diff --git a/autogen/lua_definitions/constants.lua b/autogen/lua_definitions/constants.lua index f5050de2..9b0915d6 100644 --- a/autogen/lua_definitions/constants.lua +++ b/autogen/lua_definitions/constants.lua @@ -12307,7 +12307,7 @@ MAX_LOCAL_VERSION_LENGTH = 36 MAX_VERSION_LENGTH = 32 --- @type integer -MINOR_VERSION_NUMBER = 0 +MINOR_VERSION_NUMBER = 1 --- @type integer PATCH_VERSION_NUMBER = 0 diff --git a/autogen/lua_definitions/manual.lua b/autogen/lua_definitions/manual.lua index 4368a7c0..c24e8c4d 100644 --- a/autogen/lua_definitions/manual.lua +++ b/autogen/lua_definitions/manual.lua @@ -278,9 +278,3 @@ end function level_script_parse(levelNum, func) -- ... end - ---- @param readFunc (fun(obj:Object):nil)? Called after the exclamation box spawns an object. Use this function to read the contents of the object that spawned. ---- @param writeFunc (fun(box:Object):Object)? Called when the exclamation box is about to spawn an object. Use this function to spawn a different object, and return the object for the read function to use. -function hook_exclamation_box(readFunc, writeFunc) - -end \ No newline at end of file diff --git a/docs/lua/guides/hooks.md b/docs/lua/guides/hooks.md index b2349c37..d982bdf2 100644 --- a/docs/lua/guides/hooks.md +++ b/docs/lua/guides/hooks.md @@ -146,52 +146,6 @@ hook_event(HOOK_MARIO_UPDATE, mario_update)
-## [hook_exclamation_box](#hook_exclamation_box) - -Activated when an exclamation box breaks, allowing mods to take control over exclamation boxes. -- `readFunction` is called after the exclamation box breaks, allowing mods to read the object that spawned. - - No return value is necessary. -- `writeFunction` is called when the exclamation box breaks, allowing mods to override the spawned object. - - Returning the spawned object is highly recommended as it prevents spawning both the vanilla and new object at the same time. It also allows `readFunction` to function properly. - -### Parameters - -| Field | Type | -| ----- | ---- | -| readFunction | `Lua Function` ([Object](structs.md#Object)) | -| writeFunction | `Lua Function` ([Object](structs.md#Object)): [Object](structs.md#Object) | - -### Lua Example - -```lua -local objects_to_spawn = { - [0] = {id_bhvGoomba, E_MODEL_GOOMBA}, - [1] = {id_bhvKoopa, E_MODEL_KOOPA_WITH_SHELL}, - [2] = {id_bhvTenCoinsSpawn, E_MODEL_NONE}, - [3] = {id_bhvChainChomp, E_MODEL_CHAIN_CHOMP}, - [4] = {id_bhvHeaveHo, E_MODEL_HEAVE_HO}, - [5] = {id_bhvWingCap, E_MODEL_MARIOS_WING_CAP}, - [6] = {id_bhvKoopaShell, E_MODEL_KOOPA_SHELL}, - [7] = {id_bhvBoo, E_MODEL_BOO}, -} - -local function readFunction(obj) - if obj_has_behavior_id(obj, id_bhvFlame) ~= 0 then - print("FIREEEEEEEEE") - end -end - ----@param box Object -local function writeFunction(box) - local spawn_object = objects_to_spawn[box.oBehParams2ndByte] - return spawn_sync_object(spawn_object[1], spawn_object[2], box.oPosX, box.oPosY, box.oPosZ, nil) -end - -hook_exclamation_box(readFunction, writeFunction) -``` - -
- ## [hook_mario_action](#hook_mario_action) `hook_mario_action()` allows Lua mods to create new actions or override existing ones. diff --git a/src/game/behaviors/exclamation_box.inc.c b/src/game/behaviors/exclamation_box.inc.c index c9a7b8ba..96d939f0 100644 --- a/src/game/behaviors/exclamation_box.inc.c +++ b/src/game/behaviors/exclamation_box.inc.c @@ -131,19 +131,11 @@ void exclamation_box_spawn_contents(struct Struct802C0DF0 *a0, u8 a1) { return; } - struct Object* luaSpawnedObject = NULL; - if ((luaSpawnedObject = smlua_call_exclamation_box_hook(o, true)) != NULL) { - luaSpawnedObject->parentObj = o; // Allows spawned stars to work like it was a normal exclamation box - (void *)smlua_call_exclamation_box_hook(luaSpawnedObject, false); - return; - } - while (a0->unk0 != 99) { if (a1 == a0->unk0) { s32 model = exclamation_replace_model(marioState, a0->model); spawnedObject = spawn_object(o, model, a0->behavior); - (void *)smlua_call_exclamation_box_hook(spawnedObject, false); if (spawnedObject != NULL) { spawnedObject->oVelY = 20.0f; spawnedObject->oForwardVel = 3.0f; diff --git a/src/pc/lua/smlua_constants_autogen.c b/src/pc/lua/smlua_constants_autogen.c index 618ef402..260bb82f 100644 --- a/src/pc/lua/smlua_constants_autogen.c +++ b/src/pc/lua/smlua_constants_autogen.c @@ -4296,7 +4296,7 @@ char gSmluaConstants[] = "" "COOP_OBJ_FLAG_INITIALIZED = (1 << 3)\n" "VERSION_TEXT = 'beta'\n" "VERSION_NUMBER = 36\n" -"MINOR_VERSION_NUMBER = 0\n" +"MINOR_VERSION_NUMBER = 1\n" "PATCH_VERSION_NUMBER = 0\n" "VERSION_REGION = 'JP'\n" "VERSION_REGION = 'EU'\n" diff --git a/src/pc/lua/smlua_hooks.c b/src/pc/lua/smlua_hooks.c index c1e02db1..f02d0e9e 100644 --- a/src/pc/lua/smlua_hooks.c +++ b/src/pc/lua/smlua_hooks.c @@ -1752,110 +1752,6 @@ int smlua_hook_on_sync_table_change(lua_State* L) { return 1; } - //////////////////////////// - // hooked exclamation box // -//////////////////////////// - -struct LuaHookedExclamationBox { - int readFuncReference; - int writeFuncReference; - struct Mod* mod; -}; - -#define MAX_HOOKED_EXCLAMATION_BOXES 255 // Way more than needed, but better safe than sorry - -static struct LuaHookedExclamationBox sHookedExclamationBoxes[MAX_HOOKED_EXCLAMATION_BOXES] = { 0 }; -static int sHookedExclamationBoxesCount = 0; - -// Bind to lua -int smlua_hook_exclamation_box(lua_State* L) { - if (L == NULL) { return 0; } - if (!smlua_functions_valid_param_count(L, 2)) { return 0; } - - if (gLuaLoadingMod == NULL) { - LOG_LUA_LINE("hook_exclamation_box() can only be called on load."); - return 0; - } - - if (sHookedExclamationBoxesCount > MAX_HOOKED_EXCLAMATION_BOXES) { - LOG_LUA_LINE("hook_exclamation_box() calls exceeded maximum references"); - return 0; - } - - int readReference = 0; - int readReferenceType = lua_type(L, 1); - if (readReferenceType == LUA_TNIL) { - // nothing - } else if (readReferenceType == LUA_TFUNCTION) { - // get reference - lua_pushvalue(L, 1); - readReference = luaL_ref(L, LUA_REGISTRYINDEX); - } else { - LOG_LUA_LINE("Hook exclamation box: tried to reference non-function for read function"); - return 0; - } - - int writeReference = 0; - int writeReferenceType = lua_type(L, 2); - if (writeReferenceType == LUA_TNIL) { - // nothing - } else if (writeReferenceType == LUA_TFUNCTION) { - // get reference - lua_pushvalue(L, 2); - writeReference = luaL_ref(L, LUA_REGISTRYINDEX); - } else { - LOG_LUA_LINE("Hook exclamation box: tried to reference non-function for write function"); - return 0; - } - - struct LuaHookedExclamationBox* hooked = &sHookedExclamationBoxes[sHookedExclamationBoxesCount]; - hooked->readFuncReference = readReference; - hooked->writeFuncReference = writeReference; - hooked->mod = gLuaActiveMod; - - if (!gSmLuaConvertSuccess) { return 0; } - sHookedExclamationBoxesCount++; - return 1; -} - -// Called from the exclamation boxes -struct Object* smlua_call_exclamation_box_hook(struct Object* obj, bool write) { - lua_State* L = gLuaState; - if (L == NULL) { return NULL; } - for (int i = 0; i < sHookedExclamationBoxesCount; i++) { - struct LuaHookedExclamationBox* hook = &sHookedExclamationBoxes[i]; - - // Push 2 potential callbacks - int reference = write ? hook->writeFuncReference : hook->readFuncReference; - lua_rawgeti(L, LUA_REGISTRYINDEX, reference); - - // push object - smlua_push_object(L, LOT_OBJECT, obj); - - // call the callback - if (reference != 0 && 0 != smlua_call_hook(L, 1, 1, 0, hook->mod)) { - LOG_LUA("Failed to call the exclamation box callback: %s", (write ? "writeFunction" : "readFunction")); - continue; - } - - // output the return value - struct Object* returnObject = NULL; - if (write && reference != 0) { - returnObject = (struct Object*)smlua_to_cobject(L, 1, LOT_OBJECT); - if (lua_type(L, 1) != LUA_TTABLE || !gSmLuaConvertSuccess) { - LOG_LUA("Return value type is invalid for writeFunction: %d", lua_type(L, 1)); - continue; - } - } - lua_pop(L, 1); - - return returnObject; - } - - return NULL; -} - - ////////// // misc // ////////// @@ -1931,5 +1827,4 @@ void smlua_bind_hooks(void) { smlua_bind_function(L, "hook_on_sync_table_change", smlua_hook_on_sync_table_change); smlua_bind_function(L, "hook_behavior", smlua_hook_behavior); smlua_bind_function(L, "update_chat_command_description", smlua_update_chat_command_description); - smlua_bind_function(L, "hook_exclamation_box", smlua_hook_exclamation_box); } diff --git a/src/pc/lua/smlua_hooks.h b/src/pc/lua/smlua_hooks.h index 7b84ea8b..28b47e20 100644 --- a/src/pc/lua/smlua_hooks.h +++ b/src/pc/lua/smlua_hooks.h @@ -133,9 +133,6 @@ bool smlua_call_event_hooks_mario_param_and_int_ret_int(enum LuaHookedEventType bool smlua_call_event_hooks_mario_param_and_int_and_int_ret_int(enum LuaHookedEventType hookType, struct MarioState* m, s32 param, u32 args, s32* returnValue); void smlua_call_event_hooks_graph_node_object_and_int_param(enum LuaHookedEventType hookType, struct GraphNodeObject* node, s32 param); -int smlua_hook_exclamation_box(lua_State* L); -struct Object* smlua_call_exclamation_box_hook(struct Object* obj, bool write); - enum BehaviorId smlua_get_original_behavior_id(const BehaviorScript* behavior); const BehaviorScript* smlua_override_behavior(const BehaviorScript* behavior); const BehaviorScript* smlua_get_hooked_behavior_from_id(enum BehaviorId id, bool returnOriginal);