Port various old item hooks from custom v1 builds

This commit is contained in:
NepDisk 2025-11-07 21:24:04 -05:00
parent 4986bde9ab
commit a2e2759c0a
4 changed files with 629 additions and 491 deletions

File diff suppressed because it is too large Load diff

View file

@ -40,6 +40,7 @@ automatically.
X (MobjFuse),/* when mobj->fuse runs out */\
X (MobjThinker),/* P_MobjThinker, P_SceneryThinker */\
X (BossThinker),/* P_GenericBossThinker */\
X (MobjScaleChange),/*SRB2KART*/\
X (ShouldDamage),/* P_DamageMobj (Should mobj take damage?) */\
X (ShouldSpin),/* P_DamageMobj (Should mobj take spinout damage?) */\
X (ShouldExplode),/* P_DamageMobj (Should mobj take explosion damage?) */\
@ -86,6 +87,9 @@ automatically.
X (BotJoin),\
X (GPRankPoints),/* K_CalculateGPRankPoints */\
X (AddonLoaded),\
X (PlayerItem),/*SRB2KART*/\
X (KartHyudoro),/*SRB2KART*/\
X (KartSneaker),/*SRB2KART*/\
#define STRING_HOOK_LIST(X) \
X (SpecialExecute),\
@ -171,6 +175,12 @@ int LUA_HookGPRankPoints(UINT8 position, UINT8 numplayers, INT16 *points);
int LUA_HookShouldJingleContinue(player_t *, const char *musname);
int LUA_HookMusicChange(const char *oldname, struct MusicChange *);
// Item shit
boolean LUA_HookPlayerItem(player_t *player, SINT8 itemType, boolean wasHoldingItem, boolean *force);
boolean LUA_HookKartHyudoro(player_t *player, INT32 *target, boolean sink); // SRB2Kart: Hook for K_DoHyudoroSteal and overriding its results.
boolean LUA_HookMobjScaleChange(mobj_t *target, fixed_t newscale, fixed_t oldscale); // SRB2Kart: Hook for P_SetScale.
boolean LUA_HookKartSneaker(player_t *player, int type); // SRB2Kart: Hook for K_DoSneaker.
#ifdef __cplusplus
} // extern "C"
#endif

View file

@ -1260,3 +1260,115 @@ int LUA_HookMusicChange(const char *oldname, struct MusicChange *param)
return hook.status;
}
// Allows to both override default behavior and force action. I don't like it but thats how it works
// in CEP and neptune. Fuckal whyyyyyyyyy
typedef struct {
boolean override;
boolean force;
} TrueForce_State;
static void res_trueforce(Hook_State *hook)
{
TrueForce_State *state = (TrueForce_State*)hook->userdata;
if (lua_isboolean(gL, -2))
state->override = lua_toboolean(gL, -2);
if (lua_isboolean(gL, -1))
state->force = lua_toboolean(gL, -1);
};
boolean LUA_HookPlayerItem(player_t *player, SINT8 itemType, boolean wasHoldingItem, boolean *force)
{
Hook_State hook;
TrueForce_State state = {0};
if (prepare_hook(&hook, 0, HOOK(PlayerItem)))
{
LUA_PushUserdata(gL, player, META_PLAYER);
lua_pushinteger(gL, itemType);
lua_pushboolean(gL, wasHoldingItem);
hook.userdata = &state;
call_hooks(&hook, 2, res_trueforce);
}
*force = state.force;
return state.override;
}
typedef struct {
INT32 *target;
boolean force_sink;
} KartHyudoro_State;
static void res_karthyudoro(Hook_State *hook)
{
KartHyudoro_State *state = (KartHyudoro_State*)hook->userdata;
if (lua_isnumber(gL, -2))
*state->target = lua_tonumber(gL, -2);
else if (lua_isuserdata(gL, -2))
{
player_t *player = *(player_t**)luaL_checkudata(gL, -2, META_PLAYER);
*state->target = player - players;
}
if (lua_isboolean(gL, -1))
state->force_sink = lua_toboolean(gL, -1);
}
boolean LUA_HookKartHyudoro(player_t *player, INT32 *target, boolean sink)
{
Hook_State hook;
KartHyudoro_State state = {0};
state.target = target;
if (prepare_hook(&hook, 0, HOOK(KartHyudoro)))
{
LUA_PushUserdata(gL, player, META_PLAYER);
if (*target >= 0)
LUA_PushUserdata(gL, &players[*target], META_PLAYER);
else
lua_pushnil(gL);
lua_pushboolean(gL, sink);
hook.userdata = &state;
call_hooks(&hook, 2, res_karthyudoro);
}
return state.force_sink;
}
boolean LUA_HookMobjScaleChange(mobj_t *target, fixed_t newscale, fixed_t oldscale)
{
Hook_State hook;
if (prepare_mobj_hook(&hook, false, MOBJ_HOOK(MobjScaleChange), target->type))
{
LUA_PushUserdata(gL, target, META_MOBJ);
lua_pushfixed(gL, newscale);
lua_pushfixed(gL, oldscale);
call_hooks(&hook, 1, res_true);
}
return hook.status;
}
boolean LUA_HookKartSneaker(player_t *player, int type)
{
Hook_State hook;
if (prepare_hook(&hook, false, HOOK(KartSneaker)))
{
LUA_PushUserdata(gL, player, META_PLAYER);
// Type of sneaker: 0 - perfect/panel, 1 - regular sneaker, 2 - rocket sneaker.
lua_pushinteger(gL, type);
call_hooks(&hook, 1, res_true);
}
return hook.status;
}

View file

@ -6194,6 +6194,9 @@ void P_SetScale2(mobj_t *mobj, fixed_t newscale, boolean compat)
oldscale = mobj->scale; //keep for adjusting stuff below
if (LUA_HookMobjScaleChange(mobj, newscale, oldscale) || P_MobjWasRemoved(mobj))
return;
mobj->scale = newscale;
if (compat)