#include common_scripts\utility; #include maps\mp\_utility; main() { thread main_thread(); } main_thread() { flag_init("teleport_setup_complete"); level.teleport_minimaps = []; level.teleport_allowed = true; //may be turned off by game modes level.teleport_to_offset = true; level.teleport_to_nodes = true; level.teleport_include_killsteaks = true; level.teleport_gameMode_func = undefined; level.teleport_pre_funcs = []; level.teleport_post_funcs = []; level.teleport_a10_inBoundList = []; level.teleport_a10_outBoundList = []; level.teleport_nodes_in_zone = []; level.teleport_pathnode_zones = []; //Hijack onStartGameType to do teleport set up for gamemodes level.teleport_onStartGameType = level.onStartGameType; level.onStartGameType = ::teleport_onStartGameType; level.teleportGetActiveNodesFunc = ::teleport_get_active_nodes; level.teleportGetActivePathnodeZonesFunc = ::teleport_get_active_pathnode_zones; } teleport_init() { level.teleport_spawn_info = []; zones = getStructarray("teleport_world_origin", "targetname"); if(!zones.size) return; level.teleport_zones = []; foreach(zone in zones) { if(!isDefined(zone.script_noteworthy)) zone.script_noteworthy = "zone_" + level.teleport_zones.size; zone.name = zone.script_noteworthy; teleport_parse_zone_targets(zone); level.teleport_nodes_in_zone[zone.name] = []; level.teleport_pathnode_zones[zone.name] = []; level.teleport_zones[zone.script_noteworthy] = zone; } all_nodes = GetAllNodes(); foreach(node in all_nodes) { zone = teleport_closest_zone(node.origin); level.teleport_nodes_in_zone[zone.name][level.teleport_nodes_in_zone[zone.name].size] = node; } for ( z = 0; z < GetZoneCount(); z++ ) { zone = teleport_closest_zone(GetZoneOrigin(z)); level.teleport_pathnode_zones[zone.name][level.teleport_pathnode_zones[zone.name].size] = z; } //Default to start zone if it exists if(!IsDefined(level.teleport_zone_current)) { if(IsDefined(level.teleport_zones["start"])) { teleport_set_current_zone("start"); } else { foreach(key, value in level.teleport_zones) { teleport_set_current_zone(key); break; } } } level.dynamicSpawns = ::teleport_filter_spawn_point; /# level thread teleport_debug_set_zone(); #/ } teleport_onStartGameType() { teleport_init(); pre_onStartGameType_func = undefined; post_onStartGameType_func = undefined; switch(level.gametype) { case "dom": post_onStartGameType_func = ::teleport_onStartGameDOM; break; case "siege": post_onStartGameType_func = ::teleport_onStartGameSIEGE; break; case "conf": post_onStartGameType_func = ::teleport_onStartGameCONF; break; case "sd": pre_onStartGameType_func = ::teleport_pre_onStartGameSD; break; case "sr": pre_onStartGameType_func = ::teleport_pre_onStartGameSR; break; case "blitz": pre_onStartGameType_func = ::teleport_pre_onStartGameBlitz; break; case "sotf": case "sotf_ffa": post_onStartGameType_func = ::teleport_onStartGameSOTF; break; case "grind": post_onStartGameType_func = ::teleport_onStartGameGRIND; break; case "horde": pre_onStartGameType_func = ::teleport_onStartGameHORDE; break; //No change needed case "war": case "dm": case "infect": break; default: break; } if(IsDefined(pre_onStartGameType_func)) level [[pre_onStartGameType_func]](); level [[level.teleport_onStartGameType]](); if(IsDefined(post_onStartGameType_func)) level [[post_onStartGameType_func]](); flag_set("teleport_setup_complete"); } teleport_pre_onStartGameBlitz() { foreach(zone in level.teleport_zones) { zone.blitz_all_triggers = []; } axisPortalTriggers = getEntArray( "axis_portal", "targetname" ); foreach(portal_trig in axisPortalTriggers) { closest_zone = teleport_closest_zone(portal_trig.origin); if(IsDefined(closest_zone)) { closest_zone.blitz_axis_trigger_origin = portal_trig.origin; closest_zone.blitz_all_triggers[closest_zone.blitz_all_triggers.size] = portal_trig; teleport_change_targetname(portal_trig); } } alliesPortalTriggers = getEntArray( "allies_portal", "targetname" ); foreach(portal_trig in alliesPortalTriggers) { closest_zone = teleport_closest_zone(portal_trig.origin); if(IsDefined(closest_zone)) { closest_zone.blitz_allies_trigger_origin = portal_trig.origin; closest_zone.blitz_all_triggers[closest_zone.blitz_all_triggers.size] = portal_trig; teleport_change_targetname(portal_trig); } } current_zone = level.teleport_zones[level.teleport_zone_current]; teleport_restore_targetname(current_zone.blitz_all_triggers); level.teleport_gameMode_func = ::teleport_onTeleportBlitz; } teleport_onTeleportBlitz(next_zone_name) { next_zone = level.teleport_zones[next_zone_name]; current_zone = level.teleport_zones[level.teleport_zone_current]; axis_team = "axis"; allies_team = "allies"; if(game["switchedsides"]) { axis_team = "allies"; allies_team = "axis"; } axis_offset = next_zone.blitz_axis_trigger_origin - current_zone.blitz_axis_trigger_origin; level.portalList[axis_team].origin += axis_offset; level.portalList[axis_team].trigger.origin += axis_offset; Objective_Position(level.portalList[axis_team].ownerTeamID, next_zone.blitz_axis_trigger_origin + (0,0,72)); Objective_Position(level.portalList[axis_team].enemyTeamID, next_zone.blitz_axis_trigger_origin + (0,0,72)); allies_offset = next_zone.blitz_allies_trigger_origin - current_zone.blitz_allies_trigger_origin; level.portalList[allies_team].origin += allies_offset; level.portalList[allies_team].trigger.origin += allies_offset; Objective_Position(level.portalList[allies_team].ownerTeamID, next_zone.blitz_allies_trigger_origin + (0,0,72)); Objective_Position(level.portalList[allies_team].enemyTeamID, next_zone.blitz_allies_trigger_origin + (0,0,72)); maps\mp\gametypes\blitz::assignTeamSpawns(); foreach(player in level.players) { player maps\mp\gametypes\blitz::showTeamPortalFX(); } } teleport_pre_onStartGameSR() { teleport_pre_onStartGameSD_and_SR(); } teleport_pre_onStartGameSD() { teleport_pre_onStartGameSD_and_SR(); } teleport_pre_onStartGameSD_and_SR() { foreach(zone in level.teleport_zones) { zone.sd_triggers = []; zone.sd_bombs = []; zone.sd_bombZones = []; } triggers = GetEntArray("sd_bomb_pickup_trig", "targetname"); foreach(trigger in triggers) { closest_zone = teleport_closest_zone(trigger.origin); if(IsDefined(closest_zone)) { closest_zone.sd_triggers[closest_zone.sd_triggers.size] = trigger; teleport_change_targetname(trigger, closest_zone.name); } } bombs = GetEntArray( "sd_bomb", "targetname" ); foreach(bomb in bombs) { closest_zone = teleport_closest_zone(bomb.origin); if(IsDefined(closest_zone)) { closest_zone.sd_bombs[closest_zone.sd_bombs.size] = bomb; teleport_change_targetname(bomb, closest_zone.name); } } bombZones = GetEntArray( "bombzone", "targetname" ); foreach(bombZone in bombZones) { closest_zone = teleport_closest_zone(bombZone.origin); if(IsDefined(closest_zone)) { closest_zone.sd_bombZones[closest_zone.sd_bombZones.size] = bombZone; teleport_change_targetname(bombZone, closest_zone.name); } } valid_zones = []; if ( isAnyMLGMatch() ) { valid_zones[0] = "start"; } else { foreach(zone in level.teleport_zones) { if( zone.sd_triggers.size && zone.sd_triggers.size && zone.sd_triggers.size ) { valid_zones[valid_zones.size] = zone.name; } } } teleport_gamemode_disable_teleport(valid_zones); current_zone = level.teleport_zones[level.teleport_zone_current]; teleport_restore_targetname(current_zone.sd_triggers); teleport_restore_targetname(current_zone.sd_bombs); teleport_restore_targetname(current_zone.sd_bombZones); } teleport_onStartGameSOTF() { foreach(zone in level.teleport_zones) { zone.sotf_chest_spawnpoints = []; } sotf_chest_spawnpoints = getstructarray( "sotf_chest_spawnpoint", "targetname" ); foreach(point in sotf_chest_spawnpoints) { closest_zone = teleport_closest_zone(point.origin); if(IsDefined(closest_zone)) { closest_zone.sotf_chest_spawnpoints[closest_zone.sotf_chest_spawnpoints.size] = point; } } valid_zones = []; foreach(zone in level.teleport_zones) { if( zone.sotf_chest_spawnpoints.size ) { valid_zones[valid_zones.size] = zone.name; } } level.teleport_gameMode_func = ::teleport_onTeleportSOTF; teleport_gamemode_disable_teleport(valid_zones); } teleport_onTeleportSOTF(next_zone_name) { next_zone = level.teleport_zones[next_zone_name]; level.struct_class_names[ "targetname" ][ "sotf_chest_spawnpoint" ] = next_zone.sotf_chest_spawnpoints; } teleport_onStartGameGRIND() { //Init flag arrays foreach(zone in level.teleport_zones) { zone.grindZones = []; } foreach(grindZone in level.zoneList) { closest_zone = teleport_closest_zone(grindZone.origin); if(IsDefined(closest_zone)) { grindZone.teleport_zone = closest_zone.name; closest_zone.grindZones[closest_zone.grindZones.size] = grindZone; } } level.teleport_gameMode_func = ::teleport_onTeleportGRIND; teleport_onTeleportGRIND(level.teleport_zone_current); } teleport_onTeleportGRIND(next_zone_name) { next_zone = level.teleport_zones[next_zone_name]; //Turn on Icons foreach(grindZone in next_zone.grindZones) { if(next_zone_name != level.teleport_zone_current) { Objective_State(grindZone.objId_axis, "active"); Objective_State(grindZone.objId_allies, "active"); if(IsDefined(grindZone.grind_headIcon_allies) && IsDefined(grindZone.grind_headIcon_allies.old_alpha)) { grindZone.grind_headIcon_allies.alpha = grindZone.grind_headIcon_allies.old_alpha; } if(IsDefined(grindZone.grind_headIcon_axis) && IsDefined(grindZone.grind_headIcon_axis.old_alpha) ) { grindZone.grind_headIcon_axis.alpha = grindZone.grind_headIcon_axis.old_alpha; } } } //Turn of Icons foreach(zone_name, zone in level.teleport_zones) { foreach(grindZone in zone.grindZones) { if(zone_name != next_zone_name) { thread teleport_HideGrindZone(grindZone); } } } //Clear dog tags foreach(tag in level.dogtags) { tag.visual hide(); tag.trigger hide(); tag maps\mp\gametypes\_gameobjects::allowUse( "none" ); tag notify( "reset" ); tag.lastUsedTime = 0; } } teleport_HideGrindZone(grindZone) { Objective_State(grindZone.objId_axis, "invisible"); Objective_State(grindZone.objId_allies, "invisible"); while(!IsDefined(grindZone.grind_headIcon_allies) || !IsDefined(grindZone.grind_headIcon_axis)) waitframe(); grindZone.grind_headIcon_allies.old_alpha = grindZone.grind_headIcon_allies.alpha; grindZone.grind_headIcon_allies.alpha = 0; grindZone.grind_headIcon_axis.old_alpha = grindZone.grind_headIcon_axis.alpha; grindZone.grind_headIcon_axis.alpha = 0; } teleport_onStartGameHORDE() { foreach(zone in level.teleport_zones) { zone.horde_drops = []; } hordeDropLocations = getstructarray( "horde_drop", "targetname" ); foreach(loc in hordeDropLocations) { closest_zone = teleport_closest_zone(loc.origin); if(IsDefined(closest_zone)) { closest_zone.horde_drops[closest_zone.horde_drops.size] = loc; } } valid_zones = []; foreach(zone in level.teleport_zones) { if( zone.horde_drops.size ) { valid_zones[valid_zones.size] = zone.name; } } teleport_gamemode_disable_teleport(valid_zones); current_zone = level.teleport_zones[level.teleport_zone_current]; level.struct_class_names[ "targetname" ][ "horde_drop" ] = current_zone.horde_drops; } teleport_change_targetname(ents, append) { if(!IsArray(ents)) ents = [ents]; if(!IsDefined(append)) append = "hide_from_getEnt"; foreach(ent in ents) { ent.saved_targetname = ent.targetname; ent.targetname = ent.targetname + "_" + append; } } teleport_gamemode_disable_teleport( valid_zones ) { if(!IsDefined(valid_zones)) valid_zones = GetArrayKeys(level.teleport_zones); game_zone = game["teleport_zone_dom"]; if(!IsDefined(game_zone)) { game_zone = random(valid_zones); game["teleport_zone_dom"] = game_zone; } teleport_to_zone(game_zone, false); level.teleport_allowed = false; } teleport_restore_targetname(ents) { if(!IsArray(ents)) ents = [ents]; foreach(ent in ents) { if(IsDefined(ent.saved_targetname)) ent.targetname = ent.saved_targetname; } } teleport_onStartGameDOM() { //Init flag arrays foreach(zone in level.teleport_zones) { zone.flags = []; zone.domFlags = []; } level.all_dom_flags = level.flags; foreach(flag in level.flags) { closest_zone = teleport_closest_zone(flag.origin); if(IsDefined(closest_zone)) { flag.teleport_zone = closest_zone.name; closest_zone.flags[closest_zone.flags.size] = flag; closest_zone.domFlags[closest_zone.domFlags.size] = flag.useObj; } } level.dom_flag_data = []; foreach(zone in level.teleport_zones) { foreach(domFlag in zone.flags) { data = spawnStruct(); data.trigger_origin = domFlag.origin; data.visual_origin = domFlag.useobj.visuals[0].origin; data.baseeffectpos = domFlag.useobj.baseeffectpos; data.baseeffectforward = domFlag.useobj.baseeffectforward; data.baseeffectright = domFlag.useobj.baseeffectright; data.obj_origin = domFlag.useObj.curOrigin; data.obj3d_origins = []; foreach(team in level.teamNameList) { opName = "objpoint_" + team + "_" + domFlag.useObj.entNum; objPoint = maps\mp\gametypes\_objpoints::getObjPointByName( opName ); if(IsDefined(objPoint)) { data.obj3d_origins[team] = (objPoint.x, objPoint.y, objPoint.z); } } level.dom_flag_data[zone.name][domFlag.useObj.label] = data; } } level.flags = level.teleport_zones[ level.teleport_zone_current].flags; level.domFlags = level.teleport_zones[ level.teleport_zone_current].domFlags; foreach(zone in level.teleport_zones) { foreach(flag in zone.flags) { if(zone.name == level.teleport_zone_current) continue; flag.useobj.visuals[0] Delete(); flag.useObj maps\mp\gametypes\_gameobjects::deleteUseObject(); } } level.teleport_gameMode_func = ::teleport_onTeleportDOM; teleport_onTeleportDOM(level.teleport_zone_current); level.teleport_dom_finished_initializing = true; level thread teleport_dom_post_bot_cleanup(); } teleport_dom_post_bot_cleanup() { while(!IsDefined(level.bot_gametype_precaching_done)) wait 0.05; foreach(zone in level.teleport_zones) { foreach(flag in zone.flags) { data = level.dom_flag_data[zone.name][flag.useObj.label]; data.nodes = flag.nodes; if(zone.name != level.teleport_zone_current) { flag Delete(); } } } } teleport_onStartGameSIEGE() { //Init flag arrays foreach(zone in level.teleport_zones) { zone.flags = []; zone.domFlags = []; } level.all_dom_flags = level.flags; foreach(flag in level.flags) { closest_zone = teleport_closest_zone(flag.origin); if(IsDefined(closest_zone)) { flag.teleport_zone = closest_zone.name; closest_zone.flags[closest_zone.flags.size] = flag; closest_zone.domFlags[closest_zone.domFlags.size] = flag.useObj; } } level.dom_flag_data = []; foreach(zone in level.teleport_zones) { foreach(domFlag in zone.flags) { data = spawnStruct(); data.trigger_origin = domFlag.origin; data.visual_origin = domFlag.useobj.visuals[0].origin; data.baseeffectpos = domFlag.useobj.baseeffectpos; data.baseeffectforward = domFlag.useobj.baseeffectforward; data.baseeffectright = domFlag.useobj.baseeffectright; data.obj_origin = domFlag.useObj.curOrigin; data.obj3d_origins = []; foreach(team in level.teamNameList) { opName = "objpoint_" + team + "_" + domFlag.useObj.entNum; objPoint = maps\mp\gametypes\_objpoints::getObjPointByName( opName ); if(IsDefined(objPoint)) { data.obj3d_origins[team] = (objPoint.x, objPoint.y, objPoint.z); } } level.dom_flag_data[zone.name][domFlag.useObj.label] = data; } } startingZone = "start"; AssertEx ( IsDefined ( level.teleport_zones[ startingZone ] ), "Start teleport zone does not exist" ); // Making sure we always spawn in the destroyed zone level.flags = level.teleport_zones[ startingZone ].flags; level.domFlags = level.teleport_zones[ startingZone ].domFlags; foreach ( zone in level.teleport_zones ) { foreach ( flag in zone.flags ) { if ( zone.name == startingZone ) continue; flag.useobj.visuals[ 0 ] Delete(); flag.useObj maps\mp\gametypes\_gameobjects::deleteUseObject(); } } game[ "teleport_zone_dom" ] = startingZone; teleport_gamemode_disable_teleport(); teleport_onTeleportSIEGE( startingZone ); } teleport_onStartGameCONF() { level.teleport_gameMode_func = ::teleport_onTeleportCONF; } teleport_onTeleportDOM(next_zone_name) { //Set up and copy values to the zone we are teleporting to current_zone = level.teleport_zones[ level.teleport_zone_current]; next_zone = level.teleport_zones[next_zone_name]; if(next_zone_name == level.teleport_zone_current) return; foreach(domFlag in level.flags) { data = level.dom_flag_data[next_zone_name][domFlag.useObj.label]; domFlag.origin = data.trigger_origin; domFlag.useobj.visuals[0].origin = data.visual_origin; domFlag.useobj.baseeffectpos = data.baseeffectpos; domFlag.useobj.baseeffectforward = data.baseeffectforward; domFlag.useObj maps\mp\gametypes\dom::resetFlagBaseEffect(); domFlag.teleport_zone = next_zone_name; domflag.nodes = data.nodes; foreach(teamname, objId in domFlag.useObj.teamObjIds) { Objective_Position(objId, data.obj_origin); } foreach(team in level.teamnamelist) { opName = "objpoint_" + team + "_" + domFlag.useObj.entNum; objPoint = maps\mp\gametypes\_objpoints::getObjPointByName( opName ); objPoint.x = data.obj3d_origins[team][0]; objPoint.y = data.obj3d_origins[team][1]; objPoint.z = data.obj3d_origins[team][2]; } } } teleport_onTeleportSIEGE( zone_name ) { //Set up and copy values to the zone we are teleporting to foreach(domFlag in level.flags) { data = level.dom_flag_data[zone_name][domFlag.useObj.label]; domFlag.origin = data.trigger_origin; domFlag.useobj.visuals[0].origin = data.visual_origin; domFlag.useobj.baseeffectpos = data.baseeffectpos; domFlag.useobj.baseeffectforward = data.baseeffectforward; domFlag.useObj maps\mp\gametypes\dom::resetFlagBaseEffect(); domFlag.teleport_zone = zone_name; domflag.nodes = data.nodes; foreach(teamname, objId in domFlag.useObj.teamObjIds) { Objective_Position(objId, data.obj_origin); } foreach(team in level.teamnamelist) { opName = "objpoint_" + team + "_" + domFlag.useObj.entNum; objPoint = maps\mp\gametypes\_objpoints::getObjPointByName( opName ); objPoint.x = data.obj3d_origins[team][0]; objPoint.y = data.obj3d_origins[team][1]; objPoint.z = data.obj3d_origins[team][2]; } } } teleport_get_matching_dom_flag(flag, from_zone) { foreach( dom_flag in level.teleport_zones[from_zone].flags) { if(flag.useobj.label == dom_flag.useobj.label) return dom_flag; } return undefined; } teleport_onTeleportCONF(next_zone_name) { teleport_delta = get_teleport_delta( next_zone_name ); foreach(dogTag in level.dogtags) { goal_origin = dogTag.curOrigin + teleport_delta; goal_node = teleport_get_safe_node_near(goal_origin); if(isDefined(goal_node)) { goal_node.last_teleport_time = GetTime(); delta = goal_node.origin - dogTag.curOrigin; dogTag.curOrigin += delta; dogTag.trigger.origin += delta; dogTag.visuals[0].origin += delta; dogTag.visuals[1].origin += delta; } else { dogTag maps\mp\gametypes\conf::resetTags(); } } } teleport_get_safe_node_near(near_to) { current_time = GetTime(); nodes = GetNodesInRadiusSorted( near_to, 300, 0, 200, "Path" ); for(i=0; i