KF2-Server-Extension/ServerExt/Classes/UIP_PerkSelection.uc
2020-06-26 09:32:40 +03:00

349 lines
9.1 KiB
Ucode

Class UIP_PerkSelection extends KFGUI_MultiComponent;
var KFGUI_List PerkList;
var KFGUI_Button B_Prestige;
var KFGUI_ComponentList StatsList;
var UIR_PerkTraitList TraitsList;
var KFGUI_TextLable PerkLabel;
var ExtPerkManager CurrentManager;
var Ext_PerkBase PendingPerk,OldUsedPerk;
var class<Ext_PerkBase> PrevPendingPerk;
var array<UIR_PerkStat> StatBuyers;
var int OldPerkPoints;
function InitMenu()
{
PerkList = KFGUI_List(FindComponentID('Perks'));
StatsList = KFGUI_ComponentList(FindComponentID('Stats'));
TraitsList = UIR_PerkTraitList(FindComponentID('Traits'));
PerkLabel = KFGUI_TextLable(FindComponentID('Info'));
PerkLabel.SetText("");
B_Prestige = KFGUI_Button(FindComponentID('Prestige'));
Super.InitMenu();
}
function ShowMenu()
{
Super.ShowMenu();
SetTimer(0.1,true);
Timer();
}
function CloseMenu()
{
Super.CloseMenu();
CurrentManager = None;
PrevPendingPerk = (PendingPerk!=None ? PendingPerk.Class : None);
PendingPerk = None;
OldUsedPerk = None;
SetTimer(0,false);
}
function Timer()
{
local int i;
CurrentManager = ExtPlayerController(GetPlayer()).ActivePerkManager;
if( CurrentManager!=None )
{
if( PrevPendingPerk!=None )
{
PendingPerk = CurrentManager.FindPerk(PrevPendingPerk);
PrevPendingPerk = None;
}
PerkList.ChangeListSize(CurrentManager.UserPerks.Length);
if( PendingPerk!=None && !PendingPerk.bPerkNetReady )
return;
// Huge code block to handle stat updating, but actually pretty well optimized.
if( PendingPerk!=OldUsedPerk )
{
OldUsedPerk = PendingPerk;
if( PendingPerk!=None )
{
OldPerkPoints = -1;
if( StatsList.ItemComponents.Length!=PendingPerk.PerkStats.Length )
{
if( StatsList.ItemComponents.Length<PendingPerk.PerkStats.Length )
{
for( i=StatsList.ItemComponents.Length; i<PendingPerk.PerkStats.Length; ++i )
{
if( i>=StatBuyers.Length )
{
StatBuyers[StatBuyers.Length] = UIR_PerkStat(StatsList.AddListComponent(class'UIR_PerkStat'));
StatBuyers[i].StatIndex = i;
StatBuyers[i].InitMenu();
}
else
{
StatsList.ItemComponents.Length = i+1;
StatsList.ItemComponents[i] = StatBuyers[i];
}
}
}
else if( StatsList.ItemComponents.Length>PendingPerk.PerkStats.Length )
{
for( i=PendingPerk.PerkStats.Length; i<StatsList.ItemComponents.Length; ++i )
StatBuyers[i].CloseMenu();
StatsList.ItemComponents.Length = PendingPerk.PerkStats.Length;
}
}
OldPerkPoints = PendingPerk.CurrentSP;
PerkLabel.SetText("Lv"$PendingPerk.GetLevelString()@PendingPerk.PerkName$" (Points: "$PendingPerk.CurrentSP$")");
for( i=0; i<StatsList.ItemComponents.Length; ++i ) // Just make sure perk stays the same.
{
StatBuyers[i].SetActivePerk(PendingPerk);
StatBuyers[i].CheckBuyLimit();
}
B_Prestige.SetDisabled(!PendingPerk.CanPrestige());
if( PendingPerk.MinLevelForPrestige<0 )
B_Prestige.ChangeToolTip("Prestige is disabled for this perk");
else B_Prestige.ChangeToolTip("Prestige this perk.|Minimum level required: "$PendingPerk.MinLevelForPrestige);
UpdateTraits();
}
else // Empty out if needed.
{
for( i=0; i<StatsList.ItemComponents.Length; ++i )
StatBuyers[i].CloseMenu();
StatsList.ItemComponents.Length = 0;
PerkLabel.SetText("<No perk selected>");
}
}
else if( PendingPerk!=None && OldPerkPoints!=PendingPerk.CurrentSP )
{
B_Prestige.SetDisabled(!PendingPerk.CanPrestige());
OldPerkPoints = PendingPerk.CurrentSP;
PerkLabel.SetText("Lv"$PendingPerk.GetLevelString()@PendingPerk.PerkName$" (Points: "$PendingPerk.CurrentSP$")");
for( i=0; i<StatsList.ItemComponents.Length; ++i ) // Just make sure perk stays the same.
StatBuyers[i].CheckBuyLimit();
// Update traits list.
UpdateTraits();
}
}
}
final function UpdateTraits()
{
local array< class<Ext_TGroupBase> > CatList;
local class<Ext_TGroupBase> N;
local int i,j;
local class<Ext_TraitBase> TC;
local string S;
// A bit hacky to delete and refill list again, but at least it works...
TraitsList.EmptyList();
TraitsList.ToolTip.Length = 0;
CatList.AddItem(None);
// First gather all the categories available.
for( i=0; i<PendingPerk.PerkTraits.Length; ++i )
{
N = PendingPerk.PerkTraits[i].TraitType.Default.TraitGroup;
if( N!=None && CatList.Find(N)==-1 )
CatList.AddItem(N);
}
for( j=0; j<CatList.Length; ++j )
{
N = CatList[j];
if( j>0 )
{
TraitsList.AddLine("--"$N.Static.GetUIInfo(PendingPerk),-1);
TraitsList.ToolTip.AddItem(N.Static.GetUIDesc());
}
for( i=0; i<PendingPerk.PerkTraits.Length; ++i )
{
TC = PendingPerk.PerkTraits[i].TraitType;
if( TC.Default.TraitGroup==N )
{
if( PendingPerk.PerkTraits[i].CurrentLevel>=TC.Default.NumLevels )
S = "MAX\nN/A";
else
{
S = PendingPerk.PerkTraits[i].CurrentLevel$"/"$TC.Default.NumLevels$"\n";
if( TC.Static.MeetsRequirements(PendingPerk.PerkTraits[i].CurrentLevel,PendingPerk) )
S $= string(TC.Static.GetTraitCost(PendingPerk.PerkTraits[i].CurrentLevel));
else S $= "N/A";
}
TraitsList.AddLine(TC.Default.TraitName$"\n"$S,i);
TraitsList.ToolTip.AddItem(TC.Static.GetTooltipInfo());
}
}
}
}
function DrawPerkInfo( Canvas C, int Index, float YOffset, float Height, float Width, bool bFocus )
{
local Ext_PerkBase P;
local float Sc;
if( CurrentManager==None || Index>=CurrentManager.UserPerks.Length )
return;
P = CurrentManager.UserPerks[Index];
if( P.Class==ExtPlayerReplicationInfo(GetPlayer().PlayerReplicationInfo).ECurrentPerk )
{
if( PendingPerk==None )
PendingPerk = P;
C.SetDrawColor(164,164,32);
}
else if( P==PendingPerk )
C.SetDrawColor(164,86,32);
else C.SetDrawColor(32,32,128);
if( bFocus )
{
C.DrawColor.R+=15;
C.DrawColor.G+=15;
C.DrawColor.B+=15;
}
C.SetPos(0,YOffset);
Owner.CurrentStyle.DrawWhiteBox(Width,Height);
C.SetDrawColor(240,240,240);
C.SetPos(2,YOffset);
C.DrawRect(Height,Height,P.PerkIcon);
C.SetPos(6+Height,YOffset);
C.Font = Owner.CurrentStyle.PickFont(Max(Owner.CurrentStyle.DefaultFontSize-1,0),Sc);
C.DrawText(P.PerkName,,Sc,Sc);
C.SetPos(6+Height,YOffset+Height*0.5);
C.DrawText("Lv "$P.GetLevelString()$" ("$P.CurrentEXP$"/"$P.NextLevelEXP$" XP)",,Sc,Sc);
}
function SwitchedPerk( int Index, bool bRight, int MouseX, int MouseY )
{
if( CurrentManager==None || Index>=CurrentManager.UserPerks.Length )
return;
PendingPerk = CurrentManager.UserPerks[Index];
ExtPlayerController(GetPlayer()).SwitchToPerk(PendingPerk.Class);
}
function ShowTraitInfo( KFGUI_ListItem Item, int Row, bool bRight, bool bDblClick )
{
local UIR_TraitInfoPopup T;
if( (bRight || bDblClick) && Item.Value>=0 )
{
T = UIR_TraitInfoPopup(Owner.OpenMenu(class'UIR_TraitInfoPopup'));
T.ShowTraitInfo(Item.Value,PendingPerk);
}
}
function ButtonClicked( KFGUI_Button Sender )
{
local KFGUI_Page T;
switch( Sender.ID )
{
case 'Reset':
if( PendingPerk!=None )
{
T = Owner.OpenMenu(class'UI_ResetWarning');
UI_ResetWarning(T).SetupTo(PendingPerk);
}
break;
case 'Unload':
if( PendingPerk!=None )
{
T = Owner.OpenMenu(class'UI_UnloadInfo');
UI_UnloadInfo(T).SetupTo(PendingPerk.Class);
}
break;
case 'Prestige':
if( PendingPerk!=None )
{
T = Owner.OpenMenu(class'UI_PrestigeNote');
UI_PrestigeNote(T).SetupTo(PendingPerk);
}
break;
}
}
defaultproperties
{
// TODO: localize
Begin Object Class=KFGUI_List Name=PerksList
ID="Perks"
XPosition=0
YPosition=0
XSize=0.25
YSize=1
ListItemsPerPage=12
bClickable=true
OnDrawItem=DrawPerkInfo
OnClickedItem=SwitchedPerk
End Object
Begin Object Class=KFGUI_ComponentList Name=PerkStats
ID="Stats"
XPosition=0.25
YPosition=0.12
XSize=0.375
YSize=0.88
ListItemsPerPage=16
End Object
Begin Object Class=UIR_PerkTraitList Name=PerkTraits
ID="Traits"
XPosition=0.625
YPosition=0.12
XSize=0.375
YSize=0.88
OnSelectedRow=ShowTraitInfo
End Object
Begin Object Class=KFGUI_TextLable Name=CurPerkLabel
ID="Info"
XPosition=0.4
YPosition=0
XSize=0.58
YSize=0.12
AlignX=1
AlignY=1
TextFontInfo=(bClipText=true)
End Object
Begin Object Class=KFGUI_Button Name=ResetPerkButton
ID="Reset"
ButtonText="Reset Level"
ToolTip="Reset this perk by unloading all stats, traits and set XP gained and level to 0"
XPosition=0.25
YPosition=0.025
XSize=0.074
YSize=0.045
OnClickLeft=ButtonClicked
OnClickRight=ButtonClicked
ExtravDir=1
End Object
Begin Object Class=KFGUI_Button Name=UnloadPerkButton
ID="Unload"
ButtonText="Unload Perk"
ToolTip="Reset all spent points on this perk and refund the points in exchange of some XP"
XPosition=0.325
YPosition=0.025
XSize=0.074
YSize=0.045
ExtravDir=1
OnClickLeft=ButtonClicked
OnClickRight=ButtonClicked
End Object
Begin Object Class=KFGUI_Button Name=PrestigePerkButton
ID="Prestige"
ButtonText="Prestige"
ToolTip="-"
XPosition=0.4
YPosition=0.025
XSize=0.074
YSize=0.045
OnClickLeft=ButtonClicked
OnClickRight=ButtonClicked
bDisabled=true
End Object
Components.Add(PerksList)
Components.Add(PerkStats)
Components.Add(PerkTraits)
Components.Add(CurPerkLabel)
Components.Add(ResetPerkButton)
Components.Add(UnloadPerkButton)
Components.Add(PrestigePerkButton)
}