// T6 GSC SOURCE
// Decompiled by https://github.com/xensik/gsc-tool
#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\zombies\_zm_buildables;
#include maps\mp\zm_transit_sq;

init_buildables()
{
    level.buildable_piece_count = 27;
    add_zombie_buildable( "riotshield_zm", &"ZOMBIE_BUILD_RIOT", &"ZOMBIE_BUILDING_RIOT", &"ZOMBIE_BOUGHT_RIOT" );
    add_zombie_buildable( "jetgun_zm", &"ZOMBIE_BUILD_JETGUN", &"ZOMBIE_BUILDING_JETGUN", &"ZOMBIE_BOUGHT_JETGUN" );
    add_zombie_buildable( "turret", &"ZOMBIE_BUILD_TURRET", &"ZOMBIE_BUILDING_TURRET", &"ZOMBIE_BOUGHT_TURRET" );
    add_zombie_buildable( "electric_trap", &"ZOMBIE_BUILD_ELECTRIC_TRAP", &"ZOMBIE_BUILDING_ELECTRIC_TRAP", &"ZOMBIE_BOUGHT_ELECTRIC_TRAP" );
    add_zombie_buildable( "cattlecatcher", &"ZOMBIE_BUILD_CATTLE_CATCHER", &"ZOMBIE_BUILDING_CATTLE_CATCHER" );
    add_zombie_buildable( "bushatch", &"ZOMBIE_BUILD_BUSHATCH", &"ZOMBIE_BUILDING_BUSHATCH" );
    add_zombie_buildable( "dinerhatch", &"ZOMBIE_BUILD_DINERHATCH", &"ZOMBIE_BUILDING_DINERHATCH" );
    add_zombie_buildable( "busladder", &"ZOMBIE_BUILD_BUSLADDER", &"ZOMBIE_BUILDING_BUSLADDER" );
    add_zombie_buildable( "powerswitch", &"ZOMBIE_BUILD_POWER_SWITCH", &"ZOMBIE_BUILDING_POWER_SWITCH" );
    add_zombie_buildable( "pap", &"ZOMBIE_BUILD_PAP", &"ZOMBIE_BUILDING_PAP" );
    add_zombie_buildable( "turbine", &"ZOMBIE_BUILD_TURBINE", &"ZOMBIE_BUILDING_TURBINE", &"ZOMBIE_BOUGHT_TURBINE" );
    add_zombie_buildable( "sq_common", &"ZOMBIE_BUILD_SQ_COMMON", &"ZOMBIE_BUILDING_SQ_COMMON" );
}

include_buildables()
{
    battery = generate_zombie_buildable_piece( "pap", "p6_zm_buildable_battery", 32, 64, 0, "zm_hud_icon_battery", ::onpickup_common, ::ondrop_common, undefined, "tag_part_03", undefined, 1 );
    riotshield_dolly = generate_zombie_buildable_piece( "riotshield_zm", "t6_wpn_zmb_shield_dolly", 32, 64, 0, "zm_hud_icon_dolly", ::onpickup_common, ::ondrop_common, undefined, "TAG_RIOT_SHIELD_DOLLY", undefined, 2 );
    riotshield_door = generate_zombie_buildable_piece( "riotshield_zm", "t6_wpn_zmb_shield_door", 48, 15, 25, "zm_hud_icon_cardoor", ::onpickup_common, ::ondrop_common, undefined, "TAG_RIOT_SHIELD_DOOR", undefined, 3 );
    riotshield = spawnstruct();
    riotshield.name = "riotshield_zm";
    riotshield add_buildable_piece( riotshield_dolly );
    riotshield add_buildable_piece( riotshield_door );
    riotshield.onbuyweapon = ::onbuyweapon_riotshield;
    riotshield.triggerthink = ::riotshieldbuildable;
    include_buildable( riotshield );
    maps\mp\zombies\_zm_buildables::hide_buildable_table_model( "riotshield_zm_buildable_trigger" );
    powerswitch_arm = generate_zombie_buildable_piece( "powerswitch", "p6_zm_buildable_pswitch_hand", 32, 64, 10, "zm_hud_icon_arm", ::onpickup_common, ::ondrop_common, undefined, undefined, undefined, 4 );
    powerswitch_lever = generate_zombie_buildable_piece( "powerswitch", "p6_zm_buildable_pswitch_body", 48, 64, 0, "zm_hud_icon_panel", ::onpickup_common, ::ondrop_common, undefined, undefined, undefined, 5 );
    powerswitch_box = generate_zombie_buildable_piece( "powerswitch", "p6_zm_buildable_pswitch_lever", 32, 15, 0, "zm_hud_icon_lever", ::onpickup_common, ::ondrop_common, undefined, undefined, undefined, 6 );
    powerswitch = spawnstruct();
    powerswitch.name = "powerswitch";
    powerswitch add_buildable_piece( powerswitch_arm );
    powerswitch add_buildable_piece( powerswitch_lever );
    powerswitch add_buildable_piece( powerswitch_box );
    powerswitch.onuseplantobject = ::onuseplantobject_powerswitch;
    powerswitch.triggerthink = ::powerswitchbuildable;
    include_buildable( powerswitch );
    packapunch_machine = generate_zombie_buildable_piece( "pap", "p6_zm_buildable_pap_body", 48, 64, 0, "zm_hud_icon_papbody", ::onpickup_common, ::ondrop_common, undefined, "tag_part_02", undefined, 7 );
    packapunch_legs = generate_zombie_buildable_piece( "pap", "p6_zm_buildable_pap_table", 48, 15, 0, "zm_hud_icon_chairleg", ::onpickup_common, ::ondrop_common, undefined, "tag_part_01", undefined, 8 );
    packapunch = spawnstruct();
    packapunch.name = "pap";
    packapunch add_buildable_piece( battery, "tag_part_03", 0 );
    packapunch add_buildable_piece( packapunch_machine );
    packapunch add_buildable_piece( packapunch_legs );
    packapunch.triggerthink = ::papbuildable;
    include_buildable( packapunch );
    maps\mp\zombies\_zm_buildables::hide_buildable_table_model( "pap_buildable_trigger" );
    turbine_fan = generate_zombie_buildable_piece( "turbine", "p6_zm_buildable_turbine_fan", 32, 64, 0, "zm_hud_icon_fan", ::onpickup_common, ::ondrop_common, undefined, "tag_part_03", undefined, 9 );
    turbine_panel = generate_zombie_buildable_piece( "turbine", "p6_zm_buildable_turbine_rudder", 32, 64, 0, "zm_hud_icon_rudder", ::onpickup_common, ::ondrop_common, undefined, "tag_part_04", undefined, 10 );
    turbine_body = generate_zombie_buildable_piece( "turbine", "p6_zm_buildable_turbine_mannequin", 32, 15, 0, "zm_hud_icon_mannequin", ::onpickup_common, ::ondrop_common, undefined, "tag_part_01", undefined, 11 );
    turbine = spawnstruct();
    turbine.name = "turbine";
    turbine add_buildable_piece( turbine_fan );
    turbine add_buildable_piece( turbine_panel );
    turbine add_buildable_piece( turbine_body );
    turbine.onuseplantobject = ::onuseplantobject_turbine;
    turbine.triggerthink = ::turbinebuildable;
    include_buildable( turbine );
    maps\mp\zombies\_zm_buildables::hide_buildable_table_model( "turbine_buildable_trigger" );
    turret_barrel = generate_zombie_buildable_piece( "turret", "t6_wpn_lmg_rpd_world", 32, 64, 10, "zm_hud_icon_turrethead", ::onpickup_common, ::ondrop_common, undefined, "tag_aim", undefined, 12 );
    turret_body = generate_zombie_buildable_piece( "turret", "p6_zm_buildable_turret_mower", 48, 64, 0, "zm_hud_icon_lawnmower", ::onpickup_common, ::ondrop_common, undefined, "tag_part_01", undefined, 13 );
    turret_ammo = generate_zombie_buildable_piece( "turret", "p6_zm_buildable_turret_ammo", 32, 15, 0, "zm_hud_icon_ammobox", ::onpickup_common, ::ondrop_common, undefined, "tag_part_02", undefined, 14 );
    turret = spawnstruct();
    turret.name = "turret";
    turret add_buildable_piece( turret_barrel );
    turret add_buildable_piece( turret_body );
    turret add_buildable_piece( turret_ammo );
    turret.triggerthink = ::turretbuildable;
    include_buildable( turret );
    maps\mp\zombies\_zm_buildables::hide_buildable_table_model( "turret_buildable_trigger" );
    electric_trap_spool = generate_zombie_buildable_piece( "electric_trap", "p6_zm_buildable_etrap_base", 32, 64, 0, "zm_hud_icon_coil", ::onpickup_common, ::ondrop_common, undefined, "tag_part_02", undefined, 15 );
    electric_trap_coil = generate_zombie_buildable_piece( "electric_trap", "p6_zm_buildable_etrap_tvtube", 32, 64, 10, "zm_hud_icon_tvtube", ::onpickup_common, ::ondrop_common, undefined, "tag_part_01", undefined, 16 );
    electric_trap = spawnstruct();
    electric_trap.name = "electric_trap";
    electric_trap add_buildable_piece( electric_trap_spool );
    electric_trap add_buildable_piece( electric_trap_coil );
    electric_trap add_buildable_piece( battery, "tag_part_03", 0 );
    electric_trap.triggerthink = ::electrictrapbuildable;
    include_buildable( electric_trap );
    maps\mp\zombies\_zm_buildables::hide_buildable_table_model( "electric_trap_buildable_trigger" );
    jetgun_wires = generate_zombie_buildable_piece( "jetgun_zm", "p6_zm_buildable_jetgun_wires", 32, 64, 0, "zm_hud_icon_jetgun_wires", ::onpickup_common, ::ondrop_common, undefined, "TAG_WIRES", undefined, 17 );
    jetgun_engine = generate_zombie_buildable_piece( "jetgun_zm", "p6_zm_buildable_jetgun_engine", 48, 64, 0, "zm_hud_icon_jetgun_engine", ::onpickup_common, ::ondrop_common, undefined, "TAG_ENGINE", undefined, 18 );
    jetgun_gauges = generate_zombie_buildable_piece( "jetgun_zm", "p6_zm_buildable_jetgun_guages", 32, 15, 0, "zm_hud_icon_jetgun_gauges", ::onpickup_common, ::ondrop_common, undefined, "TAG_DIALS", undefined, 19 );
    jetgun_handle = generate_zombie_buildable_piece( "jetgun_zm", "p6_zm_buildable_jetgun_handles", 32, 15, 0, "zm_hud_icon_jetgun_handles", ::onpickup_common, ::ondrop_common, undefined, "TAG_HANDLES", undefined, 20 );
    jetgun = spawnstruct();
    jetgun.name = "jetgun_zm";
    jetgun add_buildable_piece( jetgun_wires );
    jetgun add_buildable_piece( jetgun_engine );
    jetgun add_buildable_piece( jetgun_gauges );
    jetgun add_buildable_piece( jetgun_handle );
    jetgun.onbuyweapon = ::onbuyweapon_jetgun;
    jetgun.triggerthink = ::jetgunbuildable;
    include_buildable( jetgun );
    maps\mp\zombies\_zm_buildables::hide_buildable_table_model( "jetgun_zm_buildable_trigger" );
    cattlecatcher_plow = generate_zombie_buildable_piece( "cattlecatcher", "veh_t6_civ_bus_zombie_cow_catcher", 72, 100, 20, "zm_hud_icon_plow", ::onpickup_common, ::ondrop_common, undefined, undefined, undefined, 21 );
    bushatch_hatch = generate_zombie_buildable_piece( "bushatch", "veh_t6_civ_bus_zombie_roof_hatch", 32, 64, 5, "zm_hud_icon_hatch", ::onpickup_common, ::ondrop_common, undefined, undefined, undefined, 22 );
    busladder_ladder = generate_zombie_buildable_piece( "busladder", "com_stepladder_large_closed", 32, 64, 0, "zm_hud_icon_ladder", ::onpickup_common, ::ondrop_common, undefined, undefined, undefined, 23 );
    cattlecatcher = spawnstruct();
    cattlecatcher.name = "cattlecatcher";
    cattlecatcher add_buildable_piece( cattlecatcher_plow );
    cattlecatcher.triggerthink = ::cattlecatcherbuildable;
    include_buildable( cattlecatcher );
    bushatch = spawnstruct();
    bushatch.name = "bushatch";
    bushatch add_buildable_piece( bushatch_hatch, undefined, 1 );
    bushatch.triggerthink = ::bushatchbuildable;
    include_buildable( bushatch );
    dinerhatch = spawnstruct();
    dinerhatch.name = "dinerhatch";
    dinerhatch add_buildable_piece( bushatch_hatch, undefined, 1 );
    dinerhatch.triggerthink = ::dinerhatchbuildable;
    include_buildable( dinerhatch );
    busladder = spawnstruct();
    busladder.name = "busladder";
    busladder add_buildable_piece( busladder_ladder );
    busladder.triggerthink = ::busladderbuildable;
    include_buildable( busladder );

    if ( !isdefined( level.gamedifficulty ) || level.gamedifficulty != 0 )
    {
        sq_common_electricbox = generate_zombie_buildable_piece( "sq_common", "p6_zm_buildable_sq_electric_box", 32, 64, 0, "zm_hud_icon_sq_powerbox", ::onpickup_common, ::ondrop_common, undefined, "tag_part_02", undefined, 24 );
        sq_common_meteor = generate_zombie_buildable_piece( "sq_common", "p6_zm_buildable_sq_meteor", 76, 64, 0, "zm_hud_icon_sq_meteor", ::onpickup_common, ::ondrop_common, undefined, "tag_part_04", undefined, 25 );
        sq_common_scaffolding = generate_zombie_buildable_piece( "sq_common", "p6_zm_buildable_sq_scaffolding", 64, 96, 0, "zm_hud_icon_sq_scafold", ::onpickup_common, ::ondrop_common, undefined, "tag_part_01", undefined, 26 );
        sq_common_transceiver = generate_zombie_buildable_piece( "sq_common", "p6_zm_buildable_sq_transceiver", 64, 96, 0, "zm_hud_icon_sq_tranceiver", ::onpickup_common, ::ondrop_common, undefined, "tag_part_03", undefined, 27 );
        sqcommon = spawnstruct();
        sqcommon.name = "sq_common";
        sqcommon add_buildable_piece( sq_common_electricbox );
        sqcommon add_buildable_piece( sq_common_meteor );
        sqcommon add_buildable_piece( sq_common_scaffolding );
        sqcommon add_buildable_piece( sq_common_transceiver );
        sqcommon.triggerthink = ::sqcommonbuildable;
        include_buildable( sqcommon );
        maps\mp\zombies\_zm_buildables::hide_buildable_table_model( "sq_common_buildable_trigger" );
    }
}

sqcommonbuildable()
{
    level.sq_buildable = maps\mp\zombies\_zm_buildables::buildable_trigger_think( "sq_common_buildable_trigger", "sq_common", "sq_common", "", 1, 0 );
}

busladderbuildable()
{
    blb = maps\mp\zombies\_zm_buildables::vehicle_buildable_trigger_think( level.the_bus, "bus_ladder_trigger", "busladder", "busladder", "", 0, 0 );
    blb.require_look_at = 0;
    blb.custom_buildablestub_update_prompt = ::busisonormovingbuildableupdateprompt;
}

busisonormovingbuildableupdateprompt( player, sethintstringnow, buildabletrigger )
{
    if ( isdefined( player.isonbus ) && player.isonbus || level.the_bus getspeedmph() > 0.0 )
    {
        if ( isdefined( self ) )
        {
            self.hint_string = "";

            if ( isdefined( sethintstringnow ) && sethintstringnow && isdefined( buildabletrigger ) )
                buildabletrigger sethintstring( self.hint_string );
        }

        return false;
    }

    return true;
}

bushatchbuildable()
{
    bhb = maps\mp\zombies\_zm_buildables::vehicle_buildable_trigger_think( level.the_bus, "bus_hatch_bottom_trigger", "bushatch", "bushatch", "", 0, 0 );
    bhb.require_look_at = 0;
}

dinerhatchbuildable()
{
    dhb = maps\mp\zombies\_zm_buildables::buildable_trigger_think( "diner_hatch_trigger", "dinerhatch", "dinerhatch", "", 1, 0 );
    dhb.require_look_at = 0;
}

cattlecatcherbuildable()
{
    ccb = maps\mp\zombies\_zm_buildables::vehicle_buildable_trigger_think( level.the_bus, "trigger_plow", "cattlecatcher", "cattlecatcher", "", 0, 0 );
    ccb.require_look_at = 0;
    ccb.custom_buildablestub_update_prompt = ::busisonormovingbuildableupdateprompt;
}

papbuildable()
{
    maps\mp\zombies\_zm_buildables::buildable_trigger_think( "pap_buildable_trigger", "pap", "pap", "", 1, 0 );
}

riotshieldbuildable()
{
    maps\mp\zombies\_zm_buildables::buildable_trigger_think( "riotshield_zm_buildable_trigger", "riotshield_zm", "riotshield_zm", &"ZOMBIE_GRAB_RIOTSHIELD", 1, 1 );
}

powerswitchbuildable()
{
    maps\mp\zombies\_zm_buildables::buildable_trigger_think( "powerswitch_buildable_trigger", "powerswitch", "powerswitch", "", 1, 0 );
}

turbinebuildable()
{
    level.turbine_buildable = maps\mp\zombies\_zm_buildables::buildable_trigger_think( "turbine_buildable_trigger", "turbine", "equip_turbine_zm", &"ZOMBIE_GRAB_TURBINE_PICKUP_HINT_STRING", 1, 1 );
}

turretbuildable()
{
    maps\mp\zombies\_zm_buildables::buildable_trigger_think( "turret_buildable_trigger", "turret", "equip_turret_zm", &"ZOMBIE_GRAB_TURRET_PICKUP_HINT_STRING", 1, 1 );
}

electrictrapbuildable()
{
    maps\mp\zombies\_zm_buildables::buildable_trigger_think( "electric_trap_buildable_trigger", "electric_trap", "equip_electrictrap_zm", &"ZOMBIE_GRAB_ELECTRICTRAP", 1, 1 );
}

jetgunbuildable()
{
    level.jetgun_buildable = maps\mp\zombies\_zm_buildables::buildable_trigger_think( "jetgun_zm_buildable_trigger", "jetgun_zm", "jetgun_zm", &"ZOMBIE_GRAB_JETGUN", 1, 1 );
}

ondrop_common( player )
{
/#
    println( "ZM >> Common part callback onDrop()" );
#/
    self droponbus( player );
    self.piece_owner = undefined;
}

onpickup_common( player )
{
/#
    println( "ZM >> Common part callback onPickup()" );
#/
    player playsound( "zmb_buildable_pickup" );
    self pickupfrombus();
    self.piece_owner = player;

    if ( isdefined( self.buildablename ) )
    {
        if ( self.buildablename == "turbine" )
            check_for_buildable_turbine_vox( level.turbine_buildable, 0 );
        else if ( self.buildablename == "jetgun_zm" )
            check_for_buildable_jetgun_vox( level.jetgun_buildable, 0 );
    }
}

onbuyweapon_riotshield( player )
{
    if ( isdefined( player.player_shield_reset_health ) )
        player [[ player.player_shield_reset_health ]]();

    if ( isdefined( player.player_shield_reset_location ) )
        player [[ player.player_shield_reset_location ]]();
}

onuseplantobject_powerswitch( player )
{
/#
    println( "ZM >> PowerSwitch Buildable CallBack onUsePlantObject()" );
#/
    if ( !isdefined( player player_get_buildable_piece() ) )
        return;

    switch ( player player_get_buildable_piece().modelname )
    {
        case "p6_zm_buildable_pswitch_hand":
            getent( "powerswitch_p6_zm_buildable_pswitch_hand", "targetname" ) show();
            break;
        case "p6_zm_buildable_pswitch_body":
            panel = getent( "powerswitch_p6_zm_buildable_pswitch_body", "targetname" );
            panel show();
            break;
        case "p6_zm_buildable_pswitch_lever":
            getent( "powerswitch_p6_zm_buildable_pswitch_lever", "targetname" ) show();
            break;
    }
}

onuseplantobject_turbine( player )
{
/#
    println( "ZM >> Turbine Buildable CallBack onUsePlantObject()" );
#/
    buildable = self.buildablezone;
    first_part = "tag_part_03";
    second_part = "tag_part_02";

    for ( i = 0; i < buildable.pieces.size; i++ )
    {
        if ( buildable.pieces[i].part_name == first_part )
        {
            if ( isdefined( buildable.pieces[i].built ) && buildable.pieces[i].built || player player_get_buildable_piece().part_name == first_part )
            {
                buildable.stub.model showpart( second_part );
                continue;
            }

            buildable.stub.model hidepart( second_part );
        }
    }

    check_for_buildable_turbine_vox( level.turbine_buildable, 1 );
}

check_for_buildable_turbine_vox( stub, start_build_counter )
{
    if ( isdefined( level.maxis_turbine_vox_played ) && level.maxis_turbine_vox_played )
        return;

    buildable = stub.buildablezone;
    piece_counter = 0;
    build_counter = start_build_counter;

    for ( i = 0; i < buildable.pieces.size; i++ )
    {
        if ( isdefined( buildable.pieces[i].built ) && buildable.pieces[i].built || isdefined( buildable.pieces[i].piece_owner ) )
            piece_counter++;

        if ( isdefined( buildable.pieces[i].built ) && buildable.pieces[i].built )
            build_counter++;
    }

    if ( build_counter >= 2 && piece_counter == 3 )
    {
        if ( !flag( "power_on" ) )
        {
            level.maxis_turbine_vox_played = 1;
            level thread maps\mp\zm_transit_sq::maxissay( "vox_maxi_turbine_final_0", stub.origin );
        }
    }
}

onbuyweapon_jetgun( player )
{
    player switchtoweapon( self.stub.weaponname );
}

check_for_buildable_jetgun_vox( stub, start_build_counter )
{
    if ( isdefined( level.rich_jetgun_vox_played ) && level.rich_jetgun_vox_played || !flag( "power_on" ) )
        return;

    buildable = stub.buildablezone;
    piece_counter = 0;
    build_counter = start_build_counter;

    for ( i = 0; i < buildable.pieces.size; i++ )
    {
        if ( isdefined( buildable.pieces[i].built ) && buildable.pieces[i].built || isdefined( buildable.pieces[i].piece_owner ) )
            piece_counter++;

        if ( isdefined( buildable.pieces[i].built ) && buildable.pieces[i].built )
            build_counter++;
    }

    if ( build_counter == 3 && piece_counter == 4 )
        level thread maps\mp\zm_transit_sq::richtofensay( "vox_zmba_sidequest_jet_last_0" );
    else if ( build_counter == 4 )
        level thread maps\mp\zm_transit_sq::richtofensay( "vox_zmba_sidequest_jet_complete_0" );
}

onenduse_sidequestcommon( team, player, result )
{
    if ( isdefined( result ) && result )
    {
        if ( isdefined( level.sq_clip ) )
        {
            level.sq_clip trigger_on();
            level.sq_clip connectpaths();
        }
    }
}

droponbus( player )
{
    if ( isdefined( player ) && ( isdefined( player.isonbus ) && player.isonbus ) )
    {
        self.model linkto( level.the_bus );
        self.linked_to_bus = 1;
        self.unitrigger.link_parent = level.the_bus;
    }
    else
        self.unitrigger.link_parent = undefined;
}

pickupfrombus()
{
    if ( isdefined( self.linked_to_bus ) && self.linked_to_bus )
    {
        if ( isdefined( self.model ) )
            self.model unlink();

        self.linked_to_bus = undefined;
    }

    if ( isdefined( self.unitrigger ) )
        self.unitrigger.link_parent = undefined;
}
