class KFPlayerController extends KFPC; #exec OBJ LOAD FILE=KF_InterfaceSnd.uax //const MAX_BUYITEMS=50; const BUYLIST_CATS=7; const LIBLIST_CATS=3; //TODO: Kill these last remenants of the old buy system var string BuyListHeaders[BUYLIST_CATS]; var string LibraryListHeaders[LIBLIST_CATS]; var bool bChoseStarting, bClassChosen; var bool IsInLobby; var int CashThrowAmount; // Amount of cash a player throws per keypress. Set in the player settings menu var KFMusicInteraction KFInterAct; var string DelayedSongToPlay; var bool bHasDelayedSong; var KFSPNoteMessage ActiveNote; var bool bShopping; var array LightSources; var string LobbyMenuClassString; var bool bPendingLobbyDisplay; // Set when we want to show the Lobby menu and then cleared once we show it var bool bRequestedSteamData; // Used to track if we've requested Steam Stats and Achievements from Steam while bPendingLobbyDisplay is true var int ForceShowLobby; // Counter to know how long we've waitied for Steam Stats and Achievements to return while bPendingLobbyDisplay is true // Recoil var rotator RecoilRotator; // Stores recoil added to the free-aim buffer var float LastRecoilTime; // Last time we got recoil var float RecoilSpeed; // The amount of time it will take to process this recoil // Smooth FOV Management var() float TargetFOV; // The FOV that the Camera is trying to acheive var float TransitionStartFOV; // The FOV that was being used at the start of the FOV Transition var float TransitionTimeElapsed; // How long (in seconds) the camera has been transitioning to TargetFOV var float TransitionTimeTotal; // How long it should take to transition to the target FOV // Perks, Stats, and Achievements var config class SelectedVeterancy; // Current Desired Perk/Veterancy(during a wave, use KFPRI.ClientVeterancySkill as the Perk/Veterancy being used) var bool bVomittedOn; var float VomittedOnTime; var bool bScreamedAt; var float ScreamTime; var localized string YouAreNowPerkString; // You are now the selected Perk string var localized string YouWillBecomePerkString; // You will become the selected Perk at the end of this Wave string var localized string PerkChangeOncePerWaveString; // Only allowed to change Perk once per Wave string var localized string PerkFirstLevelUnlockedString; // First Perk has been unlocked string var localized string PerkUnlockedString; // New Perk has been unlocked string var localized string LevelString; // Localization string for "Level" var() float TraderPathInterval; // How ofter to draw the TraderPath when bShowTraderPath is true var bool bShowTraderPath; // Should show the trader path var config bool bWantsTraderPath; // Whether or not this player wants the trader paths at all // For hint management var KFHintManager HintManager; var config bool bShowHints; // ZED time message var config bool bHadZED; var KFSteamWebApi webAPIAccessor; // Voice Messages var bool bHasHeardTraderWelcomeMessage; var float LastClotGrabMessageTime; var float LastReloadMessageTime; var float ReloadMessageDelay; var float LastWeaponPulloutMessageTime; var float WeaponPulloutMessageDelay; //trader menu var bool bDoTraderUpdate; var config bool bUseTrueWideScreenFOV; // When set to true, the game will use True widescreen with a wider fov when in widescreen mode. Otherwise, will do the default UE2.5 thing of chopping off the top and bottom (which gives better performance) var bool bSpawnedThisWave; // Whether or not this player has already spawned this wave //Audio messages var config int AudioMessageLevel; //Temp Ammo needed for dualdeagle pickups var int PendingAmmo; // ZEDGun Support var vector EnemyLocation[16]; // Location of all enemies within 100 meter radius(5000 unreal units) var int RandXOffset; var int RandYOffset; var int BuyMenuFilterIndex; replication { reliable if(REMOTEROLE == ROLE_AUTONOMOUSPROXY) NetPlayMusic, NetStopMusic, ClientSwitchToBestMeleeWeapon, ShowLobbyMenu, DoTraderUpdate; reliable if( Role < ROLE_Authority ) KFSwitchToBestWeapon, ServerSetGRIPendingBots, ServerSetTempBotName, ServerSetWantsTraderPath, GRIKillBotCall, SelectVeterancy, /*ServerGiveAll, ServerHackSlomo,*/ ServerUnreadyPlayer; // Functions server can call. reliable if( Role == ROLE_Authority ) KFClientNetWorkMsg, ClientLocationalVoiceMessage, ClientEnterZedTime, ClientExitZedTime, ClientShakeView, ClientWeaponSpawned, ClientWeaponDestroyed, ClientForceCollectGarbage, EnemyLocation; } simulated event PreBeginPlay() { class'BullpupFire'.static.PreloadAssets(Level); class'DeagleFire'.static.PreloadAssets(Level); class'DualDeagleFire'.static.PreloadAssets(Level); class'GoldenDualDeagleFire'.static.PreloadAssets(Level); class'DualiesFire'.static.PreloadAssets(Level); class'ShotgunFire'.static.PreloadAssets(Level); class'SingleFire'.static.PreloadAssets(Level); class'WinchesterFire'.static.PreloadAssets(Level); super.PreBeginPlay(); } simulated event PostBeginPlay() { Super.PostBeginPlay(); // Spawn hint manager (if needed) UpdateHintManagement(bShowHints); } simulated function InitInputSystem() { InputClass = class'KFMod.KFPlayerInput'; Super.InitInputSystem(); InitFOV(); } function NotifyTakeHit(pawn InstigatedBy, vector HitLocation, int Damage, class damageType, vector Momentum) { local int iDam; local vector AttackLoc; super(Controller).NotifyTakeHit(InstigatedBy,HitLocation,Damage,DamageType,Momentum); // Don't need to do this if there wasn't actually any damage!!! - Ramm if( Damage <= 0 ) { return; } DamageShake(Damage); iDam = Clamp(Damage,0,250); if ( InstigatedBy != None ) AttackLoc = InstigatedBy.Location; NewClientPlayTakeHit(AttackLoc, hitLocation - Pawn.Location, iDam, damageType); } simulated function CheckZEDMessage() { if ( !bHadZED ) { ReceiveLocalizedMessage(class'KFMod.WaitingMessage', 5); bHadZED = true; SaveConfig(); } } // Called by the server when the game enters zed time. Used to play the effects simulated function ClientEnterZedTime() { CheckZEDMessage(); // if we have a weapon, play the zed time sound from it so it is higher priority and doesn't get cut off if( Pawn != none && Pawn.Weapon != none ) { Pawn.Weapon.PlaySound(Sound'KF_PlayerGlobalSnd.Zedtime_Enter', SLOT_Talk, 2.0,false,500.0,1.1/Level.TimeDilation,false); } else { PlaySound(Sound'KF_PlayerGlobalSnd.Zedtime_Enter', SLOT_Talk, 2.0,false,500.0,1.1/Level.TimeDilation,false); } } // Called by the server when the game exits zed time. Used to play the effects simulated function ClientExitZedTime() { // if we have a weapon, play the zed time sound from it so it is higher priority and doesn't get cut off if( Pawn != none && Pawn.Weapon != none ) { Pawn.Weapon.PlaySound(Sound'KF_PlayerGlobalSnd.Zedtime_Exit', SLOT_Talk, 2.0,false,500.0,1.1/Level.TimeDilation,false); } else { PlaySound(Sound'KF_PlayerGlobalSnd.Zedtime_Exit', SLOT_Talk, 2.0,false,500.0,1.1/Level.TimeDilation,false); } } simulated function DoTraderUpdate() { bDoTraderUpdate = true; } exec function ShowKickMenu() { if ( Level.NetMode != NM_StandAlone && VoteReplicationInfo != none && VoteReplicationInfo.KickVoteEnabled() ) { Player.GUIController.OpenMenu(Player.GUIController.GetPropertyText("KickVotingMenu")); } } exec function SpawnTargets() { local KFHumanPawn p; if( !class'ROEngine.ROLevelInfo'.static.RODebugMode() ) return; p = Spawn( class 'KFHumanPawn',,,Pawn.Location + 72 * Vector(Rotation) + vect(0,0,1) * 15 ); p.LoopAnim('Idle_Bullpup'); p.setphysics(PHYS_Falling); } simulated exec function PlayerCollisionDebug() { local KFBulletWhipAttachment WhipAttach; if( Level.NetMode != NM_StandAlone ) { if( !class'ROEngine.ROLevelInfo'.static.RODebugMode() ) return; } if( HudKillingFloor(myHUD).bDebugPlayerCollision ) { foreach DynamicActors(class'KFBulletWhipAttachment', WhipAttach) { WhipAttach.SetDrawType(DT_None); } HudKillingFloor(myHUD).bDebugPlayerCollision = false; } else { foreach DynamicActors(class'KFBulletWhipAttachment', WhipAttach) { WhipAttach.SetDrawType(DT_Sprite); } HudKillingFloor(myHUD).bDebugPlayerCollision = true; } } // These is an accessor for the KFPlayerInput class. It looks here to see what to set the mouse sensitivy to. // Used primarily for lowering the mouse sensitivity while sniping. Returning -1 will do no modification at all. // Ramm - 10/27/03 function float GetMouseModifier() { local KFWeapon weap; if (Pawn == none || Pawn.Weapon == none) return -1.0; weap = KFWeapon(Pawn.Weapon); if (weap== none ) return -1.0; if(weap.KFScopeDetail == KF_ModelScope && weap.ShouldDrawPortal()) { return 24; } else if(weap.KFScopeDetail == KF_ModelScopeHigh && weap.ShouldDrawPortal()) { return 24; } else { return -1.0; } } // Set up the widescreen FOV values for this player simulated final function InitFOV() { local Inventory inv; local KFWeapon KFWeap; local int i; local float ResX, ResY; local float AspectRatio; local float OriginalAspectRatio; local float NewFOV; ResX = float(GUIController(Player.GUIController).ResX); ResY = float(GUIController(Player.GUIController).ResY); AspectRatio = ResX / ResY; if ( bUseTrueWideScreenFOV && AspectRatio >= 1.60 ) //1.6 = 16/10 which is 16:10 ratio and 16:9 comes to 1.77 { OriginalAspectRatio = 4/3; NewFOV = (ATan((Tan((90.0*Pi)/360.0)*(AspectRatio/OriginalAspectRatio)),1)*360.0)/Pi; default.DefaultFOV = NewFOV; DefaultFOV = NewFOV; // 16X9 if( AspectRatio >= 1.70 ) { //log("Detected 16X9: "$(float(GUIController(Player.GUIController).ResX) / GUIController(Player.GUIController).ResY)); } else { //log("Detected 16X10: "$(float(GUIController(Player.GUIController).ResX) / GUIController(Player.GUIController).ResY)); } } else { //log("Detected 4X3: "$(float(GUIController(Player.GUIController).ResX) / GUIController(Player.GUIController).ResY)); default.DefaultFOV = 90.0; DefaultFOV = 90.0; } // Initialize the FOV of all the weapons the player is carrying if( Pawn != none ) { for ( Inv=Pawn.Inventory; Inv!=None; Inv=Inv.Inventory ) { i++; KFWeap = KFWeapon(Inv); if ( KFWeap != None ) { KFWeap.InitFOV(); } // Little hack to catch possible runaway loops. Gotta love those linked listed in UE2.5 - Ramm if( i > 10000 ) break; } } // Set the FOV to the default FOV TransitionFOV(DefaultFOV,0.); } /* // Dev commands for trailers, commented out when not filming, remove for final release - Ramm // Send a voice message of a certain type to a certain player. exec function Speech( name Type, int Index, string Callsign ) { // No speech for now for vid recording!!! - Ramm //ServerSpeech(Type,Index,Callsign); } exec function ToggleScreenShotMode() { if ( myHUD.bCrosshairShow ) { myHUD.bCrosshairShow = false; SetWeaponHand("Hidden"); myHUD.bHideHUD = true; //TeamBeaconMaxDist = 0; //bHideVehicleNoEntryIndicator = true; } else { // return to normal myHUD.bCrosshairShow = true; SetWeaponHand("Right"); myHUD.bHideHUD = false; //TeamBeaconMaxDist = default.TeamBeaconMaxDist; //bHideVehicleNoEntryIndicator = false; } } exec function ZoomTimed(float newZoom) { StartZoomWithMax(newZoom); } exec function PoundRage() { local KFMonster KFMonst; Level.Game.KillBots(Level.Game.NumBots); foreach DynamicActors(class'KFMonster', KFMonst) { KFMonst.StartCharging(); } } exec function GiveAll() { ServerGiveAll(); } function ServerGiveAll() { local Inventory Inv; Pawn.GiveWeapon("KFmod.Bullpup"); Pawn.GiveWeapon("KFmod.Winchester"); Pawn.GiveWeapon("KFmod.Crossbow"); Pawn.GiveWeapon("KFmod.DualDeagle"); Pawn.GiveWeapon("KFmod.Deagle"); Pawn.GiveWeapon("KFmod.Single"); Pawn.GiveWeapon("KFmod.Dualies"); Pawn.GiveWeapon("KFmod.Axe"); Pawn.GiveWeapon("KFmod.Machete"); Pawn.GiveWeapon("KFmod.Knife"); Pawn.GiveWeapon("KFmod.Chainsaw"); Pawn.GiveWeapon("KFmod.LAW"); Pawn.GiveWeapon("KFmod.Shotgun"); Pawn.GiveWeapon("KFmod.BoomStick"); Pawn.GiveWeapon("KFMod.FlameThrower"); for( Inv=Pawn.Inventory; Inv!=None; Inv=Inv.Inventory ) { if ( Weapon(Inv)!=None ) Weapon(Inv).SuperMaxOutAmmo(); } } exec function HackSlomo(float NewSpeed) { ServerHackSlomo(NewSpeed); } function ServerHackSlomo(float NewSpeed) { Level.Game.SetGameSpeed(NewSpeed); }*/ exec function ToggleBuddyHudDebug() { if( !class'ROEngine.ROLevelInfo'.static.RODebugMode() ) { return; } if ( HudKillingFloor(myHUD) != none ) { HudKillingFloor(myHUD).bShowBuddyDebug = !HudKillingFloor(myHUD).bShowBuddyDebug; } } exec function ToggleZedHudDebug() { if( !class'ROEngine.ROLevelInfo'.static.RODebugMode() ) { return; } if ( HudKillingFloor(myHUD) != none ) { HudKillingFloor(myHUD).bShowEnemyDebug = !HudKillingFloor(myHUD).bShowEnemyDebug; } } /* RO Bloom Stuff Begin */ //TEMP START // 0 = bloom // 1 = blur // 2 = b&w // Toggle the bloom on and off as well as the ini setting for it exec function Bloom() { local bool bBloom; bBloom = bool(ConsoleCommand("get ini:Engine.Engine.ViewportManager Bloom")); if( bBloom ) { PostFX_SetActive(0, false); ConsoleCommand("set ini:Engine.Engine.ViewportManager Bloom"@False); } else { PostFX_SetActive(0, true); ConsoleCommand("set ini:Engine.Engine.ViewportManager Bloom"@True); } } // Debug tool for the black and white effect exec function BWEffect(float NewAmount) { if ( SteamStatsAndAchievements != none ) { log("STEAMSTATS: Used Cheat BWEffect"); SteamStatsAndAchievements.bUsedCheats = true; } if( NewAmount > 0 ) { postfxon(2); postfxbw(NewAmount); } else { postfxoff(2); } } /* exec function TestWhiz(float duration, float intensity) { AddBlur(duration, Intensity/2); }*/ simulated function SetBlur(float NewAmount) { if( NewAmount > 0 ) { if( class'KFMod.KFHumanPawn'.default.bUseBlurEffect ) { postfxon(1); postfxblur(NewAmount); } } else { postfxoff(1); } } // Bloom functions simulated function postfxon(int i) { if( PostFX_IsReady() ) PostFX_SetActive(i, true); } simulated function postfxoff(int i) { if( PostFX_IsReady() ) PostFX_SetActive(i, false); } simulated function postfxblur(float f)//0... 1 { if( PostFX_IsReady() ) PostFX_SetParameter(1, 0, f); } simulated function postfxbw(float f, optional bool bDoNotTurnOffFadeFromBlackEffect) //0... 1 { if( !PostFX_IsReady() ) return; // if (!bDoNotTurnOffFadeFromBlackEffect) // bDoFadeFromBlackEffect = false; PostFX_SetParameter(2, 0, f); } /*exec function postfxbloom(float f) //0... 1 (default 0.7f) { if( Level.NetMode != NM_Standalone ) return; PostFX_SetParameter(0, 0, f); }*/ // I'm not needed no more! exec function postfxbloom_bpcontrast(float f) //0.0f ... 4.0f (default 3.0f) { if( Level.NetMode != NM_Standalone ) return; PostFX_SetParameter(0, 2, f); } exec function postfxbloom_blurmult(float f) //1.0f ... 2.0f (Default 1.5f) { if( Level.NetMode != NM_Standalone ) return; PostFX_SetParameter(0, 3, f); } exec function postfxbloom_ratiomin(float f) // 0.0f-1.0f (Default 0.0f) { if( Level.NetMode != NM_Standalone ) return; PostFX_SetParameter(0,4, f); } exec function postfxbloom_ratiomax(float f) // 0.0-1.0f (Default 0.5f) { if( Level.NetMode != NM_Standalone ) return; PostFX_SetParameter(0,5, f); } exec function postfxbloom_ratio(float f) // 0.0-1.0f (Default 0.5f) { if( Level.NetMode != NM_Standalone ) return; PostFX_SetParameter(0,6, f); } exec function postfxbloom_togglegpu() { if( Level.NetMode != NM_Standalone ) return; PostFX_SetParameter(0,7, 0); } exec function postfxbloom_gpucalcs() { // 2000 is a hacked in number, using to determine if avgbloom calcs are done on the GPU self.Player.Console.Message("Doing GPU Calcs: "$PostFX_IsActive(2000),0); } /* RO Bloom Stuff End */ exec function ToggleDuck() { if( Pawn != none ) { if( bDuck == 0 ) { bDuck = 1; } else { bDuck = 0; } } } exec function Crouch() { if( Pawn != none ) { bDuck = 1; } } exec function UnCrouch() { if( Pawn != none ) { bDuck = 0; } } // Overriden to support resetting motion blur before switching maps and cleaning // up weapons that aren't properly garbage collected under normal circumstances event PreClientTravel() { super.PreClientTravel(); if( Level.NetMode != NM_DedicatedServer ) { SetBlur(0); if( Pawn != none) { if( Vehicle(Pawn) != none && Vehicle(Pawn).Driver != none && KFPawn(Vehicle(Pawn).Driver) != none ) { KFPawn(Vehicle(Pawn).Driver).PreTravelCleanUp(); } else if ( KFPawn(Pawn) != none ) { KFPawn(Pawn).PreTravelCleanUp(); } } } } function Possess(Pawn aPawn) { bSpawnedThisWave = true; bVomittedOn = false; bScreamedAt = false; super.Possess(aPawn); } // Overidden to support resetting shake and blur values when you posses the pawn function AcknowledgePossession(Pawn P) { // Tell the server if we want the trader path or not if( Role < ROLE_Authority ) { ServerSetWantsTraderPath(bWantsTraderPath); } if( P != none ) { StopViewShaking(); if( Level.NetMode != NM_DedicatedServer ) { SetBlur(0); } if( KFHumanPawn(P) != none ) { KFHumanPawn(P).KFPC = self; } } super.AcknowledgePossession(P); } event ClientOpenMenu (string Menu, optional bool bDisconnect,optional string Msg1, optional string Msg2) { if(Player == None) Return; else Super.ClientOpenMenu(Menu,bDisconnect,Msg1,Msg2); } // TODO : Why are we not in state PlayerWaiting, where this was cut n' pasted // from in the first place? function ServerReStartPlayer() { if( PlayerReplicationInfo.bOutOfLives ) Return; // No more main menu bug closing. ClientCloseMenu(true, true); if ( Level.Game.bWaitingToStartMatch ) PlayerReplicationInfo.bReadyToPlay = true; else Level.Game.RestartPlayer(self); } function ServerUnreadyPlayer() { if ( Level.Game.bWaitingToStartMatch ) PlayerReplicationInfo.bReadyToPlay = false; } exec function FreeCamera( bool B ) { if ( SteamStatsAndAchievements != none ) { log("STEAMSTATS: Used Cheat FreeCamera"); SteamStatsAndAchievements.bUsedCheats = true; } bFreeCamera = B; bBehindView = B; } //pass in FalloffStartTime = 0 for constant shaking event SetAmbientShake(float FalloffStartTime, float FalloffTime, vector OffsetMag, float OffsetFreq, rotator RotMag, float RotFreq) { local float FalloffScaling; local float CurrentOffsetMag; // Calculate current shake's magnitude if (AmbientShakeFalloffStartTime > 0) { FalloffScaling = 1.0 - ((Level.TimeSeconds - AmbientShakeFalloffStartTime) / AmbientShakeFalloffTime); FalloffScaling = FClamp(FalloffScaling, 0.0, 1.0); } else { FalloffScaling = 1.0; } CurrentOffsetMag = VSize(AmbientShakeOffsetMag * FalloffScaling); // If new shake is less than old shake just ignore it if( VSize(OffsetMag) < CurrentOffsetMag ) { return; } bEnableAmbientShake = true; AmbientShakeFalloffStartTime = FalloffStartTime; AmbientShakeFalloffTime = FalloffTime; AmbientShakeOffsetMag = OffsetMag; AmbientShakeOffsetFreq = OffsetFreq; AmbientShakeRotMag = RotMag; AmbientShakeRotFreq = RotFreq; } // Toggle the Flashlight on or off via an exec call. exec function ToggleTorch() { if (pawn.Weapon != none && KFWeapon(pawn.Weapon).bTorchEnabled) KFWeapon(pawn.Weapon).LightFire(); } // Set a new recoil amount simulated function SetRecoil(rotator NewRecoilRotation, float NewRecoilSpeed) { RecoilRotator += NewRecoilRotation; LastRecoilTime = Level.TimeSeconds; RecoilSpeed = NewRecoilSpeed; } function UpdateRotation(float DeltaTime, float maxPitch) { local rotator newRotation, ViewRotation; if ( bInterpolating || ((Pawn != None) && Pawn.bInterpolating) ) { ViewShake(deltaTime); return; } // Added FreeCam control for better view control if (bFreeCam == True) { if (bFreeCamZoom == True) { CameraDeltaRad += DeltaTime * 0.25 * aLookUp; } else if (bFreeCamSwivel == True) { CameraSwivel.Yaw += 16.0 * DeltaTime * aTurn; CameraSwivel.Pitch += 16.0 * DeltaTime * aLookUp; } else { CameraDeltaRotation.Yaw += 32.0 * DeltaTime * aTurn; CameraDeltaRotation.Pitch += 32.0 * DeltaTime * aLookUp; } } else { ViewRotation = Rotation; if(Pawn != None && Pawn.Physics != PHYS_Flying) // mmmmm { // Ensure we are not setting the pawn to a rotation beyond its desired if( Pawn.DesiredRotation.Roll < 65535 && (ViewRotation.Roll < Pawn.DesiredRotation.Roll || ViewRotation.Roll > 0)) ViewRotation.Roll = 0; else if( Pawn.DesiredRotation.Roll > 0 && (ViewRotation.Roll > Pawn.DesiredRotation.Roll || ViewRotation.Roll < 65535)) ViewRotation.Roll = 0; } DesiredRotation = ViewRotation; //save old rotation // Removing TurnTowardNearestEnemy and TurnAround since we don't need them and they can be used to exploit ini settings to have no recoil - Ramm /*if ( bTurnToNearest != 0 ) TurnTowardNearestEnemy(); else if ( bTurn180 != 0 ) TurnAround(); else {*/ TurnTarget = None; bRotateToDesired = false; bSetTurnRot = false; ViewRotation.Yaw += 32.0 * DeltaTime * aTurn; ViewRotation.Pitch += 32.0 * DeltaTime * aLookUp; if( (Pawn != none ) && (Pawn.Weapon != none) ) { ViewRotation = RecoilHandler(ViewRotation, DeltaTime); } /*}*/ if (Pawn != None) ViewRotation.Pitch = Pawn.LimitPitch(ViewRotation.Pitch); SetRotation(ViewRotation); ViewShake(deltaTime); ViewFlash(deltaTime); NewRotation = ViewRotation; //NewRotation.Roll = Rotation.Roll; if ( !bRotateToDesired && (Pawn != None) && (!bFreeCamera || !bBehindView) ) Pawn.FaceRotation(NewRotation, deltatime); } } //------------------------------------------------------------------------------ // Recoi;mHandler // Process recoil //------------------------------------------------------------------------------ simulated function rotator RecoilHandler(rotator NewRotation, float DeltaTime) { // Process recoil if( Level.TimeSeconds - LastRecoilTime <= RecoilSpeed ) { NewRotation += (RecoilRotator/RecoilSpeed) * deltatime; } else { RecoilRotator = rot(0,0,0); } return NewRotation; } function GRIKillBotCall(int NumBotsToKill) { if (KFGameType(Level.Game) != none && NumBotsToKill > 0) KFGameType(Level.Game).KillBots(NumBotsToKill); } function KFClientNetWorkMsg(string ParamA, string ParamB) { ClientOpenMenu("KFGUI.KFNetworkStatusMsg", true, ParamA, ParamB); } function BecomeSpectator() { if (Role < ROLE_Authority) return; if ( !Level.Game.BecomeSpectator(self) ) return; if ( Pawn != None ) Pawn.Died(self, class'DamageType', Pawn.Location); if ( PlayerReplicationInfo.Team != None ) PlayerReplicationInfo.Team.RemoveFromTeam(self); PlayerReplicationInfo.Team = None; ServerSpectate(); BroadcastLocalizedMessage(Level.Game.GameMessageClass, 14, PlayerReplicationInfo); ClientBecameSpectator(); } // Returns true if there are players to spectate function bool PlayersToSpectate() { local Controller C; // Make sure there are players we can spectate. if not, leave the players looking at their corpse. for ( C = Level.ControllerList; C != None; C = C.NextController ) { if ( C != self && Level.Game.CanSpectate(self, PlayerReplicationInfo.bOnlySpectator, C.Pawn) ) { return true; } } return false; } function ServerSetGRIPendingBots(int NumBotsPending,string BotName) { local int arraydifference; //if (KFGameReplicationInfo(GameReplicationInfo).PendingBots > 0) // arraydifference = 1; //else arraydifference = 0; KFGameReplicationInfo(GameReplicationInfo).PendingBots = NumBotsPending; KFGameReplicationInfo(GameReplicationInfo).LastBotName[KFGameReplicationInfo(GameReplicationInfo).PendingBots - arraydifference] = BotName; } function ServerSetTempBotName(string KFBotName) { KFGameReplicationInfo(GameReplicationInfo).TempBotName = KFBotName; } exec function ThrowGrenade() { KFPawn(Pawn).ThrowGrenade(); } exec function NextWeapon() { if ( HudKillingFloor(myHUD) != none ) { HudKillingFloor(myHUD).NextWeapon(); } else { super.NextWeapon(); } } exec function PrevWeapon() { if ( HudKillingFloor(myHUD) != none ) { HudKillingFloor(myHUD).PrevWeapon(); } else { super.PrevWeapon(); } } exec function Fire(optional float F) { if ( HudKillingFloor(myHUD) != none && HudKillingFloor(myHUD).bDisplayInventory ) { HudKillingFloor(myHUD).SelectWeapon(); bFire = 0; } else { super.Fire(F); } } /* // KFTODO: Removed this hack for now, I'm not sure if its needed anymore, and seems to be kind of inefficient - Ramm simulated event PostNetReceive() { Super.PostNetReceive(); if ( PlayerReplicationInfo != none) // && bWaitingForPRI ) { //bWaitingForPRI = False; //rec = class'xUtil'.static.FindPlayerRecord(PlayerReplicationInfo.CharacterName); //if ( rec.Species != None ) //{ // if ( PlayerReplicationInfo.Team == None ) // rec.Species.static.LoadResources(rec, Level, PlayerReplicationInfo, 255); // else // rec.Species.static.LoadResources(rec, Level, PlayerReplicationInfo, PlayerReplicationInfo.Team.TeamIndex); // HACK !!! // TODO: remove hack PlayerReplicationInfo.VoiceTypeName = "KFCoreVoicePack.AussieVoice"; PlayerReplicationInfo.VoiceType = class(DynamicLoadObject(PlayerReplicationInfo.VoiceTypeName,class'Class')); } }*/ function KFSwitchToBestWeapon() { KFClientSwitchToBestWeapon(); } function KFClientSwitchToBestWeapon() { nextWeapon(); } function ShowBuyMenu(string wlTag,float maxweight) { StopForceFeedback(); // jdf - no way to pause feedback // Open menu ClientOpenMenu("KFGUI.GUIBuyMenu",,wlTag,string(maxweight)); } function ShowLobbyMenu() { StopForceFeedback(); // jdf - no way to pause feedback bPendingLobbyDisplay = false; // Open menu ClientOpenMenu(LobbyMenuClassString); } function ClientRestart(Pawn NewPawn) { //KILL LOBBY ClientCloseMenu(true, true); super.ClientRestart(NewPawn); } simulated function bool FindInterAction() { local int i; if( Player.InteractionMaster==None ) Return False; For( i=0; i 0) { Advertising_EnterZone("mp_lobby"); } else if (Level.GRI.bMatchHasBegun ) { Advertising_ExitZone(); } } Super.PlayerTick(DeltaTime); } // enforce Lobby menu appearance here - there were all sorts of conditions attached, // but none of them should occur in KF. This simplifies matters ;) simulated function ShowLoginMenu() { if( (Pawn != none && Pawn.Health > 0) || (Pawn.PlayerReplicationInfo != none && Pawn.PlayerReplicationInfo.bReadyToPlay) ) return; if ( GameReplicationInfo != none ) { // Open menu ClientReplaceMenu(LobbyMenuClassString); } } auto state PlayerWaiting { exec function Fire(optional float F) { LoadPlayers(); } function bool CanRestartPlayer() { if(Level.Game.GameReplicationInfo.bMatchHasBegun) return False; return ((bReadyToStart || (DeathMatch(Level.Game) != None && DeathMatch(Level.Game).bForceRespawn)) && Super.CanRestartPlayer()); } simulated function Timer() { if ( !bPendingLobbyDisplay || bDemoOwner || (PlayerReplicationInfo != none && PlayerReplicationInfo.bReadyToPlay) ) { SetTimer(0, false); } else if ( !bRequestedSteamData && SteamStatsAndAchievements == none ) { if ( Level.NetMode == NM_Standalone ) { SteamStatsAndAchievements = Spawn(SteamStatsAndAchievementsClass, self); if ( SteamStatsAndAchievements == none || !SteamStatsAndAchievements.Initialize(self) ) { SteamStatsAndAchievements.Destroy(); SteamStatsAndAchievements = none; bRequestedSteamData = true; } } else { bRequestedSteamData = true; } } else if ( SteamStatsAndAchievements != none && !SteamStatsAndAchievements.bInitialized && ForceShowLobby < 10 ) { if ( !bRequestedSteamData ) { ForceShowLobby = 0; SteamStatsAndAchievements.GetStatsAndAchievements(); bRequestedSteamData = true; } ForceShowLobby++; } else if ( Player != None && GUIController(Player.GUIController) != None && !GUIController(Player.GUIController).bActive && GameReplicationInfo != none ) { // Spawn hint manager (if needed) UpdateHintManagement(bShowHints); ShowLobbyMenu(); SetTimer(0, false); } } simulated function EndState() { super.EndState(); if (Level.NetMode != NM_DedicatedServer) { SetupWebAPI(); } } // hax to open menu when player joins the game simulated function BeginState() { super.BeginState(); bRequestedSteamData = false; if (Level.NetMode != NM_DedicatedServer && bPendingLobbyDisplay) { SetTimer(0.1, true); Timer(); } } } simulated function SetupWebAPI() { if( Player != None && webAPIAccessor == none && SteamStatsAndAchievements != none ) { webAPIAccessor = Spawn(class'KFSteamWebAPI', self); webAPIAccessor.AchievementReport = KFSteamStatsAndAchievements(SteamStatsAndAchievements).OnAchievementReport; if ( SteamStatsAndAchievements.PCowner == None ) SteamStatsAndAchievements.PCOwner= self; log("webapi*************", 'DevNet'); if( Level.NetMode != NM_DedicatedServer && Player != none && Player.GUIController != none ) { webAPIAccessor.GetAchievements(Player.GUIController.SteamGetUserID()); log(Player.GUIController.SteamGetUserID(), 'DevNet'); } else { webAPIAccessor.GetAchievements(SteamStatsAndAchievements.GetSteamUserID()); log(SteamStatsAndAchievements.GetSteamUserID(), 'DevNet'); } } } // unpossessed a pawn (because pawn was killed) function PawnDied(Pawn P) { local int i; for (i = 0; i < CameraEffects.Length; i++) { RemoveCameraEffect(CameraEffects[i]); } Super.PawnDied(P); } function ZoneInfo GetCurrentZone() { return Region.Zone; } simulated function PlayBeepSound() { if ( ViewTarget != None ) ViewTarget.PlaySound(sound'KFWeaponSound.bullethitflesh2', SLOT_None,,,,,false); } function ShowMidGameMenu(bool bPause) { if ( HUDKillingFloor(MyHud).bDisplayInventory ) { HUDKillingFloor(MyHud).HideInventory(); } else { // Pause if not already if( Level.Pauser==None && Level.NetMode==NM_StandAlone ) SetPause(true); if ( Level.NetMode != NM_DedicatedServer ) StopForceFeedback(); // jdf - no way to pause feedback // Open menu if (bDemoOwner) ClientopenMenu(DemoMenuClass); else if ( LoginMenuClass != "" ) ClientOpenMenu(LoginMenuClass); else ClientOpenMenu(MidGameMenuClass); } } // Fast Melee Switch Code. // server calls this to force client to switch function ClientSwitchToBestMeleeWeapon() { SwitchToBestMeleeWeapon(); } // Same as SwitchToBestWeapon, but we're only dealing in Melee arms now. exec function SwitchToBestMeleeWeapon() { local inventory inv; if ( Pawn == None || KFMeleeGun(Pawn.Inventory) == None ) return; if ( (Pawn.PendingWeapon == None) ) { for(inv = pawn.Inventory; inv!=None; inv=inv.Inventory) { if(inv.IsA('Knife')) { Pawn.PendingWeapon = Knife(inv); Break; } } if ( Pawn.PendingWeapon == Pawn.Weapon ) Pawn.PendingWeapon = None; if ( Pawn.PendingWeapon == None ) return; } StopFiring(); if ( Pawn.Weapon == None ) Pawn.ChangedWeapon(); else if ( Pawn.Weapon != Pawn.PendingWeapon ) Pawn.Weapon.PutDown(); } simulated function SendSelectedVeterancyToServer(optional bool bForceChange) { SelectVeterancy(SelectedVeterancy, bForceChange); } function SelectVeterancy(class VetSkill, optional bool bForceChange) { if ( VetSkill == none || KFPlayerReplicationInfo(PlayerReplicationInfo) == none ) { return; } if ( KFSteamStatsAndAchievements(SteamStatsAndAchievements) != none ) { SetSelectedVeterancy( VetSkill ); if ( KFGameReplicationInfo(GameReplicationInfo).bWaveInProgress && VetSkill != KFPlayerReplicationInfo(PlayerReplicationInfo).ClientVeteranSkill ) { bChangedVeterancyThisWave = false; ClientMessage(Repl(YouWillBecomePerkString, "%Perk%", VetSkill.Default.VeterancyName)); } else if ( !bChangedVeterancyThisWave || bForceChange ) { if ( VetSkill != KFPlayerReplicationInfo(PlayerReplicationInfo).ClientVeteranSkill ) { ClientMessage(Repl(YouAreNowPerkString, "%Perk%", VetSkill.Default.VeterancyName)); } if ( GameReplicationInfo.bMatchHasBegun ) { bChangedVeterancyThisWave = true; } KFPlayerReplicationInfo(PlayerReplicationInfo).ClientVeteranSkill = VetSkill; KFPlayerReplicationInfo(PlayerReplicationInfo).ClientVeteranSkillLevel = KFSteamStatsAndAchievements(SteamStatsAndAchievements).PerkHighestLevelAvailable(VetSkill.default.PerkIndex); if( KFHumanPawn(Pawn) != none ) { KFHumanPawn(Pawn).VeterancyChanged(); } } else { ClientMessage(PerkChangeOncePerWaveString); } } } function SetSelectedVeterancy( class VetSkill ) { local int i; SelectedVeterancy = VetSkill; for( i = 0; i < class'KFGameType'.default.LoadedSkills.Length; ++i ) { if( class'KFGameType'.default.LoadedSkills[i] == VetSkill ) { BuyMenuFilterIndex = i; break; } } } function SetPawnClass(string inClass, string inCharacter) { PawnClass = Class'KFHumanPawn'; inCharacter = Class'KFGameType'.Static.GetValidCharacter(inCharacter); PawnSetupRecord = class'xUtil'.static.FindPlayerRecord(inCharacter); PlayerReplicationInfo.SetCharacterName(inCharacter); } /* Taken out for release - Ramm exec function RMode2( byte MD ) { if ( SteamStatsAndAchievements != none ) { log("STEAMSTATS: Used Cheat RMode2"); SteamStatsAndAchievements.bUsedCheats = true; } RendMap = MD; }*/ exec function TogglePathToTrader() { SetShowPathToTrader(!bShowTraderPath); } // Handle toggling showing the path to the trader function SetShowPathToTrader(bool bShouldShowPath) { if( !bWantsTraderPath ) { bShowTraderPath = false; } else { if( bShouldShowPath ) { Timer(); SetTimer(TraderPathInterval, true); bShowTraderPath = true; } else { bShowTraderPath = false; SetTimer(0, false); } } } // Show the path the trader function Timer() { if ( !bWantsTraderPath ) { bShowTraderPath = false; SetTimer(0, false); } else { // Fairly lame place to call this, but I need a place that is called very often that is run on the server if( Role == ROLE_Authority && bShowTraderPath ) { UnrealMPGameInfo(Level.Game).ShowPathTo(Self, 0); } } if ( Role == ROLE_Authority && bVomittedOn ) { if ( Level.TimeSeconds - VomittedOnTime > 10.0 ) { if ( KFSteamStatsAndAchievements(SteamStatsAndAchievements) != none ) { KFSteamStatsAndAchievements(SteamStatsAndAchievements).Survived10SecondsAfterVomit(); bVomittedOn = false; } } else if ( !bTimerLoop || TimerRate == 0.0 ) { SetTimer(10.0 - (Level.TimeSeconds - VomittedOnTime), false); } } if ( Role == ROLE_Authority && bScreamedAt && Pawn != none && Pawn.Health > 0 ) { if ( Level.TimeSeconds - ScreamTime > 10.0 ) { if ( KFSteamStatsAndAchievements(SteamStatsAndAchievements) != none ) { KFSteamStatsAndAchievements(SteamStatsAndAchievements).Survived10SecondsAfterScream(); bScreamedAt = false; } } else if ( !bTimerLoop || TimerRate == 0.0 ) { SetTimer(10.0 - (Level.TimeSeconds - ScreamTime), false); } } } // Sets the bWantsTraderPath var on the server, since thats where its used function ServerSetWantsTraderPath(bool bNewWantsTraderPath) { bWantsTraderPath = bNewWantsTraderPath; } state Dead { function Timer() { if ( !bSpawnedThisWave && KFGameType(Level.Game) != none && Level.Game.GameReplicationInfo.bMatchHasBegun && Role == ROLE_Authority && !KFGameReplicationInfo(GameReplicationInfo).bWaveInProgress ) { PlayerReplicationInfo.Score = Max(KFGameType(Level.Game).MinRespawnCash, int(PlayerReplicationInfo.Score)); SetViewTarget(self); ClientSetBehindView(false); bBehindView = False; ClientSetViewTarget(Pawn); PlayerReplicationInfo.bOutOfLives = false; Pawn = none; ServerReStartPlayer(); } super.Timer(); } event PlayerCalcView(out actor ViewActor, out vector CameraLocation, out rotator CameraRotation ) { if( Level.NetMode==NM_DedicatedServer ) { Global.PlayerCalcView(ViewActor,CameraLocation,CameraRotation); Return; } if ( LastPlayerCalcView == Level.TimeSeconds && CalcViewActor != None && CalcViewActor.Location == CalcViewActorLocation ) { ViewActor = CalcViewActor; CameraLocation = CalcViewLocation; CameraRotation = CalcViewRotation; return; } if( Pawn(ViewTarget)!=None && Pawn(ViewTarget).bSpecialCalcView ) { // try the 'special' calcview. This may return false if its not applicable, and we do the usual. if ( Pawn(ViewTarget).SpecialCalcView(ViewActor, CameraLocation, CameraRotation) ) { CacheCalcView(ViewActor,CameraLocation,CameraRotation); return; } } Global.PlayerCalcView(ViewActor,CameraLocation,CameraRotation); } simulated function BeginState() { // Unzoom if we were zoomed TransitionFOV(DefaultFOV,0.); Super.BeginState(); if ( HudKillingFloor(myHUD) != none ) { HudKillingFloor(myHUD).bDisplayDeathScreen = True; HudKillingFloor(myHUD).GoalTarget = ViewTarget; } if ( Role == ROLE_Authority ) { SetTimer(1.0, false); } } simulated function EndState() { super.EndState(); if ( HudKillingFloor(myHUD) != none ) { HUDKillingFloor(myHud).StopFadeEffect(); } } } // Player movement. // Player Standing, walking, running, falling. state PlayerWalking { simulated function BeginState() { Super.BeginState(); // Unzoom if we were zoomed TransitionFOV(DefaultFOV,0.); } } function HandleWalking() { local KFHumanPawn P; P = KFHumanPawn(Pawn); if (P == None) return; if (P.bAimingRifle) P.SetWalking(true); else P.SetWalking( (bRun != 0) && !Region.Zone.IsA('WarpZoneInfo') ); } function AdjustView(float DeltaTime ) { local bool bReachedTargetFOV; // Updating the FOV if( TransitionTimeTotal > 0.0f && FOVAngle != TargetFOV ) { TransitionTimeElapsed += DeltaTime; if( TransitionTimeElapsed > TransitionTimeTotal ) { TransitionTimeElapsed = TransitionTimeTotal; bReachedTargetFOV = true; } FOVAngle = Lerp( (TransitionTimeElapsed / TransitionTimeTotal), TransitionStartFOV, TargetFOV ); DesiredFOV = FOVAngle; if( bReachedTargetFOV ) { TransitionTimeTotal = 0; } } super.AdjustView(DeltaTime); } //________________ // TransitionFOV // // Created to implement the interface for smooth transitioning // between FOVs. NewFOV specifies the TargetFOV and TransitionTime // specifies how long in seconds the transition should take from the // current FOV. function TransitionFOV(float NewFOV, float TransitionTime) { if( TransitionTime > 0.0f ) { TargetFOV = NewFOV; TransitionTimeTotal = TransitionTime; TransitionStartFOV = FOVAngle; TransitionTimeElapsed = 0.0f; } else { FOVAngle = NewFOV; TargetFOV = NewFOV; DesiredFOV = FOVAngle; TransitionTimeTotal = 0.0f; // The system won't attempt an FOV transition if TimeTotal is 0. } } exec function ToggleXHair() { if( !class'ROEngine.ROLevelInfo'.static.RODebugMode() ) return; if ( myHUD.bCrosshairShow ) { myHUD.bCrosshairShow = false; HudKillingFloor(myHUD).bShowKFDebugXHair = false; } else { // return to normal myHUD.bCrosshairShow = true; HudKillingFloor(myHUD).bShowKFDebugXHair = true; } } function SendVoiceMessage(PlayerReplicationInfo Sender, PlayerReplicationInfo Recipient, name messagetype, byte messageID, name broadcasttype, optional Pawn soundSender, optional vector senderLocation) { local Controller P; local KFPlayerController KFPC; if ( !AllowVoiceMessage(MessageType) ) { return; } for ( P = Level.ControllerList; P != none; P = P.NextController ) { KFPC = KFPlayerController(P); if ( KFPC != None ) { // Don't allow dead people to talk if ( Pawn != none ) { KFPC.ClientLocationalVoiceMessage(Sender, Recipient, messagetype, messageID, soundSender, senderLocation); } } } } function ClientLocationalVoiceMessage(PlayerReplicationInfo Sender, PlayerReplicationInfo Recipient, name MessageType, byte MessageID, optional Pawn SenderPawn, optional vector SenderLocation) { local VoicePack Voice; local ShopVolume Shop; if ( Sender == none || Sender.VoiceType == none || Player.Console == none || Level.NetMode == NM_DedicatedServer ) { return; } Voice = Spawn(Sender.VoiceType, self); if ( KFVoicePack(Voice) != none ) { if ( MessageType == 'TRADER' ) { if ( Pawn != none && MessageID >= 4 ) { foreach Pawn.TouchingActors(Class'ShopVolume', Shop) { SenderLocation = Shop.MyTrader.Location; // Only play the 30 Seconds remaining messages come across as Locational Speech if we're in the Shop if ( MessageID == 4 ) { return; } else if ( MessageID == 5 ) { MessageID = 999; } break; } } // Only play the 10 Seconds remaining message if we are in the Shop // and only play the 30 seconds remaning message if we haven't been to the Shop if ( MessageID == 5 || (MessageID == 4 && bHasHeardTraderWelcomeMessage) ) { return; } else if ( MessageID == 999 ) { MessageID = 5; } // Store the fact that we've heard the Trader's Welcome message on the client if ( MessageID == 7 ) { bHasHeardTraderWelcomeMessage = true; } // If we're hearing the Shop's Closed Message, reset the Trader's Welcome message flag else if ( MessageID == 6 ) { bHasHeardTraderWelcomeMessage = false; } KFVoicePack(Voice).ClientInitializeLocational(Sender, Recipient, MessageType, MessageID, SenderPawn, SenderLocation); if ( MessageID > 6 /*&& bBuyMenuIsOpen*/ ) { // TODO: Show KFVoicePack(Voice).GetClientParsedMessage() in the Buy Menu } else if ( KFVoicePack(Voice).GetClientParsedMessage() != "" ) { // Radio commands print to Text TeamMessage(Sender, KFVoicePack(Voice).GetClientParsedMessage(), 'Trader'); } } else { KFVoicePack(Voice).ClientInitializeLocational(Sender, Recipient, MessageType, MessageID, SenderPawn, SenderLocation); if ( KFVoicePack(Voice).GetClientParsedMessage() != "" ) { TeamMessage(Sender, KFVoicePack(Voice).GetClientParsedMessage(), 'Voice'); } } } else if ( Voice != None ) { Voice.ClientInitialize(Sender, Recipient, MessageType, MessageID); } } simulated event NotifyPerkAvailable(int PerkType, int PerkLevel) { local class NewPerkClass; switch ( PerkType ) { case 0: NewPerkClass = class'KFVetFieldMedic'; break; case 1: NewPerkClass = class'KFVetSupportSpec'; break; case 2: NewPerkClass = class'KFVetSharpshooter'; break; case 3: NewPerkClass = class'KFVetCommando'; break; case 4: NewPerkClass = class'KFVetBerserker'; break; case 5: NewPerkClass = class'KFVetFirebug'; break; case 6: NewPerkClass = class'KFVetDemolitions'; break; } // Show Pop up notification of Perk Unlocked and Play Sound if ( HudKillingFloor(myHUD) != none ) { // Play perk sound ViewTarget.PlaySound(sound'KF_InterfaceSnd.PerkAchieved', Slot_None, 2.0,true,,,false); if ( PerkLevel == 1 ) { HudKillingFloor(myHUD).ShowPopupNotification(5.0, 3, Repl(PerkFirstLevelUnlockedString, "%x", NewPerkClass.default.VeterancyName), NewPerkClass.default.OnHUDIcon); } else if ( PerkLevel <= 5 ) { HudKillingFloor(myHUD).ShowPopupNotification(3.0, 2, Repl(PerkUnlockedString, "%x", NewPerkClass.default.VeterancyName @ "-" @ LevelString @ PerkLevel), NewPerkClass.default.OnHUDIcon); } else { HudKillingFloor(myHUD).ShowPopupNotification(3.0, 2, Repl(PerkUnlockedString, "%x", NewPerkClass.default.VeterancyName @ "-" @ LevelString @ PerkLevel), NewPerkClass.default.OnHUDGoldIcon); } } } exec function ShowFakeNotification() { HudKillingFloor(myHUD).ShowPopupNotification(5.0, 3, Repl(PerkFirstLevelUnlockedString, "%x", class'KFVetFirebug'.default.VeterancyName), class'KFVetFirebug'.default.OnHUDIcon); } // Cheat overrides to disable Stats/Perks/Achievements exec function KillAll(class aClass) { if ( Role == ROLE_Authority && SteamStatsAndAchievements != none ) { log("STEAMSTATS: Used Cheat KillAll"); SteamStatsAndAchievements.bUsedCheats = true; } super.KillAll(aClass); } exec function FOV(float F) { if ( Level.NetMode == NM_Standalone && SteamStatsAndAchievements != none ) { log("STEAMSTATS: Used Cheat FOV"); SteamStatsAndAchievements.bUsedCheats = true; } super.FOV(F); } exec function Mutate(string MutateString) { if ( Level.NetMode == NM_Standalone && SteamStatsAndAchievements != none ) { log("STEAMSTATS: Used Cheat Mutate"); SteamStatsAndAchievements.bUsedCheats = true; } super.Mutate(MutateString); } exec function BehindView(bool B) { if ( B && Level.NetMode == NM_Standalone && SteamStatsAndAchievements != none ) { log("STEAMSTATS: Used Cheat BehindView"); SteamStatsAndAchievements.bUsedCheats = true; } super.BehindView(B); } exec function ToggleBehindView() { if ( Level.NetMode == NM_Standalone && SteamStatsAndAchievements != none ) { log("STEAMSTATS: Used Cheat ToggleBehindView"); SteamStatsAndAchievements.bUsedCheats = true; } super.ToggleBehindView(); } exec function SwitchTeam() { if ( Level.NetMode == NM_Standalone && SteamStatsAndAchievements != none ) { log("STEAMSTATS: Used Cheat SwitchTeam"); SteamStatsAndAchievements.bUsedCheats = true; } super.SwitchTeam(); } exec function ChangeTeam(int N) { if ( Level.NetMode == NM_Standalone && SteamStatsAndAchievements != none ) { log("STEAMSTATS: Used Cheat ChangeTeam"); SteamStatsAndAchievements.bUsedCheats = true; } super.ChangeTeam(N); } // Hint management functions simulated function NotifyHintRenderingDone() { if (HintManager != none) HintManager.NotifyHintRenderingDone(); } simulated function UpdateHintManagement(bool bUseHints) { if (Level.GetLocalPlayerController() == self) { if (bUseHints && HintManager == none) { HintManager = spawn(class'KFHintManager', self); if (HintManager == none) warn("Unable to spawn hint manager"); } else if (!bUseHints && HintManager != none) { HintManager.Destroy(); HintManager = none; } if (!bUseHints) if (HUDKillingFloor(myHUD) != none) HUDKillingFloor(myHUD).bDrawHint = false; } } simulated function CheckForHint(int hintType) { if (HintManager != none) { HintManager.CheckForHint(hintType); } } simulated function ClientWeaponSpawned(class WClass, Inventory Inv) { switch ( WClass ) { case class'AA12AutoShotgun': class'AA12AutoShotgun'.static.PreloadAssets(Inv); class'AA12Fire'.static.PreloadAssets(Level); class'AA12Attachment'.static.PreloadAssets(); break; case class'GoldenAA12AutoShotgun': class'GoldenAA12AutoShotgun'.static.PreloadAssets(Inv); class'GoldenAA12Fire'.static.PreloadAssets(Level); class'GoldenAA12Attachment'.static.PreloadAssets(); break; case class'SPAutoShotgun': class'SPAutoShotgun'.static.PreloadAssets(Inv); class'SPShotgunFire'.static.PreloadAssets(Level); class'SPShotgunAltFire'.static.PreloadAssets(Level); class'SPShotgunAttachment'.static.PreloadAssets(); break; case class'AK47AssaultRifle': class'AK47AssaultRifle'.static.PreloadAssets(Inv); class'AK47Fire'.static.PreloadAssets(Level); class'AK47Attachment'.static.PreloadAssets(); break; case class'GoldenAK47AssaultRifle': class'GoldenAK47AssaultRifle'.static.PreloadAssets(Inv); class'GoldenAK47Fire'.static.PreloadAssets(Level); class'GoldenAK47Attachment'.static.PreloadAssets(); break; case class'BenelliShotgun': class'BenelliShotgun'.static.PreloadAssets(Inv); class'BenelliFire'.static.PreloadAssets(Level); class'BenelliAttachment'.static.PreloadAssets(); break; case class'BlowerThrower': class'BlowerThrower'.static.PreloadAssets(Inv); class'BlowerThrowerFire'.static.PreloadAssets(Level); class'BlowerThrowerAltFire'.static.PreloadAssets(Level); class'BlowerThrowerAttachment'.static.PreloadAssets(); break; case class'GoldenBenelliShotgun': class'GoldenBenelliShotgun'.static.PreloadAssets(Inv); class'GoldenBenelliFire'.static.PreloadAssets(Level); class'GoldenBenelliAttachment'.static.PreloadAssets(); break; case class'Chainsaw': class'Chainsaw'.static.PreloadAssets(Inv); class'ChainsawFire'.static.PreloadAssets(); class'ChainsawAltFire'.static.PreloadAssets(); class'ChainsawAttachment'.static.PreloadAssets(); break; case class'GoldenChainsaw': class'GoldenChainsaw'.static.PreloadAssets(Inv); class'GoldenChainsawAttachment'.static.PreloadAssets(); break; case class'Crossbow': class'Crossbow'.static.PreloadAssets(Inv); class'CrossbowArrow'.static.PreloadAssets(); class'CrossbowFire'.static.PreloadAssets(Level); class'CrossbowAttachment'.static.PreloadAssets(); break; case class'FlameThrower': class'FlameThrower'.static.PreloadAssets(Inv); class'FlameBurstFire'.static.PreloadAssets(Level); class'FlameThrowerAttachment'.static.PreloadAssets(); break; case class'GoldenFlameThrower': class'GoldenFlameThrower'.static.PreloadAssets(Inv); class'GoldenFlameBurstFire'.static.PreloadAssets(Level); class'GoldenFTAttachment'.static.PreloadAssets(); break; case class'BoomStick': class'BoomStick'.static.PreloadAssets(Inv); class'BoomStickFire'.static.PreloadAssets(Level); class'BoomStickAltFire'.static.PreloadAssets(Level); class'BoomStickAttachment'.static.PreloadAssets(); break; case class'KSGShotgun': class'KSGShotgun'.static.PreloadAssets(Inv); class'KSGFire'.static.PreloadAssets(Level); class'KSGAttachment'.static.PreloadAssets(); break; case class'HuskGun': class'HuskGun'.static.PreloadAssets(Inv); class'HuskGunFire'.static.PreloadAssets(Level); class'HuskGunProjectile'.static.PreloadAssets(); class'HuskGunProjectile_Weak'.static.PreloadAssets(); class'HuskGunProjectile_Strong'.static.PreloadAssets(); class'HuskGunAttachment'.static.PreloadAssets(); break; case class'ZEDGun': class'ZEDGun'.static.PreloadAssets(Inv); class'ZEDGunFire'.static.PreloadAssets(Level); class'ZEDGunAltFire'.static.PreloadAssets(Level); class'ZEDGunProjectile'.static.PreloadAssets(); class'ZEDGunAttachment'.static.PreloadAssets(); break; case class'ZEDMKIIWeapon': class'ZEDMKIIWeapon'.static.PreloadAssets(Inv); class'ZEDMKIIFire'.static.PreloadAssets(Level); class'ZEDMKIIAltFire'.static.PreloadAssets(Level); class'ZEDMKIIPrimaryProjectile'.static.PreloadAssets(); class'ZEDMKIISecondaryProjectile'.static.PreloadAssets(); class'ZEDMKIIAttachment'.static.PreloadAssets(); break; case class'Katana': class'Katana'.static.PreloadAssets(Inv); class'KatanaFire'.static.PreloadAssets(); class'KatanaFireB'.static.PreloadAssets(); class'KatanaAttachment'.static.PreloadAssets(); break; case class'GoldenKatana': class'GoldenKatana'.static.PreloadAssets(Inv); class'KatanaFire'.static.PreloadAssets(); class'KatanaFireB'.static.PreloadAssets(); class'GoldenKatanaAttachment'.static.PreloadAssets(); break; case class'ClaymoreSword': class'ClaymoreSword'.static.PreloadAssets(Inv); class'ClaymoreSwordFire'.static.PreloadAssets(); class'ClaymoreSwordFireB'.static.PreloadAssets(); class'ClaymoreSwordAttachment'.static.PreloadAssets(); break; case class'DwarfAxe': class'DwarfAxe'.static.PreloadAssets(Inv); class'DwarfAxeFire'.static.PreloadAssets(); class'DwarfAxeFireB'.static.PreloadAssets(); class'DwarfAxeAttachment'.static.PreloadAssets(); break; case class'FNFAL_ACOG_AssaultRifle': class'FNFAL_ACOG_AssaultRifle'.static.PreloadAssets(Inv); class'FNFALFire'.static.PreloadAssets(Level); class'FNFAL_ACOG_Attachment'.static.PreloadAssets(); break; case class'LAW': class'LAW'.static.PreloadAssets(Inv); class'LAWFire'.static.PreloadAssets(Level); class'LAWProj'.static.PreloadAssets(); class'LAWAttachment'.static.PreloadAssets(); break; case class'M14EBRBattleRifle': class'M14EBRBattleRifle'.static.PreloadAssets(Inv); class'M14EBRFire'.static.PreloadAssets(Level); class'M14EBRAttachment'.static.PreloadAssets(); break; case class'M4AssaultRifle': class'M4AssaultRifle'.static.PreloadAssets(Inv); class'M4Fire'.static.PreloadAssets(Level); class'M4Attachment'.static.PreloadAssets(); break; case class'M32GrenadeLauncher': class'M32GrenadeLauncher'.static.PreloadAssets(Inv); class'M32Fire'.static.PreloadAssets(Level); class'M32GrenadeProjectile'.static.PreloadAssets(); class'M32Attachment'.static.PreloadAssets(); break; case class'M79GrenadeLauncher': class'M79GrenadeLauncher'.static.PreloadAssets(Inv); class'M79Fire'.static.PreloadAssets(Level); class'M79GrenadeProjectile'.static.PreloadAssets(); class'M79Attachment'.static.PreloadAssets(); break; case class'GoldenM79GrenadeLauncher': class'GoldenM79GrenadeLauncher'.static.PreloadAssets(Inv); class'GoldenM79Fire'.static.PreloadAssets(Level); class'M79GrenadeProjectile'.static.PreloadAssets(); class'GoldenM79Attachment'.static.PreloadAssets(); break; case class'M4203AssaultRifle': class'M4203AssaultRifle'.static.PreloadAssets(Inv); class'M203Fire'.static.PreloadAssets(Level); class'M4203BulletFire'.static.PreloadAssets(Level); class'M203GrenadeProjectile'.static.PreloadAssets(); class'M4203Attachment'.static.PreloadAssets(); break; case class'M7A3MMedicGun': class'M7A3MMedicGun'.static.PreloadAssets(Inv); class'M7A3MFire'.static.PreloadAssets(Level); class'M7A3MAltFire'.static.PreloadAssets(Level); class'M7A3MHealinglProjectile'.static.PreloadAssets(); class'M7A3MAttachment'.static.PreloadAssets(); break; case class'M99SniperRifle': class'M99SniperRifle'.static.PreloadAssets(Inv); class'M99Bullet'.static.PreloadAssets(); class'M99Fire'.static.PreloadAssets(Level); class'M99Attachment'.static.PreloadAssets(); break; case class'MAC10MP': class'MAC10MP'.static.PreloadAssets(Inv); class'MAC10Fire'.static.PreloadAssets(Level); class'MAC10Attachment'.static.PreloadAssets(); break; case class'Magnum44Pistol': class'Magnum44Pistol'.static.PreloadAssets(Inv); class'Magnum44Fire'.static.PreloadAssets(Level); class'Magnum44Attachment'.static.PreloadAssets(); break; case class'MK23Pistol': class'MK23Pistol'.static.PreloadAssets(Inv); class'MK23Fire'.static.PreloadAssets(Level); class'MK23Attachment'.static.PreloadAssets(); break; case class'MKb42AssaultRifle': class'MKb42AssaultRifle'.static.PreloadAssets(Inv); class'MKb42Fire'.static.PreloadAssets(Level); class'MKb42Attachment'.static.PreloadAssets(); break; case class'MP7MMedicGun': class'MP7MMedicGun'.static.PreloadAssets(Inv); class'MP7MFire'.static.PreloadAssets(Level); class'MP7MAltFire'.static.PreloadAssets(Level); class'MP7MHealinglProjectile'.static.PreloadAssets(); class'MP7MAttachment'.static.PreloadAssets(); break; case class'KrissMMedicGun': class'KrissMMedicGun'.static.PreloadAssets(Inv); class'KrissMFire'.static.PreloadAssets(Level); class'KrissMAltFire'.static.PreloadAssets(Level); class'KrissMHealingProjectile'.static.PreloadAssets(); class'KrissMAttachment'.static.PreloadAssets(); break; case class'MP5MMedicGun': class'MP5MMedicGun'.static.PreloadAssets(Inv); class'MP5MFire'.static.PreloadAssets(Level); class'MP5MAltFire'.static.PreloadAssets(Level); class'MP5MHealinglProjectile'.static.PreloadAssets(); class'MP5MAttachment'.static.PreloadAssets(); break; case class'PipeBombExplosive': class'PipeBombExplosive'.static.PreloadAssets(Inv); class'PipeBombProjectile'.static.PreloadAssets(); class'PipeBombAttachment'.static.PreloadAssets(); break; case class'SCARMK17AssaultRifle': class'SCARMK17AssaultRifle'.static.PreloadAssets(Inv); class'SCARMK17Fire'.static.PreloadAssets(Level); class'SCARMK17Attachment'.static.PreloadAssets(); break; case class'SealSquealHarpoonBomber': class'SealSquealHarpoonBomber'.static.PreloadAssets(Inv); class'SealSquealProjectile'.static.PreloadAssets(); class'SealSquealFire'.static.PreloadAssets(Level); class'SealSquealAttachment'.static.PreloadAssets(); break; case class'SeekerSixRocketLauncher': class'SeekerSixRocketLauncher'.static.PreloadAssets(Inv); class'SeekerSixRocketProjectile'.static.PreloadAssets(); class'SeekerSixSeekingRocketProjectile'.static.PreloadAssets(); class'SeekerSixFire'.static.PreloadAssets(Level); class'SeekerSixAttachment'.static.PreloadAssets(); break; case class'Trenchgun': class'Trenchgun'.static.PreloadAssets(Inv); class'TrenchgunBullet'.static.PreloadAssets(); class'TrenchgunFire'.static.PreloadAssets(Level); class'TrenchgunAttachment'.static.PreloadAssets(); break; case class'NailGun': class'NailGun'.static.PreloadAssets(Inv); class'NailGunFire'.static.PreloadAssets(Level); class'NailGunProjectile'.static.PreloadAssets(); class'NailGunAltFire'.static.PreloadAssets(Level); class'NailGunAttachment'.static.PreloadAssets(); break; case class'ThompsonSMG': class'ThompsonSMG'.static.PreloadAssets(Inv); class'ThompsonFire'.static.PreloadAssets(Level); class'ThompsonAttachment'.static.PreloadAssets(); break; case class'ThompsonDrumSMG': class'ThompsonDrumSMG'.static.PreloadAssets(Inv); class'ThompsonDrumFire'.static.PreloadAssets(Level); class'ThompsonDrumAttachment'.static.PreloadAssets(); break; case class'Scythe': class'Scythe'.static.PreloadAssets(Inv); class'ScytheFire'.static.PreloadAssets(); class'ScytheFireB'.static.PreloadAssets(); class'ScytheAttachment'.static.PreloadAssets(); break; case class'SPGrenadeLauncher': class'SPGrenadeLauncher'.static.PreloadAssets(Inv); class'SPGrenadeFire'.static.PreloadAssets(Level); class'SPGrenadeProjectile'.static.PreloadAssets(); class'SPGrenadeAttachment'.static.PreloadAssets(); break; case class'SPSniperRifle': class'SPSniperRifle'.static.PreloadAssets(Inv); class'SPSniperFire'.static.PreloadAssets(Level); class'SPSniperAttachment'.static.PreloadAssets(); break; case class'SPThompsonSMG': class'SPThompsonSMG'.static.PreloadAssets(Inv); class'SPThompsonFire'.static.PreloadAssets(Level); class'SPThompsonAttachment'.static.PreloadAssets(); break; case class'Crossbuzzsaw': class'Crossbuzzsaw'.static.PreloadAssets(Inv); class'CrossbuzzsawFire'.static.PreloadAssets(Level); class'CrossbuzzsawBlade'.static.PreloadAssets(); class'CrossbuzzsawAttachment'.static.PreloadAssets(); break; case class'FlareRevolver': class'FlareRevolver'.static.PreloadAssets(Inv); class'FlareRevolverFire'.static.PreloadAssets(Level); class'FlareRevolverProjectile'.static.PreloadAssets(); class'FlareRevolverAttachment'.static.PreloadAssets(); break; case class'Deagle': class'Deagle'.static.PreloadAssets(Inv); class'DeagleFire'.static.PreloadAssets(Level); class'DeagleAltFire'.static.PreloadAssets(Level); class'DeagleAttachment'.static.PreloadAssets(); break; case class'GoldenDeagle': class'GoldenDeagle'.static.PreloadAssets(Inv); class'GoldenDeagleFire'.static.PreloadAssets(Level); class'GoldenDeagleAltFire'.static.PreloadAssets(Level); class'GoldenDeagleAttachment'.static.PreloadAssets(); break; case class'CamoM4AssaultRifle': class'CamoM4AssaultRifle'.static.PreloadAssets(Inv); class'CamoM4Fire'.static.PreloadAssets(Level); class'CamoM4Attachment'.static.PreloadAssets(); break; case class'CamoM32GrenadeLauncher': class'CamoM32GrenadeLauncher'.static.PreloadAssets(Inv); class'CamoM32Fire'.static.PreloadAssets(Level); class'M32GrenadeProjectile'.static.PreloadAssets(); class'CamoM32Attachment'.static.PreloadAssets(); break; case class'CamoMP5MMedicGun': class'CamoMP5MMedicGun'.static.PreloadAssets(Inv); class'CamoMP5MFire'.static.PreloadAssets(Level); class'MP5MAltFire'.static.PreloadAssets(Level); class'MP5MHealinglProjectile'.static.PreloadAssets(); class'CamoMP5MAttachment'.static.PreloadAssets(); break; case class'CamoShotgun': class'CamoShotgun'.static.PreloadAssets(Inv); class'CamoShotgunFire'.static.PreloadAssets(Level); class'CamoShotgunAttachment'.static.PreloadAssets(); break; case class'NeonAK47AssaultRifle': class'NeonAK47AssaultRifle'.static.PreloadAssets(Inv); class'NeonAK47Fire'.static.PreloadAssets(Level); class'NeonAK47Attachment'.static.PreloadAssets(); break; case class'NeonKrissMMedicGun': class'NeonKrissMMedicGun'.static.PreloadAssets(Inv); class'NeonKrissMFire'.static.PreloadAssets(Level); class'KrissMAltFire'.static.PreloadAssets(Level); class'KrissMHealingProjectile'.static.PreloadAssets(); class'NeonKrissMAttachment'.static.PreloadAssets(); break; case class'NeonSCARMK17AssaultRifle': class'NeonSCARMK17AssaultRifle'.static.PreloadAssets(Inv); class'NeonSCARMK17Fire'.static.PreloadAssets(Level); class'NeonSCARMK17Attachment'.static.PreloadAssets(); break; case class'NeonKSGShotgun': class'NeonKSGShotgun'.static.PreloadAssets(Inv); class'NeonKSGFire'.static.PreloadAssets(Level); class'NeonKSGAttachment'.static.PreloadAssets(); break; } } simulated function ClientWeaponDestroyed(class WClass) { switch ( WClass ) { case class'AA12AutoShotgun': if ( class'AA12AutoShotgun'.static.UnloadAssets() ) { class'AA12Fire'.static.UnloadAssets(); class'AA12Attachment'.static.UnloadAssets(); } break; case class'GoldenAA12AutoShotgun': if ( class'GoldenAA12AutoShotgun'.static.UnloadAssets() ) { class'GoldenAA12Fire'.static.UnloadAssets(); class'GoldenAA12Attachment'.static.UnloadAssets(); } break; case class'SPAutoShotgun': if ( class'SPAutoShotgun'.static.UnloadAssets() ) { class'SPShotgunFire'.static.UnloadAssets(); class'SPShotgunAltFire'.static.UnloadAssets(); class'SPShotgunAttachment'.static.UnloadAssets(); } break; case class'AK47AssaultRifle': if ( class'AK47AssaultRifle'.static.UnloadAssets() ) { class'AK47Fire'.static.UnloadAssets(); class'AK47Attachment'.static.UnloadAssets(); } break; case class'GoldenAK47AssaultRifle': if ( class'GoldenAK47AssaultRifle'.static.UnloadAssets() ) { class'GoldenAK47Fire'.static.UnloadAssets(); class'GoldenAK47Attachment'.static.UnloadAssets(); } break; case class'BenelliShotgun': if ( class'BenelliShotgun'.static.UnloadAssets() ) { class'BenelliFire'.static.UnloadAssets(); class'BenelliAttachment'.static.UnloadAssets(); } break; case class'GoldenBenelliShotgun': if ( class'GoldenBenelliShotgun'.static.UnloadAssets() ) { class'GoldenBenelliFire'.static.UnloadAssets(); class'GoldenBenelliAttachment'.static.UnloadAssets(); } break; case class'Chainsaw': if ( class'Chainsaw'.static.UnloadAssets() ) { class'ChainsawFire'.static.UnloadAssets(); class'ChainsawAltFire'.static.UnloadAssets(); class'ChainsawAttachment'.static.UnloadAssets(); } break; case class'GoldenChainsaw': if ( class'GoldenChainsaw'.static.UnloadAssets() ) { class'GoldenChainsawAttachment'.static.UnloadAssets(); } break; case class'Crossbow': if ( class'Crossbow'.static.UnloadAssets() ) { class'CrossbowArrow'.static.UnloadAssets(); class'CrossbowFire'.static.UnloadAssets(); class'CrossbowAttachment'.static.UnloadAssets(); } break; case class'FlameThrower': if ( class'FlameThrower'.static.UnloadAssets() ) { class'FlameBurstFire'.static.UnloadAssets(); class'FlameThrowerAttachment'.static.UnloadAssets(); } break; case class'BlowerThrower': if ( class'BlowerThrower'.static.UnloadAssets() ) { class'BlowerThrowerFire'.static.UnloadAssets(); class'BlowerThrowerAltFire'.static.UnloadAssets(); class'BlowerThrowerAttachment'.static.UnloadAssets(); } break; case class'GoldenFlameThrower': if ( class'GoldenFlameThrower'.static.UnloadAssets() ) { class'GoldenFlameBurstFire'.static.UnloadAssets(); class'GoldenFTAttachment'.static.UnloadAssets(); } break; case class'BoomStick': if ( class'BoomStick'.static.UnloadAssets() ) { class'BoomStickFire'.static.UnloadAssets(); class'BoomStickAltFire'.static.UnloadAssets(); class'BoomStickAttachment'.static.UnloadAssets(); } break; case class'KSGShotgun': if ( class'KSGShotgun'.static.UnloadAssets() ) { class'KSGFire'.static.UnloadAssets(); class'KSGAttachment'.static.UnloadAssets(); } break; case class'HuskGun': if ( class'HuskGun'.static.UnloadAssets() ) { class'HuskGunFire'.static.UnloadAssets(); class'HuskGunProjectile'.static.UnloadAssets(); class'HuskGunAttachment'.static.UnloadAssets(); } break; case class'ZEDGun': if ( class'ZEDGun'.static.UnloadAssets() ) { class'ZEDGunFire'.static.UnloadAssets(); class'ZEDGunAltFire'.static.UnloadAssets(); class'ZEDGunProjectile'.static.UnloadAssets(); class'ZEDGunAttachment'.static.UnloadAssets(); } break; case class'ZEDMKIIWeapon': if ( class'ZEDMKIIWeapon'.static.UnloadAssets() ) { class'ZEDMKIIFire'.static.UnloadAssets(); class'ZEDMKIIAltFire'.static.UnloadAssets(); class'ZEDMKIIPrimaryProjectile'.static.UnloadAssets(); class'ZEDMKIISecondaryProjectile'.static.UnloadAssets(); class'ZEDMKIIAttachment'.static.UnloadAssets(); } break; case class'Katana': if ( class'Katana'.static.UnloadAssets() ) { class'KatanaFire'.static.UnloadAssets(); class'KatanaFireB'.static.UnloadAssets(); class'KatanaAttachment'.static.UnloadAssets(); } break; case class'GoldenKatana': if ( class'GoldenKatana'.static.UnloadAssets() ) { class'KatanaFire'.static.UnloadAssets(); class'KatanaFireB'.static.UnloadAssets(); class'GoldenKatanaAttachment'.static.UnloadAssets(); } break; case class'ClaymoreSword': if ( class'ClaymoreSword'.static.UnloadAssets() ) { class'ClaymoreSwordFire'.static.UnloadAssets(); class'ClaymoreSwordFireB'.static.UnloadAssets(); class'ClaymoreSwordAttachment'.static.UnloadAssets(); } break; case class'DwarfAxe': if ( class'DwarfAxe'.static.UnloadAssets() ) { class'DwarfAxeFire'.static.UnloadAssets(); class'DwarfAxeFireB'.static.UnloadAssets(); class'DwarfAxeAttachment'.static.UnloadAssets(); } break; case class'FNFAL_ACOG_AssaultRifle': if ( class'FNFAL_ACOG_AssaultRifle'.static.UnloadAssets() ) { class'FNFALFire'.static.UnloadAssets(); class'FNFAL_ACOG_Attachment'.static.UnloadAssets(); } break; case class'LAW': if ( class'LAW'.static.UnloadAssets() ) { class'LAWFire'.static.UnloadAssets(); class'LAWProj'.static.UnloadAssets(); class'LAWAttachment'.static.UnloadAssets(); } break; case class'M14EBRBattleRifle': if ( class'M14EBRBattleRifle'.static.UnloadAssets() ) { class'M14EBRFire'.static.UnloadAssets(); class'M14EBRAttachment'.static.UnloadAssets(); } break; case class'M4AssaultRifle': if ( class'M4AssaultRifle'.static.UnloadAssets() ) { class'M4Fire'.static.UnloadAssets(); class'M4Attachment'.static.UnloadAssets(); } break; case class'M32GrenadeLauncher': if ( class'M32GrenadeLauncher'.static.UnloadAssets() ) { class'M32Fire'.static.UnloadAssets(); class'M32GrenadeProjectile'.static.UnloadAssets(); class'M32Attachment'.static.UnloadAssets(); } break; case class'M79GrenadeLauncher': if ( class'M79GrenadeLauncher'.static.UnloadAssets() ) { class'M79Fire'.static.UnloadAssets(); class'M79GrenadeProjectile'.static.UnloadAssets(); class'M79Attachment'.static.UnloadAssets(); } break; case class'GoldenM79GrenadeLauncher': if ( class'GoldenM79GrenadeLauncher'.static.UnloadAssets() ) { class'GoldenM79Fire'.static.UnloadAssets(); class'M79GrenadeProjectile'.static.UnloadAssets(); class'GoldenM79Attachment'.static.UnloadAssets(); } break; case class'M4203AssaultRifle': if ( class'M4203AssaultRifle'.static.UnloadAssets() ) { class'M4203BulletFire'.static.UnloadAssets(); class'M203Fire'.static.UnloadAssets(); class'M203GrenadeProjectile'.static.UnloadAssets(); class'M4203Attachment'.static.UnloadAssets(); } break; case class'M7A3MMedicGun': if ( class'M7A3MMedicGun'.static.UnloadAssets() ) { class'M7A3MFire'.static.UnloadAssets(); class'M7A3MAltFire'.static.UnloadAssets(); class'M7A3MHealinglProjectile'.static.UnloadAssets(); class'M7A3MAttachment'.static.UnloadAssets(); } break; case class'M99SniperRifle': if ( class'M99SniperRifle'.static.UnloadAssets() ) { class'M99Bullet'.static.UnloadAssets(); class'M99Fire'.static.UnloadAssets(); class'M99Attachment'.static.UnloadAssets(); } break; case class'MAC10MP': if ( class'MAC10MP'.static.UnloadAssets() ) { class'MAC10Fire'.static.UnloadAssets(); class'MAC10Attachment'.static.UnloadAssets(); } break; case class'Magnum44Pistol': if ( class'Magnum44Pistol'.static.UnloadAssets() ) { class'Magnum44Fire'.static.UnloadAssets(); class'Magnum44Attachment'.static.UnloadAssets(); } break; case class'MK23Pistol': if ( class'MK23Pistol'.static.UnloadAssets() ) { class'MK23Fire'.static.UnloadAssets(); class'MK23Attachment'.static.UnloadAssets(); } break; case class'MKb42AssaultRifle': if ( class'MKb42AssaultRifle'.static.UnloadAssets() ) { class'MKb42Fire'.static.UnloadAssets(); class'MKb42Attachment'.static.UnloadAssets(); } break; case class'MP7MMedicGun': if ( class'MP7MMedicGun'.static.UnloadAssets() ) { class'MP7MFire'.static.UnloadAssets(); class'MP7MAltFire'.static.UnloadAssets(); class'MP7MHealinglProjectile'.static.UnloadAssets(); class'MP7MAttachment'.static.UnloadAssets(); } break; case class'KrissMMedicGun': if ( class'KrissMMedicGun'.static.UnloadAssets() ) { class'KrissMFire'.static.UnloadAssets(); class'KrissMAltFire'.static.UnloadAssets(); class'KrissMHealingProjectile'.static.UnloadAssets(); class'KrissMAttachment'.static.UnloadAssets(); } break; case class'MP5MMedicGun': if ( class'MP5MMedicGun'.static.UnloadAssets() ) { class'MP5MFire'.static.UnloadAssets(); class'MP5MAltFire'.static.UnloadAssets(); class'MP5MHealinglProjectile'.static.UnloadAssets(); class'MP5MAttachment'.static.UnloadAssets(); } break; case class'PipeBombExplosive': if ( class'PipeBombExplosive'.static.UnloadAssets() ) { class'PipeBombProjectile'.static.UnloadAssets(); class'PipeBombAttachment'.static.UnloadAssets(); } break; case class'SCARMK17AssaultRifle': if ( class'SCARMK17AssaultRifle'.static.UnloadAssets() ) { class'SCARMK17Fire'.static.UnloadAssets(); class'SCARMK17Attachment'.static.UnloadAssets(); } break; case class'SealSquealHarpoonBomber': if ( class'SealSquealHarpoonBomber'.static.UnloadAssets() ) { class'SealSquealFire'.static.UnloadAssets(); class'SealSquealProjectile'.static.UnloadAssets(); class'SealSquealAttachment'.static.UnloadAssets(); } case class'SeekerSixRocketLauncher': if ( class'SeekerSixRocketLauncher'.static.UnloadAssets() ) { class'SeekerSixFire'.static.UnloadAssets(); class'SeekerSixRocketProjectile'.static.UnloadAssets(); class'SeekerSixSeekingRocketProjectile'.static.UnloadAssets(); class'SeekerSixAttachment'.static.UnloadAssets(); } case class'Trenchgun': if ( class'Trenchgun'.static.UnloadAssets() ) { class'TrenchgunFire'.static.UnloadAssets(); class'TrenchgunBullet'.static.UnloadAssets(); class'TrenchgunAttachment'.static.UnloadAssets(); } case class'NailGun': if ( class'NailGun'.static.UnloadAssets() ) { class'NailGunFire'.static.UnloadAssets(); class'NailGunProjectile'.static.UnloadAssets(); class'NailGunAltFire'.static.UnloadAssets(); class'NailGunAttachment'.static.UnloadAssets(); } break; case class'ThompsonSMG': if ( class'ThompsonSMG'.static.UnloadAssets() ) { class'ThompsonFire'.static.UnloadAssets(); class'ThompsonAttachment'.static.UnloadAssets(); } break; case class'ThompsonDrumSMG': if ( class'ThompsonDrumSMG'.static.UnloadAssets() ) { class'ThompsonDrumFire'.static.UnloadAssets(); class'ThompsonDrumAttachment'.static.UnloadAssets(); } break; case class'Crossbuzzsaw': if ( class'Crossbuzzsaw'.static.UnloadAssets() ) { class'CrossbuzzsawFire'.static.UnloadAssets(); class'CrossbuzzsawBlade'.static.UnloadAssets(); class'CrossbuzzsawAttachment'.static.UnloadAssets(); } break; case class'Scythe': if ( class'Scythe'.static.UnloadAssets() ) { class'ScytheFire'.static.UnloadAssets(); class'ScytheAttachment'.static.UnloadAssets(); } break; case class'SPGrenadeLauncher': if ( class'SPGrenadeLauncher'.static.UnloadAssets() ) { class'SPGrenadeFire'.static.UnloadAssets(); class'SPGrenadeProjectile'.static.UnloadAssets(); class'SPGrenadeAttachment'.static.UnloadAssets(); } break; case class'SPSniperRifle': if ( class'SPSniperRifle'.static.UnloadAssets() ) { class'SPSniperFire'.static.UnloadAssets(); class'SPSniperAttachment'.static.UnloadAssets(); } break; case class'SPThompsonSMG': if ( class'SPThompsonSMG'.static.UnloadAssets() ) { class'SPThompsonFire'.static.UnloadAssets(); class'SPThompsonAttachment'.static.UnloadAssets(); } break; case class'FlareRevolver': if ( class'FlareRevolver'.static.UnloadAssets() ) { class'FlareRevolverFire'.static.UnloadAssets(); class'FlareRevolverProjectile'.static.UnloadAssets(); class'FlareRevolverAttachment'.static.UnloadAssets(); } break; case class'CamoM4AssaultRifle': if ( class'CamoM4AssaultRifle'.static.UnloadAssets() ) { class'CamoM4Fire'.static.UnloadAssets(); class'CamoM4Attachment'.static.UnloadAssets(); } break; case class'CamoM32GrenadeLauncher': if ( class'CamoM32GrenadeLauncher'.static.UnloadAssets() ) { class'CamoM32Fire'.static.UnloadAssets(); class'M32GrenadeProjectile'.static.UnloadAssets(); class'CamoM32Attachment'.static.UnloadAssets(); } break; case class'CamoMP5MMedicGun': if ( class'CamoMP5MMedicGun'.static.UnloadAssets() ) { class'CamoMP5MFire'.static.UnloadAssets(); class'MP5MAltFire'.static.UnloadAssets(); class'MP5MHealinglProjectile'.static.UnloadAssets(); class'CamoMP5MAttachment'.static.UnloadAssets(); } break; case class'CamoShotgun': if ( class'CamoShotgun'.static.UnloadAssets() ) { class'CamoShotgunFire'.static.UnloadAssets(); class'CamoShotgunAttachment'.static.UnloadAssets(); } break; case class'NeonAK47AssaultRifle': if ( class'NeonAK47AssaultRifle'.static.UnloadAssets() ) { class'NeonAK47Fire'.static.UnloadAssets(); class'NeonAK47Attachment'.static.UnloadAssets(); } break; case class'NeonKrissMMedicGun': if ( class'NeonKrissMMedicGun'.static.UnloadAssets() ) { class'NeonKrissMFire'.static.UnloadAssets(); class'KrissMAltFire'.static.UnloadAssets(); class'KrissMHealingProjectile'.static.UnloadAssets(); class'NeonKrissMAttachment'.static.UnloadAssets(); } break; case class'NeonSCARMK17AssaultRifle': if ( class'NeonSCARMK17AssaultRifle'.static.UnloadAssets() ) { class'NeonSCARMK17Fire'.static.UnloadAssets(); class'NeonSCARMK17Attachment'.static.UnloadAssets(); } break; case class'NeonKSGShotgun': if ( class'NeonKSGShotgun'.static.UnloadAssets() ) { class'NeonKSGFire'.static.UnloadAssets(); class'NeonKSGAttachment'.static.UnloadAssets(); } break; } } simulated function WeaponPulloutRemark(int RemarkIndex) { if ( FRand() < 0.10 && Level.TimeSeconds - LastWeaponPulloutMessageTime > WeaponPulloutMessageDelay ) { Speech('AUTO', RemarkIndex, ""); LastWeaponPulloutMessageTime = Level.TimeSeconds; } } function JoinedAsSpectatorOnly() { if ( Pawn != None ) Pawn.Died(self, class'DamageType', Pawn.Location); if ( PlayerReplicationInfo.Team != None ) PlayerReplicationInfo.Team.RemoveFromTeam(self); PlayerReplicationInfo.Team = None; ServerSpectate(); BroadcastLocalizedMessage(Level.Game.GameMessageClass, 14, PlayerReplicationInfo); ClientBecameSpectator(); } // for changing character on the fly (for next respawn) exec function ChangeCharacter(string newCharacter, optional string inClass) { if ( NewCharacter != "" && CharacterAvailable(newCharacter) ) { SetPawnClass(string(PawnClass), newCharacter); UpdateURL("Character", newCharacter, true); SaveConfig(); } } exec event SetProgressMessage( int Index, string S, color C ) { if ( Index < ArrayCount(ProgressMessage) ) { ProgressMessage[Index] = S; ProgressColor[Index] = C; } AddRandomOffset(); } simulated function AddRandomOffset() { local float MyOffsetX, MyOffsetY; MyOffsetX = Rand(30) + 20; MyOffsetY = Rand(30) + 20; if ( Rand(10) > 5 ) { MyOffsetX *= -1; } if ( Rand(10) > 5 ) { MyOffsetY *= -1; } RandXOffset = MyOffsetX; RandYOffset = MyOffsetY; } simulated function ClientForceCollectGarbage() { ConsoleCommand("obj garbage"); } simulated function ClientPickedup( KFGrabbable item ) { KFSteamStatsAndAchievements(SteamStatsAndAchievements).ZEDPieceGrabbed(); } function ClientShakeView(vector shRotMag, vector shRotRate, float shRotTime, vector shOffsetMag, vector shOffsetRate, float shOffsetTime) { ShakeView( shRotMag, shRotRate, shRotTime, shOffsetMag, shOffsetRate, shOffsetTime ); } function bool IsInInventory(class PickupToCheck, bool bCheckForEquivalent, bool bCheckForVariant) { local Inventory CurInv; local class InvPickupClass; local class CheckPickupClass; local class VariantPickupClass; local int i; for ( CurInv = Pawn.Inventory; CurInv != none; CurInv = CurInv.Inventory ) { if ( bCheckForEquivalent && CurInv.default.PickupClass == PickupToCheck ) { return true; } if( !bCheckForVariant ) { continue; } // check if Item is variant of normal inventory item InvPickupClass = class(CurInv.default.PickupClass); if( InvPickupClass != none ) { for( i = 0; i < InvPickupClass.default.VariantClasses.Length; ++i ) { VariantPickupClass = class(InvPickupClass.default.VariantClasses[i]); if( VariantPickupClass != none && VariantPickupClass == PickupToCheck ) { return true; } } } // check if Item is normal version of variant inventory item CheckPickupClass = class(PickupToCheck); if( CheckPickupClass != none ) { for( i = 0; i < CheckPickupClass.default.VariantClasses.Length; ++i ) { VariantPickupClass = class(CheckPickupClass.default.VariantClasses[i]); if( VariantPickupClass != none && VariantPickupClass == CurInv.default.PickupClass ) { return true; } } } } return false; } defaultproperties { bShowHints=true bHadZED=false BuyListHeaders(0)="My Inventory" BuyListHeaders(1)="Melee" BuyListHeaders(2)="Power" BuyListHeaders(3)="Speed" BuyListHeaders(4)="Range" BuyListHeaders(5)="Ammo" BuyListHeaders(6)="Equipment" LibraryListHeaders(0)="BackStory" LibraryListHeaders(1)="Equipment" LibraryListHeaders(2)="Enemies" bBehindView=True CheatClass=class'KFMod.KFCheatManager' TeamBeaconTexture=none//Texture'ONSInterface-TX.HealthBar' KFTODO: Replace this LobbyMenuClassString="KFGUI.LobbyMenu" MidGameMenuClass="KFGUI.KFInvasionLoginMenu" PlayerReplicationInfoClass=class'KFMod.KFPlayerReplicationInfo' bPendingLobbyDisplay=true SteamStatsAndAchievementsClass=class'ROEngine.KFSteamStatsAndAchievements' YouAreNowPerkString="You are now a '%Perk%'" YouWillBecomePerkString="You will become a '%Perk%' at the end of this Wave" PerkChangeOncePerWaveString="You can only change your Perk once per Wave" PerkFirstLevelUnlockedString="You have unlocked Level 1 of the %x Perk.|To change your active Perk, hit Escape, click Perks, and select a new Perk from the list." PerkUnlockedString="You have unlocked a new Perk Level:|%x" TraderPathInterval=1.1 bWantsTraderPath=true bUseTrueWideScreenFOV=true }