Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
42 commits
Select commit Hold shift + click to select a range
7b327e9
Allow change model flags
TheNormalnij Oct 14, 2020
89c1ef4
Fix typo
TheNormalnij Oct 26, 2020
3692da2
Fix typo
TheNormalnij Oct 26, 2020
1d8aea3
Fix engineResetModelFlags
TheNormalnij Oct 27, 2020
adef19c
Removed model name interface
TheNormalnij Oct 27, 2020
164321f
Merge remote-tracking branch 'origin/model_flags' into model_flags
TheNormalnij Oct 27, 2020
9747ac3
Changed interface
TheNormalnij Oct 27, 2020
454c562
Fix GetOriginalFlags
TheNormalnij Oct 27, 2020
77a5ec2
Fix optional argument
TheNormalnij Oct 27, 2020
f62aa61
Merge branch 'master' into model_flags
TheNormalnij Oct 28, 2020
5701245
Used new parser
TheNormalnij Oct 28, 2020
29040a5
Merge branch 'master' into model_flags
TheNormalnij Oct 30, 2020
0d6fca2
Fix build
TheNormalnij Oct 30, 2020
46d778d
Little defs refactor
TheNormalnij Nov 3, 2020
3f43221
Merge branch 'master' into model_flags
TheNormalnij Nov 3, 2020
9d0f75b
Reversed GTA SA flags interface
TheNormalnij Nov 5, 2020
ba36bd0
Added enums for model flags
TheNormalnij Nov 9, 2020
0918bdb
Fix build
TheNormalnij Nov 9, 2020
65ac371
Changed flag name
TheNormalnij Nov 9, 2020
bd11919
Don't allow change bIsColLoaded flag
TheNormalnij Nov 10, 2020
92709f3
Added EngineGetModelFlag and EngineSetModelFlag functions
TheNormalnij Nov 10, 2020
124b940
Merge remote-tracking branch 'upstream/master' into model_flags
TheNormalnij Nov 11, 2020
af02481
Fix API
TheNormalnij Nov 11, 2020
609feca
Fix missing "is_crane"
TheNormalnij Nov 11, 2020
fee73e8
Removed old unused code
TheNormalnij Nov 12, 2020
fdd6cdb
Fix grammar
TheNormalnij Nov 12, 2020
2e10c6a
Removed useless defs
TheNormalnij Nov 12, 2020
cbfe499
Little fix
TheNormalnij Nov 12, 2020
49abec6
Update Client/sdk/game/CModelInfo.h
TheNormalnij Nov 12, 2020
710b65e
Some fixes
TheNormalnij Nov 12, 2020
224d7ff
Merge branch 'master' into model_flags
Apr 12, 2021
5204e01
resolve conversions
Apr 12, 2021
e511868
Merge remote-tracking branch 'mta_home/master' into model_flags
Sep 25, 2021
114e030
Fix build
Sep 25, 2021
5d2fa30
Fix logical conflict
Sep 25, 2021
646285f
Merge branch 'master' into model_flags
patrikjuvonen Jan 1, 2023
ec5bb3f
Addendum to previous merge commit
patrikjuvonen Jan 1, 2023
dfd75ea
Merge branch 'master' into model_flags
patrikjuvonen Jan 1, 2023
949f1ce
Merge branch 'master' into model_flags
patrikjuvonen Apr 7, 2023
80558c2
Fix merge conflict
patrikjuvonen Apr 7, 2023
8057836
Merge branch 'master' into model_flags
patrikjuvonen Apr 7, 2023
b007054
Update CMultiplayerSA_CrashFixHacks.cpp
patrikjuvonen Apr 7, 2023
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 @@ -841,6 +841,11 @@ void CGameSA::ResetModelLodDistances()
CModelInfoSA::StaticResetLodDistances();
}

void CGameSA::ResetModelFlags()
{
CModelInfoSA::StaticResetFlags();
}

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 @@ -415,6 +415,7 @@ class CGameSA : public CGame
CWeaponStat* CreateWeaponStat(eWeaponType weaponType, eWeaponSkill weaponSkill);
void FlushPendingRestreamIPL();
void ResetModelLodDistances();
void ResetModelFlags();
void ResetAlphaTransparencies();
void DisableVSync();

Expand Down
71 changes: 59 additions & 12 deletions Client/game_sa/CModelInfoSA.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ CBaseModelInfoSAInterface** ppModelInfo = (CBaseModelInfoSAInterface**)ARRAY_Mod

std::map<unsigned short, int> CModelInfoSA::ms_RestreamTxdIDMap;
std::map<DWORD, float> CModelInfoSA::ms_ModelDefaultLodDistanceMap;
std::map<DWORD, unsigned short> CModelInfoSA::ms_ModelDefaultFlagsMap;
std::map<DWORD, BYTE> CModelInfoSA::ms_ModelDefaultAlphaTransparencyMap;
std::unordered_map<std::uint32_t, std::map<eVehicleDummies, CVector>> CModelInfoSA::ms_ModelDefaultDummiesPosition;
std::unordered_map<DWORD, unsigned short> CModelInfoSA::ms_OriginalObjectPropertiesGroups;
Expand Down Expand Up @@ -482,21 +483,67 @@ BOOL CModelInfoSA::DoIsLoaded()
return bLoaded;
}

BYTE CModelInfoSA::GetFlags()
unsigned short CModelInfoSA::GetFlags()
{
DWORD dwFunc = FUNC_GetModelFlags;
DWORD ModelID = m_dwModelID;
BYTE bFlags = 0;
_asm
{
push ModelID
call dwFunc
add esp, 4
mov bFlags, al
}
return bFlags;
m_pInterface = ppModelInfo[m_dwModelID];
if (m_pInterface)
return m_pInterface->usFlags;
return 0;
}

unsigned short CModelInfoSA::GetOriginalFlags()
{
if (MapContains(ms_ModelDefaultFlagsMap, m_dwModelID))
return MapGet(ms_ModelDefaultFlagsMap, m_dwModelID);

return 0;
}

void CModelInfoSA::SetFlags(unsigned int uiFlags)
{
m_pInterface = ppModelInfo[m_dwModelID];
if (!m_pInterface)
return;

// Save default value if not done yet
if (!MapContains(ms_ModelDefaultFlagsMap, m_dwModelID))
MapSet(ms_ModelDefaultFlagsMap, m_dwModelID, m_pInterface->usFlags);

m_pInterface->usFlags = 0xC0;
typedef char(__cdecl * Function_SetAtomicModelFlags)(CBaseModelInfoSAInterface * pInterface, unsigned int uiFlags);
Function_SetAtomicModelFlags setAtomicModelFlags = (Function_SetAtomicModelFlags)(FUNC_SetAtimicModelFlags);

setAtomicModelFlags(m_pInterface, uiFlags);
}

void CModelInfoSA::StaticResetFlags()
{
// Restore default values
for (std::map<DWORD, unsigned short>::const_iterator iter = ms_ModelDefaultFlagsMap.begin(); iter != ms_ModelDefaultFlagsMap.end(); ++iter)
{
CBaseModelInfoSAInterface* pInterface = ppModelInfo[iter->first];
if (pInterface)
pInterface->usFlags = iter->second;
}

ms_ModelDefaultFlagsMap.clear();
}

//BYTE CModelInfoSA::GetStreamFlags()
//{
// DWORD dwFunc = FUNC_GetModelFlags;
// DWORD ModelID = m_dwModelID;
// BYTE bFlags = 0;
// _asm
// {
// push ModelID
// call dwFunc
// add esp, 4
// mov bFlags, al
// }
// return bFlags;
//}

CBoundingBox* CModelInfoSA::GetBoundingBox()
{
DWORD dwFunc = FUNC_GetBoundingBox;
Expand Down
53 changes: 34 additions & 19 deletions Client/game_sa/CModelInfoSA.h
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,9 @@ class CPedModelInfoSAInterface;
#define ARRAY_ModelInfo 0xA9B0C8
#define CLASS_CText 0xC1B340
#define FUNC_CText_Get 0x6A0050
#define FUNC_GetModelFlags 0x4044E0
#define FUNC_SetBaseModelFlags 0x5B3AD0
#define FUNC_SetAtimicModelFlags 0x5B3B20
#define FUNC_GetModelStreamFlags 0x4044E0
#define FUNC_GetBoundingBox 0x4082F0

#define FUNC_RemoveRef 0x4C4BB0
Expand Down Expand Up @@ -153,23 +155,31 @@ class CBaseModelInfoSAInterface
unsigned short usDynamicIndex : 16; // +16

// Flags used by CBaseModelInfo
unsigned char bHasBeenPreRendered : 1; // +18
unsigned char bAlphaTransparency : 1;
unsigned char bIsLod : 1;
unsigned char bDontWriteZBuffer : 1;
unsigned char bDontCastShadowsOn : 1;
unsigned char bDrawAdditive : 1;
unsigned char bDrawLast : 1;
unsigned char bDoWeOwnTheColModel : 1;

unsigned char dwUnknownFlag25 : 1; // +19
unsigned char dwUnknownFlag26 : 1;
unsigned char dwUnknownFlag27 : 1;
unsigned char bSwaysInWind : 1;
unsigned char bCollisionWasStreamedWithModel : 1; // CClumpModelInfo::SetCollisionWasStreamedWithModel(unsigned int)
unsigned char bDontCollideWithFlyer : 1; // CAtomicModelInfo::SetDontCollideWithFlyer(unsigned int)
unsigned char bHasComplexHierarchy : 1; // CClumpModelInfo::SetHasComplexHierarchy(unsigned int)
unsigned char bWetRoadReflection : 1; // CAtomicModelInfo::SetWetRoadReflection(unsigned int)
union
{
struct
{
unsigned short bHasBeenPreRendered : 1; // +18
unsigned short bAlphaTransparency : 1;
unsigned short bIsLod : 1;
unsigned short bDontWriteZBuffer : 1;
unsigned short bDontCastShadowsOn : 1;
unsigned short bDrawAdditive : 1;
unsigned short bDrawLast : 1;
unsigned short bDoWeOwnTheColModel : 1;

unsigned short dwUnknownFlag25 : 1; // +19
unsigned short dwUnknownFlag26 : 1;
unsigned short dwUnknownFlag27 : 1;
unsigned short bSwaysInWind : 1;
unsigned short bCollisionWasStreamedWithModel : 1; // CClumpModelInfo::SetCollisionWasStreamedWithModel(unsigned int)
unsigned short bDontCollideWithFlyer : 1; // CAtomicModelInfo::SetDontCollideWithFlyer(unsigned int)
unsigned short bHasComplexHierarchy : 1; // CClumpModelInfo::SetHasComplexHierarchy(unsigned int)
unsigned short bWetRoadReflection : 1; // CAtomicModelInfo::SetWetRoadReflection(unsigned int)
};

unsigned short usFlags;
};

CColModelSAInterface* pColModel; // +20 CColModel: public CBoundingBox

Expand Down Expand Up @@ -218,6 +228,7 @@ class CBaseModelInfoSAInterface
// +762 = Array of WORD containing something relative to paintjobs
// +772 = Anim file index
};
static_assert(sizeof(CBaseModelInfoSAInterface) == 0x20, "Invalid size for CBaseModelInfoSAInterface");

class CVehicleModelVisualInfoSAInterface // Not sure about this name. If somebody knows more, please change
{
Expand Down Expand Up @@ -277,6 +288,7 @@ class CModelInfoSA : public CModelInfo
RpClump* m_pCustomClump;
static std::map<unsigned short, int> ms_RestreamTxdIDMap;
static std::map<DWORD, float> ms_ModelDefaultLodDistanceMap;
static std::map<DWORD, unsigned short> ms_ModelDefaultFlagsMap;
static std::map<DWORD, BYTE> ms_ModelDefaultAlphaTransparencyMap;
static std::unordered_map<std::uint32_t, std::map<eVehicleDummies, CVector>> ms_ModelDefaultDummiesPosition;
static std::unordered_map<DWORD, unsigned short> ms_OriginalObjectPropertiesGroups;
Expand Down Expand Up @@ -318,7 +330,10 @@ class CModelInfoSA : public CModelInfo
BYTE GetLevelFromPosition(CVector* vecPosition);
BOOL IsLoaded();
BOOL DoIsLoaded();
BYTE GetFlags();
unsigned short GetFlags();
unsigned short GetOriginalFlags();
void SetFlags(unsigned int uiFlags);
static void StaticResetFlags();
CBoundingBox* GetBoundingBox();
bool IsValid();
float GetDistanceFromCentreOfMassToBaseOfModel();
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 @@ -3559,6 +3559,7 @@ void CClientGame::Event_OnIngame()
g_pGame->GetWorld()->SetOcclusionsEnabled(true);

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

// Make sure we can access all areas
Expand Down
98 changes: 97 additions & 1 deletion Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,10 @@ void CLuaEngineDefs::LoadFunctions()
{"engineRestoreModelPhysicalPropertiesGroup", EngineRestoreModelPhysicalPropertiesGroup},
{"engineSetObjectGroupPhysicalProperty", EngineSetObjectGroupPhysicalProperty},
{"engineGetObjectGroupPhysicalProperty", EngineGetObjectGroupPhysicalProperty},
{"engineRestoreObjectGroupPhysicalProperties", EngineRestoreObjectGroupPhysicalProperties}
{"engineRestoreObjectGroupPhysicalProperties", EngineRestoreObjectGroupPhysicalProperties},
{"engineGetModelFlags", EngineGetModelFlags},
{"engineSetModelFlags", EngineSetModelFlags},
{"engineResetModelFlags", EngineResetModelFlags},

// CLuaCFunctions::AddFunction ( "engineReplaceMatchingAtomics", EngineReplaceMatchingAtomics );
// CLuaCFunctions::AddFunction ( "engineReplaceWheelAtomics", EngineReplaceWheelAtomics );
Expand Down Expand Up @@ -84,6 +87,10 @@ void CLuaEngineDefs::AddClass(lua_State* luaVM)
lua_classfunction(luaVM, "getObjectGroupPhysicalProperty", "engineGetObjectGroupPhysicalProperty");
lua_classfunction(luaVM, "restoreObjectGroupPhysicalProperties", "engineRestoreObjectGroupPhysicalProperties");

lua_classfunction(luaVM, "setModelFlags", "engineSetModelFlags");
lua_classfunction(luaVM, "resetModelFlags", "engineResetModelFlags");
lua_classfunction(luaVM, "getModelFlags", "engineGetModelFlags");

lua_registerstaticclass(luaVM, "Engine");

AddEngineColClass(luaVM);
Expand Down Expand Up @@ -1969,3 +1976,92 @@ int CLuaEngineDefs::EngineRestoreObjectGroupPhysicalProperties(lua_State* luaVM)
lua_pushboolean(luaVM, true);
return 1;
}

int CLuaEngineDefs::EngineGetModelFlags(lua_State* luaVM)
{
// float engineGetModelFlags ( int/string modelID )
SString strModelId;
CScriptArgReader argStream(luaVM);
argStream.ReadString(strModelId);

if (!argStream.HasErrors())
{
ushort usModelID = CModelNames::ResolveModelID(strModelId);
if (usModelID < 20000)
{
CModelInfo* pModelInfo = g_pGame->GetModelInfo(usModelID);
if (pModelInfo)
{
lua_pushnumber(luaVM, pModelInfo->GetFlags());
return 1;
}
}
else
argStream.SetCustomError(SString("Expected a valid model name or ID in range [0-19999] at argument 1, got \"%s\"", *strModelId));
}
if (argStream.HasErrors())
m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage());

// Failed
lua_pushboolean(luaVM, false);
return 1;
}

int CLuaEngineDefs::EngineSetModelFlags(lua_State* luaVM)
{
// bool engineSetModelFlags ( int/string modelID, int flags )
SString strModelId;
unsigned int uiFlags;
CScriptArgReader argStream(luaVM);
argStream.ReadString(strModelId);
argStream.ReadNumber(uiFlags);

if (!argStream.HasErrors())
{
ushort usModelID = CModelNames::ResolveModelID(strModelId);
if (usModelID < 20000)
{
CModelInfo* pModelInfo = g_pGame->GetModelInfo(usModelID);
if (pModelInfo)
{
pModelInfo->SetFlags(uiFlags);
lua_pushboolean(luaVM, true);
return 1;
}
}
else
argStream.SetCustomError(SString("Expected a valid model name or ID in range [0-19999] at argument 1, got \"%s\"", *strModelId));
}
if (argStream.HasErrors())
m_pScriptDebugging->LogCustom(luaVM, argStream.GetFullErrorMessage());

lua_pushboolean(luaVM, false);
return 1;
}

int CLuaEngineDefs::EngineResetModelFlags(lua_State* luaVM)
{
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 uiCurrentFlags = pModelInfo->GetFlags();
float uiOriginalFlags = pModelInfo->GetOriginalFlags();
if (uiOriginalFlags != uiCurrentFlags)
{
pModelInfo->SetLODDistance(uiOriginalFlags, true);
lua_pushboolean(luaVM, true);
return 1;
}
}

lua_pushboolean(luaVM, false);
return 1;
}
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 @@ -57,6 +57,9 @@ class CLuaEngineDefs : public CLuaDefs
LUA_DECLARE(EngineSetObjectGroupPhysicalProperty)
LUA_DECLARE(EngineGetObjectGroupPhysicalProperty)
LUA_DECLARE(EngineRestoreObjectGroupPhysicalProperties)
LUA_DECLARE(EngineGetModelFlags);
LUA_DECLARE(EngineSetModelFlags);
LUA_DECLARE(EngineResetModelFlags);

private:
static void AddEngineColClass(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 @@ -237,6 +237,7 @@ class __declspec(novtable) CGame
virtual bool HasCreditScreenFadedOut() = 0;
virtual void FlushPendingRestreamIPL() = 0;
virtual void ResetModelLodDistances() = 0;
virtual void ResetModelFlags() = 0;
virtual void ResetAlphaTransparencies() = 0;
virtual void DisableVSync() = 0;

Expand Down
4 changes: 3 additions & 1 deletion Client/sdk/game/CModelInfo.h
Original file line number Diff line number Diff line change
Expand Up @@ -121,7 +121,9 @@ class CModelInfo
virtual VOID Request(EModelRequestType requestType, const char* szTag /* = NULL*/) = 0;
virtual BYTE GetLevelFromPosition(CVector* vecPosition) = 0;
virtual BOOL IsLoaded() = 0;
virtual BYTE GetFlags() = 0;
virtual unsigned short GetFlags() = 0;
virtual unsigned short GetOriginalFlags() = 0;
virtual void SetFlags(unsigned int uiFlags) = 0;
virtual CBoundingBox* GetBoundingBox() = 0;
virtual bool IsValid() = 0;
virtual unsigned short GetTextureDictionaryID() = 0;
Expand Down