mirror of
https://github.com/JezuzLizard/BO2-Reimagined.git
synced 2025-06-09 23:02:53 -05:00
605 lines
16 KiB
Plaintext
605 lines
16 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, " [Cost: " + 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.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( "Press [{+actionslot 1}] or [{+actionslot 2}] to change item" );
|
|
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;
|
|
} |