Port various old item hooks from custom v1 builds
This commit is contained in:
parent
4986bde9ab
commit
a2e2759c0a
4 changed files with 629 additions and 491 deletions
995
src/k_kart.c
995
src/k_kart.c
File diff suppressed because it is too large
Load diff
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
Loading…
Reference in a new issue