Skip to content

Commit 5403912

Browse files
TheNormalnijStrixGcodenulls
authored
Fix engineSet/GetModelTime don't work in release (#1766)
* Revert "Revert "Add engineSet/GetModelTime (#752)" (#1588)" This reverts commit 0e03a42. * Fix engineSet/GetModelTime don't work in release * Update Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp * Use new parser * Moved and renamed TimeInfoSA * Revert "Moved and renamed TimeInfoSA" This reverts commit f147e4e. * code improvements * Tweak formatting in CModelInfoSA.cpp Co-authored-by: Nikita Obrekht <obrekht@gmail.com> Co-authored-by: saml1er <danishroar@gmail.com>
1 parent ed2abb3 commit 5403912

File tree

9 files changed

+115
-0
lines changed

9 files changed

+115
-0
lines changed

Client/game_sa/CGameSA.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -842,6 +842,11 @@ void CGameSA::ResetModelLodDistances()
842842
CModelInfoSA::StaticResetLodDistances();
843843
}
844844

845+
void CGameSA::ResetModelTimes()
846+
{
847+
CModelInfoSA::StaticResetModelTimes();
848+
}
849+
845850
void CGameSA::ResetAlphaTransparencies()
846851
{
847852
CModelInfoSA::StaticResetAlphaTransparencies();

Client/game_sa/CGameSA.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -420,6 +420,7 @@ class CGameSA : public CGame
420420
void ResetModelLodDistances();
421421
void ResetAlphaTransparencies();
422422
void DisableVSync();
423+
void ResetModelTimes();
423424

424425
void OnPedContextChange(CPed* pPedContext);
425426
CPed* GetPedContext();

Client/game_sa/CModelInfoSA.cpp

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ std::map<unsigned short, int> CModelInfo
2121
std::map<DWORD, float> CModelInfoSA::ms_ModelDefaultLodDistanceMap;
2222
std::map<DWORD, BYTE> CModelInfoSA::ms_ModelDefaultAlphaTransparencyMap;
2323
std::unordered_map<std::uint32_t, std::map<eVehicleDummies, CVector>> CModelInfoSA::ms_ModelDefaultDummiesPosition;
24+
std::map<CTimeInfoSAInterface*, CTimeInfoSAInterface*> CModelInfoSA::ms_ModelDefaultModelTimeInfo;
2425
std::unordered_map<DWORD, unsigned short> CModelInfoSA::ms_OriginalObjectPropertiesGroups;
2526
std::unordered_map<DWORD, std::pair<float, float>> CModelInfoSA::ms_VehicleModelDefaultWheelSizes;
2627

@@ -564,6 +565,51 @@ float CModelInfoSA::GetLODDistance()
564565
return 0.0f;
565566
}
566567

568+
bool CModelInfoSA::SetTime(char cHourOn, char cHourOff)
569+
{
570+
m_pInterface = ppModelInfo[m_dwModelID];
571+
if (!m_pInterface)
572+
return false;
573+
574+
if (GetModelType() != MODEL_INFO_TYPE_TIME)
575+
return false;
576+
577+
CTimeInfoSAInterface* pTime = &static_cast<CTimeModelInfoSAInterface*>(m_pInterface)->timeInfo;
578+
579+
if (!MapContains(ms_ModelDefaultModelTimeInfo, pTime))
580+
MapSet(ms_ModelDefaultModelTimeInfo, pTime, new CTimeInfoSAInterface(pTime->m_nTimeOn, pTime->m_nTimeOff, pTime->m_wOtherTimeModel));
581+
582+
pTime->m_nTimeOn = cHourOn;
583+
pTime->m_nTimeOff = cHourOff;
584+
return true;
585+
}
586+
587+
bool CModelInfoSA::GetTime(char& cHourOn, char& cHourOff)
588+
{
589+
m_pInterface = ppModelInfo[m_dwModelID];
590+
if (!m_pInterface)
591+
return false;
592+
593+
if (GetModelType() != MODEL_INFO_TYPE_TIME)
594+
return false;
595+
596+
CTimeInfoSAInterface* pTime = &static_cast<CTimeModelInfoSAInterface*>(m_pInterface)->timeInfo;
597+
598+
cHourOn = pTime->m_nTimeOn;
599+
cHourOff = pTime->m_nTimeOff;
600+
return true;
601+
}
602+
603+
void CModelInfoSA::StaticResetModelTimes()
604+
{
605+
for (auto const& x : ms_ModelDefaultModelTimeInfo)
606+
{
607+
x.first->m_nTimeOn = x.second->m_nTimeOn;
608+
x.first->m_nTimeOff = x.second->m_nTimeOff;
609+
}
610+
ms_ModelDefaultModelTimeInfo.clear();
611+
}
612+
567613
float CModelInfoSA::GetOriginalLODDistance()
568614
{
569615
// Return default LOD distance value (if doesn't exist, LOD distance hasn't been changed)

Client/game_sa/CModelInfoSA.h

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -219,6 +219,20 @@ class CBaseModelInfoSAInterface
219219
// +772 = Anim file index
220220
};
221221

222+
struct CTimeInfoSAInterface
223+
{
224+
CTimeInfoSAInterface(char timeOn, char timeOff, short OtherTimeModel) : m_nTimeOn(timeOn), m_nTimeOff(timeOff), m_wOtherTimeModel(OtherTimeModel){};
225+
char m_nTimeOn;
226+
char m_nTimeOff;
227+
short m_wOtherTimeModel;
228+
};
229+
230+
class CTimeModelInfoSAInterface : public CBaseModelInfoSAInterface
231+
{
232+
public:
233+
CTimeInfoSAInterface timeInfo;
234+
};
235+
222236
class CVehicleModelVisualInfoSAInterface // Not sure about this name. If somebody knows more, please change
223237
{
224238
public:
@@ -279,6 +293,7 @@ class CModelInfoSA : public CModelInfo
279293
static std::map<DWORD, float> ms_ModelDefaultLodDistanceMap;
280294
static std::map<DWORD, BYTE> ms_ModelDefaultAlphaTransparencyMap;
281295
static std::unordered_map<std::uint32_t, std::map<eVehicleDummies, CVector>> ms_ModelDefaultDummiesPosition;
296+
static std::map<CTimeInfoSAInterface*, CTimeInfoSAInterface*> ms_ModelDefaultModelTimeInfo;
282297
static std::unordered_map<DWORD, unsigned short> ms_OriginalObjectPropertiesGroups;
283298
static std::unordered_map<DWORD, std::pair<float, float>> ms_VehicleModelDefaultWheelSizes;
284299
bool m_bAddedRefForCollision;
@@ -331,6 +346,9 @@ class CModelInfoSA : public CModelInfo
331346
void RestreamIPL();
332347
static void StaticFlushPendingRestreamIPL();
333348
static void StaticSetHooks();
349+
bool GetTime(char& cHourOn, char& cHourOff);
350+
bool SetTime(char cHourOn, char cHourOff);
351+
static void StaticResetModelTimes();
334352

335353
void SetAlphaTransparencyEnabled(BOOL bEnabled);
336354
bool IsAlphaTransparencyEnabled();

Client/mods/deathmatch/logic/CClientGame.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3563,6 +3563,7 @@ void CClientGame::Event_OnIngame()
35633563

35643564
g_pGame->ResetModelLodDistances();
35653565
g_pGame->ResetAlphaTransparencies();
3566+
g_pGame->ResetModelTimes();
35663567

35673568
// Make sure we can access all areas
35683569
g_pGame->GetStats()->ModifyStat(CITIES_PASSED, 2.0);

Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@ void CLuaEngineDefs::LoadFunctions()
3838
{"engineGetModelIDFromName", EngineGetModelIDFromName},
3939
{"engineGetModelTextureNames", EngineGetModelTextureNames},
4040
{"engineGetVisibleTextureNames", EngineGetVisibleTextureNames},
41+
{"engineSetModelVisibleTime", ArgumentParser<EngineSetModelVisibleTime>},
42+
{"engineGetModelVisibleTime", ArgumentParser<EngineGetModelVisibleTime>},
4143
{"engineGetModelTextures", EngineGetModelTextures},
4244
{"engineGetSurfaceProperties", EngineGetSurfaceProperties},
4345
{"engineSetSurfaceProperties", EngineSetSurfaceProperties},
@@ -72,13 +74,15 @@ void CLuaEngineDefs::AddClass(lua_State* luaVM)
7274
lua_classfunction(luaVM, "setAsynchronousLoading", "engineSetAsynchronousLoading");
7375
lua_classfunction(luaVM, "setModelLODDistance", "engineSetModelLODDistance");
7476
lua_classfunction(luaVM, "resetModelLODDistance", "engineResetModelLODDistance");
77+
lua_classfunction(luaVM, "setModelVisibleTime", "engineSetModelVisibleTime");
7578

7679
lua_classfunction(luaVM, "getVisibleTextureNames", "engineGetVisibleTextureNames");
7780
lua_classfunction(luaVM, "getModelLODDistance", "engineGetModelLODDistance");
7881
lua_classfunction(luaVM, "getModelTextureNames", "engineGetModelTextureNames");
7982
lua_classfunction(luaVM, "getModelTextures", "engineGetModelTextures");
8083
lua_classfunction(luaVM, "getModelIDFromName", "engineGetModelIDFromName");
8184
lua_classfunction(luaVM, "getModelNameFromID", "engineGetModelNameFromID");
85+
lua_classfunction(luaVM, "getModelVisibleTime", "engineGetModelVisibleTime");
8286
lua_classfunction(luaVM, "getModelPhysicalPropertiesGroup", "engineGetModelPhysicalPropertiesGroup");
8387
lua_classfunction(luaVM, "setModelPhysicalPropertiesGroup", "engineSetModelPhysicalPropertiesGroup");
8488
lua_classfunction(luaVM, "restoreModelPhysicalPropertiesGroup", "engineRestoreModelPhysicalPropertiesGroup");
@@ -1098,6 +1102,40 @@ int CLuaEngineDefs::EngineGetVisibleTextureNames(lua_State* luaVM)
10981102
return 1;
10991103
}
11001104

1105+
bool CLuaEngineDefs::EngineSetModelVisibleTime(std::string strModelId, char cHourOn, char cHourOff)
1106+
{
1107+
ushort usModelID = CModelNames::ResolveModelID(strModelId);
1108+
CModelInfo* pModelInfo = g_pGame->GetModelInfo(usModelID);
1109+
if (pModelInfo)
1110+
{
1111+
if (cHourOn >= 0 && cHourOn <= 24 && cHourOff >= 0 && cHourOff <= 24)
1112+
{
1113+
return pModelInfo->SetTime(cHourOn, cHourOff);
1114+
}
1115+
}
1116+
return false;
1117+
}
1118+
1119+
std::variant<bool, std::tuple<char, char>> CLuaEngineDefs::EngineGetModelVisibleTime(std::string strModelId)
1120+
{
1121+
ushort usModelID = CModelNames::ResolveModelID(strModelId);
1122+
CModelInfo* pModelInfo = g_pGame->GetModelInfo(usModelID);
1123+
if (pModelInfo)
1124+
{
1125+
char cHourOn, cHourOff;
1126+
if (pModelInfo->GetTime(cHourOn, cHourOff))
1127+
{
1128+
return std::tuple(cHourOn, cHourOff);
1129+
}
1130+
else // Model is incompatible, don't let confuse user.
1131+
{
1132+
return std::tuple(0, 24);
1133+
}
1134+
}
1135+
1136+
return false;
1137+
}
1138+
11011139
int CLuaEngineDefs::EngineGetModelTextures(lua_State* luaVM)
11021140
{
11031141
// table engineGetModelTextures ( string/int modelName/modelID, string/table textureNames )

Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,9 @@ class CLuaEngineDefs : public CLuaDefs
5858
LUA_DECLARE(EngineGetObjectGroupPhysicalProperty)
5959
LUA_DECLARE(EngineRestoreObjectGroupPhysicalProperties)
6060
static bool CLuaEngineDefs::EngineRestreamWorld(lua_State* const luaVM);
61+
static bool EngineSetModelVisibleTime(std::string strModelId, char cHourOn, char cHourOff);
62+
static std::variant<bool, std::tuple<char, char>> EngineGetModelVisibleTime(std::string strModelId);
63+
6164
private:
6265
static void AddEngineColClass(lua_State* luaVM);
6366
static void AddEngineTxdClass(lua_State* luaVM);

Client/sdk/game/CGame.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -239,6 +239,7 @@ class __declspec(novtable) CGame
239239
virtual void ResetModelLodDistances() = 0;
240240
virtual void ResetAlphaTransparencies() = 0;
241241
virtual void DisableVSync() = 0;
242+
virtual void ResetModelTimes() = 0;
242243

243244
virtual void OnPedContextChange(CPed* pPedContext) = 0;
244245
virtual CPed* GetPedContext() = 0;

Client/sdk/game/CModelInfo.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,8 @@ class CModelInfo
129129
virtual float GetOriginalLODDistance() = 0;
130130
virtual void SetLODDistance(float fDistance, bool bOverrideMaxDistance = false) = 0;
131131
virtual void RestreamIPL() = 0;
132+
virtual bool GetTime(char& hourOn, char& hourOff) = 0;
133+
virtual bool SetTime(char hourOn, char hourOff) = 0;
132134

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

0 commit comments

Comments
 (0)