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;
7 #insert scripts\shared\clientfields.gsh;
8 #insert scripts\shared\shared.gsh;
9 #insert scripts\shared\version.gsh;
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
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
28 #define OOB_INVALID_TIME -1
34 level.oob_triggers = [];
36 if(SessionModeIsMultiplayerGame())
49 level.oob_damage_per_interval = GetDvarInt(
"oob_damage_per_interval",
OOB_DAMAGE_DEFAULT );
54 level.oob_damage_interval_sec = level.oob_damage_interval_ms / 1000;
56 hurt_triggers = GetEntArray(
"trigger_out_of_bounds",
"classname" );
58 foreach( trigger
in hurt_triggers )
68 self.oob_players = [];
76 if( !IsDefined(
self.oob_start_time ) )
86 triggers_to_remove = [];
89 foreach( trigger
in level.oob_triggers )
91 if( !isdefined( trigger ) )
97 if( !trigger IsTriggerEnabled() )
102 if(
self IsTouching( trigger ) )
109 foreach( trigger
in triggers_to_remove )
111 ArrayRemoveValue( level.oob_triggers, trigger );
114 triggers_to_remove = [];
115 triggers_to_remove = undefined;
122 self.oob_lastValidPlayerLoc = undefined;
123 self.oob_LastValidPlayerDir = undefined;
128 if( isdefined(level.oob_timekeep_ms))
132 self.last_oob_timekeep_ms = undefined;
136 self.last_oob_timekeep_ms = GetTime();
142 self notify(
"oob_host_migration_exit" );
145 self notify(
"oob_exit" );
150 self endon(
"death" );
154 self waittill(
"trigger", clone );
156 if( IsActor( clone ) && IsDefined( clone.isAiClone ) && clone.isAiClone && (!clone IsPlayingAnimScripted()) )
158 clone notify(
"clone_shutdown" );
165 if( isdefined(player.hijacked_vehicle_entity) && IsAlive(player.hijacked_vehicle_entity) )
167 return player.hijacked_vehicle_entity;
175 self endon(
"death" );
179 if(SessionModeIsMultiplayerGame())
184 self waittill(
"trigger", entity );
186 if( !IsPlayer(entity) && !(IsVehicle(entity) &&
IS_TRUE(entity.hijacked) && isdefined(entity.owner) && IsAlive(entity)) )
196 player = vehicle.owner;
201 player notify(
"oob_enter" );
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) )
207 player.oob_start_time = GetTime() - (level.oob_timelimit_ms - player.last_oob_duration_ms);
211 player.oob_start_time = GetTime();
214 player.oob_LastValidPlayerLoc = entity.origin;
215 player.oob_LastValidPlayerDir = VectorNormalize( entity GetVelocity() ) ;
221 if(SessionModeIsMultiplayerGame())
231 if(isdefined(
self.oob_LastValidPlayerDir) &&
self.oob_LastValidPlayerDir != (0, 0, 0))
233 vecToPlayerLocFromOrigin = entity.origin -
self.oob_lastValidPlayerLoc;
234 distance = VectorDot(vecToPlayerLocFromOrigin,
self.oob_LastValidPlayerDir);
238 distance = Distance(entity.origin,
self.oob_lastValidPlayerLoc);
244 if(distance > level.oob_max_distance_before_black)
245 distance = level.oob_max_distance_before_black;
247 return distance / level.oob_max_distance_before_black;
252 timeRemaining = (level.oob_timelimit_ms - (GetTime() -
self.oob_start_time));
254 if( isdefined(level.oob_timekeep_ms) )
256 self.last_oob_duration_ms = timeRemaining;
261 if(timeRemaining <= level.oob_time_remaining_before_black)
263 if(!isdefined(
self.oob_lastEffectValue))
268 time_val = 1 - (timeRemaining / level.oob_time_remaining_before_black);
273 oob_effectValue =
self.oob_lastEffectValue + (1 -
self.oob_lastEffectValue) * time_val;
279 if(oob_effectValue > 0.9)
281 oob_effectValue = 0.9;
283 else if(oob_effectValue < 0.05)
285 oob_effectValue = 0.05;
288 self.oob_lastEffectValue = oob_effectValue;
291 oob_effectValue = ceil(oob_effectValue * 31);
298 entity_to_kill = entity;
300 if ( IsPlayer( entity ) && entity IsInVehicle() )
302 vehicle = entity GetVehicleOccupied();
303 if ( isdefined( vehicle ) && ( vehicle.is_oob_kill_target ===
true ) )
304 entity_to_kill = vehicle;
308 entity_to_kill DoDamage( entity_to_kill.health + 10000, entity_to_kill.origin, undefined, undefined,
"none",
"MOD_TRIGGER_HURT" );
313 self endon(
"oob_exit" );
314 entity endon(
"death" );
322 if( (level.oob_timelimit_ms - (GetTime() -
self.oob_start_time)) <= 0 )
324 if( IsPlayer(entity) )
326 entity DisableInvulnerability();
327 entity.ignoreme =
false;
328 entity.laststand = undefined;
330 if( isdefined( entity.revivetrigger ) )
332 entity.reviveTrigger
delete();
349 self endon(
"disconnect" );
350 self endon(
"oob_exit" );
359 self endon(
"oob_host_migration_exit" );
361 level waittill(
"host_migration_begin");
371 self.OOBDisabled =
true;
375 self.OOBDisabled =
false;