summaryrefslogtreecommitdiffstats
path: root/src/vehicles
diff options
context:
space:
mode:
Diffstat (limited to 'src/vehicles')
-rw-r--r--src/vehicles/Automobile.cpp220
-rw-r--r--src/vehicles/Automobile.h3
-rw-r--r--src/vehicles/Boat.cpp110
-rw-r--r--src/vehicles/Boat.h2
-rw-r--r--src/vehicles/CarGen.cpp11
-rw-r--r--src/vehicles/Cranes.cpp10
-rw-r--r--src/vehicles/DamageManager.cpp23
-rw-r--r--src/vehicles/Door.cpp18
-rw-r--r--src/vehicles/Floater.cpp16
-rw-r--r--src/vehicles/Floater.h2
-rw-r--r--src/vehicles/HandlingMgr.cpp12
-rw-r--r--src/vehicles/HandlingMgr.h6
-rw-r--r--src/vehicles/Heli.cpp192
-rw-r--r--src/vehicles/Heli.h13
-rw-r--r--src/vehicles/Plane.cpp93
-rw-r--r--src/vehicles/Plane.h8
-rw-r--r--src/vehicles/Train.cpp61
-rw-r--r--src/vehicles/Transmission.cpp7
-rw-r--r--src/vehicles/Vehicle.cpp85
-rw-r--r--src/vehicles/Vehicle.h15
20 files changed, 377 insertions, 530 deletions
diff --git a/src/vehicles/Automobile.cpp b/src/vehicles/Automobile.cpp
index 257c8d33..74609e15 100644
--- a/src/vehicles/Automobile.cpp
+++ b/src/vehicles/Automobile.cpp
@@ -1,6 +1,6 @@
#include "common.h"
#include "main.h"
-#include "patcher.h"
+
#include "General.h"
#include "RwHelper.h"
#include "Pad.h"
@@ -49,7 +49,7 @@ bool bAllCarCheat; // unused
RwObject *GetCurrentAtomicObjectCB(RwObject *object, void *data);
-bool &CAutomobile::m_sAllTaxiLights = *(bool*)0x95CD21;
+bool CAutomobile::m_sAllTaxiLights;
CAutomobile::CAutomobile(int32 id, uint8 CreatedBy)
: CVehicle(CreatedBy)
@@ -356,7 +356,7 @@ CAutomobile::ProcessControl(void)
PruneReferences();
- if(m_status == STATUS_PLAYER && CRecordDataForChase::IsRecording())
+ if(m_status == STATUS_PLAYER && !CRecordDataForChase::IsRecording())
DoDriveByShootings();
}
break;
@@ -562,7 +562,7 @@ CAutomobile::ProcessControl(void)
bWasPostponed = false;
bHasHitWall = false;
m_fDistanceTravelled = 0.0f;
- field_EF = false;
+ m_bIsVehicleBeingShifted = false;
m_phy_flagA80 = false;
ApplyMoveSpeed();
ApplyTurnSpeed();
@@ -692,7 +692,7 @@ CAutomobile::ProcessControl(void)
if(m_aSuspensionSpringRatio[i] < 1.0f)
m_aWheelTimer[i] = 4.0f;
else
- m_aWheelTimer[i] = max(m_aWheelTimer[i]-CTimer::GetTimeStep(), 0.0f);
+ m_aWheelTimer[i] = Max(m_aWheelTimer[i]-CTimer::GetTimeStep(), 0.0f);
if(m_aWheelTimer[i] > 0.0f){
m_nWheelsOnGround++;
@@ -1010,7 +1010,7 @@ CAutomobile::ProcessControl(void)
if(m_status != STATUS_PLAYER && m_status != STATUS_PLAYER_REMOTE && m_status != STATUS_PHYSICS){
if(GetModelIndex() == MI_MIAMI_RCRAIDER || GetModelIndex() == MI_MIAMI_SPARROW)
- m_aWheelSpeed[0] = max(m_aWheelSpeed[0]-0.0005f, 0.0f);
+ m_aWheelSpeed[0] = Max(m_aWheelSpeed[0]-0.0005f, 0.0f);
}else if((GetModelIndex() == MI_DODO || CVehicle::bAllDodosCheat) &&
m_vecMoveSpeed.Magnitude() > 0.0f && CTimer::GetTimeStep() > 0.0f){
FlyingControl(FLIGHT_MODEL_DODO);
@@ -1018,7 +1018,7 @@ CAutomobile::ProcessControl(void)
FlyingControl(FLIGHT_MODEL_RCPLANE);
}else if(GetModelIndex() == MI_MIAMI_RCRAIDER || GetModelIndex() == MI_MIAMI_SPARROW || bAllCarCheat){
if(CPad::GetPad(0)->GetCircleJustDown())
- m_aWheelSpeed[0] = max(m_aWheelSpeed[0]-0.03f, 0.0f);
+ m_aWheelSpeed[0] = Max(m_aWheelSpeed[0]-0.03f, 0.0f);
if(m_aWheelSpeed[0] < 0.22f)
m_aWheelSpeed[0] += 0.0001f;
if(m_aWheelSpeed[0] > 0.15f)
@@ -1130,10 +1130,10 @@ CAutomobile::ProcessControl(void)
if(speed > sq(0.1f)){
speed = Sqrt(speed);
if(suspShake > 0.0f){
- uint8 freq = min(200.0f*suspShake*speed*2000.0f/m_fMass + 100.0f, 250.0f);
+ uint8 freq = Min(200.0f*suspShake*speed*2000.0f/m_fMass + 100.0f, 250.0f);
CPad::GetPad(0)->StartShake(20000.0f*CTimer::GetTimeStep()/freq, freq);
}else{
- uint8 freq = min(200.0f*surfShake*speed*2000.0f/m_fMass + 40.0f, 145.0f);
+ uint8 freq = Min(200.0f*surfShake*speed*2000.0f/m_fMass + 40.0f, 145.0f);
CPad::GetPad(0)->StartShake(5000.0f*CTimer::GetTimeStep()/freq, freq);
}
}
@@ -2148,7 +2148,7 @@ CAutomobile::ProcessEntityCollision(CEntity *ent, CColPoint *colpoints)
// m_aSuspensionSpringRatio are now set to the point where the tyre touches ground.
// In ProcessControl these will be re-normalized to ignore the tyre radius.
- if(field_EF || m_phy_flagA80 ||
+ if(m_bIsVehicleBeingShifted || m_phy_flagA80 ||
GetModelIndex() == MI_DODO && (ent->IsPed() || ent->IsVehicle())){
// don't do line collision
for(i = 0; i < 4; i++)
@@ -2601,7 +2601,7 @@ CAutomobile::HydraulicControl(void)
float minz = pos.z + extendedLowerLimit - wheelRadius;
if(minz < specialColModel->boundingBox.min.z)
specialColModel->boundingBox.min.z = minz;
- float radius = max(specialColModel->boundingBox.min.Magnitude(), specialColModel->boundingBox.max.Magnitude());
+ float radius = Max(specialColModel->boundingBox.min.Magnitude(), specialColModel->boundingBox.max.Magnitude());
if(specialColModel->boundingSphere.radius < radius)
specialColModel->boundingSphere.radius = radius;
@@ -2700,10 +2700,10 @@ CAutomobile::HydraulicControl(void)
float front = -rear;
float right = CPad::GetPad(0)->GetCarGunLeftRight()/128.0f;
float left = -right;
- suspChange[CARWHEEL_FRONT_LEFT] = max(front+left, 0.0f);
- suspChange[CARWHEEL_REAR_LEFT] = max(rear+left, 0.0f);
- suspChange[CARWHEEL_FRONT_RIGHT] = max(front+right, 0.0f);
- suspChange[CARWHEEL_REAR_RIGHT] = max(rear+right, 0.0f);
+ suspChange[CARWHEEL_FRONT_LEFT] = Max(front+left, 0.0f);
+ suspChange[CARWHEEL_REAR_LEFT] = Max(rear+left, 0.0f);
+ suspChange[CARWHEEL_FRONT_RIGHT] = Max(front+right, 0.0f);
+ suspChange[CARWHEEL_REAR_RIGHT] = Max(rear+right, 0.0f);
if(m_hydraulicState < 100){
// Lowered, move wheels up
@@ -2819,7 +2819,7 @@ CAutomobile::ProcessBuoyancy(void)
ApplyTurnForce(impulse, point);
CVector initialSpeed = m_vecMoveSpeed;
- float timeStep = max(CTimer::GetTimeStep(), 0.01f);
+ float timeStep = Max(CTimer::GetTimeStep(), 0.01f);
float impulseRatio = impulse.z / (GRAVITY * m_fMass * timeStep);
float waterResistance = Pow(1.0f - 0.05f*impulseRatio, CTimer::GetTimeStep());
m_vecMoveSpeed *= waterResistance;
@@ -2848,6 +2848,7 @@ CAutomobile::ProcessBuoyancy(void)
static uint32 nGenerateWaterCircles = 0;
if(initialSpeed.z < -0.3f && impulse.z > 0.3f){
+#if defined(PC_PARTICLE) || defined (PS2_ALTERNATIVE_CARSPLASH)
RwRGBA color;
color.red = (0.5f * CTimeCycle::GetDirectionalRed() + CTimeCycle::GetAmbientRed())*0.45f*255;
color.green = (0.5f * CTimeCycle::GetDirectionalGreen() + CTimeCycle::GetAmbientGreen())*0.45f*255;
@@ -2856,6 +2857,30 @@ CAutomobile::ProcessBuoyancy(void)
CParticleObject::AddObject(POBJECT_CAR_WATER_SPLASH, GetPosition(),
CVector(0.0f, 0.0f, CGeneral::GetRandomNumberInRange(0.15f, 0.3f)),
0.0f, 75, color, true);
+#else
+ CVector pos = (initialSpeed * 2.0f) + (GetPosition() + point);
+
+ for ( int32 i = 0; i < 360; i += 4 )
+ {
+ float fSin = Sin(float(i));
+ float fCos = Cos(float(i));
+
+ CVector dir(fSin*0.01f, fCos*0.01f, CGeneral::GetRandomNumberInRange(0.25f, 0.45f));
+
+ CParticle::AddParticle(PARTICLE_CAR_SPLASH,
+ pos + CVector(fSin*4.5f, fCos*4.5f, 0.0f),
+ dir, NULL, 0.0f, CRGBA(225, 225, 255, 180));
+
+ for ( int32 j = 0; j < 3; j++ )
+ {
+ float fMul = 1.5f * float(j + 1);
+
+ CParticle::AddParticle(PARTICLE_CAR_SPLASH,
+ pos + CVector(fSin * fMul, fCos * fMul, 0.0f),
+ dir, NULL, 0.0f, CRGBA(225, 225, 255, 180));
+ }
+ }
+#endif
nGenerateRaindrops = CTimer::GetTimeInMilliseconds() + 300;
nGenerateWaterCircles = CTimer::GetTimeInMilliseconds() + 60;
@@ -2909,10 +2934,17 @@ CAutomobile::ProcessBuoyancy(void)
CVector pos = m_aWheelColPoints[i].point + 0.3f*GetUp() - GetPosition();
CVector vSpeed = GetSpeed(pos);
vSpeed.z = 0.0f;
+#ifdef GTA_PS2_STUFF
+ // ps2 puddle physics
+ CVector moveForce = CTimer::GetTimeStep() * (m_fMass * (vSpeed * -0.003f));
+ ApplyMoveForce(moveForce.x, moveForce.y, moveForce.z);
+#endif
float fSpeed = vSpeed.MagnitudeSqr();
+#ifdef PC_PARTICLE
if(fSpeed > sq(0.05f)){
fSpeed = Sqrt(fSpeed);
- float size = min((fSpeed < 0.15f ? 0.25f : 0.75f)*fSpeed, 0.6f);
+
+ float size = Min((fSpeed < 0.15f ? 0.25f : 0.75f)*fSpeed, 0.6f);
CVector right = 0.2f*fSpeed*GetRight() + 0.2f*vSpeed;
CParticle::AddParticle(PARTICLE_PED_SPLASH,
@@ -2924,10 +2956,39 @@ CAutomobile::ProcessBuoyancy(void)
CParticle::AddParticle(PARTICLE_RUBBER_SMOKE,
pos + GetPosition(), -0.6f*right,
nil, size, smokeCol, 0, 0, 0, 0);
-
+
if((CTimer::GetFrameCounter() & 0xF) == 0)
DMAudio.PlayOneShot(m_audioEntityId, SOUND_CAR_SPLASH, 2000.0f*fSpeed);
}
+#else
+ if ( ( (CTimer::GetFrameCounter() + i) & 3 ) == 0 )
+ {
+ if(fSpeed > sq(0.05f))
+ {
+ fSpeed = Sqrt(fSpeed);
+ CRGBA color(155, 185, 155, 255);
+ float boxY = GetColModel()->boundingBox.max.y;
+ CVector right = 0.5f * GetRight();
+
+ if ( i == 2 )
+ {
+ CParticle::AddParticle(PARTICLE_PED_SPLASH,
+ GetPosition() + (boxY * GetForward()) + right,
+ 0.75f*m_vecMoveSpeed, NULL, 0.0f, color);
+
+ }
+ else if ( i == 0 )
+ {
+ CParticle::AddParticle(PARTICLE_PED_SPLASH,
+ GetPosition() + (boxY * GetForward()) - right,
+ 0.75f*m_vecMoveSpeed, NULL, 0.0f, color);
+ }
+
+ if((CTimer::GetFrameCounter() & 0xF) == 0)
+ DMAudio.PlayOneShot(m_audioEntityId, SOUND_CAR_SPLASH, 2000.0f*fSpeed);
+ }
+ }
+#endif
}
}
}
@@ -2994,11 +3055,11 @@ CAutomobile::DoDriveByShootings(void)
// TODO: what is this?
if(!lookingLeft && m_weaponDoorTimerLeft > 0.0f){
- m_weaponDoorTimerLeft = max(m_weaponDoorTimerLeft - CTimer::GetTimeStep()*0.1f, 0.0f);
+ m_weaponDoorTimerLeft = Max(m_weaponDoorTimerLeft - CTimer::GetTimeStep()*0.1f, 0.0f);
ProcessOpenDoor(CAR_DOOR_LF, NUM_ANIMS, m_weaponDoorTimerLeft);
}
if(!lookingRight && m_weaponDoorTimerRight > 0.0f){
- m_weaponDoorTimerRight = max(m_weaponDoorTimerRight - CTimer::GetTimeStep()*0.1f, 0.0f);
+ m_weaponDoorTimerRight = Max(m_weaponDoorTimerRight - CTimer::GetTimeStep()*0.1f, 0.0f);
ProcessOpenDoor(CAR_DOOR_RF, NUM_ANIMS, m_weaponDoorTimerRight);
}
}
@@ -3146,7 +3207,7 @@ CAutomobile::VehicleDamage(float impulse, uint16 damagedPiece)
FindPlayerPed()->SetWantedLevelNoDrop(1);
if(m_status == STATUS_PLAYER && impulse > 50.0f){
- uint8 freq = min(0.4f*impulse*2000.0f/m_fMass + 100.0f, 250.0f);
+ uint8 freq = Min(0.4f*impulse*2000.0f/m_fMass + 100.0f, 250.0f);
CPad::GetPad(0)->StartShake(40000/freq, freq);
}
@@ -3299,7 +3360,7 @@ CAutomobile::VehicleDamage(float impulse, uint16 damagedPiece)
if(m_pDamageEntity && m_pDamageEntity == FindPlayerVehicle() && impulse > 10.0f){
int money = (doubleMoney ? 2 : 1) * impulse*pHandling->nMonetaryValue/1000000.0f;
- money = min(money, 40);
+ money = Min(money, 40);
if(money > 2){
sprintf(gString, "$%d", money);
CWorld::Players[CWorld::PlayerInFocus].m_nMoney += money;
@@ -3486,14 +3547,29 @@ CAutomobile::AddWheelDirtAndWater(CColPoint *colpoint, uint32 belowEffectSpeed)
}
return 0;
default:
- // Is this even visible?
- if(CWeather::WetRoads > 0.01f && CTimer::GetFrameCounter() & 1){
- CParticle::AddParticle(PARTICLE_WATERSPRAY,
+ if ( CWeather::WetRoads > 0.01f
+#ifdef PC_PARTICLE
+ && CTimer::GetFrameCounter() & 1
+#endif
+ )
+ {
+ CParticle::AddParticle(
+#ifdef FIX_BUGS
+ PARTICLE_WHEEL_WATER,
+#else
+ PARTICLE_WATERSPRAY,
+#endif
colpoint->point + CVector(0.0f, 0.0f, 0.25f+0.25f),
- CVector(0.0f, 0.0f, 1.0f), nil,
+#ifdef PC_PARTICLE
+ CVector(0.0f, 0.0f, 1.0f),
+#else
+ CVector(0.0f, 0.0f, CGeneral::GetRandomNumberInRange(0.005f, 0.04f)),
+#endif
+ nil,
CGeneral::GetRandomNumberInRange(0.1f, 0.5f), waterCol);
return 0;
}
+
return 1;
}
}
@@ -4004,7 +4080,7 @@ CAutomobile::SetupSuspensionLines(void)
// adjust col model to include suspension lines
if(colModel->boundingBox.min.z > colModel->lines[0].p1.z)
colModel->boundingBox.min.z = colModel->lines[0].p1.z;
- float radius = max(colModel->boundingBox.min.Magnitude(), colModel->boundingBox.max.Magnitude());
+ float radius = Max(colModel->boundingBox.min.Magnitude(), colModel->boundingBox.max.Magnitude());
if(colModel->boundingSphere.radius < radius)
colModel->boundingSphere.radius = radius;
@@ -4206,8 +4282,7 @@ GetCurrentAtomicObjectCB(RwObject *object, void *data)
return object;
}
-CColPoint aTempPedColPts[32]; // this name doesn't make any sense
- // they probably copied it from Ped (both serves same purpose) and didn't change the name
+CColPoint spherepoints[MAX_COLLISION_POINTS];
CObject*
CAutomobile::SpawnFlyingComponent(int32 component, uint32 type)
@@ -4327,7 +4402,7 @@ CAutomobile::SpawnFlyingComponent(int32 component, uint32 type)
if(CCollision::ProcessColModels(obj->GetMatrix(), *obj->GetColModel(),
this->GetMatrix(), *this->GetColModel(),
- aTempPedColPts, nil, nil) > 0)
+ spherepoints, nil, nil) > 0)
obj->m_pCollidingEntity = this;
if(bRenderScorched)
@@ -4493,88 +4568,3 @@ CAutomobile::SetAllTaxiLights(bool set)
{
m_sAllTaxiLights = set;
}
-
-#include <new>
-
-class CAutomobile_ : public CAutomobile
-{
-public:
- void ctor(int32 id, uint8 CreatedBy) { ::new (this) CAutomobile(id, CreatedBy); }
- void dtor() { CAutomobile::~CAutomobile(); }
- void SetModelIndex_(uint32 id) { CAutomobile::SetModelIndex(id); }
- void ProcessControl_(void) { CAutomobile::ProcessControl(); }
- void Teleport_(CVector v) { CAutomobile::Teleport(v); }
- void PreRender_(void) { CAutomobile::PreRender(); }
- void Render_(void) { CAutomobile::Render(); }
-
- int32 ProcessEntityCollision_(CEntity *ent, CColPoint *colpoints){ return CAutomobile::ProcessEntityCollision(ent, colpoints); }
-
- void ProcessControlInputs_(uint8 pad) { CAutomobile::ProcessControlInputs(pad); }
- void GetComponentWorldPosition_(int32 component, CVector &pos) { CAutomobile::GetComponentWorldPosition(component, pos); }
- bool IsComponentPresent_(int32 component) { return CAutomobile::IsComponentPresent(component); }
- void SetComponentRotation_(int32 component, CVector rotation) { CAutomobile::SetComponentRotation(component, rotation); }
- void OpenDoor_(int32 component, eDoors door, float ratio) { CAutomobile::OpenDoor(component, door, ratio); }
- void ProcessOpenDoor_(uint32 component, uint32 anim, float time) { CAutomobile::ProcessOpenDoor(component, anim, time); }
- bool IsDoorReady_(eDoors door) { return CAutomobile::IsDoorReady(door); }
- bool IsDoorFullyOpen_(eDoors door) { return CAutomobile::IsDoorFullyOpen(door); }
- bool IsDoorClosed_(eDoors door) { return CAutomobile::IsDoorClosed(door); }
- bool IsDoorMissing_(eDoors door) { return CAutomobile::IsDoorMissing(door); }
- void RemoveRefsToVehicle_(CEntity *ent) { CAutomobile::RemoveRefsToVehicle(ent); }
- void BlowUpCar_(CEntity *ent) { CAutomobile::BlowUpCar(ent); }
- bool SetUpWheelColModel_(CColModel *colModel) { return CAutomobile::SetUpWheelColModel(colModel); }
- void BurstTyre_(uint8 tyre) { CAutomobile::BurstTyre(tyre); }
- bool IsRoomForPedToLeaveCar_(uint32 door, CVector *pos) { return CAutomobile::IsRoomForPedToLeaveCar(door, pos); }
- float GetHeightAboveRoad_(void) { return CAutomobile::GetHeightAboveRoad(); }
- void PlayCarHorn_(void) { CAutomobile::PlayCarHorn(); }
-};
-
-STARTPATCHES
- InjectHook(0x52C6B0, &CAutomobile_::ctor, PATCH_JUMP);
- InjectHook(0x52D170, &CAutomobile_::dtor, PATCH_JUMP);
- InjectHook(0x52D190, &CAutomobile_::SetModelIndex_, PATCH_JUMP);
- InjectHook(0x531470, &CAutomobile_::ProcessControl_, PATCH_JUMP);
- InjectHook(0x535180, &CAutomobile_::Teleport_, PATCH_JUMP);
- InjectHook(0x539EA0, &CAutomobile_::Render_, PATCH_JUMP);
- InjectHook(0x535B40, &CAutomobile_::PreRender_, PATCH_JUMP);
- InjectHook(0x53B270, &CAutomobile_::ProcessEntityCollision_, PATCH_JUMP);
- InjectHook(0x53B660, &CAutomobile_::ProcessControlInputs_, PATCH_JUMP);
- InjectHook(0x52E5F0, &CAutomobile_::GetComponentWorldPosition_, PATCH_JUMP);
- InjectHook(0x52E660, &CAutomobile_::IsComponentPresent_, PATCH_JUMP);
- InjectHook(0x52E680, &CAutomobile_::SetComponentRotation_, PATCH_JUMP);
- InjectHook(0x52E750, &CAutomobile_::OpenDoor_, PATCH_JUMP);
- InjectHook(0x52EF10, &CAutomobile_::IsDoorReady_, PATCH_JUMP);
- InjectHook(0x52EF90, &CAutomobile_::IsDoorFullyOpen_, PATCH_JUMP);
- InjectHook(0x52EFD0, &CAutomobile_::IsDoorClosed_, PATCH_JUMP);
- InjectHook(0x52F000, &CAutomobile_::IsDoorMissing_, PATCH_JUMP);
- InjectHook(0x53BF40, &CAutomobile_::RemoveRefsToVehicle_, PATCH_JUMP);
- InjectHook(0x53BC60, &CAutomobile_::BlowUpCar_, PATCH_JUMP);
- InjectHook(0x53BF70, &CAutomobile_::SetUpWheelColModel_, PATCH_JUMP);
- InjectHook(0x53C0E0, &CAutomobile_::BurstTyre_, PATCH_JUMP);
- InjectHook(0x53C5B0, &CAutomobile_::IsRoomForPedToLeaveCar_, PATCH_JUMP);
- InjectHook(0x437690, &CAutomobile_::GetHeightAboveRoad_, PATCH_JUMP);
- InjectHook(0x53C450, &CAutomobile_::PlayCarHorn_, PATCH_JUMP);
- InjectHook(0x53E090, &CAutomobile::PlaceOnRoadProperly, PATCH_JUMP);
- InjectHook(0x52F030, &CAutomobile::dmgDrawCarCollidingParticles, PATCH_JUMP);
- InjectHook(0x535450, &CAutomobile::AddDamagedVehicleParticles, PATCH_JUMP);
- InjectHook(0x5357D0, &CAutomobile::AddWheelDirtAndWater, PATCH_JUMP);
- InjectHook(0x5353A0, &CAutomobile::ResetSuspension, PATCH_JUMP);
- InjectHook(0x52D210, &CAutomobile::SetupSuspensionLines, PATCH_JUMP);
- InjectHook(0x53E000, &CAutomobile::BlowUpCarsInPath, PATCH_JUMP);
- InjectHook(0x42E220, &CAutomobile::HasCarStoppedBecauseOfLight, PATCH_JUMP);
- InjectHook(0x53D320, &CAutomobile::SetBusDoorTimer, PATCH_JUMP);
- InjectHook(0x53D370, &CAutomobile::ProcessAutoBusDoors, PATCH_JUMP);
- InjectHook(0x535250, &CAutomobile::ProcessSwingingDoor, PATCH_JUMP);
- InjectHook(0x53C240, &CAutomobile::Fix, PATCH_JUMP);
- InjectHook(0x53C310, &CAutomobile::SetupDamageAfterLoad, PATCH_JUMP);
- InjectHook(0x530300, &CAutomobile::SpawnFlyingComponent, PATCH_JUMP);
- InjectHook(0x535320, &CAutomobile::RemoveBonnetInPedCollision, PATCH_JUMP);
- InjectHook(0x5301A0, &CAutomobile::SetPanelDamage, PATCH_JUMP);
- InjectHook(0x530120, &CAutomobile::SetBumperDamage, PATCH_JUMP);
- InjectHook(0x530200, &CAutomobile::SetDoorDamage, PATCH_JUMP);
- InjectHook(0x5300E0, &CAutomobile::SetComponentVisibility, PATCH_JUMP);
- InjectHook(0x52D1B0, &CAutomobile::SetupModelNodes, PATCH_JUMP);
- InjectHook(0x53C420, &CAutomobile::SetTaxiLight, PATCH_JUMP);
- InjectHook(0x53BC40, &CAutomobile::GetAllWheelsOffGround, PATCH_JUMP);
- InjectHook(0x5308C0, &CAutomobile::ReduceHornCounter, PATCH_JUMP);
- InjectHook(0x53C440, &CAutomobile::SetAllTaxiLights, PATCH_JUMP);
-ENDPATCHES
diff --git a/src/vehicles/Automobile.h b/src/vehicles/Automobile.h
index 561ab566..2de85a99 100644
--- a/src/vehicles/Automobile.h
+++ b/src/vehicles/Automobile.h
@@ -92,7 +92,6 @@ public:
uint8 bWaterTight : 1; // no damage for non-player peds
uint8 bNotDamagedUpsideDown : 1;
uint8 bMoreResistantToDamage : 1;
- uint8 field_4DB;
CEntity *m_pBombRigger;
int16 field_4E0;
uint16 m_hydraulicState;
@@ -120,7 +119,7 @@ public:
float m_fGasPedalAudio;
tWheelState m_aWheelState[4];
- static bool &m_sAllTaxiLights;
+ static bool m_sAllTaxiLights;
CAutomobile(int32 id, uint8 CreatedBy);
diff --git a/src/vehicles/Boat.cpp b/src/vehicles/Boat.cpp
index 0159d168..14eb2f05 100644
--- a/src/vehicles/Boat.cpp
+++ b/src/vehicles/Boat.cpp
@@ -1,5 +1,5 @@
#include "common.h"
-#include "patcher.h"
+
#include "General.h"
#include "Timecycle.h"
#include "HandlingMgr.h"
@@ -21,16 +21,16 @@
#define INVALID_ORIENTATION (-9999.99f)
-float &fShapeLength = *(float*)0x600E78;
-float &fShapeTime = *(float*)0x600E7C;
-float &fRangeMult = *(float*)0x600E80; //0.6f; // 0.75f gta 3
-float &fTimeMult = *(float*)0x943008;
+float fShapeLength = 0.4f;
+float fShapeTime = 0.05f;
+float fRangeMult = 0.75f; //0.6f; // 0.75f gta 3
+float fTimeMult;
float MAX_WAKE_LENGTH = 50.0f;
float MIN_WAKE_INTERVAL = 1.0f;
float WAKE_LIFETIME = 400.0f;
-CBoat * (&CBoat::apFrameWakeGeneratingBoats)[4] = *(CBoat * (*)[4])*(uintptr*)0x8620E0;
+CBoat *CBoat::apFrameWakeGeneratingBoats[4];
CBoat::CBoat(int mi, uint8 owner) : CVehicle(owner)
{
@@ -272,7 +272,7 @@ CBoat::ProcessControl(void)
impulse = m_vecMoveSpeed.MagnitudeSqr()*pHandling->fSuspensionForceLevel*buoyanceImpulse.z*CTimer::GetTimeStep()*0.5f*m_fGasPedal;
else
impulse = 0.0f;
- impulse = min(impulse, GRAVITY*pHandling->fSuspensionDampingLevel*m_fMass*CTimer::GetTimeStep());
+ impulse = Min(impulse, GRAVITY*pHandling->fSuspensionDampingLevel*m_fMass*CTimer::GetTimeStep());
ApplyMoveForce(impulse*GetUp());
ApplyTurnForce(impulse*GetUp(), buoyancePoint - pHandling->fSuspensionBias*GetForward());
}
@@ -340,27 +340,46 @@ CBoat::ProcessControl(void)
else
jetPos.z = 0.0f;
+#ifdef PC_PARTICLE
CVector wakePos = GetPosition() + sternPos;
wakePos.z -= 0.65f;
+#else
+ CVector wakePos = GetPosition() + sternPos;
+ wakePos.z = -0.3f;
+#endif
CVector wakeDir = 0.75f * jetDir;
CParticle::AddParticle(PARTICLE_BOAT_THRUSTJET, jetPos, jetDir, nil, 0.0f, jetColor);
+#ifdef PC_PARTICLE
CParticle::AddParticle(PARTICLE_CAR_SPLASH, jetPos, 0.25f * jetDir, nil, 1.0f, splashColor,
CGeneral::GetRandomNumberInRange(0, 30),
CGeneral::GetRandomNumberInRange(0, 90), 3);
+#endif
if(!cameraHack)
CParticle::AddParticle(PARTICLE_BOAT_WAKE, wakePos, wakeDir, nil, 0.0f, jetColor);
}else if((CTimer::GetFrameCounter() + m_randomSeed) & 1){
+#ifdef PC_PARTICLE
jetDir.z = 0.018f;
jetDir.x *= 0.01f;
jetDir.y *= 0.01f;
propellerWorld.z += 1.5f;
-
+
CParticle::AddParticle(PARTICLE_BOAT_SPLASH, propellerWorld, jetDir, nil, 1.5f, jetColor);
+#else
+ jetDir.z = 0.018f;
+ jetDir.x *= 0.03f;
+ jetDir.y *= 0.03f;
+ propellerWorld.z += 1.0f;
+
+ CParticle::AddParticle(PARTICLE_BOAT_SPLASH, propellerWorld, jetDir, nil, 0.0f, jetColor);
+#endif
+
+#ifdef PC_PARTICLE
CParticle::AddParticle(PARTICLE_CAR_SPLASH, propellerWorld, 0.1f * jetDir, nil, 0.5f, splashColor,
CGeneral::GetRandomNumberInRange(0, 30),
CGeneral::GetRandomNumberInRange(0, 90), 3);
+#endif
}
}
}else if(!onLand){
@@ -375,10 +394,10 @@ CBoat::ProcessControl(void)
}
// Slow down or push down boat as it approaches the world limits
- m_vecMoveSpeed.x = min(m_vecMoveSpeed.x, -(GetPosition().x - 1900.0f)*0.01f); // east
- m_vecMoveSpeed.x = max(m_vecMoveSpeed.x, -(GetPosition().x - -1515.0f)*0.01f); // west
- m_vecMoveSpeed.y = min(m_vecMoveSpeed.y, -(GetPosition().y - 600.0f)*0.01f); // north
- m_vecMoveSpeed.y = max(m_vecMoveSpeed.y, -(GetPosition().y - -1900.0f)*0.01f); // south
+ m_vecMoveSpeed.x = Min(m_vecMoveSpeed.x, -(GetPosition().x - 1900.0f)*0.01f); // east
+ m_vecMoveSpeed.x = Max(m_vecMoveSpeed.x, -(GetPosition().x - -1515.0f)*0.01f); // west
+ m_vecMoveSpeed.y = Min(m_vecMoveSpeed.y, -(GetPosition().y - 600.0f)*0.01f); // north
+ m_vecMoveSpeed.y = Max(m_vecMoveSpeed.y, -(GetPosition().y - -1900.0f)*0.01f); // south
if(!onLand && bBoatInWater)
ApplyWaterResistance();
@@ -416,36 +435,66 @@ CBoat::ProcessControl(void)
}
// Spray particles on sides of boat
- if(m_nDeltaVolumeUnderWater > 75){
+#ifdef PC_PARTICLE
+ if(m_nDeltaVolumeUnderWater > 75)
+#else
+ if(m_nDeltaVolumeUnderWater > 120)
+#endif
+ {
float speed = m_vecMoveSpeed.Magnitude();
float splash1Size = speed;
- float splash2Size = m_nDeltaVolumeUnderWater * 0.005f * 0.2f;
+ float splash2Size = float(m_nDeltaVolumeUnderWater) * 0.005f * 0.2f;
float front = 0.9f * GetColModel()->boundingBox.max.y;
if(splash1Size > 0.75f) splash1Size = 0.75f;
CVector dir, pos;
// right
+#ifdef PC_PARTICLE
dir = -0.5f*m_vecMoveSpeed;
dir.z += 0.1f*speed;
dir += 0.5f*GetRight()*speed;
pos = front*GetForward() + 0.5f*GetRight() + GetPosition() + m_vecBuoyancePoint;
CWaterLevel::GetWaterLevel(pos, &pos.z, true);
+#else
+ dir = 0.3f*m_vecMoveSpeed;
+ dir.z += 0.05f*speed;
+ dir += 0.5f*GetRight()*speed;
+ pos = (GetPosition() + m_vecBuoyancePoint) + (1.5f*GetRight());
+#endif
+
+#ifdef PC_PARTICLE
CParticle::AddParticle(PARTICLE_CAR_SPLASH, pos, 0.75f * dir, nil, splash1Size, splashColor,
CGeneral::GetRandomNumberInRange(0, 30),
CGeneral::GetRandomNumberInRange(0, 90), 1);
CParticle::AddParticle(PARTICLE_BOAT_SPLASH, pos, dir, nil, splash2Size, jetColor);
+#else
+ CParticle::AddParticle(PARTICLE_BOAT_SPLASH, pos, dir, nil, splash2Size);
+#endif
+
// left
+#ifdef PC_PARTICLE
dir = -0.5f*m_vecMoveSpeed;
dir.z += 0.1f*speed;
dir -= 0.5f*GetRight()*speed;
pos = front*GetForward() - 0.5f*GetRight() + GetPosition() + m_vecBuoyancePoint;
CWaterLevel::GetWaterLevel(pos, &pos.z, true);
+#else
+ dir = 0.3f*m_vecMoveSpeed;
+ dir.z += 0.05f*speed;
+ dir -= 0.5f*GetRight()*speed;
+ pos = (GetPosition() + m_vecBuoyancePoint) - (1.5f*GetRight());
+#endif
+
+#ifdef PC_PARTICLE
CParticle::AddParticle(PARTICLE_CAR_SPLASH, pos, 0.75f * dir, nil, splash1Size, splashColor,
CGeneral::GetRandomNumberInRange(0, 30),
CGeneral::GetRandomNumberInRange(0, 90), 1);
CParticle::AddParticle(PARTICLE_BOAT_SPLASH, pos, dir, nil, splash2Size, jetColor);
+#else
+ CParticle::AddParticle(PARTICLE_BOAT_SPLASH, pos, dir, nil, splash2Size);
+#endif
}
m_fPrevVolumeUnderWater = m_fVolumeUnderWater;
@@ -658,13 +707,13 @@ CBoat::Render()
((CVehicleModelInfo*)CModelInfo::GetModelInfo(GetModelIndex()))->SetVehicleColour(m_currentColour1, m_currentColour2);
if (!CVehicle::bWheelsOnlyCheat)
CEntity::Render();
- KeepWaterOutVertices[0].color = -1;
+ RwIm3DVertexSetRGBA(&KeepWaterOutVertices[0], 255, 255, 255, 255);
KeepWaterOutIndices[0] = 0;
- KeepWaterOutVertices[1].color = -1;
+ RwIm3DVertexSetRGBA(&KeepWaterOutVertices[1], 255, 255, 255, 255);
KeepWaterOutIndices[1] = 2;
- KeepWaterOutVertices[2].color = -1;
+ RwIm3DVertexSetRGBA(&KeepWaterOutVertices[2], 255, 255, 255, 255);
KeepWaterOutIndices[2] = 1;
- KeepWaterOutVertices[3].color = -1;
+ RwIm3DVertexSetRGBA(&KeepWaterOutVertices[3], 255, 255, 255, 255);
KeepWaterOutIndices[3] = 1;
KeepWaterOutIndices[4] = 2;
KeepWaterOutIndices[5] = 3;
@@ -765,7 +814,7 @@ CBoat::IsVertexAffectedByWake(CVector vecVertex, CBoat *pBoat)
float fDist = vecDist.MagnitudeSqr();
if ( fDist < SQR(fMaxDist) )
- return 1.0f - min(fRangeMult * Sqrt(fDist / SQR(fMaxDist)) + (WAKE_LIFETIME - pBoat->m_afWakePointLifeTime[i]) * fTimeMult, 1.0f);
+ return 1.0f - Min(fRangeMult * Sqrt(fDist / SQR(fMaxDist)) + (WAKE_LIFETIME - pBoat->m_afWakePointLifeTime[i]) * fTimeMult, 1.0f);
}
return 0.0f;
@@ -837,7 +886,7 @@ CBoat::AddWakePoint(CVector point)
int i;
if(m_afWakePointLifeTime[0] > 0.0f){
if((CVector2D(GetPosition()) - m_avec2dWakePoints[0]).MagnitudeSqr() < SQR(1.0f)){
- for(i = min(m_nNumWakePoints, ARRAY_SIZE(m_afWakePointLifeTime)-1); i != 0; i--){
+ for(i = Min(m_nNumWakePoints, ARRAY_SIZE(m_afWakePointLifeTime)-1); i != 0; i--){
m_avec2dWakePoints[i] = m_avec2dWakePoints[i-1];
m_afWakePointLifeTime[i] = m_afWakePointLifeTime[i-1];
}
@@ -850,24 +899,3 @@ CBoat::AddWakePoint(CVector point)
m_nNumWakePoints = 1;
}
}
-
-#include <new>
-
-class CBoat_ : public CBoat
-{
-public:
- CBoat* ctor(int32 id, uint8 CreatedBy) { return ::new (this) CBoat(id, CreatedBy); }
- void dtor() { CBoat::~CBoat(); };
-};
-
-STARTPATCHES
- InjectHook(0x53E3E0, &CBoat_::ctor, PATCH_JUMP);
- InjectHook(0x53E790, &CBoat_::dtor, PATCH_JUMP);
- InjectHook(0x53E7D0, &CBoat::SetupModelNodes, PATCH_JUMP);
- InjectHook(0x542370, CBoat::IsSectorAffectedByWake, PATCH_JUMP);
- InjectHook(0x5424A0, CBoat::IsVertexAffectedByWake, PATCH_JUMP);
- InjectHook(0x542250, CBoat::FillBoatList, PATCH_JUMP);
- InjectHook(0x542140, &CBoat::AddWakePoint, PATCH_JUMP);
- InjectHook(0x5420D0, &CBoat::PruneWakeTrail, PATCH_JUMP);
- InjectHook(0x541A30, &CBoat::ApplyWaterResistance, PATCH_JUMP);
-ENDPATCHES
diff --git a/src/vehicles/Boat.h b/src/vehicles/Boat.h
index f4c6a747..ba56e355 100644
--- a/src/vehicles/Boat.h
+++ b/src/vehicles/Boat.h
@@ -58,7 +58,7 @@ public:
void PruneWakeTrail(void);
void AddWakePoint(CVector point);
- static CBoat *(&apFrameWakeGeneratingBoats)[4];
+ static CBoat *apFrameWakeGeneratingBoats[4];
static bool IsSectorAffectedByWake(CVector2D sector, float fSize, CBoat **apBoats);
static float IsVertexAffectedByWake(CVector vecVertex, CBoat *pBoat);
diff --git a/src/vehicles/CarGen.cpp b/src/vehicles/CarGen.cpp
index c35005a1..64743929 100644
--- a/src/vehicles/CarGen.cpp
+++ b/src/vehicles/CarGen.cpp
@@ -1,5 +1,5 @@
#include "common.h"
-#include "patcher.h"
+
#include "CarGen.h"
#include "Automobile.h"
@@ -157,7 +157,7 @@ void CCarGenerator::Setup(float x, float y, float z, float angle, int32 mi, int1
m_bIsBlocking = false;
m_vecInf = CModelInfo::GetModelInfo(m_nModelIndex)->GetColModel()->boundingBox.min;
m_vecSup = CModelInfo::GetModelInfo(m_nModelIndex)->GetColModel()->boundingBox.max;
- m_fSize = max(m_vecInf.Magnitude(), m_vecSup.Magnitude());
+ m_fSize = Max(m_vecInf.Magnitude(), m_vecSup.Magnitude());
}
bool CCarGenerator::CheckForBlockage()
@@ -249,10 +249,3 @@ INITSAVEBUF
CarGeneratorArray[i] = ReadSaveBuf<CCarGenerator>(buffer);
VALIDATESAVEBUF(size)
}
-
-STARTPATCHES
-InjectHook(0x543020, CTheCarGenerators::Init, PATCH_JUMP);
-InjectHook(0x542F40, CTheCarGenerators::Process, PATCH_JUMP);
-InjectHook(0x543050, CTheCarGenerators::SaveAllCarGenerators, PATCH_JUMP);
-InjectHook(0x5431E0, CTheCarGenerators::LoadAllCarGenerators, PATCH_JUMP);
-ENDPATCHES
diff --git a/src/vehicles/Cranes.cpp b/src/vehicles/Cranes.cpp
index dbc3c340..7d2160d9 100644
--- a/src/vehicles/Cranes.cpp
+++ b/src/vehicles/Cranes.cpp
@@ -1,5 +1,5 @@
#include "common.h"
-#include "patcher.h"
+
#include "Cranes.h"
#include "Camera.h"
@@ -213,10 +213,10 @@ void CCrane::Update(void)
CTimer::GetTimeInMilliseconds() > m_nTimeForNextCheck) {
CWorld::AdvanceCurrentScanCode();
#ifdef FIX_BUGS
- int xstart = max(0, CWorld::GetSectorIndexX(m_fPickupX1));
- int xend = min(NUMSECTORS_X - 1, CWorld::GetSectorIndexX(m_fPickupX2));
- int ystart = max(0, CWorld::GetSectorIndexY(m_fPickupY1));
- int yend = min(NUMSECTORS_Y - 1, CWorld::GetSectorIndexY(m_fPickupY2));
+ int xstart = Max(0, CWorld::GetSectorIndexX(m_fPickupX1));
+ int xend = Min(NUMSECTORS_X - 1, CWorld::GetSectorIndexX(m_fPickupX2));
+ int ystart = Max(0, CWorld::GetSectorIndexY(m_fPickupY1));
+ int yend = Min(NUMSECTORS_Y - 1, CWorld::GetSectorIndexY(m_fPickupY2));
#else
int xstart = CWorld::GetSectorIndexX(m_fPickupX1);
int xend = CWorld::GetSectorIndexX(m_fPickupX2);
diff --git a/src/vehicles/DamageManager.cpp b/src/vehicles/DamageManager.cpp
index 9a697b6b..03ccfe77 100644
--- a/src/vehicles/DamageManager.cpp
+++ b/src/vehicles/DamageManager.cpp
@@ -1,5 +1,5 @@
#include "common.h"
-#include "patcher.h"
+
#include "General.h"
#include "Vehicle.h"
#include "DamageManager.h"
@@ -228,24 +228,3 @@ CDamageManager::ProgressEngineDamage(void)
SetEngineStatus(newstatus);
return true;
}
-
-STARTPATCHES
- InjectHook(0x545850, &CDamageManager::ResetDamageStatus, PATCH_JUMP);
- InjectHook(0x545B70, &CDamageManager::FuckCarCompletely, PATCH_JUMP);
- InjectHook(0x545790, &CDamageManager::GetComponentGroup, PATCH_JUMP);
- InjectHook(0x545A80, &CDamageManager::ApplyDamage, PATCH_JUMP);
- InjectHook(0x545920, &CDamageManager::SetDoorStatus, PATCH_JUMP);
- InjectHook(0x545930, &CDamageManager::GetDoorStatus, PATCH_JUMP);
- InjectHook(0x545970, &CDamageManager::ProgressDoorDamage, PATCH_JUMP);
- InjectHook(0x5458B0, &CDamageManager::SetPanelStatus, PATCH_JUMP);
- InjectHook(0x5458E0, (int32 (CDamageManager::*)(int32))&CDamageManager::GetPanelStatus, PATCH_JUMP);
- InjectHook(0x545A00, &CDamageManager::ProgressPanelDamage, PATCH_JUMP);
- InjectHook(0x545860, &CDamageManager::SetLightStatus, PATCH_JUMP);
- InjectHook(0x545890, &CDamageManager::GetLightStatus, PATCH_JUMP);
- InjectHook(0x545900, &CDamageManager::SetWheelStatus, PATCH_JUMP);
- InjectHook(0x545910, &CDamageManager::GetWheelStatus, PATCH_JUMP);
- InjectHook(0x545A40, &CDamageManager::ProgressWheelDamage, PATCH_JUMP);
- InjectHook(0x545940, &CDamageManager::SetEngineStatus, PATCH_JUMP);
- InjectHook(0x545960, &CDamageManager::GetEngineStatus, PATCH_JUMP);
- InjectHook(0x5459B0, &CDamageManager::ProgressEngineDamage, PATCH_JUMP);
-ENDPATCHES
diff --git a/src/vehicles/Door.cpp b/src/vehicles/Door.cpp
index c569be59..c80965aa 100644
--- a/src/vehicles/Door.cpp
+++ b/src/vehicles/Door.cpp
@@ -1,5 +1,5 @@
#include "common.h"
-#include "patcher.h"
+
#include "Vehicle.h"
#include "Door.h"
@@ -168,19 +168,3 @@ CTrainDoor::IsClosed(void)
{
return m_fPosn == RetTranslationWhenClosed();
}
-
-STARTPATCHES
- InjectHook(0x545EF0, &CDoor::Open, PATCH_JUMP);
- InjectHook(0x545BD0, &CDoor::Process, PATCH_JUMP);
- InjectHook(0x545FE0, &CDoor::RetAngleWhenClosed, PATCH_JUMP);
- InjectHook(0x546020, &CDoor::RetAngleWhenOpen, PATCH_JUMP);
- InjectHook(0x545F80, &CDoor::GetAngleOpenRatio, PATCH_JUMP);
- InjectHook(0x546090, &CDoor::IsFullyOpen, PATCH_JUMP);
- InjectHook(0x546060, &CDoor::IsClosed, PATCH_JUMP);
-
- InjectHook(0x546200, &CTrainDoor::Open, PATCH_JUMP);
- InjectHook(0x546180, &CTrainDoor::RetTranslationWhenClosed, PATCH_JUMP);
- InjectHook(0x5461C0, &CTrainDoor::RetTranslationWhenOpen, PATCH_JUMP);
- InjectHook(0x546120, &CTrainDoor::IsFullyOpen, PATCH_JUMP);
- InjectHook(0x5460F0, &CTrainDoor::IsClosed, PATCH_JUMP);
-ENDPATCHES
diff --git a/src/vehicles/Floater.cpp b/src/vehicles/Floater.cpp
index 62d55925..1ae1c5c3 100644
--- a/src/vehicles/Floater.cpp
+++ b/src/vehicles/Floater.cpp
@@ -1,5 +1,5 @@
#include "common.h"
-#include "patcher.h"
+
#include "Timer.h"
#include "WaterLevel.h"
#include "ModelIndices.h"
@@ -7,10 +7,9 @@
#include "Vehicle.h"
#include "Floater.h"
-cBuoyancy &mod_Buoyancy = *(cBuoyancy*)0x8F2674;
+cBuoyancy mod_Buoyancy;
-//static float fVolMultiplier = 1.0f;
-static float &fVolMultiplier = *(float*)0x601394;
+static float fVolMultiplier = 1.0f;
// amount of boat volume in bounding box
// 1.0-volume is the empty space in the bbox
static float fBoatVolumeDistribution[9] = {
@@ -184,12 +183,3 @@ cBuoyancy::CalcBuoyancyForce(CPhysical *phys, CVector *point, CVector *impulse)
*impulse = CVector(0.0f, 0.0f, m_volumeUnderWater*m_buoyancy*CTimer::GetTimeStep());
return true;
}
-
-STARTPATCHES
- InjectHook(0x546270, &cBuoyancy::ProcessBuoyancy, PATCH_JUMP);
- InjectHook(0x546360, &cBuoyancy::PreCalcSetup, PATCH_JUMP);
- InjectHook(0x5466F0, &cBuoyancy::SimpleCalcBuoyancy, PATCH_JUMP);
- InjectHook(0x546820, &cBuoyancy::SimpleSumBuoyancyData, PATCH_JUMP);
- InjectHook(0x546620, &cBuoyancy::FindWaterLevel, PATCH_JUMP);
- InjectHook(0x5465A0, &cBuoyancy::CalcBuoyancyForce, PATCH_JUMP);
-ENDPATCHES
diff --git a/src/vehicles/Floater.h b/src/vehicles/Floater.h
index 4754a235..1cfb46fb 100644
--- a/src/vehicles/Floater.h
+++ b/src/vehicles/Floater.h
@@ -42,4 +42,4 @@ public:
void FindWaterLevel(const CVector &zpos, CVector *waterLevel, tWaterLevel *waterPosition);
bool CalcBuoyancyForce(CPhysical *phys, CVector *impulse, CVector *point);
};
-extern cBuoyancy &mod_Buoyancy;
+extern cBuoyancy mod_Buoyancy;
diff --git a/src/vehicles/HandlingMgr.cpp b/src/vehicles/HandlingMgr.cpp
index 0f16401e..3ac0da38 100644
--- a/src/vehicles/HandlingMgr.cpp
+++ b/src/vehicles/HandlingMgr.cpp
@@ -1,10 +1,10 @@
#include "common.h"
-#include "patcher.h"
+
#include "main.h"
#include "FileMgr.h"
#include "HandlingMgr.h"
-cHandlingDataMgr &mod_HandlingManager = *(cHandlingDataMgr*)0x728060;
+cHandlingDataMgr mod_HandlingManager;
const char *HandlingFilename = "HANDLING.CFG";
@@ -237,11 +237,3 @@ cHandlingDataMgr::GetHandlingId(const char *name)
break;
return i;
}
-
-STARTPATCHES
- InjectHook(0x546D80, &cHandlingDataMgr::Initialise, PATCH_JUMP);
- InjectHook(0x546DB0, &cHandlingDataMgr::LoadHandlingData, PATCH_JUMP);
- InjectHook(0x546BB0, &cHandlingDataMgr::ConvertDataToGameUnits, PATCH_JUMP);
- InjectHook(0x546AA0, &cHandlingDataMgr::FindExactWord, PATCH_JUMP);
- InjectHook(0x546B70, &cHandlingDataMgr::GetHandlingId, PATCH_JUMP);
-ENDPATCHES
diff --git a/src/vehicles/HandlingMgr.h b/src/vehicles/HandlingMgr.h
index 70f1c005..398a415f 100644
--- a/src/vehicles/HandlingMgr.h
+++ b/src/vehicles/HandlingMgr.h
@@ -101,7 +101,7 @@ struct tHandlingData
float fSteeringLock;
float fTractionLoss;
float fTractionBias;
- uint32 field_AC;
+ float fABS; // should be VC leftover
float fSuspensionForceLevel;
float fSuspensionDampingLevel;
float fSuspensionUpperLimit;
@@ -126,7 +126,7 @@ private:
float field_C; // unused it seems
float field_10; //
tHandlingData HandlingData[NUMHANDLINGS];
- uint32 field_302C; // unused it seems, padding?
+ uint32 field_302C; // unused it seems
public:
cHandlingDataMgr(void);
@@ -140,4 +140,4 @@ public:
bool HasFrontWheelDrive(eHandlingId id) { return HandlingData[id].Transmission.nDriveType == 'F'; }
};
VALIDATE_SIZE(cHandlingDataMgr, 0x3030);
-extern cHandlingDataMgr &mod_HandlingManager;
+extern cHandlingDataMgr mod_HandlingManager;
diff --git a/src/vehicles/Heli.cpp b/src/vehicles/Heli.cpp
index 3dc1deeb..0073a5ad 100644
--- a/src/vehicles/Heli.cpp
+++ b/src/vehicles/Heli.cpp
@@ -1,6 +1,6 @@
#include "common.h"
#include "main.h"
-#include "patcher.h"
+
#include "General.h"
#include "Darkel.h"
#include "Stats.h"
@@ -24,6 +24,9 @@
#include "Object.h"
#include "HandlingMgr.h"
#include "Heli.h"
+#ifdef FIX_BUGS
+#include "Replay.h"
+#endif
enum
{
@@ -34,13 +37,13 @@ enum
HELI_STATUS_HOVER2,
};
-CHeli **CHeli::pHelis = (CHeli**)0x72CF50;
-int16 &CHeli::NumRandomHelis = *(int16*)0x95CCAA;
-uint32 &CHeli::TestForNewRandomHelisTimer = *(uint32*)0x8F1A7C;
+CHeli *CHeli::pHelis[NUM_HELIS];
+int16 CHeli::NumRandomHelis;
+uint32 CHeli::TestForNewRandomHelisTimer;
int16 CHeli::NumScriptHelis; // unused
-bool &CHeli::CatalinaHeliOn = *(bool*)0x95CD85;
-bool &CHeli::CatalinaHasBeenShotDown = *(bool*)0x95CD56;
-bool &CHeli::ScriptHeliOn = *(bool*)0x95CD43;
+bool CHeli::CatalinaHeliOn;
+bool CHeli::CatalinaHasBeenShotDown;
+bool CHeli::ScriptHeliOn;
CHeli::CHeli(int32 id, uint8 CreatedBy)
: CVehicle(CreatedBy)
@@ -78,6 +81,9 @@ CHeli::CHeli(int32 id, uint8 CreatedBy)
m_bTestRight = true;
m_fTargetOffset = 0.0f;
m_fSearchLightX = m_fSearchLightY = 0.0f;
+
+ // BUG: not in game but gets initialized to CDCDCDCD in debug
+ m_nLastShotTime = 0;
}
void
@@ -225,19 +231,19 @@ CHeli::ProcessControl(void)
switch(m_heliStatus){
case HELI_STATUS_HOVER:
groundZ = CWorld::FindGroundZFor3DCoord(GetPosition().x, GetPosition().y, 1000.0f, nil);
- m_fTargetZ = max(groundZ, m_fTargetZ) + 8.0f;
+ m_fTargetZ = Max(groundZ, m_fTargetZ) + 8.0f;
break;
case HELI_STATUS_SHOT_DOWN:
groundZ = CWorld::FindGroundZFor3DCoord(GetPosition().x, GetPosition().y, 1000.0f, nil);
- m_fTargetZ = max(groundZ, m_fTargetZ) + 8.0f + m_fTargetOffset;
+ m_fTargetZ = Max(groundZ, m_fTargetZ) + 8.0f + m_fTargetOffset;
break;
case HELI_STATUS_HOVER2:
groundZ = CWorld::FindGroundZFor3DCoord(GetPosition().x, GetPosition().y, 1000.0f, nil);
- m_fTargetZ = max(groundZ, m_fTargetZ) + 8.0f + m_fTargetOffset;
+ m_fTargetZ = Max(groundZ, m_fTargetZ) + 8.0f + m_fTargetOffset;
break;
default:
groundZ = CWorld::FindGroundZFor3DCoord(GetPosition().x, GetPosition().y, 1000.0f, nil);
- m_fTargetZ = max(groundZ, m_fTargetZ) + 12.0f;
+ m_fTargetZ = Max(groundZ, m_fTargetZ) + 12.0f;
break;
}
@@ -425,89 +431,95 @@ CHeli::ProcessControl(void)
// Search light and shooting
if(m_heliStatus == HELI_STATUS_FLY_AWAY || m_heliType == HELI_TYPE_CATALINA || CCullZones::PlayerNoRain())
m_fSearchLightIntensity = 0.0f;
- else{
+ else {
// Update search light history once every 1000ms
int timeDiff = CTimer::GetTimeInMilliseconds() - m_nSearchLightTimer;
- while(timeDiff > 1000){
- for(i = 5; i > 0; i--){
- m_aSearchLightHistoryX[i] = m_aSearchLightHistoryX[i-1];
- m_aSearchLightHistoryY[i] = m_aSearchLightHistoryY[i-1];
+ while (timeDiff > 1000) {
+ for (i = 5; i > 0; i--) {
+ m_aSearchLightHistoryX[i] = m_aSearchLightHistoryX[i - 1];
+ m_aSearchLightHistoryY[i] = m_aSearchLightHistoryY[i - 1];
}
- m_aSearchLightHistoryX[0] = FindPlayerCoors().x + FindPlayerSpeed().x*50.0f*(m_nHeliId+2);
- m_aSearchLightHistoryY[0] = FindPlayerCoors().y + FindPlayerSpeed().y*50.0f*(m_nHeliId+2);
+ m_aSearchLightHistoryX[0] = FindPlayerCoors().x + FindPlayerSpeed().x * 50.0f * (m_nHeliId + 2);
+ m_aSearchLightHistoryY[0] = FindPlayerCoors().y + FindPlayerSpeed().y * 50.0f * (m_nHeliId + 2);
timeDiff -= 1000;
m_nSearchLightTimer += 1000;
}
assert(timeDiff <= 1000);
- float f1 = timeDiff/1000.0f;
+ float f1 = timeDiff / 1000.0f;
float f2 = 1.0f - f1;
- m_fSearchLightX = m_aSearchLightHistoryX[m_nHeliId+2]*f2 + m_aSearchLightHistoryX[m_nHeliId+2-1]*f1;
- m_fSearchLightY = m_aSearchLightHistoryY[m_nHeliId+2]*f2 + m_aSearchLightHistoryY[m_nHeliId+2-1]*f1;
+ m_fSearchLightX = m_aSearchLightHistoryX[m_nHeliId + 2] * f2 + m_aSearchLightHistoryX[m_nHeliId + 2 - 1] * f1;
+ m_fSearchLightY = m_aSearchLightHistoryY[m_nHeliId + 2] * f2 + m_aSearchLightHistoryY[m_nHeliId + 2 - 1] * f1;
float searchLightDist = (CVector2D(m_fSearchLightX, m_fSearchLightY) - GetPosition()).Magnitude();
- if(searchLightDist > 60.0f)
+ if (searchLightDist > 60.0f)
m_fSearchLightIntensity = 0.0f;
- else if(searchLightDist < 40.0f)
+ else if (searchLightDist < 40.0f)
m_fSearchLightIntensity = 1.0f;
else
- m_fSearchLightIntensity = 1.0f - (40.0f-searchLightDist)/40.0f;
+ m_fSearchLightIntensity = 1.0f - (40.0f - searchLightDist) / 40.0f;
- if(m_fSearchLightIntensity < 0.9f || sq(FindPlayerCoors().x-m_fSearchLightX) + sq(FindPlayerCoors().y-m_fSearchLightY) > sq(7.0f))
+ if (m_fSearchLightIntensity < 0.9f || sq(FindPlayerCoors().x - m_fSearchLightX) + sq(FindPlayerCoors().y - m_fSearchLightY) > sq(7.0f))
m_nShootTimer = CTimer::GetTimeInMilliseconds();
- else if(CTimer::GetTimeInMilliseconds() > m_nPoliceShoutTimer){
+ else if (CTimer::GetTimeInMilliseconds() > m_nPoliceShoutTimer) {
DMAudio.PlayOneShot(m_audioEntityId, SOUND_PED_HELI_PLAYER_FOUND, 0.0f);
- m_nPoliceShoutTimer = CTimer::GetTimeInMilliseconds() + 4500 + (CGeneral::GetRandomNumber()&0xFFF);
+ m_nPoliceShoutTimer = CTimer::GetTimeInMilliseconds() + 4500 + (CGeneral::GetRandomNumber() & 0xFFF);
}
-
- // Shoot
- int shootTimeout;
- if(m_heliType == HELI_TYPE_RANDOM){
- switch(FindPlayerPed()->m_pWanted->m_nWantedLevel){
- case 0:
- case 1:
- case 2: shootTimeout = 999999; break;
- case 3: shootTimeout = 10000; break;
- case 4: shootTimeout = 5000; break;
- case 5: shootTimeout = 3500; break;
- case 6: shootTimeout = 2000; break;
- }
- if(CCullZones::NoPolice())
- shootTimeout /= 2;
- }else
- shootTimeout = 1500;
-
- if(FindPlayerPed()->m_pWanted->IsIgnored())
- m_nShootTimer = CTimer::GetTimeInMilliseconds();
- else{
- // Check if line of sight is clear
- if(CTimer::GetTimeInMilliseconds() > m_nShootTimer + shootTimeout &&
- CTimer::GetPreviousTimeInMilliseconds() <= m_nShootTimer + shootTimeout){
- if(CWorld::GetIsLineOfSightClear(GetPosition(), FindPlayerCoors(), true, false, false, false, false, false)){
- if(m_heliStatus == HELI_STATUS_HOVER2)
- m_heliStatus = HELI_STATUS_HOVER;
- }else{
- m_nShootTimer = CTimer::GetTimeInMilliseconds();
- if(m_heliStatus == HELI_STATUS_HOVER)
- m_heliStatus = HELI_STATUS_HOVER2;
+#ifdef FIX_BUGS
+ if (!CReplay::IsPlayingBack())
+#endif
+ {
+ // Shoot
+ int shootTimeout;
+ if (m_heliType == HELI_TYPE_RANDOM) {
+ switch (FindPlayerPed()->m_pWanted->m_nWantedLevel) {
+ case 0:
+ case 1:
+ case 2: shootTimeout = 999999; break;
+ case 3: shootTimeout = 10000; break;
+ case 4: shootTimeout = 5000; break;
+ case 5: shootTimeout = 3500; break;
+ case 6: shootTimeout = 2000; break;
}
+ if (CCullZones::NoPolice())
+ shootTimeout /= 2;
}
+ else
+ shootTimeout = 1500;
+
+ if (FindPlayerPed()->m_pWanted->IsIgnored())
+ m_nShootTimer = CTimer::GetTimeInMilliseconds();
+ else {
+ // Check if line of sight is clear
+ if (CTimer::GetTimeInMilliseconds() > m_nShootTimer + shootTimeout &&
+ CTimer::GetPreviousTimeInMilliseconds() <= m_nShootTimer + shootTimeout) {
+ if (CWorld::GetIsLineOfSightClear(GetPosition(), FindPlayerCoors(), true, false, false, false, false, false)) {
+ if (m_heliStatus == HELI_STATUS_HOVER2)
+ m_heliStatus = HELI_STATUS_HOVER;
+ }
+ else {
+ m_nShootTimer = CTimer::GetTimeInMilliseconds();
+ if (m_heliStatus == HELI_STATUS_HOVER)
+ m_heliStatus = HELI_STATUS_HOVER2;
+ }
+ }
- // Shoot!
- if(CTimer::GetTimeInMilliseconds() > m_nShootTimer + shootTimeout &&
- CTimer::GetTimeInMilliseconds() > m_nLastShotTime + 200){
- CVector shotTarget = FindPlayerCoors();
- // some inaccuracy
- shotTarget.x += ((CGeneral::GetRandomNumber()&0xFF)-128)/50.0f;
- shotTarget.y += ((CGeneral::GetRandomNumber()&0xFF)-128)/50.0f;
- CVector direction = FindPlayerCoors() - GetPosition();
- direction.Normalise();
- shotTarget += 3.0f*direction;
- CVector shotSource = GetPosition();
- shotSource += 3.0f*direction;
- FireOneInstantHitRound(&shotSource, &shotTarget, 20);
- DMAudio.PlayOneShot(m_audioEntityId, SOUND_WEAPON_SHOT_FIRED, 0.0f);
- m_nLastShotTime = CTimer::GetTimeInMilliseconds();
+ // Shoot!
+ if (CTimer::GetTimeInMilliseconds() > m_nShootTimer + shootTimeout &&
+ CTimer::GetTimeInMilliseconds() > m_nLastShotTime + 200) {
+ CVector shotTarget = FindPlayerCoors();
+ // some inaccuracy
+ shotTarget.x += ((CGeneral::GetRandomNumber() & 0xFF) - 128) / 50.0f;
+ shotTarget.y += ((CGeneral::GetRandomNumber() & 0xFF) - 128) / 50.0f;
+ CVector direction = FindPlayerCoors() - GetPosition();
+ direction.Normalise();
+ shotTarget += 3.0f * direction;
+ CVector shotSource = GetPosition();
+ shotSource += 3.0f * direction;
+ FireOneInstantHitRound(&shotSource, &shotTarget, 20);
+ DMAudio.PlayOneShot(m_audioEntityId, SOUND_WEAPON_SHOT_FIRED, 0.0f);
+ m_nLastShotTime = CTimer::GetTimeInMilliseconds();
+ }
}
}
}
@@ -590,7 +602,12 @@ CHeli::PreRender(void)
break;
}
RwRGBA col = { r, g, b, 32 };
+#ifdef FIX_BUGS
+ pos.z = m_fHeliDustZ[frm];
+#else
+ // What the hell is the point of this?
pos.z = m_fHeliDustZ[(i - (i&3))/4]; // advance every 4 iterations, why not just /4?
+#endif
if(pos.z > -200.0f && GetPosition().z - pos.z < 20.0f)
CParticle::AddParticle(PARTICLE_HELI_DUST, pos, dir, nil, 0.0f, col);
i++;
@@ -817,7 +834,11 @@ CHeli::UpdateHelis(void)
int i, j;
// Spawn new police helis
- int numHelisRequired = FindPlayerPed()->m_pWanted->NumOfHelisRequired();
+ int numHelisRequired =
+#ifdef FIX_BUGS
+ CReplay::IsPlayingBack() ? 0 :
+#endif
+ FindPlayerPed()->m_pWanted->NumOfHelisRequired();
if(CStreaming::HasModelLoaded(MI_CHOPPER) && CTimer::GetTimeInMilliseconds() > TestForNewRandomHelisTimer){
// Spawn a police heli
TestForNewRandomHelisTimer = CTimer::GetTimeInMilliseconds() + 15000;
@@ -996,7 +1017,7 @@ CHeli::TestBulletCollision(CVector *line0, CVector *line1, CVector *bulletPos, i
float distToHeli = (pHelis[i]->GetPosition() - *line0).Magnitude();
CVector line = (*line1 - *line0);
float lineLength = line.Magnitude();
- *bulletPos = *line0 + line*max(1.0f, distToHeli-5.0f);
+ *bulletPos = *line0 + line*Max(1.0f, distToHeli-5.0f);
pHelis[i]->m_nBulletDamage += damage;
@@ -1035,24 +1056,3 @@ void CHeli::MakeCatalinaHeliFlyAway(void) { pHelis[HELI_CATALINA]->m_pathState =
bool CHeli::HasCatalinaBeenShotDown(void) { return CatalinaHasBeenShotDown; }
void CHeli::ActivateHeli(bool activate) { ScriptHeliOn = activate; }
-
-#include <new>
-
-class CHeli_ : public CHeli
-{
-public:
- void ctor(int32 id, uint8 CreatedBy) { ::new (this) CHeli(id, CreatedBy); }
- void dtor(void) { CHeli::~CHeli(); }
-};
-
-STARTPATCHES
- InjectHook(0x547220, &CHeli_::ctor, PATCH_JUMP);
- InjectHook(0x5474A0, &CHeli_::dtor, PATCH_JUMP);
- InjectHook(0x54AE50, &CHeli::SpawnFlyingComponent, PATCH_JUMP);
- InjectHook(0x549970, CHeli::InitHelis, PATCH_JUMP);
- InjectHook(0x5499F0, CHeli::UpdateHelis, PATCH_JUMP);
- InjectHook(0x54AE10, CHeli::SpecialHeliPreRender, PATCH_JUMP);
- InjectHook(0x54AA30, CHeli::TestRocketCollision, PATCH_JUMP);
- InjectHook(0x54AB30, CHeli::TestBulletCollision, PATCH_JUMP);
- InjectHook(0x54A640, GenerateHeli, PATCH_JUMP);
-ENDPATCHES
diff --git a/src/vehicles/Heli.h b/src/vehicles/Heli.h
index bb10345d..39e4cbcf 100644
--- a/src/vehicles/Heli.h
+++ b/src/vehicles/Heli.h
@@ -61,16 +61,15 @@ public:
float m_fTargetOffset;
bool m_bTestRight;
- static CHeli **pHelis; //[NUM_HELIS]
- static int16 &NumRandomHelis;
- static uint32 &TestForNewRandomHelisTimer;
+ static CHeli *pHelis[NUM_HELIS];
+ static int16 NumRandomHelis;
+ static uint32 TestForNewRandomHelisTimer;
static int16 NumScriptHelis; // unused
- static bool &CatalinaHeliOn;
- static bool &CatalinaHasBeenShotDown;
- static bool &ScriptHeliOn;
+ static bool CatalinaHeliOn;
+ static bool CatalinaHasBeenShotDown;
+ static bool ScriptHeliOn;
CHeli(int32 id, uint8 CreatedBy);
- CHeli* ctor(int, uint8);
// from CEntity
void SetModelIndex(uint32 id);
diff --git a/src/vehicles/Plane.cpp b/src/vehicles/Plane.cpp
index c2b9e493..273ac54a 100644
--- a/src/vehicles/Plane.cpp
+++ b/src/vehicles/Plane.cpp
@@ -1,6 +1,6 @@
#include "common.h"
#include "main.h"
-#include "patcher.h"
+
#include "General.h"
#include "ModelIndices.h"
#include "FileMgr.h"
@@ -16,35 +16,35 @@
#include "HandlingMgr.h"
#include "Plane.h"
-CPlaneNode *&pPathNodes = *(CPlaneNode**)0x8F1B68;
-CPlaneNode *&pPath2Nodes = *(CPlaneNode**)0x885B8C;
-CPlaneNode *&pPath3Nodes = *(CPlaneNode**)0x885B78;
-CPlaneNode *&pPath4Nodes = *(CPlaneNode**)0x885AD8;
-int32 &NumPathNodes = *(int32*)0x8F2BE4;
-int32 &NumPath2Nodes = *(int32*)0x941498;
-int32 &NumPath3Nodes = *(int32*)0x9414D8;
-int32 &NumPath4Nodes = *(int32*)0x9412C8;
-float &TotalLengthOfFlightPath = *(float*)0x8F2C6C;
-float &TotalLengthOfFlightPath2 = *(float*)0x64CFBC;
-float &TotalLengthOfFlightPath3 = *(float*)0x64CFD0;
-float &TotalLengthOfFlightPath4 = *(float*)0x64CFDC;
-float &TotalDurationOfFlightPath = *(float*)0x64CFB8;
-float &TotalDurationOfFlightPath2 = *(float*)0x64CFC0;
-float &TotalDurationOfFlightPath3 = *(float*)0x64CFD4;
-float &TotalDurationOfFlightPath4 = *(float*)0x64CFE0;
-float &LandingPoint = *(float*)0x8F2C7C;
-float &TakeOffPoint = *(float*)0x8E28A4;
-CPlaneInterpolationLine *aPlaneLineBits = (CPlaneInterpolationLine*)0x734168; //[6]
-
-float *PlanePathPosition = (float*)0x8F5FC8; //[3]
-float *OldPlanePathPosition = (float*)0x8F5FBC; //[3]
-float *PlanePathSpeed = (float*)0x941538; //[3]
-float *PlanePath2Position = (float*)0x64CFC4; //[3]
-float &PlanePath3Position = *(float*)0x64CFD8;
-float &PlanePath4Position = *(float*)0x64CFE4;
-float *PlanePath2Speed = (float*)0x8F1A54; //[3]
-float &PlanePath3Speed = *(float*)0x8F1A94;
-float &PlanePath4Speed = *(float*)0x8F1AFC;
+CPlaneNode *pPathNodes;
+CPlaneNode *pPath2Nodes;
+CPlaneNode *pPath3Nodes;
+CPlaneNode *pPath4Nodes;
+int32 NumPathNodes;
+int32 NumPath2Nodes;
+int32 NumPath3Nodes;
+int32 NumPath4Nodes;
+float TotalLengthOfFlightPath;
+float TotalLengthOfFlightPath2;
+float TotalLengthOfFlightPath3;
+float TotalLengthOfFlightPath4;
+float TotalDurationOfFlightPath;
+float TotalDurationOfFlightPath2;
+float TotalDurationOfFlightPath3;
+float TotalDurationOfFlightPath4;
+float LandingPoint;
+float TakeOffPoint;
+CPlaneInterpolationLine aPlaneLineBits[6];
+
+float PlanePathPosition[3];
+float OldPlanePathPosition[3];
+float PlanePathSpeed[3];
+float PlanePath2Position[3];
+float PlanePath3Position;
+float PlanePath4Position;
+float PlanePath2Speed[3];
+float PlanePath3Speed;
+float PlanePath4Speed;
enum
@@ -55,12 +55,12 @@ enum
CESNA_STATUS_LANDED,
};
-int32 &CesnaMissionStatus = *(int32*)0x64CFE8;
-int32 &CesnaMissionStartTime = *(int32*)0x64CFEC;
-CPlane *&pDrugRunCesna = *(CPlane**)0x8F5F80;
-int32 &DropOffCesnaMissionStatus = *(int32*)0x64CFF0;
-int32 &DropOffCesnaMissionStartTime = *(int32*)0x64CFF4;
-CPlane *&pDropOffCesna = *(CPlane**)0x8E2A38;
+int32 CesnaMissionStatus;
+int32 CesnaMissionStartTime;
+CPlane *pDrugRunCesna;
+int32 DropOffCesnaMissionStatus;
+int32 DropOffCesnaMissionStartTime;
+CPlane *pDropOffCesna;
CPlane::CPlane(int32 id, uint8 CreatedBy)
@@ -965,24 +965,3 @@ const CVector CPlane::FindDropOffCesnaCoordinates(void) { return pDropOffCesna->
bool CPlane::HasCesnaLanded(void) { return CesnaMissionStatus == CESNA_STATUS_LANDED; }
bool CPlane::HasCesnaBeenDestroyed(void) { return CesnaMissionStatus == CESNA_STATUS_DESTROYED; }
bool CPlane::HasDropOffCesnaBeenShotDown(void) { return DropOffCesnaMissionStatus == CESNA_STATUS_DESTROYED; }
-
-#include <new>
-
-class CPlane_ : public CPlane
-{
-public:
- void ctor(int32 id, uint8 CreatedBy) { ::new (this) CPlane(id, CreatedBy); }
- void dtor(void) { CPlane::~CPlane(); }
-};
-
-STARTPATCHES
- InjectHook(0x54B170, &CPlane_::ctor, PATCH_JUMP);
- InjectHook(0x54B270, &CPlane_::dtor, PATCH_JUMP);
- InjectHook(0x54B820, CPlane::InitPlanes, PATCH_JUMP);
- InjectHook(0x54BCD0, CPlane::Shutdown, PATCH_JUMP);
- InjectHook(0x54BD50, CPlane::LoadPath, PATCH_JUMP);
- InjectHook(0x54BEC0, CPlane::UpdatePlanes, PATCH_JUMP);
- InjectHook(0x54DE90, CPlane::TestRocketCollision, PATCH_JUMP);
- InjectHook(0x54E000, CPlane::CreateIncomingCesna, PATCH_JUMP);
- InjectHook(0x54E160, CPlane::CreateDropOffCesna, PATCH_JUMP);
-ENDPATCHES
diff --git a/src/vehicles/Plane.h b/src/vehicles/Plane.h
index edca92ec..79738858 100644
--- a/src/vehicles/Plane.h
+++ b/src/vehicles/Plane.h
@@ -33,8 +33,6 @@ public:
int16 m_nPlaneId;
int16 m_isFarAway;
int16 m_nCurPathNode;
- char field_654;
- char field_655;
float m_fSpeed;
uint32 m_nFrameWhenHit;
bool m_bHasBeenHit;
@@ -67,6 +65,6 @@ public:
};
static_assert(sizeof(CPlane) == 0x29C, "CPlane: error");
-extern float &LandingPoint;
-extern float &TakeOffPoint;
-extern float *PlanePathPosition; //[3]
+extern float LandingPoint;
+extern float TakeOffPoint;
+extern float PlanePathPosition[3];
diff --git a/src/vehicles/Train.cpp b/src/vehicles/Train.cpp
index 7d81fd57..0d1ff9b0 100644
--- a/src/vehicles/Train.cpp
+++ b/src/vehicles/Train.cpp
@@ -1,6 +1,6 @@
#include "common.h"
#include "main.h"
-#include "patcher.h"
+
#include "Timer.h"
#include "ModelIndices.h"
#include "FileMgr.h"
@@ -14,23 +14,23 @@
#include "HandlingMgr.h"
#include "Train.h"
-static CTrainNode *&pTrackNodes = *(CTrainNode**)0x8F4338;
-static int16 &NumTrackNodes = *(int16*)0x95CC5C;
+static CTrainNode* pTrackNodes;
+static int16 NumTrackNodes;
static float StationDist[3] = { 873.0f, 1522.0f, 2481.0f };
-static float &TotalLengthOfTrack = *(float*)0x64D000;
-static float &TotalDurationOfTrack = *(float*)0x64D004;
-static CTrainInterpolationLine *aLineBits = (CTrainInterpolationLine*)0x70D838; // [17]
-static float *EngineTrackPosition = (float*)0x64D008; //[2]
-static float *EngineTrackSpeed = (float*)0x880848; //[2]
-
-static CTrainNode *&pTrackNodes_S = *(CTrainNode**)0x8F2560;
-static int16 &NumTrackNodes_S = *(int16*)0x95CC6A;
+static float TotalLengthOfTrack;
+static float TotalDurationOfTrack;
+static CTrainInterpolationLine aLineBits[17];
+static float EngineTrackPosition[2];
+static float EngineTrackSpeed[2];
+
+static CTrainNode* pTrackNodes_S;
+static int16 NumTrackNodes_S;
static float StationDist_S[4] = { 55.0f, 1388.0f, 2337.0f, 3989.0f };
-static float &TotalLengthOfTrack_S = *(float*)0x64D010;
-static float &TotalDurationOfTrack_S = *(float*)0x64D014;
-static CTrainInterpolationLine *aLineBits_S = (CTrainInterpolationLine*)0x726600; // [18]
-static float *EngineTrackPosition_S = (float*)0x64D018; //[4]
-static float *EngineTrackSpeed_S = (float*)0x87C7C8; //[4]
+static float TotalLengthOfTrack_S;
+static float TotalDurationOfTrack_S;
+static CTrainInterpolationLine aLineBits_S[18];
+static float EngineTrackPosition_S[4];
+static float EngineTrackSpeed_S[4];
CVector CTrain::aStationCoors[3];
CVector CTrain::aStationCoors_S[4];
@@ -691,32 +691,3 @@ CTrain::UpdateTrains(void)
time += 0x40000/4;
}
}
-
-#include <new>
-
-class CTrain_ : public CTrain
-{
-public:
- void ctor(int32 id, uint8 CreatedBy) { ::new (this) CTrain(id, CreatedBy); }
- void SetModelIndex_(uint32 id) { CTrain::SetModelIndex(id); }
- void ProcessControl_(void) { CTrain::ProcessControl(); }
- void PreRender_(void) { CTrain::PreRender(); }
- void Render_(void) { CTrain::Render(); }
- void dtor(void) { CTrain::~CTrain(); }
-};
-
-STARTPATCHES
- InjectHook(0x54E470, &CTrain_::SetModelIndex_, PATCH_JUMP);
- InjectHook(0x54E4C0, &CTrain_::PreRender_, PATCH_JUMP);
- InjectHook(0x54EAA0, &CTrain_::Render_, PATCH_JUMP);
- InjectHook(0x54E450, &CTrain_::dtor, PATCH_JUMP);
- InjectHook(0x54E2A0, &CTrain_::ctor, PATCH_JUMP);
- InjectHook(0x550300, &CTrain::TrainHitStuff, PATCH_JUMP);
- InjectHook(0x5504A0, &CTrain::AddPassenger, PATCH_JUMP);
- InjectHook(0x550360, &CTrain::OpenTrainDoor, PATCH_JUMP);
-
- InjectHook(0x54F000, CTrain::InitTrains, PATCH_JUMP);
- InjectHook(0x54F360, CTrain::Shutdown, PATCH_JUMP);
- InjectHook(0x54EAB0, CTrain::ReadAndInterpretTrackFile, PATCH_JUMP);
- InjectHook(0x54F3A0, CTrain::UpdateTrains, PATCH_JUMP);
-ENDPATCHES
diff --git a/src/vehicles/Transmission.cpp b/src/vehicles/Transmission.cpp
index d500d004..5287055d 100644
--- a/src/vehicles/Transmission.cpp
+++ b/src/vehicles/Transmission.cpp
@@ -1,5 +1,5 @@
#include "common.h"
-#include "patcher.h"
+
#include "Timer.h"
#include "HandlingMgr.h"
#include "Transmission.h"
@@ -136,8 +136,3 @@ cTransmission::CalculateDriveAcceleration(const float &gasPedal, uint8 &gear, fl
}
return fAcceleration;
}
-
-STARTPATCHES
- InjectHook(0x550A00, &cTransmission::CalculateGearForSimpleCar, PATCH_JUMP);
- InjectHook(0x5506B0, &cTransmission::CalculateDriveAcceleration, PATCH_JUMP);
-ENDPATCHES
diff --git a/src/vehicles/Vehicle.cpp b/src/vehicles/Vehicle.cpp
index f47fd131..06894447 100644
--- a/src/vehicles/Vehicle.cpp
+++ b/src/vehicles/Vehicle.cpp
@@ -1,6 +1,6 @@
#include "common.h"
#include "main.h"
-#include "patcher.h"
+
#include "General.h"
#include "Timer.h"
#include "Pad.h"
@@ -19,12 +19,12 @@
#include "Fire.h"
#include "Darkel.h"
-bool &CVehicle::bWheelsOnlyCheat = *(bool *)0x95CD78;
-bool &CVehicle::bAllDodosCheat = *(bool *)0x95CD75;
-bool &CVehicle::bCheat3 = *(bool *)0x95CD66;
-bool &CVehicle::bCheat4 = *(bool *)0x95CD65;
-bool &CVehicle::bCheat5 = *(bool *)0x95CD64;
-bool &CVehicle::m_bDisableMouseSteering = *(bool *)0x60252C;
+bool CVehicle::bWheelsOnlyCheat;
+bool CVehicle::bAllDodosCheat;
+bool CVehicle::bCheat3;
+bool CVehicle::bCheat4;
+bool CVehicle::bCheat5;
+bool CVehicle::m_bDisableMouseSteering = true;
void *CVehicle::operator new(size_t sz) { return CPools::GetVehiclePool()->New(); }
void *CVehicle::operator new(size_t sz, int handle) { return CPools::GetVehiclePool()->New(handle); }
@@ -65,7 +65,7 @@ CVehicle::CVehicle(uint8 CreatedBy)
m_nNumGettingIn = 0;
m_nGettingInFlags = 0;
m_nGettingOutFlags = 0;
- m_nNumMaxPassengers = 8;
+ m_nNumMaxPassengers = ARRAY_SIZE(pPassengers);
for(i = 0; i < m_nNumMaxPassengers; i++)
pPassengers[i] = nil;
m_nBombTimer = 0;
@@ -101,7 +101,7 @@ CVehicle::CVehicle(uint8 CreatedBy)
m_nLastWeaponDamage = -1;
m_fMapObjectHeightAhead = m_fMapObjectHeightBehind = 0.0f;
m_audioEntityId = DMAudio.CreateEntity(AUDIOTYPE_PHYSICAL, this);
- if(m_audioEntityId)
+ if(m_audioEntityId >= 0)
DMAudio.SetEntityStatus(m_audioEntityId, true);
m_nRadioStation = CGeneral::GetRandomNumber() % USERTRACK;
m_pCurGroundEntity = nil;
@@ -281,7 +281,7 @@ CVehicle::ProcessWheel(CVector &wheelFwd, CVector &wheelRight, CVector &wheelCon
right = -contactSpeedRight/wheelsOnGround;
if(wheelStatus == WHEEL_STATUS_BURST){
- float fwdspeed = min(contactSpeedFwd, 0.3f);
+ float fwdspeed = Min(contactSpeedFwd, 0.3f);
right += fwdspeed * CGeneral::GetRandomNumberInRange(-0.1f, 0.1f);
}
}
@@ -533,7 +533,7 @@ CVehicle::DoFixedMachineGuns(void)
void
CVehicle::ExtinguishCarFire(void)
{
- m_fHealth = max(m_fHealth, 300.0f);
+ m_fHealth = Max(m_fHealth, 300.0f);
if(m_pCarFire)
m_pCarFire->Extinguish();
if(IsCar()){
@@ -728,7 +728,7 @@ CVehicle::CanBeDeleted(void)
return false;
}
- for(i = 0; i < 8; i++){
+ for(i = 0; i < ARRAY_SIZE(pPassengers); i++){
// Same check as above
if(pPassengers[i]){
if(pPassengers[i]->CharCreatedBy == MISSION_CHAR)
@@ -787,6 +787,10 @@ CVehicle::CanPedExitCar(void)
{
CVector up = GetUp();
if(up.z > 0.1f || up.z < -0.1f){
+#ifdef VC_PED_PORTS
+ if (IsBoat())
+ return true;
+#endif
// can't exit when car is moving too fast
if(m_vecMoveSpeed.MagnitudeSqr() > 0.005f)
return false;
@@ -870,13 +874,13 @@ CVehicle::SetDriver(CPed *driver)
if(bFreebies && driver == FindPlayerPed()){
if(GetModelIndex() == MI_AMBULAN)
- FindPlayerPed()->m_fHealth = min(FindPlayerPed()->m_fHealth + 20.0f, 100.0f);
+ FindPlayerPed()->m_fHealth = Min(FindPlayerPed()->m_fHealth + 20.0f, 100.0f);
else if(GetModelIndex() == MI_TAXI)
CWorld::Players[CWorld::PlayerInFocus].m_nMoney += 25;
else if(GetModelIndex() == MI_POLICE)
driver->GiveWeapon(WEAPONTYPE_SHOTGUN, 5);
else if(GetModelIndex() == MI_ENFORCER)
- driver->m_fArmour = max(driver->m_fArmour, 100.0f);
+ driver->m_fArmour = Max(driver->m_fArmour, 100.0f);
else if(GetModelIndex() == MI_CABBIE || GetModelIndex() == MI_BORGNINE)
CWorld::Players[CWorld::PlayerInFocus].m_nMoney += 25;
bFreebies = false;
@@ -937,7 +941,7 @@ void
CVehicle::RemovePassenger(CPed *p)
{
if (IsTrain()){
- for (int i = 0; i < 8; i++){
+ for (int i = 0; i < ARRAY_SIZE(pPassengers); i++){
if (pPassengers[i] == p) {
pPassengers[i] = nil;
m_nNumPassengers--;
@@ -998,66 +1002,15 @@ void
DestroyVehicleAndDriverAndPassengers(CVehicle* pVehicle)
{
if (pVehicle->pDriver) {
-#ifndef FIX_BUGS
- // this just isn't fair
CDarkel::RegisterKillByPlayer(pVehicle->pDriver, WEAPONTYPE_UNIDENTIFIED);
-#endif
pVehicle->pDriver->FlagToDestroyWhenNextProcessed();
}
for (int i = 0; i < pVehicle->m_nNumMaxPassengers; i++) {
if (pVehicle->pPassengers[i]) {
-#ifndef FIX_BUGS
- // this just isn't fair
CDarkel::RegisterKillByPlayer(pVehicle->pPassengers[i], WEAPONTYPE_UNIDENTIFIED);
-#endif
pVehicle->pPassengers[i]->FlagToDestroyWhenNextProcessed();
}
}
CWorld::Remove(pVehicle);
delete pVehicle;
}
-
-
-class CVehicle_ : public CVehicle
-{
-public:
- void dtor(void) { CVehicle::~CVehicle(); }
- void SetModelIndex_(uint32 id) { CVehicle::SetModelIndex(id); }
- bool SetupLighting_(void) { return CVehicle::SetupLighting(); }
- void RemoveLighting_(bool reset) { CVehicle::RemoveLighting(reset); }
- float GetHeightAboveRoad_(void) { return CVehicle::GetHeightAboveRoad(); }
-};
-
-STARTPATCHES
- InjectHook(0x551170, &CVehicle_::SetModelIndex_, PATCH_JUMP);
- InjectHook(0x4A7DD0, &CVehicle_::SetupLighting_, PATCH_JUMP);
- InjectHook(0x4A7E60, &CVehicle_::RemoveLighting_, PATCH_JUMP);
- InjectHook(0x417E60, &CVehicle_::GetHeightAboveRoad_, PATCH_JUMP);
-
- InjectHook(0x552BB0, &CVehicle::FlyingControl, PATCH_JUMP);
- InjectHook(0x5512E0, &CVehicle::ProcessWheel, PATCH_JUMP);
- InjectHook(0x551280, &CVehicle::ProcessWheelRotation, PATCH_JUMP);
- InjectHook(0x552AF0, &CVehicle::ExtinguishCarFire, PATCH_JUMP);
- InjectHook(0x551C90, &CVehicle::ProcessDelayedExplosion, PATCH_JUMP);
- InjectHook(0x552880, &CVehicle::IsLawEnforcementVehicle, PATCH_JUMP);
- InjectHook(0x552820, &CVehicle::ChangeLawEnforcerState, PATCH_JUMP);
- InjectHook(0x552200, &CVehicle::UsesSiren, PATCH_JUMP);
- InjectHook(0x5527E0, &CVehicle::IsVehicleNormal, PATCH_JUMP);
- InjectHook(0x552B70, &CVehicle::CarHasRoof, PATCH_JUMP);
- InjectHook(0x552230, &CVehicle::IsUpsideDown, PATCH_JUMP);
- InjectHook(0x552260, &CVehicle::IsOnItsSide, PATCH_JUMP);
- InjectHook(0x5511B0, &CVehicle::CanBeDeleted, PATCH_JUMP);
- InjectHook(0x5522A0, &CVehicle::CanPedOpenLocks, PATCH_JUMP);
- InjectHook(0x5522F0, &CVehicle::CanPedEnterCar, PATCH_JUMP);
- InjectHook(0x5523C0, &CVehicle::CanPedExitCar, PATCH_JUMP);
- InjectHook(0x5520C0, &CVehicle::SetUpDriver, PATCH_JUMP);
- InjectHook(0x552160, &CVehicle::SetupPassenger, PATCH_JUMP);
- InjectHook(0x551F20, &CVehicle::SetDriver, PATCH_JUMP);
- InjectHook(0x551D90, (bool (CVehicle::*)(CPed*))&CVehicle::AddPassenger, PATCH_JUMP);
- InjectHook(0x551E10, (bool (CVehicle::*)(CPed*,uint8))&CVehicle::AddPassenger, PATCH_JUMP);
- InjectHook(0x5520A0, &CVehicle::RemoveDriver, PATCH_JUMP);
- InjectHook(0x551EB0, &CVehicle::RemovePassenger, PATCH_JUMP);
- InjectHook(0x5525A0, &CVehicle::ProcessCarAlarm, PATCH_JUMP);
- InjectHook(0x552620, &CVehicle::IsSphereTouchingVehicle, PATCH_JUMP);
- InjectHook(0x551950, &CVehicle::InflictDamage, PATCH_JUMP);
-ENDPATCHES
diff --git a/src/vehicles/Vehicle.h b/src/vehicles/Vehicle.h
index f9becda0..2ae78829 100644
--- a/src/vehicles/Vehicle.h
+++ b/src/vehicles/Vehicle.h
@@ -130,7 +130,6 @@ public:
int8 m_nGettingInFlags;
int8 m_nGettingOutFlags;
uint8 m_nNumMaxPassengers;
- char field_1CD[3];
float field_1D0[4];
CEntity *m_pCurGroundEntity;
CFire *m_pCarFire;
@@ -180,7 +179,6 @@ public:
int16 m_nRoadblockNode;
float m_fHealth; // 1000.0f = full health. 250.0f = fire. 0 -> explode
uint8 m_nCurrentGear;
- int8 field_205[3];
float m_fChangeGearTime;
uint32 m_nGunFiringTime; // last time when gun on vehicle was fired (used on boats)
uint32 m_nTimeOfDeath;
@@ -277,12 +275,12 @@ public:
bool IsTaxi(void) { return GetModelIndex() == MI_TAXI || GetModelIndex() == MI_CABBIE || GetModelIndex() == MI_BORGNINE; }
AnimationId GetDriverAnim(void) { return IsCar() && bLowVehicle ? ANIM_CAR_LSIT : (IsBoat() && GetModelIndex() != MI_SPEEDER ? ANIM_DRIVE_BOAT : ANIM_CAR_SIT); }
- static bool &bWheelsOnlyCheat;
- static bool &bAllDodosCheat;
- static bool &bCheat3;
- static bool &bCheat4;
- static bool &bCheat5;
- static bool &m_bDisableMouseSteering;
+ static bool bWheelsOnlyCheat;
+ static bool bAllDodosCheat;
+ static bool bCheat3;
+ static bool bCheat4;
+ static bool bCheat5;
+ static bool m_bDisableMouseSteering;
};
static_assert(sizeof(CVehicle) == 0x288, "CVehicle: error");
@@ -296,7 +294,6 @@ class cVehicleParams
{
public:
bool m_bDistanceCalculated;
- char gap_1[3];
float m_fDistance;
CVehicle *m_pVehicle;
cTransmission *m_pTransmission;