diff --git a/src/actor.h b/src/actor.h index 863e4fb46a0..79ec110f0be 100644 --- a/src/actor.h +++ b/src/actor.h @@ -689,8 +689,8 @@ class AActor : public DThinker void CallDeactivate(AActor *activator); // Called when actor dies - virtual void Die (AActor *source, AActor *inflictor, int dmgflags = 0); - void CallDie(AActor *source, AActor *inflictor, int dmgflags = 0); + virtual void Die (AActor *source, AActor *inflictor, int dmgflags = 0, FName MeansOfDeath = NAME_None); + void CallDie(AActor *source, AActor *inflictor, int dmgflags = 0, FName MeansOfDeath = NAME_None); // Perform some special damage action. Returns the amount of damage to do. // Returning -1 signals the damage routine to exit immediately diff --git a/src/d_player.h b/src/d_player.h index 80ac8c87000..189b0973b80 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -92,7 +92,7 @@ class APlayerPawn : public AActor virtual bool UseInventory (AInventory *item) override; virtual void MarkPrecacheSounds () const override; virtual void BeginPlay () override; - virtual void Die (AActor *source, AActor *inflictor, int dmgflags) override; + virtual void Die (AActor *source, AActor *inflictor, int dmgflags, FName MeansOfDeath) override; virtual bool UpdateWaterLevel (bool splash) override; bool ResetAirSupply (bool playgasp = true); diff --git a/src/g_shared/a_morph.cpp b/src/g_shared/a_morph.cpp index d8b4b373b08..524a86dde3d 100644 --- a/src/g_shared/a_morph.cpp +++ b/src/g_shared/a_morph.cpp @@ -701,7 +701,7 @@ void AMorphedMonster::OnDestroy () Super::OnDestroy(); } -void AMorphedMonster::Die (AActor *source, AActor *inflictor, int dmgflags) +void AMorphedMonster::Die (AActor *source, AActor *inflictor, int dmgflags, FName MeansOfDeath) { // Dead things don't unmorph // flags3 |= MF3_STAYMORPHED; @@ -709,11 +709,11 @@ void AMorphedMonster::Die (AActor *source, AActor *inflictor, int dmgflags) // But they can now, so that line above has been // moved into P_MorphedDeath() and is now set by // that function if and only if it is needed. - Super::Die (source, inflictor, dmgflags); + Super::Die (source, inflictor, dmgflags, MeansOfDeath); if (UnmorphedMe != NULL && (UnmorphedMe->flags & MF_UNMORPHED)) { UnmorphedMe->health = health; - UnmorphedMe->CallDie (source, inflictor, dmgflags); + UnmorphedMe->CallDie (source, inflictor, dmgflags, MeansOfDeath); } } diff --git a/src/g_shared/a_sharedglobal.h b/src/g_shared/a_sharedglobal.h index ce2376cec03..9f1bff5d4bf 100644 --- a/src/g_shared/a_sharedglobal.h +++ b/src/g_shared/a_sharedglobal.h @@ -162,7 +162,7 @@ class AMorphedMonster : public AActor void Tick (); void Serialize(FSerializer &arc); - void Die (AActor *source, AActor *inflictor, int dmgflags); + void Die (AActor *source, AActor *inflictor, int dmgflags, FName MeansOfDeath) override; void OnDestroy() override; TObjPtr UnmorphedMe; diff --git a/src/p_interaction.cpp b/src/p_interaction.cpp index 4de850900db..4e8993fa601 100644 --- a/src/p_interaction.cpp +++ b/src/p_interaction.cpp @@ -83,8 +83,6 @@ CVAR (Float, sv_damagefactormobj, 1.0, CVAR_SERVERINFO|CVAR_CHEAT) CVAR (Float, sv_damagefactorfriendly, 1.0, CVAR_SERVERINFO|CVAR_CHEAT) CVAR (Float, sv_damagefactorplayer, 1.0, CVAR_SERVERINFO|CVAR_CHEAT) -FName MeansOfDeath; - // // GET STUFF // @@ -187,7 +185,7 @@ void SexMessage (const char *from, char *to, int gender, const char *victim, con // [RH] // ClientObituary: Show a message when a player dies // -void ClientObituary (AActor *self, AActor *inflictor, AActor *attacker, int dmgflags) +void ClientObituary (AActor *self, AActor *inflictor, AActor *attacker, int dmgflags, FName MeansOfDeath) { FName mod; FString ret; @@ -289,7 +287,7 @@ void ClientObituary (AActor *self, AActor *inflictor, AActor *attacker, int dmgf // EXTERN_CVAR (Int, fraglimit) -void AActor::Die (AActor *source, AActor *inflictor, int dmgflags) +void AActor::Die (AActor *source, AActor *inflictor, int dmgflags, FName MeansOfDeath) { // Handle possible unmorph on death bool wasgibbed = (health < GetGibHealth()); @@ -308,7 +306,7 @@ void AActor::Die (AActor *source, AActor *inflictor, int dmgflags) realthis->health = realgibhealth -1; // if morphed was gibbed, so must original be (where allowed)l } } - realthis->CallDie(source, inflictor, dmgflags); + realthis->CallDie(source, inflictor, dmgflags, MeansOfDeath); } return; } @@ -560,7 +558,7 @@ void AActor::Die (AActor *source, AActor *inflictor, int dmgflags) if (player) { // [RH] Death messages - ClientObituary (this, inflictor, source, dmgflags); + ClientObituary (this, inflictor, source, dmgflags, MeansOfDeath); // [ZZ] fire player death hook E_PlayerDied(int(player - players)); @@ -731,18 +729,19 @@ DEFINE_ACTION_FUNCTION(AActor, Die) PARAM_OBJECT(source, AActor); PARAM_OBJECT(inflictor, AActor); PARAM_INT_DEF(dmgflags); - self->Die(source, inflictor, dmgflags); + PARAM_NAME_DEF(MeansOfDeath); + self->Die(source, inflictor, dmgflags, MeansOfDeath); return 0; } -void AActor::CallDie(AActor *source, AActor *inflictor, int dmgflags) +void AActor::CallDie(AActor *source, AActor *inflictor, int dmgflags, FName MeansOfDeath) { IFVIRTUAL(AActor, Die) { - VMValue params[4] = { (DObject*)this, source, inflictor, dmgflags }; - VMCall(func, params, 4, nullptr, 0); + VMValue params[] = { (DObject*)this, source, inflictor, dmgflags, MeansOfDeath.GetIndex() }; + VMCall(func, params, 5, nullptr, 0); } - else return Die(source, inflictor, dmgflags); + else return Die(source, inflictor, dmgflags, MeansOfDeath); } @@ -939,6 +938,7 @@ static int DamageMobj (AActor *target, AActor *inflictor, AActor *source, int da { // Shouldn't happen return 0; } + FName MeansOfDeath = mod; // Rather than unnecessarily call the function over and over again, let's be a little more efficient. // But first, check and see if it's even needed, which it won't be if pain must not be triggered. @@ -1018,7 +1018,6 @@ static int DamageMobj (AActor *target, AActor *inflictor, AActor *source, int da flags |= DMG_NO_ARMOR; } - MeansOfDeath = mod; // [RH] Andy Baker's Stealth monsters if (target->flags & MF_STEALTH) { @@ -1508,7 +1507,7 @@ static int DamageMobj (AActor *target, AActor *inflictor, AActor *source, int da source = source->tracer; } } - target->CallDie (source, inflictor, flags); + target->CallDie (source, inflictor, flags, MeansOfDeath); return MAX(0, damage); } } diff --git a/src/p_user.cpp b/src/p_user.cpp index 6ec5b629fea..3130a39f4bf 100644 --- a/src/p_user.cpp +++ b/src/p_user.cpp @@ -1687,15 +1687,15 @@ void APlayerPawn::ActivateMorphWeapon () // //=========================================================================== -void APlayerPawn::Die (AActor *source, AActor *inflictor, int dmgflags) +void APlayerPawn::Die (AActor *source, AActor *inflictor, int dmgflags, FName MeansOfDeath) { - Super::Die (source, inflictor, dmgflags); + Super::Die (source, inflictor, dmgflags, MeansOfDeath); if (player != NULL && player->mo == this) player->bonuscount = 0; if (player != NULL && player->mo != this) { // Make the real player die, too - player->mo->CallDie (source, inflictor, dmgflags); + player->mo->CallDie (source, inflictor, dmgflags, MeansOfDeath); } else { diff --git a/wadsrc/static/zscript/actor.txt b/wadsrc/static/zscript/actor.txt index bec97eda33d..402ff19d4bf 100644 --- a/wadsrc/static/zscript/actor.txt +++ b/wadsrc/static/zscript/actor.txt @@ -429,7 +429,7 @@ class Actor : Thinker native virtual native void Deactivate(Actor activator); virtual native int DoSpecialDamage (Actor target, int damage, Name damagetype); virtual native int TakeSpecialDamage (Actor inflictor, Actor source, int damage, Name damagetype); - virtual native void Die(Actor source, Actor inflictor, int dmgflags = 0); + virtual native void Die(Actor source, Actor inflictor, int dmgflags = 0, Name MeansOfDeath = 'none'); virtual native bool Slam(Actor victim); virtual native void Touch(Actor toucher); virtual native void MarkPrecacheSounds(); diff --git a/wadsrc/static/zscript/hexen/heresiarch.txt b/wadsrc/static/zscript/hexen/heresiarch.txt index ffb26b13642..cd550217762 100644 --- a/wadsrc/static/zscript/hexen/heresiarch.txt +++ b/wadsrc/static/zscript/hexen/heresiarch.txt @@ -112,13 +112,13 @@ class Heresiarch : Actor Stop; } - override void Die (Actor source, Actor inflictor, int dmgflags) + override void Die (Actor source, Actor inflictor, int dmgflags, Name MeansOfDeath) { // The heresiarch just executes a script instead of a special upon death int script = special; special = 0; - Super.Die (source, inflictor, dmgflags); + Super.Die (source, inflictor, dmgflags, MeansOfDeath); if (script != 0) { diff --git a/wadsrc/static/zscript/raven/minotaur.txt b/wadsrc/static/zscript/raven/minotaur.txt index 1738bc3f676..74ab8d57ca8 100644 --- a/wadsrc/static/zscript/raven/minotaur.txt +++ b/wadsrc/static/zscript/raven/minotaur.txt @@ -611,9 +611,9 @@ class MinotaurFriend : Minotaur StartTime = -1; } - override void Die (Actor source, Actor inflictor, int dmgflags) + override void Die (Actor source, Actor inflictor, int dmgflags, Name MeansOfDeath) { - Super.Die (source, inflictor, dmgflags); + Super.Die (source, inflictor, dmgflags, MeansOfDeath); if (tracer && tracer.health > 0 && tracer.player) { diff --git a/wadsrc/static/zscript/strife/strifestuff.txt b/wadsrc/static/zscript/strife/strifestuff.txt index a26e5b6978d..33af78e7eef 100644 --- a/wadsrc/static/zscript/strife/strifestuff.txt +++ b/wadsrc/static/zscript/strife/strifestuff.txt @@ -1842,9 +1842,9 @@ class PowerCoupling : Actor Loop; } - override void Die (Actor source, Actor inflictor, int dmgflags) + override void Die (Actor source, Actor inflictor, int dmgflags, Name MeansOfDeath) { - Super.Die (source, inflictor, dmgflags); + Super.Die (source, inflictor, dmgflags, MeansOfDeath); int i;