summaryrefslogtreecommitdiffstats
path: root/src/objects
diff options
context:
space:
mode:
authorNikolay Korolev <nickvnuk@gmail.com>2021-06-25 09:15:19 +0200
committerNikolay Korolev <nickvnuk@gmail.com>2021-06-25 09:15:19 +0200
commit8a5afd0db2fa2616556ed953c5c464c6930d6f47 (patch)
tree0747c8742ffb38488e7d3569d92ff5ba1c3a5e39 /src/objects
parentMerge remote-tracking branch 'upstream/lcs' into lcs (diff)
parentMerge remote-tracking branch 'origin/miami' into lcs (diff)
downloadre3-8a5afd0db2fa2616556ed953c5c464c6930d6f47.tar
re3-8a5afd0db2fa2616556ed953c5c464c6930d6f47.tar.gz
re3-8a5afd0db2fa2616556ed953c5c464c6930d6f47.tar.bz2
re3-8a5afd0db2fa2616556ed953c5c464c6930d6f47.tar.lz
re3-8a5afd0db2fa2616556ed953c5c464c6930d6f47.tar.xz
re3-8a5afd0db2fa2616556ed953c5c464c6930d6f47.tar.zst
re3-8a5afd0db2fa2616556ed953c5c464c6930d6f47.zip
Diffstat (limited to 'src/objects')
-rw-r--r--src/objects/CutsceneObject.h1
-rw-r--r--src/objects/Object.cpp42
-rw-r--r--src/objects/Object.h8
-rw-r--r--src/objects/ParticleObject.cpp2
-rw-r--r--src/objects/Stinger.cpp35
5 files changed, 69 insertions, 19 deletions
diff --git a/src/objects/CutsceneObject.h b/src/objects/CutsceneObject.h
index af24c0a6..b0659c08 100644
--- a/src/objects/CutsceneObject.h
+++ b/src/objects/CutsceneObject.h
@@ -14,6 +14,7 @@ public:
CCutsceneObject(void);
~CCutsceneObject(void);
+ bool UpdatesInCutscene(void) { return true; }
void SetModelIndex(uint32 id);
void CreateShadow(void);
void ProcessControl(void);
diff --git a/src/objects/Object.cpp b/src/objects/Object.cpp
index 0605f54f..575c592c 100644
--- a/src/objects/Object.cpp
+++ b/src/objects/Object.cpp
@@ -25,10 +25,32 @@ int16 CObject::nNoTempObjects;
//int16 CObject::nBodyCastHealth = 1000;
float CObject::fDistToNearestTree;
-void *CObject::operator new(size_t sz) { return CPools::GetObjectPool()->New(); }
-void *CObject::operator new(size_t sz, int handle) { return CPools::GetObjectPool()->New(handle);};
-void CObject::operator delete(void *p, size_t sz) { CPools::GetObjectPool()->Delete((CObject*)p); }
-void CObject::operator delete(void *p, int handle) { CPools::GetObjectPool()->Delete((CObject*)p); }
+// Object pools tends to be full sometimes, let's free a temp. object in this case.
+#ifdef FIX_BUGS
+void *CObject::operator new(size_t sz) throw() {
+ CObject *obj = CPools::GetObjectPool()->New();
+ if (!obj) {
+ CObjectPool *objectPool = CPools::GetObjectPool();
+ for (int32 i = 0; i < objectPool->GetSize(); i++) {
+ CObject *existing = objectPool->GetSlot(i);
+ if (existing && existing->ObjectCreatedBy == TEMP_OBJECT) {
+ int32 handle = objectPool->GetIndex(existing);
+ CWorld::Remove(existing);
+ delete existing;
+ obj = objectPool->New(handle);
+ break;
+ }
+ }
+ }
+ return obj;
+}
+#else
+void *CObject::operator new(size_t sz) throw() { return CPools::GetObjectPool()->New(); }
+#endif
+void *CObject::operator new(size_t sz, int handle) throw() { return CPools::GetObjectPool()->New(handle); };
+
+void CObject::operator delete(void *p, size_t sz) throw() { CPools::GetObjectPool()->Delete((CObject*)p); }
+void CObject::operator delete(void *p, int handle) throw() { CPools::GetObjectPool()->Delete((CObject*)p); }
CObject::CObject(void)
{
@@ -77,7 +99,7 @@ CObject::CObject(CDummyObject *dummy)
if (dummy->m_rwObject)
AttachToRwObject(dummy->m_rwObject);
else
- GetMatrix() = dummy->GetMatrix();
+ SetMatrix(dummy->GetMatrix());
m_objectMatrix = dummy->GetMatrix();
dummy->DetachFromRwObject();
@@ -190,8 +212,8 @@ void
CObject::Teleport(CVector vecPos)
{
CWorld::Remove(this);
- m_matrix.GetPosition() = vecPos;
- m_matrix.UpdateRW();
+ GetMatrix().GetPosition() = vecPos;
+ GetMatrix().UpdateRW();
UpdateRwFrame();
CWorld::Add(this);
}
@@ -356,7 +378,7 @@ CObject::ObjectDamage(float amount)
}
#endif
if ((amount * m_fCollisionDamageMultiplier > 150.0f || bBodyCastDamageEffect) && m_nCollisionDamageEffect) {
- const CVector &vecPos = m_matrix.GetPosition();
+ const CVector& vecPos = GetMatrix().GetPosition();
const float fDirectionZ = 0.0002f * amount;
switch (m_nCollisionDamageEffect) {
case DAMAGE_EFFECT_CHANGE_MODEL:
@@ -653,7 +675,7 @@ CObject::ObjectDamage(float amount)
CParticle::AddParticle(PARTICLE_CAR_DEBRIS, particlePos, particleDir, nil, fSize, particleColor, nRotationSpeed, 0, nCurFrame, 0);
if ((i % 7) == 0) {
static RwRGBA secondaryColor = { 0x9A, 0x99, 0x99, 0x3E };
- CParticle::AddParticle(PARTICLE_DEBRIS, particlePos, particleDir, nil, 0.3, secondaryColor, nRotationSpeed, 0, 0, 0);
+ CParticle::AddParticle(PARTICLE_DEBRIS, particlePos, particleDir, nil, 0.3f, secondaryColor, nRotationSpeed);
}
}
PlayOneShotScriptObject(SCRIPT_SOUND_BOX_DESTROYED_2, vecPos);
@@ -746,7 +768,7 @@ CObject::Init(void)
m_pCollidingEntity = nil;
CColPoint point;
CEntity *outEntity = nil;
- const CVector &vecPos = m_matrix.GetPosition();
+ const CVector& vecPos = GetMatrix().GetPosition();
if (CWorld::ProcessVerticalLine(vecPos, vecPos.z - 10.0f, point, outEntity, true, false, false, false, false, false, nil))
m_pCurSurface = outEntity;
else
diff --git a/src/objects/Object.h b/src/objects/Object.h
index a8205ba9..a535732c 100644
--- a/src/objects/Object.h
+++ b/src/objects/Object.h
@@ -88,10 +88,10 @@ public:
static int16 nNoTempObjects;
static float fDistToNearestTree;
- static void *operator new(size_t);
- static void *operator new(size_t, int);
- static void operator delete(void*, size_t);
- static void operator delete(void*, int);
+ static void *operator new(size_t) throw();
+ static void *operator new(size_t, int) throw();
+ static void operator delete(void*, size_t) throw();
+ static void operator delete(void*, int) throw();
CObject(void);
CObject(int32, bool);
diff --git a/src/objects/ParticleObject.cpp b/src/objects/ParticleObject.cpp
index a281062f..defd1995 100644
--- a/src/objects/ParticleObject.cpp
+++ b/src/objects/ParticleObject.cpp
@@ -33,7 +33,7 @@ CAudioHydrant::Add(CParticleObject *particleobject)
if ( AEHANDLE_IS_FAILED(List[i].AudioEntity) )
return false;
- DMAudio.SetEntityStatus(List[i].AudioEntity, true);
+ DMAudio.SetEntityStatus(List[i].AudioEntity, TRUE);
List[i].pParticleObject = particleobject;
diff --git a/src/objects/Stinger.cpp b/src/objects/Stinger.cpp
index b3660881..29efea10 100644
--- a/src/objects/Stinger.cpp
+++ b/src/objects/Stinger.cpp
@@ -46,7 +46,14 @@ CStinger::Init(CPed *pPed)
pOwner = pPed;
for (i = 0; i < NUM_STINGER_SEGMENTS; i++) {
- pSpikes[i] = new CStingerSegment;
+ pSpikes[i] = new CStingerSegment();
+#ifdef FIX_BUGS
+ if (!pSpikes[i]) {
+ // Abort!! Pool is full
+ Remove();
+ return;
+ }
+#endif
pSpikes[i]->bUsesCollision = false;
}
bIsDeployed = true;
@@ -75,10 +82,19 @@ CStinger::Remove()
for (int32 i = 0; i < NUM_STINGER_SEGMENTS; i++) {
CStingerSegment *spikeSegment = pSpikes[i];
+
+#ifdef FIX_BUGS
+ if (spikeSegment) {
+ CWorld::Remove(spikeSegment);
+ delete spikeSegment;
+ pSpikes[i] = nil;
+ }
+#else
if (spikeSegment->m_entryInfoList.first != nil)
spikeSegment->bRemoveFromWorld = true;
else
delete spikeSegment;
+#endif
}
bIsDeployed = false;
}
@@ -86,11 +102,17 @@ CStinger::Remove()
void
CStinger::Deploy(CPed *pPed)
{
+ // So total number of stingers allowed at the same time is 2, each by different CCopPed.
if (NumOfStingerSegments < NUM_STINGER_SEGMENTS*2 && !pPed->bInVehicle && pPed->IsPedInControl()) {
- if (!bIsDeployed && RpAnimBlendClumpGetAssociation(pPed->GetClump(), ANIM_WEAPON_THROWU) == nil) {
+ if (!bIsDeployed && RpAnimBlendClumpGetAssociation(pPed->GetClump(), ANIM_STD_THROW_UNDER) == nil) {
Init(pPed);
+#ifdef FIX_BUGS
+ // Above call won't set it to true no more when object pool is full
+ if (!bIsDeployed)
+ return;
+#endif
pPed->SetPedState(PED_DEPLOY_STINGER);
- CAnimManager::AddAnimation(pPed->GetClump(), ASSOCGRP_STD, ANIM_WEAPON_THROWU);
+ CAnimManager::AddAnimation(pPed->GetClump(), ASSOCGRP_STD, ANIM_STD_THROW_UNDER);
}
}
}
@@ -161,6 +183,7 @@ CStinger::CheckForBurstTyres()
}
}
+// Only called when bIsDeployed
void
CStinger::Process()
{
@@ -170,7 +193,7 @@ CStinger::Process()
if (pOwner != nil
&& !pOwner->bInVehicle
&& pOwner->GetPedState() == PED_DEPLOY_STINGER
- && RpAnimBlendClumpGetAssociation(pOwner->GetClump(), ANIM_WEAPON_THROWU)->currentTime > 0.39f)
+ && RpAnimBlendClumpGetAssociation(pOwner->GetClump(), ANIM_STD_THROW_UNDER)->currentTime > 0.39f)
{
m_nSpikeState = STINGERSTATE_DEPLOYING;
for (int i = 0; i < NUM_STINGER_SEGMENTS; i++)
@@ -226,7 +249,11 @@ CStinger::Process()
break;
case STINGERSTATE_REMOVE:
Remove();
+#ifdef FIX_BUGS
+ return;
+#else
break;
+#endif
}
CheckForBurstTyres();
} \ No newline at end of file