rott/kf_sources/ServerPerks/Classes/SRLobbyMenu.uc
2026-07-14 20:27:09 +07:00

466 lines
13 KiB
Ucode

//-----------------------------------------------------------
//
//-----------------------------------------------------------
class SRLobbyMenu extends LobbyMenu;
struct FPlayerBoxEntry
{
var moCheckBox ReadyBox;
var KFPlayerReadyBar PlayerBox;
var GUIImage PlayerPerk;
var GUILabel PlayerVetLabel;
var bool bIsEmpty;
};
var array<FPlayerBoxEntry> PlayerBoxes;
var automated GUIScrollTextBox tb_ServerMOTD;
var int MaxPlayersOnList;
var bool bMOTDInit,bMOTDHidden;
function AddPlayer( KFPlayerReplicationInfo PRI, int Index, Canvas C )
{
local float Top;
local Material M;
if( Index>=PlayerBoxes.Length )
{
Top = Index*0.045;
PlayerBoxes.Length = Index+1;
PlayerBoxes[Index].ReadyBox = new (None) Class'moCheckBox';
PlayerBoxes[Index].ReadyBox.bValueReadOnly = true;
PlayerBoxes[Index].ReadyBox.ComponentJustification = TXTA_Left;
PlayerBoxes[Index].ReadyBox.CaptionWidth = 0.82;
PlayerBoxes[Index].ReadyBox.LabelColor.B = 0;
PlayerBoxes[Index].ReadyBox.WinTop = 0.0475+Top;
PlayerBoxes[Index].ReadyBox.WinLeft = 0.075;
PlayerBoxes[Index].ReadyBox.WinWidth = 0.4;
PlayerBoxes[Index].ReadyBox.WinHeight = 0.045;
PlayerBoxes[Index].ReadyBox.RenderWeight = 0.55;
PlayerBoxes[Index].ReadyBox.bAcceptsInput = False;
PlayerBoxes[Index].PlayerBox = new (None) Class'KFPlayerReadyBar';
PlayerBoxes[Index].PlayerBox.WinTop = 0.04+Top;
PlayerBoxes[Index].PlayerBox.WinLeft = 0.04;
PlayerBoxes[Index].PlayerBox.WinWidth = 0.35;
PlayerBoxes[Index].PlayerBox.WinHeight = 0.045;
PlayerBoxes[Index].PlayerBox.RenderWeight = 0.35;
PlayerBoxes[Index].PlayerPerk = new (None) Class'GUIImage';
PlayerBoxes[Index].PlayerPerk.ImageStyle = ISTY_Justified;
PlayerBoxes[Index].PlayerPerk.WinTop = 0.043+Top;
PlayerBoxes[Index].PlayerPerk.WinLeft = 0.0418;
PlayerBoxes[Index].PlayerPerk.WinWidth = 0.039;
PlayerBoxes[Index].PlayerPerk.WinHeight = 0.039;
PlayerBoxes[Index].PlayerPerk.RenderWeight = 0.56;
PlayerBoxes[Index].PlayerVetLabel = new (None) Class'GUILabel';
PlayerBoxes[Index].PlayerVetLabel.TextAlign = TXTA_Right;
PlayerBoxes[Index].PlayerVetLabel.TextColor = Class'Canvas'.Static.MakeColor(19,19,19);
PlayerBoxes[Index].PlayerVetLabel.TextFont = "UT2SmallFont";
PlayerBoxes[Index].PlayerVetLabel.WinTop = 0.04+Top;
PlayerBoxes[Index].PlayerVetLabel.WinLeft = 0.22907;
PlayerBoxes[Index].PlayerVetLabel.WinWidth = 0.151172;
PlayerBoxes[Index].PlayerVetLabel.WinHeight = 0.045;
PlayerBoxes[Index].PlayerVetLabel.RenderWeight = 0.5;
AppendComponent(PlayerBoxes[Index].ReadyBox, true);
AppendComponent(PlayerBoxes[Index].PlayerBox, true);
AppendComponent(PlayerBoxes[Index].PlayerPerk, true);
AppendComponent(PlayerBoxes[Index].PlayerVetLabel, true);
Top = (PlayerBoxes[Index].PlayerBox.WinTop+PlayerBoxes[Index].PlayerBox.WinHeight);
if( !bMOTDHidden && Top>=ADBackground.WinTop )
{
ADBackground.WinTop = Top+0.01;
if( (ADBackground.WinTop+ADBackground.WinHeight)>t_ChatBox.WinTop )
{
ADBackground.WinHeight = t_ChatBox.WinTop-ADBackground.WinTop;
if( ADBackground.WinHeight<0.15 )
{
RemoveComponent(ADBackground);
RemoveComponent(tb_ServerMOTD);
bMOTDHidden = true;
}
}
}
}
PlayerBoxes[Index].ReadyBox.Checked(PRI.bReadyToPlay);
PlayerBoxes[Index].ReadyBox.SetCaption(" "$Left(PRI.PlayerName,20));
if ( PRI.ClientVeteranSkill != none )
{
PlayerBoxes[Index].PlayerVetLabel.Caption = "Lv" @ PRI.ClientVeteranSkillLevel @ PRI.ClientVeteranSkill.default.VeterancyName;
if( Class<SRVeterancyTypes>(PRI.ClientVeteranSkill)!=None )
{
Class<SRVeterancyTypes>(PRI.ClientVeteranSkill).Static.PreDrawPerk(C,PRI.ClientVeteranSkillLevel,PlayerBoxes[Index].PlayerPerk.Image,M);
PlayerBoxes[Index].PlayerPerk.ImageColor = C.DrawColor;
}
else
{
PlayerBoxes[Index].PlayerPerk.Image = PRI.ClientVeteranSkill.default.OnHUDIcon;
PlayerBoxes[Index].PlayerPerk.ImageColor = Class'Canvas'.Static.MakeColor(255,255,255);
}
}
else
{
PlayerBoxes[Index].PlayerPerk.Image = None;
PlayerBoxes[Index].PlayerVetLabel.Caption = "";
}
PlayerBoxes[Index].bIsEmpty = false;
}
function EmptyPlayers( int Index )
{
while( Index<PlayerBoxes.Length && !PlayerBoxes[Index].bIsEmpty )
{
PlayerBoxes[Index].ReadyBox.Checked(False);
PlayerBoxes[Index].PlayerPerk.Image = None;
PlayerBoxes[Index].PlayerVetLabel.Caption = "";
PlayerBoxes[Index].ReadyBox.SetCaption("");
PlayerBoxes[Index].bIsEmpty = true;
++Index;
}
}
function InitComponent(GUIController MyC, GUIComponent MyO)
{
Super(UT2k4MainPage).InitComponent(MyC, MyO);
i_Portrait.WinTop = PlayerPortraitBG.ActualTop() + 30;
i_Portrait.WinHeight = PlayerPortraitBG.ActualHeight() - 36;
t_ChatBox.FocusInstead = PerkClickLabel;
}
event Opened(GUIComponent Sender)
{
bShouldUpdateVeterancy = true;
SetTimer(1,true);
}
function DrawPortrait()
{
if( PlayerOwner().PlayerReplicationInfo!=None )
sChar = PlayerOwner().PlayerReplicationInfo.CharacterName;
else sChar = PlayerOwner().GetUrlOption("Character");
if( sCharD!=sChar )
{
sCharD = sChar;
SetPlayerRec();
}
}
function bool NotifyLevelChange()
{
bPersistent = false;
bAllowClose = true;
Controller.CloseMenu(true);
return true;
}
function SetPlayerRec()
{
PlayerRec = Class'xUtil'.Static.FindPlayerRecord(sChar);
i_Portrait.Image = PlayerRec.Portrait;
}
function bool InternalOnPreDraw(Canvas C)
{
local int i, j;
local string StoryString;
local String SkillString;
local KFGameReplicationInfo KFGRI;
local PlayerController PC;
PC = PlayerOwner();
if ( PC == none || PC.Level == none ) // Error?
{
return false;
}
if ( (PC.PlayerReplicationInfo != none && (!PC.PlayerReplicationInfo.bWaitingPlayer || PC.PlayerReplicationInfo.bOnlySpectator)) || PC.Outer.Name=='Entry' )
{
bAllowClose = true;
PC.ClientCloseMenu(True,False);
return false;
}
t_Footer.InternalOnPreDraw(C);
KFGRI = KFGameReplicationInfo(PC.GameReplicationInfo);
if ( KFGRI != none )
WaveLabel.Caption = string(KFGRI.WaveNumber + 1) $ "/" $ string(KFGRI.FinalWave);
else
{
WaveLabel.Caption = "?/?";
return false;
}
C.DrawColor.A = 255;
// First fill in non-ready players.
for ( i = 0; i<KFGRI.PRIArray.Length; i++ )
{
if ( KFGRI.PRIArray[i] == none || KFGRI.PRIArray[i].bOnlySpectator || KFGRI.PRIArray[i].bReadyToPlay || KFPlayerReplicationInfo(KFGRI.PRIArray[i])==None )
continue;
AddPlayer(KFPlayerReplicationInfo(KFGRI.PRIArray[i]),j,C);
if( ++j>=MaxPlayersOnList )
GoTo'DoneIt';
}
// Then comes rest.
for ( i = 0; i < KFGRI.PRIArray.Length; i++ )
{
if ( KFGRI.PRIArray[i]==none || KFGRI.PRIArray[i].bOnlySpectator || !KFGRI.PRIArray[i].bReadyToPlay || KFPlayerReplicationInfo(KFGRI.PRIArray[i])==None )
continue;
if ( KFGRI.PRIArray[i].bReadyToPlay )
{
if ( !bTimeoutTimeLogged )
{
ActivateTimeoutTime = PC.Level.TimeSeconds;
bTimeoutTimeLogged = true;
}
}
AddPlayer(KFPlayerReplicationInfo(KFGRI.PRIArray[i]),j,C);
if( ++j>=MaxPlayersOnList )
GoTo'DoneIt';
}
if( j<MaxPlayersOnList )
EmptyPlayers(j);
DoneIt:
StoryString = PC.Level.Description;
if ( !bStoryBoxFilled )
{
l_StoryBox.LoadStoryText();
bStoryBoxFilled = true;
}
CheckBotButtonAccess();
if ( KFGRI.BaseDifficulty <= 1 )
SkillString = BeginnerString;
else if ( KFGRI.BaseDifficulty <= 2 )
SkillString = NormalString;
else if ( KFGRI.BaseDifficulty <= 4 )
SkillString = HardString;
else if ( KFGRI.BaseDifficulty <= 5 )
SkillString = SuicidalString;
else SkillString = HellOnEarthString;
CurrentMapLabel.Caption = CurrentMapString @ PC.Level.Title;
DifficultyLabel.Caption = DifficultyString @ SkillString;
return false;
}
function DrawPerk(Canvas Canvas)
{
local float X, Y, Width, Height;
local int LevelIndex;
local float TempX, TempY;
local float TempWidth, TempHeight;
local float IconSize, ProgressBarWidth;
local string PerkName, PerkLevelString;
local KFPlayerReplicationInfo KFPRI;
local GameReplicationInfo GRI;
local Material M,SM;
DrawPortrait();
if( !bMOTDHidden )
{
X = 9.f/Canvas.ClipX;
Y = 32.f/Canvas.ClipY;
tb_ServerMOTD.WinWidth = ADBackground.WinWidth-X*2.f;
tb_ServerMOTD.WinHeight = ADBackground.WinHeight-Y*1.25f;
tb_ServerMOTD.WinLeft = ADBackground.WinLeft+X;
tb_ServerMOTD.WinTop = ADBackground.WinTop+Y;
if( !bMOTDInit )
{
GRI = PlayerOwner().Level.GRI;
if( GRI!=None && GRI.MessageOfTheDay!="" )
{
bMOTDInit = true;
tb_ServerMOTD.SetContent(GRI.MessageOfTheDay);
}
}
}
KFPRI = KFPlayerReplicationInfo(PlayerOwner().PlayerReplicationInfo);
if ( KFPRI==None || KFPRI.ClientVeteranSkill==None )
{
if( CurrentVeterancyLevel!=255 )
{
CurrentVeterancyLevel = 255;
lb_PerkEffects.SetContent("None perk active");
}
return;
}
LevelIndex = KFPRI.ClientVeteranSkillLevel;
PerkName = KFPRI.ClientVeteranSkill.default.VeterancyName;
PerkLevelString = "Lv" @ LevelIndex;
//Get the position size etc in pixels
X = (i_BGPerk.WinLeft + 0.003) * Canvas.ClipX;
Y = (i_BGPerk.WinTop + 0.040) * Canvas.ClipY;
Width = (i_BGPerk.WinWidth - 0.006) * Canvas.ClipX;
Height = (i_BGPerk.WinHeight - 0.043) * Canvas.ClipY;
// Offset for the Background
TempX = X;
TempY = Y;
// Initialize the Canvas
Canvas.Style = 1;
Canvas.Font = class'ROHUD'.Static.GetSmallMenuFont(Canvas);
Canvas.SetDrawColor(255, 255, 255, 255);
// Draw Item Background
Canvas.SetPos(TempX, TempY);
//Canvas.DrawTileStretched(ItemBackground, Width, Height);
// Offset and Calculate Icon's Size
TempX += ItemBorder * Height;
TempY += ItemBorder * Height;
IconSize = Height - (ItemBorder * 2.0 * Height);
// Draw Icon
Canvas.SetPos(TempX, TempY);
if( Class<SRVeterancyTypes>(KFPRI.ClientVeteranSkill)!=None )
Class<SRVeterancyTypes>(KFPRI.ClientVeteranSkill).Static.PreDrawPerk(Canvas,KFPRI.ClientVeteranSkillLevel,M,SM);
else M = KFPRI.ClientVeteranSkill.default.OnHUDIcon;
Canvas.DrawTile(M, IconSize, IconSize, 0, 0, M.MaterialUSize(), M.MaterialVSize());
TempX += IconSize + (IconToInfoSpacing * Width);
TempY += TextTopOffset * Height;
ProgressBarWidth = Width - (TempX - X) - (IconToInfoSpacing * Width);
// Select Text Color
Canvas.SetDrawColor(255, 255, 255, 255);
// Draw the Perk's Level name
Canvas.StrLen(PerkName, TempWidth, TempHeight);
Canvas.SetPos(TempX, TempY);
Canvas.DrawText(PerkName);
// Draw the Perk's Level
if ( PerkLevelString != "" )
{
Canvas.StrLen(PerkLevelString, TempWidth, TempHeight);
Canvas.SetPos(TempX + ProgressBarWidth - TempWidth, TempY);
Canvas.DrawText(PerkLevelString);
}
TempY += TempHeight + (0.01 * Height);
if( CurrentVeterancy!=KFPRI.ClientVeteranSkill || CurrentVeterancyLevel!=LevelIndex )
{
CurrentVeterancy = KFPRI.ClientVeteranSkill;
CurrentVeterancyLevel = LevelIndex;
lb_PerkEffects.SetContent(Class<SRVeterancyTypes>(KFPRI.ClientVeteranSkill).Static.GetVetInfoText(LevelIndex,1));
}
}
function bool ShowPerkMenu(GUIComponent Sender)
{
if ( PlayerOwner() != none)
PlayerOwner().ClientOpenMenu(string(Class'SRProfilePage'), false);
return true;
}
defaultproperties
{
Begin Object Class=GUIScrollTextBox Name=MOTDScroll
CharDelay=0.002500
EOLDelay=0.100000
OnCreateComponent=MOTDScroll.InternalOnCreateComponent
WinTop=0.354102
WinLeft=0.072187
WinWidth=0.312375
WinHeight=0.335000
TabOrder=9
End Object
tb_ServerMOTD=GUIScrollTextBox'ServerPerks.SRLobbyMenu.MOTDScroll'
MaxPlayersOnList=18
ReadyBox(0)=None
ReadyBox(1)=None
ReadyBox(2)=None
ReadyBox(3)=None
ReadyBox(4)=None
ReadyBox(5)=None
PlayerBox(0)=None
PlayerBox(1)=None
PlayerBox(2)=None
PlayerBox(3)=None
PlayerBox(4)=None
PlayerBox(5)=None
PlayerPerk(0)=None
PlayerPerk(1)=None
PlayerPerk(2)=None
PlayerPerk(3)=None
PlayerPerk(4)=None
PlayerPerk(5)=None
PlayerVetLabel(0)=None
PlayerVetLabel(1)=None
PlayerVetLabel(2)=None
PlayerVetLabel(3)=None
PlayerVetLabel(4)=None
PlayerVetLabel(5)=None
Begin Object Class=SRLobbyChat Name=ChatBox
OnCreateComponent=ChatBox.InternalOnCreateComponent
WinTop=0.807600
WinLeft=0.016090
WinWidth=0.971410
WinHeight=0.100000
RenderWeight=0.010000
TabOrder=1
OnPreDraw=ChatBox.FloatingPreDraw
OnRendered=ChatBox.FloatingRendered
OnHover=ChatBox.FloatingHover
OnMousePressed=ChatBox.FloatingMousePressed
OnMouseRelease=ChatBox.FloatingMouseRelease
End Object
t_ChatBox=SRLobbyChat'ServerPerks.SRLobbyMenu.ChatBox'
Begin Object Class=SRLobbyFooter Name=BuyFooter
RenderWeight=0.300000
TabOrder=8
bBoundToParent=False
bScaleToParent=False
OnPreDraw=BuyFooter.InternalOnPreDraw
End Object
t_Footer=SRLobbyFooter'ServerPerks.SRLobbyMenu.BuyFooter'
}