Fixed crashes with the A_CrispyPlayer and A_HandLower action functions

Simply using FindPSprite in those functions wouldn't be enough because if a mod is using the firehands layer when they are called this would go very wrong
This commit is contained in:
Leonard2 2016-06-18 10:48:13 +02:00
parent 3ea70980f9
commit 05d1df3571
2 changed files with 23 additions and 5 deletions

View file

@ -378,14 +378,22 @@ DEFINE_ACTION_FUNCTION(AActor, A_CrispyPlayer)
if (self->player != nullptr && self->player->mo == self) if (self->player != nullptr && self->player->mo == self)
{ {
self->player->playerstate = PST_DEAD;
DPSprite *psp; DPSprite *psp;
psp = self->player->GetPSprite(PSP_STRIFEHANDS); psp = self->player->GetPSprite(PSP_STRIFEHANDS);
FState *firehandslower = self->FindState("FireHandsLower"); FState *firehandslower = self->FindState("FireHandsLower");
FState *firehands = self->FindState("FireHands"); FState *firehands = self->FindState("FireHands");
if (firehandslower != NULL && firehands != NULL && firehands < firehandslower) FState *state = psp->GetState();
psp->SetState(psp->GetState() + (firehandslower - firehands));
if (state != nullptr && firehandslower != nullptr && firehands != nullptr && firehands < firehandslower)
{
self->player->playerstate = PST_DEAD;
psp->SetState(state + (firehandslower - firehands));
}
else if (state == nullptr)
{
psp->SetState(nullptr);
}
} }
return 0; return 0;
} }
@ -397,13 +405,20 @@ DEFINE_ACTION_FUNCTION(AActor, A_HandLower)
if (self->player != nullptr) if (self->player != nullptr)
{ {
DPSprite *psp = self->player->GetPSprite(PSP_STRIFEHANDS); DPSprite *psp = self->player->GetPSprite(PSP_STRIFEHANDS);
if (psp->GetState() == nullptr)
{
psp->SetState(nullptr);
return 0;
}
psp->y += 9; psp->y += 9;
if (psp->y > WEAPONBOTTOM*2) if (psp->y > WEAPONBOTTOM*2)
{ {
psp->SetState(nullptr); psp->SetState(nullptr);
} }
if (self->player->extralight > 0) self->player->extralight--; if (self->player->extralight > 0) self->player->extralight--;
} }
return 0; return 0;
} }

View file

@ -231,6 +231,9 @@ DPSprite *player_t::GetPSprite(PSPLayers layer)
} }
if (layer == PSP_STRIFEHANDS) if (layer == PSP_STRIFEHANDS)
{ {
// Some of the old hacks rely on this layer coming from the FireHands state.
// This is the ONLY time a psprite's state is actually null.
pspr->State = nullptr;
pspr->y = WEAPONTOP; pspr->y = WEAPONTOP;
} }