summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSergeanur <s.anureev@yandex.ua>2020-01-07 16:26:23 +0100
committerSergeanur <s.anureev@yandex.ua>2020-01-07 16:26:40 +0100
commitf7e962beaa9bb09629990a9fc8cd42f7ef29de7d (patch)
treebe625fef86277d78ea20785f0055b377708f7d74
parentCPlayerPed & CMenuManager (#286) (diff)
downloadre3-f7e962beaa9bb09629990a9fc8cd42f7ef29de7d.tar
re3-f7e962beaa9bb09629990a9fc8cd42f7ef29de7d.tar.gz
re3-f7e962beaa9bb09629990a9fc8cd42f7ef29de7d.tar.bz2
re3-f7e962beaa9bb09629990a9fc8cd42f7ef29de7d.tar.lz
re3-f7e962beaa9bb09629990a9fc8cd42f7ef29de7d.tar.xz
re3-f7e962beaa9bb09629990a9fc8cd42f7ef29de7d.tar.zst
re3-f7e962beaa9bb09629990a9fc8cd42f7ef29de7d.zip
-rw-r--r--src/audio/AudioManager.cpp5
-rw-r--r--src/objects/ObjectData.cpp2
-rw-r--r--src/objects/Projectile.cpp14
-rw-r--r--src/objects/Projectile.h1
-rw-r--r--src/weapons/CProjectileInfo.cpp10
-rw-r--r--src/weapons/CProjectileInfo.h20
-rw-r--r--src/weapons/ProjectileInfo.cpp9
-rw-r--r--src/weapons/ProjectileInfo.h20
8 files changed, 47 insertions, 34 deletions
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