This commit is contained in:
cclecle
2023-06-02 18:42:39 +01:00
parent 0f554a5ec7
commit 4c84d5865a
9 changed files with 339 additions and 67 deletions

View File

@@ -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

View File

@@ -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;
}
}

View File

@@ -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

View File

@@ -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()

View File

@@ -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;

View File

@@ -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;

View 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

Binary file not shown.

View File

@@ -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