Merge pull request #399 from saml1er/master

CObject complete
This commit is contained in:
Nikolay Korolev 2020-04-12 12:05:49 +03:00 committed by GitHub
commit c593599fc5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
10 changed files with 318 additions and 36 deletions

View File

@ -111,7 +111,7 @@ CPickup::GiveUsAPickUpObject(int32 handle)
object->bUsesCollision = false; object->bUsesCollision = false;
object->bIsPickup = true; object->bIsPickup = true;
object->field_172 = m_eModelIndex == MI_PICKUP_BONUS ? m_nQuantity : 0; object->m_nBonusValue = m_eModelIndex == MI_PICKUP_BONUS ? m_nQuantity : 0;
switch (m_eType) switch (m_eType)
{ {
@ -671,9 +671,9 @@ void
CPickups::DoPickUpEffects(CEntity *entity) CPickups::DoPickUpEffects(CEntity *entity)
{ {
if (entity->GetModelIndex() == MI_PICKUP_KILLFRENZY) if (entity->GetModelIndex() == MI_PICKUP_KILLFRENZY)
entity->m_flagD80 = CTheScripts::IsPlayerOnAMission() || CDarkel::FrenzyOnGoing() || !CGame::nastyGame; entity->bDoNotRender = CTheScripts::IsPlayerOnAMission() || CDarkel::FrenzyOnGoing() || !CGame::nastyGame;
if (!entity->m_flagD80) { if (!entity->bDoNotRender) {
float s = Sin((float)((CTimer::GetTimeInMilliseconds() + (uintptr)entity) & 0x7FF) * DEGTORAD(360.0f / 0x800)); float s = Sin((float)((CTimer::GetTimeInMilliseconds() + (uintptr)entity) & 0x7FF) * DEGTORAD(360.0f / 0x800));
float modifiedSin = 0.3f * (s + 1.0f); float modifiedSin = 0.3f * (s + 1.0f);
@ -716,7 +716,7 @@ CPickups::DoPickUpEffects(CEntity *entity)
size, 65.0f, CCoronas::TYPE_RING, CCoronas::FLARE_NONE, CCoronas::REFLECTION_OFF, CCoronas::LOSCHECK_OFF, CCoronas::STREAK_OFF, 0.0f); size, 65.0f, CCoronas::TYPE_RING, CCoronas::FLARE_NONE, CCoronas::REFLECTION_OFF, CCoronas::LOSCHECK_OFF, CCoronas::STREAK_OFF, 0.0f);
CObject *object = (CObject*)entity; CObject *object = (CObject*)entity;
if (object->m_obj_flag2 || object->bOutOfStock || object->field_172) { if (object->m_obj_flag2 || object->bOutOfStock || object->m_nBonusValue) {
float dist = (TheCamera.GetPosition() - pos).Magnitude(); float dist = (TheCamera.GetPosition() - pos).Magnitude();
const float MAXDIST = 12.0f; const float MAXDIST = 12.0f;
@ -734,7 +734,7 @@ CPickups::DoPickUpEffects(CEntity *entity)
aMessages[NumMessages].m_color.blue = aWeaponBlues[colorId]; aMessages[NumMessages].m_color.blue = aWeaponBlues[colorId];
aMessages[NumMessages].m_color.alpha = (1.0f - dist / MAXDIST) * 128.0f; aMessages[NumMessages].m_color.alpha = (1.0f - dist / MAXDIST) * 128.0f;
aMessages[NumMessages].m_bOutOfStock = object->bOutOfStock; aMessages[NumMessages].m_bOutOfStock = object->bOutOfStock;
aMessages[NumMessages].m_quantity = object->field_172; aMessages[NumMessages].m_quantity = object->m_nBonusValue;
NumMessages++; NumMessages++;
} }
} }

View File

@ -62,11 +62,11 @@ CEntity::CEntity(void)
bRemoveFromWorld = false; bRemoveFromWorld = false;
bHasHitWall = false; bHasHitWall = false;
bImBeingRendered = false; bImBeingRendered = false;
m_flagD8 = false; bTouchingWater = false;
bIsSubway = false; bIsSubway = false;
bDrawLast = false; bDrawLast = false;
bNoBrightHeadLights = false; bNoBrightHeadLights = false;
m_flagD80 = false; bDoNotRender = false;
bDistanceFade = false; bDistanceFade = false;
m_flagE2 = false; m_flagE2 = false;

View File

@ -73,11 +73,11 @@ public:
uint32 bRemoveFromWorld : 1; uint32 bRemoveFromWorld : 1;
uint32 bHasHitWall : 1; uint32 bHasHitWall : 1;
uint32 bImBeingRendered : 1; uint32 bImBeingRendered : 1;
uint32 m_flagD8 : 1; // used by cBuoyancy::ProcessBuoyancy uint32 bTouchingWater : 1; // used by cBuoyancy::ProcessBuoyancy
uint32 bIsSubway : 1; // set when subway, but maybe different meaning? uint32 bIsSubway : 1; // set when subway, but maybe different meaning?
uint32 bDrawLast : 1; uint32 bDrawLast : 1;
uint32 bNoBrightHeadLights : 1; uint32 bNoBrightHeadLights : 1;
uint32 m_flagD80 : 1; // CObject visibility? uint32 bDoNotRender : 1;
// flagsE // flagsE
uint32 bDistanceFade : 1; uint32 bDistanceFade : 1;

View File

@ -6,12 +6,11 @@
#include "Radar.h" #include "Radar.h"
#include "Object.h" #include "Object.h"
#include "DummyObject.h" #include "DummyObject.h"
#include "Particle.h"
WRAPPER void CObject::ObjectDamage(float amount) { EAXJMP(0x4BB240); } #include "General.h"
WRAPPER void CObject::DeleteAllTempObjectInArea(CVector, float) { EAXJMP(0x4BBED0); } #include "ObjectData.h"
WRAPPER void CObject::Init(void) { EAXJMP(0x4BAEC0); } #include "World.h"
WRAPPER void CObject::ProcessControl(void) { EAXJMP(0x4BB040); } #include "Floater.h"
WRAPPER void CObject::Teleport(CVector) { EAXJMP(0x4BBDA0); }
int16 &CObject::nNoTempObjects = *(int16*)0x95CCA2; int16 &CObject::nNoTempObjects = *(int16*)0x95CCA2;
int16 &CObject::nBodyCastHealth = *(int16*)0x5F7D4C; // 1000 int16 &CObject::nBodyCastHealth = *(int16*)0x5F7D4C; // 1000
@ -28,13 +27,13 @@ CObject::CObject(void)
m_nCollisionDamageEffect = 0; m_nCollisionDamageEffect = 0;
m_nSpecialCollisionResponseCases = COLLRESPONSE_NONE; m_nSpecialCollisionResponseCases = COLLRESPONSE_NONE;
m_bCameraToAvoidThisObject = false; m_bCameraToAvoidThisObject = false;
ObjectCreatedBy = 0; ObjectCreatedBy = UNKNOWN_OBJECT;
m_nEndOfLifeTime = 0; m_nEndOfLifeTime = 0;
// m_nRefModelIndex = -1; // duplicate // m_nRefModelIndex = -1; // duplicate
// bUseVehicleColours = false; // duplicate // bUseVehicleColours = false; // duplicate
m_colour2 = 0; m_colour2 = 0;
m_colour1 = m_colour2; m_colour1 = m_colour2;
field_172 = 0; m_nBonusValue = 0;
bIsPickup = false; bIsPickup = false;
m_obj_flag2 = false; m_obj_flag2 = false;
bOutOfStock = false; bOutOfStock = false;
@ -82,10 +81,46 @@ CObject::~CObject(void)
nNoTempObjects--; nNoTempObjects--;
} }
void
CObject::ProcessControl(void)
{
CVector point, impulse;
if (m_nCollisionDamageEffect)
ObjectDamage(m_fDamageImpulse);
CPhysical::ProcessControl();
if (mod_Buoyancy.ProcessBuoyancy(this, m_fBuoyancy, &point, &impulse)) {
bIsInWater = true;
bIsStatic = false;
ApplyMoveForce(impulse);
ApplyTurnForce(impulse, point);
float fTimeStep = Pow(0.97f, CTimer::GetTimeStep());
m_vecMoveSpeed *= fTimeStep;
m_vecTurnSpeed *= fTimeStep;
}
if ((m_modelIndex == MI_EXPLODINGBARREL || m_modelIndex == MI_PETROLPUMP) && bHasBeenDamaged && bIsVisible
&& (CGeneral::GetRandomNumber() & 0x1F) == 10) {
bExplosionProof = true;
bIsVisible = false;
bUsesCollision = false;
bAffectedByGravity = false;
m_vecMoveSpeed = CVector(0.0f, 0.0f, 0.0f);
}
}
void
CObject::Teleport(CVector vecPos)
{
CWorld::Remove(this);
m_matrix.GetPosition() = vecPos;
m_matrix.UpdateRW();
UpdateRwFrame();
CWorld::Add(this);
}
void void
CObject::Render(void) CObject::Render(void)
{ {
if(m_flagD80) if(bDoNotRender)
return; return;
if(m_nRefModelIndex != -1 && ObjectCreatedBy == TEMP_OBJECT && bUseVehicleColours){ if(m_nRefModelIndex != -1 && ObjectCreatedBy == TEMP_OBJECT && bUseVehicleColours){
@ -117,6 +152,152 @@ CObject::RemoveLighting(bool reset)
WorldReplaceScorchedLightsWithNormal(Scene.world); WorldReplaceScorchedLightsWithNormal(Scene.world);
} }
void
CObject::ObjectDamage(float amount)
{
if (!m_nCollisionDamageEffect || !bUsesCollision)
return;
static int8 nFrameGen = 0;
bool bBodyCastDamageEffect = false;
if (m_modelIndex == MI_BODYCAST){
if (amount > 50.0f)
nBodyCastHealth = (int16)(nBodyCastHealth - 0.5f * amount);
if (nBodyCastHealth < 0)
nBodyCastHealth = 0;
if (nBodyCastHealth < 200)
bBodyCastDamageEffect = true;
amount = 0.0f;
}
if ((amount * m_fCollisionDamageMultiplier > 150.0f || bBodyCastDamageEffect) && m_nCollisionDamageEffect) {
const CVector& vecPos = m_matrix.GetPosition();
const float fDirectionZ = 0.0002f * amount;
switch (m_nCollisionDamageEffect)
{
case COLDAMAGE_EFFECT_CHANGE_MODEL:
bRenderDamaged = true;
break;
case COLDAMAGE_EFFECT_SPLIT_MODEL:
break;
case COLDAMAGE_EFFECT_SMASH_COMPLETELY:
bIsVisible = false;
bUsesCollision = false;
bIsStatic = true;
bExplosionProof = true;
SetMoveSpeed(0.0f, 0.0f, 0.0f);
SetTurnSpeed(0.0f, 0.0f, 0.0f);
break;
case COLDAMAGE_EFFECT_CHANGE_THEN_SMASH:
if (!bRenderDamaged) {
bRenderDamaged = true;
}
else {
bIsVisible = false;
bUsesCollision = false;
bIsStatic = true;
bExplosionProof = true;
SetMoveSpeed(0.0f, 0.0f, 0.0f);
SetTurnSpeed(0.0f, 0.0f, 0.0f);
}
break;
case COLDAMAGE_EFFECT_SMASH_CARDBOX_COMPLETELY: {
bIsVisible = false;
bUsesCollision = false;
bIsStatic = true;
bExplosionProof = true;
SetMoveSpeed(0.0f, 0.0f, 0.0f);
SetTurnSpeed(0.0f, 0.0f, 0.0f);
const RwRGBA color = { 96, 48, 0, 255 };
for (int32 i = 0; i < 25; i++) {
CVector vecDir(CGeneral::GetRandomNumberInRange(-0.35f, 0.7f),
CGeneral::GetRandomNumberInRange(-0.35f, 0.7f),
CGeneral::GetRandomNumberInRange(0.1f, 0.15f) + fDirectionZ);
++nFrameGen;
int32 currentFrame = nFrameGen & 3;
float fRandom = CGeneral::GetRandomNumberInRange(0.01f, 1.0f);
RwRGBA randomColor = { color.red * fRandom, color.green * fRandom , color.blue, color.alpha };
float fSize = CGeneral::GetRandomNumberInRange(0.02f, 0.18f);
int32 nRotationSpeed = CGeneral::GetRandomNumberInRange(-40, 80);
CParticle::AddParticle(PARTICLE_CAR_DEBRIS, vecPos, vecDir, nil, fSize, randomColor, nRotationSpeed, 0, currentFrame, 0);
}
PlayOneShotScriptObject(_SCRSOUND_CARDBOARD_BOX_SMASH, vecPos);
break;
}
case COLDAMAGE_EFFECT_SMASH_WOODENBOX_COMPLETELY: {
bIsVisible = false;
bUsesCollision = false;
bIsStatic = true;
bExplosionProof = true;
SetMoveSpeed(0.0f, 0.0f, 0.0f);
SetTurnSpeed(0.0f, 0.0f, 0.0f);
const RwRGBA color = { 128, 128, 128, 255 };
for (int32 i = 0; i < 45; i++) {
CVector vecDir(CGeneral::GetRandomNumberInRange(-0.35f, 0.7f),
CGeneral::GetRandomNumberInRange(-0.35f, 0.7f),
CGeneral::GetRandomNumberInRange(0.1f, 0.15f) + fDirectionZ);
++nFrameGen;
int32 currentFrame = nFrameGen & 3;
float fRandom = CGeneral::GetRandomNumberInRange(0.5f, 0.5f);
RwRGBA randomColor = { color.red * fRandom, color.green * fRandom , color.blue * fRandom, color.alpha };
float fSize = CGeneral::GetRandomNumberInRange(0.02f, 0.18f);
int32 nRotationSpeed = CGeneral::GetRandomNumberInRange(-40, 80);
CParticle::AddParticle(PARTICLE_CAR_DEBRIS, vecPos, vecDir, nil, fSize, randomColor, nRotationSpeed, 0, currentFrame, 0);
}
PlayOneShotScriptObject(_SCRSOUND_WOODEN_BOX_SMASH, vecPos);
break;
}
case COLDAMAGE_EFFECT_SMASH_TRAFFICCONE_COMPLETELY: {
bIsVisible = false;
bUsesCollision = false;
bIsStatic = true;
bExplosionProof = true;
SetMoveSpeed(0.0f, 0.0f, 0.0f);
SetTurnSpeed(0.0f, 0.0f, 0.0f);
const RwRGBA color1 = { 200, 0, 0, 255 };
const RwRGBA color2 = { 200, 200, 200, 255 };
for (int32 i = 0; i < 10; i++) {
CVector vecDir(CGeneral::GetRandomNumberInRange(-0.35f, 0.7f),
CGeneral::GetRandomNumberInRange(-0.35f, 0.7f),
CGeneral::GetRandomNumberInRange(0.1f, 0.15f) + fDirectionZ);
++nFrameGen;
int32 currentFrame = nFrameGen & 3;
RwRGBA color = color2;
if (nFrameGen & 1)
color = color1;
float fSize = CGeneral::GetRandomNumberInRange(0.02f, 0.18f);
int32 nRotationSpeed = CGeneral::GetRandomNumberInRange(-40, 80);
CParticle::AddParticle(PARTICLE_CAR_DEBRIS, vecPos, vecDir, nil, fSize, color, nRotationSpeed, 0, currentFrame, 0);
}
PlayOneShotScriptObject(_SCRSOUND_TYRE_BUMP, vecPos);
break;
}
case COLDAMAGE_EFFECT_SMASH_BARPOST_COMPLETELY: {
bIsVisible = false;
bUsesCollision = false;
bIsStatic = true;
bExplosionProof = true;
SetMoveSpeed(0.0f, 0.0f, 0.0f);
SetTurnSpeed(0.0f, 0.0f, 0.0f);
const RwRGBA color1 = { 200, 0, 0, 255 };
const RwRGBA color2 = { 200, 200, 200, 255 };
for (int32 i = 0; i < 32; i++) {
CVector vecDir(CGeneral::GetRandomNumberInRange(-0.35f, 0.7f),
CGeneral::GetRandomNumberInRange(-0.35f, 0.7f),
CGeneral::GetRandomNumberInRange(0.1f, 0.15f) + fDirectionZ);
++nFrameGen;
int32 currentFrame = nFrameGen & 3;
RwRGBA color = color2;
if (nFrameGen & 1)
color = color1;
float fSize = CGeneral::GetRandomNumberInRange(0.02f, 0.18f);
int32 nRotationSpeed = CGeneral::GetRandomNumberInRange(-40, 80);
CParticle::AddParticle(PARTICLE_CAR_DEBRIS, vecPos, vecDir, nil, fSize, color, nRotationSpeed, 0, currentFrame, 0);
}
PlayOneShotScriptObject(_SCRSOUND_COL_CAR, vecPos);
break;
}
}
}
}
void void
CObject::RefModelInfo(int32 modelId) CObject::RefModelInfo(int32 modelId)
@ -125,6 +306,39 @@ CObject::RefModelInfo(int32 modelId)
CModelInfo::GetModelInfo(modelId)->AddRef(); CModelInfo::GetModelInfo(modelId)->AddRef();
} }
void
CObject::Init(void)
{
m_type = ENTITY_TYPE_OBJECT;;
CObjectData::SetObjectData(m_modelIndex, *this);
m_nEndOfLifeTime = 0;
ObjectCreatedBy = GAME_OBJECT;
bIsStatic = true;
bIsPickup = false;
m_obj_flag2 = false;
bOutOfStock = false;
bGlassCracked = false;
bGlassBroken = false;
bHasBeenDamaged = false;
bUseVehicleColours = false;
m_nRefModelIndex = -1;
m_colour1 = 0;
m_colour2 = 0;
m_nBonusValue = 0;
m_pCollidingEntity = nil;
CColPoint point;
CEntity* outEntity = nil;
const CVector& vecPos = m_matrix.GetPosition();
if (CWorld::ProcessVerticalLine(vecPos, vecPos.z - 10.0f, point, outEntity, true, false, false, false, false, false, nil))
m_pCurSurface = outEntity;
else
m_pCurSurface = nil;
if (m_modelIndex == MI_BODYCAST)
nBodyCastHealth = 1000;
else if (m_modelIndex == MI_BUOY)
bTouchingWater = true;
}
bool bool
CObject::CanBeDeleted(void) CObject::CanBeDeleted(void)
{ {
@ -142,6 +356,45 @@ CObject::CanBeDeleted(void)
} }
} }
void
CObject::DeleteAllMissionObjects()
{
CObjectPool* objectPool = CPools::GetObjectPool();
for (int32 i = 0; i < objectPool->GetSize(); i++) {
CObject* pObject = objectPool->GetSlot(i);
if (pObject && pObject->ObjectCreatedBy == MISSION_OBJECT) {
CWorld::Remove(pObject);
delete pObject;
}
}
}
void
CObject::DeleteAllTempObjects()
{
CObjectPool* objectPool = CPools::GetObjectPool();
for (int32 i = 0; i < objectPool->GetSize(); i++) {
CObject* pObject = objectPool->GetSlot(i);
if (pObject && pObject->ObjectCreatedBy == TEMP_OBJECT) {
CWorld::Remove(pObject);
delete pObject;
}
}
}
void
CObject::DeleteAllTempObjectInArea(CVector point, float fRadius)
{
CObjectPool *objectPool = CPools::GetObjectPool();
for (int32 i = 0; i < objectPool->GetSize(); i++) {
CObject *pObject = objectPool->GetSlot(i);
if (pObject && pObject->ObjectCreatedBy == TEMP_OBJECT && fRadius * fRadius > pObject->GetPosition().MagnitudeSqr()) {
CWorld::Remove(pObject);
delete pObject;
}
}
}
#include <new> #include <new>
class CObject_ : public CObject class CObject_ : public CObject
@ -152,6 +405,9 @@ public:
CObject *ctor(CDummyObject *dummy) { return ::new (this) CObject(dummy); } CObject *ctor(CDummyObject *dummy) { return ::new (this) CObject(dummy); }
void dtor(void) { CObject::~CObject(); } void dtor(void) { CObject::~CObject(); }
void Render_(void) { CObject::Render(); } void Render_(void) { CObject::Render(); }
void ProcessControl_(void) { CObject::ProcessControl(); }
bool SetupLighting_(void) { return CObject::SetupLighting(); }
void RemoveLighting_(bool reset) { CObject::RemoveLighting(reset); }
}; };
STARTPATCHES STARTPATCHES
@ -159,5 +415,16 @@ STARTPATCHES
InjectHook(0x4BACE0, (CObject* (CObject::*)(int32, bool)) &CObject_::ctor, PATCH_JUMP); InjectHook(0x4BACE0, (CObject* (CObject::*)(int32, bool)) &CObject_::ctor, PATCH_JUMP);
InjectHook(0x4BAD50, (CObject* (CObject::*)(CDummyObject*)) &CObject_::ctor, PATCH_JUMP); InjectHook(0x4BAD50, (CObject* (CObject::*)(CDummyObject*)) &CObject_::ctor, PATCH_JUMP);
InjectHook(0x4BAE00, &CObject_::dtor, PATCH_JUMP); InjectHook(0x4BAE00, &CObject_::dtor, PATCH_JUMP);
InjectHook(0x4BB040, &CObject_::ProcessControl_, PATCH_JUMP);
InjectHook(0x4BBDA0, &CObject::Teleport, PATCH_JUMP);
InjectHook(0x4BB1E0, &CObject_::Render_, PATCH_JUMP); InjectHook(0x4BB1E0, &CObject_::Render_, PATCH_JUMP);
InjectHook(0x4A7C90, &CObject_::SetupLighting_, PATCH_JUMP);
InjectHook(0x4A7CD0, &CObject_::RemoveLighting_, PATCH_JUMP);
InjectHook(0x4BB240, &CObject::ObjectDamage, PATCH_JUMP);
InjectHook(0x4BBD80, &CObject::RefModelInfo, PATCH_JUMP);
InjectHook(0x4BAEC0, &CObject::Init, PATCH_JUMP);
InjectHook(0x4BB010, &CObject::CanBeDeleted, PATCH_JUMP);
InjectHook(0x4BBE60, &CObject::DeleteAllMissionObjects, PATCH_JUMP);
InjectHook(0x4BBDF0, &CObject::DeleteAllTempObjects, PATCH_JUMP);
InjectHook(0x4BBED0, &CObject::DeleteAllTempObjectInArea, PATCH_JUMP);
ENDPATCHES ENDPATCHES

View File

@ -3,12 +3,25 @@
#include "Physical.h" #include "Physical.h"
enum { enum {
UNKNOWN_OBJECT = 0,
GAME_OBJECT = 1, GAME_OBJECT = 1,
MISSION_OBJECT = 2, MISSION_OBJECT = 2,
TEMP_OBJECT = 3, TEMP_OBJECT = 3,
CUTSCENE_OBJECT = 4, CUTSCENE_OBJECT = 4,
}; };
enum {
COLDAMAGE_EFFECT_NONE = 0,
COLDAMAGE_EFFECT_CHANGE_MODEL = 1,
COLDAMAGE_EFFECT_SPLIT_MODEL = 2,
COLDAMAGE_EFFECT_SMASH_COMPLETELY = 3,
COLDAMAGE_EFFECT_CHANGE_THEN_SMASH = 4,
COLDAMAGE_EFFECT_SMASH_CARDBOX_COMPLETELY = 50,
COLDAMAGE_EFFECT_SMASH_WOODENBOX_COMPLETELY = 60,
COLDAMAGE_EFFECT_SMASH_TRAFFICCONE_COMPLETELY = 70,
COLDAMAGE_EFFECT_SMASH_BARPOST_COMPLETELY = 80,
};
enum { enum {
COLLRESPONSE_NONE, COLLRESPONSE_NONE,
COLLRESPONSE_CHANGE_MODEL, COLLRESPONSE_CHANGE_MODEL,
@ -41,21 +54,21 @@ public:
int8 bHasBeenDamaged : 1; int8 bHasBeenDamaged : 1;
int8 bUseVehicleColours : 1; int8 bUseVehicleColours : 1;
int8 m_obj_flag80 : 1; int8 m_obj_flag80 : 1;
int8 field_172; // car for a bonus pickup? int8 m_nBonusValue;
int8 field_173; int8 field_173;
float m_fCollisionDamageMultiplier; float m_fCollisionDamageMultiplier;
uint8 m_nCollisionDamageEffect; uint8 m_nCollisionDamageEffect;
uint8 m_nSpecialCollisionResponseCases; uint8 m_nSpecialCollisionResponseCases;
bool m_bCameraToAvoidThisObject; bool m_bCameraToAvoidThisObject;
int8 field_17B; int8 field_17B;
int8 field_17C; int8 field_17C;
int8 field_17D; int8 field_17D;
int8 field_17E; int8 field_17E;
int8 field_17F; int8 field_17F;
uint32 m_nEndOfLifeTime; uint32 m_nEndOfLifeTime;
int16 m_nRefModelIndex; int16 m_nRefModelIndex;
int8 field_186; int8 field_186;
int8 field_187; int8 field_187;
CEntity *m_pCurSurface; CEntity *m_pCurSurface;
CEntity *m_pCollidingEntity; CEntity *m_pCollidingEntity;
int8 m_colour1, m_colour2; int8 m_colour1, m_colour2;
@ -74,7 +87,7 @@ public:
~CObject(void); ~CObject(void);
void ProcessControl(void); void ProcessControl(void);
void Teleport(CVector); void Teleport(CVector vecPos);
void Render(void); void Render(void);
bool SetupLighting(void); bool SetupLighting(void);
void RemoveLighting(bool reset); void RemoveLighting(bool reset);
@ -84,6 +97,8 @@ public:
void Init(void); void Init(void);
bool CanBeDeleted(void); bool CanBeDeleted(void);
static void DeleteAllTempObjectInArea(CVector, float); static void DeleteAllMissionObjects();
static void DeleteAllTempObjects();
static void DeleteAllTempObjectInArea(CVector point, float fRadius);
}; };
static_assert(sizeof(CObject) == 0x198, "CObject: error"); static_assert(sizeof(CObject) == 0x198, "CObject: error");

View File

@ -15027,7 +15027,7 @@ CPed::ProcessBuoyancy(void)
#endif #endif
if (mod_Buoyancy.ProcessBuoyancy(this, GRAVITY * m_fMass * buoyancyLevel, &buoyancyPoint, &buoyancyImpulse)) { if (mod_Buoyancy.ProcessBuoyancy(this, GRAVITY * m_fMass * buoyancyLevel, &buoyancyPoint, &buoyancyImpulse)) {
m_flagD8 = true; bTouchingWater = true;
CEntity *entity; CEntity *entity;
CColPoint point; CColPoint point;
if (CWorld::ProcessVerticalLine(GetPosition(), GetPosition().z - 3.0f, point, entity, false, true, false, false, false, false, false) if (CWorld::ProcessVerticalLine(GetPosition(), GetPosition().z - 3.0f, point, entity, false, true, false, false, false, false, false)
@ -15093,7 +15093,7 @@ CPed::ProcessBuoyancy(void)
} else } else
return; return;
} else } else
m_flagD8 = false; bTouchingWater = false;
if (nGenerateWaterCircles && CTimer::GetTimeInMilliseconds() >= nGenerateWaterCircles) { if (nGenerateWaterCircles && CTimer::GetTimeInMilliseconds() >= nGenerateWaterCircles) {
CVector pos = GetPosition(); CVector pos = GetPosition();

View File

@ -967,7 +967,7 @@ CPopulation::ConvertToRealObject(CDummyObject *dummy)
} else if (obj->m_modelIndex == MI_BUOY) { } else if (obj->m_modelIndex == MI_BUOY) {
obj->bIsStatic = false; obj->bIsStatic = false;
obj->m_vecMoveSpeed = CVector(0.0f, 0.0f, -0.001f); obj->m_vecMoveSpeed = CVector(0.0f, 0.0f, -0.001f);
obj->m_flagD8 = true; obj->bTouchingWater = true;
obj->AddToMovingList(); obj->AddToMovingList();
} }
} }

View File

@ -2814,7 +2814,7 @@ CAutomobile::ProcessBuoyancy(void)
CVector impulse, point; CVector impulse, point;
if(mod_Buoyancy.ProcessBuoyancy(this, m_fBuoyancy, &point, &impulse)){ if(mod_Buoyancy.ProcessBuoyancy(this, m_fBuoyancy, &point, &impulse)){
m_flagD8 = true; bTouchingWater = true;
ApplyMoveForce(impulse); ApplyMoveForce(impulse);
ApplyTurnForce(impulse, point); ApplyTurnForce(impulse, point);
@ -2899,7 +2899,7 @@ CAutomobile::ProcessBuoyancy(void)
} }
}else{ }else{
bIsInWater = false; bIsInWater = false;
m_flagD8 = false; bTouchingWater = false;
static RwRGBA splashCol = {155, 155, 185, 196}; static RwRGBA splashCol = {155, 155, 185, 196};
static RwRGBA smokeCol = {255, 255, 255, 255}; static RwRGBA smokeCol = {255, 255, 255, 255};

View File

@ -70,7 +70,7 @@ CBoat::CBoat(int mi, uint8 owner) : CVehicle(owner)
unk1 = 0.0f; unk1 = 0.0f;
m_bIsAnchored = true; m_bIsAnchored = true;
field_2C4 = -9999.99f; field_2C4 = -9999.99f;
m_flagD8 = true; bTouchingWater = true;
field_2CC = 0.0f; field_2CC = 0.0f;
field_2D0 = 0; field_2D0 = 0;
m_nNumWakePoints = 0; m_nNumWakePoints = 0;

View File

@ -26,7 +26,7 @@ cBuoyancy::ProcessBuoyancy(CPhysical *phys, float buoyancy, CVector *point, CVec
{ {
m_numSteps = 2.0f; m_numSteps = 2.0f;
if(!CWaterLevel::GetWaterLevel(phys->GetPosition(), &m_waterlevel, phys->m_flagD8)) if(!CWaterLevel::GetWaterLevel(phys->GetPosition(), &m_waterlevel, phys->bTouchingWater))
return false; return false;
m_matrix = phys->GetMatrix(); m_matrix = phys->GetMatrix();