From b0e1f1e465f179840ee37f0b4d0936a4b194c687 Mon Sep 17 00:00:00 2001 From: PeachyPeach <72323920+PeachyPeachSM64@users.noreply.github.com> Date: Sun, 12 Apr 2026 01:42:21 +0200 Subject: [PATCH] Fix DynOS packs Lua code execution (#1194) * Fix dynos packs code execution * make mod player models ignore dynos local player model only --- data/dynos.cpp.h | 3 ++- data/dynos_bin_actor.cpp | 3 +++ data/dynos_bin_pointer.cpp | 4 ++++ data/dynos_mgr_actor.cpp | 2 +- data/dynos_mgr_builtin.cpp | 2 +- 5 files changed, 11 insertions(+), 3 deletions(-) diff --git a/data/dynos.cpp.h b/data/dynos.cpp.h index e0b699d9d..af15a4490 100644 --- a/data/dynos.cpp.h +++ b/data/dynos.cpp.h @@ -22,7 +22,8 @@ extern "C" { #define FUNCTION_BHV 2 #define FUNCTION_LVL 3 -#define MOD_PACK_INDEX 99 +#define MOD_PACK_INDEX -1 // the pack index for actors loaded from mods +#define PACK_MOD_INDEX -1 // the mod index for actors loaded from packs // // Enums diff --git a/data/dynos_bin_actor.cpp b/data/dynos_bin_actor.cpp index 7d521bc30..4443b1dc6 100644 --- a/data/dynos_bin_actor.cpp +++ b/data/dynos_bin_actor.cpp @@ -94,6 +94,9 @@ GfxData *DynOS_Actor_LoadFromBinary(const SysPath &aPackFolder, const char *aAct BinFile *_File = DynOS_Bin_Decompress(aFilename); if (_File) { _GfxData = New(); + if (aAddToPack) { + _GfxData->mModIndex = PACK_MOD_INDEX; + } for (bool _Done = false; !_Done;) { switch (_File->Read()) { case DATA_TYPE_LIGHT: DynOS_Lights_Load (_File, _GfxData); break; diff --git a/data/dynos_bin_pointer.cpp b/data/dynos_bin_pointer.cpp index e619d7631..5ece3facc 100644 --- a/data/dynos_bin_pointer.cpp +++ b/data/dynos_bin_pointer.cpp @@ -465,6 +465,10 @@ void *DynOS_Pointer_Load(BinFile *aFile, GfxData *aGfxData, u32 aValue, u8 aFunc // LUAV if (aValue == LUA_VAR_CODE) { String token; token.Read(aFile); + if (aGfxData->mModIndex == PACK_MOD_INDEX) { + sys_fatal("Invalid use of Lua function in DynOS pack: %s", token.begin()); + return NULL; + } for (s32 i = 0; i < aGfxData->mLuaTokenList.Count(); i++) { if (token == aGfxData->mLuaTokenList[i]) { return (void*)(uintptr_t)(i+1); diff --git a/data/dynos_mgr_actor.cpp b/data/dynos_mgr_actor.cpp index 802a4ee37..e47ae6823 100644 --- a/data/dynos_mgr_actor.cpp +++ b/data/dynos_mgr_actor.cpp @@ -220,7 +220,7 @@ void DynOS_Actor_Override(struct Object* obj, void** aSharedChild) { obj->behavior == smlua_override_behavior(bhvMetalCap) || obj->behavior == smlua_override_behavior(bhvVanishCap))) { struct NetworkPlayer* np = network_player_from_global_index(obj->globalPlayerIndex); - if (np && np->localIndex > 0 && configDynosLocalPlayerModelOnly) { + if (np && np->localIndex > 0 && configDynosLocalPlayerModelOnly && it->second.mPackIndex != MOD_PACK_INDEX) { return; } } diff --git a/data/dynos_mgr_builtin.cpp b/data/dynos_mgr_builtin.cpp index b750cd060..bafcc8e3b 100644 --- a/data/dynos_mgr_builtin.cpp +++ b/data/dynos_mgr_builtin.cpp @@ -2087,7 +2087,7 @@ static String DynOS_Builtin_Func_CheckMisuse_Internal(s32 aIndex, const char* aD if (aFuncType != builtinFunc.type && ( aIndex == i || (aDataName && strcmp(aDataName, builtinFunc.name) == 0) || aData == builtinFunc.func)) { return String( - "Invalid use of function %s: trying to assign %s function to %s", + "Invalid use of %s function in %s: %s", builtinFunc.name, sDynosBuiltinFuncTypeNames[builtinFunc.type], sDynosBuiltinFuncTypeNames[aFuncType]