V4
This commit is contained in:
@@ -4,11 +4,21 @@
|
||||
// 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 ChaCha V1 by chacha. 2023:
|
||||
// - add bLongRangeSuperShock option to allow bShowLongRangeMsg with SuperShockRifle
|
||||
// - fix compilation warnings
|
||||
// SmartCTF ChaCha V2 by chacha. 2023:
|
||||
// - add Denied & AirKill Features
|
||||
// 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
|
||||
//
|
||||
//
|
||||
// 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.
|
||||
@@ -77,7 +87,7 @@ var int LogoCounter, DrawLogo, SbCount;
|
||||
var float SbDelayC;
|
||||
var PlayerPawn PlayerOwner;
|
||||
var FontInfo MyFonts;
|
||||
var TournamentGameReplicationInfo pTGRI;
|
||||
var TournamentGameReplicationInfo pTGRI;
|
||||
var PlayerReplicationInfo pPRI;
|
||||
var ChallengeHUD MyHUD;
|
||||
var Color RedTeamColor, BlueTeamColor, White, Gray;
|
||||
@@ -213,6 +223,8 @@ 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.
|
||||
|
||||
@@ -248,7 +260,11 @@ function PostBeginPlay()
|
||||
}
|
||||
|
||||
// Get the Flag bases
|
||||
ForEach AllActors( class'FlagBase', fb ) FlagStands[ fb.Team ] = fb;
|
||||
ForEach AllActors( class'FlagBase', fb )
|
||||
{
|
||||
FlagStands[ fb.Team ] = fb;
|
||||
}
|
||||
|
||||
if( VSize( FlagStands[0].Location - FlagStands[1].Location ) < 1.5 * 900 )
|
||||
{
|
||||
bTooCloseForSaves = True;
|
||||
@@ -300,15 +316,15 @@ function bool ValidateSmartCTFMutator()
|
||||
|
||||
if( !bEnabled )
|
||||
{
|
||||
Log( "Instance" @ Name @ "not loaded because bEnabled in .ini = False.", 'SmartCTF' );
|
||||
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' );
|
||||
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' );
|
||||
Log( "Instance" @ Name @ "not loaded because it is already running.", 'SmartCTF' );
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -318,28 +334,45 @@ function bool ValidateSmartCTFMutator()
|
||||
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 Inventory Inv;
|
||||
local SmartCTFPlayerReplicationInfo OtherStats;
|
||||
local string IP;
|
||||
local int j,i;
|
||||
|
||||
if( bFixFlagBug && Other.bIsPlayer && !( Other.PlayerReplicationInfo.bIsSpectator && !Other.PlayerReplicationInfo.bWaitingPlayer ) )
|
||||
local int j,i;
|
||||
local bool bIsFirstSpawn;
|
||||
|
||||
|
||||
if( Other.bIsPlayer && !Other.IsA('Bot') && !( Other.PlayerReplicationInfo.bIsSpectator && !Other.PlayerReplicationInfo.bWaitingPlayer ) )
|
||||
{
|
||||
Inv = Spawn( class'SmartCTFFlagCheckerInventory' , Other );
|
||||
if( Inv != None )
|
||||
// little hacky method to know if its 1st spawn or not
|
||||
bIsFirstSpawn = Other.PlayerReplicationInfo.Deaths < 1;
|
||||
SCTFGame.WelcomeNewPlayers.CheckPawn(Other,bIsFirstSpawn);
|
||||
if( bFixFlagBug)
|
||||
{
|
||||
Inv.GiveTo( Other );
|
||||
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" )
|
||||
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,":");
|
||||
@@ -386,7 +419,7 @@ function ModifyPlayer( Pawn Other )
|
||||
}
|
||||
|
||||
|
||||
//If(OtherStats == none) return; proves fatal for StoreStats
|
||||
|
||||
if( !OtherStats.bHadFirstSpawn )
|
||||
{
|
||||
OtherStats.bHadFirstSpawn = True;
|
||||
@@ -695,14 +728,12 @@ function bool PreventDeath( Pawn Victim, Pawn Killer, name DamageType, vector Hi
|
||||
local float TimeAwake;
|
||||
local SmartCTFPlayerReplicationInfo KillerStats, VictimStats;
|
||||
|
||||
log("PreventDeath()");
|
||||
|
||||
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 )
|
||||
{
|
||||
@@ -718,14 +749,20 @@ function bool PreventDeath( Pawn Victim, Pawn Killer, name DamageType, vector Hi
|
||||
VictimStats = SCTFGame.GetStats( Victim );
|
||||
|
||||
// airkill handling
|
||||
if(bPlayAirKillSound)
|
||||
if(bPlayAirKillSound && (Victim!=Killer))
|
||||
{
|
||||
if(PlayerPawn(Victim).Physics == PHYS_Falling && PlayerPawn(Killer).Physics == PHYS_Falling)
|
||||
if(Victim.Physics == PHYS_Falling && Killer.Physics == PHYS_Falling)
|
||||
{
|
||||
Victim.ReceiveLocalizedMessage( class'SmartCTFAudioMsg', 6);
|
||||
Victim.ReceiveLocalizedMessage( class'SmartCTFCoolMsg', 7);
|
||||
Killer.ReceiveLocalizedMessage( class'SmartCTFAudioMsg', 6);
|
||||
Killer.ReceiveLocalizedMessage( class'SmartCTFCoolMsg', 6);
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -734,6 +771,7 @@ function bool PreventDeath( Pawn Victim, Pawn Killer, name DamageType, vector Hi
|
||||
VictimStats.FragSpree = 0; // Reset FragSpree for Victim
|
||||
VictimStats.SpawnKillSpree = 0;
|
||||
}
|
||||
|
||||
// If there is no killer / suicide, return.
|
||||
if( Killer == None || Killer == Victim )
|
||||
{
|
||||
@@ -749,6 +787,7 @@ function bool PreventDeath( Pawn Victim, Pawn Killer, name DamageType, vector Hi
|
||||
{
|
||||
return bPrevent;
|
||||
}
|
||||
|
||||
KillerStats = SCTFGame.GetStats( Killer );
|
||||
// Same Team! We don't count those stats like that in SmartCTF.
|
||||
if( VictimPRI.Team == KillerPRI.Team )
|
||||
@@ -826,10 +865,9 @@ function bool PreventDeath( Pawn Victim, Pawn Killer, name DamageType, vector Hi
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
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 )
|
||||
{
|
||||
@@ -849,7 +887,7 @@ function bool PreventDeath( Pawn Victim, Pawn Killer, name DamageType, vector Hi
|
||||
|| ( 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] ) ) )
|
||||
|| ( VSize( Victim.Location - FCs[KillerPRI.Team].Location ) < 768 && Victim.lineOfSightTo( FCs[KillerPRI.Team] ) ) )
|
||||
{
|
||||
// Killer DEFENDED THE Flag CARRIER
|
||||
if( KillerStats != None )
|
||||
@@ -923,10 +961,12 @@ function bool PreventDeath( Pawn Victim, Pawn Killer, name DamageType, vector Hi
|
||||
{
|
||||
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 )
|
||||
{
|
||||
@@ -993,6 +1033,7 @@ function bool PreventDeath( Pawn Victim, Pawn Killer, name DamageType, vector Hi
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if( bAfterGodLikeMsg && KillerStats != None && ( KillerStats.FragSpree == 30 || KillerStats.FragSpree == 35 ) )
|
||||
{
|
||||
for( pn = Level.PawnList; pn != None; pn = pn.NextPawn )
|
||||
@@ -2208,17 +2249,33 @@ simulated event PostRender( Canvas C )
|
||||
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;
|
||||
MyHUD = ChallengeHUD( PlayerOwner.MyHUD );
|
||||
|
||||
pTGRI = TournamentGameReplicationInfo( PlayerOwner.GameReplicationInfo );
|
||||
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 )
|
||||
{
|
||||
@@ -2330,11 +2387,6 @@ simulated event PostRender( Canvas C )
|
||||
}
|
||||
|
||||
C.Style = ERenderStyle.STY_Normal;
|
||||
|
||||
if( NextHUDMutator != None )
|
||||
{
|
||||
NextHUDMutator.PostRender( C );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -2410,12 +2462,15 @@ simulated function Tick( float delta )
|
||||
}
|
||||
|
||||
// If Game is over, bring up F3.
|
||||
if( PlayerOwner.GameReplicationInfo.GameEndedComments != "" && !bGameEnded )
|
||||
if(PlayerOwner.GameReplicationInfo !=None)
|
||||
{
|
||||
bGameEnded = True;
|
||||
OwnerStats = SCTFGame.GetStatsByPRI( pPRI );
|
||||
OwnerStats.bEndStats = True;
|
||||
PlayerOwner.ConsoleCommand( "mutate SmartCTF ForceStats" );
|
||||
if( PlayerOwner.GameReplicationInfo.GameEndedComments != "" && !bGameEnded )
|
||||
{
|
||||
bGameEnded = True;
|
||||
OwnerStats = SCTFGame.GetStatsByPRI( pPRI );
|
||||
OwnerStats.bEndStats = True;
|
||||
PlayerOwner.ConsoleCommand( "mutate SmartCTF ForceStats" );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -2584,9 +2639,6 @@ simulated function Timer()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
defaultproperties
|
||||
@@ -2595,7 +2647,7 @@ defaultproperties
|
||||
RedAstIndex=0
|
||||
BlueAstIndex=0
|
||||
TRCount=0
|
||||
version="ChaChaV2"
|
||||
version="ChaChaV4"
|
||||
GameTieMessage="The game ended in a tie!"
|
||||
FCs(0)=None
|
||||
FCs(1)=None
|
||||
@@ -3526,7 +3578,7 @@ defaultproperties
|
||||
Gray=(R=128,G=128,B=128,A=0)
|
||||
bEnabled=True
|
||||
bExtraStats=False
|
||||
CountryFlagsPackage="CountryFlags2"
|
||||
CountryFlagsPackage="CountryFlags32"
|
||||
CapBonus=15
|
||||
AssistBonus=7
|
||||
FlagKillBonus=3
|
||||
|
||||
@@ -6,6 +6,7 @@ class SmartCTFAudioMsg expands LocalMessagePlus;
|
||||
|
||||
#exec AUDIO IMPORT NAME=denied FILE=Sounds\Denied.wav GROUP=SmartCTF
|
||||
#exec AUDIO IMPORT NAME=airkill FILE=Sounds\AirKill.wav GROUP=SmartCTF
|
||||
#exec AUDIO IMPORT NAME=welcome FILE=Sounds\welcome.wav GROUP=SmartCTF
|
||||
|
||||
|
||||
|
||||
@@ -42,6 +43,9 @@ static simulated function ClientReceive( PlayerPawn P, optional int Switch, opti
|
||||
case 6:
|
||||
P.ClientPlaySound( sound'airkill', , true );
|
||||
break;
|
||||
case 7:
|
||||
P.ClientPlaySound( sound'welcome', , true );
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -7,13 +7,28 @@ var(Messages) string OvertimeEnabledString;
|
||||
var(Messages) string OvertimeDisabledString;
|
||||
var(Messages) string AirKillMsg;
|
||||
var(Messages) string AirKilledMsg;
|
||||
var Color EnabledColor, DisabledColor, SpawnLamerColor,AirKillColor,AirKilledColor;
|
||||
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 )
|
||||
|
||||
static function float GetOffset( int Switch, float YL, float ClipY )
|
||||
{
|
||||
return ( default.YPos / 768.0 ) * ClipY - 2 * YL;
|
||||
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 )
|
||||
@@ -25,6 +40,11 @@ static function string GetString( optional int Switch, optional PlayerReplicatio
|
||||
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 "";
|
||||
}
|
||||
@@ -40,6 +60,12 @@ static function Color GetColor( optional int Switch, optional PlayerReplicationI
|
||||
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;
|
||||
}
|
||||
@@ -53,11 +79,17 @@ defaultproperties
|
||||
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
|
||||
|
||||
@@ -11,6 +11,7 @@ var color SpectatorColor;
|
||||
var string CountryFlagsPackage;
|
||||
var class<ScoreBoard> NormalScoreBoardClass;
|
||||
var SmartCTFEndStats EndStats;
|
||||
var SmartCTFWelcomeNewPlayers WelcomeNewPlayers;
|
||||
var SmartCTFPlayerReplicationInfo PRIArray[64];
|
||||
var bool bInitialized, bServerInfoSetServerSide, bDoneBind;
|
||||
var class<HUD> DefaultHUDType;
|
||||
@@ -27,8 +28,7 @@ replication
|
||||
|
||||
simulated function PostBeginPlay()
|
||||
{
|
||||
//default.NormalScoreBoardClass = Level.Game.ScoreBoardType;
|
||||
SetTimer( 0.5, True );
|
||||
SetTimer( 0.5, True );
|
||||
}
|
||||
|
||||
simulated function Timer()
|
||||
|
||||
@@ -21,19 +21,19 @@ static function string GetString( optional int Switch, optional PlayerReplicatio
|
||||
switch( Switch )
|
||||
{
|
||||
case 0: // Cover FC
|
||||
return RelatedPRI_1.PlayerName @ default.CoveredMsg;
|
||||
return RelatedPRI_1.PlayerName @ default.CoveredMsg;
|
||||
case 1: // Seal base
|
||||
return RelatedPRI_1.PlayerName @ default.SealMsg;
|
||||
return RelatedPRI_1.PlayerName @ default.SealMsg;
|
||||
case 4: // Ultra cover
|
||||
return RelatedPRI_1.PlayerName @ default.UltraCoverMsg;
|
||||
return RelatedPRI_1.PlayerName @ default.UltraCoverMsg;
|
||||
case 5: // Cover spree
|
||||
return RelatedPRI_1.PlayerName @ default.CoverSpreeMsg;
|
||||
return RelatedPRI_1.PlayerName @ default.CoverSpreeMsg;
|
||||
case 7: // Saved by ...
|
||||
return default.SavedMsg @ RelatedPRI_1.PlayerName $ "!";
|
||||
return default.SavedMsg @ RelatedPRI_1.PlayerName $ "!";
|
||||
case 10: // Spawnkilling
|
||||
return RelatedPRI_1.PlayerName @ default.SpawnKillMsg;
|
||||
return RelatedPRI_1.PlayerName @ default.SpawnKillMsg;
|
||||
case 11: // Denied
|
||||
return RelatedPRI_1.PlayerName @ default.DeniedMsg;
|
||||
return default.DeniedMsg @ RelatedPRI_1.PlayerName;
|
||||
|
||||
case 0 + 64:
|
||||
return default.YouCoveredMsg;
|
||||
|
||||
@@ -16,7 +16,7 @@ var Color White, Gray, DarkGray, Yellow, RedTeamColor, BlueTeamColor, RedHeaderC
|
||||
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 TournamentGameReplicationInfo pTGRI;
|
||||
var PlayerReplicationInfo pPRI;
|
||||
var Font StatFont, CapFont, FooterFont, GameEndedFont, PlayerNameFont, FragsFont, TinyInfoFont;
|
||||
var Font PtsFont22, PtsFont20, PtsFont18, PtsFont16, PtsFont14, PtsFont12;
|
||||
@@ -58,7 +58,7 @@ function PostBeginPlay()
|
||||
super.PostBeginPlay();
|
||||
|
||||
PlayerOwner = PlayerPawn( Owner );
|
||||
pTGRI = TournamentGameReplicationInfo( PlayerOwner.GameReplicationInfo );
|
||||
pTGRI = TournamentGameReplicationInfo (PlayerOwner.GameReplicationInfo);
|
||||
pPRI = PlayerOwner.PlayerReplicationInfo;
|
||||
LastSortTime = -100;
|
||||
|
||||
|
||||
184
Sources/Classes/SmartCTFWelcomeNewPlayers.UC
Normal file
184
Sources/Classes/SmartCTFWelcomeNewPlayers.UC
Normal file
@@ -0,0 +1,184 @@
|
||||
class SmartCTFWelcomeNewPlayers expands Actor config(SmartCTF_ChaCha);
|
||||
|
||||
|
||||
var config int PawnLastSeenMaxHistory;
|
||||
var config array<string> 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
|
||||
}
|
||||
BIN
Sources/Sounds/welcome.wav
Normal file
BIN
Sources/Sounds/welcome.wav
Normal file
Binary file not shown.
@@ -1,2 +1,2 @@
|
||||
del %~dp0\..\System\SmartCTF_ChaChaV2.u
|
||||
%~dp0\..\System\ucc.exe make SmartCTF_ChaChaV2
|
||||
del %~dp0\..\System\SmartCTF_ChaChaV4.u
|
||||
%~dp0\..\System\ucc.exe make SmartCTF_ChaChaV4
|
||||
Reference in New Issue
Block a user