From 6e24cb964dde56678478b7533b8dd4751495a9d4 Mon Sep 17 00:00:00 2001 From: chacha <15073640+cclecle@users.noreply.github.com> Date: Wed, 28 Jan 2026 23:43:10 +0000 Subject: [PATCH] change directory structure and update make process --- .../SmartCTF.uc => Classes/SmartCTF.UC | 7292 ++++++++--------- .../SmartCTFAudioMsg.UC | 0 .../SmartCTFBinds.UC | 16 +- .../SmartCTFCoolMsg.UC | 200 +- .../SmartCTFEndStats.UC | 64 +- .../SmartCTFEnhancedDeathMessagePlus.UC | 108 +- .../SmartCTFEnhancedMultiKillMessage.UC | 216 +- .../SmartCTFFlagCheckerInventory.UC | 76 +- .../SmartCTFGameReplicationInfo.UC | 418 +- .../SmartCTFMessage.UC | 194 +- .../SmartCTFPlayerReplicationInfo.UC | 384 +- .../SmartCTFScoreBoard.UC | 2186 ++--- Classes/SmartCTFScoreBoard.UC.bak | 1094 +++ .../SmartCTFServerActor.UC | 32 +- .../SmartCTFServerInfo.UC | 750 +- .../SmartCTFSnowyScoreboard.UC | 856 +- .../SmartCTFSpawnNotifyPRI.UC | 78 +- .../SmartCTFSpreeMsg.UC | 36 +- .../SmartCTFWelcomeNewPlayers.UC | 366 +- Readme.md | 0 {Sources/Sounds => Sounds}/AirKill.WAV | Bin {Sources/Sounds => Sounds}/Denied.WAV | Bin {Sources/Sounds => Sounds}/HolyShit.wav | Bin {Sources/Sounds => Sounds}/LudicrousKill.wav | Bin {Sources/Sounds => Sounds}/welcome.wav | Bin Sources/make.bat | 2 - System/SmartCTF_ChaChaV6.u | Bin 0 -> 717152 bytes {Sources/Textures => Textures}/faceless.pcx | Bin {Sources/Textures => Textures}/meter.pcx | Bin {Sources/Textures => Textures}/powered.pcx | Bin {Sources/Textures => Textures}/presents.pcx | Bin {Sources/Textures => Textures}/santa.pcx | Bin {Sources/Textures => Textures}/shade.pcx | Bin .../SnowFlake1.pcx => Textures/snowFlake1.pcx | Bin .../snowFlake10.pcx | Bin .../snowFlake11.pcx | Bin .../snowFlake12.pcx | Bin .../snowFlake13.pcx | Bin .../snowFlake14.pcx | Bin .../snowFlake15.pcx | Bin .../snowFlake16.pcx | Bin .../SnowFlake2.pcx => Textures/snowFlake2.pcx | Bin .../SnowFlake3.pcx => Textures/snowFlake3.pcx | Bin .../SnowFlake4.pcx => Textures/snowFlake4.pcx | Bin .../SnowFlake5.pcx => Textures/snowFlake5.pcx | Bin .../SnowFlake6.pcx => Textures/snowFlake6.pcx | Bin .../SnowFlake7.pcx => Textures/snowFlake7.pcx | Bin .../SnowFlake8.pcx => Textures/snowFlake8.pcx | Bin .../SnowFlake9.pcx => Textures/snowFlake9.pcx | Bin make.bat | 6 + make.ini | 31 + 51 files changed, 7767 insertions(+), 6638 deletions(-) rename Sources/Classes/SmartCTF.uc => Classes/SmartCTF.UC (96%) rename Sources/Classes/SmartCTFAudioMsg.uc => Classes/SmartCTFAudioMsg.UC (100%) rename Sources/Classes/SmartCTFBinds.uc => Classes/SmartCTFBinds.UC (95%) rename Sources/Classes/SmartCTFCoolMsg.uc => Classes/SmartCTFCoolMsg.UC (96%) rename Sources/Classes/SmartCTFEndStats.uc => Classes/SmartCTFEndStats.UC (97%) rename Sources/Classes/SmartCTFEnhancedDeathMessagePlus.uc => Classes/SmartCTFEnhancedDeathMessagePlus.UC (97%) rename Sources/Classes/SmartCTFEnhancedMultiKillMessage.uc => Classes/SmartCTFEnhancedMultiKillMessage.UC (96%) rename Sources/Classes/SmartCTFFlagCheckerInventory.uc => Classes/SmartCTFFlagCheckerInventory.UC (97%) rename Sources/Classes/SmartCTFGameReplicationInfo.uc => Classes/SmartCTFGameReplicationInfo.UC (96%) rename Sources/Classes/SmartCTFMessage.uc => Classes/SmartCTFMessage.UC (96%) rename Sources/Classes/SmartCTFPlayerReplicationInfo.uc => Classes/SmartCTFPlayerReplicationInfo.UC (95%) rename Sources/Classes/SmartCTFScoreBoard.uc => Classes/SmartCTFScoreBoard.UC (96%) create mode 100644 Classes/SmartCTFScoreBoard.UC.bak rename Sources/Classes/SmartCTFServerActor.uc => Classes/SmartCTFServerActor.UC (95%) rename Sources/Classes/SmartCTFServerInfo.uc => Classes/SmartCTFServerInfo.UC (96%) rename Sources/Classes/SmartCTFSnowyScoreboard.uc => Classes/SmartCTFSnowyScoreboard.UC (98%) rename Sources/Classes/SmartCTFSpawnNotifyPRI.uc => Classes/SmartCTFSpawnNotifyPRI.UC (95%) rename Sources/Classes/SmartCTFSpreeMsg.uc => Classes/SmartCTFSpreeMsg.UC (97%) rename {Sources/Classes => Classes}/SmartCTFWelcomeNewPlayers.UC (96%) create mode 100644 Readme.md rename {Sources/Sounds => Sounds}/AirKill.WAV (100%) rename {Sources/Sounds => Sounds}/Denied.WAV (100%) rename {Sources/Sounds => Sounds}/HolyShit.wav (100%) rename {Sources/Sounds => Sounds}/LudicrousKill.wav (100%) rename {Sources/Sounds => Sounds}/welcome.wav (100%) delete mode 100644 Sources/make.bat create mode 100644 System/SmartCTF_ChaChaV6.u rename {Sources/Textures => Textures}/faceless.pcx (100%) rename {Sources/Textures => Textures}/meter.pcx (100%) rename {Sources/Textures => Textures}/powered.pcx (100%) rename {Sources/Textures => Textures}/presents.pcx (100%) rename {Sources/Textures => Textures}/santa.pcx (100%) rename {Sources/Textures => Textures}/shade.pcx (100%) rename Sources/Textures/SnowFlake1.pcx => Textures/snowFlake1.pcx (100%) rename Sources/Textures/SnowFlake10.pcx => Textures/snowFlake10.pcx (100%) rename Sources/Textures/SnowFlake11.pcx => Textures/snowFlake11.pcx (100%) rename Sources/Textures/SnowFlake12.pcx => Textures/snowFlake12.pcx (100%) rename Sources/Textures/SnowFlake13.pcx => Textures/snowFlake13.pcx (100%) rename Sources/Textures/SnowFlake14.pcx => Textures/snowFlake14.pcx (100%) rename Sources/Textures/SnowFlake15.pcx => Textures/snowFlake15.pcx (100%) rename Sources/Textures/SnowFlake16.pcx => Textures/snowFlake16.pcx (100%) rename Sources/Textures/SnowFlake2.pcx => Textures/snowFlake2.pcx (100%) rename Sources/Textures/SnowFlake3.pcx => Textures/snowFlake3.pcx (100%) rename Sources/Textures/SnowFlake4.pcx => Textures/snowFlake4.pcx (100%) rename Sources/Textures/SnowFlake5.pcx => Textures/snowFlake5.pcx (100%) rename Sources/Textures/SnowFlake6.pcx => Textures/snowFlake6.pcx (100%) rename Sources/Textures/SnowFlake7.pcx => Textures/snowFlake7.pcx (100%) rename Sources/Textures/SnowFlake8.pcx => Textures/snowFlake8.pcx (100%) rename Sources/Textures/SnowFlake9.pcx => Textures/snowFlake9.pcx (100%) create mode 100644 make.bat create mode 100644 make.ini diff --git a/Sources/Classes/SmartCTF.uc b/Classes/SmartCTF.UC similarity index 96% rename from Sources/Classes/SmartCTF.uc rename to Classes/SmartCTF.UC index 5977b13..ca48343 100644 --- a/Sources/Classes/SmartCTF.uc +++ b/Classes/SmartCTF.UC @@ -1,3646 +1,3646 @@ -// SmartCTF 4 by {PiN}Kev. Released January 2004. -// SmartCTF 4A Tweaked by {DnF2}SiNiSTeR. Released December 2004. -// SmartCTF 4B/4C Uber Massively tweaked by {DnF2}SiNiSTeR. Released March 2005. -// SmartCTF 4D with IpToCountry by [es]Rush. Released January 2006. -// SmartCTF 4D++ by adminthis. Released October 2008. -// SmartCTF 4E by adminthis & The_Cowboy & Sp0ngeb0b. Released December 2009. -// SmartCTF ChaChaV1 by chacha. 2023: -// - Add bLongRangeSuperShock option to allow bShowLongRangeMsg with SuperShockRifle -// - Fix compilation warnings -// SmartCTF ChaChaV2 by chacha. 2023: -// - Add Denied & AirKill Features -// SmartCTF ChaChaV3 by chacha. 2023: -// - Ajout mémorisation joueur vus par le serveur (couple Name+IP) -// - Messages de welcome et welcomback (reglable) -// - Audio de welcome (desactivable) -// - Correction Kill-In-The-air quand on tombe -// - Fix Access None sur Denied -// SmartCTF ChaChaV4 by chacha. 2023: -// - Fix Access None (TGRPI / PRI) -// - Fix Denied Message -// SmartCTF ChaChaV5 by chacha. 2023: -// - Add LudicrousKill & HolyShit Msg / Sounds -// - Fix accessed none KillInTheAir -// SmartCTF ChaChaV6 by chacha. 2023: -// - Recompile without SmartCTF_4E aside -// -// -// This mod changes the point system and adds features to ultimately promote Teamwork in CTF. -// This is a CTF Mod only. It will not load in any other gametype. -// -// Contact Info: private Message me, {PiN}Hai-Ping, on http://forums.prounreal.com -// {DnF2}SiNiSTeR @ #DutchNet [QuakeNet IRC] -// or if it is about version 4D explicictly -// Rush on unrealadmin.org forums / mail and msn: rush@u.one.pl -// or if it is about version 4D++ explicictly -// adminthis on unrealadmin.org -// -// or if it is about about version 4E -// The_Cowboy on unrealadmin.org -// Sp0ngeb0b on unrealadmin.org , or spongebobut@yahoo.com -// SnowyScoreboard added in 4E. Supported by Sp0ngeb0b. -// -// CHANGELOG: See Readme -// TO DO:Improve algorithm of storing stats -class SmartCTF expands Mutator config( SmartCTF_ChaCha ); - -#exec texture IMPORT NAME=meter FILE=Textures\meter.pcx GROUP=SmartCTF MIPS=OFF -#exec texture IMPORT NAME=shade File=Textures\shade.pcx GROUP=SmartCTF MIPS=OFF -#exec texture IMPORT NAME=powered File=Textures\powered.pcx GROUP=SmartCTF MIPS=OFF - -/* Server Vars */ -var SmartCTFGameReplicationInfo SCTFGame; -var byte RedAstIndex, BlueAstIndex; -var byte TRCount; -var string Version, GameTieMessage; -var Pawn FCs[2], RedAssisters[32], BlueAssisters[32]; -var Pawn RedFlagCarrier[32], BlueFlagCarrier[32]; -var float RedFlagCarrierTime[32], BlueFlagCarrierTime[32]; -var byte RedFCIndex, BlueFCIndex; -var float RedAssistTimes[32], BlueAssistTimes[32], PickupTime[2]; -var FlagBase FlagStands[2]; -var bool bForcedEndGame, bTournamentGameStarted, bTooCloseForSaves, bStartTimeCorrected; -var int MsgPID; -var string GoneName[32]; //list of disconnected players -var string GoneIP[32]; //corresponding IP addy -var float GoneScore[32]; //corresponding scores -var float GoneDeaths[32]; //corresponding deaths -var SmartCTFPlayerReplicationInfo GoneStats[32];//corresponding smartCTF stats -var string StoreName[32]; //list of stored playernames -var float StoreScore[32]; //corresponding scores -var float StoreDeaths[32]; //corresponding deaths -var string StoreIP[32]; //corresponding IP addy -var SmartCTFPlayerReplicationInfo StoreStats[32];//corresponding stored smartCTF stats -// First backup array -var string B1Name[32]; //list of stored playernames -var float B1Score[32]; //corresponding scores -var float B1Deaths[32]; //corresponding deaths -var string B1IP[32]; //corresponding IP addy -var SmartCTFPlayerReplicationInfo B1Stats[32];//corresponding stored smartCTF stats -// Second backup array -var string B2Name[32]; //list of stored playernames -var float B2Score[32]; //corresponding scores -var float B2Deaths[32]; //corresponding deaths -var string B2IP[32]; //corresponding IP addy -var SmartCTFPlayerReplicationInfo B2Stats[32];//corresponding stored smartCTF stats -var string QuitMsg; //the broadcast message when someone leaves the game -var int QuitMsgLen; //length of QuitMsg - -/* Client Vars */ -var bool bClientJoinPlayer, bGameEnded, bInitSb; -var int LogoCounter, DrawLogo, SbCount; -var float SbDelayC; -var PlayerPawn PlayerOwner; -var FontInfo MyFonts; -var TournamentGameReplicationInfo pTGRI; -var PlayerReplicationInfo pPRI; -var ChallengeHUD MyHUD; -var Color RedTeamColor, BlueTeamColor, White, Gray; - -/* Server Vars Configurable */ -var() config bool bEnabled; -var() config bool bExtraStats; -var() config string CountryFlagsPackage; -var(SmartCTFBonuses) config int CapBonus, AssistBonus, FlagKillBonus, CoverBonus, SealBonus, GrabBonus; -var(SmartCTFBonuses) config float BaseReturnBonus, MidReturnBonus, EnemyBaseReturnBonus, CloseSaveReturnBonus; -var(SmartCTFBonuses) config int SpawnKillPenalty, MinimalCapBonus; -var() config bool bFixFlagBug; -var() config bool bEnhancedMultiKill; -var() config byte EnhancedMultiKillBroadcast; -var() config bool bShowFCLocation; -var() config bool bSmartCTFServerInfo; -var() config bool bNewCapAssistScoring; -var() config bool bSpawnkillDetection; -var() config float SpawnKillTimeArena; -var() config float SpawnKillTimeNW; -var() config bool bAfterGodLikeMsg; -var() config bool bStatsDrawFaces; -var() config bool bDrawLogo; -var() config bool bSCTFSbDef; -var() config bool bShowSpecs; -var() config color SpectatorColor; -var() config bool bDoKeybind; -var() config bool bExtraMsg; -var() config float SbDelay; -var() config float MsgDelay; -var() config bool bStoreStats; -var() config bool bSnowyScoreboard; -var() config bool bXmasImages; -var(SmartCTFMessages) config byte CoverMsgType; -var(SmartCTFMessages) config byte CoverSpreeMsgType; -var(SmartCTFMessages) config byte SealMsgType; -var(SmartCTFMessages) config byte SavedMsgType; -var(SmartCTFMessages) config byte DeniedMsgType; -var(SmartCTFMessages) config bool bShowLongRangeMsg; -var(SmartCTFMessages) config bool bLongRangeSuperShock; -var(SmartCTFMessages) config bool bShowSpawnKillerGlobalMsg; -var(SmartCTFMessages) config bool bShowAssistConsoleMsg; -var(SmartCTFMessages) config bool bShowSealRewardConsoleMsg; -var(SmartCTFMessages) config bool bShowCoverRewardConsoleMsg; -var(SmartCTFSounds) config bool bPlayCaptureSound; -var(SmartCTFSounds) config bool bPlayAssistSound; -var(SmartCTFSounds) config bool bPlaySavedSound; -var(SmartCTFSounds) config bool bPlayLeadSound; -var(SmartCTFSounds) config bool bPlayDeniedSound; -var(SmartCTFSounds) config bool bPlay30SecSound; -var(SmartCTFSounds) config bool bPlayAirKillSound; -var(OvertimeControl) config bool bEnableOvertimeControl; -var(OvertimeControl) config bool bOvertime; -var(OvertimeControl) config bool bRememberOvertimeSetting; - -var texture powered; - -/* - * Check if we should spawn a SmartCTF instance. - * This check doesn't seem to work properly in PostBeginPlay, hence here. -*/ -event Spawned() -{ - super.Spawned(); - - SCTFGame = Level.Game.Spawn( class'SmartCTFGameReplicationInfo' ); - - if( !ValidateSmartCTFMutator() ) - { - SCTFGame.Destroy(); - Destroy(); - } -} - -/* - * Get the original Scoreboard and store for SmartCTFScoreboard reference. -*/ -function PreBeginPlay() -{ - local Mutator M; - - super.PreBeginPlay(); - SCTFGame.NormalScoreBoardClass = Level.Game.ScoreBoardType; - if (bSnowyScoreboard) - { - level.game.scoreBoardType = class'SmartCTFSnowyScoreboard'; - } - else - { - Level.Game.ScoreBoardType = class'SmartCTFScoreBoard'; - } - //Level.Game.default.ScoreBoardType = class'SmartCTFScoreBoard'; - // The above line was fatal in version 4B :E - - Log( "Original Scoreboard determined as" @ SCTFGame.NormalScoreBoardClass, 'SmartCTF' ); - - // Change F2 Server Info screen, compatible with UTPure - if( bSmartCTFServerInfo ) - { - class( Level.Game.HUDType ).default.ServerInfoClass = class'SmartCTFServerInfo'; - for( M = Level.Game.BaseMutator; M != None; M = M.NextMutator ) - { - if( M.IsA( 'UTPure' ) ) // Let UTPure rehandle the scoreboard - { - M.PreBeginPlay(); - SCTFGame.bServerInfoSetServerSide = True; // No need for the old fashioned way - it can be set server side. - Log( "Notified UTPure HUD to use SmartCTF ServerInfo.", 'SmartCTF' ); - break; - } - } - if( SCTFGame.bServerInfoSetServerSide && Level.Game.HUDType.Name != 'PureCTFHUD' ) - { - // In this scenario another mod intervered and we still have to do it the old fashion way. - SCTFGame.bServerInfoSetServerSide = False; - Log( "HUD is not the UTPure HUD but" @ Level.Game.HUDType.Name $ ", so SmartCTF ServerInfo will be set clientside.", 'SmartCTF' ); - } - if( !SCTFGame.bServerInfoSetServerSide ) - { - SCTFGame.DefaultHUDType = Level.Game.HUDType; // And in the old fashion way, the client will have to know the current HUD type. - } - } - else - { - SCTFGame.bServerInfoSetServerSide = True; // We didn't change anything, but neither do we want clientside intervention. - } -} - -/* - * Startup and initialize. -*/ -function PostBeginPlay() -{ - local FlagBase fb; - - Level.Game.Spawn( class'SmartCTFSpawnNotifyPRI'); - SCTFGame.WelcomeNewPlayers = Spawn( class'SmartCTFWelcomeNewPlayers'); - SCTFGame.WelcomeNewPlayers.SaveConfig(); - - SaveConfig(); // Create the .ini if its not already there. - - //Register as a message mutator, as we'll be using message monitoring - //to perform some of our code. If not registered, then many message - //events will not be passed to our mutator. - Level.Game.RegisterMessageMutator( self ); - - // Since we have problem replicating config variables... - SCTFGame.bShowFCLocation = bShowFCLocation; - SCTFGame.bPlay30SecSound = bPlay30SecSound; - SCTFGame.bStatsDrawFaces = bStatsDrawFaces; - SCTFGame.bDrawLogo = bDrawLogo; - SCTFGame.bExtraStats = bExtraStats; - SCTFGame.CountryFlagsPackage = CountryFlagsPackage; - SCTFGame.bSCTFSbDef = bSCTFSbDef; - SCTFGame.bShowSpecs = bShowSpecs; - SCTFGame.bDoKeybind = bDoKeybind; - SCTFGame.SbDelayC = SbDelayC; - SCTFGame.SpectatorColor = SpectatorColor; - SCTFGame.bSnowyScoreboard = bSnowyScoreboard; - SCTFGame.bXmasImages = bXmasImages; - - if( !bRememberOvertimeSetting ) - { - bOvertime = True; - } - - // Works serverside! - if( bEnhancedMultiKill ) - { - Level.Game.DeathMessageClass = class'SmartCTFEnhancedDeathMessagePlus'; - } - - // Get the Flag bases - ForEach AllActors( class'FlagBase', fb ) - { - FlagStands[ fb.Team ] = fb; - } - - if( VSize( FlagStands[0].Location - FlagStands[1].Location ) < 1.5 * 900 ) - { - bTooCloseForSaves = True; - } - - SCTFGame.EndStats = Spawn( class'SmartCTFEndStats', self ); - - super.PostBeginPlay(); - - if( Level.NetMode == NM_DedicatedServer ) - { - SetTimer( 1.0 , True); - } - - MsgPID=-1; // First PID is 0, so it wouldn't get messaged if we kept MsgPID at it's default value. - - if(bStoreStats == True) - { - //Register as a damage mutator, as we'll be using damage checks to - //update the stored information (new in v3.2). - Level.Game.RegisterDamageMutator(self); - - //Grab some basic info about the player left message. - QuitMsg=Level.Game.LeftMessage; - QuitMsgLen=Len(QuitMsg); - - } - Log( "SmartCTF" @ Version @ "loaded successfully.", 'SmartCTF' ); -} - -/* - * Returns True or False whether to keep this SmartCTF mutator instance, and sets bInitialized accordingly. -*/ -function bool ValidateSmartCTFMutator() -{ - local Mutator M; - local bool bRunning; - - M = Level.Game.BaseMutator; - while( M != None ) - { - if( M != Self && M.Class == Self.Class ) - { - bRunning = True; - break; - } - M = M.NextMutator; - } - - if( !bEnabled ) - { - Log( "Instance" @ Name @ "not loaded because bEnabled in .ini = False.", 'SmartCTF' ); - } - else if( CTFGame( Level.Game ) == None ) - { - Log( "Instance" @ Name @ "not loaded because gamestyle is not CTF.", 'SmartCTF' ); - } - else if( bRunning ) - { - Log( "Instance" @ Name @ "not loaded because it is already running.", 'SmartCTF' ); - } - else - { - SCTFGame.bInitialized = True; - } - - return SCTFGame.bInitialized; -} - - -/* - * For the flag bug each player gets a FlagChecker inventory on spawn. -*/ -function ModifyPlayer( Pawn Other ) -{ - local Inventory Inv; - local SmartCTFPlayerReplicationInfo OtherStats; - local string IP; - local int j,i; - local bool bIsFirstSpawn; - - - if( Other.bIsPlayer && !Other.IsA('Bot') && !( Other.PlayerReplicationInfo.bIsSpectator && !Other.PlayerReplicationInfo.bWaitingPlayer ) ) - { - // little hacky method to know if its 1st spawn or not - bIsFirstSpawn = Other.PlayerReplicationInfo.Deaths < 1; - SCTFGame.WelcomeNewPlayers.CheckPawn(Other,bIsFirstSpawn); - if( bFixFlagBug) - { - Inv = Spawn( class'SmartCTFFlagCheckerInventory' , Other ); - if( Inv != None ) - { - Inv.GiveTo( Other ); - } - } - } - - SCTFGame.RefreshPRI(); - OtherStats = SCTFGame.GetStats( Other ); - if( OtherStats!=none && - bStoreStats && - !Level.Game.bGameEnded && - Other!=none && - Other.bIsPlayer && - !Other.IsA('Spectator') && - !Other.IsA('Bot') && - Other.PlayerReplicationInfo!=none && - Other.PlayerReplicationInfo.PlayerName!="Player" ) - { - IP=PlayerPawn(Other).GetPlayerNetworkAddress(); - j=InStr(IP,":"); - if( j!=-1 ) - { - IP=Left(IP,j); - } - - for(i=0; i<32 && GoneName[i]!=""; i++) - { - if( Other.PlayerReplicationInfo.PlayerName~=GoneName[i] || (IP==GoneIP[i] && IP!="") ) - { - Log(" ## SmartCTF - Caught player by name or IP "$Other.PlayerReplicationInfo.PlayerName$"@"$IP); - Log(" ## SmartCTF is restoring stats for " $Other.PlayerReplicationInfo.PlayerName$"@"$IP); - if(GoneStats[i]!= none) - { - FirstSpawn( Other ); - OtherStats.Captures=GoneStats[i].Captures; - OtherStats.Frags=GoneStats[i].Frags; - OtherStats.Grabs=GoneStats[i].Grabs; - OtherStats.Covers=GoneStats[i].Covers; - OtherStats.Assists=GoneStats[i].Assists; - OtherStats.Seals=GoneStats[i].Seals; - OtherStats.FlagKills=GoneStats[i].FlagKills; - OtherStats.DefKills=GoneStats[i].DefKills; - OtherStats.HeadShots=GoneStats[i].HeadShots; - OtherStats.ShieldBelts=GoneStats[i].ShieldBelts; - OtherStats.Amps=GoneStats[i].Amps; - OtherStats.LastKillTime=GoneStats[i].LastKillTime; - OtherStats.MultiLevel=GoneStats[i].MultiLevel; - OtherStats.FragSpree=GoneStats[i].FragSpree; - OtherStats.CoverSpree=GoneStats[i].CoverSpree; - OtherStats.SealSpree=GoneStats[i].SealSpree; - OtherStats.SpawnKillSpree=GoneStats[i].SpawnKillSpree; - OtherStats.bHadFirstSpawn =True; - } - Other.PlayerReplicationInfo.Score=GoneScore[i]; - Other.PlayerReplicationInfo.Deaths=GoneDeaths[i]; - CleanGone(i); - Log(" ## Stats are restored"); - break; - } - } - } - - - - if( !OtherStats.bHadFirstSpawn ) - { - OtherStats.bHadFirstSpawn = True; - FirstSpawn( Other ); - } - - OtherStats.SpawnTime = Level.TimeSeconds; - - super.ModifyPlayer( Other ); - if(bStoreStats) - { - UpdateInfo(); - } - -} - -/* - * Gets called when a new player or bot joins the game, that is when they first spawn. -*/ -function FirstSpawn( Pawn Other ) -{ - local byte ID; - local string SkinName, FaceName; - - // Additional logging, useful for player tracking - if( Level.Game.LocalLog != None && PlayerPawn( Other ) != None && Other.bIsPlayer ) - { - ID = PlayerPawn( Other ).PlayerReplicationInfo.PlayerID; - Level.Game.LocalLog.LogSpecialEvent( "IP", ID, PlayerPawn( Other ).GetPlayerNetworkAddress() ); - Level.Game.LocalLog.LogSpecialEvent( "player", "NetSpeed", ID, PlayerPawn( Other ).Player.CurrentNetSpeed ); - Level.Game.LocalLog.LogSpecialEvent( "player", "Fov", ID, PlayerPawn( Other ).FovAngle ); - Level.Game.LocalLog.LogSpecialEvent( "player", "VoiceType", ID, Other.VoiceType ); - if( Other.IsA( 'TournamentPlayer' ) ) - { - if( Other.Skin == None ) - { - Other.static.GetMultiSkin( Other, SkinName, FaceName ); - } - else - { - SkinName = string( Other.Skin ); - FaceName = "None"; - } - Level.Game.LocalLog.LogSpecialEvent( "player", "Skin", ID, SkinName ); - Level.Game.LocalLog.LogSpecialEvent( "player", "Face", ID, FaceName ); - } - } -} - -/* - *Use this function to clean out entries from the gone arrays when a player - *reenters and is caught by SmartCTF -*/ -function CleanGone( int R) -{ - - local int i; - - for(i=R;i<32;i++) - { If(GoneStats[i]!=none) - { - - if(i==31) - { - GoneName[i]=""; - GoneScore[i]=0; - GoneDeaths[i]=0; - GoneIP[i]=""; - GoneStats[i].ClearStats(); - break; - } - - GoneName[i]=GoneName[i+1]; - GoneScore[i]=GoneScore[i+1]; - GoneDeaths[i]=GoneDeaths[i+1]; - GoneIP[i]=GoneIP[i+1]; - GoneStats[i]=GoneStats[i+1]; - } - } - - -} - -function bool MutatorBroadcastMessage( Actor Sender, Pawn Receiver, out coerce string Msg, optional bool bBeep, out optional name Type ) -{ - local string quitter; - local int i,j; - local bool matched; - - if(bStoreStats) - { - //Thanks to the WebChatLog mutator for the Reciever.NextPawn==none check - if(Receiver != none && Receiver.NextPawn == none && !Level.Game.bGameEnded) // prevent duplicate messages - { - if(Right(Msg,QuitMsgLen)==QuitMsg) - { - quitter=left(Msg,Len(Msg)-QuitMsgLen); //strips out the playername - - for(i=0; i<32 && StoreName[i]!=""; i++) - { - if(StoreName[i]~=quitter) - { - matched=true; //found our player match - - for(j=0; j<32; j++) - { - if(GoneName[j]=="") - { - GoneName[j]=StoreName[i]; - GoneScore[j]=StoreScore[i]; - GoneDeaths[j]=StoreDeaths[i]; - GoneIP[j]=StoreIP[i]; - GoneStats[j]=StoreStats[i]; - break; - } - - if(j==31) - { - log(" ## SmartCtf - Gone Array is full"); - break; - } - } - - break; - } - } - - //if the player wasn't caught in the main store array, check backup 1 - if(!matched) - { - for(i=0; i<32 && B1Name[i]!=""; i++) - { - if(B1Name[i]~=quitter) - { - matched=true; //found our player match - - for(j=0; j<32; j++) - { - if(GoneName[j]=="") - { - GoneName[j]=B1Name[i]; - GoneScore[j]=B1Score[i]; - GoneDeaths[j]=B1Deaths[i]; - GoneIP[j]=B1IP[i]; - GoneStats[j]=B1Stats[i]; - break; - } - - if(j==31) - { - log(" ## SmartCtf - Gone Array is full"); - break; - } - } - - break; - } - } - } - - //if the player wasn't caught in the backup 1 array, check backup 2 - if(!matched) - { - for(i=0; i<32 && B2Name[i]!=""; i++) - { - if(B2Name[i]~=quitter) - { - for(j=0; j<32; j++) - { - if(GoneName[j]=="") - { - GoneName[j]=B2Name[i]; - GoneScore[j]=B2Score[i]; - GoneDeaths[j]=B2Deaths[i]; - GoneIP[j]=B2IP[i]; - GoneStats[j]=B2Stats[i]; - break; - } - - if(j==31) - { - log(" ## SmartCtf - Gone Array is full"); - break; - } - } - - break; - } - } - } - } - } - } - - if( NextMessageMutator != none ) - { - //If there are other mutators monitoring messages, make sure we ask them - //whether to allow the message to be broadcast (i.e. return their value). - return NextMessageMutator.MutatorBroadcastMessage( Sender, Receiver, Msg, bBeep, Type ); - } - - //Else, we'll return true (true will allow the message to be broadcast). - return true; -} - -/* - *Just another event to use as an update point for our store array (the more - *update events, the more up to date the store array will be). -*/ -function ScoreKill(pawn Killer, pawn Other) -{ - super.ScoreKill(Killer, Other); - - if(bStoreStats) - { - UpdateInfo(); - } -} - -/* - *Just another event to use as an update point for our store array (the more - *update events, the more up to date the store array will be). -*/ -function MutatorTakeDamage( out int ActualDamage, Pawn Victim, Pawn InstigatedBy, out Vector HitLocation, out Vector Momentum, name DamageType) -{ - super.MutatorTakeDamage(ActualDamage,Victim,InstigatedBy,HitLocation,Momentum,DamageType); - if(bStoreStats) - { - UpdateInfo(); - } - -} - - -function UpdateInfo() -{ - local int i,j,k; - local string IP; - local Pawn P; - local SmartCTFPlayerReplicationInfo PI; - - //clear the previous name values, so we don't double register any players - for(k=0; k<32; k++) - { - StoreName[k]=""; - } - - for(P=Level.PawnList; P!=none; P=P.nextPawn) - { - if( PlayerPawn(P)!=none && - P.bIsPlayer && - !P.IsA('Spectator') && - !P.IsA('Bot') && - P.PlayerReplicationInfo!=none && - P.PlayerReplicationInfo.PlayerName!="Player" && - (P.PlayerReplicationInfo.Score!=0 || P.PlayerReplicationInfo.Deaths!=0) ) - { - IP=PlayerPawn(P).GetPlayerNetworkAddress(); - if( IP!="" ) - { - j=InStr(IP,":"); - if( j!=-1 ) - IP=Left(IP,j); - } - StoreName[i]=P.PlayerReplicationInfo.PlayerName; - StoreScore[i]=P.PlayerReplicationInfo.Score; - StoreDeaths[i]=P.PlayerReplicationInfo.Deaths; - StoreIP[i]=IP; - PI = SCTFGame.GetStats( P ); - If(PI!= none) - StoreStats[i]=PI; - i++; - } - } - -} - -/* - * Gets called once when the Countdown before a Tournament game starts. -*/ -function TournamentGameStarted() -{ - // Fix warmup mode bug + Overtime functionality - ClearStats(); - if( bEnableOvertimeControl ) - { - if( !bOvertime ) - { - BroadcastLocalizedMessage( class'SmartCTFCoolMsg', 4 ); - } - else - { - BroadcastLocalizedMessage( class'SmartCTFCoolMsg', 3 ); - } - } -} - -/* - * Check for covers and seals, and adjust scores. -*/ -function bool PreventDeath( Pawn Victim, Pawn Killer, name DamageType, vector HitLocation ) -{ - local PlayerReplicationInfo VictimPRI, KillerPRI; - local bool bPrevent, bVictimTeamHasFlag, bWarmupSkip; - local Pawn pn; - local float TimeAwake; - local SmartCTFPlayerReplicationInfo KillerStats, VictimStats; - - bPrevent = super.PreventDeath( Victim, Killer, DamageType, HitLocation ); - if( bPrevent ) - { - return bPrevent; // Player didn't die, so return - } - - // If there is no victim, return. - if( Victim == None ) - { - return bPrevent; - } - - VictimPRI = Victim.PlayerReplicationInfo; - if( VictimPRI == None || !Victim.bIsPlayer || ( VictimPRI.bIsSpectator && !VictimPRI.bWaitingPlayer ) ) - { - return bPrevent; - } - - VictimStats = SCTFGame.GetStats( Victim ); - - // airkill handling - if(bPlayAirKillSound && (Victim!=Killer) && (Killer!=None)) - { - if(Victim.Physics == PHYS_Falling && Killer.Physics == PHYS_Falling) - { - if(Victim.bIsPlayer && Victim.IsA('PlayerPawn')) - { - Victim.ReceiveLocalizedMessage( class'SmartCTFAudioMsg', 6); - Victim.ReceiveLocalizedMessage( class'SmartCTFCoolMsg', 7); - } - if(Killer.bIsPlayer && Killer.IsA('PlayerPawn')) - { - Killer.ReceiveLocalizedMessage( class'SmartCTFAudioMsg', 6); - Killer.ReceiveLocalizedMessage( class'SmartCTFCoolMsg', 6); - } - } - } - - if( VictimStats != None ) - { - VictimStats.FragSpree = 0; // Reset FragSpree for Victim - VictimStats.SpawnKillSpree = 0; - } - - // If there is no killer / suicide, return. - if( Killer == None || Killer == Victim ) - { - if( bEnhancedMultiKill && EnhancedMultiKillBroadcast > 0 ) - { - VictimStats.MultiLevel = 0; - } - return bPrevent; - } - - KillerPRI = Killer.PlayerReplicationInfo; - if( KillerPRI == None || !Killer.bIsPlayer || ( KillerPRI.bIsSpectator && !KillerPRI.bWaitingPlayer ) ) - { - return bPrevent; - } - - KillerStats = SCTFGame.GetStats( Killer ); - // Same Team! We don't count those stats like that in SmartCTF. - if( VictimPRI.Team == KillerPRI.Team ) - { - return bPrevent; - } - - // Increase Frags and FragSpree for Killer (Play "Too Easy" at 30) - if( KillerStats != None ) - { - KillerStats.Frags++; - KillerStats.FragSpree++; - } - - if( bEnhancedMultiKill && EnhancedMultiKillBroadcast > 0 ) - { - VictimStats.MultiLevel = 0; - if( Level.TimeSeconds - KillerStats.LastKillTime < 3 ) - { - KillerStats.MultiLevel++; - if( KillerStats.MultiLevel + 1 >= EnhancedMultiKillBroadcast ) - { - Level.Game.BroadcastMessage( KillerPRI.PlayerName @ class'SmartCTFEnhancedMultiKillMessage'.static.GetBroadcastString( KillerStats.MultiLevel ) ); - } - } - else - { - KillerStats.MultiLevel = 0; - } - KillerStats.LastKillTime = Level.TimeSeconds; - } - - bWarmupSkip = DeathMatchPlus( Level.Game ).bTournament && !bTournamentGameStarted; - - if( !bWarmupSkip ) - { - - // For Flag Kill, inc player's FlagKills and total - if( VictimPRI.HasFlag != None ) - { - - if( KillerStats != None ) - { - KillerStats.FlagKills++; - } - KillerPRI.Score += FlagKillBonus; - - // Already logged by UTStats serveractor. Dont want to do it twice. - //if( Level.Game.LocalLog != None ) Level.Game.LocalLog.LogSpecialEvent( "flag_kill", KillerPRI.PlayerID, VictimPRI.PlayerID, VictimPRI.Team ); - - // Handling Denied - if( VSize( Victim.Location - FlagStands[VictimPRI.Team].Location ) < 768 ) - { - if( DeniedMsgType == 1 && PlayerPawn( Killer ) != None ) - { - Killer.ClientMessage( class'SmartCTFMessage'.static.GetString( 11 + 64, KillerPRI, VictimPRI ) ); - } - else if( DeniedMsgType == 2 ) - { - BroadcastMessage( class'SmartCTFMessage'.static.GetString( 11, KillerPRI, VictimPRI ) ); - } - else if( DeniedMsgType == 3 ) - { - BroadcastLocalizedMessage( class'SmartCTFMessage', 11, KillerPRI, VictimPRI ); - } - - for( pn = Level.PawnList; pn != None; pn = pn.NextPawn ) - { - if( PlayerPawn( pn ) != None && pn.bIsPlayer ) - { - if(bPlayDeniedSound) - { - PlayerPawn( pn ).ReceiveLocalizedMessage( class'SmartCTFAudioMsg', 5 ); - } - } - } - } - } - else - { - // If Killer has Flag, no cover or seal for him - if( KillerPRI.HasFlag == None && FCs[KillerPRI.Team] != None && FCs[KillerPRI.Team].PlayerReplicationInfo.HasFlag != None ) - { - // COVER FRAG / SEAL BASE - // If Killer's Team has had an FC - - // If the FC has Flag Right now - // Defend kill - // org: If victim can see the FC or is within 600 unreal units (approx 40 feet) and has a line of sight to fc. - //if( Victim.canSee( FCs[KillerPRI.Team] ) || ( Victim.lineOfSightTo( FCs[KillerPRI.Team] ) && Distance( Victim.Location, FCs[KillerPRI.Team].Location ) < 600 ) ) - // new: victim within 512 uu of FC - // or killer within 512 uu of FC - // or victim can see FC and was Victim within 1536 uu of FC - // or killer can see FC and Victim victim within 1024 uu of FC - // or victim has direct line to FC and was Victim within 768 uu - if( ( VSize( Victim.Location - FCs[KillerPRI.Team].Location ) < 512 ) - || ( VSize( Killer.Location - FCs[KillerPRI.Team].Location ) < 512 ) - || ( VSize( Victim.Location - FCs[KillerPRI.Team].Location ) < 1536 && Victim.canSee( FCs[KillerPRI.Team] ) ) - || ( VSize( Victim.Location - FCs[KillerPRI.Team].Location ) < 1024 && Killer.canSee( FCs[KillerPRI.Team] ) ) - || ( VSize( Victim.Location - FCs[KillerPRI.Team].Location ) < 768 && Victim.lineOfSightTo( FCs[KillerPRI.Team] ) ) ) - { - // Killer DEFENDED THE Flag CARRIER - if( KillerStats != None ) - { - KillerStats.Covers++; - KillerStats.CoverSpree++; // Increment Cover spree - } - KillerPRI.Score += CoverBonus; // Reward points - - // Log cover - if( Level.Game.LocalLog != None ) - { - Level.Game.LocalLog.LogSpecialEvent( "flag_cover", KillerPRI.PlayerID, VictimPRI.PlayerID, KillerPRI.Team ); - } - - // Cover sprees - if( KillerStats != None ) - { - if( KillerStats.CoverSpree == 3 ) // Cover x 3 - { - if( CoverSpreeMsgType == 1 && PlayerPawn( Killer ) != None ) - { - Killer.ClientMessage( class'SmartCTFMessage'.static.GetString( 4 + 64, KillerPRI, VictimPRI ) ); - } - else if( CoverSpreeMsgType == 2 ) - { - BroadcastMessage( class'SmartCTFMessage'.static.GetString( 4, KillerPRI, VictimPRI ) ); - } - else if( CoverSpreeMsgType == 3 ) - { - BroadcastLocalizedMessage( class'SmartCTFMessage', 4, KillerPRI, VictimPRI ); - } - } - else if( KillerStats.CoverSpree == 4 ) // Cover x 4 - { - if( CoverSpreeMsgType == 1 && PlayerPawn( Killer ) != None ) - { - Killer.ClientMessage( class'SmartCTFMessage'.static.GetString( 5 + 64, KillerPRI, VictimPRI ) ); - } - else if( CoverSpreeMsgType == 2 ) - { - BroadcastMessage( class'SmartCTFMessage'.static.GetString( 5, KillerPRI, VictimPRI ) ); - } - else if( CoverSpreeMsgType == 3 ) - { - BroadcastLocalizedMessage( class'SmartCTFMessage', 5, KillerPRI, VictimPRI ); - } - } - else // // Covered FC - { - if( CoverMsgType == 1 && PlayerPawn( Killer ) != None ) - { - Killer.ClientMessage( class'SmartCTFMessage'.static.GetString( 0 + 64, KillerPRI, VictimPRI ) ); - } - else if( CoverMsgType == 2 ) - { - BroadcastMessage( class'SmartCTFMessage'.static.GetString( 0, KillerPRI, VictimPRI ) ); - } - else if( CoverMsgType == 3 ) - { - BroadcastLocalizedMessage( class'SmartCTFMessage', 0, KillerPRI, VictimPRI ); - } - } - } - } - - // Defense kill - // If the map has player zones - bVictimTeamHasFlag = True; - if( FCs[VictimPRI.Team] == None ) - { - bVictimTeamHasFlag = False; - } - - if( FCs[VictimPRI.Team] != None && FCs[VictimPRI.Team].PlayerReplicationInfo.HasFlag == None ) - { - bVictimTeamHasFlag = False; - } - - // If Victim's FC has not been set / If Victim's FC doesn't have our Flag - if( !bVictimTeamHasFlag ) - { - // If Killer is Red & he and his FC's Location has Red - if( IsInZone( VictimPRI, KillerPRI.Team ) && IsInZone( FCs[KillerPRI.Team].PlayerReplicationInfo, KillerPRI.Team ) ) - { - // Killer SEALED THE BASE - if( KillerStats != None ) - { - KillerStats.Seals++; - KillerStats.SealSpree++; - if(CTFReplicationInfo( Level.Game.GameReplicationInfo ).FlagList[KillerPRI.Team].bHome) // only if flag is at home - { - KillerStats.DefKills++; // seal is also a defkill - } - } - KillerPRI.Score += SealBonus; - if( SealMsgType != 0 && KillerStats != None && KillerStats.SealSpree == 2 ) // Sealing base - { - if( SealMsgType == 1 && PlayerPawn( Killer ) != None ) - { - Killer.ClientMessage( class'SmartCTFMessage'.static.GetString( 1 + 64, KillerPRI, VictimPRI ) ); - } - else if( SealMsgType == 2 ) - { - BroadcastMessage( class'SmartCTFMessage'.static.GetString( 1, KillerPRI, VictimPRI ) ); - } - else if( SealMsgType == 3 ) - { - BroadcastLocalizedMessage( class'SmartCTFMessage', 1, KillerPRI, VictimPRI ); - } - } - // Log seal - if( Level.Game.LocalLog != None ) - { - Level.Game.LocalLog.LogSpecialEvent( "flag_seal", KillerPRI.PlayerID, VictimPRI.PlayerID, KillerPRI.Team ); // Log to ngLog; - } - } - } - } - else // our team don't have a flag - { - bVictimTeamHasFlag = True; - if( FCs[VictimPRI.Team] == None ) - { - bVictimTeamHasFlag = False; - } - if( FCs[VictimPRI.Team] != None && FCs[VictimPRI.Team].PlayerReplicationInfo.HasFlag == None ) - { - bVictimTeamHasFlag = False; - } - // Defense kill - // If the map has player zones - if( VictimPRI.PlayerZone != None ) - { - if( IsInZone( VictimPRI, KillerPRI.Team ) && !bVictimTeamHasFlag && CTFReplicationInfo( Level.Game.GameReplicationInfo ).FlagList[KillerPRI.Team].bHome) - { - if( KillerStats != None ) - { - KillerStats.DefKills++; - } - } - } - } - } - } - - if( bAfterGodLikeMsg && KillerStats != None && ( KillerStats.FragSpree == 30 || KillerStats.FragSpree == 35 ) ) - { - for( pn = Level.PawnList; pn != None; pn = pn.NextPawn ) - { - if( pn.IsA( 'TournamentPlayer' ) ) - { - pn.ReceiveLocalizedMessage( class'SmartCTFSpreeMsg', KillerStats.FragSpree / 5 - 1, KillerPRI ); - } - } - } - - // Uber / Long Range kill if not sniper, HeadShot, trans, deemer, instarifle, or vengeance relic. - if( bShowLongRangeMsg && TournamentPlayer( Killer ) != None ) - { - if( DamageType != 'shot' && - DamageType != 'decapitated' && - DamageType != 'Eradicated' && - DamageType != 'Gibbed' && - DamageType != 'RedeemerDeath' && - (SuperShockRifle( Killer.Weapon ) == None || bLongRangeSuperShock)) - { - if( VSize( Killer.Location - Victim.Location ) > 1536 ) - { - if( VSize( Killer.Location - Victim.Location ) > 3072 ) - { - Killer.ReceiveLocalizedMessage( class'SmartCTFCoolMsg', 2, KillerPRI, VictimPRI ); - } - else - { - Killer.ReceiveLocalizedMessage( class'SmartCTFCoolMsg', 1, KillerPRI, VictimPRI ); - } - // Log special kill. - if( Level.Game.LocalLog != None ) - { - Level.Game.LocalLog.LogSpecialEvent( "longrangekill", KillerPRI.PlayerID, VictimPRI.PlayerID ); - } - } - } - } - - // HeadShot tracking - if( DamageType == 'decapitated' && KillerStats != None ) - { - KillerStats.HeadShots++; - } - - // Spawnkill detection - if( bSpawnkillDetection && DamageType != 'Gibbed' && VictimStats != None ) // No telefrags - { - TimeAwake = Level.TimeSeconds - VictimStats.SpawnTime; - if( Level.Game.BaseMutator.MutatedDefaultWeapon() != class'Botpack.ImpactHammer' ) - { // Arena mutator used, spawnkilling must be extreme to count - if( TimeAwake <= SpawnKillTimeArena ) - { - Killer.ReceiveLocalizedMessage( class'SmartCTFCoolMsg', 5, KillerPRI, VictimPRI ); - KillerPRI.Score -= SpawnKillPenalty; - if( KillerStats != None ) - { - KillerStats.SpawnKillSpree++; - } - if( Level.Game.LocalLog != None ) - { - Level.Game.LocalLog.LogSpecialEvent( "spawnkill", KillerPRI.PlayerID, VictimPRI.PlayerID, SpawnKillPenalty ); - } - if( bShowSpawnKillerGlobalMsg && KillerStats != None && KillerStats.SpawnKillSpree > 2 ) - { - BroadcastLocalizedMessage( class'SmartCTFMessage', 10, KillerPRI, VictimPRI ); - } - } - } - else // No arena mutator - { - if( TimeAwake < SpawnKillTimeNW ) - { - Killer.ReceiveLocalizedMessage( class'SmartCTFCoolMsg', 5, KillerPRI, VictimPRI ); - KillerPRI.Score -= SpawnKillPenalty; - if( KillerStats != None ) - { - KillerStats.SpawnKillSpree++; - } - if( Level.Game.LocalLog != None ) - { - Level.Game.LocalLog.LogSpecialEvent( "spawnkill", KillerPRI.PlayerID, VictimPRI.PlayerID, SpawnKillPenalty ); - } - if( bShowSpawnKillerGlobalMsg && KillerStats != None && KillerStats.SpawnKillSpree > 2 ) - { - BroadcastLocalizedMessage( class'SmartCTFMessage', 10, KillerPRI, VictimPRI ); - } - } - } - } - if(bStoreStats) - { - UpdateInfo(); - } - return bPrevent; -} - -/* - * ShieldBelt + Damage Amp tracking, spawnkill detection. -*/ -function bool HandlePickupQuery( Pawn Other, Inventory Item, out byte bAllowPickup ) -{ - local SmartCTFPlayerReplicationInfo OtherStats; - - OtherStats = SCTFGame.GetStats( Other ); - - if( Item.IsA( 'UT_ShieldBelt' ) && OtherStats != None ) - { - OtherStats.ShieldBelts++; - } - if( Item.IsA( 'UDamage' ) && OtherStats != None ) - { - OtherStats.Amps++; - } - - // For spawnkill detection - if( bSpawnkillDetection && OtherStats != None && OtherStats.SpawnTime != 0 ) - { - if( Item.IsA( 'TournamentWeapon' ) || Item.IsA( 'UT_ShieldBelt' ) || Item.IsA( 'UDamage' ) || Item.IsA( 'HealthPack' ) || Item.IsA( 'UT_Invisibility' ) ) - { - // This player has picked up a certain item making a kill on him no longer be qualified as a spawnkill. - OtherStats.SpawnTime = 0; - } - } - - return super.HandlePickupQuery( Other, Item, bAllowPickup ); -} - -/* - * Proper check if a player is in a location with 'red' or 'blue' in the name. -*/ -function bool IsInZone( PlayerReplicationInfo PRI, byte Team ) -{ - local string Loc; - - if( PRI.PlayerLocation != None ) - { - Loc = PRI.PlayerLocation.LocationName; - } - else if( PRI.PlayerZone != None ) - { - Loc = PRI.PlayerZone.ZoneName; - } - else - { - return False; - } - - if( Team == 0 ) - { - return ( Instr( Caps( Loc ), "RED" ) != -1 ); - } - else - { - return ( Instr( Caps( Loc ), "BLUE" ) != -1 ); - } -} - -/* - * Add a player to the Red FC/assister list. -*/ -function AddRedFlagCarrier( Pawn Aster, float Fct ) -{ - local byte i; - - if( Aster == None || !Aster.bIsPlayer || ( Aster.PlayerReplicationInfo.bIsSpectator && !Aster.PlayerReplicationInfo.bWaitingPlayer ) ) - { - return; - } - if( RedFCIndex >= 32 ) - { - RedFCIndex = 0; - } - - // Check if already in list - for( i = 0; i < 32; i++ ) - { - if( Aster == RedFlagCarrier[i] ) - { - RedFlagCarrierTime[i] += Fct; - return; - } - } - - RedFlagCarrier[RedFCIndex] = Aster; - RedFlagCarrierTime[RedFCIndex] = Fct; - RedFCIndex++; -} - -function AddBlueFlagCarrier( Pawn Aster, float Fct ) -{ - local byte i; - - if( Aster == None || !Aster.bIsPlayer || ( Aster.PlayerReplicationInfo.bIsSpectator && !Aster.PlayerReplicationInfo.bWaitingPlayer ) ) - { - return; - } - if( BlueFCIndex >= 32 ) - { - BlueFCIndex = 0; - } - - for( i = 0; i < 32; i++ ) - { - if( Aster == BlueFlagCarrier[i] ) - { - BlueFlagCarrierTime[i] += Fct; - return; - } - } - - BlueFlagCarrier[BlueFCIndex] = Aster; - BlueFlagCarrierTime[BlueFCIndex] = Fct; - BlueFCIndex++; -} - - -/* - * Walk through Red assisters/FC and reward them with points because of a cap. -*/ -function RewardRedFlagCarriers( bool bNotPlayedLead ) -{ - local byte j; - local SmartCTFPlayerReplicationInfo AssisterStats; - local int Bonus; - local float TotalTime, f; - - Bonus = AssistBonus; - - // Calculate the total flag carrying time - for( j = 0; j < 32; j++ ) TotalTime += RedFlagCarrierTime[j]; - - for( j = 0; j < 32; j++ ) - { - // If flagcarrier was not the capper - if( RedFlagCarrier[j] != None && RedFlagCarrier[j] != FCs[0] ) - { - AssisterStats = SCTFGame.GetStats( RedFlagCarrier[j] ); - if( AssisterStats != None ) - { - AssisterStats.Assists++; - } - - if( bNewCapAssistScoring ) - { - if( TotalTime == 0 ) - { - f = 0; - } - else - { - f = ( RedFlagCarrierTime[j] / TotalTime ) * ( 7 + CapBonus ); // proportionally score - } - Bonus = Max( f, 1 ); - } - RedFlagCarrier[j].PlayerReplicationInfo.Score += Bonus; - - if( PlayerPawn( RedFlagCarrier[j] ) != None ) - { - if( bShowAssistConsoleMsg ) - { - PlayerPawn( RedFlagCarrier[j] ).ClientMessage( "You get " $ Bonus $ " bonus pts for the Assist!" @ CarriedString( RedFlagCarrierTime[j], TotalTime ) ); - } - if( bPlayAssistSound && bNotPlayedLead ) - { - PlayerPawn( RedFlagCarrier[j] ).ReceiveLocalizedMessage( class'SmartCTFAudioMsg', 1 ); - } - } - if( Level.Game.LocalLog != None ) - { - Level.Game.LocalLog.LogSpecialEvent( "Flag_assist", RedFlagCarrier[j].PlayerReplicationInfo.PlayerID, 0 ); - } - } - // Award capper propertionally too. Behave like assist - else if( RedFlagCarrier[j] == FCs[0] ) - { - if( bNewCapAssistScoring ) - { - if( TotalTime == 0 ) - { - f = 0; - } - else - { - f = ( RedFlagCarrierTime[j] / TotalTime ) * ( 7 + CapBonus ); - } - Bonus = Max( f, MinimalCapBonus ); - FCs[0].PlayerReplicationInfo.Score += Bonus - 7; // 7 already awarded by UT - if( bShowAssistConsoleMsg && PlayerPawn( FCs[0] ) != None ) - { - PlayerPawn( FCs[0] ).ClientMessage( "You get " $ Bonus $ " pts for the Capture!" @ CarriedString( RedFlagCarrierTime[j], TotalTime ) ); - } - } - else - { - FCs[0].PlayerReplicationInfo.Score += CapBonus; - } - } - } - ResetFlagCarriers( 0 ); -} - -function RewardBlueFlagCarriers( bool bNotPlayedLead ) -{ - local byte j; - local SmartCTFPlayerReplicationInfo AssisterStats; - local int Bonus; - local float TotalTime, f; - - Bonus = AssistBonus; - - for( j = 0; j < 32; j++ ) - { - TotalTime += BlueFlagCarrierTime[j]; - } - - for( j = 0; j < 32; j++ ) - { - if( BlueFlagCarrier[j] != None && BlueFlagCarrier[j] != FCs[1] ) - { - AssisterStats = SCTFGame.GetStats( BlueFlagCarrier[j] ); - if( AssisterStats != None ) - { - AssisterStats.Assists++; - } - - if( bNewCapAssistScoring ) - { - if( TotalTime == 0 ) - { - f = 0; - } - else - { - f = ( BlueFlagCarrierTime[j] / TotalTime ) * ( 7 + CapBonus ); - } - Bonus = Max( f, 1 ); - } - BlueFlagCarrier[j].PlayerReplicationInfo.Score += Bonus; - - if( PlayerPawn( BlueFlagCarrier[j] ) != None ) - { - if( bShowAssistConsoleMsg ) - { - PlayerPawn( BlueFlagCarrier[j] ).ClientMessage( "You get " $ Bonus $ " bonus pts for the Assist!" @ CarriedString( BlueFlagCarrierTime[j], TotalTime ) ); - } - if( bPlayAssistSound && bNotPlayedLead ) - { - PlayerPawn( BlueFlagCarrier[j] ).ReceiveLocalizedMessage( class'SmartCTFAudioMsg', 1 ); - } - } - if( Level.Game.LocalLog != None ) - { - Level.Game.LocalLog.LogSpecialEvent( "Flag_assist", BlueFlagCarrier[j].PlayerReplicationInfo.PlayerID, 0 ); - } - } - else if( BlueFlagCarrier[j] == FCs[1] ) - { - if( bNewCapAssistScoring ) - { - if( TotalTime == 0 ) - { - f = 0; - } - else - { - f = ( BlueFlagCarrierTime[j] / TotalTime ) * ( 7 + CapBonus ); - } - Bonus = Max( f, MinimalCapBonus ); - FCs[1].PlayerReplicationInfo.Score += Bonus - 7; - if( bShowAssistConsoleMsg && PlayerPawn( FCs[1] ) != None ) - { - PlayerPawn( FCs[1] ).ClientMessage( "You get " $ Bonus $ " pts for the Capture!" @ CarriedString( BlueFlagCarrierTime[j], TotalTime ) ); - } - } - else - { - FCs[1].PlayerReplicationInfo.Score += CapBonus; - } - } - } - ResetFlagCarriers( 1 ); -} - -/* - * Clear assisters list of Team, because of flag return. Team = 2: clear both teams. -*/ -function ResetFlagCarriers( byte Team ) -{ - local byte i; - - if( Team != 1 ) - { - RedFCIndex = 0; - for( i = 0; i < 32; i++ ) - { - RedFlagCarrier[i] = None; - RedFlagCarrierTime[i] = 0; - } - } - if( Team != 0 ) - { - BlueFCIndex = 0; - for( i = 0; i < 32; i++ ) - { - BlueFlagCarrier[i] = None; - BlueFlagCarrierTime[i] = 0; - } - } -} - -function string CarriedString( float Time, float TotalTime ) -{ - local int Perc; - local float f; - - if( TotalTime == 0 ) - { - f = 0; - } - else - { - f = ( Time / TotalTime ) * 100; - } - - Perc = Clamp( f, 0, 100 ); - if( Perc == 100 ) - { - return "(Solocap," @ int( Time ) @ "sec.)"; - } - else - { - return "(Carried" @ Perc $ "% of the time:" @ int( Time ) @ "sec.)"; - } -} - -/* - * Intercept CTF messages to set FC states and adjust scores. -*/ -function bool MutatorBroadcastLocalizedMessage( Actor Sender, Pawn Receiver, out class Message, out optional int Switch, out optional PlayerReplicationInfo RelatedPRI_1, out optional PlayerReplicationInfo RelatedPRI_2, out optional Object OptionalObject ) -{ - local CTFFlag Flag; - local byte i, LeadSound; - local Pawn pn, FirstPawn; - local SmartCTFPlayerReplicationInfo ReceiverStats; - - // This function gets called each time someone receives a message. Thus for a broadcast, we need to make sure code only - // gets executed once. We can do that by comparing Receiver with f.e. the FC if applicable, or with the first Pawn - // in the PawnList (FirstPawn, see below). - - if( Message == class'CTFMessage' ) - { - if( Sender.IsA( 'CTFGame' ) ) - { - Flag = CTFFlag( OptionalObject ); - } - else if( Sender.IsA( 'CTFFlag' ) ) - { - Flag = CTFFlag( Sender ); - } - else - { - return super.MutatorBroadcastLocalizedMessage( Sender, Receiver, Message, Switch, RelatedPRI_1, RelatedPRI_2, OptionalObject ); - } - if( Flag == None ) - { - return super.MutatorBroadcastLocalizedMessage( Sender, Receiver, Message, Switch, RelatedPRI_1, RelatedPRI_2, OptionalObject ); - } - - // Warmup - if( DeathMatchPlus( Level.Game ).bTournament && !bTournamentGameStarted ) - { - return super.MutatorBroadcastLocalizedMessage( Sender, Receiver, Message, Switch, RelatedPRI_1, RelatedPRI_2, OptionalObject ); - } - - switch( Switch ) - { - // CAPTURE - // Sender: CTFGame, PRI: Scorer.PlayerReplicationInfo, OptObj: TheFlag - case 0: - if( Receiver == Pawn( RelatedPRI_1.Owner ) ) - { - //Flag = CTFFlag( OptionalObject ); - i = 1 - Flag.Team; - if( i == 1 ) - { - AddBlueFlagCarrier( FCs[i], Level.TimeSeconds - PickupTime[i] ); - } - else - { - AddRedFlagCarrier( FCs[i], Level.TimeSeconds - PickupTime[i] ); - } - - // Increment Caps for the player and the total - ReceiverStats = SCTFGame.GetStats( FCs[i] ); - if( ReceiverStats != None ) - { - ReceiverStats.Captures++; - } - - if( bPlayLeadSound ) - { - if( ( CTFGame( Level.Game ).Teams[i].Score - 1 ) == CTFGame( Level.Game ).Teams[1 - i].Score ) - { - LeadSound = 1; - } - if( CTFGame( Level.Game ).Teams[i].Score == CTFGame( Level.Game ).Teams[1 - i].Score ) - { - LeadSound = 2; - } - - for( pn = Level.PawnList; pn != None; pn = pn.NextPawn ) - { - if( PlayerPawn( pn ) != None && pn.bIsPlayer ) - { - if( LeadSound == 1 && pn.PlayerReplicationInfo.Team == i ) - { - PlayerPawn( pn ).ReceiveLocalizedMessage( class'SmartCTFAudioMsg', 3 ); - } - else if( LeadSound == 2 && pn.PlayerReplicationInfo.Team == ( 1 - i ) ) - { - PlayerPawn( pn ).ReceiveLocalizedMessage( class'SmartCTFAudioMsg', 4 ); - } - } - } - } - - // Don't play Capture sound if "Got The Lead" sound has played - if( bPlayCaptureSound && PlayerPawn( FCs[i] ) != None ) - { - if( !( bPlayLeadSound && ( LeadSound == 1 ) ) ) - { - PlayerPawn( FCs[i] ).ReceiveLocalizedMessage( class'SmartCTFAudioMsg', 0 ); - } - } - - // Reward points To FC and Assisters and increment Assists count and total - if( Flag.Team == 0 ) - { - RewardBlueFlagCarriers( !( bPlayLeadSound && ( LeadSound == 1 ) ) ); - } - else - { - RewardRedFlagCarriers( !( bPlayLeadSound && ( LeadSound == 1 ) ) ); - } - ResetFlagCarriers( 2 ); - GiveCoverSealBonus( Flag.Team ); // Reward pts to Covers And Sealers - - // Reset FCs And Assister num n index And reset sprees - FCs[0] = None; - FCs[1] = None; - ResetSprees( 2 ); // Means reset all since no Team is equal to 2. - } - break; - - // DROP - // Sender: CTFFlag, PRI: Holder.PlayerReplicationInfo, OptObj: CTFGame(Level.Game).Teams[Team] - case 2: - if( Receiver == Pawn( RelatedPRI_1.Owner ) ) - { - i = 1 - Flag.Team; - if( i == 1 ) - { - AddBlueFlagCarrier( FCs[i], Level.TimeSeconds - PickupTime[i] ); - } - else - { - AddRedFlagCarrier( FCs[i], Level.TimeSeconds - PickupTime[i] ); - } - } - break; - - // PICKUP (after the FC dropped it) - // Sender: CTFFlag, PRI: Holder.PlayerReplicationInfo, OptObj: CTFGame(Level.Game).Teams[Team] - case 4: - if( Receiver == Flag.Holder ) - { - i = 1 - Flag.Team; - PickupTime[i] = Level.TimeSeconds; - FCs[i] = Flag.Holder; - } - break; - - // GRAB - // Sender: CTFFlag, PRI: Holder.PlayerReplicationInfo, OptObj: CTFGame(Level.Game).Teams[Team] - case 6: - if( Receiver == Flag.Holder ) - { - i = 1 - Flag.Team; - PickupTime[i] = Level.TimeSeconds; - FCs[i] = Flag.Holder; // Set the FC - RelatedPRI_1.Score += GrabBonus; - // Increment FC's Grabs and total Grabs - ReceiverStats = SCTFGame.GetStats( FCs[i] ); - if( ReceiverStats != None ) - { - ReceiverStats.Grabs++; - } - } - break; - - - // RETURN - case 1: - case 3: - case 5: - // Get a pawn that receives messages, thus triggers this function ( as Receiver ) - for( FirstPawn = Level.PawnList; FirstPawn != None; FirstPawn = FirstPawn.NextPawn ) - { - if( FirstPawn.bIsPlayer || FirstPawn.IsA( 'MessagingSpectator' ) ) - { - break; - } - } - - if( Receiver == FirstPawn ) // Just get the first one. - { - // Switch == 1: it's returned by player, sent by CTFGame. - // Sender: CTFGame, PRI: Scorer.PlayerReplicationInfo, ObtObj: TheFlag - if( Switch == 1 ) - { - // 8 pts for a close save (with msg), Half a pt for base returns, 2 pts for Mid, 4 pts for enemy base - if( !bTooCloseForSaves && VSize( Flag.Location - FlagStands[1 - Flag.Team].Location ) < 900 ) - { // CLOSE SAVE - RelatedPRI_1.Score += CloseSaveReturnBonus; - if( Level.Game.LocalLog != None ) - { - Level.Game.LocalLog.LogSpecialEvent( "flag_return_closesave", RelatedPRI_1.PlayerID, Flag.Team ); - } - - // Only a msg if not a Flag standoff - other flag is home - if( CTFReplicationInfo( Level.Game.GameReplicationInfo ).FlagList[1 - Flag.Team].bHome ) - { - if( SavedMsgType == 1 && PlayerPawn( RelatedPRI_1.Owner ) != None ) - { - PlayerPawn( RelatedPRI_1.Owner ).ClientMessage( class'SmartCTFMessage'.static.GetString( 7 + 64, RelatedPRI_1 ) ); - } - else if( SavedMsgType == 2 ) - { - BroadcastMessage( class'SmartCTFMessage'.static.GetString( 7, RelatedPRI_1 ) ); - } - else if( SavedMsgType == 3 ) - { - BroadcastLocalizedMessage( class'SmartCTFMessage', 7, RelatedPRI_1 ); - } - if( bPlaySavedSound && PlayerPawn( RelatedPRI_1.Owner ) != None ) - { - PlayerPawn( RelatedPRI_1.Owner ).ReceiveLocalizedMessage( class'SmartCTFAudioMsg', 2 ); - } - } - } - else if( IsInZone( RelatedPRI_1, 1 - Flag.Team ) ) - { - RelatedPRI_1.Score += EnemyBaseReturnBonus; // If in enemy base - if( Level.Game.LocalLog != None ) - { - Level.Game.LocalLog.LogSpecialEvent( "flag_return_enemybase", RelatedPRI_1.PlayerID, Flag.Team ); - } - } - else if( !IsInZone( RelatedPRI_1, Flag.Team ) ) // Not in enemy base and not on own side = mid - { - RelatedPRI_1.Score += MidReturnBonus; // If in Mid - if( Level.Game.LocalLog != None ) - { - Level.Game.LocalLog.LogSpecialEvent( "flag_return_mid", RelatedPRI_1.PlayerID, Flag.Team ); - } - } - else - { - RelatedPRI_1.Score += BaseReturnBonus; - if( Level.Game.LocalLog != None ) - { - Level.Game.LocalLog.LogSpecialEvent( "flag_return_base", RelatedPRI_1.PlayerID, Flag.Team ); - } - } - - } // end if switch == 1 - - ResetSprees( Flag.Team ); // Reset cover sprees and seal sprees of Other Team - ResetFlagCarriers( 1 - Flag.Team ); // Reset assist list - } - - break; - } // end switch - if(bStoreStats) - { - UpdateInfo(); - } - } // end if msg is CTF msg. - - return super.MutatorBroadcastLocalizedMessage( Sender, Receiver, Message, Switch, RelatedPRI_1, RelatedPRI_2, OptionalObject ); -} - -/* - * Gives all players of Team that covered their FC extra bonus points after the cap. -*/ -function GiveCoverSealBonus( int Team ) -{ - local PlayerReplicationInfo pnPRI; - local byte i; - local SmartCTFPlayerReplicationInfo PawnStats; - local Pawn pn; - - SCTFGame.RefreshPRI(); - for( i = 0; i < 64; i++ ) - { - PawnStats = SCTFGame.GetStatNr( i ); - if( PawnStats == None ) - { - break; - } - pnPRI = PlayerReplicationInfo( PawnStats.Owner ); - pn = Pawn( pnPRI.Owner ); - - if( pnPRI.Team != Team ) - { - if( PawnStats != None && PawnStats.SealSpree > 0 ) - { - pnPRI.Score += PawnStats.SealSpree * SealBonus; - if( bShowSealRewardConsoleMsg && PlayerPawn( pn ) != None ) - { - PlayerPawn( pn ).ClientMessage("You killed " $ PawnStats.SealSpree $ " people sealing off the base. You get " $ PawnStats.SealSpree * SealBonus $ " bonus pts!" ); - } - if( Level.Game.LocalLog != None ) - { - Level.Game.LocalLog.LogSpecialEvent( "seal_bonus", pnPRI.PlayerID, PawnStats.SealSpree, PawnStats.SealSpree * SealBonus ); - } - } - if( PawnStats != None && PawnStats.CoverSpree > 0 ) - { - pnPRI.Score += PawnStats.CoverSpree * CoverBonus; - if( bShowCoverRewardConsoleMsg && PlayerPawn( pn ) != None ) - { - PlayerPawn( pn ).ClientMessage("You killed " $ PawnStats.CoverSpree $ " people covering your FC. You get " $ PawnStats.CoverSpree * CoverBonus $ " bonus pts!" ); - } - if( Level.Game.LocalLog != None ) - { - Level.Game.LocalLog.LogSpecialEvent( "cover_bonus", pnPRI.PlayerID, PawnStats.CoverSpree, PawnStats.CoverSpree * CoverBonus ); - } - } - } - } - if(bStoreStats) - { - UpdateInfo(); - } -} - -/* - * Reset cover and seal sprees of Team cause of flag return. -*/ -function ResetSprees( int Team ) -{ - local byte i; - local SmartCTFPlayerReplicationInfo PawnStats; - - SCTFGame.RefreshPRI(); - for( i = 0; i < 64; i++ ) - { - PawnStats = SCTFGame.GetStatNr( i ); - if( PawnStats == None ) - { - break; - } - if( PlayerReplicationInfo( PawnStats.Owner ).Team != Team ) - { - PawnStats.CoverSpree = 0; - PawnStats.SealSpree = 0; - } - } -} - -/* - * Clear stats. -*/ -function ClearStats() -{ - SCTFGame.ClearStats(); - ResetFlagCarriers( 2 ); - FCs[0] = None; - FCs[1] = None; -} - -/* - * Give info on 'mutate smartctf' commands. -*/ -function Mutate( string MutateString, PlayerPawn Sender ) -{ - local int ID; - local string SoundsString, MsgsString, CMsgsString; - local SmartCTFPlayerReplicationInfo SenderStats; - - if( Left( MutateString, 8 ) ~= "SmartCTF" ) - { - ID = Sender.PlayerReplicationInfo.PlayerID; - - if( Mid( MutateString, 9, 9 ) ~= "ShowStats" || Mid( MutateString, 9, 5 ) ~= "Stats" ) - { - SenderStats = SCTFGame.GetStats( Sender ); - if( SenderStats != None ) - { - SenderStats.ToggleStats(); - } - } - else if( Mid( MutateString, 9, 10 ) ~= "ForceStats" ) - { - SenderStats = SCTFGame.GetStats( Sender ); - if( SenderStats != None ) - { - SenderStats.ShowStats(); - } - } - else if( Mid( MutateString, 9, 5 ) ~= "Rules" || Mid( MutateString, 9, 6 ) ~= "Points" || Mid( MutateString, 9, 5 ) ~= "Score" || Mid( MutateString, 9, 5 ) ~= "Bonus" ) - { - if( bNewCapAssistScoring ) - { - Sender.ClientMessage( "SmartCTF Score Settings: - Cap/Assist:" @ 7 + CapBonus @ "pts divided over all FC's by time" ); - } - else - { - Sender.ClientMessage( "SmartCTF Score Settings: - Cap:" @ 7 + CapBonus @ "pts, Assist:" @ AssistBonus @ "pts." ); - } - Sender.ClientMessage( "- Cover (Kills while defending FC) Bonus :" @ CoverBonus @ "pts each. And" @ CoverBonus @ "more pts each if FC caps." ); - Sender.ClientMessage( "- Seal Bonus:" @ SealBonus @ "pts each, and" @ SealBonus @ "more pts each if FC caps." ); - Sender.ClientMessage( "- Seals (Kills while sealing off base) are defined by: 1) Your FC is on your team's side of map. 2) Your flag is not taken. 3) You kill someone on your side of the map." ); - if(bExtraStats) - { - Sender.ClientMessage( "- DefKills (Kills while the enemy is in your base area) are defined by: 1) Your flag is not taken. 2) You kill someone on your side of the map." ); - Sender.ClientMessage( "- Flagkills:" @ 5 + FlagKillBonus @ "pts. Flag Returns in base are worth" @ DitchZeros( BaseReturnBonus ) @ "pts, in mid" @ DitchZeros( MidReturnBonus ) @ "pts, enemy base" @ DitchZeros( EnemyBaseReturnBonus ) @ "pts, VERY close to capping" @ DitchZeros( CloseSaveReturnBonus ) @ "pts." ); - Sender.ClientMessage( "- Additional features: See Readme!" ); - } - } - else if( Mid( MutateString, 9, 8 ) ~= "ForceEnd" ) - { - if( !Sender.PlayerReplicationInfo.bAdmin && Level.NetMode != NM_StandAlone ) - { - Sender.ClientMessage( "You need to be logged in as admin to force the game to end." ); - } - else - { - BroadcastMessage( Sender.PlayerReplicationInfo.PlayerName @ "forced the game to end." ); - bForcedEndGame = True; - CTFGame( Level.Game ).EndGame( "forced" ); - } - } - else if( Mid( MutateString, 9, 10 ) ~= "ClearStats" ) - { - if( !Sender.PlayerReplicationInfo.bAdmin && Level.NetMode != NM_StandAlone ) - { - Sender.ClientMessage( "You need to be logged in as admin to be able to clear the stats." ); - } - else - { - ClearStats(); - Sender.ClientMessage( "Stats cleared." ); - } - } - else - { - Sender.ClientMessage( "SmartCTF - ChaCha Fork V6"); - Sender.ClientMessage( "Originally by: {PiN}Kev_HH. 4C by {DnF2}SiNiSTeR. 4D by [es]Rush. 4E by adminthis & The_Cowboy & Sp0ngeb0b.!"); - Sender.ClientMessage( "- To toggle stats, bind a key or type in console: 'Mutate SmartCTF Stats'" ); - Sender.ClientMessage( "- Type 'Mutate CTFInfo' for SmartCTF settings." ); - Sender.ClientMessage( "- Type 'Mutate SmartCTF Rules' for new point system definition." ); - Sender.ClientMessage( "- Type 'Mutate SmartCTF ForceEnd' to end a game." ); - if( bEnableOvertimeControl ) - { - Sender.ClientMessage( "- Type 'Mutate OverTime ' for Overtime Control." ); - } - } - } - else if( Left( MutateString, 7 ) ~= "CTFInfo" ) - { - SoundsString = ""; - if( bPlayCaptureSound ) SoundsString = SoundsString @ "Capture"; - if( bPlayAssistSound ) SoundsString = SoundsString @ "Assist"; - if( bPlaySavedSound ) SoundsString = SoundsString @ "Saved"; - if( bPlayLeadSound ) SoundsString = SoundsString @ "Lead"; - if( bPlay30SecSound ) SoundsString = SoundsString @ "30SecLeft"; - if( SoundsString == "" ) SoundsString = "All off"; - if( Left( SoundsString, 1 ) == " " ) SoundsString = Mid( SoundsString, 1 ); - MsgsString = ""; - if( CoverMsgType == 1 ) MsgsString = MsgsString @ "Covers"; - if( CoverMsgType == 2 ) MsgsString = MsgsString @ "Covers"; - if( CoverMsgType == 3 ) MsgsString = MsgsString @ "Covers"; - if( CoverSpreeMsgType == 1 ) MsgsString = MsgsString @ "Coversprees"; - if( CoverSpreeMsgType == 2 ) MsgsString = MsgsString @ "Coversprees"; - if( CoverSpreeMsgType == 3 ) MsgsString = MsgsString @ "Coversprees"; - if( DeniedMsgType == 1 ) MsgsString = MsgsString @ "Denied"; - if( DeniedMsgType == 2 ) MsgsString = MsgsString @ "Denied"; - if( DeniedMsgType == 3 ) MsgsString = MsgsString @ "Denied"; - if( SealMsgType == 1 ) MsgsString = MsgsString @ "Seals"; - if( SealMsgType == 2 ) MsgsString = MsgsString @ "Seals"; - if( SealMsgType == 3 ) MsgsString = MsgsString @ "Seals"; - if( SavedMsgType == 1 ) MsgsString = MsgsString @ "Saved"; - if( SavedMsgType == 2 ) MsgsString = MsgsString @ "Saved"; - if( SavedMsgType == 3 ) MsgsString = MsgsString @ "Saved"; - if( MsgsString == "" ) MsgsString = "All off"; - if( Left( MsgsString, 1 ) == " " ) MsgsString = Mid( MsgsString, 1 ); - CMsgsString = ""; - if( bShowAssistConsoleMsg ) CMsgsString = CMsgsString @ "AssistBonus"; - if( bShowSealRewardConsoleMsg ) CMsgsString = CMsgsString @ "SealReward"; - if( bShowCoverRewardConsoleMsg ) CMsgsString = CMsgsString @ "CoverReward"; - if( bShowLongRangeMsg ) CMsgsString = CMsgsString @ "LongRangeKill"; - if( CMsgsString == "" ) CMsgsString = "All off"; - if( Left( CMsgsString, 1 ) == " " ) CMsgsString = Mid( CMsgsString, 1 ); - Sender.ClientMessage( "- bExtraStats:" @ bExtraStats); - Sender.ClientMessage( "- Sounds:" @ SoundsString ); - Sender.ClientMessage( "- Msgs:" @ MsgsString ); - Sender.ClientMessage( "- Private Msgs:" @ CMsgsString ); - Sender.ClientMessage( "- bFixFlagBug:" @ bFixFlagBug ); - Sender.ClientMessage( "- bEnhancedMultiKill:" @ bEnhancedMultiKill $ ", Broadcast Level:" @ EnhancedMultiKillBroadcast ); - Sender.ClientMessage( "- bShowFCLocation:" @ bShowFCLocation ); - if( bSpawnKillDetection ) Sender.ClientMessage( "- bSpawnKillDetection: True, Global Msg:" @ bShowSpawnKillerGlobalMsg $ ", Penalty:" @ SpawnKillPenalty @ "pts" ); - else Sender.ClientMessage( "- bSpawnKillDetection: False" ); - Sender.ClientMessage( "- Overtime Control:" @ bEnableOvertimeControl @ "( Type 'Mutate OverTime' )" ); - Sender.ClientMessage( "- Scores: ( Type 'Mutate SmartCTF Rules' )"); - } - else if( Left( MutateString, 8 ) ~= "OverTime" ) - { - if( !DeathMatchPlus( Level.Game ).bTournament ) - { - Sender.ClientMessage( "Not in Tournament Mode: Default Sudden Death Overtime behaviour." ); - } - else if( !bEnableOvertimeControl ) - { - Sender.ClientMessage( "Overtime Control is not enabled: Default UT Sudden Death functionality." ); - Sender.ClientMessage( "Admins can use: admin set SmartCTF bEnableOvertimeControl True" ); - } - else - { - if( Left( MutateString, 11 ) ~= "OverTime On" ) - { - if( !Sender.PlayerReplicationInfo.bAdmin && Level.NetMode != NM_StandAlone ) - { - Sender.ClientMessage( "You need to be logged in as admin to change this setting." ); - } - else - { - bOvertime = True; - SaveConfig(); - BroadcastLocalizedMessage( class'SmartCTFCoolMsg', 3 ); - } - } - else if( Left( MutateString, 12 ) ~= "OverTime Off" ) - { - if( !Sender.PlayerReplicationInfo.bAdmin && Level.NetMode != NM_StandAlone ) - { - Sender.ClientMessage( "You need to be logged in as admin to change this setting." ); - } - else - { - bOvertime = False; - SaveConfig(); - BroadcastLocalizedMessage( class'SmartCTFCoolMsg', 4 ); - } - } - else - { - if( Sender.PlayerReplicationInfo.bAdmin || Level.NetMode == NM_StandAlone ) - { - Sender.ClientMessage( "Usage: Mutate OverTime On|Off" ); - } - if( !bOvertime ) - { - Sender.ClientMessage( "Sudden Death Overtime is DISABLED." ); - } - else - { - Sender.ClientMessage( "Sudden Death Overtime is ENABLED (default)." ); - } - Sender.ClientMessage( "Remember 'Disabled' Setting:" @ bRememberOvertimeSetting ); - } - } - } - - super.Mutate( MutateString, Sender ); -} - -/* - * To stop on a tie if needed. -*/ -function bool HandleEndGame() -{ - local bool bTied; - - if( CTFGame( Level.Game ).Teams[0].Score == CTFGame( Level.Game ).Teams[1].Score ) - { - bTied = True; - } - - if( bForcedEndGame || ( bEnableOvertimeControl && !bOvertime && DeathMatchPlus( Level.Game ).bTournament ) ) - { - bForcedEndGame = False; - if( bTied ) - { - SetEndCamsTiedCTFGame(); - return True; - } - } - - if( !bTied ) - { - CalcSmartCTFEndStats(); - } - if(bStoreStats) - { - UpdateInfo(); - } - if( NextMutator != None ) - { - return NextMutator.HandleEndGame(); - } - return False; -} - - -/* - * Position end cameras for a tied game. -*/ -function SetEndCamsTiedCTFGame() -{ - local Pawn pn, Best; - local PlayerPawn Player; - local CTFGame gg; - - gg = CTFGame( Level.Game ); - - // Find Individual Winner - for( pn = Level.PawnList ; pn != None ; pn = pn.NextPawn ) - { - if( pn.bIsPlayer && ( ( Best == None ) || ( pn.PlayerReplicationInfo.Score > Best.PlayerReplicationInfo.Score ) ) ) - { - Best = pn; - } - } - - gg.GameReplicationInfo.GameEndedComments = GameTieMessage; - gg.EndTime = Level.TimeSeconds + 3.0; - - for( pn = Level.PawnList ; pn != None ; pn = pn.NextPawn ) - { - Player = PlayerPawn( pn ); - if( Player != None ) - { - Player.bBehindView = True; - if( Player == Best ) - { - Player.ViewTarget = None; - } - else - { - Player.ViewTarget = Best; - } - - Player.ClientPlaySound( sound'CaptureSound', , true ); - Player.ClientGameEnded(); - } - pn.GotoState( 'GameEnded' ); - } - - gg.CalcEndStats(); - CalcSmartCTFEndStats(); -} - -function CalcSmartCTFEndStats() -{ - local SmartCTFPlayerReplicationInfo TopScore, TopFrags, TopCaps, TopCovers, TopFlagkills, TopHeadshots; - local string BestRecordDate; - local float PerHour; - local SmartCTFPlayerReplicationInfo PawnStats; - local PlayerReplicationInfo PRI; - local byte i; - local SmartCTFEndStats EndStats; - - EndStats = SCTFGame.EndStats; - - SCTFGame.RefreshPRI(); - for( i = 0; i < 64; i++ ) - { - PawnStats = SCTFGame.GetStatNr( i ); - if( PawnStats == None ) - { - break; - } - - if( TopScore == None || PlayerReplicationInfo( PawnStats.Owner ).Score > PlayerReplicationInfo( TopScore.Owner ).Score ) - { - TopScore = PawnStats; - } - if( TopFrags == None || PawnStats.Frags > TopFrags.Frags ) - { - TopFrags = PawnStats; - } - if( TopCaps == None || PawnStats.Captures > TopCaps.Captures ) - { - TopCaps = PawnStats; - } - if( TopCovers == None || PawnStats.Covers > TopCovers.Covers ) - { - TopCovers = PawnStats; - } - if( TopFlagkills == None || PawnStats.FlagKills > TopFlagkills.FlagKills ) - { - TopFlagkills = PawnStats; - } - if( TopHeadshots == None || PawnStats.HeadShots > TopHeadshots.HeadShots ) - { - TopHeadshots = PawnStats; - } - } - - PRI = PlayerReplicationInfo( TopScore.Owner ); - PerHour = ( Level.TimeSeconds - PRI.StartTime ) / 3600; - if( PRI.Score / PerHour > EndStats.MostPoints.Count && Level.TimeSeconds - PRI.StartTime > 300 ) - { - EndStats.MostPoints.Count = PRI.Score / PerHour; - EndStats.MostPoints.PlayerName = PRI.PlayerName; - EndStats.MostPoints.MapName = Level.Title; - CTFGame( Level.Game ).GetTimeStamp( BestRecordDate ); - EndStats.MostPoints.RecordDate = BestRecordDate; - } - - PRI = PlayerReplicationInfo( TopFrags.Owner ); - PerHour = ( Level.TimeSeconds - PRI.StartTime ) / 3600; - if( TopFrags.Frags / PerHour > EndStats.MostFrags.Count && Level.TimeSeconds - PRI.StartTime > 300 ) - { - EndStats.MostFrags.Count = TopFrags.Frags / PerHour; - EndStats.MostFrags.PlayerName = PRI.PlayerName; - EndStats.MostFrags.MapName = Level.Title; - CTFGame( Level.Game ).GetTimeStamp( BestRecordDate ); - EndStats.MostFrags.RecordDate = BestRecordDate; - } - - PRI = PlayerReplicationInfo( TopCaps.Owner ); - PerHour = ( Level.TimeSeconds - PRI.StartTime ) / 3600; - if( TopCaps.Captures / PerHour > EndStats.MostCaps.Count && Level.TimeSeconds - PRI.StartTime > 300 ) - { - EndStats.MostCaps.Count = TopCaps.Captures / PerHour; - EndStats.MostCaps.PlayerName = PRI.PlayerName; - EndStats.MostCaps.MapName = Level.Title; - CTFGame( Level.Game ).GetTimeStamp( BestRecordDate ); - EndStats.MostCaps.RecordDate = BestRecordDate; - } - - PRI = PlayerReplicationInfo( TopCovers.Owner ); - PerHour = ( Level.TimeSeconds - PRI.StartTime ) / 3600; - if( TopCovers.Covers / PerHour > EndStats.MostCovers.Count && Level.TimeSeconds - PRI.StartTime > 300 ) - { - EndStats.MostCovers.Count = TopCovers.Covers / PerHour; - EndStats.MostCovers.PlayerName = PRI.PlayerName; - EndStats.MostCovers.MapName = Level.Title; - CTFGame( Level.Game ).GetTimeStamp( BestRecordDate ); - EndStats.MostCovers.RecordDate = BestRecordDate; - } - - PRI = PlayerReplicationInfo( TopFlagkills.Owner ); - PerHour = ( Level.TimeSeconds - PRI.StartTime ) / 3600; - if( TopFlagkills.FlagKills / PerHour > EndStats.MostFlagKills.Count && Level.TimeSeconds - PRI.StartTime > 300 ) - { - EndStats.MostFlagKills.Count = TopFlagkills.FlagKills / PerHour; - EndStats.MostFlagKills.PlayerName = PRI.PlayerName; - EndStats.MostFlagKills.MapName = Level.Title; - CTFGame( Level.Game ).GetTimeStamp( BestRecordDate ); - EndStats.MostFlagKills.RecordDate = BestRecordDate; - } - - PRI = PlayerReplicationInfo( TopHeadshots.Owner ); - PerHour = ( Level.TimeSeconds - PRI.StartTime ) / 3600; - if( TopHeadshots.HeadShots / PerHour > EndStats.MostHeadShots.Count && Level.TimeSeconds - PRI.StartTime > 300 ) - { - EndStats.MostHeadShots.Count = TopHeadshots.HeadShots / PerHour; - EndStats.MostHeadShots.PlayerName = PRI.PlayerName; - EndStats.MostHeadShots.MapName = Level.Title; - CTFGame( Level.Game ).GetTimeStamp( BestRecordDate ); - EndStats.MostHeadShots.RecordDate = BestRecordDate; - } - - EndStats.SaveConfig(); -} - -/* - * Convert a float to a readable string. -*/ -function string DitchZeros( float nr ) -{ - local string str; - - str = string( nr ); - while( Right( str, 1 ) == "0" ) - { - str = Left( str , Len( str ) - 1 ); - } - if( Right( str, 1 ) == "." ) - { - str = Left( str , Len( str ) - 1 ); - } - - return str; -} - -//---------------------------------------------------------------------------------------------------------------- -//------------------------------------------------ CLIENT FUNCTIONS ---------------------------------------------- -//---------------------------------------------------------------------------------------------------------------- - -/* - * Render the HUD that is startup logo and FC location. - * ONLY gets executed on clients. -*/ -simulated event PostRender( Canvas C ) -{ - local int i, Y; - local float DummyY, Size, Temp; - local string TempStr; - - if( NextHUDMutator != None ) - { - NextHUDMutator.PostRender( C ); - } - - // Get stuff relating to PlayerOwner, if not gotten. Also spawn Font info. - if( PlayerOwner == None ) - { - PlayerOwner = C.Viewport.Actor; - pPRI = PlayerOwner.PlayerReplicationInfo; - } - - if(MyHUD == None) - { - MyHUD = ChallengeHUD( PlayerOwner.MyHUD ); - MyFonts = MyHUD.MyFonts; - } - - if(pTGRI == None) - { - pTGRI = TournamentGameReplicationInfo (PlayerOwner.GameReplicationInfo); - if(pTGRI==None) - { - return; - } - } - - // Draw the FC Location - if( SCTFGame.bShowFCLocation ) - { - for( i = 0; i < 32; i++ ) - { - if( pTGRI.PRIArray[i] == None ) - { - break; - } - if( pTGRI.PRIArray[i].bIsSpectator && !pTGRI.PRIArray[i].bWaitingPlayer ) - { - continue; - } - if( pTGRI.PRIArray[i].HasFlag != None && pTGRI.PRIArray[i].Team == pPRI.Team && pTGRI.PRIArray[i].PlayerID != pPRI.PlayerID && !pTGRI.PRIArray[i].HasFlag.IsA( 'GreenFlag' ) ) - { - if( pTGRI.PRIArray[i].PlayerLocation != None ) - { - TempStr = pTGRI.PRIArray[i].PlayerLocation.LocationName; - } - else if( pTGRI.PRIArray[i].PlayerZone != None ) - { - TempStr = pTGRI.PRIArray[i].PlayerZone.ZoneName; - } - if( TempStr == "" ) - { - TempStr = "Nameless Area"; - C.Style = ERenderStyle.STY_Translucent; - } - else - { - C.Style = ERenderStyle.STY_Normal; - } - - if( pPRI.Team == 0 ) - { - C.DrawColor = RedTeamColor; - } - else - { - C.DrawColor = BlueTeamColor; - } - - C.Font = MyFonts.GetSmallestFont( C.ClipX ); - C.StrLen( TempStr, Size, DummyY ); - if( MyHUD.bHideAllWeapons ) - { - Y = C.ClipY; - } - else if( MyHUD.HudScale * MyHUD.WeaponScale * C.ClipX <= C.ClipX - 256 * MyHUD.Scale) - { - Y = C.ClipY - 64 * MyHUD.Scale; - } - else - { - Y = C.ClipY - 128 * MyHUD.Scale; - } - - C.SetPos( C.ClipX - Size - 6, Y - 4 - 32 + ( 32 - DummyY ) / 2 ); - C.DrawText( TempStr ); - if( C.Style == ERenderStyle.STY_Translucent ) - { - C.DrawColor = Gray; - } - else - { - C.DrawColor = White; - } - C.SetPos( C.ClipX - Size - 6 - 32 - 4, Y - 4 - 32 ); - if( pPRI.Team == 0 ) - { - C.DrawIcon( texture'blueflag', 1.0 ); - } - else - { - C.DrawIcon( texture'redflag', 1.0 ); - } - - break; - } - } - } - - // Draw "Powered by.." logo when player joins - if( DrawLogo != 0 ) - { - C.Style = ERenderStyle.STY_Translucent; - if( DrawLogo > 1 ) - { - C.DrawColor.R = 255 - DrawLogo/2; - C.DrawColor.G = 255 - DrawLogo/2; - C.DrawColor.B = 255 - DrawLogo/2; - } - else // 1 - { - C.Style = ERenderStyle.STY_Translucent; - C.DrawColor = White; - } - if(powered == None) - { - powered=texture'powered'; - } - C.SetPos( C.ClipX - powered.Usize - 16, 40 ); - C.DrawIcon( powered, 1 ); - C.Font = MyFonts.GetSmallFont( C.ClipX ); - C.StrLen( "SmartCTF "$Version , Size, DummyY ); - C.SetPos( C.ClipX - powered.Usize/2 - Size/2 - 16, 40 + 8 + powered.Vsize ); - Temp = DummyY; - C.DrawText( "SmartCTF "$Version ); - } - - C.Style = ERenderStyle.STY_Normal; -} - - -/* - * Executed on the client when that player joins the server. -*/ -simulated function ClientJoinServer( Pawn Other ) -{ - if( PlayerPawn( Other ) == None || !Other.bIsPlayer ) - { - return; - } - - if(SCTFGame.bDrawLogo) - { - DrawLogo = 1; - } - - SetTimer( 0.05 , True); - - // Since this gets called in the HUD it needs to be changed clientside. - if( SCTFGame.bPlay30SecSound ) - { - class'TimeMessage'.default.TimeSound[5] = sound'Announcer.CD30Sec'; - } -} - -/* - * Clientside settings that need to be set for the first time, checking for welcome message and - * end of game screen. -*/ -simulated function Tick( float delta ) -{ - local SmartCTFPlayerReplicationInfo OwnerStats; - - // Execute on client - if( Level.NetMode != NM_DedicatedServer ) - { - if( SCTFGame == None ) - { - ForEach AllActors( class'SmartCTFGameReplicationInfo', SCTFGame ) - { - break; - } - - if( SCTFGame == None ) - { - return; - } - - if( !SCTFGame.bServerInfoSetServerSide && SCTFGame.DefaultHUDType != None ) // client side required - { - class( SCTFGame.DefaultHUDType ).default.ServerInfoClass = class'SmartCTFServerInfo'; - Log( "Notified HUD (clientside," @ SCTFGame.DefaultHUDType.name $ ") to use SmartCTF ServerInfo.", 'SmartCTF' ); - } - } - if( !SCTFGame.bInitialized ) - { - return; - } - - if( !bHUDMutator ) - { - RegisterHUDMutator(); - } - - if( PlayerOwner != None ) - { - if( !bClientJoinPlayer ) - { - bClientJoinPlayer = True; - ClientJoinServer( PlayerOwner ); - } - - // If Game is over, bring up F3. - if(PlayerOwner.GameReplicationInfo !=None) - { - if( PlayerOwner.GameReplicationInfo.GameEndedComments != "" && !bGameEnded ) - { - bGameEnded = True; - OwnerStats = SCTFGame.GetStatsByPRI( pPRI ); - OwnerStats.bEndStats = True; - PlayerOwner.ConsoleCommand( "mutate SmartCTF ForceStats" ); - } - } - } - } -} - -/* - * For showing the Logo a Timer is used instead of Ticks so its equal for each tickrate. - * On the server it keeps track of some replicated data and whether a Tournament game is starting. -*/ -simulated function Timer() -{ - local bool bReady; - local Pawn pn; - local SmartCTFPlayerReplicationInfo SenderStats; - - super.Timer(); - - // Clients - 0.05 second timer. Stops after logo is displayed. - if( Level.NetMode != NM_DedicatedServer ) - { - if( DrawLogo != 0 && SCTFGame.bDrawLogo ) - { - LogoCounter++; - if( DrawLogo == 510 ) - { - DrawLogo = 0; - if( Role != ROLE_Authority ) - { - SetTimer( 0.0, False ); // client timer off - } - else - { - SetTimer( 1.0, True ); // standalone game? keep timer running for bit below. - } - } - else if( LogoCounter > 60 ) - { - DrawLogo += 8; - if( DrawLogo > 510 ) - { - DrawLogo = 510; - } - } - else if( LogoCounter == 60 ) - { - DrawLogo = 5; - } - } - - if(!bInitSb && SCTFGame.bSCTFSbDef){ // SCTFGame fixes bSCTFSbDef bug. - if(bGameEnded) - { - // Don't interfere with scoreboard showing on game end - bInitSb=true; - return; - } - SbCount++; - if(SbCount>=SCTFGame.SbDelayC){ // Wait SbDelayC second(s) before calling SmartCTF sb - SenderStats = SCTFGame.GetStats( PlayerOwner ); - if( SenderStats != None ) - { - SenderStats.ShowStats(true); - } - bInitSb=true; - if(!SCTFGame.bDrawLogo && Role != ROLE_Authority) - { - SetTimer(0.0,False); - } - } - } - } - - // Server - 1 second timer. infinite. - if( Level.NetMode == NM_DedicatedServer || Role == ROLE_Authority ) - { - if( ++TRCount > 2 ) - { - SCTFGame.TickRate = int( ConsoleCommand( "get IpDrv.TcpNetDriver NetServerMaxTickRate" ) ); - TRCount = 0; - } - - SbDelayC = SbDelay*20; // Timer is called every 0.05s, so * 20 converts the value in seconds to our count compatible value - - // Update config vars to client / manual replication :E - // Allows for runtime changing of settings. - if( SCTFGame.bShowFCLocation != bShowFCLocation ) SCTFGame.bShowFCLocation = bShowFCLocation; - if( SCTFGame.bStatsDrawFaces != bStatsDrawFaces ) SCTFGame.bStatsDrawFaces = bStatsDrawFaces; - if( SCTFGame.bDrawLogo != bDrawLogo ) SCTFGame.bDrawLogo = bDrawLogo; - if( SCTFGame.bSCTFSbDef != bSCTFSbDef ) SCTFGame.bSCTFSbDef = bSCTFSbDef; - if( SCTFGame.bShowSpecs != bShowSpecs ) SCTFGame.bShowSpecs = bShowSpecs; - if( SCTFGame.SpectatorColor != SpectatorColor ) SCTFGame.SpectatorColor = SpectatorColor; - if( SCTFGame.bDoKeybind != bDoKeybind ) SCTFGame.bDoKeybind = bDoKeybind; - if( SCTFGame.SbDelayC != SbDelayC ) SCTFGame.SbDelayC = SbDelayC; - if( SCTFGame.bSnowyScoreboard != bSnowyScoreboard ) SCTFGame.bSnowyScoreboard = bSnowyScoreboard; - if( SCTFGame.bXmasImages != bXmasImages ) SCTFGame.bXmasImages = bXmasImages; - - if( !bTournamentGameStarted && DeathMatchPlus( Level.Game ).bTournament ) - { - if( DeathMatchPlus( Level.Game ).bRequireReady && - DeathMatchPlus( Level.Game ).CountDown > 0 && - ( DeathMatchPlus( Level.Game ).NumPlayers == DeathMatchPlus( Level.Game ).MaxPlayers || Level.NetMode == NM_Standalone ) && - DeathMatchPlus( Level.Game ).RemainingBots <= 0 ) - { - bReady = True; - for( pn = Level.PawnList; pn != None; pn = pn.NextPawn ) - { - if( pn.IsA( 'PlayerPawn' ) && !pn.IsA( 'Spectator' ) && !PlayerPawn( pn ).bReadyToPlay ) - { - bReady = False; - break; - } - } - } - - if( bReady ) - { - bTournamentGameStarted = True; - TournamentGameStarted(); - } - } - - // UT's built-in messaging spectator is excluded from the spectator list based on its starttime. - // We need to make sure this does not include any players as well. - // Update: on slow/exotic servers, the starttime could be delayed (not 0). Let's make sure it is. - if(!bStartTimeCorrected && bShowSpecs) - { - for(pn = Level.PawnList; pn != None; pn = pn.NextPawn){ - if(pn.IsA('PlayerPawn') && pn.PlayerReplicationInfo.StartTime==0) - { - pn.PlayerReplicationInfo.StartTime=1; - } - if(!pn.bIsPlayer && pn.PlayerReplicationInfo.Playername=="Player") - { - pn.PlayerReplicationInfo.StartTime=0; - } - } - if(Level.TimeSeconds>=5) - { - bStartTimeCorrected=true; // After five seconds, the messaging spectator(s) should be loaded, so we are done. - } - } - - // Since PlayerID's are incremented in the order of player joins [and those joined later cannot have an earlier StartTime than preceding players], this can be reliably used to deliver each player the delayed message only once - // without having to resort to a large array of PIDs already messaged; we can simply check against the *last* PID messaged instead. - // Too bad the timer only runs at 1.0. That sorf of defies the purpose of MsgDelay being a float instead of an int. O well... matches nice with SbDelay ;) - for(pn = Level.PawnList; pn != None; pn = pn.NextPawn) - { - if( pn.IsA('PlayerPawn') && - pn.bIsPlayer && - Level.TimeSeconds - pn.PlayerReplicationInfo.StartTime >= MsgDelay && - pn.PlayerReplicationInfo.PlayerID>MsgPID) - { - if(!SCTFGame.bDrawLogo) - { - pn.ClientMessage( "Running SmartCTF " $ Version $ ". Type 'Mutate SmartCTF' in the console for info." ); - } - if(bExtraMsg && bDoKeybind && SCTFGame.bDrawLogo) - { - pn.ClientMessage("Running SmartCTF " $ Version $ ". Press F3 to toggle between scoreboards."); - } - else if(bExtraMsg && bDoKeybind) - { - pn.ClientMessage("Press F3 to toggle between scoreboards."); // Shorter msg, since we already announced we are running SmartCTF. - } - MsgPID = pn.PlayerReplicationInfo.PlayerID; // Increase to keep track of whom still to message - } - } - } -} - -defaultproperties -{ - SCTFGame=None - RedAstIndex=0 - BlueAstIndex=0 - TRCount=0 - version="ChaChaV5" - GameTieMessage="The game ended in a tie!" - FCs(0)=None - FCs(1)=None - RedAssisters(0)=None - RedAssisters(1)=None - RedAssisters(2)=None - RedAssisters(3)=None - RedAssisters(4)=None - RedAssisters(5)=None - RedAssisters(6)=None - RedAssisters(7)=None - RedAssisters(8)=None - RedAssisters(9)=None - RedAssisters(10)=None - RedAssisters(11)=None - RedAssisters(12)=None - RedAssisters(13)=None - RedAssisters(14)=None - RedAssisters(15)=None - RedAssisters(16)=None - RedAssisters(17)=None - RedAssisters(18)=None - RedAssisters(19)=None - RedAssisters(20)=None - RedAssisters(21)=None - RedAssisters(22)=None - RedAssisters(23)=None - RedAssisters(24)=None - RedAssisters(25)=None - RedAssisters(26)=None - RedAssisters(27)=None - RedAssisters(28)=None - RedAssisters(29)=None - RedAssisters(30)=None - RedAssisters(31)=None - BlueAssisters(0)=None - BlueAssisters(1)=None - BlueAssisters(2)=None - BlueAssisters(3)=None - BlueAssisters(4)=None - BlueAssisters(5)=None - BlueAssisters(6)=None - BlueAssisters(7)=None - BlueAssisters(8)=None - BlueAssisters(9)=None - BlueAssisters(10)=None - BlueAssisters(11)=None - BlueAssisters(12)=None - BlueAssisters(13)=None - BlueAssisters(14)=None - BlueAssisters(15)=None - BlueAssisters(16)=None - BlueAssisters(17)=None - BlueAssisters(18)=None - BlueAssisters(19)=None - BlueAssisters(20)=None - BlueAssisters(21)=None - BlueAssisters(22)=None - BlueAssisters(23)=None - BlueAssisters(24)=None - BlueAssisters(25)=None - BlueAssisters(26)=None - BlueAssisters(27)=None - BlueAssisters(28)=None - BlueAssisters(29)=None - BlueAssisters(30)=None - BlueAssisters(31)=None - RedFlagCarrier(0)=None - RedFlagCarrier(1)=None - RedFlagCarrier(2)=None - RedFlagCarrier(3)=None - RedFlagCarrier(4)=None - RedFlagCarrier(5)=None - RedFlagCarrier(6)=None - RedFlagCarrier(7)=None - RedFlagCarrier(8)=None - RedFlagCarrier(9)=None - RedFlagCarrier(10)=None - RedFlagCarrier(11)=None - RedFlagCarrier(12)=None - RedFlagCarrier(13)=None - RedFlagCarrier(14)=None - RedFlagCarrier(15)=None - RedFlagCarrier(16)=None - RedFlagCarrier(17)=None - RedFlagCarrier(18)=None - RedFlagCarrier(19)=None - RedFlagCarrier(20)=None - RedFlagCarrier(21)=None - RedFlagCarrier(22)=None - RedFlagCarrier(23)=None - RedFlagCarrier(24)=None - RedFlagCarrier(25)=None - RedFlagCarrier(26)=None - RedFlagCarrier(27)=None - RedFlagCarrier(28)=None - RedFlagCarrier(29)=None - RedFlagCarrier(30)=None - RedFlagCarrier(31)=None - BlueFlagCarrier(0)=None - BlueFlagCarrier(1)=None - BlueFlagCarrier(2)=None - BlueFlagCarrier(3)=None - BlueFlagCarrier(4)=None - BlueFlagCarrier(5)=None - BlueFlagCarrier(6)=None - BlueFlagCarrier(7)=None - BlueFlagCarrier(8)=None - BlueFlagCarrier(9)=None - BlueFlagCarrier(10)=None - BlueFlagCarrier(11)=None - BlueFlagCarrier(12)=None - BlueFlagCarrier(13)=None - BlueFlagCarrier(14)=None - BlueFlagCarrier(15)=None - BlueFlagCarrier(16)=None - BlueFlagCarrier(17)=None - BlueFlagCarrier(18)=None - BlueFlagCarrier(19)=None - BlueFlagCarrier(20)=None - BlueFlagCarrier(21)=None - BlueFlagCarrier(22)=None - BlueFlagCarrier(23)=None - BlueFlagCarrier(24)=None - BlueFlagCarrier(25)=None - BlueFlagCarrier(26)=None - BlueFlagCarrier(27)=None - BlueFlagCarrier(28)=None - BlueFlagCarrier(29)=None - BlueFlagCarrier(30)=None - BlueFlagCarrier(31)=None - RedFlagCarrierTime(0)=0.000000 - RedFlagCarrierTime(1)=0.000000 - RedFlagCarrierTime(2)=0.000000 - RedFlagCarrierTime(3)=0.000000 - RedFlagCarrierTime(4)=0.000000 - RedFlagCarrierTime(5)=0.000000 - RedFlagCarrierTime(6)=0.000000 - RedFlagCarrierTime(7)=0.000000 - RedFlagCarrierTime(8)=0.000000 - RedFlagCarrierTime(9)=0.000000 - RedFlagCarrierTime(10)=0.000000 - RedFlagCarrierTime(11)=0.000000 - RedFlagCarrierTime(12)=0.000000 - RedFlagCarrierTime(13)=0.000000 - RedFlagCarrierTime(14)=0.000000 - RedFlagCarrierTime(15)=0.000000 - RedFlagCarrierTime(16)=0.000000 - RedFlagCarrierTime(17)=0.000000 - RedFlagCarrierTime(18)=0.000000 - RedFlagCarrierTime(19)=0.000000 - RedFlagCarrierTime(20)=0.000000 - RedFlagCarrierTime(21)=0.000000 - RedFlagCarrierTime(22)=0.000000 - RedFlagCarrierTime(23)=0.000000 - RedFlagCarrierTime(24)=0.000000 - RedFlagCarrierTime(25)=0.000000 - RedFlagCarrierTime(26)=0.000000 - RedFlagCarrierTime(27)=0.000000 - RedFlagCarrierTime(28)=0.000000 - RedFlagCarrierTime(29)=0.000000 - RedFlagCarrierTime(30)=0.000000 - RedFlagCarrierTime(31)=0.000000 - BlueFlagCarrierTime(0)=0.000000 - BlueFlagCarrierTime(1)=0.000000 - BlueFlagCarrierTime(2)=0.000000 - BlueFlagCarrierTime(3)=0.000000 - BlueFlagCarrierTime(4)=0.000000 - BlueFlagCarrierTime(5)=0.000000 - BlueFlagCarrierTime(6)=0.000000 - BlueFlagCarrierTime(7)=0.000000 - BlueFlagCarrierTime(8)=0.000000 - BlueFlagCarrierTime(9)=0.000000 - BlueFlagCarrierTime(10)=0.000000 - BlueFlagCarrierTime(11)=0.000000 - BlueFlagCarrierTime(12)=0.000000 - BlueFlagCarrierTime(13)=0.000000 - BlueFlagCarrierTime(14)=0.000000 - BlueFlagCarrierTime(15)=0.000000 - BlueFlagCarrierTime(16)=0.000000 - BlueFlagCarrierTime(17)=0.000000 - BlueFlagCarrierTime(18)=0.000000 - BlueFlagCarrierTime(19)=0.000000 - BlueFlagCarrierTime(20)=0.000000 - BlueFlagCarrierTime(21)=0.000000 - BlueFlagCarrierTime(22)=0.000000 - BlueFlagCarrierTime(23)=0.000000 - BlueFlagCarrierTime(24)=0.000000 - BlueFlagCarrierTime(25)=0.000000 - BlueFlagCarrierTime(26)=0.000000 - BlueFlagCarrierTime(27)=0.000000 - BlueFlagCarrierTime(28)=0.000000 - BlueFlagCarrierTime(29)=0.000000 - BlueFlagCarrierTime(30)=0.000000 - BlueFlagCarrierTime(31)=0.000000 - RedFCIndex=0 - BlueFCIndex=0 - RedAssistTimes(0)=0.000000 - RedAssistTimes(1)=0.000000 - RedAssistTimes(2)=0.000000 - RedAssistTimes(3)=0.000000 - RedAssistTimes(4)=0.000000 - RedAssistTimes(5)=0.000000 - RedAssistTimes(6)=0.000000 - RedAssistTimes(7)=0.000000 - RedAssistTimes(8)=0.000000 - RedAssistTimes(9)=0.000000 - RedAssistTimes(10)=0.000000 - RedAssistTimes(11)=0.000000 - RedAssistTimes(12)=0.000000 - RedAssistTimes(13)=0.000000 - RedAssistTimes(14)=0.000000 - RedAssistTimes(15)=0.000000 - RedAssistTimes(16)=0.000000 - RedAssistTimes(17)=0.000000 - RedAssistTimes(18)=0.000000 - RedAssistTimes(19)=0.000000 - RedAssistTimes(20)=0.000000 - RedAssistTimes(21)=0.000000 - RedAssistTimes(22)=0.000000 - RedAssistTimes(23)=0.000000 - RedAssistTimes(24)=0.000000 - RedAssistTimes(25)=0.000000 - RedAssistTimes(26)=0.000000 - RedAssistTimes(27)=0.000000 - RedAssistTimes(28)=0.000000 - RedAssistTimes(29)=0.000000 - RedAssistTimes(30)=0.000000 - RedAssistTimes(31)=0.000000 - BlueAssistTimes(0)=0.000000 - BlueAssistTimes(1)=0.000000 - BlueAssistTimes(2)=0.000000 - BlueAssistTimes(3)=0.000000 - BlueAssistTimes(4)=0.000000 - BlueAssistTimes(5)=0.000000 - BlueAssistTimes(6)=0.000000 - BlueAssistTimes(7)=0.000000 - BlueAssistTimes(8)=0.000000 - BlueAssistTimes(9)=0.000000 - BlueAssistTimes(10)=0.000000 - BlueAssistTimes(11)=0.000000 - BlueAssistTimes(12)=0.000000 - BlueAssistTimes(13)=0.000000 - BlueAssistTimes(14)=0.000000 - BlueAssistTimes(15)=0.000000 - BlueAssistTimes(16)=0.000000 - BlueAssistTimes(17)=0.000000 - BlueAssistTimes(18)=0.000000 - BlueAssistTimes(19)=0.000000 - BlueAssistTimes(20)=0.000000 - BlueAssistTimes(21)=0.000000 - BlueAssistTimes(22)=0.000000 - BlueAssistTimes(23)=0.000000 - BlueAssistTimes(24)=0.000000 - BlueAssistTimes(25)=0.000000 - BlueAssistTimes(26)=0.000000 - BlueAssistTimes(27)=0.000000 - BlueAssistTimes(28)=0.000000 - BlueAssistTimes(29)=0.000000 - BlueAssistTimes(30)=0.000000 - BlueAssistTimes(31)=0.000000 - PickupTime(0)=0.000000 - PickupTime(1)=0.000000 - FlagStands(0)=None - FlagStands(1)=None - bForcedEndGame=False - bTournamentGameStarted=False - bTooCloseForSaves=False - bStartTimeCorrected=False - MsgPID=0 - GoneName(0)="" - GoneName(1)="" - GoneName(2)="" - GoneName(3)="" - GoneName(4)="" - GoneName(5)="" - GoneName(6)="" - GoneName(7)="" - GoneName(8)="" - GoneName(9)="" - GoneName(10)="" - GoneName(11)="" - GoneName(12)="" - GoneName(13)="" - GoneName(14)="" - GoneName(15)="" - GoneName(16)="" - GoneName(17)="" - GoneName(18)="" - GoneName(19)="" - GoneName(20)="" - GoneName(21)="" - GoneName(22)="" - GoneName(23)="" - GoneName(24)="" - GoneName(25)="" - GoneName(26)="" - GoneName(27)="" - GoneName(28)="" - GoneName(29)="" - GoneName(30)="" - GoneName(31)="" - GoneIP(0)="" - GoneIP(1)="" - GoneIP(2)="" - GoneIP(3)="" - GoneIP(4)="" - GoneIP(5)="" - GoneIP(6)="" - GoneIP(7)="" - GoneIP(8)="" - GoneIP(9)="" - GoneIP(10)="" - GoneIP(11)="" - GoneIP(12)="" - GoneIP(13)="" - GoneIP(14)="" - GoneIP(15)="" - GoneIP(16)="" - GoneIP(17)="" - GoneIP(18)="" - GoneIP(19)="" - GoneIP(20)="" - GoneIP(21)="" - GoneIP(22)="" - GoneIP(23)="" - GoneIP(24)="" - GoneIP(25)="" - GoneIP(26)="" - GoneIP(27)="" - GoneIP(28)="" - GoneIP(29)="" - GoneIP(30)="" - GoneIP(31)="" - GoneScore(0)=0.000000 - GoneScore(1)=0.000000 - GoneScore(2)=0.000000 - GoneScore(3)=0.000000 - GoneScore(4)=0.000000 - GoneScore(5)=0.000000 - GoneScore(6)=0.000000 - GoneScore(7)=0.000000 - GoneScore(8)=0.000000 - GoneScore(9)=0.000000 - GoneScore(10)=0.000000 - GoneScore(11)=0.000000 - GoneScore(12)=0.000000 - GoneScore(13)=0.000000 - GoneScore(14)=0.000000 - GoneScore(15)=0.000000 - GoneScore(16)=0.000000 - GoneScore(17)=0.000000 - GoneScore(18)=0.000000 - GoneScore(19)=0.000000 - GoneScore(20)=0.000000 - GoneScore(21)=0.000000 - GoneScore(22)=0.000000 - GoneScore(23)=0.000000 - GoneScore(24)=0.000000 - GoneScore(25)=0.000000 - GoneScore(26)=0.000000 - GoneScore(27)=0.000000 - GoneScore(28)=0.000000 - GoneScore(29)=0.000000 - GoneScore(30)=0.000000 - GoneScore(31)=0.000000 - GoneDeaths(0)=0.000000 - GoneDeaths(1)=0.000000 - GoneDeaths(2)=0.000000 - GoneDeaths(3)=0.000000 - GoneDeaths(4)=0.000000 - GoneDeaths(5)=0.000000 - GoneDeaths(6)=0.000000 - GoneDeaths(7)=0.000000 - GoneDeaths(8)=0.000000 - GoneDeaths(9)=0.000000 - GoneDeaths(10)=0.000000 - GoneDeaths(11)=0.000000 - GoneDeaths(12)=0.000000 - GoneDeaths(13)=0.000000 - GoneDeaths(14)=0.000000 - GoneDeaths(15)=0.000000 - GoneDeaths(16)=0.000000 - GoneDeaths(17)=0.000000 - GoneDeaths(18)=0.000000 - GoneDeaths(19)=0.000000 - GoneDeaths(20)=0.000000 - GoneDeaths(21)=0.000000 - GoneDeaths(22)=0.000000 - GoneDeaths(23)=0.000000 - GoneDeaths(24)=0.000000 - GoneDeaths(25)=0.000000 - GoneDeaths(26)=0.000000 - GoneDeaths(27)=0.000000 - GoneDeaths(28)=0.000000 - GoneDeaths(29)=0.000000 - GoneDeaths(30)=0.000000 - GoneDeaths(31)=0.000000 - GoneStats(0)=None - GoneStats(1)=None - GoneStats(2)=None - GoneStats(3)=None - GoneStats(4)=None - GoneStats(5)=None - GoneStats(6)=None - GoneStats(7)=None - GoneStats(8)=None - GoneStats(9)=None - GoneStats(10)=None - GoneStats(11)=None - GoneStats(12)=None - GoneStats(13)=None - GoneStats(14)=None - GoneStats(15)=None - GoneStats(16)=None - GoneStats(17)=None - GoneStats(18)=None - GoneStats(19)=None - GoneStats(20)=None - GoneStats(21)=None - GoneStats(22)=None - GoneStats(23)=None - GoneStats(24)=None - GoneStats(25)=None - GoneStats(26)=None - GoneStats(27)=None - GoneStats(28)=None - GoneStats(29)=None - GoneStats(30)=None - GoneStats(31)=None - StoreName(0)="" - StoreName(1)="" - StoreName(2)="" - StoreName(3)="" - StoreName(4)="" - StoreName(5)="" - StoreName(6)="" - StoreName(7)="" - StoreName(8)="" - StoreName(9)="" - StoreName(10)="" - StoreName(11)="" - StoreName(12)="" - StoreName(13)="" - StoreName(14)="" - StoreName(15)="" - StoreName(16)="" - StoreName(17)="" - StoreName(18)="" - StoreName(19)="" - StoreName(20)="" - StoreName(21)="" - StoreName(22)="" - StoreName(23)="" - StoreName(24)="" - StoreName(25)="" - StoreName(26)="" - StoreName(27)="" - StoreName(28)="" - StoreName(29)="" - StoreName(30)="" - StoreName(31)="" - StoreScore(0)=0.000000 - StoreScore(1)=0.000000 - StoreScore(2)=0.000000 - StoreScore(3)=0.000000 - StoreScore(4)=0.000000 - StoreScore(5)=0.000000 - StoreScore(6)=0.000000 - StoreScore(7)=0.000000 - StoreScore(8)=0.000000 - StoreScore(9)=0.000000 - StoreScore(10)=0.000000 - StoreScore(11)=0.000000 - StoreScore(12)=0.000000 - StoreScore(13)=0.000000 - StoreScore(14)=0.000000 - StoreScore(15)=0.000000 - StoreScore(16)=0.000000 - StoreScore(17)=0.000000 - StoreScore(18)=0.000000 - StoreScore(19)=0.000000 - StoreScore(20)=0.000000 - StoreScore(21)=0.000000 - StoreScore(22)=0.000000 - StoreScore(23)=0.000000 - StoreScore(24)=0.000000 - StoreScore(25)=0.000000 - StoreScore(26)=0.000000 - StoreScore(27)=0.000000 - StoreScore(28)=0.000000 - StoreScore(29)=0.000000 - StoreScore(30)=0.000000 - StoreScore(31)=0.000000 - StoreDeaths(0)=0.000000 - StoreDeaths(1)=0.000000 - StoreDeaths(2)=0.000000 - StoreDeaths(3)=0.000000 - StoreDeaths(4)=0.000000 - StoreDeaths(5)=0.000000 - StoreDeaths(6)=0.000000 - StoreDeaths(7)=0.000000 - StoreDeaths(8)=0.000000 - StoreDeaths(9)=0.000000 - StoreDeaths(10)=0.000000 - StoreDeaths(11)=0.000000 - StoreDeaths(12)=0.000000 - StoreDeaths(13)=0.000000 - StoreDeaths(14)=0.000000 - StoreDeaths(15)=0.000000 - StoreDeaths(16)=0.000000 - StoreDeaths(17)=0.000000 - StoreDeaths(18)=0.000000 - StoreDeaths(19)=0.000000 - StoreDeaths(20)=0.000000 - StoreDeaths(21)=0.000000 - StoreDeaths(22)=0.000000 - StoreDeaths(23)=0.000000 - StoreDeaths(24)=0.000000 - StoreDeaths(25)=0.000000 - StoreDeaths(26)=0.000000 - StoreDeaths(27)=0.000000 - StoreDeaths(28)=0.000000 - StoreDeaths(29)=0.000000 - StoreDeaths(30)=0.000000 - StoreDeaths(31)=0.000000 - StoreIP(0)="" - StoreIP(1)="" - StoreIP(2)="" - StoreIP(3)="" - StoreIP(4)="" - StoreIP(5)="" - StoreIP(6)="" - StoreIP(7)="" - StoreIP(8)="" - StoreIP(9)="" - StoreIP(10)="" - StoreIP(11)="" - StoreIP(12)="" - StoreIP(13)="" - StoreIP(14)="" - StoreIP(15)="" - StoreIP(16)="" - StoreIP(17)="" - StoreIP(18)="" - StoreIP(19)="" - StoreIP(20)="" - StoreIP(21)="" - StoreIP(22)="" - StoreIP(23)="" - StoreIP(24)="" - StoreIP(25)="" - StoreIP(26)="" - StoreIP(27)="" - StoreIP(28)="" - StoreIP(29)="" - StoreIP(30)="" - StoreIP(31)="" - StoreStats(0)=None - StoreStats(1)=None - StoreStats(2)=None - StoreStats(3)=None - StoreStats(4)=None - StoreStats(5)=None - StoreStats(6)=None - StoreStats(7)=None - StoreStats(8)=None - StoreStats(9)=None - StoreStats(10)=None - StoreStats(11)=None - StoreStats(12)=None - StoreStats(13)=None - StoreStats(14)=None - StoreStats(15)=None - StoreStats(16)=None - StoreStats(17)=None - StoreStats(18)=None - StoreStats(19)=None - StoreStats(20)=None - StoreStats(21)=None - StoreStats(22)=None - StoreStats(23)=None - StoreStats(24)=None - StoreStats(25)=None - StoreStats(26)=None - StoreStats(27)=None - StoreStats(28)=None - StoreStats(29)=None - StoreStats(30)=None - StoreStats(31)=None - B1Name(0)="" - B1Name(1)="" - B1Name(2)="" - B1Name(3)="" - B1Name(4)="" - B1Name(5)="" - B1Name(6)="" - B1Name(7)="" - B1Name(8)="" - B1Name(9)="" - B1Name(10)="" - B1Name(11)="" - B1Name(12)="" - B1Name(13)="" - B1Name(14)="" - B1Name(15)="" - B1Name(16)="" - B1Name(17)="" - B1Name(18)="" - B1Name(19)="" - B1Name(20)="" - B1Name(21)="" - B1Name(22)="" - B1Name(23)="" - B1Name(24)="" - B1Name(25)="" - B1Name(26)="" - B1Name(27)="" - B1Name(28)="" - B1Name(29)="" - B1Name(30)="" - B1Name(31)="" - B1Score(0)=0.000000 - B1Score(1)=0.000000 - B1Score(2)=0.000000 - B1Score(3)=0.000000 - B1Score(4)=0.000000 - B1Score(5)=0.000000 - B1Score(6)=0.000000 - B1Score(7)=0.000000 - B1Score(8)=0.000000 - B1Score(9)=0.000000 - B1Score(10)=0.000000 - B1Score(11)=0.000000 - B1Score(12)=0.000000 - B1Score(13)=0.000000 - B1Score(14)=0.000000 - B1Score(15)=0.000000 - B1Score(16)=0.000000 - B1Score(17)=0.000000 - B1Score(18)=0.000000 - B1Score(19)=0.000000 - B1Score(20)=0.000000 - B1Score(21)=0.000000 - B1Score(22)=0.000000 - B1Score(23)=0.000000 - B1Score(24)=0.000000 - B1Score(25)=0.000000 - B1Score(26)=0.000000 - B1Score(27)=0.000000 - B1Score(28)=0.000000 - B1Score(29)=0.000000 - B1Score(30)=0.000000 - B1Score(31)=0.000000 - B1Deaths(0)=0.000000 - B1Deaths(1)=0.000000 - B1Deaths(2)=0.000000 - B1Deaths(3)=0.000000 - B1Deaths(4)=0.000000 - B1Deaths(5)=0.000000 - B1Deaths(6)=0.000000 - B1Deaths(7)=0.000000 - B1Deaths(8)=0.000000 - B1Deaths(9)=0.000000 - B1Deaths(10)=0.000000 - B1Deaths(11)=0.000000 - B1Deaths(12)=0.000000 - B1Deaths(13)=0.000000 - B1Deaths(14)=0.000000 - B1Deaths(15)=0.000000 - B1Deaths(16)=0.000000 - B1Deaths(17)=0.000000 - B1Deaths(18)=0.000000 - B1Deaths(19)=0.000000 - B1Deaths(20)=0.000000 - B1Deaths(21)=0.000000 - B1Deaths(22)=0.000000 - B1Deaths(23)=0.000000 - B1Deaths(24)=0.000000 - B1Deaths(25)=0.000000 - B1Deaths(26)=0.000000 - B1Deaths(27)=0.000000 - B1Deaths(28)=0.000000 - B1Deaths(29)=0.000000 - B1Deaths(30)=0.000000 - B1Deaths(31)=0.000000 - B1IP(0)="" - B1IP(1)="" - B1IP(2)="" - B1IP(3)="" - B1IP(4)="" - B1IP(5)="" - B1IP(6)="" - B1IP(7)="" - B1IP(8)="" - B1IP(9)="" - B1IP(10)="" - B1IP(11)="" - B1IP(12)="" - B1IP(13)="" - B1IP(14)="" - B1IP(15)="" - B1IP(16)="" - B1IP(17)="" - B1IP(18)="" - B1IP(19)="" - B1IP(20)="" - B1IP(21)="" - B1IP(22)="" - B1IP(23)="" - B1IP(24)="" - B1IP(25)="" - B1IP(26)="" - B1IP(27)="" - B1IP(28)="" - B1IP(29)="" - B1IP(30)="" - B1IP(31)="" - B1Stats(0)=None - B1Stats(1)=None - B1Stats(2)=None - B1Stats(3)=None - B1Stats(4)=None - B1Stats(5)=None - B1Stats(6)=None - B1Stats(7)=None - B1Stats(8)=None - B1Stats(9)=None - B1Stats(10)=None - B1Stats(11)=None - B1Stats(12)=None - B1Stats(13)=None - B1Stats(14)=None - B1Stats(15)=None - B1Stats(16)=None - B1Stats(17)=None - B1Stats(18)=None - B1Stats(19)=None - B1Stats(20)=None - B1Stats(21)=None - B1Stats(22)=None - B1Stats(23)=None - B1Stats(24)=None - B1Stats(25)=None - B1Stats(26)=None - B1Stats(27)=None - B1Stats(28)=None - B1Stats(29)=None - B1Stats(30)=None - B1Stats(31)=None - B2Name(0)="" - B2Name(1)="" - B2Name(2)="" - B2Name(3)="" - B2Name(4)="" - B2Name(5)="" - B2Name(6)="" - B2Name(7)="" - B2Name(8)="" - B2Name(9)="" - B2Name(10)="" - B2Name(11)="" - B2Name(12)="" - B2Name(13)="" - B2Name(14)="" - B2Name(15)="" - B2Name(16)="" - B2Name(17)="" - B2Name(18)="" - B2Name(19)="" - B2Name(20)="" - B2Name(21)="" - B2Name(22)="" - B2Name(23)="" - B2Name(24)="" - B2Name(25)="" - B2Name(26)="" - B2Name(27)="" - B2Name(28)="" - B2Name(29)="" - B2Name(30)="" - B2Name(31)="" - B2Score(0)=0.000000 - B2Score(1)=0.000000 - B2Score(2)=0.000000 - B2Score(3)=0.000000 - B2Score(4)=0.000000 - B2Score(5)=0.000000 - B2Score(6)=0.000000 - B2Score(7)=0.000000 - B2Score(8)=0.000000 - B2Score(9)=0.000000 - B2Score(10)=0.000000 - B2Score(11)=0.000000 - B2Score(12)=0.000000 - B2Score(13)=0.000000 - B2Score(14)=0.000000 - B2Score(15)=0.000000 - B2Score(16)=0.000000 - B2Score(17)=0.000000 - B2Score(18)=0.000000 - B2Score(19)=0.000000 - B2Score(20)=0.000000 - B2Score(21)=0.000000 - B2Score(22)=0.000000 - B2Score(23)=0.000000 - B2Score(24)=0.000000 - B2Score(25)=0.000000 - B2Score(26)=0.000000 - B2Score(27)=0.000000 - B2Score(28)=0.000000 - B2Score(29)=0.000000 - B2Score(30)=0.000000 - B2Score(31)=0.000000 - B2Deaths(0)=0.000000 - B2Deaths(1)=0.000000 - B2Deaths(2)=0.000000 - B2Deaths(3)=0.000000 - B2Deaths(4)=0.000000 - B2Deaths(5)=0.000000 - B2Deaths(6)=0.000000 - B2Deaths(7)=0.000000 - B2Deaths(8)=0.000000 - B2Deaths(9)=0.000000 - B2Deaths(10)=0.000000 - B2Deaths(11)=0.000000 - B2Deaths(12)=0.000000 - B2Deaths(13)=0.000000 - B2Deaths(14)=0.000000 - B2Deaths(15)=0.000000 - B2Deaths(16)=0.000000 - B2Deaths(17)=0.000000 - B2Deaths(18)=0.000000 - B2Deaths(19)=0.000000 - B2Deaths(20)=0.000000 - B2Deaths(21)=0.000000 - B2Deaths(22)=0.000000 - B2Deaths(23)=0.000000 - B2Deaths(24)=0.000000 - B2Deaths(25)=0.000000 - B2Deaths(26)=0.000000 - B2Deaths(27)=0.000000 - B2Deaths(28)=0.000000 - B2Deaths(29)=0.000000 - B2Deaths(30)=0.000000 - B2Deaths(31)=0.000000 - B2IP(0)="" - B2IP(1)="" - B2IP(2)="" - B2IP(3)="" - B2IP(4)="" - B2IP(5)="" - B2IP(6)="" - B2IP(7)="" - B2IP(8)="" - B2IP(9)="" - B2IP(10)="" - B2IP(11)="" - B2IP(12)="" - B2IP(13)="" - B2IP(14)="" - B2IP(15)="" - B2IP(16)="" - B2IP(17)="" - B2IP(18)="" - B2IP(19)="" - B2IP(20)="" - B2IP(21)="" - B2IP(22)="" - B2IP(23)="" - B2IP(24)="" - B2IP(25)="" - B2IP(26)="" - B2IP(27)="" - B2IP(28)="" - B2IP(29)="" - B2IP(30)="" - B2IP(31)="" - B2Stats(0)=None - B2Stats(1)=None - B2Stats(2)=None - B2Stats(3)=None - B2Stats(4)=None - B2Stats(5)=None - B2Stats(6)=None - B2Stats(7)=None - B2Stats(8)=None - B2Stats(9)=None - B2Stats(10)=None - B2Stats(11)=None - B2Stats(12)=None - B2Stats(13)=None - B2Stats(14)=None - B2Stats(15)=None - B2Stats(16)=None - B2Stats(17)=None - B2Stats(18)=None - B2Stats(19)=None - B2Stats(20)=None - B2Stats(21)=None - B2Stats(22)=None - B2Stats(23)=None - B2Stats(24)=None - B2Stats(25)=None - B2Stats(26)=None - B2Stats(27)=None - B2Stats(28)=None - B2Stats(29)=None - B2Stats(30)=None - B2Stats(31)=None - QuitMsg="" - QuitMsgLen=0 - bClientJoinPlayer=False - bGameEnded=False - bInitSb=False - LogoCounter=0 - DrawLogo=0 - SbCount=0 - SbDelayC=0.000000 - PlayerOwner=None - MyFonts=None - pTGRI=None - pPRI=None - myHUD=None - RedTeamColor=(R=255,G=0,B=0,A=0) - BlueTeamColor=(R=0,G=128,B=255,A=0) - White=(R=255,G=255,B=255,A=0) - Gray=(R=128,G=128,B=128,A=0) - bEnabled=True - bExtraStats=False - CountryFlagsPackage="CountryFlags32" - CapBonus=15 - AssistBonus=7 - FlagKillBonus=3 - CoverBonus=2 - SealBonus=3 - GrabBonus=0 - BaseReturnBonus=0.500000 - MidReturnBonus=2.000000 - EnemyBaseReturnBonus=5.000000 - CloseSaveReturnBonus=10.000000 - SpawnKillPenalty=0 - MinimalCapBonus=5 - bFixFlagBug=True - bEnhancedMultiKill=True - EnhancedMultiKillBroadcast=3 - bShowFCLocation=True - bSmartCTFServerInfo=True - bNewCapAssistScoring=True - bSpawnkillDetection=True - SpawnKillTimeArena=1.000000 - SpawnKillTimeNW=3.500000 - bAfterGodLikeMsg=True - bStatsDrawFaces=True - bDrawLogo=True - bSCTFSbDef=True - bShowSpecs=True - SpectatorColor=(R=255,G=255,B=255,A=0) - bDoKeybind=True - bExtraMsg=True - SbDelay=5.500000 - MsgDelay=7.000000 - bStoreStats=True - bSnowyScoreboard=False - bXmasImages=True - CoverMsgType=2 - CoverSpreeMsgType=3 - SealMsgType=3 - SavedMsgType=3 - DeniedMsgType=3 - bShowLongRangeMsg=False - bLongRangeSuperShock=True - bShowSpawnKillerGlobalMsg=True - bShowAssistConsoleMsg=True - bShowSealRewardConsoleMsg=True - bShowCoverRewardConsoleMsg=True - bPlayCaptureSound=True - bPlayAssistSound=True - bPlaySavedSound=True - bPlayLeadSound=True - bPlayDeniedSound=True - bPlay30SecSound=True - bPlayAirKillSound=True - bEnableOvertimeControl=False - bOverTime=True - bRememberOvertimeSetting=False - powered=None - bAlwaysRelevant=True - RemoteRole=ROLE_SimulatedProxy -} +// SmartCTF 4 by {PiN}Kev. Released January 2004. +// SmartCTF 4A Tweaked by {DnF2}SiNiSTeR. Released December 2004. +// SmartCTF 4B/4C Uber Massively tweaked by {DnF2}SiNiSTeR. Released March 2005. +// SmartCTF 4D with IpToCountry by [es]Rush. Released January 2006. +// SmartCTF 4D++ by adminthis. Released October 2008. +// SmartCTF 4E by adminthis & The_Cowboy & Sp0ngeb0b. Released December 2009. +// SmartCTF ChaChaV1 by chacha. 2023: +// - Add bLongRangeSuperShock option to allow bShowLongRangeMsg with SuperShockRifle +// - Fix compilation warnings +// SmartCTF ChaChaV2 by chacha. 2023: +// - Add Denied & AirKill Features +// SmartCTF ChaChaV3 by chacha. 2023: +// - Ajout mémorisation joueur vus par le serveur (couple Name+IP) +// - Messages de welcome et welcomback (reglable) +// - Audio de welcome (desactivable) +// - Correction Kill-In-The-air quand on tombe +// - Fix Access None sur Denied +// SmartCTF ChaChaV4 by chacha. 2023: +// - Fix Access None (TGRPI / PRI) +// - Fix Denied Message +// SmartCTF ChaChaV5 by chacha. 2023: +// - Add LudicrousKill & HolyShit Msg / Sounds +// - Fix accessed none KillInTheAir +// SmartCTF ChaChaV6 by chacha. 2023: +// - Recompile without SmartCTF_4E aside +// +// +// This mod changes the point system and adds features to ultimately promote Teamwork in CTF. +// This is a CTF Mod only. It will not load in any other gametype. +// +// Contact Info: private Message me, {PiN}Hai-Ping, on http://forums.prounreal.com +// {DnF2}SiNiSTeR @ #DutchNet [QuakeNet IRC] +// or if it is about version 4D explicictly +// Rush on unrealadmin.org forums / mail and msn: rush@u.one.pl +// or if it is about version 4D++ explicictly +// adminthis on unrealadmin.org +// +// or if it is about about version 4E +// The_Cowboy on unrealadmin.org +// Sp0ngeb0b on unrealadmin.org , or spongebobut@yahoo.com +// SnowyScoreboard added in 4E. Supported by Sp0ngeb0b. +// +// CHANGELOG: See Readme +// TO DO:Improve algorithm of storing stats +class SmartCTF expands Mutator config( SmartCTF_ChaCha ); + +#exec texture IMPORT NAME=meter FILE=Textures\meter.pcx GROUP=SmartCTF MIPS=OFF +#exec texture IMPORT NAME=shade File=Textures\shade.pcx GROUP=SmartCTF MIPS=OFF +#exec texture IMPORT NAME=powered File=Textures\powered.pcx GROUP=SmartCTF MIPS=OFF + +/* Server Vars */ +var SmartCTFGameReplicationInfo SCTFGame; +var byte RedAstIndex, BlueAstIndex; +var byte TRCount; +var string Version, GameTieMessage; +var Pawn FCs[2], RedAssisters[32], BlueAssisters[32]; +var Pawn RedFlagCarrier[32], BlueFlagCarrier[32]; +var float RedFlagCarrierTime[32], BlueFlagCarrierTime[32]; +var byte RedFCIndex, BlueFCIndex; +var float RedAssistTimes[32], BlueAssistTimes[32], PickupTime[2]; +var FlagBase FlagStands[2]; +var bool bForcedEndGame, bTournamentGameStarted, bTooCloseForSaves, bStartTimeCorrected; +var int MsgPID; +var string GoneName[32]; //list of disconnected players +var string GoneIP[32]; //corresponding IP addy +var float GoneScore[32]; //corresponding scores +var float GoneDeaths[32]; //corresponding deaths +var SmartCTFPlayerReplicationInfo GoneStats[32];//corresponding smartCTF stats +var string StoreName[32]; //list of stored playernames +var float StoreScore[32]; //corresponding scores +var float StoreDeaths[32]; //corresponding deaths +var string StoreIP[32]; //corresponding IP addy +var SmartCTFPlayerReplicationInfo StoreStats[32];//corresponding stored smartCTF stats +// First backup array +var string B1Name[32]; //list of stored playernames +var float B1Score[32]; //corresponding scores +var float B1Deaths[32]; //corresponding deaths +var string B1IP[32]; //corresponding IP addy +var SmartCTFPlayerReplicationInfo B1Stats[32];//corresponding stored smartCTF stats +// Second backup array +var string B2Name[32]; //list of stored playernames +var float B2Score[32]; //corresponding scores +var float B2Deaths[32]; //corresponding deaths +var string B2IP[32]; //corresponding IP addy +var SmartCTFPlayerReplicationInfo B2Stats[32];//corresponding stored smartCTF stats +var string QuitMsg; //the broadcast message when someone leaves the game +var int QuitMsgLen; //length of QuitMsg + +/* Client Vars */ +var bool bClientJoinPlayer, bGameEnded, bInitSb; +var int LogoCounter, DrawLogo, SbCount; +var float SbDelayC; +var PlayerPawn PlayerOwner; +var FontInfo MyFonts; +var TournamentGameReplicationInfo pTGRI; +var PlayerReplicationInfo pPRI; +var ChallengeHUD MyHUD; +var Color RedTeamColor, BlueTeamColor, White, Gray; + +/* Server Vars Configurable */ +var() config bool bEnabled; +var() config bool bExtraStats; +var() config string CountryFlagsPackage; +var(SmartCTFBonuses) config int CapBonus, AssistBonus, FlagKillBonus, CoverBonus, SealBonus, GrabBonus; +var(SmartCTFBonuses) config float BaseReturnBonus, MidReturnBonus, EnemyBaseReturnBonus, CloseSaveReturnBonus; +var(SmartCTFBonuses) config int SpawnKillPenalty, MinimalCapBonus; +var() config bool bFixFlagBug; +var() config bool bEnhancedMultiKill; +var() config byte EnhancedMultiKillBroadcast; +var() config bool bShowFCLocation; +var() config bool bSmartCTFServerInfo; +var() config bool bNewCapAssistScoring; +var() config bool bSpawnkillDetection; +var() config float SpawnKillTimeArena; +var() config float SpawnKillTimeNW; +var() config bool bAfterGodLikeMsg; +var() config bool bStatsDrawFaces; +var() config bool bDrawLogo; +var() config bool bSCTFSbDef; +var() config bool bShowSpecs; +var() config color SpectatorColor; +var() config bool bDoKeybind; +var() config bool bExtraMsg; +var() config float SbDelay; +var() config float MsgDelay; +var() config bool bStoreStats; +var() config bool bSnowyScoreboard; +var() config bool bXmasImages; +var(SmartCTFMessages) config byte CoverMsgType; +var(SmartCTFMessages) config byte CoverSpreeMsgType; +var(SmartCTFMessages) config byte SealMsgType; +var(SmartCTFMessages) config byte SavedMsgType; +var(SmartCTFMessages) config byte DeniedMsgType; +var(SmartCTFMessages) config bool bShowLongRangeMsg; +var(SmartCTFMessages) config bool bLongRangeSuperShock; +var(SmartCTFMessages) config bool bShowSpawnKillerGlobalMsg; +var(SmartCTFMessages) config bool bShowAssistConsoleMsg; +var(SmartCTFMessages) config bool bShowSealRewardConsoleMsg; +var(SmartCTFMessages) config bool bShowCoverRewardConsoleMsg; +var(SmartCTFSounds) config bool bPlayCaptureSound; +var(SmartCTFSounds) config bool bPlayAssistSound; +var(SmartCTFSounds) config bool bPlaySavedSound; +var(SmartCTFSounds) config bool bPlayLeadSound; +var(SmartCTFSounds) config bool bPlayDeniedSound; +var(SmartCTFSounds) config bool bPlay30SecSound; +var(SmartCTFSounds) config bool bPlayAirKillSound; +var(OvertimeControl) config bool bEnableOvertimeControl; +var(OvertimeControl) config bool bOvertime; +var(OvertimeControl) config bool bRememberOvertimeSetting; + +var texture powered; + +/* + * Check if we should spawn a SmartCTF instance. + * This check doesn't seem to work properly in PostBeginPlay, hence here. +*/ +event Spawned() +{ + super.Spawned(); + + SCTFGame = Level.Game.Spawn( class'SmartCTFGameReplicationInfo' ); + + if( !ValidateSmartCTFMutator() ) + { + SCTFGame.Destroy(); + Destroy(); + } +} + +/* + * Get the original Scoreboard and store for SmartCTFScoreboard reference. +*/ +function PreBeginPlay() +{ + local Mutator M; + + super.PreBeginPlay(); + SCTFGame.NormalScoreBoardClass = Level.Game.ScoreBoardType; + if (bSnowyScoreboard) + { + level.game.scoreBoardType = class'SmartCTFSnowyScoreboard'; + } + else + { + Level.Game.ScoreBoardType = class'SmartCTFScoreBoard'; + } + //Level.Game.default.ScoreBoardType = class'SmartCTFScoreBoard'; + // The above line was fatal in version 4B :E + + Log( "Original Scoreboard determined as" @ SCTFGame.NormalScoreBoardClass, 'SmartCTF' ); + + // Change F2 Server Info screen, compatible with UTPure + if( bSmartCTFServerInfo ) + { + class( Level.Game.HUDType ).default.ServerInfoClass = class'SmartCTFServerInfo'; + for( M = Level.Game.BaseMutator; M != None; M = M.NextMutator ) + { + if( M.IsA( 'UTPure' ) ) // Let UTPure rehandle the scoreboard + { + M.PreBeginPlay(); + SCTFGame.bServerInfoSetServerSide = True; // No need for the old fashioned way - it can be set server side. + Log( "Notified UTPure HUD to use SmartCTF ServerInfo.", 'SmartCTF' ); + break; + } + } + if( SCTFGame.bServerInfoSetServerSide && Level.Game.HUDType.Name != 'PureCTFHUD' ) + { + // In this scenario another mod intervered and we still have to do it the old fashion way. + SCTFGame.bServerInfoSetServerSide = False; + Log( "HUD is not the UTPure HUD but" @ Level.Game.HUDType.Name $ ", so SmartCTF ServerInfo will be set clientside.", 'SmartCTF' ); + } + if( !SCTFGame.bServerInfoSetServerSide ) + { + SCTFGame.DefaultHUDType = Level.Game.HUDType; // And in the old fashion way, the client will have to know the current HUD type. + } + } + else + { + SCTFGame.bServerInfoSetServerSide = True; // We didn't change anything, but neither do we want clientside intervention. + } +} + +/* + * Startup and initialize. +*/ +function PostBeginPlay() +{ + local FlagBase fb; + + Level.Game.Spawn( class'SmartCTFSpawnNotifyPRI'); + SCTFGame.WelcomeNewPlayers = Spawn( class'SmartCTFWelcomeNewPlayers'); + SCTFGame.WelcomeNewPlayers.SaveConfig(); + + SaveConfig(); // Create the .ini if its not already there. + + //Register as a message mutator, as we'll be using message monitoring + //to perform some of our code. If not registered, then many message + //events will not be passed to our mutator. + Level.Game.RegisterMessageMutator( self ); + + // Since we have problem replicating config variables... + SCTFGame.bShowFCLocation = bShowFCLocation; + SCTFGame.bPlay30SecSound = bPlay30SecSound; + SCTFGame.bStatsDrawFaces = bStatsDrawFaces; + SCTFGame.bDrawLogo = bDrawLogo; + SCTFGame.bExtraStats = bExtraStats; + SCTFGame.CountryFlagsPackage = CountryFlagsPackage; + SCTFGame.bSCTFSbDef = bSCTFSbDef; + SCTFGame.bShowSpecs = bShowSpecs; + SCTFGame.bDoKeybind = bDoKeybind; + SCTFGame.SbDelayC = SbDelayC; + SCTFGame.SpectatorColor = SpectatorColor; + SCTFGame.bSnowyScoreboard = bSnowyScoreboard; + SCTFGame.bXmasImages = bXmasImages; + + if( !bRememberOvertimeSetting ) + { + bOvertime = True; + } + + // Works serverside! + if( bEnhancedMultiKill ) + { + Level.Game.DeathMessageClass = class'SmartCTFEnhancedDeathMessagePlus'; + } + + // Get the Flag bases + ForEach AllActors( class'FlagBase', fb ) + { + FlagStands[ fb.Team ] = fb; + } + + if( VSize( FlagStands[0].Location - FlagStands[1].Location ) < 1.5 * 900 ) + { + bTooCloseForSaves = True; + } + + SCTFGame.EndStats = Spawn( class'SmartCTFEndStats', self ); + + super.PostBeginPlay(); + + if( Level.NetMode == NM_DedicatedServer ) + { + SetTimer( 1.0 , True); + } + + MsgPID=-1; // First PID is 0, so it wouldn't get messaged if we kept MsgPID at it's default value. + + if(bStoreStats == True) + { + //Register as a damage mutator, as we'll be using damage checks to + //update the stored information (new in v3.2). + Level.Game.RegisterDamageMutator(self); + + //Grab some basic info about the player left message. + QuitMsg=Level.Game.LeftMessage; + QuitMsgLen=Len(QuitMsg); + + } + Log( "SmartCTF" @ Version @ "loaded successfully.", 'SmartCTF' ); +} + +/* + * Returns True or False whether to keep this SmartCTF mutator instance, and sets bInitialized accordingly. +*/ +function bool ValidateSmartCTFMutator() +{ + local Mutator M; + local bool bRunning; + + M = Level.Game.BaseMutator; + while( M != None ) + { + if( M != Self && M.Class == Self.Class ) + { + bRunning = True; + break; + } + M = M.NextMutator; + } + + if( !bEnabled ) + { + Log( "Instance" @ Name @ "not loaded because bEnabled in .ini = False.", 'SmartCTF' ); + } + else if( CTFGame( Level.Game ) == None ) + { + Log( "Instance" @ Name @ "not loaded because gamestyle is not CTF.", 'SmartCTF' ); + } + else if( bRunning ) + { + Log( "Instance" @ Name @ "not loaded because it is already running.", 'SmartCTF' ); + } + else + { + SCTFGame.bInitialized = True; + } + + return SCTFGame.bInitialized; +} + + +/* + * For the flag bug each player gets a FlagChecker inventory on spawn. +*/ +function ModifyPlayer( Pawn Other ) +{ + local Inventory Inv; + local SmartCTFPlayerReplicationInfo OtherStats; + local string IP; + local int j,i; + local bool bIsFirstSpawn; + + + if( Other.bIsPlayer && !Other.IsA('Bot') && !( Other.PlayerReplicationInfo.bIsSpectator && !Other.PlayerReplicationInfo.bWaitingPlayer ) ) + { + // little hacky method to know if its 1st spawn or not + bIsFirstSpawn = Other.PlayerReplicationInfo.Deaths < 1; + SCTFGame.WelcomeNewPlayers.CheckPawn(Other,bIsFirstSpawn); + if( bFixFlagBug) + { + Inv = Spawn( class'SmartCTFFlagCheckerInventory' , Other ); + if( Inv != None ) + { + Inv.GiveTo( Other ); + } + } + } + + SCTFGame.RefreshPRI(); + OtherStats = SCTFGame.GetStats( Other ); + if( OtherStats!=none && + bStoreStats && + !Level.Game.bGameEnded && + Other!=none && + Other.bIsPlayer && + !Other.IsA('Spectator') && + !Other.IsA('Bot') && + Other.PlayerReplicationInfo!=none && + Other.PlayerReplicationInfo.PlayerName!="Player" ) + { + IP=PlayerPawn(Other).GetPlayerNetworkAddress(); + j=InStr(IP,":"); + if( j!=-1 ) + { + IP=Left(IP,j); + } + + for(i=0; i<32 && GoneName[i]!=""; i++) + { + if( Other.PlayerReplicationInfo.PlayerName~=GoneName[i] || (IP==GoneIP[i] && IP!="") ) + { + Log(" ## SmartCTF - Caught player by name or IP "$Other.PlayerReplicationInfo.PlayerName$"@"$IP); + Log(" ## SmartCTF is restoring stats for " $Other.PlayerReplicationInfo.PlayerName$"@"$IP); + if(GoneStats[i]!= none) + { + FirstSpawn( Other ); + OtherStats.Captures=GoneStats[i].Captures; + OtherStats.Frags=GoneStats[i].Frags; + OtherStats.Grabs=GoneStats[i].Grabs; + OtherStats.Covers=GoneStats[i].Covers; + OtherStats.Assists=GoneStats[i].Assists; + OtherStats.Seals=GoneStats[i].Seals; + OtherStats.FlagKills=GoneStats[i].FlagKills; + OtherStats.DefKills=GoneStats[i].DefKills; + OtherStats.HeadShots=GoneStats[i].HeadShots; + OtherStats.ShieldBelts=GoneStats[i].ShieldBelts; + OtherStats.Amps=GoneStats[i].Amps; + OtherStats.LastKillTime=GoneStats[i].LastKillTime; + OtherStats.MultiLevel=GoneStats[i].MultiLevel; + OtherStats.FragSpree=GoneStats[i].FragSpree; + OtherStats.CoverSpree=GoneStats[i].CoverSpree; + OtherStats.SealSpree=GoneStats[i].SealSpree; + OtherStats.SpawnKillSpree=GoneStats[i].SpawnKillSpree; + OtherStats.bHadFirstSpawn =True; + } + Other.PlayerReplicationInfo.Score=GoneScore[i]; + Other.PlayerReplicationInfo.Deaths=GoneDeaths[i]; + CleanGone(i); + Log(" ## Stats are restored"); + break; + } + } + } + + + + if( !OtherStats.bHadFirstSpawn ) + { + OtherStats.bHadFirstSpawn = True; + FirstSpawn( Other ); + } + + OtherStats.SpawnTime = Level.TimeSeconds; + + super.ModifyPlayer( Other ); + if(bStoreStats) + { + UpdateInfo(); + } + +} + +/* + * Gets called when a new player or bot joins the game, that is when they first spawn. +*/ +function FirstSpawn( Pawn Other ) +{ + local byte ID; + local string SkinName, FaceName; + + // Additional logging, useful for player tracking + if( Level.Game.LocalLog != None && PlayerPawn( Other ) != None && Other.bIsPlayer ) + { + ID = PlayerPawn( Other ).PlayerReplicationInfo.PlayerID; + Level.Game.LocalLog.LogSpecialEvent( "IP", ID, PlayerPawn( Other ).GetPlayerNetworkAddress() ); + Level.Game.LocalLog.LogSpecialEvent( "player", "NetSpeed", ID, PlayerPawn( Other ).Player.CurrentNetSpeed ); + Level.Game.LocalLog.LogSpecialEvent( "player", "Fov", ID, PlayerPawn( Other ).FovAngle ); + Level.Game.LocalLog.LogSpecialEvent( "player", "VoiceType", ID, Other.VoiceType ); + if( Other.IsA( 'TournamentPlayer' ) ) + { + if( Other.Skin == None ) + { + Other.static.GetMultiSkin( Other, SkinName, FaceName ); + } + else + { + SkinName = string( Other.Skin ); + FaceName = "None"; + } + Level.Game.LocalLog.LogSpecialEvent( "player", "Skin", ID, SkinName ); + Level.Game.LocalLog.LogSpecialEvent( "player", "Face", ID, FaceName ); + } + } +} + +/* + *Use this function to clean out entries from the gone arrays when a player + *reenters and is caught by SmartCTF +*/ +function CleanGone( int R) +{ + + local int i; + + for(i=R;i<32;i++) + { If(GoneStats[i]!=none) + { + + if(i==31) + { + GoneName[i]=""; + GoneScore[i]=0; + GoneDeaths[i]=0; + GoneIP[i]=""; + GoneStats[i].ClearStats(); + break; + } + + GoneName[i]=GoneName[i+1]; + GoneScore[i]=GoneScore[i+1]; + GoneDeaths[i]=GoneDeaths[i+1]; + GoneIP[i]=GoneIP[i+1]; + GoneStats[i]=GoneStats[i+1]; + } + } + + +} + +function bool MutatorBroadcastMessage( Actor Sender, Pawn Receiver, out coerce string Msg, optional bool bBeep, out optional name Type ) +{ + local string quitter; + local int i,j; + local bool matched; + + if(bStoreStats) + { + //Thanks to the WebChatLog mutator for the Reciever.NextPawn==none check + if(Receiver != none && Receiver.NextPawn == none && !Level.Game.bGameEnded) // prevent duplicate messages + { + if(Right(Msg,QuitMsgLen)==QuitMsg) + { + quitter=left(Msg,Len(Msg)-QuitMsgLen); //strips out the playername + + for(i=0; i<32 && StoreName[i]!=""; i++) + { + if(StoreName[i]~=quitter) + { + matched=true; //found our player match + + for(j=0; j<32; j++) + { + if(GoneName[j]=="") + { + GoneName[j]=StoreName[i]; + GoneScore[j]=StoreScore[i]; + GoneDeaths[j]=StoreDeaths[i]; + GoneIP[j]=StoreIP[i]; + GoneStats[j]=StoreStats[i]; + break; + } + + if(j==31) + { + log(" ## SmartCtf - Gone Array is full"); + break; + } + } + + break; + } + } + + //if the player wasn't caught in the main store array, check backup 1 + if(!matched) + { + for(i=0; i<32 && B1Name[i]!=""; i++) + { + if(B1Name[i]~=quitter) + { + matched=true; //found our player match + + for(j=0; j<32; j++) + { + if(GoneName[j]=="") + { + GoneName[j]=B1Name[i]; + GoneScore[j]=B1Score[i]; + GoneDeaths[j]=B1Deaths[i]; + GoneIP[j]=B1IP[i]; + GoneStats[j]=B1Stats[i]; + break; + } + + if(j==31) + { + log(" ## SmartCtf - Gone Array is full"); + break; + } + } + + break; + } + } + } + + //if the player wasn't caught in the backup 1 array, check backup 2 + if(!matched) + { + for(i=0; i<32 && B2Name[i]!=""; i++) + { + if(B2Name[i]~=quitter) + { + for(j=0; j<32; j++) + { + if(GoneName[j]=="") + { + GoneName[j]=B2Name[i]; + GoneScore[j]=B2Score[i]; + GoneDeaths[j]=B2Deaths[i]; + GoneIP[j]=B2IP[i]; + GoneStats[j]=B2Stats[i]; + break; + } + + if(j==31) + { + log(" ## SmartCtf - Gone Array is full"); + break; + } + } + + break; + } + } + } + } + } + } + + if( NextMessageMutator != none ) + { + //If there are other mutators monitoring messages, make sure we ask them + //whether to allow the message to be broadcast (i.e. return their value). + return NextMessageMutator.MutatorBroadcastMessage( Sender, Receiver, Msg, bBeep, Type ); + } + + //Else, we'll return true (true will allow the message to be broadcast). + return true; +} + +/* + *Just another event to use as an update point for our store array (the more + *update events, the more up to date the store array will be). +*/ +function ScoreKill(pawn Killer, pawn Other) +{ + super.ScoreKill(Killer, Other); + + if(bStoreStats) + { + UpdateInfo(); + } +} + +/* + *Just another event to use as an update point for our store array (the more + *update events, the more up to date the store array will be). +*/ +function MutatorTakeDamage( out int ActualDamage, Pawn Victim, Pawn InstigatedBy, out Vector HitLocation, out Vector Momentum, name DamageType) +{ + super.MutatorTakeDamage(ActualDamage,Victim,InstigatedBy,HitLocation,Momentum,DamageType); + if(bStoreStats) + { + UpdateInfo(); + } + +} + + +function UpdateInfo() +{ + local int i,j,k; + local string IP; + local Pawn P; + local SmartCTFPlayerReplicationInfo PI; + + //clear the previous name values, so we don't double register any players + for(k=0; k<32; k++) + { + StoreName[k]=""; + } + + for(P=Level.PawnList; P!=none; P=P.nextPawn) + { + if( PlayerPawn(P)!=none && + P.bIsPlayer && + !P.IsA('Spectator') && + !P.IsA('Bot') && + P.PlayerReplicationInfo!=none && + P.PlayerReplicationInfo.PlayerName!="Player" && + (P.PlayerReplicationInfo.Score!=0 || P.PlayerReplicationInfo.Deaths!=0) ) + { + IP=PlayerPawn(P).GetPlayerNetworkAddress(); + if( IP!="" ) + { + j=InStr(IP,":"); + if( j!=-1 ) + IP=Left(IP,j); + } + StoreName[i]=P.PlayerReplicationInfo.PlayerName; + StoreScore[i]=P.PlayerReplicationInfo.Score; + StoreDeaths[i]=P.PlayerReplicationInfo.Deaths; + StoreIP[i]=IP; + PI = SCTFGame.GetStats( P ); + If(PI!= none) + StoreStats[i]=PI; + i++; + } + } + +} + +/* + * Gets called once when the Countdown before a Tournament game starts. +*/ +function TournamentGameStarted() +{ + // Fix warmup mode bug + Overtime functionality + ClearStats(); + if( bEnableOvertimeControl ) + { + if( !bOvertime ) + { + BroadcastLocalizedMessage( class'SmartCTFCoolMsg', 4 ); + } + else + { + BroadcastLocalizedMessage( class'SmartCTFCoolMsg', 3 ); + } + } +} + +/* + * Check for covers and seals, and adjust scores. +*/ +function bool PreventDeath( Pawn Victim, Pawn Killer, name DamageType, vector HitLocation ) +{ + local PlayerReplicationInfo VictimPRI, KillerPRI; + local bool bPrevent, bVictimTeamHasFlag, bWarmupSkip; + local Pawn pn; + local float TimeAwake; + local SmartCTFPlayerReplicationInfo KillerStats, VictimStats; + + bPrevent = super.PreventDeath( Victim, Killer, DamageType, HitLocation ); + if( bPrevent ) + { + return bPrevent; // Player didn't die, so return + } + + // If there is no victim, return. + if( Victim == None ) + { + return bPrevent; + } + + VictimPRI = Victim.PlayerReplicationInfo; + if( VictimPRI == None || !Victim.bIsPlayer || ( VictimPRI.bIsSpectator && !VictimPRI.bWaitingPlayer ) ) + { + return bPrevent; + } + + VictimStats = SCTFGame.GetStats( Victim ); + + // airkill handling + if(bPlayAirKillSound && (Victim!=Killer) && (Killer!=None)) + { + if(Victim.Physics == PHYS_Falling && Killer.Physics == PHYS_Falling) + { + if(Victim.bIsPlayer && Victim.IsA('PlayerPawn')) + { + Victim.ReceiveLocalizedMessage( class'SmartCTFAudioMsg', 6); + Victim.ReceiveLocalizedMessage( class'SmartCTFCoolMsg', 7); + } + if(Killer.bIsPlayer && Killer.IsA('PlayerPawn')) + { + Killer.ReceiveLocalizedMessage( class'SmartCTFAudioMsg', 6); + Killer.ReceiveLocalizedMessage( class'SmartCTFCoolMsg', 6); + } + } + } + + if( VictimStats != None ) + { + VictimStats.FragSpree = 0; // Reset FragSpree for Victim + VictimStats.SpawnKillSpree = 0; + } + + // If there is no killer / suicide, return. + if( Killer == None || Killer == Victim ) + { + if( bEnhancedMultiKill && EnhancedMultiKillBroadcast > 0 ) + { + VictimStats.MultiLevel = 0; + } + return bPrevent; + } + + KillerPRI = Killer.PlayerReplicationInfo; + if( KillerPRI == None || !Killer.bIsPlayer || ( KillerPRI.bIsSpectator && !KillerPRI.bWaitingPlayer ) ) + { + return bPrevent; + } + + KillerStats = SCTFGame.GetStats( Killer ); + // Same Team! We don't count those stats like that in SmartCTF. + if( VictimPRI.Team == KillerPRI.Team ) + { + return bPrevent; + } + + // Increase Frags and FragSpree for Killer (Play "Too Easy" at 30) + if( KillerStats != None ) + { + KillerStats.Frags++; + KillerStats.FragSpree++; + } + + if( bEnhancedMultiKill && EnhancedMultiKillBroadcast > 0 ) + { + VictimStats.MultiLevel = 0; + if( Level.TimeSeconds - KillerStats.LastKillTime < 3 ) + { + KillerStats.MultiLevel++; + if( KillerStats.MultiLevel + 1 >= EnhancedMultiKillBroadcast ) + { + Level.Game.BroadcastMessage( KillerPRI.PlayerName @ class'SmartCTFEnhancedMultiKillMessage'.static.GetBroadcastString( KillerStats.MultiLevel ) ); + } + } + else + { + KillerStats.MultiLevel = 0; + } + KillerStats.LastKillTime = Level.TimeSeconds; + } + + bWarmupSkip = DeathMatchPlus( Level.Game ).bTournament && !bTournamentGameStarted; + + if( !bWarmupSkip ) + { + + // For Flag Kill, inc player's FlagKills and total + if( VictimPRI.HasFlag != None ) + { + + if( KillerStats != None ) + { + KillerStats.FlagKills++; + } + KillerPRI.Score += FlagKillBonus; + + // Already logged by UTStats serveractor. Dont want to do it twice. + //if( Level.Game.LocalLog != None ) Level.Game.LocalLog.LogSpecialEvent( "flag_kill", KillerPRI.PlayerID, VictimPRI.PlayerID, VictimPRI.Team ); + + // Handling Denied + if( VSize( Victim.Location - FlagStands[VictimPRI.Team].Location ) < 768 ) + { + if( DeniedMsgType == 1 && PlayerPawn( Killer ) != None ) + { + Killer.ClientMessage( class'SmartCTFMessage'.static.GetString( 11 + 64, KillerPRI, VictimPRI ) ); + } + else if( DeniedMsgType == 2 ) + { + BroadcastMessage( class'SmartCTFMessage'.static.GetString( 11, KillerPRI, VictimPRI ) ); + } + else if( DeniedMsgType == 3 ) + { + BroadcastLocalizedMessage( class'SmartCTFMessage', 11, KillerPRI, VictimPRI ); + } + + for( pn = Level.PawnList; pn != None; pn = pn.NextPawn ) + { + if( PlayerPawn( pn ) != None && pn.bIsPlayer ) + { + if(bPlayDeniedSound) + { + PlayerPawn( pn ).ReceiveLocalizedMessage( class'SmartCTFAudioMsg', 5 ); + } + } + } + } + } + else + { + // If Killer has Flag, no cover or seal for him + if( KillerPRI.HasFlag == None && FCs[KillerPRI.Team] != None && FCs[KillerPRI.Team].PlayerReplicationInfo.HasFlag != None ) + { + // COVER FRAG / SEAL BASE + // If Killer's Team has had an FC + + // If the FC has Flag Right now + // Defend kill + // org: If victim can see the FC or is within 600 unreal units (approx 40 feet) and has a line of sight to fc. + //if( Victim.canSee( FCs[KillerPRI.Team] ) || ( Victim.lineOfSightTo( FCs[KillerPRI.Team] ) && Distance( Victim.Location, FCs[KillerPRI.Team].Location ) < 600 ) ) + // new: victim within 512 uu of FC + // or killer within 512 uu of FC + // or victim can see FC and was Victim within 1536 uu of FC + // or killer can see FC and Victim victim within 1024 uu of FC + // or victim has direct line to FC and was Victim within 768 uu + if( ( VSize( Victim.Location - FCs[KillerPRI.Team].Location ) < 512 ) + || ( VSize( Killer.Location - FCs[KillerPRI.Team].Location ) < 512 ) + || ( VSize( Victim.Location - FCs[KillerPRI.Team].Location ) < 1536 && Victim.canSee( FCs[KillerPRI.Team] ) ) + || ( VSize( Victim.Location - FCs[KillerPRI.Team].Location ) < 1024 && Killer.canSee( FCs[KillerPRI.Team] ) ) + || ( VSize( Victim.Location - FCs[KillerPRI.Team].Location ) < 768 && Victim.lineOfSightTo( FCs[KillerPRI.Team] ) ) ) + { + // Killer DEFENDED THE Flag CARRIER + if( KillerStats != None ) + { + KillerStats.Covers++; + KillerStats.CoverSpree++; // Increment Cover spree + } + KillerPRI.Score += CoverBonus; // Reward points + + // Log cover + if( Level.Game.LocalLog != None ) + { + Level.Game.LocalLog.LogSpecialEvent( "flag_cover", KillerPRI.PlayerID, VictimPRI.PlayerID, KillerPRI.Team ); + } + + // Cover sprees + if( KillerStats != None ) + { + if( KillerStats.CoverSpree == 3 ) // Cover x 3 + { + if( CoverSpreeMsgType == 1 && PlayerPawn( Killer ) != None ) + { + Killer.ClientMessage( class'SmartCTFMessage'.static.GetString( 4 + 64, KillerPRI, VictimPRI ) ); + } + else if( CoverSpreeMsgType == 2 ) + { + BroadcastMessage( class'SmartCTFMessage'.static.GetString( 4, KillerPRI, VictimPRI ) ); + } + else if( CoverSpreeMsgType == 3 ) + { + BroadcastLocalizedMessage( class'SmartCTFMessage', 4, KillerPRI, VictimPRI ); + } + } + else if( KillerStats.CoverSpree == 4 ) // Cover x 4 + { + if( CoverSpreeMsgType == 1 && PlayerPawn( Killer ) != None ) + { + Killer.ClientMessage( class'SmartCTFMessage'.static.GetString( 5 + 64, KillerPRI, VictimPRI ) ); + } + else if( CoverSpreeMsgType == 2 ) + { + BroadcastMessage( class'SmartCTFMessage'.static.GetString( 5, KillerPRI, VictimPRI ) ); + } + else if( CoverSpreeMsgType == 3 ) + { + BroadcastLocalizedMessage( class'SmartCTFMessage', 5, KillerPRI, VictimPRI ); + } + } + else // // Covered FC + { + if( CoverMsgType == 1 && PlayerPawn( Killer ) != None ) + { + Killer.ClientMessage( class'SmartCTFMessage'.static.GetString( 0 + 64, KillerPRI, VictimPRI ) ); + } + else if( CoverMsgType == 2 ) + { + BroadcastMessage( class'SmartCTFMessage'.static.GetString( 0, KillerPRI, VictimPRI ) ); + } + else if( CoverMsgType == 3 ) + { + BroadcastLocalizedMessage( class'SmartCTFMessage', 0, KillerPRI, VictimPRI ); + } + } + } + } + + // Defense kill + // If the map has player zones + bVictimTeamHasFlag = True; + if( FCs[VictimPRI.Team] == None ) + { + bVictimTeamHasFlag = False; + } + + if( FCs[VictimPRI.Team] != None && FCs[VictimPRI.Team].PlayerReplicationInfo.HasFlag == None ) + { + bVictimTeamHasFlag = False; + } + + // If Victim's FC has not been set / If Victim's FC doesn't have our Flag + if( !bVictimTeamHasFlag ) + { + // If Killer is Red & he and his FC's Location has Red + if( IsInZone( VictimPRI, KillerPRI.Team ) && IsInZone( FCs[KillerPRI.Team].PlayerReplicationInfo, KillerPRI.Team ) ) + { + // Killer SEALED THE BASE + if( KillerStats != None ) + { + KillerStats.Seals++; + KillerStats.SealSpree++; + if(CTFReplicationInfo( Level.Game.GameReplicationInfo ).FlagList[KillerPRI.Team].bHome) // only if flag is at home + { + KillerStats.DefKills++; // seal is also a defkill + } + } + KillerPRI.Score += SealBonus; + if( SealMsgType != 0 && KillerStats != None && KillerStats.SealSpree == 2 ) // Sealing base + { + if( SealMsgType == 1 && PlayerPawn( Killer ) != None ) + { + Killer.ClientMessage( class'SmartCTFMessage'.static.GetString( 1 + 64, KillerPRI, VictimPRI ) ); + } + else if( SealMsgType == 2 ) + { + BroadcastMessage( class'SmartCTFMessage'.static.GetString( 1, KillerPRI, VictimPRI ) ); + } + else if( SealMsgType == 3 ) + { + BroadcastLocalizedMessage( class'SmartCTFMessage', 1, KillerPRI, VictimPRI ); + } + } + // Log seal + if( Level.Game.LocalLog != None ) + { + Level.Game.LocalLog.LogSpecialEvent( "flag_seal", KillerPRI.PlayerID, VictimPRI.PlayerID, KillerPRI.Team ); // Log to ngLog; + } + } + } + } + else // our team don't have a flag + { + bVictimTeamHasFlag = True; + if( FCs[VictimPRI.Team] == None ) + { + bVictimTeamHasFlag = False; + } + if( FCs[VictimPRI.Team] != None && FCs[VictimPRI.Team].PlayerReplicationInfo.HasFlag == None ) + { + bVictimTeamHasFlag = False; + } + // Defense kill + // If the map has player zones + if( VictimPRI.PlayerZone != None ) + { + if( IsInZone( VictimPRI, KillerPRI.Team ) && !bVictimTeamHasFlag && CTFReplicationInfo( Level.Game.GameReplicationInfo ).FlagList[KillerPRI.Team].bHome) + { + if( KillerStats != None ) + { + KillerStats.DefKills++; + } + } + } + } + } + } + + if( bAfterGodLikeMsg && KillerStats != None && ( KillerStats.FragSpree == 30 || KillerStats.FragSpree == 35 ) ) + { + for( pn = Level.PawnList; pn != None; pn = pn.NextPawn ) + { + if( pn.IsA( 'TournamentPlayer' ) ) + { + pn.ReceiveLocalizedMessage( class'SmartCTFSpreeMsg', KillerStats.FragSpree / 5 - 1, KillerPRI ); + } + } + } + + // Uber / Long Range kill if not sniper, HeadShot, trans, deemer, instarifle, or vengeance relic. + if( bShowLongRangeMsg && TournamentPlayer( Killer ) != None ) + { + if( DamageType != 'shot' && + DamageType != 'decapitated' && + DamageType != 'Eradicated' && + DamageType != 'Gibbed' && + DamageType != 'RedeemerDeath' && + (SuperShockRifle( Killer.Weapon ) == None || bLongRangeSuperShock)) + { + if( VSize( Killer.Location - Victim.Location ) > 1536 ) + { + if( VSize( Killer.Location - Victim.Location ) > 3072 ) + { + Killer.ReceiveLocalizedMessage( class'SmartCTFCoolMsg', 2, KillerPRI, VictimPRI ); + } + else + { + Killer.ReceiveLocalizedMessage( class'SmartCTFCoolMsg', 1, KillerPRI, VictimPRI ); + } + // Log special kill. + if( Level.Game.LocalLog != None ) + { + Level.Game.LocalLog.LogSpecialEvent( "longrangekill", KillerPRI.PlayerID, VictimPRI.PlayerID ); + } + } + } + } + + // HeadShot tracking + if( DamageType == 'decapitated' && KillerStats != None ) + { + KillerStats.HeadShots++; + } + + // Spawnkill detection + if( bSpawnkillDetection && DamageType != 'Gibbed' && VictimStats != None ) // No telefrags + { + TimeAwake = Level.TimeSeconds - VictimStats.SpawnTime; + if( Level.Game.BaseMutator.MutatedDefaultWeapon() != class'Botpack.ImpactHammer' ) + { // Arena mutator used, spawnkilling must be extreme to count + if( TimeAwake <= SpawnKillTimeArena ) + { + Killer.ReceiveLocalizedMessage( class'SmartCTFCoolMsg', 5, KillerPRI, VictimPRI ); + KillerPRI.Score -= SpawnKillPenalty; + if( KillerStats != None ) + { + KillerStats.SpawnKillSpree++; + } + if( Level.Game.LocalLog != None ) + { + Level.Game.LocalLog.LogSpecialEvent( "spawnkill", KillerPRI.PlayerID, VictimPRI.PlayerID, SpawnKillPenalty ); + } + if( bShowSpawnKillerGlobalMsg && KillerStats != None && KillerStats.SpawnKillSpree > 2 ) + { + BroadcastLocalizedMessage( class'SmartCTFMessage', 10, KillerPRI, VictimPRI ); + } + } + } + else // No arena mutator + { + if( TimeAwake < SpawnKillTimeNW ) + { + Killer.ReceiveLocalizedMessage( class'SmartCTFCoolMsg', 5, KillerPRI, VictimPRI ); + KillerPRI.Score -= SpawnKillPenalty; + if( KillerStats != None ) + { + KillerStats.SpawnKillSpree++; + } + if( Level.Game.LocalLog != None ) + { + Level.Game.LocalLog.LogSpecialEvent( "spawnkill", KillerPRI.PlayerID, VictimPRI.PlayerID, SpawnKillPenalty ); + } + if( bShowSpawnKillerGlobalMsg && KillerStats != None && KillerStats.SpawnKillSpree > 2 ) + { + BroadcastLocalizedMessage( class'SmartCTFMessage', 10, KillerPRI, VictimPRI ); + } + } + } + } + if(bStoreStats) + { + UpdateInfo(); + } + return bPrevent; +} + +/* + * ShieldBelt + Damage Amp tracking, spawnkill detection. +*/ +function bool HandlePickupQuery( Pawn Other, Inventory Item, out byte bAllowPickup ) +{ + local SmartCTFPlayerReplicationInfo OtherStats; + + OtherStats = SCTFGame.GetStats( Other ); + + if( Item.IsA( 'UT_ShieldBelt' ) && OtherStats != None ) + { + OtherStats.ShieldBelts++; + } + if( Item.IsA( 'UDamage' ) && OtherStats != None ) + { + OtherStats.Amps++; + } + + // For spawnkill detection + if( bSpawnkillDetection && OtherStats != None && OtherStats.SpawnTime != 0 ) + { + if( Item.IsA( 'TournamentWeapon' ) || Item.IsA( 'UT_ShieldBelt' ) || Item.IsA( 'UDamage' ) || Item.IsA( 'HealthPack' ) || Item.IsA( 'UT_Invisibility' ) ) + { + // This player has picked up a certain item making a kill on him no longer be qualified as a spawnkill. + OtherStats.SpawnTime = 0; + } + } + + return super.HandlePickupQuery( Other, Item, bAllowPickup ); +} + +/* + * Proper check if a player is in a location with 'red' or 'blue' in the name. +*/ +function bool IsInZone( PlayerReplicationInfo PRI, byte Team ) +{ + local string Loc; + + if( PRI.PlayerLocation != None ) + { + Loc = PRI.PlayerLocation.LocationName; + } + else if( PRI.PlayerZone != None ) + { + Loc = PRI.PlayerZone.ZoneName; + } + else + { + return False; + } + + if( Team == 0 ) + { + return ( Instr( Caps( Loc ), "RED" ) != -1 ); + } + else + { + return ( Instr( Caps( Loc ), "BLUE" ) != -1 ); + } +} + +/* + * Add a player to the Red FC/assister list. +*/ +function AddRedFlagCarrier( Pawn Aster, float Fct ) +{ + local byte i; + + if( Aster == None || !Aster.bIsPlayer || ( Aster.PlayerReplicationInfo.bIsSpectator && !Aster.PlayerReplicationInfo.bWaitingPlayer ) ) + { + return; + } + if( RedFCIndex >= 32 ) + { + RedFCIndex = 0; + } + + // Check if already in list + for( i = 0; i < 32; i++ ) + { + if( Aster == RedFlagCarrier[i] ) + { + RedFlagCarrierTime[i] += Fct; + return; + } + } + + RedFlagCarrier[RedFCIndex] = Aster; + RedFlagCarrierTime[RedFCIndex] = Fct; + RedFCIndex++; +} + +function AddBlueFlagCarrier( Pawn Aster, float Fct ) +{ + local byte i; + + if( Aster == None || !Aster.bIsPlayer || ( Aster.PlayerReplicationInfo.bIsSpectator && !Aster.PlayerReplicationInfo.bWaitingPlayer ) ) + { + return; + } + if( BlueFCIndex >= 32 ) + { + BlueFCIndex = 0; + } + + for( i = 0; i < 32; i++ ) + { + if( Aster == BlueFlagCarrier[i] ) + { + BlueFlagCarrierTime[i] += Fct; + return; + } + } + + BlueFlagCarrier[BlueFCIndex] = Aster; + BlueFlagCarrierTime[BlueFCIndex] = Fct; + BlueFCIndex++; +} + + +/* + * Walk through Red assisters/FC and reward them with points because of a cap. +*/ +function RewardRedFlagCarriers( bool bNotPlayedLead ) +{ + local byte j; + local SmartCTFPlayerReplicationInfo AssisterStats; + local int Bonus; + local float TotalTime, f; + + Bonus = AssistBonus; + + // Calculate the total flag carrying time + for( j = 0; j < 32; j++ ) TotalTime += RedFlagCarrierTime[j]; + + for( j = 0; j < 32; j++ ) + { + // If flagcarrier was not the capper + if( RedFlagCarrier[j] != None && RedFlagCarrier[j] != FCs[0] ) + { + AssisterStats = SCTFGame.GetStats( RedFlagCarrier[j] ); + if( AssisterStats != None ) + { + AssisterStats.Assists++; + } + + if( bNewCapAssistScoring ) + { + if( TotalTime == 0 ) + { + f = 0; + } + else + { + f = ( RedFlagCarrierTime[j] / TotalTime ) * ( 7 + CapBonus ); // proportionally score + } + Bonus = Max( f, 1 ); + } + RedFlagCarrier[j].PlayerReplicationInfo.Score += Bonus; + + if( PlayerPawn( RedFlagCarrier[j] ) != None ) + { + if( bShowAssistConsoleMsg ) + { + PlayerPawn( RedFlagCarrier[j] ).ClientMessage( "You get " $ Bonus $ " bonus pts for the Assist!" @ CarriedString( RedFlagCarrierTime[j], TotalTime ) ); + } + if( bPlayAssistSound && bNotPlayedLead ) + { + PlayerPawn( RedFlagCarrier[j] ).ReceiveLocalizedMessage( class'SmartCTFAudioMsg', 1 ); + } + } + if( Level.Game.LocalLog != None ) + { + Level.Game.LocalLog.LogSpecialEvent( "Flag_assist", RedFlagCarrier[j].PlayerReplicationInfo.PlayerID, 0 ); + } + } + // Award capper propertionally too. Behave like assist + else if( RedFlagCarrier[j] == FCs[0] ) + { + if( bNewCapAssistScoring ) + { + if( TotalTime == 0 ) + { + f = 0; + } + else + { + f = ( RedFlagCarrierTime[j] / TotalTime ) * ( 7 + CapBonus ); + } + Bonus = Max( f, MinimalCapBonus ); + FCs[0].PlayerReplicationInfo.Score += Bonus - 7; // 7 already awarded by UT + if( bShowAssistConsoleMsg && PlayerPawn( FCs[0] ) != None ) + { + PlayerPawn( FCs[0] ).ClientMessage( "You get " $ Bonus $ " pts for the Capture!" @ CarriedString( RedFlagCarrierTime[j], TotalTime ) ); + } + } + else + { + FCs[0].PlayerReplicationInfo.Score += CapBonus; + } + } + } + ResetFlagCarriers( 0 ); +} + +function RewardBlueFlagCarriers( bool bNotPlayedLead ) +{ + local byte j; + local SmartCTFPlayerReplicationInfo AssisterStats; + local int Bonus; + local float TotalTime, f; + + Bonus = AssistBonus; + + for( j = 0; j < 32; j++ ) + { + TotalTime += BlueFlagCarrierTime[j]; + } + + for( j = 0; j < 32; j++ ) + { + if( BlueFlagCarrier[j] != None && BlueFlagCarrier[j] != FCs[1] ) + { + AssisterStats = SCTFGame.GetStats( BlueFlagCarrier[j] ); + if( AssisterStats != None ) + { + AssisterStats.Assists++; + } + + if( bNewCapAssistScoring ) + { + if( TotalTime == 0 ) + { + f = 0; + } + else + { + f = ( BlueFlagCarrierTime[j] / TotalTime ) * ( 7 + CapBonus ); + } + Bonus = Max( f, 1 ); + } + BlueFlagCarrier[j].PlayerReplicationInfo.Score += Bonus; + + if( PlayerPawn( BlueFlagCarrier[j] ) != None ) + { + if( bShowAssistConsoleMsg ) + { + PlayerPawn( BlueFlagCarrier[j] ).ClientMessage( "You get " $ Bonus $ " bonus pts for the Assist!" @ CarriedString( BlueFlagCarrierTime[j], TotalTime ) ); + } + if( bPlayAssistSound && bNotPlayedLead ) + { + PlayerPawn( BlueFlagCarrier[j] ).ReceiveLocalizedMessage( class'SmartCTFAudioMsg', 1 ); + } + } + if( Level.Game.LocalLog != None ) + { + Level.Game.LocalLog.LogSpecialEvent( "Flag_assist", BlueFlagCarrier[j].PlayerReplicationInfo.PlayerID, 0 ); + } + } + else if( BlueFlagCarrier[j] == FCs[1] ) + { + if( bNewCapAssistScoring ) + { + if( TotalTime == 0 ) + { + f = 0; + } + else + { + f = ( BlueFlagCarrierTime[j] / TotalTime ) * ( 7 + CapBonus ); + } + Bonus = Max( f, MinimalCapBonus ); + FCs[1].PlayerReplicationInfo.Score += Bonus - 7; + if( bShowAssistConsoleMsg && PlayerPawn( FCs[1] ) != None ) + { + PlayerPawn( FCs[1] ).ClientMessage( "You get " $ Bonus $ " pts for the Capture!" @ CarriedString( BlueFlagCarrierTime[j], TotalTime ) ); + } + } + else + { + FCs[1].PlayerReplicationInfo.Score += CapBonus; + } + } + } + ResetFlagCarriers( 1 ); +} + +/* + * Clear assisters list of Team, because of flag return. Team = 2: clear both teams. +*/ +function ResetFlagCarriers( byte Team ) +{ + local byte i; + + if( Team != 1 ) + { + RedFCIndex = 0; + for( i = 0; i < 32; i++ ) + { + RedFlagCarrier[i] = None; + RedFlagCarrierTime[i] = 0; + } + } + if( Team != 0 ) + { + BlueFCIndex = 0; + for( i = 0; i < 32; i++ ) + { + BlueFlagCarrier[i] = None; + BlueFlagCarrierTime[i] = 0; + } + } +} + +function string CarriedString( float Time, float TotalTime ) +{ + local int Perc; + local float f; + + if( TotalTime == 0 ) + { + f = 0; + } + else + { + f = ( Time / TotalTime ) * 100; + } + + Perc = Clamp( f, 0, 100 ); + if( Perc == 100 ) + { + return "(Solocap," @ int( Time ) @ "sec.)"; + } + else + { + return "(Carried" @ Perc $ "% of the time:" @ int( Time ) @ "sec.)"; + } +} + +/* + * Intercept CTF messages to set FC states and adjust scores. +*/ +function bool MutatorBroadcastLocalizedMessage( Actor Sender, Pawn Receiver, out class Message, out optional int Switch, out optional PlayerReplicationInfo RelatedPRI_1, out optional PlayerReplicationInfo RelatedPRI_2, out optional Object OptionalObject ) +{ + local CTFFlag Flag; + local byte i, LeadSound; + local Pawn pn, FirstPawn; + local SmartCTFPlayerReplicationInfo ReceiverStats; + + // This function gets called each time someone receives a message. Thus for a broadcast, we need to make sure code only + // gets executed once. We can do that by comparing Receiver with f.e. the FC if applicable, or with the first Pawn + // in the PawnList (FirstPawn, see below). + + if( Message == class'CTFMessage' ) + { + if( Sender.IsA( 'CTFGame' ) ) + { + Flag = CTFFlag( OptionalObject ); + } + else if( Sender.IsA( 'CTFFlag' ) ) + { + Flag = CTFFlag( Sender ); + } + else + { + return super.MutatorBroadcastLocalizedMessage( Sender, Receiver, Message, Switch, RelatedPRI_1, RelatedPRI_2, OptionalObject ); + } + if( Flag == None ) + { + return super.MutatorBroadcastLocalizedMessage( Sender, Receiver, Message, Switch, RelatedPRI_1, RelatedPRI_2, OptionalObject ); + } + + // Warmup + if( DeathMatchPlus( Level.Game ).bTournament && !bTournamentGameStarted ) + { + return super.MutatorBroadcastLocalizedMessage( Sender, Receiver, Message, Switch, RelatedPRI_1, RelatedPRI_2, OptionalObject ); + } + + switch( Switch ) + { + // CAPTURE + // Sender: CTFGame, PRI: Scorer.PlayerReplicationInfo, OptObj: TheFlag + case 0: + if( Receiver == Pawn( RelatedPRI_1.Owner ) ) + { + //Flag = CTFFlag( OptionalObject ); + i = 1 - Flag.Team; + if( i == 1 ) + { + AddBlueFlagCarrier( FCs[i], Level.TimeSeconds - PickupTime[i] ); + } + else + { + AddRedFlagCarrier( FCs[i], Level.TimeSeconds - PickupTime[i] ); + } + + // Increment Caps for the player and the total + ReceiverStats = SCTFGame.GetStats( FCs[i] ); + if( ReceiverStats != None ) + { + ReceiverStats.Captures++; + } + + if( bPlayLeadSound ) + { + if( ( CTFGame( Level.Game ).Teams[i].Score - 1 ) == CTFGame( Level.Game ).Teams[1 - i].Score ) + { + LeadSound = 1; + } + if( CTFGame( Level.Game ).Teams[i].Score == CTFGame( Level.Game ).Teams[1 - i].Score ) + { + LeadSound = 2; + } + + for( pn = Level.PawnList; pn != None; pn = pn.NextPawn ) + { + if( PlayerPawn( pn ) != None && pn.bIsPlayer ) + { + if( LeadSound == 1 && pn.PlayerReplicationInfo.Team == i ) + { + PlayerPawn( pn ).ReceiveLocalizedMessage( class'SmartCTFAudioMsg', 3 ); + } + else if( LeadSound == 2 && pn.PlayerReplicationInfo.Team == ( 1 - i ) ) + { + PlayerPawn( pn ).ReceiveLocalizedMessage( class'SmartCTFAudioMsg', 4 ); + } + } + } + } + + // Don't play Capture sound if "Got The Lead" sound has played + if( bPlayCaptureSound && PlayerPawn( FCs[i] ) != None ) + { + if( !( bPlayLeadSound && ( LeadSound == 1 ) ) ) + { + PlayerPawn( FCs[i] ).ReceiveLocalizedMessage( class'SmartCTFAudioMsg', 0 ); + } + } + + // Reward points To FC and Assisters and increment Assists count and total + if( Flag.Team == 0 ) + { + RewardBlueFlagCarriers( !( bPlayLeadSound && ( LeadSound == 1 ) ) ); + } + else + { + RewardRedFlagCarriers( !( bPlayLeadSound && ( LeadSound == 1 ) ) ); + } + ResetFlagCarriers( 2 ); + GiveCoverSealBonus( Flag.Team ); // Reward pts to Covers And Sealers + + // Reset FCs And Assister num n index And reset sprees + FCs[0] = None; + FCs[1] = None; + ResetSprees( 2 ); // Means reset all since no Team is equal to 2. + } + break; + + // DROP + // Sender: CTFFlag, PRI: Holder.PlayerReplicationInfo, OptObj: CTFGame(Level.Game).Teams[Team] + case 2: + if( Receiver == Pawn( RelatedPRI_1.Owner ) ) + { + i = 1 - Flag.Team; + if( i == 1 ) + { + AddBlueFlagCarrier( FCs[i], Level.TimeSeconds - PickupTime[i] ); + } + else + { + AddRedFlagCarrier( FCs[i], Level.TimeSeconds - PickupTime[i] ); + } + } + break; + + // PICKUP (after the FC dropped it) + // Sender: CTFFlag, PRI: Holder.PlayerReplicationInfo, OptObj: CTFGame(Level.Game).Teams[Team] + case 4: + if( Receiver == Flag.Holder ) + { + i = 1 - Flag.Team; + PickupTime[i] = Level.TimeSeconds; + FCs[i] = Flag.Holder; + } + break; + + // GRAB + // Sender: CTFFlag, PRI: Holder.PlayerReplicationInfo, OptObj: CTFGame(Level.Game).Teams[Team] + case 6: + if( Receiver == Flag.Holder ) + { + i = 1 - Flag.Team; + PickupTime[i] = Level.TimeSeconds; + FCs[i] = Flag.Holder; // Set the FC + RelatedPRI_1.Score += GrabBonus; + // Increment FC's Grabs and total Grabs + ReceiverStats = SCTFGame.GetStats( FCs[i] ); + if( ReceiverStats != None ) + { + ReceiverStats.Grabs++; + } + } + break; + + + // RETURN + case 1: + case 3: + case 5: + // Get a pawn that receives messages, thus triggers this function ( as Receiver ) + for( FirstPawn = Level.PawnList; FirstPawn != None; FirstPawn = FirstPawn.NextPawn ) + { + if( FirstPawn.bIsPlayer || FirstPawn.IsA( 'MessagingSpectator' ) ) + { + break; + } + } + + if( Receiver == FirstPawn ) // Just get the first one. + { + // Switch == 1: it's returned by player, sent by CTFGame. + // Sender: CTFGame, PRI: Scorer.PlayerReplicationInfo, ObtObj: TheFlag + if( Switch == 1 ) + { + // 8 pts for a close save (with msg), Half a pt for base returns, 2 pts for Mid, 4 pts for enemy base + if( !bTooCloseForSaves && VSize( Flag.Location - FlagStands[1 - Flag.Team].Location ) < 900 ) + { // CLOSE SAVE + RelatedPRI_1.Score += CloseSaveReturnBonus; + if( Level.Game.LocalLog != None ) + { + Level.Game.LocalLog.LogSpecialEvent( "flag_return_closesave", RelatedPRI_1.PlayerID, Flag.Team ); + } + + // Only a msg if not a Flag standoff - other flag is home + if( CTFReplicationInfo( Level.Game.GameReplicationInfo ).FlagList[1 - Flag.Team].bHome ) + { + if( SavedMsgType == 1 && PlayerPawn( RelatedPRI_1.Owner ) != None ) + { + PlayerPawn( RelatedPRI_1.Owner ).ClientMessage( class'SmartCTFMessage'.static.GetString( 7 + 64, RelatedPRI_1 ) ); + } + else if( SavedMsgType == 2 ) + { + BroadcastMessage( class'SmartCTFMessage'.static.GetString( 7, RelatedPRI_1 ) ); + } + else if( SavedMsgType == 3 ) + { + BroadcastLocalizedMessage( class'SmartCTFMessage', 7, RelatedPRI_1 ); + } + if( bPlaySavedSound && PlayerPawn( RelatedPRI_1.Owner ) != None ) + { + PlayerPawn( RelatedPRI_1.Owner ).ReceiveLocalizedMessage( class'SmartCTFAudioMsg', 2 ); + } + } + } + else if( IsInZone( RelatedPRI_1, 1 - Flag.Team ) ) + { + RelatedPRI_1.Score += EnemyBaseReturnBonus; // If in enemy base + if( Level.Game.LocalLog != None ) + { + Level.Game.LocalLog.LogSpecialEvent( "flag_return_enemybase", RelatedPRI_1.PlayerID, Flag.Team ); + } + } + else if( !IsInZone( RelatedPRI_1, Flag.Team ) ) // Not in enemy base and not on own side = mid + { + RelatedPRI_1.Score += MidReturnBonus; // If in Mid + if( Level.Game.LocalLog != None ) + { + Level.Game.LocalLog.LogSpecialEvent( "flag_return_mid", RelatedPRI_1.PlayerID, Flag.Team ); + } + } + else + { + RelatedPRI_1.Score += BaseReturnBonus; + if( Level.Game.LocalLog != None ) + { + Level.Game.LocalLog.LogSpecialEvent( "flag_return_base", RelatedPRI_1.PlayerID, Flag.Team ); + } + } + + } // end if switch == 1 + + ResetSprees( Flag.Team ); // Reset cover sprees and seal sprees of Other Team + ResetFlagCarriers( 1 - Flag.Team ); // Reset assist list + } + + break; + } // end switch + if(bStoreStats) + { + UpdateInfo(); + } + } // end if msg is CTF msg. + + return super.MutatorBroadcastLocalizedMessage( Sender, Receiver, Message, Switch, RelatedPRI_1, RelatedPRI_2, OptionalObject ); +} + +/* + * Gives all players of Team that covered their FC extra bonus points after the cap. +*/ +function GiveCoverSealBonus( int Team ) +{ + local PlayerReplicationInfo pnPRI; + local byte i; + local SmartCTFPlayerReplicationInfo PawnStats; + local Pawn pn; + + SCTFGame.RefreshPRI(); + for( i = 0; i < 64; i++ ) + { + PawnStats = SCTFGame.GetStatNr( i ); + if( PawnStats == None ) + { + break; + } + pnPRI = PlayerReplicationInfo( PawnStats.Owner ); + pn = Pawn( pnPRI.Owner ); + + if( pnPRI.Team != Team ) + { + if( PawnStats != None && PawnStats.SealSpree > 0 ) + { + pnPRI.Score += PawnStats.SealSpree * SealBonus; + if( bShowSealRewardConsoleMsg && PlayerPawn( pn ) != None ) + { + PlayerPawn( pn ).ClientMessage("You killed " $ PawnStats.SealSpree $ " people sealing off the base. You get " $ PawnStats.SealSpree * SealBonus $ " bonus pts!" ); + } + if( Level.Game.LocalLog != None ) + { + Level.Game.LocalLog.LogSpecialEvent( "seal_bonus", pnPRI.PlayerID, PawnStats.SealSpree, PawnStats.SealSpree * SealBonus ); + } + } + if( PawnStats != None && PawnStats.CoverSpree > 0 ) + { + pnPRI.Score += PawnStats.CoverSpree * CoverBonus; + if( bShowCoverRewardConsoleMsg && PlayerPawn( pn ) != None ) + { + PlayerPawn( pn ).ClientMessage("You killed " $ PawnStats.CoverSpree $ " people covering your FC. You get " $ PawnStats.CoverSpree * CoverBonus $ " bonus pts!" ); + } + if( Level.Game.LocalLog != None ) + { + Level.Game.LocalLog.LogSpecialEvent( "cover_bonus", pnPRI.PlayerID, PawnStats.CoverSpree, PawnStats.CoverSpree * CoverBonus ); + } + } + } + } + if(bStoreStats) + { + UpdateInfo(); + } +} + +/* + * Reset cover and seal sprees of Team cause of flag return. +*/ +function ResetSprees( int Team ) +{ + local byte i; + local SmartCTFPlayerReplicationInfo PawnStats; + + SCTFGame.RefreshPRI(); + for( i = 0; i < 64; i++ ) + { + PawnStats = SCTFGame.GetStatNr( i ); + if( PawnStats == None ) + { + break; + } + if( PlayerReplicationInfo( PawnStats.Owner ).Team != Team ) + { + PawnStats.CoverSpree = 0; + PawnStats.SealSpree = 0; + } + } +} + +/* + * Clear stats. +*/ +function ClearStats() +{ + SCTFGame.ClearStats(); + ResetFlagCarriers( 2 ); + FCs[0] = None; + FCs[1] = None; +} + +/* + * Give info on 'mutate smartctf' commands. +*/ +function Mutate( string MutateString, PlayerPawn Sender ) +{ + local int ID; + local string SoundsString, MsgsString, CMsgsString; + local SmartCTFPlayerReplicationInfo SenderStats; + + if( Left( MutateString, 8 ) ~= "SmartCTF" ) + { + ID = Sender.PlayerReplicationInfo.PlayerID; + + if( Mid( MutateString, 9, 9 ) ~= "ShowStats" || Mid( MutateString, 9, 5 ) ~= "Stats" ) + { + SenderStats = SCTFGame.GetStats( Sender ); + if( SenderStats != None ) + { + SenderStats.ToggleStats(); + } + } + else if( Mid( MutateString, 9, 10 ) ~= "ForceStats" ) + { + SenderStats = SCTFGame.GetStats( Sender ); + if( SenderStats != None ) + { + SenderStats.ShowStats(); + } + } + else if( Mid( MutateString, 9, 5 ) ~= "Rules" || Mid( MutateString, 9, 6 ) ~= "Points" || Mid( MutateString, 9, 5 ) ~= "Score" || Mid( MutateString, 9, 5 ) ~= "Bonus" ) + { + if( bNewCapAssistScoring ) + { + Sender.ClientMessage( "SmartCTF Score Settings: - Cap/Assist:" @ 7 + CapBonus @ "pts divided over all FC's by time" ); + } + else + { + Sender.ClientMessage( "SmartCTF Score Settings: - Cap:" @ 7 + CapBonus @ "pts, Assist:" @ AssistBonus @ "pts." ); + } + Sender.ClientMessage( "- Cover (Kills while defending FC) Bonus :" @ CoverBonus @ "pts each. And" @ CoverBonus @ "more pts each if FC caps." ); + Sender.ClientMessage( "- Seal Bonus:" @ SealBonus @ "pts each, and" @ SealBonus @ "more pts each if FC caps." ); + Sender.ClientMessage( "- Seals (Kills while sealing off base) are defined by: 1) Your FC is on your team's side of map. 2) Your flag is not taken. 3) You kill someone on your side of the map." ); + if(bExtraStats) + { + Sender.ClientMessage( "- DefKills (Kills while the enemy is in your base area) are defined by: 1) Your flag is not taken. 2) You kill someone on your side of the map." ); + Sender.ClientMessage( "- Flagkills:" @ 5 + FlagKillBonus @ "pts. Flag Returns in base are worth" @ DitchZeros( BaseReturnBonus ) @ "pts, in mid" @ DitchZeros( MidReturnBonus ) @ "pts, enemy base" @ DitchZeros( EnemyBaseReturnBonus ) @ "pts, VERY close to capping" @ DitchZeros( CloseSaveReturnBonus ) @ "pts." ); + Sender.ClientMessage( "- Additional features: See Readme!" ); + } + } + else if( Mid( MutateString, 9, 8 ) ~= "ForceEnd" ) + { + if( !Sender.PlayerReplicationInfo.bAdmin && Level.NetMode != NM_StandAlone ) + { + Sender.ClientMessage( "You need to be logged in as admin to force the game to end." ); + } + else + { + BroadcastMessage( Sender.PlayerReplicationInfo.PlayerName @ "forced the game to end." ); + bForcedEndGame = True; + CTFGame( Level.Game ).EndGame( "forced" ); + } + } + else if( Mid( MutateString, 9, 10 ) ~= "ClearStats" ) + { + if( !Sender.PlayerReplicationInfo.bAdmin && Level.NetMode != NM_StandAlone ) + { + Sender.ClientMessage( "You need to be logged in as admin to be able to clear the stats." ); + } + else + { + ClearStats(); + Sender.ClientMessage( "Stats cleared." ); + } + } + else + { + Sender.ClientMessage( "SmartCTF - ChaCha Fork V6"); + Sender.ClientMessage( "Originally by: {PiN}Kev_HH. 4C by {DnF2}SiNiSTeR. 4D by [es]Rush. 4E by adminthis & The_Cowboy & Sp0ngeb0b.!"); + Sender.ClientMessage( "- To toggle stats, bind a key or type in console: 'Mutate SmartCTF Stats'" ); + Sender.ClientMessage( "- Type 'Mutate CTFInfo' for SmartCTF settings." ); + Sender.ClientMessage( "- Type 'Mutate SmartCTF Rules' for new point system definition." ); + Sender.ClientMessage( "- Type 'Mutate SmartCTF ForceEnd' to end a game." ); + if( bEnableOvertimeControl ) + { + Sender.ClientMessage( "- Type 'Mutate OverTime ' for Overtime Control." ); + } + } + } + else if( Left( MutateString, 7 ) ~= "CTFInfo" ) + { + SoundsString = ""; + if( bPlayCaptureSound ) SoundsString = SoundsString @ "Capture"; + if( bPlayAssistSound ) SoundsString = SoundsString @ "Assist"; + if( bPlaySavedSound ) SoundsString = SoundsString @ "Saved"; + if( bPlayLeadSound ) SoundsString = SoundsString @ "Lead"; + if( bPlay30SecSound ) SoundsString = SoundsString @ "30SecLeft"; + if( SoundsString == "" ) SoundsString = "All off"; + if( Left( SoundsString, 1 ) == " " ) SoundsString = Mid( SoundsString, 1 ); + MsgsString = ""; + if( CoverMsgType == 1 ) MsgsString = MsgsString @ "Covers"; + if( CoverMsgType == 2 ) MsgsString = MsgsString @ "Covers"; + if( CoverMsgType == 3 ) MsgsString = MsgsString @ "Covers"; + if( CoverSpreeMsgType == 1 ) MsgsString = MsgsString @ "Coversprees"; + if( CoverSpreeMsgType == 2 ) MsgsString = MsgsString @ "Coversprees"; + if( CoverSpreeMsgType == 3 ) MsgsString = MsgsString @ "Coversprees"; + if( DeniedMsgType == 1 ) MsgsString = MsgsString @ "Denied"; + if( DeniedMsgType == 2 ) MsgsString = MsgsString @ "Denied"; + if( DeniedMsgType == 3 ) MsgsString = MsgsString @ "Denied"; + if( SealMsgType == 1 ) MsgsString = MsgsString @ "Seals"; + if( SealMsgType == 2 ) MsgsString = MsgsString @ "Seals"; + if( SealMsgType == 3 ) MsgsString = MsgsString @ "Seals"; + if( SavedMsgType == 1 ) MsgsString = MsgsString @ "Saved"; + if( SavedMsgType == 2 ) MsgsString = MsgsString @ "Saved"; + if( SavedMsgType == 3 ) MsgsString = MsgsString @ "Saved"; + if( MsgsString == "" ) MsgsString = "All off"; + if( Left( MsgsString, 1 ) == " " ) MsgsString = Mid( MsgsString, 1 ); + CMsgsString = ""; + if( bShowAssistConsoleMsg ) CMsgsString = CMsgsString @ "AssistBonus"; + if( bShowSealRewardConsoleMsg ) CMsgsString = CMsgsString @ "SealReward"; + if( bShowCoverRewardConsoleMsg ) CMsgsString = CMsgsString @ "CoverReward"; + if( bShowLongRangeMsg ) CMsgsString = CMsgsString @ "LongRangeKill"; + if( CMsgsString == "" ) CMsgsString = "All off"; + if( Left( CMsgsString, 1 ) == " " ) CMsgsString = Mid( CMsgsString, 1 ); + Sender.ClientMessage( "- bExtraStats:" @ bExtraStats); + Sender.ClientMessage( "- Sounds:" @ SoundsString ); + Sender.ClientMessage( "- Msgs:" @ MsgsString ); + Sender.ClientMessage( "- Private Msgs:" @ CMsgsString ); + Sender.ClientMessage( "- bFixFlagBug:" @ bFixFlagBug ); + Sender.ClientMessage( "- bEnhancedMultiKill:" @ bEnhancedMultiKill $ ", Broadcast Level:" @ EnhancedMultiKillBroadcast ); + Sender.ClientMessage( "- bShowFCLocation:" @ bShowFCLocation ); + if( bSpawnKillDetection ) Sender.ClientMessage( "- bSpawnKillDetection: True, Global Msg:" @ bShowSpawnKillerGlobalMsg $ ", Penalty:" @ SpawnKillPenalty @ "pts" ); + else Sender.ClientMessage( "- bSpawnKillDetection: False" ); + Sender.ClientMessage( "- Overtime Control:" @ bEnableOvertimeControl @ "( Type 'Mutate OverTime' )" ); + Sender.ClientMessage( "- Scores: ( Type 'Mutate SmartCTF Rules' )"); + } + else if( Left( MutateString, 8 ) ~= "OverTime" ) + { + if( !DeathMatchPlus( Level.Game ).bTournament ) + { + Sender.ClientMessage( "Not in Tournament Mode: Default Sudden Death Overtime behaviour." ); + } + else if( !bEnableOvertimeControl ) + { + Sender.ClientMessage( "Overtime Control is not enabled: Default UT Sudden Death functionality." ); + Sender.ClientMessage( "Admins can use: admin set SmartCTF bEnableOvertimeControl True" ); + } + else + { + if( Left( MutateString, 11 ) ~= "OverTime On" ) + { + if( !Sender.PlayerReplicationInfo.bAdmin && Level.NetMode != NM_StandAlone ) + { + Sender.ClientMessage( "You need to be logged in as admin to change this setting." ); + } + else + { + bOvertime = True; + SaveConfig(); + BroadcastLocalizedMessage( class'SmartCTFCoolMsg', 3 ); + } + } + else if( Left( MutateString, 12 ) ~= "OverTime Off" ) + { + if( !Sender.PlayerReplicationInfo.bAdmin && Level.NetMode != NM_StandAlone ) + { + Sender.ClientMessage( "You need to be logged in as admin to change this setting." ); + } + else + { + bOvertime = False; + SaveConfig(); + BroadcastLocalizedMessage( class'SmartCTFCoolMsg', 4 ); + } + } + else + { + if( Sender.PlayerReplicationInfo.bAdmin || Level.NetMode == NM_StandAlone ) + { + Sender.ClientMessage( "Usage: Mutate OverTime On|Off" ); + } + if( !bOvertime ) + { + Sender.ClientMessage( "Sudden Death Overtime is DISABLED." ); + } + else + { + Sender.ClientMessage( "Sudden Death Overtime is ENABLED (default)." ); + } + Sender.ClientMessage( "Remember 'Disabled' Setting:" @ bRememberOvertimeSetting ); + } + } + } + + super.Mutate( MutateString, Sender ); +} + +/* + * To stop on a tie if needed. +*/ +function bool HandleEndGame() +{ + local bool bTied; + + if( CTFGame( Level.Game ).Teams[0].Score == CTFGame( Level.Game ).Teams[1].Score ) + { + bTied = True; + } + + if( bForcedEndGame || ( bEnableOvertimeControl && !bOvertime && DeathMatchPlus( Level.Game ).bTournament ) ) + { + bForcedEndGame = False; + if( bTied ) + { + SetEndCamsTiedCTFGame(); + return True; + } + } + + if( !bTied ) + { + CalcSmartCTFEndStats(); + } + if(bStoreStats) + { + UpdateInfo(); + } + if( NextMutator != None ) + { + return NextMutator.HandleEndGame(); + } + return False; +} + + +/* + * Position end cameras for a tied game. +*/ +function SetEndCamsTiedCTFGame() +{ + local Pawn pn, Best; + local PlayerPawn Player; + local CTFGame gg; + + gg = CTFGame( Level.Game ); + + // Find Individual Winner + for( pn = Level.PawnList ; pn != None ; pn = pn.NextPawn ) + { + if( pn.bIsPlayer && ( ( Best == None ) || ( pn.PlayerReplicationInfo.Score > Best.PlayerReplicationInfo.Score ) ) ) + { + Best = pn; + } + } + + gg.GameReplicationInfo.GameEndedComments = GameTieMessage; + gg.EndTime = Level.TimeSeconds + 3.0; + + for( pn = Level.PawnList ; pn != None ; pn = pn.NextPawn ) + { + Player = PlayerPawn( pn ); + if( Player != None ) + { + Player.bBehindView = True; + if( Player == Best ) + { + Player.ViewTarget = None; + } + else + { + Player.ViewTarget = Best; + } + + Player.ClientPlaySound( sound'CaptureSound', , true ); + Player.ClientGameEnded(); + } + pn.GotoState( 'GameEnded' ); + } + + gg.CalcEndStats(); + CalcSmartCTFEndStats(); +} + +function CalcSmartCTFEndStats() +{ + local SmartCTFPlayerReplicationInfo TopScore, TopFrags, TopCaps, TopCovers, TopFlagkills, TopHeadshots; + local string BestRecordDate; + local float PerHour; + local SmartCTFPlayerReplicationInfo PawnStats; + local PlayerReplicationInfo PRI; + local byte i; + local SmartCTFEndStats EndStats; + + EndStats = SCTFGame.EndStats; + + SCTFGame.RefreshPRI(); + for( i = 0; i < 64; i++ ) + { + PawnStats = SCTFGame.GetStatNr( i ); + if( PawnStats == None ) + { + break; + } + + if( TopScore == None || PlayerReplicationInfo( PawnStats.Owner ).Score > PlayerReplicationInfo( TopScore.Owner ).Score ) + { + TopScore = PawnStats; + } + if( TopFrags == None || PawnStats.Frags > TopFrags.Frags ) + { + TopFrags = PawnStats; + } + if( TopCaps == None || PawnStats.Captures > TopCaps.Captures ) + { + TopCaps = PawnStats; + } + if( TopCovers == None || PawnStats.Covers > TopCovers.Covers ) + { + TopCovers = PawnStats; + } + if( TopFlagkills == None || PawnStats.FlagKills > TopFlagkills.FlagKills ) + { + TopFlagkills = PawnStats; + } + if( TopHeadshots == None || PawnStats.HeadShots > TopHeadshots.HeadShots ) + { + TopHeadshots = PawnStats; + } + } + + PRI = PlayerReplicationInfo( TopScore.Owner ); + PerHour = ( Level.TimeSeconds - PRI.StartTime ) / 3600; + if( PRI.Score / PerHour > EndStats.MostPoints.Count && Level.TimeSeconds - PRI.StartTime > 300 ) + { + EndStats.MostPoints.Count = PRI.Score / PerHour; + EndStats.MostPoints.PlayerName = PRI.PlayerName; + EndStats.MostPoints.MapName = Level.Title; + CTFGame( Level.Game ).GetTimeStamp( BestRecordDate ); + EndStats.MostPoints.RecordDate = BestRecordDate; + } + + PRI = PlayerReplicationInfo( TopFrags.Owner ); + PerHour = ( Level.TimeSeconds - PRI.StartTime ) / 3600; + if( TopFrags.Frags / PerHour > EndStats.MostFrags.Count && Level.TimeSeconds - PRI.StartTime > 300 ) + { + EndStats.MostFrags.Count = TopFrags.Frags / PerHour; + EndStats.MostFrags.PlayerName = PRI.PlayerName; + EndStats.MostFrags.MapName = Level.Title; + CTFGame( Level.Game ).GetTimeStamp( BestRecordDate ); + EndStats.MostFrags.RecordDate = BestRecordDate; + } + + PRI = PlayerReplicationInfo( TopCaps.Owner ); + PerHour = ( Level.TimeSeconds - PRI.StartTime ) / 3600; + if( TopCaps.Captures / PerHour > EndStats.MostCaps.Count && Level.TimeSeconds - PRI.StartTime > 300 ) + { + EndStats.MostCaps.Count = TopCaps.Captures / PerHour; + EndStats.MostCaps.PlayerName = PRI.PlayerName; + EndStats.MostCaps.MapName = Level.Title; + CTFGame( Level.Game ).GetTimeStamp( BestRecordDate ); + EndStats.MostCaps.RecordDate = BestRecordDate; + } + + PRI = PlayerReplicationInfo( TopCovers.Owner ); + PerHour = ( Level.TimeSeconds - PRI.StartTime ) / 3600; + if( TopCovers.Covers / PerHour > EndStats.MostCovers.Count && Level.TimeSeconds - PRI.StartTime > 300 ) + { + EndStats.MostCovers.Count = TopCovers.Covers / PerHour; + EndStats.MostCovers.PlayerName = PRI.PlayerName; + EndStats.MostCovers.MapName = Level.Title; + CTFGame( Level.Game ).GetTimeStamp( BestRecordDate ); + EndStats.MostCovers.RecordDate = BestRecordDate; + } + + PRI = PlayerReplicationInfo( TopFlagkills.Owner ); + PerHour = ( Level.TimeSeconds - PRI.StartTime ) / 3600; + if( TopFlagkills.FlagKills / PerHour > EndStats.MostFlagKills.Count && Level.TimeSeconds - PRI.StartTime > 300 ) + { + EndStats.MostFlagKills.Count = TopFlagkills.FlagKills / PerHour; + EndStats.MostFlagKills.PlayerName = PRI.PlayerName; + EndStats.MostFlagKills.MapName = Level.Title; + CTFGame( Level.Game ).GetTimeStamp( BestRecordDate ); + EndStats.MostFlagKills.RecordDate = BestRecordDate; + } + + PRI = PlayerReplicationInfo( TopHeadshots.Owner ); + PerHour = ( Level.TimeSeconds - PRI.StartTime ) / 3600; + if( TopHeadshots.HeadShots / PerHour > EndStats.MostHeadShots.Count && Level.TimeSeconds - PRI.StartTime > 300 ) + { + EndStats.MostHeadShots.Count = TopHeadshots.HeadShots / PerHour; + EndStats.MostHeadShots.PlayerName = PRI.PlayerName; + EndStats.MostHeadShots.MapName = Level.Title; + CTFGame( Level.Game ).GetTimeStamp( BestRecordDate ); + EndStats.MostHeadShots.RecordDate = BestRecordDate; + } + + EndStats.SaveConfig(); +} + +/* + * Convert a float to a readable string. +*/ +function string DitchZeros( float nr ) +{ + local string str; + + str = string( nr ); + while( Right( str, 1 ) == "0" ) + { + str = Left( str , Len( str ) - 1 ); + } + if( Right( str, 1 ) == "." ) + { + str = Left( str , Len( str ) - 1 ); + } + + return str; +} + +//---------------------------------------------------------------------------------------------------------------- +//------------------------------------------------ CLIENT FUNCTIONS ---------------------------------------------- +//---------------------------------------------------------------------------------------------------------------- + +/* + * Render the HUD that is startup logo and FC location. + * ONLY gets executed on clients. +*/ +simulated event PostRender( Canvas C ) +{ + local int i, Y; + local float DummyY, Size, Temp; + local string TempStr; + + if( NextHUDMutator != None ) + { + NextHUDMutator.PostRender( C ); + } + + // Get stuff relating to PlayerOwner, if not gotten. Also spawn Font info. + if( PlayerOwner == None ) + { + PlayerOwner = C.Viewport.Actor; + pPRI = PlayerOwner.PlayerReplicationInfo; + } + + if(MyHUD == None) + { + MyHUD = ChallengeHUD( PlayerOwner.MyHUD ); + MyFonts = MyHUD.MyFonts; + } + + if(pTGRI == None) + { + pTGRI = TournamentGameReplicationInfo (PlayerOwner.GameReplicationInfo); + if(pTGRI==None) + { + return; + } + } + + // Draw the FC Location + if( SCTFGame.bShowFCLocation ) + { + for( i = 0; i < 32; i++ ) + { + if( pTGRI.PRIArray[i] == None ) + { + break; + } + if( pTGRI.PRIArray[i].bIsSpectator && !pTGRI.PRIArray[i].bWaitingPlayer ) + { + continue; + } + if( pTGRI.PRIArray[i].HasFlag != None && pTGRI.PRIArray[i].Team == pPRI.Team && pTGRI.PRIArray[i].PlayerID != pPRI.PlayerID && !pTGRI.PRIArray[i].HasFlag.IsA( 'GreenFlag' ) ) + { + if( pTGRI.PRIArray[i].PlayerLocation != None ) + { + TempStr = pTGRI.PRIArray[i].PlayerLocation.LocationName; + } + else if( pTGRI.PRIArray[i].PlayerZone != None ) + { + TempStr = pTGRI.PRIArray[i].PlayerZone.ZoneName; + } + if( TempStr == "" ) + { + TempStr = "Nameless Area"; + C.Style = ERenderStyle.STY_Translucent; + } + else + { + C.Style = ERenderStyle.STY_Normal; + } + + if( pPRI.Team == 0 ) + { + C.DrawColor = RedTeamColor; + } + else + { + C.DrawColor = BlueTeamColor; + } + + C.Font = MyFonts.GetSmallestFont( C.ClipX ); + C.StrLen( TempStr, Size, DummyY ); + if( MyHUD.bHideAllWeapons ) + { + Y = C.ClipY; + } + else if( MyHUD.HudScale * MyHUD.WeaponScale * C.ClipX <= C.ClipX - 256 * MyHUD.Scale) + { + Y = C.ClipY - 64 * MyHUD.Scale; + } + else + { + Y = C.ClipY - 128 * MyHUD.Scale; + } + + C.SetPos( C.ClipX - Size - 6, Y - 4 - 32 + ( 32 - DummyY ) / 2 ); + C.DrawText( TempStr ); + if( C.Style == ERenderStyle.STY_Translucent ) + { + C.DrawColor = Gray; + } + else + { + C.DrawColor = White; + } + C.SetPos( C.ClipX - Size - 6 - 32 - 4, Y - 4 - 32 ); + if( pPRI.Team == 0 ) + { + C.DrawIcon( texture'blueflag', 1.0 ); + } + else + { + C.DrawIcon( texture'redflag', 1.0 ); + } + + break; + } + } + } + + // Draw "Powered by.." logo when player joins + if( DrawLogo != 0 ) + { + C.Style = ERenderStyle.STY_Translucent; + if( DrawLogo > 1 ) + { + C.DrawColor.R = 255 - DrawLogo/2; + C.DrawColor.G = 255 - DrawLogo/2; + C.DrawColor.B = 255 - DrawLogo/2; + } + else // 1 + { + C.Style = ERenderStyle.STY_Translucent; + C.DrawColor = White; + } + if(powered == None) + { + powered=texture'powered'; + } + C.SetPos( C.ClipX - powered.Usize - 16, 40 ); + C.DrawIcon( powered, 1 ); + C.Font = MyFonts.GetSmallFont( C.ClipX ); + C.StrLen( "SmartCTF "$Version , Size, DummyY ); + C.SetPos( C.ClipX - powered.Usize/2 - Size/2 - 16, 40 + 8 + powered.Vsize ); + Temp = DummyY; + C.DrawText( "SmartCTF "$Version ); + } + + C.Style = ERenderStyle.STY_Normal; +} + + +/* + * Executed on the client when that player joins the server. +*/ +simulated function ClientJoinServer( Pawn Other ) +{ + if( PlayerPawn( Other ) == None || !Other.bIsPlayer ) + { + return; + } + + if(SCTFGame.bDrawLogo) + { + DrawLogo = 1; + } + + SetTimer( 0.05 , True); + + // Since this gets called in the HUD it needs to be changed clientside. + if( SCTFGame.bPlay30SecSound ) + { + class'TimeMessage'.default.TimeSound[5] = sound'Announcer.CD30Sec'; + } +} + +/* + * Clientside settings that need to be set for the first time, checking for welcome message and + * end of game screen. +*/ +simulated function Tick( float delta ) +{ + local SmartCTFPlayerReplicationInfo OwnerStats; + + // Execute on client + if( Level.NetMode != NM_DedicatedServer ) + { + if( SCTFGame == None ) + { + ForEach AllActors( class'SmartCTFGameReplicationInfo', SCTFGame ) + { + break; + } + + if( SCTFGame == None ) + { + return; + } + + if( !SCTFGame.bServerInfoSetServerSide && SCTFGame.DefaultHUDType != None ) // client side required + { + class( SCTFGame.DefaultHUDType ).default.ServerInfoClass = class'SmartCTFServerInfo'; + Log( "Notified HUD (clientside," @ SCTFGame.DefaultHUDType.name $ ") to use SmartCTF ServerInfo.", 'SmartCTF' ); + } + } + if( !SCTFGame.bInitialized ) + { + return; + } + + if( !bHUDMutator ) + { + RegisterHUDMutator(); + } + + if( PlayerOwner != None ) + { + if( !bClientJoinPlayer ) + { + bClientJoinPlayer = True; + ClientJoinServer( PlayerOwner ); + } + + // If Game is over, bring up F3. + if(PlayerOwner.GameReplicationInfo !=None) + { + if( PlayerOwner.GameReplicationInfo.GameEndedComments != "" && !bGameEnded ) + { + bGameEnded = True; + OwnerStats = SCTFGame.GetStatsByPRI( pPRI ); + OwnerStats.bEndStats = True; + PlayerOwner.ConsoleCommand( "mutate SmartCTF ForceStats" ); + } + } + } + } +} + +/* + * For showing the Logo a Timer is used instead of Ticks so its equal for each tickrate. + * On the server it keeps track of some replicated data and whether a Tournament game is starting. +*/ +simulated function Timer() +{ + local bool bReady; + local Pawn pn; + local SmartCTFPlayerReplicationInfo SenderStats; + + super.Timer(); + + // Clients - 0.05 second timer. Stops after logo is displayed. + if( Level.NetMode != NM_DedicatedServer ) + { + if( DrawLogo != 0 && SCTFGame.bDrawLogo ) + { + LogoCounter++; + if( DrawLogo == 510 ) + { + DrawLogo = 0; + if( Role != ROLE_Authority ) + { + SetTimer( 0.0, False ); // client timer off + } + else + { + SetTimer( 1.0, True ); // standalone game? keep timer running for bit below. + } + } + else if( LogoCounter > 60 ) + { + DrawLogo += 8; + if( DrawLogo > 510 ) + { + DrawLogo = 510; + } + } + else if( LogoCounter == 60 ) + { + DrawLogo = 5; + } + } + + if(!bInitSb && SCTFGame.bSCTFSbDef){ // SCTFGame fixes bSCTFSbDef bug. + if(bGameEnded) + { + // Don't interfere with scoreboard showing on game end + bInitSb=true; + return; + } + SbCount++; + if(SbCount>=SCTFGame.SbDelayC){ // Wait SbDelayC second(s) before calling SmartCTF sb + SenderStats = SCTFGame.GetStats( PlayerOwner ); + if( SenderStats != None ) + { + SenderStats.ShowStats(true); + } + bInitSb=true; + if(!SCTFGame.bDrawLogo && Role != ROLE_Authority) + { + SetTimer(0.0,False); + } + } + } + } + + // Server - 1 second timer. infinite. + if( Level.NetMode == NM_DedicatedServer || Role == ROLE_Authority ) + { + if( ++TRCount > 2 ) + { + SCTFGame.TickRate = int( ConsoleCommand( "get IpDrv.TcpNetDriver NetServerMaxTickRate" ) ); + TRCount = 0; + } + + SbDelayC = SbDelay*20; // Timer is called every 0.05s, so * 20 converts the value in seconds to our count compatible value + + // Update config vars to client / manual replication :E + // Allows for runtime changing of settings. + if( SCTFGame.bShowFCLocation != bShowFCLocation ) SCTFGame.bShowFCLocation = bShowFCLocation; + if( SCTFGame.bStatsDrawFaces != bStatsDrawFaces ) SCTFGame.bStatsDrawFaces = bStatsDrawFaces; + if( SCTFGame.bDrawLogo != bDrawLogo ) SCTFGame.bDrawLogo = bDrawLogo; + if( SCTFGame.bSCTFSbDef != bSCTFSbDef ) SCTFGame.bSCTFSbDef = bSCTFSbDef; + if( SCTFGame.bShowSpecs != bShowSpecs ) SCTFGame.bShowSpecs = bShowSpecs; + if( SCTFGame.SpectatorColor != SpectatorColor ) SCTFGame.SpectatorColor = SpectatorColor; + if( SCTFGame.bDoKeybind != bDoKeybind ) SCTFGame.bDoKeybind = bDoKeybind; + if( SCTFGame.SbDelayC != SbDelayC ) SCTFGame.SbDelayC = SbDelayC; + if( SCTFGame.bSnowyScoreboard != bSnowyScoreboard ) SCTFGame.bSnowyScoreboard = bSnowyScoreboard; + if( SCTFGame.bXmasImages != bXmasImages ) SCTFGame.bXmasImages = bXmasImages; + + if( !bTournamentGameStarted && DeathMatchPlus( Level.Game ).bTournament ) + { + if( DeathMatchPlus( Level.Game ).bRequireReady && + DeathMatchPlus( Level.Game ).CountDown > 0 && + ( DeathMatchPlus( Level.Game ).NumPlayers == DeathMatchPlus( Level.Game ).MaxPlayers || Level.NetMode == NM_Standalone ) && + DeathMatchPlus( Level.Game ).RemainingBots <= 0 ) + { + bReady = True; + for( pn = Level.PawnList; pn != None; pn = pn.NextPawn ) + { + if( pn.IsA( 'PlayerPawn' ) && !pn.IsA( 'Spectator' ) && !PlayerPawn( pn ).bReadyToPlay ) + { + bReady = False; + break; + } + } + } + + if( bReady ) + { + bTournamentGameStarted = True; + TournamentGameStarted(); + } + } + + // UT's built-in messaging spectator is excluded from the spectator list based on its starttime. + // We need to make sure this does not include any players as well. + // Update: on slow/exotic servers, the starttime could be delayed (not 0). Let's make sure it is. + if(!bStartTimeCorrected && bShowSpecs) + { + for(pn = Level.PawnList; pn != None; pn = pn.NextPawn){ + if(pn.IsA('PlayerPawn') && pn.PlayerReplicationInfo.StartTime==0) + { + pn.PlayerReplicationInfo.StartTime=1; + } + if(!pn.bIsPlayer && pn.PlayerReplicationInfo.Playername=="Player") + { + pn.PlayerReplicationInfo.StartTime=0; + } + } + if(Level.TimeSeconds>=5) + { + bStartTimeCorrected=true; // After five seconds, the messaging spectator(s) should be loaded, so we are done. + } + } + + // Since PlayerID's are incremented in the order of player joins [and those joined later cannot have an earlier StartTime than preceding players], this can be reliably used to deliver each player the delayed message only once + // without having to resort to a large array of PIDs already messaged; we can simply check against the *last* PID messaged instead. + // Too bad the timer only runs at 1.0. That sorf of defies the purpose of MsgDelay being a float instead of an int. O well... matches nice with SbDelay ;) + for(pn = Level.PawnList; pn != None; pn = pn.NextPawn) + { + if( pn.IsA('PlayerPawn') && + pn.bIsPlayer && + Level.TimeSeconds - pn.PlayerReplicationInfo.StartTime >= MsgDelay && + pn.PlayerReplicationInfo.PlayerID>MsgPID) + { + if(!SCTFGame.bDrawLogo) + { + pn.ClientMessage( "Running SmartCTF " $ Version $ ". Type 'Mutate SmartCTF' in the console for info." ); + } + if(bExtraMsg && bDoKeybind && SCTFGame.bDrawLogo) + { + pn.ClientMessage("Running SmartCTF " $ Version $ ". Press F3 to toggle between scoreboards."); + } + else if(bExtraMsg && bDoKeybind) + { + pn.ClientMessage("Press F3 to toggle between scoreboards."); // Shorter msg, since we already announced we are running SmartCTF. + } + MsgPID = pn.PlayerReplicationInfo.PlayerID; // Increase to keep track of whom still to message + } + } + } +} + +defaultproperties +{ + SCTFGame=None + RedAstIndex=0 + BlueAstIndex=0 + TRCount=0 + version="ChaChaV5" + GameTieMessage="The game ended in a tie!" + FCs(0)=None + FCs(1)=None + RedAssisters(0)=None + RedAssisters(1)=None + RedAssisters(2)=None + RedAssisters(3)=None + RedAssisters(4)=None + RedAssisters(5)=None + RedAssisters(6)=None + RedAssisters(7)=None + RedAssisters(8)=None + RedAssisters(9)=None + RedAssisters(10)=None + RedAssisters(11)=None + RedAssisters(12)=None + RedAssisters(13)=None + RedAssisters(14)=None + RedAssisters(15)=None + RedAssisters(16)=None + RedAssisters(17)=None + RedAssisters(18)=None + RedAssisters(19)=None + RedAssisters(20)=None + RedAssisters(21)=None + RedAssisters(22)=None + RedAssisters(23)=None + RedAssisters(24)=None + RedAssisters(25)=None + RedAssisters(26)=None + RedAssisters(27)=None + RedAssisters(28)=None + RedAssisters(29)=None + RedAssisters(30)=None + RedAssisters(31)=None + BlueAssisters(0)=None + BlueAssisters(1)=None + BlueAssisters(2)=None + BlueAssisters(3)=None + BlueAssisters(4)=None + BlueAssisters(5)=None + BlueAssisters(6)=None + BlueAssisters(7)=None + BlueAssisters(8)=None + BlueAssisters(9)=None + BlueAssisters(10)=None + BlueAssisters(11)=None + BlueAssisters(12)=None + BlueAssisters(13)=None + BlueAssisters(14)=None + BlueAssisters(15)=None + BlueAssisters(16)=None + BlueAssisters(17)=None + BlueAssisters(18)=None + BlueAssisters(19)=None + BlueAssisters(20)=None + BlueAssisters(21)=None + BlueAssisters(22)=None + BlueAssisters(23)=None + BlueAssisters(24)=None + BlueAssisters(25)=None + BlueAssisters(26)=None + BlueAssisters(27)=None + BlueAssisters(28)=None + BlueAssisters(29)=None + BlueAssisters(30)=None + BlueAssisters(31)=None + RedFlagCarrier(0)=None + RedFlagCarrier(1)=None + RedFlagCarrier(2)=None + RedFlagCarrier(3)=None + RedFlagCarrier(4)=None + RedFlagCarrier(5)=None + RedFlagCarrier(6)=None + RedFlagCarrier(7)=None + RedFlagCarrier(8)=None + RedFlagCarrier(9)=None + RedFlagCarrier(10)=None + RedFlagCarrier(11)=None + RedFlagCarrier(12)=None + RedFlagCarrier(13)=None + RedFlagCarrier(14)=None + RedFlagCarrier(15)=None + RedFlagCarrier(16)=None + RedFlagCarrier(17)=None + RedFlagCarrier(18)=None + RedFlagCarrier(19)=None + RedFlagCarrier(20)=None + RedFlagCarrier(21)=None + RedFlagCarrier(22)=None + RedFlagCarrier(23)=None + RedFlagCarrier(24)=None + RedFlagCarrier(25)=None + RedFlagCarrier(26)=None + RedFlagCarrier(27)=None + RedFlagCarrier(28)=None + RedFlagCarrier(29)=None + RedFlagCarrier(30)=None + RedFlagCarrier(31)=None + BlueFlagCarrier(0)=None + BlueFlagCarrier(1)=None + BlueFlagCarrier(2)=None + BlueFlagCarrier(3)=None + BlueFlagCarrier(4)=None + BlueFlagCarrier(5)=None + BlueFlagCarrier(6)=None + BlueFlagCarrier(7)=None + BlueFlagCarrier(8)=None + BlueFlagCarrier(9)=None + BlueFlagCarrier(10)=None + BlueFlagCarrier(11)=None + BlueFlagCarrier(12)=None + BlueFlagCarrier(13)=None + BlueFlagCarrier(14)=None + BlueFlagCarrier(15)=None + BlueFlagCarrier(16)=None + BlueFlagCarrier(17)=None + BlueFlagCarrier(18)=None + BlueFlagCarrier(19)=None + BlueFlagCarrier(20)=None + BlueFlagCarrier(21)=None + BlueFlagCarrier(22)=None + BlueFlagCarrier(23)=None + BlueFlagCarrier(24)=None + BlueFlagCarrier(25)=None + BlueFlagCarrier(26)=None + BlueFlagCarrier(27)=None + BlueFlagCarrier(28)=None + BlueFlagCarrier(29)=None + BlueFlagCarrier(30)=None + BlueFlagCarrier(31)=None + RedFlagCarrierTime(0)=0.000000 + RedFlagCarrierTime(1)=0.000000 + RedFlagCarrierTime(2)=0.000000 + RedFlagCarrierTime(3)=0.000000 + RedFlagCarrierTime(4)=0.000000 + RedFlagCarrierTime(5)=0.000000 + RedFlagCarrierTime(6)=0.000000 + RedFlagCarrierTime(7)=0.000000 + RedFlagCarrierTime(8)=0.000000 + RedFlagCarrierTime(9)=0.000000 + RedFlagCarrierTime(10)=0.000000 + RedFlagCarrierTime(11)=0.000000 + RedFlagCarrierTime(12)=0.000000 + RedFlagCarrierTime(13)=0.000000 + RedFlagCarrierTime(14)=0.000000 + RedFlagCarrierTime(15)=0.000000 + RedFlagCarrierTime(16)=0.000000 + RedFlagCarrierTime(17)=0.000000 + RedFlagCarrierTime(18)=0.000000 + RedFlagCarrierTime(19)=0.000000 + RedFlagCarrierTime(20)=0.000000 + RedFlagCarrierTime(21)=0.000000 + RedFlagCarrierTime(22)=0.000000 + RedFlagCarrierTime(23)=0.000000 + RedFlagCarrierTime(24)=0.000000 + RedFlagCarrierTime(25)=0.000000 + RedFlagCarrierTime(26)=0.000000 + RedFlagCarrierTime(27)=0.000000 + RedFlagCarrierTime(28)=0.000000 + RedFlagCarrierTime(29)=0.000000 + RedFlagCarrierTime(30)=0.000000 + RedFlagCarrierTime(31)=0.000000 + BlueFlagCarrierTime(0)=0.000000 + BlueFlagCarrierTime(1)=0.000000 + BlueFlagCarrierTime(2)=0.000000 + BlueFlagCarrierTime(3)=0.000000 + BlueFlagCarrierTime(4)=0.000000 + BlueFlagCarrierTime(5)=0.000000 + BlueFlagCarrierTime(6)=0.000000 + BlueFlagCarrierTime(7)=0.000000 + BlueFlagCarrierTime(8)=0.000000 + BlueFlagCarrierTime(9)=0.000000 + BlueFlagCarrierTime(10)=0.000000 + BlueFlagCarrierTime(11)=0.000000 + BlueFlagCarrierTime(12)=0.000000 + BlueFlagCarrierTime(13)=0.000000 + BlueFlagCarrierTime(14)=0.000000 + BlueFlagCarrierTime(15)=0.000000 + BlueFlagCarrierTime(16)=0.000000 + BlueFlagCarrierTime(17)=0.000000 + BlueFlagCarrierTime(18)=0.000000 + BlueFlagCarrierTime(19)=0.000000 + BlueFlagCarrierTime(20)=0.000000 + BlueFlagCarrierTime(21)=0.000000 + BlueFlagCarrierTime(22)=0.000000 + BlueFlagCarrierTime(23)=0.000000 + BlueFlagCarrierTime(24)=0.000000 + BlueFlagCarrierTime(25)=0.000000 + BlueFlagCarrierTime(26)=0.000000 + BlueFlagCarrierTime(27)=0.000000 + BlueFlagCarrierTime(28)=0.000000 + BlueFlagCarrierTime(29)=0.000000 + BlueFlagCarrierTime(30)=0.000000 + BlueFlagCarrierTime(31)=0.000000 + RedFCIndex=0 + BlueFCIndex=0 + RedAssistTimes(0)=0.000000 + RedAssistTimes(1)=0.000000 + RedAssistTimes(2)=0.000000 + RedAssistTimes(3)=0.000000 + RedAssistTimes(4)=0.000000 + RedAssistTimes(5)=0.000000 + RedAssistTimes(6)=0.000000 + RedAssistTimes(7)=0.000000 + RedAssistTimes(8)=0.000000 + RedAssistTimes(9)=0.000000 + RedAssistTimes(10)=0.000000 + RedAssistTimes(11)=0.000000 + RedAssistTimes(12)=0.000000 + RedAssistTimes(13)=0.000000 + RedAssistTimes(14)=0.000000 + RedAssistTimes(15)=0.000000 + RedAssistTimes(16)=0.000000 + RedAssistTimes(17)=0.000000 + RedAssistTimes(18)=0.000000 + RedAssistTimes(19)=0.000000 + RedAssistTimes(20)=0.000000 + RedAssistTimes(21)=0.000000 + RedAssistTimes(22)=0.000000 + RedAssistTimes(23)=0.000000 + RedAssistTimes(24)=0.000000 + RedAssistTimes(25)=0.000000 + RedAssistTimes(26)=0.000000 + RedAssistTimes(27)=0.000000 + RedAssistTimes(28)=0.000000 + RedAssistTimes(29)=0.000000 + RedAssistTimes(30)=0.000000 + RedAssistTimes(31)=0.000000 + BlueAssistTimes(0)=0.000000 + BlueAssistTimes(1)=0.000000 + BlueAssistTimes(2)=0.000000 + BlueAssistTimes(3)=0.000000 + BlueAssistTimes(4)=0.000000 + BlueAssistTimes(5)=0.000000 + BlueAssistTimes(6)=0.000000 + BlueAssistTimes(7)=0.000000 + BlueAssistTimes(8)=0.000000 + BlueAssistTimes(9)=0.000000 + BlueAssistTimes(10)=0.000000 + BlueAssistTimes(11)=0.000000 + BlueAssistTimes(12)=0.000000 + BlueAssistTimes(13)=0.000000 + BlueAssistTimes(14)=0.000000 + BlueAssistTimes(15)=0.000000 + BlueAssistTimes(16)=0.000000 + BlueAssistTimes(17)=0.000000 + BlueAssistTimes(18)=0.000000 + BlueAssistTimes(19)=0.000000 + BlueAssistTimes(20)=0.000000 + BlueAssistTimes(21)=0.000000 + BlueAssistTimes(22)=0.000000 + BlueAssistTimes(23)=0.000000 + BlueAssistTimes(24)=0.000000 + BlueAssistTimes(25)=0.000000 + BlueAssistTimes(26)=0.000000 + BlueAssistTimes(27)=0.000000 + BlueAssistTimes(28)=0.000000 + BlueAssistTimes(29)=0.000000 + BlueAssistTimes(30)=0.000000 + BlueAssistTimes(31)=0.000000 + PickupTime(0)=0.000000 + PickupTime(1)=0.000000 + FlagStands(0)=None + FlagStands(1)=None + bForcedEndGame=False + bTournamentGameStarted=False + bTooCloseForSaves=False + bStartTimeCorrected=False + MsgPID=0 + GoneName(0)="" + GoneName(1)="" + GoneName(2)="" + GoneName(3)="" + GoneName(4)="" + GoneName(5)="" + GoneName(6)="" + GoneName(7)="" + GoneName(8)="" + GoneName(9)="" + GoneName(10)="" + GoneName(11)="" + GoneName(12)="" + GoneName(13)="" + GoneName(14)="" + GoneName(15)="" + GoneName(16)="" + GoneName(17)="" + GoneName(18)="" + GoneName(19)="" + GoneName(20)="" + GoneName(21)="" + GoneName(22)="" + GoneName(23)="" + GoneName(24)="" + GoneName(25)="" + GoneName(26)="" + GoneName(27)="" + GoneName(28)="" + GoneName(29)="" + GoneName(30)="" + GoneName(31)="" + GoneIP(0)="" + GoneIP(1)="" + GoneIP(2)="" + GoneIP(3)="" + GoneIP(4)="" + GoneIP(5)="" + GoneIP(6)="" + GoneIP(7)="" + GoneIP(8)="" + GoneIP(9)="" + GoneIP(10)="" + GoneIP(11)="" + GoneIP(12)="" + GoneIP(13)="" + GoneIP(14)="" + GoneIP(15)="" + GoneIP(16)="" + GoneIP(17)="" + GoneIP(18)="" + GoneIP(19)="" + GoneIP(20)="" + GoneIP(21)="" + GoneIP(22)="" + GoneIP(23)="" + GoneIP(24)="" + GoneIP(25)="" + GoneIP(26)="" + GoneIP(27)="" + GoneIP(28)="" + GoneIP(29)="" + GoneIP(30)="" + GoneIP(31)="" + GoneScore(0)=0.000000 + GoneScore(1)=0.000000 + GoneScore(2)=0.000000 + GoneScore(3)=0.000000 + GoneScore(4)=0.000000 + GoneScore(5)=0.000000 + GoneScore(6)=0.000000 + GoneScore(7)=0.000000 + GoneScore(8)=0.000000 + GoneScore(9)=0.000000 + GoneScore(10)=0.000000 + GoneScore(11)=0.000000 + GoneScore(12)=0.000000 + GoneScore(13)=0.000000 + GoneScore(14)=0.000000 + GoneScore(15)=0.000000 + GoneScore(16)=0.000000 + GoneScore(17)=0.000000 + GoneScore(18)=0.000000 + GoneScore(19)=0.000000 + GoneScore(20)=0.000000 + GoneScore(21)=0.000000 + GoneScore(22)=0.000000 + GoneScore(23)=0.000000 + GoneScore(24)=0.000000 + GoneScore(25)=0.000000 + GoneScore(26)=0.000000 + GoneScore(27)=0.000000 + GoneScore(28)=0.000000 + GoneScore(29)=0.000000 + GoneScore(30)=0.000000 + GoneScore(31)=0.000000 + GoneDeaths(0)=0.000000 + GoneDeaths(1)=0.000000 + GoneDeaths(2)=0.000000 + GoneDeaths(3)=0.000000 + GoneDeaths(4)=0.000000 + GoneDeaths(5)=0.000000 + GoneDeaths(6)=0.000000 + GoneDeaths(7)=0.000000 + GoneDeaths(8)=0.000000 + GoneDeaths(9)=0.000000 + GoneDeaths(10)=0.000000 + GoneDeaths(11)=0.000000 + GoneDeaths(12)=0.000000 + GoneDeaths(13)=0.000000 + GoneDeaths(14)=0.000000 + GoneDeaths(15)=0.000000 + GoneDeaths(16)=0.000000 + GoneDeaths(17)=0.000000 + GoneDeaths(18)=0.000000 + GoneDeaths(19)=0.000000 + GoneDeaths(20)=0.000000 + GoneDeaths(21)=0.000000 + GoneDeaths(22)=0.000000 + GoneDeaths(23)=0.000000 + GoneDeaths(24)=0.000000 + GoneDeaths(25)=0.000000 + GoneDeaths(26)=0.000000 + GoneDeaths(27)=0.000000 + GoneDeaths(28)=0.000000 + GoneDeaths(29)=0.000000 + GoneDeaths(30)=0.000000 + GoneDeaths(31)=0.000000 + GoneStats(0)=None + GoneStats(1)=None + GoneStats(2)=None + GoneStats(3)=None + GoneStats(4)=None + GoneStats(5)=None + GoneStats(6)=None + GoneStats(7)=None + GoneStats(8)=None + GoneStats(9)=None + GoneStats(10)=None + GoneStats(11)=None + GoneStats(12)=None + GoneStats(13)=None + GoneStats(14)=None + GoneStats(15)=None + GoneStats(16)=None + GoneStats(17)=None + GoneStats(18)=None + GoneStats(19)=None + GoneStats(20)=None + GoneStats(21)=None + GoneStats(22)=None + GoneStats(23)=None + GoneStats(24)=None + GoneStats(25)=None + GoneStats(26)=None + GoneStats(27)=None + GoneStats(28)=None + GoneStats(29)=None + GoneStats(30)=None + GoneStats(31)=None + StoreName(0)="" + StoreName(1)="" + StoreName(2)="" + StoreName(3)="" + StoreName(4)="" + StoreName(5)="" + StoreName(6)="" + StoreName(7)="" + StoreName(8)="" + StoreName(9)="" + StoreName(10)="" + StoreName(11)="" + StoreName(12)="" + StoreName(13)="" + StoreName(14)="" + StoreName(15)="" + StoreName(16)="" + StoreName(17)="" + StoreName(18)="" + StoreName(19)="" + StoreName(20)="" + StoreName(21)="" + StoreName(22)="" + StoreName(23)="" + StoreName(24)="" + StoreName(25)="" + StoreName(26)="" + StoreName(27)="" + StoreName(28)="" + StoreName(29)="" + StoreName(30)="" + StoreName(31)="" + StoreScore(0)=0.000000 + StoreScore(1)=0.000000 + StoreScore(2)=0.000000 + StoreScore(3)=0.000000 + StoreScore(4)=0.000000 + StoreScore(5)=0.000000 + StoreScore(6)=0.000000 + StoreScore(7)=0.000000 + StoreScore(8)=0.000000 + StoreScore(9)=0.000000 + StoreScore(10)=0.000000 + StoreScore(11)=0.000000 + StoreScore(12)=0.000000 + StoreScore(13)=0.000000 + StoreScore(14)=0.000000 + StoreScore(15)=0.000000 + StoreScore(16)=0.000000 + StoreScore(17)=0.000000 + StoreScore(18)=0.000000 + StoreScore(19)=0.000000 + StoreScore(20)=0.000000 + StoreScore(21)=0.000000 + StoreScore(22)=0.000000 + StoreScore(23)=0.000000 + StoreScore(24)=0.000000 + StoreScore(25)=0.000000 + StoreScore(26)=0.000000 + StoreScore(27)=0.000000 + StoreScore(28)=0.000000 + StoreScore(29)=0.000000 + StoreScore(30)=0.000000 + StoreScore(31)=0.000000 + StoreDeaths(0)=0.000000 + StoreDeaths(1)=0.000000 + StoreDeaths(2)=0.000000 + StoreDeaths(3)=0.000000 + StoreDeaths(4)=0.000000 + StoreDeaths(5)=0.000000 + StoreDeaths(6)=0.000000 + StoreDeaths(7)=0.000000 + StoreDeaths(8)=0.000000 + StoreDeaths(9)=0.000000 + StoreDeaths(10)=0.000000 + StoreDeaths(11)=0.000000 + StoreDeaths(12)=0.000000 + StoreDeaths(13)=0.000000 + StoreDeaths(14)=0.000000 + StoreDeaths(15)=0.000000 + StoreDeaths(16)=0.000000 + StoreDeaths(17)=0.000000 + StoreDeaths(18)=0.000000 + StoreDeaths(19)=0.000000 + StoreDeaths(20)=0.000000 + StoreDeaths(21)=0.000000 + StoreDeaths(22)=0.000000 + StoreDeaths(23)=0.000000 + StoreDeaths(24)=0.000000 + StoreDeaths(25)=0.000000 + StoreDeaths(26)=0.000000 + StoreDeaths(27)=0.000000 + StoreDeaths(28)=0.000000 + StoreDeaths(29)=0.000000 + StoreDeaths(30)=0.000000 + StoreDeaths(31)=0.000000 + StoreIP(0)="" + StoreIP(1)="" + StoreIP(2)="" + StoreIP(3)="" + StoreIP(4)="" + StoreIP(5)="" + StoreIP(6)="" + StoreIP(7)="" + StoreIP(8)="" + StoreIP(9)="" + StoreIP(10)="" + StoreIP(11)="" + StoreIP(12)="" + StoreIP(13)="" + StoreIP(14)="" + StoreIP(15)="" + StoreIP(16)="" + StoreIP(17)="" + StoreIP(18)="" + StoreIP(19)="" + StoreIP(20)="" + StoreIP(21)="" + StoreIP(22)="" + StoreIP(23)="" + StoreIP(24)="" + StoreIP(25)="" + StoreIP(26)="" + StoreIP(27)="" + StoreIP(28)="" + StoreIP(29)="" + StoreIP(30)="" + StoreIP(31)="" + StoreStats(0)=None + StoreStats(1)=None + StoreStats(2)=None + StoreStats(3)=None + StoreStats(4)=None + StoreStats(5)=None + StoreStats(6)=None + StoreStats(7)=None + StoreStats(8)=None + StoreStats(9)=None + StoreStats(10)=None + StoreStats(11)=None + StoreStats(12)=None + StoreStats(13)=None + StoreStats(14)=None + StoreStats(15)=None + StoreStats(16)=None + StoreStats(17)=None + StoreStats(18)=None + StoreStats(19)=None + StoreStats(20)=None + StoreStats(21)=None + StoreStats(22)=None + StoreStats(23)=None + StoreStats(24)=None + StoreStats(25)=None + StoreStats(26)=None + StoreStats(27)=None + StoreStats(28)=None + StoreStats(29)=None + StoreStats(30)=None + StoreStats(31)=None + B1Name(0)="" + B1Name(1)="" + B1Name(2)="" + B1Name(3)="" + B1Name(4)="" + B1Name(5)="" + B1Name(6)="" + B1Name(7)="" + B1Name(8)="" + B1Name(9)="" + B1Name(10)="" + B1Name(11)="" + B1Name(12)="" + B1Name(13)="" + B1Name(14)="" + B1Name(15)="" + B1Name(16)="" + B1Name(17)="" + B1Name(18)="" + B1Name(19)="" + B1Name(20)="" + B1Name(21)="" + B1Name(22)="" + B1Name(23)="" + B1Name(24)="" + B1Name(25)="" + B1Name(26)="" + B1Name(27)="" + B1Name(28)="" + B1Name(29)="" + B1Name(30)="" + B1Name(31)="" + B1Score(0)=0.000000 + B1Score(1)=0.000000 + B1Score(2)=0.000000 + B1Score(3)=0.000000 + B1Score(4)=0.000000 + B1Score(5)=0.000000 + B1Score(6)=0.000000 + B1Score(7)=0.000000 + B1Score(8)=0.000000 + B1Score(9)=0.000000 + B1Score(10)=0.000000 + B1Score(11)=0.000000 + B1Score(12)=0.000000 + B1Score(13)=0.000000 + B1Score(14)=0.000000 + B1Score(15)=0.000000 + B1Score(16)=0.000000 + B1Score(17)=0.000000 + B1Score(18)=0.000000 + B1Score(19)=0.000000 + B1Score(20)=0.000000 + B1Score(21)=0.000000 + B1Score(22)=0.000000 + B1Score(23)=0.000000 + B1Score(24)=0.000000 + B1Score(25)=0.000000 + B1Score(26)=0.000000 + B1Score(27)=0.000000 + B1Score(28)=0.000000 + B1Score(29)=0.000000 + B1Score(30)=0.000000 + B1Score(31)=0.000000 + B1Deaths(0)=0.000000 + B1Deaths(1)=0.000000 + B1Deaths(2)=0.000000 + B1Deaths(3)=0.000000 + B1Deaths(4)=0.000000 + B1Deaths(5)=0.000000 + B1Deaths(6)=0.000000 + B1Deaths(7)=0.000000 + B1Deaths(8)=0.000000 + B1Deaths(9)=0.000000 + B1Deaths(10)=0.000000 + B1Deaths(11)=0.000000 + B1Deaths(12)=0.000000 + B1Deaths(13)=0.000000 + B1Deaths(14)=0.000000 + B1Deaths(15)=0.000000 + B1Deaths(16)=0.000000 + B1Deaths(17)=0.000000 + B1Deaths(18)=0.000000 + B1Deaths(19)=0.000000 + B1Deaths(20)=0.000000 + B1Deaths(21)=0.000000 + B1Deaths(22)=0.000000 + B1Deaths(23)=0.000000 + B1Deaths(24)=0.000000 + B1Deaths(25)=0.000000 + B1Deaths(26)=0.000000 + B1Deaths(27)=0.000000 + B1Deaths(28)=0.000000 + B1Deaths(29)=0.000000 + B1Deaths(30)=0.000000 + B1Deaths(31)=0.000000 + B1IP(0)="" + B1IP(1)="" + B1IP(2)="" + B1IP(3)="" + B1IP(4)="" + B1IP(5)="" + B1IP(6)="" + B1IP(7)="" + B1IP(8)="" + B1IP(9)="" + B1IP(10)="" + B1IP(11)="" + B1IP(12)="" + B1IP(13)="" + B1IP(14)="" + B1IP(15)="" + B1IP(16)="" + B1IP(17)="" + B1IP(18)="" + B1IP(19)="" + B1IP(20)="" + B1IP(21)="" + B1IP(22)="" + B1IP(23)="" + B1IP(24)="" + B1IP(25)="" + B1IP(26)="" + B1IP(27)="" + B1IP(28)="" + B1IP(29)="" + B1IP(30)="" + B1IP(31)="" + B1Stats(0)=None + B1Stats(1)=None + B1Stats(2)=None + B1Stats(3)=None + B1Stats(4)=None + B1Stats(5)=None + B1Stats(6)=None + B1Stats(7)=None + B1Stats(8)=None + B1Stats(9)=None + B1Stats(10)=None + B1Stats(11)=None + B1Stats(12)=None + B1Stats(13)=None + B1Stats(14)=None + B1Stats(15)=None + B1Stats(16)=None + B1Stats(17)=None + B1Stats(18)=None + B1Stats(19)=None + B1Stats(20)=None + B1Stats(21)=None + B1Stats(22)=None + B1Stats(23)=None + B1Stats(24)=None + B1Stats(25)=None + B1Stats(26)=None + B1Stats(27)=None + B1Stats(28)=None + B1Stats(29)=None + B1Stats(30)=None + B1Stats(31)=None + B2Name(0)="" + B2Name(1)="" + B2Name(2)="" + B2Name(3)="" + B2Name(4)="" + B2Name(5)="" + B2Name(6)="" + B2Name(7)="" + B2Name(8)="" + B2Name(9)="" + B2Name(10)="" + B2Name(11)="" + B2Name(12)="" + B2Name(13)="" + B2Name(14)="" + B2Name(15)="" + B2Name(16)="" + B2Name(17)="" + B2Name(18)="" + B2Name(19)="" + B2Name(20)="" + B2Name(21)="" + B2Name(22)="" + B2Name(23)="" + B2Name(24)="" + B2Name(25)="" + B2Name(26)="" + B2Name(27)="" + B2Name(28)="" + B2Name(29)="" + B2Name(30)="" + B2Name(31)="" + B2Score(0)=0.000000 + B2Score(1)=0.000000 + B2Score(2)=0.000000 + B2Score(3)=0.000000 + B2Score(4)=0.000000 + B2Score(5)=0.000000 + B2Score(6)=0.000000 + B2Score(7)=0.000000 + B2Score(8)=0.000000 + B2Score(9)=0.000000 + B2Score(10)=0.000000 + B2Score(11)=0.000000 + B2Score(12)=0.000000 + B2Score(13)=0.000000 + B2Score(14)=0.000000 + B2Score(15)=0.000000 + B2Score(16)=0.000000 + B2Score(17)=0.000000 + B2Score(18)=0.000000 + B2Score(19)=0.000000 + B2Score(20)=0.000000 + B2Score(21)=0.000000 + B2Score(22)=0.000000 + B2Score(23)=0.000000 + B2Score(24)=0.000000 + B2Score(25)=0.000000 + B2Score(26)=0.000000 + B2Score(27)=0.000000 + B2Score(28)=0.000000 + B2Score(29)=0.000000 + B2Score(30)=0.000000 + B2Score(31)=0.000000 + B2Deaths(0)=0.000000 + B2Deaths(1)=0.000000 + B2Deaths(2)=0.000000 + B2Deaths(3)=0.000000 + B2Deaths(4)=0.000000 + B2Deaths(5)=0.000000 + B2Deaths(6)=0.000000 + B2Deaths(7)=0.000000 + B2Deaths(8)=0.000000 + B2Deaths(9)=0.000000 + B2Deaths(10)=0.000000 + B2Deaths(11)=0.000000 + B2Deaths(12)=0.000000 + B2Deaths(13)=0.000000 + B2Deaths(14)=0.000000 + B2Deaths(15)=0.000000 + B2Deaths(16)=0.000000 + B2Deaths(17)=0.000000 + B2Deaths(18)=0.000000 + B2Deaths(19)=0.000000 + B2Deaths(20)=0.000000 + B2Deaths(21)=0.000000 + B2Deaths(22)=0.000000 + B2Deaths(23)=0.000000 + B2Deaths(24)=0.000000 + B2Deaths(25)=0.000000 + B2Deaths(26)=0.000000 + B2Deaths(27)=0.000000 + B2Deaths(28)=0.000000 + B2Deaths(29)=0.000000 + B2Deaths(30)=0.000000 + B2Deaths(31)=0.000000 + B2IP(0)="" + B2IP(1)="" + B2IP(2)="" + B2IP(3)="" + B2IP(4)="" + B2IP(5)="" + B2IP(6)="" + B2IP(7)="" + B2IP(8)="" + B2IP(9)="" + B2IP(10)="" + B2IP(11)="" + B2IP(12)="" + B2IP(13)="" + B2IP(14)="" + B2IP(15)="" + B2IP(16)="" + B2IP(17)="" + B2IP(18)="" + B2IP(19)="" + B2IP(20)="" + B2IP(21)="" + B2IP(22)="" + B2IP(23)="" + B2IP(24)="" + B2IP(25)="" + B2IP(26)="" + B2IP(27)="" + B2IP(28)="" + B2IP(29)="" + B2IP(30)="" + B2IP(31)="" + B2Stats(0)=None + B2Stats(1)=None + B2Stats(2)=None + B2Stats(3)=None + B2Stats(4)=None + B2Stats(5)=None + B2Stats(6)=None + B2Stats(7)=None + B2Stats(8)=None + B2Stats(9)=None + B2Stats(10)=None + B2Stats(11)=None + B2Stats(12)=None + B2Stats(13)=None + B2Stats(14)=None + B2Stats(15)=None + B2Stats(16)=None + B2Stats(17)=None + B2Stats(18)=None + B2Stats(19)=None + B2Stats(20)=None + B2Stats(21)=None + B2Stats(22)=None + B2Stats(23)=None + B2Stats(24)=None + B2Stats(25)=None + B2Stats(26)=None + B2Stats(27)=None + B2Stats(28)=None + B2Stats(29)=None + B2Stats(30)=None + B2Stats(31)=None + QuitMsg="" + QuitMsgLen=0 + bClientJoinPlayer=False + bGameEnded=False + bInitSb=False + LogoCounter=0 + DrawLogo=0 + SbCount=0 + SbDelayC=0.000000 + PlayerOwner=None + MyFonts=None + pTGRI=None + pPRI=None + myHUD=None + RedTeamColor=(R=255,G=0,B=0,A=0) + BlueTeamColor=(R=0,G=128,B=255,A=0) + White=(R=255,G=255,B=255,A=0) + Gray=(R=128,G=128,B=128,A=0) + bEnabled=True + bExtraStats=False + CountryFlagsPackage="CountryFlags32" + CapBonus=15 + AssistBonus=7 + FlagKillBonus=3 + CoverBonus=2 + SealBonus=3 + GrabBonus=0 + BaseReturnBonus=0.500000 + MidReturnBonus=2.000000 + EnemyBaseReturnBonus=5.000000 + CloseSaveReturnBonus=10.000000 + SpawnKillPenalty=0 + MinimalCapBonus=5 + bFixFlagBug=True + bEnhancedMultiKill=True + EnhancedMultiKillBroadcast=3 + bShowFCLocation=True + bSmartCTFServerInfo=True + bNewCapAssistScoring=True + bSpawnkillDetection=True + SpawnKillTimeArena=1.000000 + SpawnKillTimeNW=3.500000 + bAfterGodLikeMsg=True + bStatsDrawFaces=True + bDrawLogo=True + bSCTFSbDef=True + bShowSpecs=True + SpectatorColor=(R=255,G=255,B=255,A=0) + bDoKeybind=True + bExtraMsg=True + SbDelay=5.500000 + MsgDelay=7.000000 + bStoreStats=True + bSnowyScoreboard=False + bXmasImages=True + CoverMsgType=2 + CoverSpreeMsgType=3 + SealMsgType=3 + SavedMsgType=3 + DeniedMsgType=3 + bShowLongRangeMsg=False + bLongRangeSuperShock=True + bShowSpawnKillerGlobalMsg=True + bShowAssistConsoleMsg=True + bShowSealRewardConsoleMsg=True + bShowCoverRewardConsoleMsg=True + bPlayCaptureSound=True + bPlayAssistSound=True + bPlaySavedSound=True + bPlayLeadSound=True + bPlayDeniedSound=True + bPlay30SecSound=True + bPlayAirKillSound=True + bEnableOvertimeControl=False + bOverTime=True + bRememberOvertimeSetting=False + powered=None + bAlwaysRelevant=True + RemoteRole=ROLE_SimulatedProxy +} diff --git a/Sources/Classes/SmartCTFAudioMsg.uc b/Classes/SmartCTFAudioMsg.UC similarity index 100% rename from Sources/Classes/SmartCTFAudioMsg.uc rename to Classes/SmartCTFAudioMsg.UC diff --git a/Sources/Classes/SmartCTFBinds.uc b/Classes/SmartCTFBinds.UC similarity index 95% rename from Sources/Classes/SmartCTFBinds.uc rename to Classes/SmartCTFBinds.UC index 4587bdf..856ed08 100644 --- a/Sources/Classes/SmartCTFBinds.uc +++ b/Classes/SmartCTFBinds.UC @@ -1,8 +1,8 @@ -class SmartCTFBinds expands UTExtraKeyBindings; - -defaultproperties -{ - SectionName="SmartCTF" - LabelList(0)="Toggle Stats" - AliasNames(0)="mutate smartctf showstats" -} +class SmartCTFBinds expands UTExtraKeyBindings; + +defaultproperties +{ + SectionName="SmartCTF" + LabelList(0)="Toggle Stats" + AliasNames(0)="mutate smartctf showstats" +} diff --git a/Sources/Classes/SmartCTFCoolMsg.uc b/Classes/SmartCTFCoolMsg.UC similarity index 96% rename from Sources/Classes/SmartCTFCoolMsg.uc rename to Classes/SmartCTFCoolMsg.UC index 1cf3a8c..58013f6 100644 --- a/Sources/Classes/SmartCTFCoolMsg.uc +++ b/Classes/SmartCTFCoolMsg.UC @@ -1,100 +1,100 @@ -class SmartCTFCoolMsg expands LocalMessagePlus; - -var(Messages) string LongRangeString; -var(Messages) string UberLongRangeString; -var(Messages) string SpawnLamerString; -var(Messages) string OvertimeEnabledString; -var(Messages) string OvertimeDisabledString; -var(Messages) string AirKillMsg; -var(Messages) string AirKilledMsg; -var(Messages) string NewPlayerMsg; -var(Messages) string NewPlayerOtherMsg; -var(Messages) string PlayerBackMsg; -var(Messages) string PlayerBackOtherMsg; -var Color EnabledColor, DisabledColor, SpawnLamerColor,AirKillColor,AirKilledColor,NewPlayerColor,PlayerBackColor; - - -static function float GetOffset( int Switch, float YL, float ClipY ) -{ - switch( Switch ) - { - case 8: - case 9: - case 8 + 64: - case 9 + 64: - return ( default.YPos / 768.0 ) * ClipY - 3 * YL; - default: - return ( default.YPos / 768.0 ) * ClipY - 2 * YL; - } -} - - -static function string GetString( optional int Switch, optional PlayerReplicationInfo RelatedPRI_1, optional PlayerReplicationInfo RelatedPRI_2, optional Object OptionalObject ) -{ - switch( Switch ) - { - case 1: return default.LongRangeString; - case 2: return default.UberLongRangeString; - case 3: return default.OvertimeEnabledString; - case 4: return default.OvertimeDisabledString; - case 5: return default.SpawnLamerString; - case 6: return default.AirKillMsg; - case 7: return default.AirKilledMsg; - case 8: return default.NewPlayerMsg @ RelatedPRI_1.PlayerName @ "!"; - case 9: return default.PlayerBackMsg @ RelatedPRI_1.PlayerName @ "!"; - - case 8 + 64: return default.NewPlayerOtherMsg @ RelatedPRI_1.PlayerName @ "!"; - case 9 + 64: return default.PlayerBackOtherMsg @ RelatedPRI_1.PlayerName @ "!"; - } - return ""; -} - -static function Color GetColor( optional int Switch, optional PlayerReplicationInfo RelatedPRI_1, optional PlayerReplicationInfo RelatedPRI_2 ) -{ - switch( Switch ) - { - case 1: return default.DrawColor; - case 2: return default.DrawColor; - case 3: return default.EnabledColor; - case 4: return default.DisabledColor; - case 5: return default.SpawnLamerColor; - case 6: return default.AirKillColor; - case 7: return default.AirKilledColor; - case 8: return default.NewPlayerColor; - case 9: return default.PlayerBackColor; - - - case 8+64: return default.NewPlayerColor; - case 9+64: return default.PlayerBackColor; - } - return default.DrawColor; -} - -defaultproperties -{ - LongRangeString="Long Range Kill!" - UberLongRangeString="Über Long Range Kill!" - SpawnLamerString="Spawnkill..." - AirKilledMsg="Killed in the air!" - AirKillMsg="Kill in the air!" - OvertimeEnabledString="Sudden Death Overtime = Enabled" - OvertimeDisabledString="Sudden Death Overtime = DISABLED" - NewPlayerMsg="Welcome to you" - NewPlayerOtherMsg="Welcome to" - PlayerBackMsg="Welcome back" - PlayerBackOtherMsg="Welcome back to" - EnabledColor=(R=128,G=255,B=192,A=0) - DisabledColor=(R=255,G=192,B=128,A=0) - SpawnLamerColor=(R=255,G=64,B=0,A=0) - AirKillColor=(R=128,G=255,B=192,A=0) - AirKilledColor=(R=255,G=192,B=128,A=0) - NewPlayerColor=(R=128,G=255,B=192,A=0) - PlayerBackColor=(R=128,G=255,B=192,A=0) - FontSize=1 - bIsSpecial=True - bIsUnique=True - bFadeMessage=True - DrawColor=(G=224,B=224) - YPos=196.000000 - bCenter=True -} +class SmartCTFCoolMsg expands LocalMessagePlus; + +var(Messages) string LongRangeString; +var(Messages) string UberLongRangeString; +var(Messages) string SpawnLamerString; +var(Messages) string OvertimeEnabledString; +var(Messages) string OvertimeDisabledString; +var(Messages) string AirKillMsg; +var(Messages) string AirKilledMsg; +var(Messages) string NewPlayerMsg; +var(Messages) string NewPlayerOtherMsg; +var(Messages) string PlayerBackMsg; +var(Messages) string PlayerBackOtherMsg; +var Color EnabledColor, DisabledColor, SpawnLamerColor,AirKillColor,AirKilledColor,NewPlayerColor,PlayerBackColor; + + +static function float GetOffset( int Switch, float YL, float ClipY ) +{ + switch( Switch ) + { + case 8: + case 9: + case 8 + 64: + case 9 + 64: + return ( default.YPos / 768.0 ) * ClipY - 3 * YL; + default: + return ( default.YPos / 768.0 ) * ClipY - 2 * YL; + } +} + + +static function string GetString( optional int Switch, optional PlayerReplicationInfo RelatedPRI_1, optional PlayerReplicationInfo RelatedPRI_2, optional Object OptionalObject ) +{ + switch( Switch ) + { + case 1: return default.LongRangeString; + case 2: return default.UberLongRangeString; + case 3: return default.OvertimeEnabledString; + case 4: return default.OvertimeDisabledString; + case 5: return default.SpawnLamerString; + case 6: return default.AirKillMsg; + case 7: return default.AirKilledMsg; + case 8: return default.NewPlayerMsg @ RelatedPRI_1.PlayerName @ "!"; + case 9: return default.PlayerBackMsg @ RelatedPRI_1.PlayerName @ "!"; + + case 8 + 64: return default.NewPlayerOtherMsg @ RelatedPRI_1.PlayerName @ "!"; + case 9 + 64: return default.PlayerBackOtherMsg @ RelatedPRI_1.PlayerName @ "!"; + } + return ""; +} + +static function Color GetColor( optional int Switch, optional PlayerReplicationInfo RelatedPRI_1, optional PlayerReplicationInfo RelatedPRI_2 ) +{ + switch( Switch ) + { + case 1: return default.DrawColor; + case 2: return default.DrawColor; + case 3: return default.EnabledColor; + case 4: return default.DisabledColor; + case 5: return default.SpawnLamerColor; + case 6: return default.AirKillColor; + case 7: return default.AirKilledColor; + case 8: return default.NewPlayerColor; + case 9: return default.PlayerBackColor; + + + case 8+64: return default.NewPlayerColor; + case 9+64: return default.PlayerBackColor; + } + return default.DrawColor; +} + +defaultproperties +{ + LongRangeString="Long Range Kill!" + UberLongRangeString="Über Long Range Kill!" + SpawnLamerString="Spawnkill..." + AirKilledMsg="Killed in the air!" + AirKillMsg="Kill in the air!" + OvertimeEnabledString="Sudden Death Overtime = Enabled" + OvertimeDisabledString="Sudden Death Overtime = DISABLED" + NewPlayerMsg="Welcome to you" + NewPlayerOtherMsg="Welcome to" + PlayerBackMsg="Welcome back" + PlayerBackOtherMsg="Welcome back to" + EnabledColor=(R=128,G=255,B=192,A=0) + DisabledColor=(R=255,G=192,B=128,A=0) + SpawnLamerColor=(R=255,G=64,B=0,A=0) + AirKillColor=(R=128,G=255,B=192,A=0) + AirKilledColor=(R=255,G=192,B=128,A=0) + NewPlayerColor=(R=128,G=255,B=192,A=0) + PlayerBackColor=(R=128,G=255,B=192,A=0) + FontSize=1 + bIsSpecial=True + bIsUnique=True + bFadeMessage=True + DrawColor=(G=224,B=224) + YPos=196.000000 + bCenter=True +} diff --git a/Sources/Classes/SmartCTFEndStats.uc b/Classes/SmartCTFEndStats.UC similarity index 97% rename from Sources/Classes/SmartCTFEndStats.uc rename to Classes/SmartCTFEndStats.UC index da9ddc2..be9a9d2 100644 --- a/Sources/Classes/SmartCTFEndStats.uc +++ b/Classes/SmartCTFEndStats.UC @@ -1,32 +1,32 @@ -class SmartCTFEndStats expands EndStats config( user ); - -replication -{ - reliable if( Role == ROLE_Authority ) - MostPoints, MostFrags, MostCaps, MostFlagKills, MostCovers, MostHeadShots; -} - -struct BestSomething { - var int Count; - var string PlayerName; - var string MapName; - var string RecordDate; -}; - -var globalconfig BestSomething MostPoints; -var globalconfig BestSomething MostFrags; -var globalconfig BestSomething MostCaps; -var globalconfig BestSomething MostFlagKills; -var globalconfig BestSomething MostCovers; -var globalconfig BestSomething MostHeadShots; - -defaultproperties -{ - MostPoints=(Count=2970,PlayerName="The_Cowboy",MapName="Pure Action",RecordDate="06/03/2009 15:58:14") - MostFrags=(Count=406,PlayerName="Aryss",MapName="Pure Action",RecordDate="06/03/2009 21:31:44") - MostCaps=(Count=105,PlayerName="Archon",MapName="Liandri Docks",RecordDate="05/29/2009 14:09:35") - MostFlagKills=(Count=189,PlayerName="The_Cowboy",MapName="Pure Action",RecordDate="06/03/2009 15:58:14") - MostCovers=(Count=61,PlayerName="Aryss",MapName="Pure Action",RecordDate="06/03/2009 21:31:44") - MostHeadShots=(Count=64,PlayerName="{-_-}",MapName="Facing Worlds",RecordDate="05/14/2009 23:05:14") - bAlwaysRelevant=True -} +class SmartCTFEndStats expands EndStats config( user ); + +replication +{ + reliable if( Role == ROLE_Authority ) + MostPoints, MostFrags, MostCaps, MostFlagKills, MostCovers, MostHeadShots; +} + +struct BestSomething { + var int Count; + var string PlayerName; + var string MapName; + var string RecordDate; +}; + +var globalconfig BestSomething MostPoints; +var globalconfig BestSomething MostFrags; +var globalconfig BestSomething MostCaps; +var globalconfig BestSomething MostFlagKills; +var globalconfig BestSomething MostCovers; +var globalconfig BestSomething MostHeadShots; + +defaultproperties +{ + MostPoints=(Count=2970,PlayerName="The_Cowboy",MapName="Pure Action",RecordDate="06/03/2009 15:58:14") + MostFrags=(Count=406,PlayerName="Aryss",MapName="Pure Action",RecordDate="06/03/2009 21:31:44") + MostCaps=(Count=105,PlayerName="Archon",MapName="Liandri Docks",RecordDate="05/29/2009 14:09:35") + MostFlagKills=(Count=189,PlayerName="The_Cowboy",MapName="Pure Action",RecordDate="06/03/2009 15:58:14") + MostCovers=(Count=61,PlayerName="Aryss",MapName="Pure Action",RecordDate="06/03/2009 21:31:44") + MostHeadShots=(Count=64,PlayerName="{-_-}",MapName="Facing Worlds",RecordDate="05/14/2009 23:05:14") + bAlwaysRelevant=True +} diff --git a/Sources/Classes/SmartCTFEnhancedDeathMessagePlus.uc b/Classes/SmartCTFEnhancedDeathMessagePlus.UC similarity index 97% rename from Sources/Classes/SmartCTFEnhancedDeathMessagePlus.uc rename to Classes/SmartCTFEnhancedDeathMessagePlus.UC index 0f64e9b..f3b2b1f 100644 --- a/Sources/Classes/SmartCTFEnhancedDeathMessagePlus.uc +++ b/Classes/SmartCTFEnhancedDeathMessagePlus.UC @@ -1,54 +1,54 @@ -class SmartCTFEnhancedDeathMessagePlus extends DeathMessagePlus; - -static function ClientReceive( PlayerPawn P, optional int Switch, optional PlayerReplicationInfo RelatedPRI_1, optional PlayerReplicationInfo RelatedPRI_2, optional Object OptionalObject ) -{ - if( RelatedPRI_1 == P.PlayerReplicationInfo ) - { - // Interdict and send the child message instead. - if( TournamentPlayer( P ).myHUD != None ) - { - //if( class'DeathMessagePlus'.default.ChildMessage == class'KillerMessagePlus' ) class'KillerMessagePlus'.default.YouKilled = "You" @ TournamentGameInfo( P.Level.Game ).default.deathmessage[Rand(32)]; - TournamentPlayer( P ).myHUD.LocalizedMessage( default.ChildMessage, Switch, RelatedPRI_1, RelatedPRI_2, OptionalObject ); - TournamentPlayer( P ).myHUD.LocalizedMessage( default.Class, Switch, RelatedPRI_1, RelatedPRI_2, OptionalObject ); - } - - if( default.bIsConsoleMessage ) - { - TournamentPlayer( P ).Player.Console.AddString( static.GetString( Switch, RelatedPRI_1, RelatedPRI_2, OptionalObject ) ); - } - - if( ( RelatedPRI_1 != RelatedPRI_2 ) && ( RelatedPRI_2 != None ) ) - { - if( ( TournamentPlayer( P ).Level.TimeSeconds - TournamentPlayer( P ).LastKillTime < 3 ) && ( Switch != 1 ) ) - { - TournamentPlayer( P ).MultiLevel++; - TournamentPlayer( P ).ReceiveLocalizedMessage( class'SmartCTFEnhancedMultiKillMessage', TournamentPlayer( P ).MultiLevel , RelatedPRI_1 ); - } - else - { - TournamentPlayer( P ).MultiLevel = 0; - } - TournamentPlayer( P ).LastKillTime = TournamentPlayer( P ).Level.TimeSeconds; - } - else - { - TournamentPlayer( P ).MultiLevel = 0; - } - - if( ChallengeHUD( P.MyHUD ) != None ) ChallengeHUD( P.MyHUD ).ScoreTime = TournamentPlayer( P ).Level.TimeSeconds; - } - else if( RelatedPRI_2 == P.PlayerReplicationInfo ) - { - //class'VictimMessage'.default.YouWereKilledBy = "You were" @ TournamentGameInfo( P.Level.Game ).default.deathmessage[Rand(32)] @ "by"; - TournamentPlayer( P ).ReceiveLocalizedMessage( class'VictimMessage', 0, RelatedPRI_1 ); - super( LocalMessagePlus ).ClientReceive( P, Switch, RelatedPRI_1, RelatedPRI_2, OptionalObject ); - } - else - { - super( LocalMessagePlus ).ClientReceive( P, Switch, RelatedPRI_1, RelatedPRI_2, OptionalObject ); - } -} - -defaultproperties -{ -} +class SmartCTFEnhancedDeathMessagePlus extends DeathMessagePlus; + +static function ClientReceive( PlayerPawn P, optional int Switch, optional PlayerReplicationInfo RelatedPRI_1, optional PlayerReplicationInfo RelatedPRI_2, optional Object OptionalObject ) +{ + if( RelatedPRI_1 == P.PlayerReplicationInfo ) + { + // Interdict and send the child message instead. + if( TournamentPlayer( P ).myHUD != None ) + { + //if( class'DeathMessagePlus'.default.ChildMessage == class'KillerMessagePlus' ) class'KillerMessagePlus'.default.YouKilled = "You" @ TournamentGameInfo( P.Level.Game ).default.deathmessage[Rand(32)]; + TournamentPlayer( P ).myHUD.LocalizedMessage( default.ChildMessage, Switch, RelatedPRI_1, RelatedPRI_2, OptionalObject ); + TournamentPlayer( P ).myHUD.LocalizedMessage( default.Class, Switch, RelatedPRI_1, RelatedPRI_2, OptionalObject ); + } + + if( default.bIsConsoleMessage ) + { + TournamentPlayer( P ).Player.Console.AddString( static.GetString( Switch, RelatedPRI_1, RelatedPRI_2, OptionalObject ) ); + } + + if( ( RelatedPRI_1 != RelatedPRI_2 ) && ( RelatedPRI_2 != None ) ) + { + if( ( TournamentPlayer( P ).Level.TimeSeconds - TournamentPlayer( P ).LastKillTime < 3 ) && ( Switch != 1 ) ) + { + TournamentPlayer( P ).MultiLevel++; + TournamentPlayer( P ).ReceiveLocalizedMessage( class'SmartCTFEnhancedMultiKillMessage', TournamentPlayer( P ).MultiLevel , RelatedPRI_1 ); + } + else + { + TournamentPlayer( P ).MultiLevel = 0; + } + TournamentPlayer( P ).LastKillTime = TournamentPlayer( P ).Level.TimeSeconds; + } + else + { + TournamentPlayer( P ).MultiLevel = 0; + } + + if( ChallengeHUD( P.MyHUD ) != None ) ChallengeHUD( P.MyHUD ).ScoreTime = TournamentPlayer( P ).Level.TimeSeconds; + } + else if( RelatedPRI_2 == P.PlayerReplicationInfo ) + { + //class'VictimMessage'.default.YouWereKilledBy = "You were" @ TournamentGameInfo( P.Level.Game ).default.deathmessage[Rand(32)] @ "by"; + TournamentPlayer( P ).ReceiveLocalizedMessage( class'VictimMessage', 0, RelatedPRI_1 ); + super( LocalMessagePlus ).ClientReceive( P, Switch, RelatedPRI_1, RelatedPRI_2, OptionalObject ); + } + else + { + super( LocalMessagePlus ).ClientReceive( P, Switch, RelatedPRI_1, RelatedPRI_2, OptionalObject ); + } +} + +defaultproperties +{ +} diff --git a/Sources/Classes/SmartCTFEnhancedMultiKillMessage.uc b/Classes/SmartCTFEnhancedMultiKillMessage.UC similarity index 96% rename from Sources/Classes/SmartCTFEnhancedMultiKillMessage.uc rename to Classes/SmartCTFEnhancedMultiKillMessage.UC index b422eb8..25a6a19 100644 --- a/Sources/Classes/SmartCTFEnhancedMultiKillMessage.uc +++ b/Classes/SmartCTFEnhancedMultiKillMessage.UC @@ -1,108 +1,108 @@ -//============================================================================= -// SmartCTFEnhancedMultiKillMessage. -// - v1.0 29-Feb-2004 by {DnF2}SiNiSTeR - -//============================================================================= -class SmartCTFEnhancedMultiKillMessage extends MultiKillMessage; - -// Extended Multikills adds 2 more to the list :] -// These Announcer sounds already were included in the orginal game, just not used. -// It also doesn't stop after 9 times ;p - -#exec OBJ LOAD FILE=..\Sounds\Announcer.uax -#exec AUDIO IMPORT NAME=LudicrousKill FILE=Sounds\LudicrousKill.wav GROUP=SmartCTF -#exec AUDIO IMPORT NAME=HolyShit FILE=Sounds\HolyShit.wav GROUP=SmartCTF - -var(Messages) localized string MegaKillString; -var(Messages) localized string LudicrousKillString; -var(Messages) localized string HolyShitString; - -static function int GetFontSize( int Switch ) -{ - if( Switch < 3 ) return default.FontSize; - else return 2; -} - -static function string GetString( optional int Switch, optional PlayerReplicationInfo RelatedPRI_1, optional PlayerReplicationInfo RelatedPRI_2, optional Object OptionalObject ) -{ - switch( Switch ) - { - case 0: return ""; - break; - case 1: return default.DoubleKillString; - break; - case 2: return default.TripleKillString; - break; - case 3: return default.MultiKillString; - break; - case 4: return default.MegaKillString; - break; - case 5: return default.UltraKillString; - break; - case 6: return default.MonsterKillString; - break; - case 7: return default.LudicrousKillString; - break; - default: return default.HolyShitString; - break; - } -} - -static function string GetBroadcastString( int MultiLevel ) -{ - if( MultiLevel == 5 ) return "had an" @ static.GetString( MultiLevel ); - else return "had a" @ static.GetString( MultiLevel ); -} - -static simulated function ClientReceive( PlayerPawn P, optional int Switch, optional PlayerReplicationInfo RelatedPRI_1, optional PlayerReplicationInfo RelatedPRI_2, optional Object OptionalObject ) -{ - super( LocalMessagePlus ).ClientReceive( P, Switch, RelatedPRI_1, RelatedPRI_2, OptionalObject ); - - switch( Switch ) - { - case 0: break; - case 1: P.ClientPlaySound( sound'Announcer.DoubleKill', , true ); - break; - case 2: P.ClientPlaySound( sound'Announcer.TripleKill', , true ); - break; - case 3: P.ClientPlaySound( sound'Announcer.MultiKill', , true ); - break; - case 4: P.ClientPlaySound( sound'Announcer.MegaKill', , true ); - break; - case 5: P.ClientPlaySound( sound'Announcer.UltraKill', , true ); - break; - case 6: P.ClientPlaySound( sound'Announcer.MonsterKill', , true ); - break; - case 7: P.ClientPlaySound( sound'LudicrousKill', , true ); - break; - default: P.ClientPlaySound( sound'HolyShit', , true ); - break; - } -} - -static function color GetColor( optional int Switch, optional PlayerReplicationInfo RelatedPRI_1, optional PlayerReplicationInfo RelatedPRI_2 ) -{ - local Color cres; - - cres = Default.DrawColor; - if( Switch >= 1 && Switch <= 5 ) - { - cres.G = 48 * ( 5 - Switch ); - return cres; - } - else if( Switch > 5 ) - { - cres.B = Min( 48 * ( Switch - 5 ), 255 ); - return cres; - } - else - { - return cres; - } -} - -defaultproperties -{ - MegaKillString="MEGA KILL!" - LudicrousKillString="L U D I C R O U S K I L L !!!" - HolyShitString="H O L Y S H I T!!!" -} +//============================================================================= +// SmartCTFEnhancedMultiKillMessage. +// - v1.0 29-Feb-2004 by {DnF2}SiNiSTeR - +//============================================================================= +class SmartCTFEnhancedMultiKillMessage extends MultiKillMessage; + +// Extended Multikills adds 2 more to the list :] +// These Announcer sounds already were included in the orginal game, just not used. +// It also doesn't stop after 9 times ;p + +#exec OBJ LOAD FILE=..\Sounds\Announcer.uax +#exec AUDIO IMPORT NAME=LudicrousKill FILE=Sounds\LudicrousKill.wav GROUP=SmartCTF +#exec AUDIO IMPORT NAME=HolyShit FILE=Sounds\HolyShit.wav GROUP=SmartCTF + +var(Messages) localized string MegaKillString; +var(Messages) localized string LudicrousKillString; +var(Messages) localized string HolyShitString; + +static function int GetFontSize( int Switch ) +{ + if( Switch < 3 ) return default.FontSize; + else return 2; +} + +static function string GetString( optional int Switch, optional PlayerReplicationInfo RelatedPRI_1, optional PlayerReplicationInfo RelatedPRI_2, optional Object OptionalObject ) +{ + switch( Switch ) + { + case 0: return ""; + break; + case 1: return default.DoubleKillString; + break; + case 2: return default.TripleKillString; + break; + case 3: return default.MultiKillString; + break; + case 4: return default.MegaKillString; + break; + case 5: return default.UltraKillString; + break; + case 6: return default.MonsterKillString; + break; + case 7: return default.LudicrousKillString; + break; + default: return default.HolyShitString; + break; + } +} + +static function string GetBroadcastString( int MultiLevel ) +{ + if( MultiLevel == 5 ) return "had an" @ static.GetString( MultiLevel ); + else return "had a" @ static.GetString( MultiLevel ); +} + +static simulated function ClientReceive( PlayerPawn P, optional int Switch, optional PlayerReplicationInfo RelatedPRI_1, optional PlayerReplicationInfo RelatedPRI_2, optional Object OptionalObject ) +{ + super( LocalMessagePlus ).ClientReceive( P, Switch, RelatedPRI_1, RelatedPRI_2, OptionalObject ); + + switch( Switch ) + { + case 0: break; + case 1: P.ClientPlaySound( sound'Announcer.DoubleKill', , true ); + break; + case 2: P.ClientPlaySound( sound'Announcer.TripleKill', , true ); + break; + case 3: P.ClientPlaySound( sound'Announcer.MultiKill', , true ); + break; + case 4: P.ClientPlaySound( sound'Announcer.MegaKill', , true ); + break; + case 5: P.ClientPlaySound( sound'Announcer.UltraKill', , true ); + break; + case 6: P.ClientPlaySound( sound'Announcer.MonsterKill', , true ); + break; + case 7: P.ClientPlaySound( sound'LudicrousKill', , true ); + break; + default: P.ClientPlaySound( sound'HolyShit', , true ); + break; + } +} + +static function color GetColor( optional int Switch, optional PlayerReplicationInfo RelatedPRI_1, optional PlayerReplicationInfo RelatedPRI_2 ) +{ + local Color cres; + + cres = Default.DrawColor; + if( Switch >= 1 && Switch <= 5 ) + { + cres.G = 48 * ( 5 - Switch ); + return cres; + } + else if( Switch > 5 ) + { + cres.B = Min( 48 * ( Switch - 5 ), 255 ); + return cres; + } + else + { + return cres; + } +} + +defaultproperties +{ + MegaKillString="MEGA KILL!" + LudicrousKillString="L U D I C R O U S K I L L !!!" + HolyShitString="H O L Y S H I T!!!" +} diff --git a/Sources/Classes/SmartCTFFlagCheckerInventory.uc b/Classes/SmartCTFFlagCheckerInventory.UC similarity index 97% rename from Sources/Classes/SmartCTFFlagCheckerInventory.uc rename to Classes/SmartCTFFlagCheckerInventory.UC index 5b1b367..f4d1944 100644 --- a/Sources/Classes/SmartCTFFlagCheckerInventory.uc +++ b/Classes/SmartCTFFlagCheckerInventory.UC @@ -1,38 +1,38 @@ -class SmartCTFFlagCheckerInventory expands TournamentPickup; - -// This inventory item gets added to every player by default. -// Now, each time this inventory item gets destroyed it means either the player left the game or died. -// If he simply died, then the original code already made sure the flag is dropped, before we get here, -// and nothing special happens. -// When we're here, we will check if he was actually carrying the flag. If he still has a flag, it means -// the player left the server and we drop the flag manually. -// All this happens before the code that would send the flag home. -// Quite ingenious if I may say so :p (c) {DnF2}SiNiSTeR imo xD - -var string DroppedMessage; - -function Destroyed() -{ - local CTFFlag flag; - - // Use Other.Class==Class'ClassName' if you want a specific Actor type - if( Owner != none && Owner.IsA('Pawn') ) { - if( Pawn( Owner ).bIsPlayer ) { // Pawn is a player - flag = CTFFlag( Pawn( Owner ).PlayerReplicationInfo.HasFlag ); - - if( flag != None ) { // Should handle casting failure - flag.Drop( 0.5 * Pawn( Owner ).Velocity ); - BroadcastMessage( Pawn( Owner ).PlayerReplicationInfo.PlayerName @ DroppedMessage ); - } - } - } - - super.Destroyed(); // Call Destroyed() on super class TournamentPickup -} - -defaultproperties -{ - DroppedMessage="had the flag but disconnected. Flag is dropped!" - bHeldItem=True - bHidden=True -} +class SmartCTFFlagCheckerInventory expands TournamentPickup; + +// This inventory item gets added to every player by default. +// Now, each time this inventory item gets destroyed it means either the player left the game or died. +// If he simply died, then the original code already made sure the flag is dropped, before we get here, +// and nothing special happens. +// When we're here, we will check if he was actually carrying the flag. If he still has a flag, it means +// the player left the server and we drop the flag manually. +// All this happens before the code that would send the flag home. +// Quite ingenious if I may say so :p (c) {DnF2}SiNiSTeR imo xD + +var string DroppedMessage; + +function Destroyed() +{ + local CTFFlag flag; + + // Use Other.Class==Class'ClassName' if you want a specific Actor type + if( Owner != none && Owner.IsA('Pawn') ) { + if( Pawn( Owner ).bIsPlayer ) { // Pawn is a player + flag = CTFFlag( Pawn( Owner ).PlayerReplicationInfo.HasFlag ); + + if( flag != None ) { // Should handle casting failure + flag.Drop( 0.5 * Pawn( Owner ).Velocity ); + BroadcastMessage( Pawn( Owner ).PlayerReplicationInfo.PlayerName @ DroppedMessage ); + } + } + } + + super.Destroyed(); // Call Destroyed() on super class TournamentPickup +} + +defaultproperties +{ + DroppedMessage="had the flag but disconnected. Flag is dropped!" + bHeldItem=True + bHidden=True +} diff --git a/Sources/Classes/SmartCTFGameReplicationInfo.uc b/Classes/SmartCTFGameReplicationInfo.UC similarity index 96% rename from Sources/Classes/SmartCTFGameReplicationInfo.uc rename to Classes/SmartCTFGameReplicationInfo.UC index b9ac453..ec605d5 100644 --- a/Sources/Classes/SmartCTFGameReplicationInfo.uc +++ b/Classes/SmartCTFGameReplicationInfo.UC @@ -1,209 +1,209 @@ -// This class gets spawned in the mutator, serverside. -// Because of its Role, it will also get copied to clients. -// The replicated variables are accessible there. - -class SmartCTFGameReplicationInfo expands ReplicationInfo; - -var int TickRate; -var bool bShowFCLocation, bStatsDrawFaces, bPlay30SecSound, bDrawLogo, bExtraStats, bShowSpecs, bDoKeybind, bSCTFSbDef, bSnowyScoreboard, bXmasImages; -var float SbDelayC; -var color SpectatorColor; -var string CountryFlagsPackage; -var class NormalScoreBoardClass; -var SmartCTFEndStats EndStats; -var SmartCTFWelcomeNewPlayers WelcomeNewPlayers; -var SmartCTFPlayerReplicationInfo PRIArray[64]; -var bool bInitialized, bServerInfoSetServerSide, bDoneBind; -var class DefaultHUDType; - -replication -{ - // Settings - reliable if( Role == ROLE_Authority ) - bShowFCLocation, bPlay30SecSound, bStatsDrawFaces, bDrawLogo, bExtraStats, CountryFlagsPackage, bShowSpecs, bSCTFSbDef, bDoKeybind, bSnowyScoreboard, bXmasImages; - - reliable if( Role == ROLE_Authority ) - bInitialized, TickRate, NormalScoreBoardClass, EndStats, bServerInfoSetServerSide, DefaultHUDType, DoBind, SbDelayC, SpectatorColor; -} - -simulated function PostBeginPlay() -{ - SetTimer( 0.5, True ); -} - -simulated function Timer() -{ - local PlayerPawn P; - - RefreshPRI(); - - if (Level.Netmode == NM_DedicatedServer || bDoneBind || !bDoKeybind) return; // Only execute on clients, if bind hasn't been done yet and if bind should be done. - - foreach AllActors(class 'PlayerPawn', P) - if (Viewport(P.Player) != None) break; - if(P!=None) DoBind(P); - bDoneBind=true; -} - -simulated function SmartCTFPlayerReplicationInfo GetStats( Actor P ) -{ - local int i; - local PlayerReplicationInfo PRI; - - if( !P.IsA( 'Pawn' ) ) return None; - PRI = Pawn( P ).PlayerReplicationInfo; - if( PRI == None ) return None; - - for( i = 0; i < 64; i++ ) - { - if( PRIArray[i] == None ) break; - if( PRIArray[i].Owner == PRI ) return PRIArray[i]; - } - return None; -} - -simulated function SmartCTFPlayerReplicationInfo GetStatsByPRI( PlayerReplicationInfo PRI ) -{ - local int i; - - if( PRI == None ) return None; - for( i = 0; i < 64; i++ ) - { - if( PRIArray[i] == None ) break; - if( PRIArray[i].Owner == PRI ) return PRIArray[i]; - } - return None; -} - -simulated function SmartCTFPlayerReplicationInfo GetStatNr( byte i ) -{ - return PRIArray[i]; -} - -simulated function ClearStats() -{ - local int i; - for( i = 0; i < 64; i++ ) - { - if( PRIArray[i] == None ) break; - PRIArray[i].ClearStats(); - } -} - -simulated function RefreshPRI() -{ - local SmartCTFPlayerReplicationInfo PRI; - local int i; - - for( i = 0; i < 64; i++ ) PRIArray[i] = None; - - i = 0; - ForEach AllActors( class'SmartCTFPlayerReplicationInfo', PRI ) - { - if( i < 64 ) - { - if( PRI.Owner != None ) PRIArray[i++] = PRI; - } - else break; - } -} - -simulated function DoBind(PlayerPawn P) -{ - local string keyBinding; - - if ((InStr( Caps(P.ConsoleCommand("Keybinding F3")), "MUTATE SMARTCTF SHOWSTATS") == -1)) - { - keyBinding = P.ConsoleCommand("Keybinding F3"); - P.ConsoleCommand("SET INPUT F3 mutate smartctf showstats|"$keyBinding); - } -} - -defaultproperties -{ - TickRate=0 - bShowFCLocation=False - bStatsDrawFaces=False - bPlay30SecSound=False - bDrawLogo=False - bExtraStats=False - bShowSpecs=False - bDoKeybind=False - bSCTFSbDef=False - bSnowyScoreboard=False - bXmasImages=False - SbDelayC=0.000000 - SpectatorColor=(R=0,G=0,B=0,A=0) - CountryFlagsPackage="" - NormalScoreBoardClass=None - EndStats=None - PRIArray(0)=None - PRIArray(1)=None - PRIArray(2)=None - PRIArray(3)=None - PRIArray(4)=None - PRIArray(5)=None - PRIArray(6)=None - PRIArray(7)=None - PRIArray(8)=None - PRIArray(9)=None - PRIArray(10)=None - PRIArray(11)=None - PRIArray(12)=None - PRIArray(13)=None - PRIArray(14)=None - PRIArray(15)=None - PRIArray(16)=None - PRIArray(17)=None - PRIArray(18)=None - PRIArray(19)=None - PRIArray(20)=None - PRIArray(21)=None - PRIArray(22)=None - PRIArray(23)=None - PRIArray(24)=None - PRIArray(25)=None - PRIArray(26)=None - PRIArray(27)=None - PRIArray(28)=None - PRIArray(29)=None - PRIArray(30)=None - PRIArray(31)=None - PRIArray(32)=None - PRIArray(33)=None - PRIArray(34)=None - PRIArray(35)=None - PRIArray(36)=None - PRIArray(37)=None - PRIArray(38)=None - PRIArray(39)=None - PRIArray(40)=None - PRIArray(41)=None - PRIArray(42)=None - PRIArray(43)=None - PRIArray(44)=None - PRIArray(45)=None - PRIArray(46)=None - PRIArray(47)=None - PRIArray(48)=None - PRIArray(49)=None - PRIArray(50)=None - PRIArray(51)=None - PRIArray(52)=None - PRIArray(53)=None - PRIArray(54)=None - PRIArray(55)=None - PRIArray(56)=None - PRIArray(57)=None - PRIArray(58)=None - PRIArray(59)=None - PRIArray(60)=None - PRIArray(61)=None - PRIArray(62)=None - PRIArray(63)=None - bInitialized=False - bServerInfoSetServerSide=False - bDoneBind=False - DefaultHUDType=None - RemoteRole=ROLE_SimulatedProxy -} +// This class gets spawned in the mutator, serverside. +// Because of its Role, it will also get copied to clients. +// The replicated variables are accessible there. + +class SmartCTFGameReplicationInfo expands ReplicationInfo; + +var int TickRate; +var bool bShowFCLocation, bStatsDrawFaces, bPlay30SecSound, bDrawLogo, bExtraStats, bShowSpecs, bDoKeybind, bSCTFSbDef, bSnowyScoreboard, bXmasImages; +var float SbDelayC; +var color SpectatorColor; +var string CountryFlagsPackage; +var class NormalScoreBoardClass; +var SmartCTFEndStats EndStats; +var SmartCTFWelcomeNewPlayers WelcomeNewPlayers; +var SmartCTFPlayerReplicationInfo PRIArray[64]; +var bool bInitialized, bServerInfoSetServerSide, bDoneBind; +var class DefaultHUDType; + +replication +{ + // Settings + reliable if( Role == ROLE_Authority ) + bShowFCLocation, bPlay30SecSound, bStatsDrawFaces, bDrawLogo, bExtraStats, CountryFlagsPackage, bShowSpecs, bSCTFSbDef, bDoKeybind, bSnowyScoreboard, bXmasImages; + + reliable if( Role == ROLE_Authority ) + bInitialized, TickRate, NormalScoreBoardClass, EndStats, bServerInfoSetServerSide, DefaultHUDType, DoBind, SbDelayC, SpectatorColor; +} + +simulated function PostBeginPlay() +{ + SetTimer( 0.5, True ); +} + +simulated function Timer() +{ + local PlayerPawn P; + + RefreshPRI(); + + if (Level.Netmode == NM_DedicatedServer || bDoneBind || !bDoKeybind) return; // Only execute on clients, if bind hasn't been done yet and if bind should be done. + + foreach AllActors(class 'PlayerPawn', P) + if (Viewport(P.Player) != None) break; + if(P!=None) DoBind(P); + bDoneBind=true; +} + +simulated function SmartCTFPlayerReplicationInfo GetStats( Actor P ) +{ + local int i; + local PlayerReplicationInfo PRI; + + if( !P.IsA( 'Pawn' ) ) return None; + PRI = Pawn( P ).PlayerReplicationInfo; + if( PRI == None ) return None; + + for( i = 0; i < 64; i++ ) + { + if( PRIArray[i] == None ) break; + if( PRIArray[i].Owner == PRI ) return PRIArray[i]; + } + return None; +} + +simulated function SmartCTFPlayerReplicationInfo GetStatsByPRI( PlayerReplicationInfo PRI ) +{ + local int i; + + if( PRI == None ) return None; + for( i = 0; i < 64; i++ ) + { + if( PRIArray[i] == None ) break; + if( PRIArray[i].Owner == PRI ) return PRIArray[i]; + } + return None; +} + +simulated function SmartCTFPlayerReplicationInfo GetStatNr( byte i ) +{ + return PRIArray[i]; +} + +simulated function ClearStats() +{ + local int i; + for( i = 0; i < 64; i++ ) + { + if( PRIArray[i] == None ) break; + PRIArray[i].ClearStats(); + } +} + +simulated function RefreshPRI() +{ + local SmartCTFPlayerReplicationInfo PRI; + local int i; + + for( i = 0; i < 64; i++ ) PRIArray[i] = None; + + i = 0; + ForEach AllActors( class'SmartCTFPlayerReplicationInfo', PRI ) + { + if( i < 64 ) + { + if( PRI.Owner != None ) PRIArray[i++] = PRI; + } + else break; + } +} + +simulated function DoBind(PlayerPawn P) +{ + local string keyBinding; + + if ((InStr( Caps(P.ConsoleCommand("Keybinding F3")), "MUTATE SMARTCTF SHOWSTATS") == -1)) + { + keyBinding = P.ConsoleCommand("Keybinding F3"); + P.ConsoleCommand("SET INPUT F3 mutate smartctf showstats|"$keyBinding); + } +} + +defaultproperties +{ + TickRate=0 + bShowFCLocation=False + bStatsDrawFaces=False + bPlay30SecSound=False + bDrawLogo=False + bExtraStats=False + bShowSpecs=False + bDoKeybind=False + bSCTFSbDef=False + bSnowyScoreboard=False + bXmasImages=False + SbDelayC=0.000000 + SpectatorColor=(R=0,G=0,B=0,A=0) + CountryFlagsPackage="" + NormalScoreBoardClass=None + EndStats=None + PRIArray(0)=None + PRIArray(1)=None + PRIArray(2)=None + PRIArray(3)=None + PRIArray(4)=None + PRIArray(5)=None + PRIArray(6)=None + PRIArray(7)=None + PRIArray(8)=None + PRIArray(9)=None + PRIArray(10)=None + PRIArray(11)=None + PRIArray(12)=None + PRIArray(13)=None + PRIArray(14)=None + PRIArray(15)=None + PRIArray(16)=None + PRIArray(17)=None + PRIArray(18)=None + PRIArray(19)=None + PRIArray(20)=None + PRIArray(21)=None + PRIArray(22)=None + PRIArray(23)=None + PRIArray(24)=None + PRIArray(25)=None + PRIArray(26)=None + PRIArray(27)=None + PRIArray(28)=None + PRIArray(29)=None + PRIArray(30)=None + PRIArray(31)=None + PRIArray(32)=None + PRIArray(33)=None + PRIArray(34)=None + PRIArray(35)=None + PRIArray(36)=None + PRIArray(37)=None + PRIArray(38)=None + PRIArray(39)=None + PRIArray(40)=None + PRIArray(41)=None + PRIArray(42)=None + PRIArray(43)=None + PRIArray(44)=None + PRIArray(45)=None + PRIArray(46)=None + PRIArray(47)=None + PRIArray(48)=None + PRIArray(49)=None + PRIArray(50)=None + PRIArray(51)=None + PRIArray(52)=None + PRIArray(53)=None + PRIArray(54)=None + PRIArray(55)=None + PRIArray(56)=None + PRIArray(57)=None + PRIArray(58)=None + PRIArray(59)=None + PRIArray(60)=None + PRIArray(61)=None + PRIArray(62)=None + PRIArray(63)=None + bInitialized=False + bServerInfoSetServerSide=False + bDoneBind=False + DefaultHUDType=None + RemoteRole=ROLE_SimulatedProxy +} diff --git a/Sources/Classes/SmartCTFMessage.uc b/Classes/SmartCTFMessage.UC similarity index 96% rename from Sources/Classes/SmartCTFMessage.uc rename to Classes/SmartCTFMessage.UC index 2355660..64af733 100644 --- a/Sources/Classes/SmartCTFMessage.uc +++ b/Classes/SmartCTFMessage.UC @@ -1,97 +1,97 @@ -// Above all other messages. -class SmartCTFMessage extends LocalMessagePlus; - -var string CoveredMsg, YouCoveredMsg; -var string CoverSpreeMsg, YouCoverSpreeMsg; -var string UltraCoverMsg, YouUltraCoverMsg; -var string SealMsg, YouSealMsg; -var string SavedMsg, YouSavedMsg; -var string SpawnKillMsg; -var string DeniedMsg, YouDeniedMsg; - -static function float GetOffset( int Switch, float YL, float ClipY ) -{ - return ( default.YPos / 768.0 ) * ClipY - 3 * YL; -} - -static function string GetString( optional int Switch, optional PlayerReplicationInfo RelatedPRI_1, optional PlayerReplicationInfo RelatedPRI_2, optional Object OptionalObject ) -{ - if (RelatedPRI_1 == None) return ""; - - switch( Switch ) - { - case 0: // Cover FC - return RelatedPRI_1.PlayerName @ default.CoveredMsg; - case 1: // Seal base - return RelatedPRI_1.PlayerName @ default.SealMsg; - case 4: // Ultra cover - return RelatedPRI_1.PlayerName @ default.UltraCoverMsg; - case 5: // Cover spree - return RelatedPRI_1.PlayerName @ default.CoverSpreeMsg; - case 7: // Saved by ... - return default.SavedMsg @ RelatedPRI_1.PlayerName $ "!"; - case 10: // Spawnkilling - return RelatedPRI_1.PlayerName @ default.SpawnKillMsg; - case 11: // Denied - return default.DeniedMsg @ RelatedPRI_1.PlayerName; - - case 0 + 64: - return default.YouCoveredMsg; - case 1 + 64: - return default.YouSealMsg; - case 4 + 64: - return default.YouUltraCoverMsg; - case 5 + 64: - return default.YouCoverSpreeMsg; - case 7 + 64: - return default.YouSavedMsg; - case 11 + 64: - return default.YouDeniedMsg; - } - return ""; -} - -static simulated function ClientReceive( PlayerPawn P, optional int Switch, optional PlayerReplicationInfo RelatedPRI_1, optional PlayerReplicationInfo RelatedPRI_2, optional Object OptionalObject ) -{ - super.ClientReceive( P, Switch, RelatedPRI_1, RelatedPRI_2, OptionalObject ); - - switch( Switch ) - { - - case 5: - // Cover spree - guitarsound for player, spreesound for all - if( RelatedPRI_1 == P.PlayerReplicationInfo ) - { - P.ClientPlaySound( sound'CaptureSound', , true ); - } - else - { - P.PlaySound( sound'SpreeSound', , 4.0 ); - } - break; - } -} - -defaultproperties -{ - CoveredMsg="covered the flagcarrier!" - YouCoveredMsg="You covered the flagcarrier!" - CoverSpreeMsg="is on a cover spree!" - YouCoverSpreeMsg="You are on a cover spree!" - UltraCoverMsg="got a multi cover!" - YouUltraCoverMsg="You got a multi cover!" - SealMsg="is sealing off the base!" - YouSealMsg="You are sealing off the base!" - SavedMsg="Saved By" - YouSavedMsg="Close save!!" - DeniedMsg="Denied By" - YouDeniedMsg="Nide deny!!" - SpawnKillMsg="is a spawnkilling lamer!" - FontSize=1 - bIsSpecial=True - bIsUnique=True - bFadeMessage=True - DrawColor=(R=24,G=192,B=24) - YPos=196.000000 - bCenter=True -} +// Above all other messages. +class SmartCTFMessage extends LocalMessagePlus; + +var string CoveredMsg, YouCoveredMsg; +var string CoverSpreeMsg, YouCoverSpreeMsg; +var string UltraCoverMsg, YouUltraCoverMsg; +var string SealMsg, YouSealMsg; +var string SavedMsg, YouSavedMsg; +var string SpawnKillMsg; +var string DeniedMsg, YouDeniedMsg; + +static function float GetOffset( int Switch, float YL, float ClipY ) +{ + return ( default.YPos / 768.0 ) * ClipY - 3 * YL; +} + +static function string GetString( optional int Switch, optional PlayerReplicationInfo RelatedPRI_1, optional PlayerReplicationInfo RelatedPRI_2, optional Object OptionalObject ) +{ + if (RelatedPRI_1 == None) return ""; + + switch( Switch ) + { + case 0: // Cover FC + return RelatedPRI_1.PlayerName @ default.CoveredMsg; + case 1: // Seal base + return RelatedPRI_1.PlayerName @ default.SealMsg; + case 4: // Ultra cover + return RelatedPRI_1.PlayerName @ default.UltraCoverMsg; + case 5: // Cover spree + return RelatedPRI_1.PlayerName @ default.CoverSpreeMsg; + case 7: // Saved by ... + return default.SavedMsg @ RelatedPRI_1.PlayerName $ "!"; + case 10: // Spawnkilling + return RelatedPRI_1.PlayerName @ default.SpawnKillMsg; + case 11: // Denied + return default.DeniedMsg @ RelatedPRI_1.PlayerName; + + case 0 + 64: + return default.YouCoveredMsg; + case 1 + 64: + return default.YouSealMsg; + case 4 + 64: + return default.YouUltraCoverMsg; + case 5 + 64: + return default.YouCoverSpreeMsg; + case 7 + 64: + return default.YouSavedMsg; + case 11 + 64: + return default.YouDeniedMsg; + } + return ""; +} + +static simulated function ClientReceive( PlayerPawn P, optional int Switch, optional PlayerReplicationInfo RelatedPRI_1, optional PlayerReplicationInfo RelatedPRI_2, optional Object OptionalObject ) +{ + super.ClientReceive( P, Switch, RelatedPRI_1, RelatedPRI_2, OptionalObject ); + + switch( Switch ) + { + + case 5: + // Cover spree - guitarsound for player, spreesound for all + if( RelatedPRI_1 == P.PlayerReplicationInfo ) + { + P.ClientPlaySound( sound'CaptureSound', , true ); + } + else + { + P.PlaySound( sound'SpreeSound', , 4.0 ); + } + break; + } +} + +defaultproperties +{ + CoveredMsg="covered the flagcarrier!" + YouCoveredMsg="You covered the flagcarrier!" + CoverSpreeMsg="is on a cover spree!" + YouCoverSpreeMsg="You are on a cover spree!" + UltraCoverMsg="got a multi cover!" + YouUltraCoverMsg="You got a multi cover!" + SealMsg="is sealing off the base!" + YouSealMsg="You are sealing off the base!" + SavedMsg="Saved By" + YouSavedMsg="Close save!!" + DeniedMsg="Denied By" + YouDeniedMsg="Nide deny!!" + SpawnKillMsg="is a spawnkilling lamer!" + FontSize=1 + bIsSpecial=True + bIsUnique=True + bFadeMessage=True + DrawColor=(R=24,G=192,B=24) + YPos=196.000000 + bCenter=True +} diff --git a/Sources/Classes/SmartCTFPlayerReplicationInfo.uc b/Classes/SmartCTFPlayerReplicationInfo.UC similarity index 95% rename from Sources/Classes/SmartCTFPlayerReplicationInfo.uc rename to Classes/SmartCTFPlayerReplicationInfo.UC index 1576396..5b58cb1 100644 --- a/Sources/Classes/SmartCTFPlayerReplicationInfo.uc +++ b/Classes/SmartCTFPlayerReplicationInfo.UC @@ -1,192 +1,192 @@ -class SmartCTFPlayerReplicationInfo expands ReplicationInfo; - -// Replicated -var int Captures, Assists, Grabs, Covers, Seals, FlagKills, DefKills; -var int Frags, HeadShots, ShieldBelts, Amps; - -var string CountryPrefix; // for IpToCountry - -// Server side -var float LastKillTime; -var int MultiLevel; -var int FragSpree, CoverSpree, SealSpree, SpawnKillSpree; -var float SpawnTime; -var bool bHadFirstSpawn; - -// Client side -var bool bViewingStats; -var bool bEndStats; -var float IndicatorStartShow; -var byte IndicatorVisibility; - -var Actor IpToCountry; -var bool bIpToCountry; - -replication -{ - // Stats - reliable if( Role == ROLE_Authority ) - Captures, Assists, Grabs, Covers, Seals, FlagKills, DefKills, - Frags, HeadShots, ShieldBelts, Amps, CountryPrefix; - - // Toggle stats functions - reliable if( Role == ROLE_Authority ) - ToggleStats, ShowStats; -} - -function PostBeginPlay() -{ - - super.PostBeginPlay(); - - SetTimer( 0.5, True ); -} - -function Timer() -{ - local string temp; - local PlayerPawn P; - if( Owner == None ) - { - SetTimer( 0.0, False ); - Destroy(); - return; - } - if(bIpToCountry) - { - if(CountryPrefix == "") - { - if(Owner.Owner.IsA('PlayerPawn')) - { - P=PlayerPawn(Owner.Owner); - if(NetConnection(P.Player) != None) - { - temp=P.GetPlayerNetworkAddress(); - temp=Left(temp, InStr(temp, ":")); - temp=IpToCountry.GetItemName(temp); - if(temp == "!Disabled") /* after this return, iptocountry won't resolve anything anyway */ - bIpToCountry=False; - else if(Left(temp, 1) != "!") /* good response */ - { - CountryPrefix=SelElem(temp, 5); - if(CountryPrefix=="") /* the country is probably unknown(maybe LAN), so as the prefix */ - bIpToCountry=False; - } - } - else - bIpToCountry=False; - } - else - bIpToCountry=False; - } - else - bIpToCountry=False; - } -} - -static final function string SelElem(string Str, int Elem) -{ - local int pos; - while(Elem-->1) - Str=Mid(Str, InStr(Str,":")+1); - pos=InStr(Str, ":"); - if(pos != -1) - Str=Left(Str, pos); - return Str; -} - -// Called on the server, executed on the client -simulated function ToggleStats() -{ - local PlayerPawn P; - - if( Owner == None ) return; - P = PlayerPawn( Owner.Owner ); - if( P == None ) return; - - if( P.Scoring != None && !P.Scoring.IsA( 'SmartCTFScoreBoard' ) ) - { - P.ClientMessage( "Problem loading the SmartCTF ScoreBoard..." ); - } - else - { - bViewingStats = !bViewingStats; - IndicatorStartShow = Level.TimeSeconds; - IndicatorVisibility = 255; - P.bShowScores = True; - } -} - -// Called on the client -simulated function ShowStats(optional bool bHide) -{ - local PlayerPawn P; - - if( Owner == None ) return; - P = PlayerPawn( Owner.Owner ); - if( P == None ) return; - - if( P.Scoring != None && !P.Scoring.IsA( 'SmartCTFScoreBoard' ) ) - { - P.ClientMessage( "Problem loading the SmartCTF ScoreBoard..." ); - } - else - { - bViewingStats = True; - if(!bHide) P.bShowScores = True; - } -} - -function ClearStats() -{ - Captures = 0; - Assists = 0; - Grabs = 0; - Covers = 0; - Seals = 0; - DefKills = 0; - FlagKills = 0; - Frags = 0; - HeadShots = 0; - ShieldBelts = 0; - Amps = 0; - - FragSpree = 0; - CoverSpree = 0; - SealSpree = 0; - SpawnKillSpree = 0; - SpawnTime = 0; - - LastKillTime = 0; - MultiLevel = 0; -} - -defaultproperties -{ - Captures=0 - Assists=0 - Grabs=0 - Covers=0 - Seals=0 - FlagKills=0 - DefKills=0 - Frags=0 - HeadShots=0 - ShieldBelts=0 - Amps=0 - CountryPrefix="" - LastKillTime=0.000000 - MultiLevel=0 - FragSpree=0 - CoverSpree=0 - SealSpree=0 - SpawnKillSpree=0 - SpawnTime=0.000000 - bHadFirstSpawn=False - bViewingStats=False - bEndStats=False - IndicatorStartShow=0.000000 - IndicatorVisibility=0 - ipToCountry=None - bIpToCountry=False -} +class SmartCTFPlayerReplicationInfo expands ReplicationInfo; + +// Replicated +var int Captures, Assists, Grabs, Covers, Seals, FlagKills, DefKills; +var int Frags, HeadShots, ShieldBelts, Amps; + +var string CountryPrefix; // for IpToCountry + +// Server side +var float LastKillTime; +var int MultiLevel; +var int FragSpree, CoverSpree, SealSpree, SpawnKillSpree; +var float SpawnTime; +var bool bHadFirstSpawn; + +// Client side +var bool bViewingStats; +var bool bEndStats; +var float IndicatorStartShow; +var byte IndicatorVisibility; + +var Actor IpToCountry; +var bool bIpToCountry; + +replication +{ + // Stats + reliable if( Role == ROLE_Authority ) + Captures, Assists, Grabs, Covers, Seals, FlagKills, DefKills, + Frags, HeadShots, ShieldBelts, Amps, CountryPrefix; + + // Toggle stats functions + reliable if( Role == ROLE_Authority ) + ToggleStats, ShowStats; +} + +function PostBeginPlay() +{ + + super.PostBeginPlay(); + + SetTimer( 0.5, True ); +} + +function Timer() +{ + local string temp; + local PlayerPawn P; + if( Owner == None ) + { + SetTimer( 0.0, False ); + Destroy(); + return; + } + if(bIpToCountry) + { + if(CountryPrefix == "") + { + if(Owner.Owner.IsA('PlayerPawn')) + { + P=PlayerPawn(Owner.Owner); + if(NetConnection(P.Player) != None) + { + temp=P.GetPlayerNetworkAddress(); + temp=Left(temp, InStr(temp, ":")); + temp=IpToCountry.GetItemName(temp); + if(temp == "!Disabled") /* after this return, iptocountry won't resolve anything anyway */ + bIpToCountry=False; + else if(Left(temp, 1) != "!") /* good response */ + { + CountryPrefix=SelElem(temp, 5); + if(CountryPrefix=="") /* the country is probably unknown(maybe LAN), so as the prefix */ + bIpToCountry=False; + } + } + else + bIpToCountry=False; + } + else + bIpToCountry=False; + } + else + bIpToCountry=False; + } +} + +static final function string SelElem(string Str, int Elem) +{ + local int pos; + while(Elem-->1) + Str=Mid(Str, InStr(Str,":")+1); + pos=InStr(Str, ":"); + if(pos != -1) + Str=Left(Str, pos); + return Str; +} + +// Called on the server, executed on the client +simulated function ToggleStats() +{ + local PlayerPawn P; + + if( Owner == None ) return; + P = PlayerPawn( Owner.Owner ); + if( P == None ) return; + + if( P.Scoring != None && !P.Scoring.IsA( 'SmartCTFScoreBoard' ) ) + { + P.ClientMessage( "Problem loading the SmartCTF ScoreBoard..." ); + } + else + { + bViewingStats = !bViewingStats; + IndicatorStartShow = Level.TimeSeconds; + IndicatorVisibility = 255; + P.bShowScores = True; + } +} + +// Called on the client +simulated function ShowStats(optional bool bHide) +{ + local PlayerPawn P; + + if( Owner == None ) return; + P = PlayerPawn( Owner.Owner ); + if( P == None ) return; + + if( P.Scoring != None && !P.Scoring.IsA( 'SmartCTFScoreBoard' ) ) + { + P.ClientMessage( "Problem loading the SmartCTF ScoreBoard..." ); + } + else + { + bViewingStats = True; + if(!bHide) P.bShowScores = True; + } +} + +function ClearStats() +{ + Captures = 0; + Assists = 0; + Grabs = 0; + Covers = 0; + Seals = 0; + DefKills = 0; + FlagKills = 0; + Frags = 0; + HeadShots = 0; + ShieldBelts = 0; + Amps = 0; + + FragSpree = 0; + CoverSpree = 0; + SealSpree = 0; + SpawnKillSpree = 0; + SpawnTime = 0; + + LastKillTime = 0; + MultiLevel = 0; +} + +defaultproperties +{ + Captures=0 + Assists=0 + Grabs=0 + Covers=0 + Seals=0 + FlagKills=0 + DefKills=0 + Frags=0 + HeadShots=0 + ShieldBelts=0 + Amps=0 + CountryPrefix="" + LastKillTime=0.000000 + MultiLevel=0 + FragSpree=0 + CoverSpree=0 + SealSpree=0 + SpawnKillSpree=0 + SpawnTime=0.000000 + bHadFirstSpawn=False + bViewingStats=False + bEndStats=False + IndicatorStartShow=0.000000 + IndicatorVisibility=0 + ipToCountry=None + bIpToCountry=False +} diff --git a/Sources/Classes/SmartCTFScoreBoard.uc b/Classes/SmartCTFScoreBoard.UC similarity index 96% rename from Sources/Classes/SmartCTFScoreBoard.uc rename to Classes/SmartCTFScoreBoard.UC index 9398eb6..cc30ae4 100644 --- a/Sources/Classes/SmartCTFScoreBoard.uc +++ b/Classes/SmartCTFScoreBoard.UC @@ -1,1094 +1,1094 @@ -class SmartCTFScoreBoard extends UnrealCTFScoreBoard; - -#exec texture IMPORT NAME=faceless File=Textures\faceless.pcx GROUP=SmartCTF - -var ScoreBoard NormalScoreBoard; -var SmartCTFGameReplicationInfo SCTFGame; -var SmartCTFPlayerReplicationInfo OwnerStats; - -var int TryCount; -var PlayerPawn PlayerOwner; - -var string PtsText, FragsText, SepText, MoreText, HeaderText, HeaderText2; -var int LastSortTime, MaxMeterWidth; -var byte ColorChangeSpeed, RowColState; -var Color White, Gray, DarkGray, Yellow, RedTeamColor, BlueTeamColor, RedHeaderColor, BlueHeaderColor, StatsColor, FooterColor, HeaderColor, TinyInfoColor, HeaderTinyInfoColor; -var float StatsTextWidth, StatHeight, MeterHeight, NameHeight, ColumnHeight, StatBlockHeight; -var float RedStartX, BlueStartX, ColumnWidth, StatWidth, StatsHorSpacing, ShadingSpacingX, HeaderShadingSpacingY, ColumnShadingSpacingY; -var float StartY, StatLineHeight, StatBlockSpacing, StatIndent; -var TournamentGameReplicationInfo pTGRI; -var PlayerReplicationInfo pPRI; -var Font StatFont, CapFont, FooterFont, GameEndedFont, PlayerNameFont, FragsFont, TinyInfoFont; -var Font PtsFont22, PtsFont20, PtsFont18, PtsFont16, PtsFont14, PtsFont12; - -var int MaxCaps, MaxAssists, MaxGrabs, MaxCovers, MaxSeals, MaxDefKills, MaxFlagKills, MaxFrags, MaxDeaths; -var int TotShieldBelts, TotAmps; - -var bool bSealsOrDefs; -var bool bStarted; -var bool bEndHandled; - -struct FlagData -{ - var string Prefix; - var texture Tex; -}; -var FlagData FD[32]; // there can be max 32 so max 32 different flags -var int saveindex; // new loaded flags will be saved in FD[index] - -function int GetFlagIndex(string Prefix) -{ - local int i; - for(i=0;i<32;i++) - { - if(FD[i].Prefix == Prefix) - { - return i; - } - } - FD[saveindex].Prefix=Prefix; - FD[saveindex].Tex=texture(DynamicLoadObject(SCTFGame.CountryFlagsPackage$"."$Prefix, class'Texture')); - i=saveindex; - saveindex = (saveindex+1) % 256; - return i; -} - -function PostBeginPlay() -{ - super.PostBeginPlay(); - - PlayerOwner = PlayerPawn( Owner ); - pTGRI = TournamentGameReplicationInfo (PlayerOwner.GameReplicationInfo); - pPRI = PlayerOwner.PlayerReplicationInfo; - LastSortTime = -100; - - // Preload - PtsFont22 = Font( DynamicLoadObject( "LadderFonts.UTLadder22", class'Font' ) ); - PtsFont20 = Font( DynamicLoadObject( "LadderFonts.UTLadder20", class'Font' ) ); - PtsFont18 = Font( DynamicLoadObject( "LadderFonts.UTLadder18", class'Font' ) ); - PtsFont16 = Font( DynamicLoadObject( "LadderFonts.UTLadder16", class'Font' ) ); - PtsFont14 = Font( DynamicLoadObject( "LadderFonts.UTLadder14", class'Font' ) ); - PtsFont12 = Font( DynamicLoadObject( "LadderFonts.UTLadder12", class'Font' ) ); - - SpawnNormalScoreBoard(); - if( NormalScoreBoard == None ) - { - SetTimer( 1.0 , True ); - } - else - { - bStarted = True; - SetTimer( 3.0, true); - } -} - -// Try to spawn a local instance of the original scoreboard class if it doesn't exist already. -function SpawnNormalScoreBoard() -{ - if( SCTFGame == None ) - { - ForEach AllActors( class'SmartCTFGameReplicationInfo', SCTFGame ) break; - } - if( SCTFGame != None ) - { - OwnerStats = SCTFGame.GetStats( PlayerOwner ); - } - - if( SCTFGame != None && SCTFGame.NormalScoreBoardClass == None ) - { - Log( "Unable to identify original ScoreBoard type. Retrying in 1 second." , 'SmartCTF' ); - return; - } - - if( SCTFGame != None && SCTFGame.NormalScoreBoardClass == self.Class ) - { - NormalScoreBoard = Spawn( class'UnrealCTFScoreBoard', PlayerOwner ); - Log( "Cannot use itself. Using the default CTF ScoreBoard instead." , 'SmartCTF' ); - return; - } - - if( SCTFGame != None && SCTFGame.NormalScoreBoardClass != None ) - { - NormalScoreBoard = Spawn( SCTFGame.NormalScoreBoardClass, PlayerOwner ); - Log( "Determined and spawned original scoreboard as" @ NormalScoreBoard, 'SmartCTF' ); - } -} - -// In the case of the 'normal scoreboard' not being replicated properly, try every second to see if it has. -function Timer() -{ - if(!bStarted) - { - if( NormalScoreBoard == None ) - { - TryCount++; - SpawnNormalScoreBoard(); - } - - if( NormalScoreBoard != None ) - { - bStarted = True; - SetTimer( 3.0, True ); - } - else if( TryCount > 3 ) - { - Log( "Given up. Using the default CTF ScoreBoard instead." , 'SmartCTF' ); - - if( NormalScoreBoard == None ) - { - NormalScoreBoard = Spawn( class'UnrealCTFScoreBoard', PlayerOwner ); - Log( "Spawned as" @ NormalScoreBoard, 'SmartCTF' ); - } - bStarted = True; - SetTimer( 3.0, True ); - } - } - else - { - bSealsOrDefs = !bSealsOrDefs; - } -} - -function ShowScores( Canvas C ) -{ - if( SCTFGame == None || OwnerStats == None ) - { - if( NormalScoreBoard != None ) - { - NormalScoreBoard.ShowScores( C ); - } - else - { - PlayerOwner.bShowScores = False; - } - return; - } - - if(OwnerStats.bEndStats && !bEndHandled) - { - bEndHandled = True; - bSealsOrDefs = True; - SetTimer(10, true); - } - - if( OwnerStats.bViewingStats ) - { - SmartCTFShowScores( C ); - } - else - { - if( NormalScoreBoard == None ) - { - SmartCTFShowScores( C ); - } - else - { - NormalScoreBoard.ShowScores( C ); - } - } - - if( OwnerStats.IndicatorVisibility > 0 ) - { - ShowIndicator( C ); - } -} - -function ShowIndicator( Canvas C ) -{ - local float BlockLen, LineHeight; - - C.DrawColor.R = OwnerStats.IndicatorVisibility; - C.DrawColor.G = OwnerStats.IndicatorVisibility; - C.DrawColor.B = OwnerStats.IndicatorVisibility; - C.Style = ERenderStyle.STY_Translucent; - C.Font = C.SmallFont; - C.StrLen( "Scoreboard:", BlockLen, LineHeight ); - C.SetPos( C.ClipX - BlockLen - 16, 16 ); - C.DrawText( "Scoreboard:" ); - C.SetPos( C.ClipX - BlockLen, 16 + LineHeight ); - C.DrawText( "Default" ); - C.SetPos( C.ClipX - BlockLen, 16 + 2 * LineHeight ); - C.DrawText( "SmartCTF" ); - if( OwnerStats.bViewingStats ) - { - C.SetPos( C.ClipX - BlockLen - 16, 16 + 2 * LineHeight ); - } - else - { - C.SetPos( C.ClipX - BlockLen - 16, 16 + LineHeight ); - } - C.DrawIcon( texture'UWindow.MenuTick', 1 ); - C.Style = ERenderStyle.STY_Normal; - - if( Level.TimeSeconds - OwnerStats.IndicatorStartShow > 2 ) - { - OwnerStats.IndicatorVisibility = 0; - } -} - -function SmartCTFShowScores( Canvas C ) - { - local int ID, i, j, Time, AvgPing, AvgPL, TotSB, TotAmp; - local float Eff; - local int RedY, BlueY, X, Y; - local float Nil, DummyX, DummyY, SizeX, SizeY, Buffer, Size; - local byte LabelDrawn[2], Rendered[2]; - local Color TeamColor, TempColor; - local string TempStr; - local SmartCTFPlayerReplicationInfo PlayerStats, PlayerStats2; - local int FlagShift; /* shifting elements to fit a flag */ - local Texture TmpTexture; - - if( Level.TimeSeconds - LastSortTime > 0.5 ) - { - SortScores( 32 ); - RecountNumbers(); - InitStatBoardConstPos( C ); - CompressStatBoard( C ); - LastSortTime = Level.TimeSeconds; - } - - Y = int( StartY ); - RedY = Y; - BlueY = Y; - - C.Style = ERenderStyle.STY_Normal; - - // FOR EACH PLAYER DRAW INFO - for( i = 0; i < 32; i++ ) - { - if( Ordered[i] == None ) break; - PlayerStats = SCTFGame.GetStatsByPRI( Ordered[i] ); - if( PlayerStats == None ) continue; - - // Get the ID of the ith player - ID = Ordered[i].PlayerID; - - // set the pos depending on Team - if( Ordered[i].Team == 0 ) - { - X = RedStartX; - Y = RedY; - TeamColor = RedTeamColor; - } - else - { - X = BlueStartX; - Y = BlueY; - TeamColor = BlueTeamColor; - } - C.DrawColor = TeamColor; - - if( LabelDrawn[Ordered[i].Team] == 0 ) - { - // DRAW THE Team SCORES with the cool Flag icons (masked because of black borders) - - C.bNoSmooth = False; - C.Font = PlayerNameFont; - C.Style = ERenderStyle.STY_Translucent; - if( Ordered[i].Team == 0 ) C.DrawColor = RedHeaderColor; - else C.DrawColor = BlueHeaderColor; - C.StrLen( PtsText, SizeX, SizeY ); - C.Style = ERenderStyle.STY_Modulated; - C.SetPos( X - ShadingSpacingX, Y - HeaderShadingSpacingY ); - C.DrawRect( texture'shade', ColumnWidth + ( ShadingSpacingX * 2 ) , SizeY + ( HeaderShadingSpacingY * 2 ) ); - C.Style = ERenderStyle.STY_Translucent; - C.SetPos( X - ShadingSpacingX, Y - HeaderShadingSpacingY ); - if( Ordered[i].Team == 0 ) C.DrawPattern( texture'redskin2', ColumnWidth + ( ShadingSpacingX * 2 ) , SizeY + ( HeaderShadingSpacingY * 2 ) , 1 ); - else C.DrawPattern( texture'blueskin2', ColumnWidth + ( ShadingSpacingX * 2 ) , SizeY + ( HeaderShadingSpacingY * 2 ) , 1 ); - - C.Style = ERenderStyle.STY_Modulated; - C.SetPos( X - ShadingSpacingX, Y + SizeY + HeaderShadingSpacingY ); - C.DrawRect( texture'shade', ColumnWidth + ( ShadingSpacingX * 2 ) , ColumnHeight + ( ColumnShadingSpacingY * 2 ) ); - - C.Style = ERenderStyle.STY_Translucent; - C.DrawColor = TeamColor; - C.SetPos( X, Y - ( ( 32 - SizeY ) / 2 ) ); // Y - 4 - if( Ordered[i].Team == 0 ) C.DrawIcon( texture'I_TeamR', 0.5 ); - else C.DrawIcon( texture'I_TeamB', 0.5 ); - - C.Font = CapFont; - C.StrLen( int( pTGRI.Teams[Ordered[i].Team].Score ), DummyX, DummyY ); - C.Style = ERenderStyle.STY_Normal; - C.SetPos( X + StatIndent, Y - ( ( DummyY - SizeY ) / 2 ) ); - C.DrawText( int( pTGRI.Teams[Ordered[i].Team].Score ) ); - - //Draw the Frags/Pts text - C.Font = PlayerNameFont; - C.SetPos( X + ColumnWidth - SizeX, Y ); - C.DrawText( PtsText ); - C.Font = FragsFont; - C.StrLen( FragsText $ SepText, Buffer, Nil ); - C.SetPos( X + ColumnWidth - SizeX - Buffer, Y ); - C.DrawText( FragsText $ SepText ); - - C.DrawColor = HeaderTinyInfoColor; - C.Font = TinyInfoFont; - C.StrLen( "TEST", Nil, DummyY ); - C.SetPos( X + StatIndent + DummyX + 2 * StatsHorSpacing, Y + ( SizeY - DummyY * 2 ) / 2 ); - Time = Max( 1, Level.TimeSeconds / 60 ); - AvgPing = 0; - AvgPL = 0; - TotSB = 0; - TotAmp = 0; - for( j = 0; j < 32; j++ ) - { - if( Ordered[j] == None ) break; - if( Ordered[j].Team == Ordered[i].Team ) - { - PlayerStats2 = SCTFGame.GetStatsByPRI( Ordered[j] ); - if( PlayerStats2 == None ) continue; - AvgPing += Ordered[j].Ping; - AvgPL += Ordered[j].PacketLoss; - TotSB += PlayerStats2.ShieldBelts; - TotAmp += PlayerStats2.Amps; - } - } - if( pTGRI.Teams[Ordered[i].Team].Size != 0 ) - { - AvgPing = AvgPing / pTGRI.Teams[Ordered[i].Team].Size; - AvgPL = AvgPL / pTGRI.Teams[Ordered[i].Team].Size; - } - if( TotShieldBelts == 0 ) TotSB = 0; - else TotSB = Clamp( float( TotSB ) / float( TotShieldBelts ) * 100, 0, 100 ); - if( TotAmps == 0 ) TotAmp = 0; - else TotAmp = Clamp( float( TotAmp ) / float( TotAmps ) * 100, 0, 100 ); - TempStr = "PING:" $ AvgPing $ " PL:" $ AvgPL $ "%"; - C.DrawText( TempStr ); - C.SetPos( X + StatIndent + DummyX + 2 * StatsHorSpacing, Y + ( SizeY - DummyY * 2 ) / 2 + DummyY ); - TempStr = "TM:" $ Time; - if( TotSB != 0 ) TempStr = TempStr @ "SB:" $ TotSB $ "%"; - if( TotAmp != 0 ) TempStr = TempStr @ "AM:" $ TotAmp $ "%"; - C.DrawText( TempStr ); - - C.bNoSmooth = True; - - Y += SizeY + HeaderShadingSpacingY + ColumnShadingSpacingY; - LabelDrawn[Ordered[i].Team] = 1; - } - - C.Font = FooterFont; - C.StrLen( "Test", Nil, DummyY ); - if( LabelDrawn[Ordered[i].Team] != 2 && ( Y + NameHeight + StatBlockHeight + StatBlockSpacing > C.ClipY - DummyY * 5 ) ) - { - - C.DrawColor = TeamColor; - C.StrLen( MoreText , Size, DummyY ); - if( Ordered[i].Team == 1 ) C.SetPos( X + ColumnWidth - Size, C.ClipY - DummyY * 5 ); - else C.SetPos( X, C.ClipY - DummyY * 5 ); - C.DrawText( "[" @ pTGRI.Teams[Ordered[i].Team].Size - Rendered[Ordered[i].Team] @ MoreText @ "]" ); - LabelDrawn[Ordered[i].Team] = 2; // "More" label also drawn - } - - else if( LabelDrawn[Ordered[i].Team] != 2 ) - { - - // Draw the face - if( Ordered[i].HasFlag == None ) - { - C.bNoSmooth = False; - C.DrawColor = White; - C.Style = ERenderStyle.STY_Translucent; - C.SetPos( X, Y ); - if( SCTFGame.bStatsDrawFaces && Ordered[i].TalkTexture != None ) C.DrawIcon( Ordered[i].TalkTexture, 0.5 ); - else C.DrawIcon( texture'faceless', 0.5 ); - C.SetPos( X, Y ); - C.DrawColor = DarkGray; - C.DrawIcon( texture'IconSelection', 1 ); - C.Style = ERenderStyle.STY_Normal; - C.bNoSmooth = True; - } - - // Draw the player name - C.SetPos( X + StatIndent, Y ); - - C.Font = PlayerNameFont; - if( Ordered[i].bAdmin ) C.DrawColor = White; - else if( Ordered[i].PlayerID == pPRI.PlayerID ) C.DrawColor = Yellow; - else C.DrawColor = TeamColor; - TempColor = C.DrawColor; - C.DrawText( Ordered[i].PlayerName ); - C.StrLen( Ordered[i].PlayerName, Size, Buffer ); - - C.DrawColor = TinyInfoColor; - C.Font = TinyInfoFont; - C.StrLen( "TEST", Buffer, DummyY ); - - // Draw Time, Eff, HS, SB, Amp - C.SetPos( X + StatIndent + Size + StatsHorSpacing, Y + ( NameHeight - DummyY * 2 ) / 2 ); - TempStr = ""; - if( PlayerStats.HeadShots != 0 ) TempStr = TempStr $ "HS:" $ PlayerStats.HeadShots; - if( PlayerStats.ShieldBelts != 0 ) TempStr = TempStr @ "SB:" $ PlayerStats.ShieldBelts; - if( PlayerStats.Amps != 0 ) TempStr = TempStr @ "AM:" $ PlayerStats.Amps; - if( Left( TempStr, 1 ) == " " ) TempStr = Mid( TempStr, 1 ); - C.DrawText( TempStr ); - Time = Max( 1, ( Level.TimeSeconds + pPRI.StartTime - Ordered[i].StartTime ) / 60 ); - if( PlayerStats.Frags + Ordered[i].Deaths == 0 ) Eff = 0; - else Eff = ( PlayerStats.Frags / ( PlayerStats.Frags + Ordered[i].Deaths ) ) * 100; - C.SetPos( X + StatIndent + Size + StatsHorSpacing, Y + ( NameHeight - DummyY * 2 ) / 2 + DummyY ); - C.DrawText( "TM:" $ Time $ " EFF:" $ Clamp( int( Eff ), 0, 100 ) $ "%" ); - - // Draw the country flag - if(PlayerStats.CountryPrefix != "") - { - C.SetPos( X, Y + StatIndent - 16); - C.bNoSmooth = False; - C.DrawColor = White; - //C.DrawIcon(FD[GetFlagIndex(PlayerStats.CountryPrefix)].Tex, 1.0); - TmpTexture = FD[GetFlagIndex(PlayerStats.CountryPrefix)].Tex; - C.DrawIcon(TmpTexture, 32 / float(TmpTexture.VSize)); - FlagShift=12; - C.bNoSmooth = True; - } - else - { - FlagShift=0; - } - // Draw Bot or Ping/PL - C.SetPos( X, Y + StatIndent + FlagShift); - if( Ordered[i].bIsABot ) - { - C.DrawText( "BOT" ); - if( Ordered[i].Team == pPRI.Team ) - { - C.SetPos( X, Y + StatIndent + DummyY); - C.DrawText( Left( string( BotReplicationInfo( Ordered[i] ).RealOrders ) , 3 ) ); - } - } - else - { - C.DrawColor = HeaderTinyInfoColor; - TempStr = "PI:" $ Ordered[i].Ping; - if( Len( TempStr ) > 5 ) TempStr = "P:" $ Ordered[i].Ping; - if( Len( TempStr ) > 5 ) TempStr = string( Ordered[i].Ping ); - C.DrawText( TempStr ); - C.SetPos( X, Y + StatIndent + DummyY + FlagShift); - TempStr = "PL:" $ Ordered[i].PacketLoss $ "%"; - if( Len( TempStr ) > 5 ) TempStr = "L:" $ Ordered[i].PacketLoss $ "%"; - if( Len( TempStr ) > 5 ) TempStr = "L:" $ Ordered[i].PacketLoss; - if( Len( TempStr ) > 5 ) TempStr = Ordered[i].PacketLoss $ "%"; - C.DrawText( TempStr ); - } - - // Draw the Flag if he has Flag - if( Ordered[i].HasFlag != None ) - { - C.DrawColor = White; - C.SetPos( X, Y ); - if( Ordered[i].HasFlag.IsA( 'GreenFlag' ) ) C.DrawIcon( texture'GreenFlag', 1 ); - else if( Ordered[i].HasFlag.IsA( 'YellowFlag' ) ) C.DrawIcon( texture'YellowFlag', 1 ); - else if( Ordered[i].Team == 0 ) C.DrawIcon( texture'BlueFlag', 1 ); - else C.DrawIcon( texture'RedFlag', 1 ); - } // End if he has Flag - - C.Font = PlayerNameFont; - C.DrawColor = TempColor; - - // Draw Frag/Score - C.StrLen( int( Ordered[i].Score ), Size, DummyY ); - C.SetPos( X + ColumnWidth - Size, Y ); - C.DrawText( int( Ordered[i].Score ) ); - - C.Font = FragsFont; - C.StrLen( PlayerStats.Frags $ SepText, Buffer, SizeY ); - C.SetPos( X + ColumnWidth - Size - Buffer, Y ); - C.DrawText( PlayerStats.Frags $ SepText ); - - Y += NameHeight; - - // Set the Font for the stat drawing - C.Font = StatFont; - - if( RowColState == 1 ) - { - DrawStatType( C, X, Y, 1, 1, "Caps: ", PlayerStats.Captures, MaxCaps ); - DrawStatType( C, X, Y, 1, 2, "Assists: ", PlayerStats.Assists, MaxAssists ); - DrawStatType( C, X, Y, 1, 3, "Grabs: ", PlayerStats.Grabs, MaxGrabs ); - if(SCTFGame.bExtraStats) - { - if( bSealsOrDefs) { - DrawStatType( C, X, Y, 2, 2, "DefKills: ", PlayerStats.DefKills, MaxDefKills ); - DrawStatType( C, X, Y, 2, 1, "Covers: ", PlayerStats.Covers, MaxCovers ); - } - else { - DrawStatType( C, X, Y, 2, 2, "Seals: ", PlayerStats.Seals, MaxSeals ); - DrawStatType( C, X, Y, 2, 1, "Deaths: ", Ordered[i].Deaths, MaxDeaths ); - } - } - else - { - DrawStatType( C, X, Y, 2, 1, "Covers: ", PlayerStats.Covers, MaxCovers ); - if( MaxSeals > 0 ) DrawStatType( C, X, Y, 2, 2, "Seals: ", PlayerStats.Seals, MaxSeals ); - else DrawStatType( C, X, Y, 2, 2, "Deaths: ", Ordered[i].Deaths, MaxDeaths ); - } - DrawStatType( C, X, Y, 2, 3, "FlagKls: ", PlayerStats.FlagKills, MaxFlagKills ); - } - else - { - DrawStatType( C, X, Y, 1, 1, "Caps: ", PlayerStats.Captures, MaxCaps ); - DrawStatType( C, X, Y, 2, 1, "Grabs: ", PlayerStats.Grabs, MaxGrabs ); - - if(SCTFGame.bExtraStats) - { - if( bSealsOrDefs) { - DrawStatType( C, X, Y, 2, 2, "DefKills: ", PlayerStats.DefKills, MaxDefKills ); - DrawStatType( C, X, Y, 1, 2, "Covers: ", PlayerStats.Covers, MaxCovers ); - } - else { - DrawStatType( C, X, Y, 2, 2, "Seals: ", PlayerStats.Seals, MaxSeals ); - DrawStatType( C, X, Y, 1, 2, "Deaths: ", Ordered[i].Deaths, MaxDeaths ); - } - } - else - { - DrawStatType( C, X, Y, 1, 2, "Covers: ", PlayerStats.Covers, MaxCovers ); - if( MaxSeals > 0 ) DrawStatType( C, X, Y, 2, 2, "Seals: ", PlayerStats.Seals, MaxSeals ); - else DrawStatType( C, X, Y, 2, 2, "Deaths: ", Ordered[i].Deaths, MaxDeaths ); - } - DrawStatType( C, X, Y, 3, 1, "Assists: ", PlayerStats.Assists, MaxAssists ); - DrawStatType( C, X, Y, 3, 2, "FlagKls: ", PlayerStats.FlagKills, MaxFlagKills ); - } - - Y += StatBlockHeight + StatBlockSpacing; - } - - // Alter the RedY or BlueY and do next player - if( Ordered[i].Team == 0 ) RedY = Y; - else BlueY = Y; - Rendered[Ordered[i].Team]++; - - } //End of PRI for loop - -DrawHeader( C ); -DrawFooters( C ); -} - -function InitStatBoardConstPos( Canvas C ) -{ - local float Nil, LeftSpacingPercent, MidSpacingPercent, RightSpacingPercent; - - CapFont = Font'LEDFont2'; //Font( DynamicLoadObject( "UWindowFonts.UTFont40", class'Font' ) ); - FooterFont = MyFonts.GetSmallestFont( C.ClipX ); - GameEndedFont = MyFonts.GetHugeFont( C.ClipX ); - PlayerNameFont = MyFonts.GetBigFont( C.ClipX ); - TinyInfoFont = C.SmallFont; - - if( PlayerNameFont == PtsFont22 ) FragsFont = PtsFont18; - else if( PlayerNameFont == PtsFont20 ) FragsFont = PtsFont18; - else if( PlayerNameFont == PtsFont18 ) FragsFont = PtsFont14; - else if( PlayerNameFont == PtsFont16 ) FragsFont = PtsFont12; - else FragsFont = font'SmallFont'; - - C.Font = PlayerNameFont; - C.StrLen( "Player", Nil, NameHeight ); - - StartY = ( 120.0 / 1024.0 ) * C.ClipY; - ColorChangeSpeed = 100; // Influences how 'fast' the color changes from white to green. Higher = faster. - - LeftSpacingPercent = 0.075; - MidSpacingPercent = 0.15; - RightSpacingPercent = 0.075; - RedStartX = LeftSpacingPercent * C.ClipX; - ColumnWidth = ( ( 1 - LeftSpacingPercent - MidSpacingPercent - RightSpacingPercent ) / 2 * C.ClipX ); - BlueStartX = RedStartX + ColumnWidth + ( MidSpacingPercent * C.ClipX ); - ShadingSpacingX = ( 10.0 / 1024.0 ) * C.ClipX; - HeaderShadingSpacingY = ( 32 - NameHeight ) / 2 + ( ( 4.0 / 1024.0 ) * C.ClipX ); - ColumnShadingSpacingY = ( 10.0 / 1024.0 ) * C.ClipX; - - StatsHorSpacing = ( 5.0 / 1024.0 ) * C.ClipX; - StatIndent = ( 32 + StatsHorSpacing ); // For face + flag icons - - InitStatBoardDynamicPos( C ); -} - -function InitStatBoardDynamicPos( Canvas C , optional int Rows , optional int Cols , optional Font NewStatFont , optional float LineSpacing , optional float BlockSpacing ) -{ - if( Rows == 0 ) Rows = 3; - if( Cols == 0 ) Cols = 2; - if( LineSpacing == 0 ) LineSpacing = 0.9; - if( BlockSpacing == 0 ) BlockSpacing = 1; - - if( Rows == 2 && Cols == 3 ) RowColState = 1; - else RowColState = 0; - - StatWidth = ( ( ColumnWidth - StatIndent ) / Cols ) - ( StatsHorSpacing * ( Cols - 1 ) ); - - if( NewStatFont == None ) StatFont = MyFonts.GetSmallestFont( C.ClipX ); - else StatFont = NewStatFont; - C.Font = StatFont; - C.StrLen( "FlagKls: 00", StatsTextWidth, StatHeight ); - - MaxMeterWidth = StatWidth - StatsTextWidth - StatsHorSpacing; - StatLineHeight = StatHeight * LineSpacing; - MeterHeight = Max( 1, StatLineHeight * 0.3 ); - StatBlockSpacing = StatLineHeight * BlockSpacing; - - StatBlockHeight = Rows * StatLineHeight; - - if( pTGRI.Teams[0].Size > pTGRI.Teams[1].Size ) - ColumnHeight = pTGRI.Teams[0].Size * ( NameHeight + StatBlockHeight + StatBlockSpacing ) - StatBlockSpacing; - else - ColumnHeight = pTGRI.Teams[1].Size * ( NameHeight + StatBlockHeight + StatBlockSpacing ) - StatBlockSpacing; -} - -function CompressStatBoard( Canvas C , optional int Level ) -{ - local float EndY, Nil, DummyY; - - C.Font = FooterFont; - C.StrLen( "Test", Nil, DummyY ); - - EndY = StartY + ColumnHeight + ( ColumnShadingSpacingY * 2 ) + NameHeight + HeaderShadingSpacingY; - if( EndY > C.ClipY - DummyY * 5 ) - { - if( Level == 0 ) - { - InitStatBoardDynamicPos( C, , , , 0.8 ); - } - else if( Level == 1 ) - { - InitStatBoardDynamicPos( C, 2, 3 ); - } - else if( Level == 2 ) - { - InitStatBoardDynamicPos( C, 2, 3, Font( DynamicLoadObject( "UWindowFonts.Tahoma10", class'Font' ) ) , 1.0 , 1.0 ); - } - else - { - // We did all the compression we can do. Draw 'More' labels later. - // First find the columnheight for the amount of players that fit on it. - ColumnHeight = int( ( C.ClipY - ( EndY - ColumnHeight ) - DummyY * 5 + StatBlockSpacing ) / ( NameHeight + StatBlockHeight + StatBlockSpacing ) ) - * ( NameHeight + StatBlockHeight + StatBlockSpacing ) - StatBlockSpacing; - return; - } - // Did some compression, see if we need more. - CompressStatBoard( C , Level + 1 ); - } - // No compression at all or no more compression needed. - return; -} - -/* - * Draw a specific stat - * X, Y = Upper left corner of stats ( row,col: 1,1) -*/ -function DrawStatType( Canvas C, int X, int Y, int Row, int Col, string Label, int Count, int Total ) -{ - local float Size, DummyY; - local int ColorChange, M; - - X += StatIndent + ( ( StatWidth + StatsHorSpacing ) * ( Col - 1 ) ); - Y += ( StatLineHeight * ( Row - 1 ) ); - - C.DrawColor = StatsColor; - C.SetPos( X, Y ); - C.DrawText( Label ); - C.StrLen( Count, Size, DummyY ); - C.SetPos( X + StatsTextWidth - Size, Y ); - C.DrawText( Count ); //text - if( Count > 0 ) - { - ColorChange = ColorChangeSpeed * loge( Count ); - if( ColorChange > 255 ) ColorChange = 255; - C.DrawColor.R = StatsColor.R - ColorChange; - C.DrawColor.B = StatsColor.B - ColorChange; - } - M = GetMeterLength( Count, Total ); - C.SetPos( X + StatsTextWidth + StatsHorSpacing, Y + ( ( StatHeight - MeterHeight ) / 2 ) ); - C.DrawRect( texture'meter', M, MeterHeight ); //meter -} - -function DrawFooters( Canvas C ) -{ - local float DummyX, DummyY, Nil; - local string TextStr; - local string TimeStr; - local int Hours, Minutes, Seconds, i; - local PlayerReplicationInfo PRI; - local color specColor; - - C.bCenter = True; - C.Font = FooterFont; - - // Display server info in bottom center - C.DrawColor = FooterColor; - C.StrLen( "Test", DummyX, DummyY ); - C.SetPos( 0, C.ClipY - DummyY ); - TextStr = "Playing" @ Level.Title @ "on" @ pTGRI.ServerName; - if( SCTFGame.TickRate > 0 ) TextStr = TextStr @ "(TR:" @ SCTFGame.TickRate $ ")"; - C.DrawText( TextStr ); - - // Draw Time - if( bTimeDown || ( PlayerOwner.GameReplicationInfo.RemainingTime > 0 ) ) - { - bTimeDown = True; - if( PlayerOwner.GameReplicationInfo.RemainingTime <= 0 ) - { - TimeStr = RemainingTime $ "00:00"; - } - else - { - Minutes = PlayerOwner.GameReplicationInfo.RemainingTime / 60; - Seconds = PlayerOwner.GameReplicationInfo.RemainingTime % 60; - TimeStr = RemainingTime $ TwoDigitString( Minutes ) $ ":" $ TwoDigitString( Seconds ); - } - } - else - { - Seconds = PlayerOwner.GameReplicationInfo.ElapsedTime; - Minutes = Seconds / 60; - Hours = Minutes / 60; - Seconds = Seconds - ( Minutes * 60 ); - Minutes = Minutes - ( Hours * 60 ); - TimeStr = ElapsedTime $ TwoDigitString( Hours ) $ ":" $ TwoDigitString( Minutes ) $ ":" $ TwoDigitString( Seconds ); - } - - if(SCTFGame.bShowSpecs){ - for ( i=0; i<32; i++ ) - { - if (PlayerPawn(Owner).GameReplicationInfo.PRIArray[i] != None) - { - PRI = PlayerPawn(Owner).GameReplicationInfo.PRIArray[i]; - if (PRI.bIsSpectator && !PRI.bWaitingPlayer && PRI.StartTime > 0) - { - if(HeaderText=="") HeaderText = pri.Playername; else HeaderText = HeaderText$", "$pri.Playername; - } - } - } - if (HeaderText=="") HeaderText = "there is currently no one spectating this match."; else HeaderText = HeaderText$"."; // I'm sorry about this, it's really stupid - } // but I'm to lazy rewrite it :P - // Atleast it's working.. - C.SetPos( 0, C.ClipY - 2 * DummyY ); - C.DrawText( "Current Time:" @ GetTimeStr() @ "|" @ TimeStr ); - - // Draw Spectators - C.StrLen( HeaderText, DummyX, Nil ); - C.Style = ERenderStyle.STY_Normal; - C.SetPos( 0, C.ClipY - 5 * DummyY ); - - if(SCTFGame.bShowSpecs){ - specColor = SCTFGame.SpectatorColor; - C.Font = MyFonts.GetSmallestFont(C.ClipX); - C.DrawColor = specColor; // Added in 4E - C.DrawText("Spectators:"@HeaderText); - HeaderText=""; // This is declared as a global var, so we reset it to start with a clean slate. - }else{ - C.DrawText( "" ); // Don't draw credits 2 times - } - - // Draw new-credits - C.StrLen( HeaderText2, DummyX, DummyY ); - C.Style = ERenderStyle.STY_Normal; - C.SetPos( 0, C.ClipY - 3 * DummyY ); - C.Font = MyFonts.GetSmallestFont(C.ClipX); - C.DrawColor = Yellow; - C.DrawText( HeaderText2 ); - - C.bCenter = False; -} - -function DrawHeader( Canvas C ) -{ - local float DummyX, DummyY; - - if( pTGRI.GameEndedComments == "" ) return; - - C.Font = GameEndedFont; - C.StrLen( pTGRI.GameEndedComments, DummyX, DummyY ); - - C.DrawColor = DarkGray; - C.Style = ERenderStyle.STY_Translucent; - C.SetPos( C.ClipX / 2 - DummyX / 2 + 2, DummyY + 2 ); - C.DrawText( pTGRI.GameEndedComments ); - - C.DrawColor = HeaderColor; - C.Style = ERenderStyle.STY_Normal; - C.SetPos( C.ClipX / 2 - DummyX / 2, DummyY ); - C.DrawText( pTGRI.GameEndedComments ); -} - -/* - * Returns time and date in a string. -*/ -function string GetTimeStr() -{ - local string Mon, Day, Min; - - Min = string( PlayerOwner.Level.Minute ); - if( int( Min ) < 10 ) Min = "0" $ Min; - - switch( PlayerOwner.Level.month ) - { - case 1: Mon = "Jan"; break; - case 2: Mon = "Feb"; break; - case 3: Mon = "Mar"; break; - case 4: Mon = "Apr"; break; - case 5: Mon = "May"; break; - case 6: Mon = "Jun"; break; - case 7: Mon = "Jul"; break; - case 8: Mon = "Aug"; break; - case 9: Mon = "Sep"; break; - case 10: Mon = "Oct"; break; - case 11: Mon = "Nov"; break; - case 12: Mon = "Dec"; break; - } - - switch( PlayerOwner.Level.dayOfWeek ) - { - case 0: Day = "Sunday"; break; - case 1: Day = "Monday"; break; - case 2: Day = "Tuesday"; break; - case 3: Day = "Wednesday"; break; - case 4: Day = "Thursday"; break; - case 5: Day = "Friday"; break; - case 6: Day = "Saturday"; break; - } - - return Day @ PlayerOwner.Level.Day @ Mon @ PlayerOwner.Level.Year $ "," @ PlayerOwner.Level.Hour $ ":" $ Min; -} - -/* - * Length of a meter drawing for a given number A out of B total. -*/ -function int GetMeterLength( int A, int B ) -{ - local int Result; - - if( B == 0 ) return 0; - Result = ( A * MaxMeterWidth ) / B; - - if( Result > MaxMeterWidth ) return MaxMeterWidth; - else return Result; -} - -/* - * Sort PlayerReplicationInfo's on score. -*/ -function SortScores( int N ) -{ - local byte i, j; - local bool bSorted; - local SmartCTFPlayerReplicationInfo PlayerStats1, PlayerStats2; - - // Copy PRI array except for spectators. - j = 0; - for( i = 0; i < N; i++ ) - { - if( pTGRI.priArray[i] == None ) break; - if( pTGRI.priArray[i].bIsSpectator && !pTGRI.priArray[i].bWaitingPlayer ) continue; - Ordered[j] = pTGRI.priArray[i]; - j++; - } - // Clear the remaining entries. - for( i = j; i < N; i++ ) - { - Ordered[i] = None; - } - - for( i = 0; i < N; i++) - { - bSorted = True; - for( j = 0; j < N - 1; j++) - { - if( Ordered[j] == None || Ordered[j+1] == None ) break; - - if( Ordered[j].Score < Ordered[j+1].Score ) - { - SwapOrdered( j, j + 1 ); - bSorted = False; - } - else if( Ordered[j].Score == Ordered[j+1].Score ) - { - PlayerStats1 = SCTFGame.GetStatsByPRI( Ordered[j] ); - PlayerStats2 = SCTFGame.GetStatsByPRI( Ordered[j+1] ); - if( PlayerStats1 != None && PlayerStats2 != None ) - { - if( PlayerStats1.Frags < PlayerStats2.Frags ) - { - SwapOrdered( j, j + 1 ); - bSorted = False; - } - else if( PlayerStats1.Frags == PlayerStats2.Frags ) - { - if( Ordered[j].Deaths > Ordered[j+1].Deaths ) - { - SwapOrdered( j, j + 1 ); - bSorted = False; - } - } - } - } - } - if( bSorted ) break; - } -} - -/* - * Used for sorting. -*/ -function SwapOrdered( byte A, byte B ) -{ - local PlayerReplicationInfo Temp; - Temp = Ordered[A]; - Ordered[A] = Ordered[B]; - Ordered[B] = Temp; -} - -/* - * Recalculate the totals for displaying meters on the scoreboards. - * This way it doesn't get calculated every tick. -*/ -function RecountNumbers() -{ - local byte ID, i; - local SmartCTFPlayerReplicationInfo PlayerStats; - - MaxCaps = 0; - MaxAssists = 0; - MaxGrabs = 0; - MaxCovers = 0; - MaxSeals = 0; - MaxDefKills = 0; - MaxFlagKills = 0; - MaxFrags = 0; - MaxDeaths = 0; - TotShieldBelts = 0; - TotAmps = 0; - - for( i = 0; i < 32; i++ ) - { - if( Ordered[i] == None ) break; - if( Ordered[i].bIsSpectator && !Ordered[i].bWaitingPlayer ) continue; - - ID = Ordered[i].PlayerID; - - PlayerStats = SCTFGame.GetStatsByPRI( Ordered[i] ); - if( PlayerStats != None ) - { - if( PlayerStats.Captures > MaxCaps ) MaxCaps = PlayerStats.Captures; - if( PlayerStats.Assists > MaxAssists ) MaxAssists = PlayerStats.Assists; - if( PlayerStats.Grabs > MaxGrabs ) MaxGrabs = PlayerStats.Grabs; - if( PlayerStats.Covers > MaxCovers ) MaxCovers = PlayerStats.Covers; - if( PlayerStats.Seals > MaxSeals ) MaxSeals = PlayerStats.Seals; - if( PlayerStats.DefKills > MaxDefKills ) MaxDefKills = PlayerStats.DefKills; - if( PlayerStats.FlagKills > MaxFlagKills ) MaxFlagKills = PlayerStats.FlagKills; - if( PlayerStats.Frags > MaxFrags ) MaxFrags = PlayerStats.Frags; - TotShieldBelts += PlayerStats.ShieldBelts; - TotAmps += PlayerStats.Amps; - } - if( Ordered[i].Deaths > MaxDeaths ) MaxDeaths = Ordered[i].Deaths; - } -} - -defaultproperties -{ - NormalScoreBoard=None - SCTFGame=None - OwnerStats=None - TryCount=0 - PlayerOwner=None - PtsText="Pts" - FragsText="Frags" - SepText=" / " - MoreText="More..." - HeaderText="" - HeaderText2="[ SmartCTF ChaChaV6 ]" - LastSortTime=0 - MaxMeterWidth=0 - ColorChangeSpeed=0 - RowColState=0 - White=(R=255,G=255,B=255,A=0) - Gray=(R=128,G=128,B=128,A=0) - DarkGray=(R=32,G=32,B=32,A=0) - Yellow=(R=255,G=255,B=0,A=0) - RedTeamColor=(R=255,G=0,B=0,A=0) - BlueTeamColor=(R=0,G=128,B=255,A=0) - RedHeaderColor=(R=64,G=0,B=0,A=0) - BlueHeaderColor=(R=0,G=32,B=64,A=0) - StatsColor=(R=255,G=255,B=255,A=0) - FooterColor=(R=255,G=255,B=255,A=0) - HeaderColor=(R=255,G=255,B=0,A=0) - TinyInfoColor=(R=128,G=128,B=128,A=0) - HeaderTinyInfoColor=(R=192,G=192,B=192,A=0) - StatsTextWidth=0.000000 - StatHeight=0.000000 - MeterHeight=0.000000 - NameHeight=0.000000 - ColumnHeight=0.000000 - StatBlockHeight=0.000000 - RedStartX=0.000000 - BlueStartX=0.000000 - ColumnWidth=0.000000 - StatWidth=0.000000 - StatsHorSpacing=0.000000 - ShadingSpacingX=0.000000 - HeaderShadingSpacingY=0.000000 - ColumnShadingSpacingY=0.000000 - StartY=0.000000 - StatLineHeight=0.000000 - StatBlockSpacing=0.000000 - StatIndent=0.000000 - pTGRI=None - pPRI=None - StatFont=None - CapFont=None - FooterFont=None - GameEndedFont=None - PlayerNameFont=None - FragsFont=None - TinyInfoFont=None - PtsFont22=None - PtsFont20=None - PtsFont18=None - PtsFont16=None - PtsFont14=None - PtsFont12=None - MaxCaps=0 - MaxAssists=0 - MaxGrabs=0 - MaxCovers=0 - MaxSeals=0 - MaxDefKills=0 - MaxFlagKills=0 - MaxFrags=0 - MaxDeaths=0 - TotShieldBelts=0 - TotAmps=0 - bSealsOrDefs=False - bStarted=False - bEndHandled=False - FD(0)=(Prefix="",Tex=None) - FD(1)=(Prefix="",Tex=None) - FD(2)=(Prefix="",Tex=None) - FD(3)=(Prefix="",Tex=None) - FD(4)=(Prefix="",Tex=None) - FD(5)=(Prefix="",Tex=None) - FD(6)=(Prefix="",Tex=None) - FD(7)=(Prefix="",Tex=None) - FD(8)=(Prefix="",Tex=None) - FD(9)=(Prefix="",Tex=None) - FD(10)=(Prefix="",Tex=None) - FD(11)=(Prefix="",Tex=None) - FD(12)=(Prefix="",Tex=None) - FD(13)=(Prefix="",Tex=None) - FD(14)=(Prefix="",Tex=None) - FD(15)=(Prefix="",Tex=None) - FD(16)=(Prefix="",Tex=None) - FD(17)=(Prefix="",Tex=None) - FD(18)=(Prefix="",Tex=None) - FD(19)=(Prefix="",Tex=None) - FD(20)=(Prefix="",Tex=None) - FD(21)=(Prefix="",Tex=None) - FD(22)=(Prefix="",Tex=None) - FD(23)=(Prefix="",Tex=None) - FD(24)=(Prefix="",Tex=None) - FD(25)=(Prefix="",Tex=None) - FD(26)=(Prefix="",Tex=None) - FD(27)=(Prefix="",Tex=None) - FD(28)=(Prefix="",Tex=None) - FD(29)=(Prefix="",Tex=None) - FD(30)=(Prefix="",Tex=None) - FD(31)=(Prefix="",Tex=None) - saveindex=0 - } +class SmartCTFScoreBoard extends UnrealCTFScoreBoard; + +#exec texture IMPORT NAME=faceless File=Textures\faceless.pcx GROUP=SmartCTF + +var ScoreBoard NormalScoreBoard; +var SmartCTFGameReplicationInfo SCTFGame; +var SmartCTFPlayerReplicationInfo OwnerStats; + +var int TryCount; +var PlayerPawn PlayerOwner; + +var string PtsText, FragsText, SepText, MoreText, HeaderText, HeaderText2; +var int LastSortTime, MaxMeterWidth; +var byte ColorChangeSpeed, RowColState; +var Color White, Gray, DarkGray, Yellow, RedTeamColor, BlueTeamColor, RedHeaderColor, BlueHeaderColor, StatsColor, FooterColor, HeaderColor, TinyInfoColor, HeaderTinyInfoColor; +var float StatsTextWidth, StatHeight, MeterHeight, NameHeight, ColumnHeight, StatBlockHeight; +var float RedStartX, BlueStartX, ColumnWidth, StatWidth, StatsHorSpacing, ShadingSpacingX, HeaderShadingSpacingY, ColumnShadingSpacingY; +var float StartY, StatLineHeight, StatBlockSpacing, StatIndent; +var TournamentGameReplicationInfo pTGRI; +var PlayerReplicationInfo pPRI; +var Font StatFont, CapFont, FooterFont, GameEndedFont, PlayerNameFont, FragsFont, TinyInfoFont; +var Font PtsFont22, PtsFont20, PtsFont18, PtsFont16, PtsFont14, PtsFont12; + +var int MaxCaps, MaxAssists, MaxGrabs, MaxCovers, MaxSeals, MaxDefKills, MaxFlagKills, MaxFrags, MaxDeaths; +var int TotShieldBelts, TotAmps; + +var bool bSealsOrDefs; +var bool bStarted; +var bool bEndHandled; + +struct FlagData +{ + var string Prefix; + var texture Tex; +}; +var FlagData FD[32]; // there can be max 32 so max 32 different flags +var int saveindex; // new loaded flags will be saved in FD[index] + +function int GetFlagIndex(string Prefix) +{ + local int i; + for(i=0;i<32;i++) + { + if(FD[i].Prefix == Prefix) + { + return i; + } + } + FD[saveindex].Prefix=Prefix; + FD[saveindex].Tex=texture(DynamicLoadObject(SCTFGame.CountryFlagsPackage$"."$Prefix, class'Texture')); + i=saveindex; + saveindex = (saveindex+1) % 256; + return i; +} + +function PostBeginPlay() +{ + super.PostBeginPlay(); + + PlayerOwner = PlayerPawn( Owner ); + pTGRI = TournamentGameReplicationInfo (PlayerOwner.GameReplicationInfo); + pPRI = PlayerOwner.PlayerReplicationInfo; + LastSortTime = -100; + + // Preload + PtsFont22 = Font( DynamicLoadObject( "LadderFonts.UTLadder22", class'Font' ) ); + PtsFont20 = Font( DynamicLoadObject( "LadderFonts.UTLadder20", class'Font' ) ); + PtsFont18 = Font( DynamicLoadObject( "LadderFonts.UTLadder18", class'Font' ) ); + PtsFont16 = Font( DynamicLoadObject( "LadderFonts.UTLadder16", class'Font' ) ); + PtsFont14 = Font( DynamicLoadObject( "LadderFonts.UTLadder14", class'Font' ) ); + PtsFont12 = Font( DynamicLoadObject( "LadderFonts.UTLadder12", class'Font' ) ); + + SpawnNormalScoreBoard(); + if( NormalScoreBoard == None ) + { + SetTimer( 1.0 , True ); + } + else + { + bStarted = True; + SetTimer( 3.0, true); + } +} + +// Try to spawn a local instance of the original scoreboard class if it doesn't exist already. +function SpawnNormalScoreBoard() +{ + if( SCTFGame == None ) + { + ForEach AllActors( class'SmartCTFGameReplicationInfo', SCTFGame ) break; + } + if( SCTFGame != None ) + { + OwnerStats = SCTFGame.GetStats( PlayerOwner ); + } + + if( SCTFGame != None && SCTFGame.NormalScoreBoardClass == None ) + { + Log( "Unable to identify original ScoreBoard type. Retrying in 1 second." , 'SmartCTF' ); + return; + } + + if( SCTFGame != None && SCTFGame.NormalScoreBoardClass == self.Class ) + { + NormalScoreBoard = Spawn( class'UnrealCTFScoreBoard', PlayerOwner ); + Log( "Cannot use itself. Using the default CTF ScoreBoard instead." , 'SmartCTF' ); + return; + } + + if( SCTFGame != None && SCTFGame.NormalScoreBoardClass != None ) + { + NormalScoreBoard = Spawn( SCTFGame.NormalScoreBoardClass, PlayerOwner ); + Log( "Determined and spawned original scoreboard as" @ NormalScoreBoard, 'SmartCTF' ); + } +} + +// In the case of the 'normal scoreboard' not being replicated properly, try every second to see if it has. +function Timer() +{ + if(!bStarted) + { + if( NormalScoreBoard == None ) + { + TryCount++; + SpawnNormalScoreBoard(); + } + + if( NormalScoreBoard != None ) + { + bStarted = True; + SetTimer( 3.0, True ); + } + else if( TryCount > 3 ) + { + Log( "Given up. Using the default CTF ScoreBoard instead." , 'SmartCTF' ); + + if( NormalScoreBoard == None ) + { + NormalScoreBoard = Spawn( class'UnrealCTFScoreBoard', PlayerOwner ); + Log( "Spawned as" @ NormalScoreBoard, 'SmartCTF' ); + } + bStarted = True; + SetTimer( 3.0, True ); + } + } + else + { + bSealsOrDefs = !bSealsOrDefs; + } +} + +function ShowScores( Canvas C ) +{ + if( SCTFGame == None || OwnerStats == None ) + { + if( NormalScoreBoard != None ) + { + NormalScoreBoard.ShowScores( C ); + } + else + { + PlayerOwner.bShowScores = False; + } + return; + } + + if(OwnerStats.bEndStats && !bEndHandled) + { + bEndHandled = True; + bSealsOrDefs = True; + SetTimer(10, true); + } + + if( OwnerStats.bViewingStats ) + { + SmartCTFShowScores( C ); + } + else + { + if( NormalScoreBoard == None ) + { + SmartCTFShowScores( C ); + } + else + { + NormalScoreBoard.ShowScores( C ); + } + } + + if( OwnerStats.IndicatorVisibility > 0 ) + { + ShowIndicator( C ); + } +} + +function ShowIndicator( Canvas C ) +{ + local float BlockLen, LineHeight; + + C.DrawColor.R = OwnerStats.IndicatorVisibility; + C.DrawColor.G = OwnerStats.IndicatorVisibility; + C.DrawColor.B = OwnerStats.IndicatorVisibility; + C.Style = ERenderStyle.STY_Translucent; + C.Font = C.SmallFont; + C.StrLen( "Scoreboard:", BlockLen, LineHeight ); + C.SetPos( C.ClipX - BlockLen - 16, 16 ); + C.DrawText( "Scoreboard:" ); + C.SetPos( C.ClipX - BlockLen, 16 + LineHeight ); + C.DrawText( "Default" ); + C.SetPos( C.ClipX - BlockLen, 16 + 2 * LineHeight ); + C.DrawText( "SmartCTF" ); + if( OwnerStats.bViewingStats ) + { + C.SetPos( C.ClipX - BlockLen - 16, 16 + 2 * LineHeight ); + } + else + { + C.SetPos( C.ClipX - BlockLen - 16, 16 + LineHeight ); + } + C.DrawIcon( texture'UWindow.MenuTick', 1 ); + C.Style = ERenderStyle.STY_Normal; + + if( Level.TimeSeconds - OwnerStats.IndicatorStartShow > 2 ) + { + OwnerStats.IndicatorVisibility = 0; + } +} + +function SmartCTFShowScores( Canvas C ) + { + local int ID, i, j, Time, AvgPing, AvgPL, TotSB, TotAmp; + local float Eff; + local int RedY, BlueY, X, Y; + local float Nil, DummyX, DummyY, SizeX, SizeY, Buffer, Size; + local byte LabelDrawn[2], Rendered[2]; + local Color TeamColor, TempColor; + local string TempStr; + local SmartCTFPlayerReplicationInfo PlayerStats, PlayerStats2; + local int FlagShift; /* shifting elements to fit a flag */ + local Texture TmpTexture; + + if( Level.TimeSeconds - LastSortTime > 0.5 ) + { + SortScores( 32 ); + RecountNumbers(); + InitStatBoardConstPos( C ); + CompressStatBoard( C ); + LastSortTime = Level.TimeSeconds; + } + + Y = int( StartY ); + RedY = Y; + BlueY = Y; + + C.Style = ERenderStyle.STY_Normal; + + // FOR EACH PLAYER DRAW INFO + for( i = 0; i < 32; i++ ) + { + if( Ordered[i] == None ) break; + PlayerStats = SCTFGame.GetStatsByPRI( Ordered[i] ); + if( PlayerStats == None ) continue; + + // Get the ID of the ith player + ID = Ordered[i].PlayerID; + + // set the pos depending on Team + if( Ordered[i].Team == 0 ) + { + X = RedStartX; + Y = RedY; + TeamColor = RedTeamColor; + } + else + { + X = BlueStartX; + Y = BlueY; + TeamColor = BlueTeamColor; + } + C.DrawColor = TeamColor; + + if( LabelDrawn[Ordered[i].Team] == 0 ) + { + // DRAW THE Team SCORES with the cool Flag icons (masked because of black borders) + + C.bNoSmooth = False; + C.Font = PlayerNameFont; + C.Style = ERenderStyle.STY_Translucent; + if( Ordered[i].Team == 0 ) C.DrawColor = RedHeaderColor; + else C.DrawColor = BlueHeaderColor; + C.StrLen( PtsText, SizeX, SizeY ); + C.Style = ERenderStyle.STY_Modulated; + C.SetPos( X - ShadingSpacingX, Y - HeaderShadingSpacingY ); + C.DrawRect( texture'shade', ColumnWidth + ( ShadingSpacingX * 2 ) , SizeY + ( HeaderShadingSpacingY * 2 ) ); + C.Style = ERenderStyle.STY_Translucent; + C.SetPos( X - ShadingSpacingX, Y - HeaderShadingSpacingY ); + if( Ordered[i].Team == 0 ) C.DrawPattern( texture'redskin2', ColumnWidth + ( ShadingSpacingX * 2 ) , SizeY + ( HeaderShadingSpacingY * 2 ) , 1 ); + else C.DrawPattern( texture'blueskin2', ColumnWidth + ( ShadingSpacingX * 2 ) , SizeY + ( HeaderShadingSpacingY * 2 ) , 1 ); + + C.Style = ERenderStyle.STY_Modulated; + C.SetPos( X - ShadingSpacingX, Y + SizeY + HeaderShadingSpacingY ); + C.DrawRect( texture'shade', ColumnWidth + ( ShadingSpacingX * 2 ) , ColumnHeight + ( ColumnShadingSpacingY * 2 ) ); + + C.Style = ERenderStyle.STY_Translucent; + C.DrawColor = TeamColor; + C.SetPos( X, Y - ( ( 32 - SizeY ) / 2 ) ); // Y - 4 + if( Ordered[i].Team == 0 ) C.DrawIcon( texture'I_TeamR', 0.5 ); + else C.DrawIcon( texture'I_TeamB', 0.5 ); + + C.Font = CapFont; + C.StrLen( int( pTGRI.Teams[Ordered[i].Team].Score ), DummyX, DummyY ); + C.Style = ERenderStyle.STY_Normal; + C.SetPos( X + StatIndent, Y - ( ( DummyY - SizeY ) / 2 ) ); + C.DrawText( int( pTGRI.Teams[Ordered[i].Team].Score ) ); + + //Draw the Frags/Pts text + C.Font = PlayerNameFont; + C.SetPos( X + ColumnWidth - SizeX, Y ); + C.DrawText( PtsText ); + C.Font = FragsFont; + C.StrLen( FragsText $ SepText, Buffer, Nil ); + C.SetPos( X + ColumnWidth - SizeX - Buffer, Y ); + C.DrawText( FragsText $ SepText ); + + C.DrawColor = HeaderTinyInfoColor; + C.Font = TinyInfoFont; + C.StrLen( "TEST", Nil, DummyY ); + C.SetPos( X + StatIndent + DummyX + 2 * StatsHorSpacing, Y + ( SizeY - DummyY * 2 ) / 2 ); + Time = Max( 1, Level.TimeSeconds / 60 ); + AvgPing = 0; + AvgPL = 0; + TotSB = 0; + TotAmp = 0; + for( j = 0; j < 32; j++ ) + { + if( Ordered[j] == None ) break; + if( Ordered[j].Team == Ordered[i].Team ) + { + PlayerStats2 = SCTFGame.GetStatsByPRI( Ordered[j] ); + if( PlayerStats2 == None ) continue; + AvgPing += Ordered[j].Ping; + AvgPL += Ordered[j].PacketLoss; + TotSB += PlayerStats2.ShieldBelts; + TotAmp += PlayerStats2.Amps; + } + } + if( pTGRI.Teams[Ordered[i].Team].Size != 0 ) + { + AvgPing = AvgPing / pTGRI.Teams[Ordered[i].Team].Size; + AvgPL = AvgPL / pTGRI.Teams[Ordered[i].Team].Size; + } + if( TotShieldBelts == 0 ) TotSB = 0; + else TotSB = Clamp( float( TotSB ) / float( TotShieldBelts ) * 100, 0, 100 ); + if( TotAmps == 0 ) TotAmp = 0; + else TotAmp = Clamp( float( TotAmp ) / float( TotAmps ) * 100, 0, 100 ); + TempStr = "PING:" $ AvgPing $ " PL:" $ AvgPL $ "%"; + C.DrawText( TempStr ); + C.SetPos( X + StatIndent + DummyX + 2 * StatsHorSpacing, Y + ( SizeY - DummyY * 2 ) / 2 + DummyY ); + TempStr = "TM:" $ Time; + if( TotSB != 0 ) TempStr = TempStr @ "SB:" $ TotSB $ "%"; + if( TotAmp != 0 ) TempStr = TempStr @ "AM:" $ TotAmp $ "%"; + C.DrawText( TempStr ); + + C.bNoSmooth = True; + + Y += SizeY + HeaderShadingSpacingY + ColumnShadingSpacingY; + LabelDrawn[Ordered[i].Team] = 1; + } + + C.Font = FooterFont; + C.StrLen( "Test", Nil, DummyY ); + if( LabelDrawn[Ordered[i].Team] != 2 && ( Y + NameHeight + StatBlockHeight + StatBlockSpacing > C.ClipY - DummyY * 5 ) ) + { + + C.DrawColor = TeamColor; + C.StrLen( MoreText , Size, DummyY ); + if( Ordered[i].Team == 1 ) C.SetPos( X + ColumnWidth - Size, C.ClipY - DummyY * 5 ); + else C.SetPos( X, C.ClipY - DummyY * 5 ); + C.DrawText( "[" @ pTGRI.Teams[Ordered[i].Team].Size - Rendered[Ordered[i].Team] @ MoreText @ "]" ); + LabelDrawn[Ordered[i].Team] = 2; // "More" label also drawn + } + + else if( LabelDrawn[Ordered[i].Team] != 2 ) + { + + // Draw the face + if( Ordered[i].HasFlag == None ) + { + C.bNoSmooth = False; + C.DrawColor = White; + C.Style = ERenderStyle.STY_Translucent; + C.SetPos( X, Y ); + if( SCTFGame.bStatsDrawFaces && Ordered[i].TalkTexture != None ) C.DrawIcon( Ordered[i].TalkTexture, 0.5 ); + else C.DrawIcon( texture'faceless', 0.5 ); + C.SetPos( X, Y ); + C.DrawColor = DarkGray; + C.DrawIcon( texture'IconSelection', 1 ); + C.Style = ERenderStyle.STY_Normal; + C.bNoSmooth = True; + } + + // Draw the player name + C.SetPos( X + StatIndent, Y ); + + C.Font = PlayerNameFont; + if( Ordered[i].bAdmin ) C.DrawColor = White; + else if( Ordered[i].PlayerID == pPRI.PlayerID ) C.DrawColor = Yellow; + else C.DrawColor = TeamColor; + TempColor = C.DrawColor; + C.DrawText( Ordered[i].PlayerName ); + C.StrLen( Ordered[i].PlayerName, Size, Buffer ); + + C.DrawColor = TinyInfoColor; + C.Font = TinyInfoFont; + C.StrLen( "TEST", Buffer, DummyY ); + + // Draw Time, Eff, HS, SB, Amp + C.SetPos( X + StatIndent + Size + StatsHorSpacing, Y + ( NameHeight - DummyY * 2 ) / 2 ); + TempStr = ""; + if( PlayerStats.HeadShots != 0 ) TempStr = TempStr $ "HS:" $ PlayerStats.HeadShots; + if( PlayerStats.ShieldBelts != 0 ) TempStr = TempStr @ "SB:" $ PlayerStats.ShieldBelts; + if( PlayerStats.Amps != 0 ) TempStr = TempStr @ "AM:" $ PlayerStats.Amps; + if( Left( TempStr, 1 ) == " " ) TempStr = Mid( TempStr, 1 ); + C.DrawText( TempStr ); + Time = Max( 1, ( Level.TimeSeconds + pPRI.StartTime - Ordered[i].StartTime ) / 60 ); + if( PlayerStats.Frags + Ordered[i].Deaths == 0 ) Eff = 0; + else Eff = ( PlayerStats.Frags / ( PlayerStats.Frags + Ordered[i].Deaths ) ) * 100; + C.SetPos( X + StatIndent + Size + StatsHorSpacing, Y + ( NameHeight - DummyY * 2 ) / 2 + DummyY ); + C.DrawText( "TM:" $ Time $ " EFF:" $ Clamp( int( Eff ), 0, 100 ) $ "%" ); + + // Draw the country flag + if(PlayerStats.CountryPrefix != "") + { + C.SetPos( X, Y + StatIndent - 16); + C.bNoSmooth = False; + C.DrawColor = White; + //C.DrawIcon(FD[GetFlagIndex(PlayerStats.CountryPrefix)].Tex, 1.0); + TmpTexture = FD[GetFlagIndex(PlayerStats.CountryPrefix)].Tex; + C.DrawIcon(TmpTexture, 32 / float(TmpTexture.VSize)); + FlagShift=12; + C.bNoSmooth = True; + } + else + { + FlagShift=0; + } + // Draw Bot or Ping/PL + C.SetPos( X, Y + StatIndent + FlagShift); + if( Ordered[i].bIsABot ) + { + C.DrawText( "BOT" ); + if( Ordered[i].Team == pPRI.Team ) + { + C.SetPos( X, Y + StatIndent + DummyY); + C.DrawText( Left( string( BotReplicationInfo( Ordered[i] ).RealOrders ) , 3 ) ); + } + } + else + { + C.DrawColor = HeaderTinyInfoColor; + TempStr = "PI:" $ Ordered[i].Ping; + if( Len( TempStr ) > 5 ) TempStr = "P:" $ Ordered[i].Ping; + if( Len( TempStr ) > 5 ) TempStr = string( Ordered[i].Ping ); + C.DrawText( TempStr ); + C.SetPos( X, Y + StatIndent + DummyY + FlagShift); + TempStr = "PL:" $ Ordered[i].PacketLoss $ "%"; + if( Len( TempStr ) > 5 ) TempStr = "L:" $ Ordered[i].PacketLoss $ "%"; + if( Len( TempStr ) > 5 ) TempStr = "L:" $ Ordered[i].PacketLoss; + if( Len( TempStr ) > 5 ) TempStr = Ordered[i].PacketLoss $ "%"; + C.DrawText( TempStr ); + } + + // Draw the Flag if he has Flag + if( Ordered[i].HasFlag != None ) + { + C.DrawColor = White; + C.SetPos( X, Y ); + if( Ordered[i].HasFlag.IsA( 'GreenFlag' ) ) C.DrawIcon( texture'GreenFlag', 1 ); + else if( Ordered[i].HasFlag.IsA( 'YellowFlag' ) ) C.DrawIcon( texture'YellowFlag', 1 ); + else if( Ordered[i].Team == 0 ) C.DrawIcon( texture'BlueFlag', 1 ); + else C.DrawIcon( texture'RedFlag', 1 ); + } // End if he has Flag + + C.Font = PlayerNameFont; + C.DrawColor = TempColor; + + // Draw Frag/Score + C.StrLen( int( Ordered[i].Score ), Size, DummyY ); + C.SetPos( X + ColumnWidth - Size, Y ); + C.DrawText( int( Ordered[i].Score ) ); + + C.Font = FragsFont; + C.StrLen( PlayerStats.Frags $ SepText, Buffer, SizeY ); + C.SetPos( X + ColumnWidth - Size - Buffer, Y ); + C.DrawText( PlayerStats.Frags $ SepText ); + + Y += NameHeight; + + // Set the Font for the stat drawing + C.Font = StatFont; + + if( RowColState == 1 ) + { + DrawStatType( C, X, Y, 1, 1, "Caps: ", PlayerStats.Captures, MaxCaps ); + DrawStatType( C, X, Y, 1, 2, "Assists: ", PlayerStats.Assists, MaxAssists ); + DrawStatType( C, X, Y, 1, 3, "Grabs: ", PlayerStats.Grabs, MaxGrabs ); + if(SCTFGame.bExtraStats) + { + if( bSealsOrDefs) { + DrawStatType( C, X, Y, 2, 2, "DefKills: ", PlayerStats.DefKills, MaxDefKills ); + DrawStatType( C, X, Y, 2, 1, "Covers: ", PlayerStats.Covers, MaxCovers ); + } + else { + DrawStatType( C, X, Y, 2, 2, "Seals: ", PlayerStats.Seals, MaxSeals ); + DrawStatType( C, X, Y, 2, 1, "Deaths: ", Ordered[i].Deaths, MaxDeaths ); + } + } + else + { + DrawStatType( C, X, Y, 2, 1, "Covers: ", PlayerStats.Covers, MaxCovers ); + if( MaxSeals > 0 ) DrawStatType( C, X, Y, 2, 2, "Seals: ", PlayerStats.Seals, MaxSeals ); + else DrawStatType( C, X, Y, 2, 2, "Deaths: ", Ordered[i].Deaths, MaxDeaths ); + } + DrawStatType( C, X, Y, 2, 3, "FlagKls: ", PlayerStats.FlagKills, MaxFlagKills ); + } + else + { + DrawStatType( C, X, Y, 1, 1, "Caps: ", PlayerStats.Captures, MaxCaps ); + DrawStatType( C, X, Y, 2, 1, "Grabs: ", PlayerStats.Grabs, MaxGrabs ); + + if(SCTFGame.bExtraStats) + { + if( bSealsOrDefs) { + DrawStatType( C, X, Y, 2, 2, "DefKills: ", PlayerStats.DefKills, MaxDefKills ); + DrawStatType( C, X, Y, 1, 2, "Covers: ", PlayerStats.Covers, MaxCovers ); + } + else { + DrawStatType( C, X, Y, 2, 2, "Seals: ", PlayerStats.Seals, MaxSeals ); + DrawStatType( C, X, Y, 1, 2, "Deaths: ", Ordered[i].Deaths, MaxDeaths ); + } + } + else + { + DrawStatType( C, X, Y, 1, 2, "Covers: ", PlayerStats.Covers, MaxCovers ); + if( MaxSeals > 0 ) DrawStatType( C, X, Y, 2, 2, "Seals: ", PlayerStats.Seals, MaxSeals ); + else DrawStatType( C, X, Y, 2, 2, "Deaths: ", Ordered[i].Deaths, MaxDeaths ); + } + DrawStatType( C, X, Y, 3, 1, "Assists: ", PlayerStats.Assists, MaxAssists ); + DrawStatType( C, X, Y, 3, 2, "FlagKls: ", PlayerStats.FlagKills, MaxFlagKills ); + } + + Y += StatBlockHeight + StatBlockSpacing; + } + + // Alter the RedY or BlueY and do next player + if( Ordered[i].Team == 0 ) RedY = Y; + else BlueY = Y; + Rendered[Ordered[i].Team]++; + + } //End of PRI for loop + +DrawHeader( C ); +DrawFooters( C ); +} + +function InitStatBoardConstPos( Canvas C ) +{ + local float Nil, LeftSpacingPercent, MidSpacingPercent, RightSpacingPercent; + + CapFont = Font'LEDFont2'; //Font( DynamicLoadObject( "UWindowFonts.UTFont40", class'Font' ) ); + FooterFont = MyFonts.GetSmallestFont( C.ClipX ); + GameEndedFont = MyFonts.GetHugeFont( C.ClipX ); + PlayerNameFont = MyFonts.GetBigFont( C.ClipX ); + TinyInfoFont = C.SmallFont; + + if( PlayerNameFont == PtsFont22 ) FragsFont = PtsFont18; + else if( PlayerNameFont == PtsFont20 ) FragsFont = PtsFont18; + else if( PlayerNameFont == PtsFont18 ) FragsFont = PtsFont14; + else if( PlayerNameFont == PtsFont16 ) FragsFont = PtsFont12; + else FragsFont = font'SmallFont'; + + C.Font = PlayerNameFont; + C.StrLen( "Player", Nil, NameHeight ); + + StartY = ( 120.0 / 1024.0 ) * C.ClipY; + ColorChangeSpeed = 100; // Influences how 'fast' the color changes from white to green. Higher = faster. + + LeftSpacingPercent = 0.075; + MidSpacingPercent = 0.15; + RightSpacingPercent = 0.075; + RedStartX = LeftSpacingPercent * C.ClipX; + ColumnWidth = ( ( 1 - LeftSpacingPercent - MidSpacingPercent - RightSpacingPercent ) / 2 * C.ClipX ); + BlueStartX = RedStartX + ColumnWidth + ( MidSpacingPercent * C.ClipX ); + ShadingSpacingX = ( 10.0 / 1024.0 ) * C.ClipX; + HeaderShadingSpacingY = ( 32 - NameHeight ) / 2 + ( ( 4.0 / 1024.0 ) * C.ClipX ); + ColumnShadingSpacingY = ( 10.0 / 1024.0 ) * C.ClipX; + + StatsHorSpacing = ( 5.0 / 1024.0 ) * C.ClipX; + StatIndent = ( 32 + StatsHorSpacing ); // For face + flag icons + + InitStatBoardDynamicPos( C ); +} + +function InitStatBoardDynamicPos( Canvas C , optional int Rows , optional int Cols , optional Font NewStatFont , optional float LineSpacing , optional float BlockSpacing ) +{ + if( Rows == 0 ) Rows = 3; + if( Cols == 0 ) Cols = 2; + if( LineSpacing == 0 ) LineSpacing = 0.9; + if( BlockSpacing == 0 ) BlockSpacing = 1; + + if( Rows == 2 && Cols == 3 ) RowColState = 1; + else RowColState = 0; + + StatWidth = ( ( ColumnWidth - StatIndent ) / Cols ) - ( StatsHorSpacing * ( Cols - 1 ) ); + + if( NewStatFont == None ) StatFont = MyFonts.GetSmallestFont( C.ClipX ); + else StatFont = NewStatFont; + C.Font = StatFont; + C.StrLen( "FlagKls: 00", StatsTextWidth, StatHeight ); + + MaxMeterWidth = StatWidth - StatsTextWidth - StatsHorSpacing; + StatLineHeight = StatHeight * LineSpacing; + MeterHeight = Max( 1, StatLineHeight * 0.3 ); + StatBlockSpacing = StatLineHeight * BlockSpacing; + + StatBlockHeight = Rows * StatLineHeight; + + if( pTGRI.Teams[0].Size > pTGRI.Teams[1].Size ) + ColumnHeight = pTGRI.Teams[0].Size * ( NameHeight + StatBlockHeight + StatBlockSpacing ) - StatBlockSpacing; + else + ColumnHeight = pTGRI.Teams[1].Size * ( NameHeight + StatBlockHeight + StatBlockSpacing ) - StatBlockSpacing; +} + +function CompressStatBoard( Canvas C , optional int Level ) +{ + local float EndY, Nil, DummyY; + + C.Font = FooterFont; + C.StrLen( "Test", Nil, DummyY ); + + EndY = StartY + ColumnHeight + ( ColumnShadingSpacingY * 2 ) + NameHeight + HeaderShadingSpacingY; + if( EndY > C.ClipY - DummyY * 5 ) + { + if( Level == 0 ) + { + InitStatBoardDynamicPos( C, , , , 0.8 ); + } + else if( Level == 1 ) + { + InitStatBoardDynamicPos( C, 2, 3 ); + } + else if( Level == 2 ) + { + InitStatBoardDynamicPos( C, 2, 3, Font( DynamicLoadObject( "UWindowFonts.Tahoma10", class'Font' ) ) , 1.0 , 1.0 ); + } + else + { + // We did all the compression we can do. Draw 'More' labels later. + // First find the columnheight for the amount of players that fit on it. + ColumnHeight = int( ( C.ClipY - ( EndY - ColumnHeight ) - DummyY * 5 + StatBlockSpacing ) / ( NameHeight + StatBlockHeight + StatBlockSpacing ) ) + * ( NameHeight + StatBlockHeight + StatBlockSpacing ) - StatBlockSpacing; + return; + } + // Did some compression, see if we need more. + CompressStatBoard( C , Level + 1 ); + } + // No compression at all or no more compression needed. + return; +} + +/* + * Draw a specific stat + * X, Y = Upper left corner of stats ( row,col: 1,1) +*/ +function DrawStatType( Canvas C, int X, int Y, int Row, int Col, string Label, int Count, int Total ) +{ + local float Size, DummyY; + local int ColorChange, M; + + X += StatIndent + ( ( StatWidth + StatsHorSpacing ) * ( Col - 1 ) ); + Y += ( StatLineHeight * ( Row - 1 ) ); + + C.DrawColor = StatsColor; + C.SetPos( X, Y ); + C.DrawText( Label ); + C.StrLen( Count, Size, DummyY ); + C.SetPos( X + StatsTextWidth - Size, Y ); + C.DrawText( Count ); //text + if( Count > 0 ) + { + ColorChange = ColorChangeSpeed * loge( Count ); + if( ColorChange > 255 ) ColorChange = 255; + C.DrawColor.R = StatsColor.R - ColorChange; + C.DrawColor.B = StatsColor.B - ColorChange; + } + M = GetMeterLength( Count, Total ); + C.SetPos( X + StatsTextWidth + StatsHorSpacing, Y + ( ( StatHeight - MeterHeight ) / 2 ) ); + C.DrawRect( texture'meter', M, MeterHeight ); //meter +} + +function DrawFooters( Canvas C ) +{ + local float DummyX, DummyY, Nil; + local string TextStr; + local string TimeStr; + local int Hours, Minutes, Seconds, i; + local PlayerReplicationInfo PRI; + local color specColor; + + C.bCenter = True; + C.Font = FooterFont; + + // Display server info in bottom center + C.DrawColor = FooterColor; + C.StrLen( "Test", DummyX, DummyY ); + C.SetPos( 0, C.ClipY - DummyY ); + TextStr = "Playing" @ Level.Title @ "on" @ pTGRI.ServerName; + if( SCTFGame.TickRate > 0 ) TextStr = TextStr @ "(TR:" @ SCTFGame.TickRate $ ")"; + C.DrawText( TextStr ); + + // Draw Time + if( bTimeDown || ( PlayerOwner.GameReplicationInfo.RemainingTime > 0 ) ) + { + bTimeDown = True; + if( PlayerOwner.GameReplicationInfo.RemainingTime <= 0 ) + { + TimeStr = RemainingTime $ "00:00"; + } + else + { + Minutes = PlayerOwner.GameReplicationInfo.RemainingTime / 60; + Seconds = PlayerOwner.GameReplicationInfo.RemainingTime % 60; + TimeStr = RemainingTime $ TwoDigitString( Minutes ) $ ":" $ TwoDigitString( Seconds ); + } + } + else + { + Seconds = PlayerOwner.GameReplicationInfo.ElapsedTime; + Minutes = Seconds / 60; + Hours = Minutes / 60; + Seconds = Seconds - ( Minutes * 60 ); + Minutes = Minutes - ( Hours * 60 ); + TimeStr = ElapsedTime $ TwoDigitString( Hours ) $ ":" $ TwoDigitString( Minutes ) $ ":" $ TwoDigitString( Seconds ); + } + + if(SCTFGame.bShowSpecs){ + for ( i=0; i<32; i++ ) + { + if (PlayerPawn(Owner).GameReplicationInfo.PRIArray[i] != None) + { + PRI = PlayerPawn(Owner).GameReplicationInfo.PRIArray[i]; + if (PRI.bIsSpectator && !PRI.bWaitingPlayer && PRI.StartTime > 0) + { + if(HeaderText=="") HeaderText = pri.Playername; else HeaderText = HeaderText$", "$pri.Playername; + } + } + } + if (HeaderText=="") HeaderText = "there is currently no one spectating this match."; else HeaderText = HeaderText$"."; // I'm sorry about this, it's really stupid + } // but I'm to lazy rewrite it :P + // Atleast it's working.. + C.SetPos( 0, C.ClipY - 2 * DummyY ); + C.DrawText( "Current Time:" @ GetTimeStr() @ "|" @ TimeStr ); + + // Draw Spectators + C.StrLen( HeaderText, DummyX, Nil ); + C.Style = ERenderStyle.STY_Normal; + C.SetPos( 0, C.ClipY - 5 * DummyY ); + + if(SCTFGame.bShowSpecs){ + specColor = SCTFGame.SpectatorColor; + C.Font = MyFonts.GetSmallestFont(C.ClipX); + C.DrawColor = specColor; // Added in 4E + C.DrawText("Spectators:"@HeaderText); + HeaderText=""; // This is declared as a global var, so we reset it to start with a clean slate. + }else{ + C.DrawText( "" ); // Don't draw credits 2 times + } + + // Draw new-credits + C.StrLen( HeaderText2, DummyX, DummyY ); + C.Style = ERenderStyle.STY_Normal; + C.SetPos( 0, C.ClipY - 3 * DummyY ); + C.Font = MyFonts.GetSmallestFont(C.ClipX); + C.DrawColor = Yellow; + C.DrawText( HeaderText2 ); + + C.bCenter = False; +} + +function DrawHeader( Canvas C ) +{ + local float DummyX, DummyY; + + if( pTGRI.GameEndedComments == "" ) return; + + C.Font = GameEndedFont; + C.StrLen( pTGRI.GameEndedComments, DummyX, DummyY ); + + C.DrawColor = DarkGray; + C.Style = ERenderStyle.STY_Translucent; + C.SetPos( C.ClipX / 2 - DummyX / 2 + 2, DummyY + 2 ); + C.DrawText( pTGRI.GameEndedComments ); + + C.DrawColor = HeaderColor; + C.Style = ERenderStyle.STY_Normal; + C.SetPos( C.ClipX / 2 - DummyX / 2, DummyY ); + C.DrawText( pTGRI.GameEndedComments ); +} + +/* + * Returns time and date in a string. +*/ +function string GetTimeStr() +{ + local string Mon, Day, Min; + + Min = string( PlayerOwner.Level.Minute ); + if( int( Min ) < 10 ) Min = "0" $ Min; + + switch( PlayerOwner.Level.month ) + { + case 1: Mon = "Jan"; break; + case 2: Mon = "Feb"; break; + case 3: Mon = "Mar"; break; + case 4: Mon = "Apr"; break; + case 5: Mon = "May"; break; + case 6: Mon = "Jun"; break; + case 7: Mon = "Jul"; break; + case 8: Mon = "Aug"; break; + case 9: Mon = "Sep"; break; + case 10: Mon = "Oct"; break; + case 11: Mon = "Nov"; break; + case 12: Mon = "Dec"; break; + } + + switch( PlayerOwner.Level.dayOfWeek ) + { + case 0: Day = "Sunday"; break; + case 1: Day = "Monday"; break; + case 2: Day = "Tuesday"; break; + case 3: Day = "Wednesday"; break; + case 4: Day = "Thursday"; break; + case 5: Day = "Friday"; break; + case 6: Day = "Saturday"; break; + } + + return Day @ PlayerOwner.Level.Day @ Mon @ PlayerOwner.Level.Year $ "," @ PlayerOwner.Level.Hour $ ":" $ Min; +} + +/* + * Length of a meter drawing for a given number A out of B total. +*/ +function int GetMeterLength( int A, int B ) +{ + local int Result; + + if( B == 0 ) return 0; + Result = ( A * MaxMeterWidth ) / B; + + if( Result > MaxMeterWidth ) return MaxMeterWidth; + else return Result; +} + +/* + * Sort PlayerReplicationInfo's on score. +*/ +function SortScores( int N ) +{ + local byte i, j; + local bool bSorted; + local SmartCTFPlayerReplicationInfo PlayerStats1, PlayerStats2; + + // Copy PRI array except for spectators. + j = 0; + for( i = 0; i < N; i++ ) + { + if( pTGRI.priArray[i] == None ) break; + if( pTGRI.priArray[i].bIsSpectator && !pTGRI.priArray[i].bWaitingPlayer ) continue; + Ordered[j] = pTGRI.priArray[i]; + j++; + } + // Clear the remaining entries. + for( i = j; i < N; i++ ) + { + Ordered[i] = None; + } + + for( i = 0; i < N; i++) + { + bSorted = True; + for( j = 0; j < N - 1; j++) + { + if( Ordered[j] == None || Ordered[j+1] == None ) break; + + if( Ordered[j].Score < Ordered[j+1].Score ) + { + SwapOrdered( j, j + 1 ); + bSorted = False; + } + else if( Ordered[j].Score == Ordered[j+1].Score ) + { + PlayerStats1 = SCTFGame.GetStatsByPRI( Ordered[j] ); + PlayerStats2 = SCTFGame.GetStatsByPRI( Ordered[j+1] ); + if( PlayerStats1 != None && PlayerStats2 != None ) + { + if( PlayerStats1.Frags < PlayerStats2.Frags ) + { + SwapOrdered( j, j + 1 ); + bSorted = False; + } + else if( PlayerStats1.Frags == PlayerStats2.Frags ) + { + if( Ordered[j].Deaths > Ordered[j+1].Deaths ) + { + SwapOrdered( j, j + 1 ); + bSorted = False; + } + } + } + } + } + if( bSorted ) break; + } +} + +/* + * Used for sorting. +*/ +function SwapOrdered( byte A, byte B ) +{ + local PlayerReplicationInfo Temp; + Temp = Ordered[A]; + Ordered[A] = Ordered[B]; + Ordered[B] = Temp; +} + +/* + * Recalculate the totals for displaying meters on the scoreboards. + * This way it doesn't get calculated every tick. +*/ +function RecountNumbers() +{ + local byte ID, i; + local SmartCTFPlayerReplicationInfo PlayerStats; + + MaxCaps = 0; + MaxAssists = 0; + MaxGrabs = 0; + MaxCovers = 0; + MaxSeals = 0; + MaxDefKills = 0; + MaxFlagKills = 0; + MaxFrags = 0; + MaxDeaths = 0; + TotShieldBelts = 0; + TotAmps = 0; + + for( i = 0; i < 32; i++ ) + { + if( Ordered[i] == None ) break; + if( Ordered[i].bIsSpectator && !Ordered[i].bWaitingPlayer ) continue; + + ID = Ordered[i].PlayerID; + + PlayerStats = SCTFGame.GetStatsByPRI( Ordered[i] ); + if( PlayerStats != None ) + { + if( PlayerStats.Captures > MaxCaps ) MaxCaps = PlayerStats.Captures; + if( PlayerStats.Assists > MaxAssists ) MaxAssists = PlayerStats.Assists; + if( PlayerStats.Grabs > MaxGrabs ) MaxGrabs = PlayerStats.Grabs; + if( PlayerStats.Covers > MaxCovers ) MaxCovers = PlayerStats.Covers; + if( PlayerStats.Seals > MaxSeals ) MaxSeals = PlayerStats.Seals; + if( PlayerStats.DefKills > MaxDefKills ) MaxDefKills = PlayerStats.DefKills; + if( PlayerStats.FlagKills > MaxFlagKills ) MaxFlagKills = PlayerStats.FlagKills; + if( PlayerStats.Frags > MaxFrags ) MaxFrags = PlayerStats.Frags; + TotShieldBelts += PlayerStats.ShieldBelts; + TotAmps += PlayerStats.Amps; + } + if( Ordered[i].Deaths > MaxDeaths ) MaxDeaths = Ordered[i].Deaths; + } +} + +defaultproperties +{ + NormalScoreBoard=None + SCTFGame=None + OwnerStats=None + TryCount=0 + PlayerOwner=None + PtsText="Pts" + FragsText="Frags" + SepText=" / " + MoreText="More..." + HeaderText="" + HeaderText2="[ SmartCTF ChaChaV6 ]" + LastSortTime=0 + MaxMeterWidth=0 + ColorChangeSpeed=0 + RowColState=0 + White=(R=255,G=255,B=255,A=0) + Gray=(R=128,G=128,B=128,A=0) + DarkGray=(R=32,G=32,B=32,A=0) + Yellow=(R=255,G=255,B=0,A=0) + RedTeamColor=(R=255,G=0,B=0,A=0) + BlueTeamColor=(R=0,G=128,B=255,A=0) + RedHeaderColor=(R=64,G=0,B=0,A=0) + BlueHeaderColor=(R=0,G=32,B=64,A=0) + StatsColor=(R=255,G=255,B=255,A=0) + FooterColor=(R=255,G=255,B=255,A=0) + HeaderColor=(R=255,G=255,B=0,A=0) + TinyInfoColor=(R=128,G=128,B=128,A=0) + HeaderTinyInfoColor=(R=192,G=192,B=192,A=0) + StatsTextWidth=0.000000 + StatHeight=0.000000 + MeterHeight=0.000000 + NameHeight=0.000000 + ColumnHeight=0.000000 + StatBlockHeight=0.000000 + RedStartX=0.000000 + BlueStartX=0.000000 + ColumnWidth=0.000000 + StatWidth=0.000000 + StatsHorSpacing=0.000000 + ShadingSpacingX=0.000000 + HeaderShadingSpacingY=0.000000 + ColumnShadingSpacingY=0.000000 + StartY=0.000000 + StatLineHeight=0.000000 + StatBlockSpacing=0.000000 + StatIndent=0.000000 + pTGRI=None + pPRI=None + StatFont=None + CapFont=None + FooterFont=None + GameEndedFont=None + PlayerNameFont=None + FragsFont=None + TinyInfoFont=None + PtsFont22=None + PtsFont20=None + PtsFont18=None + PtsFont16=None + PtsFont14=None + PtsFont12=None + MaxCaps=0 + MaxAssists=0 + MaxGrabs=0 + MaxCovers=0 + MaxSeals=0 + MaxDefKills=0 + MaxFlagKills=0 + MaxFrags=0 + MaxDeaths=0 + TotShieldBelts=0 + TotAmps=0 + bSealsOrDefs=False + bStarted=False + bEndHandled=False + FD(0)=(Prefix="",Tex=None) + FD(1)=(Prefix="",Tex=None) + FD(2)=(Prefix="",Tex=None) + FD(3)=(Prefix="",Tex=None) + FD(4)=(Prefix="",Tex=None) + FD(5)=(Prefix="",Tex=None) + FD(6)=(Prefix="",Tex=None) + FD(7)=(Prefix="",Tex=None) + FD(8)=(Prefix="",Tex=None) + FD(9)=(Prefix="",Tex=None) + FD(10)=(Prefix="",Tex=None) + FD(11)=(Prefix="",Tex=None) + FD(12)=(Prefix="",Tex=None) + FD(13)=(Prefix="",Tex=None) + FD(14)=(Prefix="",Tex=None) + FD(15)=(Prefix="",Tex=None) + FD(16)=(Prefix="",Tex=None) + FD(17)=(Prefix="",Tex=None) + FD(18)=(Prefix="",Tex=None) + FD(19)=(Prefix="",Tex=None) + FD(20)=(Prefix="",Tex=None) + FD(21)=(Prefix="",Tex=None) + FD(22)=(Prefix="",Tex=None) + FD(23)=(Prefix="",Tex=None) + FD(24)=(Prefix="",Tex=None) + FD(25)=(Prefix="",Tex=None) + FD(26)=(Prefix="",Tex=None) + FD(27)=(Prefix="",Tex=None) + FD(28)=(Prefix="",Tex=None) + FD(29)=(Prefix="",Tex=None) + FD(30)=(Prefix="",Tex=None) + FD(31)=(Prefix="",Tex=None) + saveindex=0 + } \ No newline at end of file diff --git a/Classes/SmartCTFScoreBoard.UC.bak b/Classes/SmartCTFScoreBoard.UC.bak new file mode 100644 index 0000000..da25003 --- /dev/null +++ b/Classes/SmartCTFScoreBoard.UC.bak @@ -0,0 +1,1094 @@ +class SmartCTFScoreBoard extends UnrealCTFScoreBoard; + +#exec texture IMPORT NAME=faceless File=Textures\faceless.pcx GROUP=SmartCTF + +var ScoreBoard NormalScoreBoard; +var SmartCTFGameReplicationInfo SCTFGame; +var SmartCTFPlayerReplicationInfo OwnerStats; + +var int TryCount; +var PlayerPawn PlayerOwner; + +var string PtsText, FragsText, SepText, MoreText, HeaderText, HeaderText2; +var int LastSortTime, MaxMeterWidth; +var byte ColorChangeSpeed, RowColState; +var Color White, Gray, DarkGray, Yellow, RedTeamColor, BlueTeamColor, RedHeaderColor, BlueHeaderColor, StatsColor, FooterColor, HeaderColor, TinyInfoColor, HeaderTinyInfoColor; +var float StatsTextWidth, StatHeight, MeterHeight, NameHeight, ColumnHeight, StatBlockHeight; +var float RedStartX, BlueStartX, ColumnWidth, StatWidth, StatsHorSpacing, ShadingSpacingX, HeaderShadingSpacingY, ColumnShadingSpacingY; +var float StartY, StatLineHeight, StatBlockSpacing, StatIndent; +var TournamentGameReplicationInfo pTGRI; +var PlayerReplicationInfo pPRI; +var Font StatFont, CapFont, FooterFont, GameEndedFont, PlayerNameFont, FragsFont, TinyInfoFont; +var Font PtsFont22, PtsFont20, PtsFont18, PtsFont16, PtsFont14, PtsFont12; + +var int MaxCaps, MaxAssists, MaxGrabs, MaxCovers, MaxSeals, MaxDefKills, MaxFlagKills, MaxFrags, MaxDeaths; +var int TotShieldBelts, TotAmps; + +var bool bSealsOrDefs; +var bool bStarted; +var bool bEndHandled; + +struct FlagData +{ + var string Prefix; + var texture Tex; +}; +var FlagData FD[32]; // there can be max 32 so max 32 different flags +var int saveindex; // new loaded flags will be saved in FD[index] + +function int GetFlagIndex(string Prefix) +{ + local int i; + for(i=0;i<32;i++) + { + if(FD[i].Prefix == Prefix) + { + return i; + } + } + FD[saveindex].Prefix=Prefix; + FD[saveindex].Tex=texture(DynamicLoadObject(SCTFGame.CountryFlagsPackage$"."$Prefix, class'Texture')); + i=saveindex; + saveindex = (saveindex+1) % 256; + return i; +} + +function PostBeginPlay() +{ + super.PostBeginPlay(); + + PlayerOwner = PlayerPawn( Owner ); + pTGRI = TournamentGameReplicationInfo (PlayerOwner.GameReplicationInfo); + pPRI = PlayerOwner.PlayerReplicationInfo; + LastSortTime = -100; + + // Preload + PtsFont22 = Font( DynamicLoadObject( "LadderFonts.UTLadder22", class'Font' ) ); + PtsFont20 = Font( DynamicLoadObject( "LadderFonts.UTLadder20", class'Font' ) ); + PtsFont18 = Font( DynamicLoadObject( "LadderFonts.UTLadder18", class'Font' ) ); + PtsFont16 = Font( DynamicLoadObject( "LadderFonts.UTLadder16", class'Font' ) ); + PtsFont14 = Font( DynamicLoadObject( "LadderFonts.UTLadder14", class'Font' ) ); + PtsFont12 = Font( DynamicLoadObject( "LadderFonts.UTLadder12", class'Font' ) ); + + SpawnNormalScoreBoard(); + if( NormalScoreBoard == None ) + { + SetTimer( 1.0 , True ); + } + else + { + bStarted = True; + SetTimer( 3.0, true); + } +} + +// Try to spawn a local instance of the original scoreboard class if it doesn't exist already. +function SpawnNormalScoreBoard() +{ + if( SCTFGame == None ) + { + ForEach AllActors( class'SmartCTFGameReplicationInfo', SCTFGame ) break; + } + if( SCTFGame != None ) + { + OwnerStats = SCTFGame.GetStats( PlayerOwner ); + } + + if( SCTFGame != None && SCTFGame.NormalScoreBoardClass == None ) + { + Log( "Unable to identify original ScoreBoard type. Retrying in 1 second." , 'SmartCTF' ); + return; + } + + if( SCTFGame != None && SCTFGame.NormalScoreBoardClass == self.Class ) + { + NormalScoreBoard = Spawn( class'UnrealCTFScoreBoard', PlayerOwner ); + Log( "Cannot use itself. Using the default CTF ScoreBoard instead." , 'SmartCTF' ); + return; + } + + if( SCTFGame != None && SCTFGame.NormalScoreBoardClass != None ) + { + NormalScoreBoard = Spawn( SCTFGame.NormalScoreBoardClass, PlayerOwner ); + Log( "Determined and spawned original scoreboard as" @ NormalScoreBoard, 'SmartCTF' ); + } +} + +// In the case of the 'normal scoreboard' not being replicated properly, try every second to see if it has. +function Timer() +{ + if(!bStarted) + { + if( NormalScoreBoard == None ) + { + TryCount++; + SpawnNormalScoreBoard(); + } + + if( NormalScoreBoard != None ) + { + bStarted = True; + SetTimer( 3.0, True ); + } + else if( TryCount > 3 ) + { + Log( "Given up. Using the default CTF ScoreBoard instead." , 'SmartCTF' ); + + if( NormalScoreBoard == None ) + { + NormalScoreBoard = Spawn( class'UnrealCTFScoreBoard', PlayerOwner ); + Log( "Spawned as" @ NormalScoreBoard, 'SmartCTF' ); + } + bStarted = True; + SetTimer( 3.0, True ); + } + } + else + { + bSealsOrDefs = !bSealsOrDefs; + } +} + +function ShowScores( Canvas C ) +{ + if( SCTFGame == None || OwnerStats == None ) + { + if( NormalScoreBoard != None ) + { + NormalScoreBoard.ShowScores( C ); + } + else + { + PlayerOwner.bShowScores = False; + } + return; + } + + if(OwnerStats.bEndStats && !bEndHandled) + { + bEndHandled = True; + bSealsOrDefs = True; + SetTimer(10, true); + } + + if( OwnerStats.bViewingStats ) + { + SmartCTFShowScores( C ); + } + else + { + if( NormalScoreBoard == None ) + { + SmartCTFShowScores( C ); + } + else + { + NormalScoreBoard.ShowScores( C ); + } + } + + if( OwnerStats.IndicatorVisibility > 0 ) + { + ShowIndicator( C ); + } +} + +function ShowIndicator( Canvas C ) +{ + local float BlockLen, LineHeight; + + C.DrawColor.R = OwnerStats.IndicatorVisibility; + C.DrawColor.G = OwnerStats.IndicatorVisibility; + C.DrawColor.B = OwnerStats.IndicatorVisibility; + C.Style = ERenderStyle.STY_Translucent; + C.Font = C.SmallFont; + C.StrLen( "Scoreboard:", BlockLen, LineHeight ); + C.SetPos( C.ClipX - BlockLen - 16, 16 ); + C.DrawText( "Scoreboard:" ); + C.SetPos( C.ClipX - BlockLen, 16 + LineHeight ); + C.DrawText( "Default" ); + C.SetPos( C.ClipX - BlockLen, 16 + 2 * LineHeight ); + C.DrawText( "SmartCTF" ); + if( OwnerStats.bViewingStats ) + { + C.SetPos( C.ClipX - BlockLen - 16, 16 + 2 * LineHeight ); + } + else + { + C.SetPos( C.ClipX - BlockLen - 16, 16 + LineHeight ); + } + C.DrawIcon( texture'UWindow.MenuTick', 1 ); + C.Style = ERenderStyle.STY_Normal; + + if( Level.TimeSeconds - OwnerStats.IndicatorStartShow > 2 ) + { + OwnerStats.IndicatorVisibility = 0; + } +} + +function SmartCTFShowScores( Canvas C ) + { + local int ID, i, j, Time, AvgPing, AvgPL, TotSB, TotAmp; + local float Eff; + local int RedY, BlueY, X, Y; + local float Nil, DummyX, DummyY, SizeX, SizeY, Buffer, Size; + local byte LabelDrawn[2], Rendered[2]; + local Color TeamColor, TempColor; + local string TempStr; + local SmartCTFPlayerReplicationInfo PlayerStats, PlayerStats2; + local int FlagShift; /* shifting elements to fit a flag */ + local Texture TmpTexture; + + if( Level.TimeSeconds - LastSortTime > 0.5 ) + { + SortScores( 32 ); + RecountNumbers(); + InitStatBoardConstPos( C ); + CompressStatBoard( C ); + LastSortTime = Level.TimeSeconds; + } + + Y = int( StartY ); + RedY = Y; + BlueY = Y; + + C.Style = ERenderStyle.STY_Normal; + + // FOR EACH PLAYER DRAW INFO + for( i = 0; i < 32; i++ ) + { + if( Ordered[i] == None ) break; + PlayerStats = SCTFGame.GetStatsByPRI( Ordered[i] ); + if( PlayerStats == None ) continue; + + // Get the ID of the ith player + ID = Ordered[i].PlayerID; + + // set the pos depending on Team + if( Ordered[i].Team == 0 ) + { + X = RedStartX; + Y = RedY; + TeamColor = RedTeamColor; + } + else + { + X = BlueStartX; + Y = BlueY; + TeamColor = BlueTeamColor; + } + C.DrawColor = TeamColor; + + if( LabelDrawn[Ordered[i].Team] == 0 ) + { + // DRAW THE Team SCORES with the cool Flag icons (masked because of black borders) + + C.bNoSmooth = False; + C.Font = PlayerNameFont; + C.Style = ERenderStyle.STY_Translucent; + if( Ordered[i].Team == 0 ) C.DrawColor = RedHeaderColor; + else C.DrawColor = BlueHeaderColor; + C.StrLen( PtsText, SizeX, SizeY ); + C.Style = ERenderStyle.STY_Modulated; + C.SetPos( X - ShadingSpacingX, Y - HeaderShadingSpacingY ); + C.DrawRect( texture'shade', ColumnWidth + ( ShadingSpacingX * 2 ) , SizeY + ( HeaderShadingSpacingY * 2 ) ); + C.Style = ERenderStyle.STY_Translucent; + C.SetPos( X - ShadingSpacingX, Y - HeaderShadingSpacingY ); + if( Ordered[i].Team == 0 ) C.DrawPattern( texture'redskin2', ColumnWidth + ( ShadingSpacingX * 2 ) , SizeY + ( HeaderShadingSpacingY * 2 ) , 1 ); + else C.DrawPattern( texture'blueskin2', ColumnWidth + ( ShadingSpacingX * 2 ) , SizeY + ( HeaderShadingSpacingY * 2 ) , 1 ); + + C.Style = ERenderStyle.STY_Modulated; + C.SetPos( X - ShadingSpacingX, Y + SizeY + HeaderShadingSpacingY ); + C.DrawRect( texture'shade', ColumnWidth + ( ShadingSpacingX * 2 ) , ColumnHeight + ( ColumnShadingSpacingY * 2 ) ); + + C.Style = ERenderStyle.STY_Translucent; + C.DrawColor = TeamColor; + C.SetPos( X, Y - ( ( 32 - SizeY ) / 2 ) ); // Y - 4 + if( Ordered[i].Team == 0 ) C.DrawIcon( texture'I_TeamR', 0.5 ); + else C.DrawIcon( texture'I_TeamB', 0.5 ); + + C.Font = CapFont; + C.StrLen( int( pTGRI.Teams[Ordered[i].Team].Score ), DummyX, DummyY ); + C.Style = ERenderStyle.STY_Normal; + C.SetPos( X + StatIndent, Y - ( ( DummyY - SizeY ) / 2 ) ); + C.DrawText( int( pTGRI.Teams[Ordered[i].Team].Score ) ); + + //Draw the Frags/Pts text + C.Font = PlayerNameFont; + C.SetPos( X + ColumnWidth - SizeX, Y ); + C.DrawText( PtsText ); + C.Font = FragsFont; + C.StrLen( FragsText $ SepText, Buffer, Nil ); + C.SetPos( X + ColumnWidth - SizeX - Buffer, Y ); + C.DrawText( FragsText $ SepText ); + + C.DrawColor = HeaderTinyInfoColor; + C.Font = TinyInfoFont; + C.StrLen( "TEST", Nil, DummyY ); + C.SetPos( X + StatIndent + DummyX + 2 * StatsHorSpacing, Y + ( SizeY - DummyY * 2 ) / 2 ); + Time = Max( 1, Level.TimeSeconds / 60 ); + AvgPing = 0; + AvgPL = 0; + TotSB = 0; + TotAmp = 0; + for( j = 0; j < 32; j++ ) + { + if( Ordered[j] == None ) break; + if( Ordered[j].Team == Ordered[i].Team ) + { + PlayerStats2 = SCTFGame.GetStatsByPRI( Ordered[j] ); + if( PlayerStats2 == None ) continue; + AvgPing += Ordered[j].Ping; + AvgPL += Ordered[j].PacketLoss; + TotSB += PlayerStats2.ShieldBelts; + TotAmp += PlayerStats2.Amps; + } + } + if( pTGRI.Teams[Ordered[i].Team].Size != 0 ) + { + AvgPing = AvgPing / pTGRI.Teams[Ordered[i].Team].Size; + AvgPL = AvgPL / pTGRI.Teams[Ordered[i].Team].Size; + } + if( TotShieldBelts == 0 ) TotSB = 0; + else TotSB = Clamp( float( TotSB ) / float( TotShieldBelts ) * 100, 0, 100 ); + if( TotAmps == 0 ) TotAmp = 0; + else TotAmp = Clamp( float( TotAmp ) / float( TotAmps ) * 100, 0, 100 ); + TempStr = "PING:" $ AvgPing $ " PL:" $ AvgPL $ "%"; + C.DrawText( TempStr ); + C.SetPos( X + StatIndent + DummyX + 2 * StatsHorSpacing, Y + ( SizeY - DummyY * 2 ) / 2 + DummyY ); + TempStr = "TM:" $ Time; + if( TotSB != 0 ) TempStr = TempStr @ "SB:" $ TotSB $ "%"; + if( TotAmp != 0 ) TempStr = TempStr @ "AM:" $ TotAmp $ "%"; + C.DrawText( TempStr ); + + C.bNoSmooth = True; + + Y += SizeY + HeaderShadingSpacingY + ColumnShadingSpacingY; + LabelDrawn[Ordered[i].Team] = 1; + } + + C.Font = FooterFont; + C.StrLen( "Test", Nil, DummyY ); + if( LabelDrawn[Ordered[i].Team] != 2 && ( Y + NameHeight + StatBlockHeight + StatBlockSpacing > C.ClipY - DummyY * 5 ) ) + { + + C.DrawColor = TeamColor; + C.StrLen( MoreText , Size, DummyY ); + if( Ordered[i].Team == 1 ) C.SetPos( X + ColumnWidth - Size, C.ClipY - DummyY * 5 ); + else C.SetPos( X, C.ClipY - DummyY * 5 ); + C.DrawText( "[" @ pTGRI.Teams[Ordered[i].Team].Size - Rendered[Ordered[i].Team] @ MoreText @ "]" ); + LabelDrawn[Ordered[i].Team] = 2; // "More" label also drawn + } + + else if( LabelDrawn[Ordered[i].Team] != 2 ) + { + + // Draw the face + if( Ordered[i].HasFlag == None ) + { + C.bNoSmooth = False; + C.DrawColor = White; + C.Style = ERenderStyle.STY_Translucent; + C.SetPos( X, Y ); + if( SCTFGame.bStatsDrawFaces && Ordered[i].TalkTexture != None ) C.DrawIcon( Ordered[i].TalkTexture, 0.5 ); + else C.DrawIcon( texture'faceless', 0.5 ); + C.SetPos( X, Y ); + C.DrawColor = DarkGray; + C.DrawIcon( texture'IconSelection', 1 ); + C.Style = ERenderStyle.STY_Normal; + C.bNoSmooth = True; + } + + // Draw the player name + C.SetPos( X + StatIndent, Y ); + + C.Font = PlayerNameFont; + if( Ordered[i].bAdmin ) C.DrawColor = White; + else if( Ordered[i].PlayerID == pPRI.PlayerID ) C.DrawColor = Yellow; + else C.DrawColor = TeamColor; + TempColor = C.DrawColor; + C.DrawText( Ordered[i].PlayerName ); + C.StrLen( Ordered[i].PlayerName, Size, Buffer ); + + C.DrawColor = TinyInfoColor; + C.Font = TinyInfoFont; + C.StrLen( "TEST", Buffer, DummyY ); + + // Draw Time, Eff, HS, SB, Amp + C.SetPos( X + StatIndent + Size + StatsHorSpacing, Y + ( NameHeight - DummyY * 2 ) / 2 ); + TempStr = ""; + if( PlayerStats.HeadShots != 0 ) TempStr = TempStr $ "HS:" $ PlayerStats.HeadShots; + if( PlayerStats.ShieldBelts != 0 ) TempStr = TempStr @ "SB:" $ PlayerStats.ShieldBelts; + if( PlayerStats.Amps != 0 ) TempStr = TempStr @ "AM:" $ PlayerStats.Amps; + if( Left( TempStr, 1 ) == " " ) TempStr = Mid( TempStr, 1 ); + C.DrawText( TempStr ); + Time = Max( 1, ( Level.TimeSeconds + pPRI.StartTime - Ordered[i].StartTime ) / 60 ); + if( PlayerStats.Frags + Ordered[i].Deaths == 0 ) Eff = 0; + else Eff = ( PlayerStats.Frags / ( PlayerStats.Frags + Ordered[i].Deaths ) ) * 100; + C.SetPos( X + StatIndent + Size + StatsHorSpacing, Y + ( NameHeight - DummyY * 2 ) / 2 + DummyY ); + C.DrawText( "TM:" $ Time $ " EFF:" $ Clamp( int( Eff ), 0, 100 ) $ "%" ); + + // Draw the country flag + if(PlayerStats.CountryPrefix != "") + { + C.SetPos( X, Y + StatIndent - 16); + C.bNoSmooth = False; + C.DrawColor = White; + //C.DrawIcon(FD[GetFlagIndex(PlayerStats.CountryPrefix)].Tex, 1.0); + TmpTexture = FD[GetFlagIndex(PlayerStats.CountryPrefix)].Tex; + C.DrawIcon(TmpTexture, 32 / float(TmpTexture.VSize)); + FlagShift=12; + C.bNoSmooth = True; + } + else + { + FlagShift=0; + } + // Draw Bot or Ping/PL + C.SetPos( X, Y + StatIndent + FlagShift); + if( Ordered[i].bIsABot ) + { + C.DrawText( "BOT" ); + if( Ordered[i].Team == pPRI.Team ) + { + C.SetPos( X, Y + StatIndent + DummyY); + C.DrawText( Left( string( BotReplicationInfo( Ordered[i] ).RealOrders ) , 3 ) ); + } + } + else + { + C.DrawColor = HeaderTinyInfoColor; + TempStr = "PI:" $ Ordered[i].Ping; + if( Len( TempStr ) > 5 ) TempStr = "P:" $ Ordered[i].Ping; + if( Len( TempStr ) > 5 ) TempStr = string( Ordered[i].Ping ); + C.DrawText( TempStr ); + C.SetPos( X, Y + StatIndent + DummyY + FlagShift); + TempStr = "PL:" $ Ordered[i].PacketLoss $ "%"; + if( Len( TempStr ) > 5 ) TempStr = "L:" $ Ordered[i].PacketLoss $ "%"; + if( Len( TempStr ) > 5 ) TempStr = "L:" $ Ordered[i].PacketLoss; + if( Len( TempStr ) > 5 ) TempStr = Ordered[i].PacketLoss $ "%"; + C.DrawText( TempStr ); + } + + // Draw the Flag if he has Flag + if( Ordered[i].HasFlag != None ) + { + C.DrawColor = White; + C.SetPos( X, Y ); + if( Ordered[i].HasFlag.IsA( 'GreenFlag' ) ) C.DrawIcon( texture'GreenFlag', 1 ); + else if( Ordered[i].HasFlag.IsA( 'YellowFlag' ) ) C.DrawIcon( texture'YellowFlag', 1 ); + else if( Ordered[i].Team == 0 ) C.DrawIcon( texture'BlueFlag', 1 ); + else C.DrawIcon( texture'RedFlag', 1 ); + } // End if he has Flag + + C.Font = PlayerNameFont; + C.DrawColor = TempColor; + + // Draw Frag/Score + C.StrLen( int( Ordered[i].Score ), Size, DummyY ); + C.SetPos( X + ColumnWidth - Size, Y ); + C.DrawText( int( Ordered[i].Score ) ); + + C.Font = FragsFont; + C.StrLen( PlayerStats.Frags $ SepText, Buffer, SizeY ); + C.SetPos( X + ColumnWidth - Size - Buffer, Y ); + C.DrawText( PlayerStats.Frags $ SepText ); + + Y += NameHeight; + + // Set the Font for the stat drawing + C.Font = StatFont; + + if( RowColState == 1 ) + { + DrawStatType( C, X, Y, 1, 1, "Caps: ", PlayerStats.Captures, MaxCaps ); + DrawStatType( C, X, Y, 1, 2, "Assists: ", PlayerStats.Assists, MaxAssists ); + DrawStatType( C, X, Y, 1, 3, "Grabs: ", PlayerStats.Grabs, MaxGrabs ); + if(SCTFGame.bExtraStats) + { + if( bSealsOrDefs) { + DrawStatType( C, X, Y, 2, 2, "DefKills: ", PlayerStats.DefKills, MaxDefKills ); + DrawStatType( C, X, Y, 2, 1, "Covers: ", PlayerStats.Covers, MaxCovers ); + } + else { + DrawStatType( C, X, Y, 2, 2, "Seals: ", PlayerStats.Seals, MaxSeals ); + DrawStatType( C, X, Y, 2, 1, "Deaths: ", Ordered[i].Deaths, MaxDeaths ); + } + } + else + { + DrawStatType( C, X, Y, 2, 1, "Covers: ", PlayerStats.Covers, MaxCovers ); + if( MaxSeals > 0 ) DrawStatType( C, X, Y, 2, 2, "Seals: ", PlayerStats.Seals, MaxSeals ); + else DrawStatType( C, X, Y, 2, 2, "Deaths: ", Ordered[i].Deaths, MaxDeaths ); + } + DrawStatType( C, X, Y, 2, 3, "FlagKls: ", PlayerStats.FlagKills, MaxFlagKills ); + } + else + { + DrawStatType( C, X, Y, 1, 1, "Caps: ", PlayerStats.Captures, MaxCaps ); + DrawStatType( C, X, Y, 2, 1, "Grabs: ", PlayerStats.Grabs, MaxGrabs ); + + if(SCTFGame.bExtraStats) + { + if( bSealsOrDefs) { + DrawStatType( C, X, Y, 2, 2, "DefKills: ", PlayerStats.DefKills, MaxDefKills ); + DrawStatType( C, X, Y, 1, 2, "Covers: ", PlayerStats.Covers, MaxCovers ); + } + else { + DrawStatType( C, X, Y, 2, 2, "Seals: ", PlayerStats.Seals, MaxSeals ); + DrawStatType( C, X, Y, 1, 2, "Deaths: ", Ordered[i].Deaths, MaxDeaths ); + } + } + else + { + DrawStatType( C, X, Y, 1, 2, "Covers: ", PlayerStats.Covers, MaxCovers ); + if( MaxSeals > 0 ) DrawStatType( C, X, Y, 2, 2, "Seals: ", PlayerStats.Seals, MaxSeals ); + else DrawStatType( C, X, Y, 2, 2, "Deaths: ", Ordered[i].Deaths, MaxDeaths ); + } + DrawStatType( C, X, Y, 3, 1, "Assists: ", PlayerStats.Assists, MaxAssists ); + DrawStatType( C, X, Y, 3, 2, "FlagKls: ", PlayerStats.FlagKills, MaxFlagKills ); + } + + Y += StatBlockHeight + StatBlockSpacing; + } + + // Alter the RedY or BlueY and do next player + if( Ordered[i].Team == 0 ) RedY = Y; + else BlueY = Y; + Rendered[Ordered[i].Team]++; + + } //End of PRI for loop + +DrawHeader( C ); +DrawFooters( C ); +} + +function InitStatBoardConstPos( Canvas C ) +{ + local float Nil, LeftSpacingPercent, MidSpacingPercent, RightSpacingPercent; + + CapFont = Font'LEDFont2'; //Font( DynamicLoadObject( "UWindowFonts.UTFont40", class'Font' ) ); + FooterFont = MyFonts.GetSmallestFont( C.ClipX ); + GameEndedFont = MyFonts.GetHugeFont( C.ClipX ); + PlayerNameFont = MyFonts.GetBigFont( C.ClipX ); + TinyInfoFont = C.SmallFont; + + if( PlayerNameFont == PtsFont22 ) FragsFont = PtsFont18; + else if( PlayerNameFont == PtsFont20 ) FragsFont = PtsFont18; + else if( PlayerNameFont == PtsFont18 ) FragsFont = PtsFont14; + else if( PlayerNameFont == PtsFont16 ) FragsFont = PtsFont12; + else FragsFont = font'SmallFont'; + + C.Font = PlayerNameFont; + C.StrLen( "Player", Nil, NameHeight ); + + StartY = ( 120.0 / 1024.0 ) * C.ClipY; + ColorChangeSpeed = 100; // Influences how 'fast' the color changes from white to green. Higher = faster. + + LeftSpacingPercent = 0.075; + MidSpacingPercent = 0.15; + RightSpacingPercent = 0.075; + RedStartX = LeftSpacingPercent * C.ClipX; + ColumnWidth = ( ( 1 - LeftSpacingPercent - MidSpacingPercent - RightSpacingPercent ) / 2 * C.ClipX ); + BlueStartX = RedStartX + ColumnWidth + ( MidSpacingPercent * C.ClipX ); + ShadingSpacingX = ( 10.0 / 1024.0 ) * C.ClipX; + HeaderShadingSpacingY = ( 32 - NameHeight ) / 2 + ( ( 4.0 / 1024.0 ) * C.ClipX ); + ColumnShadingSpacingY = ( 10.0 / 1024.0 ) * C.ClipX; + + StatsHorSpacing = ( 5.0 / 1024.0 ) * C.ClipX; + StatIndent = ( 32 + StatsHorSpacing ); // For face + flag icons + + InitStatBoardDynamicPos( C ); +} + +function InitStatBoardDynamicPos( Canvas C , optional int Rows , optional int Cols , optional Font NewStatFont , optional float LineSpacing , optional float BlockSpacing ) +{ + if( Rows == 0 ) Rows = 3; + if( Cols == 0 ) Cols = 2; + if( LineSpacing == 0 ) LineSpacing = 0.9; + if( BlockSpacing == 0 ) BlockSpacing = 1; + + if( Rows == 2 && Cols == 3 ) RowColState = 1; + else RowColState = 0; + + StatWidth = ( ( ColumnWidth - StatIndent ) / Cols ) - ( StatsHorSpacing * ( Cols - 1 ) ); + + if( NewStatFont == None ) StatFont = MyFonts.GetSmallestFont( C.ClipX ); + else StatFont = NewStatFont; + C.Font = StatFont; + C.StrLen( "FlagKls: 00", StatsTextWidth, StatHeight ); + + MaxMeterWidth = StatWidth - StatsTextWidth - StatsHorSpacing; + StatLineHeight = StatHeight * LineSpacing; + MeterHeight = Max( 1, StatLineHeight * 0.3 ); + StatBlockSpacing = StatLineHeight * BlockSpacing; + + StatBlockHeight = Rows * StatLineHeight; + + if( pTGRI.Teams[0].Size > pTGRI.Teams[1].Size ) + ColumnHeight = pTGRI.Teams[0].Size * ( NameHeight + StatBlockHeight + StatBlockSpacing ) - StatBlockSpacing; + else + ColumnHeight = pTGRI.Teams[1].Size * ( NameHeight + StatBlockHeight + StatBlockSpacing ) - StatBlockSpacing; +} + +function CompressStatBoard( Canvas C , optional int Level ) +{ + local float EndY, Nil, DummyY; + + C.Font = FooterFont; + C.StrLen( "Test", Nil, DummyY ); + + EndY = StartY + ColumnHeight + ( ColumnShadingSpacingY * 2 ) + NameHeight + HeaderShadingSpacingY; + if( EndY > C.ClipY - DummyY * 5 ) + { + if( Level == 0 ) + { + InitStatBoardDynamicPos( C, , , , 0.8 ); + } + else if( Level == 1 ) + { + InitStatBoardDynamicPos( C, 2, 3 ); + } + else if( Level == 2 ) + { + InitStatBoardDynamicPos( C, 2, 3, Font( DynamicLoadObject( "UWindowFonts.Tahoma10", class'Font' ) ) , 1.0 , 1.0 ); + } + else + { + // We did all the compression we can do. Draw 'More' labels later. + // First find the columnheight for the amount of players that fit on it. + ColumnHeight = int( ( C.ClipY - ( EndY - ColumnHeight ) - DummyY * 5 + StatBlockSpacing ) / ( NameHeight + StatBlockHeight + StatBlockSpacing ) ) + * ( NameHeight + StatBlockHeight + StatBlockSpacing ) - StatBlockSpacing; + return; + } + // Did some compression, see if we need more. + CompressStatBoard( C , Level + 1 ); + } + // No compression at all or no more compression needed. + return; +} + +/* + * Draw a specific stat + * X, Y = Upper left corner of stats ( row,col: 1,1) +*/ +function DrawStatType( Canvas C, int X, int Y, int Row, int Col, string Label, int Count, int Total ) +{ + local float Size, DummyY; + local int ColorChange, M; + + X += StatIndent + ( ( StatWidth + StatsHorSpacing ) * ( Col - 1 ) ); + Y += ( StatLineHeight * ( Row - 1 ) ); + + C.DrawColor = StatsColor; + C.SetPos( X, Y ); + C.DrawText( Label ); + C.StrLen( Count, Size, DummyY ); + C.SetPos( X + StatsTextWidth - Size, Y ); + C.DrawText( Count ); //text + if( Count > 0 ) + { + ColorChange = ColorChangeSpeed * loge( Count ); + if( ColorChange > 255 ) ColorChange = 255; + C.DrawColor.R = StatsColor.R - ColorChange; + C.DrawColor.B = StatsColor.B - ColorChange; + } + M = GetMeterLength( Count, Total ); + C.SetPos( X + StatsTextWidth + StatsHorSpacing, Y + ( ( StatHeight - MeterHeight ) / 2 ) ); + C.DrawRect( texture'meter', M, MeterHeight ); //meter +} + +function DrawFooters( Canvas C ) +{ + local float DummyX, DummyY, Nil; + local string TextStr; + local string TimeStr; + local int Hours, Minutes, Seconds, i; + local PlayerReplicationInfo PRI; + local color specColor; + + C.bCenter = True; + C.Font = FooterFont; + + // Display server info in bottom center + C.DrawColor = FooterColor; + C.StrLen( "Test", DummyX, DummyY ); + C.SetPos( 0, C.ClipY - DummyY ); + TextStr = "Playing" @ Level.Title @ "on" @ pTGRI.ServerName; + if( SCTFGame.TickRate > 0 ) TextStr = TextStr @ "(TR:" @ SCTFGame.TickRate $ ")"; + C.DrawText( TextStr ); + + // Draw Time + if( bTimeDown || ( PlayerOwner.GameReplicationInfo.RemainingTime > 0 ) ) + { + bTimeDown = True; + if( PlayerOwner.GameReplicationInfo.RemainingTime <= 0 ) + { + TimeStr = RemainingTime $ "00:00"; + } + else + { + Minutes = PlayerOwner.GameReplicationInfo.RemainingTime / 60; + Seconds = PlayerOwner.GameReplicationInfo.RemainingTime % 60; + TimeStr = RemainingTime $ TwoDigitString( Minutes ) $ ":" $ TwoDigitString( Seconds ); + } + } + else + { + Seconds = PlayerOwner.GameReplicationInfo.ElapsedTime; + Minutes = Seconds / 60; + Hours = Minutes / 60; + Seconds = Seconds - ( Minutes * 60 ); + Minutes = Minutes - ( Hours * 60 ); + TimeStr = ElapsedTime $ TwoDigitString( Hours ) $ ":" $ TwoDigitString( Minutes ) $ ":" $ TwoDigitString( Seconds ); + } + + if(SCTFGame.bShowSpecs){ + for ( i=0; i<32; i++ ) + { + if (PlayerPawn(Owner).GameReplicationInfo.PRIArray[i] != None) + { + PRI = PlayerPawn(Owner).GameReplicationInfo.PRIArray[i]; + if (PRI.bIsSpectator && !PRI.bWaitingPlayer && PRI.StartTime > 0) + { + if(HeaderText=="") HeaderText = pri.Playername; else HeaderText = HeaderText$", "$pri.Playername; + } + } + } + if (HeaderText=="") HeaderText = "there is currently no one spectating this match."; else HeaderText = HeaderText$"."; // I'm sorry about this, it's really stupid + } // but I'm to lazy rewrite it :P + // Atleast it's working.. + C.SetPos( 0, C.ClipY - 2 * DummyY ); + C.DrawText( "Current Time:" @ GetTimeStr() @ "|" @ TimeStr ); + + // Draw Spectators + C.StrLen( HeaderText, DummyX, Nil ); + C.Style = ERenderStyle.STY_Normal; + C.SetPos( 0, C.ClipY - 5 * DummyY ); + + if(SCTFGame.bShowSpecs){ + specColor = SCTFGame.SpectatorColor; + C.Font = MyFonts.GetSmallestFont(C.ClipX); + C.DrawColor = specColor; // Added in 4E + C.DrawText("Spectators:"@HeaderText); + HeaderText=""; // This is declared as a global var, so we reset it to start with a clean slate. + }else{ + C.DrawText( "" ); // Don't draw credits 2 times + } + + // Draw new-credits + C.StrLen( HeaderText2, DummyX, DummyY ); + C.Style = ERenderStyle.STY_Normal; + C.SetPos( 0, C.ClipY - 3 * DummyY ); + C.Font = MyFonts.GetSmallestFont(C.ClipX); + C.DrawColor = Yellow; + C.DrawText( HeaderText2 ); + + C.bCenter = False; +} + +function DrawHeader( Canvas C ) +{ + local float DummyX, DummyY; + + if( pTGRI.GameEndedComments == "" ) return; + + C.Font = GameEndedFont; + C.StrLen( pTGRI.GameEndedComments, DummyX, DummyY ); + + C.DrawColor = DarkGray; + C.Style = ERenderStyle.STY_Translucent; + C.SetPos( C.ClipX / 2 - DummyX / 2 + 2, DummyY + 2 ); + C.DrawText( pTGRI.GameEndedComments ); + + C.DrawColor = HeaderColor; + C.Style = ERenderStyle.STY_Normal; + C.SetPos( C.ClipX / 2 - DummyX / 2, DummyY ); + C.DrawText( pTGRI.GameEndedComments ); +} + +/* + * Returns time and date in a string. +*/ +function string GetTimeStr() +{ + local string Mon, Day, Min; + + Min = string( PlayerOwner.Level.Minute ); + if( int( Min ) < 10 ) Min = "0" $ Min; + + switch( PlayerOwner.Level.month ) + { + case 1: Mon = "Jan"; break; + case 2: Mon = "Feb"; break; + case 3: Mon = "Mar"; break; + case 4: Mon = "Apr"; break; + case 5: Mon = "May"; break; + case 6: Mon = "Jun"; break; + case 7: Mon = "Jul"; break; + case 8: Mon = "Aug"; break; + case 9: Mon = "Sep"; break; + case 10: Mon = "Oct"; break; + case 11: Mon = "Nov"; break; + case 12: Mon = "Dec"; break; + } + + switch( PlayerOwner.Level.dayOfWeek ) + { + case 0: Day = "Sunday"; break; + case 1: Day = "Monday"; break; + case 2: Day = "Tuesday"; break; + case 3: Day = "Wednesday"; break; + case 4: Day = "Thursday"; break; + case 5: Day = "Friday"; break; + case 6: Day = "Saturday"; break; + } + + return Day @ PlayerOwner.Level.Day @ Mon @ PlayerOwner.Level.Year $ "," @ PlayerOwner.Level.Hour $ ":" $ Min; +} + +/* + * Length of a meter drawing for a given number A out of B total. +*/ +function int GetMeterLength( int A, int B ) +{ + local int Result; + + if( B == 0 ) return 0; + Result = ( A * MaxMeterWidth ) / B; + + if( Result > MaxMeterWidth ) return MaxMeterWidth; + else return Result; +} + +/* + * Sort PlayerReplicationInfo's on score. +*/ +function SortScores( int N ) +{ + local byte i, j; + local bool bSorted; + local SmartCTFPlayerReplicationInfo PlayerStats1, PlayerStats2; + + // Copy PRI array except for spectators. + j = 0; + for( i = 0; i < N; i++ ) + { + if( pTGRI.priArray[i] == None ) break; + if( pTGRI.priArray[i].bIsSpectator && !pTGRI.priArray[i].bWaitingPlayer ) continue; + Ordered[j] = pTGRI.priArray[i]; + j++; + } + // Clear the remaining entries. + for( i = j; i < N; i++ ) + { + Ordered[i] = None; + } + + for( i = 0; i < N; i++) + { + bSorted = True; + for( j = 0; j < N - 1; j++) + { + if( Ordered[j] == None || Ordered[j+1] == None ) break; + + if( Ordered[j].Score < Ordered[j+1].Score ) + { + SwapOrdered( j, j + 1 ); + bSorted = False; + } + else if( Ordered[j].Score == Ordered[j+1].Score ) + { + PlayerStats1 = SCTFGame.GetStatsByPRI( Ordered[j] ); + PlayerStats2 = SCTFGame.GetStatsByPRI( Ordered[j+1] ); + if( PlayerStats1 != None && PlayerStats2 != None ) + { + if( PlayerStats1.Frags < PlayerStats2.Frags ) + { + SwapOrdered( j, j + 1 ); + bSorted = False; + } + else if( PlayerStats1.Frags == PlayerStats2.Frags ) + { + if( Ordered[j].Deaths > Ordered[j+1].Deaths ) + { + SwapOrdered( j, j + 1 ); + bSorted = False; + } + } + } + } + } + if( bSorted ) break; + } +} + +/* + * Used for sorting. +*/ +function SwapOrdered( byte A, byte B ) +{ + local PlayerReplicationInfo Temp; + Temp = Ordered[A]; + Ordered[A] = Ordered[B]; + Ordered[B] = Temp; +} + +/* + * Recalculate the totals for displaying meters on the scoreboards. + * This way it doesn't get calculated every tick. +*/ +function RecountNumbers() +{ + local byte ID, i; + local SmartCTFPlayerReplicationInfo PlayerStats; + + MaxCaps = 0; + MaxAssists = 0; + MaxGrabs = 0; + MaxCovers = 0; + MaxSeals = 0; + MaxDefKills = 0; + MaxFlagKills = 0; + MaxFrags = 0; + MaxDeaths = 0; + TotShieldBelts = 0; + TotAmps = 0; + + for( i = 0; i < 32; i++ ) + { + if( Ordered[i] == None ) break; + if( Ordered[i].bIsSpectator && !Ordered[i].bWaitingPlayer ) continue; + + ID = Ordered[i].PlayerID; + + PlayerStats = SCTFGame.GetStatsByPRI( Ordered[i] ); + if( PlayerStats != None ) + { + if( PlayerStats.Captures > MaxCaps ) MaxCaps = PlayerStats.Captures; + if( PlayerStats.Assists > MaxAssists ) MaxAssists = PlayerStats.Assists; + if( PlayerStats.Grabs > MaxGrabs ) MaxGrabs = PlayerStats.Grabs; + if( PlayerStats.Covers > MaxCovers ) MaxCovers = PlayerStats.Covers; + if( PlayerStats.Seals > MaxSeals ) MaxSeals = PlayerStats.Seals; + if( PlayerStats.DefKills > MaxDefKills ) MaxDefKills = PlayerStats.DefKills; + if( PlayerStats.FlagKills > MaxFlagKills ) MaxFlagKills = PlayerStats.FlagKills; + if( PlayerStats.Frags > MaxFrags ) MaxFrags = PlayerStats.Frags; + TotShieldBelts += PlayerStats.ShieldBelts; + TotAmps += PlayerStats.Amps; + } + if( Ordered[i].Deaths > MaxDeaths ) MaxDeaths = Ordered[i].Deaths; + } +} + +defaultproperties +{ + NormalScoreBoard=None + SCTFGame=None + OwnerStats=None + TryCount=0 + PlayerOwner=None + PtsText="Pts" + FragsText="Frags" + SepText=" / " + MoreText="More..." + HeaderText="" + HeaderText2="[ SmartCTF 4E | {PiN}Kev | {DnF2}SiNiSTeR | [es]Rush | adminthis & The_Cowboy & Sp0ngeb0b ]" + LastSortTime=0 + MaxMeterWidth=0 + ColorChangeSpeed=0 + RowColState=0 + White=(R=255,G=255,B=255,A=0) + Gray=(R=128,G=128,B=128,A=0) + DarkGray=(R=32,G=32,B=32,A=0) + Yellow=(R=255,G=255,B=0,A=0) + RedTeamColor=(R=255,G=0,B=0,A=0) + BlueTeamColor=(R=0,G=128,B=255,A=0) + RedHeaderColor=(R=64,G=0,B=0,A=0) + BlueHeaderColor=(R=0,G=32,B=64,A=0) + StatsColor=(R=255,G=255,B=255,A=0) + FooterColor=(R=255,G=255,B=255,A=0) + HeaderColor=(R=255,G=255,B=0,A=0) + TinyInfoColor=(R=128,G=128,B=128,A=0) + HeaderTinyInfoColor=(R=192,G=192,B=192,A=0) + StatsTextWidth=0.000000 + StatHeight=0.000000 + MeterHeight=0.000000 + NameHeight=0.000000 + ColumnHeight=0.000000 + StatBlockHeight=0.000000 + RedStartX=0.000000 + BlueStartX=0.000000 + ColumnWidth=0.000000 + StatWidth=0.000000 + StatsHorSpacing=0.000000 + ShadingSpacingX=0.000000 + HeaderShadingSpacingY=0.000000 + ColumnShadingSpacingY=0.000000 + StartY=0.000000 + StatLineHeight=0.000000 + StatBlockSpacing=0.000000 + StatIndent=0.000000 + pTGRI=None + pPRI=None + StatFont=None + CapFont=None + FooterFont=None + GameEndedFont=None + PlayerNameFont=None + FragsFont=None + TinyInfoFont=None + PtsFont22=None + PtsFont20=None + PtsFont18=None + PtsFont16=None + PtsFont14=None + PtsFont12=None + MaxCaps=0 + MaxAssists=0 + MaxGrabs=0 + MaxCovers=0 + MaxSeals=0 + MaxDefKills=0 + MaxFlagKills=0 + MaxFrags=0 + MaxDeaths=0 + TotShieldBelts=0 + TotAmps=0 + bSealsOrDefs=False + bStarted=False + bEndHandled=False + FD(0)=(Prefix="",Tex=None) + FD(1)=(Prefix="",Tex=None) + FD(2)=(Prefix="",Tex=None) + FD(3)=(Prefix="",Tex=None) + FD(4)=(Prefix="",Tex=None) + FD(5)=(Prefix="",Tex=None) + FD(6)=(Prefix="",Tex=None) + FD(7)=(Prefix="",Tex=None) + FD(8)=(Prefix="",Tex=None) + FD(9)=(Prefix="",Tex=None) + FD(10)=(Prefix="",Tex=None) + FD(11)=(Prefix="",Tex=None) + FD(12)=(Prefix="",Tex=None) + FD(13)=(Prefix="",Tex=None) + FD(14)=(Prefix="",Tex=None) + FD(15)=(Prefix="",Tex=None) + FD(16)=(Prefix="",Tex=None) + FD(17)=(Prefix="",Tex=None) + FD(18)=(Prefix="",Tex=None) + FD(19)=(Prefix="",Tex=None) + FD(20)=(Prefix="",Tex=None) + FD(21)=(Prefix="",Tex=None) + FD(22)=(Prefix="",Tex=None) + FD(23)=(Prefix="",Tex=None) + FD(24)=(Prefix="",Tex=None) + FD(25)=(Prefix="",Tex=None) + FD(26)=(Prefix="",Tex=None) + FD(27)=(Prefix="",Tex=None) + FD(28)=(Prefix="",Tex=None) + FD(29)=(Prefix="",Tex=None) + FD(30)=(Prefix="",Tex=None) + FD(31)=(Prefix="",Tex=None) + saveindex=0 + } + \ No newline at end of file diff --git a/Sources/Classes/SmartCTFServerActor.uc b/Classes/SmartCTFServerActor.UC similarity index 95% rename from Sources/Classes/SmartCTFServerActor.uc rename to Classes/SmartCTFServerActor.UC index 521a38c..dfe60dc 100644 --- a/Sources/Classes/SmartCTFServerActor.uc +++ b/Classes/SmartCTFServerActor.UC @@ -1,16 +1,16 @@ -class SmartCTFServerActor expands Actor; - -function PostBeginPlay() -{ - if( CTFGame( Level.Game ) != None ) - { - Log( "ServerActor, Spawning and adding Mutator...", 'SmartCTF' ); - Level.Game.BaseMutator.AddMutator( Level.Game.Spawn( class'SmartCTF' ) ); - } - Destroy(); -} - -defaultproperties -{ - bHidden=True -} +class SmartCTFServerActor expands Actor; + +function PostBeginPlay() +{ + if( CTFGame( Level.Game ) != None ) + { + Log( "ServerActor, Spawning and adding Mutator...", 'SmartCTF' ); + Level.Game.BaseMutator.AddMutator( Level.Game.Spawn( class'SmartCTF' ) ); + } + Destroy(); +} + +defaultproperties +{ + bHidden=True +} diff --git a/Sources/Classes/SmartCTFServerInfo.uc b/Classes/SmartCTFServerInfo.UC similarity index 96% rename from Sources/Classes/SmartCTFServerInfo.uc rename to Classes/SmartCTFServerInfo.UC index eb4c2aa..3c1e1f2 100644 --- a/Sources/Classes/SmartCTFServerInfo.uc +++ b/Classes/SmartCTFServerInfo.UC @@ -1,375 +1,375 @@ -class SmartCTFServerInfo expands ServerInfoCTF; - -var SmartCTFGameReplicationInfo SCTFGame; -var PlayerPawn PlayerOwner; -var string MapNameText; -var bool bFontUpdated; -var float LastUpdateTime; -var float HeaderHeight, CatHeight, TextHeight, SmallTextHeight, VSpacing, BorderSpacing, TotalHeight; -var float StartY, Y, SideSpacing; -var Color HeaderBlue, TextBlue, InfoWhite; - -function PostBeginPlay() -{ - if( SCTFGame == None ) - { - ForEach AllActors( class'SmartCTFGameReplicationInfo', SCTFGame ) break; - } - - super.PostBeginPlay(); -} - -function RenderInfo( Canvas C ) -{ - local float XL; - local GameReplicationInfo GRI; - - if( Level.TimeSeconds - LastUpdateTime > 0.5 ) bFontUpdated = False; - if( !bFontUpdated ) - { - C.Font = MyFonts.GetHugeFont( C.ClipX ); - C.StrLen( "Test", XL, HeaderHeight ); - C.Font = MyFonts.GetBigFont( C.ClipX ); - C.StrLen( "Test", XL, CatHeight ); - C.Font = MyFonts.GetSmallFont( C.ClipX ); - C.StrLen( "Test", XL, TextHeight ); - C.Font = MyFonts.GetSmallFont( C.ClipX ); - C.StrLen( "Test", XL, SmallTextHeight ); - CatHeight = CatHeight * 1.2; - TextHeight = TextHeight * 1.2; - SmallTextHeight = SmallTextHeight * 1.1; - VSpacing = HeaderHeight * 0.8; - BorderSpacing = VSpacing; - TotalHeight = 1.5 * HeaderHeight + 2 * BorderSpacing + CatHeight * 3 + TextHeight * 6 + SmallTextHeight * 7 + VSpacing * 3; - StartY = C.ClipY / 2 - TotalHeight / 2; - SideSpacing = C.ClipX / 10; - bFontUpdated = True; - LastUpdateTime = Level.TimeSeconds; - } - - GRI = PlayerPawn(Owner).GameReplicationInfo; - - DrawTitle( C ); - DrawContactInfo( C, GRI ); - DrawMOTD( C, GRI ); - DrawGameStats( C, GRI ); - DrawServerStats( C, GRI ); - DrawLeaderBoard( C, GRI ); -} - -function DrawTitle( Canvas C ) -{ - Y = StartY; - - C.Style = ERenderStyle.STY_Modulated; - C.SetPos( SideSpacing - BorderSpacing, Y ); - C.DrawRect( texture'shade', C.ClipX - 2 * SideSpacing + 2 * BorderSpacing , TotalHeight ); - C.Style = ERenderStyle.STY_Translucent; - C.DrawColor.R = 32; - C.DrawColor.G = 32; - C.DrawColor.B = 32; - C.SetPos( SideSpacing - BorderSpacing, Y ); - C.DrawPattern( texture'newblue', C.ClipX - 2 * SideSpacing + 2 * BorderSpacing , 1.5 * HeaderHeight, 1.0 ); - C.Style = ERenderStyle.STY_Normal; - - C.Font = MyFonts.GetHugeFont( C.ClipX ); - C.DrawColor = HeaderBlue; - - C.bCenter = True; - C.SetPos( 0, Y + 0.25 * HeaderHeight ); - C.DrawText( ServerInfoText, True ); - C.bCenter = False; - - Y += 1.5 * HeaderHeight + BorderSpacing; -} - -function DrawContactInfo( Canvas C, GameReplicationInfo GRI ) -{ - local float XL, YL, XL2, YL2; - - C.DrawColor = HeaderBlue; - C.Font = MyFonts.GetBigFont( C.ClipX ); - C.StrLen( "TEMP", XL, YL ); - - C.SetPos( SideSpacing, Y ); - C.DrawText( ContactInfoText, True); - - C.DrawColor = TextBlue; - C.Font = MyFonts.GetSmallFont( C.ClipX ); - C.StrLen( "TEMP", XL2, YL2 ); - - C.SetPos( SideSpacing, Y + CatHeight ); - C.DrawText( NameText, True); - - C.SetPos( SideSpacing, Y + CatHeight + TextHeight ); - C.DrawText( AdminText, True); - - C.SetPos( SideSpacing, Y + CatHeight + 2 * TextHeight); - C.DrawText( EMailText, True); - - C.DrawColor = InfoWhite; - C.SetPos( SideSpacing + XL2 * 2, Y + CatHeight ); - C.DrawText( GRI.ServerName, True); - - C.SetPos( SideSpacing + XL2 * 2, Y + CatHeight + TextHeight ); - if( GRI.AdminName != "" ) - C.DrawText( GRI.AdminName, True ); - else - C.DrawText( UnknownText, True ); - - C.SetPos( SideSpacing + XL2 * 2, Y + CatHeight + 2 * TextHeight ); - if( GRI.AdminEmail != "" ) - C.DrawText( GRI.AdminEmail, True ); - else - C.DrawText( UnknownText, True ); -} - -function DrawMOTD( Canvas C, GameReplicationInfo GRI ) -{ - local float XL, YL, XL2, YL2; - - C.DrawColor = HeaderBlue; - - C.Font = MyFonts.GetBigFont( C.ClipX ); - C.StrLen( "TEMP", XL, YL ); - - C.SetPos( SideSpacing * 6, Y ); - C.DrawText( MOTD, True ); - - C.DrawColor = InfoWhite; - - C.Font = MyFonts.GetSmallFont( C.ClipX ); - C.StrLen( "TEMP", XL2, YL2 ); - - C.StrLen( GRI.MOTDLine1, XL2, YL2 ); - C.SetPos( SideSpacing * 6, Y + CatHeight ); - C.DrawText( GRI.MOTDLine1, True ); - - C.StrLen( GRI.MOTDLine2, XL2, YL2 ); - C.SetPos( SideSpacing * 6, Y + CatHeight + TextHeight ); - C.DrawText( GRI.MOTDLine2, True ); - - C.StrLen( GRI.MOTDLine3, XL2, YL2 ); - C.SetPos( SideSpacing * 6, Y + CatHeight + 2 * TextHeight ); - C.DrawText( GRI.MOTDLine3, True ); - - C.StrLen( GRI.MOTDLine4, XL2, YL2 ); - C.SetPos( SideSpacing * 6, Y + CatHeight + 3 * TextHeight ); - C.DrawText( GRI.MOTDLine4, True ); - - Y += CatHeight + 4 * TextHeight + VSpacing; -} - -function DrawGameStats( Canvas C, GameReplicationInfo GRI ) -{ - local float XL, YL, XL2, YL2; - local int i, NumBots; - - C.DrawColor = HeaderBlue; - - C.Font = MyFonts.GetBigFont( C.ClipX ); - C.StrLen( "TEMP", XL, YL ); - - C.SetPos( SideSpacing, Y ); - C.DrawText( GameStatsText, True ); - - C.DrawColor = TextBlue; - - C.Font = MyFonts.GetSmallFont( C.ClipX ); - C.StrLen( "TEMP", XL2, YL2 ); - - C.SetPos( SideSpacing, Y + CatHeight ); - C.DrawText( GameTypeText, True ); - - C.SetPos( SideSpacing, Y + CatHeight + TextHeight ); - C.DrawText( PlayersText, True ); - - C.DrawColor = InfoWhite; - - C.SetPos( SideSpacing * 2, Y + CatHeight ); - C.DrawText( "Smart Capture The Flag", True); // GRI.GameName - - for( i = 0; i < 32; i++ ) - { - if( ( GRI.PRIArray[i] != None ) && ( GRI.PRIArray[i].bIsABot ) ) NumBots++; - } - C.SetPos( SideSpacing * 2, Y + CatHeight + TextHeight ); - C.DrawText( GRI.NumPlayers $ " [" $ NumBots @ BotText $ "]", True ); -} - -function DrawServerStats( canvas C, GameReplicationInfo GRI ) -{ - local float XL, YL, XL2, YL2; - local TournamentGameReplicationInfo TGRI; - - C.DrawColor = HeaderBlue; - - C.Font = MyFonts.GetBigFont( C.ClipX ); - C.StrLen( "TEMP", XL, YL ); - - C.SetPos( SideSpacing * 6, Y ); - C.DrawText( ServerStatsText, True ); - - C.DrawColor = TextBlue; - - C.Font = MyFonts.GetSmallFont( C.ClipX ); - C.StrLen( "TEMP", XL2, YL2 ); - - C.SetPos( SideSpacing * 6, Y + CatHeight ); - C.DrawText( GamesHostedText, True); - - C.SetPos( SideSpacing * 6, Y + CatHeight + TextHeight ); - C.DrawText( FlagsCapturedText, True); - - C.DrawColor = InfoWhite; - - TGRI = TournamentGameReplicationInfo( GRI ); - - C.SetPos( SideSpacing * 7.25, Y + CatHeight ); - C.DrawText( TGRI.TotalGames, True ); - - C.SetPos( SideSpacing * 7.25, Y + CatHeight + TextHeight ); - C.DrawText( TGRI.TotalFlags, True ); - - Y += CatHeight + 2 * TextHeight + VSpacing; -} - -function DrawLeaderBoard( Canvas C, GameReplicationInfo GRI ) -{ - local float YL; - local int i; - local SmartCTFEndStats EndStats; - local string Title, What, Who, Where, When; - - C.DrawColor = HeaderBlue; - - YL = ( CatHeight + SmallTextHeight - 4 ) / 64; - C.Font = MyFonts.GetBigFont( C.ClipX ); - C.SetPos( SideSpacing + 68 * YL, Y ); - C.DrawText( TopPlayersText, True ); - - C.DrawColor = InfoWhite; - C.Style = ERenderStyle.STY_Translucent; - C.bNoSmooth = False; - C.SetPos( SideSpacing, Y ); - C.DrawIcon( texture'UTMenu.TrophyCTF', YL ); - C.SetPos( SideSpacing, Y ); - - C.bNoSmooth = True; - C.Style = ERenderStyle.STY_Normal; - - C.Font = MyFonts.GetSmallestFont( C.ClipX ); - C.DrawColor = TextBlue; - - C.SetPos( SideSpacing * 2.5, Y + CatHeight ); - C.DrawText( BestFPHText, True ); - - C.SetPos( SideSpacing * 3.75, Y + CatHeight ); - C.DrawText( BestNameText, True ); - - C.SetPos( SideSpacing * 5.75, Y + CatHeight ); - C.DrawText( MapNameText, True ); - - C.SetPos( SideSpacing * 7.5, Y + CatHeight ); - C.DrawText( BestRecordSetText, True ); - - C.DrawColor = InfoWhite; - - if( SCTFGame != None ) EndStats = SCTFGame.EndStats; - if( EndStats != None ) - { - for( i = 0; i < 6; i++ ) - { - switch( i ) - { - case 0: - Title = "Greatest Point 'Ho"; - What = EndStats.MostPoints.Count @ "points/h"; - Who = EndStats.MostPoints.PlayerName; - Where = EndStats.MostPoints.MapName; - When = EndStats.MostPoints.RecordDate; - break; - case 1: - Title = "Biggest DM'er"; - What = EndStats.MostFrags.Count @ "frags/h"; - Who = EndStats.MostFrags.PlayerName; - Where = EndStats.MostFrags.MapName; - When = EndStats.MostFrags.RecordDate; - break; - case 2: - Title = "Best Flagcapper"; - What = EndStats.MostCaps.Count @ "caps/h"; - Who = EndStats.MostCaps.PlayerName; - Where = EndStats.MostCaps.MapName; - When = EndStats.MostCaps.RecordDate; - break; - case 3: - Title = "Best Flagkiller"; - What = EndStats.MostFlagkills.Count @ "flagk./h"; - Who = EndStats.MostFlagkills.PlayerName; - Where = EndStats.MostFlagkills.MapName; - When = EndStats.MostFlagkills.RecordDate; - break; - case 4: - Title = "Most Cover"; - What = EndStats.MostCovers.Count @ "covers/h"; - Who = EndStats.MostCovers.PlayerName; - Where = EndStats.MostCovers.MapName; - When = EndStats.MostCovers.RecordDate; - break; - case 5: - Title = "Hardcore Sniper"; - What = EndStats.MostHeadShots.Count @ "HS/h"; - Who = EndStats.MostHeadShots.PlayerName; - Where = EndStats.MostHeadShots.MapName; - When = EndStats.MostHeadShots.RecordDate; - break; - } - if( What == "" ) What = "--"; - if( Who == "" ) Who = "--"; - if( Where == "" ) Where = "--"; - if( When == "" ) When = "--"; - if( Len( Where ) > 20 ) Where = Left( Where, 20 ) $ ".."; - if( Len( Who ) > 25 ) Who = Left( Who, 25 ) $ ".."; - - C.DrawColor = TextBlue; - C.SetPos( SideSpacing, Y + CatHeight + ( ( i + 1 ) * SmallTextHeight ) ); - C.DrawText( Title, True ); - C.DrawColor = InfoWhite; - C.SetPos( SideSpacing * 2.5, Y + CatHeight + ( ( i + 1 ) * SmallTextHeight ) ); - C.DrawText( What, True ); - C.SetPos( SideSpacing * 3.75, Y + CatHeight + ( ( i + 1 ) * SmallTextHeight ) ); - C.DrawText( Who, True ); - C.SetPos( SideSpacing * 5.75, Y + CatHeight + ( ( i + 1 ) * SmallTextHeight ) ); - C.DrawText( Where, True ); - C.SetPos( SideSpacing * 7.5, Y + CatHeight + ( ( i + 1 ) * SmallTextHeight ) ); - C.DrawText( When, True ); - } - } -} - -defaultproperties -{ - SCTFGame=None - PlayerOwner=None - MapNameText="Where" - bFontUpdated=False - LastUpdateTime=0.000000 - HeaderHeight=0.000000 - CatHeight=0.000000 - textHeight=0.000000 - SmallTextHeight=0.000000 - VSpacing=0.000000 - BorderSpacing=0.000000 - TotalHeight=0.000000 - StartY=0.000000 - Y=0.000000 - SideSpacing=0.000000 - HeaderBlue=(R=9,G=151,B=247,A=0) - TextBlue=(R=0,G=128,B=255,A=0) - InfoWhite=(R=255,G=255,B=255,A=0) - TopPlayersText="SmartCTF Record Holders [Numbers per Hour]" - BestNameText="Who" - BestFPHText="What" - BestRecordSetText="When" -} +class SmartCTFServerInfo expands ServerInfoCTF; + +var SmartCTFGameReplicationInfo SCTFGame; +var PlayerPawn PlayerOwner; +var string MapNameText; +var bool bFontUpdated; +var float LastUpdateTime; +var float HeaderHeight, CatHeight, TextHeight, SmallTextHeight, VSpacing, BorderSpacing, TotalHeight; +var float StartY, Y, SideSpacing; +var Color HeaderBlue, TextBlue, InfoWhite; + +function PostBeginPlay() +{ + if( SCTFGame == None ) + { + ForEach AllActors( class'SmartCTFGameReplicationInfo', SCTFGame ) break; + } + + super.PostBeginPlay(); +} + +function RenderInfo( Canvas C ) +{ + local float XL; + local GameReplicationInfo GRI; + + if( Level.TimeSeconds - LastUpdateTime > 0.5 ) bFontUpdated = False; + if( !bFontUpdated ) + { + C.Font = MyFonts.GetHugeFont( C.ClipX ); + C.StrLen( "Test", XL, HeaderHeight ); + C.Font = MyFonts.GetBigFont( C.ClipX ); + C.StrLen( "Test", XL, CatHeight ); + C.Font = MyFonts.GetSmallFont( C.ClipX ); + C.StrLen( "Test", XL, TextHeight ); + C.Font = MyFonts.GetSmallFont( C.ClipX ); + C.StrLen( "Test", XL, SmallTextHeight ); + CatHeight = CatHeight * 1.2; + TextHeight = TextHeight * 1.2; + SmallTextHeight = SmallTextHeight * 1.1; + VSpacing = HeaderHeight * 0.8; + BorderSpacing = VSpacing; + TotalHeight = 1.5 * HeaderHeight + 2 * BorderSpacing + CatHeight * 3 + TextHeight * 6 + SmallTextHeight * 7 + VSpacing * 3; + StartY = C.ClipY / 2 - TotalHeight / 2; + SideSpacing = C.ClipX / 10; + bFontUpdated = True; + LastUpdateTime = Level.TimeSeconds; + } + + GRI = PlayerPawn(Owner).GameReplicationInfo; + + DrawTitle( C ); + DrawContactInfo( C, GRI ); + DrawMOTD( C, GRI ); + DrawGameStats( C, GRI ); + DrawServerStats( C, GRI ); + DrawLeaderBoard( C, GRI ); +} + +function DrawTitle( Canvas C ) +{ + Y = StartY; + + C.Style = ERenderStyle.STY_Modulated; + C.SetPos( SideSpacing - BorderSpacing, Y ); + C.DrawRect( texture'shade', C.ClipX - 2 * SideSpacing + 2 * BorderSpacing , TotalHeight ); + C.Style = ERenderStyle.STY_Translucent; + C.DrawColor.R = 32; + C.DrawColor.G = 32; + C.DrawColor.B = 32; + C.SetPos( SideSpacing - BorderSpacing, Y ); + C.DrawPattern( texture'newblue', C.ClipX - 2 * SideSpacing + 2 * BorderSpacing , 1.5 * HeaderHeight, 1.0 ); + C.Style = ERenderStyle.STY_Normal; + + C.Font = MyFonts.GetHugeFont( C.ClipX ); + C.DrawColor = HeaderBlue; + + C.bCenter = True; + C.SetPos( 0, Y + 0.25 * HeaderHeight ); + C.DrawText( ServerInfoText, True ); + C.bCenter = False; + + Y += 1.5 * HeaderHeight + BorderSpacing; +} + +function DrawContactInfo( Canvas C, GameReplicationInfo GRI ) +{ + local float XL, YL, XL2, YL2; + + C.DrawColor = HeaderBlue; + C.Font = MyFonts.GetBigFont( C.ClipX ); + C.StrLen( "TEMP", XL, YL ); + + C.SetPos( SideSpacing, Y ); + C.DrawText( ContactInfoText, True); + + C.DrawColor = TextBlue; + C.Font = MyFonts.GetSmallFont( C.ClipX ); + C.StrLen( "TEMP", XL2, YL2 ); + + C.SetPos( SideSpacing, Y + CatHeight ); + C.DrawText( NameText, True); + + C.SetPos( SideSpacing, Y + CatHeight + TextHeight ); + C.DrawText( AdminText, True); + + C.SetPos( SideSpacing, Y + CatHeight + 2 * TextHeight); + C.DrawText( EMailText, True); + + C.DrawColor = InfoWhite; + C.SetPos( SideSpacing + XL2 * 2, Y + CatHeight ); + C.DrawText( GRI.ServerName, True); + + C.SetPos( SideSpacing + XL2 * 2, Y + CatHeight + TextHeight ); + if( GRI.AdminName != "" ) + C.DrawText( GRI.AdminName, True ); + else + C.DrawText( UnknownText, True ); + + C.SetPos( SideSpacing + XL2 * 2, Y + CatHeight + 2 * TextHeight ); + if( GRI.AdminEmail != "" ) + C.DrawText( GRI.AdminEmail, True ); + else + C.DrawText( UnknownText, True ); +} + +function DrawMOTD( Canvas C, GameReplicationInfo GRI ) +{ + local float XL, YL, XL2, YL2; + + C.DrawColor = HeaderBlue; + + C.Font = MyFonts.GetBigFont( C.ClipX ); + C.StrLen( "TEMP", XL, YL ); + + C.SetPos( SideSpacing * 6, Y ); + C.DrawText( MOTD, True ); + + C.DrawColor = InfoWhite; + + C.Font = MyFonts.GetSmallFont( C.ClipX ); + C.StrLen( "TEMP", XL2, YL2 ); + + C.StrLen( GRI.MOTDLine1, XL2, YL2 ); + C.SetPos( SideSpacing * 6, Y + CatHeight ); + C.DrawText( GRI.MOTDLine1, True ); + + C.StrLen( GRI.MOTDLine2, XL2, YL2 ); + C.SetPos( SideSpacing * 6, Y + CatHeight + TextHeight ); + C.DrawText( GRI.MOTDLine2, True ); + + C.StrLen( GRI.MOTDLine3, XL2, YL2 ); + C.SetPos( SideSpacing * 6, Y + CatHeight + 2 * TextHeight ); + C.DrawText( GRI.MOTDLine3, True ); + + C.StrLen( GRI.MOTDLine4, XL2, YL2 ); + C.SetPos( SideSpacing * 6, Y + CatHeight + 3 * TextHeight ); + C.DrawText( GRI.MOTDLine4, True ); + + Y += CatHeight + 4 * TextHeight + VSpacing; +} + +function DrawGameStats( Canvas C, GameReplicationInfo GRI ) +{ + local float XL, YL, XL2, YL2; + local int i, NumBots; + + C.DrawColor = HeaderBlue; + + C.Font = MyFonts.GetBigFont( C.ClipX ); + C.StrLen( "TEMP", XL, YL ); + + C.SetPos( SideSpacing, Y ); + C.DrawText( GameStatsText, True ); + + C.DrawColor = TextBlue; + + C.Font = MyFonts.GetSmallFont( C.ClipX ); + C.StrLen( "TEMP", XL2, YL2 ); + + C.SetPos( SideSpacing, Y + CatHeight ); + C.DrawText( GameTypeText, True ); + + C.SetPos( SideSpacing, Y + CatHeight + TextHeight ); + C.DrawText( PlayersText, True ); + + C.DrawColor = InfoWhite; + + C.SetPos( SideSpacing * 2, Y + CatHeight ); + C.DrawText( "Smart Capture The Flag", True); // GRI.GameName + + for( i = 0; i < 32; i++ ) + { + if( ( GRI.PRIArray[i] != None ) && ( GRI.PRIArray[i].bIsABot ) ) NumBots++; + } + C.SetPos( SideSpacing * 2, Y + CatHeight + TextHeight ); + C.DrawText( GRI.NumPlayers $ " [" $ NumBots @ BotText $ "]", True ); +} + +function DrawServerStats( canvas C, GameReplicationInfo GRI ) +{ + local float XL, YL, XL2, YL2; + local TournamentGameReplicationInfo TGRI; + + C.DrawColor = HeaderBlue; + + C.Font = MyFonts.GetBigFont( C.ClipX ); + C.StrLen( "TEMP", XL, YL ); + + C.SetPos( SideSpacing * 6, Y ); + C.DrawText( ServerStatsText, True ); + + C.DrawColor = TextBlue; + + C.Font = MyFonts.GetSmallFont( C.ClipX ); + C.StrLen( "TEMP", XL2, YL2 ); + + C.SetPos( SideSpacing * 6, Y + CatHeight ); + C.DrawText( GamesHostedText, True); + + C.SetPos( SideSpacing * 6, Y + CatHeight + TextHeight ); + C.DrawText( FlagsCapturedText, True); + + C.DrawColor = InfoWhite; + + TGRI = TournamentGameReplicationInfo( GRI ); + + C.SetPos( SideSpacing * 7.25, Y + CatHeight ); + C.DrawText( TGRI.TotalGames, True ); + + C.SetPos( SideSpacing * 7.25, Y + CatHeight + TextHeight ); + C.DrawText( TGRI.TotalFlags, True ); + + Y += CatHeight + 2 * TextHeight + VSpacing; +} + +function DrawLeaderBoard( Canvas C, GameReplicationInfo GRI ) +{ + local float YL; + local int i; + local SmartCTFEndStats EndStats; + local string Title, What, Who, Where, When; + + C.DrawColor = HeaderBlue; + + YL = ( CatHeight + SmallTextHeight - 4 ) / 64; + C.Font = MyFonts.GetBigFont( C.ClipX ); + C.SetPos( SideSpacing + 68 * YL, Y ); + C.DrawText( TopPlayersText, True ); + + C.DrawColor = InfoWhite; + C.Style = ERenderStyle.STY_Translucent; + C.bNoSmooth = False; + C.SetPos( SideSpacing, Y ); + C.DrawIcon( texture'UTMenu.TrophyCTF', YL ); + C.SetPos( SideSpacing, Y ); + + C.bNoSmooth = True; + C.Style = ERenderStyle.STY_Normal; + + C.Font = MyFonts.GetSmallestFont( C.ClipX ); + C.DrawColor = TextBlue; + + C.SetPos( SideSpacing * 2.5, Y + CatHeight ); + C.DrawText( BestFPHText, True ); + + C.SetPos( SideSpacing * 3.75, Y + CatHeight ); + C.DrawText( BestNameText, True ); + + C.SetPos( SideSpacing * 5.75, Y + CatHeight ); + C.DrawText( MapNameText, True ); + + C.SetPos( SideSpacing * 7.5, Y + CatHeight ); + C.DrawText( BestRecordSetText, True ); + + C.DrawColor = InfoWhite; + + if( SCTFGame != None ) EndStats = SCTFGame.EndStats; + if( EndStats != None ) + { + for( i = 0; i < 6; i++ ) + { + switch( i ) + { + case 0: + Title = "Greatest Point 'Ho"; + What = EndStats.MostPoints.Count @ "points/h"; + Who = EndStats.MostPoints.PlayerName; + Where = EndStats.MostPoints.MapName; + When = EndStats.MostPoints.RecordDate; + break; + case 1: + Title = "Biggest DM'er"; + What = EndStats.MostFrags.Count @ "frags/h"; + Who = EndStats.MostFrags.PlayerName; + Where = EndStats.MostFrags.MapName; + When = EndStats.MostFrags.RecordDate; + break; + case 2: + Title = "Best Flagcapper"; + What = EndStats.MostCaps.Count @ "caps/h"; + Who = EndStats.MostCaps.PlayerName; + Where = EndStats.MostCaps.MapName; + When = EndStats.MostCaps.RecordDate; + break; + case 3: + Title = "Best Flagkiller"; + What = EndStats.MostFlagkills.Count @ "flagk./h"; + Who = EndStats.MostFlagkills.PlayerName; + Where = EndStats.MostFlagkills.MapName; + When = EndStats.MostFlagkills.RecordDate; + break; + case 4: + Title = "Most Cover"; + What = EndStats.MostCovers.Count @ "covers/h"; + Who = EndStats.MostCovers.PlayerName; + Where = EndStats.MostCovers.MapName; + When = EndStats.MostCovers.RecordDate; + break; + case 5: + Title = "Hardcore Sniper"; + What = EndStats.MostHeadShots.Count @ "HS/h"; + Who = EndStats.MostHeadShots.PlayerName; + Where = EndStats.MostHeadShots.MapName; + When = EndStats.MostHeadShots.RecordDate; + break; + } + if( What == "" ) What = "--"; + if( Who == "" ) Who = "--"; + if( Where == "" ) Where = "--"; + if( When == "" ) When = "--"; + if( Len( Where ) > 20 ) Where = Left( Where, 20 ) $ ".."; + if( Len( Who ) > 25 ) Who = Left( Who, 25 ) $ ".."; + + C.DrawColor = TextBlue; + C.SetPos( SideSpacing, Y + CatHeight + ( ( i + 1 ) * SmallTextHeight ) ); + C.DrawText( Title, True ); + C.DrawColor = InfoWhite; + C.SetPos( SideSpacing * 2.5, Y + CatHeight + ( ( i + 1 ) * SmallTextHeight ) ); + C.DrawText( What, True ); + C.SetPos( SideSpacing * 3.75, Y + CatHeight + ( ( i + 1 ) * SmallTextHeight ) ); + C.DrawText( Who, True ); + C.SetPos( SideSpacing * 5.75, Y + CatHeight + ( ( i + 1 ) * SmallTextHeight ) ); + C.DrawText( Where, True ); + C.SetPos( SideSpacing * 7.5, Y + CatHeight + ( ( i + 1 ) * SmallTextHeight ) ); + C.DrawText( When, True ); + } + } +} + +defaultproperties +{ + SCTFGame=None + PlayerOwner=None + MapNameText="Where" + bFontUpdated=False + LastUpdateTime=0.000000 + HeaderHeight=0.000000 + CatHeight=0.000000 + textHeight=0.000000 + SmallTextHeight=0.000000 + VSpacing=0.000000 + BorderSpacing=0.000000 + TotalHeight=0.000000 + StartY=0.000000 + Y=0.000000 + SideSpacing=0.000000 + HeaderBlue=(R=9,G=151,B=247,A=0) + TextBlue=(R=0,G=128,B=255,A=0) + InfoWhite=(R=255,G=255,B=255,A=0) + TopPlayersText="SmartCTF Record Holders [Numbers per Hour]" + BestNameText="Who" + BestFPHText="What" + BestRecordSetText="When" +} diff --git a/Sources/Classes/SmartCTFSnowyScoreboard.uc b/Classes/SmartCTFSnowyScoreboard.UC similarity index 98% rename from Sources/Classes/SmartCTFSnowyScoreboard.uc rename to Classes/SmartCTFSnowyScoreboard.UC index 335f428..e0372a3 100644 --- a/Sources/Classes/SmartCTFSnowyScoreboard.uc +++ b/Classes/SmartCTFSnowyScoreboard.UC @@ -1,428 +1,428 @@ -// SnowyScoreboard original from CTT. Thanks to Defrost! -// Brought to SmartCTF by Sp0ngeb0b -// spongebobut@yahoo.com -class SmartCTFSnowyScoreboard extends SmartCTFScoreBoard; - -#exec texture import name=snowFlake1 file="Textures\SnowFlake1.pcx" mips=off flags=2 -#exec texture import name=snowFlake2 file="Textures\SnowFlake2.pcx" mips=off flags=2 -#exec texture import name=snowFlake3 file="Textures\SnowFlake3.pcx" mips=off flags=2 -#exec texture import name=snowFlake4 file="Textures\SnowFlake4.pcx" mips=off flags=2 -#exec texture import name=snowFlake5 file="Textures\SnowFlake5.pcx" mips=off flags=2 -#exec texture import name=snowFlake6 file="Textures\SnowFlake6.pcx" mips=off flags=2 -#exec texture import name=snowFlake7 file="Textures\SnowFlake7.pcx" mips=off flags=2 -#exec texture import name=snowFlake8 file="Textures\SnowFlake8.pcx" mips=off flags=2 -#exec texture import name=snowFlake9 file="Textures\SnowFlake9.pcx" mips=off flags=2 -#exec texture import name=snowFlake10 file="Textures\SnowFlake10.pcx" mips=off flags=2 -#exec texture import name=snowFlake11 file="Textures\SnowFlake11.pcx" mips=off flags=2 -#exec texture import name=snowFlake12 file="Textures\SnowFlake12.pcx" mips=off flags=2 -#exec texture import name=snowFlake13 file="Textures\SnowFlake13.pcx" mips=off flags=2 -#exec texture import name=snowFlake14 file="Textures\SnowFlake14.pcx" mips=off flags=2 -#exec texture import name=snowFlake15 file="Textures\SnowFlake15.pcx" mips=off flags=2 -#exec texture import name=snowFlake16 file="Textures\SnowFlake16.pcx" mips=off flags=2 -//#exec texture import name=lights file="Textures\Lights2.pcx" mips=off flags=2 -#exec texture import name=santa file="Textures\santa.pcx" mips=off flags=2 -#exec texture import name=present file="Textures\presents.pcx" mips=off flags=2 - -struct ParticleInfo { // Snow particle description struct. - var int spriteNum; // The snow flake sprite to use. - var float cx; // Horizontal offset. - var float cy; // Vertical offset. - var float ct; // Time offset. - var float waveFreq; // Particle wave frequency. - var float waveAmplitude; // Amplitude of the wave. - var float dy; // Vertical base velocity. - var float dx; // Horizontal base velocity. - var color col; // Color of the particle. -}; - -var color baseColor; // Base color of the snow flakes. -var bool bSnowInitialized; // Whether the particles have been initialized. -var Texture sprites[16]; // Snow flake sprites. -var ParticleInfo particles[100]; // Current particles displayed. -var float lastUpdateTime; // Last time the particles were rendered. - -var float minDX; // Minimum horizontal base velocity. -var float maxDX; // Maximum horizontal base velocity. -var float minDY; // Minimum vertical base velocity. -var float maxDY; // Maximum vertical base velocity. -var float minWaveAmplitude; // Minimum wave amplitude. -var float maxWaveAmplitude; // Maximum wave amplitude. - -// Non scaled constants. -const minWaveFreq = 0.25; // Minimum wave frequency. -const maxWaveFreq = 1.0; // Maximum wave frequency. -const minGlow = 0.40; // Minimum snow flake sprite glow. -const maxGlow = 1.00; // Maximum snow flake sprite glow. - -// Scaled constants (set for a resolution of 1280x1024 px). -const scaleMinDX = -20.0; -const scaleMaxDX = 20.0; -const scaleMinDY = 100.0; -const scaleMaxDY = 300.0; -const scaleMinWaveAmplitude = 8; -const scaleMaxWaveAmplitude = 22; -const scaleWidth = 1280; -const scaleHeight = 1024; - -// Texture constants -const santaTextureWidth = 128; // Width of the santa texture. -const santaTextureHeight = 128; // Height of the santa texture. - -const presentTextureWidth = 128; // Width of the present texture. -const presentTextureHeight = 128; // Height of the present texture. - - - -/*************************************************************************************************** - * - * $DESCRIPTION Renders the scoreboard. - * $PARAM c The canvas on which the rendering should be performed. - * $REQUIRE c != none - * $OVERRIDE - * -**************************************************************************************************/ -function showScores(Canvas c) -{ - super.showScores(c); - renderSnow(c); -} - - - -/*************************************************************************************************** - * - * $DESCRIPTION Renders the scoreboard in small scale? - * $PARAM c The canvas on which the rendering should be performed. - * $REQUIRE c != none - * $OVERRIDE - * -**************************************************************************************************/ -function showMiniScores(Canvas c) -{ - super.showMiniScores(c); - renderSnow(c); -} - - - -/*************************************************************************************************** - * - * $DESCRIPTION Renders the snow particles. Also adds the XmasImages. - * $PARAM c The canvas on which the rendering should be performed. - * $REQUIRE c != none - * $OVERRIDE - * -**************************************************************************************************/ -simulated function renderSnow(Canvas c) -{ - local int baseX, baseY; - local int index; - local Texture sprite; - local float cx, cy; - - // Update position of each particle. - updateSnow(c); - - // Draw each particle. - c.style = ERenderStyle.STY_Translucent; - for (index = 0; index < arrayCount(particles); index++) - { - // Set position. - cx = particles[index].cx; - cy = particles[index].cy; - cx += sin(particles[index].ct * particles[index].waveFreq * 2 * pi) * particles[index].waveAmplitude; - c.setPos(cx, cy); - - // Draw particle sprite. - c.drawColor = particles[index].col; - sprite = sprites[particles[index].spriteNum]; - c.drawTile(sprite, sprite.uSize, sprite.vSize, 0, 0, sprite.uSize, sprite.vSize); - } - - if (SCTFGame.bXmasImages) // whether to display the Sexy Xmas images! :D - { - // Draw Santa - baseX = c.clipX - santaTextureWidth - 16; - baseY = c.clipY - santaTextureHeight - 16; - - c.style = ERenderStyle.STY_Normal; - c.drawColor = BaseColor; - - c.setPos(baseX, baseY); - c.drawTile(Texture'santa', santaTextureWidth, santaTextureHeight, 0.0, 0.0, santaTextureWidth, santaTextureHeight); - - // Draw presents - baseX = 16; - baseY = c.clipY - presentTextureHeight - 16; - - c.style = ERenderStyle.STY_Normal; - c.drawColor = BaseColor; - - c.setPos(baseX, baseY); - c.drawTile(Texture'present', presentTextureWidth, presentTextureHeight, 0.0, 0.0, presentTextureWidth, presentTextureHeight); - } -} - - -/*************************************************************************************************** - * - * $DESCRIPTION Updates the positions of the snow particles. - * $PARAM c The canvas on which the rendering should be performed. - * $REQUIRE c != none - * $OVERRIDE - * -**************************************************************************************************/ -simulated function updateSnow(Canvas c) -{ - local float deltaTime; - local int index; - - // Prepare for update. - setupScalars(c); - if (!bSnowInitialized) - { - initializeSnow(c); - } - deltaTime = fMin(0.5, level.timeSeconds - lastUpdateTime); - - // Move each particle. - for (index = 0; index < arrayCount(particles); index++) - { - particles[index].cx += particles[index].dx * deltaTime; - particles[index].cy += particles[index].dy * deltaTime; - particles[index].ct += deltaTime / level.timeDilation; - - // Check if particle has left the screen. - if (particles[index].cy > c.clipY) - { - // It has, reset particle. - initializeParticle(index, c, true); - } - } - lastUpdateTime = level.timeSeconds; -} - - - -/*************************************************************************************************** - * - * $DESCRIPTION Initializes all snow particles. - * $PARAM c The canvas on which the rendering should be performed. - * $REQUIRE c != none - * $ENSURE bSnowInitialized - * $OVERRIDE - * -**************************************************************************************************/ -simulated function initializeSnow(Canvas c) -{ - local int index; - bSnowInitialized = true; - - // Initialize each particle. - for (index = 0; index < arrayCount(particles); index++) - { - initializeParticle(index, c); - } - lastUpdateTime = level.timeSeconds; -} - - - -/*************************************************************************************************** - * - * $DESCRIPTION Initializes the specified particle. - * $PARAM index The particle that is to be initialized. - * $PARAM c The canvas on which the rendering should be performed. - * $PARAM bReset Reset particle to the top of the screen. - * $REQUIRE 0 <= index && index <= arrayCount(particles) && c != none - * $OVERRIDE - * -**************************************************************************************************/ -simulated function initializeParticle(int index, Canvas c, optional bool bReset) -{ - particles[index].spriteNum = rand(arrayCount(sprites)); - particles[index].cx = fRand() * c.clipX; - if (bReset) - { - particles[index].cy = -sprites[particles[index].spriteNum].vSize; - } - else - { - particles[index].cy = fRand() * c.clipY; - } - particles[index].ct = 0.0; - particles[index].dx = fRand() * (maxDX - minDX) + minDX; - particles[index].dy = fRand() * (maxDY - minDY) + minDY; - particles[index].waveFreq = fRand() * (maxWaveFreq - minWaveFreq) + minWaveFreq; - particles[index].waveAmplitude = fRand() * (maxWaveAmplitude - minWaveAmplitude) + minWaveAmplitude; - particles[index].waveFreq *= particles[index].dy / maxDY; - particles[index].waveAmplitude *= particles[index].dy / maxDY; - - if (level.month == 12 && level.day == 24 || level.month == 12 && level.day == 25 || level.month == 12 && level.day == 31 || level.month == 1 && level.day == 1) - { - particles[index].col.r = rand(256); - particles[index].col.g = rand(256); - particles[index].col.b = rand(256); - } - else - { - particles[index].col = baseColor * (fRand() * (maxGlow - minGlow) + minGlow); - } -} - - - -/*************************************************************************************************** - * - * $DESCRIPTION Computes the absolute values of the scaled settings. - * $PARAM c The canvas on which the rendering should be performed. - * $REQUIRE c != none - * $OVERRIDE - * -**************************************************************************************************/ -simulated function setupScalars(Canvas c) -{ - minDX = scaleMinDX / scaleWidth * c.clipX; - maxDX = scaleMaxDX / scaleWidth * c.clipX; - minDY = scaleMinDY / scaleHeight * c.clipY; - maxDY = scaleMaxDY / scaleHeight * c.clipY; - minWaveAmplitude = scaleMinWaveAmplitude / scaleWidth * c.clipX; - maxWaveAmplitude = scaleMaxWaveAmplitude / scaleWidth * c.clipX; -} - - - -/*************************************************************************************************** - * - * $DESCRIPTION Default properties block. - * -**************************************************************************************************/ - -defaultproperties -{ - BaseColor=(R=255,G=255,B=255,A=0) - bSnowInitialized=False - sprites(0)=Texture'SmartCTF_ChaChaV2.snowFlake1' - sprites(1)=Texture'SmartCTF_ChaChaV2.snowFlake2' - sprites(2)=Texture'SmartCTF_ChaChaV2.snowFlake3' - sprites(3)=Texture'SmartCTF_ChaChaV2.snowFlake4' - sprites(4)=Texture'SmartCTF_ChaChaV2.snowFlake5' - sprites(5)=Texture'SmartCTF_ChaChaV2.snowFlake6' - sprites(6)=Texture'SmartCTF_ChaChaV2.snowFlake7' - sprites(7)=Texture'SmartCTF_ChaChaV2.snowFlake8' - sprites(8)=Texture'SmartCTF_ChaChaV2.snowFlake9' - sprites(9)=Texture'SmartCTF_ChaChaV2.snowFlake10' - sprites(10)=Texture'SmartCTF_ChaChaV2.snowFlake11' - sprites(11)=Texture'SmartCTF_ChaChaV2.snowFlake12' - sprites(12)=Texture'SmartCTF_ChaChaV2.snowFlake13' - sprites(13)=Texture'SmartCTF_ChaChaV2.snowFlake14' - sprites(14)=Texture'SmartCTF_ChaChaV2.snowFlake15' - sprites(15)=Texture'SmartCTF_ChaChaV2.snowFlake16' - particles(0)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) - particles(1)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) - particles(2)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) - particles(3)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) - particles(4)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) - particles(5)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) - particles(6)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) - particles(7)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) - particles(8)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) - particles(9)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) - particles(10)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) - particles(11)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) - particles(12)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) - particles(13)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) - particles(14)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) - particles(15)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) - particles(16)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) - particles(17)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) - particles(18)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) - particles(19)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) - particles(20)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) - particles(21)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) - particles(22)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) - particles(23)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) - particles(24)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) - particles(25)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) - particles(26)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) - particles(27)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) - particles(28)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) - particles(29)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) - particles(30)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) - particles(31)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) - particles(32)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) - particles(33)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) - particles(34)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) - particles(35)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) - particles(36)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) - particles(37)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) - particles(38)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) - particles(39)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) - particles(40)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) - particles(41)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) - particles(42)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) - particles(43)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) - particles(44)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) - particles(45)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) - particles(46)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) - particles(47)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) - particles(48)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) - particles(49)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) - particles(50)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) - particles(51)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) - particles(52)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) - particles(53)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) - particles(54)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) - particles(55)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) - particles(56)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) - particles(57)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) - particles(58)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) - particles(59)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) - particles(60)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) - particles(61)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) - particles(62)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) - particles(63)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) - particles(64)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) - particles(65)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) - particles(66)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) - particles(67)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) - particles(68)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) - particles(69)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) - particles(70)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) - particles(71)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) - particles(72)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) - particles(73)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) - particles(74)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) - particles(75)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) - particles(76)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) - particles(77)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) - particles(78)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) - particles(79)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) - particles(80)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) - particles(81)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) - particles(82)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) - particles(83)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) - particles(84)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) - particles(85)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) - particles(86)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) - particles(87)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) - particles(88)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) - particles(89)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) - particles(90)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) - particles(91)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) - particles(92)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) - particles(93)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) - particles(94)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) - particles(95)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) - particles(96)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) - particles(97)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) - particles(98)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) - particles(99)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) - LastUpdateTime=0.000000 - minDX=0.000000 - maxDX=0.000000 - minDY=0.000000 - maxDY=0.000000 - minWaveAmplitude=0.000000 - maxWaveAmplitude=0.000000 -} +// SnowyScoreboard original from CTT. Thanks to Defrost! +// Brought to SmartCTF by Sp0ngeb0b +// spongebobut@yahoo.com +class SmartCTFSnowyScoreboard extends SmartCTFScoreBoard; + +#exec texture import name=snowFlake1 file="Textures\SnowFlake1.pcx" mips=off flags=2 +#exec texture import name=snowFlake2 file="Textures\SnowFlake2.pcx" mips=off flags=2 +#exec texture import name=snowFlake3 file="Textures\SnowFlake3.pcx" mips=off flags=2 +#exec texture import name=snowFlake4 file="Textures\SnowFlake4.pcx" mips=off flags=2 +#exec texture import name=snowFlake5 file="Textures\SnowFlake5.pcx" mips=off flags=2 +#exec texture import name=snowFlake6 file="Textures\SnowFlake6.pcx" mips=off flags=2 +#exec texture import name=snowFlake7 file="Textures\SnowFlake7.pcx" mips=off flags=2 +#exec texture import name=snowFlake8 file="Textures\SnowFlake8.pcx" mips=off flags=2 +#exec texture import name=snowFlake9 file="Textures\SnowFlake9.pcx" mips=off flags=2 +#exec texture import name=snowFlake10 file="Textures\SnowFlake10.pcx" mips=off flags=2 +#exec texture import name=snowFlake11 file="Textures\SnowFlake11.pcx" mips=off flags=2 +#exec texture import name=snowFlake12 file="Textures\SnowFlake12.pcx" mips=off flags=2 +#exec texture import name=snowFlake13 file="Textures\SnowFlake13.pcx" mips=off flags=2 +#exec texture import name=snowFlake14 file="Textures\SnowFlake14.pcx" mips=off flags=2 +#exec texture import name=snowFlake15 file="Textures\SnowFlake15.pcx" mips=off flags=2 +#exec texture import name=snowFlake16 file="Textures\SnowFlake16.pcx" mips=off flags=2 +//#exec texture import name=lights file="Textures\Lights2.pcx" mips=off flags=2 +#exec texture import name=santa file="Textures\santa.pcx" mips=off flags=2 +#exec texture import name=present file="Textures\presents.pcx" mips=off flags=2 + +struct ParticleInfo { // Snow particle description struct. + var int spriteNum; // The snow flake sprite to use. + var float cx; // Horizontal offset. + var float cy; // Vertical offset. + var float ct; // Time offset. + var float waveFreq; // Particle wave frequency. + var float waveAmplitude; // Amplitude of the wave. + var float dy; // Vertical base velocity. + var float dx; // Horizontal base velocity. + var color col; // Color of the particle. +}; + +var color baseColor; // Base color of the snow flakes. +var bool bSnowInitialized; // Whether the particles have been initialized. +var Texture sprites[16]; // Snow flake sprites. +var ParticleInfo particles[100]; // Current particles displayed. +var float lastUpdateTime; // Last time the particles were rendered. + +var float minDX; // Minimum horizontal base velocity. +var float maxDX; // Maximum horizontal base velocity. +var float minDY; // Minimum vertical base velocity. +var float maxDY; // Maximum vertical base velocity. +var float minWaveAmplitude; // Minimum wave amplitude. +var float maxWaveAmplitude; // Maximum wave amplitude. + +// Non scaled constants. +const minWaveFreq = 0.25; // Minimum wave frequency. +const maxWaveFreq = 1.0; // Maximum wave frequency. +const minGlow = 0.40; // Minimum snow flake sprite glow. +const maxGlow = 1.00; // Maximum snow flake sprite glow. + +// Scaled constants (set for a resolution of 1280x1024 px). +const scaleMinDX = -20.0; +const scaleMaxDX = 20.0; +const scaleMinDY = 100.0; +const scaleMaxDY = 300.0; +const scaleMinWaveAmplitude = 8; +const scaleMaxWaveAmplitude = 22; +const scaleWidth = 1280; +const scaleHeight = 1024; + +// Texture constants +const santaTextureWidth = 128; // Width of the santa texture. +const santaTextureHeight = 128; // Height of the santa texture. + +const presentTextureWidth = 128; // Width of the present texture. +const presentTextureHeight = 128; // Height of the present texture. + + + +/*************************************************************************************************** + * + * $DESCRIPTION Renders the scoreboard. + * $PARAM c The canvas on which the rendering should be performed. + * $REQUIRE c != none + * $OVERRIDE + * +**************************************************************************************************/ +function showScores(Canvas c) +{ + super.showScores(c); + renderSnow(c); +} + + + +/*************************************************************************************************** + * + * $DESCRIPTION Renders the scoreboard in small scale? + * $PARAM c The canvas on which the rendering should be performed. + * $REQUIRE c != none + * $OVERRIDE + * +**************************************************************************************************/ +function showMiniScores(Canvas c) +{ + super.showMiniScores(c); + renderSnow(c); +} + + + +/*************************************************************************************************** + * + * $DESCRIPTION Renders the snow particles. Also adds the XmasImages. + * $PARAM c The canvas on which the rendering should be performed. + * $REQUIRE c != none + * $OVERRIDE + * +**************************************************************************************************/ +simulated function renderSnow(Canvas c) +{ + local int baseX, baseY; + local int index; + local Texture sprite; + local float cx, cy; + + // Update position of each particle. + updateSnow(c); + + // Draw each particle. + c.style = ERenderStyle.STY_Translucent; + for (index = 0; index < arrayCount(particles); index++) + { + // Set position. + cx = particles[index].cx; + cy = particles[index].cy; + cx += sin(particles[index].ct * particles[index].waveFreq * 2 * pi) * particles[index].waveAmplitude; + c.setPos(cx, cy); + + // Draw particle sprite. + c.drawColor = particles[index].col; + sprite = sprites[particles[index].spriteNum]; + c.drawTile(sprite, sprite.uSize, sprite.vSize, 0, 0, sprite.uSize, sprite.vSize); + } + + if (SCTFGame.bXmasImages) // whether to display the Sexy Xmas images! :D + { + // Draw Santa + baseX = c.clipX - santaTextureWidth - 16; + baseY = c.clipY - santaTextureHeight - 16; + + c.style = ERenderStyle.STY_Normal; + c.drawColor = BaseColor; + + c.setPos(baseX, baseY); + c.drawTile(Texture'santa', santaTextureWidth, santaTextureHeight, 0.0, 0.0, santaTextureWidth, santaTextureHeight); + + // Draw presents + baseX = 16; + baseY = c.clipY - presentTextureHeight - 16; + + c.style = ERenderStyle.STY_Normal; + c.drawColor = BaseColor; + + c.setPos(baseX, baseY); + c.drawTile(Texture'present', presentTextureWidth, presentTextureHeight, 0.0, 0.0, presentTextureWidth, presentTextureHeight); + } +} + + +/*************************************************************************************************** + * + * $DESCRIPTION Updates the positions of the snow particles. + * $PARAM c The canvas on which the rendering should be performed. + * $REQUIRE c != none + * $OVERRIDE + * +**************************************************************************************************/ +simulated function updateSnow(Canvas c) +{ + local float deltaTime; + local int index; + + // Prepare for update. + setupScalars(c); + if (!bSnowInitialized) + { + initializeSnow(c); + } + deltaTime = fMin(0.5, level.timeSeconds - lastUpdateTime); + + // Move each particle. + for (index = 0; index < arrayCount(particles); index++) + { + particles[index].cx += particles[index].dx * deltaTime; + particles[index].cy += particles[index].dy * deltaTime; + particles[index].ct += deltaTime / level.timeDilation; + + // Check if particle has left the screen. + if (particles[index].cy > c.clipY) + { + // It has, reset particle. + initializeParticle(index, c, true); + } + } + lastUpdateTime = level.timeSeconds; +} + + + +/*************************************************************************************************** + * + * $DESCRIPTION Initializes all snow particles. + * $PARAM c The canvas on which the rendering should be performed. + * $REQUIRE c != none + * $ENSURE bSnowInitialized + * $OVERRIDE + * +**************************************************************************************************/ +simulated function initializeSnow(Canvas c) +{ + local int index; + bSnowInitialized = true; + + // Initialize each particle. + for (index = 0; index < arrayCount(particles); index++) + { + initializeParticle(index, c); + } + lastUpdateTime = level.timeSeconds; +} + + + +/*************************************************************************************************** + * + * $DESCRIPTION Initializes the specified particle. + * $PARAM index The particle that is to be initialized. + * $PARAM c The canvas on which the rendering should be performed. + * $PARAM bReset Reset particle to the top of the screen. + * $REQUIRE 0 <= index && index <= arrayCount(particles) && c != none + * $OVERRIDE + * +**************************************************************************************************/ +simulated function initializeParticle(int index, Canvas c, optional bool bReset) +{ + particles[index].spriteNum = rand(arrayCount(sprites)); + particles[index].cx = fRand() * c.clipX; + if (bReset) + { + particles[index].cy = -sprites[particles[index].spriteNum].vSize; + } + else + { + particles[index].cy = fRand() * c.clipY; + } + particles[index].ct = 0.0; + particles[index].dx = fRand() * (maxDX - minDX) + minDX; + particles[index].dy = fRand() * (maxDY - minDY) + minDY; + particles[index].waveFreq = fRand() * (maxWaveFreq - minWaveFreq) + minWaveFreq; + particles[index].waveAmplitude = fRand() * (maxWaveAmplitude - minWaveAmplitude) + minWaveAmplitude; + particles[index].waveFreq *= particles[index].dy / maxDY; + particles[index].waveAmplitude *= particles[index].dy / maxDY; + + if (level.month == 12 && level.day == 24 || level.month == 12 && level.day == 25 || level.month == 12 && level.day == 31 || level.month == 1 && level.day == 1) + { + particles[index].col.r = rand(256); + particles[index].col.g = rand(256); + particles[index].col.b = rand(256); + } + else + { + particles[index].col = baseColor * (fRand() * (maxGlow - minGlow) + minGlow); + } +} + + + +/*************************************************************************************************** + * + * $DESCRIPTION Computes the absolute values of the scaled settings. + * $PARAM c The canvas on which the rendering should be performed. + * $REQUIRE c != none + * $OVERRIDE + * +**************************************************************************************************/ +simulated function setupScalars(Canvas c) +{ + minDX = scaleMinDX / scaleWidth * c.clipX; + maxDX = scaleMaxDX / scaleWidth * c.clipX; + minDY = scaleMinDY / scaleHeight * c.clipY; + maxDY = scaleMaxDY / scaleHeight * c.clipY; + minWaveAmplitude = scaleMinWaveAmplitude / scaleWidth * c.clipX; + maxWaveAmplitude = scaleMaxWaveAmplitude / scaleWidth * c.clipX; +} + + + +/*************************************************************************************************** + * + * $DESCRIPTION Default properties block. + * +**************************************************************************************************/ + +defaultproperties +{ + BaseColor=(R=255,G=255,B=255,A=0) + bSnowInitialized=False + sprites(0)=Texture'SmartCTF_ChaChaV2.snowFlake1' + sprites(1)=Texture'SmartCTF_ChaChaV2.snowFlake2' + sprites(2)=Texture'SmartCTF_ChaChaV2.snowFlake3' + sprites(3)=Texture'SmartCTF_ChaChaV2.snowFlake4' + sprites(4)=Texture'SmartCTF_ChaChaV2.snowFlake5' + sprites(5)=Texture'SmartCTF_ChaChaV2.snowFlake6' + sprites(6)=Texture'SmartCTF_ChaChaV2.snowFlake7' + sprites(7)=Texture'SmartCTF_ChaChaV2.snowFlake8' + sprites(8)=Texture'SmartCTF_ChaChaV2.snowFlake9' + sprites(9)=Texture'SmartCTF_ChaChaV2.snowFlake10' + sprites(10)=Texture'SmartCTF_ChaChaV2.snowFlake11' + sprites(11)=Texture'SmartCTF_ChaChaV2.snowFlake12' + sprites(12)=Texture'SmartCTF_ChaChaV2.snowFlake13' + sprites(13)=Texture'SmartCTF_ChaChaV2.snowFlake14' + sprites(14)=Texture'SmartCTF_ChaChaV2.snowFlake15' + sprites(15)=Texture'SmartCTF_ChaChaV2.snowFlake16' + particles(0)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) + particles(1)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) + particles(2)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) + particles(3)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) + particles(4)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) + particles(5)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) + particles(6)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) + particles(7)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) + particles(8)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) + particles(9)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) + particles(10)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) + particles(11)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) + particles(12)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) + particles(13)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) + particles(14)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) + particles(15)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) + particles(16)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) + particles(17)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) + particles(18)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) + particles(19)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) + particles(20)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) + particles(21)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) + particles(22)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) + particles(23)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) + particles(24)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) + particles(25)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) + particles(26)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) + particles(27)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) + particles(28)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) + particles(29)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) + particles(30)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) + particles(31)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) + particles(32)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) + particles(33)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) + particles(34)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) + particles(35)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) + particles(36)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) + particles(37)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) + particles(38)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) + particles(39)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) + particles(40)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) + particles(41)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) + particles(42)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) + particles(43)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) + particles(44)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) + particles(45)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) + particles(46)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) + particles(47)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) + particles(48)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) + particles(49)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) + particles(50)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) + particles(51)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) + particles(52)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) + particles(53)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) + particles(54)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) + particles(55)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) + particles(56)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) + particles(57)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) + particles(58)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) + particles(59)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) + particles(60)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) + particles(61)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) + particles(62)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) + particles(63)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) + particles(64)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) + particles(65)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) + particles(66)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) + particles(67)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) + particles(68)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) + particles(69)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) + particles(70)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) + particles(71)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) + particles(72)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) + particles(73)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) + particles(74)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) + particles(75)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) + particles(76)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) + particles(77)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) + particles(78)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) + particles(79)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) + particles(80)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) + particles(81)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) + particles(82)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) + particles(83)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) + particles(84)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) + particles(85)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) + particles(86)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) + particles(87)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) + particles(88)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) + particles(89)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) + particles(90)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) + particles(91)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) + particles(92)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) + particles(93)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) + particles(94)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) + particles(95)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) + particles(96)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) + particles(97)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) + particles(98)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) + particles(99)=(spriteNum=0,cx=0.000000,cy=0.000000,ct=0.000000,waveFreq=0.000000,waveAmplitude=0.000000,dy=0.000000,dx=0.000000,col=(R=0,G=0,B=0,A=0)) + LastUpdateTime=0.000000 + minDX=0.000000 + maxDX=0.000000 + minDY=0.000000 + maxDY=0.000000 + minWaveAmplitude=0.000000 + maxWaveAmplitude=0.000000 +} diff --git a/Sources/Classes/SmartCTFSpawnNotifyPRI.uc b/Classes/SmartCTFSpawnNotifyPRI.UC similarity index 95% rename from Sources/Classes/SmartCTFSpawnNotifyPRI.uc rename to Classes/SmartCTFSpawnNotifyPRI.UC index 1abe6bb..7cdd3f6 100644 --- a/Sources/Classes/SmartCTFSpawnNotifyPRI.uc +++ b/Classes/SmartCTFSpawnNotifyPRI.UC @@ -1,39 +1,39 @@ -class SmartCTFSpawnNotifyPRI expands SpawnNotify; - -var Actor IpToCountry; -var bool bChecked; - -simulated event Actor SpawnNotification( Actor A ) -{ - local Actor Search; - local SmartCTFPlayerReplicationInfo RI; - - if( A.Owner == None ) return A; - if( !A.Owner.IsA( 'PlayerPawn' ) && !A.Owner.IsA( 'Bot' ) ) return A; - if( !Pawn( A.Owner ).bIsPlayer ) return A; - - if(!bChecked) - { - foreach Level.Game.AllActors(class'Actor', Search, 'IpToCountry') - { - IpToCountry=Search; - break; - } - bChecked=True; - } - // Spawn SmartCTF PRI for this pawn on the server - RI=Spawn( class'SmartCTFPlayerReplicationInfo', A ); - if(IpToCountry != None) - { - RI.IpToCountry=IpToCountry; - RI.bIpToCountry=True; - } - return A; -} - -defaultproperties -{ - ipToCountry=None - bChecked=False - ActorClass=Class'Engine.PlayerReplicationInfo' -} +class SmartCTFSpawnNotifyPRI expands SpawnNotify; + +var Actor IpToCountry; +var bool bChecked; + +simulated event Actor SpawnNotification( Actor A ) +{ + local Actor Search; + local SmartCTFPlayerReplicationInfo RI; + + if( A.Owner == None ) return A; + if( !A.Owner.IsA( 'PlayerPawn' ) && !A.Owner.IsA( 'Bot' ) ) return A; + if( !Pawn( A.Owner ).bIsPlayer ) return A; + + if(!bChecked) + { + foreach Level.Game.AllActors(class'Actor', Search, 'IpToCountry') + { + IpToCountry=Search; + break; + } + bChecked=True; + } + // Spawn SmartCTF PRI for this pawn on the server + RI=Spawn( class'SmartCTFPlayerReplicationInfo', A ); + if(IpToCountry != None) + { + RI.IpToCountry=IpToCountry; + RI.bIpToCountry=True; + } + return A; +} + +defaultproperties +{ + ipToCountry=None + bChecked=False + ActorClass=Class'Engine.PlayerReplicationInfo' +} diff --git a/Sources/Classes/SmartCTFSpreeMsg.uc b/Classes/SmartCTFSpreeMsg.UC similarity index 97% rename from Sources/Classes/SmartCTFSpreeMsg.uc rename to Classes/SmartCTFSpreeMsg.UC index 1abcbae..8d6878e 100644 --- a/Sources/Classes/SmartCTFSpreeMsg.uc +++ b/Classes/SmartCTFSpreeMsg.UC @@ -1,18 +1,18 @@ -class SmartCTFSpreeMsg expands KillingSpreeMessage; - -static function string GetString( optional int Switch, optional PlayerReplicationInfo RelatedPRI_1, optional PlayerReplicationInfo RelatedPRI_2, optional Object OptionalObject ) -{ - if( RelatedPRI_1 != None ) - { - if( Switch == 5 ) return default.SpreeNote[Switch] @ RelatedPRI_1.PlayerName $ "!"; - if( Switch == 6 ) return RelatedPRI_1.PlayerName @ class'TournamentPlayer'.default.SpreeNote[3]; - } - return ""; -} - -defaultproperties -{ - spreenote(5)="This is just TOO EASY for" - SpreeSound(5)=Sound'Botpack.ChatSound.SpreeSound' - SpreeSound(6)=Sound'Botpack.ChatSound.SpreeSound' -} +class SmartCTFSpreeMsg expands KillingSpreeMessage; + +static function string GetString( optional int Switch, optional PlayerReplicationInfo RelatedPRI_1, optional PlayerReplicationInfo RelatedPRI_2, optional Object OptionalObject ) +{ + if( RelatedPRI_1 != None ) + { + if( Switch == 5 ) return default.SpreeNote[Switch] @ RelatedPRI_1.PlayerName $ "!"; + if( Switch == 6 ) return RelatedPRI_1.PlayerName @ class'TournamentPlayer'.default.SpreeNote[3]; + } + return ""; +} + +defaultproperties +{ + spreenote(5)="This is just TOO EASY for" + SpreeSound(5)=Sound'Botpack.ChatSound.SpreeSound' + SpreeSound(6)=Sound'Botpack.ChatSound.SpreeSound' +} diff --git a/Sources/Classes/SmartCTFWelcomeNewPlayers.UC b/Classes/SmartCTFWelcomeNewPlayers.UC similarity index 96% rename from Sources/Classes/SmartCTFWelcomeNewPlayers.UC rename to Classes/SmartCTFWelcomeNewPlayers.UC index 010c1b2..4e24fcd 100644 --- a/Sources/Classes/SmartCTFWelcomeNewPlayers.UC +++ b/Classes/SmartCTFWelcomeNewPlayers.UC @@ -1,184 +1,184 @@ -class SmartCTFWelcomeNewPlayers expands Actor config(SmartCTF_ChaCha); - - -var config int PawnLastSeenMaxHistory; -var config array PawnIdentHistory; -var config byte WelcomeMsgType; -var config byte WelcomeBackMsgType; -var config bool bPlayWelcomeSound; -var config bool bPlayWelcomeOthersSound; -var config float fDelayWelcome; -var config float fDelayWelcomeBack; - -var Pawn OtherNewpawn; - - -function BumpPawnToTop(int IdxPawn) -{ - PawnIdentHistory.Insert(PawnIdentHistory.Length,1); - PawnIdentHistory[PawnIdentHistory.Length-1]=PawnIdentHistory[IdxPawn]; - PawnIdentHistory.Remove(IdxPawn); -} - -state Welcome -{ - function Timer() - { - local Pawn pn; - local PlayerReplicationInfo OtherNewpawnPRI; - - OtherNewpawnPRI = OtherNewpawn.PlayerReplicationInfo; - if( OtherNewpawnPRI == None || !OtherNewpawn.bIsPlayer || ( OtherNewpawnPRI.bIsSpectator && !OtherNewpawnPRI.bWaitingPlayer ) ) - { - return; - } - - if(bPlayWelcomeSound) - { - //log("a"); - //log(OtherNewpawn); - OtherNewpawn.ReceiveLocalizedMessage( class'SmartCTFAudioMsg', 7 ); - } - if(WelcomeMsgType==1) - { - //log("b"); - //log(OtherNewpawn); - OtherNewpawn.ClientMessage( class'SmartCTFCoolMsg'.static.GetString(8)); - } - else if(WelcomeMsgType==2) - { - //log("c"); - Level.Game.BroadcastMessage( class'SmartCTFCoolMsg'.static.GetString(8 +64,OtherNewpawnPRI)); - } - else if(WelcomeMsgType==3) - { - //log("d"); - //log(class'SmartCTFCoolMsg'.static.GetString(8+64,OtherNewpawnPRI)); - Level.Game.BroadcastLocalizedMessage( class'SmartCTFCoolMsg',8 + 64,OtherNewpawnPRI); - } - - if(bPlayWelcomeOthersSound) - { - //log("e"); - for( pn = Level.PawnList; pn != None; pn = pn.NextPawn ) - { - if( PlayerPawn( pn ) != None && pn.bIsPlayer && pn != OtherNewpawn) - { - //log("f"); - //log(pn); - pn.ReceiveLocalizedMessage( class'SmartCTFAudioMsg', 7 ); - } - } - } - } -} -state WelcomeBack -{ - function Timer() - { - local PlayerReplicationInfo OtherNewpawnPRI; - - OtherNewpawnPRI = OtherNewpawn.PlayerReplicationInfo; - if( OtherNewpawnPRI == None || !OtherNewpawn.bIsPlayer || ( OtherNewpawnPRI.bIsSpectator && !OtherNewpawnPRI.bWaitingPlayer ) ) - { - return; - } - if(WelcomeBackMsgType==1) - { - //log("b"); - //log(OtherNewpawn); - OtherNewpawn.ClientMessage( class'SmartCTFCoolMsg'.static.GetString(9)); - } - else if(WelcomeBackMsgType==2) - { - //log("c"); - Level.Game.BroadcastMessage( class'SmartCTFCoolMsg'.static.GetString(9 +64,OtherNewpawnPRI)); - } - else if(WelcomeBackMsgType==3) - { - //log("d"); - //log(class'SmartCTFCoolMsg'.static.GetString(9+64,OtherNewpawnPRI)); - Level.Game.BroadcastLocalizedMessage( class'SmartCTFCoolMsg',9 + 64,OtherNewpawnPRI); - } - } -} - -function CheckPawn(Pawn Other,bool bIsFirstSpawn) -{ - local int i,iColon; - local string PawnIPPort,PawnIP,PawnName,PawnIdent; - - if( PlayerPawn( Other ) == None) - { - return; - } - - PawnIPPort = PlayerPawn(Other).GetPlayerNetworkAddress(); - iColon = InStr( PawnIPPort, ":" ); - PawnIP = Left( PawnIPPort, iColon ); - if( PawnIP == "") - { - log("[WARNING] Ignored player with empty / incorrect IP address"); - return; - } - PawnName = Other.PlayerReplicationInfo.PlayerName; - - PawnIdent=PawnIP$":"$PawnName; - - //log(Other); - //log(PawnIPPort); - //log(PawnIP); - //log(PawnName); - //log(PawnIdent); - - if( PawnIdentHistory.Length > PawnLastSeenMaxHistory) - { - PawnIdentHistory.Remove(0,PawnIdentHistory.Length - PawnLastSeenMaxHistory); - log("[WARNING] PawnIdentHistory too big, removing old history..."); - } - - for ( i = 0; ( i < PawnIdentHistory.Length ); i++ ) - { - if( PawnIdentHistory[i] == PawnIdent) - { - //log("Pawn FOUND in history :-) !"); - BumpPawnToTop(i); - OtherNewpawn=Other; - if(bIsFirstSpawn) - { - GotoState('WelcomeBack'); - SetTimer(fDelayWelcomeBack,False); - } - SaveConfig(); - return; - } - } - - //log("Pawn NOT found in history :( !"); - PawnIdentHistory.Insert(PawnIdentHistory.Length,1); - PawnIdentHistory[PawnIdentHistory.Length-1]=PawnIdent; - - if( PawnIdentHistory.Length > PawnLastSeenMaxHistory) - { - //log("Need to trim history"); - PawnIdentHistory.Remove(0,1); - } - OtherNewpawn=Other; - GotoState('Welcome'); - SetTimer(fDelayWelcome,False); - - //log("Finish"); - SaveConfig(); -} - -defaultproperties -{ - PawnLastSeenMaxHistory=256 - WelcomeMsgType=3 - WelcomeBackMsgType=3 - bPlayWelcomeSound=True - bPlayWelcomeOthersSound=True - fDelayWelcome=1.0 - fDelayWelcomeBack=1.0 - bHidden=True +class SmartCTFWelcomeNewPlayers expands Actor config(SmartCTF_ChaCha); + + +var config int PawnLastSeenMaxHistory; +var config array PawnIdentHistory; +var config byte WelcomeMsgType; +var config byte WelcomeBackMsgType; +var config bool bPlayWelcomeSound; +var config bool bPlayWelcomeOthersSound; +var config float fDelayWelcome; +var config float fDelayWelcomeBack; + +var Pawn OtherNewpawn; + + +function BumpPawnToTop(int IdxPawn) +{ + PawnIdentHistory.Insert(PawnIdentHistory.Length,1); + PawnIdentHistory[PawnIdentHistory.Length-1]=PawnIdentHistory[IdxPawn]; + PawnIdentHistory.Remove(IdxPawn); +} + +state Welcome +{ + function Timer() + { + local Pawn pn; + local PlayerReplicationInfo OtherNewpawnPRI; + + OtherNewpawnPRI = OtherNewpawn.PlayerReplicationInfo; + if( OtherNewpawnPRI == None || !OtherNewpawn.bIsPlayer || ( OtherNewpawnPRI.bIsSpectator && !OtherNewpawnPRI.bWaitingPlayer ) ) + { + return; + } + + if(bPlayWelcomeSound) + { + //log("a"); + //log(OtherNewpawn); + OtherNewpawn.ReceiveLocalizedMessage( class'SmartCTFAudioMsg', 7 ); + } + if(WelcomeMsgType==1) + { + //log("b"); + //log(OtherNewpawn); + OtherNewpawn.ClientMessage( class'SmartCTFCoolMsg'.static.GetString(8)); + } + else if(WelcomeMsgType==2) + { + //log("c"); + Level.Game.BroadcastMessage( class'SmartCTFCoolMsg'.static.GetString(8 +64,OtherNewpawnPRI)); + } + else if(WelcomeMsgType==3) + { + //log("d"); + //log(class'SmartCTFCoolMsg'.static.GetString(8+64,OtherNewpawnPRI)); + Level.Game.BroadcastLocalizedMessage( class'SmartCTFCoolMsg',8 + 64,OtherNewpawnPRI); + } + + if(bPlayWelcomeOthersSound) + { + //log("e"); + for( pn = Level.PawnList; pn != None; pn = pn.NextPawn ) + { + if( PlayerPawn( pn ) != None && pn.bIsPlayer && pn != OtherNewpawn) + { + //log("f"); + //log(pn); + pn.ReceiveLocalizedMessage( class'SmartCTFAudioMsg', 7 ); + } + } + } + } +} +state WelcomeBack +{ + function Timer() + { + local PlayerReplicationInfo OtherNewpawnPRI; + + OtherNewpawnPRI = OtherNewpawn.PlayerReplicationInfo; + if( OtherNewpawnPRI == None || !OtherNewpawn.bIsPlayer || ( OtherNewpawnPRI.bIsSpectator && !OtherNewpawnPRI.bWaitingPlayer ) ) + { + return; + } + if(WelcomeBackMsgType==1) + { + //log("b"); + //log(OtherNewpawn); + OtherNewpawn.ClientMessage( class'SmartCTFCoolMsg'.static.GetString(9)); + } + else if(WelcomeBackMsgType==2) + { + //log("c"); + Level.Game.BroadcastMessage( class'SmartCTFCoolMsg'.static.GetString(9 +64,OtherNewpawnPRI)); + } + else if(WelcomeBackMsgType==3) + { + //log("d"); + //log(class'SmartCTFCoolMsg'.static.GetString(9+64,OtherNewpawnPRI)); + Level.Game.BroadcastLocalizedMessage( class'SmartCTFCoolMsg',9 + 64,OtherNewpawnPRI); + } + } +} + +function CheckPawn(Pawn Other,bool bIsFirstSpawn) +{ + local int i,iColon; + local string PawnIPPort,PawnIP,PawnName,PawnIdent; + + if( PlayerPawn( Other ) == None) + { + return; + } + + PawnIPPort = PlayerPawn(Other).GetPlayerNetworkAddress(); + iColon = InStr( PawnIPPort, ":" ); + PawnIP = Left( PawnIPPort, iColon ); + if( PawnIP == "") + { + log("[WARNING] Ignored player with empty / incorrect IP address"); + return; + } + PawnName = Other.PlayerReplicationInfo.PlayerName; + + PawnIdent=PawnIP$":"$PawnName; + + //log(Other); + //log(PawnIPPort); + //log(PawnIP); + //log(PawnName); + //log(PawnIdent); + + if( PawnIdentHistory.Length > PawnLastSeenMaxHistory) + { + PawnIdentHistory.Remove(0,PawnIdentHistory.Length - PawnLastSeenMaxHistory); + log("[WARNING] PawnIdentHistory too big, removing old history..."); + } + + for ( i = 0; ( i < PawnIdentHistory.Length ); i++ ) + { + if( PawnIdentHistory[i] == PawnIdent) + { + //log("Pawn FOUND in history :-) !"); + BumpPawnToTop(i); + OtherNewpawn=Other; + if(bIsFirstSpawn) + { + GotoState('WelcomeBack'); + SetTimer(fDelayWelcomeBack,False); + } + SaveConfig(); + return; + } + } + + //log("Pawn NOT found in history :( !"); + PawnIdentHistory.Insert(PawnIdentHistory.Length,1); + PawnIdentHistory[PawnIdentHistory.Length-1]=PawnIdent; + + if( PawnIdentHistory.Length > PawnLastSeenMaxHistory) + { + //log("Need to trim history"); + PawnIdentHistory.Remove(0,1); + } + OtherNewpawn=Other; + GotoState('Welcome'); + SetTimer(fDelayWelcome,False); + + //log("Finish"); + SaveConfig(); +} + +defaultproperties +{ + PawnLastSeenMaxHistory=256 + WelcomeMsgType=3 + WelcomeBackMsgType=3 + bPlayWelcomeSound=True + bPlayWelcomeOthersSound=True + fDelayWelcome=1.0 + fDelayWelcomeBack=1.0 + bHidden=True } \ No newline at end of file diff --git a/Readme.md b/Readme.md new file mode 100644 index 0000000..e69de29 diff --git a/Sources/Sounds/AirKill.WAV b/Sounds/AirKill.WAV similarity index 100% rename from Sources/Sounds/AirKill.WAV rename to Sounds/AirKill.WAV diff --git a/Sources/Sounds/Denied.WAV b/Sounds/Denied.WAV similarity index 100% rename from Sources/Sounds/Denied.WAV rename to Sounds/Denied.WAV diff --git a/Sources/Sounds/HolyShit.wav b/Sounds/HolyShit.wav similarity index 100% rename from Sources/Sounds/HolyShit.wav rename to Sounds/HolyShit.wav diff --git a/Sources/Sounds/LudicrousKill.wav b/Sounds/LudicrousKill.wav similarity index 100% rename from Sources/Sounds/LudicrousKill.wav rename to Sounds/LudicrousKill.wav diff --git a/Sources/Sounds/welcome.wav b/Sounds/welcome.wav similarity index 100% rename from Sources/Sounds/welcome.wav rename to Sounds/welcome.wav diff --git a/Sources/make.bat b/Sources/make.bat deleted file mode 100644 index 2250228..0000000 --- a/Sources/make.bat +++ /dev/null @@ -1,2 +0,0 @@ -del %~dp0\..\System\SmartCTF_ChaChaV6.u -%~dp0\..\System\ucc.exe make SmartCTF_ChaChaV6 \ No newline at end of file diff --git a/System/SmartCTF_ChaChaV6.u b/System/SmartCTF_ChaChaV6.u new file mode 100644 index 0000000000000000000000000000000000000000..25a4450ae8ccbb42642717f568b34d07e43524a4 GIT binary patch literal 717152 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

E_3ydk= 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�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

Y~rY1YgCG>=A2}N+>dGKoY6s{?;E2HQ9I(h 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 z TT7TO*TDHZcZ>Kf}YVdGYMoI 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 LY0!?8eR=;IfreW= literal 0 HcmV?d00001 diff --git a/Sources/Textures/faceless.pcx b/Textures/faceless.pcx similarity index 100% rename from Sources/Textures/faceless.pcx rename to Textures/faceless.pcx diff --git a/Sources/Textures/meter.pcx b/Textures/meter.pcx similarity index 100% rename from Sources/Textures/meter.pcx rename to Textures/meter.pcx diff --git a/Sources/Textures/powered.pcx b/Textures/powered.pcx similarity index 100% rename from Sources/Textures/powered.pcx rename to Textures/powered.pcx diff --git a/Sources/Textures/presents.pcx b/Textures/presents.pcx similarity index 100% rename from Sources/Textures/presents.pcx rename to Textures/presents.pcx diff --git a/Sources/Textures/santa.pcx b/Textures/santa.pcx similarity index 100% rename from Sources/Textures/santa.pcx rename to Textures/santa.pcx diff --git a/Sources/Textures/shade.pcx b/Textures/shade.pcx similarity index 100% rename from Sources/Textures/shade.pcx rename to Textures/shade.pcx diff --git a/Sources/Textures/SnowFlake1.pcx b/Textures/snowFlake1.pcx similarity index 100% rename from Sources/Textures/SnowFlake1.pcx rename to Textures/snowFlake1.pcx diff --git a/Sources/Textures/SnowFlake10.pcx b/Textures/snowFlake10.pcx similarity index 100% rename from Sources/Textures/SnowFlake10.pcx rename to Textures/snowFlake10.pcx diff --git a/Sources/Textures/SnowFlake11.pcx b/Textures/snowFlake11.pcx similarity index 100% rename from Sources/Textures/SnowFlake11.pcx rename to Textures/snowFlake11.pcx diff --git a/Sources/Textures/SnowFlake12.pcx b/Textures/snowFlake12.pcx similarity index 100% rename from Sources/Textures/SnowFlake12.pcx rename to Textures/snowFlake12.pcx diff --git a/Sources/Textures/SnowFlake13.pcx b/Textures/snowFlake13.pcx similarity index 100% rename from Sources/Textures/SnowFlake13.pcx rename to Textures/snowFlake13.pcx diff --git a/Sources/Textures/SnowFlake14.pcx b/Textures/snowFlake14.pcx similarity index 100% rename from Sources/Textures/SnowFlake14.pcx rename to Textures/snowFlake14.pcx diff --git a/Sources/Textures/SnowFlake15.pcx b/Textures/snowFlake15.pcx similarity index 100% rename from Sources/Textures/SnowFlake15.pcx rename to Textures/snowFlake15.pcx diff --git a/Sources/Textures/SnowFlake16.pcx b/Textures/snowFlake16.pcx similarity index 100% rename from Sources/Textures/SnowFlake16.pcx rename to Textures/snowFlake16.pcx diff --git a/Sources/Textures/SnowFlake2.pcx b/Textures/snowFlake2.pcx similarity index 100% rename from Sources/Textures/SnowFlake2.pcx rename to Textures/snowFlake2.pcx diff --git a/Sources/Textures/SnowFlake3.pcx b/Textures/snowFlake3.pcx similarity index 100% rename from Sources/Textures/SnowFlake3.pcx rename to Textures/snowFlake3.pcx diff --git a/Sources/Textures/SnowFlake4.pcx b/Textures/snowFlake4.pcx similarity index 100% rename from Sources/Textures/SnowFlake4.pcx rename to Textures/snowFlake4.pcx diff --git a/Sources/Textures/SnowFlake5.pcx b/Textures/snowFlake5.pcx similarity index 100% rename from Sources/Textures/SnowFlake5.pcx rename to Textures/snowFlake5.pcx diff --git a/Sources/Textures/SnowFlake6.pcx b/Textures/snowFlake6.pcx similarity index 100% rename from Sources/Textures/SnowFlake6.pcx rename to Textures/snowFlake6.pcx diff --git a/Sources/Textures/SnowFlake7.pcx b/Textures/snowFlake7.pcx similarity index 100% rename from Sources/Textures/SnowFlake7.pcx rename to Textures/snowFlake7.pcx diff --git a/Sources/Textures/SnowFlake8.pcx b/Textures/snowFlake8.pcx similarity index 100% rename from Sources/Textures/SnowFlake8.pcx rename to Textures/snowFlake8.pcx diff --git a/Sources/Textures/SnowFlake9.pcx b/Textures/snowFlake9.pcx similarity index 100% rename from Sources/Textures/SnowFlake9.pcx rename to Textures/snowFlake9.pcx diff --git a/make.bat b/make.bat new file mode 100644 index 0000000..77ac5ec --- /dev/null +++ b/make.bat @@ -0,0 +1,6 @@ +set UArtifactName=SmartCTF_ChaChaV6 +del %~dp0\..\System\%UArtifactName%.u +del %~dp0\System\%UArtifactName%.u +%~dp0\..\System\ucc.exe make ini=%~dp0\make.ini +%~dp0\..\System\ucc.exe stripsource %UArtifactName% +xcopy %~dp0\..\System\%UArtifactName%.u %~dp0\System\ \ No newline at end of file diff --git a/make.ini b/make.ini new file mode 100644 index 0000000..0a93ae4 --- /dev/null +++ b/make.ini @@ -0,0 +1,31 @@ +[Core.System] +Paths=../System/*.u +Paths=../Maps/*.unr +Paths=../Textures/*.utx +Paths=../Sounds/*.uax +Paths=../Music/*.umx + +[Engine.Engine] +EditorEngine=Editor.EditorEngine +Language=int + +[Editor.EditorEngine] +CacheSizeMegs=32 +EditPackages=Core +EditPackages=Engine +EditPackages=Editor +EditPackages=UWindow +EditPackages=Fire +EditPackages=IpDrv +EditPackages=UWeb +EditPackages=UBrowser +EditPackages=UnrealShare +EditPackages=UnrealI +EditPackages=UMenu +EditPackages=IpServer +EditPackages=Botpack +EditPackages=UTServerAdmin +EditPackages=UTMenu +EditPackages=UTBrowser +EditPackages=SmartCTF_ChaChaV6 +