diff --git a/README.md b/README.md index 6af4e6a3..964b4442 100644 --- a/README.md +++ b/README.md @@ -775,8 +775,9 @@ * Downing kills all zombies around the player ### Vulture-Aid -* Stink areas no longer activate while the player is moving +* Added ability to see zombies through walls * Removed ability to see perks, wallbuys, and Mystery Box through walls +* Stink areas no longer activate while the player is moving ## Pack-a-Punch * Changed default weapon camo to dragon camo from Black Ops 2 Multiplayer (modified to be darker on primary camo and not animated on secondary camo) diff --git a/materials/generic_filter_zm_turned.json b/materials/generic_filter_zm_turned.json new file mode 100644 index 00000000..e75860d6 --- /dev/null +++ b/materials/generic_filter_zm_turned.json @@ -0,0 +1,90 @@ +{ + "_type": "material", + "_version": 1, + "cameraRegion": "none", + "constants": [ + { + "literal": [ + 0.0, + 0.0, + 0.0, + 1.0 + ], + "name": "BlurAmount" + } + ], + "contents": 1, + "gameFlags": [], + "hashIndex": 0, + "layeredSurfaceTypes": 536870912, + "probeMipBits": 0, + "sortKey": 4, + "stateBits": [ + { + "alphaTest": "disabled", + "blendOpAlpha": "add", + "blendOpRgb": "add", + "colorWriteAlpha": true, + "colorWriteRgb": true, + "cullFace": "none", + "depthTest": "disabled", + "depthWrite": false, + "dstBlendAlpha": "one", + "dstBlendRgb": "invsrcalpha", + "polygonOffset": "offset0", + "polymodeLine": false, + "srcBlendAlpha": "invdestalpha", + "srcBlendRgb": "one", + "stencilBack": null, + "stencilFront": null + } + ], + "stateBitsEntry": [ + -1, + -1, + 0, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1 + ], + "stateFlags": 0, + "surfaceFlags": 0, + "surfaceTypeBits": 0, + "techniqueSet": "sw4_2d_zm_turned_6w16136w", + "textureAtlas": { + "columns": 1, + "rows": 1 + }, + "textures": [], + "thermalMaterial": null +} \ No newline at end of file diff --git a/scripts/zm/replaced/_zm_perk_vulture.csc b/scripts/zm/replaced/_zm_perk_vulture.csc index 569f7982..9b108a94 100644 --- a/scripts/zm/replaced/_zm_perk_vulture.csc +++ b/scripts/zm/replaced/_zm_perk_vulture.csc @@ -6,6 +6,95 @@ #include clientscripts\mp\_visionset_mgr; #include clientscripts\mp\_filter; +init_vulture() +{ + registerclientfield("toplayer", "vulture_perk_toplayer", 12000, 1, "int", ::vulture_callback_toplayer, 0, 1); + registerclientfield("actor", "vulture_perk_actor", 12000, 2, "int", ::vulture_callback_actor, 0, 0); + registerclientfield("scriptmover", "vulture_perk_scriptmover", 12000, 4, "int", ::vulture_callback_scriptmover, 0, 0); + registerclientfield("zbarrier", "vulture_perk_zbarrier", 12000, 1, "int", ::vulture_vision_mystery_box, 0, 0); + registerclientfield("toplayer", "sndVultureStink", 12000, 1, "int", ::sndvulturestink); + registerclientfield("world", "vulture_perk_disable_solo_quick_revive_glow", 12000, 1, "int", ::vulture_disable_solo_quick_revive_glow, 0, 0); + registerclientfield("toplayer", "vulture_perk_disease_meter", 12000, 5, "float", ::vulture_callback_stink_active, 0, 1); + registerclientfield("toplayer", "vulture_perk_ir", 3000, 1, "int", ::vulture_perk_ir, 0, 1); + setupclientfieldcodecallbacks("toplayer", 1, "vulture_perk_disease_meter"); + clientscripts\mp\_visionset_mgr::vsmgr_register_overlay_info_style_filter("vulture_stink_overlay", 12000, 31, 0, 0, "generic_filter_zombie_perk_vulture", 0); + level._effect["vulture_perk_zombie_stink"] = loadfx("maps/zombie/fx_zm_vulture_perk_stink"); + level._effect["vulture_perk_zombie_stink_trail"] = loadfx("maps/zombie/fx_zm_vulture_perk_stink_trail"); + level._effect["vulture_perk_bonus_drop"] = loadfx("misc/fx_zombie_powerup_vulture"); + level._effect["vulture_drop_picked_up"] = loadfx("misc/fx_zombie_powerup_grab"); + level._effect["vulture_perk_wallbuy_static"] = loadfx("maps/zombie/fx_zm_vulture_wallbuy_rifle"); + level._effect["vulture_perk_wallbuy_dynamic"] = loadfx("maps/zombie/fx_zm_vulture_glow_question"); + level._effect["vulture_perk_machine_glow_doubletap"] = loadfx("maps/zombie/fx_zm_vulture_glow_dbltap"); + level._effect["vulture_perk_machine_glow_juggernog"] = loadfx("maps/zombie/fx_zm_vulture_glow_jugg"); + level._effect["vulture_perk_machine_glow_revive"] = loadfx("maps/zombie/fx_zm_vulture_glow_revive"); + level._effect["vulture_perk_machine_glow_speed"] = loadfx("maps/zombie/fx_zm_vulture_glow_speed"); + level._effect["vulture_perk_machine_glow_marathon"] = loadfx("maps/zombie/fx_zm_vulture_glow_marathon"); + level._effect["vulture_perk_machine_glow_mule_kick"] = loadfx("maps/zombie/fx_zm_vulture_glow_mule"); + level._effect["vulture_perk_machine_glow_pack_a_punch"] = loadfx("maps/zombie/fx_zm_vulture_glow_pap"); + level._effect["vulture_perk_machine_glow_vulture"] = loadfx("maps/zombie/fx_zm_vulture_glow_vulture"); + level._effect["vulture_perk_mystery_box_glow"] = loadfx("maps/zombie/fx_zm_vulture_glow_mystery_box"); + level._effect["vulture_perk_powerup_drop"] = loadfx("maps/zombie/fx_zm_vulture_glow_powerup"); + level._effect["vulture_perk_zombie_eye_glow"] = loadfx("misc/fx_zombie_eye_vulture"); + level.perk_vulture = spawnstruct(); + level.perk_vulture.array_stink_zombies = []; + level.perk_vulture.array_stink_drop_locations = []; + level.perk_vulture.players_with_vulture_perk = []; + level.perk_vulture.vulture_vision_fx_list = []; + level.perk_vulture.clientfields = spawnstruct(); + level.perk_vulture.clientfields.scriptmovers = []; + level.perk_vulture.clientfields.scriptmovers[0] = ::vulture_stink_fx; + level.perk_vulture.clientfields.scriptmovers[1] = ::vulture_drop_fx; + level.perk_vulture.clientfields.scriptmovers[2] = ::vulture_drop_pickup; + level.perk_vulture.clientfields.scriptmovers[3] = ::vulture_powerup_drop; + level.perk_vulture.clientfields.actors = []; + level.perk_vulture.clientfields.actors[1] = ::vulture_eye_glow; + level.perk_vulture.clientfields.actors[0] = ::vulture_stink_trail_fx; + level.perk_vulture.clientfields.toplayer = []; + level.perk_vulture.clientfields.toplayer[0] = ::vulture_toggle; + level.perk_vulture.disable_solo_quick_revive_glow = 0; + + if (!isdefined(level.perk_vulture.custom_funcs_enable)) + level.perk_vulture.custom_funcs_enable = []; + + if (!isdefined(level.perk_vulture.custom_funcs_disable)) + level.perk_vulture.custom_funcs_disable = []; + + level.zombie_eyes_clientfield_cb_additional = ::vulture_eye_glow_callback_from_system; +} + +vulture_perk_ir(localclientnum, oldval, newval, bnewent, binitialsnap, fieldname, bwasdemojump) +{ + if (!self islocalplayer()) + return; + + if (!isdefined(self getlocalclientnumber())) + return; + + if (self getlocalclientnumber() != localclientnum) + return; + + if (isdemoplaying() && isspectating(localclientnum)) + newval = 0; + + vulture_perk_set_ir(localclientnum, newval); +} + +vulture_perk_set_ir(lcn, newval) +{ + if (newval) + { + setlutscriptindex(lcn, 2); + enable_filter_zm_turned(self, 0, 0); + self setsonarattachmentenabled(1); + } + else + { + setlutscriptindex(lcn, 0); + disable_filter_zm_turned(self, 0, 0); + self setsonarattachmentenabled(0); + } +} + vulture_vision_enable(localclientnumber) { if (isdefined(level.perk_vulture.vulture_vision_fx_list[localclientnumber])) diff --git a/scripts/zm/replaced/_zm_perk_vulture.gsc b/scripts/zm/replaced/_zm_perk_vulture.gsc index d95caf7b..7189fc7e 100644 --- a/scripts/zm/replaced/_zm_perk_vulture.gsc +++ b/scripts/zm/replaced/_zm_perk_vulture.gsc @@ -12,6 +12,160 @@ #include maps\mp\zombies\_zm_score; #include maps\mp\zombies\_zm_ai_basic; +init_vulture() +{ + setdvarint("zombies_perk_vulture_pickup_time", 12); + setdvarint("zombies_perk_vulture_pickup_time_stink", 16); + setdvarint("zombies_perk_vulture_drop_chance", 65); + setdvarint("zombies_perk_vulture_ammo_chance", 33); + setdvarint("zombies_perk_vulture_points_chance", 33); + setdvarint("zombies_perk_vulture_stink_chance", 33); + setdvarint("zombies_perk_vulture_drops_max", 20); + setdvarint("zombies_perk_vulture_network_drops_max", 5); + setdvarint("zombies_perk_vulture_network_time_frame", 250); + setdvarint("zombies_perk_vulture_spawn_stink_zombie_cooldown", 12); + setdvarint("zombies_perk_vulture_max_stink_zombies", 4); + level.perk_vulture = spawnstruct(); + level.perk_vulture.zombie_stink_array = []; + level.perk_vulture.drop_time_last = 0; + level.perk_vulture.drop_slots_for_network = 0; + level.perk_vulture.last_stink_zombie_spawned = 0; + level.perk_vulture.use_exit_behavior = 0; + level.perk_vulture.clientfields = spawnstruct(); + level.perk_vulture.clientfields.scriptmovers = []; + level.perk_vulture.clientfields.scriptmovers["vulture_stink_fx"] = 0; + level.perk_vulture.clientfields.scriptmovers["vulture_drop_fx"] = 1; + level.perk_vulture.clientfields.scriptmovers["vulture_drop_pickup"] = 2; + level.perk_vulture.clientfields.scriptmovers["vulture_powerup_drop"] = 3; + level.perk_vulture.clientfields.actors = []; + level.perk_vulture.clientfields.actors["vulture_stink_trail_fx"] = 0; + level.perk_vulture.clientfields.actors["vulture_eye_glow"] = 1; + level.perk_vulture.clientfields.toplayer = []; + level.perk_vulture.clientfields.toplayer["vulture_perk_active"] = 0; + registerclientfield("toplayer", "vulture_perk_toplayer", 12000, 1, "int"); + registerclientfield("actor", "vulture_perk_actor", 12000, 2, "int"); + registerclientfield("scriptmover", "vulture_perk_scriptmover", 12000, 4, "int"); + registerclientfield("zbarrier", "vulture_perk_zbarrier", 12000, 1, "int"); + registerclientfield("toplayer", "sndVultureStink", 12000, 1, "int"); + registerclientfield("world", "vulture_perk_disable_solo_quick_revive_glow", 12000, 1, "int"); + registerclientfield("toplayer", "vulture_perk_disease_meter", 12000, 5, "float"); + registerclientfield("toplayer", "vulture_perk_ir", 3000, 1, "int"); + maps\mp\_visionset_mgr::vsmgr_register_info("overlay", "vulture_stink_overlay", 12000, 120, 31, 1); + maps\mp\zombies\_zm_spawner::add_cusom_zombie_spawn_logic(::vulture_zombie_spawn_func); + register_zombie_death_event_callback(::zombies_drop_stink_on_death); + level thread vulture_perk_watch_mystery_box(); + level thread vulture_perk_watch_fire_sale(); + level thread vulture_perk_watch_powerup_drops(); + level thread vulture_handle_solo_quick_revive(); + assert(!isdefined(level.exit_level_func), "vulture perk is attempting to use level.exit_level_func, but one already exists for this level!"); + level.exit_level_func = ::vulture_zombies_find_exit_point; + level.perk_vulture.invalid_bonus_ammo_weapons = array("time_bomb_zm", "time_bomb_detonator_zm"); + + if (!isdefined(level.perk_vulture.func_zombies_find_valid_exit_locations)) + level.perk_vulture.func_zombies_find_valid_exit_locations = ::get_valid_exit_points_for_zombie; + + setup_splitscreen_optimizations(); + initialize_bonus_entity_pool(); + initialize_stink_entity_pool(); +} + +give_vulture_perk() +{ + vulture_debug_text("player " + self getentitynumber() + " has vulture perk!"); + + if (!isdefined(self.perk_vulture)) + self.perk_vulture = spawnstruct(); + + self.perk_vulture.active = 1; + self vulture_vision_toggle(1); + self vulture_clientfield_toplayer_set("vulture_perk_active"); + self thread vulture_perk_ir_think(); + self thread _vulture_perk_think(); +} + +take_vulture_perk() +{ + if (isdefined(self.perk_vulture) && (isdefined(self.perk_vulture.active) && self.perk_vulture.active)) + { + vulture_debug_text("player " + self getentitynumber() + " has lost vulture perk!"); + self.perk_vulture.active = 0; + + if (!self maps\mp\zombies\_zm_laststand::player_is_in_laststand()) + self.ignoreme = 0; + + self vulture_vision_toggle(0); + self vulture_clientfield_toplayer_clear("vulture_perk_active"); + self set_vulture_overlay(0); + self.vulture_stink_value = 0; + self setclientfieldtoplayer("vulture_perk_disease_meter", 0); + self setclientfieldtoplayer("vulture_perk_ir", 0); + self notify("vulture_perk_lost"); + } +} + +vulture_perk_ir_think() +{ + self endon("disconnect"); + self endon("vulture_perk_lost"); + + self setclientdvar("cg_sonarAttachmentSpeedDelay", 0.1); + prev_val = 0; + + while (1) + { + if (prev_val == 0) + { + if (self vulture_perk_ir_is_valid()) + { + self setclientfieldtoplayer("vulture_perk_ir", 1); + prev_val = 1; + } + } + else + { + if (!self vulture_perk_ir_is_valid()) + { + self setclientfieldtoplayer("vulture_perk_ir", 0); + prev_val = 0; + } + } + + wait 0.1; + } +} + +vulture_perk_ir_is_valid() +{ + // activating vulture stink filter deactivates vulture ir filter + if (isdefined(self.vulture_stink_value) && self.vulture_stink_value > 0) + { + return 0; + } + + zombies = getaispeciesarray(level.zombie_team, "all"); + + if (isdefined(level.sloth)) + { + zombies = add_to_array(zombies, level.sloth, 0); + } + + foreach (zombie in zombies) + { + if (zombie damageconetrace(self getplayercamerapos(), self)) + { + normal = vectornormalize(zombie getcentroid() - self getplayercamerapos()); + dot = vectordot(anglestoforward(self.angles), normal); + + if (dot >= 0.5) + { + return 0; + } + } + } + + return 1; +} + _is_player_in_zombie_stink(a_points) { velocity = self getVelocity() * (1, 1, 0); diff --git a/scripts/zm/zm_buried/zm_buried_reimagined.csc b/scripts/zm/zm_buried/zm_buried_reimagined.csc index 773495ab..80344b02 100644 --- a/scripts/zm/zm_buried/zm_buried_reimagined.csc +++ b/scripts/zm/zm_buried/zm_buried_reimagined.csc @@ -5,6 +5,7 @@ main() { replaceFunc(clientscripts\mp\zm_buried::init_gamemodes, scripts\zm\replaced\zm_buried::init_gamemodes); replaceFunc(clientscripts\mp\zm_buried::start_zombie_stuff, scripts\zm\replaced\zm_buried::start_zombie_stuff); + replaceFunc(clientscripts\mp\zombies\_zm_perk_vulture::init_vulture, scripts\zm\replaced\_zm_perk_vulture::init_vulture); replaceFunc(clientscripts\mp\zombies\_zm_perk_vulture::vulture_vision_enable, scripts\zm\replaced\_zm_perk_vulture::vulture_vision_enable); replaceFunc(clientscripts\mp\zombies\_zm_perk_vulture::vulture_vision_update_wallbuy_list, scripts\zm\replaced\_zm_perk_vulture::vulture_vision_update_wallbuy_list); replaceFunc(clientscripts\mp\zombies\_zm_perk_vulture::vulture_vision_mystery_box, scripts\zm\replaced\_zm_perk_vulture::vulture_vision_mystery_box); diff --git a/scripts/zm/zm_buried/zm_buried_reimagined.gsc b/scripts/zm/zm_buried/zm_buried_reimagined.gsc index 1a66931f..339c61bd 100644 --- a/scripts/zm/zm_buried/zm_buried_reimagined.gsc +++ b/scripts/zm/zm_buried/zm_buried_reimagined.gsc @@ -46,6 +46,9 @@ main() replaceFunc(maps\mp\zombies\_zm_equip_headchopper::init_anim_slice_times, scripts\zm\replaced\_zm_equip_headchopper::init_anim_slice_times); replaceFunc(maps\mp\zombies\_zm_equip_headchopper::headchopperthink, scripts\zm\replaced\_zm_equip_headchopper::headchopperthink); replaceFunc(maps\mp\zombies\_zm_equip_headchopper::setupwatchers, scripts\zm\replaced\_zm_equip_headchopper::setupwatchers); + replaceFunc(maps\mp\zombies\_zm_perk_vulture::init_vulture, scripts\zm\replaced\_zm_perk_vulture::init_vulture); + replaceFunc(maps\mp\zombies\_zm_perk_vulture::give_vulture_perk, scripts\zm\replaced\_zm_perk_vulture::give_vulture_perk); + replaceFunc(maps\mp\zombies\_zm_perk_vulture::take_vulture_perk, scripts\zm\replaced\_zm_perk_vulture::take_vulture_perk); replaceFunc(maps\mp\zombies\_zm_perk_vulture::_is_player_in_zombie_stink, scripts\zm\replaced\_zm_perk_vulture::_is_player_in_zombie_stink); replaceFunc(maps\mp\zombies\_zm_weap_slowgun::init, scripts\zm\replaced\_zm_weap_slowgun::init); replaceFunc(maps\mp\zombies\_zm_weap_slowgun::zombie_paralyzed, scripts\zm\replaced\_zm_weap_slowgun::zombie_paralyzed); diff --git a/zone_source/includes/zm/materials.zone b/zone_source/includes/zm/materials.zone index 18ee02e8..dc738d2d 100644 --- a/zone_source/includes/zm/materials.zone +++ b/zone_source/includes/zm/materials.zone @@ -11,6 +11,7 @@ material,menu_zm_nuked_zsurvival_nuked material,menu_zm_prison_zencounter_cellblock material,menu_zm_buried_zencounter_street material,menu_zm_map_transit_blit_power +material,generic_filter_zm_turned image,menu_zm_transit_zclassic_transit image,menu_zm_highrise_zclassic_rooftop image,menu_zm_prison_select_mob