1
0
mirror of https://github.com/JezuzLizard/BO2-Reimagined.git synced 2025-06-07 21:59:49 -05:00
BO2-Reimagined/scripts/zm/replaced/zm_transit_bus.gsc
2024-01-04 01:45:31 -08:00

764 lines
20 KiB
Plaintext

#include maps\mp\zm_transit_bus;
#include common_scripts\utility;
#include maps\mp\_utility;
#include maps\mp\zombies\_zm_utility;
#include maps\mp\zombies\_zm_weapons;
#include maps\mp\zm_transit_utility;
#include maps\mp\zm_transit_automaton;
#include maps\mp\zm_transit_cling;
#include maps\mp\zm_transit_openings;
#include maps\mp\zombies\_zm_zonemgr;
#include maps\mp\zm_transit_ambush;
#include maps\mp\zombies\_zm;
#include maps\mp\zombies\_zm_spawner;
#include maps\mp\zombies\_zm_ai_basic;
#include maps\mp\zombies\_zm_equipment;
#include maps\mp\zombies\_zm_stats;
#include maps\mp\zombies\_zm_laststand;
#include maps\mp\zombies\_zm_powerups;
#include maps\mp\zombies\_zm_buildables;
#include maps\mp\zombies\_zm_weap_emp_bomb;
#include maps\mp\zm_transit_lava;
#include maps\mp\zombies\_zm_audio;
#using_animtree("zombie_bus");
bussetup()
{
flag_init("ladder_attached");
flag_init("catcher_attached");
flag_init("hatch_attached");
self.immediatespeed = 0;
self.currentspeed = 0;
self.targetspeed = 0;
self.ismoving = 0;
self.isstopping = 0;
self.gas = 100;
self.accel = 20;
self.decel = 60;
self.radius = 88;
self.height = 240;
self.frontdist = 340;
self.backdist = 55;
self.floor = 36;
self.frontlocal = (self.frontdist - self.radius / 2.0, 0, 0);
self.backlocal = (self.backdist * -1 + self.radius / 2.0, 0, 0);
self.drivepath = 0;
self.zone = "zone_pri";
self.roadzone = self.zone;
self.zombiesinside = 0;
self.zombiesatwindow = 0;
self.zombiesonroof = 0;
self.numplayers = 0;
self.numplayerson = 0;
self.numplayersonroof = 0;
self.numplayersinsidebus = 0;
self.numplayersnear = 0;
self.numaliveplayersridingbus = 0;
self.numflattires = 0;
self.doorsclosed = 1;
self.doorsdisabledfortime = 0;
self.stalled = 0;
self.issafe = 1;
self.waittimeatdestination = 0;
self.gracetimeatdestination = 10;
self.path_blocking = 0;
self.chase_pos = self.origin;
self.chase_pos_time = 0;
self.istouchingignorewindowsvolume = 0;
level.zm_mantle_over_40_move_speed_override = ::zm_mantle_over_40_move_speed_override;
self setmovingplatformenabled(1);
self.supportsanimscripted = 1;
self setvehmaxspeed(50);
self useanimtree(#animtree);
level.callbackactordamage = ::transit_actor_damage_override_wrapper;
self maps\mp\zm_transit_automaton::main();
maps\mp\zm_transit_cling::initializecling();
self maps\mp\zm_transit_openings::main();
self bus_upgrades();
self thread busplowsetup();
self buslightssetup();
self busdoorssetup();
self buspathblockersetup();
self bussetupbounds();
self bus_roof_watch();
self bus_set_nodes();
self bus_set_exit_triggers();
self thread bus_audio_setup();
level thread init_bus_door_anims();
level thread init_bus_props_anims();
self thread bususeanimtree();
self thread bususedoor(0);
self thread busidledoor();
self thread play_lava_audio();
self thread busthink();
self thread busopeningscene();
busschedule();
self thread busschedulethink();
self thread bus_bridge_speedcontrol();
self.door_nodes_linked = 1;
self thread bussetdoornodes(0);
}
busscheduleadd(stopname, isambush, maxwaittimebeforeleaving, busspeedleaving, gasusage)
{
assert(isdefined(stopname));
assert(isdefined(isambush));
assert(isdefined(maxwaittimebeforeleaving));
assert(isdefined(busspeedleaving));
destinationindex = self.destinations.size;
self.destinations[destinationindex] = spawnstruct();
self.destinations[destinationindex].name = stopname;
self.destinations[destinationindex].isambush = isambush;
self.destinations[destinationindex].maxwaittimebeforeleaving = maxwaittimebeforeleaving;
self.destinations[destinationindex].busspeedleaving = busspeedleaving * 2;
self.destinations[destinationindex].gasusage = gasusage;
}
busschedulethink()
{
self endon("death");
while (true)
{
self waittill("noteworthy", noteworthy, noteworthynode);
zoneisempty = 1;
shouldremovegas = 0;
destinationindex = level.busschedule busschedulegetdestinationindex(noteworthy);
if (!isdefined(destinationindex) || !isdefined(noteworthynode))
{
continue;
}
self.destinationindex = destinationindex;
self.waittimeatdestination = level.busschedule busschedulegetmaxwaittimebeforeleaving(self.destinationindex);
self.currentnode = noteworthynode;
targetspeed = level.busschedule busschedulegetbusspeedleaving(self.destinationindex);
foreach (zone in level.zones)
{
if (!isdefined(zone.volumes) || zone.volumes.size == 0)
continue;
zonename = zone.volumes[0].targetname;
if (self maps\mp\zombies\_zm_zonemgr::entity_in_zone(zonename))
{
self.zone = zonename;
zonestocheck = [];
zonestocheck[zonestocheck.size] = zonename;
switch (zonename)
{
case "zone_station_ext":
zonestocheck[zonestocheck.size] = "zone_trans_1";
zonestocheck[zonestocheck.size] = "zone_pri";
zonestocheck[zonestocheck.size] = "zone_pri2";
zonestocheck[zonestocheck.size] = "zone_amb_bridge";
zonestocheck[zonestocheck.size] = "zone_trans_2b";
break;
case "zone_gas":
zonestocheck[zonestocheck.size] = "zone_trans_2";
zonestocheck[zonestocheck.size] = "zone_amb_tunnel";
zonestocheck[zonestocheck.size] = "zone_gar";
zonestocheck[zonestocheck.size] = "zone_trans_diner";
zonestocheck[zonestocheck.size] = "zone_trans_diner2";
zonestocheck[zonestocheck.size] = "zone_diner_roof";
zonestocheck[zonestocheck.size] = "zone_din";
zonestocheck[zonestocheck.size] = "zone_roadside_west";
zonestocheck[zonestocheck.size] = "zone_roadside_east";
zonestocheck[zonestocheck.size] = "zone_trans_3";
break;
case "zone_far":
zonestocheck[zonestocheck.size] = "zone_amb_forest";
zonestocheck[zonestocheck.size] = "zone_far_ext";
zonestocheck[zonestocheck.size] = "zone_farm_house";
zonestocheck[zonestocheck.size] = "zone_brn";
zonestocheck[zonestocheck.size] = "zone_trans_5";
zonestocheck[zonestocheck.size] = "zone_trans_6";
break;
case "zone_pow":
zonestocheck[zonestocheck.size] = "zone_trans_6";
zonestocheck[zonestocheck.size] = "zone_amb_cornfield";
zonestocheck[zonestocheck.size] = "zone_trans_7";
zonestocheck[zonestocheck.size] = "zone_pow_ext1";
zonestocheck[zonestocheck.size] = "zone_prr";
zonestocheck[zonestocheck.size] = "zone_pcr";
zonestocheck[zonestocheck.size] = "zone_pow_warehouse";
break;
case "zone_town_north":
zonestocheck[zonestocheck.size] = "zone_trans_8";
zonestocheck[zonestocheck.size] = "zone_amb_power2town";
zonestocheck[zonestocheck.size] = "zone_tbu";
zonestocheck[zonestocheck.size] = "zone_town_church";
zonestocheck[zonestocheck.size] = "zone_bar";
zonestocheck[zonestocheck.size] = "zone_town_east";
zonestocheck[zonestocheck.size] = "zone_tow";
zonestocheck[zonestocheck.size] = "zone_ban";
zonestocheck[zonestocheck.size] = "zone_ban_vault";
zonestocheck[zonestocheck.size] = "zone_town_west";
zonestocheck[zonestocheck.size] = "zone_town_west2";
zonestocheck[zonestocheck.size] = "zone_town_barber";
zonestocheck[zonestocheck.size] = "zone_town_south";
zonestocheck[zonestocheck.size] = "zone_trans_9";
break;
}
foreach (zone in zonestocheck)
{
if (!(isdefined(zoneisempty) && zoneisempty))
continue;
if (maps\mp\zombies\_zm_zonemgr::player_in_zone(zone))
{
zoneisempty = 0;
}
}
if (isdefined(zoneisempty) && zoneisempty)
{
continue;
}
}
}
if (isdefined(shouldremovegas) && shouldremovegas)
self busgasremove(level.busschedule busschedulegetbusgasusage(self.destinationindex));
if (isdefined(zoneisempty) && zoneisempty)
{
self busstartmoving(targetspeed);
continue;
}
if (isdefined(self.skip_next_destination) && self.skip_next_destination)
{
self notify("skipping_destination");
self busstartmoving(targetspeed);
continue;
}
if (level.busschedule busschedulegetisambushstop(self.destinationindex))
{
if (maps\mp\zm_transit_ambush::shouldstartambushround() && self.numplayersinsidebus != 0)
{
self busstopmoving(1);
level.nml_zone_name = "zone_amb_" + noteworthy;
thread maps\mp\zm_transit_ambush::ambushstartround();
thread automatonspeak("inform", "out_of_gas");
flag_waitopen("ambush_round");
shouldremovegas = 1;
thread automatonspeak("inform", "refueled_gas");
}
else
{
continue;
}
}
else
{
self notify("reached_destination");
shouldremovegas = 1;
thread do_automaton_arrival_vox(noteworthy);
if (noteworthy == "diner" || noteworthy == "town" || noteworthy == "power")
{
self busstopmoving(1);
if (noteworthy == "diner")
self bussetdineropenings(0);
else if (noteworthy == "power")
self bussetpoweropenings(0);
else if (noteworthy == "town")
self bussettownopenings(0);
}
else
self busstopmoving();
self thread busscheduledepartearly();
}
waittimeatdestination = self.waittimeatdestination;
self thread busshowleavinghud(waittimeatdestination);
self waittill_any_timeout(waittimeatdestination, "depart_early");
self notify("ready_to_depart");
self thread buslightsflash();
self thread buslightsignal("turn_signal_left");
thread automatonspeak("inform", "leaving_warning");
self thread play_bus_audio("grace");
wait(self.gracetimeatdestination);
thread automatonspeak("inform", "leaving");
self.accel = 2;
self busstartmoving(targetspeed);
self notify("departing");
self setclientfield("bus_flashing_lights", 0);
}
}
busshowleavinghud(time)
{
self endon("depart_early");
self thread busshowleavinghud_destroy_on_depart_early();
while (time > 0)
{
players = get_players();
foreach (player in players)
{
if (!isDefined(player.busleavehud))
{
hud = newclienthudelem(player);
hud.alignx = "center";
hud.aligny = "middle";
hud.horzalign = "center";
hud.vertalign = "bottom";
hud.y = -75;
hud.foreground = 1;
hud.hidewheninmenu = 1;
hud.font = "default";
hud.fontscale = 1;
hud.alpha = 1;
hud.color = (1, 1, 1);
hud.label = &"ZM_TRANSIT_BUS_DEPART_TIME";
hud setTimer(time);
player.busleavehud = hud;
}
if (!is_true(player.isonbus))
{
player.busleavehud.alpha = 0;
}
else
{
player.busleavehud.alpha = 1;
}
}
time -= 0.05;
wait 0.05;
}
players = get_players();
foreach (player in players)
{
if (isDefined(player.busleavehud))
{
player.busleavehud destroy();
player.busleavehud = undefined;
}
}
}
busshowleavinghud_destroy_on_depart_early()
{
self waittill("depart_early");
players = get_players();
foreach (player in players)
{
if (isDefined(player.busleavehud))
{
player.busleavehud destroy();
player.busleavehud = undefined;
}
}
}
bus_bridge_speedcontrol()
{
while (true)
{
self waittill("reached_node", nextpoint);
if (isdefined(nextpoint.script_string))
{
if (nextpoint.script_string == "map_out_tunnel" || nextpoint.script_string == "map_out_1forest" || nextpoint.script_string == "map_out_corn" || nextpoint.script_string == "map_out_2forest" || nextpoint.script_string == "map_out_bridge")
{
self setspeed(self.targetspeed / 2, 10, 10);
}
}
if (isdefined(nextpoint.script_string))
{
if (nextpoint.script_string == "arrival_slowdown")
self thread start_stopping_bus();
if (nextpoint.script_string == "arrival_slowdown_fast")
self thread start_stopping_bus(1);
}
if (isdefined(nextpoint.script_noteworthy))
{
if (nextpoint.script_noteworthy == "slow_down")
{
self.targetspeed = 20;
if (isdefined(nextpoint.script_float))
{
self.targetspeed = nextpoint.script_float * 2;
}
self setspeed(self.targetspeed, 160, 10);
}
else if (nextpoint.script_noteworthy == "turn_signal_left" || nextpoint.script_noteworthy == "turn_signal_right")
self thread buslightsignal(nextpoint.script_noteworthy);
else if (nextpoint.script_noteworthy == "resume_speed")
{
self.targetspeed = 24;
if (isdefined(nextpoint.script_float))
{
self.targetspeed = nextpoint.script_float * 2;
}
self setspeed(self.targetspeed, 120, 120);
}
else if (nextpoint.script_noteworthy == "emp_stop_point")
self notify("reached_emp_stop_point");
else if (nextpoint.script_noteworthy == "start_lava")
playfxontag(level._effect["bus_lava_driving"], self, "tag_origin");
else if (nextpoint.script_noteworthy == "stop_lava")
{
}
else if (nextpoint.script_noteworthy == "bus_scrape")
self playsound("zmb_bus_car_scrape");
else if (nextpoint.script_noteworthy == "arriving")
{
self thread begin_arrival_slowdown();
self thread play_bus_audio("arriving");
level thread do_player_bus_zombie_vox("bus_stop", 10);
self thread buslightsignal("turn_signal_right");
}
else if (nextpoint.script_noteworthy == "enter_transition")
playfxontag(level._effect["fx_zbus_trans_fog"], self, "tag_headlights");
else if (nextpoint.script_noteworthy == "bridge")
{
level thread do_automaton_arrival_vox("bridge");
player_near = 0;
node = getvehiclenode("bridge_accel_point", "script_noteworthy");
if (isdefined(node))
{
players = get_players();
foreach (player in players)
{
if (player.isonbus)
continue;
if (distancesquared(player.origin, node.origin) < 6760000)
player_near = 1;
}
}
if (player_near)
{
trig = getent("bridge_trig", "targetname");
trig notify("trigger");
}
}
else if (nextpoint.script_noteworthy == "depot")
{
volume = getent("depot_lava_pit", "targetname");
traverse_volume = getent("depot_pit_traverse", "targetname");
if (isdefined(volume))
{
zombies = getaiarray(level.zombie_team);
for (i = 0; i < zombies.size; i++)
{
if (isdefined(zombies[i].depot_lava_pit))
{
if (zombies[i] istouching(volume))
zombies[i] thread [[zombies[i].depot_lava_pit]]();
continue;
}
if (zombies[i] istouching(volume))
{
zombies[i] dodamage(zombies[i].health + 100, zombies[i].origin);
continue;
}
if (zombies[i] istouching(traverse_volume))
zombies[i] dodamage(zombies[i].health + 100, zombies[i].origin);
}
}
}
}
waittillframeend;
}
}
start_stopping_bus(stop_fast)
{
if (isdefined(stop_fast) && stop_fast)
self setspeed(4, 30);
else
self setspeed(4, 10);
}
begin_arrival_slowdown()
{
self setspeed(10, 10, 10);
}
buspathblockersetup()
{
self.path_blockers = getentarray("bus_path_blocker", "targetname");
for (i = 0; i < self.path_blockers.size; i++)
self.path_blockers[i] linkto(self, "", self worldtolocalcoords(self.path_blockers[i].origin), self.path_blockers[i].angles + self.angles);
cow_catcher_blocker = getent("cow_catcher_path_blocker", "targetname");
if (isdefined(cow_catcher_blocker))
cow_catcher_blocker linkto(self, "", self worldtolocalcoords(cow_catcher_blocker.origin), cow_catcher_blocker.angles + self.angles);
self thread bus_buyable_weapon_unitrigger_setup();
}
bus_buyable_weapon_unitrigger_setup()
{
weapon_model = getent("bus_buyable_weapon1", "script_noteworthy");
weapon_model enablelinkto();
weapon_model linkto(self, "", self worldtolocalcoords(weapon_model.origin), weapon_model.angles + self.angles);
weapon_model setmovingplatformenabled(1);
weapon_model._linked_ent = self;
weapon_model hide();
unitrigger = undefined;
while (!isDefined(unitrigger))
{
for (i = 0; i < level._unitriggers.trigger_stubs.size; i++)
{
if (IsDefined(level._unitriggers.trigger_stubs[i].zombie_weapon_upgrade) && level._unitriggers.trigger_stubs[i].zombie_weapon_upgrade == "beretta93r_zm")
{
unitrigger = level._unitriggers.trigger_stubs[i];
break;
}
}
wait 1;
}
unitrigger.require_look_at = 0;
unitrigger.target = weapon_model;
unitrigger.origin_parent = weapon_model;
unitrigger.link_parent = self;
unitrigger.originfunc = ::bus_buyable_weapon_get_unitrigger_origin;
unitrigger.onspawnfunc = ::bus_buyable_weapon_on_spawn_trigger;
while (1)
{
level waittill("weapon_bought", player, weapon);
if (weapon == "beretta93r_zm")
{
break;
}
}
weapon_model show();
}
bus_buyable_weapon_get_unitrigger_origin()
{
return self.origin_parent.origin + (0, 0, -32);
}
bus_buyable_weapon_on_spawn_trigger(trigger)
{
trigger enablelinkto();
trigger linkto(self.link_parent);
trigger setmovingplatformenabled(1);
}
busthink()
{
no_danger = 0;
self thread busupdatechasers();
self thread busupdateplayers();
self thread busupdatenearzombies();
while (true)
{
waittillframeend;
self busupdatespeed();
self busupdateignorewindows();
if (self.ismoving)
self busupdatenearequipment();
if (!(isdefined(level.bus_zombie_danger) && level.bus_zombie_danger) && (self.numplayersonroof || self.numplayersinsidebus))
{
no_danger++;
if (no_danger > 40)
{
level thread do_player_bus_zombie_vox("bus_zom_none", 40, 60);
no_danger = 0;
}
}
else
no_danger = 0;
wait 0.1;
}
}
busupdateplayers()
{
level endon("end_game");
while (true)
{
self.numplayers = 0;
self.numplayerson = 0;
self.numplayersonroof = 0;
self.numplayersinsidebus = 0;
self.numplayersnear = 0;
self.numaliveplayersridingbus = 0;
self.frontworld = self localtoworldcoords(self.frontlocal);
self.backworld = self localtoworldcoords(self.backlocal);
self.bus_riders_alive = [];
players = get_players();
foreach (player in players)
{
if (!isalive(player))
continue;
self.numplayers++;
if (distance2d(player.origin, self.origin) < 1700)
self.numplayersnear++;
playerisinbus = 0;
mover = player getmoverent();
if (isdefined(mover))
{
if (isdefined(mover.targetname))
{
if (mover.targetname == "the_bus" || mover.targetname == "bus_path_blocker" || mover.targetname == "hatch_clip" || mover.targetname == "ladder_mantle")
playerisinbus = 1;
}
if (isdefined(mover.equipname))
{
if (mover.equipname == "riotshield_zm")
{
if (isdefined(mover.isonbus) && mover.isonbus)
playerisinbus = 1;
}
}
if (isdefined(mover.is_zombie) && mover.is_zombie && (isdefined(mover.isonbus) && mover.isonbus))
playerisinbus = 1;
}
if (playerisinbus)
{
self.numplayerson++;
if (is_player_valid(player))
{
self.numaliveplayersridingbus++;
self.bus_riders_alive[self.bus_riders_alive.size] = player;
}
}
ground_ent = player getgroundent();
if (player isonladder())
ground_ent = mover;
if (isdefined(ground_ent))
{
if (isdefined(ground_ent.is_zombie) && ground_ent.is_zombie)
player thread zombie_surf(ground_ent);
else
{
if (playerisinbus && !(isdefined(player.isonbus) && player.isonbus))
{
bbprint("zombie_events", "category %s type %s round %d playername %s", "BUS", "player_enter", level.round_number, player.name);
player thread bus_audio_interior_loop(self);
player clientnotify("OBS");
player setclientplayerpushamount(0);
if (randomint(100) > 80 && level.automaton.greeting_timer == 0)
{
thread automatonspeak("convo", "player_enter");
level.automaton thread greeting_timer();
}
}
if (!playerisinbus && (isdefined(player.isonbus) && player.isonbus))
{
bbprint("zombie_events", "category %s type %s round %d playername %s", "BUS", "player_exit", level.round_number, player.name);
player setclientplayerpushamount(1);
player notify("left bus");
player clientnotify("LBS");
if (randomint(100) > 80 && level.automaton.greeting_timer == 0)
{
thread automatonspeak("convo", "player_leave");
level.automaton thread greeting_timer();
}
}
player.isonbus = playerisinbus;
player.isonbusroof = player _entityisonroof();
}
}
if (isdefined(player.isonbusroof) && player.isonbusroof)
{
self.numplayersonroof++;
}
else if (isdefined(player.isonbus) && player.isonbus)
{
self.numplayersinsidebus++;
}
wait 0.05;
}
wait 0.05;
}
}
busplowkillzombieuntildeath()
{
self endon("death");
while (isdefined(self) && isalive(self))
{
if (isdefined(self.health))
{
self dodamage(self.health + 666, self.origin, self, self, "none", "MOD_SUICIDE");
}
wait 1;
}
}