mirror of
https://github.com/ZDoom/gzdoom-gles.git
synced 2024-12-01 08:31:14 +00:00
- Fixed: Godmode didn't stop ALLOW/CAUSE/FORCEPAIN because the code execution always ended prematurely.
- Optimized checks for fake pain and forced pain. Fake pain now calls a subfunction so the code is cleaner.
This commit is contained in:
parent
601852d224
commit
7e579a0a2a
1 changed files with 40 additions and 29 deletions
|
@ -925,6 +925,11 @@ static inline bool MustForcePain(AActor *target, AActor *inflictor)
|
||||||
(inflictor->flags6 & MF6_FORCEPAIN) && !(inflictor->flags5 & MF5_PAINLESS));
|
(inflictor->flags6 & MF6_FORCEPAIN) && !(inflictor->flags5 & MF5_PAINLESS));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline bool isFakePain(AActor *target, AActor *inflictor)
|
||||||
|
{
|
||||||
|
return ((target->flags7 & MF7_ALLOWPAIN) || ((inflictor != NULL) && (inflictor->flags7 & MF7_CAUSEPAIN)));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// Returns the amount of damage actually inflicted upon the target, or -1 if
|
// Returns the amount of damage actually inflicted upon the target, or -1 if
|
||||||
// the damage was cancelled.
|
// the damage was cancelled.
|
||||||
|
@ -940,6 +945,8 @@ int P_DamageMobj (AActor *target, AActor *inflictor, AActor *source, int damage,
|
||||||
bool justhit = false;
|
bool justhit = false;
|
||||||
bool plrDontThrust = false;
|
bool plrDontThrust = false;
|
||||||
bool invulpain = false;
|
bool invulpain = false;
|
||||||
|
bool fakedPain = false;
|
||||||
|
bool forcedPain = false;
|
||||||
int fakeDamage = 0;
|
int fakeDamage = 0;
|
||||||
int holdDamage = 0;
|
int holdDamage = 0;
|
||||||
|
|
||||||
|
@ -948,6 +955,10 @@ int P_DamageMobj (AActor *target, AActor *inflictor, AActor *source, int damage,
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//Rather than unnecessarily call the function over and over again, let's be a little more efficient.
|
||||||
|
fakedPain = (isFakePain(target, inflictor));
|
||||||
|
forcedPain = (MustForcePain(target, inflictor));
|
||||||
|
|
||||||
// Spectral targets only take damage from spectral projectiles.
|
// Spectral targets only take damage from spectral projectiles.
|
||||||
if (target->flags4 & MF4_SPECTRAL && damage < TELEFRAG_DAMAGE)
|
if (target->flags4 & MF4_SPECTRAL && damage < TELEFRAG_DAMAGE)
|
||||||
{
|
{
|
||||||
|
@ -976,7 +987,7 @@ int P_DamageMobj (AActor *target, AActor *inflictor, AActor *source, int damage,
|
||||||
{
|
{
|
||||||
if (inflictor == NULL || (!(inflictor->flags3 & MF3_FOILINVUL) && !(flags & DMG_FOILINVUL)))
|
if (inflictor == NULL || (!(inflictor->flags3 & MF3_FOILINVUL) && !(flags & DMG_FOILINVUL)))
|
||||||
{
|
{
|
||||||
if ((target->flags7 & MF7_ALLOWPAIN) || ((inflictor != NULL) && (inflictor->flags7 & MF7_CAUSEPAIN)))
|
if (fakedPain)
|
||||||
{
|
{
|
||||||
invulpain = true; //This returns -1 later.
|
invulpain = true; //This returns -1 later.
|
||||||
fakeDamage = damage;
|
fakeDamage = damage;
|
||||||
|
@ -991,7 +1002,7 @@ int P_DamageMobj (AActor *target, AActor *inflictor, AActor *source, int damage,
|
||||||
// Players are optionally excluded from getting thrust by damage.
|
// Players are optionally excluded from getting thrust by damage.
|
||||||
if (static_cast<APlayerPawn *>(target)->PlayerFlags & PPF_NOTHRUSTWHENINVUL)
|
if (static_cast<APlayerPawn *>(target)->PlayerFlags & PPF_NOTHRUSTWHENINVUL)
|
||||||
{
|
{
|
||||||
if ((target->flags7 & MF7_ALLOWPAIN) || ((inflictor != NULL) && (inflictor->flags7 & MF7_CAUSEPAIN)))
|
if (fakedPain)
|
||||||
plrDontThrust = 1;
|
plrDontThrust = 1;
|
||||||
else
|
else
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -999,7 +1010,7 @@ int P_DamageMobj (AActor *target, AActor *inflictor, AActor *source, int damage,
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
if (((target->flags7 & MF7_ALLOWPAIN) || ((inflictor != NULL) && (inflictor->flags7 & MF7_CAUSEPAIN))) && (damage < TELEFRAG_DAMAGE))
|
if ((fakedPain) && (damage < TELEFRAG_DAMAGE))
|
||||||
{
|
{
|
||||||
//Intentionally do not jump to fakepain because the damage hasn't been dished out yet.
|
//Intentionally do not jump to fakepain because the damage hasn't been dished out yet.
|
||||||
//Once it's dished out, THEN we can disregard damage factors affecting pain chances.
|
//Once it's dished out, THEN we can disregard damage factors affecting pain chances.
|
||||||
|
@ -1057,9 +1068,9 @@ int P_DamageMobj (AActor *target, AActor *inflictor, AActor *source, int damage,
|
||||||
if (damage > 0)
|
if (damage > 0)
|
||||||
damage = inflictor->DoSpecialDamage (target, damage, mod);
|
damage = inflictor->DoSpecialDamage (target, damage, mod);
|
||||||
|
|
||||||
if (damage == -1)
|
if ((damage == -1) && (target->player == NULL)) //This isn't meant for the player.
|
||||||
{
|
{
|
||||||
if ((target->flags7 & MF7_ALLOWPAIN) || (inflictor->flags7 & MF7_CAUSEPAIN)) //Hold off ending the function before we can deal the pain chances.
|
if (fakedPain) //Hold off ending the function before we can deal the pain chances.
|
||||||
goto fakepain;
|
goto fakepain;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -1069,12 +1080,13 @@ int P_DamageMobj (AActor *target, AActor *inflictor, AActor *source, int damage,
|
||||||
{
|
{
|
||||||
int olddam = damage;
|
int olddam = damage;
|
||||||
source->Inventory->ModifyDamage(olddam, mod, damage, false);
|
source->Inventory->ModifyDamage(olddam, mod, damage, false);
|
||||||
if (olddam != damage && damage <= 0)
|
if (((source->flags7 & MF7_CAUSEPAIN) && (fakeDamage <= 0)) || (olddam != damage && damage <= 0))
|
||||||
{ // Still allow FORCEPAIN
|
{ // Still allow FORCEPAIN
|
||||||
if (MustForcePain(target, inflictor))
|
if (forcedPain)
|
||||||
{
|
|
||||||
goto dopain;
|
goto dopain;
|
||||||
}
|
else if (fakedPain)
|
||||||
|
goto fakepain;
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1083,13 +1095,11 @@ int P_DamageMobj (AActor *target, AActor *inflictor, AActor *source, int damage,
|
||||||
{
|
{
|
||||||
int olddam = damage;
|
int olddam = damage;
|
||||||
target->Inventory->ModifyDamage(olddam, mod, damage, true);
|
target->Inventory->ModifyDamage(olddam, mod, damage, true);
|
||||||
if (((target->flags7 & MF7_ALLOWPAIN) && (fakeDamage <= 0)) || (olddam != damage && damage <= 0))
|
if ((olddam != damage && damage <= 0) && target->player == NULL)
|
||||||
{ // Still allow FORCEPAIN and make sure we're still passing along fake damage to hit enemies for their pain states.
|
{ // Still allow FORCEPAIN and make sure we're still passing along fake damage to hit enemies for their pain states.
|
||||||
if (MustForcePain(target, inflictor))
|
if (forcedPain)
|
||||||
{
|
|
||||||
goto dopain;
|
goto dopain;
|
||||||
}
|
else if (fakedPain)
|
||||||
else if ((target->flags7 & MF7_ALLOWPAIN) || ((inflictor != NULL) && (inflictor->flags7 & MF7_CAUSEPAIN)))
|
|
||||||
goto fakepain;
|
goto fakepain;
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -1103,13 +1113,11 @@ int P_DamageMobj (AActor *target, AActor *inflictor, AActor *source, int damage,
|
||||||
{
|
{
|
||||||
damage = DamageTypeDefinition::ApplyMobjDamageFactor(damage, mod, target->GetClass()->ActorInfo->DamageFactors);
|
damage = DamageTypeDefinition::ApplyMobjDamageFactor(damage, mod, target->GetClass()->ActorInfo->DamageFactors);
|
||||||
}
|
}
|
||||||
if (damage <= 0)
|
if (damage <= 0 && target->player == NULL)
|
||||||
{ // Still allow FORCEPAIN
|
{ // Still allow FORCEPAIN
|
||||||
if (MustForcePain(target, inflictor))
|
if (forcedPain)
|
||||||
{
|
|
||||||
goto dopain;
|
goto dopain;
|
||||||
}
|
else if (fakedPain)
|
||||||
else if ((target->flags7 & MF7_ALLOWPAIN) || ((inflictor != NULL) && (inflictor->flags7 & MF7_CAUSEPAIN)))
|
|
||||||
goto fakepain;
|
goto fakepain;
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -1118,9 +1126,9 @@ int P_DamageMobj (AActor *target, AActor *inflictor, AActor *source, int damage,
|
||||||
if (damage > 0)
|
if (damage > 0)
|
||||||
damage = target->TakeSpecialDamage (inflictor, source, damage, mod);
|
damage = target->TakeSpecialDamage (inflictor, source, damage, mod);
|
||||||
}
|
}
|
||||||
if (damage == -1)
|
if (damage == -1 && target->player == NULL) //Make sure it's not a player, the pain has yet to be processed with cheats.
|
||||||
{
|
{
|
||||||
if ((target->flags7 & MF7_ALLOWPAIN) || ((inflictor != NULL) && (inflictor->flags7 & MF7_CAUSEPAIN)))
|
if (fakedPain)
|
||||||
goto fakepain;
|
goto fakepain;
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -1247,16 +1255,17 @@ int P_DamageMobj (AActor *target, AActor *inflictor, AActor *source, int damage,
|
||||||
(player->cheats & CF_GODMODE2) || (player->mo->flags5 & MF5_NODAMAGE))
|
(player->cheats & CF_GODMODE2) || (player->mo->flags5 & MF5_NODAMAGE))
|
||||||
//Absolutely no hurting if NODAMAGE is involved. Same for GODMODE2.
|
//Absolutely no hurting if NODAMAGE is involved. Same for GODMODE2.
|
||||||
{ // player is invulnerable, so don't hurt him
|
{ // player is invulnerable, so don't hurt him
|
||||||
|
|
||||||
if (((!(player->cheats & CF_GODMODE)) && (!(player->cheats & CF_GODMODE2)) && (!(player->mo->flags5 & MF5_NOPAIN))) &&
|
|
||||||
(((player->mo->flags7 & MF7_ALLOWPAIN) || (player->mo->flags5 & MF5_NODAMAGE)) || ((inflictor != NULL) && (inflictor->flags7 & MF7_CAUSEPAIN))))
|
|
||||||
//Make sure no godmodes and NOPAIN flags are found first.
|
//Make sure no godmodes and NOPAIN flags are found first.
|
||||||
//Then, check to see if the player has NODAMAGE or ALLOWPAIN, or inflictor has CAUSEPAIN.
|
//Then, check to see if the player has NODAMAGE or ALLOWPAIN, or inflictor has CAUSEPAIN.
|
||||||
|
if ((player->cheats & CF_GODMODE) || (player->cheats & CF_GODMODE2) || (player->mo->flags5 & MF5_NOPAIN))
|
||||||
|
return -1;
|
||||||
|
else if ((((player->mo->flags7 & MF7_ALLOWPAIN) || (player->mo->flags5 & MF5_NODAMAGE)) || ((inflictor != NULL) && (inflictor->flags7 & MF7_CAUSEPAIN))))
|
||||||
{
|
{
|
||||||
invulpain = true;
|
invulpain = true;
|
||||||
fakeDamage = damage;
|
fakeDamage = damage;
|
||||||
goto fakepain;
|
goto fakepain;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1306,6 +1315,7 @@ int P_DamageMobj (AActor *target, AActor *inflictor, AActor *source, int damage,
|
||||||
// telefrag him right? ;) (Unfortunately the damage is "absorbed" by armor,
|
// telefrag him right? ;) (Unfortunately the damage is "absorbed" by armor,
|
||||||
// but telefragging should still do enough damage to kill the player)
|
// but telefragging should still do enough damage to kill the player)
|
||||||
// Ignore players that are already dead.
|
// Ignore players that are already dead.
|
||||||
|
// [MC]Buddha2 absorbs telefrag damage, and anything else thrown their way.
|
||||||
if ((player->cheats & CF_BUDDHA2) || (((player->cheats & CF_BUDDHA) || (player->mo->flags7 & MF7_BUDDHA)) && (damage < TELEFRAG_DAMAGE)) && (player->playerstate != PST_DEAD))
|
if ((player->cheats & CF_BUDDHA2) || (((player->cheats & CF_BUDDHA) || (player->mo->flags7 & MF7_BUDDHA)) && (damage < TELEFRAG_DAMAGE)) && (player->playerstate != PST_DEAD))
|
||||||
{
|
{
|
||||||
// If this is a voodoo doll we need to handle the real player as well.
|
// If this is a voodoo doll we need to handle the real player as well.
|
||||||
|
@ -1339,7 +1349,7 @@ int P_DamageMobj (AActor *target, AActor *inflictor, AActor *source, int damage,
|
||||||
damage = newdam;
|
damage = newdam;
|
||||||
if (damage <= 0)
|
if (damage <= 0)
|
||||||
{
|
{
|
||||||
if ((target->flags7 & MF7_ALLOWPAIN) || ((inflictor != NULL) && (inflictor->flags7 & MF7_CAUSEPAIN)))
|
if (fakedPain)
|
||||||
goto fakepain;
|
goto fakepain;
|
||||||
else
|
else
|
||||||
return damage;
|
return damage;
|
||||||
|
@ -1370,6 +1380,7 @@ int P_DamageMobj (AActor *target, AActor *inflictor, AActor *source, int damage,
|
||||||
|
|
||||||
if (target->health <= 0)
|
if (target->health <= 0)
|
||||||
{
|
{
|
||||||
|
//[MC]Buddha flag for monsters.
|
||||||
if ((target->flags7 & MF7_BUDDHA) && (damage < TELEFRAG_DAMAGE) && ((inflictor == NULL || !(inflictor->flags3 & MF7_FOILBUDDHA)) && !(flags & DMG_FOILBUDDHA)))
|
if ((target->flags7 & MF7_BUDDHA) && (damage < TELEFRAG_DAMAGE) && ((inflictor == NULL || !(inflictor->flags3 & MF7_FOILBUDDHA)) && !(flags & DMG_FOILBUDDHA)))
|
||||||
{ //FOILBUDDHA or Telefrag damage must kill it.
|
{ //FOILBUDDHA or Telefrag damage must kill it.
|
||||||
target->health = 1;
|
target->health = 1;
|
||||||
|
@ -1434,7 +1445,7 @@ fakepain: //Needed so we can skip the rest of the above, but still obey the orig
|
||||||
//CAUSEPAIN can always attempt to trigger the chances of pain.
|
//CAUSEPAIN can always attempt to trigger the chances of pain.
|
||||||
//ALLOWPAIN can do the same, only if the (unfiltered aka fake) damage is greater than 0.
|
//ALLOWPAIN can do the same, only if the (unfiltered aka fake) damage is greater than 0.
|
||||||
if ((((target->flags7 & MF7_ALLOWPAIN) && (fakeDamage > 0))
|
if ((((target->flags7 & MF7_ALLOWPAIN) && (fakeDamage > 0))
|
||||||
|| ((inflictor != NULL) && (inflictor->flags7 & MF7_CAUSEPAIN))) && (fakeDamage != damage))
|
|| ((inflictor != NULL) && (inflictor->flags7 & MF7_CAUSEPAIN))))
|
||||||
{
|
{
|
||||||
holdDamage = damage; //Store the modified damage away after factors are taken into account.
|
holdDamage = damage; //Store the modified damage away after factors are taken into account.
|
||||||
damage = fakeDamage; //Retrieve the original damage.
|
damage = fakeDamage; //Retrieve the original damage.
|
||||||
|
@ -1535,7 +1546,7 @@ dopain:
|
||||||
{
|
{
|
||||||
return -1; //NOW we return -1!
|
return -1; //NOW we return -1!
|
||||||
}
|
}
|
||||||
else if ((target->flags7 & MF7_ALLOWPAIN) || ((inflictor != NULL) && (inflictor->flags7 & MF7_CAUSEPAIN)))
|
else if (fakedPain)
|
||||||
{
|
{
|
||||||
return holdDamage; //This is the calculated damage after all is said and done.
|
return holdDamage; //This is the calculated damage after all is said and done.
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue