Compare commits

...

3 commits

Author SHA1 Message Date
Blockyyy
833271d50f
Merge 3c84097e15 into 32f395fb0c 2025-10-21 19:47:23 +02:00
Blockyyy
3c84097e15 fix new line, remove HOOK_BEFORE_OBJECT_UPDATE 2025-10-18 21:12:03 +02:00
Blockyyy
e9a48ee4f5 HOOK_OBJECT_UPDATE & HOOK_BEFORE_OBJECT_UPDATE 2025-10-16 22:03:16 +02:00
8 changed files with 40 additions and 5 deletions

View file

@ -8123,7 +8123,8 @@ 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_OBJECT_UPDATE = 60 --- @type LuaHookedEventType
HOOK_MAX = 61 --- @type LuaHookedEventType
--- @alias LuaHookedEventType
--- | `HOOK_UPDATE`
@ -8186,6 +8187,7 @@ HOOK_MAX = 60 --- @type LuaHookedEventType
--- | `HOOK_ON_ADD_SURFACE`
--- | `HOOK_ON_CLEAR_AREAS`
--- | `HOOK_ON_PACKET_BYTESTRING_RECEIVE`
--- | `HOOK_OBJECT_UPDATE`
--- | `HOOK_MAX`
HUD_DISPLAY_LIVES = 0 --- @type HudDisplayValue

View file

@ -3523,7 +3523,8 @@
| HOOK_ON_ADD_SURFACE | 57 |
| HOOK_ON_CLEAR_AREAS | 58 |
| HOOK_ON_PACKET_BYTESTRING_RECEIVE | 59 |
| HOOK_MAX | 60 |
| HOOK_OBJECT_UPDATE | 60 |
| HOOK_MAX | 61 |
[:arrow_up_small:](#)

View file

@ -151,7 +151,7 @@ The lua functions sent to `hook_event()` will be automatically called by SM64 wh
| HOOK_MARIO_OVERRIDE_FLOOR_CLASS | Called when Mario's floor class logic updates, return a `SURFACE_CLASS_*` constant to override the type. | [MarioState](../structs.md#MarioState) mario, `integer` surfaceClass |
| HOOK_ON_ADD_SURFACE | Called when collision surfaces are added. | [Surface](../structs.md#Surface) surface, `boolean` dynamic |
| HOOK_ON_CLEAR_AREAS | Called when a level's areas are unloaded. | None |
| HOOK_OBJECT_UPDATE | Called once per object per frame | [Object](../structs.md#Object) obj |
### Parameters
| Field | Type |

View file

@ -1380,7 +1380,7 @@ cur_obj_update_begin:;
smlua_call_behavior_hook(&gCurBhvCommand, gCurrentObject, false);
gCurrentObject->curBhvCommand = gCurBhvCommand;
// Increment the object's timer.
if (gCurrentObject->oTimer < 0x3FFFFFFF) {
gCurrentObject->oTimer++;
@ -1457,6 +1457,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) {

View file

@ -3487,7 +3487,8 @@ 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_OBJECT_UPDATE=60\n"
"HOOK_MAX=61\n"
"HUD_DISPLAY_LIVES=0\n"
"HUD_DISPLAY_COINS=1\n"
"HUD_DISPLAY_STARS=2\n"

View file

@ -58,3 +58,4 @@ 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_OBJECT_UPDATE, HOOK_RETURN_NEVER, struct Object *obj)

View file

@ -1863,3 +1863,30 @@ bool smlua_call_event_hooks_HOOK_ON_PACKET_BYTESTRING_RECEIVE(s32 modIndex, s32
}
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;
}

View file

@ -74,6 +74,7 @@ enum LuaHookedEventType {
HOOK_ON_ADD_SURFACE,
HOOK_ON_CLEAR_AREAS,
HOOK_ON_PACKET_BYTESTRING_RECEIVE,
HOOK_OBJECT_UPDATE,
HOOK_MAX,
};