class KFTab_MidGamePerks extends MidGamePanel; var automated GUISectionBackground i_BGPerks; var automated KFPerkSelectListBox lb_PerkSelect; var automated GUISectionBackground i_BGPerkEffects; var automated GUIScrollTextBox lb_PerkEffects; var automated GUISectionBackground i_BGPerkNextLevel; var automated KFPerkProgressListBox lb_PerkProgress; var automated GUIButton b_Save; var KFSteamStatsAndAchievements KFStatsAndAchievements; //copied stuff var automated GUIButton b_Team, b_Settings, b_Browser, b_Quit, b_Favs, b_Leave, b_MapVote, b_KickVote, b_MatchSetup, b_Spec; var() noexport bool bTeamGame, bFFAGame, bNetGame; var localized string LeaveMPButtonText, LeaveSPButtonText, SpectateButtonText, JoinGameButtonText; var localized array ContextItems, DefaultItems; var localized string KickPlayer, BanPlayer; var localized string BuddyText; var localized string RedTeam, BlueTeam; var string PlayerStyleName; var GUIStyles PlayerStyle; function InitComponent(GUIController MyController, GUIComponent MyOwner) { local string s; local int i; local eFontScale FS; Super.InitComponent(MyController, MyOwner); s = GetSizingCaption(); for ( i = 0; i < Controls.Length; i++ ) { if ( GUIButton(Controls[i]) != None && Controls[i] != b_Team && Controls[i] != b_Save) { GUIButton(Controls[i]).bAutoSize = true; GUIButton(Controls[i]).SizingCaption = s; GUIButton(Controls[i]).AutoSizePadding.HorzPerc = 0.04; GUIButton(Controls[i]).AutoSizePadding.VertPerc = 0.5; } } PlayerStyle = MyController.GetStyle(PlayerStyleName, fs); lb_PerkSelect.List.OnChange = OnPerkSelected; } function ShowPanel(bool bShow) { super.ShowPanel(bShow); if ( bShow ) { if ( PlayerOwner() != none ) { KFStatsAndAchievements = KFSteamStatsAndAchievements(PlayerOwner().SteamStatsAndAchievements); if ( KFStatsAndAchievements != none ) { // Initialize the List lb_PerkSelect.List.InitList(KFStatsAndAchievements); lb_PerkProgress.List.InitList(); } } InitGRI(); } } event Closed(GUIComponent Sender, bool bCancelled) { KFStatsAndAchievements = none; super.Closed(Sender, bCancelled); } function string GetSizingCaption() { local int i; local string s; for ( i = 0; i < Controls.Length; i++ ) { if ( GUIButton(Controls[i]) != none && Controls[i] != b_Team && Controls[i] != b_Save) { if ( s == "" || Len(GUIButton(Controls[i]).Caption) > Len(s) ) { s = GUIButton(Controls[i]).Caption; } } } return s; } function GameReplicationInfo GetGRI() { return PlayerOwner().GameReplicationInfo; } function InitGRI() { local PlayerController PC; local GameReplicationInfo GRI; GRI = GetGRI(); PC = PlayerOwner(); if ( PC == none || PC.PlayerReplicationInfo == none || GRI == none ) { return; } bInit = False; if ( !bTeamGame && !bFFAGame ) { if ( GRI.bTeamGame ) { bTeamGame = True; } else if ( !(GRI.GameClass ~= "Engine.GameInfo") ) { bFFAGame = True; } } bNetGame = PC.Level.NetMode != NM_StandAlone; if ( bNetGame ) { b_Leave.Caption = LeaveMPButtonText; } else { b_Leave.Caption = LeaveSPButtonText; } if ( PC.PlayerReplicationInfo.bOnlySpectator ) { b_Spec.Caption = JoinGameButtonText; } else { b_Spec.Caption = SpectateButtonText; } SetupGroups(); //InitLists(); } function float ItemHeight(Canvas C) { local float XL, YL, H; local eFontScale f; if ( bTeamGame ) { f=FNS_Medium; } else { f=FNS_Large; } PlayerStyle.TextSize(C, MSAT_Blurry, "Wqz, ", XL, H, F); if ( C.ClipX > 640 && bNetGame ) { PlayerStyle.TextSize(C, MSAT_Blurry, "Wqz, ", XL, YL, FNS_Small); } H += YL; H += (H * 0.2); return h; } function SetupGroups() { local int i; local PlayerController PC; PC = PlayerOwner(); if ( bTeamGame ) { //RemoveComponent(lb_FFA, True); //RemoveComponent(sb_FFA, true); if ( PC.GameReplicationInfo != None && PC.GameReplicationInfo.bNoTeamChanges ) { RemoveComponent(b_Team,true); } //lb_FFA = None; } else if ( bFFAGame ) { //RemoveComponent(i_JoinRed, true); //RemoveComponent(lb_Red, true); //RemoveComponent(sb_Red, true); RemoveComponent(b_Team, true); } else { for ( i = 0; i < Controls.Length; i++ ) { if ( Controls[i] != i_BGPerks && Controls[i] != lb_PerkSelect && Controls[i] != i_BGPerkEffects && Controls[i] != lb_PerkEffects && Controls[i] != i_BGPerkNextLevel && Controls[i] != lb_PerkProgress && Controls[i] != b_Save ) { RemoveComponent(Controls[i], True); } } } if ( PC.Level.NetMode != NM_Client ) { RemoveComponent(b_Favs); RemoveComponent(b_Browser); } else if ( CurrentServerIsInFavorites() ) { DisableComponent(b_Favs); } if ( PC.Level.NetMode == NM_StandAlone ) { RemoveComponent(b_MapVote, True); RemoveComponent(b_MatchSetup, True); RemoveComponent(b_KickVote, True); } else if ( PC.VoteReplicationInfo != None ) { if ( !PC.VoteReplicationInfo.MapVoteEnabled() ) { RemoveComponent(b_MapVote,True); } if ( !PC.VoteReplicationInfo.KickVoteEnabled() ) { RemoveComponent(b_KickVote); } if ( !PC.VoteReplicationInfo.MatchSetupEnabled() ) { RemoveComponent(b_MatchSetup); } } else { RemoveComponent(b_MapVote); RemoveComponent(b_KickVote); RemoveComponent(b_MatchSetup); } RemapComponents(); } function SetButtonPositions(Canvas C) { local int i, j, ButtonsPerRow, ButtonsLeftInRow, NumButtons; local float Width, Height, Center, X, Y, YL, ButtonSpacing; Width = b_Settings.ActualWidth(); Height = b_Settings.ActualHeight(); Center = ActualLeft() + (ActualWidth() / 2.0); ButtonSpacing = Width * 0.05; YL = Height * 1.2; Y = b_Settings.ActualTop(); ButtonsPerRow = ActualWidth() / (Width + ButtonSpacing); ButtonsLeftInRow = ButtonsPerRow; for ( i = 0; i < Components.Length; i++) { if ( Components[i].bVisible && GUIButton(Components[i]) != none && Components[i] != b_Team && Components[i] != b_Save ) { NumButtons++; } } if ( NumButtons < ButtonsPerRow ) { X = Center - (((Width * float(NumButtons)) + (ButtonSpacing * float(NumButtons - 1))) * 0.5); } else if ( ButtonsPerRow > 1 ) { X = Center - (((Width * float(ButtonsPerRow)) + (ButtonSpacing * float(ButtonsPerRow - 1))) * 0.5); } else { X = Center - Width / 2.0; } for ( i = 0; i < Components.Length; i++) { if ( !Components[i].bVisible || GUIButton(Components[i]) == none || Components[i]==b_Team || Components[i] == b_Save ) { continue; } Components[i].SetPosition( X, Y, Width, Height, true ); if ( --ButtonsLeftInRow > 0 ) { X += Width + ButtonSpacing; } else { Y += YL; for ( j = i + 1; j < Components.Length && ButtonsLeftInRow < ButtonsPerRow; j++) { if ( Components[i].bVisible && GUIButton(Components[i]) != none && Components[i] != b_Team && Components[i] != b_Save ) { ButtonsLeftInRow++; } } if ( ButtonsLeftInRow > 1 ) { X = Center - (((Width * float(ButtonsLeftInRow)) + (ButtonSpacing * float(ButtonsLeftInRow - 1))) * 0.5); } else { X = Center - Width / 2.0; } } } } // See if we already have this server in our favorites function bool CurrentServerIsInFavorites() { local ExtendedConsole.ServerFavorite Fav; local string address,portString; // Get current network address if ( PlayerOwner() == None ) { return true; } address = PlayerOwner().GetServerNetworkAddress(); if( address == "" ) { return true; // slightly hacky - dont want to add "none"! } // Parse text to find IP and possibly port number if ( Divide(address, ":", Fav.IP, portstring) ) { Fav.Port = int(portString); } else { Fav.IP = address; } return class'ExtendedConsole'.static.InFavorites(Fav); } function bool ButtonClicked(GUIComponent Sender) { local PlayerController PC; local GUIController C; C = Controller; PC = PlayerOwner(); /*if ( Sender == i_JoinRed ) { //Join Red team if ( PC.PlayerReplicationInfo == None || PC.PlayerReplicationInfo.Team == none || PC.PlayerReplicationInfo.Team.TeamIndex != 0 ) { PC.ChangeTeam(0); } Controller.CloseMenu(false); } */ if ( Sender == b_Settings ) { //Settings Controller.OpenMenu(Controller.GetSettingsPage()); } else if ( Sender == b_Browser ) { //Server browser Controller.OpenMenu("KFGUI.KFServerBrowser"); } else if ( Sender == b_Leave ) { //Forfeit/Disconnect PC.ConsoleCommand("DISCONNECT"); KFGUIController(C).ReturnToMainMenu(); } else if ( Sender == b_Favs ) { //Add this server to favorites PC.ConsoleCommand( "ADDCURRENTTOFAVORITES" ); b_Favs.MenuStateChange(MSAT_Disabled); } else if ( Sender == b_Quit ) { //Quit game Controller.OpenMenu(Controller.GetQuitPage()); } else if ( Sender == b_MapVote ) { //Map voting Controller.OpenMenu(Controller.MapVotingMenu); } else if ( Sender == b_KickVote ) { //Kick voting Controller.OpenMenu(Controller.KickVotingMenu); } else if ( Sender == b_MatchSetup ) { //Match setup Controller.OpenMenu(Controller.MatchSetupMenu); } else if ( Sender == b_Spec ) { Controller.CloseMenu(); //Spectate/rejoin if ( PC.PlayerReplicationInfo.bOnlySpectator ) { PC.BecomeActivePlayer(); } else { PC.BecomeSpectator(); } } return true; } function bool InternalOnPreDraw(Canvas C) { local GameReplicationInfo GRI; GRI = GetGRI(); if ( GRI != none ) { if ( bInit ) { InitGRI(); } /* if ( bTeamGame ) { if ( PlayerOwner().PlayerReplicationInfo.Team != none ) { sb_Red.HeaderBase = texture'InterfaceArt_tex.Menu.RODisplay'; } } sb_Red.SetPosition((ActualWidth() / 2.0) - ((sb_Red.WinWidth * ActualWidth()) / 2.0), sb_Red.WinTop, sb_Red.WinWidth, sb_Red.WinHeight); */ SetButtonPositions(C); //UpdatePlayerLists(); if ( (PlayerOwner().myHUD == None || !PlayerOwner().myHUD.IsInCinematic()) && GRI != none && GRI.bMatchHasBegun && !PlayerOwner().IsInState('GameEnded') ) { EnableComponent(b_Spec); } else { DisableComponent(b_Spec); } } return false; } function bool ContextMenuOpened(GUIContextMenu Menu) { local GUIList List; local PlayerReplicationInfo PRI; local byte Restriction; local GameReplicationInfo GRI; GRI = GetGRI(); if ( GRI == None ) { return false; } List = GUIList(Controller.ActiveControl); if ( List == None ) { log(Name @ "ContextMenuOpened active control was not a list - active:" $ Controller.ActiveControl.Name); return False; } if ( !List.IsValid() ) { return False; } PRI = GRI.FindPlayerByID(int(List.GetExtra())); if ( PRI == None || PRI.bBot || PlayerIDIsMine(PRI.PlayerID) ) { return False; } Restriction = PlayerOwner().ChatManager.GetPlayerRestriction(PRI.PlayerID); if ( bool(Restriction & 1) ) { Menu.ContextItems[0] = ContextItems[0]; } else { Menu.ContextItems[0] = DefaultItems[0]; } if ( bool(Restriction & 2) ) { Menu.ContextItems[1] = ContextItems[1]; } else { Menu.ContextItems[1] = DefaultItems[1]; } if ( bool(Restriction & 4) ) { Menu.ContextItems[2] = ContextItems[2]; } else { Menu.ContextItems[2] = DefaultItems[2]; } if ( bool(Restriction & 8) ) { Menu.ContextItems[3] = ContextItems[3]; } else { Menu.ContextItems[3] = DefaultItems[3]; } Menu.ContextItems[4] = "-"; Menu.ContextItems[5] = BuddyText; if ( PlayerOwner().PlayerReplicationInfo.bAdmin ) { Menu.ContextItems[6] = "-"; Menu.ContextItems[7] = KickPlayer $ "["$List.Get() $ "]"; Menu.ContextItems[8] = BanPlayer $ "["$List.Get() $ "]"; } else if ( Menu.ContextItems.Length > 6 ) { Menu.ContextItems.Remove(6,Menu.ContextItems.Length - 6); } return True; } function ContextClick(GUIContextMenu Menu, int ClickIndex) { local bool bUndo; local byte Type; local GUIList List; local PlayerController PC; local PlayerReplicationInfo PRI; local GameReplicationInfo GRI; GRI = GetGRI(); if ( GRI == None ) { return; } PC = PlayerOwner(); bUndo = Menu.ContextItems[ClickIndex] == ContextItems[ClickIndex]; List = GUIList(Controller.ActiveControl); if ( List == None ) { return; } PRI = GRI.FindPlayerById(int(List.GetExtra())); if ( PRI == None ) { return; } if ( ClickIndex > 5 ) // Admin stuff { switch ( ClickIndex ) { case 6: case 7: PC.AdminCommand("admin kick"@List.GetExtra()); break; case 8: PC.AdminCommand("admin kickban"@List.GetExtra()); break; } return; } if ( ClickIndex > 3 ) { Controller.AddBuddy(List.Get()); return; } Type = 1 << ClickIndex; if ( bUndo ) { if ( PC.ChatManager.ClearRestrictionID(PRI.PlayerID, Type) ) { PC.ServerChatRestriction(PRI.PlayerID, PC.ChatManager.GetPlayerRestriction(PRI.PlayerID)); ModifiedChatRestriction(Self, PRI.PlayerID); } } else { if ( PC.ChatManager.AddRestrictionID(PRI.PlayerID, Type) ) { PC.ServerChatRestriction(PRI.PlayerID, PC.ChatManager.GetPlayerRestriction(PRI.PlayerID)); ModifiedChatRestriction(Self, PRI.PlayerID); } } } function OnPerkSelected(GUIComponent Sender) { if ( KFStatsAndAchievements.bUsedCheats ) { lb_PerkEffects.SetContent(class'LobbyMenu'.default.PerksDisabledString); } else { lb_PerkEffects.SetContent(class'KFGameType'.default.LoadedSkills[lb_PerkSelect.GetIndex()].default.LevelEffects[KFStatsAndAchievements.PerkHighestLevelAvailable(lb_PerkSelect.GetIndex())]); lb_PerkProgress.List.PerkChanged(KFStatsAndAchievements, lb_PerkSelect.GetIndex()); } } function bool OnSaveButtonClicked(GUIComponent Sender) { local PlayerController PC; PC = PlayerOwner(); class'KFPlayerController'.default.SelectedVeterancy = class'KFGameType'.default.LoadedSkills[lb_PerkSelect.GetIndex()]; if ( KFPlayerController(PC) != none ) { KFPlayerController(PC).SetSelectedVeterancy( class'KFGameType'.default.LoadedSkills[lb_PerkSelect.GetIndex()] ); KFPlayerController(PC).SendSelectedVeterancyToServer(); PC.SaveConfig(); } else { class'KFPlayerController'.static.StaticSaveConfig(); } return true; } defaultproperties { PropagateVisibility=False WinWidth=.5 WinHeight=.75 WinTop=0.125 WinLeft=0.25 LeaveMPButtonText="Disconnect" LeaveSPButtonText="Forfeit" SpectateButtonText="Spectate" JoinGameButtonText="Join" // OnRightClick=RightClick ContextItems(0)="Unignore text" ContextItems(1)="Unignore speech" ContextItems(2)="Unignore voice chat" ContextItems(3)="Unban from voice chat" DefaultItems(0)="Ignore text" DefaultItems(1)="Ignore speech" DefaultItems(2)="Ignore voice chat" DefaultItems(3)="Ban from voice chat" PlayerStyleName="TextLabel" OnPreDraw=InternalOnPreDraw KickPlayer="Kick " BanPlayer="Ban " Begin Object Class=GUIContextMenu name=PlayerListContextMenu OnSelect=ContextClick OnOpen=ContextMenuOpened End Object ContextMenu=PlayerListContextMenu Begin Object class=GUISectionBackground Name=BGPerks WinWidth=0.457166 WinHeight=0.796032 WinLeft=0.019240 WinTop=0.012063 Caption="Select Perk" bFillClient=true End Object i_BGPerks=BGPerks Begin Object class=KFPerkSelectListBox Name=PerkSelectList WinWidth=0.437166 WinHeight=0.742836 WinLeft=0.029240 WinTop=0.057760 End Object lb_PerkSelect=PerkSelectList Begin Object class=GUISectionBackground Name=BGPerkEffects WinWidth=0.491566 WinHeight=0.366816 WinLeft=0.486700 WinTop=0.012063 Caption="Perk Effects" bFillClient=true End Object i_BGPerkEffects=BGPerkEffects Begin Object Class=GUIScrollTextBox Name=PerkEffectsScroll WinWidth=0.465143 WinHeight=0.323477 WinLeft=0.500554 WinTop=0.093121 CharDelay=0.0025 EOLDelay=0.1 TabOrder=9 StyleName="NoBackground" End Object lb_PerkEffects=PerkEffectsScroll Begin Object class=GUISectionBackground Name=BGPerksNextLevel WinWidth=0.490282 WinHeight=0.415466 WinLeft=0.486700 WinTop=0.392889 Caption="Next Level Requirements" bFillClient=true End Object i_BGPerkNextLevel=BGPerksNextLevel Begin Object class=KFPerkProgressListBox Name=PerkProgressList WinWidth=0.463858 WinHeight=0.341256 WinLeft=0.499269 WinTop=0.476850 End Object lb_PerkProgress=PerkProgressList Begin Object Class=GUIButton Name=SaveButton Caption="Select Perk" Hint="Use Selected Perk" StyleName="SquareButton" WinWidth=0.363829 WinHeight=0.042757 WinLeft=0.302670 WinTop=0.822807 TabOrder=2 bBoundToParent=True OnClick=OnSaveButtonClicked End Object b_Save=SaveButton Begin Object Class=GUIButton Name=SettingsButton Caption="Settings" StyleName="SquareButton" OnClick=ButtonClicked WinWidth=0.147268 WinHeight=0.048769 WinLeft=0.194420 WinTop=0.878657 TabOrder=0 bBoundToParent=true bScaleToParent=true End Object b_Settings=SettingsButton Begin Object Class=GUIButton Name=BrowserButton Caption="Server Browser" StyleName="SquareButton" OnClick=ButtonClicked WinWidth=0.20000 WinHeight=0.05000 WinLeft=0.375000 WinTop=0.85000//0.675 bAutoSize=True TabOrder=1 bBoundToParent=true bScaleToParent=true End Object b_Browser=BrowserButton Begin Object Class=GUIButton Name=LeaveMatchButton Caption="" StyleName="SquareButton" OnClick=ButtonClicked WinWidth=0.20000 WinHeight=0.05000 WinLeft=0.7250000 WinTop=0.87//0.750 bAutoSize=True TabOrder=10 bBoundToParent=true bScaleToParent=true End Object b_Leave=LeaveMatchButton Begin Object Class=GUIButton Name=FavoritesButton Caption="Add to Favs" Hint="Add this server to your Favorites" StyleName="SquareButton" WinWidth=0.20000 WinHeight=0.05000 WinLeft=0.02500 WinTop=0.870 bBoundToParent=true bScaleToParent=true OnClick=ButtonClicked bAutoSize=True TabOrder=3 End Object b_Favs=FavoritesButton Begin Object Class=GUIButton Name=QuitGameButton Caption="Exit Game" StyleName="SquareButton" OnClick=ButtonClicked WinWidth=0.20000 WinHeight=0.05000 WinLeft=0.725000 WinTop=0.870 bAutoSize=True TabOrder=11 End Object b_Quit=QuitGameButton Begin Object Class=GUIButton Name=MapVotingButton Caption="Map Voting" StyleName="SquareButton" OnClick=ButtonClicked WinWidth=0.20000 WinHeight=0.050000 WinLeft=0.025000 WinTop=0.890 bAutoSize=True TabOrder=5 End Object b_MapVote=MapVotingButton Begin Object Class=GUIButton Name=KickVotingButton Caption="Kick Voting" StyleName="SquareButton" OnClick=ButtonClicked WinWidth=0.20000 WinHeight=0.050000 WinLeft=0.375000 WinTop=0.890 bAutoSize=True TabOrder=6 End Object b_KickVote=KickVotingButton Begin Object Class=GUIButton Name=MatchSetupButton Caption="Match Setup" StyleName="SquareButton" OnClick=ButtonClicked WinWidth=0.20000 WinHeight=0.050000 WinLeft=0.725000 WinTop=0.890 bAutoSize=True TabOrder=7 End Object b_MatchSetup=MatchSetupButton Begin Object Class=GUIButton Name=SpectateButton Caption="Spectate" StyleName="SquareButton" OnClick=ButtonClicked WinWidth=0.20000 WinHeight=0.050000 WinLeft=0.725000 WinTop=0.890 bAutoSize=True TabOrder=9 End Object b_Spec=SpectateButton }