Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 34d4eed

Browse files
Neproifyqaisjp
authored andcommitted
Add dynamic ped ID allocating FOR TESTING (#151)
Thank you very much to these authors: @lopezloo, @Neproify, @ArranTuna * Added dynamic ped ID allocating(based on lopezloo pull request) * Don't add model to manager twice, use SString == operator, not stricmp. * Deallocate models that were allocated by resource that is unloading * Just some minor code changes. * Revert changes to files that break git diff * Reapply changes to files that broke git diff * Fix formatting * Fix formatting (2) * Fix formatting (3) * Replace NULL with nullptr * Use lt not lte for MAX_MODEL_ID * Fix model ID check
1 parent 9740887 commit 34d4eed

19 files changed

+375
-30
lines changed

‎Client/core/CModelCacheManager.h‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/*****************************************************************************
22
*
3-
* PROJECT: Multi Theft Auto v1.0
3+
* PROJECT: Multi Theft Auto
44
* LICENSE: See LICENSE in the top level directory
55
*
66
* Multi Theft Auto is available from http://www.multitheftauto.com/

‎Client/game_sa/CGameSA.cpp‎

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -294,24 +294,18 @@ bool CGameSA::IsInForeground()
294294
return *VAR_IsForegroundWindow;
295295
}
296296

297-
CModelInfo* CGameSA::GetModelInfo(DWORD dwModelID)
297+
CModelInfo* CGameSA::GetModelInfo(DWORD dwModelID, bool bCanBeInvalid)
298298
{
299-
DEBUG_TRACE("CModelInfo * CGameSA::GetModelInfo(DWORD dwModelID)");
299+
DEBUG_TRACE("CModelInfo * CGameSA::GetModelInfo(DWORD dwModelID, bool bCanBeInvalid)");
300300
if (dwModelID < MODELINFO_MAX)
301301
{
302-
if (ModelInfo[dwModelID].IsValid())
302+
if (ModelInfo[dwModelID].IsValid() || bCanBeInvalid)
303303
{
304304
return &ModelInfo[dwModelID];
305305
}
306-
else
307-
{
308-
return NULL;
309-
}
310-
}
311-
else
312-
{
313-
return NULL;
306+
return nullptr;
314307
}
308+
return nullptr;
315309
}
316310

317311
/**

‎Client/game_sa/CGameSA.h‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -312,7 +312,7 @@ class CGameSA : public CGame
312312
CFxManagerSA* GetFxManagerSA() { return m_pFxManager; }
313313

314314
CWeaponInfo* GetWeaponInfo(eWeaponType weapon, eWeaponSkill skill = WEAPONSKILL_STD);
315-
CModelInfo* GetModelInfo(DWORD dwModelID);
315+
CModelInfo* GetModelInfo(DWORD dwModelID, bool bCanBeInvalid = false);
316316

317317
DWORD GetSystemTime()
318318
{

‎Client/game_sa/CModelInfoSA.cpp‎

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -250,10 +250,7 @@ BOOL CModelInfoSA::IsVehicle()
250250

251251
bool CModelInfoSA::IsPlayerModel()
252252
{
253-
return (m_dwModelID == 0 || m_dwModelID == 1 || m_dwModelID == 2 || m_dwModelID == 7 ||
254-
(m_dwModelID >= 9 && m_dwModelID != 208 && m_dwModelID != 149 && m_dwModelID != 119 && m_dwModelID != 86 && m_dwModelID != 74 &&
255-
m_dwModelID != 65 && m_dwModelID != 42 && m_dwModelID <= 272) ||
256-
(m_dwModelID >= 274 && m_dwModelID <= 288) || (m_dwModelID >= 290 && m_dwModelID <= 312));
253+
return (GetInterface() && GetInterface()->pColModel && GetInterface()->pColModel == (CColModelSAInterface*)VAR_CTempColModels_ModelPed1);
257254
}
258255

259256
BOOL CModelInfoSA::IsUpgrade(void)
@@ -1190,6 +1187,11 @@ void CModelInfoSA::MakePedModel(char* szTexture)
11901187
pGame->GetStreaming()->RequestSpecialModel(m_dwModelID, szTexture, 0);
11911188
}
11921189

1190+
void CModelInfoSA::DeallocateModel(void)
1191+
{
1192+
Remove();
1193+
ppModelInfo[m_dwModelID] = nullptr;
1194+
}
11931195
//////////////////////////////////////////////////////////////////////////////////////////
11941196
//
11951197
// Hook for CFileLoader_LoadCollisionFile_Mid

‎Client/game_sa/CModelInfoSA.h‎

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,7 @@
99
*
1010
*****************************************************************************/
1111

12-
#ifndef __CGAMESA_MODELINFO
13-
#define __CGAMESA_MODELINFO
12+
#pragma once
1413

1514
#include <game/CModelInfo.h>
1615
#include <game/Common.h>
@@ -356,6 +355,7 @@ class CModelInfoSA : public CModelInfo
356355

357356
// CModelInfoSA methods
358357
void MakePedModel(char* szTexture);
358+
void DeallocateModel(void);
359359

360360
SVehicleSupportedUpgrades GetVehicleSupportedUpgrades(void) { return m_ModelSupportedUpgrades; }
361361

@@ -365,5 +365,3 @@ class CModelInfoSA : public CModelInfo
365365
private:
366366
void RwSetSupportedUpgrades(RwFrame* parent, DWORD dwModel);
367367
};
368-
369-
#endif

‎Client/mods/deathmatch/StdInc.h‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@
9393
#include <CElementArray.h>
9494
#include <CLogger.h>
9595
#include <CMapEventManager.h>
96+
#include <CClientModelManager.h>
9697
#include <CModelNames.h>
9798
#include <CIFPEngine.h>
9899
#include <CFileReader.h>

‎Client/mods/deathmatch/logic/CClientGame.cpp‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3543,6 +3543,9 @@ void CClientGame::Event_OnIngame(void)
35433543
g_pGame->GetWaterManager()->SetWaterDrawnLast(true);
35443544
m_pCamera->SetCameraClip(true, true);
35453545

3546+
// Deallocate all custom models
3547+
m_pManager->GetModelManager()->RemoveAll();
3548+
35463549
// Create a local player for us
35473550
m_pLocalPlayer = new CClientPlayer(m_pManager, m_LocalID, true);
35483551
if (m_pLocalPlayer)

‎Client/mods/deathmatch/logic/CClientManager.cpp‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ CClientManager::CClientManager(void)
5252
m_pWeaponManager = new CClientWeaponManager(this);
5353
m_pEffectManager = new CClientEffectManager(this);
5454
m_pPointLightsManager = new CClientPointLightsManager(this);
55+
m_pModelManager = new CClientModelManager(this);
5556
m_pPacketRecorder = new CClientPacketRecorder(this);
5657

5758
m_bBeingDeleted = false;
@@ -173,6 +174,9 @@ CClientManager::~CClientManager(void)
173174

174175
delete m_pPointLightsManager;
175176
m_pPointLightsManager = NULL;
177+
178+
delete m_pModelManager;
179+
m_pModelManager = nullptr;
176180
}
177181

178182
//

‎Client/mods/deathmatch/logic/CClientManager.h‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ class CClientManager;
4343
#include "CClientWeaponManager.h"
4444
#include "CClientEffectManager.h"
4545
#include "CClientPointLightsManager.h"
46+
#include "CClientModelManager.h"
4647

4748
class CClientProjectileManager;
4849
class CClientExplosionManager;
@@ -95,6 +96,7 @@ class CClientManager
9596
CClientWeaponManager* GetWeaponManager(void) { return m_pWeaponManager; }
9697
CClientEffectManager* GetEffectManager(void) { return m_pEffectManager; }
9798
CClientPointLightsManager* GetPointLightsManager(void) { return m_pPointLightsManager; }
99+
CClientModelManager* GetModelManager(void) { return m_pModelManager; }
98100

99101
bool IsGameLoaded(void) { return g_pGame->GetSystemState() == 9 && !m_bGameUnloadedFlag && g_pCore->GetNetwork()->GetServerBitStreamVersion(); }
100102
bool IsBeingDeleted(void) { return m_bBeingDeleted; }
@@ -147,6 +149,7 @@ class CClientManager
147149
CClientWeaponManager* m_pWeaponManager;
148150
CClientEffectManager* m_pEffectManager;
149151
CClientPointLightsManager* m_pPointLightsManager;
152+
CClientModelManager* m_pModelManager;
150153
CClientPacketRecorder* m_pPacketRecorder;
151154
bool m_bBeingDeleted;
152155
bool m_bGameUnloadedFlag;
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
/*****************************************************************************
2+
*
3+
* PROJECT: Multi Theft Auto
4+
* (Shared logic for modifications)
5+
* LICENSE: See LICENSE in the top level directory
6+
* FILE: mods/deathmatch/logic/CClientModel.h
7+
* PURPOSE: Model handling class
8+
*
9+
*****************************************************************************/
10+
11+
#include "StdInc.h"
12+
13+
CClientModel::CClientModel(CClientManager* pManager, int iModelID, eClientModelType eModelType)
14+
{
15+
// Init
16+
m_pManager = pManager;
17+
m_pModelManager = pManager->GetModelManager();
18+
m_iModelID = iModelID;
19+
m_eModelType = eModelType;
20+
21+
m_pModelManager->Add(this);
22+
}
23+
24+
CClientModel::~CClientModel(void)
25+
{
26+
Deallocate();
27+
28+
m_pModelManager->Remove(this);
29+
}
30+
31+
bool CClientModel::Allocate(void)
32+
{
33+
m_bAllocatedByUs = true;
34+
35+
CModelInfo* pModelInfo = g_pGame->GetModelInfo(m_iModelID, true);
36+
37+
// Allocate only on free IDs
38+
if (!pModelInfo->IsValid())
39+
{
40+
pModelInfo->MakePedModel("PSYCHO");
41+
return true;
42+
}
43+
return false;
44+
}
45+
46+
bool CClientModel::Deallocate(void)
47+
{
48+
if (!m_bAllocatedByUs)
49+
return false;
50+
51+
CModelInfo* pModelInfo = g_pGame->GetModelInfo(m_iModelID, true);
52+
53+
// ModelInfo must be valid
54+
if (pModelInfo->IsValid())
55+
{
56+
if (m_eModelType == CCLIENTMODELPED)
57+
{
58+
// If some ped is using this ID, change him to CJ
59+
CClientPedManager* pPedManager = g_pClientGame->GetManager()->GetPedManager();
60+
std::vector<CClientPed*>::const_iterator iter = pPedManager->IterBegin();
61+
for (; iter != pPedManager->IterEnd(); iter++)
62+
{
63+
if ((*iter)->GetModel() == m_iModelID)
64+
{
65+
if ((*iter)->IsStreamedIn())
66+
{
67+
(*iter)->StreamOutForABit();
68+
}
69+
(*iter)->SetModel(0);
70+
}
71+
}
72+
}
73+
74+
// Restore DFF/TXD
75+
g_pClientGame->GetManager()->GetDFFManager()->RestoreModel(m_iModelID);
76+
77+
// Restore COL (for non ped models)
78+
if (m_eModelType != CCLIENTMODELPED)
79+
{
80+
g_pClientGame->GetManager()->GetColModelManager()->RestoreModel(m_iModelID);
81+
}
82+
83+
pModelInfo->DeallocateModel();
84+
85+
this->SetParentResource(nullptr);
86+
return true;
87+
}
88+
return false;
89+
}

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /