Possible fix for lack of mobjdamage and shoulddamage lua functionalities on players.

This commit is contained in:
Latapostrophe 2018-11-26 21:23:41 +01:00
parent 2b91e42410
commit 0175e5b6a5
7 changed files with 80 additions and 26 deletions

View file

@ -21,6 +21,7 @@
#include "k_kart.h" #include "k_kart.h"
#include "f_finale.h" #include "f_finale.h"
#include "lua_hud.h" // For Lua hud checks #include "lua_hud.h" // For Lua hud checks
#include "lua_hook.h" // For MobjDamage and ShouldDamage
// SOME IMPORTANT VARIABLES DEFINED IN DOOMDEF.H: // SOME IMPORTANT VARIABLES DEFINED IN DOOMDEF.H:
// gamespeed is cc (0 for easy, 1 for normal, 2 for hard) // gamespeed is cc (0 for easy, 1 for normal, 2 for hard)
@ -1842,8 +1843,24 @@ void K_SpawnBattlePoints(player_t *source, player_t *victim, UINT8 amount)
pt->color = source->skincolor; pt->color = source->skincolor;
} }
void K_SpinPlayer(player_t *player, mobj_t *source, INT32 type, boolean trapitem) void K_SpinPlayer(player_t *player, mobj_t *source, INT32 type, boolean trapitem, mobj_t *inflictor)
{ {
// PS: Inflictor is unused for all purposes here and is actually only ever relevant to Lua. It may be nil too.
#ifdef HAVE_BLUA
boolean force = false; // Used to check if Lua ShouldDamage should get us damaged reguardless of flashtics or heck knows what.
UINT8 shouldForce = LUAh_ShouldDamage(player->mo, inflictor, source, 1);
if (P_MobjWasRemoved(player->mo))
return; // mobj was removed (in theory that shouldn't happen)
if (shouldForce == 1)
force = true;
else if (shouldForce == 2)
return;
#else
static const boolean force = false;
#endif
UINT8 scoremultiply = 1; UINT8 scoremultiply = 1;
if (!trapitem && G_BattleGametype()) if (!trapitem && G_BattleGametype())
{ {
@ -1860,10 +1877,16 @@ void K_SpinPlayer(player_t *player, mobj_t *source, INT32 type, boolean trapitem
|| player->kartstuff[k_invincibilitytimer] > 0 || player->kartstuff[k_growshrinktimer] > 0 || player->kartstuff[k_hyudorotimer] > 0 || player->kartstuff[k_invincibilitytimer] > 0 || player->kartstuff[k_growshrinktimer] > 0 || player->kartstuff[k_hyudorotimer] > 0
|| (G_BattleGametype() && ((player->kartstuff[k_bumper] <= 0 && player->kartstuff[k_comebacktimer]) || player->kartstuff[k_comebackmode] == 1))) || (G_BattleGametype() && ((player->kartstuff[k_bumper] <= 0 && player->kartstuff[k_comebacktimer]) || player->kartstuff[k_comebackmode] == 1)))
{ {
K_DoInstashield(player); if (!force) // if shoulddamage force, we go THROUGH that.
return; {
K_DoInstashield(player);
return;
}
} }
if (LUAh_MobjDamage(player->mo, inflictor, source, 1))
return;
if (source && source != player->mo && source->player) if (source && source != player->mo && source->player)
K_PlayHitEmSound(source); K_PlayHitEmSound(source);
@ -2029,6 +2052,20 @@ void K_SquishPlayer(player_t *player, mobj_t *source)
void K_ExplodePlayer(player_t *player, mobj_t *source, mobj_t *inflictor) // A bit of a hack, we just throw the player up higher here and extend their spinout timer void K_ExplodePlayer(player_t *player, mobj_t *source, mobj_t *inflictor) // A bit of a hack, we just throw the player up higher here and extend their spinout timer
{ {
#ifdef HAVE_BLUA
boolean force = false; // Used to check if Lua ShouldDamage should get us damaged reguardless of flashtics or heck knows what.
UINT8 shouldForce = LUAh_ShouldDamage(player->mo, inflictor, source, 1);
if (P_MobjWasRemoved(player->mo))
return; // mobj was removed (in theory that shouldn't happen)
if (shouldForce == 1)
force = true;
else if (shouldForce == 2)
return;
#else
static const boolean force = false;
#endif
UINT8 scoremultiply = 1; UINT8 scoremultiply = 1;
if (G_BattleGametype()) if (G_BattleGametype())
{ {
@ -2045,10 +2082,16 @@ void K_ExplodePlayer(player_t *player, mobj_t *source, mobj_t *inflictor) // A b
||*/player->kartstuff[k_invincibilitytimer] > 0 || player->kartstuff[k_growshrinktimer] > 0 || player->kartstuff[k_hyudorotimer] > 0 ||*/player->kartstuff[k_invincibilitytimer] > 0 || player->kartstuff[k_growshrinktimer] > 0 || player->kartstuff[k_hyudorotimer] > 0
|| (G_BattleGametype() && ((player->kartstuff[k_bumper] <= 0 && player->kartstuff[k_comebacktimer]) || player->kartstuff[k_comebackmode] == 1))) || (G_BattleGametype() && ((player->kartstuff[k_bumper] <= 0 && player->kartstuff[k_comebacktimer]) || player->kartstuff[k_comebackmode] == 1)))
{ {
K_DoInstashield(player); if (!force) // ShouldDamage can bypass that, again.
return; {
K_DoInstashield(player);
return;
}
} }
if (LUAh_MobjDamage(player->mo, inflictor, source, 1))
return;
if (source && source != player->mo && source->player) if (source && source != player->mo && source->player)
K_PlayHitEmSound(source); K_PlayHitEmSound(source);
@ -3181,7 +3224,7 @@ static void K_DoShrink(player_t *user)
// Wipeout // Wipeout
K_DropItems(&players[i]); K_DropItems(&players[i]);
K_SpinPlayer(&players[i], user->mo, 1, false); K_SpinPlayer(&players[i], user->mo, 1, false, NULL);
// P_RingDamage // P_RingDamage
P_DoPlayerPain(&players[i], user->mo, user->mo); P_DoPlayerPain(&players[i], user->mo, user->mo);

View file

@ -28,7 +28,7 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd);
void K_KartPlayerAfterThink(player_t *player); void K_KartPlayerAfterThink(player_t *player);
void K_DoInstashield(player_t *player); void K_DoInstashield(player_t *player);
void K_SpawnBattlePoints(player_t *source, player_t *victim, UINT8 amount); void K_SpawnBattlePoints(player_t *source, player_t *victim, UINT8 amount);
void K_SpinPlayer(player_t *player, mobj_t *source, INT32 type, boolean trapitem); void K_SpinPlayer(player_t *player, mobj_t *source, INT32 type, boolean trapitem, mobj_t *inflictor);
void K_SquishPlayer(player_t *player, mobj_t *source); void K_SquishPlayer(player_t *player, mobj_t *source);
void K_ExplodePlayer(player_t *player, mobj_t *source, mobj_t *inflictor); void K_ExplodePlayer(player_t *player, mobj_t *source, mobj_t *inflictor);
void K_StealBumper(player_t *player, player_t *victim, boolean force); void K_StealBumper(player_t *player, player_t *victim, boolean force);

View file

@ -2191,12 +2191,15 @@ static int lib_kSpinPlayer(lua_State *L)
mobj_t *source = NULL; mobj_t *source = NULL;
INT32 type = (INT32)luaL_optinteger(L, 3, 0); INT32 type = (INT32)luaL_optinteger(L, 3, 0);
boolean trapitem = lua_optboolean(L, 4); boolean trapitem = lua_optboolean(L, 4);
mobj_t *inflictor = NULL;
NOHUD NOHUD
if (!player) if (!player)
return LUA_ErrInvalid(L, "player_t"); return LUA_ErrInvalid(L, "player_t");
if (!lua_isnone(L, 2) && lua_isuserdata(L, 2)) if (!lua_isnone(L, 2) && lua_isuserdata(L, 2))
source = *((mobj_t **)luaL_checkudata(L, 2, META_MOBJ)); source = *((mobj_t **)luaL_checkudata(L, 2, META_MOBJ));
K_SpinPlayer(player, source, type, trapitem); if (!lua_isnone(L, 5) && lua_isuserdata(L, 5))
inflictor = *((mobj_t **)luaL_checkudata(L, 5, META_MOBJ));
K_SpinPlayer(player, source, type, trapitem, inflictor);
return 0; return 0;
} }

View file

@ -590,7 +590,7 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
P_RemoveMobj(special); P_RemoveMobj(special);
} }
else else
K_SpinPlayer(player, special, 0, false); K_SpinPlayer(player, special, 0, false, NULL);
return; return;
/*case MT_EERIEFOG: /*case MT_EERIEFOG:
special->frame &= ~FF_TRANS80; special->frame &= ~FF_TRANS80;
@ -3243,6 +3243,11 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da
return true; return true;
} }
#ifdef HAVE_BLUA // Add this back here for ACTUAL NORMAL DAMAGE. The funny shit is that the player is barely ever "actually" damaged.
if (LUAh_MobjDamage(target, inflictor, source, damage))
return true;
#endif
if (!force && inflictor && (inflictor->flags & MF_FIRE)) if (!force && inflictor && (inflictor->flags & MF_FIRE))
{ {
if ((player->powers[pw_shield] & SH_NOSTACK) == SH_ELEMENTAL) if ((player->powers[pw_shield] & SH_NOSTACK) == SH_ELEMENTAL)
@ -3275,8 +3280,11 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da
P_KillPlayer(player, source, damage); P_KillPlayer(player, source, damage);
else if (player->kartstuff[k_invincibilitytimer] > 0 || player->kartstuff[k_growshrinktimer] > 0 || player->powers[pw_flashing]) else if (player->kartstuff[k_invincibilitytimer] > 0 || player->kartstuff[k_growshrinktimer] > 0 || player->powers[pw_flashing])
{ {
K_DoInstashield(player); if (!force) // shoulddamage bypasses all of that.
return false; {
K_DoInstashield(player);
return false;
}
} }
else else
{ {
@ -3285,7 +3293,7 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da
|| inflictor->type == MT_SMK_THWOMP || inflictor->player)) || inflictor->type == MT_SMK_THWOMP || inflictor->player))
{ {
player->kartstuff[k_sneakertimer] = 0; player->kartstuff[k_sneakertimer] = 0;
K_SpinPlayer(player, source, 1, false); K_SpinPlayer(player, source, 1, false, inflictor);
damage = player->mo->health - 1; damage = player->mo->health - 1;
P_RingDamage(player, inflictor, source, damage); P_RingDamage(player, inflictor, source, damage);
P_PlayerRingBurst(player, 5); P_PlayerRingBurst(player, 5);
@ -3297,7 +3305,7 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da
} }
else else
{ {
K_SpinPlayer(player, source, 0, false); K_SpinPlayer(player, source, 0, false, inflictor);
} }
return true; return true;
} }

View file

@ -882,7 +882,7 @@ static boolean PIT_CheckThing(mobj_t *thing)
if (tmthing->state == &states[S_MINEEXPLOSION1]) if (tmthing->state == &states[S_MINEEXPLOSION1])
K_ExplodePlayer(thing->player, tmthing->target, tmthing); K_ExplodePlayer(thing->player, tmthing->target, tmthing);
else else
K_SpinPlayer(thing->player, tmthing->target, 0, false); K_SpinPlayer(thing->player, tmthing->target, 0, false, tmthing);
} }
return true; // This doesn't collide with anything, but we want it to effect the player anyway. return true; // This doesn't collide with anything, but we want it to effect the player anyway.
@ -915,7 +915,7 @@ static boolean PIT_CheckThing(mobj_t *thing)
if (thing->type == MT_PLAYER) if (thing->type == MT_PLAYER)
{ {
// Player Damage // Player Damage
K_SpinPlayer(thing->player, tmthing->target, 0, (tmthing->type == MT_BANANA || tmthing->type == MT_BANANA_SHIELD)); K_SpinPlayer(thing->player, tmthing->target, 0, (tmthing->type == MT_BANANA || tmthing->type == MT_BANANA_SHIELD), tmthing);
// This Item Damage // This Item Damage
if (tmthing->eflags & MFE_VERTICALFLIP) if (tmthing->eflags & MFE_VERTICALFLIP)
@ -1061,7 +1061,7 @@ static boolean PIT_CheckThing(mobj_t *thing)
return true; return true;
// Player Damage // Player Damage
K_SpinPlayer(tmthing->player, thing->target, 0, (thing->type == MT_BANANA || thing->type == MT_BANANA_SHIELD)); K_SpinPlayer(tmthing->player, thing->target, 0, (thing->type == MT_BANANA || thing->type == MT_BANANA_SHIELD), tmthing);
// Other Item Damage // Other Item Damage
if (thing->eflags & MFE_VERTICALFLIP) if (thing->eflags & MFE_VERTICALFLIP)
@ -1091,7 +1091,7 @@ static boolean PIT_CheckThing(mobj_t *thing)
if (thing->state == &states[S_MINEEXPLOSION1]) if (thing->state == &states[S_MINEEXPLOSION1])
K_ExplodePlayer(tmthing->player, thing->target, thing); K_ExplodePlayer(tmthing->player, thing->target, thing);
else else
K_SpinPlayer(tmthing->player, thing->target, 0, false); K_SpinPlayer(tmthing->player, thing->target, 0, false, tmthing);
return true; return true;
} }
@ -1423,7 +1423,7 @@ static boolean PIT_CheckThing(mobj_t *thing)
// Make sure they aren't able to damage you ANYWHERE along the Z axis, you have to be TOUCHING the person. // Make sure they aren't able to damage you ANYWHERE along the Z axis, you have to be TOUCHING the person.
&& !(thing->z + thing->height < tmthing->z || thing->z > tmthing->z + tmthing->height)) && !(thing->z + thing->height < tmthing->z || thing->z > tmthing->z + tmthing->height))
{ {
if (tmthing->scale > thing->scale + (mapheaderinfo[gamemap-1]->mobj_scale/8)) // SRB2kart - Handle squishes first! if (tmthing->scale > thing->scale + (mapheaderinfo[gamemap-1]->mobj_scale/8)) // SRB2kart - Handle squishes first!
K_SquishPlayer(thing->player, tmthing); K_SquishPlayer(thing->player, tmthing);
else if (thing->scale > tmthing->scale + (mapheaderinfo[gamemap-1]->mobj_scale/8)) else if (thing->scale > tmthing->scale + (mapheaderinfo[gamemap-1]->mobj_scale/8))
@ -1543,7 +1543,7 @@ static boolean PIT_CheckThing(mobj_t *thing)
if (G_BattleGametype() && tmthing->player->kartstuff[k_pogospring]) if (G_BattleGametype() && tmthing->player->kartstuff[k_pogospring])
{ {
K_StealBumper(tmthing->player, thing->player, false); K_StealBumper(tmthing->player, thing->player, false);
K_SpinPlayer(thing->player, tmthing, 0, false); K_SpinPlayer(thing->player, tmthing, 0, false, tmthing);
} }
} }
else if (P_IsObjectOnGround(tmthing) && thing->momz < 0) else if (P_IsObjectOnGround(tmthing) && thing->momz < 0)
@ -1552,7 +1552,7 @@ static boolean PIT_CheckThing(mobj_t *thing)
if (G_BattleGametype() && thing->player->kartstuff[k_pogospring]) if (G_BattleGametype() && thing->player->kartstuff[k_pogospring])
{ {
K_StealBumper(thing->player, tmthing->player, false); K_StealBumper(thing->player, tmthing->player, false);
K_SpinPlayer(tmthing->player, thing, 0, false); K_SpinPlayer(tmthing->player, thing, 0, false, thing);
} }
} }
else else
@ -1563,12 +1563,12 @@ static boolean PIT_CheckThing(mobj_t *thing)
if (thing->player->kartstuff[k_sneakertimer] && !(tmthing->player->kartstuff[k_sneakertimer])) if (thing->player->kartstuff[k_sneakertimer] && !(tmthing->player->kartstuff[k_sneakertimer]))
{ {
K_StealBumper(thing->player, tmthing->player, false); K_StealBumper(thing->player, tmthing->player, false);
K_SpinPlayer(tmthing->player, thing, 0, false); K_SpinPlayer(tmthing->player, thing, 0, false, tmthing);
} }
else if (tmthing->player->kartstuff[k_sneakertimer] && !(thing->player->kartstuff[k_sneakertimer])) else if (tmthing->player->kartstuff[k_sneakertimer] && !(thing->player->kartstuff[k_sneakertimer]))
{ {
K_StealBumper(tmthing->player, thing->player, false); K_StealBumper(tmthing->player, thing->player, false);
K_SpinPlayer(thing->player, tmthing, 0, false); K_SpinPlayer(thing->player, tmthing, 0, false, thing);
} }
} }

View file

@ -4033,7 +4033,7 @@ DoneSection2:
case 7: // SRB2kart 190117 - Oil Slick (deprecated) case 7: // SRB2kart 190117 - Oil Slick (deprecated)
if (roversector || P_MobjReadyToTrigger(player->mo, sector)) if (roversector || P_MobjReadyToTrigger(player->mo, sector))
{ {
K_SpinPlayer(player, NULL, 0, false); K_SpinPlayer(player, NULL, 0, false, NULL);
} }
break; break;

View file

@ -7764,7 +7764,7 @@ void P_NukeEnemies(mobj_t *inflictor, mobj_t *source, fixed_t radius)
continue; continue;
if (mo->type == MT_PLAYER) // Players wipe out in Kart if (mo->type == MT_PLAYER) // Players wipe out in Kart
K_SpinPlayer(mo->player, source, 0, false); K_SpinPlayer(mo->player, source, 0, false, inflictor);
//} //}
else else
P_DamageMobj(mo, inflictor, source, 1000); P_DamageMobj(mo, inflictor, source, 1000);