mirror of
https://github.com/coop-deluxe/sm64coopdx.git
synced 2025-10-30 08:01:01 +00:00
HOOK_OBJECT_UPDATE & HOOK_BEFORE_OBJECT_UPDATE
This commit is contained in:
parent
b4c8f023d2
commit
e9a48ee4f5
7 changed files with 74 additions and 3 deletions
|
|
@ -8111,7 +8111,9 @@ HOOK_MARIO_OVERRIDE_FLOOR_CLASS = 56 --- @type LuaHookedEventType
|
|||
HOOK_ON_ADD_SURFACE = 57 --- @type LuaHookedEventType
|
||||
HOOK_ON_CLEAR_AREAS = 58 --- @type LuaHookedEventType
|
||||
HOOK_ON_PACKET_BYTESTRING_RECEIVE = 59 --- @type LuaHookedEventType
|
||||
HOOK_MAX = 60 --- @type LuaHookedEventType
|
||||
HOOK_BEFORE_OBJECT_UPDATE = 60 --- @type LuaHookedEventType
|
||||
HOOK_OBJECT_UPDATE = 61 --- @type LuaHookedEventType
|
||||
HOOK_MAX = 62 --- @type LuaHookedEventType
|
||||
|
||||
--- @alias LuaHookedEventType
|
||||
--- | `HOOK_UPDATE`
|
||||
|
|
@ -8174,6 +8176,8 @@ HOOK_MAX = 60 --- @type LuaHookedEventType
|
|||
--- | `HOOK_ON_ADD_SURFACE`
|
||||
--- | `HOOK_ON_CLEAR_AREAS`
|
||||
--- | `HOOK_ON_PACKET_BYTESTRING_RECEIVE`
|
||||
--- | `HOOK_BEFORE_OBJECT_UPDATE`
|
||||
--- | `HOOK_OBJECT_UPDATE`
|
||||
--- | `HOOK_MAX`
|
||||
|
||||
HUD_DISPLAY_LIVES = 0 --- @type HudDisplayValue
|
||||
|
|
|
|||
|
|
@ -3519,7 +3519,9 @@
|
|||
| HOOK_ON_ADD_SURFACE | 57 |
|
||||
| HOOK_ON_CLEAR_AREAS | 58 |
|
||||
| HOOK_ON_PACKET_BYTESTRING_RECEIVE | 59 |
|
||||
| HOOK_MAX | 60 |
|
||||
| HOOK_BEFORE_OBJECT_UPDATE | 60 |
|
||||
| HOOK_OBJECT_UPDATE | 61 |
|
||||
| HOOK_MAX | 62 |
|
||||
|
||||
[:arrow_up_small:](#)
|
||||
|
||||
|
|
|
|||
|
|
@ -1293,6 +1293,7 @@ static BhvCommandProc BehaviorCmdTable[BEHAVIOR_CMD_TABLE_MAX] = {
|
|||
void cur_obj_update(void) {
|
||||
if (!gCurrentObject) { return; }
|
||||
// Don't update if dormant
|
||||
|
||||
if (gCurrentObject->activeFlags & ACTIVE_FLAG_DORMANT) {
|
||||
gCurrentObject->header.gfx.node.flags &= ~GRAPH_RENDER_ACTIVE;
|
||||
gCurrentObject->oInteractStatus = INT_STATUS_INTERACTED;
|
||||
|
|
@ -1381,6 +1382,8 @@ cur_obj_update_begin:;
|
|||
smlua_call_behavior_hook(&gCurBhvCommand, gCurrentObject, false);
|
||||
gCurrentObject->curBhvCommand = gCurBhvCommand;
|
||||
|
||||
smlua_call_event_hooks(HOOK_BEFORE_OBJECT_UPDATE, gCurrentObject);
|
||||
|
||||
// Increment the object's timer.
|
||||
if (gCurrentObject->oTimer < 0x3FFFFFFF) {
|
||||
gCurrentObject->oTimer++;
|
||||
|
|
@ -1457,6 +1460,8 @@ cur_obj_update_begin:;
|
|||
}
|
||||
}
|
||||
|
||||
smlua_call_event_hooks(HOOK_OBJECT_UPDATE, gCurrentObject);
|
||||
|
||||
// call the network area timer's run-once callback
|
||||
cur_obj_update_end:;
|
||||
if (gCurrentObject->areaTimerType != AREA_TIMER_TYPE_NONE) {
|
||||
|
|
|
|||
|
|
@ -3483,7 +3483,9 @@ char gSmluaConstants[] = ""
|
|||
"HOOK_ON_ADD_SURFACE=57\n"
|
||||
"HOOK_ON_CLEAR_AREAS=58\n"
|
||||
"HOOK_ON_PACKET_BYTESTRING_RECEIVE=59\n"
|
||||
"HOOK_MAX=60\n"
|
||||
"HOOK_BEFORE_OBJECT_UPDATE=60\n"
|
||||
"HOOK_OBJECT_UPDATE=61\n"
|
||||
"HOOK_MAX=62\n"
|
||||
"HUD_DISPLAY_LIVES=0\n"
|
||||
"HUD_DISPLAY_COINS=1\n"
|
||||
"HUD_DISPLAY_STARS=2\n"
|
||||
|
|
|
|||
|
|
@ -58,3 +58,5 @@ SMLUA_EVENT_HOOK(HOOK_MARIO_OVERRIDE_FLOOR_CLASS, HOOK_RETURN_ON_OUTPUT_SET, str
|
|||
SMLUA_EVENT_HOOK(HOOK_ON_ADD_SURFACE, HOOK_RETURN_NEVER, struct Surface *surface, bool dynamic)
|
||||
SMLUA_EVENT_HOOK(HOOK_ON_CLEAR_AREAS, HOOK_RETURN_NEVER)
|
||||
SMLUA_EVENT_HOOK(HOOK_ON_PACKET_BYTESTRING_RECEIVE, HOOK_RETURN_NEVER, s32 modIndex, s32 valueIndex)
|
||||
SMLUA_EVENT_HOOK(HOOK_BEFORE_OBJECT_UPDATE, HOOK_RETURN_NEVER, struct Object *obj)
|
||||
SMLUA_EVENT_HOOK(HOOK_OBJECT_UPDATE, HOOK_RETURN_NEVER, struct Object *obj)
|
||||
|
|
|
|||
|
|
@ -1863,3 +1863,57 @@ bool smlua_call_event_hooks_HOOK_ON_PACKET_BYTESTRING_RECEIVE(s32 modIndex, s32
|
|||
}
|
||||
return hookResult;
|
||||
}
|
||||
|
||||
bool smlua_call_event_hooks_HOOK_BEFORE_OBJECT_UPDATE(struct Object *obj) {
|
||||
lua_State *L = gLuaState;
|
||||
if (L == NULL) { return false; }
|
||||
bool hookResult = false;
|
||||
|
||||
struct LuaHookedEvent *hook = &sHookedEvents[HOOK_BEFORE_OBJECT_UPDATE];
|
||||
for (int i = 0; i < hook->count; i++) {
|
||||
s32 prevTop = lua_gettop(L);
|
||||
|
||||
// push the callback onto the stack
|
||||
lua_rawgeti(L, LUA_REGISTRYINDEX, hook->reference[i]);
|
||||
|
||||
// push obj
|
||||
smlua_push_object(L, LOT_OBJECT, obj, NULL);
|
||||
|
||||
// call the callback
|
||||
if (0 != smlua_call_hook(L, 1, 0, 0, hook->mod[i], hook->modFile[i])) {
|
||||
LOG_LUA("Failed to call the callback for hook %s", sLuaHookedEventTypeName[HOOK_BEFORE_OBJECT_UPDATE]);
|
||||
continue;
|
||||
}
|
||||
hookResult = true;
|
||||
|
||||
lua_settop(L, prevTop);
|
||||
}
|
||||
return hookResult;
|
||||
}
|
||||
|
||||
bool smlua_call_event_hooks_HOOK_OBJECT_UPDATE(struct Object *obj) {
|
||||
lua_State *L = gLuaState;
|
||||
if (L == NULL) { return false; }
|
||||
bool hookResult = false;
|
||||
|
||||
struct LuaHookedEvent *hook = &sHookedEvents[HOOK_OBJECT_UPDATE];
|
||||
for (int i = 0; i < hook->count; i++) {
|
||||
s32 prevTop = lua_gettop(L);
|
||||
|
||||
// push the callback onto the stack
|
||||
lua_rawgeti(L, LUA_REGISTRYINDEX, hook->reference[i]);
|
||||
|
||||
// push obj
|
||||
smlua_push_object(L, LOT_OBJECT, obj, NULL);
|
||||
|
||||
// call the callback
|
||||
if (0 != smlua_call_hook(L, 1, 0, 0, hook->mod[i], hook->modFile[i])) {
|
||||
LOG_LUA("Failed to call the callback for hook %s", sLuaHookedEventTypeName[HOOK_OBJECT_UPDATE]);
|
||||
continue;
|
||||
}
|
||||
hookResult = true;
|
||||
|
||||
lua_settop(L, prevTop);
|
||||
}
|
||||
return hookResult;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -74,6 +74,8 @@ enum LuaHookedEventType {
|
|||
HOOK_ON_ADD_SURFACE,
|
||||
HOOK_ON_CLEAR_AREAS,
|
||||
HOOK_ON_PACKET_BYTESTRING_RECEIVE,
|
||||
HOOK_BEFORE_OBJECT_UPDATE,
|
||||
HOOK_OBJECT_UPDATE,
|
||||
HOOK_MAX,
|
||||
};
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue