1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
|
global function GamemodeKR_Init
struct {
float currentHighestKillraceAmount
int currentKillraceScore
entity currentRacer
array<vector> flagSpawnPoints
} file
void function GamemodeKR_Init()
{
PrecacheModel( CTF_FLAG_MODEL )
SetSpawnpointGamemodeOverride( FFA )
ClassicMP_ForceDisableEpilogue( true )
Riff_ForceTitanAvailability( eTitanAvailability.Never )
Riff_ForceBoostAvailability( eBoostAvailability.Disabled )
AddSpawnCallback( "info_hardpoint", AddFlagSpawnPoint )
AddCallback_OnPlayerKilled( OnPlayerKilled )
AddCallback_OnTouchHealthKit( "item_flag", StartPlayerKillrace )
AddCallback_GameStateEnter( eGameState.Playing, StartKillraceSpawnThink )
}
void function AddFlagSpawnPoint( entity hardpoint )
{
if ( hardpoint.HasKey( "hardpointGroup" ) && ( hardpoint.kv.hardpointGroup == "A" || hardpoint.kv.hardpointGroup == "B" || hardpoint.kv.hardpointGroup == "C" ) )
file.flagSpawnPoints.append( hardpoint.GetOrigin() )
}
void function OnPlayerKilled( entity victim, entity attacker, var damageInfo )
{
if ( !victim.IsPlayer() || !attacker.IsPlayer() || attacker == victim )
return
float killRaceTime = attacker.GetPlayerNetTime( "killRaceTime" ) + 5.0
attacker.SetPlayerNetTime( "killRaceTime", killRaceTime )
if ( killRaceTime > file.currentHighestKillraceAmount )
file.currentHighestKillraceAmount = killRaceTime
if ( file.currentRacer != null )
file.currentKillraceScore++
}
bool function StartPlayerKillrace( entity player, entity flag )
{
float killRaceTime = player.GetPlayerNetTime( "killRaceTime" )
if ( killRaceTime > 0.0 )
{
thread PlayerKillrace( player, killRaceTime )
return true // delete the flag entity
}
return false // keep it alive
}
void function PlayerKillrace( entity player, float raceTime )
{
file.currentKillraceScore = 0
file.currentRacer = player
int oldMaxHealth = player.GetMaxHealth()
player.SetMaxHealth( oldMaxHealth * 10 )
player.SetHealth( player.GetMaxHealth() )
foreach ( entity weapon in player.GetMainWeapons() )
foreach ( string mod in GetWeaponBurnMods( weapon.GetWeaponClassName() ) )
weapon.AddMod( mod )
foreach ( entity otherPlayer in GetPlayerArray() )
Remote_CallFunction_NonReplay( otherPlayer, "ServerCallback_NewKillRacer", player.GetEncodedEHandle(), Time() + raceTime )
float raceEnd = Time() + raceTime
while ( raceEnd > Time() && IsAlive( player ) )
WaitFrame()
player.SetPlayerNetTime( "killRaceTime", 0.0 )
player.SetMaxHealth( oldMaxHealth )
foreach ( entity weapon in player.GetMainWeapons() )
foreach ( string mod in GetWeaponBurnMods( weapon.GetWeaponClassName() ) )
weapon.RemoveMod( mod )
foreach ( entity otherPlayer in GetPlayerArray() )
Remote_CallFunction_NonReplay( otherPlayer, "ServerCallback_EndKillrace", player.GetEncodedEHandle(), file.currentKillraceScore )
if ( GameRules_GetTeamScore( player.GetTeam() ) < file.currentKillraceScore )
{
GameRules_SetTeamScore( player.GetTeam(), file.currentKillraceScore )
player.SetPlayerGameStat( PGS_ASSAULT_SCORE, file.currentKillraceScore )
}
thread KillraceSpawnThink() // go to spawn next flag
}
void function StartKillraceSpawnThink()
{
thread KillraceSpawnThink()
}
void function KillraceSpawnThink()
{
file.currentHighestKillraceAmount = 0
file.currentRacer = null
file.currentKillraceScore = 0
float time = Time()
while ( time + 20.0 > Time() && file.currentHighestKillraceAmount < 25 )
WaitFrame()
vector spawnpos = file.flagSpawnPoints[ RandomInt( file.flagSpawnPoints.len() ) ]
foreach ( entity player in GetPlayerArray() )
Remote_CallFunction_NonReplay( player, "ServerCallback_FlagSpawnIncoming", spawnpos.x, spawnpos.y, spawnpos.z, Time() + 15 )
wait 15.0
// create a flag
entity flag = CreateEntity( "item_flag" )
flag.SetValueForModelKey( CTF_FLAG_MODEL )
SetTargetName( flag, "krflag" )
DispatchSpawn( flag )
flag.SetModel( CTF_FLAG_MODEL )
flag.SetOrigin( spawnpos + < 0, 0, flag.GetBoundingMaxs().z / 2 > ) // get it out of the ground
flag.SetVelocity( < 0, 0, 1 > ) // make it do gravity again
}
|