1 #using scripts\codescripts\struct;
3 #using scripts\shared\callbacks_shared;
4 #using scripts\shared\system_shared;
5 #using scripts\shared\util_shared;
7 #insert scripts\shared\shared.gsh;
9 #using scripts\zm\gametypes\_spawnlogic;
11 #using scripts\zm\_util;
82 level.recently_deceased= [];
83 foreach( team
in level.teams )
90 level.spawnProtectionTime = GetGametypeSetting(
"spawnprotectiontime" );
91 level.spawnProtectionTimeMS = int (
VAL( level.spawnProtectionTime, 0 ) * 1000 );
98 level.spawnsystem = spawnstruct();
99 spawnsystem = level.spawnsystem;
101 if (!IsDefined( spawnsystem.unifiedSideSwitching ))
102 spawnsystem.unifiedSideSwitching = 1;
104 spawnsystem.objective_facing_bonus = 0.0;
106 spawnsystem.iSPAWN_TEAMMASK = [];
107 spawnsystem.iSPAWN_TEAMMASK_FREE = ( 1 << 0 );
108 spawnsystem.iSPAWN_TEAMMASK[
"free"] = spawnsystem.iSPAWN_TEAMMASK_FREE;
109 all = spawnsystem.iSPAWN_TEAMMASK_FREE;
111 foreach( team
in level.teams )
113 spawnsystem.iSPAWN_TEAMMASK[team] = ( 1 << count );
114 all = all | spawnsystem.iSPAWN_TEAMMASK[team];
117 spawnsystem.iSPAWN_TEAMMASK[
"all"] = all;
129 level endon (
"game_ended" );
131 self setEnterTime( getTime() );
147 self endon(
"disconnect" );
148 level endon (
"game_ended" );
152 self waittill(
"spawned_player" );
170 self endon(
"disconnect" );
171 level endon (
"game_ended" );
173 self waittill (
"death" );
190 self endon(
"disconnect" );
191 level endon (
"game_ended" );
206 self endon(
"disconnect" );
207 level endon (
"game_ended" );
211 self waittill (
"grenade_fire", grenade, weapon );
219 if ( level.teambased )
225 team_mask = level.spawnsystem.iSPAWN_TEAMMASK_FREE;
233 if ( level.teambased )
239 team_mask = level.spawnsystem.iSPAWN_TEAMMASK_FREE;
247 self.influencers[
name] = AddInfluencer(
name, origin, team_mask );
251 return self.influencers[
name];
260 return self.influencersFriendly[
name];
269 return self.influencersEnemy[
name];
274 self.influencers[
name] = AddEntityInfluencer(
name,
self, team_mask );
275 return self.influencers[
name] ;
296 return self.influencersFriendly[
name];
303 return self.influencersEnemy[
name];
308 assert( !isdefined(
self.influencers) );
309 assert( !isdefined(
self.influencers) );
311 if ( !level.teambased )
313 team_mask = level.spawnsystem.iSPAWN_TEAMMASK_FREE;
314 other_team_mask = level.spawnsystem.iSPAWN_TEAMMASK_FREE;
315 weapon_team_mask = level.spawnsystem.iSPAWN_TEAMMASK_FREE;
317 else if ( isdefined(
self.pers[
"team"] ) )
319 team =
self.pers[
"team"];
326 enemy_teams_mask = 0;
329 angles =
self.angles;
330 origin =
self.origin;
334 self.influencers = [];
335 self.friendlyInfluencers = [];
336 self.enemyInfluencers = [];
340 if ( level.teambased )
345 if ( !isdefined(
self.pers[
"team"]) ||
self.pers[
"team"] ==
"spectator" )
353 foreach ( influencer
in self.influencers )
355 RemoveInfluencer( influencer );
358 self.influencers = [];
359 if ( IsDefined(
self.influencersFriendly ) )
361 self.influencersFriendly = [];
363 if ( IsDefined(
self.influencersEnemy ) )
365 self.influencersEnemy = [];
373 self notify(
"watch_remove_influencer" );
374 self endon(
"watch_remove_influencer" );
376 self waittill(
"influencer_removed", index );
378 ArrayRemoveValue(
self.influencers, index );
379 ArrayRemoveValue(
self.influencersFriendly, index );
380 ArrayRemoveValue(
self.influencersEnemy, index );
388 foreach ( influencer
in self.influencers )
390 EnableInfluencer( influencer, enabled );
396 if (!isdefined(
self.influencers))
404 if ( !level.teambased )
406 team_mask = level.spawnsystem.iSPAWN_TEAMMASK_FREE;
407 enemy_teams_mask = level.spawnsystem.iSPAWN_TEAMMASK_FREE;
412 team =
self.pers[
"team"];
418 if ( isDefined(
self.influencersFriendly ) )
420 foreach ( influencer
in self.influencersFriendly )
422 SetInfluencerTeammask( influencer, team_mask );
425 if ( isDefined(
self.influencersEnemy ) )
427 foreach ( influencer
in self.influencersEnemy )
429 SetInfluencerTeammask( influencer, enemy_teams_mask );
436 pixbeginevent(
"create_grenade_influencers");
438 spawn_influencer = weapon.spawnInfluencer;
440 if ( IsDefined( grenade.origin ) && spawn_influencer !=
"" )
442 if ( !level.teambased )
444 weapon_team_mask = level.spawnsystem.iSPAWN_TEAMMASK_FREE;
451 if ( level.friendlyfire )
465 staticInfluencerEnts = GetEntArray(
"mp_uspawn_influencer",
"classname" );
467 for ( i = 0; i < staticInfluencerEnts.size; i++ )
469 staticInfluencerEnt = staticInfluencerEnts[ i ];
479 if (isdefined(influencer_entity.script_noteworty))
486 assertmsg(
"Radiant-placed spawn influencers require the 'script_noteworty' parameter" );
489 return influencer_id;
495 foreach( team
in level.teams )
502 if ( level.teambased )
504 foreach( team
in level.teams )
511 foreach( team
in level.teams )
527 if (!isdefined( predictedSpawn ))
528 predictedSpawn =
false;
530 use_new_spawn_system=
false;;
533 if (isdefined(
self.uspawn_already_spawned))
535 initial_spawn= !
self.uspawn_already_spawned;
538 if ( level.useStartSpawns )
540 use_new_spawn_system=
false;
544 if (level.gametype==
"sd")
546 use_new_spawn_system=
false;
605 [[level.onSpawnPlayer]](predictedSpawn);
611 self.uspawn_already_spawned=
true;
623 if (!isdefined( predictedSpawn ))
624 predictedSpawn =
false;
626 if (level.teambased )
628 point_team = player_entity.pers[
"team"];
629 influencer_team = player_entity.pers[
"team"];
634 influencer_team =
"free";
637 if (level.teambased && isdefined(game[
"switchedsides"]) && game[
"switchedsides"] && level.spawnsystem.unifiedSideSwitching)
643 best_spawn =
get_best_spawnpoint( point_team, influencer_team, player_entity, predictedSpawn );
647 player_entity.last_spawn_origin = best_spawn[
"origin"];
655 if (level.teambased )
657 team = player.pers[
"team"];
664 index = level.test_spawn_point_index;
665 level.test_spawn_point_index++;
667 if ( team ==
"free" )
670 foreach( team
in level.teams )
672 spawn_counts += level.unified_spawn_points[ team ].a.size;
675 if (level.test_spawn_point_index >= spawn_counts)
677 level.test_spawn_point_index= 0;
681 foreach( team
in level.teams )
683 size = level.unified_spawn_points[ team ].a.size;
684 if (level.test_spawn_point_index < count + size)
685 return level.unified_spawn_points[ team ].a[level.test_spawn_point_index - count];
692 if (level.test_spawn_point_index >= level.unified_spawn_points[ team ].a.size)
694 level.test_spawn_point_index= 0;
697 return level.unified_spawn_points[ team ].a[level.test_spawn_point_index];
704 if (level.teambased )
710 vis_team_mask = level.spawnsystem.iSPAWN_TEAMMASK_FREE;
713 spawn_point = GetBestSpawnPoint( point_team, influencer_team, vis_team_mask, player, predictedSpawn );
715 if( !predictedSpawn )
718 bbPrint(
"mpspawnpointsused",
"reason %s x %d y %d z %d",
"point used", spawn_point[
"origin"] );
728 if ( !isdefined( level.unified_spawn_points ) )
730 level.unified_spawn_points = [];
734 if ( isdefined( level.unified_spawn_points[ player_team ] ) )
736 return level.unified_spawn_points[ player_team ];
744 if ( !isdefined(spawn_entities_s.a))
746 spawn_entities_s.a= [];
749 level.unified_spawn_points[player_team] = spawn_entities_s;
751 return spawn_entities_s;
762 return isdefined( level.hardcoreMode )
763 && level.hardcoreMode;
772 if ( !isdefined( team1 ) || !isdefined( team2 ) || (level.gameType==
"dm"))
775 return team1 !=
"neutral"
776 && team2 !=
"neutral"
785 spawn_entity_types = [];
790 spawn_entity_types[ spawn_entity_types.size ] =
"mp_dm_spawn";
793 spawn_entity_types[ spawn_entity_types.size ] =
"mp_tdm_spawn_allies_start";
794 spawn_entity_types[ spawn_entity_types.size ] =
"mp_tdm_spawn_axis_start";
795 spawn_entity_types[ spawn_entity_types.size ] =
"mp_tdm_spawn";
798 spawn_entity_types[ spawn_entity_types.size ] =
"mp_ctf_spawn_allies_start";
799 spawn_entity_types[ spawn_entity_types.size ] =
"mp_ctf_spawn_axis_start";
800 spawn_entity_types[ spawn_entity_types.size ] =
"mp_ctf_spawn_allies";
801 spawn_entity_types[ spawn_entity_types.size ] =
"mp_ctf_spawn_axis";
804 spawn_entity_types[ spawn_entity_types.size ] =
"mp_dom_spawn_allies_start";
805 spawn_entity_types[ spawn_entity_types.size ] =
"mp_dom_spawn_axis_start";
806 spawn_entity_types[ spawn_entity_types.size ] =
"mp_dom_spawn";
812 spawn_entity_types[ spawn_entity_types.size ] =
"mp_sab_spawn_allies_start";
813 spawn_entity_types[ spawn_entity_types.size ] =
"mp_sab_spawn_axis_start";
814 spawn_entity_types[ spawn_entity_types.size ] =
"mp_sab_spawn_allies";
815 spawn_entity_types[ spawn_entity_types.size ] =
"mp_sab_spawn_axis";
818 spawn_entity_types[ spawn_entity_types.size ] =
"mp_sd_spawn_attacker";
819 spawn_entity_types[ spawn_entity_types.size ] =
"mp_sd_spawn_defender";
822 spawn_entity_types[ spawn_entity_types.size ] =
"mp_twar_spawn_axis_start";
823 spawn_entity_types[ spawn_entity_types.size ] =
"mp_twar_spawn_allies_start";
824 spawn_entity_types[ spawn_entity_types.size ] =
"mp_twar_spawn";
826 for ( i = 0; i < spawn_entity_types.size; i++ )
839 for ( i = 0; i < spawnpoints.size; i++ )
841 spawnpoints[i]
delete();
847 if ( !isdefined( level.spawn_point_class_names ) )
852 for ( i = 0; i < level.spawn_point_class_names.size; i++ )
854 if ( level.spawn_point_class_names[i] ==
name )
867 foreach( team
in level.teams )
873 level.unified_spawn_points = undefined;
879 self endon(
"death" );
880 self endon(
"disconnect" );
883 if ( !isdefined( level.spawnProtectionTime ) || level.spawnProtectionTime == 0 )
893 if ( specialtyName ==
"specialty_nottargetedbyairsupport" )
895 self.specialty_nottargetedbyairsupport =
true;
896 wait level.spawnProtectionTime;
897 self.specialty_nottargetedbyairsupport = undefined;
899 else if ( !
self HasPerk( specialtyName ) )
901 self setPerk( specialtyName );
902 wait level.spawnProtectionTime;
903 self unsetPerk( specialtyName );