1 #using scripts\codescripts\struct;
3 #using scripts\shared\array_shared;
4 #using scripts\shared\callbacks_shared;
5 #using scripts\shared\flag_shared;
6 #using scripts\shared\hud_shared;
7 #using scripts\shared\hud_util_shared;
9 #insert scripts\shared\shared.gsh;
11 #using scripts\zm\_zm;
12 #using scripts\zm\_zm_utility;
14 #namespace hostmigration;
19 shouldBeStopped = isdefined( level.hostMigrationTimer );
21 if ( !level.timerStopped && shouldBeStopped )
23 level.timerStopped =
true;
24 level.timerPauseTime = gettime();
26 else if ( level.timerStopped && !shouldBeStopped )
28 level.timerStopped =
false;
29 level.discardTime += gettime() - level.timerPauseTime;
41 if (
IS_TRUE( level._hm_should_pause_spawning ) )
46 for(i = 0; i < level.players.size; i++)
48 level.players[i] EnableInvulnerability();
49 level.players[i] setDStat(
"AfterActionReportStats",
"lobbyPopup",
"summary" );
55 level.migrationTimerPauseTime = gettime();
60 level.discardTime += gettime() - level.migrationTimerPauseTime;
65 level endon(
"host_migration_begin" );
66 level endon(
"host_migration_end" );
72 if ( !level.timerStopped && isdefined(level.discardTime) )
73 level.discardTime += gettime() - currTime;
82 setSlowMotion( 1, 1, 0 );
88 level.hostMigrationReturnedPlayerCount = 0;
90 if ( level.gameEnded )
96 sethostmigrationstatus(
true);
98 level notify(
"host_migration_begin" );
100 for(i = 0; i < level.players.size; i++)
102 if(isdefined(level.hostmigration_link_entity_callback))
104 if(!isdefined(level.players[i]._host_migration_link_entity))
106 level.players[i]._host_migration_link_entity = level.players[i] [[level.hostmigration_link_entity_callback]]();
113 if(isdefined(level.hostmigration_ai_link_entity_callback))
115 zombies = GetAiTeamArray( level.zombie_team );
116 if(IsDefined(zombies) && zombies.size > 0)
118 foreach(zombie
in zombies)
120 if(!isdefined(zombie._host_migration_link_entity))
122 zombie._host_migration_link_entity = zombie [[level.hostmigration_ai_link_entity_callback]]();
129 zombies = GetAiTeamArray( level.zombie_team );
130 if(IsDefined(zombies) && zombies.size > 0)
132 foreach(zombie
in zombies)
134 zombie.no_powerups =
true;
135 zombie.marked_for_recycle = 1;
136 zombie.has_been_damaged_by_player =
false;
137 zombie DoDamage( zombie.health + 1000, zombie.origin, zombie );
142 if (level.inPrematchPeriod)
143 level waittill(
"prematch_over");
147 level.hostMigrationTimer =
true;
152 if (
IS_TRUE( level.b_host_migration_force_player_respawn ) )
154 foreach(player
in level.players)
163 zombies = GetAiTeamArray( level.zombie_team );
164 if(IsDefined(zombies) && zombies.size > 0)
166 foreach(zombie
in zombies)
168 if(isdefined(zombie._host_migration_link_entity))
171 ent =
spawn(
"script_origin", zombie.origin);
172 ent.angles = zombie.angles;
175 ent LinkTo(zombie._host_migration_link_entity,
"tag_origin", zombie._host_migration_link_entity WorldToLocalCoords(ent.origin), ent.angles + zombie._host_migration_link_entity.angles);
176 zombie._host_migration_link_helper = ent;
177 zombie LinkTo(zombie._host_migration_link_helper);
182 level endon(
"host_migration_begin" );
185 should_pause_spawning = level
flag::get(
"spawn_zombies");
187 if(should_pause_spawning )
195 foreach(player
in level.players)
200 zombies = GetAiTeamArray( level.zombie_team );
201 if(IsDefined(zombies) && zombies.size > 0)
203 foreach(zombie
in zombies)
205 if(isdefined(zombie._host_migration_link_entity))
208 zombie._host_migration_link_helper
delete();
209 zombie._host_migration_link_helper = undefined;
210 zombie._host_migration_link_entity = undefined;
215 if(should_pause_spawning )
220 level.hostMigrationTimer = undefined;
221 level._hm_should_pause_spawning = undefined;
222 sethostmigrationstatus(
false);
225 level notify(
"host_migration_end" );
230 self endon(
"disconnect");
236 self endon(
"disconnect");
238 was_inv =
self EnableInvulnerability();
240 self DisableInvulnerability();
248 new_origin = undefined;
250 if ( isdefined( level.check_valid_spawn_override ) )
252 new_origin = [[ level.check_valid_spawn_override ]]( self );
255 if ( !isdefined( new_origin ) )
261 if( IsDefined( new_origin ) )
263 if(!isDefined(new_origin.angles))
269 angles = new_origin.angles;
271 self DontInterpolate();
272 self SetOrigin( new_origin.origin );
273 self SetPlayerAngles( angles );
285 level endon(
"match_start_timer_beginning" );
286 while ( countTime > 0 && !level.gameEnded )
301 level notify(
"match_start_timer_beginning" );
306 matchStartText.sort = 1001;
307 matchStartText setText( game[
"strings"][
"waiting_for_teams"] );
308 matchStartText.foreground =
false;
309 matchStartText.hidewheninmenu =
true;
312 matchStartText setText( game[
"strings"][type] );
323 countTime = int( duration );
325 if ( countTime >= 2 )
345 n_black_screen = duration - fade_time;
353 level endon(
"game_ended" );
359 if ( level.hostMigrationReturnedPlayerCount < level.players.size * 2 / 3 )
372 level endon(
"hostmigration_enoughplayers" );
378 level endon(
"host_migration_begin" );
379 level endon(
"host_migration_end" );
381 self.hostMigrationControlsFrozen =
false;
383 while ( !isAlive(
self ) )
385 self waittill(
"spawned" );
388 if(isdefined(
self._host_migration_link_entity))
390 ent =
spawn(
"script_origin",
self.origin);
391 ent.angles =
self.angles;
394 ent LinkTo(
self._host_migration_link_entity,
"tag_origin",
self._host_migration_link_entity WorldToLocalCoords(ent.origin), ent.angles +
self._host_migration_link_entity.angles);
395 self._host_migration_link_helper = ent;
399 self.hostMigrationControlsFrozen =
true;
400 self freezeControls(
true );
402 level waittill(
"host_migration_end" );
407 self endon(
"disconnect" );
408 level endon(
"host_migration_begin" );
412 if (
self.hostMigrationControlsFrozen )
414 self freezeControls(
false );
415 self.hostMigrationControlsFrozen =
false;
420 if(isdefined(
self._host_migration_link_entity))
423 self._host_migration_link_helper
delete();
424 self._host_migration_link_helper = undefined;
426 if(isdefined(
self._host_migration_link_entity._post_host_migration_thread))
428 self thread [[
self._host_migration_link_entity._post_host_migration_thread]](
self._host_migration_link_entity);
431 self._host_migration_link_entity = undefined;
437 if ( !isdefined( level.hostMigrationTimer ) )
440 starttime = gettime();
441 level waittill(
"host_migration_end" );
442 return gettime() - starttime;
447 if ( isdefined( level.hostMigrationTimer ) )
450 level endon(
"host_migration_begin" );
458 assert( duration > 0 );
460 starttime = gettime();
462 endtime = gettime() + duration * 1000;
464 while ( gettime() < endtime )
468 if ( isdefined( level.hostMigrationTimer ) )
471 endtime += timePassed;
475 if( gettime() != endtime )
480 return gettime() - starttime;
487 assert( duration > 0 );
489 starttime = gettime();
491 endtime = gettime() + duration * 1000;
493 while ( gettime() < endtime )
497 while ( isdefined( level.hostMigrationTimer ) )
500 setGameEndTime(
int( endTime ) );
504 while ( isdefined( level.hostMigrationTimer ) )
507 setGameEndTime(
int( endTime ) );
511 return gettime() - starttime;
516 found_node = undefined;
518 a_nodes = GetNodesInRadiusSorted( v_origin, max_radius, min_radius, max_height,
"pathnodes" );
520 if( IsDefined(a_nodes) && (a_nodes.size > 0) )
523 a_player_volumes = getentarray(
"player_volume",
"script_noteworthy" );
526 index = a_nodes.size - 1;
527 for( i=index; i>=0; i-- )
529 n_node = a_nodes[ i ];
532 if( ignore_targetted_nodes ==
true )
534 if( IsDefined(n_node.target) )
541 if( !positionWouldTelefrag(n_node.origin) )
546 v_start = ( n_node.origin[0], n_node.origin[1], n_node.origin[2]+30 );
547 v_end = ( n_node.origin[0], n_node.origin[1], n_node.origin[2]-30 );
548 trace = bulletTrace( v_start, v_end,
false, undefined );
549 if(
trace[
"fraction"] < 1)
554 if( IsDefined(level._whoswho_reject_node_override_func) )
556 override_abort = [[ level._whoswho_reject_node_override_func ]]( v_origin, n_node );
559 if( !override_abort )
575 spawnPoint = undefined;
582 if( !IsDefined(spawnPoint) )
588 if( !IsDefined(spawnPoint) )
595 if( !IsDefined(spawnPoint) )
601 if( !Isdefined(spawnPoint) )
605 location = level.scr_zm_map_start_location;
606 if ((location ==
"default" || location ==
"" ) && IsDefined(level.default_start_location))
608 location = level.default_start_location;
611 match_string = level.scr_zm_ui_gametype +
"_" + location;
615 if(IsDefined(structs))
617 foreach(
struct in structs)
619 if(IsDefined(
struct.script_string) )
622 tokens = strtok(
struct.script_string,
" ");
623 foreach(token
in tokens)
625 if(token == match_string )
627 spawnPoints[spawnPoints.size] =
struct;
635 if(!IsDefined(spawnPoints) || spawnPoints.size == 0)
640 assert(IsDefined(spawnPoints),
"Could not find initial spawn points!");
645 if(isdefined(spawnPoint))
647 self SetOrigin( spawnPoint.origin );