diff --git a/scripts/zm/_zm_reimagined.gsc b/scripts/zm/_zm_reimagined.gsc index 9d16c90d..f87ff920 100644 --- a/scripts/zm/_zm_reimagined.gsc +++ b/scripts/zm/_zm_reimagined.gsc @@ -271,6 +271,7 @@ post_all_players_spawned() level.callbackplayerdamage = scripts\zm\replaced\_zm::callback_playerdamage; level.overrideplayerdamage = scripts\zm\replaced\_zm::player_damage_override; level.playerlaststand_func = scripts\zm\replaced\_zm::player_laststand; + level.callbackplayerlaststand = scripts\zm\replaced\_zm::callback_playerlaststand; level.etrap_damage = maps\mp\zombies\_zm::ai_zombie_health( 255 ); level.slipgun_damage = maps\mp\zombies\_zm::ai_zombie_health( 255 ); level.tombstone_spawn_func = ::tombstone_spawn; diff --git a/scripts/zm/replaced/_zm.gsc b/scripts/zm/replaced/_zm.gsc index be0f7ae2..aa768e72 100644 --- a/scripts/zm/replaced/_zm.gsc +++ b/scripts/zm/replaced/_zm.gsc @@ -998,7 +998,7 @@ player_damage_override( einflictor, eattacker, idamage, idflags, smeansofdeath, if ( ( solo_death || non_solo_death ) && !is_true( level.no_end_game_check ) ) { level notify( "stop_suicide_trigger" ); - self thread maps\mp\zombies\_zm_laststand::playerlaststand( einflictor, eattacker, idamage, smeansofdeath, sweapon, vdir, shitloc, psoffsettime ); + self thread scripts\zm\replaced\_zm_laststand::playerlaststand( einflictor, eattacker, idamage, smeansofdeath, sweapon, vdir, shitloc, psoffsettime ); if ( !isDefined( vdir ) ) { vdir = ( 1, 0, 0 ); @@ -1195,6 +1195,12 @@ player_laststand( einflictor, attacker, idamage, smeansofdeath, sweapon, vdir, s } } +callback_playerlaststand( einflictor, eattacker, idamage, smeansofdeath, sweapon, vdir, shitloc, psoffsettime, deathanimduration ) +{ + self endon( "disconnect" ); + [[ scripts\zm\replaced\_zm_laststand::playerlaststand ]]( einflictor, eattacker, idamage, smeansofdeath, sweapon, vdir, shitloc, psoffsettime, deathanimduration ); +} + player_spawn_protection() { self endon("disconnect"); diff --git a/scripts/zm/replaced/_zm_laststand.gsc b/scripts/zm/replaced/_zm_laststand.gsc index 3c0f85a0..1e9485f4 100644 --- a/scripts/zm/replaced/_zm_laststand.gsc +++ b/scripts/zm/replaced/_zm_laststand.gsc @@ -334,4 +334,68 @@ auto_revive( reviver, dont_enable_weapons ) } self notify( "player_revived", reviver ); +} + +playerlaststand( einflictor, attacker, idamage, smeansofdeath, sweapon, vdir, shitloc, psoffsettime, deathanimduration ) +{ + self notify( "entering_last_stand" ); + + if ( isdefined( level._game_module_player_laststand_callback ) ) + self [[ level._game_module_player_laststand_callback ]]( einflictor, attacker, idamage, smeansofdeath, sweapon, vdir, shitloc, psoffsettime, deathanimduration ); + + if ( self player_is_in_laststand() ) + return; + + if ( isdefined( self.in_zombify_call ) && self.in_zombify_call ) + return; + + self thread player_last_stand_stats( einflictor, attacker, idamage, smeansofdeath, sweapon, vdir, shitloc, psoffsettime, deathanimduration ); + + if ( isdefined( level.playerlaststand_func ) ) + [[ level.playerlaststand_func ]]( einflictor, attacker, idamage, smeansofdeath, sweapon, vdir, shitloc, psoffsettime, deathanimduration ); + + self.health = 1; + self.laststand = 1; + self.ignoreme = 1; + self thread maps\mp\gametypes_zm\_gameobjects::onplayerlaststand(); + self thread maps\mp\zombies\_zm_buildables::onplayerlaststand(); + + if ( !( isdefined( self.no_revive_trigger ) && self.no_revive_trigger ) ) + self revive_trigger_spawn(); + else + self undolaststand(); + + if ( isdefined( self.is_zombie ) && self.is_zombie ) + { + self takeallweapons(); + + if ( isdefined( attacker ) && isplayer( attacker ) && attacker != self ) + attacker notify( "killed_a_zombie_player", einflictor, self, idamage, smeansofdeath, sweapon, vdir, shitloc, psoffsettime, deathanimduration ); + } + else + { + self laststand_disable_player_weapons(); + self laststand_give_pistol(); + } + + if ( isdefined( level.playersuicideallowed ) && level.playersuicideallowed && get_players().size > 1 ) + { + if ( !isdefined( level.canplayersuicide ) || self [[ level.canplayersuicide ]]() ) + self thread suicide_trigger_spawn(); + } + + if ( level.laststandgetupallowed ) + self thread laststand_getup(); + else + { + bleedout_time = getdvarfloat( "player_lastStandBleedoutTime" ); + self thread laststand_bleedout( bleedout_time ); + } + + if ( "zcleansed" != level.gametype ) + maps\mp\_demo::bookmark( "zm_player_downed", gettime(), self ); + + self notify( "player_downed" ); + self thread refire_player_downed(); + self thread cleanup_laststand_on_disconnect(); } \ No newline at end of file