1 #using scripts\codescripts\struct;
3 #using scripts\shared\callbacks_shared;
4 #using scripts\shared\clientfield_shared;
5 #using scripts\shared\gameobjects_shared;
6 #using scripts\shared\hostmigration_shared;
7 #using scripts\shared\objpoints_shared;
8 #using scripts\shared\scoreevents_shared;
9 #using scripts\shared\system_shared;
10 #using scripts\shared\util_shared;
12 #insert scripts\shared\shared.gsh;
14 #using scripts\mp\_util;
15 #using scripts\mp\gametypes\_globallogic_audio;
16 #using scripts\mp\gametypes\_globallogic_score;
17 #using scripts\mp\gametypes\_hostmigration;
18 #using scripts\mp\gametypes\_spectating;
22 #define DOGTAG_VANISH_FX "ui/fx_kill_confirmed_vanish"
24 #precache( "fx", DOGTAG_VANISH_FX );
28 level.antiBoostDistance = GetGametypeSetting(
"antiBoostDistance" );
32 function spawn_dog_tag( victim, attacker, on_use_function, objectives_for_attacker_and_victim_only )
34 if ( isdefined( level.dogtags[victim.entnum] ) )
37 level.dogtags[victim.entnum] notify(
"reset" );
41 visuals[0] =
spawn(
"script_model", (0,0,0) );
42 visuals[0] setModel( victim GetEnemyDogTagModel() );
43 visuals[1] =
spawn(
"script_model", (0,0,0) );
44 visuals[1] setModel( victim GetFriendlyDogTagModel() );
46 trigger =
spawn(
"trigger_radius", (0,0,0), 0, 32, 32 );
51 level.dogtags[victim.entnum].onUse =&
onUse;
52 level.dogtags[victim.entnum].custom_onUse = on_use_function;
53 level.dogtags[victim.entnum].victim = victim;
54 level.dogtags[victim.entnum].victimTeam = victim.team;
59 foreach( team
in level.teams )
61 objective_add( level.dogtags[victim.entnum].objId[team],
"invisible", (0,0,0) );
62 objective_icon( level.dogtags[victim.entnum].objId[team],
"waypoint_dogtags" );
63 Objective_Team( level.dogtags[victim.entnum].objId[team], team );
64 if ( team == attacker.team )
66 objective_setcolor( level.dogtags[victim.entnum].objId[team], &
"EnemyOrange" );
70 objective_setcolor( level.dogtags[victim.entnum].objId[team], &
"FriendlyBlue" );
75 pos = victim.origin + (0,0,14);
76 level.dogtags[victim.entnum].curOrigin = pos;
77 level.dogtags[victim.entnum].trigger.origin = pos;
78 level.dogtags[victim.entnum].visuals[0].origin = pos;
79 level.dogtags[victim.entnum].visuals[1].origin = pos;
81 level.dogtags[victim.entnum].visuals[0] DontInterpolate();
82 level.dogtags[victim.entnum].visuals[1] DontInterpolate();
86 level.dogtags[victim.entnum].visuals[0] thread
show_to_team( level.dogtags[victim.entnum], attacker.team );
87 level.dogtags[victim.entnum].visuals[1] thread
show_to_enemy_teams( level.dogtags[victim.entnum], attacker.team );
89 level.dogtags[victim.entnum].attacker = attacker;
90 level.dogtags[victim.entnum].attackerTeam = attacker.team;
91 level.dogtags[victim.entnum].unreachable = undefined;
92 level.dogtags[victim.entnum].tacInsert =
false;
95 foreach( team
in level.teams )
97 if ( IsDefined( level.dogtags[victim.entnum].objId[team] ) )
99 objective_position( level.dogtags[victim.entnum].objId[team], pos );
100 objective_state( level.dogtags[victim.entnum].objId[team],
"active" );
104 if ( objectives_for_attacker_and_victim_only )
106 Objective_SetInvisibleToAll( level.dogtags[victim.entnum].objId[attacker.team] );
108 if ( IsPlayer( attacker ) )
109 Objective_SetVisibleToPlayer( level.dogtags[victim.entnum].objId[attacker.team], attacker );
111 Objective_SetInvisibleToAll( level.dogtags[victim.entnum].objId[victim.team] );
113 if ( IsPlayer( victim ) )
114 Objective_SetVisibleToPlayer( level.dogtags[victim.entnum].objId[victim.team], victim );
119 level.dogtags[victim.entnum] thread
bounce();
120 level notify(
"dogtag_spawned" );
128 foreach( team
in level.teams )
130 self HideFromTeam( team );
132 self ShowToTeam( show_team );
139 foreach( team
in level.teams )
141 self ShowToTeam( team );
143 self HideFromTeam( friend_team );
148 self.visuals[0] playSound(
"mpl_killconfirm_tags_pickup" );
149 tacInsertBoost =
false;
152 if ( player.team !=
self.attackerTeam )
154 player AddPlayerStat(
"KILLSDENIED", 1 );
155 player RecordGameEvent(
"return");
157 if (
self.victim == player )
159 if (
self.tacInsert ==
false )
161 event =
"retrieve_own_tags";
165 tacInsertBoost =
true;
170 event =
"kill_denied";
173 if ( !tacInsertBoost )
175 player.pers[
"killsdenied"]++;
176 player.killsdenied = player.pers[
"killsdenied"];
181 event =
"kill_confirmed";
183 player AddPlayerStat(
"KILLSCONFIRMED", 1 );
184 player RecordGameEvent(
"capture");
186 if ( isdefined(
self.attacker ) &&
self.attacker != player )
188 self.attacker
onPickup(
"teammate_kill_confirmed" );
192 if ( !tacInsertBoost && isdefined( player ) )
197 [[
self.custom_onUse]]( player );
206 self.attacker = undefined;
207 self.unreachable = undefined;
208 self notify(
"reset" );
209 self.visuals[0] hide();
210 self.visuals[1] hide();
211 self.curOrigin = (0,0,1000);
212 self.trigger.origin = (0,0,1000);
213 self.visuals[0].origin = (0,0,1000);
214 self.visuals[1].origin = (0,0,1000);
215 self.tacInsert =
false;
218 foreach( team
in level.teams )
220 objective_state(
self.objId[team],
"invisible" );
233 level endon(
"game_ended" );
235 guid = victim.entnum;
236 victim waittill(
"disconnect" );
238 if ( isdefined( level.dogtags[guid] ) )
245 level.dogtags[guid] notify(
"reset" );
249 if ( isdefined( level.dogtags[guid] ) )
252 foreach( team
in level.teams )
254 objective_delete( level.dogtags[guid].objId[team] );
256 level.dogtags[guid].trigger
delete();
257 for ( i=0; i<level.dogtags[guid].visuals.size; i++ )
258 level.dogtags[guid].visuals[i]
delete();
259 level.dogtags[guid] notify (
"deleted" );
262 level.dogtags[guid] = undefined;
269 if ( level.rankedMatch || level.leagueMatch )
271 if ( isdefined(
self.tacticalInsertionTime) &&
self.tacticalInsertionTime + 100 > GetTime() )
273 minDist = level.antiBoostDistance;
274 minDistSqr = minDist * minDist;
276 distSqr = DistanceSquared(
self.origin, level.dogtags[
self.entnum].curOrigin );
279 if ( distSqr < minDistSqr )
281 level.dogtags[
self.entnum].tacInsert =
true;
289 level endon(
"game_ended" );
290 self endon(
"disconnect" );
294 self waittill(
"joined_team" );
296 tags.victimTeam =
self.team;
303 level endon(
"game_ended" );
304 victim endon(
"disconnect" );
305 self notify(
"timeout" );
306 self endon(
"timeout" );
310 self.visuals[0] hide();
311 self.visuals[1] hide();
312 self.curOrigin = (0,0,1000);
313 self.trigger.origin = (0,0,1000);
314 self.visuals[0].origin = (0,0,1000);
315 self.visuals[1].origin = (0,0,1000);
316 self.tacInsert =
false;
322 level endon(
"game_ended" );
323 self endon(
"reset" );
325 bottomPos =
self.curOrigin;
326 topPos =
self.curOrigin + (0,0,12);
330 self.visuals[0] moveTo( topPos, 0.5, 0.15, 0.15 );
331 self.visuals[0] rotateYaw( 180, 0.5 );
332 self.visuals[1] moveTo( topPos, 0.5, 0.15, 0.15 );
333 self.visuals[1] rotateYaw( 180, 0.5 );
337 self.visuals[0] moveTo( bottomPos, 0.5, 0.15, 0.15 );
338 self.visuals[0] rotateYaw( 180, 0.5 );
339 self.visuals[1] moveTo( bottomPos, 0.5, 0.15, 0.15 );
340 self.visuals[1] rotateYaw( 180, 0.5 );
348 self endon(
"disconnect");
373 function should_spawn_tags( eInflictor, attacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, psOffsetTime, deathAnimDuration )
375 if ( IsAlive(
self ) )
379 if ( IsDefined(
self.switching_teams ) )
383 if ( isDefined( attacker ) && attacker ==
self )
387 if ( level.teamBased && isDefined( attacker ) && isDefined( attacker.team ) && attacker.team ==
self.team )
391 if( IsDefined( attacker ) && ( !IsDefined( attacker.team ) || attacker.team ==
"free" ) && ( attacker.classname ==
"trigger_hurt" || attacker.classname ==
"worldspawn" ) )
400 if ( player.pers[
"team"] ==
self.victimTeam )
402 player.pers[
"rescues"]++;
403 player.rescues = player.pers[
"rescues"];
405 if ( isdefined(
self.victim ) )
407 if ( !level.gameEnded )
427 if ( isDefined(
self ) && (
self.sessionstate ==
"spectator" || !isAlive(
self ) ) )
429 self.pers[
"lives"] = 1;
430 self thread [[level.spawnClient]]();