change directory structure and update make process

This commit is contained in:
chacha
2026-01-28 23:43:10 +00:00
parent a11be8e33d
commit 6e24cb964d
51 changed files with 7767 additions and 6638 deletions

File diff suppressed because it is too large Load Diff

View File

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

View File

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

View File

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

View File

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

View File

@@ -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!!!"
}

View File

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

View File

@@ -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<ScoreBoard> NormalScoreBoardClass;
var SmartCTFEndStats EndStats;
var SmartCTFWelcomeNewPlayers WelcomeNewPlayers;
var SmartCTFPlayerReplicationInfo PRIArray[64];
var bool bInitialized, bServerInfoSetServerSide, bDoneBind;
var class<HUD> 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<ScoreBoard> NormalScoreBoardClass;
var SmartCTFEndStats EndStats;
var SmartCTFWelcomeNewPlayers WelcomeNewPlayers;
var SmartCTFPlayerReplicationInfo PRIArray[64];
var bool bInitialized, bServerInfoSetServerSide, bDoneBind;
var class<HUD> 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
}

View File

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

View File

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

File diff suppressed because it is too large Load Diff

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -1,184 +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
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
}

0
Readme.md Normal file
View File

View File

@@ -1,2 +0,0 @@
del %~dp0\..\System\SmartCTF_ChaChaV6.u
%~dp0\..\System\ucc.exe make SmartCTF_ChaChaV6

BIN
System/SmartCTF_ChaChaV6.u Normal file

Binary file not shown.

6
make.bat Normal file
View File

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

31
make.ini Normal file
View File

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