Fixed Pre(Un)Morph being called out of order.

- This had broken several mods that relied on the inventory being in place before the switch, which was the intended way to begin with.
This commit is contained in:
Major Cooke 2024-06-23 18:18:05 -05:00 committed by Rachael Alexanderson
parent 5fc3d44ba5
commit 3e91d38582
3 changed files with 37 additions and 6 deletions

View File

@ -5345,6 +5345,42 @@ int MorphPointerSubstitution(AActor* from, AActor* to)
return false;
}
// [MC] Had to move this here since ObtainInventory was also moved as well. Should be called
// before any transference of items since that's what was intended when introduced.
if (!from->alternative) // Morphing into
{
{
IFVIRTUALPTR(from, AActor, PreMorph)
{
VMValue params[] = { from, to, false };
VMCall(func, params, 3, nullptr, 0);
}
}
{
IFVIRTUALPTR(to, AActor, PreMorph)
{
VMValue params[] = { to, from, true };
VMCall(func, params, 3, nullptr, 0);
}
}
}
else // Unmorphing back
{
{
IFVIRTUALPTR(from, AActor, PreUnmorph)
{
VMValue params[] = { from, to, false };
VMCall(func, params, 3, nullptr, 0);
}
}
{
IFVIRTUALPTR(to, AActor, PreUnmorph)
{
VMValue params[] = { to, from, true };
VMCall(func, params, 3, nullptr, 0);
}
}
}
// Since the check is good, move the inventory items over. This should always be done when
// morphing to emulate Heretic/Hexen's behavior since those stored the inventory in their
// player structs.

View File

@ -99,6 +99,7 @@ extend class Actor
}
// [MC] Called when an actor morphs, on both the previous form (!current) and present form (current).
// Due to recent changes, these are now called internally instead of within the virtuals.
virtual void PreMorph(Actor mo, bool current) {}
virtual void PostMorph(Actor mo, bool current) {}
virtual void PreUnmorph(Actor mo, bool current) {}

View File

@ -129,9 +129,6 @@ extend class PlayerPawn
return false;
}
PreMorph(morphed, false);
morphed.PreMorph(self, true);
morphed.EndAllPowerupEffects();
if ((style & MRF_TRANSFERTRANSLATION) && !morphed.bDontTranslate)
@ -259,9 +256,6 @@ extend class PlayerPawn
if (!MorphInto(alt))
return false;
PreUnmorph(alt, false); // This body's about to be left.
alt.PreUnmorph(self, true); // This one's about to become current.
alt.EndAllPowerupEffects();
// Remove the morph power if the morph is being undone prematurely.