Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions Client/mods/deathmatch/logic/CStaticFunctionDefinitions.h
Original file line number Diff line number Diff line change
Expand Up @@ -634,6 +634,12 @@ class CStaticFunctionDefinitions
static bool ResetAllSurfaceInfo();
static bool ResetSurfaceInfo(short sSurfaceID);

static inline unsigned short ResolveModelID(const std::variant<std::string, unsigned short>& variant)
{
if (std::holds_alternative<unsigned short>(variant))
return std::get<unsigned short>(variant);
return CModelNames::ResolveModelID(std::get<std::string>(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);
Expand Down
127 changes: 40 additions & 87 deletions Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
*****************************************************************************/

#include "StdInc.h"
#include <lua/CLuaFunctionParser.h>

void CLuaEngineDefs::LoadFunctions()
{
Expand All @@ -29,16 +30,16 @@ void CLuaEngineDefs::LoadFunctions()
{"engineRequestModel", EngineRequestModel},
{"engineGetModelLODDistance", EngineGetModelLODDistance},
{"engineSetModelLODDistance", EngineSetModelLODDistance},
{"engineResetModelLODDistance", EngineResetModelLODDistance},
{"engineResetModelLODDistance", ArgumentParser<EngineResetModelLODDistance>},
{"engineSetAsynchronousLoading", EngineSetAsynchronousLoading},
{"engineApplyShaderToWorldTexture", EngineApplyShaderToWorldTexture},
{"engineRemoveShaderFromWorldTexture", EngineRemoveShaderFromWorldTexture},
{"engineGetModelNameFromID", EngineGetModelNameFromID},
{"engineGetModelIDFromName", EngineGetModelIDFromName},
{"engineGetModelTextureNames", EngineGetModelTextureNames},
{"engineGetVisibleTextureNames", EngineGetVisibleTextureNames},
{"engineSetModelVisibleTime", EngineSetModelVisibleTime},
{"engineGetModelVisibleTime", EngineGetModelVisibleTime},
{"engineSetModelVisibleTime", ArgumentParser<EngineSetModelVisibleTime>},
{"engineGetModelVisibleTime", ArgumentParser<EngineGetModelVisibleTime>},
{"engineGetModelTextures", EngineGetModelTextures},
{"engineGetSurfaceProperties", EngineGetSurfaceProperties},
{"engineSetSurfaceProperties", EngineSetSurfaceProperties},
Expand Down Expand Up @@ -772,31 +773,20 @@ int CLuaEngineDefs::EngineSetModelLODDistance(lua_State* luaVM)
return 1;
}

int CLuaEngineDefs::EngineResetModelLODDistance(lua_State* luaVM)
bool CLuaEngineDefs::EngineResetModelLODDistance(const std::variant<std::string, unsigned short> 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)
Expand Down Expand Up @@ -1104,72 +1094,35 @@ int CLuaEngineDefs::EngineGetVisibleTextureNames(lua_State* luaVM)
return 1;
}

int CLuaEngineDefs::EngineSetModelVisibleTime(lua_State* luaVM)
bool CLuaEngineDefs::EngineSetModelVisibleTime(const std::variant<std::string, unsigned short> 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<char, char> CLuaEngineDefs::EngineGetModelVisibleTime(const std::variant<std::string, unsigned short> 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)
Expand Down
8 changes: 5 additions & 3 deletions Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@

#pragma once
#include "CLuaDefs.h"
#include <optional>
#include <variant>

class CLuaEngineDefs : public CLuaDefs
{
Expand Down Expand Up @@ -39,16 +41,16 @@ class CLuaEngineDefs : public CLuaDefs
LUA_DECLARE(EngineReplaceVehiclePart);
LUA_DECLARE(EngineGetModelLODDistance);
LUA_DECLARE(EngineSetModelLODDistance);
LUA_DECLARE(EngineResetModelLODDistance);
static bool EngineResetModelLODDistance(const std::variant<std::string, unsigned short> variantModelID);
LUA_DECLARE(EngineSetAsynchronousLoading);
LUA_DECLARE(EngineApplyShaderToWorldTexture);
LUA_DECLARE(EngineRemoveShaderFromWorldTexture);
LUA_DECLARE(EngineGetModelNameFromID);
LUA_DECLARE(EngineGetModelIDFromName);
LUA_DECLARE(EngineGetModelTextureNames);
LUA_DECLARE(EngineGetVisibleTextureNames);
LUA_DECLARE(EngineSetModelVisibleTime);
LUA_DECLARE(EngineGetModelVisibleTime);
static bool EngineSetModelVisibleTime(const std::variant<std::string, unsigned short> variantModelID, short hourOn, short hourOff);
static std::tuple<char, char> EngineGetModelVisibleTime(const std::variant<std::string, unsigned short> variantModelID);
LUA_DECLARE(EngineGetModelTextures);
LUA_DECLARE(EngineSetSurfaceProperties);
LUA_DECLARE(EngineGetSurfaceProperties);
Expand Down