Skip to content
Merged
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
5 changes: 5 additions & 0 deletions Client/game_sa/CGameSA.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -842,6 +842,11 @@ void CGameSA::ResetModelLodDistances()
CModelInfoSA::StaticResetLodDistances();
}

void CGameSA::ResetModelTimes()
{
CModelInfoSA::StaticResetModelTimes();
}

void CGameSA::ResetAlphaTransparencies()
{
CModelInfoSA::StaticResetAlphaTransparencies();
Expand Down
1 change: 1 addition & 0 deletions Client/game_sa/CGameSA.h
Original file line number Diff line number Diff line change
Expand Up @@ -420,6 +420,7 @@ class CGameSA : public CGame
void ResetModelLodDistances();
void ResetAlphaTransparencies();
void DisableVSync();
void ResetModelTimes();

void OnPedContextChange(CPed* pPedContext);
CPed* GetPedContext();
Expand Down
46 changes: 46 additions & 0 deletions Client/game_sa/CModelInfoSA.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ std::map<unsigned short, int> CModelInfo
std::map<DWORD, float> CModelInfoSA::ms_ModelDefaultLodDistanceMap;
std::map<DWORD, BYTE> CModelInfoSA::ms_ModelDefaultAlphaTransparencyMap;
std::unordered_map<std::uint32_t, std::map<eVehicleDummies, CVector>> CModelInfoSA::ms_ModelDefaultDummiesPosition;
std::map<CTimeInfoSAInterface*, CTimeInfoSAInterface*> CModelInfoSA::ms_ModelDefaultModelTimeInfo;
std::unordered_map<DWORD, unsigned short> CModelInfoSA::ms_OriginalObjectPropertiesGroups;
std::unordered_map<DWORD, std::pair<float, float>> CModelInfoSA::ms_VehicleModelDefaultWheelSizes;

Expand Down Expand Up @@ -564,6 +565,51 @@ float CModelInfoSA::GetLODDistance()
return 0.0f;
}

bool CModelInfoSA::SetTime(char cHourOn, char cHourOff)
{
m_pInterface = ppModelInfo[m_dwModelID];
if (!m_pInterface)
return false;

if (GetModelType() != MODEL_INFO_TYPE_TIME)
return false;

CTimeInfoSAInterface* pTime = &static_cast<CTimeModelInfoSAInterface*>(m_pInterface)->timeInfo;

if (!MapContains(ms_ModelDefaultModelTimeInfo, pTime))
MapSet(ms_ModelDefaultModelTimeInfo, pTime, new CTimeInfoSAInterface(pTime->m_nTimeOn, pTime->m_nTimeOff, pTime->m_wOtherTimeModel));

pTime->m_nTimeOn = cHourOn;
pTime->m_nTimeOff = cHourOff;
return true;
}

bool CModelInfoSA::GetTime(char& cHourOn, char& cHourOff)
{
m_pInterface = ppModelInfo[m_dwModelID];
if (!m_pInterface)
return false;

if (GetModelType() != MODEL_INFO_TYPE_TIME)
return false;

CTimeInfoSAInterface* pTime = &static_cast<CTimeModelInfoSAInterface*>(m_pInterface)->timeInfo;

cHourOn = pTime->m_nTimeOn;
cHourOff = pTime->m_nTimeOff;
return true;
}

void CModelInfoSA::StaticResetModelTimes()
{
for (auto const& x : ms_ModelDefaultModelTimeInfo)
{
x.first->m_nTimeOn = x.second->m_nTimeOn;
x.first->m_nTimeOff = x.second->m_nTimeOff;
}
ms_ModelDefaultModelTimeInfo.clear();
}

float CModelInfoSA::GetOriginalLODDistance()
{
// Return default LOD distance value (if doesn't exist, LOD distance hasn't been changed)
Expand Down
18 changes: 18 additions & 0 deletions Client/game_sa/CModelInfoSA.h
Original file line number Diff line number Diff line change
Expand Up @@ -219,6 +219,20 @@ class CBaseModelInfoSAInterface
// +772 = Anim file index
};

struct CTimeInfoSAInterface
{
CTimeInfoSAInterface(char timeOn, char timeOff, short OtherTimeModel) : m_nTimeOn(timeOn), m_nTimeOff(timeOff), m_wOtherTimeModel(OtherTimeModel){};
char m_nTimeOn;
char m_nTimeOff;
short m_wOtherTimeModel;
};

class CTimeModelInfoSAInterface : public CBaseModelInfoSAInterface
{
public:
CTimeInfoSAInterface timeInfo;
};

class CVehicleModelVisualInfoSAInterface // Not sure about this name. If somebody knows more, please change
{
public:
Expand Down Expand Up @@ -279,6 +293,7 @@ class CModelInfoSA : public CModelInfo
static std::map<DWORD, float> ms_ModelDefaultLodDistanceMap;
static std::map<DWORD, BYTE> ms_ModelDefaultAlphaTransparencyMap;
static std::unordered_map<std::uint32_t, std::map<eVehicleDummies, CVector>> ms_ModelDefaultDummiesPosition;
static std::map<CTimeInfoSAInterface*, CTimeInfoSAInterface*> ms_ModelDefaultModelTimeInfo;
static std::unordered_map<DWORD, unsigned short> ms_OriginalObjectPropertiesGroups;
static std::unordered_map<DWORD, std::pair<float, float>> ms_VehicleModelDefaultWheelSizes;
bool m_bAddedRefForCollision;
Expand Down Expand Up @@ -331,6 +346,9 @@ class CModelInfoSA : public CModelInfo
void RestreamIPL();
static void StaticFlushPendingRestreamIPL();
static void StaticSetHooks();
bool GetTime(char& cHourOn, char& cHourOff);
bool SetTime(char cHourOn, char cHourOff);
static void StaticResetModelTimes();

void SetAlphaTransparencyEnabled(BOOL bEnabled);
bool IsAlphaTransparencyEnabled();
Expand Down
1 change: 1 addition & 0 deletions Client/mods/deathmatch/logic/CClientGame.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3563,6 +3563,7 @@ void CClientGame::Event_OnIngame()

g_pGame->ResetModelLodDistances();
g_pGame->ResetAlphaTransparencies();
g_pGame->ResetModelTimes();

// Make sure we can access all areas
g_pGame->GetStats()->ModifyStat(CITIES_PASSED, 2.0);
Expand Down
38 changes: 38 additions & 0 deletions Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,8 @@ void CLuaEngineDefs::LoadFunctions()
{"engineGetModelIDFromName", EngineGetModelIDFromName},
{"engineGetModelTextureNames", EngineGetModelTextureNames},
{"engineGetVisibleTextureNames", EngineGetVisibleTextureNames},
{"engineSetModelVisibleTime", ArgumentParser<EngineSetModelVisibleTime>},
{"engineGetModelVisibleTime", ArgumentParser<EngineGetModelVisibleTime>},
{"engineGetModelTextures", EngineGetModelTextures},
{"engineGetSurfaceProperties", EngineGetSurfaceProperties},
{"engineSetSurfaceProperties", EngineSetSurfaceProperties},
Expand Down Expand Up @@ -72,13 +74,15 @@ void CLuaEngineDefs::AddClass(lua_State* luaVM)
lua_classfunction(luaVM, "setAsynchronousLoading", "engineSetAsynchronousLoading");
lua_classfunction(luaVM, "setModelLODDistance", "engineSetModelLODDistance");
lua_classfunction(luaVM, "resetModelLODDistance", "engineResetModelLODDistance");
lua_classfunction(luaVM, "setModelVisibleTime", "engineSetModelVisibleTime");

lua_classfunction(luaVM, "getVisibleTextureNames", "engineGetVisibleTextureNames");
lua_classfunction(luaVM, "getModelLODDistance", "engineGetModelLODDistance");
lua_classfunction(luaVM, "getModelTextureNames", "engineGetModelTextureNames");
lua_classfunction(luaVM, "getModelTextures", "engineGetModelTextures");
lua_classfunction(luaVM, "getModelIDFromName", "engineGetModelIDFromName");
lua_classfunction(luaVM, "getModelNameFromID", "engineGetModelNameFromID");
lua_classfunction(luaVM, "getModelVisibleTime", "engineGetModelVisibleTime");
lua_classfunction(luaVM, "getModelPhysicalPropertiesGroup", "engineGetModelPhysicalPropertiesGroup");
lua_classfunction(luaVM, "setModelPhysicalPropertiesGroup", "engineSetModelPhysicalPropertiesGroup");
lua_classfunction(luaVM, "restoreModelPhysicalPropertiesGroup", "engineRestoreModelPhysicalPropertiesGroup");
Expand Down Expand Up @@ -1098,6 +1102,40 @@ int CLuaEngineDefs::EngineGetVisibleTextureNames(lua_State* luaVM)
return 1;
}

bool CLuaEngineDefs::EngineSetModelVisibleTime(std::string strModelId, char cHourOn, char cHourOff)
{
ushort usModelID = CModelNames::ResolveModelID(strModelId);
CModelInfo* pModelInfo = g_pGame->GetModelInfo(usModelID);
if (pModelInfo)
{
if (cHourOn >= 0 && cHourOn <= 24 && cHourOff >= 0 && cHourOff <= 24)
{
return pModelInfo->SetTime(cHourOn, cHourOff);
}
}
return false;
}

std::variant<bool, std::tuple<char, char>> CLuaEngineDefs::EngineGetModelVisibleTime(std::string strModelId)
{
ushort usModelID = CModelNames::ResolveModelID(strModelId);
CModelInfo* pModelInfo = g_pGame->GetModelInfo(usModelID);
if (pModelInfo)
{
char cHourOn, cHourOff;
if (pModelInfo->GetTime(cHourOn, cHourOff))
{
return std::tuple(cHourOn, cHourOff);
}
else // Model is incompatible, don't let confuse user.
{
return std::tuple(0, 24);
}
}

return false;
}

int CLuaEngineDefs::EngineGetModelTextures(lua_State* luaVM)
{
// table engineGetModelTextures ( string/int modelName/modelID, string/table textureNames )
Expand Down
3 changes: 3 additions & 0 deletions Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.h
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,9 @@ class CLuaEngineDefs : public CLuaDefs
LUA_DECLARE(EngineGetObjectGroupPhysicalProperty)
LUA_DECLARE(EngineRestoreObjectGroupPhysicalProperties)
static bool CLuaEngineDefs::EngineRestreamWorld(lua_State* const luaVM);
static bool EngineSetModelVisibleTime(std::string strModelId, char cHourOn, char cHourOff);
static std::variant<bool, std::tuple<char, char>> EngineGetModelVisibleTime(std::string strModelId);

private:
static void AddEngineColClass(lua_State* luaVM);
static void AddEngineTxdClass(lua_State* luaVM);
Expand Down
1 change: 1 addition & 0 deletions Client/sdk/game/CGame.h
Original file line number Diff line number Diff line change
Expand Up @@ -239,6 +239,7 @@ class __declspec(novtable) CGame
virtual void ResetModelLodDistances() = 0;
virtual void ResetAlphaTransparencies() = 0;
virtual void DisableVSync() = 0;
virtual void ResetModelTimes() = 0;

virtual void OnPedContextChange(CPed* pPedContext) = 0;
virtual CPed* GetPedContext() = 0;
Expand Down
2 changes: 2 additions & 0 deletions Client/sdk/game/CModelInfo.h
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,8 @@ class CModelInfo
virtual float GetOriginalLODDistance() = 0;
virtual void SetLODDistance(float fDistance, bool bOverrideMaxDistance = false) = 0;
virtual void RestreamIPL() = 0;
virtual bool GetTime(char& hourOn, char& hourOff) = 0;
virtual bool SetTime(char hourOn, char hourOff) = 0;

virtual void ModelAddRef(EModelRequestType requestType, const char* szTag /* = NULL*/) = 0;
virtual void RemoveRef(bool bRemoveExtraGTARef = false) = 0;
Expand Down