diff --git a/README.md b/README.md index 06ea0c5d..ac5f3b49 100644 --- a/README.md +++ b/README.md @@ -318,6 +318,10 @@ ### Carpenter * Removed +### Zombie Blood +* No longer makes zombies ignore the player +* Makes the player invulnerable to zombie melee swipes + ### Meat * All zombies go after player holding the meat * 60% move speed while holding the meat diff --git a/scripts/zm/_zm_reimagined.gsc b/scripts/zm/_zm_reimagined.gsc index 2bfd6e41..761a0233 100644 --- a/scripts/zm/_zm_reimagined.gsc +++ b/scripts/zm/_zm_reimagined.gsc @@ -4,6 +4,7 @@ #include maps\mp\gametypes_zm\_hud_util; #include scripts\zm\replaced\utility; +#include scripts\zm\replaced\zm_melee; #include scripts\zm\replaced\_zm; #include scripts\zm\replaced\_zm_playerhealth; #include scripts\zm\replaced\_zm_utility; @@ -27,6 +28,7 @@ main() { replaceFunc(common_scripts\utility::struct_class_init, scripts\zm\replaced\utility::struct_class_init); + replaceFunc(maps\mp\animscripts\zm_melee::meleecombat, scripts\zm\replaced\zm_melee::meleecombat); replaceFunc(maps\mp\zombies\_zm::check_quickrevive_for_hotjoin, scripts\zm\replaced\_zm::check_quickrevive_for_hotjoin); replaceFunc(maps\mp\zombies\_zm::ai_calculate_health, scripts\zm\replaced\_zm::ai_calculate_health); replaceFunc(maps\mp\zombies\_zm::onallplayersready, scripts\zm\replaced\_zm::onallplayersready); diff --git a/scripts/zm/replaced/_zm_powerup_zombie_blood.gsc b/scripts/zm/replaced/_zm_powerup_zombie_blood.gsc new file mode 100644 index 00000000..600bf4b1 --- /dev/null +++ b/scripts/zm/replaced/_zm_powerup_zombie_blood.gsc @@ -0,0 +1,121 @@ +#include common_scripts\utility; +#include maps\mp\_utility; +#include maps\mp\zombies\_zm_powerups; +#include maps\mp\zombies\_zm_utility; +#include maps\mp\_visionset_mgr; +#include maps\mp\zombies\_zm_powerup_zombie_blood; + +zombie_blood_powerup( m_powerup, e_player ) +{ + e_player notify( "zombie_blood" ); + e_player endon( "zombie_blood" ); + e_player endon( "disconnect" ); + e_player thread powerup_vo( "zombie_blood" ); + e_player._show_solo_hud = 1; + e_player.zombie_vars["zombie_powerup_zombie_blood_time"] = 30; + e_player.zombie_vars["zombie_powerup_zombie_blood_on"] = 1; + level notify( "player_zombie_blood", e_player ); + maps\mp\_visionset_mgr::vsmgr_activate( "visionset", "zm_powerup_zombie_blood_visionset", e_player ); + maps\mp\_visionset_mgr::vsmgr_activate( "overlay", "zm_powerup_zombie_blood_overlay", e_player ); + e_player setclientfield( "player_zombie_blood_fx", 1 ); + __new = []; + + foreach ( __key, __value in level.a_zombie_blood_entities ) + { + if ( isdefined( __value ) ) + { + if ( isstring( __key ) ) + { + __new[__key] = __value; + continue; + } + + __new[__new.size] = __value; + } + } + + level.a_zombie_blood_entities = __new; + + foreach ( e_zombie_blood in level.a_zombie_blood_entities ) + { + if ( isdefined( e_zombie_blood.e_unique_player ) ) + { + if ( e_zombie_blood.e_unique_player == e_player ) + e_zombie_blood setvisibletoplayer( e_player ); + + continue; + } + + e_zombie_blood setvisibletoplayer( e_player ); + } + + if ( !isdefined( e_player.m_fx ) ) + { + v_origin = e_player gettagorigin( "J_Eyeball_LE" ); + v_angles = e_player gettagangles( "J_Eyeball_LE" ); + m_fx = spawn( "script_model", v_origin ); + m_fx setmodel( "tag_origin" ); + m_fx.angles = v_angles; + m_fx linkto( e_player, "J_Eyeball_LE", ( 0, 0, 0 ), ( 0, 0, 0 ) ); + m_fx thread fx_disconnect_watch( e_player ); + playfxontag( level._effect["zombie_blood"], m_fx, "tag_origin" ); + e_player.m_fx = m_fx; + e_player.m_fx playloopsound( "zmb_zombieblood_3rd_loop", 1 ); + + if ( isdefined( level.str_zombie_blood_model ) ) + { + e_player.hero_model = e_player.model; + e_player setmodel( level.str_zombie_blood_model ); + } + } + + e_player thread watch_zombie_blood_early_exit(); + + while ( e_player.zombie_vars["zombie_powerup_zombie_blood_time"] >= 0 ) + { + wait 0.05; + e_player.zombie_vars["zombie_powerup_zombie_blood_time"] -= 0.05; + } + + e_player notify( "zombie_blood_over" ); + + if ( isdefined( e_player.characterindex ) ) + e_player playsound( "vox_plr_" + e_player.characterindex + "_exert_grunt_" + randomintrange( 0, 3 ) ); + + e_player.m_fx delete(); + maps\mp\_visionset_mgr::vsmgr_deactivate( "visionset", "zm_powerup_zombie_blood_visionset", e_player ); + maps\mp\_visionset_mgr::vsmgr_deactivate( "overlay", "zm_powerup_zombie_blood_overlay", e_player ); + e_player.zombie_vars["zombie_powerup_zombie_blood_on"] = 0; + e_player.zombie_vars["zombie_powerup_zombie_blood_time"] = 30; + e_player._show_solo_hud = 0; + e_player setclientfield( "player_zombie_blood_fx", 0 ); + + e_player.early_exit = undefined; + + __new = []; + + foreach ( __key, __value in level.a_zombie_blood_entities ) + { + if ( isdefined( __value ) ) + { + if ( isstring( __key ) ) + { + __new[__key] = __value; + continue; + } + + __new[__new.size] = __value; + } + } + + level.a_zombie_blood_entities = __new; + + foreach ( e_zombie_blood in level.a_zombie_blood_entities ) + e_zombie_blood setinvisibletoplayer( e_player ); + + if ( isdefined( e_player.hero_model ) ) + { + e_player setmodel( e_player.hero_model ); + e_player.hero_model = undefined; + } +} \ No newline at end of file diff --git a/scripts/zm/replaced/zm_melee.gsc b/scripts/zm/replaced/zm_melee.gsc new file mode 100644 index 00000000..b6c957b8 --- /dev/null +++ b/scripts/zm/replaced/zm_melee.gsc @@ -0,0 +1,117 @@ +#include common_scripts\utility; +#include maps\mp\animscripts\shared; +#include maps\mp\animscripts\utility; +#include maps\mp\animscripts\zm_utility; +#include maps\mp\animscripts\zm_combat; +#include maps\mp\animscripts\zm_melee; + +meleecombat() +{ + self endon( "end_melee" ); + self endon( "killanimscript" ); + assert( canmeleeanyrange() ); + self orientmode( "face enemy" ); + + if ( is_true( self.sliding_on_goo ) ) + self animmode( "slide" ); + else + self animmode( "zonly_physics" ); + + for (;;) + { + if ( isdefined( self.marked_for_death ) ) + return; + + if ( isdefined( self.enemy ) ) + { + angles = vectortoangles( self.enemy.origin - self.origin ); + self orientmode( "face angle", angles[1] ); + } + + if ( isdefined( self.zmb_vocals_attack ) ) + self playsound( self.zmb_vocals_attack ); + + if ( isdefined( self.nochangeduringmelee ) && self.nochangeduringmelee ) + self.safetochangescript = 0; + + if ( isdefined( self.is_inert ) && self.is_inert ) + return; + + set_zombie_melee_anim_state( self ); + + if ( isdefined( self.melee_anim_func ) ) + self thread [[ self.melee_anim_func ]](); + + while ( true ) + { + self waittill( "melee_anim", note ); + + if ( note == "end" ) + break; + else if ( note == "fire" ) + { + if ( !isdefined( self.enemy ) ) + break; + + if ( isdefined( self.dont_die_on_me ) && self.dont_die_on_me ) + break; + + if ( is_true( self.enemy.zombie_vars["zombie_powerup_zombie_blood_on"] ) ) + break; + + self.enemy notify( "melee_swipe", self ); + oldhealth = self.enemy.health; + self melee(); + + if ( !isdefined( self.enemy ) ) + break; + + if ( self.enemy.health >= oldhealth ) + { + if ( isdefined( self.melee_miss_func ) ) + self [[ self.melee_miss_func ]](); + else if ( isdefined( level.melee_miss_func ) ) + self [[ level.melee_miss_func ]](); + } + } + else if ( note == "stop" ) + { + if ( !cancontinuetomelee() ) + break; + } + } + + if ( is_true( self.sliding_on_goo ) ) + self orientmode( "face enemy" ); + else + self orientmode( "face default" ); + + if ( isdefined( self.nochangeduringmelee ) && self.nochangeduringmelee || is_true( self.sliding_on_goo ) ) + { + if ( isdefined( self.enemy ) ) + { + dist_sq = distancesquared( self.origin, self.enemy.origin ); + + if ( dist_sq > self.meleeattackdist * self.meleeattackdist ) + { + self.safetochangescript = 1; + wait 0.1; + break; + } + } + else + { + self.safetochangescript = 1; + wait 0.1; + break; + } + } + } + + if ( is_true( self.sliding_on_goo ) ) + self animmode( "slide" ); + else + self animmode( "none" ); + + self thread maps\mp\animscripts\zm_combat::main(); +} \ No newline at end of file diff --git a/scripts/zm/zm_tomb/zm_tomb_reimagined.gsc b/scripts/zm/zm_tomb/zm_tomb_reimagined.gsc index 041ad71c..ce243469 100644 --- a/scripts/zm/zm_tomb/zm_tomb_reimagined.gsc +++ b/scripts/zm/zm_tomb/zm_tomb_reimagined.gsc @@ -3,18 +3,20 @@ #include maps\mp\zombies\_zm_utility; #include maps\mp\zombies\_zm_craftables; -#include scripts\zm\replaced\_zm_craftables; -#include scripts\zm\replaced\_zm_riotshield_tomb; -#include scripts\zm\replaced\_zm_weap_riotshield_tomb; #include scripts\zm\replaced\zm_tomb_main_quest; #include scripts\zm\replaced\zm_tomb_quest_air; #include scripts\zm\replaced\zm_tomb_quest_elec; #include scripts\zm\replaced\zm_tomb_quest_fire; #include scripts\zm\replaced\zm_tomb_quest_ice; -#include scripts\zm\replaced\_zm_ai_mechz; +#include scripts\zm\replaced\zm_tomb_challenges; #include scripts\zm\replaced\zm_tomb_craftables; #include scripts\zm\replaced\zm_tomb_dig; #include scripts\zm\replaced\zm_tomb_tank; +#include scripts\zm\replaced\_zm_ai_mechz; +#include scripts\zm\replaced\_zm_craftables; +#include scripts\zm\replaced\_zm_powerup_zombie_blood; +#include scripts\zm\replaced\_zm_riotshield_tomb; +#include scripts\zm\replaced\_zm_weap_riotshield_tomb; main() { @@ -29,14 +31,15 @@ main() replaceFunc(maps\mp\zm_tomb_ee_main_step_2::create_robot_head_trigger, scripts\zm\replaced\zm_tomb_ee_main_step_2::create_robot_head_trigger); replaceFunc(maps\mp\zm_tomb_ee_main_step_2::remove_plinth, scripts\zm\replaced\zm_tomb_ee_main_step_2::remove_plinth); replaceFunc(maps\mp\zm_tomb_ee_main_step_3::fire_link_cooldown, scripts\zm\replaced\zm_tomb_ee_main_step_3::fire_link_cooldown); + replaceFunc(maps\mp\zm_tomb_challenges::challenges_init, scripts\zm\replaced\zm_tomb_challenges::challenges_init); replaceFunc(maps\mp\zm_tomb_craftables::quadrotor_control_thread, scripts\zm\replaced\zm_tomb_craftables::quadrotor_control_thread); replaceFunc(maps\mp\zm_tomb_craftables::quadrotor_set_unavailable, scripts\zm\replaced\zm_tomb_craftables::quadrotor_set_unavailable); - replaceFunc(maps\mp\zm_tomb_challenges::challenges_init, scripts\zm\replaced\zm_tomb_challenges::challenges_init); replaceFunc(maps\mp\zm_tomb_dig::increment_player_perk_purchase_limit, scripts\zm\replaced\zm_tomb_dig::increment_player_perk_purchase_limit); replaceFunc(maps\mp\zm_tomb_dig::dig_disconnect_watch, scripts\zm\replaced\zm_tomb_dig::dig_disconnect_watch); replaceFunc(maps\mp\zm_tomb_tank::players_on_tank_update, scripts\zm\replaced\zm_tomb_tank::players_on_tank_update); replaceFunc(maps\mp\zombies\_zm_ai_mechz::mechz_set_starting_health, scripts\zm\replaced\_zm_ai_mechz::mechz_set_starting_health); replaceFunc(maps\mp\zombies\_zm_craftables::choose_open_craftable, scripts\zm\replaced\_zm_craftables::choose_open_craftable); + replaceFunc(maps\mp\zombies\_zm_powerup_zombie_blood::zombie_blood_powerup, scripts\zm\replaced\_zm_powerup_zombie_blood::zombie_blood_powerup); replaceFunc(maps\mp\zombies\_zm_riotshield_tomb::doriotshielddeploy, scripts\zm\replaced\_zm_riotshield_tomb::doriotshielddeploy); replaceFunc(maps\mp\zombies\_zm_riotshield_tomb::trackriotshield, scripts\zm\replaced\_zm_riotshield_tomb::trackriotshield); replaceFunc(maps\mp\zombies\_zm_weap_riotshield_tomb::init, scripts\zm\replaced\_zm_weap_riotshield_tomb::init);