diff --git a/Client/mods/deathmatch/logic/CStaticFunctionDefinitions.h b/Client/mods/deathmatch/logic/CStaticFunctionDefinitions.h index 4776be6ca1e..86731bdd096 100644 --- a/Client/mods/deathmatch/logic/CStaticFunctionDefinitions.h +++ b/Client/mods/deathmatch/logic/CStaticFunctionDefinitions.h @@ -634,6 +634,12 @@ class CStaticFunctionDefinitions static bool ResetAllSurfaceInfo(); static bool ResetSurfaceInfo(short sSurfaceID); + static inline unsigned short ResolveModelID(const std::variant& variant) + { + if (std::holds_alternative(variant)) + return std::get(variant); + return CModelNames::ResolveModelID(std::get(variant)); + } // Input functions static bool BindKey(const char* szKey, const char* szHitState, CLuaMain* pLuaMain, const CLuaFunctionRef& iLuaFunction, CLuaArguments& Arguments); static bool BindKey(const char* szKey, const char* szHitState, const char* szCommandName, const char* szArguments, const char* szResource); diff --git a/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp b/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp index f35c2094bc3..0dedb67f55d 100644 --- a/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp +++ b/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp @@ -10,6 +10,7 @@ *****************************************************************************/ #include "StdInc.h" +#include void CLuaEngineDefs::LoadFunctions() { @@ -29,7 +30,7 @@ void CLuaEngineDefs::LoadFunctions() {"engineRequestModel", EngineRequestModel}, {"engineGetModelLODDistance", EngineGetModelLODDistance}, {"engineSetModelLODDistance", EngineSetModelLODDistance}, - {"engineResetModelLODDistance", EngineResetModelLODDistance}, + {"engineResetModelLODDistance", ArgumentParser}, {"engineSetAsynchronousLoading", EngineSetAsynchronousLoading}, {"engineApplyShaderToWorldTexture", EngineApplyShaderToWorldTexture}, {"engineRemoveShaderFromWorldTexture", EngineRemoveShaderFromWorldTexture}, @@ -37,8 +38,8 @@ void CLuaEngineDefs::LoadFunctions() {"engineGetModelIDFromName", EngineGetModelIDFromName}, {"engineGetModelTextureNames", EngineGetModelTextureNames}, {"engineGetVisibleTextureNames", EngineGetVisibleTextureNames}, - {"engineSetModelVisibleTime", EngineSetModelVisibleTime}, - {"engineGetModelVisibleTime", EngineGetModelVisibleTime}, + {"engineSetModelVisibleTime", ArgumentParser}, + {"engineGetModelVisibleTime", ArgumentParser}, {"engineGetModelTextures", EngineGetModelTextures}, {"engineGetSurfaceProperties", EngineGetSurfaceProperties}, {"engineSetSurfaceProperties", EngineSetSurfaceProperties}, @@ -772,31 +773,20 @@ int CLuaEngineDefs::EngineSetModelLODDistance(lua_State* luaVM) return 1; } -int CLuaEngineDefs::EngineResetModelLODDistance(lua_State* luaVM) +bool CLuaEngineDefs::EngineResetModelLODDistance(const std::variant variantModelID) { - SString strModel = ""; - CScriptArgReader argStream(luaVM); - argStream.ReadString(strModel); - - if (argStream.HasErrors()) - return luaL_error(luaVM, argStream.GetFullErrorMessage()); - - unsigned short usModelID = CModelNames::ResolveModelID(strModel); - CModelInfo* pModelInfo = g_pGame->GetModelInfo(usModelID); - if (pModelInfo) - { - float fCurrentDistance = pModelInfo->GetLODDistance(); - float fOriginalDistance = pModelInfo->GetOriginalLODDistance(); - //Make sure we're dealing with a valid LOD distance, and not setting the same LOD distance - if (fOriginalDistance > 0.0f && fOriginalDistance != fCurrentDistance) { - pModelInfo->SetLODDistance(fOriginalDistance, true); - lua_pushboolean(luaVM, true); - return 1; - } - } - - lua_pushboolean(luaVM, false); - return 1; + const unsigned short modelID = CStaticFunctionDefinitions::ResolveModelID(variantModelID); + CModelInfo* const modelInfo = g_pGame->GetModelInfo(modelID); + if (!modelInfo) + throw std::invalid_argument(SString("Invalid model id %u. Valid IDs are in range 0 - 19999", modelID)); + + //Make sure we're dealing with a valid LOD distance, and not setting the same LOD distance + const float originalDistance = modelInfo->GetOriginalLODDistance(); + if (originalDistance == 0.0f || originalDistance == modelInfo->GetLODDistance()) + return false; + + modelInfo->SetLODDistance(originalDistance, true); + return true; } int CLuaEngineDefs::EngineSetAsynchronousLoading(lua_State* luaVM) @@ -1104,72 +1094,35 @@ int CLuaEngineDefs::EngineGetVisibleTextureNames(lua_State* luaVM) return 1; } -int CLuaEngineDefs::EngineSetModelVisibleTime(lua_State* luaVM) +bool CLuaEngineDefs::EngineSetModelVisibleTime(const std::variant variantModelID, short hourOn, short hourOff) { - // bool engineSetModelVisibleTime ( int/string modelID, int hourOn, int hourOff ) - SString strModelId; - char cHourOn,cHourOff; - CScriptArgReader argStream(luaVM); - argStream.ReadString(strModelId); - argStream.ReadNumber(cHourOn); - argStream.ReadNumber(cHourOff); - - if (!argStream.HasErrors()) - { - ushort usModelID = CModelNames::ResolveModelID(strModelId); - CModelInfo* pModelInfo = g_pGame->GetModelInfo(usModelID); - if (pModelInfo) - { - if (cHourOn >= 0 && cHourOn <= 24 && cHourOff >= 0 && cHourOff <= 24) - { - lua_pushboolean(luaVM, pModelInfo->SetTime(cHourOn, cHourOff)); - return 1; - } - } - } - else - luaL_error(luaVM, argStream.GetFullErrorMessage()); + const unsigned short modelID = CStaticFunctionDefinitions::ResolveModelID(variantModelID); + CModelInfo* const modelInfo = g_pGame->GetModelInfo(modelID); + if (!modelInfo) + throw std::invalid_argument(SString("Invalid model id %u", modelID)); - // Failed - lua_pushboolean(luaVM, false); - return 1; -} + if (hourOn > 24 || hourOn < 0) + throw std::invalid_argument("hourOn must be between 0 and 24"); -int CLuaEngineDefs::EngineGetModelVisibleTime(lua_State* luaVM) -{ - // int, int engineGetModelVisibleTime ( int/string modelID ) - SString strModelId; + if (hourOff > 24 || hourOff < 0) + throw std::invalid_argument("hourOff must be between 0 and 24"); - CScriptArgReader argStream(luaVM); - argStream.ReadString(strModelId); + if (hourOn > hourOff) + std::swap(hourOn, hourOff); - if (!argStream.HasErrors()) - { - ushort usModelID = CModelNames::ResolveModelID(strModelId); - CModelInfo* pModelInfo = g_pGame->GetModelInfo(usModelID); - if (pModelInfo) - { - char cHourOn, cHourOff; - if (pModelInfo->GetTime(cHourOn, cHourOff)) - { - lua_pushnumber(luaVM, cHourOn); - lua_pushnumber(luaVM, cHourOff); - return 2; - } - else // Model is incompatible, don't let confuse user. - { - lua_pushnumber(luaVM, 0); - lua_pushnumber(luaVM, 24); - return 2; - } - } - } - else - luaL_error(luaVM, argStream.GetFullErrorMessage()); + return modelInfo->SetTime(hourOn, hourOff); +} - // Failed - lua_pushboolean(luaVM, false); - return 1; +std::tuple CLuaEngineDefs::EngineGetModelVisibleTime(const std::variant variantModelID) +{ + const unsigned short modelID = CStaticFunctionDefinitions::ResolveModelID(variantModelID); + CModelInfo* const modelInfo = g_pGame->GetModelInfo(modelID); + if (!modelInfo) + throw std::invalid_argument(SString("Invalid model id %u", modelID)); + + char hourOn = 0, hourOff = 24; // If model is incompatible it returns these numbers(in order: 0, 24) so we dont confuse the user + modelInfo->GetTime(hourOn, hourOff); + return { hourOn, hourOff }; } int CLuaEngineDefs::EngineGetModelTextures(lua_State* luaVM) diff --git a/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.h b/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.h index 9214535f0c7..f7a3b920aba 100644 --- a/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.h +++ b/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.h @@ -11,6 +11,8 @@ #pragma once #include "CLuaDefs.h" +#include +#include class CLuaEngineDefs : public CLuaDefs { @@ -39,7 +41,7 @@ class CLuaEngineDefs : public CLuaDefs LUA_DECLARE(EngineReplaceVehiclePart); LUA_DECLARE(EngineGetModelLODDistance); LUA_DECLARE(EngineSetModelLODDistance); - LUA_DECLARE(EngineResetModelLODDistance); + static bool EngineResetModelLODDistance(const std::variant variantModelID); LUA_DECLARE(EngineSetAsynchronousLoading); LUA_DECLARE(EngineApplyShaderToWorldTexture); LUA_DECLARE(EngineRemoveShaderFromWorldTexture); @@ -47,8 +49,8 @@ class CLuaEngineDefs : public CLuaDefs LUA_DECLARE(EngineGetModelIDFromName); LUA_DECLARE(EngineGetModelTextureNames); LUA_DECLARE(EngineGetVisibleTextureNames); - LUA_DECLARE(EngineSetModelVisibleTime); - LUA_DECLARE(EngineGetModelVisibleTime); + static bool EngineSetModelVisibleTime(const std::variant variantModelID, short hourOn, short hourOff); + static std::tuple EngineGetModelVisibleTime(const std::variant variantModelID); LUA_DECLARE(EngineGetModelTextures); LUA_DECLARE(EngineSetSurfaceProperties); LUA_DECLARE(EngineGetSurfaceProperties);