From 03ca492d68533ec6b91991ceabebbf48ae21f232 Mon Sep 17 00:00:00 2001 From: Shtoyan Date: Wed, 22 Mar 2023 01:36:11 +0400 Subject: [PATCH] Original Version --- Classes/DMTeamAI.uc | 6 + Classes/GGAnnouncementMessage.uc | 99 ++ Classes/GGHUDKillingFloor.uc | 234 +++ Classes/GGLobbyFooter.uc | 242 +++ Classes/GGLobbyMenu.uc | 2255 ++++++++++++++++++++++++ Classes/GGMapList.uc | 14 + Classes/GGShopTrigger.uc | 38 + Classes/GGStartupMessage.uc | 94 + Classes/GGSyringe.uc | 15 + Classes/GGSyringeFire.uc | 75 + Classes/GGSyringePickup.uc | 9 + Classes/GGTeamAI.uc | 6 + Classes/GGWarmupMessage.uc | 93 + Classes/GG_HuskGun.uc | 15 + Classes/GG_HuskGunFire.uc | 18 + Classes/GG_HuskGunProjectile.uc | 102 ++ Classes/GG_HuskGunProjectile_Strong.uc | 102 ++ Classes/GG_HuskGunProjectile_Weak.uc | 102 ++ Classes/GG_LAW.uc | 6 + Classes/GG_LAWFire.uc | 6 + Classes/GG_LAWProj.uc | 56 + Classes/GG_M203Fire.uc | 6 + Classes/GG_M203GrenadeProjectile.uc | 55 + Classes/GG_M32Fire.uc | 6 + Classes/GG_M32GrenadeLauncher.uc | 9 + Classes/GG_M32GrenadeProjectile.uc | 55 + Classes/GG_M4203AssaultRifle.uc | 15 + Classes/GG_M79Fire.uc | 6 + Classes/GG_M79GrenadeLauncher.uc | 9 + Classes/GG_M79GrenadeProjectile.uc | 55 + Classes/KFBlueGGPlayer.uc | 47 + Classes/KFDMScoreBoard.uc | 286 +++ Classes/KFDMSquad.uc | 10 + Classes/KFGG.uc | 1385 +++++++++++++++ Classes/KFGGBaseMut.uc | 15 + Classes/KFGGBot.uc | 338 ++++ Classes/KFGGGameReplicationInfo.uc | 13 + Classes/KFGGHumanPawn.uc | 519 ++++++ Classes/KFGGLoginControls.uc | 1256 +++++++++++++ Classes/KFGGMidGameMenu.uc | 91 + Classes/KFGGPRI.uc | 23 + Classes/KFGGPlayerController.uc | 193 ++ Classes/KFGGScoreBoard.uc | 272 +++ Classes/KFGGSquad.uc | 10 + Classes/KFGGTab_MidGameHelp.uc | 1005 +++++++++++ Classes/KFGGTab_MidGameVoiceChat.uc | 865 +++++++++ Classes/KFGGTimeMessage.uc | 64 + Classes/KFGGWinMessage.uc | 78 + Classes/KFRedGGPlayer.uc | 121 ++ README.md | 33 + 50 files changed, 10427 insertions(+) create mode 100644 Classes/DMTeamAI.uc create mode 100644 Classes/GGAnnouncementMessage.uc create mode 100644 Classes/GGHUDKillingFloor.uc create mode 100644 Classes/GGLobbyFooter.uc create mode 100644 Classes/GGLobbyMenu.uc create mode 100644 Classes/GGMapList.uc create mode 100644 Classes/GGShopTrigger.uc create mode 100644 Classes/GGStartupMessage.uc create mode 100644 Classes/GGSyringe.uc create mode 100644 Classes/GGSyringeFire.uc create mode 100644 Classes/GGSyringePickup.uc create mode 100644 Classes/GGTeamAI.uc create mode 100644 Classes/GGWarmupMessage.uc create mode 100644 Classes/GG_HuskGun.uc create mode 100644 Classes/GG_HuskGunFire.uc create mode 100644 Classes/GG_HuskGunProjectile.uc create mode 100644 Classes/GG_HuskGunProjectile_Strong.uc create mode 100644 Classes/GG_HuskGunProjectile_Weak.uc create mode 100644 Classes/GG_LAW.uc create mode 100644 Classes/GG_LAWFire.uc create mode 100644 Classes/GG_LAWProj.uc create mode 100644 Classes/GG_M203Fire.uc create mode 100644 Classes/GG_M203GrenadeProjectile.uc create mode 100644 Classes/GG_M32Fire.uc create mode 100644 Classes/GG_M32GrenadeLauncher.uc create mode 100644 Classes/GG_M32GrenadeProjectile.uc create mode 100644 Classes/GG_M4203AssaultRifle.uc create mode 100644 Classes/GG_M79Fire.uc create mode 100644 Classes/GG_M79GrenadeLauncher.uc create mode 100644 Classes/GG_M79GrenadeProjectile.uc create mode 100644 Classes/KFBlueGGPlayer.uc create mode 100644 Classes/KFDMScoreBoard.uc create mode 100644 Classes/KFDMSquad.uc create mode 100644 Classes/KFGG.uc create mode 100644 Classes/KFGGBaseMut.uc create mode 100644 Classes/KFGGBot.uc create mode 100644 Classes/KFGGGameReplicationInfo.uc create mode 100644 Classes/KFGGHumanPawn.uc create mode 100644 Classes/KFGGLoginControls.uc create mode 100644 Classes/KFGGMidGameMenu.uc create mode 100644 Classes/KFGGPRI.uc create mode 100644 Classes/KFGGPlayerController.uc create mode 100644 Classes/KFGGScoreBoard.uc create mode 100644 Classes/KFGGSquad.uc create mode 100644 Classes/KFGGTab_MidGameHelp.uc create mode 100644 Classes/KFGGTab_MidGameVoiceChat.uc create mode 100644 Classes/KFGGTimeMessage.uc create mode 100644 Classes/KFGGWinMessage.uc create mode 100644 Classes/KFRedGGPlayer.uc create mode 100644 README.md diff --git a/Classes/DMTeamAI.uc b/Classes/DMTeamAI.uc new file mode 100644 index 0000000..a8e4675 --- /dev/null +++ b/Classes/DMTeamAI.uc @@ -0,0 +1,6 @@ +Class DMTeamAI extends TeamAI; + +defaultproperties +{ + SquadType=Class'KFGunGame.KFDMSquad' +} diff --git a/Classes/GGAnnouncementMessage.uc b/Classes/GGAnnouncementMessage.uc new file mode 100644 index 0000000..a7e39b4 --- /dev/null +++ b/Classes/GGAnnouncementMessage.uc @@ -0,0 +1,99 @@ +class GGAnnouncementMessage extends CriticalEventPlus; + +//var localized string FirstBloodString; +//var sound FirstBloodSound; // OBSOLETE + +//var localized string Stage[4]; +var localized string HasReachedString; +var localized string FirstString; +var localized string FinalWeaponString; +var localized string LevelString; +var localized string StoleALevelFromString; +var sound StageSound, FinalStageSound; +var sound StoleLevelSound; + +static function string GetString( + optional int Switch, + optional PlayerReplicationInfo RelatedPRI_1, + optional PlayerReplicationInfo RelatedPRI_2, + optional Object OptionalObject + ) +{ +// if ( Switch < 7 ) +// { +// P.Level.FillPrecacheMaterialsArray(false); +// P.Level.FillPrecacheStaticMeshesArray(false); +// P.PrecacheAnnouncements(); +// } +// // don't play sound if quickstart=true, so no 'play' voiceover at start of tutorials +// if ( Switch == 5 && P != none ) +// { +// //P.PlayStatusAnnouncement('Play',1,true); +// P.ClientPlaySound(sound'KF_BasePatriarch.Kev_Entrance1', false, 2.0); +// P.ClientPlaySound(sound'KF_FoundrySnd.Alarm_BellWarning01', false, 2.0); +// } +// else if ( (Switch > 1) && (Switch < 5) ) +// //P.PlayBeepSound(); +// P.ClientPlaySound(sound'Miscsounds.Enter', true, 2.0); +// else if ( Switch == 7 ) +// P.ClientPlaySound(Default.Riff); + + + if (RelatedPRI_1 == None) + return ""; + if (RelatedPRI_1.PlayerName == "") + return ""; + + if( switch == 0 ) + { + return RelatedPRI_1.PlayerName@Default.HasReachedString@class(OptionalObject).default.ItemName@default.LevelString@KFGGPRI(RelatedPRI_1).WeaponLevel$"/"$KFGGGameReplicationInfo(RelatedPRI_1.Level.GRI).MaxWeaponLevel$"!"; + } + else if( switch == 1 ) + { + return RelatedPRI_1.PlayerName@Default.FinalWeaponString@class(OptionalObject).default.ItemName$"!!!"; + } + else if( switch == 2 ) + { + return RelatedPRI_1.PlayerName@Default.StoleALevelFromString@RelatedPRI_2.PlayerName$"!"; + } +} + +static simulated function ClientReceive( + PlayerController P, + optional int Switch, + optional PlayerReplicationInfo RelatedPRI_1, + optional PlayerReplicationInfo RelatedPRI_2, + optional Object OptionalObject + ) +{ + Super.ClientReceive(P, Switch, RelatedPRI_1, RelatedPRI_2, OptionalObject); + + if ( Switch == 0 ) + { + P.ClientPlaySound(default.StageSound, true, 2.0); + } + else if( Switch == 1 ) + { + P.ClientPlaySound(default.FinalStageSound, true, 2.0); + } + else if( Switch == 2 ) + { + P.ClientPlaySound(default.StoleLevelSound, true, 2.0); + } +} + +defaultproperties +{ + HasReachedString="has reached the" + FirstString="first!" + FinalWeaponString="has reached the final weapon" + LevelString="level" + StoleALevelFromString="stole a level from" + StageSound=Sound'KF_InterfaceSnd.Perks.PerkAchieved' + FinalStageSound=Sound'KF_FoundrySnd.Alarm_SirenLoop01' + StoleLevelSound=Sound'Miscsounds.Egg.DeanScream' + bIsUnique=False + Lifetime=4 + DrawColor=(B=0,G=255) + PosY=0.300000 +} diff --git a/Classes/GGHUDKillingFloor.uc b/Classes/GGHUDKillingFloor.uc new file mode 100644 index 0000000..f4b943e --- /dev/null +++ b/Classes/GGHUDKillingFloor.uc @@ -0,0 +1,234 @@ +class GGHUDKillingFloor extends HUDKillingFloor; + +var byte PLCount,PLPosition; +var float NextPosUpdate; +var localized string LostMatchStr,WonMatchStr,OtherWinnerStr; + +simulated final function UpdatePosition() +{ + local int i; + local PlayerReplicationInfo PRI; + + PLCount = 1; + PLPosition = 1; + PRI = PlayerOwner.PlayerReplicationInfo; + for( i=0; iPRI.Kills ) + PLPosition++; + } +} + +simulated function DrawHud(Canvas C) +{ + local KFGameReplicationInfo CurrentGame; + local rotator CamRot; + local vector CamPos, ViewDir; + local int i; + local bool bBloom; + + if ( KFGameType(PlayerOwner.Level.Game) != none ) + CurrentGame = KFGameReplicationInfo(PlayerOwner.Level.GRI); + + if ( FontsPrecached < 2 ) + PrecacheFonts(C); + + UpdateHud(); + + PassStyle = STY_Modulated; + DrawModOverlay(C); + + bBloom = bool(ConsoleCommand("get ini:Engine.Engine.ViewportManager Bloom")); + if ( bBloom ) + { + PlayerOwner.PostFX_SetActive(0, true); + } + + if( bHideHud ) + return; + + if ( bShowTargeting ) + DrawTargeting(C); + + // Grab our View Direction + C.GetCameraLocation(CamPos,CamRot); + ViewDir = vector(CamRot); + + // Draw the Name, Health, Armor, and Veterancy above other players + for ( i = 0; i < PlayerInfoPawns.Length; i++ ) + { + if ( PlayerInfoPawns[i].Pawn != none && PlayerInfoPawns[i].Pawn.Health > 0 && (PlayerInfoPawns[i].Pawn.Location - PawnOwner.Location) dot ViewDir > 0.8 && + PlayerInfoPawns[i].RendTime > Level.TimeSeconds ) + DrawPlayerInfo(C, PlayerInfoPawns[i].Pawn, PlayerInfoPawns[i].PlayerInfoScreenPosX, PlayerInfoPawns[i].PlayerInfoScreenPosY); + else PlayerInfoPawns.Remove(i--, 1); + } + + PassStyle = STY_Alpha; + DrawDamageIndicators(C); + if( !bShowScoreboard ) + { + DrawHudPassA(C); + } + + DrawHudPassC(C); + + if ( KFPlayerController(PlayerOwner)!= None && KFPlayerController(PlayerOwner).ActiveNote!= None ) + { + if( PlayerOwner.Pawn == none ) + KFPlayerController(PlayerOwner).ActiveNote = None; + else KFPlayerController(PlayerOwner).ActiveNote.RenderNote(C); + } + + PassStyle = STY_None; + DisplayLocalMessages(C); + if( !bShowScoreboard ) + { + DrawWeaponName(C); + DrawVehicleName(C); + } + + PassStyle = STY_Modulated; + + if ( KFGameReplicationInfo(Level.GRI)!= None && KFGameReplicationInfo(Level.GRI).EndGameType > 0 ) + { + if ( KFGameReplicationInfo(Level.GRI).EndGameType == 2 ) + DrawEndGameHUD(C, True); + else DrawEndGameHUD(C, False); + } + else DrawKFHUDTextElements(C); + + if ( bShowNotification ) + DrawPopupNotification(C); +} + +function DrawDoorHealthBars(Canvas C) +{ + if( PlayerOwner.Pawn!=None ) + Super.DrawDoorHealthBars(C); +} + +simulated function DrawKFHUDTextElements(Canvas C); + +simulated function DrawHudPassC(Canvas C) +{ + DrawFadeEffect(C); + + if ( bShowScoreBoard && ScoreBoard != None ) + { + ScoreBoard.DrawScoreboard(C); + } + + // portrait + if ( bShowPortrait && (Portrait != None) ) + { + DrawPortrait(C); + } + + if ( PawnOwner != None && PawnOwner.Weapon != None && KFWeapon(PawnOwner.Weapon) != none ) + { + if( !KFWeapon(PawnOwner.Weapon).bAimingRifle && !PawnOwner.Weapon.IsA('Crossbow') + && !PawnOwner.Weapon.IsA('M14EBRBattleRifle') && !PawnOwner.Weapon.IsA('M99SniperRifle') ) + { + DrawCrosshair(C); + } + } + + // Slow, for debugging only + if( bDebugPlayerCollision && (class'ROEngine.ROLevelInfo'.static.RODebugMode() || Level.NetMode == NM_StandAlone) ) + { + DrawPointSphere(); + } + +} + +simulated function DrawCrosshair (Canvas C) +{ + local float NormalScale; + local int i, CurrentCrosshair; + local float OldScale,OldW, CurrentCrosshairScale; + local color CurrentCrosshairColor; + local SpriteWidget CHtexture; + +// if (!bCrosshairShow /*|| !class'ROEngine.ROLevelInfo'.static.RODebugMode() || !bShowKFDebugXHair*/) +// return; + + if ( (PawnOwner != None) && (PawnOwner.Weapon != None) && (PawnOwner.Weapon.CustomCrosshair >= 0) ) + { + CurrentCrosshairColor = PawnOwner.Weapon.CustomCrosshairColor; + CurrentCrosshair = PawnOwner.Weapon.CustomCrosshair; + CurrentCrosshairScale = PawnOwner.Weapon.CustomCrosshairScale; + if ( PawnOwner.Weapon.CustomCrosshairTextureName != "" ) + { + if ( PawnOwner.Weapon.CustomCrosshairTexture == None ) + { + PawnOwner.Weapon.CustomCrosshairTexture = Texture(DynamicLoadObject(PawnOwner.Weapon.CustomCrosshairTextureName,class'Texture')); + if ( PawnOwner.Weapon.CustomCrosshairTexture == None ) + { + log(PawnOwner.Weapon$" custom crosshair texture not found!"); + PawnOwner.Weapon.CustomCrosshairTextureName = ""; + } + } + CHTexture = Crosshairs[0]; + CHTexture.WidgetTexture = PawnOwner.Weapon.CustomCrosshairTexture; + } + } + else + { + CurrentCrosshair = CrosshairStyle; + CurrentCrosshairColor = CrosshairColor; + CurrentCrosshairScale = CrosshairScale; + } + + CurrentCrosshair = Clamp(CurrentCrosshair, 0, Crosshairs.Length - 1); + + NormalScale = Crosshairs[CurrentCrosshair].TextureScale; + if ( CHTexture.WidgetTexture == None ) + CHTexture = Crosshairs[CurrentCrosshair]; + CHTexture.TextureScale *= CurrentCrosshairScale; + + for( i = 0; i < ArrayCount(CHTexture.Tints); i++ ) + CHTexture.Tints[i] = CurrentCrossHairColor; + + OldScale = HudScale; + HudScale=1; + OldW = C.ColorModulate.W; + C.ColorModulate.W = 1; + DrawSpriteWidget (C, CHTexture); + C.ColorModulate.W = OldW; + HudScale=OldScale; + CHTexture.TextureScale = NormalScale; + + //DrawEnemyName(C); +} + +simulated function DrawEndGameHUD(Canvas C, bool bVictory) +{ + C.SetDrawColor(255, 255, 255, 255); + C.Font = LoadFont(1); + C.SetPos(0,C.ClipY*0.7f); + C.bCenter = true; +// if( TeamInfo(KFGRI.Winner)==None ) +// C.DrawText(LostMatchStr,false); +// else if( TeamInfo(KFGRI.Winner).TeamIndex==0 ) +// C.DrawText("Red Team"$OtherWinnerStr,false); +// else C.DrawText("Blue Team"$OtherWinnerStr,false); + if( PlayerReplicationInfo(KFGRI.Winner)==None ) + C.DrawText(LostMatchStr,false); // Do something else here + else if( KFGRI.Winner==PlayerOwner.PlayerReplicationInfo ) + C.DrawText(WonMatchStr,false); + else C.DrawText(PlayerReplicationInfo(KFGRI.Winner).PlayerName$WonMatchPostFix,false); + + C.bCenter = false; + if ( bShowScoreBoard && ScoreBoard != None ) + ScoreBoard.DrawScoreboard(C); +} + +defaultproperties +{ + LostMatchStr="You've have lost the match!" + WonMatchStr="You've have won the match!" + OtherWinnerStr=" is the winner!" +} diff --git a/Classes/GGLobbyFooter.uc b/Classes/GGLobbyFooter.uc new file mode 100644 index 0000000..15c3bcc --- /dev/null +++ b/Classes/GGLobbyFooter.uc @@ -0,0 +1,242 @@ +//----------------------------------------------------------- +// +//----------------------------------------------------------- +class GGLobbyFooter extends ButtonFooter; + +var automated GUIButton b_Ready, b_Cancel, b_Options; + +function PositionButtons (Canvas C) +{ + local int i; + local GUIButton b; + local float x; + + for ( i = 0; i < Controls.Length; i++ ) + { + b = GUIButton(Controls[i]); + if ( b != None) + { + if ( x == 0 ) + x = ButtonLeft; + else x += GetSpacer(); + b.WinLeft = b.RelativeLeft( x, True ); + x += b.ActualWidth(); + } + } +} + +function bool ButtonsSized(Canvas C) +{ + local int i; + local GUIButton b; + local bool bResult; + local string str; + local float T, AH, AT; + + if ( !bPositioned ) + return false; + + bResult = true; + str = GetLongestCaption(C); + + AH = ActualHeight(); + AT = ActualTop(); + + for (i = 0; i < Controls.Length; i++ ) + { + b = GUIButton(Controls[i]); + if ( b != None ) + { + if ( bAutoSize && bFixedWidth ) + { + if(b.Caption == "") + b.SizingCaption = Left(str,Len(str)/2); + else + b.SizingCaption = str; + } + else b.SizingCaption = ""; + + bResult = bResult && b.bPositioned; + if ( bFullHeight ) + b.WinHeight = b.RelativeHeight(AH,true); + else b.WinHeight = b.RelativeHeight(ActualHeight(ButtonHeight),true); + + switch ( Justification ) + { + case TXTA_Left: + T = ClientBounds[1]; + break; + + case TXTA_Center: + T = (AT + AH / 2) - (b.ActualHeight() / 2); + break; + + case TXTA_Right: + T = ClientBounds[3] - b.ActualHeight(); + break; + } + + //b.WinTop = AT + ((AH - ActualHeight(ButtonHeight)) / 2); + b.WinTop = b.RelativeTop(T, true ) + ((WinHeight - ButtonHeight) / 2); + } + } + + return bResult; +} + +function float GetButtonLeft() +{ + local int i; + local GUIButton b; + local float TotalWidth, AW, AL; + local float FooterMargin; + + AL = ActualLeft(); + AW = ActualWidth(); + FooterMargin = GetMargin(); + + for (i = 0; i < Controls.Length; i++ ) + { + b = GUIButton(Controls[i]); + if ( b != None ) + { + if ( TotalWidth > 0 ) + TotalWidth += GetSpacer(); + + TotalWidth += b.ActualWidth(); + } + } + + if ( Alignment == TXTA_Center ) + return (AL + AW) / 2 - FooterMargin / 2 - TotalWidth / 2; + + if ( Alignment == TXTA_Right ) + return (AL + AW - FooterMargin / 2) - TotalWidth; + + return AL + (FooterMargin / 2); +} + +// Finds the longest caption of all the buttons +function string GetLongestCaption(Canvas C) +{ + local int i; + local float XL, YL, LongestW; + local string str; + local GUIButton b; + + if ( C == None ) + return ""; + + for ( i = 0; i < Controls.Length; i++ ) + { + b = GUIButton(Controls[i]); + if ( b != None ) + { + if ( b.Style != None ) + b.Style.TextSize(C, b.MenuState, b.Caption, XL, YL, b.FontScale); + else C.StrLen( b.Caption, XL, YL ); + + if ( LongestW == 0 || XL > LongestW ) + { + str = b.Caption; + LongestW = XL; + } + } + } + + return str; +} + +function bool OnFooterClick(GUIComponent Sender) +{ + local GUIController C; + local PlayerController PC; + + PC = PlayerOwner(); + C = Controller; + if(Sender == b_Cancel) + { + //Kill Window and exit game/disconnect from server + LobbyMenu(PageOwner).bAllowClose = true; + C.ViewportOwner.Console.ConsoleCommand("DISCONNECT"); + KFGUIController(C).ReturnToMainMenu(); + } + else if(Sender == b_Ready) + { + if ( PC.PlayerReplicationInfo.Team != none ) + { + //Set Ready + //PC.ServerRestartPlayer(); + PC.PlayerReplicationInfo.bReadyToPlay = True; + //if ( PC.Level.GRI.bMatchHasBegun ) + PC.ClientCloseMenu(true, false); + } + } + else if (Sender == b_Options) + { + PC.ClientOpenMenu("KFGUI.KFSettingsPage", false); + } + + return false; +} + +function OnSteamStatsAndAchievementsReady() +{ + PlayerOwner().ClientOpenMenu("KFGUI.KFProfilePage", false); +} + +defaultproperties +{ + Begin Object Class=GUIButton Name=ReadyButton + Caption="Ready" + Hint="Click here to choose your team and begin" + WinTop=0.966146 + WinLeft=0.350000 + WinWidth=0.120000 + WinHeight=0.033203 + RenderWeight=2.000000 + TabOrder=5 + bBoundToParent=True + ToolTip=None + + OnClick=GGLobbyFooter.OnFooterClick + OnKeyEvent=ReadyButton.InternalOnKeyEvent + End Object + b_Ready=GUIButton'KFGunGame.GGLobbyFooter.ReadyButton' + + Begin Object Class=GUIButton Name=Cancel + Caption="Disconnect" + Hint="Disconnect From This Server" + WinTop=0.966146 + WinLeft=0.280000 + WinWidth=0.120000 + WinHeight=0.033203 + RenderWeight=2.000000 + TabOrder=4 + bBoundToParent=True + ToolTip=None + + OnClick=GGLobbyFooter.OnFooterClick + OnKeyEvent=Cancel.InternalOnKeyEvent + End Object + b_Cancel=GUIButton'KFGunGame.GGLobbyFooter.Cancel' + + Begin Object Class=GUIButton Name=Options + Caption="Options" + Hint="Change game settings." + WinTop=0.966146 + WinLeft=-0.500000 + WinWidth=0.120000 + WinHeight=0.033203 + RenderWeight=2.000000 + TabOrder=3 + bBoundToParent=True + ToolTip=None + + OnClick=GGLobbyFooter.OnFooterClick + OnKeyEvent=Cancel.InternalOnKeyEvent + End Object + b_Options=GUIButton'KFGunGame.GGLobbyFooter.Options' + + OnPreDraw=GGLobbyFooter.InternalOnPreDraw +} diff --git a/Classes/GGLobbyMenu.uc b/Classes/GGLobbyMenu.uc new file mode 100644 index 0000000..8f3080d --- /dev/null +++ b/Classes/GGLobbyMenu.uc @@ -0,0 +1,2255 @@ +class GGLobbyMenu extends UT2k4MainPage; + +var automated GUIButton TeamButtons[2]; + +var automated moCheckBox ReadyBox[16]; +var automated KFPlayerReadyBar PlayerBox[16]; +var automated GUIImage PlayerPerk[16]; +var automated GUILabel PlayerVetLabel[16]; + +var automated moCheckBox ReadyBox2[16]; +var automated KFPlayerReadyBar PlayerBox2[16]; +var automated GUIImage PlayerPerk2[16]; +var automated GUILabel PlayerVetLabel2[16]; + +var automated KFLobbyChat t_ChatBox; +var automated GUILabel label_TimeOutCounter; +var automated GUILabel SpectatorsLabel; + +var bool bAllowClose; +var int ActivateTimeoutTime; // When was the lobby timeout turned on? +var bool bTimeoutTimeLogged; // Was it already logged once? +var bool bTimedOut; // Have we timed out out successfully? +var bool bShouldUpdateVeterancy; + +// Video Ad +var automated GUISectionBackground ADBackground; +var LobbyMenuAd LobbyMenuAd; +var float VideoTimer; +var bool VideoPlayed; + +// Localized Strings +var localized string LvAbbrString; +var localized string SelectPerkInformationString; +var localized string WaitingForServerStatus; +var localized string WaitingForOtherPlayers; +var localized string AutoCommence; +var localized string SpectatorsString; + +function InitComponent(GUIController MyC, GUIComponent MyO) +{ + local int i; + + super.InitComponent(MyC, MyO); + + LobbyMenuAd = new class'LobbyMenuAd'; + + for ( i = 0; i < 16; i++ ) + { + PlayerPerk[i].WinWidth = PlayerPerk[i].ActualHeight(); + PlayerPerk[i].WinLeft += ((PlayerBox[i].ActualHeight() - PlayerPerk[i].ActualHeight()) / 2) / MyC.ResX; + + PlayerPerk2[i].WinWidth = PlayerPerk2[i].ActualHeight(); + PlayerPerk2[i].WinLeft += ((PlayerBox2[i].ActualHeight() - PlayerPerk2[i].ActualHeight()) / 2) / MyC.ResX; + } +} + +function bool InternalOnKeyEvent(out byte Key, out byte State, float delta) +{ + local int i; + local bool bVoiceChatKey; + local array BindKeyNames, LocalizedBindKeyNames; + + Controller.GetAssignedKeys( "VoiceTalk", BindKeyNames, LocalizedBindKeyNames ); + + for ( i = 0; i < BindKeyNames.Length; i++ ) + { + if ( Mid( GetEnum(enum'EInputKey', Key), 3 ) ~= BindKeyNames[i] ) + { + bVoiceChatKey = true; + break; + } + } + + if ( bVoiceChatKey ) + { + if ( state == 1 || state == 2 ) + { + if ( PlayerOwner() != none ) + { + PlayerOwner().bVoiceTalk = 1; + } + } + else + { + if ( PlayerOwner() != none ) + { + PlayerOwner().bVoiceTalk = 0; + return false; + } + } + + return true; + } + + return false; +} + +function CheckBotButtonAccess(); +function UpdateBotSlots(); + +function ClearChatBox() +{ + t_ChatBox.lb_Chat.SetContent(""); +} + +function TimedOut() +{ + bTimedOut = true; + PlayerOwner().ServerRestartPlayer(); + bAllowClose = true; +} + +function bool InternalOnPreDraw(Canvas C) +{ + local int i, z, Team1Index, Team2Index; + local KFGameReplicationInfo KFGRI; + local PlayerController PC; + local PlayerReplicationInfo InList[16], InList2[16]; + local bool bWasThere, bShowProfilePage; + local string SpectatingString; + + PC = PlayerOwner(); + + if ( PC == none || PC.Level == none ) // Error? + { + return false; + } + + if ( PC.PlayerReplicationInfo != none && (!PC.PlayerReplicationInfo.bWaitingPlayer || PC.PlayerReplicationInfo.bOnlySpectator) ) + { + PC.ClientCloseMenu(True,False); + return false; + } + + t_Footer.InternalOnPreDraw(C); + + KFGRI = KFGameReplicationInfo(PC.GameReplicationInfo); + + if ( KFPlayerController(PC) != none && bShouldUpdateVeterancy ) + { + if ( KFPlayerController(PC).SelectedVeterancy == none ) + { + bShowProfilePage = true; + + if ( PC.SteamStatsAndAchievements == none ) + { + if ( PC.Level.NetMode != NM_Client ) + { + PC.SteamStatsAndAchievements = PC.Spawn(PC.default.SteamStatsAndAchievementsClass, PC); + if ( !PC.SteamStatsAndAchievements.Initialize(PC) ) + { + Controller.OpenMenu(Controller.QuestionMenuClass); + GUIQuestionPage(Controller.TopPage()).SetupQuestion(class'KFMainMenu'.default.UnknownSteamErrorText, QBTN_Ok, QBTN_Ok); + PC.SteamStatsAndAchievements.Destroy(); + PC.SteamStatsAndAchievements = none; + } + else + { + PC.SteamStatsAndAchievements.OnDataInitialized = OnSteamStatsAndAchievementsReady; + } + } + + bShowProfilePage = false; + } + else if ( !PC.SteamStatsAndAchievements.bInitialized ) + { + PC.SteamStatsAndAchievements.OnDataInitialized = OnSteamStatsAndAchievementsReady; + PC.SteamStatsAndAchievements.GetStatsAndAchievements(); + bShowProfilePage = false; + } + + if ( KFSteamStatsAndAchievements(PC.SteamStatsAndAchievements) != none ) + { + for ( i = 0; i < class'KFGameType'.default.LoadedSkills.Length; i++ ) + { + if ( KFSteamStatsAndAchievements(PC.SteamStatsAndAchievements).GetPerkProgress(i) < 0.0 ) + { + PC.SteamStatsAndAchievements.OnDataInitialized = OnSteamStatsAndAchievementsReady; + PC.SteamStatsAndAchievements.GetStatsAndAchievements(); + bShowProfilePage = false; + } + } + } + + if ( bShowProfilePage ) + { + OnSteamStatsAndAchievementsReady(); + } + } + else if ( PC.SteamStatsAndAchievements != none && PC.SteamStatsAndAchievements.bInitialized ) + { + KFPlayerController(PC).SendSelectedVeterancyToServer(); + } + } + + // First fill in non-ready players. + if ( KFGRI != none ) + { + for ( i = 0; i < KFGRI.PRIArray.Length; i++ ) + { + if ( KFGRI.PRIArray[i] == none || KFGRI.PRIArray[i].bReadyToPlay ) + { + continue; + } + + if ( KFGRI.PRIArray[i].Team == none || KFGRI.PRIArray[i].bOnlySpectator ) + { + if ( SpectatingString != "" ) + { + SpectatingString $= ", "; + } + + SpectatingString $= Left(KFGRI.PRIArray[i].PlayerName, 20); + + continue; + } + + if ( KFGRI.PRIArray[i].Team.TeamIndex == 0 ) + { + if ( Team1Index >= 16 ) + continue; + + PlayerPerk[Team1Index].Image = none; + ReadyBox[Team1Index].Checked(false); + ReadyBox[Team1Index].SetCaption(Left(KFGRI.PRIArray[i].PlayerName, 20)); + + if ( KFPlayerReplicationInfo(KFGRI.PRIArray[i]).ClientVeteranSkill != none ) + { + PlayerVetLabel[Team1Index].Caption = LvAbbrString @ KFPlayerReplicationInfo(KFGRI.PRIArray[i]).ClientVeteranSkillLevel; + PlayerPerk[Team1Index].Image = KFPlayerReplicationInfo(KFGRI.PRIArray[i]).ClientVeteranSkill.default.OnHUDIcon; + } + + InList[Team1Index] = KFGRI.PRIArray[i]; + Team1Index++; + } + else + { + if ( Team2Index >= 16 ) + continue; + + PlayerPerk2[Team2Index].Image = none; + ReadyBox2[Team2Index].Checked(false); + ReadyBox2[Team2Index].SetCaption(Left(KFGRI.PRIArray[i].PlayerName, 20)); + + if ( KFPlayerReplicationInfo(KFGRI.PRIArray[i]).ClientVeteranSkill != none ) + { + PlayerVetLabel2[Team2Index].Caption = LvAbbrString @ KFPlayerReplicationInfo(KFGRI.PRIArray[i]).ClientVeteranSkillLevel; + PlayerPerk2[Team2Index].Image = KFPlayerReplicationInfo(KFGRI.PRIArray[i]).ClientVeteranSkill.default.OnHUDIcon; + } + + InList2[Team2Index] = KFGRI.PRIArray[i]; + Team2Index++; + } + } + + // Then comes rest. + for ( i = 0; i < KFGRI.PRIArray.Length; i++ ) + { + if ( KFGRI.PRIArray[i] == none || KFGRI.PRIArray[i].bOnlySpectator || KFGRI.PRIArray[i].Team == none ) + { + continue; + } + + bWasThere = false; + + for ( z = 0; z < 16; z++ ) + { + if ( InList[z] == KFGRI.PRIArray[i] || InList2[z] == KFGRI.PRIArray[i] ) + { + bWasThere = true; + break; + } + } + + if ( bWasThere ) + { + continue; + } + + if ( KFGRI.PRIArray[i].Team == none || KFGRI.PRIArray[i].Team.TeamIndex == 0 ) + { + if ( Team1Index >= 16 ) + continue; + + PlayerPerk[Team1Index].Image = none; + ReadyBox[Team1Index].Checked(KFGRI.PRIArray[i].bReadyToPlay); + ReadyBox[Team1Index].SetCaption(Left(KFGRI.PRIArray[i].PlayerName, 20)); + + if ( KFPlayerReplicationInfo(KFGRI.PRIArray[i]).ClientVeteranSkill != none ) + { + PlayerVetLabel[Team1Index].Caption = LvAbbrString @ KFPlayerReplicationInfo(KFGRI.PRIArray[i]).ClientVeteranSkillLevel; + PlayerPerk[Team1Index].Image = KFPlayerReplicationInfo(KFGRI.PRIArray[i]).ClientVeteranSkill.default.OnHUDIcon; + } + + Team1Index++; + } + else + { + if ( Team2Index >= 16 ) + continue; + + PlayerPerk2[Team2Index].Image = none; + ReadyBox2[Team2Index].Checked(KFGRI.PRIArray[i].bReadyToPlay); + ReadyBox2[Team2Index].SetCaption(Left(KFGRI.PRIArray[i].PlayerName, 20)); + + if ( KFPlayerReplicationInfo(KFGRI.PRIArray[i]).ClientVeteranSkill != none ) + { + PlayerVetLabel2[Team2Index].Caption = LvAbbrString @ KFPlayerReplicationInfo(KFGRI.PRIArray[i]).ClientVeteranSkillLevel; + PlayerPerk2[Team2Index].Image = KFPlayerReplicationInfo(KFGRI.PRIArray[i]).ClientVeteranSkill.default.OnHUDIcon; + } + + Team2Index++; + } + + if ( KFGRI.PRIArray[i].bReadyToPlay ) + { + if ( !bTimeoutTimeLogged ) + { + ActivateTimeoutTime = PC.Level.TimeSeconds; + bTimeoutTimeLogged = true; + } + } + } + } + + while( Team1Index < 16 ) + { + PlayerPerk[Team1Index].Image = none; + ReadyBox[Team1Index].Checked(False); + ReadyBox[Team1Index].SetCaption(""); + PlayerVetLabel[Team1Index].Caption = ""; + Team1Index++; + } + + while( Team2Index < 16 ) + { + PlayerPerk2[Team2Index].Image = none; + ReadyBox2[Team2Index].Checked(False); + ReadyBox2[Team2Index].SetCaption(""); + PlayerVetLabel2[Team2Index].Caption = ""; + Team2Index++; + } + + SpectatorsLabel.Caption = SpectatorsString @ SpectatingString; + + return false; +} + +function bool OnTeam1ButtonClick(GUIComponent Sender) +{ + local PlayerController PC; + + PC = PlayerOwner(); + + if ( PC != none ) + { + PC.ServerChangeTeam(1); + } + + return true; +} + +function bool OnTeam2ButtonClick(GUIComponent Sender) +{ + local PlayerController PC; + + PC = PlayerOwner(); + + if ( PC != none ) + { + PC.ServerChangeTeam(1); + } + + return true; +} + +function bool StopClose(optional bool bCancelled) +{ + ClearChatBox(); + + // this is for the OnCanClose delegate + // can't close now unless done by call to CloseAll, + // or the bool has been set to true by LobbyFooter + return false; +} + +event Opened(GUIComponent Sender) // Called when the Menu Owner is opened +{ + if ( LobbyMenuAd == none) + { + LobbyMenuAd = new class'LobbyMenuAd'; + } + + bShouldUpdateVeterancy = true; + SetTimer(1,true); + VideoTimer = 0.0; + VideoPlayed = false; +} + +function InternalOnClosed(bool bCancelled) +{ + if ( PlayerOwner() != none) + { + PlayerOwner().Advertising_ExitZone(); + } + + if ( LobbyMenuAd != none ) + { + LobbyMenuAd.DestroyMovie(); + LobbyMenuAd = none; + } +} + +event Timer() +{ + local KFGameReplicationInfo KF; + + if ( PlayerOwner().PlayerReplicationInfo.bOnlySpectator ) + { + label_TimeOutCounter.caption = "You are a spectator."; + Return; + } + + KF = KFGameReplicationInfo(PlayerOwner().GameReplicationInfo); + + if ( KF == none ) + { + label_TimeOutCounter.caption = WaitingForServerStatus; + } +// else if ( KF.LobbyTimeout <= 0 ) +// { + label_TimeOutCounter.caption = WaitingForOtherPlayers; +// } +// else +// { +// label_TimeOutCounter.caption = AutoCommence$":" @ KF.LobbyTimeout; +// } +} + +function DrawAd(Canvas Canvas) +{ + local float X; + local AdAsset.AdAssetState adState; + local bool bFocused; + + bFocused = Controller.ActivePage == self; + + if ( bFocused ) + { + VideoTimer += Controller.RenderDelta; + } + else + { + if ( LobbyMenuAd == None || !LobbyMenuAd.MenuMovie.IsPlaying() ) + { + VideoTimer = 0.0; + } + + VideoPlayed = false; + } + + if ( bFocused && LobbyMenuAd != none ) + { + Canvas.SetPos(0.349700 * Canvas.ClipX + 5, 0.037343 * Canvas.ClipY + 30); + X = Canvas.ClipX / 1024; // X & Y scale + + AdBackground.WinWidth = 320 * X + 10; + AdBackground.WinHeight = 240 * X + 37; + + // refresh state from ad + VideoPlayed = LobbyMenuAd.HasBeenDisplayed(); + + adState = LobbyMenuAd.GetState(); + if (adState == 2) // ADASSET_STATE_DOWNLOADED + { + if ( !VideoPlayed && !LobbyMenuAd.MenuMovie.IsPlaying() ) + { + // Start video + VideoPlayed = true; + LobbyMenuAd.MenuMovie.Play(false); + } + + // Hold on the first frame for 3 seconds so it doesn't + // Overwhelm the player + if (VideoTimer < 3.0 ) + { + LobbyMenuAd.MenuMovie.Pause(true); + } + else + { + LobbyMenuAd.MenuMovie.Pause(false); + + if (!VideoPlayed) + { + VideoPlayed = true; + + // Report interaction on advertisement + LobbyMenuAd.Displayed(); + } + + } + + Canvas.DrawTile(LobbyMenuAd.MenuMovie, 320 * X, 240 * X, + 0, 0, 320, 240); + } + else if (VideoTimer >= 30.0) + { + if (!VideoPlayed) + { + VideoPlayed = true; + + // Assume it timed out + // Report interaction on the default advertisement + LobbyMenuAd.Displayed(); + } + } + } +} + +function bool ShowPerkMenu(GUIComponent Sender) +{ + if ( PlayerOwner() != none) + { + PlayerOwner().ClientOpenMenu("KFGUI.KFProfilePage", false); + } + + return true; +} + +function OnSteamStatsAndAchievementsReady() +{ + Controller.OpenMenu("KFGUI.KFProfilePage"); + + Controller.OpenMenu(Controller.QuestionMenuClass); + GUIQuestionPage(Controller.TopPage()).SetupQuestion(SelectPerkInformationString, QBTN_Ok, QBTN_Ok); +} + +defaultproperties +{ + Begin Object Class=GUIButton Name=Team1Button + Caption="Green Team" + Hint="Click to join Green Team" + WinTop=0.001000 + WinLeft=0.102422 + WinWidth=0.120000 + WinHeight=0.033203 + RenderWeight=2.000000 + TabOrder=4 + bBoundToParent=True + ToolTip=None + + OnClick=GGLobbyMenu.OnTeam1ButtonClick + OnKeyEvent=Team1Button.InternalOnKeyEvent + End Object + TeamButtons(0)=GUIButton'KFGunGame.GGLobbyMenu.Team1Button' + + Begin Object Class=GUIButton Name=Team2Button + Caption="Blue Team" + Hint="Click to join Blue Team" + WinTop=0.001000 + WinLeft=0.762695 + WinWidth=0.120000 + WinHeight=0.033203 + RenderWeight=2.000000 + TabOrder=4 + bBoundToParent=True + ToolTip=None + + OnClick=GGLobbyMenu.OnTeam2ButtonClick + OnKeyEvent=Team2Button.InternalOnKeyEvent + End Object + TeamButtons(1)=GUIButton'KFGunGame.GGLobbyMenu.Team2Button' + + Begin Object Class=moCheckBox Name=ReadyBox0 + bValueReadOnly=True + ComponentJustification=TXTA_Left + CaptionWidth=0.820000 + Caption="NAME1" + LabelStyleName="" + LabelColor=(B=10,G=10,R=10,A=210) + OnCreateComponent=ReadyBox0.InternalOnCreateComponent + WinTop=0.047500 + WinLeft=0.052000 + WinWidth=0.290000 + WinHeight=0.045000 + RenderWeight=0.550000 + bAcceptsInput=False + bNeverFocus=True + bAnimating=True + End Object + ReadyBox(0)=moCheckBox'KFGunGame.GGLobbyMenu.ReadyBox0' + + Begin Object Class=moCheckBox Name=ReadyBox1 + bValueReadOnly=True + ComponentJustification=TXTA_Left + CaptionWidth=0.820000 + Caption="NAME2" + LabelColor=(B=0) + OnCreateComponent=ReadyBox1.InternalOnCreateComponent + WinTop=0.092500 + WinLeft=0.052000 + WinWidth=0.290000 + WinHeight=0.045000 + RenderWeight=0.550000 + bAcceptsInput=False + bNeverFocus=True + bAnimating=True + End Object + ReadyBox(1)=moCheckBox'KFGunGame.GGLobbyMenu.ReadyBox1' + + Begin Object Class=moCheckBox Name=ReadyBox012 + bValueReadOnly=True + ComponentJustification=TXTA_Left + CaptionWidth=0.820000 + Caption="NAME3" + LabelColor=(B=0) + OnCreateComponent=ReadyBox012.InternalOnCreateComponent + WinTop=0.137500 + WinLeft=0.052000 + WinWidth=0.290000 + WinHeight=0.048000 + RenderWeight=0.550000 + bAcceptsInput=False + bNeverFocus=True + bAnimating=True + End Object + ReadyBox(2)=moCheckBox'KFGunGame.GGLobbyMenu.ReadyBox012' + + Begin Object Class=moCheckBox Name=ReadyBox3 + bValueReadOnly=True + ComponentJustification=TXTA_Left + CaptionWidth=0.820000 + Caption="NAME4" + LabelColor=(B=0) + OnCreateComponent=ReadyBox3.InternalOnCreateComponent + WinTop=0.182500 + WinLeft=0.052000 + WinWidth=0.290000 + WinHeight=0.045000 + RenderWeight=0.550000 + bAcceptsInput=False + bNeverFocus=True + bAnimating=True + End Object + ReadyBox(3)=moCheckBox'KFGunGame.GGLobbyMenu.ReadyBox3' + + Begin Object Class=moCheckBox Name=ReadyBox4 + bValueReadOnly=True + ComponentJustification=TXTA_Left + CaptionWidth=0.820000 + Caption="NAME5" + LabelColor=(B=0) + OnCreateComponent=ReadyBox4.InternalOnCreateComponent + WinTop=0.227500 + WinLeft=0.052000 + WinWidth=0.290000 + WinHeight=0.045000 + RenderWeight=0.550000 + bAcceptsInput=False + bNeverFocus=True + bAnimating=True + End Object + ReadyBox(4)=moCheckBox'KFGunGame.GGLobbyMenu.ReadyBox4' + + Begin Object Class=moCheckBox Name=ReadyBox5 + bValueReadOnly=True + ComponentJustification=TXTA_Left + CaptionWidth=0.820000 + Caption="NAME6" + LabelColor=(B=0) + OnCreateComponent=ReadyBox5.InternalOnCreateComponent + WinTop=0.272500 + WinLeft=0.052000 + WinWidth=0.290000 + WinHeight=0.045000 + RenderWeight=0.550000 + bAcceptsInput=False + bNeverFocus=True + bAnimating=True + End Object + ReadyBox(5)=moCheckBox'KFGunGame.GGLobbyMenu.ReadyBox5' + + Begin Object Class=moCheckBox Name=ReadyBox6 + bValueReadOnly=True + ComponentJustification=TXTA_Left + CaptionWidth=0.820000 + Caption="NAME1" + LabelStyleName="" + LabelColor=(B=10,G=10,R=10,A=210) + OnCreateComponent=ReadyBox6.InternalOnCreateComponent + WinTop=0.317500 + WinLeft=0.052000 + WinWidth=0.290000 + WinHeight=0.045000 + RenderWeight=0.550000 + bAcceptsInput=False + bNeverFocus=True + bAnimating=True + End Object + ReadyBox(6)=moCheckBox'KFGunGame.GGLobbyMenu.ReadyBox6' + + Begin Object Class=moCheckBox Name=ReadyBox7 + bValueReadOnly=True + ComponentJustification=TXTA_Left + CaptionWidth=0.820000 + Caption="NAME1" + LabelStyleName="" + LabelColor=(B=10,G=10,R=10,A=210) + OnCreateComponent=ReadyBox7.InternalOnCreateComponent + WinTop=0.362500 + WinLeft=0.052000 + WinWidth=0.290000 + WinHeight=0.045000 + RenderWeight=0.550000 + bAcceptsInput=False + bNeverFocus=True + bAnimating=True + End Object + ReadyBox(7)=moCheckBox'KFGunGame.GGLobbyMenu.ReadyBox7' + + Begin Object Class=moCheckBox Name=ReadyBox8 + bValueReadOnly=True + ComponentJustification=TXTA_Left + CaptionWidth=0.820000 + Caption="NAME1" + LabelStyleName="" + LabelColor=(B=10,G=10,R=10,A=210) + OnCreateComponent=ReadyBox8.InternalOnCreateComponent + WinTop=0.407500 + WinLeft=0.052000 + WinWidth=0.290000 + WinHeight=0.045000 + RenderWeight=0.550000 + bAcceptsInput=False + bNeverFocus=True + bAnimating=True + End Object + ReadyBox(8)=moCheckBox'KFGunGame.GGLobbyMenu.ReadyBox8' + + Begin Object Class=moCheckBox Name=ReadyBox9 + bValueReadOnly=True + ComponentJustification=TXTA_Left + CaptionWidth=0.820000 + Caption="NAME1" + LabelStyleName="" + LabelColor=(B=10,G=10,R=10,A=210) + OnCreateComponent=ReadyBox9.InternalOnCreateComponent + WinTop=0.452500 + WinLeft=0.052000 + WinWidth=0.290000 + WinHeight=0.045000 + RenderWeight=0.550000 + bAcceptsInput=False + bNeverFocus=True + bAnimating=True + End Object + ReadyBox(9)=moCheckBox'KFGunGame.GGLobbyMenu.ReadyBox9' + + Begin Object Class=moCheckBox Name=ReadyBox10 + bValueReadOnly=True + ComponentJustification=TXTA_Left + CaptionWidth=0.820000 + Caption="NAME1" + LabelStyleName="" + LabelColor=(B=10,G=10,R=10,A=210) + OnCreateComponent=ReadyBox10.InternalOnCreateComponent + WinTop=0.497500 + WinLeft=0.052000 + WinWidth=0.290000 + WinHeight=0.045000 + RenderWeight=0.550000 + bAcceptsInput=False + bNeverFocus=True + bAnimating=True + End Object + ReadyBox(10)=moCheckBox'KFGunGame.GGLobbyMenu.ReadyBox10' + + Begin Object Class=moCheckBox Name=ReadyBox11 + bValueReadOnly=True + ComponentJustification=TXTA_Left + CaptionWidth=0.820000 + Caption="NAME1" + LabelStyleName="" + LabelColor=(B=10,G=10,R=10,A=210) + OnCreateComponent=ReadyBox11.InternalOnCreateComponent + WinTop=0.542500 + WinLeft=0.052000 + WinWidth=0.290000 + WinHeight=0.045000 + RenderWeight=0.550000 + bAcceptsInput=False + bNeverFocus=True + bAnimating=True + End Object + ReadyBox(11)=moCheckBox'KFGunGame.GGLobbyMenu.ReadyBox11' + + Begin Object Class=moCheckBox Name=ReadyBox12 + bValueReadOnly=True + ComponentJustification=TXTA_Left + CaptionWidth=0.820000 + Caption="NAME1" + LabelStyleName="" + LabelColor=(B=10,G=10,R=10,A=210) + OnCreateComponent=ReadyBox12.InternalOnCreateComponent + WinTop=0.587500 + WinLeft=0.052000 + WinWidth=0.290000 + WinHeight=0.045000 + RenderWeight=0.550000 + bAcceptsInput=False + bNeverFocus=True + bAnimating=True + End Object + ReadyBox(12)=moCheckBox'KFGunGame.GGLobbyMenu.ReadyBox12' + + Begin Object Class=moCheckBox Name=ReadyBox13 + bValueReadOnly=True + ComponentJustification=TXTA_Left + CaptionWidth=0.820000 + Caption="NAME1" + LabelStyleName="" + LabelColor=(B=10,G=10,R=10,A=210) + OnCreateComponent=ReadyBox13.InternalOnCreateComponent + WinTop=0.632500 + WinLeft=0.052000 + WinWidth=0.290000 + WinHeight=0.045000 + RenderWeight=0.550000 + bAcceptsInput=False + bNeverFocus=True + bAnimating=True + End Object + ReadyBox(13)=moCheckBox'KFGunGame.GGLobbyMenu.ReadyBox13' + + Begin Object Class=moCheckBox Name=ReadyBox14 + bValueReadOnly=True + ComponentJustification=TXTA_Left + CaptionWidth=0.820000 + Caption="NAME1" + LabelStyleName="" + LabelColor=(B=10,G=10,R=10,A=210) + OnCreateComponent=ReadyBox14.InternalOnCreateComponent + WinTop=0.677500 + WinLeft=0.052000 + WinWidth=0.290000 + WinHeight=0.045000 + RenderWeight=0.550000 + bAcceptsInput=False + bNeverFocus=True + bAnimating=True + End Object + ReadyBox(14)=moCheckBox'KFGunGame.GGLobbyMenu.ReadyBox14' + + Begin Object Class=moCheckBox Name=ReadyBox15 + bValueReadOnly=True + ComponentJustification=TXTA_Left + CaptionWidth=0.820000 + Caption="NAME1" + LabelStyleName="" + LabelColor=(B=10,G=10,R=10,A=210) + OnCreateComponent=ReadyBox15.InternalOnCreateComponent + WinTop=0.722500 + WinLeft=0.052000 + WinWidth=0.290000 + WinHeight=0.045000 + RenderWeight=0.550000 + bAcceptsInput=False + bNeverFocus=True + bAnimating=True + End Object + ReadyBox(15)=moCheckBox'KFGunGame.GGLobbyMenu.ReadyBox15' + + Begin Object Class=KFPlayerReadyBar Name=Player1BackDrop + WinTop=0.040000 + WinLeft=0.016250 + WinWidth=0.268750 + WinHeight=0.045000 + RenderWeight=0.350000 + End Object + PlayerBox(0)=KFPlayerReadyBar'KFGunGame.GGLobbyMenu.Player1BackDrop' + + Begin Object Class=KFPlayerReadyBar Name=Player2BackDrop + WinTop=0.085000 + WinLeft=0.016250 + WinWidth=0.268750 + WinHeight=0.045000 + RenderWeight=0.350000 + End Object + PlayerBox(1)=KFPlayerReadyBar'KFGunGame.GGLobbyMenu.Player2BackDrop' + + Begin Object Class=KFPlayerReadyBar Name=Player3BackDrop + WinTop=0.130000 + WinLeft=0.016250 + WinWidth=0.268750 + WinHeight=0.045000 + RenderWeight=0.350000 + End Object + PlayerBox(2)=KFPlayerReadyBar'KFGunGame.GGLobbyMenu.Player3BackDrop' + + Begin Object Class=KFPlayerReadyBar Name=Player4BackDrop + WinTop=0.175000 + WinLeft=0.016250 + WinWidth=0.268750 + WinHeight=0.045000 + RenderWeight=0.350000 + End Object + PlayerBox(3)=KFPlayerReadyBar'KFGunGame.GGLobbyMenu.Player4BackDrop' + + Begin Object Class=KFPlayerReadyBar Name=Player5BackDrop + WinTop=0.220000 + WinLeft=0.016250 + WinWidth=0.268750 + WinHeight=0.045000 + RenderWeight=0.350000 + End Object + PlayerBox(4)=KFPlayerReadyBar'KFGunGame.GGLobbyMenu.Player5BackDrop' + + Begin Object Class=KFPlayerReadyBar Name=Player6BackDrop + WinTop=0.265000 + WinLeft=0.016250 + WinWidth=0.268750 + WinHeight=0.045000 + RenderWeight=0.350000 + End Object + PlayerBox(5)=KFPlayerReadyBar'KFGunGame.GGLobbyMenu.Player6BackDrop' + + Begin Object Class=KFPlayerReadyBar Name=Player7BackDrop + WinTop=0.310000 + WinLeft=0.016250 + WinWidth=0.268750 + WinHeight=0.045000 + RenderWeight=0.350000 + End Object + PlayerBox(6)=KFPlayerReadyBar'KFGunGame.GGLobbyMenu.Player7BackDrop' + + Begin Object Class=KFPlayerReadyBar Name=Player8BackDrop + WinTop=0.355000 + WinLeft=0.016250 + WinWidth=0.268750 + WinHeight=0.045000 + RenderWeight=0.350000 + End Object + PlayerBox(7)=KFPlayerReadyBar'KFGunGame.GGLobbyMenu.Player8BackDrop' + + Begin Object Class=KFPlayerReadyBar Name=Player9BackDrop + WinTop=0.400000 + WinLeft=0.016250 + WinWidth=0.268750 + WinHeight=0.045000 + RenderWeight=0.350000 + End Object + PlayerBox(8)=KFPlayerReadyBar'KFGunGame.GGLobbyMenu.Player9BackDrop' + + Begin Object Class=KFPlayerReadyBar Name=Player10BackDrop + WinTop=0.445000 + WinLeft=0.016250 + WinWidth=0.268750 + WinHeight=0.045000 + RenderWeight=0.350000 + End Object + PlayerBox(9)=KFPlayerReadyBar'KFGunGame.GGLobbyMenu.Player10BackDrop' + + Begin Object Class=KFPlayerReadyBar Name=Player11BackDrop + WinTop=0.490000 + WinLeft=0.016250 + WinWidth=0.268750 + WinHeight=0.045000 + RenderWeight=0.350000 + End Object + PlayerBox(10)=KFPlayerReadyBar'KFGunGame.GGLobbyMenu.Player11BackDrop' + + Begin Object Class=KFPlayerReadyBar Name=Player12BackDrop + WinTop=0.535000 + WinLeft=0.016250 + WinWidth=0.268750 + WinHeight=0.045000 + RenderWeight=0.350000 + End Object + PlayerBox(11)=KFPlayerReadyBar'KFGunGame.GGLobbyMenu.Player12BackDrop' + + Begin Object Class=KFPlayerReadyBar Name=Player13BackDrop + WinTop=0.580000 + WinLeft=0.016250 + WinWidth=0.268750 + WinHeight=0.045000 + RenderWeight=0.350000 + End Object + PlayerBox(12)=KFPlayerReadyBar'KFGunGame.GGLobbyMenu.Player13BackDrop' + + Begin Object Class=KFPlayerReadyBar Name=Player14BackDrop + WinTop=0.625000 + WinLeft=0.016250 + WinWidth=0.268750 + WinHeight=0.045000 + RenderWeight=0.350000 + End Object + PlayerBox(13)=KFPlayerReadyBar'KFGunGame.GGLobbyMenu.Player14BackDrop' + + Begin Object Class=KFPlayerReadyBar Name=Player15BackDrop + WinTop=0.670000 + WinLeft=0.016250 + WinWidth=0.268750 + WinHeight=0.045000 + RenderWeight=0.350000 + End Object + PlayerBox(14)=KFPlayerReadyBar'KFGunGame.GGLobbyMenu.Player15BackDrop' + + Begin Object Class=KFPlayerReadyBar Name=Player16BackDrop + WinTop=0.715000 + WinLeft=0.016250 + WinWidth=0.268750 + WinHeight=0.045000 + RenderWeight=0.350000 + End Object + PlayerBox(15)=KFPlayerReadyBar'KFGunGame.GGLobbyMenu.Player16BackDrop' + + Begin Object Class=GUIImage Name=Player1P + ImageStyle=ISTY_Justified + WinTop=0.043000 + WinLeft=0.017000 + WinWidth=0.039000 + WinHeight=0.039000 + RenderWeight=0.560000 + End Object + PlayerPerk(0)=GUIImage'KFGunGame.GGLobbyMenu.Player1P' + + Begin Object Class=GUIImage Name=Player2P + ImageStyle=ISTY_Justified + WinTop=0.088000 + WinLeft=0.017000 + WinWidth=0.045000 + WinHeight=0.039000 + RenderWeight=0.560000 + End Object + PlayerPerk(1)=GUIImage'KFGunGame.GGLobbyMenu.Player2P' + + Begin Object Class=GUIImage Name=Player3P + ImageStyle=ISTY_Justified + WinTop=0.133000 + WinLeft=0.017000 + WinWidth=0.045000 + WinHeight=0.039000 + RenderWeight=0.560000 + End Object + PlayerPerk(2)=GUIImage'KFGunGame.GGLobbyMenu.Player3P' + + Begin Object Class=GUIImage Name=Player4P + ImageStyle=ISTY_Justified + WinTop=0.178000 + WinLeft=0.017000 + WinWidth=0.045000 + WinHeight=0.039000 + RenderWeight=0.560000 + End Object + PlayerPerk(3)=GUIImage'KFGunGame.GGLobbyMenu.Player4P' + + Begin Object Class=GUIImage Name=Player5P + ImageStyle=ISTY_Justified + WinTop=0.223000 + WinLeft=0.017000 + WinWidth=0.045000 + WinHeight=0.039000 + RenderWeight=0.560000 + End Object + PlayerPerk(4)=GUIImage'KFGunGame.GGLobbyMenu.Player5P' + + Begin Object Class=GUIImage Name=Player6P + ImageStyle=ISTY_Justified + WinTop=0.268000 + WinLeft=0.017000 + WinWidth=0.045000 + WinHeight=0.039000 + RenderWeight=0.560000 + End Object + PlayerPerk(5)=GUIImage'KFGunGame.GGLobbyMenu.Player6P' + + Begin Object Class=GUIImage Name=Player7P + ImageStyle=ISTY_Justified + WinTop=0.313000 + WinLeft=0.017000 + WinWidth=0.039000 + WinHeight=0.039000 + RenderWeight=0.560000 + End Object + PlayerPerk(6)=GUIImage'KFGunGame.GGLobbyMenu.Player7P' + + Begin Object Class=GUIImage Name=Player8P + ImageStyle=ISTY_Justified + WinTop=0.358000 + WinLeft=0.017000 + WinWidth=0.039000 + WinHeight=0.039000 + RenderWeight=0.560000 + End Object + PlayerPerk(7)=GUIImage'KFGunGame.GGLobbyMenu.Player8P' + + Begin Object Class=GUIImage Name=Player9P + ImageStyle=ISTY_Justified + WinTop=0.403000 + WinLeft=0.017000 + WinWidth=0.039000 + WinHeight=0.039000 + RenderWeight=0.560000 + End Object + PlayerPerk(8)=GUIImage'KFGunGame.GGLobbyMenu.Player9P' + + Begin Object Class=GUIImage Name=Player10P + ImageStyle=ISTY_Justified + WinTop=0.448000 + WinLeft=0.017000 + WinWidth=0.039000 + WinHeight=0.039000 + RenderWeight=0.560000 + End Object + PlayerPerk(9)=GUIImage'KFGunGame.GGLobbyMenu.Player10P' + + Begin Object Class=GUIImage Name=Player11P + ImageStyle=ISTY_Justified + WinTop=0.493000 + WinLeft=0.017000 + WinWidth=0.039000 + WinHeight=0.039000 + RenderWeight=0.560000 + End Object + PlayerPerk(10)=GUIImage'KFGunGame.GGLobbyMenu.Player11P' + + Begin Object Class=GUIImage Name=Player12P + ImageStyle=ISTY_Justified + WinTop=0.538000 + WinLeft=0.017000 + WinWidth=0.039000 + WinHeight=0.039000 + RenderWeight=0.560000 + End Object + PlayerPerk(11)=GUIImage'KFGunGame.GGLobbyMenu.Player12P' + + Begin Object Class=GUIImage Name=Player13P + ImageStyle=ISTY_Justified + WinTop=0.583000 + WinLeft=0.017000 + WinWidth=0.039000 + WinHeight=0.039000 + RenderWeight=0.560000 + End Object + PlayerPerk(12)=GUIImage'KFGunGame.GGLobbyMenu.Player13P' + + Begin Object Class=GUIImage Name=Player14P + ImageStyle=ISTY_Justified + WinTop=0.628000 + WinLeft=0.017000 + WinWidth=0.039000 + WinHeight=0.039000 + RenderWeight=0.560000 + End Object + PlayerPerk(13)=GUIImage'KFGunGame.GGLobbyMenu.Player14P' + + Begin Object Class=GUIImage Name=Player15P + ImageStyle=ISTY_Justified + WinTop=0.673000 + WinLeft=0.017000 + WinWidth=0.039000 + WinHeight=0.039000 + RenderWeight=0.560000 + End Object + PlayerPerk(14)=GUIImage'KFGunGame.GGLobbyMenu.Player15P' + + Begin Object Class=GUIImage Name=Player16P + ImageStyle=ISTY_Justified + WinTop=0.718000 + WinLeft=0.017000 + WinWidth=0.039000 + WinHeight=0.039000 + RenderWeight=0.560000 + End Object + PlayerPerk(15)=GUIImage'KFGunGame.GGLobbyMenu.Player16P' + + Begin Object Class=GUILabel Name=Player1Veterancy + TextAlign=TXTA_Right + TextColor=(B=19,G=19,R=19) + TextFont="UT2SmallFont" + WinTop=0.040000 + WinLeft=0.129070 + WinWidth=0.151172 + WinHeight=0.045000 + RenderWeight=0.500000 + End Object + PlayerVetLabel(0)=GUILabel'KFGunGame.GGLobbyMenu.Player1Veterancy' + + Begin Object Class=GUILabel Name=Player2Veterancy + TextAlign=TXTA_Right + TextColor=(B=19,G=19,R=19) + TextFont="UT2SmallFont" + WinTop=0.085000 + WinLeft=0.129070 + WinWidth=0.151172 + WinHeight=0.045000 + RenderWeight=0.500000 + End Object + PlayerVetLabel(1)=GUILabel'KFGunGame.GGLobbyMenu.Player2Veterancy' + + Begin Object Class=GUILabel Name=Player3Veterancy + TextAlign=TXTA_Right + TextColor=(B=19,G=19,R=19) + TextFont="UT2SmallFont" + WinTop=0.130000 + WinLeft=0.129070 + WinWidth=0.151172 + WinHeight=0.045000 + RenderWeight=0.550000 + End Object + PlayerVetLabel(2)=GUILabel'KFGunGame.GGLobbyMenu.Player3Veterancy' + + Begin Object Class=GUILabel Name=Player4Veterancy + TextAlign=TXTA_Right + TextColor=(B=19,G=19,R=19) + TextFont="UT2SmallFont" + WinTop=0.175000 + WinLeft=0.129070 + WinWidth=0.151172 + WinHeight=0.045000 + RenderWeight=0.550000 + End Object + PlayerVetLabel(3)=GUILabel'KFGunGame.GGLobbyMenu.Player4Veterancy' + + Begin Object Class=GUILabel Name=Player5Veterancy + TextAlign=TXTA_Right + TextColor=(B=19,G=19,R=19) + TextFont="UT2SmallFont" + WinTop=0.220000 + WinLeft=0.129070 + WinWidth=0.151172 + WinHeight=0.045000 + RenderWeight=0.550000 + End Object + PlayerVetLabel(4)=GUILabel'KFGunGame.GGLobbyMenu.Player5Veterancy' + + Begin Object Class=GUILabel Name=Player6Veterancy + TextAlign=TXTA_Right + TextColor=(B=19,G=19,R=19) + TextFont="UT2SmallFont" + WinTop=0.265000 + WinLeft=0.129070 + WinWidth=0.151172 + WinHeight=0.045000 + RenderWeight=0.550000 + End Object + PlayerVetLabel(5)=GUILabel'KFGunGame.GGLobbyMenu.Player6Veterancy' + + Begin Object Class=GUILabel Name=Player7Veterancy + TextAlign=TXTA_Right + TextColor=(B=19,G=19,R=19) + TextFont="UT2SmallFont" + WinTop=0.310000 + WinLeft=0.129070 + WinWidth=0.151172 + WinHeight=0.045000 + RenderWeight=0.550000 + End Object + PlayerVetLabel(6)=GUILabel'KFGunGame.GGLobbyMenu.Player7Veterancy' + + Begin Object Class=GUILabel Name=Player8Veterancy + TextAlign=TXTA_Right + TextColor=(B=19,G=19,R=19) + TextFont="UT2SmallFont" + WinTop=0.355000 + WinLeft=0.129070 + WinWidth=0.151172 + WinHeight=0.045000 + RenderWeight=0.550000 + End Object + PlayerVetLabel(7)=GUILabel'KFGunGame.GGLobbyMenu.Player8Veterancy' + + Begin Object Class=GUILabel Name=Player9Veterancy + TextAlign=TXTA_Right + TextColor=(B=19,G=19,R=19) + TextFont="UT2SmallFont" + WinTop=0.400000 + WinLeft=0.129070 + WinWidth=0.151172 + WinHeight=0.045000 + RenderWeight=0.550000 + End Object + PlayerVetLabel(8)=GUILabel'KFGunGame.GGLobbyMenu.Player9Veterancy' + + Begin Object Class=GUILabel Name=Player10Veterancy + TextAlign=TXTA_Right + TextColor=(B=19,G=19,R=19) + TextFont="UT2SmallFont" + WinTop=0.445000 + WinLeft=0.129070 + WinWidth=0.151172 + WinHeight=0.045000 + RenderWeight=0.550000 + End Object + PlayerVetLabel(9)=GUILabel'KFGunGame.GGLobbyMenu.Player10Veterancy' + + Begin Object Class=GUILabel Name=Player11Veterancy + TextAlign=TXTA_Right + TextColor=(B=19,G=19,R=19) + TextFont="UT2SmallFont" + WinTop=0.490000 + WinLeft=0.129070 + WinWidth=0.151172 + WinHeight=0.045000 + RenderWeight=0.550000 + End Object + PlayerVetLabel(10)=GUILabel'KFGunGame.GGLobbyMenu.Player11Veterancy' + + Begin Object Class=GUILabel Name=Player12Veterancy + TextAlign=TXTA_Right + TextColor=(B=19,G=19,R=19) + TextFont="UT2SmallFont" + WinTop=0.535000 + WinLeft=0.129070 + WinWidth=0.151172 + WinHeight=0.045000 + RenderWeight=0.550000 + End Object + PlayerVetLabel(11)=GUILabel'KFGunGame.GGLobbyMenu.Player12Veterancy' + + Begin Object Class=GUILabel Name=Player13Veterancy + TextAlign=TXTA_Right + TextColor=(B=19,G=19,R=19) + TextFont="UT2SmallFont" + WinTop=0.580000 + WinLeft=0.129070 + WinWidth=0.151172 + WinHeight=0.045000 + RenderWeight=0.550000 + End Object + PlayerVetLabel(12)=GUILabel'KFGunGame.GGLobbyMenu.Player13Veterancy' + + Begin Object Class=GUILabel Name=Player14Veterancy + TextAlign=TXTA_Right + TextColor=(B=19,G=19,R=19) + TextFont="UT2SmallFont" + WinTop=0.625000 + WinLeft=0.129070 + WinWidth=0.151172 + WinHeight=0.045000 + RenderWeight=0.550000 + End Object + PlayerVetLabel(13)=GUILabel'KFGunGame.GGLobbyMenu.Player14Veterancy' + + Begin Object Class=GUILabel Name=Player15Veterancy + TextAlign=TXTA_Right + TextColor=(B=19,G=19,R=19) + TextFont="UT2SmallFont" + WinTop=0.670000 + WinLeft=0.129070 + WinWidth=0.151172 + WinHeight=0.045000 + RenderWeight=0.550000 + End Object + PlayerVetLabel(14)=GUILabel'KFGunGame.GGLobbyMenu.Player15Veterancy' + + Begin Object Class=GUILabel Name=Player16Veterancy + TextAlign=TXTA_Right + TextColor=(B=19,G=19,R=19) + TextFont="UT2SmallFont" + WinTop=0.715000 + WinLeft=0.129070 + WinWidth=0.151172 + WinHeight=0.045000 + RenderWeight=0.550000 + End Object + PlayerVetLabel(15)=GUILabel'KFGunGame.GGLobbyMenu.Player16Veterancy' + + Begin Object Class=moCheckBox Name=ReadyBox20 + bValueReadOnly=True + ComponentJustification=TXTA_Left + CaptionWidth=0.820000 + Caption="NAME1" + LabelStyleName="" + LabelColor=(B=10,G=10,R=10,A=210) + OnCreateComponent=ReadyBox20.InternalOnCreateComponent + WinTop=0.047500 + WinLeft=0.717000 + WinWidth=0.290000 + WinHeight=0.045000 + RenderWeight=0.550000 + bAcceptsInput=False + bNeverFocus=True + bAnimating=True + End Object + ReadyBox2(0)=moCheckBox'KFGunGame.GGLobbyMenu.ReadyBox20' + + Begin Object Class=moCheckBox Name=ReadyBox21 + bValueReadOnly=True + ComponentJustification=TXTA_Left + CaptionWidth=0.820000 + Caption="NAME2" + LabelColor=(B=0) + OnCreateComponent=ReadyBox21.InternalOnCreateComponent + WinTop=0.092500 + WinLeft=0.717000 + WinWidth=0.290000 + WinHeight=0.045000 + RenderWeight=0.550000 + bAcceptsInput=False + bNeverFocus=True + bAnimating=True + End Object + ReadyBox2(1)=moCheckBox'KFGunGame.GGLobbyMenu.ReadyBox21' + + Begin Object Class=moCheckBox Name=ReadyBox22 + bValueReadOnly=True + ComponentJustification=TXTA_Left + CaptionWidth=0.820000 + Caption="NAME3" + LabelColor=(B=0) + OnCreateComponent=ReadyBox22.InternalOnCreateComponent + WinTop=0.137500 + WinLeft=0.717000 + WinWidth=0.290000 + WinHeight=0.048000 + RenderWeight=0.550000 + bAcceptsInput=False + bNeverFocus=True + bAnimating=True + End Object + ReadyBox2(2)=moCheckBox'KFGunGame.GGLobbyMenu.ReadyBox22' + + Begin Object Class=moCheckBox Name=ReadyBox23 + bValueReadOnly=True + ComponentJustification=TXTA_Left + CaptionWidth=0.820000 + Caption="NAME4" + LabelColor=(B=0) + OnCreateComponent=ReadyBox23.InternalOnCreateComponent + WinTop=0.182500 + WinLeft=0.717000 + WinWidth=0.290000 + WinHeight=0.045000 + RenderWeight=0.550000 + bAcceptsInput=False + bNeverFocus=True + bAnimating=True + End Object + ReadyBox2(3)=moCheckBox'KFGunGame.GGLobbyMenu.ReadyBox23' + + Begin Object Class=moCheckBox Name=ReadyBox24 + bValueReadOnly=True + ComponentJustification=TXTA_Left + CaptionWidth=0.820000 + Caption="NAME5" + LabelColor=(B=0) + OnCreateComponent=ReadyBox24.InternalOnCreateComponent + WinTop=0.227500 + WinLeft=0.717000 + WinWidth=0.290000 + WinHeight=0.045000 + RenderWeight=0.550000 + bAcceptsInput=False + bNeverFocus=True + bAnimating=True + End Object + ReadyBox2(4)=moCheckBox'KFGunGame.GGLobbyMenu.ReadyBox24' + + Begin Object Class=moCheckBox Name=ReadyBox25 + bValueReadOnly=True + ComponentJustification=TXTA_Left + CaptionWidth=0.820000 + Caption="NAME6" + LabelColor=(B=0) + OnCreateComponent=ReadyBox25.InternalOnCreateComponent + WinTop=0.272500 + WinLeft=0.717000 + WinWidth=0.290000 + WinHeight=0.045000 + RenderWeight=0.550000 + bAcceptsInput=False + bNeverFocus=True + bAnimating=True + End Object + ReadyBox2(5)=moCheckBox'KFGunGame.GGLobbyMenu.ReadyBox25' + + Begin Object Class=moCheckBox Name=ReadyBox26 + bValueReadOnly=True + ComponentJustification=TXTA_Left + CaptionWidth=0.820000 + Caption="NAME1" + LabelStyleName="" + LabelColor=(B=10,G=10,R=10,A=210) + OnCreateComponent=ReadyBox26.InternalOnCreateComponent + WinTop=0.317500 + WinLeft=0.717000 + WinWidth=0.290000 + WinHeight=0.045000 + RenderWeight=0.550000 + bAcceptsInput=False + bNeverFocus=True + bAnimating=True + End Object + ReadyBox2(6)=moCheckBox'KFGunGame.GGLobbyMenu.ReadyBox26' + + Begin Object Class=moCheckBox Name=ReadyBox27 + bValueReadOnly=True + ComponentJustification=TXTA_Left + CaptionWidth=0.820000 + Caption="NAME1" + LabelStyleName="" + LabelColor=(B=10,G=10,R=10,A=210) + OnCreateComponent=ReadyBox27.InternalOnCreateComponent + WinTop=0.362500 + WinLeft=0.717000 + WinWidth=0.290000 + WinHeight=0.045000 + RenderWeight=0.550000 + bAcceptsInput=False + bNeverFocus=True + bAnimating=True + End Object + ReadyBox2(7)=moCheckBox'KFGunGame.GGLobbyMenu.ReadyBox27' + + Begin Object Class=moCheckBox Name=ReadyBox28 + bValueReadOnly=True + ComponentJustification=TXTA_Left + CaptionWidth=0.820000 + Caption="NAME1" + LabelStyleName="" + LabelColor=(B=10,G=10,R=10,A=210) + OnCreateComponent=ReadyBox28.InternalOnCreateComponent + WinTop=0.407500 + WinLeft=0.717000 + WinWidth=0.290000 + WinHeight=0.045000 + RenderWeight=0.550000 + bAcceptsInput=False + bNeverFocus=True + bAnimating=True + End Object + ReadyBox2(8)=moCheckBox'KFGunGame.GGLobbyMenu.ReadyBox28' + + Begin Object Class=moCheckBox Name=ReadyBox29 + bValueReadOnly=True + ComponentJustification=TXTA_Left + CaptionWidth=0.820000 + Caption="NAME1" + LabelStyleName="" + LabelColor=(B=10,G=10,R=10,A=210) + OnCreateComponent=ReadyBox29.InternalOnCreateComponent + WinTop=0.452500 + WinLeft=0.717000 + WinWidth=0.290000 + WinHeight=0.045000 + RenderWeight=0.550000 + bAcceptsInput=False + bNeverFocus=True + bAnimating=True + End Object + ReadyBox2(9)=moCheckBox'KFGunGame.GGLobbyMenu.ReadyBox29' + + Begin Object Class=moCheckBox Name=ReadyBox210 + bValueReadOnly=True + ComponentJustification=TXTA_Left + CaptionWidth=0.820000 + Caption="NAME1" + LabelStyleName="" + LabelColor=(B=10,G=10,R=10,A=210) + OnCreateComponent=ReadyBox210.InternalOnCreateComponent + WinTop=0.497500 + WinLeft=0.717000 + WinWidth=0.290000 + WinHeight=0.045000 + RenderWeight=0.550000 + bAcceptsInput=False + bNeverFocus=True + bAnimating=True + End Object + ReadyBox2(10)=moCheckBox'KFGunGame.GGLobbyMenu.ReadyBox210' + + Begin Object Class=moCheckBox Name=ReadyBox211 + bValueReadOnly=True + ComponentJustification=TXTA_Left + CaptionWidth=0.820000 + Caption="NAME1" + LabelStyleName="" + LabelColor=(B=10,G=10,R=10,A=210) + OnCreateComponent=ReadyBox211.InternalOnCreateComponent + WinTop=0.542500 + WinLeft=0.717000 + WinWidth=0.290000 + WinHeight=0.045000 + RenderWeight=0.550000 + bAcceptsInput=False + bNeverFocus=True + bAnimating=True + End Object + ReadyBox2(11)=moCheckBox'KFGunGame.GGLobbyMenu.ReadyBox211' + + Begin Object Class=moCheckBox Name=ReadyBox212 + bValueReadOnly=True + ComponentJustification=TXTA_Left + CaptionWidth=0.820000 + Caption="NAME1" + LabelStyleName="" + LabelColor=(B=10,G=10,R=10,A=210) + OnCreateComponent=ReadyBox212.InternalOnCreateComponent + WinTop=0.587500 + WinLeft=0.717000 + WinWidth=0.290000 + WinHeight=0.045000 + RenderWeight=0.550000 + bAcceptsInput=False + bNeverFocus=True + bAnimating=True + End Object + ReadyBox2(12)=moCheckBox'KFGunGame.GGLobbyMenu.ReadyBox212' + + Begin Object Class=moCheckBox Name=ReadyBox213 + bValueReadOnly=True + ComponentJustification=TXTA_Left + CaptionWidth=0.820000 + Caption="NAME1" + LabelStyleName="" + LabelColor=(B=10,G=10,R=10,A=210) + OnCreateComponent=ReadyBox213.InternalOnCreateComponent + WinTop=0.632500 + WinLeft=0.717000 + WinWidth=0.290000 + WinHeight=0.045000 + RenderWeight=0.550000 + bAcceptsInput=False + bNeverFocus=True + bAnimating=True + End Object + ReadyBox2(13)=moCheckBox'KFGunGame.GGLobbyMenu.ReadyBox213' + + Begin Object Class=moCheckBox Name=ReadyBox214 + bValueReadOnly=True + ComponentJustification=TXTA_Left + CaptionWidth=0.820000 + Caption="NAME1" + LabelStyleName="" + LabelColor=(B=10,G=10,R=10,A=210) + OnCreateComponent=ReadyBox214.InternalOnCreateComponent + WinTop=0.677500 + WinLeft=0.717000 + WinWidth=0.290000 + WinHeight=0.045000 + RenderWeight=0.550000 + bAcceptsInput=False + bNeverFocus=True + bAnimating=True + End Object + ReadyBox2(14)=moCheckBox'KFGunGame.GGLobbyMenu.ReadyBox214' + + Begin Object Class=moCheckBox Name=ReadyBox215 + bValueReadOnly=True + ComponentJustification=TXTA_Left + CaptionWidth=0.820000 + Caption="NAME1" + LabelStyleName="" + LabelColor=(B=10,G=10,R=10,A=210) + OnCreateComponent=ReadyBox215.InternalOnCreateComponent + WinTop=0.722500 + WinLeft=0.717000 + WinWidth=0.290000 + WinHeight=0.045000 + RenderWeight=0.550000 + bAcceptsInput=False + bNeverFocus=True + bAnimating=True + End Object + ReadyBox2(15)=moCheckBox'KFGunGame.GGLobbyMenu.ReadyBox215' + + Begin Object Class=KFPlayerReadyBar Name=Player1BackDrop2 + WinTop=0.040000 + WinLeft=0.681253 + WinWidth=0.268750 + WinHeight=0.045000 + RenderWeight=0.350000 + End Object + PlayerBox2(0)=KFPlayerReadyBar'KFGunGame.GGLobbyMenu.Player1BackDrop2' + + Begin Object Class=KFPlayerReadyBar Name=Player2BackDrop2 + WinTop=0.085000 + WinLeft=0.681253 + WinWidth=0.268750 + WinHeight=0.045000 + RenderWeight=0.350000 + End Object + PlayerBox2(1)=KFPlayerReadyBar'KFGunGame.GGLobbyMenu.Player2BackDrop2' + + Begin Object Class=KFPlayerReadyBar Name=Player3BackDrop2 + WinTop=0.130000 + WinLeft=0.681253 + WinWidth=0.268750 + WinHeight=0.045000 + RenderWeight=0.350000 + End Object + PlayerBox2(2)=KFPlayerReadyBar'KFGunGame.GGLobbyMenu.Player3BackDrop2' + + Begin Object Class=KFPlayerReadyBar Name=Player4BackDrop2 + WinTop=0.175000 + WinLeft=0.681253 + WinWidth=0.268750 + WinHeight=0.045000 + RenderWeight=0.350000 + End Object + PlayerBox2(3)=KFPlayerReadyBar'KFGunGame.GGLobbyMenu.Player4BackDrop2' + + Begin Object Class=KFPlayerReadyBar Name=Player5BackDrop2 + WinTop=0.220000 + WinLeft=0.681253 + WinWidth=0.268750 + WinHeight=0.045000 + RenderWeight=0.350000 + End Object + PlayerBox2(4)=KFPlayerReadyBar'KFGunGame.GGLobbyMenu.Player5BackDrop2' + + Begin Object Class=KFPlayerReadyBar Name=Player6BackDrop2 + WinTop=0.265000 + WinLeft=0.681253 + WinWidth=0.268750 + WinHeight=0.045000 + RenderWeight=0.350000 + End Object + PlayerBox2(5)=KFPlayerReadyBar'KFGunGame.GGLobbyMenu.Player6BackDrop2' + + Begin Object Class=KFPlayerReadyBar Name=Player7BackDrop2 + WinTop=0.310000 + WinLeft=0.681253 + WinWidth=0.268750 + WinHeight=0.045000 + RenderWeight=0.350000 + End Object + PlayerBox2(6)=KFPlayerReadyBar'KFGunGame.GGLobbyMenu.Player7BackDrop2' + + Begin Object Class=KFPlayerReadyBar Name=Player8BackDrop2 + WinTop=0.355000 + WinLeft=0.681253 + WinWidth=0.268750 + WinHeight=0.045000 + RenderWeight=0.350000 + End Object + PlayerBox2(7)=KFPlayerReadyBar'KFGunGame.GGLobbyMenu.Player8BackDrop2' + + Begin Object Class=KFPlayerReadyBar Name=Player9BackDrop2 + WinTop=0.400000 + WinLeft=0.681253 + WinWidth=0.268750 + WinHeight=0.045000 + RenderWeight=0.350000 + End Object + PlayerBox2(8)=KFPlayerReadyBar'KFGunGame.GGLobbyMenu.Player9BackDrop2' + + Begin Object Class=KFPlayerReadyBar Name=Player10BackDrop2 + WinTop=0.445000 + WinLeft=0.681253 + WinWidth=0.268750 + WinHeight=0.045000 + RenderWeight=0.350000 + End Object + PlayerBox2(9)=KFPlayerReadyBar'KFGunGame.GGLobbyMenu.Player10BackDrop2' + + Begin Object Class=KFPlayerReadyBar Name=Player11BackDrop2 + WinTop=0.490000 + WinLeft=0.681253 + WinWidth=0.268750 + WinHeight=0.045000 + RenderWeight=0.350000 + End Object + PlayerBox2(10)=KFPlayerReadyBar'KFGunGame.GGLobbyMenu.Player11BackDrop2' + + Begin Object Class=KFPlayerReadyBar Name=Player12BackDrop2 + WinTop=0.535000 + WinLeft=0.681253 + WinWidth=0.268750 + WinHeight=0.045000 + RenderWeight=0.350000 + End Object + PlayerBox2(11)=KFPlayerReadyBar'KFGunGame.GGLobbyMenu.Player12BackDrop2' + + Begin Object Class=KFPlayerReadyBar Name=Player13BackDrop2 + WinTop=0.580000 + WinLeft=0.681253 + WinWidth=0.268750 + WinHeight=0.045000 + RenderWeight=0.350000 + End Object + PlayerBox2(12)=KFPlayerReadyBar'KFGunGame.GGLobbyMenu.Player13BackDrop2' + + Begin Object Class=KFPlayerReadyBar Name=Player14BackDrop2 + WinTop=0.625000 + WinLeft=0.681253 + WinWidth=0.268750 + WinHeight=0.045000 + RenderWeight=0.350000 + End Object + PlayerBox2(13)=KFPlayerReadyBar'KFGunGame.GGLobbyMenu.Player14BackDrop2' + + Begin Object Class=KFPlayerReadyBar Name=Player15BackDrop2 + WinTop=0.670000 + WinLeft=0.681253 + WinWidth=0.268750 + WinHeight=0.045000 + RenderWeight=0.350000 + End Object + PlayerBox2(14)=KFPlayerReadyBar'KFGunGame.GGLobbyMenu.Player15BackDrop2' + + Begin Object Class=KFPlayerReadyBar Name=Player16BackDrop2 + WinTop=0.715000 + WinLeft=0.681253 + WinWidth=0.268750 + WinHeight=0.045000 + RenderWeight=0.350000 + End Object + PlayerBox2(15)=KFPlayerReadyBar'KFGunGame.GGLobbyMenu.Player16BackDrop2' + + Begin Object Class=GUIImage Name=Player1P2 + ImageStyle=ISTY_Justified + WinTop=0.043000 + WinLeft=0.681753 + WinWidth=0.039000 + WinHeight=0.039000 + RenderWeight=0.560000 + End Object + PlayerPerk2(0)=GUIImage'KFGunGame.GGLobbyMenu.Player1P2' + + Begin Object Class=GUIImage Name=Player2P2 + ImageStyle=ISTY_Justified + WinTop=0.088000 + WinLeft=0.681753 + WinWidth=0.045000 + WinHeight=0.039000 + RenderWeight=0.560000 + End Object + PlayerPerk2(1)=GUIImage'KFGunGame.GGLobbyMenu.Player2P2' + + Begin Object Class=GUIImage Name=Player3P2 + ImageStyle=ISTY_Justified + WinTop=0.133000 + WinLeft=0.681753 + WinWidth=0.045000 + WinHeight=0.039000 + RenderWeight=0.560000 + End Object + PlayerPerk2(2)=GUIImage'KFGunGame.GGLobbyMenu.Player3P2' + + Begin Object Class=GUIImage Name=Player4P2 + ImageStyle=ISTY_Justified + WinTop=0.178000 + WinLeft=0.681753 + WinWidth=0.045000 + WinHeight=0.039000 + RenderWeight=0.560000 + End Object + PlayerPerk2(3)=GUIImage'KFGunGame.GGLobbyMenu.Player4P2' + + Begin Object Class=GUIImage Name=Player5P2 + ImageStyle=ISTY_Justified + WinTop=0.223000 + WinLeft=0.681753 + WinWidth=0.045000 + WinHeight=0.039000 + RenderWeight=0.560000 + End Object + PlayerPerk2(4)=GUIImage'KFGunGame.GGLobbyMenu.Player5P2' + + Begin Object Class=GUIImage Name=Player6P2 + ImageStyle=ISTY_Justified + WinTop=0.268000 + WinLeft=0.681753 + WinWidth=0.045000 + WinHeight=0.039000 + RenderWeight=0.560000 + End Object + PlayerPerk2(5)=GUIImage'KFGunGame.GGLobbyMenu.Player6P2' + + Begin Object Class=GUIImage Name=Player7P2 + ImageStyle=ISTY_Justified + WinTop=0.313000 + WinLeft=0.681753 + WinWidth=0.039000 + WinHeight=0.039000 + RenderWeight=0.560000 + End Object + PlayerPerk2(6)=GUIImage'KFGunGame.GGLobbyMenu.Player7P2' + + Begin Object Class=GUIImage Name=Player8P2 + ImageStyle=ISTY_Justified + WinTop=0.358000 + WinLeft=0.681753 + WinWidth=0.039000 + WinHeight=0.039000 + RenderWeight=0.560000 + End Object + PlayerPerk2(7)=GUIImage'KFGunGame.GGLobbyMenu.Player8P2' + + Begin Object Class=GUIImage Name=Player9P2 + ImageStyle=ISTY_Justified + WinTop=0.403000 + WinLeft=0.681753 + WinWidth=0.039000 + WinHeight=0.039000 + RenderWeight=0.560000 + End Object + PlayerPerk2(8)=GUIImage'KFGunGame.GGLobbyMenu.Player9P2' + + Begin Object Class=GUIImage Name=Player10P2 + ImageStyle=ISTY_Justified + WinTop=0.448000 + WinLeft=0.681753 + WinWidth=0.039000 + WinHeight=0.039000 + RenderWeight=0.560000 + End Object + PlayerPerk2(9)=GUIImage'KFGunGame.GGLobbyMenu.Player10P2' + + Begin Object Class=GUIImage Name=Player11P2 + ImageStyle=ISTY_Justified + WinTop=0.493000 + WinLeft=0.681753 + WinWidth=0.039000 + WinHeight=0.039000 + RenderWeight=0.560000 + End Object + PlayerPerk2(10)=GUIImage'KFGunGame.GGLobbyMenu.Player11P2' + + Begin Object Class=GUIImage Name=Player12P2 + ImageStyle=ISTY_Justified + WinTop=0.538000 + WinLeft=0.681753 + WinWidth=0.039000 + WinHeight=0.039000 + RenderWeight=0.560000 + End Object + PlayerPerk2(11)=GUIImage'KFGunGame.GGLobbyMenu.Player12P2' + + Begin Object Class=GUIImage Name=Player13P2 + ImageStyle=ISTY_Justified + WinTop=0.583000 + WinLeft=0.681753 + WinWidth=0.039000 + WinHeight=0.039000 + RenderWeight=0.560000 + End Object + PlayerPerk2(12)=GUIImage'KFGunGame.GGLobbyMenu.Player13P2' + + Begin Object Class=GUIImage Name=Player14P2 + ImageStyle=ISTY_Justified + WinTop=0.628000 + WinLeft=0.681753 + WinWidth=0.039000 + WinHeight=0.039000 + RenderWeight=0.560000 + End Object + PlayerPerk2(13)=GUIImage'KFGunGame.GGLobbyMenu.Player14P2' + + Begin Object Class=GUIImage Name=Player15P2 + ImageStyle=ISTY_Justified + WinTop=0.673000 + WinLeft=0.681753 + WinWidth=0.039000 + WinHeight=0.039000 + RenderWeight=0.560000 + End Object + PlayerPerk2(14)=GUIImage'KFGunGame.GGLobbyMenu.Player15P2' + + Begin Object Class=GUIImage Name=Player16P2 + ImageStyle=ISTY_Justified + WinTop=0.718000 + WinLeft=0.681753 + WinWidth=0.039000 + WinHeight=0.039000 + RenderWeight=0.560000 + End Object + PlayerPerk2(15)=GUIImage'KFGunGame.GGLobbyMenu.Player16P2' + + Begin Object Class=GUILabel Name=Player1Veterancy2 + TextAlign=TXTA_Right + TextColor=(B=19,G=19,R=19) + TextFont="UT2SmallFont" + WinTop=0.040000 + WinLeft=0.793094 + WinWidth=0.151172 + WinHeight=0.045000 + RenderWeight=0.500000 + End Object + PlayerVetLabel2(0)=GUILabel'KFGunGame.GGLobbyMenu.Player1Veterancy2' + + Begin Object Class=GUILabel Name=Player2Veterancy2 + TextAlign=TXTA_Right + TextColor=(B=19,G=19,R=19) + TextFont="UT2SmallFont" + WinTop=0.085000 + WinLeft=0.793094 + WinWidth=0.151172 + WinHeight=0.045000 + RenderWeight=0.500000 + End Object + PlayerVetLabel2(1)=GUILabel'KFGunGame.GGLobbyMenu.Player2Veterancy2' + + Begin Object Class=GUILabel Name=Player3Veterancy2 + TextAlign=TXTA_Right + TextColor=(B=19,G=19,R=19) + TextFont="UT2SmallFont" + WinTop=0.130000 + WinLeft=0.793094 + WinWidth=0.151172 + WinHeight=0.045000 + RenderWeight=0.550000 + End Object + PlayerVetLabel2(2)=GUILabel'KFGunGame.GGLobbyMenu.Player3Veterancy2' + + Begin Object Class=GUILabel Name=Player4Veterancy2 + TextAlign=TXTA_Right + TextColor=(B=19,G=19,R=19) + TextFont="UT2SmallFont" + WinTop=0.175000 + WinLeft=0.793094 + WinWidth=0.151172 + WinHeight=0.045000 + RenderWeight=0.550000 + End Object + PlayerVetLabel2(3)=GUILabel'KFGunGame.GGLobbyMenu.Player4Veterancy2' + + Begin Object Class=GUILabel Name=Player5Veterancy2 + TextAlign=TXTA_Right + TextColor=(B=19,G=19,R=19) + TextFont="UT2SmallFont" + WinTop=0.220000 + WinLeft=0.793094 + WinWidth=0.151172 + WinHeight=0.045000 + RenderWeight=0.550000 + End Object + PlayerVetLabel2(4)=GUILabel'KFGunGame.GGLobbyMenu.Player5Veterancy2' + + Begin Object Class=GUILabel Name=Player6Veterancy2 + TextAlign=TXTA_Right + TextColor=(B=19,G=19,R=19) + TextFont="UT2SmallFont" + WinTop=0.265000 + WinLeft=0.793094 + WinWidth=0.151172 + WinHeight=0.045000 + RenderWeight=0.550000 + End Object + PlayerVetLabel2(5)=GUILabel'KFGunGame.GGLobbyMenu.Player6Veterancy2' + + Begin Object Class=GUILabel Name=Player7Veterancy2 + TextAlign=TXTA_Right + TextColor=(B=19,G=19,R=19) + TextFont="UT2SmallFont" + WinTop=0.310000 + WinLeft=0.793094 + WinWidth=0.151172 + WinHeight=0.045000 + RenderWeight=0.550000 + End Object + PlayerVetLabel2(6)=GUILabel'KFGunGame.GGLobbyMenu.Player7Veterancy2' + + Begin Object Class=GUILabel Name=Player8Veterancy2 + TextAlign=TXTA_Right + TextColor=(B=19,G=19,R=19) + TextFont="UT2SmallFont" + WinTop=0.355000 + WinLeft=0.793094 + WinWidth=0.151172 + WinHeight=0.045000 + RenderWeight=0.550000 + End Object + PlayerVetLabel2(7)=GUILabel'KFGunGame.GGLobbyMenu.Player8Veterancy2' + + Begin Object Class=GUILabel Name=Player9Veterancy2 + TextAlign=TXTA_Right + TextColor=(B=19,G=19,R=19) + TextFont="UT2SmallFont" + WinTop=0.400000 + WinLeft=0.793094 + WinWidth=0.151172 + WinHeight=0.045000 + RenderWeight=0.550000 + End Object + PlayerVetLabel2(8)=GUILabel'KFGunGame.GGLobbyMenu.Player9Veterancy2' + + Begin Object Class=GUILabel Name=Player10Veterancy2 + TextAlign=TXTA_Right + TextColor=(B=19,G=19,R=19) + TextFont="UT2SmallFont" + WinTop=0.445000 + WinLeft=0.793094 + WinWidth=0.151172 + WinHeight=0.045000 + RenderWeight=0.550000 + End Object + PlayerVetLabel2(9)=GUILabel'KFGunGame.GGLobbyMenu.Player10Veterancy2' + + Begin Object Class=GUILabel Name=Player11Veterancy2 + TextAlign=TXTA_Right + TextColor=(B=19,G=19,R=19) + TextFont="UT2SmallFont" + WinTop=0.490000 + WinLeft=0.793094 + WinWidth=0.151172 + WinHeight=0.045000 + RenderWeight=0.550000 + End Object + PlayerVetLabel2(10)=GUILabel'KFGunGame.GGLobbyMenu.Player11Veterancy2' + + Begin Object Class=GUILabel Name=Player12Veterancy2 + TextAlign=TXTA_Right + TextColor=(B=19,G=19,R=19) + TextFont="UT2SmallFont" + WinTop=0.535000 + WinLeft=0.793094 + WinWidth=0.151172 + WinHeight=0.045000 + RenderWeight=0.550000 + End Object + PlayerVetLabel2(11)=GUILabel'KFGunGame.GGLobbyMenu.Player12Veterancy2' + + Begin Object Class=GUILabel Name=Player13Veterancy2 + TextAlign=TXTA_Right + TextColor=(B=19,G=19,R=19) + TextFont="UT2SmallFont" + WinTop=0.580000 + WinLeft=0.793094 + WinWidth=0.151172 + WinHeight=0.045000 + RenderWeight=0.550000 + End Object + PlayerVetLabel2(12)=GUILabel'KFGunGame.GGLobbyMenu.Player13Veterancy2' + + Begin Object Class=GUILabel Name=Player14Veterancy2 + TextAlign=TXTA_Right + TextColor=(B=19,G=19,R=19) + TextFont="UT2SmallFont" + WinTop=0.625000 + WinLeft=0.793094 + WinWidth=0.151172 + WinHeight=0.045000 + RenderWeight=0.550000 + End Object + PlayerVetLabel2(13)=GUILabel'KFGunGame.GGLobbyMenu.Player14Veterancy2' + + Begin Object Class=GUILabel Name=Player15Veterancy2 + TextAlign=TXTA_Right + TextColor=(B=19,G=19,R=19) + TextFont="UT2SmallFont" + WinTop=0.670000 + WinLeft=0.793094 + WinWidth=0.151172 + WinHeight=0.045000 + RenderWeight=0.550000 + End Object + PlayerVetLabel2(14)=GUILabel'KFGunGame.GGLobbyMenu.Player15Veterancy2' + + Begin Object Class=GUILabel Name=Player16Veterancy2 + TextAlign=TXTA_Right + TextColor=(B=19,G=19,R=19) + TextFont="UT2SmallFont" + WinTop=0.715000 + WinLeft=0.793094 + WinWidth=0.151172 + WinHeight=0.045000 + RenderWeight=0.550000 + End Object + PlayerVetLabel2(15)=GUILabel'KFGunGame.GGLobbyMenu.Player16Veterancy2' + + Begin Object Class=KFLobbyChat 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=KFLobbyChat'KFGunGame.GGLobbyMenu.ChatBox' + + Begin Object Class=GUILabel Name=TimeOutCounter + Caption="Game will auto-commence in: " + TextAlign=TXTA_Center + TextColor=(B=158,G=176,R=175) + WinTop=0.000010 + WinLeft=0.336310 + WinWidth=0.346719 + WinHeight=0.045704 + TabOrder=6 + End Object + label_TimeOutCounter=GUILabel'KFGunGame.GGLobbyMenu.TimeOutCounter' + + Begin Object Class=GUILabel Name=Spectators + Caption="Spectators:" + TextColor=(B=158,G=176,R=175) + WinTop=0.760000 + WinLeft=0.017000 + WinWidth=0.966000 + WinHeight=0.045704 + TabOrder=6 + End Object + SpectatorsLabel=GUILabel'KFGunGame.GGLobbyMenu.Spectators' + + Begin Object Class=GUISectionBackground Name=ADBG + WinTop=0.037343 + WinLeft=0.349700 + WinWidth=0.322266 + WinHeight=0.360677 + RenderWeight=0.300000 + OnPreDraw=ADBG.InternalPreDraw + End Object + ADBackground=GUISectionBackground'KFGunGame.GGLobbyMenu.ADBG' + + LvAbbrString="Lv" + SelectPerkInformationString="Perks enhance certain abilities of your character.|There are 6 Perks to choose from in the center of the screen.|Each has different Effects shown in the upper right.|Perks improve as you complete the Level Requirements shown on the right." + WaitingForServerStatus="Awaiting server status..." + WaitingForOtherPlayers="Pick A Team" + AutoCommence="Game will auto-commence in" + SpectatorsString="Spectators:" + Begin Object Class=GUITabControl Name=PageTabs + bDockPanels=True + TabHeight=0.040000 + WinLeft=0.010000 + WinWidth=0.980000 + WinHeight=0.040000 + RenderWeight=0.490000 + TabOrder=3 + bAcceptsInput=True + OnActivate=PageTabs.InternalOnActivate + End Object + c_Tabs=GUITabControl'KFGui.GUIClassMenu.PageTabs' + + Begin Object Class=GUIHeader Name=MyHeader + WinHeight=-0.350000 + bVisible=False + End Object + t_Header=GUIHeader'KFGunGame.GGLobbyMenu.MyHeader' + + Begin Object Class=GGLobbyFooter Name=MyFooter + RenderWeight=0.300000 + TabOrder=8 + bBoundToParent=False + bScaleToParent=False + OnPreDraw=BuyFooter.InternalOnPreDraw + End Object + t_Footer=GGLobbyFooter'KFGunGame.GGLobbyMenu.MyFooter' + + bRenderWorld=True + bAllowedAsLast=True + OnClose=GGLobbyMenu.InternalOnClosed + OnCanClose=GGLobbyMenu.StopClose + WinHeight=0.500000 + OnPreDraw=GGLobbyMenu.InternalOnPreDraw + OnRendered=GGLobbyMenu.DrawAd + OnKeyEvent=GGLobbyMenu.InternalOnKeyEvent +} diff --git a/Classes/GGMapList.uc b/Classes/GGMapList.uc new file mode 100644 index 0000000..a0ae318 --- /dev/null +++ b/Classes/GGMapList.uc @@ -0,0 +1,14 @@ +class GGMapList extends MapList + config; + +defaultproperties +{ + Maps(0)="GG-TR_CloseQuarters" + Maps(1)="GG-VR_HighJump" + Maps(2)="GG-VR_VerticalLowGrav" + Maps(3)="GG-VR_Vertical" + Maps(4)="GG-VR_Ramps" + Maps(5)="GG-TR_Stairways" + Maps(6)="GG-VR_RampsLowGrav" + MapNum=5 +} diff --git a/Classes/GGShopTrigger.uc b/Classes/GGShopTrigger.uc new file mode 100644 index 0000000..f59568e --- /dev/null +++ b/Classes/GGShopTrigger.uc @@ -0,0 +1,38 @@ +//----------------------------------------------------------- +// +//----------------------------------------------------------- +class GGShopTrigger extends Triggers + NotPlaceable; + +var byte Team; + +function Touch( Actor Other ) +{ + if( Pawn(Other)!=None && PlayerController(Pawn(Other).Controller)!=None && Pawn(Other).GetTeamNum()==Team ) + PlayerController(Pawn(Other).Controller).ReceiveLocalizedMessage(Class'KFMainMessages',3); +} +function UsedBy( Pawn user ) +{ + // Set the pawn to an idle anim so he wont keep making footsteps + User.SetAnimAction(User.IdleWeaponAnim); + + if( KFPlayerController(user.Controller)!=None && user.GetTeamNum()==Team ) + KFPlayerController(user.Controller).ShowBuyMenu("Mee",KFHumanPawn(user).MaxCarryWeight); +} +function Destroyed() +{ + local KFPawn P; + + foreach TouchingActors(Class'KFPawn',P) + { + if( PlayerController(P.Controller)!=None ) + PlayerController(P.Controller).ClientCloseMenu(true, true); + } +} + +defaultproperties +{ + LifeSpan=30.000000 + CollisionRadius=200.000000 + CollisionHeight=60.000000 +} diff --git a/Classes/GGStartupMessage.uc b/Classes/GGStartupMessage.uc new file mode 100644 index 0000000..f6b07c5 --- /dev/null +++ b/Classes/GGStartupMessage.uc @@ -0,0 +1,94 @@ +class GGStartupMessage extends CriticalEventPlus; + +#EXEC OBJ LOAD FILE=KF_BasePatriarch.uax +#EXEC OBJ LOAD FILE=KF_FoundrySnd.uax + +var localized string Stage[8], NotReady, SinglePlayer; +var sound Riff; + +static simulated function ClientReceive( + PlayerController P, + optional int Switch, + optional PlayerReplicationInfo RelatedPRI_1, + optional PlayerReplicationInfo RelatedPRI_2, + optional Object OptionalObject + ) +{ + Super.ClientReceive(P, Switch, RelatedPRI_1, RelatedPRI_2, OptionalObject); + if ( Switch < 7 ) + { + P.Level.FillPrecacheMaterialsArray(false); + P.Level.FillPrecacheStaticMeshesArray(false); + P.PrecacheAnnouncements(); + } + if ( Switch == 5 && P != none ) + { + //P.PlayStatusAnnouncement('Play',1,true); + P.ClientPlaySound(sound'KF_BasePatriarch.Kev_KnockedDown2', false, 2.0); + P.ClientPlaySound(sound'KF_FoundrySnd.Alarm_BellWarning01', false, 2.0); + } + else if ( (Switch > 1) && (Switch < 5) ) + P.ClientPlaySound(sound'KF_FoundrySnd.Alarm_AlertWarning01', true, 2.0); + else if ( Switch == 7 ) + P.ClientPlaySound(Default.Riff); +} + +static function string GetString( + optional int Switch, + optional PlayerReplicationInfo RelatedPRI_1, + optional PlayerReplicationInfo RelatedPRI_2, + optional Object OptionalObject + ) +{ + local int i, PlayerCount; + local GameReplicationInfo GRI; + + if ( (RelatedPRI_1 != None) && (RelatedPRI_1.Level.NetMode == NM_Standalone) ) + { + if ( (DeathMatch(RelatedPRI_1.Level.Game) != None) && DeathMatch(RelatedPRI_1.Level.Game).bQuickstart ) + return ""; + if ( Switch < 2 ) + return Default.SinglePlayer; + } + else if ( Switch == 0 && RelatedPRI_1 != None ) + { + GRI = RelatedPRI_1.Level.GRI; + if (GRI == None) + return Default.Stage[0]; + for (i = 0; i < GRI.PRIArray.Length; i++) + { + if ( GRI.PRIArray[i] != None && !GRI.PRIArray[i].bOnlySpectator + && (!GRI.PRIArray[i].bIsSpectator || GRI.PRIArray[i].bWaitingPlayer) ) + PlayerCount++; + } + if (GRI.MinNetPlayers - PlayerCount > 0) + return Default.Stage[0]@"("$(GRI.MinNetPlayers - PlayerCount)$")"; + } + else if ( switch == 1 ) + { + if ( (RelatedPRI_1 == None) || !RelatedPRI_1.bWaitingPlayer ) + return Default.Stage[0]; + else if ( RelatedPRI_1.bReadyToPlay ) + return Default.Stage[1]; + else + return Default.NotReady; + } + return Default.Stage[Switch]; +} + +defaultproperties +{ + Stage(0)="Waiting for other players." + Stage(1)="Waiting for ready signals. You are READY." + Stage(2)="The match is about to begin...3" + Stage(3)="The match is about to begin...2" + Stage(4)="The match is about to begin...1" + Stage(5)="The match has begun!" + Stage(6)="The match has begun!" + Stage(7)="OVER TIME!" + NotReady="You're not Ready. Click Ready!" + SinglePlayer="Click Ready to start!" + bIsConsoleMessage=False + DrawColor=(B=64,G=64,R=255) + PosY=0.400000 +} diff --git a/Classes/GGSyringe.uc b/Classes/GGSyringe.uc new file mode 100644 index 0000000..3a17ecb --- /dev/null +++ b/Classes/GGSyringe.uc @@ -0,0 +1,15 @@ +//============================================================================= +// Syringe Inventory class +//============================================================================= +class GGSyringe extends Syringe; + +simulated function PostBeginPlay() +{ + Super(KFWeapon).PostBeginPlay(); // No additional health boost. +} + +defaultproperties +{ + FireModeClass(0)=Class'KFGunGame.GGSyringeFire' + PickupClass=Class'KFGunGame.GGSyringePickup' +} diff --git a/Classes/GGSyringeFire.uc b/Classes/GGSyringeFire.uc new file mode 100644 index 0000000..4e9e0c3 --- /dev/null +++ b/Classes/GGSyringeFire.uc @@ -0,0 +1,75 @@ +class GGSyringeFire extends SyringeFire; + +Function Timer() +{ + local KFPlayerReplicationInfo PRI; + local int MedicReward; + local KFHumanPawn Healed; + local float HealSum; // for modifying based on perks + + Healed = CachedHealee; + CachedHealee = none; + + if ( Healed != none && Healed.Health > 0 && Healed != Instigator ) + { + Weapon.ConsumeAmmo(ThisModeNum, AmmoPerFire); + + MedicReward = Syringe(Weapon).HealBoostAmount; + + if ( KFPlayerReplicationInfo(Instigator.PlayerReplicationInfo) != none && KFPlayerReplicationInfo(Instigator.PlayerReplicationInfo).ClientVeteranSkill != none ) + MedicReward *= KFPlayerReplicationInfo(Instigator.PlayerReplicationInfo).ClientVeteranSkill.Static.GetHealPotency(KFPlayerReplicationInfo(Instigator.PlayerReplicationInfo)); + + HealSum = MedicReward; + + if ( (Healed.Health + Healed.healthToGive + MedicReward) > Healed.HealthMax ) + { + MedicReward = Healed.HealthMax - (Healed.Health + Healed.healthToGive); + if ( MedicReward < 0 ) + MedicReward = 0; + } + + Healed.GiveHealth(HealSum, Healed.HealthMax); + + // Tell them we're healing them + if( PlayerController(Instigator.Controller)!=None ) + PlayerController(Instigator.Controller).Speech('AUTO', 5, ""); + LastHealMessageTime = Level.TimeSeconds; + + PRI = KFPlayerReplicationInfo(Instigator.PlayerReplicationInfo); + if ( PRI != None ) + { + if ( MedicReward > 0 && KFSteamStatsAndAchievements(PRI.SteamStatsAndAchievements) != none ) + KFSteamStatsAndAchievements(PRI.SteamStatsAndAchievements).AddDamageHealed(MedicReward); + if ( KFHumanPawn(Instigator) != none ) + KFHumanPawn(Instigator).AlphaAmount = 255; + } + } +} +function KFHumanPawn GetHealee() +{ + local KFHumanPawn KFHP, BestKFHP; + local vector Dir; + local float TempDot, BestDot; + + Dir = vector(Instigator.GetViewRotation()); + + foreach Instigator.VisibleCollidingActors(class'KFHumanPawn', KFHP, 80.0) + { + if ( KFHP.Health<100 && KFHP.Health>0 && KFHP.GetTeamNum()==Instigator.GetTeamNum() ) + { + TempDot = Dir dot (KFHP.Location - Instigator.Location); + if ( TempDot > 0.7 && TempDot > BestDot ) + { + BestKFHP = KFHP; + BestDot = TempDot; + } + } + } + + return BestKFHP; +} + +defaultproperties +{ + NoHealTargetMessage="You must be near another team member to heal them!" +} diff --git a/Classes/GGSyringePickup.uc b/Classes/GGSyringePickup.uc new file mode 100644 index 0000000..ef733a8 --- /dev/null +++ b/Classes/GGSyringePickup.uc @@ -0,0 +1,9 @@ +//----------------------------------------------------------- +// +//----------------------------------------------------------- +class GGSyringePickup extends SyringePickup; + +defaultproperties +{ + InventoryType=Class'KFGunGame.GGSyringe' +} diff --git a/Classes/GGTeamAI.uc b/Classes/GGTeamAI.uc new file mode 100644 index 0000000..600ffbb --- /dev/null +++ b/Classes/GGTeamAI.uc @@ -0,0 +1,6 @@ +class GGTeamAI extends TeamAI; + +defaultproperties +{ + SquadType=Class'KFGunGame.KFGGSquad' +} diff --git a/Classes/GGWarmupMessage.uc b/Classes/GGWarmupMessage.uc new file mode 100644 index 0000000..ada894d --- /dev/null +++ b/Classes/GGWarmupMessage.uc @@ -0,0 +1,93 @@ +class GGWarmupMessage extends CriticalEventPlus; + +var localized string Stage[8], NotReady, SinglePlayer; +var sound Riff; + +#EXEC OBJ LOAD FILE=Miscsounds.uax + +static simulated function ClientReceive( + PlayerController P, + optional int Switch, + optional PlayerReplicationInfo RelatedPRI_1, + optional PlayerReplicationInfo RelatedPRI_2, + optional Object OptionalObject + ) +{ + Super.ClientReceive(P, Switch, RelatedPRI_1, RelatedPRI_2, OptionalObject); + if ( Switch < 7 ) + { + P.Level.FillPrecacheMaterialsArray(false); + P.Level.FillPrecacheStaticMeshesArray(false); + P.PrecacheAnnouncements(); + } + // don't play sound if quickstart=true, so no 'play' voiceover at start of tutorials + if ( Switch == 5 && P != none ) + { + //P.PlayStatusAnnouncement('Play',1,true); + P.ClientPlaySound(sound'KF_BasePatriarch.Kev_Entrance1', false, 2.0); + P.ClientPlaySound(sound'KF_FoundrySnd.Alarm_BellWarning01', false, 2.0); + } + else if ( (Switch > 1) && (Switch < 5) ) + P.ClientPlaySound(sound'Miscsounds.Enter', true, 2.0); + else if ( Switch == 7 ) + P.ClientPlaySound(Default.Riff); +} + +static function string GetString( + optional int Switch, + optional PlayerReplicationInfo RelatedPRI_1, + optional PlayerReplicationInfo RelatedPRI_2, + optional Object OptionalObject + ) +{ + local int i, PlayerCount; + local GameReplicationInfo GRI; + + if ( (RelatedPRI_1 != None) && (RelatedPRI_1.Level.NetMode == NM_Standalone) ) + { + if ( (DeathMatch(RelatedPRI_1.Level.Game) != None) && DeathMatch(RelatedPRI_1.Level.Game).bQuickstart ) + return ""; + if ( Switch < 2 ) + return Default.SinglePlayer; + } + else if ( Switch == 0 && RelatedPRI_1 != None ) + { + GRI = RelatedPRI_1.Level.GRI; + if (GRI == None) + return Default.Stage[0]; + for (i = 0; i < GRI.PRIArray.Length; i++) + { + if ( GRI.PRIArray[i] != None && !GRI.PRIArray[i].bOnlySpectator + && (!GRI.PRIArray[i].bIsSpectator || GRI.PRIArray[i].bWaitingPlayer) ) + PlayerCount++; + } + if (GRI.MinNetPlayers - PlayerCount > 0) + return Default.Stage[0]@"("$(GRI.MinNetPlayers - PlayerCount)$")"; + } + else if ( switch == 1 ) + { + if ( (RelatedPRI_1 == None) || !RelatedPRI_1.bWaitingPlayer ) + return Default.Stage[0]; + else if ( RelatedPRI_1.bReadyToPlay ) + return Default.Stage[1]; + else + return Default.NotReady; + } + return Default.Stage[Switch]; +} + +defaultproperties +{ + Stage(0)="Waiting for other players." + Stage(1)="Waiting for ready signals. You are READY." + Stage(2)="The warmup is about to begin...3" + Stage(3)="The warmup is about to begin...2" + Stage(4)="The warmup is about to begin...1" + Stage(5)="The warmup has begun!" + Stage(6)="The warmup has begun!" + Stage(7)="OVER TIME!" + NotReady="You're not Ready. Click Ready!" + SinglePlayer="Click Ready to start!" + bIsConsoleMessage=False + DrawColor=(B=64,G=64,R=255) +} diff --git a/Classes/GG_HuskGun.uc b/Classes/GG_HuskGun.uc new file mode 100644 index 0000000..f9c40a5 --- /dev/null +++ b/Classes/GG_HuskGun.uc @@ -0,0 +1,15 @@ +//============================================================================= +// GG_HuskGun +//============================================================================= +// Gun Game Version Husk Arm fireball launching gun +//============================================================================= +// Killing Floor Source +// Copyright (C) 2011 Tripwire Interactive LLC +// - John "Ramm-Jaeger" Gibson +//============================================================================= +class GG_HuskGun extends HuskGun; + +defaultproperties +{ + FireModeClass(0)=Class'KFGunGame.GG_HuskGunFire' +} diff --git a/Classes/GG_HuskGunFire.uc b/Classes/GG_HuskGunFire.uc new file mode 100644 index 0000000..7a2231f --- /dev/null +++ b/Classes/GG_HuskGunFire.uc @@ -0,0 +1,18 @@ +//============================================================================= +// GG_HuskGunFire +//============================================================================= +// Gun Game Version Husk Gun primary fire class +//============================================================================= +// Killing Floor Source +// Copyright (C) 2011 Tripwire Interactive LLC +// - John "Ramm-Jaeger" Gibson +//============================================================================= + +class GG_HuskGunFire extends HuskGunFire; + +defaultproperties +{ + WeakProjectileClass=Class'KFGunGame.GG_HuskGunProjectile_Weak' + StrongProjectileClass=Class'KFGunGame.GG_HuskGunProjectile_Strong' + ProjectileClass=Class'KFGunGame.GG_HuskGunProjectile' +} diff --git a/Classes/GG_HuskGunProjectile.uc b/Classes/GG_HuskGunProjectile.uc new file mode 100644 index 0000000..1a2a47b --- /dev/null +++ b/Classes/GG_HuskGunProjectile.uc @@ -0,0 +1,102 @@ +//============================================================================= +// GG_HuskGunProjectile +//============================================================================= +// Gun Game Version Fireball projectile for the Husk zombie +//============================================================================= +// Killing Floor Source +// Copyright (C) 2009 Tripwire Interactive LLC +// - John "Ramm-Jaeger" Gibson +//============================================================================= +class GG_HuskGunProjectile extends HuskGunProjectile; + +simulated function ProcessTouch(Actor Other, Vector HitLocation) +{ + local vector X; + local Vector TempHitLocation, HitNormal; + local array HitPoints; + local KFPawn HitPawn; + + // Don't let it hit this player, or blow up on another player + if ( Other == none || Other == Instigator || Other.Base == Instigator ) + return; + + // Don't collide with bullet whip attachments + if( KFBulletWhipAttachment(Other) != none ) + { + return; + } + + // Don't allow hits on poeple on the same team + if( KFHumanPawn(Other) != none && Instigator != none + && KFHumanPawn(Other).PlayerReplicationInfo.Team.TeamIndex == Instigator.PlayerReplicationInfo.Team.TeamIndex ) + { + return; + } + + // Use the instigator's location if it exists. This fixes issues with + // the original location of the projectile being really far away from + // the real Origloc due to it taking a couple of milliseconds to + // replicate the location to the client and the first replicated location has + // already moved quite a bit. + if( Instigator != none ) + { + OrigLoc = Instigator.Location; + } + + X = Vector(Rotation); + + if( Role == ROLE_Authority ) + { + if( ROBulletWhipAttachment(Other) != none ) + { + if(!Other.Base.bDeleteMe) + { + Other = Instigator.HitPointTrace(TempHitLocation, HitNormal, HitLocation + (200 * X), HitPoints, HitLocation,, 1); + + if( Other == none || HitPoints.Length == 0 ) + return; + + HitPawn = KFPawn(Other); + + if (Role == ROLE_Authority) + { + if ( HitPawn != none ) + { + // Hit detection debugging + /*log("Bullet hit "$HitPawn.PlayerReplicationInfo.PlayerName); + HitPawn.HitStart = HitLocation; + HitPawn.HitEnd = HitLocation + (65535 * X);*/ + + if( !HitPawn.bDeleteMe ) + HitPawn.ProcessLocationalDamage(ImpactDamage, Instigator, TempHitLocation, MomentumTransfer * Normal(Velocity), ImpactDamageType,HitPoints); + + + // Hit detection debugging + //if( Level.NetMode == NM_Standalone) + // HitPawn.DrawBoneLocation(); + } + } + } + } + else + { + if (Pawn(Other) != none && Pawn(Other).IsHeadShot(HitLocation, X, 1.0)) + { + Pawn(Other).TakeDamage(ImpactDamage * HeadShotDamageMult, Instigator, HitLocation, MomentumTransfer * Normal(Velocity), ImpactDamageType); + } + else + { + Other.TakeDamage(ImpactDamage, Instigator, HitLocation, MomentumTransfer * Normal(Velocity), ImpactDamageType); + } + } + } + + if( !bDud ) + { + Explode(HitLocation,Normal(HitLocation-Other.Location)); + } +} + +defaultproperties +{ +} diff --git a/Classes/GG_HuskGunProjectile_Strong.uc b/Classes/GG_HuskGunProjectile_Strong.uc new file mode 100644 index 0000000..90226be --- /dev/null +++ b/Classes/GG_HuskGunProjectile_Strong.uc @@ -0,0 +1,102 @@ +//============================================================================= //============================================================================= +// GG_HuskGunProjectile_Strong +//============================================================================= +// GG Version Fireball projectile for the Husk zombie, stronger effects +//============================================================================= +// Killing Floor Source +// Copyright (C) 2009 Tripwire Interactive LLC +// - John "Ramm-Jaeger" Gibson +//============================================================================= +class GG_HuskGunProjectile_Strong extends HuskGunProjectile_Strong; + +simulated function ProcessTouch(Actor Other, Vector HitLocation) +{ + local vector X; + local Vector TempHitLocation, HitNormal; + local array HitPoints; + local KFPawn HitPawn; + + // Don't let it hit this player, or blow up on another player + if ( Other == none || Other == Instigator || Other.Base == Instigator ) + return; + + // Don't collide with bullet whip attachments + if( KFBulletWhipAttachment(Other) != none ) + { + return; + } + + // Don't allow hits on poeple on the same team + if( KFHumanPawn(Other) != none && Instigator != none + && KFHumanPawn(Other).PlayerReplicationInfo.Team.TeamIndex == Instigator.PlayerReplicationInfo.Team.TeamIndex ) + { + return; + } + + // Use the instigator's location if it exists. This fixes issues with + // the original location of the projectile being really far away from + // the real Origloc due to it taking a couple of milliseconds to + // replicate the location to the client and the first replicated location has + // already moved quite a bit. + if( Instigator != none ) + { + OrigLoc = Instigator.Location; + } + + X = Vector(Rotation); + + if( Role == ROLE_Authority ) + { + if( ROBulletWhipAttachment(Other) != none ) + { + if(!Other.Base.bDeleteMe) + { + Other = Instigator.HitPointTrace(TempHitLocation, HitNormal, HitLocation + (200 * X), HitPoints, HitLocation,, 1); + + if( Other == none || HitPoints.Length == 0 ) + return; + + HitPawn = KFPawn(Other); + + if (Role == ROLE_Authority) + { + if ( HitPawn != none ) + { + // Hit detection debugging + /*log("Bullet hit "$HitPawn.PlayerReplicationInfo.PlayerName); + HitPawn.HitStart = HitLocation; + HitPawn.HitEnd = HitLocation + (65535 * X);*/ + + if( !HitPawn.bDeleteMe ) + HitPawn.ProcessLocationalDamage(ImpactDamage, Instigator, TempHitLocation, MomentumTransfer * Normal(Velocity), ImpactDamageType,HitPoints); + + + // Hit detection debugging + //if( Level.NetMode == NM_Standalone) + // HitPawn.DrawBoneLocation(); + } + } + } + } + else + { + if (Pawn(Other) != none && Pawn(Other).IsHeadShot(HitLocation, X, 1.0)) + { + Pawn(Other).TakeDamage(ImpactDamage * HeadShotDamageMult, Instigator, HitLocation, MomentumTransfer * Normal(Velocity), ImpactDamageType); + } + else + { + Other.TakeDamage(ImpactDamage, Instigator, HitLocation, MomentumTransfer * Normal(Velocity), ImpactDamageType); + } + } + } + + if( !bDud ) + { + Explode(HitLocation,Normal(HitLocation-Other.Location)); + } +} + +defaultproperties +{ +} diff --git a/Classes/GG_HuskGunProjectile_Weak.uc b/Classes/GG_HuskGunProjectile_Weak.uc new file mode 100644 index 0000000..5074922 --- /dev/null +++ b/Classes/GG_HuskGunProjectile_Weak.uc @@ -0,0 +1,102 @@ +//============================================================================= //============================================================================= +// GG_HuskGunProjectile_Weak +//============================================================================= +// Gun Game Version Fireball projectile for the Husk zombie, weaker effects +//============================================================================= +// Killing Floor Source +// Copyright (C) 2009 Tripwire Interactive LLC +// - John "Ramm-Jaeger" Gibson +//============================================================================= +class GG_HuskGunProjectile_Weak extends HuskGunProjectile_Weak; + +simulated function ProcessTouch(Actor Other, Vector HitLocation) +{ + local vector X; + local Vector TempHitLocation, HitNormal; + local array HitPoints; + local KFPawn HitPawn; + + // Don't let it hit this player, or blow up on another player + if ( Other == none || Other == Instigator || Other.Base == Instigator ) + return; + + // Don't collide with bullet whip attachments + if( KFBulletWhipAttachment(Other) != none ) + { + return; + } + + // Don't allow hits on poeple on the same team + if( KFHumanPawn(Other) != none && Instigator != none + && KFHumanPawn(Other).PlayerReplicationInfo.Team.TeamIndex == Instigator.PlayerReplicationInfo.Team.TeamIndex ) + { + return; + } + + // Use the instigator's location if it exists. This fixes issues with + // the original location of the projectile being really far away from + // the real Origloc due to it taking a couple of milliseconds to + // replicate the location to the client and the first replicated location has + // already moved quite a bit. + if( Instigator != none ) + { + OrigLoc = Instigator.Location; + } + + X = Vector(Rotation); + + if( Role == ROLE_Authority ) + { + if( ROBulletWhipAttachment(Other) != none ) + { + if(!Other.Base.bDeleteMe) + { + Other = Instigator.HitPointTrace(TempHitLocation, HitNormal, HitLocation + (200 * X), HitPoints, HitLocation,, 1); + + if( Other == none || HitPoints.Length == 0 ) + return; + + HitPawn = KFPawn(Other); + + if (Role == ROLE_Authority) + { + if ( HitPawn != none ) + { + // Hit detection debugging + /*log("Bullet hit "$HitPawn.PlayerReplicationInfo.PlayerName); + HitPawn.HitStart = HitLocation; + HitPawn.HitEnd = HitLocation + (65535 * X);*/ + + if( !HitPawn.bDeleteMe ) + HitPawn.ProcessLocationalDamage(ImpactDamage, Instigator, TempHitLocation, MomentumTransfer * Normal(Velocity), ImpactDamageType,HitPoints); + + + // Hit detection debugging + //if( Level.NetMode == NM_Standalone) + // HitPawn.DrawBoneLocation(); + } + } + } + } + else + { + if (Pawn(Other) != none && Pawn(Other).IsHeadShot(HitLocation, X, 1.0)) + { + Pawn(Other).TakeDamage(ImpactDamage * HeadShotDamageMult, Instigator, HitLocation, MomentumTransfer * Normal(Velocity), ImpactDamageType); + } + else + { + Other.TakeDamage(ImpactDamage, Instigator, HitLocation, MomentumTransfer * Normal(Velocity), ImpactDamageType); + } + } + } + + if( !bDud ) + { + Explode(HitLocation,Normal(HitLocation-Other.Location)); + } +} + +defaultproperties +{ +} diff --git a/Classes/GG_LAW.uc b/Classes/GG_LAW.uc new file mode 100644 index 0000000..9b76f2e --- /dev/null +++ b/Classes/GG_LAW.uc @@ -0,0 +1,6 @@ +class GG_LAW extends LAW; + +defaultproperties +{ + FireModeClass(0)=Class'KFGunGame.GG_LAWFire' +} diff --git a/Classes/GG_LAWFire.uc b/Classes/GG_LAWFire.uc new file mode 100644 index 0000000..9ba520f --- /dev/null +++ b/Classes/GG_LAWFire.uc @@ -0,0 +1,6 @@ +class GG_LAWFire extends LAWFire; + +defaultproperties +{ + ProjectileClass=Class'KFGunGame.GG_LAWProj' +} diff --git a/Classes/GG_LAWProj.uc b/Classes/GG_LAWProj.uc new file mode 100644 index 0000000..9473701 --- /dev/null +++ b/Classes/GG_LAWProj.uc @@ -0,0 +1,56 @@ +class GG_LAWProj extends LAWProj; + +// Need to override this until we get the KF bug fix patch out otherwise this projectile will be bugged - Ramm +simulated function ProcessTouch(Actor Other, Vector HitLocation) +{ + // Don't let it hit this player, or blow up on another player + if ( Other == none || Other == Instigator || Other.Base == Instigator ) + return; + + // Don't collide with bullet whip attachments + if( KFBulletWhipAttachment(Other) != none ) + { + return; + } + + // Don't allow hits on poeple on the same team + if( KFHumanPawn(Other) != none && Instigator != none + && KFHumanPawn(Other).PlayerReplicationInfo.Team.TeamIndex == Instigator.PlayerReplicationInfo.Team.TeamIndex ) + { + return; + } + + // Use the instigator's location if it exists. This fixes issues with + // the original location of the projectile being really far away from + // the real Origloc due to it taking a couple of milliseconds to + // replicate the location to the client and the first replicated location has + // already moved quite a bit. + if( Instigator != none ) + { + OrigLoc = Instigator.Location; + } + + if( !bDud && ((VSizeSquared(Location - OrigLoc) < ArmDistSquared) || OrigLoc == vect(0,0,0)) ) + { + if( Role == ROLE_Authority ) + { + AmbientSound=none; + PlaySound(Sound'ProjectileSounds.PTRD_deflect04',,2.0); + Other.TakeDamage( ImpactDamage, Instigator, HitLocation, Normal(Velocity), ImpactDamageType ); + } + + bDud = true; + Velocity = vect(0,0,0); + LifeSpan=1.0; + SetPhysics(PHYS_Falling); + } + + if( !bDud ) + { + Explode(HitLocation,Normal(HitLocation-Other.Location)); + } +} + +defaultproperties +{ +} diff --git a/Classes/GG_M203Fire.uc b/Classes/GG_M203Fire.uc new file mode 100644 index 0000000..6f8fa97 --- /dev/null +++ b/Classes/GG_M203Fire.uc @@ -0,0 +1,6 @@ +class GG_M203Fire extends M203Fire; + +defaultproperties +{ + ProjectileClass=Class'KFGunGame.GG_M203GrenadeProjectile' +} diff --git a/Classes/GG_M203GrenadeProjectile.uc b/Classes/GG_M203GrenadeProjectile.uc new file mode 100644 index 0000000..758aa1f --- /dev/null +++ b/Classes/GG_M203GrenadeProjectile.uc @@ -0,0 +1,55 @@ +class GG_M203GrenadeProjectile extends M203GrenadeProjectile; + +// Need to override this until we get the KF bug fix patch out otherwise this projectile will be bugged - Ramm +simulated function ProcessTouch(Actor Other, Vector HitLocation) +{ + // Don't let it hit this player, or blow up on another player + if ( Other == none || Other == Instigator || Other.Base == Instigator ) + return; + + // Don't collide with bullet whip attachments + if( KFBulletWhipAttachment(Other) != none ) + { + return; + } + + // Don't allow hits on poeple on the same team + if( KFHumanPawn(Other) != none && Instigator != none + && KFHumanPawn(Other).PlayerReplicationInfo.Team.TeamIndex == Instigator.PlayerReplicationInfo.Team.TeamIndex ) + { + return; + } + + // Use the instigator's location if it exists. This fixes issues with + // the original location of the projectile being really far away from + // the real Origloc due to it taking a couple of milliseconds to + // replicate the location to the client and the first replicated location has + // already moved quite a bit. + if( Instigator != none ) + { + OrigLoc = Instigator.Location; + } + + if( !bDud && ((VSizeSquared(Location - OrigLoc) < ArmDistSquared) || OrigLoc == vect(0,0,0)) ) + { + if( Role == ROLE_Authority ) + { + AmbientSound=none; + PlaySound(Sound'ProjectileSounds.PTRD_deflect04',,2.0); + Other.TakeDamage( ImpactDamage, Instigator, HitLocation, Normal(Velocity), ImpactDamageType ); + } + bDud = true; + Velocity = vect(0,0,0); + LifeSpan=1.0; + SetPhysics(PHYS_Falling); + } + + if( !bDud ) + { + Explode(HitLocation,Normal(HitLocation-Other.Location)); + } +} + +defaultproperties +{ +} diff --git a/Classes/GG_M32Fire.uc b/Classes/GG_M32Fire.uc new file mode 100644 index 0000000..e816e09 --- /dev/null +++ b/Classes/GG_M32Fire.uc @@ -0,0 +1,6 @@ +class GG_M32Fire extends M32Fire; + +defaultproperties +{ + ProjectileClass=Class'KFGunGame.GG_M32GrenadeProjectile' +} diff --git a/Classes/GG_M32GrenadeLauncher.uc b/Classes/GG_M32GrenadeLauncher.uc new file mode 100644 index 0000000..49cf70f --- /dev/null +++ b/Classes/GG_M32GrenadeLauncher.uc @@ -0,0 +1,9 @@ +//============================================================================= +// Gun Game Version M32 MGL Semi automatic grenade launcher Inventory class +//============================================================================= +class GG_M32GrenadeLauncher extends M32GrenadeLauncher; + +defaultproperties +{ + FireModeClass(0)=Class'KFGunGame.GG_M32Fire' +} diff --git a/Classes/GG_M32GrenadeProjectile.uc b/Classes/GG_M32GrenadeProjectile.uc new file mode 100644 index 0000000..6bc23f3 --- /dev/null +++ b/Classes/GG_M32GrenadeProjectile.uc @@ -0,0 +1,55 @@ +class GG_M32GrenadeProjectile extends M32GrenadeProjectile; + +// Need to override this until we get the KF bug fix patch out otherwise this projectile will be bugged - Ramm +simulated function ProcessTouch(Actor Other, Vector HitLocation) +{ + // Don't let it hit this player, or blow up on another player + if ( Other == none || Other == Instigator || Other.Base == Instigator ) + return; + + // Don't collide with bullet whip attachments + if( KFBulletWhipAttachment(Other) != none ) + { + return; + } + + // Don't allow hits on poeple on the same team + if( KFHumanPawn(Other) != none && Instigator != none + && KFHumanPawn(Other).PlayerReplicationInfo.Team.TeamIndex == Instigator.PlayerReplicationInfo.Team.TeamIndex ) + { + return; + } + + // Use the instigator's location if it exists. This fixes issues with + // the original location of the projectile being really far away from + // the real Origloc due to it taking a couple of milliseconds to + // replicate the location to the client and the first replicated location has + // already moved quite a bit. + if( Instigator != none ) + { + OrigLoc = Instigator.Location; + } + + if( !bDud && ((VSizeSquared(Location - OrigLoc) < ArmDistSquared) || OrigLoc == vect(0,0,0)) ) + { + if( Role == ROLE_Authority ) + { + AmbientSound=none; + PlaySound(Sound'ProjectileSounds.PTRD_deflect04',,2.0); + Other.TakeDamage( ImpactDamage, Instigator, HitLocation, Normal(Velocity), ImpactDamageType ); + } + bDud = true; + Velocity = vect(0,0,0); + LifeSpan=1.0; + SetPhysics(PHYS_Falling); + } + + if( !bDud ) + { + Explode(HitLocation,Normal(HitLocation-Other.Location)); + } +} + +defaultproperties +{ +} diff --git a/Classes/GG_M4203AssaultRifle.uc b/Classes/GG_M4203AssaultRifle.uc new file mode 100644 index 0000000..d7e5c39 --- /dev/null +++ b/Classes/GG_M4203AssaultRifle.uc @@ -0,0 +1,15 @@ +//============================================================================= +// GG_M4203AssaultRifle +//============================================================================= +// Gun Game Version M4 Assault Rifle with M203 Grenade launcher +//============================================================================= +// Killing Floor Source +// Copyright (C) 2011 Tripwire Interactive LLC +// - John "Ramm-Jaeger" Gibson +//============================================================================= +class GG_M4203AssaultRifle extends M4203AssaultRifle; + +defaultproperties +{ + FireModeClass(1)=Class'KFGunGame.GG_M203Fire' +} diff --git a/Classes/GG_M79Fire.uc b/Classes/GG_M79Fire.uc new file mode 100644 index 0000000..ac66aba --- /dev/null +++ b/Classes/GG_M79Fire.uc @@ -0,0 +1,6 @@ +class GG_M79Fire extends M79Fire; + +defaultproperties +{ + ProjectileClass=Class'KFGunGame.GG_M79GrenadeProjectile' +} diff --git a/Classes/GG_M79GrenadeLauncher.uc b/Classes/GG_M79GrenadeLauncher.uc new file mode 100644 index 0000000..ef14ea1 --- /dev/null +++ b/Classes/GG_M79GrenadeLauncher.uc @@ -0,0 +1,9 @@ +//============================================================================= +// Gun Game Version M79 Grenade launcher Inventory class +//============================================================================= +class GG_M79GrenadeLauncher extends M79GrenadeLauncher; + +defaultproperties +{ + FireModeClass(0)=Class'KFGunGame.GG_M79Fire' +} diff --git a/Classes/GG_M79GrenadeProjectile.uc b/Classes/GG_M79GrenadeProjectile.uc new file mode 100644 index 0000000..73fb72e --- /dev/null +++ b/Classes/GG_M79GrenadeProjectile.uc @@ -0,0 +1,55 @@ +class GG_M79GrenadeProjectile extends M79GrenadeProjectile; + +// Need to override this until we get the KF bug fix patch out otherwise this projectile will be bugged - Ramm +simulated function ProcessTouch(Actor Other, Vector HitLocation) +{ + // Don't let it hit this player, or blow up on another player + if ( Other == none || Other == Instigator || Other.Base == Instigator ) + return; + + // Don't collide with bullet whip attachments + if( KFBulletWhipAttachment(Other) != none ) + { + return; + } + + // Don't allow hits on poeple on the same team + if( KFHumanPawn(Other) != none && Instigator != none + && KFHumanPawn(Other).PlayerReplicationInfo.Team.TeamIndex == Instigator.PlayerReplicationInfo.Team.TeamIndex ) + { + return; + } + + // Use the instigator's location if it exists. This fixes issues with + // the original location of the projectile being really far away from + // the real Origloc due to it taking a couple of milliseconds to + // replicate the location to the client and the first replicated location has + // already moved quite a bit. + if( Instigator != none ) + { + OrigLoc = Instigator.Location; + } + + if( !bDud && ((VSizeSquared(Location - OrigLoc) < ArmDistSquared) || OrigLoc == vect(0,0,0)) ) + { + if( Role == ROLE_Authority ) + { + AmbientSound=none; + PlaySound(Sound'ProjectileSounds.PTRD_deflect04',,2.0); + Other.TakeDamage( ImpactDamage, Instigator, HitLocation, Normal(Velocity), ImpactDamageType ); + } + bDud = true; + Velocity = vect(0,0,0); + LifeSpan=1.0; + SetPhysics(PHYS_Falling); + } + + if( !bDud ) + { + Explode(HitLocation,Normal(HitLocation-Other.Location)); + } +} + +defaultproperties +{ +} diff --git a/Classes/KFBlueGGPlayer.uc b/Classes/KFBlueGGPlayer.uc new file mode 100644 index 0000000..25db176 --- /dev/null +++ b/Classes/KFBlueGGPlayer.uc @@ -0,0 +1,47 @@ +// Blue Team player. +class KFBlueGGPlayer extends KFRedGGPlayer; + +simulated function bool IsTeamColorCharacter(string CheckString) +{ + if( CheckString == "Police_Constable_Briar" || CheckString == "Police_Sergeant_Davin" + || CheckString == "Paramedic_Alfred_Anderson") + { + return true; + } + else + { + return false; + } +} + +simulated function string GetDefaultCharacter() +{ + local int RandChance; + + RandChance = Rand(2); + + if( RandChance == 0 ) + { + return "Police_Constable_Briar"; + } + else if( RandChance == 1 ) + { + return "Paramedic_Alfred_Anderson"; + } + else + { + return "Police_Sergeant_Davin"; + } + + //kinda fits +// Agent_Wilkes +// FoundryWorker_Aldridge +// KF_German +// MR_Foster +// Pyro_Blue + +} + +defaultproperties +{ +} diff --git a/Classes/KFDMScoreBoard.uc b/Classes/KFDMScoreBoard.uc new file mode 100644 index 0000000..9ed3342 --- /dev/null +++ b/Classes/KFDMScoreBoard.uc @@ -0,0 +1,286 @@ +class KFDMScoreBoard extends KFScoreBoard; + +function DrawTitle(Canvas Canvas, float HeaderOffsetY, float PlayerAreaY, float PlayerBoxSizeY) +{ + local string TitleString, ScoreInfoString, RestartString; + local float TitleXL, ScoreInfoXL, YL, TitleY, TitleYL; + + TitleString = "DeathMatch" @ Eval(GRI.GoalScore>0,"|"@"Frag Limit:"@GRI.GoalScore@"|","|")@Level.Title; + + Canvas.Font = class'ROHud'.static.GetSmallMenuFont(Canvas); + + Canvas.StrLen(TitleString, TitleXL, TitleYL); + + if ( GRI.TimeLimit != 0 ) + { + ScoreInfoString = TimeLimit $ FormatTime(GRI.RemainingTime); + } + else + { + ScoreInfoString = FooterText @ FormatTime(GRI.ElapsedTime); + } + + Canvas.DrawColor = HUDClass.default.RedColor; + + if ( UnrealPlayer(Owner).bDisplayLoser ) + { + ScoreInfoString = class'HUDBase'.default.YouveLostTheMatch; + } + else if ( UnrealPlayer(Owner).bDisplayWinner ) + { + ScoreInfoString = class'HUDBase'.default.YouveWonTheMatch; + } + else if ( PlayerController(Owner).IsDead() ) + { + RestartString = Restart; + ScoreInfoString = RestartString; + } + + TitleY = Canvas.ClipY * 0.13; + Canvas.SetPos(0.5 * (Canvas.ClipX - TitleXL), TitleY); + Canvas.DrawText(TitleString); + + Canvas.StrLen(ScoreInfoString, ScoreInfoXL, YL); + Canvas.SetPos(0.5 * (Canvas.ClipX - ScoreInfoXL), TitleY + TitleYL); + Canvas.DrawText(ScoreInfoString); +} +simulated event UpdateScoreBoard(Canvas Canvas) +{ + local PlayerReplicationInfo PRI, OwnerPRI; + local int i, FontReduction, NetXPos, PlayerCount, HeaderOffsetY, HeadFoot, MessageFoot, PlayerBoxSizeY, BoxSpaceY, NameXPos, BoxTextOffsetY, OwnerOffset, HealthXPos, BoxXPos,KillsXPos, TitleYPos, BoxWidth, VetXPos; + local float XL,YL, MaxScaling; + local float deathsXL, KillsXL, netXL,HealthXL, MaxNamePos, KillWidthX, HealthWidthX; + local bool bNameFontReduction; + + OwnerPRI = KFPlayerController(Owner).PlayerReplicationInfo; + OwnerOffset = -1; + + for ( i = 0; i < GRI.PRIArray.Length; i++) + { + PRI = GRI.PRIArray[i]; + + if ( !PRI.bOnlySpectator ) + { + if ( PRI == OwnerPRI ) + { + OwnerOffset = i; + } + + PlayerCount++; + } + } + + PlayerCount = Min(PlayerCount, MAXPLAYERS); + + // Select best font size and box size to fit as many players as possible on screen + Canvas.Font = class'ROHud'.static.GetSmallMenuFont(Canvas); + Canvas.StrLen("Test", XL, YL); + BoxSpaceY = 0.25 * YL; + PlayerBoxSizeY = 1.2 * YL; + HeadFoot = 7 * YL; + MessageFoot = 1.5 * HeadFoot; + + if ( PlayerCount > (Canvas.ClipY - 1.5 * HeadFoot) / (PlayerBoxSizeY + BoxSpaceY) ) + { + BoxSpaceY = 0.125 * YL; + PlayerBoxSizeY = 1.25 * YL; + + if ( PlayerCount > (Canvas.ClipY - 1.5 * HeadFoot) / (PlayerBoxSizeY + BoxSpaceY) ) + { + if ( PlayerCount > (Canvas.ClipY - 1.5 * HeadFoot) / (PlayerBoxSizeY + BoxSpaceY) ) + { + PlayerBoxSizeY = 1.125 * YL; + } + /* + if ( PlayerCount > (Canvas.ClipY - 1.5 * HeadFoot) / (PlayerBoxSizeY + BoxSpaceY) ) + { + FontReduction++; + Canvas.Font = GetSmallerFontFor(Canvas, FontReduction); + Canvas.StrLen("Test", XL, YL); + BoxSpaceY = 0.125 * YL; + PlayerBoxSizeY = 1.125 * YL; + HeadFoot = 7 * YL; + + if ( PlayerCount > (Canvas.ClipY - HeadFoot) / (PlayerBoxSizeY + BoxSpaceY) ) + { + FontReduction++; + Canvas.Font = GetSmallerFontFor(Canvas, FontReduction); + Canvas.StrLen("Test", XL, YL); + BoxSpaceY = 0.125 * YL; + PlayerBoxSizeY = 1.125 * YL; + HeadFoot = 7 * YL; + + if ( (Canvas.ClipY >= 768) && (PlayerCount > (Canvas.ClipY - HeadFoot) / (PlayerBoxSizeY + BoxSpaceY)) ) + { + FontReduction++; + Canvas.Font = GetSmallerFontFor(Canvas,FontReduction); + Canvas.StrLen("Test", XL, YL); + BoxSpaceY = 0.125 * YL; + PlayerBoxSizeY = 1.125 * YL; + HeadFoot = 7 * YL; + } + } + }*/ + } + } + + if ( Canvas.ClipX < 512 ) + { + PlayerCount = Min(PlayerCount, 1+(Canvas.ClipY - HeadFoot) / (PlayerBoxSizeY + BoxSpaceY) ); + } + else + { + PlayerCount = Min(PlayerCount, (Canvas.ClipY - HeadFoot) / (PlayerBoxSizeY + BoxSpaceY) ); + } + + if ( FontReduction > 2 ) + { + MaxScaling = 3; + } + else + { + MaxScaling = 2.125; + } + + PlayerBoxSizeY = FClamp((1.25 + (Canvas.ClipY - 0.67 * MessageFoot)) / PlayerCount - BoxSpaceY, PlayerBoxSizeY, MaxScaling * YL); + + bDisplayMessages = (PlayerCount <= (Canvas.ClipY - MessageFoot) / (PlayerBoxSizeY + BoxSpaceY)); + + HeaderOffsetY = 10 * YL; + BoxWidth = 0.7 * Canvas.ClipX; + BoxXPos = 0.5 * (Canvas.ClipX - BoxWidth); + BoxWidth = Canvas.ClipX - 2 * BoxXPos; + VetXPos = BoxXPos + 0.0001 * BoxWidth; + NameXPos = BoxXPos + 0.08 * BoxWidth; + KillsXPos = BoxXPos + 0.60 * BoxWidth; + HealthXpos = BoxXPos + 0.75 * BoxWidth; + NetXPos = BoxXPos + 0.90 * BoxWidth; + + // draw background boxes + Canvas.Style = ERenderStyle.STY_Alpha; + Canvas.DrawColor = HUDClass.default.WhiteColor; + Canvas.DrawColor.A = 128; + + for ( i = 0; i < PlayerCount; i++ ) + { + Canvas.SetPos(BoxXPos, HeaderOffsetY + (PlayerBoxSizeY + BoxSpaceY) * i); + Canvas.DrawTileStretched( BoxMaterial, BoxWidth, PlayerBoxSizeY); + } + + // draw title + Canvas.Style = ERenderStyle.STY_Normal; + DrawTitle(Canvas, HeaderOffsetY, (PlayerCount + 1) * (PlayerBoxSizeY + BoxSpaceY), PlayerBoxSizeY); + + // Draw headers + TitleYPos = HeaderOffsetY - 1.1 * YL; + Canvas.StrLen(HealthText, HealthXL, YL); + Canvas.StrLen(DeathsText, DeathsXL, YL); + Canvas.StrLen(KillsText, KillsXL, YL); + Canvas.StrLen("50", HealthWidthX, YL); + + Canvas.DrawColor = HUDClass.default.WhiteColor; + Canvas.SetPos(NameXPos, TitleYPos); + Canvas.DrawText(PlayerText,true); + + if( bDisplayWithKills ) + { + Canvas.SetPos(KillsXPos - 0.5 * KillsXL, TitleYPos); + Canvas.DrawText(KillsText,true); + } + + Canvas.SetPos(HealthXPos - 0.5 * HealthXL, TitleYPos); + Canvas.DrawText(HealthText,true); + + // draw player names + MaxNamePos = 0.9 * (KillsXPos - NameXPos); + + for ( i = 0; i < PlayerCount; i++ ) + { + Canvas.StrLen(GRI.PRIArray[i].PlayerName, XL, YL); + + if ( XL > MaxNamePos ) + { + bNameFontReduction = true; + break; + } + } + + if ( bNameFontReduction ) + { + Canvas.Font = GetSmallerFontFor(Canvas, FontReduction + 1); + } + + Canvas.Style = ERenderStyle.STY_Normal; + Canvas.DrawColor = HUDClass.default.WhiteColor; + Canvas.SetPos(0.5 * Canvas.ClipX, HeaderOffsetY + 4); + BoxTextOffsetY = HeaderOffsetY + 0.5 * (PlayerBoxSizeY - YL); + + Canvas.DrawColor = HUDClass.default.WhiteColor; + MaxNamePos = Canvas.ClipX; + Canvas.ClipX = KillsXPos - 4.f; + + for ( i = 0; i < PlayerCount; i++ ) + { + Canvas.SetPos(NameXPos, (PlayerBoxSizeY + BoxSpaceY)*i + BoxTextOffsetY); + + if( i == OwnerOffset ) + { + Canvas.DrawColor.G = 0; + Canvas.DrawColor.B = 0; + } + else + { + Canvas.DrawColor.G = 255; + Canvas.DrawColor.B = 255; + } + + Canvas.DrawTextClipped(GRI.PRIArray[i].PlayerName); + } + + Canvas.ClipX = MaxNamePos; + Canvas.DrawColor = HUDClass.default.WhiteColor; + + if ( bNameFontReduction ) + { + Canvas.Font = GetSmallerFontFor(Canvas, FontReduction); + } + + Canvas.Style = ERenderStyle.STY_Normal; + MaxScaling = FMax(PlayerBoxSizeY,30.f); + Canvas.DrawColor = HUDClass.default.WhiteColor; + + // Draw the player informations. + for ( i = 0; i < PlayerCount; i++ ) + { + // draw kills + Canvas.StrLen(KFPlayerReplicationInfo(GRI.PRIArray[i]).Kills, KillWidthX, YL); + Canvas.SetPos(KillsXPos - 0.5 * KillWidthX, (PlayerBoxSizeY + BoxSpaceY) * i + BoxTextOffsetY); + Canvas.DrawText(GRI.PRIArray[i].Kills, true); + + // draw deaths + Canvas.SetPos(HealthXpos - 0.5 * HealthWidthX, (PlayerBoxSizeY + BoxSpaceY) * i + BoxTextOffsetY); + Canvas.DrawText(string(int(GRI.PRIArray[i].Deaths)), true); + } + + if ( Level.NetMode == NM_Standalone ) + return; + + Canvas.StrLen(NetText, NetXL, YL); + Canvas.DrawColor = HUDClass.default.WhiteColor; + Canvas.SetPos(NetXPos - 0.5 * NetXL, TitleYPos); + Canvas.DrawText(NetText,true); + + for ( i=0; i WeaponList; // A list of weapons that the players have to go through to win +var array StandardWeaponList; // A list of weapons that the players have to go through to win that includes the longer list of weapons weapons +var array ShortWeaponList; // A list of weapons that the players have to go through to win that is shortened down +//var string FinalWeapon; // The final weapon to get a kill with to get the victory +var localized string WarmupDescription; +var localized string ReverseDescription; +var localized string ShortListDescription; + +static function Texture GetRandomTeamSymbol(int base) +{ + return Texture'Engine.S_Actor'; +} +event Tick(float DeltaTime); +function DramaticEvent(float BaseZedTimePossibility, optional float DesiredZedTimeDuration); +function ShowPathTo(PlayerController P, int TeamNum); +function DoBossDeath(); + +event PostLogin( PlayerController NewPlayer ) +{ + local int i; + + Super.PostLogin(NewPlayer); + + // Precache all the weapons + if ( KFPlayerController(NewPlayer) != none ) + { + for ( i = 0; i < StandardWeaponList.Length; i++ ) + { + KFPlayerController(NewPlayer).ClientWeaponSpawned(class(BaseMutator.GetInventoryClass(StandardWeaponList[i])), none); + } + } +} + +// For now don't dynamically load/unload weapons. TODO: find a way to dynamically +// load a set of the GG weapons at a time to save on memory +function WeaponSpawned(Inventory Weapon){} +function WeaponDestroyed(class WeaponClass){} + +static function FillPlayInfo(PlayInfo PlayInfo) +{ + Super(Info).FillPlayInfo(PlayInfo); // Always begin with calling parent + + PlayInfo.AddSetting(default.GameGroup, "TimeLimit",GetDisplayText("TimeLimit"),0, 0, "Text","3;0:999"); + PlayInfo.AddSetting(default.GameGroup, "WarmupTime",default.WarmupDescription,0, 0, "Text","3;0:999"); + PlayInfo.AddSetting(default.GameGroup, "bReverseList", default.ReverseDescription, 0, 0, "Check", , ,True,True); + PlayInfo.AddSetting(default.GameGroup, "bShortList", default.ShortListDescription, 0, 0, "Check", , ,True,True); + + //AddSetting(string Group, string PropertyName, string Description, byte SecLevel, byte Weight, string RenderType, optional string Extras, optional string ExtraPrivs, optional bool bMultiPlayerOnly, optional bool bAdvanced); + //PlayInfo.AddSetting(default.GameGroup, "NumAmmoSpawns","Num Ammo Pickups",0, 0, "Text","2;0:10"); + + PlayInfo.AddSetting(default.ServerGroup, "MinPlayers","Num Bots",0, 0, "Text","2;0:64",,True,True); + PlayInfo.AddSetting(default.ServerGroup, "LobbyTimeOut", GetDisplayText("LobbyTimeOut"), 0, 1, "Text", "3;0:120", ,True,True); + PlayInfo.AddSetting(default.ServerGroup, "bAdminCanPause", GetDisplayText("bAdminCanPause"), 1, 1, "Check", , ,True,True); + PlayInfo.AddSetting(default.ServerGroup, "MaxSpectators", GetDisplayText("MaxSpectators"), 1, 1, "Text", "6;0:32", ,True,True); + PlayInfo.AddSetting(default.ServerGroup, "MaxPlayers", GetDisplayText("MaxPlayers"), 0, 1, "Text", "6;0:32", ,True); + PlayInfo.AddSetting(default.ServerGroup, "MaxIdleTime", GetDisplayText("MaxIdleTime"), 0, 1, "Text", "3;0:300", ,True,True); + + // Add GRI's PIData + if (default.GameReplicationInfoClass != None) + { + default.GameReplicationInfoClass.static.FillPlayInfo(PlayInfo); + PlayInfo.PopClass(); + } + + if (default.VoiceReplicationInfoClass != None) + { + default.VoiceReplicationInfoClass.static.FillPlayInfo(PlayInfo); + PlayInfo.PopClass(); + } + + if (default.BroadcastClass != None) + default.BroadcastClass.static.FillPlayInfo(PlayInfo); + else class'BroadcastHandler'.static.FillPlayInfo(PlayInfo); + + PlayInfo.PopClass(); + + if (class'Engine.GameInfo'.default.VotingHandlerClass != None) + { + class'Engine.GameInfo'.default.VotingHandlerClass.static.FillPlayInfo(PlayInfo); + PlayInfo.PopClass(); + } +} + +static event string GetDescriptionText(string PropName) +{ + switch (PropName) + { + //case "NumAmmoSpawns": return "Number of ammo pickups that can be available at once."; + //case "MinPlayers": return "Minimum number of players in game (rest will be filled with bots."; + //case "InitGrenadesCount": return "Initial amount of grenades players start with."; + case "WarmupTime": return default.WarmupDescription; + case "bReverseList": return default.ReverseDescription; + } + return Super.GetDescriptionText(PropName); +} + +function bool CheckMaxLives(PlayerReplicationInfo Scorer) +{ + return false; +} + +event PreBeginPlay() +{ + local int i; + + Super(xTeamGame).PreBeginPlay(); + GameReplicationInfo.bNoTeamSkins = true; + GameReplicationInfo.bForceNoPlayerLights = true; + GameReplicationInfo.bNoTeamChanges = false; + + + if( bShortList ) + { + for ( i = 0; i < ShortWeaponList.Length; i++ ) + { + if( bReverseList ) + { + if( ShortWeaponList[i] != "" ) + { + if( i > 0 ) + { + WeaponList[WeaponList.Length] = ShortWeaponList[ShortWeaponList.Length - (i + 1)]; + + } + } + } + else + { + if( ShortWeaponList[i] != "" ) + { + WeaponList[i] = ShortWeaponList[i]; + } + } + } + } + else + { + for ( i = 0; i < StandardWeaponList.Length; i++ ) + { + if( bReverseList ) + { + if( StandardWeaponList[i] != "" ) + { + if( i > 0 ) + { + WeaponList[WeaponList.Length] = StandardWeaponList[StandardWeaponList.Length - (i + 1)]; + + } + } + } + else + { + if( StandardWeaponList[i] != "" ) + { + WeaponList[i] = StandardWeaponList[i]; + } + } + } + } + + // Add the final weapon when in reverse mode + if( bReverseList ) + { + if( bShortList ) + { + if( ShortWeaponList[ShortWeaponList.Length - 1] != "" ) + { + WeaponList[WeaponList.Length] = ShortWeaponList[ShortWeaponList.Length-1]; + } + } + else + { + if( StandardWeaponList[StandardWeaponList.Length - 1] != "" ) + { + WeaponList[WeaponList.Length] = StandardWeaponList[StandardWeaponList.Length-1]; + } + } + } + +// for ( i = 0; i < WeaponList.Length; i++ ) +// { +// log("i = "$i$" WeaponList.Length = "$WeaponList.Length$" WeaponList[i] = "$WeaponList[i]); +// } + + KFGGGameReplicationInfo(GameReplicationInfo).MaxWeaponLevel = WeaponList.Length; +} + +event InitGame( string Options, out string Error ) +{ + local KFLevelRules KFLRit; + local ShopVolume SH; + local ZombieVolume ZZ; + + MaxLives = 0; + Super(DeathMatch).InitGame(Options, Error); + + foreach DynamicActors(class'KFLevelRules',KFLRit) + KFLRit.Destroy(); + foreach AllActors(class'ShopVolume',SH) + ShopList[ShopList.Length] = SH; + foreach AllActors(class'ZombieVolume',ZZ) + ZedSpawnList[ZedSpawnList.Length] = ZZ; +// foreach AllActors(class'KFRandomSpawn',RS) +// { +// TestSpawnPoint(RS); +// RS.SetTimer(0,false); +// RS.Destroy(); +// } +// foreach AllActors(class'Pickup',I) +// { +// TestSpawnPoint(I); +// I.Destroy(); +// } +// if( SpawningPoints.Length==0 ) +// Warn("Could not find any possible spawn areas on this map!!!"); +// for( N=Level.NavigationPointList; N!=None; N=N.nextNavigationPoint ) +// if( PlayerStart(N)!=None && PointIsGood(N.Location) ) +// SpawningPoints[SpawningPoints.Length] = PlayerStart(N); +// if( SpawnTester!=None ) +// SpawnTester.Destroy(); + + //provide default rules if mapper did not need custom one + if(KFLRules==none) + KFLRules = spawn(class'KFLevelRules'); +} + +function UnrealTeamInfo GetBotTeam(optional int TeamBots) +{ + return Super(xTeamGame).GetBotTeam(TeamBots); +} + +function byte PickTeam(byte num, Controller C) +{ + return Super(TeamGame).PickTeam(num,C); + +// if( C.PlayerReplicationInfo.Team.TeamIndex == 0 ) +// { +// C.SetPawnClass(DefaultPlayerClassName, "Sergeant_Powers"); +// } +// else if( C.PlayerReplicationInfo.Team.TeamIndex == 1 ) +// { +// C.SetPawnClass(DefaultPlayerClassName, "Police_Constable_Briar"); +// } +} + +function bool ChangeTeam(Controller Other, int num, bool bNewTeam) +{ + return Super(xTeamGame).ChangeTeam(Other,num,bNewTeam); + +// if( Other.PlayerReplicationInfo.Team.TeamIndex == 0 ) +// { +// Other.SetPawnClass(DefaultPlayerClassName, "Sergeant_Powers"); +// } +// else if( Other.PlayerReplicationInfo.Team.TeamIndex == 1 ) +// { +// Other.SetPawnClass(DefaultPlayerClassName, "Police_Constable_Briar"); +// } +} + +static event bool AcceptPlayInfoProperty(string PropertyName) +{ + return Super(GameInfo).AcceptPlayInfoProperty(PropertyName); +} + +/* Rate whether player should choose this NavigationPoint as its start +*/ +function float RatePlayerStart(NavigationPoint N, byte Team, Controller Player) +{ + return super(TeamGame).RatePlayerStart(N,Team,Player); +} + +exec function AddBots(int num) +{ + num = Clamp(num, 0, 32 - (NumPlayers + NumBots)); + + while (--num >= 0) + { + if ( Level.NetMode != NM_Standalone ) + MinPlayers = Max(MinPlayers + 1, NumPlayers + NumBots + 1); + AddBot(); + } +} + +function Bot SpawnBot(optional string botName) +{ + local KFGGBot NewBot; + local RosterEntry Chosen; + local UnrealTeamInfo BotTeam; + + BotTeam = GetBotTeam(); + Chosen = BotTeam.ChooseBotClass(botName); + + if (Chosen.PawnClass == None) + Chosen.Init(); //amb + NewBot = Spawn(class'KFGGBot'); + + if ( NewBot != None ) + InitializeBot(NewBot,BotTeam,Chosen); + NewBot.PlayerReplicationInfo.Score = StartingCash; + + return NewBot; +} + +//function int ReduceDamage(int Damage, pawn injured, pawn instigatedBy, vector HitLocation, out vector Momentum, class DamageType) +//{ +// if( instigatedBy!=None && instigatedBy!=injured && injured.GetTeamNum()==instigatedBy.GetTeamNum() ) +// { +// if( FriendlyFireScale==0.f || Damage<=0 ) +// return 0; +// else return Super.ReduceDamage(Max(Damage*FriendlyFireScale,1),injured,instigatedBy,HitLocation,Momentum,DamageType); +// } +// return Super.ReduceDamage(Damage,injured,instigatedBy,HitLocation,Momentum,DamageType); +//} + +function PlayEndOfMatchMessage() +{ + local Controller C; + + for ( C = Level.ControllerList; C != None; C = C.NextController ) + { + if ( C.IsA('PlayerController') ) + { + //PlayerController(C).ClientPlaySound(Sound'KF_MaleVoiceOne.Insult_Specimens_9',true,2.f,SLOT_Talk); + if( FRand() < 0.25 ) + { + PlayerController(C).ClientPlaySound(Sound'KF_BasePatriarch.Kev_Victory5',true,2.f,SLOT_Talk); + } + else if( FRand() < 0.25 ) + { + PlayerController(C).ClientPlaySound(Sound'KF_BasePatriarch.Kev_Victory3',true,2.f,SLOT_Talk); + } + else if( FRand() < 0.25 ) + { + PlayerController(C).ClientPlaySound(Sound'KF_BasePatriarch.Kev_Victory2',true,2.f,SLOT_Talk); + } + else + { + PlayerController(C).ClientPlaySound(Sound'KF_BasePatriarch.Kev_Talk3',true,2.f,SLOT_Talk); + } + } + } +} + +function bool CheckEndGame(PlayerReplicationInfo Winner, string Reason) +{ + local Controller P, NextController; + local PlayerController Player; + + if ( (GameRulesModifiers != None) && !GameRulesModifiers.CheckEndGame(Winner, Reason) ) + return false; + +// if ( Winner == None ) +// { +// // find winner +// for ( P=Level.ControllerList; P!=None; P=P.nextController ) +// if ( P.bIsPlayer && ((Winner == None) || (P.PlayerReplicationInfo.Kills>= Winner.Kills)) ) +// { +// Winner = P.PlayerReplicationInfo; +// } +// } + + // check for tie +// for ( P=Level.ControllerList; P!=None; P=P.nextController ) +// { +// if ( P.bIsPlayer && (Winner != P.PlayerReplicationInfo) && (P.PlayerReplicationInfo.Kills==Winner.Kills) ) +// { +// if ( !bOverTimeBroadcast ) +// { +// BroadcastLocalizedMessage(class'KFDMTimeMessage', -1); +// bOverTimeBroadcast = true; +// } +// return false; +// } +// } + + EndTime = Level.TimeSeconds + EndTimeDelay + 5; + GameReplicationInfo.Winner = Winner; + + EndGameFocus = Controller(Winner.Owner).Pawn; + if ( EndGameFocus != None ) + EndGameFocus.bAlwaysRelevant = true; + for ( P=Level.ControllerList; P!=None; P=NextController ) + { + NextController = P.NextController; + Player = PlayerController(P); + if ( Player != None ) + { + //if ( !Player.PlayerReplicationInfo.bOnlySpectator ) + // PlayWinMessage(Player, (Player.PlayerReplicationInfo == Winner)); + Player.ClientSetBehindView(true); + if ( EndGameFocus != None ) + { + Player.ClientSetViewTarget(EndGameFocus); + Player.SetViewTarget(EndGameFocus); + } + Player.ClientGameEnded(); + } + P.GameHasEnded(); + } + return true; +} + +// Function used for debugging levelling up +function ForceLevelUp(Controller Killer) +{ + local class WeaponClass; + + WeaponClass = class(BaseMutator.GetInventoryClass(WeaponList[KFGGPRI(Killer.PlayerReplicationInfo).WeaponLevel + 1])); + + if( KFGGPRI(Killer.PlayerReplicationInfo).WeaponLevel < (WeaponList.Length - 1) ) + { + if( KFGGHumanPawn(Killer.Pawn) != none ) + { + KFGGHumanPawn(Killer.Pawn).ClearOutCurrentWeapons(); + } + + KFGGPRI(Killer.PlayerReplicationInfo).WeaponLevel++; + Killer.PlayerReplicationInfo.Score += 1; + + if( KFGGHumanPawn(Killer.Pawn) != none ) + { + KFGGHumanPawn(Killer.Pawn).CreateInventory(WeaponList[KFGGPRI(Killer.PlayerReplicationInfo).WeaponLevel]); + Killer.SwitchToBestWeapon(); + } + + if( PlayerController(Killer) != none ) + { + PlayerController(Killer).ClientPlaySound(Sound'KF_PlayerGlobalSnd.Zedtime_Exit',true,2.f,SLOT_None); + } + + if( KFGGPRI(Killer.PlayerReplicationInfo).WeaponLevel == int(WeaponList.Length * 0.25) ) + { + BroadcastLocalizedMessage(class'GGAnnouncementMessage', 0,Killer.PlayerReplicationInfo,,WeaponClass); + } + else if( KFGGPRI(Killer.PlayerReplicationInfo).WeaponLevel == int(WeaponList.Length * 0.5) ) + { + BroadcastLocalizedMessage(class'GGAnnouncementMessage', 0,Killer.PlayerReplicationInfo,,WeaponClass); + } + else if( KFGGPRI(Killer.PlayerReplicationInfo).WeaponLevel == int(WeaponList.Length * 0.75) ) + { + BroadcastLocalizedMessage(class'GGAnnouncementMessage', 0,Killer.PlayerReplicationInfo,,WeaponClass); + } + else if( KFGGPRI(Killer.PlayerReplicationInfo).WeaponLevel == (WeaponList.Length - 1) ) + { + BroadcastLocalizedMessage(class'GGAnnouncementMessage', 1,Killer.PlayerReplicationInfo,,WeaponClass); + } + } + else if( KFGGPRI(Killer.PlayerReplicationInfo).WeaponLevel < WeaponList.Length ) + { + KFGGPRI(Killer.PlayerReplicationInfo).WeaponLevel++; + Killer.PlayerReplicationInfo.Score += 1; + } +} + +function Killed(Controller Killer, Controller Killed, Pawn KilledPawn, class damageType) +{ + local bool bKilledWithRightWeapon; + local bool bKnifeKill; + local Controller C; + local string S; + local class WeaponClass; + + Super(DeathMatch).Killed(Killer,Killed,KilledPawn,DamageType); + + if( KFGGPRI(Killer.PlayerReplicationInfo) != none && + Killer.PlayerReplicationInfo.Team.TeamIndex != Killed.PlayerReplicationInfo.Team.TeamIndex ) + { + if( class(damageType) != none && KFGGPRI(Killer.PlayerReplicationInfo).WeaponLevel < (WeaponList.Length - 1) + && KFGGPRI(Killed.PlayerReplicationInfo).WeaponLevel > 0 ) + { + bKnifeKill = true; + bKilledWithRightWeapon = true; + } + + if( !bKnifeKill ) + { + // Check to make sure they got a kill with the right weapon + if( class(damageType).default.WeaponClass == BaseMutator.GetInventoryClass(WeaponList[KFGGPRI(Killer.PlayerReplicationInfo).WeaponLevel]) ) + { + bKilledWithRightWeapon = true; + } + // Special handling for weapons that don't apparantly have the weapon class plugged into the damage type + // TODO: fix up the base damage classes to have thier weapon class plugged + // in!!! - Ramm + else if( WeaponList[KFGGPRI(Killer.PlayerReplicationInfo).WeaponLevel] == "KFMod.Single" && + class(damageType) != none ) + { + bKilledWithRightWeapon = true; + } + else if( WeaponList[KFGGPRI(Killer.PlayerReplicationInfo).WeaponLevel] == "KFMod.BoomStick" && + class(damageType) != none ) + { + bKilledWithRightWeapon = true; + } + else if( WeaponList[KFGGPRI(Killer.PlayerReplicationInfo).WeaponLevel] == "KFMod.Crossbow" && + class(damageType) != none || class(damageType) != none ) + { + bKilledWithRightWeapon = true; + } + else if( WeaponList[KFGGPRI(Killer.PlayerReplicationInfo).WeaponLevel] == "KFMod.FlameThrower" && + class(damageType) != none ) + { + bKilledWithRightWeapon = true; + } + else if( WeaponList[KFGGPRI(Killer.PlayerReplicationInfo).WeaponLevel] == "KFGunGame.GG_M79GrenadeLauncher" && + class(damageType) != none ) + { + bKilledWithRightWeapon = true; + } + else if( WeaponList[KFGGPRI(Killer.PlayerReplicationInfo).WeaponLevel] == "KFGunGame.GG_M4203AssaultRifle" && + class(damageType) != none || class(damageType) != none ) + { + bKilledWithRightWeapon = true; + } + else if( WeaponList[KFGGPRI(Killer.PlayerReplicationInfo).WeaponLevel] == "KFGunGame.GG_M32GrenadeLauncher" && + class(damageType) != none ) + { + bKilledWithRightWeapon = true; + } + else if( WeaponList[KFGGPRI(Killer.PlayerReplicationInfo).WeaponLevel] == "KFGunGame.GG_HuskGun" && + class(damageType) != none || class(damageType) != none + || class(damageType) != none ) + { + bKilledWithRightWeapon = true; + } + else if( WeaponList[KFGGPRI(Killer.PlayerReplicationInfo).WeaponLevel] == "KFGunGame.GG_LAW" && + class(damageType) != none ) + { + bKilledWithRightWeapon = true; + } + } + + if( bKilledWithRightWeapon ) + { + if( KFGGPRI(Killer.PlayerReplicationInfo).WeaponLevel < (WeaponList.Length - 1) ) + { + if( KFGGHumanPawn(Killer.Pawn) != none ) + { + KFGGHumanPawn(Killer.Pawn).ClearOutCurrentWeapons(); + } + + KFGGPRI(Killer.PlayerReplicationInfo).WeaponLevel++; + Killer.PlayerReplicationInfo.Score += 1; + + if( KFGGHumanPawn(Killer.Pawn) != none ) + { + KFGGHumanPawn(Killer.Pawn).CreateInventory(WeaponList[KFGGPRI(Killer.PlayerReplicationInfo).WeaponLevel]); + Killer.SwitchToBestWeapon(); + } + + if( PlayerController(Killer) != none ) + { + PlayerController(Killer).ClientPlaySound(Sound'KF_PlayerGlobalSnd.Zedtime_Exit',true,2.f,SLOT_None); + } + + if( bKnifeKill && KFGGPRI(Killed.PlayerReplicationInfo).WeaponLevel > 0 ) + { +// if( Killer.Pawn != none ) +// { +// Killer.Pawn.PlayOwnedSound(Sound'KF_MaleVoiceOne.Insult_Specimens_9', SLOT_Talk,2.0,true,500); +// PlayerController(Killer).ClientPlaySound(Sound'KF_MaleVoiceOne.Insult_Specimens_9',true,2.f,SLOT_Talk); +// } + + BroadcastLocalizedMessage(class'GGAnnouncementMessage', 2,Killer.PlayerReplicationInfo,Killed.PlayerReplicationInfo); + + if( KFGGHumanPawn(Killed.Pawn) != none ) + { + KFGGHumanPawn(Killed.Pawn).ClearOutCurrentWeapons(); + } + + KFGGPRI(Killed.PlayerReplicationInfo).WeaponLevel--; + Killed.PlayerReplicationInfo.Score -= 1; + + if( KFGGHumanPawn(Killed.Pawn) != none ) + { + KFGGHumanPawn(Killed.Pawn).CreateInventory(WeaponList[KFGGPRI(Killed.PlayerReplicationInfo).WeaponLevel]); + Killed.SwitchToBestWeapon(); + } + PlayerController(Killed).ClientPlaySound(Sound'KF_PlayerGlobalSnd.Zedtime_Enter',true,2.f,SLOT_None); + } + + if( KFGGPRI(Killer.PlayerReplicationInfo).WeaponLevel == int(WeaponList.Length * 0.25) ) + { + WeaponClass = class(BaseMutator.GetInventoryClass(WeaponList[KFGGPRI(Killer.PlayerReplicationInfo).WeaponLevel + 1])); + BroadcastLocalizedMessage(class'GGAnnouncementMessage', 0,Killer.PlayerReplicationInfo,Killed.PlayerReplicationInfo,WeaponClass); + } + else if( KFGGPRI(Killer.PlayerReplicationInfo).WeaponLevel == int(WeaponList.Length * 0.5) ) + { + WeaponClass = class(BaseMutator.GetInventoryClass(WeaponList[KFGGPRI(Killer.PlayerReplicationInfo).WeaponLevel + 1])); + BroadcastLocalizedMessage(class'GGAnnouncementMessage', 0,Killer.PlayerReplicationInfo,Killed.PlayerReplicationInfo,WeaponClass); + } + else if( KFGGPRI(Killer.PlayerReplicationInfo).WeaponLevel == int(WeaponList.Length * 0.75) ) + { + WeaponClass = class(BaseMutator.GetInventoryClass(WeaponList[KFGGPRI(Killer.PlayerReplicationInfo).WeaponLevel + 1])); + BroadcastLocalizedMessage(class'GGAnnouncementMessage', 0,Killer.PlayerReplicationInfo,Killed.PlayerReplicationInfo,WeaponClass); + } + else if( KFGGPRI(Killer.PlayerReplicationInfo).WeaponLevel == (WeaponList.Length - 1) ) + { + WeaponClass = class(BaseMutator.GetInventoryClass(WeaponList[KFGGPRI(Killer.PlayerReplicationInfo).WeaponLevel + 1])); + BroadcastLocalizedMessage(class'GGAnnouncementMessage', 1,Killer.PlayerReplicationInfo,Killed.PlayerReplicationInfo,WeaponClass); + } + } + else if( KFGGPRI(Killer.PlayerReplicationInfo).WeaponLevel < WeaponList.Length ) + { + KFGGPRI(Killer.PlayerReplicationInfo).WeaponLevel++; + Killer.PlayerReplicationInfo.Score += 1; + } + } + + if( !bDoingWarmup && KFGGPRI(Killer.PlayerReplicationInfo).WeaponLevel >= WeaponList.Length ) + { + MusicPlaying = True; + CalmMusicPlaying = False; + + // Give the guy that won 100% health so we won't get any weird dying hud effects or sounds + if( Killer.Pawn != none ) + { + Killer.Pawn.GiveHealth(100,Killer.Pawn.HealthMax); + } + + if( FRand() < 0.5 ) + { + S = "DirgeDisunion1"; + } + else + { + S = "KF_Containment"; + } + + for( C=Level.ControllerList;C!=None;C=C.NextController ) + { + if (KFPlayerController(C)!= none) + KFPlayerController(C).NetPlayMusic(S, 0.25,1.0); + } + + EndGame(Killer.PlayerReplicationInfo,"fraglimit"); + } + } +} + +function AmmoPickedUp(KFAmmoPickup PickedUp) +{ + PickedUp.Destroy(); // Kill all ammo pickups. +} + +//event PlayerController Login +//( +// string Portal, +// string Options, +// out string Error +//) +//{ +// local PlayerController NewPlayer; +// +// NewPlayer = Super.Login(Portal, Options, Error); +// +// if( NewPlayer.PlayerReplicationInfo.Team.TeamIndex == 0 ) +// { +// NewPlayer.SetPawnClass(DefaultPlayerClassName, "Sergeant_Powers"); +// } +// else if( NewPlayer.PlayerReplicationInfo.Team.TeamIndex == 1 ) +// { +// NewPlayer.SetPawnClass(DefaultPlayerClassName, "Police_Constable_Briar"); +// } +// +//// // Green +//// Corporal_Lewis +//// Lieutenant_Masterson +//// Sergeant_Powers +//// +//// // Blue +//// Police_Constable_Briar +//// Police_Sergeant_Davin +// +// return NewPlayer; +//} + +function int ReduceDamage( int Damage, pawn injured, pawn instigatedBy, vector HitLocation, out vector Momentum, class DamageType ) +{ + +// WeaponList(0)="KFMod.Single" +// WeaponList(1)="KFMod.Dualies" +// WeaponList(2)="KFMod.Magnum44Pistol" +// WeaponList(3)="KFMod.Dual44Magnum" +// WeaponList(4)="KFMod.Winchester" +// WeaponList(5)="KFMod.MAC10MP" +// WeaponList(6)="KFMod.MP7MMedicGun" +// WeaponList(7)="KFMod.MP5MMedicGun" +// WeaponList(8)="KFMod.Bullpup" +// WeaponList(9)="KFMod.Crossbow" +// WeaponList(10)="KFMod.Shotgun" +// WeaponList(11)="KFMod.FlameThrower" +// WeaponList(12)="KFMod.Deagle" +// WeaponList(13)="KFMod.M4AssaultRifle" +// WeaponList(14)="KFMod.AK47AssaultRifle" +// WeaponList(15)="KFMod.BoomStick" +// WeaponList(16)="KFMod.M14EBRBattleRifle" +// WeaponList(17)="KFMod.DualDeagle" +// WeaponList(18)="KFMod.BenelliShotgun" +// WeaponList(19)="KFGunGame.GG_M79GrenadeLauncher" +// WeaponList(20)="KFMod.SCARMK17AssaultRifle" +// WeaponList(21)="KFGunGame.GG_M4203AssaultRifle" +// WeaponList(22)="KFGunGame.GG_M32GrenadeLauncher" +// WeaponList(23)="KFGunGame.GG_HuskGun" +// WeaponList(24)="KFMod.AA12AutoShotgun" +// WeaponList(25)="KFGunGame.GG_LAW" +// WeaponList(26)="KFMod.Katana" + + // Adjust damage for gungame, as KF weapons were all balanced for shooting zombies not players! :) + if( class(damageType) != none || class(damageType) != none + || class(damageType) != none) + { + Damage *= 0.5; + } + else if( class(damageType) != none || class(damageType) != none ) + { + Damage *= 0.5; + } + else if( class(damageType) != none ) + { + Damage *= 0.75; + } + else if( class(damageType) != none ) + { + Damage *= 0.65; + } + else if( class(damageType) != none ) + { + Damage *= 0.65; + } + else if( class(damageType) != none ) + { + Damage *= 0.65; + } + else if( class(damageType) != none ) + { + Damage *= 1.0; + } + else if( class(damageType) != none || class(damageType) != none + || class(damageType) != none || class(damageType) != none) + { + Damage *= 0.65; + } + else if( class(damageType) != none || class(damageType) != none ) + { + Damage *= 0.41;// 1 Hit kill if all pellets hit you + } + else if( class(damageType) != none ) + { + Damage *= 2.0; + } + else if( class(damageType) != none || class(damageType) != none ) + { + Damage *= 0.5; + } + else if( class(damageType) != none || class(damageType) != none ) + { + Damage *= 0.75; + } + else if( class(damageType) != none ) + { + Damage *= 0.75; + } + else if( class(damageType) != none ) + { + Damage *= 0.3; + } + else if( class(damageType) != none || class(damageType) != none ) + { + Damage *= 0.75; + } + else if( class(damageType) != none || class(damageType) != none ) + { + Damage *= 0.65; + } + else if( class(damageType) != none ) + { + Damage *= 0.35; + } + else if( class(damageType) != none ) + { + Damage *= 0.35; + } + else if( class(damageType) != none || class(damageType) != none) + { + Damage *= 0.4; + } + else if( class(damageType) != none ) + { + Damage *= 0.3; + } + else if( class(damageType) != none ) + { + Damage *= 0.15; + } + else if( class(damageType) != none ) + { + Damage *= 0.8; + } + else if( class(damageType) != none ) + { + Damage *= 0.25; + } + else if( class(damageType) != none ) + { + Damage *= 1.0; + } + else if( class(damageType) != none ) + { + Damage *= 0.3; + } + else if( class(damageType) != none ) + { + Damage *= 3.0; + } + + return Super.ReduceDamage( Damage,injured,instigatedBy,HitLocation,Momentum,DamageType ); +} + +function ScoreKill(Controller Killer, Controller Other) +{ + if ( GameRulesModifiers != None ) + GameRulesModifiers.ScoreKill(Killer, Other); + + if( (killer == Other) || (killer == None) ) + { + return; + } + + if ( Killer.PlayerReplicationInfo==None ) + return; + + Killer.PlayerReplicationInfo.Kills++; + Killer.PlayerReplicationInfo.NetUpdateTime = Level.TimeSeconds - 1; + ScoreEvent(Killer.PlayerReplicationInfo, 1, "frag"); +} + +function AddGameSpecificInventory(Pawn p) +{ + p.CreateInventory(WeaponList[KFGGPRI(p.PlayerReplicationInfo).WeaponLevel]); + p.Controller.SwitchToBestWeapon(); +} + +final function UpdateViewsNow() +{ + local Controller C; + + for( C=Level.ControllerList; C!=None; C=C.nextController ) + { + if( C.PlayerReplicationInfo!=None && !C.PlayerReplicationInfo.bOnlySpectator && PlayerController(C)!=None && C.Pawn!=None ) + { + PlayerController(C).ClientSetBehindView(false); + PlayerController(C).ClientSetViewTarget(C.Pawn); + //PlayerController(C).ReceiveLocalizedMessage(Class'KFMainMessages',3); + } +// else if( KFInvasionBot(C)!=None && C.Pawn!=None && FRand()<0.5f ) +// KFInvasionBot(C).DoTrading(); + } +} + +function CheckScore(PlayerReplicationInfo Scorer); + +function RestartPlayer( Controller aPlayer ) +{ + if ( aPlayer.PlayerReplicationInfo.bOutOfLives || aPlayer.Pawn!=None ) + return; + if( aPlayer.PlayerReplicationInfo.Team.TeamIndex==0 ) + aPlayer.PawnClass = Class'KFRedGGPlayer'; + else aPlayer.PawnClass = Class'KFBlueGGPlayer'; + aPlayer.PreviousPawnClass = aPlayer.PawnClass; + KFPlayerReplicationInfo(aPlayer.PlayerReplicationInfo).ClientVeteranSkill = Class'KFVeterancyTypes'; + aPlayer.PlayerReplicationInfo.Score = Max(MinRespawnCash, int(aPlayer.PlayerReplicationInfo.Score)); + Super(Invasion).RestartPlayer(aPlayer); +} + +function Timer() +{ + Super(xTeamGame).Timer(); +} + +auto State PendingMatch +{ + function RestartPlayer( Controller aPlayer ) + { + if ( CountDown <= 0 ) + Super.RestartPlayer(aPlayer); + } + + function Timer() + { + local Controller P; + local bool bReady; + + Global.Timer(); + + // first check if there are enough net players, and enough time has elapsed to give people + // a chance to join + if ( NumPlayers == 0 ) + bWaitForNetPlayers = true; + + if ( bWaitForNetPlayers && (Level.NetMode != NM_Standalone) ) + { + if ( NumPlayers >= MinNetPlayers ) + ElapsedTime++; + else + ElapsedTime = 0; + if ( (NumPlayers == MaxPlayers) || (ElapsedTime > NetWait) ) + { + bWaitForNetPlayers = false; + CountDown = Default.CountDown; + } + } + + if ( (Level.NetMode != NM_Standalone) && (bWaitForNetPlayers || (bTournament && (NumPlayers < MaxPlayers))) ) + { + PlayStartupMessage(); + return; + } + + // check if players are ready + bReady = true; + StartupStage = 1; + if ( !bStartedCountDown && (bTournament /*|| bPlayersMustBeReady*/ || (Level.NetMode == NM_Standalone)) ) + { + for (P=Level.ControllerList; P!=None; P=P.NextController ) + if ( P.IsA('PlayerController') && (P.PlayerReplicationInfo != None) + && P.bIsPlayer && P.PlayerReplicationInfo.bWaitingPlayer + && !P.PlayerReplicationInfo.bReadyToPlay ) + bReady = false; + } + if ( bReady && !bReviewingJumpspots ) + { + bStartedCountDown = true; + CountDown--; + if ( CountDown <= 0 ) + StartMatch(); + else + StartupStage = 5 - CountDown; + } + if( !bDidWarmup && WarmupTime > 0 ) + { + PlayWarmupMessage(); + } + else + { + PlayStartupMessage(); + } + } + + function beginstate() + { + bWaitingToStartMatch = true; + StartupStage = 0; + WarmupCountDown=WarmupTime; +// if ( IsA('xLastManStandingGame') ) +// NetWait = Max(NetWait,10); + } + +// function EndState() +// { +// KFGameReplicationInfo(GameReplicationInfo).LobbyTimeout = -1; +// } + +Begin: + if ( bQuickStart ) + StartMatch(); +} + +function PlayStartupMessage() +{ + local Controller P; + + // keep message displayed for waiting players + for (P=Level.ControllerList; P!=None; P=P.NextController ) + if ( UnrealPlayer(P) != None ) + UnrealPlayer(P).PlayStartUpMessage(StartupStage); +} + +function PlayWarmupMessage() +{ + local Controller P; + + // keep message displayed for waiting players + for (P=Level.ControllerList; P!=None; P=P.NextController ) + if ( KFGGPlayerController(P) != None ) + KFGGPlayerController(P).PlayWarmupMessage(StartupStage); +} + + +state MatchInProgress +{ + function OpenShops(); + function CloseShops(); + + function Timer() + { + local Controller C; + + Global.Timer(); + + for( C=Level.ControllerList; C!=None; C=C.nextController ) + if( C.PlayerReplicationInfo!=None && !C.PlayerReplicationInfo.bOnlySpectator && C.Pawn == none/*C.PlayerReplicationInfo.bReadyToPlay + && C.IsA('PlayerController') && C.IsInState('PlayerWaiting')*/ ) + RestartPlayer(C); + + if ( !bFinalStartup ) + { + bFinalStartup = true; + UpdateViewsNow(); + } + + if ( NeedPlayers() && AddBot() && (RemainingBots > 0) ) + RemainingBots--; + ElapsedTime++; + GameReplicationInfo.ElapsedTime = ElapsedTime; + + if( !bDidWarmup && WarmupTime > 0 ) + { + WarmupCountDown--; + + if( WarmupCountDown <= (Default.CountDown - 1) && WarmupCountDown > 0 ) + { + StartupStage = 5 - WarmupCountDown; + + PlayStartupMessage(); + } + + if( WarmupCountDown <= 0 ) + { + ResetBeforeMatchStart(); + bDidWarmup = true; + bDoingWarmup = false; + StartMatch(); + + for( C=Level.ControllerList; C!=None; C=C.nextController ) + if( C.PlayerReplicationInfo!=None && !C.PlayerReplicationInfo.bOnlySpectator && C.Pawn == none/*C.PlayerReplicationInfo.bReadyToPlay + && C.IsA('PlayerController') && C.IsInState('PlayerWaiting')*/ ) + { + RestartPlayer(C); + } + + StartupStage = 5; + PlayStartupMessage(); + StartupStage = 6; + + } + else + { + bDoingWarmup = true; + } + + } + else + { + bDidWarmup = true; + } + + if ( bOverTime ) + EndGame(None,"TimeLimit"); + else if ( TimeLimit > 0 ) + { + GameReplicationInfo.bStopCountDown = false; + RemainingTime--; + GameReplicationInfo.RemainingTime = RemainingTime; + if ( RemainingTime % 60 == 0 ) + GameReplicationInfo.RemainingMinute = RemainingTime; + if( RemainingTime==600 || RemainingTime==300 || RemainingTime==180 || RemainingTime==120 || RemainingTime==60 + || RemainingTime==30 || RemainingTime==20 || (RemainingTime<=10 && RemainingTime>=1) ) + BroadcastLocalizedMessage(class'KFGGTimeMessage', RemainingTime); + if ( RemainingTime <= 0 ) + EndGame(None,"TimeLimit"); + } + } + + function beginstate() + { + local PlayerReplicationInfo PRI; + + ForEach DynamicActors(class'PlayerReplicationInfo',PRI) + PRI.StartTime = 0; + ElapsedTime = 0; + bWaitingToStartMatch = false; + StartupStage = 5; + if( !bDidWarmup && WarmupTime > 0 ) + { + PlayWarmupMessage(); + } + else + { + PlayStartupMessage(); + } + StartupStage = 6; + } +} + +function ResetBeforeMatchStart() +{ + local Controller P, NextC; + local Actor A; + + // Reset all controllers + P = Level.ControllerList; + while ( P != none ) + { + NextC = P.NextController; + + if( AIController(P) != none) + { + bKillBots = true; + P.Destroy(); + bKillBots = false; + P = NextC; + continue; + } + + if( P.Pawn!=None && P.PlayerReplicationInfo!=None ) + P.Pawn.Destroy(); + + if ( P.PlayerReplicationInfo == None || !P.PlayerReplicationInfo.bOnlySpectator ) + { + if ( PlayerController(P) != None ) + PlayerController(P).ClientReset(); + P.Reset(); + + if( P.PlayerReplicationInfo != none ) + { + P.PlayerReplicationInfo.Score = 0; + P.PlayerReplicationInfo.Deaths = 0; + P.PlayerReplicationInfo.GoalsScored = 0; + P.PlayerReplicationInfo.Kills = 0; + if( TeamPlayerReplicationInfo(P.PlayerReplicationInfo) != none ) + { + TeamPlayerReplicationInfo(P.PlayerReplicationInfo).bFirstBlood = false; + } + + if( KFGGPRI(P.PlayerReplicationInfo) != none ) + { + KFGGPRI(P.PlayerReplicationInfo).WeaponLevel = 0; + } + } + } + + P = NextC; + } + + // Reset ALL actors (except Controllers) + foreach AllActors(class'Actor', A) + { + if (!A.IsA('Controller')) + A.Reset(); + + // Destroy any active projectiles + if (A.IsA('Projectile')) + A.Destroy(); + } + + for( P=Level.ControllerList; P!=None; P=NextC ) + { + NextC = P.nextController; + if( P.PlayerReplicationInfo!=None && !P.PlayerReplicationInfo.bOnlySpectator && P.PlayerReplicationInfo.Team!=None ) + { + P.PlayerReplicationInfo.bOutOfLives = false; + RestartPlayer(P); + } + } + + log("End RemainingBots = "$RemainingBots); + + bFinalStartup = false; +} + +//final function StartNewRound() +//{ +// local Controller C,NC; +// local array CA; +// local int i; +// local Projectile P; +// +// if( GoalScore>0 ) // Check winners +// { +// if( Teams[0].Score>=GoalScore ) +// { +// EndGame(None,"fraglimit"); +// return; +// } +// else if( Teams[1].Score>=GoalScore ) +// { +// EndGame(None,"fraglimit"); +// return; +// } +// } +// +// // First kill all pawns. +// for( C=Level.ControllerList; C!=None; C=NC ) +// { +// NC = C.nextController; +// if( C.Pawn!=None && C.PlayerReplicationInfo!=None ) +// C.Pawn.Destroy(); +// } +// +// // Then even the teams. +// if( Teams[0].Size>(Teams[1].Size+1) ) // To many Reds. +// { +// for( C=Level.ControllerList; C!=None; C=C.nextController ) +// { +// if( C.PlayerReplicationInfo!=None && !C.PlayerReplicationInfo.bOnlySpectator && C.PlayerReplicationInfo.Team!=None +// && C.PlayerReplicationInfo.Team.TeamIndex==0 ) +// CA[CA.Length] = C; +// } +// while( Teams[0].Size>(Teams[1].Size+1) && CA.Length>0 ) +// { +// i = Rand(CA.Length); +// ChangeTeam(CA[i],1,true); +// CA.Remove(i,1); +// } +// } +// else if( Teams[1].Size>(Teams[0].Size+1) ) // To many Blues. +// { +// for( C=Level.ControllerList; C!=None; C=C.nextController ) +// { +// if( C.PlayerReplicationInfo!=None && !C.PlayerReplicationInfo.bOnlySpectator && C.PlayerReplicationInfo.Team!=None +// && C.PlayerReplicationInfo.Team.TeamIndex==1 ) +// CA[CA.Length] = C; +// } +// while( Teams[1].Size>(Teams[0].Size+1) && CA.Length>0 ) +// { +// i = Rand(CA.Length); +// ChangeTeam(CA[i],0,true); +// CA.Remove(i,1); +// } +// } +// +// // Kill any active projectiles +// foreach DynamicActors(Class'Projectile',P) +// P.Destroy(); +// +// // Init new spawns and respawn players. +// PickSpawnPoints(); +// for( C=Level.ControllerList; C!=None; C=NC ) +// { +// NC = C.nextController; +// if( C.PlayerReplicationInfo!=None && !C.PlayerReplicationInfo.bOnlySpectator && C.PlayerReplicationInfo.Team!=None ) +// { +// C.PlayerReplicationInfo.bOutOfLives = false; +// RestartPlayer(C); +// } +// } +// bFinalStartup = false; +//} + +state MatchOver +{ + function Timer() + { + local Controller C; + + Global.Timer(); + + if ( !bGameRestarted && (Level.TimeSeconds > EndTime + RestartWait) ) + RestartGame(); + + if ( EndGameFocus != None ) + { + EndGameFocus.bAlwaysRelevant = true; + for ( C = Level.ControllerList; C != None; C = C.NextController ) + if ( PlayerController(C) != None ) + PlayerController(C).ClientSetViewtarget(EndGameFocus); + } + + // play end-of-match message for winner/losers (for single and muli-player) + EndMessageCounter++; + if ( EndMessageCounter == EndMessageWait ) + PlayEndOfMatchMessage(); + } + function BeginState() + { + GameReplicationInfo.bStopCountDown = true; + KFGameReplicationInfo(GameReplicationInfo).EndGameType = 2; + } +} + +defaultproperties +{ + WarmUpTime=30 + StandardWeaponList(0)="KFMod.Single" + StandardWeaponList(1)="KFMod.MK23Pistol" + StandardWeaponList(2)="KFMod.Dualies" + StandardWeaponList(3)="KFMod.DualMK23Pistol" + StandardWeaponList(4)="KFMod.Magnum44Pistol" + StandardWeaponList(5)="KFMod.Dual44Magnum" + StandardWeaponList(6)="KFMod.Winchester" + StandardWeaponList(7)="KFMod.MAC10MP" + StandardWeaponList(8)="KFMod.MP7MMedicGun" + StandardWeaponList(9)="KFMod.MP5MMedicGun" + StandardWeaponList(10)="KFMod.Bullpup" + StandardWeaponList(11)="KFMod.Crossbow" + StandardWeaponList(12)="KFMod.Shotgun" + StandardWeaponList(13)="KFMod.M7A3MMedicGun" + StandardWeaponList(14)="KFMod.FlameThrower" + StandardWeaponList(15)="KFMod.Deagle" + StandardWeaponList(16)="KFMod.M4AssaultRifle" + StandardWeaponList(17)="KFMod.KSGShotgun" + StandardWeaponList(18)="KFMod.AK47AssaultRifle" + StandardWeaponList(19)="KFMod.BoomStick" + StandardWeaponList(20)="KFMod.M14EBRBattleRifle" + StandardWeaponList(21)="KFMod.DualDeagle" + StandardWeaponList(22)="KFMod.BenelliShotgun" + StandardWeaponList(23)="KFGunGame.GG_M79GrenadeLauncher" + StandardWeaponList(24)="KFMod.SCARMK17AssaultRifle" + StandardWeaponList(25)="KFMod.FNFAL_ACOG_AssaultRifle" + StandardWeaponList(26)="KFGunGame.GG_M4203AssaultRifle" + StandardWeaponList(27)="KFGunGame.GG_M32GrenadeLauncher" + StandardWeaponList(28)="KFMod.M99SniperRifle" + StandardWeaponList(29)="KFGunGame.GG_HuskGun" + StandardWeaponList(30)="KFMod.AA12AutoShotgun" + StandardWeaponList(31)="KFGunGame.GG_LAW" + StandardWeaponList(32)="KFMod.Katana" + ShortWeaponList(0)="KFMod.Single" + ShortWeaponList(1)="KFMod.MK23Pistol" + ShortWeaponList(2)="KFMod.Dual44Magnum" + ShortWeaponList(3)="KFMod.Winchester" + ShortWeaponList(4)="KFMod.MP5MMedicGun" + ShortWeaponList(5)="KFMod.Bullpup" + ShortWeaponList(6)="KFMod.Crossbow" + ShortWeaponList(7)="KFMod.M7A3MMedicGun" + ShortWeaponList(8)="KFMod.FlameThrower" + ShortWeaponList(9)="KFMod.M4AssaultRifle" + ShortWeaponList(10)="KFMod.AK47AssaultRifle" + ShortWeaponList(11)="KFMod.BoomStick" + ShortWeaponList(12)="KFMod.M14EBRBattleRifle" + ShortWeaponList(13)="KFMod.DualDeagle" + ShortWeaponList(14)="KFMod.BenelliShotgun" + ShortWeaponList(15)="KFGunGame.GG_M79GrenadeLauncher" + ShortWeaponList(16)="KFMod.FNFAL_ACOG_AssaultRifle" + ShortWeaponList(17)="KFGunGame.GG_M32GrenadeLauncher" + ShortWeaponList(18)="KFMod.M99SniperRifle" + ShortWeaponList(19)="KFMod.AA12AutoShotgun" + ShortWeaponList(20)="KFGunGame.GG_LAW" + ShortWeaponList(21)="KFMod.Katana" + WarmupDescription="Warmup Time" + ReverseDescription="Reverse Weapon List" + ShortListDescription="Shorter Weapon List" + bNoBots=False + bSpawnInTeamArea=True + TeamAIType(0)=Class'KFGunGame.GGTeamAI' + TeamAIType(1)=Class'KFGunGame.GGTeamAI' + RestartWait=30 + SpawnProtectionTime=2.000000 + DefaultMaxLives=0 + DefaultEnemyRosterClass="XGame.xTeamRoster" + LoginMenuClass="KFGunGame.KFGGMidGameMenu" + DefaultPlayerClassName="KFGunGame.KFGGHumanPawn" + ScoreBoardType="KFGunGame.KFGGScoreBoard" + HUDType="KFGunGame.GGHUDKillingFloor" + MapListType="KFGunGame.GGMapList" + MapPrefix="GG" + BeaconName="GG" + MaxLives=0 + TimeLimit=15 + MutatorClass="KFGunGame.KFGGBaseMut" + PlayerControllerClass=Class'KFGunGame.KFGGPlayerController' + PlayerControllerClassName="KFGunGame.KFGGPlayerController" + GameReplicationInfoClass=Class'KFGunGame.KFGGGameReplicationInfo' + GameName="KF Gun Game" + Description="Gun Game With Killing Floor Weapons. Every kill instantly gets you the next weapon in the list. Be the first player to get a kill with every weapon on the list to win!" + Acronym="GG" +} diff --git a/Classes/KFGGBaseMut.uc b/Classes/KFGGBaseMut.uc new file mode 100644 index 0000000..81c08b1 --- /dev/null +++ b/Classes/KFGGBaseMut.uc @@ -0,0 +1,15 @@ +// Written by Marco +class KFGGBaseMut extends KillingFloorMut + HideDropDown + CacheExempt; + +function bool CheckReplacement(Actor Other, out byte bSuperRelevant) +{ + if( Controller(Other)!=None ) + Controller(Other).PlayerReplicationInfoClass = Class'KFGGPRI'; + return true; +} + +defaultproperties +{ +} diff --git a/Classes/KFGGBot.uc b/Classes/KFGGBot.uc new file mode 100644 index 0000000..b1cb9dc --- /dev/null +++ b/Classes/KFGGBot.uc @@ -0,0 +1,338 @@ +class KFGGBot extends KFInvasionBot; + +function float AdjustAimError(float aimerror, float TargetDist, bool bDefendMelee, bool bInstantProj, bool bLeadTargetNow ) +{ + return super(Bot).AdjustAimError(aimerror,TargetDist,bDefendMelee,bInstantProj,bLeadTargetNow)*25; +} + +function bool FindInjuredAlly() +{ + local controller c; + local KFHumanPawn aKFHPawn; + local float AllyDist; + local float BestDist; + + // Lets test them not healing anyone so they just keep fighting + return false; + + InjuredAlly = None; + + if( LastHealTime>Level.TimeSeconds || !Level.Game.bTeamGame || (Enemy!=None && VSizeSquared(Enemy.Location-Pawn.Location)<1000000.f && LineOfSightTo(Enemy)) ) + return false; + + if( FindMySyringe()==none || MySyringe.ChargeBar()<0.6f ) + return false; + + for(c=level.ControllerList; c!=none; c=c.nextController) + { + if( C==Self || C.PlayerReplicationInfo==None || C.PlayerReplicationInfo.Team!=PlayerReplicationInfo.Team ) + continue; + + aKFHPawn = KFHumanPawn(c.pawn); + + // If he's dead. dont bother. + if ( aKFHPawn==none || aKFHPawn.Health<=0 || aKFHPawn.Health>85 || !ActorReachable(aKFHPawn) ) + continue; + + AllyDist = VSizeSquared(Pawn.Location - AKFHPawn.Location); + + if( InjuredAlly==none || (AllyDist