diff --git a/scripts/zm/_zm_reimagined.gsc b/scripts/zm/_zm_reimagined.gsc index 7ec6296c..23755b24 100644 --- a/scripts/zm/_zm_reimagined.gsc +++ b/scripts/zm/_zm_reimagined.gsc @@ -490,6 +490,7 @@ health_bar_hud() x = 5; y = -104; + if (level.script == "zm_buried") { y -= 25; @@ -580,6 +581,7 @@ shield_bar_hud() x = 5; y = -104; + if (level.script == "zm_buried") { y -= 25; @@ -655,6 +657,7 @@ shield_bar_hud() } health = level.zombie_vars["riotshield_hit_points"] - self.shielddamagetaken; + if (health < 0) { health = 0; @@ -664,6 +667,7 @@ shield_bar_hud() offset_x = 0; health_str = "" + self.health; + for(i = 0; i < health_str.size; i++) { if (health_str[i] == "1") @@ -722,6 +726,7 @@ enemy_counter_hud() while (1) { enemies = get_round_enemy_array().size + level.zombie_total; + if (level flag_exists("spawn_ghosts") && flag("spawn_ghosts")) { enemies = get_current_ghost_count(); @@ -970,6 +975,7 @@ zone_hud() x = 5; y = -119; + if (level.script == "zm_buried") { y -= 25; @@ -2101,6 +2107,7 @@ bleedout_bar_hud_updatebar(hud) for(i = 0; i < vars["num_intervals"]; i++) { vars["time"] = vars["bleedout_time"]; + if(vars["time"] > vars["interval_time"]) { vars["time"] = vars["interval_time"]; @@ -2109,6 +2116,7 @@ bleedout_bar_hud_updatebar(hud) vars["frac"] = 0.99 - ((i + 1) * vars["interval_frac"]); barwidth = int((hud.width * vars["frac"]) + 0.5); + if(barwidth < 1) { barwidth = 1; @@ -2169,6 +2177,7 @@ last_stand_pistol_swap() else if ( self.laststandpistol == "ray_gun_zm" || self.laststandpistol == "ray_gun_upgraded_zm" || self.laststandpistol == "raygun_mark2_zm" || self.laststandpistol == "raygun_mark2_upgraded_zm" || self.laststandpistol == level.default_solo_laststandpistol ) { amt = ammoclip; + if ( self.hadpistol && amt > self.stored_weapon_info[self.laststandpistol].total_amt ) { amt = self.stored_weapon_info[self.laststandpistol].total_amt; @@ -2179,6 +2188,7 @@ last_stand_pistol_swap() else { amt = ammoclip + doubleclip; + if ( self.hadpistol && amt > self.stored_weapon_info[self.laststandpistol].total_amt ) { amt = self.stored_weapon_info[self.laststandpistol].total_amt; @@ -2203,6 +2213,7 @@ last_stand_pistol_swap() } clip_amt_add = weaponclipsize( self.laststandpistol ) - clip_amt_init; + if ( clip_amt_add > amt ) { clip_amt_add = amt; @@ -2215,6 +2226,7 @@ last_stand_pistol_swap() if ( dual_wield_wep != "none" ) { left_clip_amt_add = weaponclipsize( dual_wield_wep ) - left_clip_amt_init; + if ( left_clip_amt_add > amt ) { left_clip_amt_add = amt; @@ -2226,6 +2238,7 @@ last_stand_pistol_swap() } stock_amt = doubleclip; + if ( stock_amt > amt ) { stock_amt = amt; @@ -2239,6 +2252,7 @@ last_stand_pistol_swap() last_stand_restore_pistol_ammo(only_store_info = false) { self.weapon_taken_by_losing_specialty_additionalprimaryweapon = undefined; + if ( !isDefined( self.stored_weapon_info ) ) { return; @@ -2247,9 +2261,11 @@ last_stand_restore_pistol_ammo(only_store_info = false) weapon_inventory = self getweaponslist( 1 ); weapon_to_restore = getarraykeys( self.stored_weapon_info ); i = 0; + while ( i < weapon_inventory.size ) { weapon = weapon_inventory[ i ]; + if(weapon != self.laststandpistol) { i++; @@ -2259,6 +2275,7 @@ last_stand_restore_pistol_ammo(only_store_info = false) for ( j = 0; j < weapon_to_restore.size; j++ ) { check_weapon = weapon_to_restore[ j ]; + if ( weapon == check_weapon ) { if (self.stored_weapon_info[ weapon ].given_amt == 0) @@ -2277,10 +2294,12 @@ last_stand_restore_pistol_ammo(only_store_info = false) last_clip = self getweaponammoclip( weapon ); last_left_clip = 0; + if( "none" != dual_wield_name ) { last_left_clip = self getweaponammoclip( dual_wield_name ); } + last_stock = self getweaponammostock( weapon ); last_total = last_clip + last_left_clip + last_stock; @@ -2348,6 +2367,7 @@ last_stand_restore_pistol_ammo(only_store_info = false) break; } } + i++; } } @@ -2412,6 +2432,7 @@ set_lethal_grenade_init() swap_staminup_perk() { vending_triggers = getentarray("zombie_vending", "targetname"); + foreach (trigger in vending_triggers) { if (trigger.script_noteworthy == "specialty_longersprint") @@ -2584,6 +2605,7 @@ disable_bank_teller() { level notify( "stop_bank_teller" ); bank_teller_dmg_trig = getent( "bank_teller_tazer_trig", "targetname" ); + if(IsDefined(bank_teller_dmg_trig)) { bank_teller_transfer_trig = getent( bank_teller_dmg_trig.target, "targetname" ); @@ -2651,6 +2673,7 @@ add_wallbuy( name, script_noteworthy ) spawnable_weapon_spawns = arraycombine( spawnable_weapon_spawns, getstructarray( "tazer_upgrade", "targetname" ), 1, 0 ); spawnable_weapon_spawns = arraycombine( spawnable_weapon_spawns, getstructarray( "buildable_wallbuy", "targetname" ), 1, 0 ); spawnable_weapon_spawns = arraycombine( spawnable_weapon_spawns, getstructarray( "claymore_purchase", "targetname" ), 1, 0 ); + for(i = 0; i < spawnable_weapon_spawns.size; i++) { if(IsDefined(spawnable_weapon_spawns[i].zombie_weapon_upgrade) && spawnable_weapon_spawns[i].zombie_weapon_upgrade == name) @@ -2661,6 +2684,7 @@ add_wallbuy( name, script_noteworthy ) } struct = spawnable_weapon_spawns[i]; + break; } } @@ -2777,6 +2801,7 @@ weapon_inspect_watcher() vars["curr_wep"] = self getCurrentWeapon(); vars["is_primary"] = 0; + foreach(wep in self getWeaponsListPrimaries()) { if(wep == vars["curr_wep"]) @@ -2866,6 +2891,7 @@ buildbuildables() buildbuildable( buildable, craft = 0, solo_pool = 0, onuse ) { player = get_players()[0]; + foreach (stub in level.buildable_stubs) { if ( !isDefined( buildable ) || stub.equipname == buildable ) @@ -3029,10 +3055,12 @@ removebuildable( buildable, poolname ) if ( isDefined( buildable ) || stub.persistent != 3 ) { stub maps\mp\zombies\_zm_buildables::buildablestub_remove(); + foreach (piece in stub.buildablezone.pieces) { piece maps\mp\zombies\_zm_buildables::piece_unspawn(); } + maps\mp\zombies\_zm_unitrigger::unregister_unitrigger( stub ); return; } @@ -3116,6 +3144,7 @@ buildcraftables() takecraftableparts( buildable ) { player = get_players()[ 0 ]; + foreach (stub in level.zombie_include_craftables) { if ( stub.name == buildable ) @@ -3123,6 +3152,7 @@ takecraftableparts( buildable ) foreach (piece in stub.a_piecestubs) { piecespawn = piece.piecespawn; + if ( isDefined( piecespawn ) ) { player player_take_piece( piecespawn ); @@ -3137,6 +3167,7 @@ takecraftableparts( buildable ) buildcraftable( buildable ) { player = get_players()[ 0 ]; + foreach (stub in level.a_uts_craftables) { if ( stub.craftablestub.name == buildable ) @@ -3144,6 +3175,7 @@ buildcraftable( buildable ) foreach (piece in stub.craftablespawn.a_piecespawns) { piecespawn = get_craftable_piece( stub.craftablestub.name, piece.piecename ); + if ( isDefined( piecespawn ) ) { player player_take_piece( piecespawn ); @@ -3216,11 +3248,14 @@ piece_unspawn() { self.model delete(); } + self.model = undefined; + if ( isDefined( self.unitrigger ) ) { thread maps\mp\zombies\_zm_unitrigger::unregister_unitrigger( self.unitrigger ); } + self.unitrigger = undefined; } @@ -3231,10 +3266,12 @@ remove_buildable_pieces( buildable_name ) if(IsDefined(buildable.name) && buildable.name == buildable_name) { pieces = buildable.buildablepieces; + for(i = 0; i < pieces.size; i++) { pieces[i] maps\mp\zombies\_zm_buildables::piece_unspawn(); } + return; } } @@ -3380,6 +3417,7 @@ tombstone_emp() while ( 1 ) { level waittill( "emp_detonate", origin, radius ); + if ( distancesquared( origin, self.origin ) < ( radius * radius ) ) { playfx( level._effect[ "powerup_off" ], self.origin ); @@ -3425,6 +3463,7 @@ tombstone_grab() { players = get_players(); i = 0; + while ( i < players.size ) { if ( players[ i ].is_zombie ) @@ -3437,6 +3476,7 @@ tombstone_grab() if ( isDefined( self.player ) && players[ i ] == self.player ) { dist = distance( players[ i ].origin, self.origin ); + if ( dist < 64 ) { playfx( level._effect[ "powerup_grabbed_solo" ], self.origin ); @@ -3454,8 +3494,10 @@ tombstone_grab() } } } + i++; } + wait_network_frame(); } } @@ -3504,20 +3546,24 @@ tombstone_save() alt_wep = weaponAltWeaponName(wep); clip_missing = weaponClipSize(wep) - self.tombstone_savedweapon_weaponsammo_clip[i]; + if (clip_missing > self.tombstone_savedweapon_weaponsammo_stock[i]) { clip_missing = self.tombstone_savedweapon_weaponsammo_stock[i]; } + self.tombstone_savedweapon_weaponsammo_clip[i] += clip_missing; self.tombstone_savedweapon_weaponsammo_stock[i] -= clip_missing; if (dualwield_wep != "none") { clip_dualwield_missing = weaponClipSize(dualwield_wep) - self.tombstone_savedweapon_weaponsammo_clip_dualwield[i]; + if (clip_dualwield_missing > self.tombstone_savedweapon_weaponsammo_stock[i]) { clip_dualwield_missing = self.tombstone_savedweapon_weaponsammo_stock[i]; } + self.tombstone_savedweapon_weaponsammo_clip_dualwield[i] += clip_dualwield_missing; self.tombstone_savedweapon_weaponsammo_stock[i] -= clip_dualwield_missing; } @@ -3525,10 +3571,12 @@ tombstone_save() if (alt_wep != "none") { clip_alt_missing = weaponClipSize(alt_wep) - self.tombstone_savedweapon_weaponsammo_clip_alt[i]; + if (clip_alt_missing > self.tombstone_savedweapon_weaponsammo_stock_alt[i]) { clip_alt_missing = self.tombstone_savedweapon_weaponsammo_stock_alt[i]; } + self.tombstone_savedweapon_weaponsammo_clip_alt[i] += clip_alt_missing; self.tombstone_savedweapon_weaponsammo_stock_alt[i] -= clip_alt_missing; } @@ -3558,34 +3606,42 @@ tombstone_save() tombstone_save_perks( ent ) { perk_array = []; + if ( ent hasperk( "specialty_armorvest" ) ) { perk_array[ perk_array.size ] = "specialty_armorvest"; } + if ( ent hasperk( "specialty_deadshot" ) ) { perk_array[ perk_array.size ] = "specialty_deadshot"; } + if ( ent hasperk( "specialty_fastreload" ) ) { perk_array[ perk_array.size ] = "specialty_fastreload"; } + if ( ent hasperk( "specialty_flakjacket" ) ) { perk_array[ perk_array.size ] = "specialty_flakjacket"; } + if ( ent hasperk( "specialty_movefaster" ) ) { perk_array[ perk_array.size ] = "specialty_movefaster"; } + if ( ent hasperk( "specialty_quickrevive" ) ) { perk_array[ perk_array.size ] = "specialty_quickrevive"; } + if ( ent hasperk( "specialty_rof" ) ) { perk_array[ perk_array.size ] = "specialty_rof"; } + return perk_array; } @@ -3597,6 +3653,7 @@ tombstone_give() } primary_weapons = self getWeaponsListPrimaries(); + foreach(weapon in primary_weapons) { self takeWeapon(weapon); @@ -3609,6 +3666,7 @@ tombstone_give() primary_weapons_returned = 0; i = 0; + while ( i < self.tombstone_savedweapon_weapons.size ) { if ( isdefined( self.tombstone_savedweapon_grenades ) && self.tombstone_savedweapon_weapons[ i ] == self.tombstone_savedweapon_grenades || ( isdefined( self.tombstone_savedweapon_tactical ) && self.tombstone_savedweapon_weapons[ i ] == self.tombstone_savedweapon_tactical ) ) @@ -3720,10 +3778,12 @@ tombstone_give() } current_wep = self getCurrentWeapon(); + if(!isSubStr(current_wep, "perk_bottle") && !isSubStr(current_wep, "knuckle_crack") && !isSubStr(current_wep, "flourish") && !isSubStr(current_wep, "item_meat")) { switched = 0; primaries = self getweaponslistprimaries(); + foreach ( weapon in primaries ) { if ( isDefined( self.tombstone_savedweapon_currentweapon ) && self.tombstone_savedweapon_currentweapon == weapon ) @@ -3745,6 +3805,7 @@ tombstone_give() if ( isDefined( self.tombstone_perks ) && self.tombstone_perks.size > 0 ) { i = 0; + while ( i < self.tombstone_perks.size ) { if ( self hasperk( self.tombstone_perks[ i ] ) ) @@ -3866,12 +3927,14 @@ additionalprimaryweapon_stowed_weapon_refill() if(self hasPerk("specialty_additionalprimaryweapon")) { vars["curr_wep"] = self getCurrentWeapon(); + if(vars["curr_wep"] == "none") { continue; } primaries = self getWeaponsListPrimaries(); + foreach(primary in primaries) { if(primary != maps\mp\zombies\_zm_weapons::get_nonalternate_weapon(vars["curr_wep"])) @@ -3941,6 +4004,7 @@ refill_after_time(primary) self setWeaponAmmoStock(primary, vars["ammo_stock"] - vars["missing_clip"]); vars["dw_primary"] = weaponDualWieldWeaponName(primary); + if(vars["dw_primary"] != "none") { vars["ammo_clip"] = self getWeaponAmmoClip(vars["dw_primary"]); @@ -3957,6 +4021,7 @@ refill_after_time(primary) } vars["alt_primary"] = weaponAltWeaponName(primary); + if(vars["alt_primary"] != "none") { vars["ammo_clip"] = self getWeaponAmmoClip(vars["alt_primary"]); @@ -4044,6 +4109,7 @@ remove_status_icons_on_intermission() level waittill("intermission"); players = get_players(); + foreach(player in players) { player.statusicon = ""; diff --git a/scripts/zm/locs/loc_common.gsc b/scripts/zm/locs/loc_common.gsc index f083614b..5ffa5653 100644 --- a/scripts/zm/locs/loc_common.gsc +++ b/scripts/zm/locs/loc_common.gsc @@ -29,6 +29,7 @@ init() enemy_location_override( zombie, enemy ) { location = enemy.origin; + if ( is_true( self.reroute ) ) { if ( isDefined( self.reroute_origin ) ) @@ -36,5 +37,6 @@ enemy_location_override( zombie, enemy ) location = self.reroute_origin; } } + return location; } \ No newline at end of file diff --git a/scripts/zm/locs/zm_buried_loc_maze.gsc b/scripts/zm/locs/zm_buried_loc_maze.gsc index c0538651..d6f7a2fc 100644 --- a/scripts/zm/locs/zm_buried_loc_maze.gsc +++ b/scripts/zm/locs/zm_buried_loc_maze.gsc @@ -60,6 +60,7 @@ struct_init() for (i = 0; i < og_perk_structs.size; i++) { rand = randomint(og_perk_structs.size); + if (rand != i) { temp_script_noteworthy = og_perk_structs[i].script_noteworthy; @@ -111,6 +112,7 @@ struct_init() else if (player_respawn_point.script_noteworthy == "zone_maze_staircase") { spawn_array = getstructarray( player_respawn_point.target, "targetname" ); + foreach (spawn in spawn_array) { if (spawn.origin[0] > 5950) @@ -237,6 +239,7 @@ init_wallbuys() { og_weapon_structs = []; structs = getstructarray( "weapon_upgrade", "targetname" ); + foreach (struct in structs) { if (isDefined(struct.script_noteworthy) && isSubStr(struct.script_noteworthy, "maze")) @@ -269,6 +272,7 @@ init_barriers() scripts\zm\replaced\utility::barrier( "collision_geo_64x64x128_standard", (3398, 898, 372), (0, 0, 0) ); structs = getstructarray( "zm_perk_machine", "targetname" ); + foreach (struct in structs) { scripts\zm\replaced\utility::barrier( "collision_geo_64x64x128_standard", struct.origin + (anglesToRight(struct.angles) * -9) + (0, 0, 320), struct.angles ); diff --git a/scripts/zm/locs/zm_prison_loc_docks.gsc b/scripts/zm/locs/zm_prison_loc_docks.gsc index 1c380724..f31ce6c5 100644 --- a/scripts/zm/locs/zm_prison_loc_docks.gsc +++ b/scripts/zm/locs/zm_prison_loc_docks.gsc @@ -119,6 +119,7 @@ set_box_weapons() { level.zombie_weapons["thompson_zm"].is_in_box = 0; } + if(isDefined(level.zombie_weapons["beretta93r_zm"])) { level.zombie_weapons["beretta93r_zm"].is_in_box = 1; @@ -177,6 +178,7 @@ disable_zombie_spawn_locations() 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)) @@ -196,6 +198,7 @@ disable_zombie_spawn_locations() disable_gondola_call_triggers() { t_call_triggers = getentarray( "gondola_call_trigger", "targetname" ); + foreach ( trigger in t_call_triggers ) { trigger delete(); @@ -205,6 +208,7 @@ disable_gondola_call_triggers() disable_craftable_triggers() { t_crafting_table = getentarray( "open_craftable_trigger", "targetname" ); + foreach ( trigger in t_crafting_table ) { trigger delete(); @@ -214,6 +218,7 @@ disable_craftable_triggers() disable_afterlife_props() { a_afterlife_props = getentarray( "afterlife_show", "targetname" ); + foreach ( m_prop in a_afterlife_props ) { m_prop delete(); @@ -223,6 +228,7 @@ disable_afterlife_props() turn_afterlife_interacts_on() { a_afterlife_interact = getentarray( "afterlife_interact", "targetname" ); + foreach ( model in a_afterlife_interact ) { if ( model.script_string == "juggernog_on" ) diff --git a/scripts/zm/locs/zm_transit_loc_cornfield.gsc b/scripts/zm/locs/zm_transit_loc_cornfield.gsc index ee8333dd..a0224fcd 100644 --- a/scripts/zm/locs/zm_transit_loc_cornfield.gsc +++ b/scripts/zm/locs/zm_transit_loc_cornfield.gsc @@ -15,6 +15,7 @@ struct_init() zone_respawnpoints = []; respawnpoints = maps\mp\gametypes_zm\_zm_gametype::get_player_spawns_for_gametype(); + for (i = 0; i < respawnpoints.size; i++) { if (isDefined(respawnpoints[i].script_noteworthy) && respawnpoints[i].script_noteworthy == "zone_amb_cornfield") @@ -37,6 +38,7 @@ struct_init() scripts\zm\replaced\utility::register_map_spawn_group( zone_respawnpoints[zone].origin, zone, zone_respawnpoints[zone].script_int ); respawn_array = getstructarray(zone_respawnpoints[zone].target, "targetname"); + foreach(respawn in respawn_array) { scripts\zm\replaced\utility::register_map_spawn( respawn.origin + (100, 0, 0), respawn.angles, zone, respawn.script_int ); @@ -55,6 +57,7 @@ struct_init() scripts\zm\replaced\utility::register_map_spawn( (10036, -967, -186), (0, 0, 0), zone ); structs = getstructarray( "game_mode_object", "targetname" ); + foreach ( struct in structs ) { if ( isDefined( struct.script_noteworthy ) && struct.script_noteworthy == "cornfield" ) @@ -240,6 +243,7 @@ disable_zombie_spawn_locations() zone = level.zones[ level.zone_keys[ z ] ]; i = 0; + while ( i < zone.spawn_locations.size ) { if (zone.spawn_locations[i].origin[0] <= 9700) diff --git a/scripts/zm/locs/zm_transit_loc_diner.gsc b/scripts/zm/locs/zm_transit_loc_diner.gsc index b05bd0fc..5460997d 100644 --- a/scripts/zm/locs/zm_transit_loc_diner.gsc +++ b/scripts/zm/locs/zm_transit_loc_diner.gsc @@ -16,6 +16,7 @@ struct_init() ind = 0; respawnpoints = maps\mp\gametypes_zm\_zm_gametype::get_player_spawns_for_gametype(); + for(i = 0; i < respawnpoints.size; i++) { if(respawnpoints[i].script_noteworthy == "zone_gas") @@ -29,6 +30,7 @@ struct_init() scripts\zm\replaced\utility::register_map_spawn_group( respawnpoints[ind].origin, zone, respawnpoints[ind].script_int ); respawn_array = getstructarray(respawnpoints[ind].target, "targetname"); + foreach(respawn in respawn_array) { if(respawn.script_int == 2) @@ -64,6 +66,7 @@ struct_init() scripts\zm\replaced\utility::register_map_spawn( (-5895, -6984, -30), (0, 0, 0), zone ); gameObjects = getEntArray( "script_model", "classname" ); + foreach ( object in gameObjects ) { if ( isDefined( object.script_noteworthy ) && object.script_noteworthy == getDvar( "ui_zm_mapstartlocation" ) ) @@ -188,6 +191,7 @@ disable_zombie_spawn_locations() zone = level.zones[ level.zone_keys[ z ] ]; i = 0; + while ( i < zone.spawn_locations.size ) { if ( zone.spawn_locations[ i ].targetname == "zone_trans_diner_spawners") diff --git a/scripts/zm/locs/zm_transit_loc_power.gsc b/scripts/zm/locs/zm_transit_loc_power.gsc index 6e19ac48..2ab09c62 100644 --- a/scripts/zm/locs/zm_transit_loc_power.gsc +++ b/scripts/zm/locs/zm_transit_loc_power.gsc @@ -19,6 +19,7 @@ struct_init() ind = 0; respawnpoints = maps\mp\gametypes_zm\_zm_gametype::get_player_spawns_for_gametype(); + for(i = 0; i < respawnpoints.size; i++) { if(respawnpoints[i].script_noteworthy == "zone_prr") @@ -44,9 +45,11 @@ struct_init() scripts\zm\replaced\utility::register_map_spawn_group( respawnpoints[ind].origin, zone, respawnpoints[ind].script_int ); respawn_array = getstructarray(respawnpoints[ind].target, "targetname"); + foreach(respawn in respawn_array) { angles = respawn.angles; + if (respawn.origin[0] < 12200) { angles += (0, 90, 0); @@ -164,6 +167,7 @@ disable_zombie_spawn_locations() disable_player_spawn_locations() { respawnpoints = maps\mp\gametypes_zm\_zm_gametype::get_player_spawns_for_gametype(); + foreach (respawnpoint in respawnpoints) { if (respawnpoint.script_noteworthy == "zone_pow_warehouse") diff --git a/scripts/zm/locs/zm_transit_loc_tunnel.gsc b/scripts/zm/locs/zm_transit_loc_tunnel.gsc index 97315142..cc0922fa 100644 --- a/scripts/zm/locs/zm_transit_loc_tunnel.gsc +++ b/scripts/zm/locs/zm_transit_loc_tunnel.gsc @@ -98,6 +98,7 @@ disable_zombie_spawn_locations() zone = level.zones[ level.zone_keys[ z ] ]; i = 0; + while ( i < zone.spawn_locations.size ) { if ( zone.spawn_locations[ i ].origin == ( -11447, -3424, 254.2 ) ) diff --git a/scripts/zm/replaced/_globallogic_ui.gsc b/scripts/zm/replaced/_globallogic_ui.gsc index 5b122926..031586a3 100644 --- a/scripts/zm/replaced/_globallogic_ui.gsc +++ b/scripts/zm/replaced/_globallogic_ui.gsc @@ -41,6 +41,7 @@ get_assigned_team() teamplayers["allies"] = 0; players = get_players(); + foreach ( player in players ) { if ( !isDefined(player.team) || (player.team != "axis" && player.team != "allies") ) @@ -59,6 +60,7 @@ get_assigned_team() if ( teamplayers["axis"] <= teamplayers["allies"] ) { guids = strTok(getDvar("team_axis"), " "); + foreach ( guid in guids ) { if ( self getguid() == int(guid) ) @@ -66,6 +68,7 @@ get_assigned_team() arrayRemoveValue(guids, guid); guid_text = ""; + foreach (guid in guids) { guid_text += guid + " "; @@ -81,6 +84,7 @@ get_assigned_team() if ( teamplayers["allies"] <= teamplayers["axis"] ) { guids = strTok(getDvar("team_allies"), " "); + foreach ( guid in guids ) { if ( self getguid() == int(guid) ) @@ -88,6 +92,7 @@ get_assigned_team() arrayRemoveValue(guids, guid); guid_text = ""; + foreach (guid in guids) { guid_text += guid + " "; diff --git a/scripts/zm/replaced/_zm.gsc b/scripts/zm/replaced/_zm.gsc index bbf70d29..63a01e81 100644 --- a/scripts/zm/replaced/_zm.gsc +++ b/scripts/zm/replaced/_zm.gsc @@ -329,6 +329,7 @@ round_think( restart = 0 ) if (!is_gametype_active("zgrief")) { level.player_starting_points = (level.round_number + 1) * 500; + if (level.player_starting_points > 10000) { level.player_starting_points = 10000; @@ -459,6 +460,7 @@ spectators_respawn() thread refresh_player_navcard_hud(); new_score = (level.round_number + 1) * 250; + if (new_score > 1500) { new_score = 1500; @@ -610,6 +612,7 @@ fade_out_intro_screen_zm( hold_black_time, fade_out_time, destroyed_afterwards ) level.passed_introscreen = 1; players = get_players(); + foreach (player in players) { player setclientuivisibilityflag( "hud_visible", 1 ); @@ -627,6 +630,7 @@ fade_out_intro_screen_zm( hold_black_time, fade_out_time, destroyed_afterwards ) } players = get_players(); + for ( i = 0; i < players.size; i++ ) { if ( !( isdefined( level.host_ended_game ) && level.host_ended_game ) ) @@ -667,6 +671,7 @@ wait_for_all_players_ready() } num_players = get_number_of_waiting_players(); + while ( num_players < level.pregame_minplayers ) { if (is_gametype_active("zgrief")) @@ -675,6 +680,7 @@ wait_for_all_players_ready() } players = get_players(); + foreach ( player in players ) { if ( is_true( player.afterlife ) ) @@ -688,6 +694,7 @@ wait_for_all_players_ready() num_waiting_for = level.pregame_minplayers - num_players; players_str = "PLAYERS"; + if ( num_waiting_for == 1 ) { players_str = "PLAYER"; @@ -813,6 +820,7 @@ wait_for_all_players_ready() num_waiting_for = players.size - num_ready; players_str = "PLAYERS"; + if ( num_waiting_for == 1 ) { players_str = "PLAYER"; @@ -1044,6 +1052,7 @@ last_stand_best_pistol() ammo_count = self getammocount( current_weapons[i] ); dual_wield_name = weapondualwieldweaponname( current_weapons[i] ); + if ( dual_wield_name != "none" ) { ammo_count += self getweaponammoclip( dual_wield_name ); @@ -1105,6 +1114,7 @@ can_track_ammo( weap ) case "alcatraz_shield_zm": case "tomb_shield_zm": return false; + default: if ( is_melee_weapon( weap ) || is_zombie_perk_bottle( weap ) || is_placeable_mine( weap ) || is_equipment( weap ) || issubstr( weap, "knife_ballistic_" ) || getsubstr( weap, 0, 3 ) == "gl_" || weaponfuellife( weap ) > 0 || weap == level.revive_tool ) return false; @@ -1144,20 +1154,24 @@ take_additionalprimaryweapon() alt_name = weaponAltWeaponName(name); clip_missing = weaponClipSize(name) - self.a_saved_weapon["clip"]; + if (clip_missing > self.a_saved_weapon["stock"]) { clip_missing = self.a_saved_weapon["stock"]; } + self.a_saved_weapon["clip"] += clip_missing; self.a_saved_weapon["stock"] -= clip_missing; if (dw_name != "none") { clip_dualwield_missing = weaponClipSize(dw_name) - self.a_saved_weapon["lh_clip"]; + if (clip_dualwield_missing > self.a_saved_weapon["stock"]) { clip_dualwield_missing = self.a_saved_weapon["stock"]; } + self.a_saved_weapon["lh_clip"] += clip_dualwield_missing; self.a_saved_weapon["stock"] -= clip_dualwield_missing; } @@ -1165,10 +1179,12 @@ take_additionalprimaryweapon() if (alt_name != "none") { clip_alt_missing = weaponClipSize(alt_name) - self.a_saved_weapon["alt_clip"]; + if (clip_alt_missing > self.a_saved_weapon["alt_stock"]) { clip_alt_missing = self.a_saved_weapon["alt_stock"]; } + self.a_saved_weapon["alt_clip"] += clip_alt_missing; self.a_saved_weapon["alt_stock"] -= clip_alt_missing; } @@ -1516,6 +1532,7 @@ callback_playerdamage( einflictor, eattacker, idamage, idflags, smeansofdeath, s if ( isDefined( eattacker ) && isplayer( eattacker ) && eattacker.sessionteam == self.sessionteam && !eattacker hasperk( "specialty_noname" ) && isDefined( self.is_zombie ) && !self.is_zombie ) { self maps\mp\zombies\_zm::process_friendly_fire_callbacks( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime, boneindex ); + if ( self != eattacker ) { return; @@ -1525,10 +1542,12 @@ callback_playerdamage( einflictor, eattacker, idamage, idflags, smeansofdeath, s return; } } + if ( is_true( level.pers_upgrade_insta_kill ) ) { self maps\mp\zombies\_zm_pers_upgrades_functions::pers_insta_kill_melee_swipe( smeansofdeath, eattacker ); } + if ( isDefined( self.overrideplayerdamage ) ) { idamage = self [[ self.overrideplayerdamage ]]( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime ); @@ -1537,20 +1556,24 @@ callback_playerdamage( einflictor, eattacker, idamage, idflags, smeansofdeath, s { idamage = self [[ level.overrideplayerdamage ]]( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime ); } + if ( is_true( self.magic_bullet_shield ) ) { maxhealth = self.maxhealth; self.health += idamage; self.maxhealth = maxhealth; } + if ( isDefined( self.divetoprone ) && self.divetoprone == 1 ) { if ( smeansofdeath == "MOD_GRENADE_SPLASH" ) { dist = distance2d( vpoint, self.origin ); + if ( dist > 32 ) { dot_product = vectordot( anglesToForward( self.angles ), vdir ); + if ( dot_product > 0 ) { idamage = int( idamage * 0.5 ); @@ -1558,6 +1581,7 @@ callback_playerdamage( einflictor, eattacker, idamage, idflags, smeansofdeath, s } } } + if ( isDefined( level.prevent_player_damage ) ) { if ( self [[ level.prevent_player_damage ]]( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime ) ) @@ -1565,7 +1589,9 @@ callback_playerdamage( einflictor, eattacker, idamage, idflags, smeansofdeath, s return; } } + idflags |= level.idflags_no_knockback; + if ( idamage > 0 && shitloc == "riotshield" ) { shitloc = "torso_upper"; @@ -1587,6 +1613,7 @@ getfreespawnpoint( spawnpoints, player ) { game[ "spawns_randomized" ] = 1; random_chance = randomint( 100 ); + if ( random_chance > 50 ) { set_game_var( "side_selection", 1 ); @@ -1598,6 +1625,7 @@ getfreespawnpoint( spawnpoints, player ) } side_selection = get_game_var( "side_selection" ); + if ( get_game_var( "switchedsides" ) ) { if ( side_selection == 2 ) @@ -1616,6 +1644,7 @@ getfreespawnpoint( spawnpoints, player ) if ( isdefined( player ) && isdefined( player.team ) ) { i = 0; + while ( isdefined( spawnpoints ) && i < spawnpoints.size ) { if ( side_selection == 1 ) @@ -1741,6 +1770,7 @@ check_for_valid_spawn_near_team( revivee, return_struct ) if ( spawn_points[ j ].locked == 0 ) { plyr_dist = distancesquared( players[ i ].origin, spawn_points[ j ].origin ); + if ( plyr_dist < ideal_distance * ideal_distance ) { if ( plyr_dist < closest_distance ) @@ -1769,6 +1799,7 @@ check_for_valid_spawn_near_team( revivee, return_struct ) if ( isdefined( closest_group ) ) { spawn_location = get_valid_spawn_location( revivee, spawn_points, closest_group, return_struct ); + if ( isdefined( spawn_location ) ) { return spawn_location; @@ -1795,6 +1826,7 @@ check_for_valid_spawn_near_team( revivee, return_struct ) if ( spawn_points[ j ].locked == 0 ) { plyr_dist = distancesquared( self.origin, spawn_points[ j ].origin ); + if ( plyr_dist < ideal_distance * ideal_distance ) { if ( plyr_dist < closest_distance ) @@ -1822,6 +1854,7 @@ check_for_valid_spawn_near_team( revivee, return_struct ) if ( isdefined( closest_group ) ) { spawn_location = get_valid_spawn_location( revivee, spawn_points, closest_group, return_struct ); + if ( isdefined( spawn_location ) ) { return spawn_location; @@ -1878,6 +1911,7 @@ player_damage_override( einflictor, eattacker, idamage, idflags, smeansofdeath, if ( is_true( self.use_adjusted_grenade_damage ) ) { self.use_adjusted_grenade_damage = undefined; + if ( self.health > idamage ) { return idamage; @@ -1968,6 +2002,7 @@ player_damage_override( einflictor, eattacker, idamage, idflags, smeansofdeath, } canexert = 1; + if ( is_true( level.pers_upgrade_flopper ) ) { if ( is_true( self.pers_upgrades_awarded[ "flopper" ] ) ) @@ -2032,6 +2067,7 @@ player_damage_override( einflictor, eattacker, idamage, idflags, smeansofdeath, } vars = []; + if (!self hasPerk("specialty_flakjacket")) { // remove fall damage being based off max health @@ -2040,11 +2076,13 @@ player_damage_override( einflictor, eattacker, idamage, idflags, smeansofdeath, // increase fall damage beyond 110 vars["max_damage"] = 110; + if (idamage >= vars["max_damage"]) { vars["velocity"] = abs(self.fall_velocity); vars["min_velocity"] = getDvarInt("bg_fallDamageMinHeight") * 3.25; vars["max_velocity"] = getDvarInt("bg_fallDamageMaxHeight") * 2.5; + if (self.divetoprone) { vars["min_velocity"] = getDvarInt("dtp_fall_damage_min_height") * 4.5; @@ -2062,6 +2100,7 @@ player_damage_override( einflictor, eattacker, idamage, idflags, smeansofdeath, finaldamage = idamage; } } + if ( smeansofdeath == "MOD_PROJECTILE" || smeansofdeath == "MOD_PROJECTILE_SPLASH" || smeansofdeath == "MOD_GRENADE" || smeansofdeath == "MOD_GRENADE_SPLASH" ) { if ( self hasperk( "specialty_flakjacket" ) ) @@ -2113,6 +2152,7 @@ player_damage_override( einflictor, eattacker, idamage, idflags, smeansofdeath, return finaldamage; } + if ( isDefined( eattacker ) ) { if ( isDefined( eattacker.animname ) && eattacker.animname == "zombie_dog" ) @@ -2164,6 +2204,7 @@ player_damage_override( einflictor, eattacker, idamage, idflags, smeansofdeath, players = get_players(); count = 0; + for ( i = 0; i < players.size; i++ ) { if ( players[ i ] == self || players[ i ].is_zombie || players[ i ] maps\mp\zombies\_zm_laststand::player_is_in_laststand() || players[ i ].sessionstate == "spectator" ) @@ -2178,11 +2219,13 @@ player_damage_override( einflictor, eattacker, idamage, idflags, smeansofdeath, { self thread maps\mp\zombies\_zm::wait_and_revive(); } + return finaldamage; } solo_death = self is_solo_death( players ); non_solo_death = self is_non_solo_death( players, count ); + if ( ( solo_death || non_solo_death ) && !is_true( level.no_end_game_check ) ) { level notify( "stop_suicide_trigger" ); @@ -2264,12 +2307,14 @@ is_solo_death( players ) } active_perks = 0; + if(isDefined(self.perks_active)) { active_perks = self.perks_active.size; } disabled_perks = 0; + if(isDefined(self.disabled_perks)) { disabled_perks = self.disabled_perks.size; @@ -2300,31 +2345,39 @@ player_laststand( einflictor, attacker, idamage, smeansofdeath, sweapon, vdir, s self allowjump( 0 ); currweapon = self getcurrentweapon(); statweapon = currweapon; + if ( is_alt_weapon( statweapon ) ) { statweapon = weaponaltweaponname( statweapon ); } + self addweaponstat( statweapon, "deathsDuringUse", 1 ); + if ( is_true( self.hasperkspecialtytombstone ) ) { self.laststand_perks = scripts\zm\_zm_reimagined::tombstone_save_perks( self ); } + if ( isDefined( self.pers_upgrades_awarded[ "perk_lose" ] ) && self.pers_upgrades_awarded[ "perk_lose" ] ) { self maps\mp\zombies\_zm_pers_upgrades_functions::pers_upgrade_perk_lose_save(); } + players = get_players(); + if ( players.size == 1 && flag( "solo_game" ) ) { if ( self.solo_lives_given < 3 ) { active_perks = 0; + if(isDefined(self.perks_active)) { active_perks = self.perks_active.size; } disabled_perks = 0; + if(isDefined(self.disabled_perks)) { disabled_perks = self.disabled_perks.size; @@ -2336,10 +2389,12 @@ player_laststand( einflictor, attacker, idamage, smeansofdeath, sweapon, vdir, s } } } + if ( self hasperk( "specialty_additionalprimaryweapon" ) ) { self.weapon_taken_by_losing_specialty_additionalprimaryweapon = maps\mp\zombies\_zm::take_additionalprimaryweapon(); } + if ( is_true( self.hasperkspecialtytombstone ) ) { self [[ level.tombstone_laststand_func ]](); @@ -2351,12 +2406,14 @@ player_laststand( einflictor, attacker, idamage, smeansofdeath, sweapon, vdir, s self notify( "specialty_scavenger_stop" ); } } + self clear_is_drinking(); self thread maps\mp\zombies\_zm::remove_deadshot_bottle(); self thread maps\mp\zombies\_zm::remote_revive_watch(); self maps\mp\zombies\_zm_score::player_downed_penalty(); self disableoffhandweapons(); self thread maps\mp\zombies\_zm::last_stand_grenade_save_and_return(); + if ( smeansofdeath != "MOD_SUICIDE" && smeansofdeath != "MOD_FALLING" ) { if ( !is_true( self.intermission ) ) @@ -2371,23 +2428,29 @@ player_laststand( einflictor, attacker, idamage, smeansofdeath, sweapon, vdir, s } } } + bbprint( "zombie_playerdeaths", "round %d playername %s deathtype %s x %f y %f z %f", level.round_number, self.name, "downed", self.origin ); + if ( isDefined( level._zombie_minigun_powerup_last_stand_func ) ) { self thread [[ level._zombie_minigun_powerup_last_stand_func ]](); } + if ( isDefined( level._zombie_tesla_powerup_last_stand_func ) ) { self thread [[ level._zombie_tesla_powerup_last_stand_func ]](); } + if ( self hasperk( "specialty_grenadepulldeath" ) ) { b_alt_visionset = 1; + if ( isDefined( level.custom_laststand_func ) ) { self thread [[ level.custom_laststand_func ]](); } } + if ( is_true( self.intermission ) ) { bbprint( "zombie_playerdeaths", "round %d playername %s deathtype %s x %f y %f z %f", level.round_number, self.name, "died", self.origin ); @@ -2395,6 +2458,7 @@ player_laststand( einflictor, attacker, idamage, smeansofdeath, sweapon, vdir, s self stopsounds(); level waittill( "forever" ); } + if ( !b_alt_visionset ) { visionsetlaststand( "zombie_last_stand", 1 ); @@ -2446,15 +2510,19 @@ player_spawn_protection_timeout() wait_and_revive() { flag_set( "wait_and_revive" ); + if ( isDefined( self.waiting_to_revive ) && self.waiting_to_revive == 1 ) { return; } + if ( is_true( self.pers_upgrades_awarded[ "perk_lose" ] ) ) { self maps\mp\zombies\_zm_pers_upgrades_functions::pers_upgrade_perk_lose_save(); } + self.waiting_to_revive = 1; + if ( isDefined( level.exit_level_func ) ) { self thread [[ level.exit_level_func ]](); @@ -2463,10 +2531,12 @@ wait_and_revive() { self thread maps\mp\zombies\_zm::default_exit_level(); } + solo_revive_time = 10; self.revive_hud.y = -160; self.revive_hud settext( &"ZOMBIE_REVIVING" ); self maps\mp\zombies\_zm_laststand::revive_hud_show_n_fade( solo_revive_time ); + if ( !isDefined( self.beingrevivedprogressbar ) ) { self.beingrevivedprogressbar = self createprimaryprogressbar(); @@ -2480,18 +2550,22 @@ wait_and_revive() self.beingrevivedprogressbar.barframe.sort = 3; self.beingrevivedprogressbar.barframe destroy(); } + self.beingrevivedprogressbar updatebar( 0.01, 1 / solo_revive_time ); flag_wait_or_timeout( "instant_revive", solo_revive_time ); self.revive_hud settext( "" ); + if ( isDefined( self.beingrevivedprogressbar ) ) { self.beingrevivedprogressbar destroyelem(); } + flag_clear( "wait_and_revive" ); self maps\mp\zombies\_zm_laststand::auto_revive( self ); self.solo_lives_given++; self.waiting_to_revive = 0; + if ( is_true( self.pers_upgrades_awarded[ "perk_lose" ] ) ) { self thread maps\mp\zombies\_zm_pers_upgrades_functions::pers_upgrade_perk_lose_restore(); @@ -2503,23 +2577,29 @@ player_revive_monitor() self endon( "disconnect" ); self notify( "stop_player_revive_monitor" ); self endon( "stop_player_revive_monitor" ); + while ( 1 ) { self waittill( "player_revived", reviver ); self playsoundtoplayer( "zmb_character_revived", self ); + if ( isDefined( level.isresetting_grief ) && level.isresetting_grief ) { continue; } + bbprint( "zombie_playerdeaths", "round %d playername %s deathtype %s x %f y %f z %f", level.round_number, self.name, "revived", self.origin ); + if ( isDefined( reviver ) ) { self maps\mp\zombies\_zm_audio::create_and_play_dialog( "general", "revive_up" ); + if(reviver != self) { points = self.score_lost_when_downed; reviver maps\mp\zombies\_zm_score::player_add_points( "reviver", points ); } + self.score_lost_when_downed = 0; } } @@ -2654,6 +2734,7 @@ end_game() level waittill( "end_game" ); maps\mp\zombies\_zm::check_end_game_intermission_delay(); clientnotify( "zesn" ); + if ( isDefined( level.sndgameovermusicoverride ) ) { level thread maps\mp\zombies\_zm_audio::change_zombie_music( level.sndgameovermusicoverride ); @@ -2662,14 +2743,18 @@ end_game() { level thread maps\mp\zombies\_zm_audio::change_zombie_music( "game_over" ); } + players = get_players(); + for ( i = 0; i < players.size; i++ ) { setclientsysstate( "lsm", "0", players[ i ] ); } + for ( i = 0; i < players.size; i++ ) { players[ i ] enableInvulnerability(); + if ( players[ i ] maps\mp\zombies\_zm_laststand::player_is_in_laststand() ) { players[ i ] recordplayerdeathzombies(); @@ -2677,11 +2762,13 @@ end_game() players[ i ] maps\mp\zombies\_zm_stats::increment_client_stat( "deaths" ); players[ i ] maps\mp\zombies\_zm_pers_upgrades_functions::pers_upgrade_jugg_player_death_stat(); } + if ( isdefined( players[ i ].revivetexthud) ) { players[ i ].revivetexthud destroy(); } } + stopallrumbles(); level.intermission = 1; level.zombie_vars[ "zombie_powerup_insta_kill_time" ] = 0; @@ -2691,6 +2778,7 @@ end_game() game_over = []; survived = []; players = get_players(); + if ( !isDefined( level._supress_survived_screen ) ) { for ( i = 0; i < players.size; i++ ) @@ -2716,6 +2804,7 @@ end_game() game_over[ i ] fadeovertime( 1 ); game_over[ i ].alpha = 1; } + survived[ i ] = newclienthudelem( players[ i ] ); survived[ i ].alignx = "center"; survived[ i ].aligny = "middle"; @@ -2753,25 +2842,30 @@ end_game() { survived[ i ] settext( &"ZOMBIE_SURVIVED_ROUNDS", level.round_number ); } + survived[ i ] fadeovertime( 1 ); survived[ i ].alpha = 1; } } + if ( isDefined( level.custom_end_screen ) ) { level [[ level.custom_end_screen ]](); } + for ( i = 0; i < players.size; i++ ) { players[ i ] setclientammocounterhide( 1 ); players[ i ] setclientminiscoreboardhide( 1 ); } + uploadstats(); maps\mp\zombies\_zm_stats::update_players_stats_at_match_end( players ); maps\mp\zombies\_zm_stats::update_global_counters_on_match_end(); wait 1; wait 3.95; players = get_players(); + foreach ( player in players ) { if ( isdefined( player.sessionstate ) && player.sessionstate == "spectator" ) @@ -2779,8 +2873,10 @@ end_game() player.sessionstate = "playing"; } } + wait 0.05; players = get_players(); + if ( !isDefined( level._supress_survived_screen ) ) { for(i = 0; i < players.size; i++) @@ -2789,17 +2885,20 @@ end_game() game_over[ i ] destroy(); } } + for ( i = 0; i < players.size; i++ ) { if ( isDefined( players[ i ].survived_hud ) ) { players[ i ].survived_hud destroy(); } + if ( isDefined( players[ i ].game_over_hud ) ) { players[ i ].game_over_hud destroy(); } } + maps\mp\zombies\_zm::intermission(); wait level.zombie_vars[ "zombie_intermission_time" ]; level notify( "stop_intermission" ); @@ -2807,6 +2906,7 @@ end_game() bbprint( "zombie_epilogs", "rounds %d", level.round_number ); wait 1.5; players = get_players(); + for ( i = 0; i < players.size; i++ ) { players[ i ] cameraactivate( 0 ); diff --git a/scripts/zm/replaced/_zm_afterlife.gsc b/scripts/zm/replaced/_zm_afterlife.gsc index a04d5d2d..ec818937 100644 --- a/scripts/zm/replaced/_zm_afterlife.gsc +++ b/scripts/zm/replaced/_zm_afterlife.gsc @@ -92,6 +92,7 @@ afterlife_add() self.lives++; self thread afterlife_add_fx(); } + self playsoundtoplayer( "zmb_afterlife_add", self ); self setclientfieldtoplayer( "player_lives", self.lives ); } @@ -101,10 +102,12 @@ afterlife_start_zombie_logic() flag_wait( "start_zombie_round_logic" ); wait 0.5; everyone_alive = 0; + while ( isDefined( everyone_alive ) && !everyone_alive ) { everyone_alive = 1; players = getplayers(); + foreach (player in players) { if ( isDefined( player.afterlife ) && player.afterlife ) @@ -115,11 +118,14 @@ afterlife_start_zombie_logic() } } } + wait 0.5; + while ( level.intermission ) { wait 0.05; } + flag_set( "afterlife_start_over" ); wait 2; array_func( getplayers(), ::afterlife_add ); @@ -296,6 +302,7 @@ afterlife_revive_do_revive( playerbeingrevived, revivergun ) playerbeingrevived_player = playerbeingrevived; playerbeingrevived_player.revive_hud.y = -160; beingrevivedprogressbar_y = level.primaryprogressbary * -1; + if ( isDefined( playerbeingrevived.e_afterlife_player ) ) { playerbeingrevived_player = playerbeingrevived.e_afterlife_player; diff --git a/scripts/zm/replaced/_zm_ai_avogadro.gsc b/scripts/zm/replaced/_zm_ai_avogadro.gsc index 8e26b56c..9340f03c 100644 --- a/scripts/zm/replaced/_zm_ai_avogadro.gsc +++ b/scripts/zm/replaced/_zm_ai_avogadro.gsc @@ -48,6 +48,7 @@ check_range_attack() avogadro_exit( from ) { powerup_origin = spawn( "script_origin", self.origin ); + if ( self.state == "attacking_bus" || self.state == "stay_attached" ) { powerup_origin linkto( level.the_bus ); diff --git a/scripts/zm/replaced/_zm_ai_basic.gsc b/scripts/zm/replaced/_zm_ai_basic.gsc index 3eb06cd6..f775134d 100644 --- a/scripts/zm/replaced/_zm_ai_basic.gsc +++ b/scripts/zm/replaced/_zm_ai_basic.gsc @@ -16,9 +16,11 @@ inert_wakeup() { current_time = getTime(); players = get_players(); + foreach ( player in players ) { dist_sq = distancesquared( self.origin, player.origin ); + if ( dist_sq < 4096 ) { self maps\mp\zombies\_zm_ai_basic::stop_inert(); diff --git a/scripts/zm/replaced/_zm_ai_brutus.gsc b/scripts/zm/replaced/_zm_ai_brutus.gsc index af412143..20e2f996 100644 --- a/scripts/zm/replaced/_zm_ai_brutus.gsc +++ b/scripts/zm/replaced/_zm_ai_brutus.gsc @@ -433,6 +433,7 @@ brutus_spawn( starting_health, has_helmet, helmet_hits, explosive_dmg_taken, zon { level.num_pulls_since_brutus_spawn = 0; self set_zombie_run_cycle( "run" ); + if ( !isDefined( has_helmet ) ) { self.has_helmet = 1; @@ -441,6 +442,7 @@ brutus_spawn( starting_health, has_helmet, helmet_hits, explosive_dmg_taken, zon { self.has_helmet = has_helmet; } + if ( !isDefined( helmet_hits ) ) { self.helmet_hits = 0; @@ -449,6 +451,7 @@ brutus_spawn( starting_health, has_helmet, helmet_hits, explosive_dmg_taken, zon { self.helmet_hits = helmet_hits; } + if ( !isDefined( explosive_dmg_taken ) ) { self.explosive_dmg_taken = 0; @@ -457,6 +460,7 @@ brutus_spawn( starting_health, has_helmet, helmet_hits, explosive_dmg_taken, zon { self.explosive_dmg_taken = explosive_dmg_taken; } + if ( !isDefined( starting_health ) ) { self brutus_health_increases(); @@ -468,6 +472,7 @@ brutus_spawn( starting_health, has_helmet, helmet_hits, explosive_dmg_taken, zon self.maxhealth = starting_health; self.health = starting_health; } + self.explosive_dmg_req = level.brutus_expl_dmg_req; self.no_damage_points = 1; self endon( "death" ); @@ -495,6 +500,7 @@ brutus_spawn( starting_health, has_helmet, helmet_hits, explosive_dmg_taken, zon self setfreecameralockonallowed( 0 ); level thread maps\mp\zombies\_zm_spawner::zombie_death_event( self ); self thread maps\mp\zombies\_zm_spawner::enemy_death_detection(); + if ( isDefined( zone_name ) && zone_name == "zone_golden_gate_bridge" ) { wait randomfloat( 1.5 ); @@ -504,23 +510,28 @@ brutus_spawn( starting_health, has_helmet, helmet_hits, explosive_dmg_taken, zon { spawn_pos = get_best_brutus_spawn_pos( zone_name ); } + if ( !isDefined( spawn_pos ) ) { self delete(); return; } + if ( !isDefined( spawn_pos.angles ) ) { spawn_pos.angles = ( 0, 0, 0 ); } + if ( isDefined( level.brutus_do_prologue ) && level.brutus_do_prologue ) { self brutus_spawn_prologue( spawn_pos ); } + if ( !self.has_helmet ) { self detach( "c_zom_cellbreaker_helmet" ); } + level.brutus_count++; self maps\mp\zombies\_zm_spawner::zombie_complete_emerging_into_playable_area(); self thread snddelayedmusic(); @@ -560,20 +571,24 @@ brutus_damage_override( inflictor, attacker, damage, flags, meansofdeath, weapon n_brutus_damage_percent = level.brutus_damage_percent; n_brutus_headshot_modifier = 1; } + if ( isDefined( weapon ) && is_weapon_shotgun( weapon ) ) { n_brutus_damage_percent *= level.brutus_shotgun_damage_mod; n_brutus_headshot_modifier *= level.brutus_shotgun_damage_mod; } + if ( isDefined( weapon ) && weapon == "bouncing_tomahawk_zm" && isDefined( inflictor ) ) { self playsound( "wpn_tomahawk_imp_zombie" ); + if ( self.has_helmet ) { if ( damage == 1 ) { return 0; } + if ( isDefined( inflictor.n_cookedtime ) && inflictor.n_cookedtime >= 2000 ) { self.helmet_hits = level.brutus_helmet_shots; @@ -586,9 +601,11 @@ brutus_damage_override( inflictor, attacker, damage, flags, meansofdeath, weapon { self.helmet_hits++; } + if ( self.helmet_hits >= level.brutus_helmet_shots ) { self thread brutus_remove_helmet( vdir ); + if ( level.brutus_in_grief ) { player_points = level.brutus_points_for_helmet; @@ -598,6 +615,7 @@ brutus_damage_override( inflictor, attacker, damage, flags, meansofdeath, weapon multiplier = maps\mp\zombies\_zm_score::get_points_multiplier( self ); player_points = multiplier * round_up_score( level.brutus_points_for_helmet, 5 ); } + if ( isDefined( attacker ) && isplayer( attacker ) ) { attacker add_to_player_score( player_points ); @@ -605,6 +623,7 @@ brutus_damage_override( inflictor, attacker, damage, flags, meansofdeath, weapon level notify( "brutus_helmet_removed", attacker ); } } + return damage * n_brutus_damage_percent; } else @@ -612,6 +631,7 @@ brutus_damage_override( inflictor, attacker, damage, flags, meansofdeath, weapon return damage; } } + if ( ( meansofdeath == "MOD_MELEE" || meansofdeath == "MOD_IMPACT" ) && isDefined( meansofdeath ) ) { if ( weapon == "alcatraz_shield_zm" ) @@ -621,14 +641,17 @@ brutus_damage_override( inflictor, attacker, damage, flags, meansofdeath, weapon return 0; } } + if ( isDefined( level.zombiemode_using_afterlife ) && level.zombiemode_using_afterlife && weapon == "lightning_hands_zm" ) { self thread brutus_afterlife_teleport(); return 0; } + if ( is_explosive_damage( meansofdeath ) && weapon != "raygun_mark2_zm" && weapon != "raygun_mark2_upgraded_zm" ) { self.explosive_dmg_taken += damage; + if ( !self.has_helmet ) { scaler = n_brutus_headshot_modifier; @@ -637,9 +660,11 @@ brutus_damage_override( inflictor, attacker, damage, flags, meansofdeath, weapon { scaler = level.brutus_damage_percent; } + if ( self.explosive_dmg_taken >= self.explosive_dmg_req && isDefined( self.has_helmet ) && self.has_helmet ) { self thread brutus_remove_helmet( vectorScale( ( 0, 1, 0 ), 10 ) ); + if ( level.brutus_in_grief ) { player_points = level.brutus_points_for_helmet; @@ -649,9 +674,11 @@ brutus_damage_override( inflictor, attacker, damage, flags, meansofdeath, weapon multiplier = maps\mp\zombies\_zm_score::get_points_multiplier( self ); player_points = multiplier * round_up_score( level.brutus_points_for_helmet, 5 ); } + attacker add_to_player_score( player_points ); attacker.pers[ "score" ] = inflictor.score; } + return damage * scaler; } else if ( shitloc != "head" && shitloc != "helmet" ) @@ -675,21 +702,26 @@ brutus_health_increases() { players = getplayers(); n_player_modifier = 1; + if ( players.size > 1 ) { n_player_modifier = players.size * 0.75; } + level.brutus_round_count++; level.brutus_health = int( level.brutus_health_increase * n_player_modifier * level.brutus_round_count ); level.brutus_expl_dmg_req = int( level.brutus_explosive_damage_increase * n_player_modifier * level.brutus_round_count ); + if ( level.brutus_health >= ( 5000 * n_player_modifier ) ) { level.brutus_health = int( 5000 * n_player_modifier ); } + if ( level.brutus_expl_dmg_req >= ( 4500 * n_player_modifier ) ) { level.brutus_expl_dmg_req = int( 4500 * n_player_modifier ); } + level.brutus_last_spawn_round = level.round_number; } } diff --git a/scripts/zm/replaced/_zm_ai_screecher.gsc b/scripts/zm/replaced/_zm_ai_screecher.gsc index 93ebbfc5..5254b2a8 100644 --- a/scripts/zm/replaced/_zm_ai_screecher.gsc +++ b/scripts/zm/replaced/_zm_ai_screecher.gsc @@ -118,6 +118,7 @@ screecher_spawning_logic() screecher_melee_damage( player ) { melee_score = 0; + if ( player hasweapon( "tazer_knuckles_zm" ) ) { melee_score = 30; diff --git a/scripts/zm/replaced/_zm_banking.gsc b/scripts/zm/replaced/_zm_banking.gsc index cb2928ff..472c6266 100644 --- a/scripts/zm/replaced/_zm_banking.gsc +++ b/scripts/zm/replaced/_zm_banking.gsc @@ -6,10 +6,12 @@ init() { onplayerconnect_callback( ::onplayerconnect_bank_deposit_box ); + if ( !isDefined( level.ta_vaultfee ) ) { level.ta_vaultfee = 100; } + if ( !isDefined( level.ta_tellerfee ) ) { level.ta_tellerfee = 100; @@ -31,6 +33,7 @@ gain_interest_after_rounds() level waittill("end_of_round"); self.account_value *= 1.1; + if(self.account_value > level.bank_account_max) { self.account_value = level.bank_account_max; @@ -65,13 +68,16 @@ bank_withdraw_unitrigger() trigger_deposit_think() { self endon( "kill_trigger" ); + while ( 1 ) { self waittill( "trigger", player ); + while ( !is_player_valid( player ) ) { continue; } + if ( player.account_value < level.bank_account_max ) { account_value = level.bank_account_increment; @@ -93,10 +99,12 @@ trigger_deposit_think() player playsoundtoplayer( "zmb_vault_bank_deposit", player ); player.score -= score; player.account_value += account_value; + if ( isDefined( level.custom_bank_deposit_vo ) ) { player thread [[ level.custom_bank_deposit_vo ]](); } + if ( (player.score <= 0) || (player.account_value >= level.bank_account_max) ) { self sethintstring( "" ); @@ -106,6 +114,7 @@ trigger_deposit_think() { player thread do_player_general_vox( "general", "exert_sigh", 10, 50 ); } + self thread show_balance(player); } } @@ -113,13 +122,16 @@ trigger_deposit_think() trigger_withdraw_think() { self endon( "kill_trigger" ); + while ( 1 ) { self waittill( "trigger", player ); + while ( !is_player_valid( player ) ) { continue; } + if ( player.account_value > 0 ) { score = level.bank_deposit_ddl_increment_amount; @@ -135,6 +147,7 @@ trigger_withdraw_think() player.score += score; level notify( "bank_withdrawal" ); player.account_value -= account_value; + if ( isDefined( level.custom_bank_withdrawl_vo ) ) { player thread [[ level.custom_bank_withdrawl_vo ]](); @@ -143,6 +156,7 @@ trigger_withdraw_think() { player thread do_player_general_vox( "general", "exert_laugh", 10, 50 ); } + if ( player.account_value <= 0 ) { self sethintstring( "" ); @@ -152,6 +166,7 @@ trigger_withdraw_think() { player thread do_player_general_vox( "general", "exert_sigh", 10, 50 ); } + self thread show_balance(player); } } @@ -159,11 +174,13 @@ trigger_withdraw_think() trigger_deposit_update_prompt( player ) { self thread show_balance(player); + if ( (player.score <= 0) || (player.account_value >= level.bank_account_max) ) { self sethintstring( "" ); return 0; } + self sethintstring( &"ZOMBIE_BANK_DEPOSIT_PROMPT", level.bank_deposit_ddl_increment_amount ); return 1; } @@ -171,11 +188,13 @@ trigger_deposit_update_prompt( player ) trigger_withdraw_update_prompt( player ) { self thread show_balance(player); + if ( player.account_value <= 0 ) { self sethintstring( "" ); return 0; } + self sethintstring( &"ZOMBIE_BANK_WITHDRAW_PROMPT", level.bank_deposit_ddl_increment_amount, level.ta_vaultfee ); return 1; } diff --git a/scripts/zm/replaced/_zm_blockers.gsc b/scripts/zm/replaced/_zm_blockers.gsc index cdac97ee..a8978bf3 100644 --- a/scripts/zm/replaced/_zm_blockers.gsc +++ b/scripts/zm/replaced/_zm_blockers.gsc @@ -186,10 +186,12 @@ handle_post_board_repair_rewards( cost, zbarrier ) { self maps\mp\zombies\_zm_stats::increment_client_stat( "boards" ); self maps\mp\zombies\_zm_stats::increment_player_stat( "boards" ); + if ( isDefined( self.pers[ "boards" ] ) && ( self.pers[ "boards" ] % 10 ) == 0 ) { self thread do_player_general_vox( "general", "reboard", 90 ); } + self maps\mp\zombies\_zm_pers_upgrades_functions::pers_boards_updated( zbarrier ); self.rebuild_barrier_reward += cost; diff --git a/scripts/zm/replaced/_zm_buildables.gsc b/scripts/zm/replaced/_zm_buildables.gsc index e2826987..f882cc09 100644 --- a/scripts/zm/replaced/_zm_buildables.gsc +++ b/scripts/zm/replaced/_zm_buildables.gsc @@ -14,6 +14,7 @@ buildable_place_think() { self endon( "kill_trigger" ); player_built = undefined; + while ( isDefined( self.stub.built ) && !self.stub.built ) { self waittill( "trigger", player ); @@ -24,24 +25,29 @@ buildable_place_think() { continue; } + if ( isDefined( player.screecher_weapon ) ) { continue; } + if ( !is_player_valid( player ) ) { player thread ignore_triggers( 0.5 ); } status = player player_can_build( self.stub.buildablezone ); + if ( !status ) { self.stub.hint_string = ""; self sethintstring( self.stub.hint_string ); + if ( isDefined( self.stub.oncantuse ) ) { self.stub [[ self.stub.oncantuse ]]( player ); } + continue; } else @@ -50,12 +56,15 @@ buildable_place_think() { self.stub [[ self.stub.onbeginuse ]]( player ); } + result = self buildable_use_hold_think( player ); team = player.pers[ "team" ]; + if ( isDefined( self.stub.onenduse ) ) { self.stub [[ self.stub.onenduse ]]( team, player, result ); } + if ( !result ) { continue; @@ -70,6 +79,7 @@ buildable_place_think() { self.stub [[ self.stub.onuse ]]( player ); } + prompt = player maps\mp\zombies\_zm_buildables::player_build( self.stub.buildablezone ); player_built = player; self.stub.hint_string = prompt; diff --git a/scripts/zm/replaced/_zm_buildables_pooled.gsc b/scripts/zm/replaced/_zm_buildables_pooled.gsc index 03660a1a..b5c3bc79 100644 --- a/scripts/zm/replaced/_zm_buildables_pooled.gsc +++ b/scripts/zm/replaced/_zm_buildables_pooled.gsc @@ -57,6 +57,7 @@ randomize_pooled_buildables( poolname ) 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] ); @@ -499,9 +500,11 @@ pooled_buildable_place_think() 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" ); diff --git a/scripts/zm/replaced/_zm_chugabud.gsc b/scripts/zm/replaced/_zm_chugabud.gsc index 53704405..9afde477 100644 --- a/scripts/zm/replaced/_zm_chugabud.gsc +++ b/scripts/zm/replaced/_zm_chugabud.gsc @@ -236,6 +236,7 @@ chugabud_give_loadout() } weapons_given = 0; + for ( i = 0; i < loadout.weapons.size; i++ ) { if ( !isdefined( loadout.weapons[i] ) ) @@ -247,6 +248,7 @@ chugabud_give_loadout() self maps\mp\zombies\_zm_weapons::weapondata_give( loadout.weapons[i] ); weapons_given++; + if (weapons_given >= 2) { break; @@ -299,6 +301,7 @@ chugabud_give_perks() maps\mp\zombies\_zm_perks::give_perk( loadout.perks[i] ); } } + self.loadout.perks = undefined; } diff --git a/scripts/zm/replaced/_zm_equip_headchopper.gsc b/scripts/zm/replaced/_zm_equip_headchopper.gsc index 50caedaa..e57eadf3 100644 --- a/scripts/zm/replaced/_zm_equip_headchopper.gsc +++ b/scripts/zm/replaced/_zm_equip_headchopper.gsc @@ -23,6 +23,7 @@ init_anim_slice_times() animlength = getanimlength( %o_zmb_chopper_slice_slow ); i = 0; + foreach ( frac in slice_times ) { if ( i != 6 ) @@ -36,6 +37,7 @@ init_anim_slice_times() } i = 0; + foreach ( frac in retract_times ) { if ( i == 0 || i == 6 ) diff --git a/scripts/zm/replaced/_zm_equip_turret.gsc b/scripts/zm/replaced/_zm_equip_turret.gsc index 8add4b07..91dcb3bf 100644 --- a/scripts/zm/replaced/_zm_equip_turret.gsc +++ b/scripts/zm/replaced/_zm_equip_turret.gsc @@ -8,28 +8,34 @@ startturretdeploy( weapon ) self endon( "disconnect" ); self endon( "equip_turret_zm_taken" ); self thread maps\mp\zombies\_zm_equip_turret::watchforcleanup(); + if ( !isDefined( self.turret_health ) ) { self.turret_health = 30; } + if ( isDefined( weapon ) ) { weapon hide(); wait 0.1; + if ( isDefined( weapon.power_on ) && weapon.power_on ) { weapon.turret notify( "stop_burst_fire_unmanned" ); } + if ( !isDefined( weapon ) ) { return; } + if ( isDefined( self.turret ) ) { self.turret notify( "stop_burst_fire_unmanned" ); self.turret notify( "turret_deactivated" ); self.turret delete(); } + turret = spawnturret( "misc_turret", weapon.origin, "zombie_bullet_crouch_zm" ); turret.turrettype = "sentry"; turret setturrettype( turret.turrettype ); @@ -53,25 +59,30 @@ startturretdeploy( weapon ) weapon.turret = turret; self.turret = turret; weapon turret_power_on(); + if ( weapon.power_on ) { turret thread maps\mp\zombies\_zm_mgturret::burst_fire_unmanned(); } + self thread turretdecay( weapon ); self thread maps\mp\zombies\_zm_buildables::delete_on_disconnect( weapon ); weapon waittill("death"); + if ( isDefined( self.buildableturret.sound_ent ) ) { self.buildableturret.sound_ent playsound( "wpn_zmb_turret_stop" ); self.buildableturret.sound_ent delete(); self.buildableturret.sound_ent = undefined; } + if ( isDefined( turret ) ) { turret notify( "stop_burst_fire_unmanned" ); turret notify( "turret_deactivated" ); turret delete(); } + self.turret = undefined; self notify( "turret_cleanup" ); } @@ -82,10 +93,12 @@ turret_power_on() self.power_on = 1; self.turret thread maps\mp\zombies\_zm_mgturret::burst_fire_unmanned(); player = self.turret.owner; + if ( !isDefined( player.buildableturret.sound_ent ) ) { player.buildableturret.sound_ent = spawn( "script_origin", self.turret.origin ); } + player.buildableturret.sound_ent playsound( "wpn_zmb_turret_start" ); player.buildableturret.sound_ent playloopsound( "wpn_zmb_turret_loop", 2 ); } @@ -95,6 +108,7 @@ turretdecay( weapon ) self endon( "death" ); self endon( "disconnect" ); self endon( "equip_turret_zm_taken" ); + while ( isDefined( weapon ) ) { if ( weapon.power_on ) @@ -109,6 +123,7 @@ turretdecay( weapon ) return; } } + wait 1; } } \ No newline at end of file diff --git a/scripts/zm/replaced/_zm_equipment.gsc b/scripts/zm/replaced/_zm_equipment.gsc index 84649c10..bac3885c 100644 --- a/scripts/zm/replaced/_zm_equipment.gsc +++ b/scripts/zm/replaced/_zm_equipment.gsc @@ -23,11 +23,14 @@ show_equipment_hint( equipment ) placed_equipment_think( model, equipname, origin, angles, tradius, toffset ) { pickupmodel = spawn( "script_model", origin ); + if ( isDefined( angles ) ) { pickupmodel.angles = angles; } + pickupmodel setmodel( model ); + if ( isDefined( level.equipment_safe_to_drop ) ) { if ( !( self [[ level.equipment_safe_to_drop ]]( pickupmodel ) ) ) @@ -38,7 +41,9 @@ placed_equipment_think( model, equipname, origin, angles, tradius, toffset ) return undefined; } } + watchername = getsubstr( equipname, 0, equipname.size - 3 ); + if ( isDefined( level.retrievehints[ watchername ] ) ) { hint = level.retrievehints[ watchername ].hint; @@ -47,17 +52,22 @@ placed_equipment_think( model, equipname, origin, angles, tradius, toffset ) { hint = &"MP_GENERIC_PICKUP"; } + icon = maps\mp\zombies\_zm_equipment::get_equipment_icon( equipname ); + if ( !isDefined( tradius ) ) { tradius = 32; } + torigin = origin; + if ( isDefined( toffset ) ) { tforward = anglesToForward( angles ); torigin += toffset * tforward; } + tup = anglesToUp( angles ); eq_unitrigger_offset = 12 * tup; pickupmodel.stub = maps\mp\zombies\_zm_equipment::generate_equipment_unitrigger( "trigger_radius_use", torigin + eq_unitrigger_offset, angles, 0, tradius, 64, hint, equipname, maps\mp\zombies\_zm_equipment::placed_equipment_unitrigger_think, pickupmodel.canmove ); @@ -65,18 +75,22 @@ placed_equipment_think( model, equipname, origin, angles, tradius, toffset ) pickupmodel.stub.equipname = equipname; pickupmodel.equipname = equipname; pickupmodel thread item_watch_damage(); + if ( maps\mp\zombies\_zm_equipment::is_limited_equipment( equipname ) ) { if ( !isDefined( level.dropped_equipment ) ) { level.dropped_equipment = []; } + if ( isDefined( level.dropped_equipment[ equipname ] ) && isDefined( level.dropped_equipment[ equipname ].model ) ) { level.dropped_equipment[ equipname ].model maps\mp\zombies\_zm_equipment::dropped_equipment_destroy( 1 ); } + level.dropped_equipment[ equipname ] = pickupmodel.stub; } + maps\mp\zombies\_zm_equipment::destructible_equipment_list_add( pickupmodel ); return pickupmodel; } @@ -85,6 +99,7 @@ item_watch_damage() { self endon( "death" ); self setcandamage( 1 ); + while ( 1 ) { self.health = 1000000; diff --git a/scripts/zm/replaced/_zm_game_module.gsc b/scripts/zm/replaced/_zm_game_module.gsc index b3a1203c..8ab116e3 100644 --- a/scripts/zm/replaced/_zm_game_module.gsc +++ b/scripts/zm/replaced/_zm_game_module.gsc @@ -15,12 +15,14 @@ wait_for_team_death_and_round_end() checking_for_round_end = 0; checking_for_round_tie = 0; level.isresetting_grief = 0; + while ( 1 ) { cdc_alive = 0; cia_alive = 0; players = get_players(); i = 0; + while ( i < players.size ) { if ( !isDefined( players[ i ]._encounters_team ) ) @@ -28,19 +30,23 @@ wait_for_team_death_and_round_end() i++; continue; } + if ( players[ i ]._encounters_team == "A" ) { if ( is_player_valid( players[ i ] ) ) { cia_alive++; } + i++; continue; } + if ( is_player_valid( players[ i ] ) ) { cdc_alive++; } + i++; } @@ -126,6 +132,7 @@ round_end(winner) level endon("end_game"); team = undefined; + if(isDefined(winner)) { if(winner == "A") @@ -144,6 +151,7 @@ round_end(winner) } players = get_players(); + foreach(player in players) { // don't spawn tombstone powerup on next down @@ -213,18 +221,22 @@ game_won(winner) level.zombie_vars[ "spectators_respawn" ] = 0; players = get_players(); i = 0; + while ( i < players.size ) { players[ i ] freezecontrols( 1 ); + if ( players[ i ]._encounters_team == winner ) { players[ i ] thread maps\mp\zombies\_zm_audio_announcer::leaderdialogonplayer( "grief_won" ); i++; continue; } + players[ i ] thread maps\mp\zombies\_zm_audio_announcer::leaderdialogonplayer( "grief_lost" ); i++; } + level notify( "game_module_ended", winner ); level._game_module_game_end_check = undefined; maps\mp\gametypes_zm\_zm_gametype::track_encounters_win_stats( level.gamemodulewinningteam ); @@ -242,6 +254,7 @@ zombie_goto_round(target_round) level.zombie_total = 0; zombies = get_round_enemy_array(); + if ( isDefined( zombies ) ) { for ( i = 0; i < zombies.size; i++ ) @@ -270,6 +283,7 @@ player_respawn_award() { maps\mp\zombies\_zm::award_grenades_for_survivors(); players = get_players(); + foreach(player in players) { if(player.score < level.player_starting_points) diff --git a/scripts/zm/replaced/_zm_gametype.gsc b/scripts/zm/replaced/_zm_gametype.gsc index f189fbb5..8414bf09 100644 --- a/scripts/zm/replaced/_zm_gametype.gsc +++ b/scripts/zm/replaced/_zm_gametype.gsc @@ -8,17 +8,21 @@ onspawnplayer( predictedspawn ) { predictedspawn = 0; } + pixbeginevent( "ZSURVIVAL:onSpawnPlayer" ); self.usingobj = undefined; self.is_zombie = 0; + if ( isDefined( level.custom_spawnplayer ) && is_true( self.player_initialized ) ) { self [[ level.custom_spawnplayer ]](); return; } + if ( isDefined( level.customspawnlogic ) ) { self [[ level.customspawnlogic ]]( predictedspawn ); + if ( predictedspawn ) { return; @@ -27,6 +31,7 @@ onspawnplayer( predictedspawn ) else { location = level.scr_zm_map_start_location; + if ( ( location == "default" || location == "" ) && isDefined( level.default_start_location ) ) { location = level.default_start_location; @@ -43,6 +48,7 @@ onspawnplayer( predictedspawn ) if ( isdefined( structs[ i ].script_string ) ) { tokens = strtok( structs[ i ].script_string, " " ); + foreach ( token in tokens ) { if ( token == match_string ) @@ -96,6 +102,7 @@ onspawnplayer( predictedspawn ) if ( isDefined( level.game_mode_spawn_player_logic ) ) { spawn_in_spectate = [[ level.game_mode_spawn_player_logic ]](); + if ( spawn_in_spectate ) { self delay_thread( 0.05, maps\mp\zombies\_zm::spawnspectator ); @@ -109,26 +116,32 @@ onplayerspawned() { level endon( "end_game" ); self endon( "disconnect" ); + for ( ;; ) { self waittill_either( "spawned_player", "fake_spawned_player" ); + if ( isDefined( level.match_is_ending ) && level.match_is_ending ) { return; } + if ( self maps\mp\zombies\_zm_laststand::player_is_in_laststand() ) { self thread maps\mp\zombies\_zm_laststand::auto_revive( self ); } + if ( isDefined( level.custom_player_fake_death_cleanup ) ) { self [[ level.custom_player_fake_death_cleanup ]](); } + self setstance( "stand" ); self.zmbdialogqueue = []; self.zmbdialogactive = 0; self.zmbdialoggroups = []; self.zmbdialoggroup = ""; + if ( is_encounter() ) { if ( self.team == "axis" ) @@ -144,27 +157,35 @@ onplayerspawned() self._team_name = &"ZOMBIE_RACE_TEAM_2"; } } + self takeallweapons(); + if ( isDefined( level.givecustomcharacters ) ) { self [[ level.givecustomcharacters ]](); } + weapons_restored = 0; + if ( isDefined( level.onplayerspawned_restore_previous_weapons ) ) { weapons_restored = self [[ level.onplayerspawned_restore_previous_weapons ]](); } + if ( !is_true( weapons_restored ) ) { self giveweapon( "knife_zm" ); self give_start_weapon( 1 ); } + weapons_restored = 0; + if ( isDefined( level._team_loadout ) ) { self giveweapon( level._team_loadout ); self switchtoweapon( level._team_loadout ); } + if ( isDefined( level.gamemode_post_spawn_logic ) ) { self [[ level.gamemode_post_spawn_logic ]](); @@ -360,12 +381,15 @@ menu_onmenuresponse() case "allies": self [[ level.allies ]](); break; + case "axis": self [[ level.teammenu ]]( response ); break; + case "autoassign": self [[ level.autoassign ]]( 1 ); break; + case "spectator": self [[ level.spectator ]](); break; diff --git a/scripts/zm/replaced/_zm_laststand.gsc b/scripts/zm/replaced/_zm_laststand.gsc index 5dca5675..2a7fafaf 100644 --- a/scripts/zm/replaced/_zm_laststand.gsc +++ b/scripts/zm/replaced/_zm_laststand.gsc @@ -12,6 +12,7 @@ revive_do_revive( playerbeingrevived, revivergun ) playerbeingrevived_player = playerbeingrevived; playerbeingrevived_player.revive_hud.y = -160; beingrevivedprogressbar_y = level.primaryprogressbary * -1; + if ( isDefined( playerbeingrevived.e_chugabud_player ) ) { playerbeingrevived_player = playerbeingrevived.e_chugabud_player; @@ -258,6 +259,7 @@ laststand_clean_up_reviving_any( playerbeingrevived ) playerbeingrevived waittill_any( "disconnect", "zombified", "stop_revive_trigger", "chugabud_effects_cleanup" ); self.is_reviving_any--; + if ( self.is_reviving_any < 0 ) { self.is_reviving_any = 0; @@ -290,6 +292,7 @@ laststand_clean_up_reviving_any( playerbeingrevived ) revive_give_back_weapons( gun ) { revive_tool = level.revive_tool; + if ( is_true( self.afterlife ) ) { revive_tool = level.afterlife_revive_tool; @@ -326,6 +329,7 @@ revive_give_back_weapons( gun ) else { primaryweapons = self getweaponslistprimaries(); + if ( isDefined( primaryweapons ) && primaryweapons.size > 0 ) { self switchtoweapon( primaryweapons[ 0 ] ); @@ -340,13 +344,16 @@ revive_hud_think() while ( 1 ) { wait 0.1; + if ( !maps\mp\zombies\_zm_laststand::player_any_player_in_laststand() ) { continue; } + players = get_players(); playertorevive = undefined; i = 0; + while ( i < players.size ) { if ( !isDefined( players[ i ].revivetrigger ) || !isDefined( players[ i ].revivetrigger.createtime ) ) @@ -354,15 +361,19 @@ revive_hud_think() i++; continue; } + if ( !isDefined( playertorevive ) || playertorevive.revivetrigger.createtime > players[ i ].revivetrigger.createtime ) { playertorevive = players[ i ]; } + i++; } + if ( isDefined( playertorevive ) ) { i = 0; + while ( i < players.size ) { if ( players[ i ] maps\mp\zombies\_zm_laststand::player_is_in_laststand() ) @@ -370,6 +381,7 @@ revive_hud_think() i++; continue; } + if ( getDvar( "g_gametype" ) == "vs" ) { if ( players[ i ].team != playertorevive.team ) @@ -378,6 +390,7 @@ revive_hud_think() continue; } } + if ( is_encounter() ) { if ( players[ i ].sessionteam != playertorevive.sessionteam ) @@ -385,15 +398,18 @@ revive_hud_think() i++; continue; } + if ( is_true( level.hide_revive_message ) ) { i++; continue; } } + players[ i ] thread maps\mp\zombies\_zm_laststand::faderevivemessageover( playertorevive, 3 ); i++; } + playertorevive.revivetrigger.createtime = undefined; } } @@ -440,6 +456,7 @@ auto_revive( reviver, dont_enable_weapons ) self.laststand = undefined; valid_reviver = 1; + if ( is_gametype_active( "zgrief" ) && reviver == self ) { valid_reviver = 0; diff --git a/scripts/zm/replaced/_zm_magicbox.gsc b/scripts/zm/replaced/_zm_magicbox.gsc index 8910a315..2c314f60 100644 --- a/scripts/zm/replaced/_zm_magicbox.gsc +++ b/scripts/zm/replaced/_zm_magicbox.gsc @@ -19,16 +19,20 @@ treasure_chest_init( start_chest_name ) flag_init( "chest_has_been_used" ); level.chest_moves = 0; level.chest_level = 0; + if ( level.chests.size == 0 ) { return; } + i = 0; + while ( i < level.chests.size ) { level.chests[ i ].box_hacks = []; level.chests[ i ].orig_origin = level.chests[ i ].origin; level.chests[ i ] maps\mp\zombies\_zm_magicbox::get_chest_pieces(); + if ( isDefined( level.chests[ i ].zombie_cost ) ) { level.chests[ i ].old_cost = level.chests[ i ].zombie_cost; @@ -39,17 +43,22 @@ treasure_chest_init( start_chest_name ) { level.chests[ i ].old_cost = 950; } + i++; } + if ( (getDvar("g_gametype") == "zgrief" && getDvarIntDefault("ui_gametype_pro", 0)) || !level.enable_magic ) { foreach (chest in level.chests) { chest maps\mp\zombies\_zm_magicbox::hide_chest(); } + return; } + level.chest_accessed = 0; + if ( level.chests.size > 1 ) { flag_set( "moving_chest_enabled" ); @@ -60,6 +69,7 @@ treasure_chest_init( start_chest_name ) level.chest_index = 0; level.chests[ 0 ].no_fly_away = 1; } + init_starting_chest_location( start_chest_name ); array_thread( level.chests, ::treasure_chest_think ); } @@ -522,6 +532,7 @@ treasure_chest_weapon_spawn( chest, player, respin ) self.weapon_string = undefined; joker_angles = angles - vectorscale( ( 0, 1, 0 ), 90.0 ); + if ( angles[2] < 0 ) { joker_angles = angles + vectorscale( ( 0, 1, 0 ), 90.0 ); @@ -714,28 +725,36 @@ treasure_chest_move( player_vox ) level waittill( "weapon_fly_away_start" ); players = get_players(); array_thread( players, maps\mp\zombies\_zm_magicbox::play_crazi_sound ); + if ( isDefined( player_vox ) ) { player_vox delay_thread( randomintrange( 2, 7 ), maps\mp\zombies\_zm_audio::create_and_play_dialog, "general", "box_move" ); } + level waittill( "weapon_fly_away_end" ); + if ( isDefined( self.zbarrier ) ) { self maps\mp\zombies\_zm_magicbox::hide_chest( 1 ); } + wait 0.1; + if ( level.zombie_vars[ "zombie_powerup_fire_sale_on" ] == 1 && self [[ level._zombiemode_check_firesale_loc_valid_func ]]() ) { current_sale_time = level.zombie_vars[ "zombie_powerup_fire_sale_time" ]; wait_network_frame(); self thread maps\mp\zombies\_zm_magicbox::fire_sale_fix(); level.zombie_vars[ "zombie_powerup_fire_sale_time" ] = current_sale_time; + while ( level.zombie_vars[ "zombie_powerup_fire_sale_time" ] > 0 ) { wait 0.1; } } + level.verify_chest = 0; + if ( isDefined( level._zombiemode_custom_box_move_logic ) ) { [[ level._zombiemode_custom_box_move_logic ]](); @@ -744,10 +763,12 @@ treasure_chest_move( player_vox ) { default_box_move_logic(); } + if ( isDefined( level.chests[ level.chest_index ].box_hacks[ "summon_box" ] ) ) { level.chests[ level.chest_index ] [[ level.chests[ level.chest_index ].box_hacks[ "summon_box" ] ]]( 0 ); } + playfx( level._effect[ "poltergeist" ], level.chests[ level.chest_index ].zbarrier.origin ); level.chests[ level.chest_index ] maps\mp\zombies\_zm_magicbox::show_chest(); flag_clear( "moving_chest_now" ); @@ -799,6 +820,7 @@ timer_til_despawn( v_float ) self endon( "kill_weapon_movement" ); self moveto( self.origin - ( v_float * 0.85 ), level.magicbox_timeout, level.magicbox_timeout * 0.5 ); wait level.magicbox_timeout; + if ( isDefined( self ) ) { self delete(); @@ -824,6 +846,7 @@ decide_hide_show_hint( endon_notify, second_endon_notify, onlyplayer ) use_choke = 1; is_grenade = 0; + if ( isDefined( self.zombie_weapon_upgrade ) && weaponType( self.zombie_weapon_upgrade ) == "grenade" ) { is_grenade = 1; @@ -888,6 +911,7 @@ trigger_visible_to_player( player ) else { is_chest = 0; + foreach ( chest in level.chests ) { if ( self.stub.trigger_target == chest ) diff --git a/scripts/zm/replaced/_zm_melee_weapon.gsc b/scripts/zm/replaced/_zm_melee_weapon.gsc index 538f53f6..b9ef0ebc 100644 --- a/scripts/zm/replaced/_zm_melee_weapon.gsc +++ b/scripts/zm/replaced/_zm_melee_weapon.gsc @@ -7,11 +7,13 @@ change_melee_weapon( weapon_name, current_weapon ) { current_melee_weapon = self get_player_melee_weapon(); + if ( isDefined( current_melee_weapon ) && current_melee_weapon != weapon_name ) { self takeweapon( current_melee_weapon ); unacquire_weapon_toggle( current_melee_weapon ); } + self set_player_melee_weapon( weapon_name ); had_ballistic = 0; had_ballistic_upgraded = 0; @@ -21,52 +23,65 @@ change_melee_weapon( weapon_name, current_weapon ) ballistic_ammo_stock = 0; primaryweapons = self getweaponslistprimaries(); i = 0; + while ( i < primaryweapons.size ) { primary_weapon = primaryweapons[ i ]; + if ( issubstr( primary_weapon, "knife_ballistic_" ) ) { had_ballistic = 1; + if ( primary_weapon == current_weapon ) { ballistic_was_primary = 1; } + old_ballistic = primary_weapon; ballistic_ammo_clip = self getWeaponAmmoClip( primary_weapon ); ballistic_ammo_stock = self getWeaponAmmoStock( primary_weapon ); self notify( "zmb_lost_knife" ); self takeweapon( primary_weapon ); unacquire_weapon_toggle( primary_weapon ); + if ( issubstr( primary_weapon, "upgraded" ) ) { had_ballistic_upgraded = 1; } } + i++; } + if ( had_ballistic ) { if ( had_ballistic_upgraded ) { new_ballistic = level.ballistic_upgraded_weapon_name[ weapon_name ]; + if ( ballistic_was_primary ) { current_weapon = new_ballistic; } + self giveweapon( new_ballistic, 0, self maps\mp\zombies\_zm_weapons::get_pack_a_punch_weapon_options( new_ballistic ) ); } else { new_ballistic = level.ballistic_weapon_name[ weapon_name ]; + if ( ballistic_was_primary ) { current_weapon = new_ballistic; } + self giveweapon( new_ballistic, 0 ); } + self giveMaxAmmo( new_ballistic ); self seteverhadweaponall( 1 ); } + return current_weapon; } diff --git a/scripts/zm/replaced/_zm_perk_random.gsc b/scripts/zm/replaced/_zm_perk_random.gsc index 4023c988..87e791b6 100644 --- a/scripts/zm/replaced/_zm_perk_random.gsc +++ b/scripts/zm/replaced/_zm_perk_random.gsc @@ -26,6 +26,7 @@ machine_selector() do new_machine = machines[randomint( machines.size )]; + while ( new_machine == level.random_perk_start_machine ); level.random_perk_start_machine = new_machine; diff --git a/scripts/zm/replaced/_zm_perks.gsc b/scripts/zm/replaced/_zm_perks.gsc index ee1dde50..bace6d3a 100644 --- a/scripts/zm/replaced/_zm_perks.gsc +++ b/scripts/zm/replaced/_zm_perks.gsc @@ -154,6 +154,7 @@ vending_trigger_think() case "specialty_armorvest": cost = 2500; break; + case "specialty_quickrevive_upgrade": case "specialty_quickrevive": if ( solo ) @@ -162,22 +163,27 @@ vending_trigger_think() cost = 1500; break; + case "specialty_fastreload_upgrade": case "specialty_fastreload": cost = 3000; break; + case "specialty_rof_upgrade": case "specialty_rof": cost = 2000; break; + case "specialty_longersprint_upgrade": case "specialty_longersprint": cost = 2000; break; + case "specialty_deadshot_upgrade": case "specialty_deadshot": cost = 1500; break; + case "specialty_additionalprimaryweapon_upgrade": case "specialty_additionalprimaryweapon": cost = 4000; @@ -215,6 +221,7 @@ vending_trigger_think() case "specialty_armorvest": self sethintstring( &"ZOMBIE_PERK_JUGGERNAUT", cost ); break; + case "specialty_quickrevive_upgrade": case "specialty_quickrevive": if ( solo ) @@ -223,34 +230,42 @@ vending_trigger_think() self sethintstring( &"ZOMBIE_PERK_QUICKREVIVE", cost ); break; + case "specialty_fastreload_upgrade": case "specialty_fastreload": self sethintstring( &"ZOMBIE_PERK_FASTRELOAD", cost ); break; + case "specialty_rof_upgrade": case "specialty_rof": self sethintstring( &"ZOMBIE_PERK_DOUBLETAP", cost ); break; + case "specialty_longersprint_upgrade": case "specialty_longersprint": self sethintstring( &"ZOMBIE_PERK_MARATHON", cost ); break; + case "specialty_deadshot_upgrade": case "specialty_deadshot": self sethintstring( &"ZOMBIE_PERK_DEADSHOT", cost ); break; + case "specialty_additionalprimaryweapon_upgrade": case "specialty_additionalprimaryweapon": self sethintstring( &"ZOMBIE_PERK_ADDITIONALPRIMARYWEAPON", cost ); break; + case "specialty_scavenger_upgrade": case "specialty_scavenger": self sethintstring( &"ZOMBIE_PERK_TOMBSTONE", cost ); break; + case "specialty_finalstand_upgrade": case "specialty_finalstand": self sethintstring( &"ZOMBIE_PERK_CHUGABUD", cost ); break; + default: self sethintstring( perk + " Cost: " + level.zombie_vars["zombie_perk_cost"] ); } @@ -393,40 +408,49 @@ perk_give_bottle_end( gun, perk ) case "specialty_rof": weapon = level.machine_assets["doubletap"].weapon; break; + case "specialty_longersprint_upgrade": case "specialty_longersprint": weapon = level.machine_assets["marathon"].weapon; break; + case "specialty_flakjacket_upgrade": case "specialty_flakjacket": weapon = level.machine_assets["divetonuke"].weapon; break; + case "specialty_armorvest_upgrade": case "specialty_armorvest": weapon = level.machine_assets["juggernog"].weapon; self.jugg_used = 1; break; + case "specialty_quickrevive_upgrade": case "specialty_quickrevive": weapon = level.machine_assets["revive"].weapon; break; + case "specialty_fastreload_upgrade": case "specialty_fastreload": weapon = level.machine_assets["speedcola"].weapon; self.speed_used = 1; break; + case "specialty_deadshot_upgrade": case "specialty_deadshot": weapon = level.machine_assets["deadshot"].weapon; break; + case "specialty_additionalprimaryweapon_upgrade": case "specialty_additionalprimaryweapon": weapon = level.machine_assets["additionalprimaryweapon"].weapon; break; + case "specialty_scavenger_upgrade": case "specialty_scavenger": weapon = level.machine_assets["tombstone"].weapon; break; + case "specialty_finalstand_upgrade": case "specialty_finalstand": weapon = level.machine_assets["whoswho"].weapon; @@ -676,6 +700,7 @@ destroy_weapon_in_blackout( player ) { self.worldgun.worldgundw delete(); } + self.worldgun delete(); } @@ -686,9 +711,11 @@ give_perk( perk, bought ) { self setperk( perk ); self.num_perks++; + if ( isDefined( bought ) && bought ) { self maps\mp\zombies\_zm_audio::playerexert( "burp" ); + if ( isDefined( level.remove_perk_vo_delay ) && level.remove_perk_vo_delay ) { self maps\mp\zombies\_zm_audio::perk_vox( perk ); @@ -697,9 +724,12 @@ give_perk( perk, bought ) { self delay_thread( 1.5, maps\mp\zombies\_zm_audio::perk_vox, perk ); } + self notify( "perk_bought" ); } + self perk_set_max_health_if_jugg( perk, 1, 0 ); + if ( isDefined( level.disable_deadshot_clientfield ) && !level.disable_deadshot_clientfield ) { if ( perk == "specialty_deadshot" ) @@ -714,18 +744,23 @@ give_perk( perk, bought ) } } } + if ( perk == "specialty_scavenger" ) { self.hasperkspecialtytombstone = 1; } + players = get_players(); + if ( use_solo_revive() && perk == "specialty_quickrevive" ) { self.lives = 1; + if ( !isDefined( level.solo_lives_given ) ) { level.solo_lives_given = 0; } + if ( isDefined( level.solo_game_free_player_quickrevive ) ) { level.solo_game_free_player_quickrevive = undefined; @@ -734,40 +769,50 @@ give_perk( perk, bought ) { level.solo_lives_given++; } + if ( level.solo_lives_given >= 3 ) { flag_set( "solo_revive" ); } + self thread solo_revive_buy_trigger_move( perk ); } + if ( perk == "specialty_finalstand" ) { self.hasperkspecialtychugabud = 1; self notify( "perk_chugabud_activated" ); } + if ( perk == "specialty_additionalprimaryweapon" ) { self scripts\zm\replaced\_zm::restore_additionalprimaryweapon(); } + if ( isDefined( level._custom_perks[ perk ] ) && isDefined( level._custom_perks[ perk ].player_thread_give ) ) { self thread [[ level._custom_perks[ perk ].player_thread_give ]](); } + self set_perk_clientfield( perk, 1 ); maps\mp\_demo::bookmark( "zm_player_perk", getTime(), self ); self maps\mp\zombies\_zm_stats::increment_client_stat( "perks_drank" ); self maps\mp\zombies\_zm_stats::increment_client_stat( perk + "_drank" ); self maps\mp\zombies\_zm_stats::increment_player_stat( perk + "_drank" ); self maps\mp\zombies\_zm_stats::increment_player_stat( "perks_drank" ); + if ( !isDefined( self.perk_history ) ) { self.perk_history = []; } + self.perk_history = add_to_array( self.perk_history, perk, 0 ); + if ( !isDefined( self.perks_active ) ) { self.perks_active = []; } + self.perks_active[ self.perks_active.size ] = perk; self notify( "perk_acquired" ); self thread perk_think( perk ); @@ -780,10 +825,12 @@ perk_think( perk ) perk_str = perk + "_stop"; result = self waittill_any_return( "fake_death", "death", "player_downed", perk_str ); do_retain = 1; + if ( use_solo_revive() && perk == "specialty_quickrevive" ) { do_retain = 0; } + if ( do_retain ) { if ( is_true( self._retain_perks ) ) @@ -795,6 +842,7 @@ perk_think( perk ) return; } } + self unsetperk( perk ); self.num_perks--; @@ -803,43 +851,55 @@ perk_think( perk ) case "specialty_armorvest": self setmaxhealth( self.premaxhealth ); break; + case "specialty_additionalprimaryweapon": if ( result == perk_str ) { self maps\mp\zombies\_zm::take_additionalprimaryweapon(); } + break; + case "specialty_deadshot": if ( !is_true( level.disable_deadshot_clientfield ) ) { self setclientfieldtoplayer( "deadshot_perk", 0 ); } + break; + case "specialty_deadshot_upgrade": if ( !is_true( level.disable_deadshot_clientfield ) ) { self setclientfieldtoplayer( "deadshot_perk", 0 ); } + break; } + if ( isDefined( level._custom_perks[ perk ] ) && isDefined( level._custom_perks[ perk ].player_thread_take ) ) { self thread [[ level._custom_perks[ perk ].player_thread_take ]](); } + self set_perk_clientfield( perk, 0 ); self.perk_purchased = undefined; + if ( isDefined( level.perk_lost_func ) ) { self [[ level.perk_lost_func ]]( perk ); } + if ( isDefined( self.perks_active ) && isinarray( self.perks_active, perk ) ) { arrayremovevalue( self.perks_active, perk, 0 ); } + if ( isDefined( self.disabled_perks ) && isDefined( self.disabled_perks[perk] ) ) { self.disabled_perks[perk] = undefined; } + self notify( "perk_lost" ); } @@ -926,33 +986,43 @@ set_perk_clientfield( perk, state ) case "specialty_additionalprimaryweapon": self setclientfieldtoplayer( "perk_additional_primary_weapon", state ); break; + case "specialty_deadshot": self setclientfieldtoplayer( "perk_dead_shot", state ); break; + case "specialty_flakjacket": self setclientfieldtoplayer( "perk_dive_to_nuke", state ); break; + case "specialty_rof": self setclientfieldtoplayer( "perk_double_tap", state ); break; + case "specialty_armorvest": self setclientfieldtoplayer( "perk_juggernaut", state ); break; + case "specialty_movefaster": self setclientfieldtoplayer( "perk_marathon", state ); break; + case "specialty_quickrevive": self setclientfieldtoplayer( "perk_quick_revive", state ); break; + case "specialty_fastreload": self setclientfieldtoplayer( "perk_sleight_of_hand", state ); break; + case "specialty_scavenger": self setclientfieldtoplayer( "perk_tombstone", state ); break; + case "specialty_finalstand": self setclientfieldtoplayer( "perk_chugabud", state ); break; + default: break; } @@ -1024,6 +1094,7 @@ remove_pap_machine() exceptions = array("specialty_armorvest", "specialty_fastreload"); structs = getStructArray("zm_perk_machine", "targetname"); + foreach(struct in structs) { if(isDefined(struct.script_noteworthy) && struct.script_noteworthy == "specialty_weapupgrade") @@ -1063,6 +1134,7 @@ move_perk_machine(map, location, perk, move_struct) if(isDefined(move_struct.script_string)) { gametypes = strTok(move_struct.script_string, " "); + foreach(gametype in gametypes) { perk_struct.script_string += " " + gametype + "_perks_" + location; @@ -1104,15 +1176,18 @@ turn_movefaster_on() machine = getentarray( "vending_marathon", "targetname" ); machine_triggers = getentarray( "vending_marathon", "target" ); i = 0; + while ( i < machine.size ) { machine[ i ] setmodel( level.machine_assets[ "marathon" ].off_model ); i++; } + array_thread( machine_triggers, ::set_power_on, 0 ); level thread do_initial_power_off_callback( machine, "marathon" ); level waittill( "marathon_on" ); i = 0; + while ( i < machine.size ) { machine[ i ] setmodel( level.machine_assets[ "marathon" ].on_model ); @@ -1122,17 +1197,22 @@ turn_movefaster_on() machine[ i ] thread play_loop_on_machine(); i++; } + level notify( "specialty_movefaster_power_on" ); array_thread( machine_triggers, ::set_power_on, 1 ); + if ( isDefined( level.machine_assets[ "marathon" ].power_on_callback ) ) { array_thread( machine, level.machine_assets[ "marathon" ].power_on_callback ); } + level waittill( "marathon_off" ); + if ( isDefined( level.machine_assets[ "marathon" ].power_off_callback ) ) { array_thread( machine, level.machine_assets[ "marathon" ].power_off_callback ); } + array_thread( machine, ::turn_perk_off ); } } diff --git a/scripts/zm/replaced/_zm_playerhealth.gsc b/scripts/zm/replaced/_zm_playerhealth.gsc index c0f37989..18c152c0 100644 --- a/scripts/zm/replaced/_zm_playerhealth.gsc +++ b/scripts/zm/replaced/_zm_playerhealth.gsc @@ -38,16 +38,19 @@ playerhealthregen() healthoverlaycutoff = 0.2; self thread maps\mp\zombies\_zm_playerhealth::playerhurtcheck(); + if ( !isDefined( self.veryhurt ) ) { self.veryhurt = 0; } + self.bolthit = 0; if ( getDvar( "scr_playerInvulTimeScale" ) == "" ) { setdvar( "scr_playerInvulTimeScale", 1 ); } + playerinvultimescale = getDvarFloat( "scr_playerInvulTimeScale" ); for ( ;; ) @@ -73,6 +76,7 @@ playerhealthregen() { player_flag_clear( "player_has_red_flashing_overlay" ); } + lastinvulratio = 1; playerjustgotredflashing = 0; veryhurt = 0; @@ -93,6 +97,7 @@ playerhealthregen() if ( self.health <= 50 ) { veryhurt = 1; + if ( !wasveryhurt ) { hurttime = getTime(); @@ -117,6 +122,7 @@ playerhealthregen() { self.veryhurt = veryhurt; newhealth = health_ratio; + if ( veryhurt ) { if ( ( getTime() - hurttime ) >= longregendelay ) @@ -173,6 +179,7 @@ playerhealthregen() { self player_flag_set( "player_is_invulnerable" ); level notify( "player_becoming_invulnerable" ); + if ( playerjustgotredflashing ) { invultime = level.invultime_onshield; @@ -186,6 +193,7 @@ playerhealthregen() { invultime = level.invultime_preshield; } + invultime *= playerinvultimescale; lastinvulratio = self.health / self.maxhealth; self thread maps\mp\zombies\_zm_playerhealth::playerinvul( invultime ); diff --git a/scripts/zm/replaced/_zm_power.gsc b/scripts/zm/replaced/_zm_power.gsc index 09cce580..06048315 100644 --- a/scripts/zm/replaced/_zm_power.gsc +++ b/scripts/zm/replaced/_zm_power.gsc @@ -8,6 +8,7 @@ standard_powered_items() flag_wait( "start_zombie_round_logic" ); vending_triggers = getentarray( "zombie_vending", "targetname" ); i = 0; + while ( i < vending_triggers.size) { if ( vending_triggers[ i ].script_noteworthy == "specialty_weapupgrade" ) @@ -15,33 +16,42 @@ standard_powered_items() i++; continue; } + powered_on = maps\mp\zombies\_zm_perks::get_perk_machine_start_state( vending_triggers[ i ].script_noteworthy ); add_powered_item( ::perk_power_on, ::perk_power_off, ::perk_range, ::cost_low_if_local, 0, powered_on, vending_triggers[ i ] ); i++; } + pack_a_punch = getentarray( "specialty_weapupgrade", "script_noteworthy" ); + foreach ( trigger in pack_a_punch ) { powered_on = maps\mp\zombies\_zm_perks::get_perk_machine_start_state( trigger.script_noteworthy ); trigger.powered = add_powered_item( ::pap_power_on, ::pap_power_off, ::pap_range, ::cost_low_if_local, 0, powered_on, trigger ); } + zombie_doors = getentarray( "zombie_door", "targetname" ); + foreach ( door in zombie_doors ) { if ( isDefined( door.script_noteworthy ) && door.script_noteworthy == "electric_door" ) { add_powered_item( ::door_power_on, ::door_power_off, ::door_range, ::cost_door, 0, 0, door ); } + if ( isDefined( door.script_noteworthy ) && door.script_noteworthy == "local_electric_door" ) { power_sources = 0; + if ( !is_true( level.power_local_doors_globally ) ) { power_sources = 1; } + add_powered_item( ::door_local_power_on, ::door_local_power_off, ::door_range, ::cost_door, power_sources, 0, door ); } } + thread watch_global_power(); } @@ -49,10 +59,12 @@ perk_power_off( origin, radius ) { self.target notify( "death" ); self.target thread maps\mp\zombies\_zm_perks::vending_trigger_think(); + if ( isDefined( self.target.perk_hum ) ) { self.target.perk_hum delete(); } + maps\mp\zombies\_zm_perks::perk_pause( self.target.script_noteworthy ); level notify( self.target maps\mp\zombies\_zm_perks::getvendingmachinenotify() + "_off" ); } \ No newline at end of file diff --git a/scripts/zm/replaced/_zm_powerups.gsc b/scripts/zm/replaced/_zm_powerups.gsc index e548cc63..c376006c 100644 --- a/scripts/zm/replaced/_zm_powerups.gsc +++ b/scripts/zm/replaced/_zm_powerups.gsc @@ -160,18 +160,22 @@ powerup_grab( powerup_team ) players[i].zombie_nuked = arraysort( zombies, self.origin ); players[i] notify( "nuke_triggered" ); break; + case "full_ammo": level thread full_ammo_powerup( self, players[i] ); players[i] thread powerup_vo( "full_ammo" ); break; + case "double_points": level thread double_points_powerup( self, players[i] ); players[i] thread powerup_vo( "double_points" ); break; + case "insta_kill": level thread insta_kill_powerup( self, players[i] ); players[i] thread powerup_vo( "insta_kill" ); break; + case "carpenter": if ( is_classic() ) players[i] thread maps\mp\zombies\_zm_pers_upgrades::persistent_carpenter_ability_check(); @@ -183,43 +187,55 @@ powerup_grab( powerup_team ) players[i] thread powerup_vo( "carpenter" ); break; + case "fire_sale": level thread start_fire_sale( self ); players[i] thread powerup_vo( "firesale" ); break; + case "bonfire_sale": level thread start_bonfire_sale( self ); players[i] thread powerup_vo( "firesale" ); break; + case "minigun": level thread minigun_weapon_powerup( players[i] ); players[i] thread powerup_vo( "minigun" ); break; + case "free_perk": level thread free_perk_powerup( self ); break; + case "tesla": level thread tesla_weapon_powerup( players[i] ); players[i] thread powerup_vo( "tesla" ); break; + case "random_weapon": if ( !level random_weapon_powerup( self, players[i] ) ) continue; + break; + case "bonus_points_player": level thread bonus_points_player_powerup( self, players[i] ); players[i] thread powerup_vo( "bonus_points_solo" ); break; + case "bonus_points_team": level thread bonus_points_team_powerup( self ); players[i] thread powerup_vo( "bonus_points_team" ); break; + case "teller_withdrawl": level thread teller_withdrawl( self, players[i] ); break; + default: if ( isdefined( level._zombiemode_powerup_grab ) ) level thread [[ level._zombiemode_powerup_grab ]]( self, players[i] ); + break; } } @@ -298,6 +314,7 @@ powerup_grab( powerup_team ) full_ammo_powerup( drop_item, player ) { clip_only = 0; + if(level.scr_zm_ui_gametype == "zgrief") { clip_only = 1; @@ -305,11 +322,14 @@ full_ammo_powerup( drop_item, player ) } players = get_players( player.team ); + if ( isdefined( level._get_game_module_players ) ) { players = [[ level._get_game_module_players ]]( player ); } + i = 0; + while ( i < players.size ) { if ( players[ i ] maps\mp\zombies\_zm_laststand::player_is_in_laststand() ) @@ -317,6 +337,7 @@ full_ammo_powerup( drop_item, player ) i++; continue; } + primary_weapons = players[ i ] getweaponslist( 1 ); players[ i ] notify( "zmb_max_ammo" ); @@ -325,6 +346,7 @@ full_ammo_powerup( drop_item, player ) players[ i ] notify( "zmb_disable_spikemore_prompt" ); x = 0; + while ( x < primary_weapons.size ) { if ( level.headshots_only && is_lethal_grenade(primary_weapons[ x ] ) ) @@ -356,6 +378,7 @@ full_ammo_powerup( drop_item, player ) } new_ammo = players[i] getWeaponAmmoStock(primary_weapons[x]) + weaponClipSize(primary_weapons[x]); + if(weaponDualWieldWeaponName(primary_weapons[x]) != "none") { new_ammo += weaponClipSize(weaponDualWieldWeaponName(primary_weapons[x])); @@ -373,6 +396,7 @@ full_ammo_powerup( drop_item, player ) players[i] givemaxammo(primary_weapons[x]); } } + x++; } @@ -380,6 +404,7 @@ full_ammo_powerup( drop_item, player ) i++; } + level thread full_ammo_on_hud( drop_item, player.team ); if(level.scr_zm_ui_gametype == "zgrief") @@ -424,6 +449,7 @@ empty_clip_powerup( drop_item, player ) i = 0; players = get_players(team); + while(i < players.size) { if ( players[ i ] maps\mp\zombies\_zm_laststand::player_is_in_laststand() ) @@ -433,6 +459,7 @@ empty_clip_powerup( drop_item, player ) } primaries = players[i] getweaponslistprimaries(); + foreach(weapon in primaries) { dual_wield_weapon = weaponDualWieldWeaponName(weapon); @@ -539,6 +566,7 @@ nuke_powerup( drop_item, player_team ) } players = get_players( player_team ); + for ( i = 0; i < players.size; i++ ) { players[ i ] maps\mp\zombies\_zm_score::player_add_points( "nuke_powerup", 400 ); @@ -547,6 +575,7 @@ nuke_powerup( drop_item, player_team ) if(level.scr_zm_ui_gametype == "zgrief") { players = get_players(getOtherTeam(player_team)); + for(i = 0; i < players.size; i++) { if(is_player_valid(players[i])) @@ -599,6 +628,7 @@ insta_kill_powerup( drop_item, player ) team = player.team; time = 30; + if(level.scr_zm_ui_gametype == "zgrief") { time = 15; @@ -637,12 +667,14 @@ insta_kill_powerup( drop_item, player ) players = get_players( team ); i = 0; + while ( i < players.size ) { if ( isDefined( players[ i ] ) ) { players[ i ] notify( "insta_kill_over" ); } + i++; } } @@ -682,6 +714,7 @@ double_points_powerup( drop_item, player ) team = player.team; time = 30; + if(level.scr_zm_ui_gametype == "zgrief") { time = 15; @@ -715,6 +748,7 @@ double_points_powerup( drop_item, player ) } players = get_players( team ); + for ( i = 0; i < players.size; i++ ) { players[ i ] setclientfield( "score_cf_double_points_active", 1 ); @@ -740,6 +774,7 @@ double_points_powerup( drop_item, player ) temp_ent delete(); players = get_players( team ); + for ( i = 0; i < players.size; i++ ) { players[ i ] playsound( "zmb_points_loop_off" ); diff --git a/scripts/zm/replaced/_zm_score.gsc b/scripts/zm/replaced/_zm_score.gsc index 0e3e86bb..0cd18d2e 100644 --- a/scripts/zm/replaced/_zm_score.gsc +++ b/scripts/zm/replaced/_zm_score.gsc @@ -9,17 +9,21 @@ add_to_player_score( points, add_to_total ) { add_to_total = 1; } + if ( !isDefined( points ) || level.intermission ) { return; } + points = int(points); // points must be an int self.score += points; self.pers[ "score" ] = self.score; + if ( add_to_total ) { self.score_total += points; } + self incrementplayerstat( "score", points ); } @@ -29,6 +33,7 @@ minus_to_player_score( points ) { return; } + points = int(points); // points must be an int self.score -= points; self.pers[ "score" ] = self.score; @@ -60,6 +65,7 @@ player_add_points_kill_bonus( mod, hit_location ) self score_cf_increment_info( "death_head" ); score = level.zombie_vars["zombie_score_bonus_head"]; break; + default: self score_cf_increment_info( "death_normal" ); break; diff --git a/scripts/zm/replaced/_zm_spawner.gsc b/scripts/zm/replaced/_zm_spawner.gsc index d0faf29b..523e7768 100644 --- a/scripts/zm/replaced/_zm_spawner.gsc +++ b/scripts/zm/replaced/_zm_spawner.gsc @@ -64,12 +64,14 @@ zombie_damage( mod, hit_location, hit_origin, player, amount, team ) if ( is_placeable_mine( self.damageweapon ) ) { damage = level.round_number * 100; + if(level.scr_zm_ui_gametype == "zgrief") { damage = 2000; } max_damage = 9000; + if(damage > max_damage) { damage = max_damage; @@ -91,12 +93,14 @@ zombie_damage( mod, hit_location, hit_origin, player, amount, team ) else if ( mod == "MOD_GRENADE" || mod == "MOD_GRENADE_SPLASH" ) { damage = level.round_number * 25; + if(level.scr_zm_ui_gametype == "zgrief") { damage = 500; } max_damage = 1500; + if(damage > max_damage) { damage = max_damage; @@ -116,12 +120,14 @@ zombie_damage( mod, hit_location, hit_origin, player, amount, team ) else if ( mod == "MOD_PROJECTILE" || mod == "MOD_PROJECTILE_SPLASH" || mod == "MOD_EXPLOSIVE" ) { damage = level.round_number * 50; + if(level.scr_zm_ui_gametype == "zgrief") { damage = 1000; } max_damage = 3000; + if(damage > max_damage) { damage = max_damage; @@ -142,6 +148,7 @@ zombie_damage( mod, hit_location, hit_origin, player, amount, team ) if ( isDefined( player ) ) { rand = randomintrange( 0, 100 ); + if ( rand < 10 ) { player maps\mp\zombies\_zm_audio::create_and_play_dialog( "general", "crawl_spawn" ); @@ -157,6 +164,7 @@ zombie_damage( mod, hit_location, hit_origin, player, amount, team ) if ( isDefined( player ) ) { rand = randomintrange( 0, 100 ); + if ( rand < 7 ) { player maps\mp\zombies\_zm_audio::create_and_play_dialog( "general", "shoot_arm" ); @@ -201,16 +209,19 @@ zombie_gib_on_damage() refs[refs.size] = "guts"; refs[refs.size] = "right_arm"; break; + case "right_hand": case "right_arm_upper": case "right_arm_lower": refs[refs.size] = "right_arm"; break; + case "left_hand": case "left_arm_upper": case "left_arm_lower": refs[refs.size] = "left_arm"; break; + case "right_leg_upper": case "right_leg_lower": case "right_foot": @@ -223,6 +234,7 @@ zombie_gib_on_damage() } break; + case "left_leg_upper": case "left_leg_lower": case "left_foot": @@ -235,6 +247,7 @@ zombie_gib_on_damage() } break; + default: if ( self.damagelocation == "none" ) { diff --git a/scripts/zm/replaced/_zm_sq.gsc b/scripts/zm/replaced/_zm_sq.gsc index 54225c1e..bc37d15e 100644 --- a/scripts/zm/replaced/_zm_sq.gsc +++ b/scripts/zm/replaced/_zm_sq.gsc @@ -25,6 +25,7 @@ navcomputer_waitfor_navcard() navcomputer_use_trig playsound( "zmb_sq_navcard_success" ); players = get_players(); + foreach (player in players) { player freezecontrols(1); @@ -53,6 +54,7 @@ sq_give_player_all_perks() else { machines = array_randomize( getentarray( "zombie_vending", "targetname" ) ); + for ( i = 0; i < machines.size; i++ ) { if ( machines[i].script_noteworthy == "specialty_weapupgrade" ) diff --git a/scripts/zm/replaced/_zm_utility.gsc b/scripts/zm/replaced/_zm_utility.gsc index 0466392d..f93a9623 100644 --- a/scripts/zm/replaced/_zm_utility.gsc +++ b/scripts/zm/replaced/_zm_utility.gsc @@ -85,44 +85,56 @@ create_zombie_point_of_interest_attractor_positions( num_attract_dists, diff_per { self endon( "death" ); forward = ( 0, 1, 0 ); + if ( !isDefined( self.num_poi_attracts ) || isDefined( self.script_noteworthy ) && self.script_noteworthy != "zombie_poi" ) { return; } + if ( !isDefined( num_attract_dists ) ) { num_attract_dists = 4; } + if ( !isDefined( diff_per_dist ) ) { diff_per_dist = 45; } + if ( !isDefined( attractor_width ) ) { attractor_width = 45; } + self.attract_to_origin = 0; self.num_attract_dists = num_attract_dists; self.last_index = []; + for ( i = 0; i < num_attract_dists; i++ ) { self.last_index[ i ] = -1; } + self.attract_dists = []; + for ( i = 0; i < self.num_attract_dists; i++ ) { self.attract_dists[ i ] = diff_per_dist * ( i + 1 ); } + max_positions = []; + for ( i = 0; i < self.num_attract_dists; i++ ) { max_positions[ i ] = int( ( 6.28 * self.attract_dists[ i ] ) / attractor_width ); } + num_attracts_per_dist = self.num_poi_attracts / self.num_attract_dists; self.max_attractor_dist = self.attract_dists[ self.attract_dists.size - 1 ] * 1.1; diff = 0; actual_num_positions = []; i = 0; + while ( i < self.num_attract_dists ) { if ( num_attracts_per_dist > ( max_positions[ i ] + diff ) ) @@ -132,14 +144,17 @@ create_zombie_point_of_interest_attractor_positions( num_attract_dists, diff_per i++; continue; } + actual_num_positions[ i ] = num_attracts_per_dist + diff; diff = 0; i++; } + self.attractor_positions = []; failed = 0; angle_offset = 0; prev_last_index = -1; + for ( j = 0; j < 4; j++) { if ( ( actual_num_positions[ j ] + failed ) < max_positions[ j ] ) @@ -152,6 +167,7 @@ create_zombie_point_of_interest_attractor_positions( num_attract_dists, diff_per actual_num_positions[ j ] = max_positions[ j ]; failed = max_positions[ j ] - actual_num_positions[ j ]; } + failed += self generated_radius_attract_positions( forward, angle_offset, actual_num_positions[ j ], self.attract_dists[ j ] ); angle_offset += 15; self.last_index[ j ] = int( ( actual_num_positions[ j ] - failed ) + prev_last_index ); diff --git a/scripts/zm/replaced/_zm_weap_ballistic_knife.gsc b/scripts/zm/replaced/_zm_weap_ballistic_knife.gsc index b486fb5f..b2ba5e3f 100644 --- a/scripts/zm/replaced/_zm_weap_ballistic_knife.gsc +++ b/scripts/zm/replaced/_zm_weap_ballistic_knife.gsc @@ -28,6 +28,7 @@ on_spawn( watcher, player ) retrievable_model.angles = angles; retrievable_model.name = watcher.weapon; isfriendly = 0; + if ( isDefined( prey ) ) { if ( isplayer( prey ) ) @@ -38,6 +39,7 @@ on_spawn( watcher, player ) { isfriendly = 1; } + if ( isfriendly ) { retrievable_model physicslaunch( normal, ( randomint( 10 ), randomint( 10 ), randomint( 10 ) ) ); @@ -49,8 +51,10 @@ on_spawn( watcher, player ) retrievable_model thread force_drop_knives_to_ground_on_death( player, prey ); } } + watcher.objectarray[ watcher.objectarray.size ] = retrievable_model; retrievable_model thread drop_knives_to_ground( player ); + if( isfriendly ) { player notify( "ballistic_knife_stationary", retrievable_model, normal ); @@ -68,29 +72,36 @@ watch_use_trigger( trigger, model, callback, weapon, playersoundonuse, npcsoundo self endon( "delete" ); level endon( "game_ended" ); autorecover = is_true( level.ballistic_knife_autorecover ); + while ( 1 ) { trigger waittill( "trigger", player ); + if ( !isalive( player ) ) { continue; } + if ( isDefined( trigger.triggerteam ) && player.team != trigger.triggerteam ) { continue; } + if ( isDefined( trigger.claimedby ) && player != trigger.claimedby ) { continue; } + if ( isDefined( trigger.owner ) && player != trigger.owner ) { continue; } + if ( player getcurrentweapon() == weapon && player getweaponammostock( weapon ) >= weaponmaxammo( weapon ) ) { continue; } + if ( !autorecover && !is_true( trigger.force_pickup ) ) { if( player.throwinggrenade || player meleebuttonpressed() ) @@ -98,14 +109,17 @@ watch_use_trigger( trigger, model, callback, weapon, playersoundonuse, npcsoundo continue; } } + if ( isDefined( playersoundonuse ) ) { player playlocalsound( playersoundonuse ); } + if ( isDefined( npcsoundonuse ) ) { player playsound( npcsoundonuse ); } + player thread [[ callback ]]( weapon, model, trigger ); return; } diff --git a/scripts/zm/replaced/_zm_weap_blundersplat.gsc b/scripts/zm/replaced/_zm_weap_blundersplat.gsc index d87051ef..e285a598 100644 --- a/scripts/zm/replaced/_zm_weap_blundersplat.gsc +++ b/scripts/zm/replaced/_zm_weap_blundersplat.gsc @@ -62,6 +62,7 @@ _titus_locate_target( is_not_upgraded = 1, count ) n_fuse_timer = randomfloatrange( 3.0, 4.0 ); n_spread = 5; + if (isads(self)) { n_spread *= 0.5; diff --git a/scripts/zm/replaced/_zm_weap_claymore.gsc b/scripts/zm/replaced/_zm_weap_claymore.gsc index e0b27937..7a1e46da 100644 --- a/scripts/zm/replaced/_zm_weap_claymore.gsc +++ b/scripts/zm/replaced/_zm_weap_claymore.gsc @@ -9,26 +9,33 @@ buy_claymores() self sethintstring( &"ZOMBIE_CLAYMORE_PURCHASE" ); self setcursorhint( "HINT_WEAPON", "claymore_zm" ); self endon( "kill_trigger" ); + if ( !isDefined( self.stub ) ) { return; } + if ( isDefined( self.stub ) && !isDefined( self.stub.claymores_triggered ) ) { self.stub.claymores_triggered = 0; } + self.claymores_triggered = self.stub.claymores_triggered; + while ( 1 ) { self waittill( "trigger", who ); + while ( who in_revive_trigger() ) { continue; } + while ( who has_powerup_weapon() ) { wait 0.1; } + if ( is_player_valid( who ) ) { if ( who.score >= self.zombie_cost ) @@ -37,19 +44,24 @@ buy_claymores() { play_sound_at_pos( "purchase", self.origin ); who maps\mp\zombies\_zm_score::minus_to_player_score( self.zombie_cost ); + if ( !who is_player_placeable_mine( "claymore_zm" ) ) { who thread show_claymore_hint( "claymore_purchased" ); } + who thread claymore_setup(); who thread maps\mp\zombies\_zm_audio::create_and_play_dialog( "weapon_pickup", "grenade" ); + if ( isDefined( self.stub ) ) { self.claymores_triggered = self.stub.claymores_triggered; } + if ( self.claymores_triggered == 0 ) { model = getent( self.target, "targetname" ); + if ( isDefined( model ) ) { model thread maps\mp\zombies\_zm_weapons::weapon_show( who ); @@ -61,7 +73,9 @@ buy_claymores() level setclientfield( self.clientfieldname, 1 ); } } + self.claymores_triggered = 1; + if ( isDefined( self.stub ) ) { self.stub.claymores_triggered = 1; @@ -94,40 +108,50 @@ claymore_detonation() damagearea setexcludeteamfortrigger( self.team ); damagearea enablelinkto(); damagearea linkto( self ); + if ( is_true( self.isonbus ) ) { damagearea setmovingplatformenabled( 1 ); } + self.damagearea = damagearea; self thread delete_claymores_on_death( self.owner, damagearea ); self.owner.claymores[ self.owner.claymores.size ] = self; + while ( 1 ) { damagearea waittill( "trigger", ent ); + if ( isDefined( self.owner ) && ent == self.owner ) { continue; } + if ( isDefined( ent.pers ) && isDefined( ent.pers[ "team" ] ) && ent.pers[ "team" ] == self.team ) { continue; } + if ( isDefined( ent.pers ) && isDefined( ent.pers[ "team" ] ) && ent.pers[ "team" ] == getOtherTeam( self.team ) ) { continue; } + if ( isDefined( ent.ignore_claymore ) && ent.ignore_claymore ) { continue; } + if ( !ent shouldaffectweaponobject( self ) ) { continue; } + if ( ent damageconetrace( self.origin, self ) > 0 ) { self playsound( "wpn_claymore_alert" ); wait 0.4; + if ( isDefined( self.owner ) ) { self detonate( self.owner ); @@ -136,6 +160,7 @@ claymore_detonation() { self detonate( undefined ); } + return; } } diff --git a/scripts/zm/replaced/_zm_weap_emp_bomb.gsc b/scripts/zm/replaced/_zm_weap_emp_bomb.gsc index a2e87b15..eaab6a24 100644 --- a/scripts/zm/replaced/_zm_weap_emp_bomb.gsc +++ b/scripts/zm/replaced/_zm_weap_emp_bomb.gsc @@ -144,6 +144,7 @@ emp_players(origin, radius, owner) { rsquared = radius * radius; players = get_players(); + foreach(player in players) { if(distancesquared(origin, player.origin) < rsquared) @@ -167,6 +168,7 @@ player_emp_fx(time) self endon("player_perk_pause_timeout"); wait_time = 2.5; + for(i = 0; i < time; i += wait_time) { playfxontag( level._effect[ "elec_torso" ], self, "J_SpineLower" ); @@ -208,6 +210,7 @@ player_perk_pause_all_perks_acquired(time) player_perk_pause_all_perks() { vending_triggers = getentarray( "zombie_vending", "targetname" ); + foreach ( trigger in vending_triggers ) { self player_perk_pause( trigger.script_noteworthy ); @@ -219,6 +222,7 @@ player_perk_unpause_all_perks() self notify("player_perk_pause_timeout"); vending_triggers = getentarray( "zombie_vending", "targetname" ); + foreach ( trigger in vending_triggers ) { self player_perk_unpause( trigger.script_noteworthy ); @@ -238,30 +242,37 @@ player_perk_pause( perk ) { self.disabled_perks = []; } + if ( !is_true( self.disabled_perks[ perk ] ) && self hasperk( perk ) ) { self.disabled_perks[ perk ] = 1; } + if ( self.disabled_perks[ perk ] ) { self unsetperk( perk ); self maps\mp\zombies\_zm_perks::set_perk_clientfield( perk, 2 ); + if ( perk == "specialty_armorvest" || perk == "specialty_armorvest_upgrade" ) { self setmaxhealth( self.premaxhealth ); + if ( self.health > self.maxhealth ) { self.health = self.maxhealth; } } + if ( perk == "specialty_additionalprimaryweapon" || perk == "specialty_additionalprimaryweapon_upgrade" ) { self maps\mp\zombies\_zm::take_additionalprimaryweapon(); } + if ( issubstr( perk, "specialty_scavenger" ) ) { self.hasperkspecialtytombstone = 0; } + if ( isDefined( level._custom_perks[ perk ] ) && isDefined( level._custom_perks[ perk ].player_thread_take ) ) { self thread [[ level._custom_perks[ perk ].player_thread_take ]](); @@ -288,11 +299,14 @@ player_perk_unpause( perk ) self.disabled_perks[ perk ] = undefined; self maps\mp\zombies\_zm_perks::set_perk_clientfield( perk, 1 ); self setperk( perk ); + if ( issubstr( perk, "specialty_scavenger" ) ) { self.hasperkspecialtytombstone = 1; } + self maps\mp\zombies\_zm_perks::perk_set_max_health_if_jugg( perk, 0, 0 ); + if ( isDefined( level._custom_perks[ perk ] ) && isDefined( level._custom_perks[ perk ].player_thread_give ) ) { self thread [[ level._custom_perks[ perk ].player_thread_give ]](); diff --git a/scripts/zm/replaced/_zm_weap_jetgun.gsc b/scripts/zm/replaced/_zm_weap_jetgun.gsc index 0c71c03a..a97719eb 100644 --- a/scripts/zm/replaced/_zm_weap_jetgun.gsc +++ b/scripts/zm/replaced/_zm_weap_jetgun.gsc @@ -96,51 +96,64 @@ jetgun_check_enemies_in_range( zombie, view_pos, drag_range_squared, gib_range_s { return; } + if ( zombie enemy_killed_by_jetgun() ) { return; } + if ( isDefined( zombie.is_avogadro ) && zombie.is_avogadro ) { return; } + if ( isDefined( zombie.isdog ) && zombie.isdog ) { return; } + if ( isDefined( zombie.isscreecher ) && zombie.isscreecher ) { return; } + if ( isDefined( self.animname ) && self.animname == "quad_zombie" ) { return; } + test_origin = zombie getcentroid(); test_range_squared = distancesquared( view_pos, test_origin ); + if ( test_range_squared > drag_range_squared ) { zombie jetgun_debug_print( "range", ( 1, 0, 1 ) ); return; } + normal = vectornormalize( test_origin - view_pos ); dot = vectordot( forward_view_angles, normal ); + if ( abs( dot ) < 0.7 ) { zombie jetgun_debug_print( "dot", ( 1, 0, 1 ) ); return; } + radial_origin = pointonsegmentnearesttopoint( view_pos, end_pos, test_origin ); + if ( distancesquared( test_origin, radial_origin ) > cylinder_radius_squared ) { zombie jetgun_debug_print( "cylinder", ( 1, 0, 1 ) ); return; } + if ( zombie damageconetrace( view_pos, self ) == 0 ) { zombie jetgun_debug_print( "cone", ( 1, 0, 1 ) ); return; } + if ( test_range_squared < grind_range_squared ) { level.jetgun_fling_enemies[ level.jetgun_fling_enemies.size ] = zombie; @@ -152,6 +165,7 @@ jetgun_check_enemies_in_range( zombie, view_pos, drag_range_squared, gib_range_s { return; } + if ( isDefined( zombie.in_the_ground ) && zombie.in_the_ground ) { return; @@ -169,10 +183,12 @@ jetgun_grind_zombie( player ) player endon( "death" ); player endon( "disconnect" ); self endon( "death" ); + if ( !isDefined( self.jetgun_grind ) ) { self.jetgun_grind = 1; self notify( "grinding" ); + if ( is_mature() ) { if ( isDefined( level._effect[ "zombie_guts_explosion" ] ) ) @@ -180,6 +196,7 @@ jetgun_grind_zombie( player ) playfx( level._effect[ "zombie_guts_explosion" ], self gettagorigin( "J_SpineLower" ) ); } } + self.nodeathragdoll = 1; self.handle_death_notetracks = ::jetgun_handle_death_notetracks; player maps\mp\zombies\_zm_score::add_to_player_score(50 * maps\mp\zombies\_zm_score::get_points_multiplier(player)); @@ -190,6 +207,7 @@ jetgun_grind_zombie( player ) handle_overheated_jetgun() { self endon( "disconnect" ); + while ( 1 ) { self waittill( "jetgun_overheated" ); diff --git a/scripts/zm/replaced/_zm_weap_slipgun.gsc b/scripts/zm/replaced/_zm_weap_slipgun.gsc index 509fc915..8d03b3c8 100644 --- a/scripts/zm/replaced/_zm_weap_slipgun.gsc +++ b/scripts/zm/replaced/_zm_weap_slipgun.gsc @@ -109,6 +109,7 @@ explode_into_goo( player, chain_depth ) self.goo_chain_depth = chain_depth; chain_radius = level.zombie_vars["slipgun_chain_radius"]; + if ( is_true( self.goo_upgraded ) ) { chain_radius *= 1.5; diff --git a/scripts/zm/replaced/_zm_weap_slowgun.gsc b/scripts/zm/replaced/_zm_weap_slowgun.gsc index 3172d486..b08236c7 100644 --- a/scripts/zm/replaced/_zm_weap_slowgun.gsc +++ b/scripts/zm/replaced/_zm_weap_slowgun.gsc @@ -114,6 +114,7 @@ watch_reset_anim_rate() { self set_anim_rate( 1 ); self setclientfieldtoplayer( "slowgun_fx", 0 ); + while ( 1 ) { self waittill_any( "spawned_player", "entering_last_stand", "player_revived", "player_suicide" ); diff --git a/scripts/zm/replaced/_zm_weap_staff_fire.gsc b/scripts/zm/replaced/_zm_weap_staff_fire.gsc index dba8ffd1..0fca24fc 100644 --- a/scripts/zm/replaced/_zm_weap_staff_fire.gsc +++ b/scripts/zm/replaced/_zm_weap_staff_fire.gsc @@ -57,12 +57,15 @@ get_impact_damage( damageweapon ) { case "staff_fire_zm": return 2050; + case "staff_fire_upgraded_zm": case "staff_fire_upgraded2_zm": case "staff_fire_upgraded3_zm": return 3300; + case "one_inch_punch_fire_zm": return 0; + default: return 0; } diff --git a/scripts/zm/replaced/_zm_weap_tomahawk.gsc b/scripts/zm/replaced/_zm_weap_tomahawk.gsc index bc8a445c..007c0d05 100644 --- a/scripts/zm/replaced/_zm_weap_tomahawk.gsc +++ b/scripts/zm/replaced/_zm_weap_tomahawk.gsc @@ -57,6 +57,7 @@ tomahawk_attack_zombies( m_tomahawk, a_zombies ) } n_attack_limit = m_tomahawk.n_grenade_charge_power - 1; + if ( a_zombies.size <= n_attack_limit ) n_attack_limit = a_zombies.size; diff --git a/scripts/zm/replaced/_zm_weapon_locker.gsc b/scripts/zm/replaced/_zm_weapon_locker.gsc index 0872ec5d..8af6797e 100644 --- a/scripts/zm/replaced/_zm_weapon_locker.gsc +++ b/scripts/zm/replaced/_zm_weapon_locker.gsc @@ -60,6 +60,7 @@ show_current_weapon(player) num = player getentitynumber(); displayname = "None"; + if (player wl_has_stored_weapondata()) { weapondata = player wl_get_stored_weapondata(); @@ -117,20 +118,24 @@ wl_set_stored_weapondata( weapondata ) alt_name = weaponAltWeaponName(name); clip_missing = weaponClipSize(name) - weapondata["clip"]; + if (clip_missing > weapondata["stock"]) { clip_missing = weapondata["stock"]; } + weapondata["clip"] += clip_missing; weapondata["stock"] -= clip_missing; if (dw_name != "none") { clip_dualwield_missing = weaponClipSize(dw_name) - weapondata["lh_clip"]; + if (clip_dualwield_missing > weapondata["stock"]) { clip_dualwield_missing = weapondata["stock"]; } + weapondata["lh_clip"] += clip_dualwield_missing; weapondata["stock"] -= clip_dualwield_missing; } @@ -138,10 +143,12 @@ wl_set_stored_weapondata( weapondata ) if (alt_name != "none") { clip_alt_missing = weaponClipSize(alt_name) - weapondata["alt_clip"]; + if (clip_alt_missing > weapondata["alt_stock"]) { clip_alt_missing = weapondata["alt_stock"]; } + weapondata["alt_clip"] += clip_alt_missing; weapondata["alt_stock"] -= clip_alt_missing; } diff --git a/scripts/zm/replaced/_zm_weapons.gsc b/scripts/zm/replaced/_zm_weapons.gsc index 90dee652..bb9d0b3e 100644 --- a/scripts/zm/replaced/_zm_weapons.gsc +++ b/scripts/zm/replaced/_zm_weapons.gsc @@ -316,15 +316,19 @@ weapon_give( weapon, is_upgrade, magic_box, nosound ) primaryweapons = self getweaponslistprimaries(); current_weapon = self getcurrentweapon(); current_weapon = self maps\mp\zombies\_zm_weapons::switch_from_alt_weapon( current_weapon ); + if ( !isDefined( is_upgrade ) ) { is_upgrade = 0; } + weapon_limit = get_player_weapon_limit( self ); + if ( is_equipment( weapon ) ) { self maps\mp\zombies\_zm_equipment::equipment_give( weapon ); } + if ( weapon == "riotshield_zm" ) { if ( isDefined( self.player_shield_reset_health ) ) @@ -332,19 +336,24 @@ weapon_give( weapon, is_upgrade, magic_box, nosound ) self [[ self.player_shield_reset_health ]](); } } + if ( self hasweapon( weapon ) ) { if ( issubstr( weapon, "knife_ballistic_" ) ) { self notify( "zmb_lost_knife" ); } + self givestartammo( weapon ); + if ( !is_offhand_weapon( weapon ) ) { self switchtoweapon( weapon ); } + return; } + if ( is_melee_weapon( weapon ) ) { current_weapon = maps\mp\zombies\_zm_melee_weapon::change_melee_weapon( weapon, current_weapon ); @@ -352,43 +361,52 @@ weapon_give( weapon, is_upgrade, magic_box, nosound ) else if ( is_lethal_grenade( weapon ) ) { old_lethal = self get_player_lethal_grenade(); + if ( isDefined( old_lethal ) && old_lethal != "" ) { self takeweapon( old_lethal ); unacquire_weapon_toggle( old_lethal ); } + self set_player_lethal_grenade( weapon ); } else if ( is_tactical_grenade( weapon ) ) { old_tactical = self get_player_tactical_grenade(); + if ( isDefined( old_tactical ) && old_tactical != "" ) { self takeweapon( old_tactical ); unacquire_weapon_toggle( old_tactical ); } + self set_player_tactical_grenade( weapon ); } else if ( is_placeable_mine( weapon ) ) { old_mine = self get_player_placeable_mine(); + if ( isDefined( old_mine ) ) { self takeweapon( old_mine ); unacquire_weapon_toggle( old_mine ); } + self set_player_placeable_mine( weapon ); } + if ( !is_offhand_weapon( weapon ) ) { self maps\mp\zombies\_zm_weapons::take_fallback_weapon(); } + if ( primaryweapons.size >= weapon_limit ) { if ( is_melee_weapon( current_weapon ) || is_placeable_mine( current_weapon ) || is_equipment( current_weapon ) ) { current_weapon = undefined; } + if ( isDefined( current_weapon ) ) { if ( !is_offhand_weapon( weapon ) ) @@ -397,15 +415,18 @@ weapon_give( weapon, is_upgrade, magic_box, nosound ) { level.player_drops_tesla_gun = 1; } + if ( issubstr( current_weapon, "knife_ballistic_" ) ) { self notify( "zmb_lost_knife" ); } + self takeweapon( current_weapon ); unacquire_weapon_toggle( current_weapon ); } } } + if ( isDefined( level.zombiemode_offhand_weapon_give_override ) ) { if ( self [[ level.zombiemode_offhand_weapon_give_override ]]( weapon ) ) @@ -413,6 +434,7 @@ weapon_give( weapon, is_upgrade, magic_box, nosound ) return; } } + if ( weapon == "cymbal_monkey_zm" ) { self maps\mp\zombies\_zm_weap_cymbal_monkey::player_give_cymbal_monkey(); @@ -429,20 +451,24 @@ weapon_give( weapon, is_upgrade, magic_box, nosound ) self play_weapon_vo( weapon, magic_box ); return; } + if ( isDefined( level.zombie_weapons_callbacks ) && isDefined( level.zombie_weapons_callbacks[ weapon ] ) ) { self thread [[ level.zombie_weapons_callbacks[ weapon ] ]](); play_weapon_vo( weapon, magic_box ); return; } + if ( !is_true( nosound ) ) { self play_sound_on_ent( "purchase" ); } + if ( is_true( magic_box ) && is_limited_weapon( weapon ) && level.limited_weapons[ weapon ] == 1 ) { playsoundatposition( "mus_raygun_stinger", ( 0, 0, 0 ) ); } + if ( !is_weapon_upgraded( weapon ) ) { self giveweapon( weapon ); @@ -451,8 +477,10 @@ weapon_give( weapon, is_upgrade, magic_box, nosound ) { self giveweapon( weapon, 0, self get_pack_a_punch_weapon_options( weapon ) ); } + acquire_weapon_toggle( weapon, self ); self givestartammo( weapon ); + if ( !is_offhand_weapon( weapon ) ) { if ( !is_melee_weapon( weapon ) ) @@ -464,6 +492,7 @@ weapon_give( weapon, is_upgrade, magic_box, nosound ) self switchtoweapon( current_weapon ); } } + self play_weapon_vo( weapon, magic_box ); self notify("weapon_ammo_change"); @@ -536,6 +565,7 @@ weapon_spawn_think() second_endon = undefined; is_grenade = 0; + if(weapontype( self.zombie_weapon_upgrade ) == "grenade") { is_grenade = 1; @@ -565,6 +595,7 @@ weapon_spawn_think() else if ( !isDefined( self.first_time_triggered ) ) { self.first_time_triggered = 0; + if ( isDefined( self.stub ) ) { self.stub.first_time_triggered = 0; @@ -599,6 +630,7 @@ weapon_spawn_think() toplayer = player get_eye() - self.origin; forward = -1 * anglesToRight( self.angles ); dot = vectordot( toplayer, forward ); + if ( dot < 0 ) { continue; @@ -612,9 +644,11 @@ weapon_spawn_think() } player_has_weapon = player maps\mp\zombies\_zm_weapons::has_weapon_or_upgrade( self.zombie_weapon_upgrade ); + if ( !player_has_weapon && is_true( level.weapons_using_ammo_sharing ) ) { shared_ammo_weapon = player maps\mp\zombies\_zm_weapons::get_shared_ammo_weapon( self.zombie_weapon_upgrade ); + if ( isDefined( shared_ammo_weapon ) ) { player_has_weapon = 1; @@ -627,6 +661,7 @@ weapon_spawn_think() } cost = maps\mp\zombies\_zm_weapons::get_weapon_cost( self.zombie_weapon_upgrade ); + if ( player maps\mp\zombies\_zm_pers_upgrades_functions::is_pers_double_points_active() ) { cost = int( cost / 2 ); @@ -648,6 +683,7 @@ weapon_spawn_think() if ( self.zombie_weapon_upgrade == "riotshield_zm" ) { player maps\mp\zombies\_zm_equipment::equipment_give( "riotshield_zm" ); + if ( isDefined( player.player_shield_reset_health ) ) { player [[ player.player_shield_reset_health ]](); diff --git a/scripts/zm/replaced/utility.gsc b/scripts/zm/replaced/utility.gsc index 751c5307..383526c6 100644 --- a/scripts/zm/replaced/utility.gsc +++ b/scripts/zm/replaced/utility.gsc @@ -19,6 +19,7 @@ struct_class_init() level.struct_class_names[ "script_noteworthy" ] = []; level.struct_class_names[ "script_linkname" ] = []; level.struct_class_names[ "script_unitrigger_type" ] = []; + foreach ( s_struct in level.struct ) { if ( isDefined( s_struct.targetname ) ) @@ -27,43 +28,53 @@ struct_class_init() { level.struct_class_names[ "targetname" ][ s_struct.targetname ] = []; } + size = level.struct_class_names[ "targetname" ][ s_struct.targetname ].size; level.struct_class_names[ "targetname" ][ s_struct.targetname ][ size ] = s_struct; } + if ( isDefined( s_struct.target ) ) { if ( !isDefined( level.struct_class_names[ "target" ][ s_struct.target ] ) ) { level.struct_class_names[ "target" ][ s_struct.target ] = []; } + size = level.struct_class_names[ "target" ][ s_struct.target ].size; level.struct_class_names[ "target" ][ s_struct.target ][ size ] = s_struct; } + if ( isDefined( s_struct.script_noteworthy ) ) { if ( !isDefined( level.struct_class_names[ "script_noteworthy" ][ s_struct.script_noteworthy ] ) ) { level.struct_class_names[ "script_noteworthy" ][ s_struct.script_noteworthy ] = []; } + size = level.struct_class_names[ "script_noteworthy" ][ s_struct.script_noteworthy ].size; level.struct_class_names[ "script_noteworthy" ][ s_struct.script_noteworthy ][ size ] = s_struct; } + if ( isDefined( s_struct.script_linkname ) ) { level.struct_class_names[ "script_linkname" ][ s_struct.script_linkname ][ 0 ] = s_struct; } + if ( isDefined( s_struct.script_unitrigger_type ) ) { if ( !isDefined( level.struct_class_names[ "script_unitrigger_type" ][ s_struct.script_unitrigger_type ] ) ) { level.struct_class_names[ "script_unitrigger_type" ][ s_struct.script_unitrigger_type ] = []; } + size = level.struct_class_names[ "script_unitrigger_type" ][ s_struct.script_unitrigger_type ].size; level.struct_class_names[ "script_unitrigger_type" ][ s_struct.script_unitrigger_type ][ size ] = s_struct; } } + gametype = getDvar( "g_gametype" ); location = getDvar( "ui_zm_mapstartlocation" ); + if ( array_validate( level.add_struct_gamemode_location_funcs ) ) { if ( array_validate( level.add_struct_gamemode_location_funcs[ gametype ] ) ) @@ -87,37 +98,45 @@ add_struct( s_struct ) { level.struct_class_names[ "targetname" ][ s_struct.targetname ] = []; } + size = level.struct_class_names[ "targetname" ][ s_struct.targetname ].size; level.struct_class_names[ "targetname" ][ s_struct.targetname ][ size ] = s_struct; } + if ( isDefined( s_struct.script_noteworthy ) ) { if ( !isDefined( level.struct_class_names[ "script_noteworthy" ][ s_struct.script_noteworthy ] ) ) { level.struct_class_names[ "script_noteworthy" ][ s_struct.script_noteworthy ] = []; } + size = level.struct_class_names[ "script_noteworthy" ][ s_struct.script_noteworthy ].size; level.struct_class_names[ "script_noteworthy" ][ s_struct.script_noteworthy ][ size ] = s_struct; } + if ( isDefined( s_struct.target ) ) { if ( !isDefined( level.struct_class_names[ "target" ][ s_struct.target ] ) ) { level.struct_class_names[ "target" ][ s_struct.target ] = []; } + size = level.struct_class_names[ "target" ][ s_struct.target ].size; level.struct_class_names[ "target" ][ s_struct.target ][ size ] = s_struct; } + if ( isDefined( s_struct.script_linkname ) ) { level.struct_class_names[ "script_linkname" ][ s_struct.script_linkname ][ 0 ] = s_struct; } + if ( isDefined( s_struct.script_unitrigger_type ) ) { if ( !isDefined( level.struct_class_names[ "script_unitrigger_type" ][ s_struct.script_unitrigger_type ] ) ) { level.struct_class_names[ "script_unitrigger_type" ][ s_struct.script_unitrigger_type ] = []; } + size = level.struct_class_names[ "script_unitrigger_type" ][ s_struct.script_unitrigger_type ].size; level.struct_class_names[ "script_unitrigger_type" ][ s_struct.script_unitrigger_type ][ size ] = s_struct; } @@ -185,6 +204,7 @@ wallbuy( weapon_name, target, targetname, origin, angles, play_chalk_fx = 1 ) unitrigger_stub.angles = angles; model_name = undefined; + if ( weapon_name == "sticky_grenade_zm" ) { model_name = "semtex_bag"; @@ -217,6 +237,7 @@ wallbuy( weapon_name, target, targetname, origin, angles, play_chalk_fx = 1 ) if ( unitrigger_stub.targetname == "weapon_upgrade" ) { unitrigger_stub.cost = get_weapon_cost( weapon_name ); + if ( !is_true( level.monolingustic_prompt_format ) ) { unitrigger_stub.hint_string = get_weapon_hint( weapon_name ); @@ -225,10 +246,12 @@ wallbuy( weapon_name, target, targetname, origin, angles, play_chalk_fx = 1 ) else { unitrigger_stub.hint_parm1 = get_weapon_display_name( weapon_name ); + if ( !isDefined( unitrigger_stub.hint_parm1 ) || unitrigger_stub.hint_parm1 == "" || unitrigger_stub.hint_parm1 == "none" ) { unitrigger_stub.hint_parm1 = "missing weapon name " + weapon_name; } + unitrigger_stub.hint_parm2 = unitrigger_stub.cost; unitrigger_stub.hint_string = &"ZOMBIE_WEAPONCOSTONLY"; } @@ -244,6 +267,7 @@ wallbuy( weapon_name, target, targetname, origin, angles, play_chalk_fx = 1 ) if ( is_melee_weapon( weapon_name ) ) { melee_weapon = undefined; + foreach(melee_weapon in level._melee_weapons) { if(melee_weapon.weapon_name == weapon_name) @@ -330,6 +354,7 @@ playchalkfx( effect, origin, angles ) wallbuy_grenade_model_fix() { model = getent(self.target, "targetname"); + if(!isDefined(model)) { return; @@ -347,13 +372,16 @@ barrier( model, origin, angles, not_solid ) level.survival_barriers = []; level.survival_barriers_index = 0; } + level.survival_barriers[ level.survival_barriers_index ] = spawn( "script_model", origin ); level.survival_barriers[ level.survival_barriers_index ] setModel( model ); level.survival_barriers[ level.survival_barriers_index ] rotateTo( angles, 0.1 ); + if ( is_true( not_solid ) ) { level.survival_barriers[ level.survival_barriers_index ] notSolid(); } + level.survival_barriers_index++; } @@ -363,13 +391,16 @@ add_struct_location_gamemode_func( gametype, location, func ) { level.add_struct_gamemode_location_funcs = []; } + if ( !isDefined( level.add_struct_gamemode_location_funcs[ gametype ] ) ) { level.add_struct_gamemode_location_funcs[ gametype ] = []; } + if ( !isDefined( level.add_struct_gamemode_location_funcs[ gametype ][ location ] ) ) { level.add_struct_gamemode_location_funcs[ gametype ][ location ] = []; } + level.add_struct_gamemode_location_funcs[ gametype ][ location ][ level.add_struct_gamemode_location_funcs[ gametype ][ location ].size ] = func; } \ No newline at end of file diff --git a/scripts/zm/replaced/zgrief.gsc b/scripts/zm/replaced/zgrief.gsc index 759fd058..d6b8f718 100644 --- a/scripts/zm/replaced/zgrief.gsc +++ b/scripts/zm/replaced/zgrief.gsc @@ -136,6 +136,7 @@ meat_stink( who ) if (valid_drop) { players = get_players(); + foreach (player in players) { player thread scripts\zm\zgrief\zgrief_reimagined::show_grief_hud_msg("Meat dropped!"); @@ -178,6 +179,7 @@ meat_stink( who ) } players = get_players(); + foreach (player in players) { player thread maps\mp\gametypes_zm\zgrief::meat_stink_player_cleanup(); @@ -289,6 +291,7 @@ meat_stink_ignoreme_think() zombies = get_round_enemy_array(); players = get_players(); + foreach (player in players) { if (player == self) @@ -337,6 +340,7 @@ meat_stink_cleanup_on_downed() } players = get_players(); + foreach (player in players) { player thread maps\mp\gametypes_zm\zgrief::meat_stink_player_cleanup(); @@ -354,6 +358,7 @@ meat_stink_cleanup_on_downed() if (valid_drop) { players = get_players(); + foreach (player in players) { player thread scripts\zm\zgrief\zgrief_reimagined::show_grief_hud_msg("Meat dropped!"); @@ -380,6 +385,7 @@ meat_powerup_reset_on_disconnect() level.meat_player = undefined; players = get_players(); + foreach (player in players) { if (is_player_valid(player) && !is_true(player.spawn_protection) && !is_true(player.revive_protection)) @@ -424,6 +430,7 @@ meat_stink_player( who ) level.meat_player = who; who.ignoreme = 0; players = get_players(); + foreach ( player in players ) { player thread maps\mp\gametypes_zm\zgrief::meat_stink_player_cleanup(); @@ -443,6 +450,7 @@ meat_stink_player( who ) who notify( "meat_stink_player_end" ); players = get_players(); + foreach ( player in players ) { player thread maps\mp\gametypes_zm\zgrief::meat_stink_player_cleanup(); @@ -452,6 +460,7 @@ meat_stink_player( who ) player.ignoreme = 0; } } + level.meat_player = undefined; } @@ -479,6 +488,7 @@ print_meat_msg(meat_player, verb) } color = ""; + if (self.team == meat_player.team) { color = "^8"; diff --git a/scripts/zm/replaced/zm_alcatraz_classic.gsc b/scripts/zm/replaced/zm_alcatraz_classic.gsc index 22f74fbf..c37a14b5 100644 --- a/scripts/zm/replaced/zm_alcatraz_classic.gsc +++ b/scripts/zm/replaced/zm_alcatraz_classic.gsc @@ -12,6 +12,7 @@ give_afterlife() wait 0.5; start_pos = 1; players = getplayers(); + foreach ( player in players ) { if ( isDefined( player.afterlife ) && !player.afterlife ) diff --git a/scripts/zm/replaced/zm_alcatraz_grief_cellblock.gsc b/scripts/zm/replaced/zm_alcatraz_grief_cellblock.gsc index a1a1a266..5ac09ea3 100644 --- a/scripts/zm/replaced/zm_alcatraz_grief_cellblock.gsc +++ b/scripts/zm/replaced/zm_alcatraz_grief_cellblock.gsc @@ -52,14 +52,17 @@ give_team_characters() { self detachall(); self set_player_is_female( 0 ); + if ( !isDefined( self.characterindex ) ) { self.characterindex = 1; + if ( self.team == "axis" ) { self.characterindex = 0; } } + switch( self.characterindex ) { case 0: @@ -70,6 +73,7 @@ give_team_characters() self setviewmodel( "c_zom_oleary_shortsleeve_viewhands" ); self.characterindex = 0; break; + case 1: case 3: self setmodel( "c_zom_player_grief_guard_fb" ); @@ -79,6 +83,7 @@ give_team_characters() self.characterindex = 1; break; } + self setmovespeedscale( 1 ); self setsprintduration( 4 ); self setsprintcooldown( 0 ); @@ -120,6 +125,7 @@ main() a_t_door_triggers = getentarray( "zombie_door", "targetname" ); triggers = a_t_door_triggers; i = 0; + while ( i < triggers.size ) { if ( isDefined( triggers[ i ].script_flag ) ) @@ -130,25 +136,32 @@ main() i++; continue; } + if ( triggers[ i ].script_flag == "activate_cafeteria" || triggers[ i ].script_flag == "activate_cellblock_east" || triggers[ i ].script_flag == "activate_cellblock_west" || triggers[ i ].script_flag == "activate_cellblock_barber" || triggers[ i ].script_flag == "activate_cellblock_gondola" || triggers[ i ].script_flag == "activate_cellblock_east_west" || triggers[ i ].script_flag == "activate_warden_office" ) { i++; continue; } + if ( isDefined( triggers[ i ].target ) ) { str_target = triggers[ i ].target; a_door_and_clip = getentarray( str_target, "targetname" ); + foreach ( ent in a_door_and_clip ) { ent delete(); } } + triggers[ i ] delete(); } + i++; } + a_t_doors = getentarray( "zombie_door", "targetname" ); + foreach ( t_door in a_t_doors ) { if ( isDefined( t_door.script_flag ) ) @@ -159,6 +172,7 @@ main() } } } + zbarriers = getzbarrierarray(); a_str_zones = []; a_str_zones[ 0 ] = "zone_start"; @@ -171,6 +185,7 @@ main() a_str_zones[ 7 ] = "zone_cellblock_west_barber"; a_str_zones[ 8 ] = "zone_cellblock_west"; a_str_zones[ 9 ] = "zone_cellblock_west_gondola"; + foreach ( barrier in zbarriers ) { if ( isDefined( barrier.script_noteworthy ) && barrier.script_noteworthy == "cafe_chest_zbarrier" || isDefined( barrier.script_noteworthy ) && barrier.script_noteworthy == "start_chest_zbarrier" ) @@ -181,6 +196,7 @@ main() { str_model = barrier.model; b_delete_barrier = 1; + if ( isdefined( barrier.script_string ) ) { for ( i = 0; i < a_str_zones.size; i++ ) @@ -198,6 +214,7 @@ main() } } } + t_temp = getent( "tower_trap_activate_trigger", "targetname" ); t_temp delete(); t_temp = getent( "tower_trap_range_trigger", "targetname" ); @@ -207,77 +224,99 @@ main() e_brush = getent( "tower_shockbox_door", "targetname" ); e_brush delete(); a_t_travel_triggers = getentarray( "travel_trigger", "script_noteworthy" ); + foreach ( trigger in a_t_travel_triggers ) { trigger delete(); } + a_e_gondola_lights = getentarray( "gondola_state_light", "targetname" ); + foreach ( light in a_e_gondola_lights ) { light delete(); } + a_e_gondola_landing_gates = getentarray( "gondola_landing_gates", "targetname" ); + foreach ( model in a_e_gondola_landing_gates ) { model delete(); } + a_e_gondola_landing_doors = getentarray( "gondola_landing_doors", "targetname" ); + foreach ( model in a_e_gondola_landing_doors ) { model delete(); } + a_e_gondola_gates = getentarray( "gondola_gates", "targetname" ); + foreach ( model in a_e_gondola_gates ) { model delete(); } + a_e_gondola_doors = getentarray( "gondola_doors", "targetname" ); + foreach ( model in a_e_gondola_doors ) { model delete(); } + m_gondola = getent( "zipline_gondola", "targetname" ); m_gondola delete(); t_ride_trigger = getent( "gondola_ride_trigger", "targetname" ); t_ride_trigger delete(); a_classic_clips = getentarray( "classic_clips", "targetname" ); + foreach ( clip in a_classic_clips ) { clip connectpaths(); clip delete(); } + a_afterlife_props = getentarray( "afterlife_show", "targetname" ); + foreach ( m_prop in a_afterlife_props ) { m_prop delete(); } + spork_portal = getent( "afterlife_show_spork", "targetname" ); spork_portal delete(); a_audio = getentarray( "at_headphones", "script_noteworthy" ); + foreach ( model in a_audio ) { model delete(); } + m_spoon_pickup = getent( "pickup_spoon", "targetname" ); m_spoon_pickup delete(); t_sq_bg = getent( "sq_bg_reward_pickup", "targetname" ); t_sq_bg delete(); t_crafting_table = getentarray( "open_craftable_trigger", "targetname" ); + foreach ( trigger in t_crafting_table ) { trigger delete(); } + t_warden_fence = getent( "warden_fence_damage", "targetname" ); t_warden_fence delete(); m_plane_about_to_crash = getent( "plane_about_to_crash", "targetname" ); m_plane_about_to_crash delete(); m_plane_craftable = getent( "plane_craftable", "targetname" ); m_plane_craftable delete(); + for ( i = 1; i <= 5; i++ ) { m_key_lock = getent( "masterkey_lock_" + i, "targetname" ); m_key_lock delete(); } + m_shower_door = getent( "shower_key_door", "targetname" ); m_shower_door delete(); m_nixie_door = getent( "nixie_door_left", "targetname" ); @@ -286,11 +325,13 @@ main() m_nixie_door delete(); m_nixie_brush = getent( "nixie_tube_weaponclip", "targetname" ); m_nixie_brush delete(); + for ( i = 1; i <= 3; i++ ) { m_nixie_tube = getent( "nixie_tube_" + i, "targetname" ); m_nixie_tube delete(); } + t_elevator_door = getent( "nixie_elevator_door", "targetname" ); t_elevator_door delete(); e_elevator_clip = getent( "elevator_door_playerclip", "targetname" ); @@ -309,18 +350,23 @@ main() m_infirmary_case delete(); fake_plane_part = getent( "fake_veh_t6_dlc_zombie_part_control", "targetname" ); fake_plane_part delete(); + for ( i = 1; i <= 3; i++ ) { m_generator = getent( "generator_panel_" + i, "targetname" ); m_generator delete(); } + a_m_generator_core = getentarray( "generator_core", "targetname" ); + foreach ( generator in a_m_generator_core ) { generator delete(); } + e_playerclip = getent( "electric_chair_playerclip", "targetname" ); e_playerclip delete(); + for ( i = 1; i <= 4; i++ ) { t_use = getent( "trigger_electric_chair_" + i, "targetname" ); @@ -328,12 +374,15 @@ main() m_chair = getent( "electric_chair_" + i, "targetname" ); m_chair delete(); } + a_afterlife_interact = getentarray( "afterlife_interact", "targetname" ); + foreach ( model in a_afterlife_interact ) { model turn_afterlife_interact_on(); wait 0.1; } + flag_wait( "initial_blackscreen_passed" ); maps\mp\zombies\_zm_game_module::turn_power_on_and_open_doors(); flag_wait( "start_zombie_round_logic" ); @@ -366,6 +415,7 @@ remove_zombie_hats_for_grief() enemy_location_override( zombie, enemy ) { location = enemy.origin; + if ( is_true( self.reroute ) ) { if ( isDefined( self.reroute_origin ) ) @@ -373,19 +423,23 @@ enemy_location_override( zombie, enemy ) location = self.reroute_origin; } } + return location; } magicbox_face_spawn() { self endon( "disconnect" ); + if ( !is_gametype_active( "zgrief" ) ) { return; } + while ( 1 ) { self waittill( "user_grabbed_weapon" ); + if ( randomint( 50000 ) == 115 ) { self playsoundtoplayer( "zmb_easteregg_face", self ); @@ -400,6 +454,7 @@ magicbox_face_spawn() wait 0.25; self.wth_elem destroy(); } + wait 0.05; } } @@ -412,6 +467,7 @@ turn_afterlife_interact_on() { return; } + if ( self.script_string == "electric_cherry_on" || self.script_string == "sleight_on" || self.script_string == "wires_admin_door" ) { if ( !isDefined( level.shockbox_anim ) ) @@ -419,6 +475,7 @@ turn_afterlife_interact_on() level.shockbox_anim[ "on" ] = %fxanim_zom_al_shock_box_on_anim; level.shockbox_anim[ "off" ] = %fxanim_zom_al_shock_box_off_anim; } + if ( issubstr( self.model, "p6_zm_al_shock_box" ) ) { self useanimtree( -1 ); diff --git a/scripts/zm/replaced/zm_alcatraz_travel.gsc b/scripts/zm/replaced/zm_alcatraz_travel.gsc index 3ce05377..592bdd39 100644 --- a/scripts/zm/replaced/zm_alcatraz_travel.gsc +++ b/scripts/zm/replaced/zm_alcatraz_travel.gsc @@ -38,10 +38,12 @@ move_gondola( b_suppress_doors_close = 0 ) flag_clear( "gondola_at_" + e_gondola.location ); a_t_move = getentarray( "gondola_move_trigger", "targetname" ); + foreach ( trigger in a_t_move ) trigger sethintstring( "" ); a_t_call = getentarray( "gondola_call_trigger", "targetname" ); + foreach ( trigger in a_t_call ) trigger sethintstring( &"ZM_PRISON_GONDOLA_ACTIVE" ); diff --git a/scripts/zm/replaced/zm_alcatraz_utility.gsc b/scripts/zm/replaced/zm_alcatraz_utility.gsc index ac048dc1..b0ecb649 100644 --- a/scripts/zm/replaced/zm_alcatraz_utility.gsc +++ b/scripts/zm/replaced/zm_alcatraz_utility.gsc @@ -50,6 +50,7 @@ blundergat_upgrade_station() } str_valid_weapon = player getcurrentweapon(); + if ( str_valid_weapon == "blundergat_zm" || str_valid_weapon == "blundergat_upgraded_zm" ) { player maps\mp\zombies\_zm_score::minus_to_player_score( t_upgrade.cost ); diff --git a/scripts/zm/replaced/zm_buried_grief_street.gsc b/scripts/zm/replaced/zm_buried_grief_street.gsc index 7c5c6c11..a8bd4f21 100644 --- a/scripts/zm/replaced/zm_buried_grief_street.gsc +++ b/scripts/zm/replaced/zm_buried_grief_street.gsc @@ -85,6 +85,7 @@ main() enemy_location_override( zombie, enemy ) { location = enemy.origin; + if ( isDefined( self.reroute ) && self.reroute ) { if ( isDefined( self.reroute_origin ) ) @@ -92,6 +93,7 @@ enemy_location_override( zombie, enemy ) location = self.reroute_origin; } } + return location; } @@ -131,6 +133,7 @@ builddynamicwallbuy( location, weaponname ) if ( isDefined( wallbuy.script_location ) && wallbuy.script_location == location ) { spawned_wallbuy = undefined; + for ( i = 0; i < level._spawned_wallbuys.size; i++ ) { if ( level._spawned_wallbuys[ i ].target == wallbuy.targetname ) @@ -157,6 +160,7 @@ builddynamicwallbuy( location, weaponname ) } struct = spawnStruct(); + struct.target = wallbuy.targetname; level._spawned_wallbuys[level._spawned_wallbuys.size] = struct; @@ -274,6 +278,7 @@ disable_tunnels() // player spawns invalid_zones = array("zone_start", "zone_tunnels_center", "zone_tunnels_north", "zone_tunnels_south"); spawn_points = maps\mp\gametypes_zm\_zm_gametype::get_player_spawns_for_gametype(); + foreach(spawn_point in spawn_points) { if(isinarray(invalid_zones, spawn_point.script_noteworthy)) diff --git a/scripts/zm/replaced/zm_buried_sq_ows.gsc b/scripts/zm/replaced/zm_buried_sq_ows.gsc index 18a26477..c9c5b845 100644 --- a/scripts/zm/replaced/zm_buried_sq_ows.gsc +++ b/scripts/zm/replaced/zm_buried_sq_ows.gsc @@ -26,6 +26,7 @@ ows_targets_start() } players = get_players(); + if ( level.targets_hit < ( 20 * players.size ) ) { flag_set( "sq_ows_target_missed" ); @@ -45,6 +46,7 @@ ows_targets_start() ows_targets_spawn( a_spawn_spots ) { i = 0; + foreach ( s_spot in a_spawn_spots ) { m_target = spawn( "script_model", s_spot.origin ); diff --git a/scripts/zm/replaced/zm_buried_sq_tpo.gsc b/scripts/zm/replaced/zm_buried_sq_tpo.gsc index f617d75f..6a38b02d 100644 --- a/scripts/zm/replaced/zm_buried_sq_tpo.gsc +++ b/scripts/zm/replaced/zm_buried_sq_tpo.gsc @@ -72,6 +72,7 @@ stage_logic_richtofen() flag_clear( "sq_tpo_time_bomb_in_valid_location" ); b_time_bomb_in_valid_location = 0; + while (1) { if ( isdefined( level.time_bomb_save_data ) && isdefined( level.time_bomb_save_data.time_bomb_model ) ) @@ -136,6 +137,7 @@ special_round_end() scripts\zm\replaced\_zm_weap_time_bomb::time_bomb_detonation(); a_players = get_players(); + foreach ( player in a_players ) { vsmgr_deactivate( "visionset", "cheat_bw", player ); diff --git a/scripts/zm/replaced/zm_highrise_classic.gsc b/scripts/zm/replaced/zm_highrise_classic.gsc index 08131f6e..66f3c2d9 100644 --- a/scripts/zm/replaced/zm_highrise_classic.gsc +++ b/scripts/zm/replaced/zm_highrise_classic.gsc @@ -148,27 +148,33 @@ squashed_death_init( kill_if_falling ) insta_kill_player( perks_can_respawn_player, kill_if_falling ) { self endon( "disconnect" ); + if ( isDefined( perks_can_respawn_player ) && perks_can_respawn_player == 0 ) { if ( self hasperk( "specialty_quickrevive" ) ) { self unsetperk( "specialty_quickrevive" ); } + if ( self hasperk( "specialty_finalstand" ) ) { self unsetperk( "specialty_finalstand" ); } } + self maps\mp\zombies\_zm_buildables::player_return_piece_to_original_spawn(); + if ( isDefined( self.insta_killed ) && self.insta_killed ) { return; } + if ( isDefined( self.ignore_insta_kill ) ) { self.disable_chugabud_corpse = 1; return; } + if ( self hasperk( "specialty_finalstand" ) ) { self.ignore_insta_kill = 1; @@ -176,6 +182,7 @@ insta_kill_player( perks_can_respawn_player, kill_if_falling ) self dodamage( self.health + 1000, ( 0, 0, 1 ) ); return; } + if ( !isDefined( kill_if_falling ) || kill_if_falling == 0 ) { if ( !self isonground() ) @@ -183,16 +190,20 @@ insta_kill_player( perks_can_respawn_player, kill_if_falling ) return; } } + if ( is_player_killable( self ) ) { self.insta_killed = 1; in_last_stand = 0; self notify( "chugabud_effects_cleanup" ); + if ( self maps\mp\zombies\_zm_laststand::player_is_in_laststand() ) { in_last_stand = 1; } + self thread blood_splat(); + if ( getnumconnectedplayers() == 1 ) { if ( isDefined( self.solo_lives_given ) && self.solo_lives_given < 3 ) @@ -201,15 +212,18 @@ insta_kill_player( perks_can_respawn_player, kill_if_falling ) points = getstruct( "zone_green_start", "script_noteworthy" ); spawn_points = getstructarray( points.target, "targetname" ); point = spawn_points[ 0 ]; + if ( in_last_stand == 0 ) { self dodamage( self.health + 1000, ( 0, 0, 1 ) ); } + wait 0.5; self freezecontrols( 1 ); wait 0.25; self setorigin( point.origin + vectorScale( ( 0, 0, 1 ), 20 ) ); self.angles = point.angles; + if ( in_last_stand ) { flag_set( "instant_revive" ); @@ -224,6 +238,7 @@ insta_kill_player( perks_can_respawn_player, kill_if_falling ) self.solo_respawn = 0; self.lives--; } + self freezecontrols( 0 ); self.insta_killed = 0; } @@ -238,6 +253,7 @@ insta_kill_player( perks_can_respawn_player, kill_if_falling ) wait_network_frame(); self.bleedout_time = 0; } + self.insta_killed = 0; } } @@ -291,6 +307,7 @@ escape_pod() level notify( "escape_pod_falling_begin" ); players_in_escape_pod = escape_pod_trigger escape_pod_get_all_alive_players_inside(); + foreach ( player in players_in_escape_pod ) { player.riding_escape_pod = 1; diff --git a/scripts/zm/replaced/zm_highrise_elevators.gsc b/scripts/zm/replaced/zm_highrise_elevators.gsc index 7a44c764..b89e703a 100644 --- a/scripts/zm/replaced/zm_highrise_elevators.gsc +++ b/scripts/zm/replaced/zm_highrise_elevators.gsc @@ -484,6 +484,7 @@ watch_for_elevator_during_faller_spawn() flag_wait( "power_on" ); elevator_bodies = []; + foreach ( elevator in level.elevators ) { elevator_bodies[elevator_bodies.size] = elevator.body; diff --git a/scripts/zm/replaced/zm_highrise_sq.gsc b/scripts/zm/replaced/zm_highrise_sq.gsc index a031e0c8..aa13f0bb 100644 --- a/scripts/zm/replaced/zm_highrise_sq.gsc +++ b/scripts/zm/replaced/zm_highrise_sq.gsc @@ -178,6 +178,7 @@ sq_give_all_perks() level thread scripts\zm\replaced\_zm_sq::sq_complete_time_hud(); players = getplayers(); + foreach ( player in players ) { player thread sq_give_player_perks( perks, v_fireball_start_loc, n_fireball_exploder ); diff --git a/scripts/zm/replaced/zm_highrise_sq_atd.gsc b/scripts/zm/replaced/zm_highrise_sq_atd.gsc index a925640c..57b12dfd 100644 --- a/scripts/zm/replaced/zm_highrise_sq_atd.gsc +++ b/scripts/zm/replaced/zm_highrise_sq_atd.gsc @@ -62,6 +62,7 @@ sq_atd_watch_elevator( str_flag ) } a_dragon_icons = getentarray( "elevator_dragon_icon", "targetname" ); + foreach ( m_icon in a_dragon_icons ) { if ( issubstr( self.targetname, m_icon.script_noteworthy ) ) diff --git a/scripts/zm/replaced/zm_highrise_sq_pts.gsc b/scripts/zm/replaced/zm_highrise_sq_pts.gsc index 466827ac..18d8710a 100644 --- a/scripts/zm/replaced/zm_highrise_sq_pts.gsc +++ b/scripts/zm/replaced/zm_highrise_sq_pts.gsc @@ -120,6 +120,7 @@ is_springpad_in_place( m_springpad, is_generator ) if ( is_generator ) { wait 0.1; + if ( pts_should_springpad_create_trigs( s_spot ) ) { thread maps\mp\zombies\_zm_unitrigger::unregister_unitrigger( self.buildablespringpad.stub ); @@ -322,14 +323,17 @@ pts_springpad_fling( str_spot_name ) str_anim1 = "dc"; str_anim2 = "cd"; break; + case "lion_pair_2": str_anim1 = "ab"; str_anim2 = "ba"; break; + case "lion_pair_3": str_anim1 = "cd"; str_anim2 = "dc"; break; + case "lion_pair_4": str_anim1 = "ba"; str_anim2 = "ab"; diff --git a/scripts/zm/replaced/zm_prison_sq_final.gsc b/scripts/zm/replaced/zm_prison_sq_final.gsc index 3b4616fb..08469146 100644 --- a/scripts/zm/replaced/zm_prison_sq_final.gsc +++ b/scripts/zm/replaced/zm_prison_sq_final.gsc @@ -77,6 +77,7 @@ stage_two() t_plane_fly_afterlife trigger_on(); players = get_players(); + foreach ( player in players ) { if ( is_player_valid( player ) ) diff --git a/scripts/zm/replaced/zm_tomb.gsc b/scripts/zm/replaced/zm_tomb.gsc index 043f6c92..5b3a80bf 100644 --- a/scripts/zm/replaced/zm_tomb.gsc +++ b/scripts/zm/replaced/zm_tomb.gsc @@ -70,6 +70,7 @@ sndmeleewpn_isstaff( weapon ) case "staff_air_melee_zm": isstaff = 1; break; + default: isstaff = 0; } @@ -120,6 +121,7 @@ tomb_can_track_ammo_custom( weap ) case "alcatraz_shield_zm": case "tomb_shield_zm": return false; + default: if ( is_melee_weapon( weap ) || is_zombie_perk_bottle( weap ) || is_placeable_mine( weap ) || is_equipment( weap ) || issubstr( weap, "knife_ballistic_" ) || getsubstr( weap, 0, 3 ) == "gl_" || weaponfuellife( weap ) > 0 || weap == level.revive_tool ) return false; diff --git a/scripts/zm/replaced/zm_tomb_challenges.gsc b/scripts/zm/replaced/zm_tomb_challenges.gsc index 5ad40b3a..3e9be334 100644 --- a/scripts/zm/replaced/zm_tomb_challenges.gsc +++ b/scripts/zm/replaced/zm_tomb_challenges.gsc @@ -78,12 +78,14 @@ reward_random_perk( player, s_stat ) } perk = player.tomb_reward_perk; + if (!isDefined(perk)) { return 0; } model = maps\mp\zombies\_zm_perk_random::get_perk_weapon_model(perk); + if (!isDefined(model)) { return 0; @@ -95,15 +97,18 @@ reward_random_perk( player, s_stat ) m_reward playsound( "zmb_spawn_powerup" ); m_reward playloopsound( "zmb_spawn_powerup_loop", 0.5 ); wait_network_frame(); + if ( !maps\mp\zombies\_zm_challenges::reward_rise_and_grab( m_reward, 50, 2, 2, 10 ) ) { return 0; } + if ( player hasperk( perk ) || player maps\mp\zombies\_zm_perks::has_perk_paused( perk ) ) { m_reward thread maps\mp\zm_tomb_challenges::bottle_reject_sink( player ); return 0; } + m_reward stoploopsound( 0.1 ); player playsound( "zmb_powerup_grabbed" ); m_reward thread maps\mp\zombies\_zm_perks::vending_trigger_post_think( player, perk ); @@ -114,9 +119,11 @@ reward_random_perk( player, s_stat ) get_random_perk() { perks = []; + for (i = 0; i < level._random_perk_machine_perk_list.size; i++) { perk = level._random_perk_machine_perk_list[ i ]; + if ( isDefined( self.perk_purchased ) && self.perk_purchased == perk ) { continue; @@ -129,6 +136,7 @@ get_random_perk() } } } + if ( perks.size > 0 ) { perks = array_randomize( perks ); diff --git a/scripts/zm/replaced/zm_tomb_craftables.gsc b/scripts/zm/replaced/zm_tomb_craftables.gsc index 0d47d67f..4baf3387 100644 --- a/scripts/zm/replaced/zm_tomb_craftables.gsc +++ b/scripts/zm/replaced/zm_tomb_craftables.gsc @@ -242,6 +242,7 @@ quadrotor_control_thread() } str_vehicle = "heli_quadrotor_zm"; + if ( flag( "ee_maxis_drone_retrieved" ) ) { str_vehicle = "heli_quadrotor_upgraded_zm"; @@ -331,9 +332,11 @@ quadrotor_set_available() case "zone_nml_9": setclientfield( "cooldown_steam", 1 ); break; + case "zone_bunker_5a": setclientfield( "cooldown_steam", 2 ); break; + case "zone_village_1": setclientfield( "cooldown_steam", 3 ); break; diff --git a/scripts/zm/replaced/zm_tomb_ee_main_step_2.gsc b/scripts/zm/replaced/zm_tomb_ee_main_step_2.gsc index e050c00c..cd5eaa47 100644 --- a/scripts/zm/replaced/zm_tomb_ee_main_step_2.gsc +++ b/scripts/zm/replaced/zm_tomb_ee_main_step_2.gsc @@ -40,12 +40,15 @@ create_robot_head_trigger( unitrigger_stub ) case "fire": m_sign showpart( "j_fire" ); break; + case "water": m_sign showpart( "j_ice" ); break; + case "lightning": m_sign showpart( "j_lightning" ); break; + case "air": m_sign showpart( "j_wind" ); break; diff --git a/scripts/zm/replaced/zm_tomb_ee_main_step_8.gsc b/scripts/zm/replaced/zm_tomb_ee_main_step_8.gsc index c1ed1387..78695d6c 100644 --- a/scripts/zm/replaced/zm_tomb_ee_main_step_8.gsc +++ b/scripts/zm/replaced/zm_tomb_ee_main_step_8.gsc @@ -28,6 +28,7 @@ stage_logic() } a_zombies = getaispeciesarray( level.zombie_team, "all" ); + foreach ( zombie in a_zombies ) { if ( is_point_in_chamber( zombie.origin ) && !is_true( zombie.is_mechz ) && is_true( zombie.has_legs ) && is_true( zombie.completed_emerging_into_playable_area ) ) @@ -49,6 +50,7 @@ stage_logic() } players = get_players(); + foreach ( player in players ) { if ( is_player_valid( player ) ) diff --git a/scripts/zm/replaced/zm_tomb_giant_robot.gsc b/scripts/zm/replaced/zm_tomb_giant_robot.gsc index a519c100..466cff9a 100644 --- a/scripts/zm/replaced/zm_tomb_giant_robot.gsc +++ b/scripts/zm/replaced/zm_tomb_giant_robot.gsc @@ -73,6 +73,7 @@ robot_cycling() { do random_number = randomint( 3 ); + while ( random_number == last_robot ); } diff --git a/scripts/zm/replaced/zm_tomb_main_quest.gsc b/scripts/zm/replaced/zm_tomb_main_quest.gsc index f3825f59..5dfab3c4 100644 --- a/scripts/zm/replaced/zm_tomb_main_quest.gsc +++ b/scripts/zm/replaced/zm_tomb_main_quest.gsc @@ -380,6 +380,7 @@ insert_staff_hint_charger(player, enum) self.playertrigger[num] endon("death"); element = ""; + if (enum == 1) { element = "Fire"; @@ -564,6 +565,7 @@ run_gramophone_teleporter( str_vinyl_record ) } arrayremovevalue(level.gramophone_teleporter_triggers, t_gramophone); + foreach (trigger in level.gramophone_teleporter_triggers) { if (trigger != t_gramophone) diff --git a/scripts/zm/replaced/zm_transit_bus.gsc b/scripts/zm/replaced/zm_transit_bus.gsc index 606983f6..2414e389 100644 --- a/scripts/zm/replaced/zm_transit_bus.gsc +++ b/scripts/zm/replaced/zm_transit_bus.gsc @@ -159,6 +159,7 @@ busschedulethink() zonestocheck[zonestocheck.size] = "zone_amb_bridge"; zonestocheck[zonestocheck.size] = "zone_trans_2b"; break; + case "zone_gas": zonestocheck[zonestocheck.size] = "zone_trans_2"; zonestocheck[zonestocheck.size] = "zone_amb_tunnel"; @@ -171,6 +172,7 @@ busschedulethink() zonestocheck[zonestocheck.size] = "zone_roadside_east"; zonestocheck[zonestocheck.size] = "zone_trans_3"; break; + case "zone_far": zonestocheck[zonestocheck.size] = "zone_amb_forest"; zonestocheck[zonestocheck.size] = "zone_far_ext"; @@ -179,6 +181,7 @@ busschedulethink() zonestocheck[zonestocheck.size] = "zone_trans_5"; zonestocheck[zonestocheck.size] = "zone_trans_6"; break; + case "zone_pow": zonestocheck[zonestocheck.size] = "zone_trans_6"; zonestocheck[zonestocheck.size] = "zone_amb_cornfield"; @@ -188,6 +191,7 @@ busschedulethink() zonestocheck[zonestocheck.size] = "zone_pcr"; zonestocheck[zonestocheck.size] = "zone_pow_warehouse"; break; + case "zone_town_north": zonestocheck[zonestocheck.size] = "zone_trans_8"; zonestocheck[zonestocheck.size] = "zone_amb_power2town"; @@ -309,6 +313,7 @@ busshowleavinghud( time ) while (time > 0) { players = get_players(); + foreach (player in players) { if (!isDefined(player.busleavehud)) @@ -345,6 +350,7 @@ busshowleavinghud( time ) } players = get_players(); + foreach (player in players) { if (isDefined(player.busleavehud)) @@ -360,6 +366,7 @@ busshowleavinghud_destroy_on_depart_early() self waittill("depart_early"); players = get_players(); + foreach (player in players) { if (isDefined(player.busleavehud)) @@ -544,6 +551,7 @@ buspathblockersetup() bus_buyable_weapon_unitrigger_setup(trig) { unitrigger = undefined; + while (!isDefined(unitrigger)) { for(i = 0; i < level._unitriggers.trigger_stubs.size; i++) diff --git a/scripts/zm/replaced/zm_transit_grief_station.gsc b/scripts/zm/replaced/zm_transit_grief_station.gsc index a966efeb..742cd00b 100644 --- a/scripts/zm/replaced/zm_transit_grief_station.gsc +++ b/scripts/zm/replaced/zm_transit_grief_station.gsc @@ -39,6 +39,7 @@ main() enemy_location_override( zombie, enemy ) { location = enemy.origin; + if ( is_true( self.reroute ) ) { if ( isDefined( self.reroute_origin ) ) @@ -46,12 +47,14 @@ enemy_location_override( zombie, enemy ) location = self.reroute_origin; } } + return location; } remove_lava_collision() { ents = getEntArray( "script_model", "classname"); + foreach (ent in ents) { if (IsDefined(ent.model)) @@ -97,6 +100,7 @@ open_electric_doors_on_door_opened() level.local_doors_stay_open = 1; door = undefined; zombie_doors = getentarray( "zombie_door", "targetname" ); + foreach ( door in zombie_doors ) { if(door.target == "busstop_doors") @@ -108,6 +112,7 @@ open_electric_doors_on_door_opened() door waittill( "door_opened" ); zombie_doors = getentarray( "zombie_door", "targetname" ); + foreach ( door in zombie_doors ) { if ( isDefined( door.script_noteworthy ) && door.script_noteworthy == "local_electric_door" ) diff --git a/scripts/zm/replaced/zm_transit_sq.gsc b/scripts/zm/replaced/zm_transit_sq.gsc index 495dfd2b..1f8684dc 100644 --- a/scripts/zm/replaced/zm_transit_sq.gsc +++ b/scripts/zm/replaced/zm_transit_sq.gsc @@ -125,10 +125,12 @@ maxis_sidequest_c() flag_waitopen( "power_on" ); level endon( "power_on" ); level.sq_progress["maxis"]["C_screecher_dark"] = 0; + for(i = 0; i < 8; i++) { level.sq_progress["maxis"]["C_screecher_" + i] = undefined; } + level.sq_progress["maxis"]["C_complete"] = 0; turbine_1_talked = 0; turbine_2_talked = 0; @@ -151,6 +153,7 @@ maxis_sidequest_c() player.buildableturbine thread turbine_watch_cleanup(); zone_used = 0; + for(i = 0; i < 8; i++) { if ( isdefined( level.sq_progress["maxis"]["C_screecher_" + i] ) && zone == level.sq_progress["maxis"]["C_screecher_" + i] ) @@ -283,6 +286,7 @@ droppowerup( story ) level thread scripts\zm\replaced\_zm_sq::sq_complete_time_hud(); players = get_players(); + foreach ( player in players ) { if ( is_player_valid( player ) ) diff --git a/scripts/zm/replaced/zm_transit_standard_station.gsc b/scripts/zm/replaced/zm_transit_standard_station.gsc index 55c2c929..5250fbcb 100644 --- a/scripts/zm/replaced/zm_transit_standard_station.gsc +++ b/scripts/zm/replaced/zm_transit_standard_station.gsc @@ -36,6 +36,7 @@ main() // electric doors showing hintstring zombie_doors = getentarray( "zombie_door", "targetname" ); + foreach ( door in zombie_doors ) { if ( isDefined( door.script_noteworthy ) && door.script_noteworthy == "local_electric_door" ) @@ -48,6 +49,7 @@ main() enemy_location_override( zombie, enemy ) { location = enemy.origin; + if ( is_true( self.reroute ) ) { if ( isDefined( self.reroute_origin ) ) @@ -55,12 +57,14 @@ enemy_location_override( zombie, enemy ) location = self.reroute_origin; } } + return location; } remove_lava_collision() { ents = getEntArray( "script_model", "classname"); + foreach (ent in ents) { if (IsDefined(ent.model)) @@ -106,6 +110,7 @@ open_electric_doors_on_door_opened() level.local_doors_stay_open = 1; door = undefined; zombie_doors = getentarray( "zombie_door", "targetname" ); + foreach ( door in zombie_doors ) { if(door.target == "busstop_doors") @@ -117,6 +122,7 @@ open_electric_doors_on_door_opened() door waittill( "door_opened" ); zombie_doors = getentarray( "zombie_door", "targetname" ); + foreach ( door in zombie_doors ) { if ( isDefined( door.script_noteworthy ) && door.script_noteworthy == "local_electric_door" ) diff --git a/scripts/zm/replaced/zmeat.gsc b/scripts/zm/replaced/zmeat.gsc index d03f157a..77b5c9a1 100644 --- a/scripts/zm/replaced/zmeat.gsc +++ b/scripts/zm/replaced/zmeat.gsc @@ -57,6 +57,7 @@ item_meat_on_spawn_retrieve_trigger( watcher, player, weaponname ) } players = get_players(); + foreach (other_player in players) { other_player thread maps\mp\gametypes_zm\zgrief::meat_stink_player_cleanup(); diff --git a/scripts/zm/zgrief/zgrief_reimagined.gsc b/scripts/zm/zgrief/zgrief_reimagined.gsc index 94a6a73c..6d4d224d 100644 --- a/scripts/zm/zgrief/zgrief_reimagined.gsc +++ b/scripts/zm/zgrief/zgrief_reimagined.gsc @@ -351,14 +351,17 @@ set_grief_vars() { 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; } + if(isDefined(level.zombie_weapons["raygun_mark2_zm"])) { level.zombie_weapons["raygun_mark2_zm"].is_in_box = 1; } + if(isDefined(level.zombie_weapons["willy_pete_zm"])) { register_tactical_grenade_for_level( "willy_pete_zm" ); @@ -504,6 +507,7 @@ powerup_hud_destroy_on_intermission() powerup_hud_move() { offset_x = 37; + if((level.active_powerup_hud_array[self.team].size % 2) == 0) { offset_x /= 2; @@ -604,6 +608,7 @@ grief_onplayerdisconnect(disconnecting_player) if(count <= 0) { encounters_team = "A"; + if(getOtherTeam(disconnecting_player.team) == "allies") { encounters_team = "B"; @@ -815,6 +820,7 @@ add_grief_downed_score() add_grief_bleedout_score() { players = get_players(); + foreach(player in players) { if(is_player_valid(player) && player.team != self.team) @@ -938,6 +944,7 @@ headstomp_watcher() } players = get_players(); + foreach(player in players) { player_top_origin = player getCentroid(); @@ -1002,6 +1009,7 @@ round_start_wait(time, initial) flag_wait( "start_zombie_round_logic" ); players = get_players(); + foreach(player in players) { player.hostmigrationcontrolsfrozen = 1; // fixes players being able to move after initial_blackscreen_passed @@ -1014,6 +1022,7 @@ round_start_wait(time, initial) else { players = get_players(); + foreach(player in players) { ground_origin = groundpos(player.origin); @@ -1042,6 +1051,7 @@ round_start_wait(time, initial) level thread zombie_spawn_wait(zombie_spawn_time); text = "MATCH BEGINS IN"; + if(level.scr_zm_ui_gametype_obj == "zsnr") { text = "ROUND " + level.snr_round_number + " BEGINS IN"; @@ -1054,6 +1064,7 @@ round_start_wait(time, initial) countdown_hud scripts\zm\replaced\_zm::countdown_hud_destroy(); players = get_players(); + foreach(player in players) { if(initial) @@ -1075,6 +1086,7 @@ freeze_hotjoin_players() while(1) { players = get_players(); + foreach(player in players) { if(!is_true(player.hostmigrationcontrolsfrozen)) @@ -1340,6 +1352,7 @@ grief_intro_msg() get_gamemode_display_name(gamemode = level.scr_zm_ui_gametype_obj) { name = ""; + if(gamemode == "zgrief") { name = "Grief"; @@ -1534,6 +1547,7 @@ custom_end_screen() { players = get_players(); i = 0; + while ( i < players.size ) { players[ i ].game_over_hud = newclienthudelem( players[ i ] ); @@ -1550,11 +1564,13 @@ custom_end_screen() players[ i ].game_over_hud settext( &"ZOMBIE_GAME_OVER" ); players[ i ].game_over_hud fadeovertime( 1 ); players[ i ].game_over_hud.alpha = 1; + if ( players[ i ] issplitscreen() ) { players[ i ].game_over_hud.fontscale = 2; players[ i ].game_over_hud.y += 40; } + players[ i ].survived_hud = newclienthudelem( players[ i ] ); players[ i ].survived_hud.alignx = "center"; players[ i ].survived_hud.aligny = "middle"; @@ -1566,11 +1582,13 @@ custom_end_screen() players[ i ].survived_hud.alpha = 0; players[ i ].survived_hud.color = ( 1, 1, 1 ); players[ i ].survived_hud.hidewheninmenu = 1; + if ( players[ i ] issplitscreen() ) { players[ i ].survived_hud.fontscale = 1.5; players[ i ].survived_hud.y += 40; } + winner_text = "YOU WIN!"; loser_text = "YOU LOSE!"; @@ -1589,6 +1607,7 @@ custom_end_screen() players[ i ].survived_hud settext( loser_text ); } } + players[ i ].survived_hud fadeovertime( 1 ); players[ i ].survived_hud.alpha = 1; i++; @@ -1598,12 +1617,14 @@ custom_end_screen() game_module_player_damage_callback( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime ) { self.last_damage_from_zombie_or_player = 0; + if ( isDefined( eattacker ) ) { if ( isplayer( eattacker ) && eattacker == self ) { return; } + if ( isDefined( eattacker.is_zombie ) || eattacker.is_zombie && isplayer( eattacker ) ) { self.last_damage_from_zombie_or_player = 1; @@ -1659,6 +1680,7 @@ game_module_player_damage_callback( einflictor, eattacker, idamage, idflags, sme } is_melee = false; + if(isDefined(eattacker) && isplayer(eattacker) && eattacker != self && eattacker.team != self.team && (smeansofdeath == "MOD_MELEE" || issubstr(sweapon, "knife_ballistic"))) { is_melee = true; @@ -1677,6 +1699,7 @@ game_module_player_damage_callback( einflictor, eattacker, idamage, idflags, sme { amount = 297.5; // 32 units } + if (self getStance() == "crouch") { amount = 215; // 21.33 units @@ -1696,6 +1719,7 @@ game_module_player_damage_callback( einflictor, eattacker, idamage, idflags, sme { amount = 235; // 24 units } + if (self getStance() == "crouch") { amount = 172.5; // 16 units @@ -1718,6 +1742,7 @@ game_module_player_damage_callback( einflictor, eattacker, idamage, idflags, sme { amount = 540; // 64 units } + if (self getStance() == "crouch") { amount = 377.5; // 42.66 units @@ -1737,6 +1762,7 @@ game_module_player_damage_callback( einflictor, eattacker, idamage, idflags, sme { amount = 420; // 48 units } + if (self getStance() == "crouch") { amount = 297.5; // 32 units @@ -1830,6 +1856,7 @@ do_game_mode_shellshock(is_melee = 0, is_upgraded = 0) self endon( "disconnect" ); time = 0.5; + if (is_melee) { time = 0.75; @@ -1921,10 +1948,12 @@ grief_laststand_weapon_save( einflictor, attacker, idamage, smeansofdeath, sweap if (isDefined(self.grief_savedweapon_weaponsammo_clip[i])) { clip_missing = weaponClipSize(self.grief_savedweapon_weapons[i]) - self.grief_savedweapon_weaponsammo_clip[i]; + if (clip_missing > self.grief_savedweapon_weaponsammo_stock[i]) { clip_missing = self.grief_savedweapon_weaponsammo_stock[i]; } + self.grief_savedweapon_weaponsammo_clip[i] += clip_missing; self.grief_savedweapon_weaponsammo_stock[i] -= clip_missing; } @@ -1932,10 +1961,12 @@ grief_laststand_weapon_save( einflictor, attacker, idamage, smeansofdeath, sweap if (isDefined(self.grief_savedweapon_weaponsammo_clip_dualwield[i]) && weaponDualWieldWeaponName(self.grief_savedweapon_weapons[i]) != "none") { clip_dualwield_missing = weaponClipSize(weaponDualWieldWeaponName(self.grief_savedweapon_weapons[i])) - self.grief_savedweapon_weaponsammo_clip_dualwield[i]; + if (clip_dualwield_missing > self.grief_savedweapon_weaponsammo_stock[i]) { clip_dualwield_missing = self.grief_savedweapon_weaponsammo_stock[i]; } + self.grief_savedweapon_weaponsammo_clip_dualwield[i] += clip_dualwield_missing; self.grief_savedweapon_weaponsammo_stock[i] -= clip_dualwield_missing; } @@ -1943,10 +1974,12 @@ grief_laststand_weapon_save( einflictor, attacker, idamage, smeansofdeath, sweap if (isDefined(self.grief_savedweapon_weaponsammo_clip_alt[i]) && weaponAltWeaponName(self.grief_savedweapon_weapons[i]) != "none") { clip_alt_missing = weaponClipSize(weaponAltWeaponName(self.grief_savedweapon_weapons[i])) - self.grief_savedweapon_weaponsammo_clip_alt[i]; + if (clip_alt_missing > self.grief_savedweapon_weaponsammo_stock_alt[i]) { clip_alt_missing = self.grief_savedweapon_weaponsammo_stock_alt[i]; } + self.grief_savedweapon_weaponsammo_clip_alt[i] += clip_alt_missing; self.grief_savedweapon_weaponsammo_stock_alt[i] -= clip_alt_missing; } @@ -1987,6 +2020,7 @@ grief_laststand_weapons_return() if(isDefined(self.grief_savedperks)) { self.perks_active = []; + foreach(perk in self.grief_savedperks) { self maps\mp\zombies\_zm_perks::give_perk(perk); @@ -1996,6 +2030,7 @@ grief_laststand_weapons_return() primary_weapons_returned = 0; i = 0; + while ( i < self.grief_savedweapon_weapons.size ) { if ( isdefined( self.grief_savedweapon_grenades ) && self.grief_savedweapon_weapons[ i ] == self.grief_savedweapon_grenades || ( isdefined( self.grief_savedweapon_tactical ) && self.grief_savedweapon_weapons[ i ] == self.grief_savedweapon_tactical ) ) @@ -2037,6 +2072,7 @@ grief_laststand_weapons_return() self.grief_savedweapon_weaponsammo_stock[i] = 0; dual_wield_name = weapondualwieldweaponname(self.grief_savedweapon_weapons[i]); + if( "none" != dual_wield_name ) { if (used_amt >= self.grief_savedweapon_weaponsammo_clip_dualwield[i]) @@ -2253,6 +2289,7 @@ sudden_death() level.sudden_death = 1; players = get_players(); + foreach(player in players) { player thread show_grief_hud_msg( "Sudden Death!" ); @@ -2261,6 +2298,7 @@ sudden_death() health = player.health; player setMaxHealth(player.maxhealth - 100); + if(player.health > health) { player.health = health; @@ -2335,6 +2373,7 @@ func_should_drop_meat() } players = get_players(); + foreach (player in players) { if (player hasWeapon("item_meat_zm")) @@ -2373,12 +2412,14 @@ save_teams_on_intermission() if (level.allow_teamchange) { players = get_players("axis"); + foreach (player in players) { axis_guids += player getguid() + " "; } players = get_players("allies"); + foreach (player in players) { allies_guids += player getguid() + " "; @@ -2387,6 +2428,7 @@ save_teams_on_intermission() else { players = array_randomize(get_players()); + for (i = 0; i < players.size; i++) { if (i % 2 == 0) @@ -2422,6 +2464,7 @@ race_check_for_kills() amount = 1; special_score = undefined; + if (is_true(zombie.is_brutus)) { amount = 10; @@ -2516,6 +2559,7 @@ containment_think() next_zone = level.zones[next_zone_name]; zone_name_to_lock = zone_name; + if (zone_name == "zone_street_fountain") { zone_name_to_lock = "zone_street_lighteast"; @@ -2526,6 +2570,7 @@ containment_think() } players = get_players(); + foreach(player in players) { player thread show_grief_hud_msg("New containment zone!"); @@ -2548,6 +2593,7 @@ containment_think() if (containment_zones.size > 1) { spawn_points = maps\mp\gametypes_zm\_zm_gametype::get_player_spawns_for_gametype(); + foreach(spawn_point in spawn_points) { if(spawn_point.script_noteworthy == zone_name_to_lock) @@ -2567,6 +2613,7 @@ containment_think() foreach(player in players) { player_zone_name = player get_current_zone(); + if(isDefined(player_zone_name) && player_zone_name == zone_name) { if(is_player_valid(player)) @@ -2596,6 +2643,7 @@ containment_think() if (containment_zones.size > 1 && show_next_obj_waypoint) { player_zone_name = player get_current_zone(); + if (isDefined(player_zone_name) && player_zone_name == next_zone_name) { player containment_set_obj_waypoint_on_screen(1); @@ -2616,6 +2664,7 @@ containment_think() if (team_diff > 0) { team = "axis"; + if (get_players("allies").size < get_players("axis").size) { team = "allies"; @@ -2678,10 +2727,12 @@ containment_think() if(held_prev != "axis") { obj_time = 1000; + if(!isDefined(held_time["axis"])) { held_time["axis"] = getTime(); } + held_time["allies"] = undefined; held_prev = "axis"; @@ -2715,10 +2766,12 @@ containment_think() if(held_prev != "allies") { obj_time = 1000; + if(!isDefined(held_time["allies"])) { held_time["allies"] = getTime(); } + held_time["axis"] = undefined; held_prev = "allies"; @@ -2811,6 +2864,7 @@ containment_think() } zombies = get_round_enemy_array(); + if (isDefined(zombies)) { for (i = 0; i < zombies.size; i++) @@ -2823,6 +2877,7 @@ containment_think() } spawn_points = maps\mp\gametypes_zm\_zm_gametype::get_player_spawns_for_gametype(); + foreach(spawn_point in spawn_points) { if(spawn_point.script_noteworthy == zone_name_to_lock) @@ -2912,6 +2967,7 @@ containment_get_zones() containment_set_obj_waypoint_on_screen(next_obj = false) { hud = self.obj_waypoint; + if (next_obj) { hud = self.next_obj_waypoint; @@ -2936,6 +2992,7 @@ containment_set_obj_waypoint_on_screen(next_obj = false) containment_set_obj_waypoint_off_screen(zone_name, zone, next_obj = false) { hud = self.obj_waypoint; + if (next_obj) { hud = self.next_obj_waypoint; @@ -3045,6 +3102,7 @@ meat_powerup_drop_think() wait 10; players = get_players(); + foreach(player in players) { player thread show_grief_hud_msg("Kill a zombie to drop the meat!"); @@ -3065,6 +3123,7 @@ meat_powerup_drop_think() if (!isDefined(level.meat_player)) { players = get_players(); + foreach (player in players) { player thread show_grief_hud_msg("Meat dropped!"); @@ -3076,6 +3135,7 @@ meat_powerup_drop_think() level waittill("meat_inactive"); players = get_players(); + foreach (player in players) { player thread show_grief_hud_msg("Meat reset!"); @@ -3269,12 +3329,14 @@ increment_score(team, amount = 1, show_lead_msg = true, special_score) level endon("end_game"); encounters_team = "A"; + if(team == "allies") { encounters_team = "B"; } level.grief_score[encounters_team] += amount; + if (level.grief_score[encounters_team] > get_gamemode_winning_score()) { level.grief_score[encounters_team] = get_gamemode_winning_score(); @@ -3297,6 +3359,7 @@ increment_score(team, amount = 1, show_lead_msg = true, special_score) if(level.scr_zm_ui_gametype_obj == "zgrief") { players = get_players(team); + foreach(player in players) { player thread show_grief_hud_msg("Enemy Bled Out! [" + score_left + " Remaining]"); @@ -3332,6 +3395,7 @@ increment_score(team, amount = 1, show_lead_msg = true, special_score) } players = get_players(team); + foreach (player in players) { player thread show_grief_hud_msg(msg); @@ -3346,6 +3410,7 @@ increment_score(team, amount = 1, show_lead_msg = true, special_score) level.prev_leader = encounters_team; players = get_players(); + foreach (player in players) { if (player.team == team) diff --git a/scripts/zm/zm_buried/zm_buried_reimagined.gsc b/scripts/zm/zm_buried/zm_buried_reimagined.gsc index d728ee38..09212bce 100644 --- a/scripts/zm/zm_buried/zm_buried_reimagined.gsc +++ b/scripts/zm/zm_buried/zm_buried_reimagined.gsc @@ -93,15 +93,18 @@ buried_special_weapon_magicbox_check(weapon) { players = get_players(); i = 0; + while ( i < players.size ) { if ( is_player_valid( players[ i ], undefined, 1 ) && players[ i ] is_player_tactical_grenade( weapon ) ) { return 0; } + i++; } } + return 1; } @@ -117,6 +120,7 @@ player_initial_spawn_override() // set new initial spawns to be same as respawns already on map ind = 0; respawn_points = maps\mp\gametypes_zm\_zm_gametype::get_player_spawns_for_gametype(); + for (i = 0; i < respawn_points.size; i++) { if (respawn_points[i].script_noteworthy == "zone_stables") @@ -127,6 +131,7 @@ player_initial_spawn_override() } respawn_array = getstructarray(respawn_points[ind].target, "targetname"); + foreach (respawn in respawn_array) { struct = spawnStruct(); @@ -204,6 +209,7 @@ sloth_barricades_buyable() } sloth_trigs = getentarray( "sloth_barricade", "targetname" ); + foreach (trig in sloth_trigs) { if (isDefined(trig.script_noteworthy) && trig.script_noteworthy == "courtyard_fountain") @@ -316,6 +322,7 @@ sloth_barricade_move() num = randomintrange( 3, 5 ); og_angles = self.angles; + for ( i = 0; i < num; i++ ) { angles = og_angles + ( -5 + randomfloat( 10 ), -5 + randomfloat( 10 ), -5 + randomfloat( 10 ) ); diff --git a/scripts/zm/zm_highrise/zm_highrise_reimagined.gsc b/scripts/zm/zm_highrise/zm_highrise_reimagined.gsc index cbbf4db9..356c6c12 100644 --- a/scripts/zm/zm_highrise/zm_highrise_reimagined.gsc +++ b/scripts/zm/zm_highrise/zm_highrise_reimagined.gsc @@ -57,9 +57,11 @@ init() door_changes() { zombie_doors = getentarray( "zombie_door", "targetname" ); + for ( i = 0; i < zombie_doors.size; i++ ) { new_target = undefined; + if (zombie_doors[i].target == "pf1577_auto2497") { new_target = "pf1577_auto2496"; @@ -89,16 +91,20 @@ zombie_init_done() self.zombie_path_bad = 0; self thread maps\mp\zm_highrise_distance_tracking::escaped_zombies_cleanup_init(); self thread maps\mp\zm_highrise::elevator_traverse_watcher(); + if ( self.classname == "actor_zm_highrise_basic_03" ) { health_bonus = int( self.maxhealth * 0.05 ); self.maxhealth += health_bonus; + if ( self.headmodel == "c_zom_zombie_chinese_head3_helmet" ) { self.maxhealth += health_bonus; } + self.health = self.maxhealth; } + self setphysparams( 15, 0, 48 ); } @@ -126,12 +132,14 @@ highrise_respawn_override( revivee, return_struct ) if ( isDefined( spawn_points[ j ].script_noteworthy ) ) { zone = level.zones[ spawn_points[ j ].script_noteworthy ]; + for ( k = 0; k < zone.volumes.size; k++ ) { if ( players[ i ] istouching( zone.volumes[ k ] ) ) { closest_group = j; spawn_location = maps\mp\zombies\_zm::get_valid_spawn_location( revivee, spawn_points, closest_group, return_struct ); + if ( isDefined( spawn_location ) ) { return spawn_location; @@ -246,6 +254,7 @@ elevator_call_think() while ( 1 ) { cost_active = 0; + if ( !self.elevator.body.is_moving && self.elevator maps\mp\zm_highrise_elevators::elevator_is_on_floor( self.floor ) && !is_true( self.elevator.body.start_location_wait ) ) { if ( !is_true( self.elevator.body.elevator_stop ) ) diff --git a/scripts/zm/zm_nuked/zm_nuked_reimagined.gsc b/scripts/zm/zm_nuked/zm_nuked_reimagined.gsc index 0f4c70cb..7d355b49 100644 --- a/scripts/zm/zm_nuked/zm_nuked_reimagined.gsc +++ b/scripts/zm/zm_nuked/zm_nuked_reimagined.gsc @@ -18,10 +18,12 @@ zombie_init_done() { self.meleedamage = 50; self.allowpain = 0; + if ( isDefined( self.script_parameters ) && self.script_parameters == "crater" ) { self thread maps\mp\zm_nuked::zombie_crater_locomotion(); } + self setphysparams( 15, 0, 48 ); } diff --git a/scripts/zm/zm_prison/zm_prison_reimagined.gsc b/scripts/zm/zm_prison/zm_prison_reimagined.gsc index 3d5486dc..6c326c85 100644 --- a/scripts/zm/zm_prison/zm_prison_reimagined.gsc +++ b/scripts/zm/zm_prison/zm_prison_reimagined.gsc @@ -89,6 +89,7 @@ door_changes() num = 0; targets = getentarray( "cellblock_start_door", "targetname" ); zombie_doors = getentarray( "zombie_door", "targetname" ); + for ( i = 0; i < zombie_doors.size; i++ ) { if ( isdefined( zombie_doors[i].target ) && zombie_doors[i].target == "cellblock_start_door" ) @@ -115,18 +116,22 @@ check_for_special_weapon_limit_exist(weapon) { return 1; } + players = get_players(); count = 0; + if ( weapon == "blundergat_zm" ) { if ( self maps\mp\zombies\_zm_weapons::has_weapon_or_upgrade( "blundersplat_zm" ) ) { return 0; } + if ( self afterlife_weapon_limit_check( "blundergat_zm" ) ) { return 0; } + limit = level.limited_weapons[ "blundergat_zm" ]; } else @@ -135,9 +140,12 @@ check_for_special_weapon_limit_exist(weapon) { return 0; } + limit = level.limited_weapons[ "minigun_alcatraz_zm" ]; } + i = 0; + while ( i < players.size ) { if ( weapon == "blundergat_zm" ) @@ -156,12 +164,15 @@ check_for_special_weapon_limit_exist(weapon) count++; } } + i++; } + if ( count >= limit ) { return 0; } + return 1; } @@ -778,6 +789,7 @@ working_zone_init() add_adjacent_zone( "zone_cellblock_west_gondola", "zone_cellblock_west_gondola_dock", "activate_cellblock_gondola" ); add_adjacent_zone( "zone_cellblock_west_gondola", "zone_cellblock_west_gondola_dock", "gondola_dock_to_roof" ); } + // else if ( is_gametype_active( "zgrief" ) ) // { // playable_area = getentarray( "player_volume", "script_noteworthy" ); diff --git a/scripts/zm/zm_tomb/zm_tomb_reimagined.gsc b/scripts/zm/zm_tomb/zm_tomb_reimagined.gsc index f6e064e5..ac0b9072 100644 --- a/scripts/zm/zm_tomb/zm_tomb_reimagined.gsc +++ b/scripts/zm/zm_tomb/zm_tomb_reimagined.gsc @@ -102,6 +102,7 @@ tomb_special_weapon_magicbox_check(weapon) return 0; } } + if ( isDefined( level.zombie_weapons[ weapon ].shared_ammo_weapon ) ) { if ( self maps\mp\zombies\_zm_weapons::has_weapon_or_upgrade( level.zombie_weapons[ weapon ].shared_ammo_weapon ) ) @@ -109,6 +110,7 @@ tomb_special_weapon_magicbox_check(weapon) return 0; } } + return 1; } @@ -125,24 +127,28 @@ register_melee_weapons_for_level() change_stargate_teleport_return_player_angles() { struct = getstructarray( "air_teleport_return", "targetname" ); + foreach (pos in struct) { pos.angles = (0, -120, 0); } struct = getstructarray( "elec_teleport_return", "targetname" ); + foreach (pos in struct) { pos.angles = (0, 0, 0); } struct = getstructarray( "fire_teleport_return", "targetname" ); + foreach (pos in struct) { pos.angles = (0, -130, 0); } struct = getstructarray( "ice_teleport_return", "targetname" ); + foreach (pos in struct) { pos.angles = (0, -110, 0); @@ -175,6 +181,7 @@ zombie_blood_dig_changes() for (i = 0; i < level.a_zombie_blood_entities.size; i++) { ent = level.a_zombie_blood_entities[i]; + if (IsDefined(ent.e_unique_player)) { if (!isDefined(ent.e_unique_player.initial_zombie_blood_dig)) @@ -183,6 +190,7 @@ zombie_blood_dig_changes() } ent.e_unique_player.initial_zombie_blood_dig++; + if (ent.e_unique_player.initial_zombie_blood_dig <= 2) { ent setvisibletoplayer(ent.e_unique_player); @@ -216,6 +224,7 @@ custom_magic_box_timer_til_despawn( magic_box ) v_float = anglesToForward( magic_box.angles - vectorScale( ( 0, 1, 0 ), 90 ) ) * 40; self moveto( self.origin - ( v_float * 0.25 ), level.magicbox_timeout, level.magicbox_timeout * 0.5 ); wait level.magicbox_timeout; + if ( isDefined( self ) ) { self delete(); diff --git a/scripts/zm/zm_transit/zm_transit_reimagined.gsc b/scripts/zm/zm_transit/zm_transit_reimagined.gsc index a0a88770..4d198a33 100644 --- a/scripts/zm/zm_transit/zm_transit_reimagined.gsc +++ b/scripts/zm/zm_transit/zm_transit_reimagined.gsc @@ -141,6 +141,7 @@ electric_door_changes() } zombie_doors = getentarray( "zombie_door", "targetname" ); + for ( i = 0; i < zombie_doors.size; i++ ) { if ( isDefined( zombie_doors[i].script_noteworthy ) && (zombie_doors[i].script_noteworthy == "local_electric_door" || zombie_doors[i].script_noteworthy == "electric_door") ) @@ -155,6 +156,7 @@ electric_door_changes() // link Bus Depot and Farm electric doors together new_target = undefined; + if (zombie_doors[i].target == "pf1766_auto2353") { new_target = "pf1766_auto2352"; @@ -192,6 +194,7 @@ power_local_electric_doors_globally() local_power = []; zombie_doors = getentarray( "zombie_door", "targetname" ); + for ( i = 0; i < zombie_doors.size; i++ ) { if ( isDefined( zombie_doors[i].script_noteworthy ) && zombie_doors[i].script_noteworthy == "local_electric_door" ) @@ -334,6 +337,7 @@ player_respawn_override() scripts\zm\replaced\utility::register_map_spawn_group(origin, zone, dist); respawn_array = []; + for (i = 0; i < 8; i++) { respawn_array[i] = spawnStruct(); @@ -376,6 +380,7 @@ player_respawn_override() scripts\zm\replaced\utility::register_map_spawn_group(origin, zone, dist); respawn_array = []; + for (i = 0; i < 8; i++) { respawn_array[i] = spawnStruct(); @@ -418,6 +423,7 @@ player_respawn_override() scripts\zm\replaced\utility::register_map_spawn_group(origin, zone, dist); respawn_array = []; + for (i = 0; i < 8; i++) { respawn_array[i] = spawnStruct(); @@ -460,6 +466,7 @@ player_respawn_override() scripts\zm\replaced\utility::register_map_spawn_group(origin, zone, dist); respawn_array = []; + for (i = 0; i < 8; i++) { respawn_array[i] = spawnStruct(); @@ -595,6 +602,7 @@ power_station_vision_change() while(1) { players = get_players(); + foreach(player in players) { if(!isDefined(player.power_station_vision_set)) @@ -636,6 +644,7 @@ change_dvar_over_time(dvar, val, time, increment) rate = (level.changed_r_exposureValue - level.default_r_exposureValue) / intervals; i = 0; + while(i < intervals) { if(increment) @@ -730,10 +739,12 @@ manage_zones( initial_zone ) deactivate_initial_barrier_goals(); zone_choke = 0; spawn_points = maps\mp\gametypes_zm\_zm_gametype::get_player_spawns_for_gametype(); + for ( i = 0; i < spawn_points.size; i++ ) { spawn_points[ i ].locked = 1; } + if ( isDefined( level.zone_manager_init_func ) ) { [[ level.zone_manager_init_func ]](); @@ -752,17 +763,21 @@ manage_zones( initial_zone ) zone_init( initial_zone ); enable_zone( initial_zone ); } + setup_zone_flag_waits(); zkeys = getarraykeys( level.zones ); level.zone_keys = zkeys; level.newzones = []; + for ( z = 0; z < zkeys.size; z++ ) { level.newzones[ zkeys[ z ] ] = spawnstruct(); } + oldzone = undefined; flag_set( "zones_initialized" ); flag_wait( "begin_spawning" ); + while ( getDvarInt( "noclip" ) == 0 || getDvarInt( "notarget" ) != 0 ) { for( z = 0; z < zkeys.size; z++ ) @@ -770,19 +785,23 @@ manage_zones( initial_zone ) level.newzones[ zkeys[ z ] ].is_active = 0; level.newzones[ zkeys[ z ] ].is_occupied = 0; } + a_zone_is_active = 0; a_zone_is_spawning_allowed = 0; level.zone_scanning_active = 1; z = 0; + while ( z < zkeys.size ) { zone = level.zones[ zkeys[ z ] ]; newzone = level.newzones[ zkeys[ z ] ]; + if( !zone.is_enabled ) { z++; continue; } + if ( isdefined(level.zone_occupied_func ) ) { newzone.is_occupied = [[ level.zone_occupied_func ]]( zkeys[ z ] ); @@ -791,25 +810,31 @@ manage_zones( initial_zone ) { newzone.is_occupied = player_in_zone( zkeys[ z ] ); } + if ( newzone.is_occupied ) { newzone.is_active = 1; a_zone_is_active = 1; + if ( zone.is_spawning_allowed ) { a_zone_is_spawning_allowed = 1; } + if ( !isdefined(oldzone) || oldzone != newzone ) { level notify( "newzoneActive", zkeys[ z ] ); oldzone = newzone; } + azkeys = getarraykeys( zone.adjacent_zones ); + for ( az = 0; az < zone.adjacent_zones.size; az++ ) { if ( zone.adjacent_zones[ azkeys[ az ] ].is_connected && level.zones[ azkeys[ az ] ].is_enabled ) { level.newzones[ azkeys[ az ] ].is_active = 1; + if ( level.zones[ azkeys[ az ] ].is_spawning_allowed ) { a_zone_is_spawning_allowed = 1; @@ -817,20 +842,26 @@ manage_zones( initial_zone ) } } } + zone_choke++; + if ( zone_choke >= 3 ) { zone_choke = 0; wait 0.05; } + z++; } + level.zone_scanning_active = 0; + for ( z = 0; z < zkeys.size; z++ ) { level.zones[ zkeys[ z ] ].is_active = level.newzones[ zkeys[ z ] ].is_active; level.zones[ zkeys[ z ] ].is_occupied = level.newzones[ zkeys[ z ] ].is_occupied; } + if ( !a_zone_is_active || !a_zone_is_spawning_allowed ) { if ( isarray( initial_zone ) ) @@ -846,6 +877,7 @@ manage_zones( initial_zone ) level.zones[ initial_zone ].is_spawning_allowed = 1; } } + [[ level.create_spawner_list_func ]]( zkeys ); level.active_zone_names = maps\mp\zombies\_zm_zonemgr::get_active_zone_names(); wait 1;