diff options
-rw-r--r-- | src/control/ObjectData.cpp | 100 | ||||
-rw-r--r-- | src/control/ObjectData.h | 20 | ||||
-rw-r--r-- | src/control/PedStats.cpp | 4 | ||||
-rw-r--r-- | src/control/PedStats.h | 13 | ||||
-rw-r--r-- | src/entities/Object.cpp | 4 | ||||
-rw-r--r-- | src/entities/Object.h | 21 | ||||
-rw-r--r-- | src/entities/Ped.h | 2 | ||||
-rw-r--r-- | src/entities/Physical.cpp | 8 | ||||
-rw-r--r-- | src/entities/Physical.h | 2 | ||||
-rw-r--r-- | src/modelinfo/BaseModelInfo.h | 2 |
10 files changed, 153 insertions, 23 deletions
diff --git a/src/control/ObjectData.cpp b/src/control/ObjectData.cpp index 28c34658..a0838007 100644 --- a/src/control/ObjectData.cpp +++ b/src/control/ObjectData.cpp @@ -1,5 +1,103 @@ #include "common.h" #include "patcher.h" +#include "main.h" +#include "ModelInfo.h" +#include "Object.h" +#include "FileMgr.h" #include "ObjectData.h" -WRAPPER void CObjectData::Initialise(const char *filename) { EAXJMP(0x4BC0E0); } +CObjectInfo CObjectData::ms_aObjectInfo[NUMOBJECTINFO]; + +// Another ugly file reader +void +CObjectData::Initialise(const char *filename) +{ + char *p, *lp; + char line[1024], name[256]; + int id; + float percentSubmerged; + int damageEffect, responseCase, camAvoid; + CBaseModelInfo *mi; + + CFileMgr::SetDir(""); + CFileMgr::LoadFile(filename, work_buff, 55000, "r"); + + id = 0; + p = (char*)work_buff; + while(*p != '*'){ + // skip over white space and comments + while(*p == ' ' || *p == '\n' || *p == '\r' || *p == ';') + if(*p == ';') + while(*p != '\n' && *p != '*') + p++; + else + p++; + + if(*p == '*') + break; + + // read one line + lp = line; + while(*p != '\n' && *p != '*'){ + *lp++ = *p == ',' ? ' ' : *p; + p++; + } + if(*p == '\n') + p++; + *lp = '\0'; // FIX: game wrote '\n' here + + assert(id < NUMOBJECTINFO); + sscanf(line, "%s %f %f %f %f %f %f %f %d %d %d", name, + &ms_aObjectInfo[id].m_fMass, + &ms_aObjectInfo[id].m_fTurnMass, + &ms_aObjectInfo[id].m_fAirResistance, + &ms_aObjectInfo[id].m_fElasticity, + &percentSubmerged, + &ms_aObjectInfo[id].m_fUprootLimit, + &ms_aObjectInfo[id].m_fCollisionDamageMultiplier, + &damageEffect, &responseCase, &camAvoid); + + ms_aObjectInfo[id].m_fBuoyancy = 100.0f/percentSubmerged * 0.008*ms_aObjectInfo[id].m_fMass; + ms_aObjectInfo[id].m_nCollisionDamageEffect = damageEffect; + ms_aObjectInfo[id].m_nSpecialCollisionResponseCases = responseCase; + ms_aObjectInfo[id].m_bCameraToAvoidThisObject = camAvoid; + + mi = CModelInfo::GetModelInfo(name, nil); + if(mi) + mi->SetObjectID(id++); + else + debug("CObjectData: Cannot find object %s\n", name); + } +} + +void +CObjectData::SetObjectData(int32 modelId, CObject &object) +{ + CObjectInfo *objinfo; + + if(CModelInfo::GetModelInfo(modelId)->GetObjectID() == -1) + return; + + objinfo = &ms_aObjectInfo[CModelInfo::GetModelInfo(modelId)->GetObjectID()]; + + object.m_fMass = objinfo->m_fMass; + object.m_fTurnMass = objinfo->m_fTurnMass; + object.m_fAirResistance = objinfo->m_fAirResistance; + object.m_fElasticity = objinfo->m_fElasticity; + object.m_fBuoyancy = objinfo->m_fBuoyancy; + object.m_fUprootLimit = objinfo->m_fUprootLimit; + object.m_fCollisionDamageMultiplier = objinfo->m_fCollisionDamageMultiplier; + object.m_nCollisionDamageEffect = objinfo->m_nCollisionDamageEffect; + object.m_nSpecialCollisionResponseCases = objinfo->m_nSpecialCollisionResponseCases; + object.m_bCameraToAvoidThisObject = objinfo->m_bCameraToAvoidThisObject; + if(object.m_fMass >= 99998.0){ + object.bInfiniteMass = true; + object.bAffectedByGravity = false; + object.m_flagB2 = true; + } +} + +STARTPATCHES + InjectHook(0x4BC0E0, CObjectData::Initialise, PATCH_JUMP); + InjectHook(0x4BC270, CObjectData::SetObjectData, PATCH_JUMP); +ENDPATCHES diff --git a/src/control/ObjectData.h b/src/control/ObjectData.h index 7df1c845..e3a5c1bd 100644 --- a/src/control/ObjectData.h +++ b/src/control/ObjectData.h @@ -1,7 +1,27 @@ #pragma once +class CObject; + +class CObjectInfo +{ +public: + float m_fMass; + float m_fTurnMass; + float m_fAirResistance; + float m_fElasticity; + float m_fBuoyancy; + float m_fUprootLimit; + float m_fCollisionDamageMultiplier; + uint8 m_nCollisionDamageEffect; + uint8 m_nSpecialCollisionResponseCases; + bool m_bCameraToAvoidThisObject; +}; +static_assert(sizeof(CObjectInfo) == 0x20, "CObjectInfo: error"); + class CObjectData { + static CObjectInfo ms_aObjectInfo[NUMOBJECTINFO]; public: static void Initialise(const char *filename); + static void SetObjectData(int32 modelId, CObject &object); }; diff --git a/src/control/PedStats.cpp b/src/control/PedStats.cpp index e669ab43..f6508580 100644 --- a/src/control/PedStats.cpp +++ b/src/control/PedStats.cpp @@ -3,7 +3,7 @@ #include "FileMgr.h" #include "PedStats.h" -CPedStat *(&CPedStats::ms_apPedStats)[NUM_PEDSTATS] = *(CPedStat *(*)[NUM_PEDSTATS]) *(uintptr*)0x9404D4; +CPedStats *(&CPedStats::ms_apPedStats)[NUM_PEDSTATS] = *(CPedStats *(*)[NUM_PEDSTATS]) *(uintptr*)0x9404D4; void CPedStats::Initialise(void) @@ -12,7 +12,7 @@ CPedStats::Initialise(void) debug("Initialising CPedStats...\n"); for(i = 0; i < NUM_PEDSTATS; i++){ - ms_apPedStats[i] = new CPedStat; + ms_apPedStats[i] = new CPedStats; ms_apPedStats[i]->m_type = PEDSTAT_PLAYER; ms_apPedStats[i]->m_name[8] = 'R'; // WHAT? ms_apPedStats[i]->m_fleeDistance = 20.0f; diff --git a/src/control/PedStats.h b/src/control/PedStats.h index 6b53ea37..78414341 100644 --- a/src/control/PedStats.h +++ b/src/control/PedStats.h @@ -54,8 +54,11 @@ enum STAT_GUN_PANIC = 0x80 }; -struct CPedStat +class CPedStats { + static CPedStats *(&ms_apPedStats)[NUM_PEDSTATS]; + +public: ePedStats m_type; char m_name[24]; float m_fleeDistance; @@ -67,16 +70,10 @@ struct CPedStat float m_attackStrength; float m_defendWeakness; int16 m_flags; -}; -static_assert(sizeof(CPedStat) == 0x34, "CPedStat: error"); -class CPedStats -{ - static CPedStat *(&ms_apPedStats)[NUM_PEDSTATS]; - -public: static void Initialise(void); static void Shutdown(void); static void LoadPedStats(void); static int32 GetPedStatType(char *name); }; +static_assert(sizeof(CPedStats) == 0x34, "CPedStats: error"); diff --git a/src/entities/Object.cpp b/src/entities/Object.cpp index 2b068d49..35a64604 100644 --- a/src/entities/Object.cpp +++ b/src/entities/Object.cpp @@ -16,8 +16,8 @@ CObject::CObject(void) m_type = ENTITY_TYPE_OBJECT; m_fUprootLimit = 0.0f; m_nCollisionDamageEffect = 0; - m_bSpecialCollisionResponseCases = 0; - m_bCameraToAvoidThisObject = 0; + m_nSpecialCollisionResponseCases = COLLRESPONSE_NONE; + m_bCameraToAvoidThisObject = false; ObjectCreatedBy = 0; m_nEndOfLifeTime = 0; // m_nRefModelIndex = -1; // duplicate diff --git a/src/entities/Object.h b/src/entities/Object.h index c9800e20..2079ff0e 100644 --- a/src/entities/Object.h +++ b/src/entities/Object.h @@ -9,6 +9,21 @@ enum { CUTSCENE_OBJECT = 4, }; +enum { + COLLRESPONSE_NONE, + COLLRESPONSE_CHANGE_MODEL, + COLLRESPONSE_SPLIT_MODEL, + COLLRESPONSE_SMASH_COMPLETELY, + COLLRESPONSE_CHANGE_THEN_SMASH, + COLLRESPONSE_UNKNOWN5, + + COLLRESPONSE_SMASH_CARDBOARD_COMPLETELY = 50, + COLLRESPONSE_SMASH_WOODENBOX_COMPLETELY = 60, + COLLRESPONSE_SMASH_TRAFFICCONE_COMPLETELY = 70, + COLLRESPONSE_SMASH_BARPOST_COMPLETELY = 80, + +}; + class CVehicle; class CObject : public CPhysical @@ -28,9 +43,9 @@ public: int8 field_172; int8 field_173; float m_fCollisionDamageMultiplier; - int8 m_nCollisionDamageEffect; - int8 m_bSpecialCollisionResponseCases; - int8 m_bCameraToAvoidThisObject; + uint8 m_nCollisionDamageEffect; + uint8 m_nSpecialCollisionResponseCases; + bool m_bCameraToAvoidThisObject; int8 field_17B; int8 field_17C; int8 field_17D; diff --git a/src/entities/Ped.h b/src/entities/Ped.h index 3804236a..fbfa3f57 100644 --- a/src/entities/Ped.h +++ b/src/entities/Ped.h @@ -211,7 +211,7 @@ public: bool bInVehicle; uint8 stuff4[23]; int32 m_nPedType; - CPedStat *m_pedStats; + CPedStats *m_pedStats; uint8 stuff5[24]; CEntity *m_pCollidingEntity; uint8 stuff6[12]; diff --git a/src/entities/Physical.cpp b/src/entities/Physical.cpp index 33e2deff..f2693a68 100644 --- a/src/entities/Physical.cpp +++ b/src/entities/Physical.cpp @@ -1801,8 +1801,8 @@ CPhysical::ProcessCollision(void) n = distSq > 0.32f ? NUMSTEPS(0.3f) : NUMSTEPS(0.4f); step = savedTimeStep / n; }else if(IsObject()){ - int responsecase = ((CObject*)this)->m_bSpecialCollisionResponseCases; - if(responsecase == 1){ + int responsecase = ((CObject*)this)->m_nSpecialCollisionResponseCases; + if(responsecase == COLLRESPONSE_CHANGE_MODEL){ CVector speedUp = { 0.0f, 0.0f, 0.0f }; CVector speedDown = { 0.0f, 0.0f, 0.0f }; speedUp.z = GetBoundRadius(); @@ -1816,12 +1816,12 @@ CPhysical::ProcessCollision(void) n = NUMSTEPS(0.3f); step = savedTimeStep / n; } - }else if(responsecase == 5){ + }else if(responsecase == COLLRESPONSE_UNKNOWN5){ if(distSq >= 0.009f){ n = NUMSTEPS(0.09f); step = savedTimeStep / n; } - }else if(responsecase == 2 || responsecase == 4){ + }else if(responsecase == COLLRESPONSE_SPLIT_MODEL || responsecase == COLLRESPONSE_CHANGE_THEN_SMASH){ if(distSq >= sq(0.15f)){ n = NUMSTEPS(0.15f); step = savedTimeStep / n; diff --git a/src/entities/Physical.h b/src/entities/Physical.h index 6b5bd1f6..11d2a1f9 100644 --- a/src/entities/Physical.h +++ b/src/entities/Physical.h @@ -30,7 +30,7 @@ public: float fForceMultiplier; float m_fAirResistance; float m_fElasticity; - float fPercentSubmerged; + float m_fBuoyancy; CVector m_vecCentreOfMass; CEntryInfoList m_entryInfoList; CPtrNode *m_movingListNode; diff --git a/src/modelinfo/BaseModelInfo.h b/src/modelinfo/BaseModelInfo.h index b6c6c62e..da72990f 100644 --- a/src/modelinfo/BaseModelInfo.h +++ b/src/modelinfo/BaseModelInfo.h @@ -52,7 +52,7 @@ public: void DeleteCollisionModel(void); void ClearTexDictionary(void) { m_txdSlot = -1; } short GetObjectID(void) { return m_objectId; } - void SetObjectID(short id) { m_objectId = id; } + void SetObjectID(int16 id) { m_objectId = id; } short GetTxdSlot(void) { return m_txdSlot; } void AddRef(void); void RemoveRef(void); |