Add HOOK_ON_ADD_SURFACE and HOOK_ON_CLEAR_AREAS (#843)
Some checks are pending
Build coop / build-linux (push) Waiting to run
Build coop / build-steamos (push) Waiting to run
Build coop / build-windows-opengl (push) Waiting to run
Build coop / build-windows-directx (push) Waiting to run
Build coop / build-macos-arm (push) Waiting to run
Build coop / build-macos-intel (push) Waiting to run

This commit is contained in:
djoslin0 2025-06-07 20:46:28 -07:00 committed by GitHub
parent b99f18dacc
commit 838fe40d6e
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
8 changed files with 40 additions and 3 deletions

View file

@ -7822,7 +7822,9 @@ HOOK_ALLOW_FORCE_WATER_ACTION = 53 --- @type LuaHookedEventType
HOOK_BEFORE_WARP = 54 --- @type LuaHookedEventType
HOOK_ON_INSTANT_WARP = 55 --- @type LuaHookedEventType
HOOK_MARIO_OVERRIDE_FLOOR_CLASS = 56 --- @type LuaHookedEventType
HOOK_MAX = 57 --- @type LuaHookedEventType
HOOK_ON_ADD_SURFACE = 57 --- @type LuaHookedEventType
HOOK_ON_CLEAR_AREAS = 58 --- @type LuaHookedEventType
HOOK_MAX = 59 --- @type LuaHookedEventType
--- @alias LuaHookedEventType
--- | `HOOK_UPDATE`
@ -7882,6 +7884,8 @@ HOOK_MAX = 57 --- @type LuaHookedEventType
--- | `HOOK_BEFORE_WARP`
--- | `HOOK_ON_INSTANT_WARP`
--- | `HOOK_MARIO_OVERRIDE_FLOOR_CLASS`
--- | `HOOK_ON_ADD_SURFACE`
--- | `HOOK_ON_CLEAR_AREAS`
--- | `HOOK_MAX`
ACTION_HOOK_EVERY_FRAME = 0 --- @type LuaActionHookType

View file

@ -3439,7 +3439,9 @@
| HOOK_BEFORE_WARP | 54 |
| HOOK_ON_INSTANT_WARP | 55 |
| HOOK_MARIO_OVERRIDE_FLOOR_CLASS | 56 |
| HOOK_MAX | 57 |
| HOOK_ON_ADD_SURFACE | 57 |
| HOOK_ON_CLEAR_AREAS | 58 |
| HOOK_MAX | 59 |
### [enum LuaActionHookType](#LuaActionHookType)
| Identifier | Value |

View file

@ -149,6 +149,8 @@ The lua functions sent to `hook_event()` will be automatically called by SM64 wh
| HOOK_BEFORE_WARP | Called before the local player warps. Return a table with `destLevel`, `destArea`, `destWarpNode`, to override the warp | `integer` destLevel, `integer` destArea, `integer` destWarpNode, `integer` arg |
| HOOK_ON_INSTANT_WARP | Called when the local player goes through an instant warp.| `integer` area, `integer` id, `Vec3s` displacement|
| 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 |
### Parameters

View file

@ -245,6 +245,8 @@ static void add_surface(struct Surface *surface, s32 dynamic) {
add_surface_to_cell(dynamic, cellX, cellZ, surface);
}
}
smlua_call_event_on_add_surface(surface, dynamic);
}
/**

View file

@ -215,6 +215,8 @@ void load_obj_warp_nodes(void) {
}
void clear_areas(void) {
smlua_call_event_hooks(HOOK_ON_CLEAR_AREAS);
struct NetworkPlayer* np = gNetworkPlayerLocal;
if (np != NULL) {
np->currAreaSyncValid = false;

View file

@ -3254,7 +3254,9 @@ char gSmluaConstants[] = ""
"HOOK_BEFORE_WARP=54\n"
"HOOK_ON_INSTANT_WARP=55\n"
"HOOK_MARIO_OVERRIDE_FLOOR_CLASS=56\n"
"HOOK_MAX=57\n"
"HOOK_ON_ADD_SURFACE=57\n"
"HOOK_ON_CLEAR_AREAS=58\n"
"HOOK_MAX=59\n"
"ACTION_HOOK_EVERY_FRAME=0\n"
"ACTION_HOOK_GRAVITY=1\n"
"ACTION_HOOK_MAX=2\n"

View file

@ -164,6 +164,26 @@ void smlua_call_event_on_hud_render_behind(void (*resetFunc)(void)) {
}
void smlua_call_event_on_add_surface(struct Surface* surface, bool dynamic) {
lua_State* L = gLuaState;
if (L == NULL) { return; }
struct LuaHookedEvent* hook = &sHookedEvents[HOOK_ON_ADD_SURFACE];
for (int i = 0; i < hook->count; i++) {
// push the callback onto the stack
lua_rawgeti(L, LUA_REGISTRYINDEX, hook->reference[i]);
// push surface and dynamic
smlua_push_object(L, LOT_SURFACE, surface, NULL);
lua_pushboolean(L, dynamic);
// call the callback
if (0 != smlua_call_hook(L, 2, 0, 0, hook->mod[i])) {
LOG_LUA("Failed to call the event_hook callback: %u", HOOK_ON_ADD_SURFACE);
}
}
}
void smlua_call_event_hooks_bool_param(enum LuaHookedEventType hookType, bool value) {
lua_State* L = gLuaState;
if (L == NULL) { return; }

View file

@ -70,6 +70,8 @@ enum LuaHookedEventType {
HOOK_BEFORE_WARP,
HOOK_ON_INSTANT_WARP,
HOOK_MARIO_OVERRIDE_FLOOR_CLASS,
HOOK_ON_ADD_SURFACE,
HOOK_ON_CLEAR_AREAS,
HOOK_MAX,
};
@ -180,6 +182,7 @@ int smlua_hook_custom_bhv(BehaviorScript *bhvScript, const char *bhvName);
void smlua_call_event_hooks(enum LuaHookedEventType hookType);
void smlua_call_event_on_hud_render(void (*resetFunc)(void));
void smlua_call_event_on_hud_render_behind(void (*resetFunc)(void));
void smlua_call_event_on_add_surface(struct Surface* surface, bool dynamic);
void smlua_call_event_hooks_bool_param(enum LuaHookedEventType hookType, bool value);
void smlua_call_event_hooks_bool_param_ret_bool(enum LuaHookedEventType hookType, bool value, bool* returnValue);
void smlua_call_event_hooks_mario_param(enum LuaHookedEventType hookType, struct MarioState* m);