diff --git a/README.md b/README.md index d3e1ca34..a87d4ee0 100644 --- a/README.md +++ b/README.md @@ -471,6 +471,12 @@ * Added Smoke Grenades to the Mystery Box * Added Richtofen Head meat powerup model +#### Docks +* Added Grief game mode +* Wallbuys: M14, Olympia, MP5, Uzi, M1927 +* Perks: Juggernog +* Pack-a-Punch + ### Buried * Power automatically on * Removed Turbine diff --git a/scripts/zm/locs/zm_prison_loc_docks.gsc b/scripts/zm/locs/zm_prison_loc_docks.gsc new file mode 100644 index 00000000..f3c7834d --- /dev/null +++ b/scripts/zm/locs/zm_prison_loc_docks.gsc @@ -0,0 +1,277 @@ +#include maps\mp\zombies\_zm_utility; +#include common_scripts\utility; +#include maps\mp\_utility; +#include maps\mp\zm_prison; +#include maps\mp\zombies\_zm_zonemgr; +#include scripts\zm\locs\loc_common; + +struct_init() +{ + level.struct_class_names[ "targetname" ][ "zm_perk_machine" ] = []; + + scripts\zm\replaced\utility::register_perk_struct( "specialty_armorvest", "zombie_vending_jugg", ( 473.92, 6638.99, 208 ), ( 0, 102, 0 ) ); + scripts\zm\replaced\utility::register_perk_struct( "specialty_weapupgrade", "p6_zm_al_vending_pap_on", ( -1769, 5391, -72 ), ( 0, 100, 0 ) ); + + ind = 0; + respawnpoints = getstructarray( "player_respawn_point", "targetname" ); + for(i = 0; i < respawnpoints.size; i++) + { + if(respawnpoints[i].script_noteworthy == "zone_dock") + { + ind = i; + break; + } + } + + level.struct_class_names[ "script_noteworthy" ][ "initial_spawn" ] = []; + + respawn_array = getstructarray(respawnpoints[ind].target, "targetname"); + i = 0; + foreach(respawn in respawn_array) + { + if (respawn.origin == (-664, 5944, 0)) + { + continue; + } + + script_int = int(i / 2) + 1; + + origin = respawn.origin + (anglesToRight(respawn.angles) * 32); + angles = respawn.angles; + + scripts\zm\replaced\utility::register_map_initial_spawnpoint( origin, angles, script_int ); + + origin = respawn.origin + (anglesToRight(respawn.angles) * -32); + angles = respawn.angles; + + scripts\zm\replaced\utility::register_map_initial_spawnpoint( origin, angles, script_int ); + + i++; + } +} + +precache() +{ + setdvar( "disableLookAtEntityLogic", 1 ); + level.chests = []; + level.chests[0] = getstruct( "dock_chest", "script_noteworthy" ); +} + +main() +{ + enable_zones(); + init_wallbuys(); + init_barriers(); + set_box_weapons(); + disable_zombie_spawn_locations(); + disable_player_spawn_locations(); + create_key_door_unitrigger( 4, 98, 112, 108 ); + level thread open_inner_gate(); + maps\mp\gametypes_zm\_zm_gametype::setup_standard_objects( "cellblock" ); + maps\mp\zombies\_zm_magicbox::treasure_chest_init( "dock_chest" ); + precacheshader( "zm_al_wth_zombie" ); + array_thread( level.zombie_spawners, ::add_spawn_function, maps\mp\zm_alcatraz_grief_cellblock::remove_zombie_hats_for_grief ); + maps\mp\zombies\_zm_ai_brutus::precache(); + maps\mp\zombies\_zm_ai_brutus::init(); + level._effect["butterflies"] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_skull_elec" ); + scripts\zm\locs\loc_common::init(); + level thread maps\mp\zm_alcatraz_traps::init_tower_trap_trigs(); +} + +set_box_weapons() +{ + if(isDefined(level.zombie_weapons["knife_ballistic_zm"])) + { + level.zombie_weapons["knife_ballistic_zm"].is_in_box = 1; + } + if(isDefined(level.zombie_weapons["ray_gun_zm"])) + { + level.zombie_weapons["ray_gun_zm"].is_in_box = 1; + } +} + +enable_zones() +{ + zone_init( "zone_dock" ); + enable_zone( "zone_dock" ); + zone_init( "zone_dock_gondola" ); + enable_zone( "zone_dock_gondola" ); + zone_init( "zone_dock_puzzle" ); + flag_set( "gondola_roof_to_dock" ); +} + +init_wallbuys() +{ + scripts\zm\replaced\utility::wallbuy( "m14_zm", "m14", "weapon_upgrade", ( 305, 6376, 319 ), ( 0, -80, 0 ) ); + scripts\zm\replaced\utility::wallbuy( "rottweil72_zm", "olympia", "weapon_upgrade", ( -709, 5721, -19.875 ), ( 0, -80, 30 ) ); + scripts\zm\replaced\utility::wallbuy( "uzi_zm", "uzi", "weapon_upgrade", ( -219, 7156, 122 ), ( 0, 190, 0 ) ); +} + +init_barriers() +{ + // left + model = spawn( "script_model", (-90.4585, 7669.56, 114.511)); + model.angles = (90, -10, 55); + model setmodel("p6_zm_al_horrific_bed_mattress_3"); + model = spawn( "script_model", (-111.549, 7667.96, 97.125)); + model.angles = (0, 0, 90); + model setmodel("zm_al_kitchen_table_01"); + model = spawn( "script_model", (-113.959, 7638.7, 75.0369)); + model.angles = (6, 0, -6); + model setmodel("afr_corrugated_metal4x8_holes"); + model = spawn( "script_model", (-106.911, 7636.47, 64.125)); + model.angles = (0, 0, 0); + model setmodel("collision_clip_wall_128x128x10"); + + // right + model = spawn( "script_model", (48.6213, 7639.88, 74.125)); + model.angles = (22, -44, 0); + model setmodel("p6_zm_al_infirmary_case"); + model = spawn( "script_model", (44.9895, 7601.56, 81.125)); + model.angles = (-5, -41, -8); + model setmodel("afr_corrugated_metal4x8_holes"); + model = spawn( "script_model", (98.769, 7602.89, 64.125)); + model.angles = (0, -142, 0); + model setmodel("p6_zm_al_desk_small"); + model = spawn( "script_model", (43.2479, 7606.2, 66.125)); + model.angles = (0, -45, 0); + model setmodel("collision_clip_wall_128x128x10"); +} + +disable_zombie_spawn_locations() +{ + for ( z = 0; z < level.zone_keys.size; z++ ) + { + zone = level.zones[ level.zone_keys[ z ] ]; + + i = 0; + while ( i < zone.spawn_locations.size ) + { + if (zone.spawn_locations[i].origin == (615.8, 7875.9, 95)) + { + zone.spawn_locations[i].is_enabled = false; + } + else if (zone.spawn_locations[i].origin == (663.8, 7827.9, 95)) + { + zone.spawn_locations[i].is_enabled = false; + } + + i++; + } + } +} + +disable_player_spawn_locations() +{ + spawn_points = getstructarray( "player_respawn_point", "targetname" ); + foreach(spawn_point in spawn_points) + { + if(spawn_point.script_noteworthy == "zone_citadel_basement") + { + spawn_point.script_noteworthy = "none"; + } + } +} + +create_key_door_unitrigger( piece_num, width, height, length ) +{ + t_key_door = getstruct( "key_door_" + piece_num + "_trigger", "targetname" ); + t_key_door.unitrigger_stub = spawnstruct(); + t_key_door.unitrigger_stub.origin = t_key_door.origin; + t_key_door.unitrigger_stub.angles = t_key_door.angles; + t_key_door.unitrigger_stub.script_unitrigger_type = "unitrigger_box_use"; + t_key_door.unitrigger_stub.hint_string = &"ZM_PRISON_KEY_DOOR_LOCKED"; + t_key_door.unitrigger_stub.cursor_hint = "HINT_NOICON"; + t_key_door.unitrigger_stub.script_width = width; + t_key_door.unitrigger_stub.script_height = height; + t_key_door.unitrigger_stub.script_length = length; + t_key_door.unitrigger_stub.n_door_index = piece_num; + t_key_door.unitrigger_stub.require_look_at = 0; + t_key_door.unitrigger_stub.prompt_and_visibility_func = ::key_door_trigger_visibility; + t_key_door.unitrigger_stub.cost = 2000; + maps\mp\zombies\_zm_unitrigger::register_static_unitrigger( t_key_door.unitrigger_stub, ::master_key_door_trigger_thread ); +} + +key_door_trigger_visibility( player ) +{ + b_is_invis = player.afterlife || isdefined( self.stub.master_key_door_opened ) && self.stub.master_key_door_opened || self.stub.n_door_index == 2 && !flag( "generator_challenge_completed" ); + self setinvisibletoplayer( player, b_is_invis ); + + self sethintstring( &"ZOMBIE_BUTTON_BUY_OPEN_DOOR_2000" ); + + return !b_is_invis; +} + +master_key_door_trigger_thread() +{ + self endon( "death" ); + self endon( "kill_trigger" ); + n_door_index = self.stub.n_door_index; + b_door_open = 0; + + while ( !b_door_open ) + { + self waittill( "trigger", e_triggerer ); + + if ( is_player_valid(e_triggerer) && e_triggerer.score >= self.stub.cost ) + { + e_triggerer maps\mp\zombies\_zm_score::minus_to_player_score( self.stub.cost ); + e_triggerer play_sound_on_ent( "purchase" ); + + self.stub.master_key_door_opened = 1; + self.stub maps\mp\zombies\_zm_unitrigger::run_visibility_function_for_all_triggers(); + level thread open_custom_door_master_key( n_door_index, e_triggerer ); + self playsound( "evt_quest_door_open" ); + b_door_open = 1; + } + } + + level thread maps\mp\zombies\_zm_unitrigger::unregister_unitrigger( self.stub ); +} + +open_custom_door_master_key( n_door_index, e_triggerer ) +{ + m_lock = getent( "masterkey_lock_" + n_door_index, "targetname" ); + m_lock playsound( "zmb_quest_key_unlock" ); + playfxontag( level._effect["fx_alcatraz_unlock_door"], m_lock, "tag_origin" ); + wait 0.5; + m_lock delete(); + + m_gate_01 = getent( "cable_puzzle_gate_01", "targetname" ); + m_gate_01 moveto( m_gate_01.origin + ( -16, 80, 0 ), 0.5 ); + m_gate_01 connectpaths(); + gate_1_monsterclip = getent( "docks_gate_1_monsterclip", "targetname" ); + gate_1_monsterclip.origin += vectorscale( ( 0, 0, 1 ), 256.0 ); + gate_1_monsterclip disconnectpaths(); + gate_1_monsterclip.origin -= vectorscale( ( 0, 0, 1 ), 256.0 ); + + if ( isdefined( e_triggerer ) ) + e_triggerer door_rumble_on_open(); + + m_gate_01 playsound( "zmb_chainlink_open" ); + flag_set( "docks_inner_gate_unlocked" ); + flag_set( "docks_inner_gate_open" ); +} + +door_rumble_on_open() +{ + self endon( "disconnect" ); + level endon( "end_game" ); + self setclientfieldtoplayer( "rumble_door_open", 1 ); + wait_network_frame(); + self setclientfieldtoplayer( "rumble_door_open", 0 ); +} + +open_inner_gate() +{ + m_gate_02 = getent( "cable_puzzle_gate_02", "targetname" ); + + m_gate_02 moveto( m_gate_02.origin + ( -16, 80, 0 ), 0.5 ); + wait( 0.75 ); + m_gate_02 connectpaths(); + gate_2_monsterclip = getent( "docks_gate_2_monsterclip", "targetname" ); + gate_2_monsterclip.origin += vectorscale( ( 0, 0, 1 ), 256.0 ); + gate_2_monsterclip disconnectpaths(); + gate_2_monsterclip.origin -= vectorscale( ( 0, 0, 1 ), 256.0 ); + m_gate_02 playsound( "zmb_chainlink_close" ); +} \ No newline at end of file diff --git a/scripts/zm/replaced/zm_alcatraz_gamemodes.gsc b/scripts/zm/replaced/zm_alcatraz_gamemodes.gsc index 4bf62cdd..7ea49d83 100644 --- a/scripts/zm/replaced/zm_alcatraz_gamemodes.gsc +++ b/scripts/zm/replaced/zm_alcatraz_gamemodes.gsc @@ -13,8 +13,16 @@ init() { level.custom_vending_precaching = maps\mp\zm_prison::custom_vending_precaching; + add_map_gamemode( "zclassic", maps\mp\zm_prison::zclassic_preinit, undefined, undefined ); add_map_gamemode( "zgrief", scripts\zm\replaced\zm_alcatraz_grief_cellblock::zgrief_preinit, undefined, undefined ); + add_map_location_gamemode( "zclassic", "prison", maps\mp\zm_alcatraz_classic::precache, maps\mp\zm_alcatraz_classic::main ); + add_map_location_gamemode( "zgrief", "cellblock", scripts\zm\replaced\zm_alcatraz_grief_cellblock::precache, scripts\zm\replaced\zm_alcatraz_grief_cellblock::main ); + + if (getDvar("ui_zm_mapstartlocation_fake") == "docks") + { + scripts\zm\replaced\utility::add_struct_location_gamemode_func( "zgrief", "cellblock", scripts\zm\locs\zm_prison_loc_docks::struct_init ); + } } \ No newline at end of file diff --git a/scripts/zm/replaced/zm_alcatraz_grief_cellblock.gsc b/scripts/zm/replaced/zm_alcatraz_grief_cellblock.gsc index a4a633ce..a1a1a266 100644 --- a/scripts/zm/replaced/zm_alcatraz_grief_cellblock.gsc +++ b/scripts/zm/replaced/zm_alcatraz_grief_cellblock.gsc @@ -14,7 +14,11 @@ precache() { - + if (getDvar("ui_zm_mapstartlocation_fake") == "docks") + { + scripts\zm\locs\zm_prison_loc_docks::precache(); + return; + } } zgrief_preinit() @@ -99,6 +103,12 @@ grief_treasure_chest_init() main() { + if (getDvar("ui_zm_mapstartlocation_fake") == "docks") + { + scripts\zm\locs\zm_prison_loc_docks::main(); + return; + } + maps\mp\gametypes_zm\_zm_gametype::setup_standard_objects( "cellblock" ); grief_treasure_chest_init(); precacheshader( "zm_al_wth_zombie" ); diff --git a/scripts/zm/replaced/zm_alcatraz_weap_quest.gsc b/scripts/zm/replaced/zm_alcatraz_weap_quest.gsc index aacacdc8..c36a5db2 100644 --- a/scripts/zm/replaced/zm_alcatraz_weap_quest.gsc +++ b/scripts/zm/replaced/zm_alcatraz_weap_quest.gsc @@ -93,6 +93,12 @@ wolf_spit_out_powerup() } } + if (level.scr_zm_map_start_location == "docks") + { + power_origin_struct = spawnStruct(); + power_origin_struct.origin = ( 41.4695, 6096.17, -102.9326 ); + } + spawn_infinite_powerup_drop( power_origin_struct.origin, level.zombie_powerup_array[level.zombie_powerup_index] ); power_ups = get_array_of_closest( power_origin_struct.origin, level.active_powerups, undefined, undefined, 100 ); diff --git a/scripts/zm/zgrief/zgrief_reimagined.gsc b/scripts/zm/zgrief/zgrief_reimagined.gsc index fc7898d4..32ae6b07 100644 --- a/scripts/zm/zgrief/zgrief_reimagined.gsc +++ b/scripts/zm/zgrief/zgrief_reimagined.gsc @@ -2647,7 +2647,7 @@ containment_think() player.obj_waypoint.alpha = 1; - if(level.script == "zm_transit" && level.scr_zm_map_start_location == "power" && zone_name == "zone_trans_8") + if(level.script == "zm_transit" && zone_name == "zone_trans_8") { other_zone = level.zones["zone_pow_warehouse"]; player.obj_waypoint.x = (zone.volumes[0].origin[0] + other_zone.volumes[0].origin[0]) / 2; @@ -2661,6 +2661,11 @@ containment_think() player.obj_waypoint.z = zone.volumes[0].origin[2]; } + if(level.script == "zm_prison" && zone_name == "zone_dock_gondola") + { + player.obj_waypoint.z += 200; + } + player.obj_waypoint setWaypoint(1, "waypoint_revive"); } } @@ -2911,7 +2916,14 @@ containment_get_zones() { if(level.scr_zm_map_start_location == "cellblock") { - containment_zones = array("zone_cellblock_west", "zone_cellblock_west_gondola", "zone_cellblock_west_barber", "zone_cellblock_east", "zone_start", "zone_library", "zone_cafeteria", "zone_warden_office"); + if (getDvar("ui_zm_mapstartlocation_fake") == "docks") + { + containment_zones = array("zone_dock_gondola", "zone_studio", "zone_citadel_basement_building"); + } + else + { + containment_zones = array("zone_cellblock_west", "zone_cellblock_west_gondola", "zone_cellblock_west_barber", "zone_cellblock_east", "zone_start", "zone_library", "zone_cafeteria", "zone_warden_office"); + } } } else if(level.script == "zm_buried") diff --git a/scripts/zm/zgrief/zgrief_reimagined_server.gsc b/scripts/zm/zgrief/zgrief_reimagined_server.gsc index 14cecc40..8e4e04b2 100644 --- a/scripts/zm/zgrief/zgrief_reimagined_server.gsc +++ b/scripts/zm/zgrief/zgrief_reimagined_server.gsc @@ -54,9 +54,6 @@ precache_map_images() preCacheShader("loadscreen_zm_transit_zgrief_transit"); preCacheShader("loadscreen_zm_transit_zgrief_farm"); preCacheShader("loadscreen_zm_transit_zgrief_town"); - preCacheShader("loadscreen_zm_transit_zgrief_power"); - preCacheShader("loadscreen_zm_transit_zgrief_tunnel"); - preCacheShader("loadscreen_zm_transit_zgrief_cornfield"); preCacheShader("loadscreen_zm_transit_dr_zcleansed_diner"); preCacheShader("loadscreen_zm_prison_zgrief_cellblock"); preCacheShader("loadscreen_zm_buried_zgrief_street"); @@ -567,6 +564,14 @@ get_image_for_loc(mapname, locname) { return "loadscreen_zm_transit_dr_zcleansed_diner"; } + else if (locname == "power" || locname == "tunnel" || locname == "cornfield") + { + return "loadscreen_zm_transit_zgrief_transit"; + } + else if (locname == "docks") + { + return "loadscreen_zm_prison_zgrief_cellblock"; + } return "loadscreen_" + mapname + "_zgrief_" + locname; } \ No newline at end of file diff --git a/scripts/zm/zm_prison/zm_prison_reimagined.gsc b/scripts/zm/zm_prison/zm_prison_reimagined.gsc index 3595b49f..69a239f0 100644 --- a/scripts/zm/zm_prison/zm_prison_reimagined.gsc +++ b/scripts/zm/zm_prison/zm_prison_reimagined.gsc @@ -2,6 +2,7 @@ #include common_scripts\utility; #include maps\mp\zombies\_zm_utility; #include maps\mp\zombies\_zm_craftables; +#include maps\mp\zombies\_zm_zonemgr; #include maps\mp\zm_alcatraz_utility; #include scripts\zm\replaced\zm_alcatraz_classic; @@ -41,6 +42,8 @@ init() level.zombie_powerups["meat_stink"].model_name = "t6_wpn_zmb_severedhead_world"; + add_adjacent_zone( "zone_dock", "zone_dock_puzzle", "always_on" ); // "docks_inner_gate_unlocked" + remove_acid_trap_player_spawn(); tower_trap_changes();