mirror of
https://github.com/JezuzLizard/BO2-Reimagined.git
synced 2025-06-07 21:59:49 -05:00
613 lines
15 KiB
Plaintext
613 lines
15 KiB
Plaintext
#include maps\mp\zombies\_zm_buildables_pooled;
|
|
#include maps\mp\_utility;
|
|
#include common_scripts\utility;
|
|
#include maps\mp\zombies\_zm_utility;
|
|
|
|
add_buildable_to_pool(stub, poolname)
|
|
{
|
|
if (!isdefined(level.buildablepools))
|
|
level.buildablepools = [];
|
|
|
|
if (!isdefined(level.buildablepools[poolname]))
|
|
{
|
|
level.buildablepools[poolname] = spawnstruct();
|
|
level.buildablepools[poolname].stubs = [];
|
|
}
|
|
|
|
level.buildablepools[poolname].stubs[level.buildablepools[poolname].stubs.size] = stub;
|
|
|
|
if (!isdefined(level.buildablepools[poolname].buildable_slot))
|
|
level.buildablepools[poolname].buildable_slot = stub.buildablestruct.buildable_slot;
|
|
else
|
|
assert(level.buildablepools[poolname].buildable_slot == stub.buildablestruct.buildable_slot);
|
|
|
|
stub.buildable_pool = level.buildablepools[poolname];
|
|
stub.original_prompt_and_visibility_func = stub.prompt_and_visibility_func;
|
|
stub.original_trigger_func = stub.trigger_func;
|
|
stub.prompt_and_visibility_func = ::pooledbuildabletrigger_update_prompt;
|
|
reregister_unitrigger(stub, ::pooled_buildable_place_think);
|
|
}
|
|
|
|
reregister_unitrigger(unitrigger_stub, new_trigger_func)
|
|
{
|
|
static = 0;
|
|
|
|
if (isdefined(unitrigger_stub.in_zone))
|
|
static = 1;
|
|
|
|
unregister_unitrigger(unitrigger_stub);
|
|
unitrigger_stub.trigger_func = new_trigger_func;
|
|
|
|
if (static)
|
|
register_static_unitrigger(unitrigger_stub, new_trigger_func, 0);
|
|
else
|
|
register_unitrigger(unitrigger_stub, new_trigger_func);
|
|
}
|
|
|
|
randomize_pooled_buildables(poolname)
|
|
{
|
|
level waittill("buildables_setup");
|
|
|
|
if (isdefined(level.buildablepools[poolname]))
|
|
{
|
|
count = level.buildablepools[poolname].stubs.size;
|
|
|
|
if (count > 1)
|
|
{
|
|
for (i = 0; i < count; i++)
|
|
{
|
|
rand = randomint(count);
|
|
|
|
if (rand != i)
|
|
{
|
|
swap_buildable_fields(level.buildablepools[poolname].stubs[i], level.buildablepools[poolname].stubs[rand]);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
pooledbuildabletrigger_update_prompt(player)
|
|
{
|
|
can_use = self.stub pooledbuildablestub_update_prompt(player, self);
|
|
|
|
if (can_use && is_true(self.stub.built))
|
|
{
|
|
self sethintstring(self.stub.hint_string, self.stub.cost);
|
|
}
|
|
else
|
|
{
|
|
self sethintstring(self.stub.hint_string);
|
|
}
|
|
|
|
self setcursorhint("HINT_NOICON");
|
|
|
|
return can_use;
|
|
}
|
|
|
|
pooledbuildablestub_update_prompt(player, trigger)
|
|
{
|
|
if (!self anystub_update_prompt(player))
|
|
return 0;
|
|
|
|
can_use = 1;
|
|
|
|
if (isdefined(self.custom_buildablestub_update_prompt) && !self [[self.custom_buildablestub_update_prompt]](player))
|
|
return 0;
|
|
|
|
self.cursor_hint = "HINT_NOICON";
|
|
self.cursor_hint_weapon = undefined;
|
|
piece = undefined;
|
|
|
|
if (!(isdefined(self.built) && self.built))
|
|
{
|
|
if (!is_true(self.solo_pool))
|
|
{
|
|
if (level.buildables_available.size > 1)
|
|
{
|
|
if (!is_true(self.open_buildable_checking_input))
|
|
{
|
|
self thread choose_open_buildable(player);
|
|
}
|
|
else
|
|
{
|
|
equipname = level.buildables_available[self.buildables_available_index];
|
|
self.hint_string = level.zombie_buildables[equipname].hint;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
self notify("kill_choose_open_buildable");
|
|
self.open_buildable_checking_input = 0;
|
|
|
|
if (isdefined(self.openbuildablehudelem))
|
|
{
|
|
self.openbuildablehudelem destroy();
|
|
self.openbuildablehudelem = undefined;
|
|
}
|
|
|
|
self.buildables_available_index = 0;
|
|
equipname = level.buildables_available[self.buildables_available_index];
|
|
self.hint_string = level.zombie_buildables[equipname].hint;
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
if (isdefined(level.zombie_buildables[self.equipname].hint))
|
|
self.hint_string = level.zombie_buildables[self.equipname].hint;
|
|
else
|
|
self.hint_string = "Missing buildable hint";
|
|
}
|
|
else
|
|
return trigger [[self.original_prompt_and_visibility_func]](player);
|
|
|
|
return 1;
|
|
}
|
|
|
|
find_bench(bench_name)
|
|
{
|
|
return getent(bench_name, "targetname");
|
|
}
|
|
|
|
swap_buildable_fields(stub1, stub2)
|
|
{
|
|
temp = stub2.buildablezone;
|
|
stub2.buildablezone = stub1.buildablezone;
|
|
stub2.buildablezone.stub = stub2;
|
|
stub1.buildablezone = temp;
|
|
stub1.buildablezone.stub = stub1;
|
|
temp = stub2.buildablestruct;
|
|
stub2.buildablestruct = stub1.buildablestruct;
|
|
stub1.buildablestruct = temp;
|
|
temp = stub2.equipname;
|
|
stub2.equipname = stub1.equipname;
|
|
stub1.equipname = temp;
|
|
temp = stub2.hint_string;
|
|
stub2.hint_string = stub1.hint_string;
|
|
stub1.hint_string = temp;
|
|
temp = stub2.trigger_hintstring;
|
|
stub2.trigger_hintstring = stub1.trigger_hintstring;
|
|
stub1.trigger_hintstring = temp;
|
|
temp = stub2.persistent;
|
|
stub2.persistent = stub1.persistent;
|
|
stub1.persistent = temp;
|
|
temp = stub2.onbeginuse;
|
|
stub2.onbeginuse = stub1.onbeginuse;
|
|
stub1.onbeginuse = temp;
|
|
temp = stub2.oncantuse;
|
|
stub2.oncantuse = stub1.oncantuse;
|
|
stub1.oncantuse = temp;
|
|
temp = stub2.onenduse;
|
|
stub2.onenduse = stub1.onenduse;
|
|
stub1.onenduse = temp;
|
|
temp = stub2.target;
|
|
stub2.target = stub1.target;
|
|
stub1.target = temp;
|
|
temp = stub2.targetname;
|
|
stub2.targetname = stub1.targetname;
|
|
stub1.targetname = temp;
|
|
temp = stub2.weaponname;
|
|
stub2.weaponname = stub1.weaponname;
|
|
stub1.weaponname = temp;
|
|
temp = stub2.cost;
|
|
stub2.cost = stub1.cost;
|
|
stub1.cost = temp;
|
|
temp = stub2.original_prompt_and_visibility_func;
|
|
stub2.original_prompt_and_visibility_func = stub1.original_prompt_and_visibility_func;
|
|
stub1.original_prompt_and_visibility_func = temp;
|
|
bench1 = undefined;
|
|
bench2 = undefined;
|
|
transfer_pos_as_is = 1;
|
|
|
|
if (isdefined(stub1.model.target) && isdefined(stub2.model.target))
|
|
{
|
|
bench1 = find_bench(stub1.model.target);
|
|
bench2 = find_bench(stub2.model.target);
|
|
|
|
if (isdefined(bench1) && isdefined(bench2))
|
|
{
|
|
transfer_pos_as_is = 0;
|
|
temp = [];
|
|
temp[0] = bench1 worldtolocalcoords(stub1.model.origin);
|
|
temp[1] = stub1.model.angles - bench1.angles;
|
|
temp[2] = bench2 worldtolocalcoords(stub2.model.origin);
|
|
temp[3] = stub2.model.angles - bench2.angles;
|
|
stub1.model.origin = bench2 localtoworldcoords(temp[0]);
|
|
stub1.model.angles = bench2.angles + temp[1];
|
|
stub2.model.origin = bench1 localtoworldcoords(temp[2]);
|
|
stub2.model.angles = bench1.angles + temp[3];
|
|
}
|
|
|
|
temp = stub2.model.target;
|
|
stub2.model.target = stub1.model.target;
|
|
stub1.model.target = temp;
|
|
}
|
|
|
|
temp = stub2.model;
|
|
stub2.model = stub1.model;
|
|
stub1.model = temp;
|
|
|
|
if (transfer_pos_as_is)
|
|
{
|
|
temp = [];
|
|
temp[0] = stub2.model.origin;
|
|
temp[1] = stub2.model.angles;
|
|
stub2.model.origin = stub1.model.origin;
|
|
stub2.model.angles = stub1.model.angles;
|
|
stub1.model.origin = temp[0];
|
|
stub1.model.angles = temp[1];
|
|
|
|
swap_buildable_fields_model_offset(stub1, stub2);
|
|
}
|
|
}
|
|
|
|
swap_buildable_fields_model_offset(stub1, stub2)
|
|
{
|
|
origin_offset = (0, 0, 0);
|
|
angle_offset = (0, 0, 0);
|
|
|
|
if (stub1.weaponname == "equip_turbine_zm")
|
|
{
|
|
if (stub2.weaponname == "riotshield_zm")
|
|
{
|
|
origin_offset = (6, -6, -27);
|
|
angle_offset = (0, -180, 0);
|
|
}
|
|
else if (stub2.weaponname == "equip_turret_zm")
|
|
{
|
|
origin_offset = (-7, -5, 0);
|
|
angle_offset = (0, -90, 0);
|
|
}
|
|
else if (stub2.weaponname == "equip_electrictrap_zm")
|
|
{
|
|
origin_offset = (-2, 8, 0);
|
|
angle_offset = (0, 90, 0);
|
|
}
|
|
else if (stub2.weaponname == "jetgun_zm")
|
|
{
|
|
origin_offset = (-3, -4, -24);
|
|
angle_offset = (0, -90, 0);
|
|
}
|
|
}
|
|
else if (stub1.weaponname == "riotshield_zm")
|
|
{
|
|
if (stub2.weaponname == "equip_turbine_zm")
|
|
{
|
|
origin_offset = (-6, 6, 27);
|
|
angle_offset = (0, 180, 0);
|
|
}
|
|
else if (stub2.weaponname == "equip_turret_zm")
|
|
{
|
|
origin_offset = (-1, 1, 27);
|
|
angle_offset = (0, 90, 0);
|
|
}
|
|
else if (stub2.weaponname == "equip_electrictrap_zm")
|
|
{
|
|
origin_offset = (2, -4, 27);
|
|
angle_offset = (0, -90, 0);
|
|
}
|
|
else if (stub2.weaponname == "jetgun_zm")
|
|
{
|
|
origin_offset = (-2, 5, 3);
|
|
angle_offset = (0, 90, 0);
|
|
}
|
|
}
|
|
else if (stub1.weaponname == "equip_turret_zm")
|
|
{
|
|
if (stub2.weaponname == "equip_turbine_zm")
|
|
{
|
|
origin_offset = (7, 5, 0);
|
|
angle_offset = (0, 90, 0);
|
|
}
|
|
else if (stub2.weaponname == "riotshield_zm")
|
|
{
|
|
origin_offset = (1, -1, -27);
|
|
angle_offset = (0, -90, 0);
|
|
}
|
|
else if (stub2.weaponname == "equip_electrictrap_zm")
|
|
{
|
|
origin_offset = (2, -2, 0);
|
|
angle_offset = (0, -180, 0);
|
|
}
|
|
else if (stub2.weaponname == "jetgun_zm")
|
|
{
|
|
origin_offset = (4, 0, -24);
|
|
angle_offset = (0, 0, 0);
|
|
}
|
|
}
|
|
else if (stub1.weaponname == "equip_electrictrap_zm")
|
|
{
|
|
if (stub2.weaponname == "equip_turbine_zm")
|
|
{
|
|
origin_offset = (2, -8, 0);
|
|
angle_offset = (0, -90, 0);
|
|
}
|
|
else if (stub2.weaponname == "riotshield_zm")
|
|
{
|
|
origin_offset = (-2, 4, -27);
|
|
angle_offset = (0, 90, 0);
|
|
}
|
|
else if (stub2.weaponname == "equip_turret_zm")
|
|
{
|
|
origin_offset = (-2, 2, 0);
|
|
angle_offset = (0, 180, 0);
|
|
}
|
|
else if (stub2.weaponname == "jetgun_zm")
|
|
{
|
|
origin_offset = (-6, 3, -24);
|
|
angle_offset = (0, 180, 0);
|
|
}
|
|
}
|
|
else if (stub1.weaponname == "jetgun_zm")
|
|
{
|
|
if (stub2.weaponname == "equip_turbine_zm")
|
|
{
|
|
origin_offset = (3, 4, 24);
|
|
angle_offset = (0, 90, 0);
|
|
}
|
|
else if (stub2.weaponname == "riotshield_zm")
|
|
{
|
|
origin_offset = (2, -5, -3);
|
|
angle_offset = (0, -90, 0);
|
|
}
|
|
else if (stub2.weaponname == "equip_turret_zm")
|
|
{
|
|
origin_offset = (-4, 0, 24);
|
|
angle_offset = (0, 0, 0);
|
|
}
|
|
else if (stub2.weaponname == "equip_electrictrap_zm")
|
|
{
|
|
origin_offset = (6, -3, 24);
|
|
angle_offset = (0, -180, 0);
|
|
}
|
|
}
|
|
else if (stub1.weaponname == "equip_springpad_zm")
|
|
{
|
|
if (stub2.weaponname == "slipgun_zm")
|
|
{
|
|
origin_offset = (-14, 2, -2);
|
|
angle_offset = (64.2, 90, 0);
|
|
}
|
|
}
|
|
else if (stub1.weaponname == "slipgun_zm")
|
|
{
|
|
if (stub2.weaponname == "equip_springpad_zm")
|
|
{
|
|
origin_offset = (14, -2, 2);
|
|
angle_offset = (-64.2, -90, 0);
|
|
}
|
|
}
|
|
|
|
stub1.model.angles += angle_offset;
|
|
stub2.model.angles -= angle_offset;
|
|
|
|
model1_angle = (0, stub1.model.angles[1], 0);
|
|
model2_angle = (0, stub2.model.angles[1], 0);
|
|
|
|
if (angle_offset[1] < 0)
|
|
{
|
|
model1_angle -= (0, angle_offset[1], 0);
|
|
}
|
|
else
|
|
{
|
|
model2_angle += (0, angle_offset[1], 0);
|
|
}
|
|
|
|
stub1.model.origin += (anglesToForward(model1_angle) * origin_offset[0]) + (anglesToRight(model1_angle) * origin_offset[1]) + (anglesToUp(model1_angle) * origin_offset[2]);
|
|
stub2.model.origin -= (anglesToForward(model2_angle) * origin_offset[0]) + (anglesToRight(model2_angle) * origin_offset[1]) + (anglesToUp(model2_angle) * origin_offset[2]);
|
|
}
|
|
|
|
pooled_buildable_place_think()
|
|
{
|
|
self endon("kill_trigger");
|
|
|
|
if (isdefined(self.stub.built) && self.stub.built)
|
|
return scripts\zm\replaced\_zm_buildables::buildable_place_think();
|
|
|
|
while (!(isdefined(self.stub.built) && self.stub.built))
|
|
{
|
|
self waittill("trigger", player);
|
|
|
|
if (player != self.parent_player)
|
|
continue;
|
|
|
|
if (isdefined(player.screecher_weapon))
|
|
continue;
|
|
|
|
if (!is_player_valid(player))
|
|
{
|
|
player thread ignore_triggers(0.5);
|
|
continue;
|
|
}
|
|
|
|
bind_to = self.stub;
|
|
|
|
if (isdefined(self.stub.buildables_available_index))
|
|
{
|
|
bind_to = self.stub.buildable_pool pooledbuildable_stub_for_equipname(level.buildables_available[self.stub.buildables_available_index]);
|
|
}
|
|
|
|
if (!isdefined(bind_to) || isdefined(self.stub.bound_to_buildable) && self.stub.bound_to_buildable != bind_to || isdefined(bind_to.bound_to_buildable) && self.stub != bind_to.bound_to_buildable)
|
|
{
|
|
self.stub.hint_string = "";
|
|
self sethintstring(self.stub.hint_string);
|
|
|
|
if (isdefined(self.stub.oncantuse))
|
|
self.stub [[self.stub.oncantuse]](player);
|
|
|
|
continue;
|
|
}
|
|
|
|
status = player scripts\zm\replaced\_zm_buildables::player_can_build(bind_to.buildablezone);
|
|
|
|
if (!status)
|
|
{
|
|
self.stub.hint_string = "";
|
|
self sethintstring(self.stub.hint_string);
|
|
|
|
if (isdefined(bind_to.oncantuse))
|
|
bind_to [[bind_to.oncantuse]](player);
|
|
}
|
|
else
|
|
{
|
|
if (isdefined(bind_to.onbeginuse))
|
|
self.stub [[bind_to.onbeginuse]](player);
|
|
|
|
result = self scripts\zm\replaced\_zm_buildables::buildable_use_hold_think(player, bind_to);
|
|
team = player.pers["team"];
|
|
|
|
if (result)
|
|
{
|
|
if (isdefined(self.stub.bound_to_buildable) && self.stub.bound_to_buildable != bind_to)
|
|
result = 0;
|
|
|
|
if (isdefined(bind_to.bound_to_buildable) && self.stub != bind_to.bound_to_buildable)
|
|
result = 0;
|
|
}
|
|
|
|
if (isdefined(bind_to.onenduse))
|
|
self.stub [[bind_to.onenduse]](team, player, result);
|
|
|
|
if (!result)
|
|
continue;
|
|
|
|
if (bind_to != self.stub)
|
|
{
|
|
swap_buildable_fields(self.stub, bind_to);
|
|
}
|
|
|
|
if (isdefined(self.stub.onuse))
|
|
self.stub [[self.stub.onuse]](player);
|
|
|
|
prompt = player scripts\zm\replaced\_zm_buildables::player_build(self.stub.buildablezone);
|
|
self.stub.hint_string = self.stub.trigger_hintstring;
|
|
}
|
|
}
|
|
|
|
self.stub maps\mp\zombies\_zm_buildables::buildablestub_remove();
|
|
arrayremovevalue(level.buildables_available, self.stub.equipname);
|
|
|
|
if (level.buildables_available.size == 0)
|
|
{
|
|
foreach (stub in level.buildable_stubs)
|
|
{
|
|
if (isDefined(stub.buildable_pool) && stub.buildable_pool == self.stub.buildable_pool)
|
|
{
|
|
maps\mp\zombies\_zm_unitrigger::unregister_unitrigger(stub);
|
|
}
|
|
}
|
|
}
|
|
|
|
self thread pooled_buildable_place_update_all();
|
|
}
|
|
|
|
pooled_buildable_place_update_all()
|
|
{
|
|
players = get_players();
|
|
|
|
foreach (player in players)
|
|
{
|
|
num = player getentitynumber();
|
|
|
|
if (isDefined(self.stub.playertrigger[num]))
|
|
{
|
|
self.stub.playertrigger[num] notify("kill_trigger");
|
|
self.stub.playertrigger[num] pooledbuildabletrigger_update_prompt(player);
|
|
self.stub.playertrigger[num] pooled_buildable_place_think();
|
|
}
|
|
}
|
|
}
|
|
|
|
pooledbuildable_stub_for_equipname(equipname)
|
|
{
|
|
foreach (stub in self.stubs)
|
|
{
|
|
if (isdefined(stub.bound_to_buildable))
|
|
continue;
|
|
|
|
if (stub.equipname == equipname)
|
|
return stub;
|
|
}
|
|
|
|
return undefined;
|
|
}
|
|
|
|
choose_open_buildable(player)
|
|
{
|
|
self endon("kill_choose_open_buildable");
|
|
|
|
num = player getentitynumber();
|
|
got_input = 1;
|
|
hud = newclienthudelem(player);
|
|
hud.alignx = "center";
|
|
hud.aligny = "middle";
|
|
hud.horzalign = "center";
|
|
hud.vertalign = "bottom";
|
|
hud.y = -100;
|
|
hud.foreground = 1;
|
|
hud.hidewheninmenu = 1;
|
|
hud.font = "default";
|
|
hud.fontscale = 1;
|
|
hud.alpha = 1;
|
|
hud.color = (1, 1, 1);
|
|
hud settext(&"ZM_CRAFTABLES_CHANGE_BUILD");
|
|
self.open_buildable_checking_input = 1;
|
|
self.openbuildablehudelem = hud;
|
|
|
|
if (!isDefined(self.buildables_available_index))
|
|
{
|
|
self.buildables_available_index = 0;
|
|
}
|
|
|
|
while (isDefined(self.playertrigger[num]) && !self.built)
|
|
{
|
|
if (!player isTouching(self.playertrigger[num]) || !player is_player_looking_at(self.playertrigger[num].origin, 0.76) || !is_player_valid(player) || player isSprinting() || player isThrowingGrenade())
|
|
{
|
|
hud.alpha = 0;
|
|
wait 0.05;
|
|
continue;
|
|
}
|
|
|
|
hud.alpha = 1;
|
|
|
|
if (player actionslotonebuttonpressed())
|
|
{
|
|
self.buildables_available_index++;
|
|
got_input = 1;
|
|
}
|
|
else if (player actionslottwobuttonpressed())
|
|
{
|
|
self.buildables_available_index--;
|
|
got_input = 1;
|
|
}
|
|
|
|
if (self.buildables_available_index >= level.buildables_available.size)
|
|
{
|
|
self.buildables_available_index = 0;
|
|
}
|
|
else if (self.buildables_available_index < 0)
|
|
{
|
|
self.buildables_available_index = level.buildables_available.size - 1;
|
|
}
|
|
|
|
if (got_input)
|
|
{
|
|
equipname = level.buildables_available[self.buildables_available_index];
|
|
self.hint_string = level.zombie_buildables[equipname].hint;
|
|
|
|
foreach (trig in self.playertrigger)
|
|
{
|
|
trig sethintstring(self.hint_string);
|
|
}
|
|
|
|
got_input = 0;
|
|
}
|
|
|
|
wait 0.05;
|
|
}
|
|
|
|
self.open_buildable_checking_input = 0;
|
|
self.openbuildablehudelem destroy();
|
|
self.openbuildablehudelem = undefined;
|
|
} |