‪Black Ops 3 Source Code Explorer  0.1
‪An script explorer for Black Ops 3 by ZeRoY
_oob.gsc
Go to the documentation of this file.
1 #using scripts\shared\callbacks_shared;
2 #using scripts\shared\clientfield_shared;
3 #using scripts\shared\system_shared;
4 #using scripts\shared\util_shared;
5 #using scripts\shared\hostmigration_shared;
6 
7 #insert scripts\shared\clientfields.gsh;
8 #insert scripts\shared\shared.gsh;
9 #insert scripts\shared\version.gsh;
10 
11 
12 #namespace oob;
13 
14 #define OOB_TIMELIMIT_MS_DEFAULT 6000 //Change the value in the _oob.csc file to match this one
15 #define OOB_DAMAGE_MS_DEFAULT 1000
16 #define OOB_DAMAGE_DEFAULT 5
17 #define OOB_EFFECT_MAX_DISTANCE_BEFORE_BLACK 400
18 #define OOB_EFFECT_TIME_REMAINING_BEFORE_BLACK 1000
19 
20 
21 #define OOB_TIMEKEEP_MP 3000 //Change the value in the _oob.csc file to match this one
22 #define OOB_TIMELIMIT_MS_DEFAULT_MP 3000 //Change the value in the _oob.csc file to match this one
23 #define OOB_DAMAGE_MS_DEFAULT_MP 3000
24 #define OOB_DAMAGE_DEFAULT_MP 999
25 #define OOB_EFFECT_MAX_DISTANCE_BEFORE_BLACK_MP 100000
26 #define OOB_EFFECT_TIME_REMAINING_BEFORE_BLACK_MP -1
27 
28 #define OOB_INVALID_TIME -1
29 
30 ‪REGISTER_SYSTEM( "out_of_bounds", &‪__init__, undefined )
31 
32 function ‪__init__()
33 {
34  level.oob_triggers = [];
35 
36  if(SessionModeIsMultiplayerGame())
37  {
38  level.oob_timekeep_ms = GetDvarInt( "oob_timekeep_ms", ‪OOB_TIMEKEEP_MP );
39  level.oob_timelimit_ms = GetDvarInt( "oob_timelimit_ms", ‪OOB_TIMELIMIT_MS_DEFAULT_MP );
40  level.oob_damage_interval_ms = GetDvarInt( "oob_damage_interval_ms", ‪OOB_DAMAGE_MS_DEFAULT_MP );
41  level.oob_damage_per_interval = GetDvarInt( "oob_damage_per_interval", ‪OOB_DAMAGE_DEFAULT_MP );
42  level.oob_max_distance_before_black = GetDvarInt( "oob_max_distance_before_black", ‪OOB_EFFECT_MAX_DISTANCE_BEFORE_BLACK_MP );
43  level.oob_time_remaining_before_black = GetDvarInt( "oob_time_remaining_before_black", ‪OOB_EFFECT_TIME_REMAINING_BEFORE_BLACK_MP );
44  }
45  else
46  {
47  level.oob_timelimit_ms = GetDvarInt( "oob_timelimit_ms", ‪OOB_TIMELIMIT_MS_DEFAULT );
48  level.oob_damage_interval_ms = GetDvarInt( "oob_damage_interval_ms", ‪OOB_DAMAGE_MS_DEFAULT );
49  level.oob_damage_per_interval = GetDvarInt( "oob_damage_per_interval", ‪OOB_DAMAGE_DEFAULT );
50  level.oob_max_distance_before_black = GetDvarInt( "oob_max_distance_before_black", ‪OOB_EFFECT_MAX_DISTANCE_BEFORE_BLACK );
51  level.oob_time_remaining_before_black = GetDvarInt( "oob_time_remaining_before_black", ‪OOB_EFFECT_TIME_REMAINING_BEFORE_BLACK );
52  }
53 
54  level.oob_damage_interval_sec = level.oob_damage_interval_ms / 1000;
55 
56  hurt_triggers = GetEntArray( "trigger_out_of_bounds","classname" );
57 
58  foreach( trigger in hurt_triggers )
59  {
60  trigger thread ‪run_oob_trigger();
61  }
62 
63  ‪clientfield::register( "toplayer", "out_of_bounds", ‪VERSION_SHIP, 5, "int" );
64 }
65 
67 {
68  self.oob_players = [];
69  ‪ARRAY_ADD( level.oob_triggers, self );
70  self thread ‪waitForPlayerTouch();
71  self thread ‪waitForCloneTouch();
72 }
73 
74 function ‪IsOutOfBounds()
75 {
76  if( !IsDefined( self.oob_start_time ) )
77  {
78  return false;
79  }
80 
81  return self.oob_start_time != ‪OOB_INVALID_TIME;
82 }
83 
85 {
86  triggers_to_remove = [];
87  ‪result = false;
88 
89  foreach( trigger in level.oob_triggers )
90  {
91  if( !isdefined( trigger ) )
92  {
93  ‪ARRAY_ADD(triggers_to_remove, trigger);
94  continue;
95  }
96 
97  if( !trigger IsTriggerEnabled() )
98  {
99  continue;
100  }
101 
102  if( self IsTouching( trigger ) )
103  {
104  ‪result = true;
105  break;
106  }
107  }
108 
109  foreach( trigger in triggers_to_remove )
110  {
111  ArrayRemoveValue( level.oob_triggers, trigger );
112  }
113 
114  triggers_to_remove = [];
115  triggers_to_remove = undefined;
116 
117  return ‪result;
118 }
119 
120 function ‪ResetOOBTimer( is_host_migrating, b_disable_timekeep)
121 {
122  self.oob_lastValidPlayerLoc = undefined;
123  self.oob_LastValidPlayerDir = undefined;
124  self ‪clientfield::set_to_player( "out_of_bounds", 0 );
125  self ‪util::show_hud( 1 );
126  self.oob_start_time = ‪OOB_INVALID_TIME;
127 
128  if( isdefined(level.oob_timekeep_ms))
129  {
130  if(‪IS_TRUE(b_disable_timekeep))
131  {
132  self.last_oob_timekeep_ms = undefined;
133  }
134  else
135  {
136  self.last_oob_timekeep_ms = GetTime();
137  }
138  }
139 
140  if(!‪IS_TRUE(is_host_migrating))
141  {
142  self notify( "oob_host_migration_exit" );
143  }
144 
145  self notify( "oob_exit" );
146 }
147 
148 function ‪waitForCloneTouch()//self = trigger
149 {
150  self endon( "death" );
151 
152  while( true )
153  {
154  self waittill( "trigger", clone );
155 
156  if( IsActor( clone ) && IsDefined( clone.isAiClone ) && clone.isAiClone && (!clone IsPlayingAnimScripted()) )
157  {
158  clone notify( "clone_shutdown" );
159  }
160  }
161 }
162 
163 function ‪GetAdjusedPlayer( Player )
164 {
165  if( isdefined(player.hijacked_vehicle_entity) && IsAlive(player.hijacked_vehicle_entity) )
166  {
167  return player.hijacked_vehicle_entity;
168  }
169 
170  return Player;
171 }
172 
173 function ‪waitForPlayerTouch()//self = trigger
174 {
175  self endon( "death" );
176 
177  while( true )
178  {
179  if(SessionModeIsMultiplayerGame())
180  {
182  }
183 
184  self waittill( "trigger", entity );
185 
186  if( !IsPlayer(entity) && !(IsVehicle(entity) && ‪IS_TRUE(entity.hijacked) && isdefined(entity.owner) && IsAlive(entity)) )
187  continue;
188 
189  if(IsPlayer(entity))
190  {
191  player = entity;
192  }
193  else
194  {
195  vehicle = entity;
196  player = vehicle.owner;
197  }
198 
199  if( !(player ‪IsOutOfBounds()) && !(player IsPlayingAnimScripted()) && !‪IS_TRUE( player.OOBDisabled ) )
200  {
201  player notify( "oob_enter" );
202 
203  //Logic to pause/continue the OOB time for a certain duration if the player come out/in from it.
204  if( isdefined(level.oob_timekeep_ms) && isdefined(player.last_oob_timekeep_ms) && isdefined(player.last_oob_duration_ms) &&
205  ((GetTime() - player.last_oob_timekeep_ms) < level.oob_timekeep_ms) )
206  {
207  player.oob_start_time = GetTime() - (level.oob_timelimit_ms - player.last_oob_duration_ms);
208  }
209  else
210  {
211  player.oob_start_time = GetTime();
212  }
213 
214  player.oob_LastValidPlayerLoc = entity.origin;
215  player.oob_LastValidPlayerDir = VectorNormalize( entity GetVelocity() ) ;
216 
217  player ‪util::show_hud( 0 );
218  player thread ‪watchForLeave( self, entity );
219  player thread ‪watchForDeath( self, entity );
220 
221  if(SessionModeIsMultiplayerGame())
222  {
223  player thread ‪watchForHostMigration( self, entity );
224  }
225  }
226  }
227 }
228 
229 function ‪GetDistanceFromLastValidPlayerLoc(trigger, entity)
230 {
231  if(isdefined(self.oob_LastValidPlayerDir) && self.oob_LastValidPlayerDir != (0, 0, 0))
232  {
233  vecToPlayerLocFromOrigin = entity.origin - self.oob_lastValidPlayerLoc;
234  distance = VectorDot(vecToPlayerLocFromOrigin, self.oob_LastValidPlayerDir);
235  }
236  else
237  {
238  distance = Distance(entity.origin, self.oob_lastValidPlayerLoc);
239  }
240 
241  if(distance < 0)
242  distance = 0;
243 
244  if(distance > level.oob_max_distance_before_black)
245  distance = level.oob_max_distance_before_black;
246 
247  return distance / level.oob_max_distance_before_black;
248 }
249 
250 function ‪UpdateVisualEffects( trigger, entity )
251 {
252  timeRemaining = (level.oob_timelimit_ms - (GetTime() - self.oob_start_time));
253 
254  if( isdefined(level.oob_timekeep_ms) )
255  {
256  self.last_oob_duration_ms = timeRemaining;
257  }
258 
259  oob_effectValue = 0;
260 
261  if(timeRemaining <= level.oob_time_remaining_before_black)
262  {
263  if(!isdefined(self.oob_lastEffectValue))
264  {
265  self.oob_lastEffectValue = ‪GetDistanceFromLastValidPlayerLoc(trigger, entity);
266  }
267 
268  time_val = 1 - (timeRemaining / level.oob_time_remaining_before_black);
269 
270  if(time_val > 1)
271  time_val = 1;
272 
273  oob_effectValue = self.oob_lastEffectValue + (1 - self.oob_lastEffectValue) * time_val;
274  }
275  else
276  {
277  oob_effectValue = ‪GetDistanceFromLastValidPlayerLoc(trigger, entity);
278 
279  if(oob_effectValue > 0.9)
280  {
281  oob_effectValue = 0.9;
282  }
283  else if(oob_effectValue < 0.05)
284  {
285  oob_effectValue = 0.05;
286  }
287 
288  self.oob_lastEffectValue = oob_effectValue;
289  }
290 
291  oob_effectValue = ceil(oob_effectValue * 31); //5 bits 2^5 = 32 (so 31 values)
292 
293  self ‪clientfield::set_to_player( "out_of_bounds", int(oob_effectValue) );
294 }
295 
296 function ‪killEntity(entity)
297 {
298  entity_to_kill = entity;
299 
300  if ( IsPlayer( entity ) && entity IsInVehicle() )
301  {
302  vehicle = entity GetVehicleOccupied();
303  if ( isdefined( vehicle ) && ( vehicle.is_oob_kill_target === true ) )
304  entity_to_kill = vehicle;
305  }
306 
307  self ‪ResetOOBTimer();
308  entity_to_kill DoDamage( entity_to_kill.health + 10000, entity_to_kill.origin, undefined, undefined, "none", "MOD_TRIGGER_HURT" );
309 }
310 
311 function ‪watchForLeave( trigger, entity )
312 {
313  self endon( "oob_exit" );
314  entity endon( "death" );
315 
316  while( true )
317  {
318  if( entity ‪IsTouchingAnyOOBTrigger() )
319  {
320  ‪UpdateVisualEffects( trigger, entity );
321 
322  if( (level.oob_timelimit_ms - (GetTime() - self.oob_start_time)) <= 0 )
323  {
324  if( IsPlayer(entity) )
325  {
326  entity DisableInvulnerability();
327  entity.ignoreme = false;
328  entity.laststand = undefined;
329 
330  if( isdefined( entity.revivetrigger ) )
331  {
332  entity.reviveTrigger delete();
333  }
334  }
335  self thread ‪killEntity( entity );
336  }
337  }
338  else
339  {
340  self ‪ResetOOBTimer();
341  }
342 
343  wait( 0.1 );
344  }
345 }
346 
347 function ‪watchForDeath( trigger, entity )
348 {
349  self endon( "disconnect" );
350  self endon( "oob_exit" );
351 
352  ‪util::waittill_any_ents_two( self, "death", entity, "death" );
353 
354  self ‪ResetOOBTimer();
355 }
356 
357 function ‪watchForHostMigration( trigger, entity )
358 {
359  self endon( "oob_host_migration_exit" );
360 
361  level waittill("host_migration_begin");
362 
363  self ‪ResetOOBTimer( true, true );
364 }
365 
366 function ‪disablePlayerOOB( disabled )
367 {
368  if ( disabled )
369  {
370  self ‪ResetOOBTimer();
371  self.OOBDisabled = true;
372  }
373  else
374  {
375  self.OOBDisabled = false;
376  }
377 }
‪waitTillHostMigrationDone
‪function waitTillHostMigrationDone()
Definition: hostmigration_shared.gsc:193
‪killEntity
‪function killEntity(entity)
Definition: _oob.gsc:296
‪IsTouchingAnyOOBTrigger
‪function IsTouchingAnyOOBTrigger()
Definition: _oob.gsc:84
‪GetDistanceFromLastValidPlayerLoc
‪function GetDistanceFromLastValidPlayerLoc(trigger, entity)
Definition: _oob.gsc:229
‪set_to_player
‪function set_to_player(str_field_name, n_value)
Definition: clientfield_shared.gsc:58
‪OOB_DAMAGE_DEFAULT_MP
‪#define OOB_DAMAGE_DEFAULT_MP
Definition: _oob.gsc:24
‪ResetOOBTimer
‪function ResetOOBTimer(is_host_migrating, b_disable_timekeep)
Definition: _oob.gsc:120
‪VERSION_SHIP
‪#define VERSION_SHIP
Definition: version.gsh:36
‪OOB_EFFECT_MAX_DISTANCE_BEFORE_BLACK
‪#define OOB_EFFECT_MAX_DISTANCE_BEFORE_BLACK
Definition: _oob.gsc:17
‪IsOutOfBounds
‪function IsOutOfBounds()
Definition: _oob.gsc:74
‪show_hud
‪function show_hud(b_show)
Definition: util_shared.gsc:4025
‪disablePlayerOOB
‪function disablePlayerOOB(disabled)
Definition: _oob.gsc:366
‪OOB_TIMELIMIT_MS_DEFAULT
‪#define OOB_TIMELIMIT_MS_DEFAULT
Definition: _oob.gsc:14
‪OOB_EFFECT_MAX_DISTANCE_BEFORE_BLACK_MP
‪#define OOB_EFFECT_MAX_DISTANCE_BEFORE_BLACK_MP
Definition: _oob.gsc:25
‪waitForCloneTouch
‪function waitForCloneTouch()
Definition: _oob.gsc:148
‪IS_TRUE
‪#define IS_TRUE(__a)
Definition: shared.gsh:251
‪OOB_DAMAGE_DEFAULT
‪#define OOB_DAMAGE_DEFAULT
Definition: _oob.gsc:16
‪OOB_TIMELIMIT_MS_DEFAULT_MP
‪#define OOB_TIMELIMIT_MS_DEFAULT_MP
Definition: _oob.gsc:22
‪OOB_DAMAGE_MS_DEFAULT
‪#define OOB_DAMAGE_MS_DEFAULT
Definition: _oob.gsc:15
‪__init__
‪function __init__()
Definition: _oob.gsc:32
‪run_oob_trigger
‪function run_oob_trigger()
Definition: _oob.gsc:66
‪watchForDeath
‪function watchForDeath(trigger, entity)
Definition: _oob.gsc:347
‪OOB_EFFECT_TIME_REMAINING_BEFORE_BLACK_MP
‪#define OOB_EFFECT_TIME_REMAINING_BEFORE_BLACK_MP
Definition: _oob.gsc:26
‪ARRAY_ADD
‪#define ARRAY_ADD(__array, __item)
Definition: shared.gsh:304
‪watchForLeave
‪function watchForLeave(trigger, entity)
Definition: _oob.gsc:311
‪REGISTER_SYSTEM
‪#define REGISTER_SYSTEM(__sys, __func_init_preload, __reqs)
Definition: shared.gsh:204
‪GetAdjusedPlayer
‪function GetAdjusedPlayer(Player)
Definition: _oob.gsc:163
‪OOB_EFFECT_TIME_REMAINING_BEFORE_BLACK
‪#define OOB_EFFECT_TIME_REMAINING_BEFORE_BLACK
Definition: _oob.gsc:18
‪waittill_any_ents_two
‪function waittill_any_ents_two(ent1, string1, ent2, string2)
Definition: util_shared.csc:535
‪register
‪function register()
Definition: _ai_tank.gsc:126
‪UpdateVisualEffects
‪function UpdateVisualEffects(trigger, entity)
Definition: _oob.gsc:250
‪result
‪function result(death, attacker, mod, weapon)
Definition: _zm_aat_blast_furnace.gsc:46
‪watchForHostMigration
‪function watchForHostMigration(trigger, entity)
Definition: _oob.gsc:357
‪OOB_TIMEKEEP_MP
‪#define OOB_TIMEKEEP_MP
Definition: _oob.gsc:21
‪OOB_DAMAGE_MS_DEFAULT_MP
‪#define OOB_DAMAGE_MS_DEFAULT_MP
Definition: _oob.gsc:23
‪OOB_INVALID_TIME
‪#define OOB_INVALID_TIME
Definition: _oob.gsc:28
‪waitForPlayerTouch
‪function waitForPlayerTouch()
Definition: _oob.gsc:173