diff --git a/autogen/lua_definitions/constants.lua b/autogen/lua_definitions/constants.lua index 3913bc7f..671dad86 100644 --- a/autogen/lua_definitions/constants.lua +++ b/autogen/lua_definitions/constants.lua @@ -5294,7 +5294,13 @@ HOOK_ON_WARP = 12 HOOK_ON_SYNC_VALID = 13 --- @type LuaHookedEventType -HOOK_MAX = 14 +HOOK_ON_OBJECT_UNLOAD = 14 + +--- @type LuaHookedEventType +HOOK_ON_SYNC_OBJECT_UNLOAD = 15 + +--- @type LuaHookedEventType +HOOK_MAX = 16 --- @class ModelExtendedId diff --git a/docs/lua/constants.md b/docs/lua/constants.md index 3dcb4592..5230a7a0 100644 --- a/docs/lua/constants.md +++ b/docs/lua/constants.md @@ -1862,7 +1862,9 @@ | HOOK_ON_LEVEL_INIT | 11 | | HOOK_ON_WARP | 12 | | HOOK_ON_SYNC_VALID | 13 | -| HOOK_MAX | 14 | +| HOOK_ON_OBJECT_UNLOAD | 14 | +| HOOK_ON_SYNC_OBJECT_UNLOAD | 15 | +| HOOK_MAX | 16 | [:arrow_up_small:](#) diff --git a/docs/lua/hooks.md b/docs/lua/hooks.md index cb5ebb72..cac58087 100644 --- a/docs/lua/hooks.md +++ b/docs/lua/hooks.md @@ -100,6 +100,8 @@ The lua functions sent to `hook_event()` will be automatically called by SM64 wh | HOOK_ON_LEVEL_INIT | Called when the level is initialized | None | | HOOK_ON_WARP | Called when the local player warps | None | | HOOK_ON_SYNC_VALID | Called when the current area is synchronized | None | +| HOOK_ON_OBJECT_UNLOAD | Called when any object is unloaded | [Object](structs.md#Object) unloadedObject | +| HOOK_ON_SYNC_OBJECT_UNLOAD | Called when any networked object is unloaded | [Object](structs.md#Object) unloadedObject | ### Parameters diff --git a/src/game/spawn_object.c b/src/game/spawn_object.c index a76d3c3b..e48b2031 100644 --- a/src/game/spawn_object.c +++ b/src/game/spawn_object.c @@ -214,8 +214,11 @@ void unload_object(struct Object *obj) { } else { network_send_reservation_release(obj->oSyncID); } + smlua_call_event_hooks_object_param(HOOK_ON_SYNC_OBJECT_UNLOAD, obj); } + smlua_call_event_hooks_object_param(HOOK_ON_OBJECT_UNLOAD, obj); + deallocate_object(&gFreeObjectList, &obj->header); } diff --git a/src/pc/lua/smlua_constants_autogen.c b/src/pc/lua/smlua_constants_autogen.c index ea73d035..85813c0a 100644 --- a/src/pc/lua/smlua_constants_autogen.c +++ b/src/pc/lua/smlua_constants_autogen.c @@ -1904,7 +1904,9 @@ char gSmluaConstants[] = "" "HOOK_ON_LEVEL_INIT = 11\n" "HOOK_ON_WARP = 12\n" "HOOK_ON_SYNC_VALID = 13\n" -"HOOK_MAX = 14\n" +"HOOK_ON_OBJECT_UNLOAD = 14\n" +"HOOK_ON_SYNC_OBJECT_UNLOAD = 15\n" +"HOOK_MAX = 16\n" "E_MODEL_NONE = 0\n" "E_MODEL_MARIO = 1\n" "E_MODEL_SMOKE = 2\n" diff --git a/src/pc/lua/smlua_hooks.c b/src/pc/lua/smlua_hooks.c index 4507cecb..675cb3a2 100644 --- a/src/pc/lua/smlua_hooks.c +++ b/src/pc/lua/smlua_hooks.c @@ -192,6 +192,26 @@ void smlua_call_event_hooks_interact_params(enum LuaHookedEventType hookType, st } } +void smlua_call_event_hooks_object_param(enum LuaHookedEventType hookType, struct Object* obj) { + lua_State* L = gLuaState; + if (L == NULL) { return; } + struct LuaHookedEvent* hook = &sHookedEvents[hookType]; + for (int i = 0; i < hook->count; i++) { + // push the callback onto the stack + lua_rawgeti(L, LUA_REGISTRYINDEX, hook->reference[i]); + + // push object + smlua_push_object(L, LOT_OBJECT, obj); + + // call the callback + if (0 != smlua_call_hook(L, 1, 0, 0, hook->mod[i])) { + LOG_LUA("Failed to call the callback: %u, %s", hookType, lua_tostring(L, -1)); + smlua_logline(); + continue; + } + } +} + void smlua_call_event_hooks_network_player_param(enum LuaHookedEventType hookType, struct NetworkPlayer* np) { lua_State* L = gLuaState; if (L == NULL) { return; } diff --git a/src/pc/lua/smlua_hooks.h b/src/pc/lua/smlua_hooks.h index e81eede4..57799509 100644 --- a/src/pc/lua/smlua_hooks.h +++ b/src/pc/lua/smlua_hooks.h @@ -19,6 +19,8 @@ enum LuaHookedEventType { HOOK_ON_LEVEL_INIT, HOOK_ON_WARP, HOOK_ON_SYNC_VALID, + HOOK_ON_OBJECT_UNLOAD, + HOOK_ON_SYNC_OBJECT_UNLOAD, HOOK_MAX, }; @@ -37,6 +39,8 @@ static char* LuaHookedEventTypeName[] = { "HOOK_ON_LEVEL_INIT", "HOOK_ON_WARP", "HOOK_ON_SYNC_VALID", + "HOOK_ON_OBJECT_UNLOAD", + "HOOK_ON_SYNC_OBJECT_UNLOAD", "HOOK_MAX" }; @@ -47,6 +51,7 @@ void smlua_call_event_hooks_mario_param(enum LuaHookedEventType hookType, struct void smlua_call_event_hooks_mario_params(enum LuaHookedEventType hookType, struct MarioState* m1, struct MarioState* m2); void smlua_call_event_hooks_mario_params_ret_bool(enum LuaHookedEventType hookType, struct MarioState* m1, struct MarioState* m2, bool* returnValue); void smlua_call_event_hooks_interact_params(enum LuaHookedEventType hookType, struct MarioState* m, struct Object* obj, u32 interactType, bool interactValue); +void smlua_call_event_hooks_object_param(enum LuaHookedEventType hookType, struct Object* obj); const BehaviorScript* smlua_override_behavior(const BehaviorScript* behavior); const BehaviorScript* get_lua_behavior_from_id(enum BehaviorId id, bool returnOriginal);