1
0
mirror of https://github.com/JezuzLizard/BO2-Reimagined.git synced 2025-06-10 15:17:57 -05:00
Files
BO2-Reimagined/scripts/zm/replaced/_zm_buildables_pooled.gsc

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;
}