‪Black Ops 3 Source Code Explorer  0.1
‪An script explorer for Black Ops 3 by ZeRoY
sd.gsc
Go to the documentation of this file.
1 #using scripts\shared\demo_shared;
2 #using scripts\shared\exploder_shared;
3 #using scripts\shared\gameobjects_shared;
4 #using scripts\shared\hostmigration_shared;
5 #using scripts\shared\hud_util_shared;
6 #using scripts\shared\math_shared;
7 #using scripts\shared\medals_shared;
8 #using scripts\shared\rank_shared;
9 #using scripts\shared\popups_shared;
10 #using scripts\shared\scoreevents_shared;
11 #using scripts\shared\sound_shared;
12 #using scripts\shared\util_shared;
13 #using scripts\mp\gametypes\_dogtags;
14 #using scripts\mp\gametypes\_globallogic_spawn;
15 
16 #using scripts\shared\abilities\gadgets\_gadget_resurrect;
17 
18 #insert scripts\shared\shared.gsh;
19 
20 #using scripts\mp\gametypes\_battlechatter;
21 #using scripts\mp\gametypes\_globallogic;
22 #using scripts\mp\gametypes\_globallogic_audio;
23 #using scripts\mp\gametypes\_globallogic_defaults;
24 #using scripts\mp\gametypes\_globallogic_score;
25 #using scripts\mp\gametypes\_globallogic_utils;
26 #using scripts\mp\gametypes\_hostmigration;
27 #using scripts\mp\gametypes\_spawning;
28 #using scripts\mp\gametypes\_spawnlogic;
29 #using scripts\mp\gametypes\_spectating;
30 
31 #using scripts\mp\_challenges;
32 #using scripts\mp\_util;
33 
34 // Rallypoints should be destroyed on leaving your team/getting killed
35 // Compass icons need to be looked at
36 // Doesn't seem to be setting angle on spawn so that you are facing your rallypoint
37 
38 /*
39  Search and Destroy
40  Attackers objective: Bomb one of 2 positions
41  Defenders objective: Defend these 2 positions / Defuse planted bombs
42  Round ends: When one team is eliminated, bomb explodes, bomb is defused, or roundlength time is reached
43  Map ends: When one team reaches the score limit, or time limit or round limit is reached
44  Respawning: Players remain dead for the round and will respawn at the beginning of the next round
45 
46  Level requirements
47  ------------------
48  Allied Spawnpoints:
49  classname mp_sd_spawn_attacker
50  Allied players spawn from these. Place at least 16 of these relatively close together.
51 
52  Axis Spawnpoints:
53  classname mp_sd_spawn_defender
54  Axis players spawn from these. Place at least 16 of these relatively close together.
55 
56  Spectator Spawnpoints:
57  classname mp_global_intermission
58  Spectators spawn from these and intermission is viewed from these positions.
59  Atleast one is required, any more and they are randomly chosen between.
60 
61  Bombzones:
62  classname trigger_multiple
63  targetname bombzone
64  script_gameobjectname bombzone
65  script_bombmode_original <if defined this bombzone will be used in the original bomb mode>
66  script_bombmode_single <if defined this bombzone will be used in the single bomb mode>
67  script_bombmode_dual <if defined this bombzone will be used in the dual bomb mode>
68  script_team Set to allies or axis. This is used to set which team a bombzone is used by in dual bomb mode.
69  script_label Set to A or B. This sets the letter shown on the compass in original mode.
70  This is a volume of space in which the bomb can planted. Must contain an origin brush.
71 
72  Bomb:
73  classname trigger_lookat
74  targetname bombtrigger
75  script_gameobjectname bombzone
76  This should be a 16x16 unit trigger with an origin brush placed so that it's center lies on the bottom plane of the trigger.
77  Must be in the level somewhere. This is the trigger that is used when defusing a bomb.
78  It gets moved to the position of the planted bomb model.
79 
80  Level script requirements
81  -------------------------
82  Team Definitions:
83  game["allies"] = "marines";
84  game["axis"] = "nva";
85  This sets the nationalities of the teams. Allies can be american, british, or russian. Axis can be german.
86 
87  game["attackers"] = "allies";
88  game["defenders"] = "axis";
89  This sets which team is attacking and which team is defending. Attackers plant the bombs. Defenders protect the targets.
90 
91  If using minefields or exploders:
92  load::main();
93 
94  Optional level script settings
95  ------------------------------
96  Soldier Type and Variation:
97  game["soldiertypeset"] = "seals";
98  This sets what character models are used for each nationality on a particular map.
99 
100  Valid settings:
101  soldiertypeset seals
102 
103  Exploder Effects:
104  Setting script_noteworthy on a bombzone trigger to an exploder group can be used to trigger additional effects.
105 */
106 
107 /*QUAKED mp_sd_spawn_attacker (0.0 1.0 0.0) (-16 -16 0) (16 16 72)
108 Attacking players spawn randomly at one of these positions at the beginning of a round.*/
109 
110 /*QUAKED mp_sd_spawn_defender (1.0 0.0 0.0) (-16 -16 0) (16 16 72)
111 Defending players spawn randomly at one of these positions at the beginning of a round.*/
112 
113 #define CARRY_ICON_X 130
114 #define CARRY_ICON_Y -60
115 
116 #define OBJECTIVE_FLAG_DEFUSED 0
117 #define OBJECTIVE_FLAG_PLANTED 1
118 
119 #precache( "fx", "explosions/fx_exp_bomb_demo_mp" );
120 #precache( "material","compass_waypoint_target" );
121 #precache( "material","compass_waypoint_target_a" );
122 #precache( "material","compass_waypoint_target_b" );
123 #precache( "material","compass_waypoint_defend" );
124 #precache( "material","compass_waypoint_defend_a" );
125 #precache( "material","compass_waypoint_defend_b" );
126 #precache( "material","compass_waypoint_defuse" );
127 #precache( "material","compass_waypoint_defuse_a" );
128 #precache( "material","compass_waypoint_defuse_b" );
129 #precache( "model", "p7_mp_suitcase_bomb" );
130 #precache( "objective", "sd_bomb" );
131 #precache( "objective", "sd_a" );
132 #precache( "objective", "sd_defuse_a" );
133 #precache( "objective", "sd_b" );
134 #precache( "objective", "sd_defuse_b" );
135 #precache( "string", "OBJECTIVES_SD_ATTACKER" );
136 #precache( "string", "OBJECTIVES_SD_DEFENDER" );
137 #precache( "string", "OBJECTIVES_SD_ATTACKER_SCORE" );
138 #precache( "string", "OBJECTIVES_SD_DEFENDER_SCORE" );
139 #precache( "string", "OBJECTIVES_SD_ATTACKER_HINT" );
140 #precache( "string", "OBJECTIVES_SD_DEFENDER_HINT" );
141 #precache( "string", "MP_EXPLOSIVES_BLOWUP_BY" );
142 #precache( "string", "MP_EXPLOSIVES_RECOVERED_BY" );
143 #precache( "string", "MP_EXPLOSIVES_DROPPED_BY" );
144 #precache( "string", "MP_EXPLOSIVES_PLANTED_BY" );
145 #precache( "string", "MP_EXPLOSIVES_DEFUSED_BY" );
146 #precache( "string", "PLATFORM_HOLD_TO_PLANT_EXPLOSIVES" );
147 #precache( "string", "PLATFORM_HOLD_TO_DEFUSE_EXPLOSIVES" );
148 #precache( "string", "MP_CANT_PLANT_WITHOUT_BOMB" );
149 #precache( "string", "MP_PLANTING_EXPLOSIVE" );
150 #precache( "string", "MP_DEFUSING_EXPLOSIVE" );
151 #precache( "string", "MP_TARGET_DESTROYED" );
152 #precache( "string", "MP_BOMB_DEFUSED" );
153 #precache( "string", "bomb" );
154 #precache( "triggerstring", "PLATFORM_HOLD_TO_DEFUSE_EXPLOSIVES" );
155 #precache( "triggerstring", "PLATFORM_HOLD_TO_PLANT_EXPLOSIVES" );
156 
157 function ‪main()
158 {
160 
162  ‪util::registerTimeLimit( 0, 1440 );
163  ‪util::registerScoreLimit( 0, 500 );
166  ‪util::registerNumLives( 0, 100 );
167 
168  ‪globallogic::registerFriendlyFireDelay( level.gameType, 15, 0, 1440 );
169 
170  level.teamBased = true;
171  level.overrideTeamScore = true;
172  level.onPrecacheGameType =&‪onPrecacheGameType;
173  level.onStartGameType =&‪onStartGameType;
174  level.onSpawnPlayer =&‪onSpawnPlayer;
175  level.playerSpawnedCB =&‪sd_playerSpawnedCB;
176  level.onPlayerKilled =&‪onPlayerKilled;
177  level.onDeadEvent =&‪onDeadEvent;
178  level.onOneLeftEvent =&‪onOneLeftEvent;
179  level.onTimeLimit =&‪onTimeLimit;
180  level.onRoundSwitch =&‪onRoundSwitch;
181  level.getTeamKillPenalty =&‪sd_getTeamKillPenalty;
182  level.getTeamKillScore =&‪sd_getTeamKillScore;
183  level.isKillBoosting =&‪sd_isKillBoosting;
184  level.figure_out_gametype_friendly_fire = &‪figureOutGameTypeFriendlyFire;
185 
186  level.endGameOnScoreLimit = false;
187 
191 
192  ‪globallogic_audio::set_leader_gametype_dialog ( "startSearchAndDestroy", "hcStartSearchAndDestroy", "objDestroy", "objDefend" );
193 
194  // Sets the scoreboard columns and determines with data is sent across the network
195  if ( !SessionModeIsSystemlink() && !SessionModeIsOnlineGame() && IsSplitScreen() )
196  // local matches only show the first three columns
197  ‪globallogic::setvisiblescoreboardcolumns( "score", "kills", "plants", "defuses", "deaths" );
198  else
199  ‪globallogic::setvisiblescoreboardcolumns( "score", "kills", "deaths", "plants", "defuses" );
200 }
201 
203 {
204  game["bomb_dropped_sound"] = "fly_bomb_drop_plr";
205  game["bomb_recovered_sound"] = "fly_bomb_pickup_plr";
206 }
207 
208 function ‪sd_getTeamKillPenalty( eInflictor, attacker, sMeansOfDeath, weapon )
209 {
210  teamkill_penalty = ‪globallogic_defaults::default_getTeamKillPenalty( eInflictor, attacker, sMeansOfDeath, weapon );
211 
212  if ( ( isdefined( self.isDefusing ) && self.isDefusing ) || ( isdefined( self.isPlanting ) && self.isPlanting ) )
213  {
214  teamkill_penalty = teamkill_penalty * level.teamKillPenaltyMultiplier;
215  }
216 
217  return teamkill_penalty;
218 }
219 
220 function ‪sd_getTeamKillScore( eInflictor, attacker, sMeansOfDeath, weapon )
221 {
222  teamkill_score = ‪rank::getScoreInfoValue( "team_kill" );
223 
224  if ( ( isdefined( self.isDefusing ) && self.isDefusing ) || ( isdefined( self.isPlanting ) && self.isPlanting ) )
225  {
226  teamkill_score = teamkill_score * level.teamKillScoreMultiplier;
227  }
228 
229  return int(teamkill_score);
230 }
231 
232 
234 {
235  if ( !isdefined( game["switchedsides"] ) )
236  game["switchedsides"] = false;
237 
238  if ( game["teamScores"]["allies"] == level.scorelimit - 1 && game["teamScores"]["axis"] == level.scorelimit - 1 )
239  {
240  // overtime! team that's ahead in kills gets to defend.
241  aheadTeam = ‪getBetterTeam();
242  if ( aheadTeam != game["defenders"] )
243  {
244  game["switchedsides"] = !game["switchedsides"];
245  }
246  level.halftimeType = "overtime";
247  }
248  else
249  {
250  level.halftimeType = "halftime";
251  game["switchedsides"] = !game["switchedsides"];
252  }
253 }
254 
256 {
257  kills["allies"] = 0;
258  kills["axis"] = 0;
259  deaths["allies"] = 0;
260  deaths["axis"] = 0;
261 
262  for ( i = 0; i < level.players.size; i++ )
263  {
264  player = level.players[i];
265  team = player.pers["team"];
266  if ( isdefined( team ) && (team == "allies" || team == "axis") )
267  {
268  kills[ team ] += player.kills;
269  deaths[ team ] += player.deaths;
270  }
271  }
272 
273  if ( kills["allies"] > kills["axis"] )
274  return "allies";
275  else if ( kills["axis"] > kills["allies"] )
276  return "axis";
277 
278  // same number of kills
279 
280  if ( deaths["allies"] < deaths["axis"] )
281  return "allies";
282  else if ( deaths["axis"] < deaths["allies"] )
283  return "axis";
284 
285  // same number of deaths
286 
287  if ( randomint(2) == 0 )
288  return "allies";
289  return "axis";
290 }
291 
293 {
294  SetBombTimer( "A", 0 );
295  SetMatchFlag( "bomb_timer_a", 0 );
296  SetBombTimer( "B", 0 );
297  SetMatchFlag( "bomb_timer_b", 0 );
298 
299  if ( !isdefined( game["switchedsides"] ) )
300  game["switchedsides"] = false;
301 
302  if ( game["switchedsides"] )
303  {
304  oldAttackers = game["attackers"];
305  oldDefenders = game["defenders"];
306  game["attackers"] = oldDefenders;
307  game["defenders"] = oldAttackers;
308  }
309 
310  setClientNameMode( "manual_change" );
311 
312  game["strings"]["target_destroyed"] = &"MP_TARGET_DESTROYED";
313  game["strings"]["bomb_defused"] = &"MP_BOMB_DEFUSED";
314 
315  level._effect["bombexplosion"] = "explosions/fx_exp_bomb_demo_mp";
316 
317  ‪util::setObjectiveText( game["attackers"], &"OBJECTIVES_SD_ATTACKER" );
318  ‪util::setObjectiveText( game["defenders"], &"OBJECTIVES_SD_DEFENDER" );
319 
320  if ( level.splitscreen )
321  {
322  ‪util::setObjectiveScoreText( game["attackers"], &"OBJECTIVES_SD_ATTACKER" );
323  ‪util::setObjectiveScoreText( game["defenders"], &"OBJECTIVES_SD_DEFENDER" );
324  }
325  else
326  {
327  ‪util::setObjectiveScoreText( game["attackers"], &"OBJECTIVES_SD_ATTACKER_SCORE" );
328  ‪util::setObjectiveScoreText( game["defenders"], &"OBJECTIVES_SD_DEFENDER_SCORE" );
329  }
330  ‪util::setObjectiveHintText( game["attackers"], &"OBJECTIVES_SD_ATTACKER_HINT" );
331  ‪util::setObjectiveHintText( game["defenders"], &"OBJECTIVES_SD_DEFENDER_HINT" );
332 
333  level.alwaysUseStartSpawns = true;
334 
335  // now that the game objects have been deleted place the influencers
337 
338  level.spawnMins = ( 0, 0, 0 );
339  level.spawnMaxs = ( 0, 0, 0 );
340  ‪spawnlogic::place_spawn_points( "mp_sd_spawn_attacker" );
341  ‪spawnlogic::place_spawn_points( "mp_sd_spawn_defender" );
342 
343  level.mapCenter = ‪math::find_box_center( level.spawnMins, level.spawnMaxs );
344  setMapCenter( level.mapCenter );
345 
347  setDemoIntermissionPoint( spawnpoint.origin, spawnpoint.angles );
348 
349 
350  level.spawn_start = [];
351 
352  level.spawn_start["axis"] = ‪spawnlogic::get_spawnpoint_array( "mp_sd_spawn_defender" );
353  level.spawn_start["allies"] = ‪spawnlogic::get_spawnpoint_array( "mp_sd_spawn_attacker" );
354 
355  thread ‪updateGametypeDvars();
356 
357  thread ‪bombs();
358 }
359 
360 
361 function ‪onSpawnPlayer(predictedSpawn)
362 {
363  self.isPlanting = false;
364  self.isDefusing = false;
365  self.isBombCarrier = false;
366 
367  ‪spawning::onSpawnPlayer(predictedSpawn);
368 }
369 
371 {
372  level notify ( "spawned_player" );
373 }
374 
375 function ‪onPlayerKilled(eInflictor, attacker, iDamage, sMeansOfDeath, weapon, vDir, sHitLoc, psOffsetTime, deathAnimDuration)
376 {
377  thread ‪checkAllowSpectating();
378 
379  if( ‪IS_TRUE( level.droppedTagRespawn ) )
380  {
381  ‪should_spawn_tags = self ‪dogtags::should_spawn_tags(eInflictor, attacker, iDamage, sMeansOfDeath, weapon, vDir, sHitLoc, psOffsetTime, deathAnimDuration);
382 
383  // we should spawn tags if one the previous statements were true and we may not spawn
385 
387  level thread ‪dogtags::spawn_dog_tag( self, attacker, &‪dogtags::onUseDogTag, false );
388  }
389 
390  if ( isPlayer( attacker ) && attacker.pers["team"] != self.pers["team"])
391  {
392  ‪scoreevents::processScoreEvent( "kill_sd", attacker, self, weapon );
393  }
394 
395  inBombZone = false;
396 
397  for ( index = 0; index < level.bombZones.size; index++ )
398  {
399  dist = Distance2dSquared(self.origin, level.bombZones[index].curorigin);
400  if ( dist < level.defaultOffenseRadiusSQ )
401  {
402  inBombZone = true;
403  currentObjective = level.bombZones[index];
404  break;
405  }
406  }
407 
408  if ( inBombZone && isPlayer( attacker ) && attacker.pers["team"] != self.pers["team"] )
409  {
410  if ( game["defenders"] == self.pers["team"] )
411  {
413  attacker thread ‪challenges::killedBaseDefender( currentObjective );
414  self RecordKillModifier("defending");
415  ‪scoreevents::processScoreEvent( "killed_defender", attacker, self, weapon );
416  }
417  else
418  {
419  if( isdefined(attacker.pers["defends"]) )
420  {
421  attacker.pers["defends"]++;
422  attacker.defends = attacker.pers["defends"];
423  }
424 
426  attacker thread ‪challenges::killedBaseOffender( currentObjective, weapon );
427  self RecordKillModifier("assaulting");
428  ‪scoreevents::processScoreEvent( "killed_attacker", attacker, self, weapon );
429  }
430  }
431 
432  if ( isPlayer( attacker ) && attacker.pers["team"] != self.pers["team"] && isdefined( self.isBombCarrier ) && self.isBombCarrier == true )
433  {
434  self RecordKillModifier("carrying");
435 
436  attacker RecordGameEvent("kill_carrier");
437  }
438 
439  if( self.isPlanting == true )
440  self RecordKillModifier("planting");
441 
442  if( self.isDefusing == true )
443  self RecordKillModifier("defusing");
444 }
445 
446 
448 {
449  self endon("disconnect");
450 
452 
453  ‪update = false;
454 
455  livesLeft = !(level.numLives && !self.pers["lives"]);
456 
457  if ( !level.aliveCount[ game["attackers"] ] && !livesLeft )
458  {
459  level.spectateOverride[game["attackers"]].allowEnemySpectate = 1;
460  ‪update = true;
461  }
462  if ( !level.aliveCount[ game["defenders"] ] && !livesLeft )
463  {
464  level.spectateOverride[game["defenders"]].allowEnemySpectate = 1;
465  ‪update = true;
466  }
467  if ( ‪update )
469 }
470 
471 
472 function ‪sd_endGame( winningTeam, endReasonText )
473 {
474  if ( isdefined( winningTeam ) )
476 
477  thread ‪globallogic::endGame( winningTeam, endReasonText );
478 }
479 
480 function ‪sd_endGameWithKillcam( winningTeam, endReasonText )
481 {
482  ‪sd_endGame( winningTeam, endReasonText );
483 }
484 
485 
486 function ‪onDeadEvent( team )
487 {
488  if ( level.bombExploded || level.bombDefused )
489  return;
490 
491  if ( team == "all" )
492  {
493  if ( level.bombPlanted )
494  ‪sd_endGameWithKillcam( game["attackers"], game["strings"][game["defenders"]+"_eliminated"] );
495  else
496  ‪sd_endGameWithKillcam( game["defenders"], game["strings"][game["attackers"]+"_eliminated"] );
497  }
498  else if ( team == game["attackers"] )
499  {
500  if ( level.bombPlanted )
501  return;
502 
503  ‪sd_endGameWithKillcam( game["defenders"], game["strings"][game["attackers"]+"_eliminated"] );
504  }
505  else if ( team == game["defenders"] )
506  {
507  ‪sd_endGameWithKillcam( game["attackers"], game["strings"][game["defenders"]+"_eliminated"] );
508  }
509 }
510 
511 
512 function ‪onOneLeftEvent( team )
513 {
514  if ( level.bombExploded || level.bombDefused )
515  return;
516 
517  //if ( team == game["attackers"] )
518  ‪warnLastPlayer( team );
519 }
520 
521 
522 function ‪onTimeLimit()
523 {
524  if ( level.teamBased )
525  ‪sd_endGame( game["defenders"], game["strings"]["time_limit_reached"] );
526  else
527  ‪sd_endGame( undefined, game["strings"]["time_limit_reached"] );
528 }
529 
530 
531 function ‪warnLastPlayer( team )
532 {
533  if ( !isdefined( level.warnedLastPlayer ) )
534  level.warnedLastPlayer = [];
535 
536  if ( isdefined( level.warnedLastPlayer[team] ) )
537  return;
538 
539  level.warnedLastPlayer[team] = true;
540 
541  players = level.players;
542  for ( i = 0; i < players.size; i++ )
543  {
544  player = players[i];
545 
546  if ( isdefined( player.pers["team"] ) && player.pers["team"] == team && isdefined( player.pers["class"] ) )
547  {
548  if ( player.sessionstate == "playing" && !player.afk )
549  break;
550  }
551  }
552 
553  if ( i == players.size )
554  return;
555 
556  players[i] thread ‪giveLastAttackerWarning( team );
557 
558 
559 }
560 
561 
563 {
564  self endon("death");
565  self endon("disconnect");
566 
567  fullHealthTime = 0;
568  interval = .05;
569 
570  self.lastManSD = true;
571 
572  enemyTeam = game["defenders"];
573 
574  if ( team == enemyTeam )
575  {
576  enemyTeam = game["attackers"];
577  }
578 
579 
580  if ( level.aliveCount[enemyTeam] > 2 )
581  {
582  self.lastManSDDefeat3Enemies = true;
583  }
584 
585 
586  while(1)
587  {
588  if ( self.health != self.maxhealth )
589  fullHealthTime = 0;
590  else
591  fullHealthTime += interval;
592 
593  wait interval;
594 
595  if (self.health == self.maxhealth && fullHealthTime >= 3)
596  break;
597  }
598 
599  self ‪globallogic_audio::leader_dialog_on_player( "roundEncourageLastPlayer" );
600  self playlocalsound ("mus_last_stand");
601 }
602 
603 
605 {
606  level.plantTime = GetGametypeSetting( "plantTime" );
607  level.defuseTime = GetGametypeSetting( "defuseTime" );
608  level.bombTimer = GetGametypeSetting( "bombTimer" );
609  level.multiBomb = GetGametypeSetting( "multiBomb" );
610 
611  level.teamKillPenaltyMultiplier = GetGametypeSetting( "teamKillPenalty" );
612  level.teamKillScoreMultiplier = GetGametypeSetting( "teamKillScore" );
613 
614  level.playerKillsMax = GetGametypeSetting( "playerKillsMax" );
615  level.totalKillsMax = GetGametypeSetting( "totalKillsMax" );
616 }
617 
618 function ‪bombs()
619 {
620  level.bombPlanted = false;
621  level.bombDefused = false;
622  level.bombExploded = false;
623 
624  trigger = getEnt( "sd_bomb_pickup_trig", "targetname" );
625  if ( !isdefined( trigger ) )
626  {
627  /#‪util::error("No sd_bomb_pickup_trig trigger found in map.");#/
628  return;
629  }
630 
631  visuals[0] = getEnt( "sd_bomb", "targetname" );
632  if ( !isdefined( visuals[0] ) )
633  {
634  /#‪util::error("No sd_bomb script_model found in map.");#/
635  return;
636  }
637 
638  //visuals[0] setModel( "weapon_explosives" );
639 
640  if ( !level.multiBomb )
641  {
642  level.sdBomb = ‪gameobjects::create_carry_object( game["attackers"], trigger, visuals, (0,0,32), &"sd_bomb" );
643  level.sdBomb ‪gameobjects::allow_carry( "friendly" );
644  level.sdBomb ‪gameobjects::set_2d_icon( "friendly", "compass_waypoint_bomb" );
645  level.sdBomb ‪gameobjects::set_3d_icon( "friendly", "waypoint_bomb" );
646  level.sdBomb ‪gameobjects::set_visible_team( "friendly" );
647  level.sdBomb ‪gameobjects::set_carry_icon( "hud_suitcase_bomb" );
648  level.sdBomb.allowWeapons = true;
649  level.sdBomb.onPickup =&‪onPickup;
650  level.sdBomb.onDrop =&‪onDrop;
651 
652  foreach( visual in level.sdBomb.visuals )
653  visual.team = "free"; // for preventing red reticles when pointing at the bomb
654  }
655  else
656  {
657  trigger delete();
658  visuals[0] delete();
659  }
660 
661 
662  level.bombZones = [];
663 
664  bombZones = getEntArray( "bombzone", "targetname" );
665 
666  for ( index = 0; index < bombZones.size; index++ )
667  {
668  trigger = bombZones[index];
669  visuals = getEntArray( bombZones[index].target, "targetname" );
670 
671  ‪name = istring("sd"+trigger.script_label);
672 
673  bombZone = ‪gameobjects::create_use_object( game["defenders"], trigger, visuals, (0,0,0), ‪name, true, true );
674  bombZone ‪gameobjects::allow_use( "enemy" );
675  bombZone ‪gameobjects::set_use_time( level.plantTime );
676  bombZone ‪gameobjects::set_use_text( &"MP_PLANTING_EXPLOSIVE" );
677  bombZone ‪gameobjects::set_use_hint_text( &"PLATFORM_HOLD_TO_PLANT_EXPLOSIVES" );
678  if ( !level.multiBomb )
679  bombZone ‪gameobjects::set_key_object( level.sdBomb );
680  label = bombZone ‪gameobjects::get_label();
681  bombZone.label = label;
682  bombZone ‪gameobjects::set_2d_icon( "friendly", "compass_waypoint_defend" + label );
683  bombZone ‪gameobjects::set_3d_icon( "friendly", "waypoint_defend" + label );
684  bombZone ‪gameobjects::set_2d_icon( "enemy", "compass_waypoint_target" + label );
685  bombZone ‪gameobjects::set_3d_icon( "enemy", "waypoint_target" + label );
686  bombZone ‪gameobjects::set_visible_team( "any" );
687  bombZone.onBeginUse =&‪onBeginUse;
688  bombZone.onEndUse =&‪onEndUse;
689  bombZone.onUse =&‪onUsePlantObject;
690  bombZone.onCantUse =&‪onCantUse;
691  bombZone.useWeapon = GetWeapon( "briefcase_bomb" );
692  bombZone.visuals[0].killCamEnt = ‪spawn( "script_model", bombZone.visuals[0].origin + (0,0,128) );
693 
694  if ( isdefined( level.bomb_zone_fixup ) )
695  [[ level.bomb_zone_fixup ]]( bombZone );
696 
697  if ( !level.multiBomb )
698  bombZone.trigger SetInvisibleToAll();
699 
700  for ( i = 0; i < visuals.size; i++ )
701  {
702  if ( isdefined( visuals[i].script_exploder ) )
703  {
704  bombZone.exploderIndex = visuals[i].script_exploder;
705  break;
706  }
707  }
708 
709  foreach( visual in bombZone.visuals )
710  visual.team = "free"; // for preventing red reticles when pointing at bomb zones
711 
712  level.bombZones[level.bombZones.size] = bombZone;
713 
714  bombZone.bombDefuseTrig = getent( visuals[0].target, "targetname" );
715  assert( isdefined( bombZone.bombDefuseTrig ) );
716  bombZone.bombDefuseTrig.origin += (0,0,-10000);
717  bombZone.bombDefuseTrig.label = label;
718  }
719 
720  for ( index = 0; index < level.bombZones.size; index++ )
721  {
722  ‪array = [];
723  for ( otherindex = 0; otherindex < level.bombZones.size; otherindex++ )
724  {
725  if ( otherindex != index )
726  ‪array[ ‪array.size ] = level.bombZones[otherindex];
727  }
728  level.bombZones[index].otherBombZones = ‪array;
729  }
730 }
731 
732 function ‪setBombOverheatingAfterWeaponChange( useObject, overheated, heat ) // self == player
733 {
734  self endon ( "death" );
735  self endon ( "disconnect" );
736  self endon ( "joined_team");
737  self endon ( "joined_spectators");
738 
739  self waittill( "weapon_change", weapon );
740 
741  if ( weapon == useObject.useWeapon )
742  {
743  self SetWeaponOverheating( overheated, heat, weapon ); // resetting overheating allows for quick drop anim to be played
744  }
745 }
746 
747 function ‪onBeginUse( player )
748 {
749  if ( self ‪gameobjects::is_friendly_team( player.pers["team"] ) )
750  {
751  player playSound( "mpl_sd_bomb_defuse" );
752  player.isDefusing = true;
753  player thread ‪setBombOverheatingAfterWeaponChange( self, false, 0 ); // overheated specific use weapons play "drop" instead of "quick drop" anims
754  player thread ‪battlechatter::gametype_specific_battle_chatter( "sd_enemyplant", player.pers["team"] );
755 
756  if ( isdefined( level.sdBombModel ) )
757  level.sdBombModel hide();
758  }
759  else
760  {
761  player.isPlanting = true;
762  player thread ‪setBombOverheatingAfterWeaponChange( self, false, 0 ); // overheated specific use weapons play "drop" instead of "quick drop" anims
763  player thread ‪battlechatter::gametype_specific_battle_chatter( "sd_friendlyplant", player.pers["team"] );
764 
765  if ( level.multibomb )
766  {
767  for ( i = 0; i < self.otherBombZones.size; i++ )
768  {
769  self.otherBombZones[i] ‪gameobjects::disable_object();
770  }
771  }
772  }
773  player playSound( "fly_bomb_raise_plr" );
774 }
775 
776 function ‪onEndUse( team, player, ‪result )
777 {
778  if ( !isdefined( player ) )
779  return;
780 
781  player.isDefusing = false;
782  player.isPlanting = false;
783  player notify( "event_ended" );
784 
785  if ( self ‪gameobjects::is_friendly_team( player.pers["team"] ) )
786  {
787  if ( isdefined( level.sdBombModel ) && !‪result )
788  {
789  level.sdBombModel show();
790  }
791  }
792  else
793  {
794  if ( level.multibomb && !‪result )
795  {
796  for ( i = 0; i < self.otherBombZones.size; i++ )
797  {
798  self.otherBombZones[i] ‪gameobjects::enable_object();
799  }
800  }
801  }
802 }
803 
804 function ‪onCantUse( player )
805 {
806  player iPrintLnBold( &"MP_CANT_PLANT_WITHOUT_BOMB" );
807 }
808 
809 function ‪onUsePlantObject( player )
810 {
811  // planted the bomb
812  if ( !self ‪gameobjects::is_friendly_team( player.pers["team"] ) )
813  {
815  level thread ‪bombPlanted( self, player );
816  /#print( "bomb planted: " + self.label );#/
817 
818  // disable all bomb zones except this one
819  for ( index = 0; index < level.bombZones.size; index++ )
820  {
821  if ( level.bombZones[index] == self )
822  {
823  level.bombZones[index].isPlanted = true;
824  continue;
825  }
826 
827  level.bombZones[index] ‪gameobjects::disable_object();
828  }
829  thread ‪sound::play_on_players( "mus_sd_planted"+"_"+level.teamPostfix[player.pers["team"]] );
830  player notify ( "bomb_planted" );
831 
832  level thread ‪popups::DisplayTeamMessageToAll( &"MP_EXPLOSIVES_PLANTED_BY", player );
833 
834  if( isdefined(player.pers["plants"]) )
835  {
836  player.pers["plants"]++;
837  player.plants = player.pers["plants"];
838  }
839 
840  ‪demo::bookmark( "event", gettime(), player );
841  player AddPlayerStatWithGameType( "PLANTS", 1 );
842 
843  ‪globallogic_audio::leader_dialog( "bombPlanted" );
844 
845  ‪scoreevents::processScoreEvent( "planted_bomb", player );
846  player RecordGameEvent("plant");
847  }
848 }
849 
850 function ‪onUseDefuseObject( player )
851 {
853  player notify ( "bomb_defused" );
854  /#print( "bomb defused: " + self.label );#/
855  level thread ‪bombDefused( self, player );
856 
857  // disable this bomb zone
859 
860  for ( index = 0; index < level.bombZones.size; index++ )
861  {
862  level.bombZones[index].isPlanted = false;
863  }
864 
865  level thread ‪popups::DisplayTeamMessageToAll( &"MP_EXPLOSIVES_DEFUSED_BY", player );
866 
867  if( isdefined(player.pers["defuses"]) )
868  {
869  player.pers["defuses"]++;
870  player.defuses = player.pers["defuses"];
871  }
872 
873  player AddPlayerStatWithGameType( "DEFUSES", 1 );
874  ‪demo::bookmark( "event", gettime(), player );
875 
876  ‪globallogic_audio::leader_dialog( "bombDefused" );
877 
878  if ( player.lastManSD === true && level.aliveCount[ game["attackers"] ] > 0 )
879  {
880  ‪scoreevents::processScoreEvent( "defused_bomb_last_man_alive", player );
881  player addplayerstat( "defused_bomb_last_man_alive", 1 );
882  }
883  else
884  {
885  ‪scoreevents::processScoreEvent( "defused_bomb", player );
886  }
887  player RecordGameEvent("defuse");
888 }
889 
890 
891 function ‪onDrop( player )
892 {
893  if ( !level.bombPlanted )
894  {
895  ‪globallogic_audio::leader_dialog( "bombFriendlyDropped", game["attackers"] );
896  /#
897  if ( isdefined( player ) )
898  print( "bomb dropped" );
899  else
900  print( "bomb dropped" );
901  #/
902  }
903 
904  player notify( "event_ended" );
905 
906  self ‪gameobjects::set_3d_icon( "friendly", "waypoint_bomb" );
907 
908  ‪sound::play_on_players( game["bomb_dropped_sound"], game["attackers"] );
909 
910  if ( isdefined(level.bombDropBotEvent) )
911  {
912  [[level.bombDropBotEvent]]();
913  }
914 }
915 
916 
917 function ‪onPickup( player )
918 {
919  player.isBombCarrier = true;
920 
921  player RecordGameEvent("pickup");
922 
923  self ‪gameobjects::set_3d_icon( "friendly", "waypoint_defend" );
924 
925  if ( !level.bombDefused )
926  {
927  if ( isdefined( player ) && isdefined( player.name ) )
928  {
929  player AddPlayerStatWithGameType( "PICKUPS", 1 );
930  }
931 
932  //thread sound::play_on_players( "mus_sd_pickup"+"_"+level.teamPostfix[player.pers["team"]], player.pers["team"] );
933  // New Music System
934  team = self ‪gameobjects::get_owner_team();
935  otherTeam = ‪util::getOtherTeam( team );
936 
937  ‪globallogic_audio::leader_dialog( "bombFriendlyTaken", game["attackers"] );
938  /#print( "bomb taken" );#/
939  }
940  //sound::play_on_players( game["bomb_recovered_sound"], game["attackers"] );
941  player playsound ( "fly_bomb_pickup_plr" );
942 
943  for ( i = 0; i < level.bombZones.size; i++ )
944  {
945  level.bombZones[i].trigger SetInvisibleToAll();
946  level.bombZones[i].trigger SetVisibleToPlayer( player );
947  }
948 
949  if ( isdefined(level.bombPickupBotEvent) )
950  {
951  [[level.bombPickupBotEvent]]();
952  }
953 }
954 
955 
956 function ‪onReset()
957 {
958 
959 }
960 
962 {
963  level endon ("bomb_defused");
964  //wait for 30 seconds until explosion
965 
966  time = (level.bombtimer - 30);
967  if (time > 1)
968  {
969  wait (time);
970  thread ‪globallogic_audio::set_music_on_team( "timeOutQuiet" );
971  }
972 }
973 
974 function ‪bombPlanted( destroyedObj, player )
975 {
977  level.bombPlanted = true;
978  player SetWeaponOverheating( true, 100, destroyedObj.useWeapon ); // overheating allows for non-quick drop anim to be played
979  team = player.pers["team"];
980 
981  destroyedObj.visuals[0] thread ‪globallogic_utils::playTickingSound( "mpl_sab_ui_suitcasebomb_timer" );
982  //Play suspense music
983  level thread ‪bombPlantedMusicDelay();
984 
985  level.tickingObject = destroyedObj.visuals[0];
986 
987  level.timeLimitOverride = true;
988  setGameEndTime( int( gettime() + (level.bombTimer * 1000) ) );
989 
990  label = destroyedObj ‪gameobjects::get_label();
991  SetMatchFlag( "bomb_timer"+label, 1 );
992  if ( label == "_a" )
993  {
994  SetBombTimer( "A", int( gettime() + level.bombTimer * 1000 ) );
995  SetMatchFlag( "bomb_timer_a", 1 );
996  }
997  else
998  {
999  SetBombTimer( "B", int( gettime() + level.bombTimer * 1000 ) );
1000  SetMatchFlag( "bomb_timer_b", 1 );
1001  }
1002 
1003 
1004  if ( !level.multiBomb )
1005  {
1006  level.sdBomb ‪gameobjects::allow_carry( "none" );
1007  level.sdBomb ‪gameobjects::set_visible_team( "none" );
1008  level.sdBomb ‪gameobjects::set_dropped();
1009  level.sdBombModel = level.sdBomb.visuals[0];
1010  }
1011  else
1012  {
1013 
1014  for ( index = 0; index < level.players.size; index++ )
1015  {
1016  if ( isdefined( level.players[index].carryIcon ) )
1017  level.players[index].carryIcon ‪hud::destroyElem();
1018  }
1019 
1020  ‪trace = bulletTrace( player.origin + (0,0,20), player.origin - (0,0,2000), false, player );
1021 
1022  tempAngle = randomfloat( 360 );
1023  forward = (cos( tempAngle ), sin( tempAngle ), 0);
1024  forward = vectornormalize( forward - VectorScale( ‪trace["normal"], vectordot( forward, ‪trace["normal"] ) ) );
1025  dropAngles = vectortoangles( forward );
1026 
1027  level.sdBombModel = ‪spawn( "script_model", ‪trace["position"] );
1028  level.sdBombModel.angles = dropAngles;
1029  level.sdBombModel setModel( "p7_mp_suitcase_bomb" );
1030  }
1031  destroyedObj ‪gameobjects::allow_use( "none" );
1032  destroyedObj ‪gameobjects::set_visible_team( "none" );
1033 
1034  label = destroyedObj ‪gameobjects::get_label();
1035 
1036  // create a new object to defuse with.
1037  trigger = destroyedObj.bombDefuseTrig;
1038  trigger.origin = level.sdBombModel.origin;
1039  visuals = [];
1040  defuseObject = ‪gameobjects::create_use_object( game["defenders"], trigger, visuals, (0,0,32), istring("sd_defuse"+label), true, true );
1041  defuseObject ‪gameobjects::allow_use( "friendly" );
1042  defuseObject ‪gameobjects::set_use_time( level.defuseTime );
1043  defuseObject ‪gameobjects::set_use_text( &"MP_DEFUSING_EXPLOSIVE" );
1044  defuseObject ‪gameobjects::set_use_hint_text( &"PLATFORM_HOLD_TO_DEFUSE_EXPLOSIVES" );
1045  defuseObject ‪gameobjects::set_visible_team( "any" );
1046  defuseObject ‪gameobjects::set_2d_icon( "friendly", "compass_waypoint_defuse" + label );
1047  defuseObject ‪gameobjects::set_2d_icon( "enemy", "compass_waypoint_defend" + label );
1048  defuseObject ‪gameobjects::set_3d_icon( "friendly", "waypoint_defuse" + label );
1049  defuseObject ‪gameobjects::set_3d_icon( "enemy", "waypoint_defend" + label );
1051  defuseObject.label = label;
1052  defuseObject.onBeginUse =&‪onBeginUse;
1053  defuseObject.onEndUse =&‪onEndUse;
1054  defuseObject.onUse =&‪onUseDefuseObject;
1055  defuseObject.useWeapon = GetWeapon( "briefcase_bomb_defuse" );
1056 
1057  player.isBombCarrier = false;
1058  player PlayBombPlant();
1059 
1060  ‪BombTimerWait();
1061  SetBombTimer( "A", 0 );
1062  SetBombTimer( "B", 0 );
1063  SetMatchFlag( "bomb_timer_a", 0 );
1064  SetMatchFlag( "bomb_timer_b", 0 );
1065 
1066  destroyedObj.visuals[0] ‪globallogic_utils::stopTickingSound();
1067 
1068  if ( level.gameEnded || level.bombDefused )
1069  return;
1070 
1071  level.bombExploded = true;
1072 
1073  origin = (0,0,0);
1074  if ( isdefined( player ) )
1075  {
1076  origin = player.origin;
1077  }
1078 
1079  explosionOrigin = level.sdBombModel.origin+(0,0,12);
1080  level.sdBombModel hide();
1081 
1082  if ( isdefined( player ) )
1083  {
1084  destroyedObj.visuals[0] radiusDamage( explosionOrigin, 512, 200, 20, player, "MOD_EXPLOSIVE", GetWeapon( "briefcase_bomb" ) );
1085  level thread ‪popups::DisplayTeamMessageToAll( &"MP_EXPLOSIVES_BLOWUP_BY", player );
1086  ‪scoreevents::processScoreEvent( "bomb_detonated", player );
1087  player AddPlayerStatWithGameType( "DESTRUCTIONS", 1 );
1088  player AddPlayerStatWithGameType( "captures", 1 ); // counts towards Destroyer challenge
1089  player RecordGameEvent("destroy");
1090  }
1091  else
1092  destroyedObj.visuals[0] radiusDamage( explosionOrigin, 512, 200, 20, undefined, "MOD_EXPLOSIVE", GetWeapon( "briefcase_bomb" ) );
1093 
1094  rot = randomfloat(360);
1095  explosionEffect = spawnFx( level._effect["bombexplosion"], explosionOrigin + (0,0,50), (0,0,1), (cos(rot),sin(rot),0) );
1096  triggerFx( explosionEffect );
1097 
1098  thread ‪sound::play_in_space( "mpl_sd_exp_suitcase_bomb_main", explosionOrigin );
1099 
1100  if ( isdefined( destroyedObj.exploderIndex ) )
1101  ‪exploder::exploder( destroyedObj.exploderIndex );
1102 
1103  defuseObject ‪gameobjects::destroy_object();
1104  foreach ( zone in level.bombZones )
1106 
1107  setGameEndTime( 0 );
1108 
1109  wait 3;
1110 
1111  ‪sd_endGame( game["attackers"], game["strings"]["target_destroyed"] );
1112 }
1113 
1115 {
1116  level endon("game_ended");
1117  level endon("bomb_defused");
1119 }
1120 
1121 function ‪bombDefused( defusedObject, player )
1122 {
1123  level.tickingObject ‪globallogic_utils::stopTickingSound();
1124  level.bombDefused = true;
1125  player SetWeaponOverheating( true, 100, defusedObject.useWeapon ); // overheating allows for non-quick drop anim to be played
1126  SetBombTimer( "A", 0 );
1127  SetBombTimer( "B", 0 );
1128  SetMatchFlag( "bomb_timer_a", 0 );
1129  SetMatchFlag( "bomb_timer_b", 0 );
1130 
1131  player PlayBombDefuse();
1132 
1133  level notify("bomb_defused");
1134  thread ‪globallogic_audio::set_music_on_team( "silent" );
1135 
1136  wait 1.5;
1137 
1138  setGameEndTime( 0 );
1139 
1140  ‪sd_endGame( game["defenders"], game["strings"]["bomb_defused"] );
1141 }
1142 
1144 {
1145  roundsPlayed = ‪util::getRoundsPlayed();
1146 
1147  if ( level.playerKillsMax == 0 )
1148  return false;
1149 
1150  if ( game["totalKills"] > ( level.totalKillsMax * (roundsPlayed + 1) ) )
1151  return true;
1152 
1153  if ( self.kills > ( level.playerKillsMax * (roundsPlayed + 1)) )
1154  return true;
1155 
1156  if ( level.teambased && (self.team == "allies" || self.team == "axis" ))
1157  {
1158  if ( game["totalKillsTeam"][self.team] > ( level.playerKillsMax * (roundsPlayed + 1)) )
1159  return true;
1160  }
1161 
1162  return false;
1163 }
1164 
1166 {
1167  if ( level.hardcoreMode && level.friendlyfire > 0 && isdefined( victim ) && ( victim.isPlanting === true || victim.isDefusing === true ) )
1168  {
1169  return 2; // FF 2 = reflect; design wants reflect friendly fire whenever a player is planting or defusing in SD.
1170  }
1171 
1172  return level.friendlyfire;
1173 }
‪create_use_object
‪function create_use_object(ownerTeam, trigger, visuals, offset, objectiveName, allowInitialHoldDelay=false, allowWeaponCyclingDuringHold=false)
Definition: gameobjects_shared.gsc:1491
‪endGame
‪function endGame(winner, endReasonText)
Definition: _globallogic.gsc:1950
‪processScoreEvent
‪function processScoreEvent(event, player, victim, weapon)
Definition: scoreevents_shared.gsc:19
‪update_settings
‪function update_settings()
Definition: _spectating.gsc:28
‪setObjectiveText
‪function setObjectiveText(team, text)
Definition: _util.gsc:585
‪giveTeamScoreForObjective_DelayPostProcessing
‪function giveTeamScoreForObjective_DelayPostProcessing(team, score)
Definition: _globallogic_score.gsc:747
‪exploder
‪function exploder(exploder_id, n_localclientnumber)
Definition: exploder_shared.csc:297
‪allow_use
‪function allow_use(relativeTeam)
Definition: gameobjects_shared.gsc:3485
‪setvisiblescoreboardcolumns
‪function setvisiblescoreboardcolumns(col1, col2, col3, col4, col5)
Definition: _globallogic.gsc:545
‪onSpawnPlayer
‪function onSpawnPlayer(predictedSpawn)
Definition: sd.gsc:361
‪killedBaseDefender
‪function killedBaseDefender(objective)
Definition: _challenges.gsc:1647
‪sd_getTeamKillPenalty
‪function sd_getTeamKillPenalty(eInflictor, attacker, sMeansOfDeath, weapon)
Definition: sd.gsc:208
‪onDeadEvent
‪function onDeadEvent(team)
Definition: sd.gsc:486
‪OBJECTIVE_FLAG_DEFUSED
‪#define OBJECTIVE_FLAG_DEFUSED
Definition: sd.gsc:116
‪onCantUse
‪function onCantUse(player)
Definition: sd.gsc:804
‪registerRoundWinLimit
‪function registerRoundWinLimit(minValue, maxValue)
Definition: _util.gsc:630
‪get_label
‪function get_label()
Definition: gameobjects_shared.gsc:4207
‪updateGametypeDvars
‪function updateGametypeDvars()
Definition: sd.gsc:604
‪set_use_time
‪function set_use_time(time)
Definition: gameobjects_shared.gsc:3455
‪register_allowed_gameobject
‪function register_allowed_gameobject(gameobject)
Definition: gameobjects_shared.gsc:67
‪defenseGlobalCount
‪function defenseGlobalCount()
Definition: medals_shared.gsc:41
‪play_in_space
‪function play_in_space(localClientNum, alias, origin)
Definition: sound_shared.csc:30
‪set_dropped
‪function set_dropped()
Definition: gameobjects_shared.gsc:1063
‪killedBaseOffender
‪function killedBaseOffender(objective, weapon)
Definition: _challenges.gsc:1566
‪find_box_center
‪function find_box_center(mins, maxs)
Definition: math_shared.gsc:86
‪set_2d_icon
‪function set_2d_icon(relativeTeam, shader)
Definition: gameobjects_shared.gsc:3564
‪onTimeLimit
‪function onTimeLimit()
Definition: sd.gsc:522
‪onUseDefuseObject
‪function onUseDefuseObject(player)
Definition: sd.gsc:850
‪is_friendly_team
‪function is_friendly_team(team)
Definition: gameobjects_shared.gsc:3980
‪offenseGlobalCount
‪function offenseGlobalCount()
Definition: medals_shared.gsc:36
‪set_3d_icon
‪function set_3d_icon(relativeTeam, shader)
Definition: gameobjects_shared.gsc:3570
‪playTickingSound
‪function playTickingSound(gametype_tick_sound)
Definition: _globallogic_utils.gsc:155
‪onStartGameType
‪function onStartGameType()
Definition: sd.gsc:292
‪maySpawn
‪function maySpawn()
Definition: _globallogic_spawn.gsc:93
‪onPrecacheGameType
‪function onPrecacheGameType()
Definition: sd.gsc:202
‪play_on_players
‪function play_on_players(sound, team)
Definition: sound_shared.gsc:257
‪trace
‪function trace(from, to, target)
Definition: grapple.gsc:369
‪registerFriendlyFireDelay
‪function registerFriendlyFireDelay(dvarString, defaultValue, minValue, maxValue)
Definition: _globallogic.gsc:3917
‪destroyElem
‪function destroyElem()
Definition: hud_util_shared.gsc:755
‪checkAllowSpectating
‪function checkAllowSpectating()
Definition: sd.gsc:447
‪spawn
‪function spawn(v_origin=(0, 0, 0), v_angles=(0, 0, 0))
Definition: struct.csc:23
‪IS_TRUE
‪#define IS_TRUE(__a)
Definition: shared.gsh:251
‪onReset
‪function onReset()
Definition: sd.gsc:956
‪allow_carry
‪function allow_carry(relativeTeam)
Definition: gameobjects_shared.gsc:3480
‪getBetterTeam
‪function getBetterTeam()
Definition: sd.gsc:255
‪sd_playerSpawnedCB
‪function sd_playerSpawnedCB()
Definition: sd.gsc:370
‪pauseTimer
‪function pauseTimer(pausePlayableTimer=false)
Definition: _globallogic_utils.gsc:287
‪setBombOverheatingAfterWeaponChange
‪function setBombOverheatingAfterWeaponChange(useObject, overheated, heat)
Definition: sd.gsc:732
‪set_flags
‪function set_flags(flags)
Definition: gameobjects_shared.gsc:4234
‪registerNumLives
‪function registerNumLives(minValue, maxValue, teamLivesMinValue, teamLivesMaxValue)
Definition: _util.gsc:664
‪registerScoreLimit
‪function registerScoreLimit(minValue, maxValue)
Definition: _util.gsc:638
‪set_music_on_team
‪function set_music_on_team(state, team="both", wait_time=0, save_state=false, return_state=false)
Definition: _globallogic_audio.gsc:1036
‪BombTimerWait
‪function BombTimerWait()
Definition: sd.gsc:1114
‪error
‪function error(msg)
Definition: _util.gsc:28
‪getScoreInfoValue
‪function getScoreInfoValue(type)
Definition: rank_shared.gsc:248
‪create_map_placed_influencers
‪function create_map_placed_influencers()
Definition: _spawning.gsc:522
‪bombs
‪function bombs()
Definition: sd.gsc:618
‪set_key_object
‪function set_key_object(object)
Definition: gameobjects_shared.gsc:1674
‪onRoundSwitch
‪function onRoundSwitch()
Definition: sd.gsc:233
‪getOtherTeam
‪function getOtherTeam(team)
Definition: _util.gsc:360
‪getRoundsPlayed
‪function getRoundsPlayed()
Definition: util_shared.gsc:3737
‪should_spawn_tags
‪function should_spawn_tags(eInflictor, attacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, psOffsetTime, deathAnimDuration)
Definition: _dogtags.gsc:373
‪default_getTeamKillPenalty
‪function default_getTeamKillPenalty(eInflictor, attacker, sMeansOfDeath, weapon)
Definition: _globallogic_defaults.gsc:337
‪get_owner_team
‪function get_owner_team()
Definition: gameobjects_shared.gsc:3445
‪warnLastPlayer
‪function warnLastPlayer(team)
Definition: sd.gsc:531
‪set_visible_team
‪function set_visible_team(relativeTeam)
Definition: gameobjects_shared.gsc:3491
‪set_leader_gametype_dialog
‪function set_leader_gametype_dialog(startGameDialogKey, startHcGameDialogKey, offenseOrderDialogKey, defenseOrderDialogKey)
Definition: _globallogic_audio.gsc:92
‪onUseDogTag
‪function onUseDogTag(player)
Definition: _dogtags.gsc:397
‪enable_object
‪function enable_object(forceShow)
Definition: gameobjects_shared.gsc:3938
‪place_spawn_points
‪function place_spawn_points(spawnPointName)
Definition: _spawnlogic.gsc:22
‪get_spawnpoint_array
‪function get_spawnpoint_array(classname)
Definition: _spawnlogic.gsc:27
‪DisplayTeamMessageToAll
‪function DisplayTeamMessageToAll(message, player)
Definition: popups_shared.gsc:122
‪onOneLeftEvent
‪function onOneLeftEvent(team)
Definition: sd.gsc:512
‪setObjectiveHintText
‪function setObjectiveHintText(team, text)
Definition: _util.gsc:595
‪figureOutGameTypeFriendlyFire
‪function figureOutGameTypeFriendlyFire(victim)
Definition: sd.gsc:1165
‪onUsePlantObject
‪function onUsePlantObject(player)
Definition: sd.gsc:809
‪gametype_specific_battle_chatter
‪function gametype_specific_battle_chatter(event, team)
Definition: _battlechatter.gsc:838
‪onBeginUse
‪function onBeginUse(player)
Definition: sd.gsc:747
‪set_carry_icon
‪function set_carry_icon(shader)
Definition: gameobjects_shared.gsc:3855
‪bookmark
‪function bookmark(type, time, mainClientEnt, otherClientEnt, eventPriority, inflictorEnt, overrideEntityCamera, actorEnt)
Definition: demo_shared.gsc:25
‪array
‪function filter array
Definition: array_shared.csc:16
‪registerRoundSwitch
‪function registerRoundSwitch(minValue, maxValue)
Definition: _util.gsc:615
‪create_carry_object
‪function create_carry_object(ownerTeam, trigger, visuals, offset, objectiveName, hitSound)
Definition: gameobjects_shared.gsc:266
‪registerRoundLimit
‪function registerRoundLimit(minValue, maxValue)
Definition: _util.gsc:622
‪set_use_hint_text
‪function set_use_hint_text(text)
Definition: gameobjects_shared.gsc:3475
‪onDrop
‪function onDrop(player)
Definition: sd.gsc:891
‪init
‪function init()
Definition: struct.csc:1
‪onEndUse
‪function onEndUse(team, player, result)
Definition: sd.gsc:776
‪main
‪function main()
Definition: sd.gsc:157
‪spawn_dog_tag
‪function spawn_dog_tag(victim, attacker, on_use_function, objectives_for_attacker_and_victim_only)
Definition: _dogtags.gsc:32
‪setObjectiveScoreText
‪function setObjectiveScoreText(team, text)
Definition: _util.gsc:590
‪bombPlanted
‪function bombPlanted(destroyedObj, player)
Definition: sd.gsc:974
‪leader_dialog
‪function leader_dialog(dialogKey, team, excludeList, objectiveKey, killstreakId, dialogBufferKey)
Definition: _globallogic_audio.gsc:435
‪sd_isKillBoosting
‪function sd_isKillBoosting()
Definition: sd.gsc:1143
‪waitLongDurationWithGameEndTimeUpdate
‪function waitLongDurationWithGameEndTimeUpdate(duration)
Definition: hostmigration_shared.gsc:292
‪onPickup
‪function onPickup(player)
Definition: sd.gsc:917
‪OBJECTIVE_FLAG_PLANTED
‪#define OBJECTIVE_FLAG_PLANTED
Definition: sd.gsc:117
‪update
‪function update()
Definition: _serversettings.gsc:71
‪stopTickingSound
‪function stopTickingSound()
Definition: _globallogic_utils.gsc:191
‪sd_getTeamKillScore
‪function sd_getTeamKillScore(eInflictor, attacker, sMeansOfDeath, weapon)
Definition: sd.gsc:220
‪set_use_text
‪function set_use_text(text)
Definition: gameobjects_shared.gsc:3460
‪result
‪function result(death, attacker, mod, weapon)
Definition: _zm_aat_blast_furnace.gsc:46
‪onPlayerKilled
‪function onPlayerKilled(eInflictor, attacker, iDamage, sMeansOfDeath, weapon, vDir, sHitLoc, psOffsetTime, deathAnimDuration)
Definition: sd.gsc:375
‪bombPlantedMusicDelay
‪function bombPlantedMusicDelay()
Definition: sd.gsc:961
‪sd_endGame
‪function sd_endGame(winningTeam, endReasonText)
Definition: sd.gsc:472
‪leader_dialog_on_player
‪function leader_dialog_on_player(dialogKey, objectiveKey, killstreakId, dialogBufferKey, introDialog)
Definition: _globallogic_audio.gsc:460
‪registerTimeLimit
‪function registerTimeLimit(minValue, maxValue)
Definition: _util.gsc:655
‪name
‪class GroundFx name
‪get_random_intermission_point
‪function get_random_intermission_point()
Definition: _spawnlogic.gsc:54
‪destroy_object
‪function destroy_object(deleteTrigger, forceHide, b_connect_paths=false)
Definition: gameobjects_shared.gsc:3872
‪disable_object
‪function disable_object(forceHide)
Definition: gameobjects_shared.gsc:3909
‪bombDefused
‪function bombDefused(defusedObject, player)
Definition: sd.gsc:1121
‪sd_endGameWithKillcam
‪function sd_endGameWithKillcam(winningTeam, endReasonText)
Definition: sd.gsc:480
‪WAIT_SERVER_FRAME
‪#define WAIT_SERVER_FRAME
Definition: shared.gsh:265
‪giveLastAttackerWarning
‪function giveLastAttackerWarning(team)
Definition: sd.gsc:562