Skip to content

Commit 429c0b7

Browse files
author
CrosRoad95
authored
Add engineSet/GetModelTime (#752)
1 parent 865f4fd commit 429c0b7

File tree

10 files changed

+150
-6
lines changed

10 files changed

+150
-6
lines changed

Client/game_sa/CGameSA.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -836,6 +836,11 @@ void CGameSA::ResetModelLodDistances()
836836
CModelInfoSA::StaticResetLodDistances();
837837
}
838838

839+
void CGameSA::ResetModelTimes()
840+
{
841+
CModelInfoSA::StaticResetModelTimes();
842+
}
843+
839844
void CGameSA::ResetAlphaTransparencies()
840845
{
841846
CModelInfoSA::StaticResetAlphaTransparencies();

Client/game_sa/CGameSA.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -417,6 +417,7 @@ class CGameSA : public CGame
417417
void ResetModelLodDistances();
418418
void ResetAlphaTransparencies();
419419
void DisableVSync();
420+
void ResetModelTimes();
420421

421422
void OnPedContextChange(CPed* pPedContext);
422423
CPed* GetPedContext();

Client/game_sa/CModelInfoSA.cpp

Lines changed: 47 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ std::map<unsigned short, int>
2020
std::map<DWORD, float> CModelInfoSA::ms_ModelDefaultLodDistanceMap;
2121
std::map<DWORD, BYTE> CModelInfoSA::ms_ModelDefaultAlphaTransparencyMap;
2222
std::unordered_map<CVehicleModelInfoSAInterface*, std::map<eVehicleDummies, CVector>> CModelInfoSA::ms_ModelDefaultDummiesPosition;
23+
std::map<TimeInfo*, TimeInfo*> CModelInfoSA::ms_ModelDefaultModelTimeInfo;
2324
std::unordered_map<DWORD, unsigned short> CModelInfoSA::ms_OriginalObjectPropertiesGroups;
2425

2526
CModelInfoSA::CModelInfoSA()
@@ -562,6 +563,51 @@ float CModelInfoSA::GetLODDistance()
562563
return 0.0f;
563564
}
564565

566+
bool CModelInfoSA::SetTime(char cHourOn, char cHourOff)
567+
{
568+
m_pInterface = ppModelInfo[m_dwModelID];
569+
if (!m_pInterface)
570+
return false;
571+
572+
TimeInfo* pTime = ((TimeInfo*(*)(void))m_pInterface->VFTBL->GetTimeInfo)();
573+
if (!pTime)
574+
return false;
575+
576+
if (!MapContains(ms_ModelDefaultModelTimeInfo, pTime))
577+
MapSet(ms_ModelDefaultModelTimeInfo, pTime, new TimeInfo(pTime->m_nTimeOn, pTime->m_nTimeOff, pTime->m_wOtherTimeModel));
578+
579+
pTime->m_nTimeOn = cHourOn;
580+
pTime->m_nTimeOff = cHourOff;
581+
return true;
582+
}
583+
584+
bool CModelInfoSA::GetTime(char& cHourOn, char& cHourOff)
585+
{
586+
m_pInterface = ppModelInfo[m_dwModelID];
587+
if (!m_pInterface)
588+
return false;
589+
590+
TimeInfo* time = ((TimeInfo*(*)(void))m_pInterface->VFTBL->GetTimeInfo)();
591+
if (!time)
592+
return false;
593+
594+
cHourOn = time->m_nTimeOn;
595+
cHourOff = time->m_nTimeOff;
596+
return true;
597+
}
598+
599+
void CModelInfoSA::StaticResetModelTimes()
600+
{
601+
// Restore default values
602+
for (std::map<TimeInfo*, TimeInfo*>::const_iterator iter = ms_ModelDefaultModelTimeInfo.begin(); iter != ms_ModelDefaultModelTimeInfo.end(); ++iter)
603+
{
604+
iter->first->m_nTimeOn = iter->second->m_nTimeOn;
605+
iter->first->m_nTimeOff = iter->second->m_nTimeOff;
606+
}
607+
608+
ms_ModelDefaultModelTimeInfo.clear();
609+
}
610+
565611
float CModelInfoSA::GetOriginalLODDistance()
566612
{
567613
// Return default LOD distance value (if doesn't exist, LOD distance hasn't been changed)
@@ -1440,7 +1486,7 @@ bool CModelInfoSA::IsTowableBy(CModelInfo* towingModel)
14401486

14411487
const bool isTowTruck = towingModel->GetModel() == 525;
14421488
const bool isTractor = towingModel->GetModel() == 531;
1443-
1489+
14441490
if (IsTrain() || towingModel->IsTrain())
14451491
{
14461492
// A train is never towing other vehicles. Trains are linked by other means

Client/game_sa/CModelInfoSA.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -268,6 +268,7 @@ class CModelInfoSA : public CModelInfo
268268
static std::map<DWORD, float> ms_ModelDefaultLodDistanceMap;
269269
static std::map<DWORD, BYTE> ms_ModelDefaultAlphaTransparencyMap;
270270
static std::unordered_map<CVehicleModelInfoSAInterface*, std::map<eVehicleDummies, CVector>> ms_ModelDefaultDummiesPosition;
271+
static std::map<TimeInfo*, TimeInfo*> ms_ModelDefaultModelTimeInfo;
271272
static std::unordered_map<DWORD, unsigned short> ms_OriginalObjectPropertiesGroups;
272273
bool m_bAddedRefForCollision;
273274
SVehicleSupportedUpgrades m_ModelSupportedUpgrades;
@@ -319,6 +320,9 @@ class CModelInfoSA : public CModelInfo
319320
void RestreamIPL();
320321
static void StaticFlushPendingRestreamIPL();
321322
static void StaticSetHooks();
323+
bool GetTime(char& cHourOn, char& cHourOff);
324+
bool SetTime(char cHourOn, char cHourOff);
325+
static void StaticResetModelTimes();
322326

323327
void SetAlphaTransparencyEnabled(BOOL bEnabled);
324328
bool IsAlphaTransparencyEnabled();

Client/mods/deathmatch/logic/CClientGame.cpp

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

35553555
g_pGame->ResetModelLodDistances();
35563556
g_pGame->ResetAlphaTransparencies();
3557+
g_pGame->ResetModelTimes();
35573558

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

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

Lines changed: 80 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@ void CLuaEngineDefs::LoadFunctions()
3737
{"engineGetModelIDFromName", EngineGetModelIDFromName},
3838
{"engineGetModelTextureNames", EngineGetModelTextureNames},
3939
{"engineGetVisibleTextureNames", EngineGetVisibleTextureNames},
40+
{"engineSetModelVisibleTime", EngineSetModelVisibleTime},
41+
{"engineGetModelVisibleTime", EngineGetModelVisibleTime},
4042
{"engineGetModelTextures", EngineGetModelTextures},
4143
{"engineGetSurfaceProperties", EngineGetSurfaceProperties},
4244
{"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");
@@ -231,7 +235,7 @@ int CLuaEngineDefs::EngineLoadDFF(lua_State* luaVM)
231235
}
232236

233237
SString filePath;
234-
238+
235239
if (bIsRawData || CResourceManager::ParseResourcePathInput(input, pResource, &filePath))
236240
{
237241
// Grab the resource root entity
@@ -1100,6 +1104,77 @@ int CLuaEngineDefs::EngineGetVisibleTextureNames(lua_State* luaVM)
11001104
return 1;
11011105
}
11021106

1107+
int CLuaEngineDefs::EngineSetModelVisibleTime(lua_State* luaVM)
1108+
{
1109+
// bool engineSetModelVisibleTime ( int/string modelID, int hourOn, int hourOff )
1110+
SString strModelId;
1111+
char cHourOn,cHourOff;
1112+
CScriptArgReader argStream(luaVM);
1113+
argStream.ReadString(strModelId);
1114+
argStream.ReadNumber(cHourOn);
1115+
argStream.ReadNumber(cHourOff);
1116+
1117+
if (!argStream.HasErrors())
1118+
{
1119+
ushort usModelID = CModelNames::ResolveModelID(strModelId);
1120+
CModelInfo* pModelInfo = g_pGame->GetModelInfo(usModelID);
1121+
if (pModelInfo)
1122+
{
1123+
if (cHourOn > cHourOff)
1124+
std::swap(cHourOn, cHourOff);
1125+
1126+
if (cHourOn >= 0 && cHourOn <= 24 && cHourOff >= 0 && cHourOff <= 24)
1127+
{
1128+
lua_pushboolean(luaVM, pModelInfo->SetTime(cHourOn, cHourOff));
1129+
return 1;
1130+
}
1131+
}
1132+
}
1133+
else
1134+
luaL_error(luaVM, argStream.GetFullErrorMessage());
1135+
1136+
// Failed
1137+
lua_pushboolean(luaVM, false);
1138+
return 1;
1139+
}
1140+
1141+
int CLuaEngineDefs::EngineGetModelVisibleTime(lua_State* luaVM)
1142+
{
1143+
// int, int engineGetModelVisibleTime ( int/string modelID )
1144+
SString strModelId;
1145+
1146+
CScriptArgReader argStream(luaVM);
1147+
argStream.ReadString(strModelId);
1148+
1149+
if (!argStream.HasErrors())
1150+
{
1151+
ushort usModelID = CModelNames::ResolveModelID(strModelId);
1152+
CModelInfo* pModelInfo = g_pGame->GetModelInfo(usModelID);
1153+
if (pModelInfo)
1154+
{
1155+
char cHourOn, cHourOff;
1156+
if (pModelInfo->GetTime(cHourOn, cHourOff))
1157+
{
1158+
lua_pushnumber(luaVM, cHourOn);
1159+
lua_pushnumber(luaVM, cHourOff);
1160+
return 2;
1161+
}
1162+
else // Model is incompatible, don't let confuse user.
1163+
{
1164+
lua_pushnumber(luaVM, 0);
1165+
lua_pushnumber(luaVM, 24);
1166+
return 2;
1167+
}
1168+
}
1169+
}
1170+
else
1171+
luaL_error(luaVM, argStream.GetFullErrorMessage());
1172+
1173+
// Failed
1174+
lua_pushboolean(luaVM, false);
1175+
return 1;
1176+
}
1177+
11031178
int CLuaEngineDefs::EngineGetModelTextures(lua_State* luaVM)
11041179
{
11051180
// table engineGetModelTextures ( string/int modelName/modelID, string/table textureNames )
@@ -1568,7 +1643,7 @@ int CLuaEngineDefs::EngineGetModelPhysicalPropertiesGroup(lua_State* luaVM)
15681643
}
15691644
argStream.SetCustomError("Expected valid model ID at argument 1");
15701645
}
1571-
1646+
15721647
return luaL_error(luaVM, argStream.GetFullErrorMessage());
15731648
}
15741649

@@ -1605,7 +1680,7 @@ int CLuaEngineDefs::EngineSetModelPhysicalPropertiesGroup(lua_State* luaVM)
16051680
}
16061681
argStream.SetCustomError("Expected valid model ID at argument 1");
16071682
}
1608-
1683+
16091684
return luaL_error(luaVM, argStream.GetFullErrorMessage());
16101685
}
16111686

@@ -1634,7 +1709,7 @@ int CLuaEngineDefs::EngineRestoreModelPhysicalPropertiesGroup(lua_State* luaVM)
16341709
}
16351710
argStream.SetCustomError("Expected valid model ID at argument 1");
16361711
}
1637-
1712+
16381713
return luaL_error(luaVM, argStream.GetFullErrorMessage());
16391714
}
16401715

@@ -1818,7 +1893,7 @@ int CLuaEngineDefs::EngineSetObjectGroupPhysicalProperty(lua_State* luaVM)
18181893
}
18191894
}
18201895
}
1821-
1896+
18221897
return luaL_error(luaVM, argStream.GetFullErrorMessage());
18231898
}
18241899

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,8 @@ class CLuaEngineDefs : public CLuaDefs
4747
LUA_DECLARE(EngineGetModelIDFromName);
4848
LUA_DECLARE(EngineGetModelTextureNames);
4949
LUA_DECLARE(EngineGetVisibleTextureNames);
50+
LUA_DECLARE(EngineSetModelVisibleTime);
51+
LUA_DECLARE(EngineGetModelVisibleTime);
5052
LUA_DECLARE(EngineGetModelTextures);
5153
LUA_DECLARE(EngineSetSurfaceProperties);
5254
LUA_DECLARE(EngineGetSurfaceProperties);

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;

Client/sdk/game/RenderWare.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -424,3 +424,10 @@ struct RwError
424424
{
425425
int err1, err2;
426426
};
427+
428+
struct TimeInfo {
429+
TimeInfo(char timeOn, char timeOff, short OtherTimeModel) : m_nTimeOn(timeOn), m_nTimeOff(timeOff), m_wOtherTimeModel(OtherTimeModel) {};
430+
char m_nTimeOn;
431+
char m_nTimeOff;
432+
short m_wOtherTimeModel;
433+
};

0 commit comments

Comments
 (0)