Skip to content

Commit

Permalink
- fixed: A global variable was used to pass MeansOfDeath to ClientObi…
Browse files Browse the repository at this point in the history
…tuary.

The problem here is that this affects the public scripting interface so it cannot be committed to master without further adjustments.
  • Loading branch information
coelckers committed Apr 23, 2018
1 parent 2aee68d commit 36e058d
Show file tree
Hide file tree
Showing 10 changed files with 29 additions and 30 deletions.
4 changes: 2 additions & 2 deletions src/actor.h
Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion src/d_player.h
Expand Up @@ -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);
Expand Down
6 changes: 3 additions & 3 deletions src/g_shared/a_morph.cpp
Expand Up @@ -701,19 +701,19 @@ 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;
// [MH]
// 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);
}
}

Expand Down
2 changes: 1 addition & 1 deletion src/g_shared/a_sharedglobal.h
Expand Up @@ -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<AActor*> UnmorphedMe;
Expand Down
25 changes: 12 additions & 13 deletions src/p_interaction.cpp
Expand Up @@ -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
//
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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());
Expand All @@ -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;
}
Expand Down Expand Up @@ -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));
Expand Down Expand Up @@ -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);
}


Expand Down Expand Up @@ -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.
Expand Down Expand Up @@ -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)
{
Expand Down Expand Up @@ -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);
}
}
Expand Down
6 changes: 3 additions & 3 deletions src/p_user.cpp
Expand Up @@ -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
{
Expand Down
2 changes: 1 addition & 1 deletion wadsrc/static/zscript/actor.txt
Expand Up @@ -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();
Expand Down
4 changes: 2 additions & 2 deletions wadsrc/static/zscript/hexen/heresiarch.txt
Expand Up @@ -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)
{
Expand Down
4 changes: 2 additions & 2 deletions wadsrc/static/zscript/raven/minotaur.txt
Expand Up @@ -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)
{
Expand Down
4 changes: 2 additions & 2 deletions wadsrc/static/zscript/strife/strifestuff.txt
Expand Up @@ -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;

Expand Down

0 comments on commit 36e058d

Please sign in to comment.