mirror of
https://git.do.srb2.org/STJr/SRB2.git
synced 2024-11-15 01:01:33 +00:00
Automatically count hook values
This commit is contained in:
parent
e24fe29114
commit
a75d4a1c36
1 changed files with 49 additions and 42 deletions
|
@ -259,11 +259,16 @@ static void push_string(void)
|
|||
lua_pushvalue(gL, SINDEX);
|
||||
}
|
||||
|
||||
static boolean start_hook_stack(void)
|
||||
static boolean begin_hook_values(Hook_State *hook)
|
||||
{
|
||||
hook->top = lua_gettop(gL);
|
||||
return true;
|
||||
}
|
||||
|
||||
static void start_hook_stack(void)
|
||||
{
|
||||
lua_settop(gL, 0);
|
||||
push_error_handler();
|
||||
return true;
|
||||
}
|
||||
|
||||
static boolean init_hook_type
|
||||
|
@ -279,10 +284,11 @@ static boolean init_hook_type
|
|||
|
||||
if (nonzero)
|
||||
{
|
||||
start_hook_stack();
|
||||
hook->hook_type = hook_type;
|
||||
hook->mobj_type = mobj_type;
|
||||
hook->string = string;
|
||||
return start_hook_stack();
|
||||
return begin_hook_values(hook);
|
||||
}
|
||||
else
|
||||
return false;
|
||||
|
@ -323,7 +329,7 @@ static boolean prepare_string_hook
|
|||
stringHooks[hook_type].ref))
|
||||
{
|
||||
lua_pushstring(gL, string);
|
||||
return true;
|
||||
return begin_hook_values(hook);
|
||||
}
|
||||
else
|
||||
return false;
|
||||
|
@ -332,12 +338,12 @@ static boolean prepare_string_hook
|
|||
static void init_hook_call
|
||||
(
|
||||
Hook_State * hook,
|
||||
int values,
|
||||
int results,
|
||||
Hook_Callback results_handler
|
||||
){
|
||||
hook->top = lua_gettop(gL);
|
||||
hook->values = values;
|
||||
const int top = lua_gettop(gL);
|
||||
hook->values = (top - hook->top);
|
||||
hook->top = top;
|
||||
hook->results = results;
|
||||
hook->results_handler = results_handler;
|
||||
}
|
||||
|
@ -447,13 +453,12 @@ static int call_mobj_type_hooks(Hook_State *hook, mobjtype_t mobj_type)
|
|||
static int call_hooks
|
||||
(
|
||||
Hook_State * hook,
|
||||
int values,
|
||||
int results,
|
||||
Hook_Callback results_handler
|
||||
){
|
||||
int calls = 0;
|
||||
|
||||
init_hook_call(hook, values, results, results_handler);
|
||||
init_hook_call(hook, results, results_handler);
|
||||
|
||||
if (hook->string)
|
||||
{
|
||||
|
@ -514,7 +519,7 @@ int LUA_HookMobj(mobj_t *mobj, int hook_type)
|
|||
if (prepare_mobj_hook(&hook, false, hook_type, mobj->type))
|
||||
{
|
||||
LUA_PushUserdata(gL, mobj, META_MOBJ);
|
||||
call_hooks(&hook, 1, 1, res_true);
|
||||
call_hooks(&hook, 1, res_true);
|
||||
}
|
||||
return hook.status;
|
||||
}
|
||||
|
@ -526,7 +531,7 @@ int LUA_Hook2Mobj(mobj_t *t1, mobj_t *t2, int hook_type)
|
|||
{
|
||||
LUA_PushUserdata(gL, t1, META_MOBJ);
|
||||
LUA_PushUserdata(gL, t2, META_MOBJ);
|
||||
call_hooks(&hook, 2, 1, res_force);
|
||||
call_hooks(&hook, 1, res_force);
|
||||
}
|
||||
return hook.status;
|
||||
}
|
||||
|
@ -535,7 +540,7 @@ void LUA_HookVoid(int type)
|
|||
{
|
||||
Hook_State hook;
|
||||
if (prepare_hook(&hook, 0, type))
|
||||
call_hooks(&hook, 0, 0, res_none);
|
||||
call_hooks(&hook, 0, res_none);
|
||||
}
|
||||
|
||||
void LUA_HookInt(INT32 number, int hook_type)
|
||||
|
@ -544,7 +549,7 @@ void LUA_HookInt(INT32 number, int hook_type)
|
|||
if (prepare_hook(&hook, 0, hook_type))
|
||||
{
|
||||
lua_pushinteger(gL, number);
|
||||
call_hooks(&hook, 1, 0, res_none);
|
||||
call_hooks(&hook, 0, res_none);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -554,7 +559,7 @@ void LUA_HookBool(boolean value, int hook_type)
|
|||
if (prepare_hook(&hook, 0, hook_type))
|
||||
{
|
||||
lua_pushboolean(gL, value);
|
||||
call_hooks(&hook, 1, 0, res_none);
|
||||
call_hooks(&hook, 0, res_none);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -564,7 +569,7 @@ int LUA_HookPlayer(player_t *player, int hook_type)
|
|||
if (prepare_hook(&hook, false, hook_type))
|
||||
{
|
||||
LUA_PushUserdata(gL, player, META_PLAYER);
|
||||
call_hooks(&hook, 1, 1, res_true);
|
||||
call_hooks(&hook, 1, res_true);
|
||||
}
|
||||
return hook.status;
|
||||
}
|
||||
|
@ -580,7 +585,7 @@ int LUA_HookTiccmd(player_t *player, ticcmd_t *cmd, int hook_type)
|
|||
if (hook_type == HOOK(PlayerCmd))
|
||||
hook_cmd_running = true;
|
||||
|
||||
call_hooks(&hook, 2, 1, res_true);
|
||||
call_hooks(&hook, 1, res_true);
|
||||
|
||||
if (hook_type == HOOK(PlayerCmd))
|
||||
hook_cmd_running = false;
|
||||
|
@ -594,7 +599,7 @@ int LUA_HookKey(INT32 keycode, int hook_type)
|
|||
if (prepare_hook(&hook, false, hook_type))
|
||||
{
|
||||
lua_pushinteger(gL, keycode);
|
||||
call_hooks(&hook, 1, 1, res_true);
|
||||
call_hooks(&hook, 1, res_true);
|
||||
}
|
||||
return hook.status;
|
||||
}
|
||||
|
@ -618,7 +623,7 @@ void LUA_HookThinkFrame(void)
|
|||
|
||||
if (prepare_hook(&hook, 0, type))
|
||||
{
|
||||
init_hook_call(&hook, 0, 0, res_none);
|
||||
init_hook_call(&hook, 0, res_none);
|
||||
|
||||
for (k = 0; k < map->numHooks; ++k)
|
||||
{
|
||||
|
@ -653,7 +658,7 @@ int LUA_HookMobjLineCollide(mobj_t *mobj, line_t *line)
|
|||
{
|
||||
LUA_PushUserdata(gL, mobj, META_MOBJ);
|
||||
LUA_PushUserdata(gL, line, META_LINE);
|
||||
call_hooks(&hook, 2, 1, res_force);
|
||||
call_hooks(&hook, 1, res_force);
|
||||
}
|
||||
return hook.status;
|
||||
}
|
||||
|
@ -665,7 +670,7 @@ int LUA_HookTouchSpecial(mobj_t *special, mobj_t *toucher)
|
|||
{
|
||||
LUA_PushUserdata(gL, special, META_MOBJ);
|
||||
LUA_PushUserdata(gL, toucher, META_MOBJ);
|
||||
call_hooks(&hook, 2, 1, res_true);
|
||||
call_hooks(&hook, 1, res_true);
|
||||
}
|
||||
return hook.status;
|
||||
}
|
||||
|
@ -678,7 +683,6 @@ static int damage_hook
|
|||
INT32 damage,
|
||||
UINT8 damagetype,
|
||||
int hook_type,
|
||||
int values,
|
||||
Hook_Callback results_handler
|
||||
){
|
||||
Hook_State hook;
|
||||
|
@ -687,10 +691,10 @@ static int damage_hook
|
|||
LUA_PushUserdata(gL, target, META_MOBJ);
|
||||
LUA_PushUserdata(gL, inflictor, META_MOBJ);
|
||||
LUA_PushUserdata(gL, source, META_MOBJ);
|
||||
if (values == 5)
|
||||
if (hook_type != MOBJ_HOOK(MobjDeath))
|
||||
lua_pushinteger(gL, damage);
|
||||
lua_pushinteger(gL, damagetype);
|
||||
call_hooks(&hook, values, 1, results_handler);
|
||||
call_hooks(&hook, 1, results_handler);
|
||||
}
|
||||
return hook.status;
|
||||
}
|
||||
|
@ -698,19 +702,19 @@ static int damage_hook
|
|||
int LUA_HookShouldDamage(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 damage, UINT8 damagetype)
|
||||
{
|
||||
return damage_hook(target, inflictor, source, damage, damagetype,
|
||||
MOBJ_HOOK(ShouldDamage), 5, res_force);
|
||||
MOBJ_HOOK(ShouldDamage), res_force);
|
||||
}
|
||||
|
||||
int LUA_HookMobjDamage(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 damage, UINT8 damagetype)
|
||||
{
|
||||
return damage_hook(target, inflictor, source, damage, damagetype,
|
||||
MOBJ_HOOK(MobjDamage), 5, res_true);
|
||||
MOBJ_HOOK(MobjDamage), res_true);
|
||||
}
|
||||
|
||||
int LUA_HookMobjDeath(mobj_t *target, mobj_t *inflictor, mobj_t *source, UINT8 damagetype)
|
||||
{
|
||||
return damage_hook(target, inflictor, source, 0, damagetype,
|
||||
MOBJ_HOOK(MobjDeath), 4, res_true);
|
||||
MOBJ_HOOK(MobjDeath), res_true);
|
||||
}
|
||||
|
||||
typedef struct {
|
||||
|
@ -783,7 +787,7 @@ int LUA_HookBotAI(mobj_t *sonic, mobj_t *tails, ticcmd_t *cmd)
|
|||
|
||||
hook.userdata = &botai;
|
||||
|
||||
call_hooks(&hook, 2, 8, res_botai);
|
||||
call_hooks(&hook, 8, res_botai);
|
||||
}
|
||||
|
||||
return hook.status;
|
||||
|
@ -798,7 +802,7 @@ void LUA_HookLinedefExecute(line_t *line, mobj_t *mo, sector_t *sector)
|
|||
LUA_PushUserdata(gL, line, META_LINE);
|
||||
LUA_PushUserdata(gL, mo, META_MOBJ);
|
||||
LUA_PushUserdata(gL, sector, META_SECTOR);
|
||||
ps_lua_mobjhooks += call_hooks(&hook, 3, 0, res_none);
|
||||
ps_lua_mobjhooks += call_hooks(&hook, 0, res_none);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -822,7 +826,7 @@ int LUA_HookPlayerMsg(int source, int target, int flags, char *msg)
|
|||
LUA_PushUserdata(gL, &players[target-1], META_PLAYER); // target
|
||||
}
|
||||
lua_pushstring(gL, msg); // msg
|
||||
call_hooks(&hook, 4, 1, res_true);
|
||||
call_hooks(&hook, 1, res_true);
|
||||
}
|
||||
return hook.status;
|
||||
}
|
||||
|
@ -836,7 +840,7 @@ int LUA_HookHurtMsg(player_t *player, mobj_t *inflictor, mobj_t *source, UINT8 d
|
|||
LUA_PushUserdata(gL, inflictor, META_MOBJ);
|
||||
LUA_PushUserdata(gL, source, META_MOBJ);
|
||||
lua_pushinteger(gL, damagetype);
|
||||
call_hooks(&hook, 4, 1, res_true);
|
||||
call_hooks(&hook, 1, res_true);
|
||||
}
|
||||
return hook.status;
|
||||
}
|
||||
|
@ -855,12 +859,14 @@ void LUA_HookNetArchive(lua_CFunction archFunc)
|
|||
push_error_handler();
|
||||
lua_insert(gL, EINDEX);
|
||||
|
||||
begin_hook_values(&hook);
|
||||
|
||||
// tables becomes an upvalue of archFunc
|
||||
lua_pushvalue(gL, -1);
|
||||
lua_pushcclosure(gL, archFunc, 1);
|
||||
// stack: tables, archFunc
|
||||
|
||||
init_hook_call(&hook, 1, 0, res_none);
|
||||
init_hook_call(&hook, 0, res_none);
|
||||
call_mapped(&hook, map);
|
||||
|
||||
lua_pop(gL, 1); // pop archFunc
|
||||
|
@ -876,7 +882,7 @@ int LUA_HookMapThingSpawn(mobj_t *mobj, mapthing_t *mthing)
|
|||
{
|
||||
LUA_PushUserdata(gL, mobj, META_MOBJ);
|
||||
LUA_PushUserdata(gL, mthing, META_MAPTHING);
|
||||
call_hooks(&hook, 2, 1, res_true);
|
||||
call_hooks(&hook, 1, res_true);
|
||||
}
|
||||
return hook.status;
|
||||
}
|
||||
|
@ -888,7 +894,7 @@ int LUA_HookFollowMobj(player_t *player, mobj_t *mobj)
|
|||
{
|
||||
LUA_PushUserdata(gL, player, META_PLAYER);
|
||||
LUA_PushUserdata(gL, mobj, META_MOBJ);
|
||||
call_hooks(&hook, 2, 1, res_true);
|
||||
call_hooks(&hook, 1, res_true);
|
||||
}
|
||||
return hook.status;
|
||||
}
|
||||
|
@ -900,7 +906,7 @@ int LUA_HookPlayerCanDamage(player_t *player, mobj_t *mobj)
|
|||
{
|
||||
LUA_PushUserdata(gL, player, META_PLAYER);
|
||||
LUA_PushUserdata(gL, mobj, META_MOBJ);
|
||||
call_hooks(&hook, 2, 1, res_force);
|
||||
call_hooks(&hook, 1, res_force);
|
||||
}
|
||||
return hook.status;
|
||||
}
|
||||
|
@ -912,7 +918,7 @@ void LUA_HookPlayerQuit(player_t *plr, kickreason_t reason)
|
|||
{
|
||||
LUA_PushUserdata(gL, plr, META_PLAYER); // Player that quit
|
||||
lua_pushinteger(gL, reason); // Reason for quitting
|
||||
call_hooks(&hook, 2, 0, res_none);
|
||||
call_hooks(&hook, 0, res_none);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -926,7 +932,7 @@ int LUA_HookTeamSwitch(player_t *player, int newteam, boolean fromspectators, bo
|
|||
lua_pushboolean(gL, fromspectators);
|
||||
lua_pushboolean(gL, tryingautobalance);
|
||||
lua_pushboolean(gL, tryingscramble);
|
||||
call_hooks(&hook, 5, 1, res_false);
|
||||
call_hooks(&hook, 1, res_false);
|
||||
}
|
||||
return hook.status;
|
||||
}
|
||||
|
@ -941,7 +947,7 @@ int LUA_HookViewpointSwitch(player_t *player, player_t *newdisplayplayer, boolea
|
|||
lua_pushboolean(gL, forced);
|
||||
|
||||
hud_running = true; // local hook
|
||||
call_hooks(&hook, 3, 1, res_force);
|
||||
call_hooks(&hook, 1, res_force);
|
||||
hud_running = false;
|
||||
}
|
||||
return hook.status;
|
||||
|
@ -956,7 +962,7 @@ int LUA_HookSeenPlayer(player_t *player, player_t *seenfriend)
|
|||
LUA_PushUserdata(gL, seenfriend, META_PLAYER);
|
||||
|
||||
hud_running = true; // local hook
|
||||
call_hooks(&hook, 2, 1, res_false);
|
||||
call_hooks(&hook, 1, res_false);
|
||||
hud_running = false;
|
||||
}
|
||||
return hook.status;
|
||||
|
@ -972,7 +978,7 @@ int LUA_HookShouldJingleContinue(player_t *player, const char *musname)
|
|||
push_string();
|
||||
|
||||
hud_running = true; // local hook
|
||||
call_hooks(&hook, 2, 1, res_true);
|
||||
call_hooks(&hook, 1, res_true);
|
||||
hud_running = false;
|
||||
}
|
||||
return hook.status;
|
||||
|
@ -1038,7 +1044,8 @@ int LUA_HookMusicChange(const char *oldname, struct MusicChange *param)
|
|||
|
||||
if (prepare_hook(&hook, false, type))
|
||||
{
|
||||
init_hook_call(&hook, 7, 6, res_musicchange);
|
||||
init_hook_call(&hook, 6, res_musicchange);
|
||||
hook.values = 7;/* values pushed later */
|
||||
hook.userdata = param;
|
||||
|
||||
lua_pushstring(gL, oldname);/* the only constant value */
|
||||
|
@ -1084,7 +1091,7 @@ fixed_t LUA_HookPlayerHeight(player_t *player)
|
|||
if (prepare_hook(&hook, -1, HOOK(PlayerHeight)))
|
||||
{
|
||||
LUA_PushUserdata(gL, player, META_PLAYER);
|
||||
call_hooks(&hook, 1, 1, res_playerheight);
|
||||
call_hooks(&hook, 1, res_playerheight);
|
||||
}
|
||||
return hook.status;
|
||||
}
|
||||
|
@ -1095,7 +1102,7 @@ int LUA_HookPlayerCanEnterSpinGaps(player_t *player)
|
|||
if (prepare_hook(&hook, 0, HOOK(PlayerCanEnterSpinGaps)))
|
||||
{
|
||||
LUA_PushUserdata(gL, player, META_PLAYER);
|
||||
call_hooks(&hook, 1, 1, res_force);
|
||||
call_hooks(&hook, 1, res_force);
|
||||
}
|
||||
return hook.status;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue