From f7e962beaa9bb09629990a9fc8cd42f7ef29de7d Mon Sep 17 00:00:00 2001 From: Sergeanur Date: Tue, 7 Jan 2020 17:26:23 +0200 Subject: Fixing Projectile code --- src/audio/AudioManager.cpp | 5 +++-- src/objects/ObjectData.cpp | 2 +- src/objects/Projectile.cpp | 14 ++++++++++++++ src/objects/Projectile.h | 1 + src/weapons/CProjectileInfo.cpp | 10 ---------- src/weapons/CProjectileInfo.h | 20 -------------------- src/weapons/ProjectileInfo.cpp | 9 +++++++++ src/weapons/ProjectileInfo.h | 20 +++++++++++++++++++- 8 files changed, 47 insertions(+), 34 deletions(-) delete mode 100644 src/weapons/CProjectileInfo.cpp delete mode 100644 src/weapons/CProjectileInfo.h (limited to 'src') diff --git a/src/audio/AudioManager.cpp b/src/audio/AudioManager.cpp index abfbde00..d825fb89 100644 --- a/src/audio/AudioManager.cpp +++ b/src/audio/AudioManager.cpp @@ -8,7 +8,6 @@ #include "Automobile.h" #include "Boat.h" #include "Bridge.h" -#include "CProjectileInfo.h" #include "Camera.h" #include "DMAudio.h" #include "Entity.h" @@ -25,6 +24,8 @@ #include "Plane.h" #include "PlayerPed.h" #include "Pools.h" +#include "Projectile.h" +#include "ProjectileInfo.h" #include "Replay.h" #include "Stats.h" #include "SurfaceTable.h" @@ -6954,7 +6955,7 @@ cAudioManager::ProcessProjectiles() } m_sQueueSample.field_48 = 4.0; m_sQueueSample.field_76 = 3; - m_sQueueSample.m_vecPos = CProjectileInfo::ms_apProjectile[i].GetPosition(); + m_sQueueSample.m_vecPos = CProjectileInfo::ms_apProjectile[i]->GetPosition(); float distSquared = GetDistanceSquared(&m_sQueueSample.m_vecPos); if(distSquared < maxDist) { m_sQueueSample.m_fDistance = Sqrt(distSquared); diff --git a/src/objects/ObjectData.cpp b/src/objects/ObjectData.cpp index 775a87a1..92e9d544 100644 --- a/src/objects/ObjectData.cpp +++ b/src/objects/ObjectData.cpp @@ -57,7 +57,7 @@ CObjectData::Initialise(const char *filename) &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_fBuoyancy = 100.0f/percentSubmerged * GRAVITY *ms_aObjectInfo[id].m_fMass; ms_aObjectInfo[id].m_nCollisionDamageEffect = damageEffect; ms_aObjectInfo[id].m_nSpecialCollisionResponseCases = responseCase; ms_aObjectInfo[id].m_bCameraToAvoidThisObject = camAvoid; diff --git a/src/objects/Projectile.cpp b/src/objects/Projectile.cpp index c6c2d6e1..38bbfdfa 100644 --- a/src/objects/Projectile.cpp +++ b/src/objects/Projectile.cpp @@ -2,12 +2,26 @@ #include "patcher.h" #include "Projectile.h" +CProjectile::CProjectile(int32 model) : CObject() +{ + m_fMass = 1.0f; + m_fTurnMass = 1.0f; + m_fAirResistance = 0.99f; + m_fElasticity = 0.75f; + m_fBuoyancy = GRAVITY * m_fMass * 0.1f; + bExplosionProof = true; + SetModelIndex(model); + ObjectCreatedBy = MISSION_OBJECT; +} + class CProjectile_ : public CProjectile { public: + CProjectile* ctor(int32 model) { return ::new (this) CProjectile(model); } void dtor(void) { CProjectile::~CProjectile(); } }; STARTPATCHES + InjectHook(0x4BFE30, &CProjectile_::ctor, PATCH_JUMP); InjectHook(0x4BFED0, &CProjectile_::dtor, PATCH_JUMP); ENDPATCHES diff --git a/src/objects/Projectile.h b/src/objects/Projectile.h index 4d5041f8..2f2b541c 100644 --- a/src/objects/Projectile.h +++ b/src/objects/Projectile.h @@ -7,4 +7,5 @@ class CProjectile : public CObject { public: + CProjectile(int32); }; diff --git a/src/weapons/CProjectileInfo.cpp b/src/weapons/CProjectileInfo.cpp deleted file mode 100644 index f3c78ed8..00000000 --- a/src/weapons/CProjectileInfo.cpp +++ /dev/null @@ -1,10 +0,0 @@ -#include "CProjectileInfo.h" - -CProjectileInfo *gaProjectileInfo = (CProjectileInfo *)0x64ED50; -CProjectileInfo *CProjectileInfo::ms_apProjectile = (CProjectileInfo *)0x87C748; - -CProjectileInfo * -CProjectileInfo::GetProjectileInfo(int32 id) -{ - return &gaProjectileInfo[id]; -} diff --git a/src/weapons/CProjectileInfo.h b/src/weapons/CProjectileInfo.h deleted file mode 100644 index 426d25f1..00000000 --- a/src/weapons/CProjectileInfo.h +++ /dev/null @@ -1,20 +0,0 @@ -#pragma once - -#include "Object.h" -#include "Weapon.h" - -struct CProjectileInfo : public CObject { - eWeaponType m_eWeaponType; - CEntity *m_pSource; - int m_nExplosionTime; - char m_bInUse; - char field_13; - char field_14; - char field_15; - CVector m_vecPos; - - static CProjectileInfo *GetProjectileInfo(int32 id); - static CProjectileInfo *ms_apProjectile; -}; - -extern CProjectileInfo *gaProjectileInfo; \ No newline at end of file diff --git a/src/weapons/ProjectileInfo.cpp b/src/weapons/ProjectileInfo.cpp index 7919b8ab..efb9dab3 100644 --- a/src/weapons/ProjectileInfo.cpp +++ b/src/weapons/ProjectileInfo.cpp @@ -3,6 +3,15 @@ #include "ProjectileInfo.h" #include "Projectile.h" +CProjectileInfo* gaProjectileInfo = (CProjectileInfo*)0x64ED50; +CProjectile* (&CProjectileInfo::ms_apProjectile)[32] = *(CProjectile*(*)[32])*(uintptr*)0x87C748; + WRAPPER void CProjectileInfo::RemoveAllProjectiles(void) { EAXJMP(0x55BB80); } WRAPPER bool CProjectileInfo::RemoveIfThisIsAProjectile(CObject *pObject) { EAXJMP(0x55BBD0); } WRAPPER bool CProjectileInfo::IsProjectileInRange(float x1, float x2, float y1, float y2, float z1, float z2, bool remove) { EAXJMP(0x55BA50); } + +CProjectileInfo* +CProjectileInfo::GetProjectileInfo(int32 id) +{ + return &gaProjectileInfo[id]; +} diff --git a/src/weapons/ProjectileInfo.h b/src/weapons/ProjectileInfo.h index e1faf028..7a1b5b53 100644 --- a/src/weapons/ProjectileInfo.h +++ b/src/weapons/ProjectileInfo.h @@ -1,11 +1,29 @@ #pragma once +class CEntity; class CObject; +class CProjectile; +enum eWeaponType; class CProjectileInfo { public: + eWeaponType m_eWeaponType; + CEntity* m_pSource; + int m_nExplosionTime; + char m_bInUse; + char field_13; + char field_14; + char field_15; + CVector m_vecPos; + +public: + static CProjectileInfo* GetProjectileInfo(int32 id); + static CProjectile* (&ms_apProjectile)[32]; + static bool RemoveIfThisIsAProjectile(CObject *pObject); static void RemoveAllProjectiles(void); static bool IsProjectileInRange(float x1, float x2, float y1, float y2, float z1, float z2, bool remove); -}; \ No newline at end of file +}; + +extern CProjectileInfo* gaProjectileInfo; \ No newline at end of file -- cgit v1.2.3