CAutomobile done

This commit is contained in:
aap 2021-08-20 10:33:02 +02:00
parent 2d41405e29
commit aed313d81c
9 changed files with 361 additions and 270 deletions

View File

@ -252,6 +252,7 @@ public:
bool8 InitialiseSampleBanks(void); bool8 InitialiseSampleBanks(void);
uint8 GetMusicVolume() const { return m_nMusicVolume; } uint8 GetMusicVolume() const { return m_nMusicVolume; }
uint8 GetMusicFadeVolume() const { return m_nMusicFadeVolume; }
}; };
extern cSampleManager SampleManager; extern cSampleManager SampleManager;

View File

@ -5063,6 +5063,11 @@ CCam::Process_FollowCar_SA(const CVector& CameraTarget, float TargetOrientation,
// Using GetCarGun(LR/UD) will give us same unprocessed RightStick value as SA // Using GetCarGun(LR/UD) will give us same unprocessed RightStick value as SA
float stickX = -(pad->GetCarGunLeftRight()); float stickX = -(pad->GetCarGunLeftRight());
float stickY = -pad->GetCarGunUpDown(); float stickY = -pad->GetCarGunUpDown();
// HACK to disable rotation on tank for now
if(car->GetModelIndex() == MI_RHINO){
stickX = 0.0f;
stickY = 0.0f;
}
// In SA this checks for m_bUseMouse3rdPerson so num2 / num8 do not move camera // In SA this checks for m_bUseMouse3rdPerson so num2 / num8 do not move camera
// when Keyboard & Mouse controls are used. To make it work better with III/VC, check for actual pad state instead // when Keyboard & Mouse controls are used. To make it work better with III/VC, check for actual pad state instead
@ -5357,70 +5362,5 @@ CCam::Process_FollowCar_SA(const CVector& CameraTarget, float TargetOrientation,
// SA // SA
// gTargetCoordsForLookingBehind = TargetCoors; // gTargetCoordsForLookingBehind = TargetCoors;
// SA code from CAutomobile::TankControl/FireTruckControl.
if (car->GetModelIndex() == MI_RHINO || car->GetModelIndex() == MI_FIRETRUCK) {
float &carGunLR = ((CAutomobile*)car)->m_fCarGunLR;
CVector hi = Multiply3x3(Front, car->GetMatrix());
// III/VC's firetruck turret angle is reversed
float angleToFace = (car->GetModelIndex() == MI_FIRETRUCK ? -hi.Heading() : hi.Heading());
if (angleToFace <= carGunLR + PI) {
if (angleToFace < carGunLR - PI)
angleToFace = angleToFace + TWOPI;
} else {
angleToFace = angleToFace - TWOPI;
}
float neededTurn = angleToFace - carGunLR;
float turnPerFrame = CTimer::GetTimeStep() * (car->GetModelIndex() == MI_FIRETRUCK ? 0.05f : 0.015f);
if (neededTurn <= turnPerFrame) {
if (neededTurn < -turnPerFrame)
angleToFace = carGunLR - turnPerFrame;
} else {
angleToFace = turnPerFrame + carGunLR;
}
if (car->GetModelIndex() == MI_RHINO && carGunLR != angleToFace) {
DMAudio.PlayOneShot(car->m_audioEntityId, SOUND_CAR_TANK_TURRET_ROTATE, Abs(angleToFace - carGunLR));
}
carGunLR = angleToFace;
if (carGunLR < -PI) {
carGunLR += TWOPI;
} else if (carGunLR > PI) {
carGunLR -= TWOPI;
}
// Because firetruk turret also has Y movement
if (car->GetModelIndex() == MI_FIRETRUCK) {
float &carGunUD = ((CAutomobile*)car)->m_fCarGunUD;
float alphaToFace = Atan2(hi.z, hi.Magnitude2D()) + DEGTORAD(15.0f);
float neededAlphaTurn = alphaToFace - carGunUD;
float alphaTurnPerFrame = CTimer::GetTimeStepInSeconds();
if (neededAlphaTurn > alphaTurnPerFrame) {
neededTurn = alphaTurnPerFrame;
carGunUD = neededTurn + carGunUD;
} else {
if (neededAlphaTurn >= -alphaTurnPerFrame) {
carGunUD = alphaToFace;
} else {
carGunUD = carGunUD - alphaTurnPerFrame;
}
}
float turretMinY = -DEGTORAD(20.0f);
float turretMaxY = DEGTORAD(20.0f);
if (turretMinY <= carGunUD) {
if (carGunUD > turretMaxY)
carGunUD = turretMaxY;
} else {
carGunUD = turretMinY;
}
}
}
} }
#endif #endif

View File

@ -6,36 +6,10 @@ class CGeneral
{ {
public: public:
static float GetATanOfXY(float x, float y){ static float GetATanOfXY(float x, float y){
if(x == 0.0f && y == 0.0f) float arc = atan2f(y, x);
return 0.0f; if(arc < 0.0f)
float xabs = Abs(x); arc += TWOPI;
float yabs = Abs(y); return arc;
if(xabs < yabs){
if(y > 0.0f){
if(x > 0.0f)
return 0.5f*PI - Atan2(x / y, 1.0f);
else
return 0.5f*PI + Atan2(-x / y, 1.0f);
}else{
if(x > 0.0f)
return 1.5f*PI + Atan2(x / -y, 1.0f);
else
return 1.5f*PI - Atan2(-x / -y, 1.0f);
}
}else{
if(y > 0.0f){
if(x > 0.0f)
return Atan2(y / x, 1.0f);
else
return PI - Atan2(y / -x, 1.0f);
}else{
if(x > 0.0f)
return 2.0f*PI - Atan2(-y / x, 1.0f);
else
return PI + Atan2(-y / -x, 1.0f);
}
}
} }
static float LimitAngle(float angle) static float LimitAngle(float angle)

View File

@ -1096,8 +1096,11 @@ enum
MI_SEASPAR = -986, MI_SEASPAR = -986,
MI_SPARROW = -985, MI_SPARROW = -985,
MI_VOODOO = -984, MI_VOODOO = -984,
MI_FBIRANCH = -982,
MI_SANDKING = -981, MI_SANDKING = -981,
MI_COMET = -972, MI_COMET = -972,
MI_PHEONIX = -973,
MI_KAUFMAN = -967,
MI_BAGGAGE = -963, MI_BAGGAGE = -963,
MI_VICECHEE = -954, MI_VICECHEE = -954,
MI_RCBARON = -955, MI_RCBARON = -955,
@ -1107,14 +1110,12 @@ enum
MI_TROPIC = -988, MI_TROPIC = -988,
// HACK HACK, hopefully temporary // HACK HACK, hopefully temporary
MI_FBIRANCH = -2000, MI_SQUALO = -2000,
MI_SQUALO,
MI_JETMAX, MI_JETMAX,
MI_COASTG, MI_COASTG,
MI_DINGHY, MI_DINGHY,
MI_SKIMMER, MI_SKIMMER,
MI_CUBAN, MI_CUBAN,
MI_PHEONIX,
MI_SABRE, MI_SABRE,
MI_VIRGO, MI_VIRGO,
MI_RANCHER, MI_RANCHER,

View File

@ -725,7 +725,7 @@ CShadows::StoreShadowForVehicle(CVehicle *pCar, VEH_SHD_TYPE type)
void void
CShadows::StoreCarLightShadow(CVehicle *pCar, int32 nID, RwTexture *pTexture, CVector *pPosn, CShadows::StoreCarLightShadow(CVehicle *pCar, int32 nID, RwTexture *pTexture, CVector *pPosn,
float fFrontX, float fFrontY, float fSideX, float fSideY, uint8 nRed, uint8 nGreen, uint8 nBlue, float fFrontX, float fFrontY, float fSideX, float fSideY, uint8 nRed, uint8 nGreen, uint8 nBlue,
float fMaxViewAngle) float fMaxViewAngle, bool arg1, float arg2, float arg3)
{ {
ASSERT(pCar != nil); ASSERT(pCar != nil);
ASSERT(pPosn != nil); ASSERT(pPosn != nil);

View File

@ -159,7 +159,7 @@ public:
static void StoreShadowToBeRendered ( uint8 ShadowType, CVector *pPosn, float fFrontX, float fFrontY, float fSideX, float fSideY, int16 nIntensity, uint8 nRed, uint8 nGreen, uint8 nBlue); static void StoreShadowToBeRendered ( uint8 ShadowType, CVector *pPosn, float fFrontX, float fFrontY, float fSideX, float fSideY, int16 nIntensity, uint8 nRed, uint8 nGreen, uint8 nBlue);
static void StoreShadowToBeRendered ( uint8 ShadowType, RwTexture *pTexture, CVector *pPosn, float fFrontX, float fFrontY, float fSideX, float fSideY, int16 nIntensity, uint8 nRed, uint8 nGreen, uint8 nBlue, float fZDistance, bool bDrawOnWater, float fScale, CCutsceneShadow *pShadow, bool bDrawOnBuildings); static void StoreShadowToBeRendered ( uint8 ShadowType, RwTexture *pTexture, CVector *pPosn, float fFrontX, float fFrontY, float fSideX, float fSideY, int16 nIntensity, uint8 nRed, uint8 nGreen, uint8 nBlue, float fZDistance, bool bDrawOnWater, float fScale, CCutsceneShadow *pShadow, bool bDrawOnBuildings);
static void StoreShadowForVehicle (CVehicle *pCar, VEH_SHD_TYPE type); static void StoreShadowForVehicle (CVehicle *pCar, VEH_SHD_TYPE type);
static void StoreCarLightShadow (CVehicle *pCar, int32 nID, RwTexture *pTexture, CVector *pPosn, float fFrontX, float fFrontY, float fSideX, float fSideY, uint8 nRed, uint8 nGreen, uint8 nBlue, float fMaxViewAngle); static void StoreCarLightShadow (CVehicle *pCar, int32 nID, RwTexture *pTexture, CVector *pPosn, float fFrontX, float fFrontY, float fSideX, float fSideY, uint8 nRed, uint8 nGreen, uint8 nBlue, float fMaxViewAngle, bool arg1 = false, float arg2 = 0.0f, float arg3 = 1.0f);
static void StoreShadowForPed (CPed *pPed, float fDisplacementX, float fDisplacementY, float fFrontX, float fFrontY, float fSideX, float fSideY); static void StoreShadowForPed (CPed *pPed, float fDisplacementX, float fDisplacementY, float fFrontX, float fFrontY, float fSideX, float fSideY);
static void StoreShadowForPedObject (CEntity *pPedObject, float fDisplacementX, float fDisplacementY, float fFrontX, float fFrontY, float fSideX, float fSideY); static void StoreShadowForPedObject (CEntity *pPedObject, float fDisplacementX, float fDisplacementY, float fFrontX, float fFrontY, float fSideX, float fSideY);
static void StoreShadowForCutscenePedObject(CCutsceneObject *pObject, float fDisplacementX, float fDisplacementY, float fFrontX, float fFrontY, float fSideX, float fSideY); static void StoreShadowForCutscenePedObject(CCutsceneObject *pObject, float fDisplacementX, float fDisplacementY, float fFrontX, float fFrontY, float fSideX, float fSideY);

View File

@ -51,6 +51,8 @@
#include "Bike.h" #include "Bike.h"
#include "Wanted.h" #include "Wanted.h"
#include "SaveBuf.h" #include "SaveBuf.h"
#include "Streaming.h"
#include "sampman.h"
bool bAllCarCheat; bool bAllCarCheat;
@ -1667,6 +1669,11 @@ CAutomobile::Teleport(CVector pos)
CWorld::Add(this); CWorld::Add(this);
} }
float gHeadlightRange = 25.0f;
float gTaxilightRange = 1.1f;
CVector gHeadlightColour(0.86, 0.82f, 1.0f);
CVector gTaxilightColour(1.0, 1.0f, 0.5f);
void void
CAutomobile::PreRender(void) CAutomobile::PreRender(void)
{ {
@ -1678,19 +1685,8 @@ CAutomobile::PreRender(void)
CVehicle::PreRender(); CVehicle::PreRender();
if(GetModelIndex() == MI_RHINO && m_aCarNodes[CAR_WINDSCREEN]){
// Rotate Rhino turret
CMatrix m;
CVector p;
m.Attach(RwFrameGetMatrix(m_aCarNodes[CAR_WINDSCREEN]));
p = m.GetPosition();
m.SetRotateZ(m_fCarGunLR);
m.Translate(p);
m.UpdateRW();
}
if(GetModelIndex() == MI_RCBANDIT){ if(GetModelIndex() == MI_RCBANDIT){
CVector pos = GetMatrix() * CVector(0.218f, -0.444f, 0.391f); CVector pos = GetMatrix() * CVector(0.218f, -0.3f, 0.0f);
CAntennas::RegisterOne((uintptr)this, GetUp(), pos, 1.0f); CAntennas::RegisterOne((uintptr)this, GetUp(), pos, 1.0f);
} }
@ -1699,7 +1695,7 @@ CAutomobile::PreRender(void)
// Wheel particles // Wheel particles
if(GetModelIndex() == MI_DODO || GetVehicleAppearance() != VEHICLE_APPEARANCE_CAR){ if(GetModelIndex() == MI_DODO){
; // nothing ; // nothing
}else if(GetModelIndex() == MI_RCBANDIT){ }else if(GetModelIndex() == MI_RCBANDIT){
for(i = 0; i < 4; i++){ for(i = 0; i < 4; i++){
@ -1812,7 +1808,7 @@ CAutomobile::PreRender(void)
break; break;
default: default:
if(Abs(fwdSpeed) > 0.5f) if(Abs(fwdSpeed) > 5.0f)
AddWheelDirtAndWater(&m_aWheelColPoints[i], drawParticles); AddWheelDirtAndWater(&m_aWheelColPoints[i], drawParticles);
if((m_aWheelSkidmarkBloody[i] || m_aWheelSkidmarkUnk[i]) && m_aWheelTimer[i] > 0.0f) if((m_aWheelSkidmarkBloody[i] || m_aWheelSkidmarkUnk[i]) && m_aWheelTimer[i] > 0.0f)
CSkidmarks::RegisterOne((uintptr)this + i, m_aWheelColPoints[i].point, CSkidmarks::RegisterOne((uintptr)this + i, m_aWheelColPoints[i].point,
@ -1866,7 +1862,7 @@ CAutomobile::PreRender(void)
CVector(0.0f, 0.0f, 0.0f)); CVector(0.0f, 0.0f, 0.0f));
if(m_aWheelTimer[CARWHEEL_REAR_LEFT] > 0.0f) if(m_aWheelTimer[CARWHEEL_REAR_LEFT] > 0.0f)
CSkidmarks::RegisterOne((uintptr)this + CARWHEEL_REAR_LEFT, CSkidmarks::RegisterOne((uintptr)this + 5,
m_aWheelColPoints[CARWHEEL_REAR_LEFT].point + offset, m_aWheelColPoints[CARWHEEL_REAR_LEFT].point + offset,
GetForward().x, GetForward().y, GetForward().x, GetForward().y,
m_aWheelSkidmarkType[CARWHEEL_REAR_LEFT], &m_aWheelSkidmarkBloody[CARWHEEL_REAR_LEFT]); m_aWheelSkidmarkType[CARWHEEL_REAR_LEFT], &m_aWheelSkidmarkBloody[CARWHEEL_REAR_LEFT]);
@ -1884,18 +1880,18 @@ CAutomobile::PreRender(void)
CVector(0.0f, 0.0f, 0.0f)); CVector(0.0f, 0.0f, 0.0f));
if(m_aWheelTimer[CARWHEEL_REAR_RIGHT] > 0.0f) if(m_aWheelTimer[CARWHEEL_REAR_RIGHT] > 0.0f)
CSkidmarks::RegisterOne((uintptr)this + CARWHEEL_REAR_RIGHT, CSkidmarks::RegisterOne((uintptr)this + 6,
m_aWheelColPoints[CARWHEEL_REAR_RIGHT].point + offset, m_aWheelColPoints[CARWHEEL_REAR_RIGHT].point + offset,
GetForward().x, GetForward().y, GetForward().x, GetForward().y,
m_aWheelSkidmarkType[CARWHEEL_REAR_RIGHT], &m_aWheelSkidmarkBloody[CARWHEEL_REAR_RIGHT]); m_aWheelSkidmarkType[CARWHEEL_REAR_RIGHT], &m_aWheelSkidmarkBloody[CARWHEEL_REAR_RIGHT]);
break; break;
default: break; default: break;
} }
} }
// Rain on roof // Rain on roof
if(!CCullZones::CamNoRain() && !CCullZones::PlayerNoRain() && if(!CCullZones::CamNoRain() && !CCullZones::PlayerNoRain() && // LCS has those checks twice, but let's not be silly
Abs(fwdSpeed) < 20.0f && CWeather::Rain > 0.02f){ Abs(fwdSpeed) < 20.0f && CWeather::Rain > 0.02f){
CColModel *colModel = GetColModel(); CColModel *colModel = GetColModel();
@ -1910,7 +1906,7 @@ CAutomobile::PreRender(void)
p3 = GetMatrix() * p3; p3 = GetMatrix() * p3;
c = (p1 + p2 + p3)/3.0f; c = (p1 + p2 + p3)/3.0f;
n = 6.0f*CWeather::Rain; n = 4.5f*CWeather::Rain;
for(j = 0; j <= n; j++) for(j = 0; j <= n; j++)
CParticle::AddParticle(PARTICLE_RAIN_SPLASHUP, CParticle::AddParticle(PARTICLE_RAIN_SPLASHUP,
c + CVector(CGeneral::GetRandomNumberInRange(-0.4f, 0.4f), CGeneral::GetRandomNumberInRange(-0.4f, 0.4f), 0.0f), c + CVector(CGeneral::GetRandomNumberInRange(-0.4f, 0.4f), CGeneral::GetRandomNumberInRange(-0.4f, 0.4f), 0.0f),
@ -1952,7 +1948,8 @@ CAutomobile::PreRender(void)
static float fumesLimit = 2.0f; static float fumesLimit = 2.0f;
if(CGeneral::GetRandomNumberInRange(1.0f, 3.0f)*(m_fGasPedal+1.1f) > fumesLimit) if(CGeneral::GetRandomNumberInRange(1.0f, 3.0f)*(m_fGasPedal+1.1f) > fumesLimit)
for(i = 0; i < 4;){ // for(i = 0; i < 4;)
{
CParticle::AddParticle(PARTICLE_EXHAUST_FUMES, pos1, dir1); CParticle::AddParticle(PARTICLE_EXHAUST_FUMES, pos1, dir1);
if(pHandling->Flags & HANDLING_DBL_EXHAUST) if(pHandling->Flags & HANDLING_DBL_EXHAUST)
CParticle::AddParticle(PARTICLE_EXHAUST_FUMES, pos2, dir2); CParticle::AddParticle(PARTICLE_EXHAUST_FUMES, pos2, dir2);
@ -1965,6 +1962,7 @@ CAutomobile::PreRender(void)
CParticle::AddParticle(PARTICLE_EXHAUST_FUMES, pos2, dir2); CParticle::AddParticle(PARTICLE_EXHAUST_FUMES, pos2, dir2);
} }
/*
// Fire on Cuban hermes // Fire on Cuban hermes
if(GetModelIndex() == MI_CUBAN && i == 1 && m_fGasPedal > 0.9f){ if(GetModelIndex() == MI_CUBAN && i == 1 && m_fGasPedal > 0.9f){
if(m_nCurrentGear == 1 || m_nCurrentGear == 3 && (CTimer::GetTimeInMilliseconds()%1500) > 750){ if(m_nCurrentGear == 1 || m_nCurrentGear == 3 && (CTimer::GetTimeInMilliseconds()%1500) > 750){
@ -1984,7 +1982,6 @@ CAutomobile::PreRender(void)
if(DotProduct(GetForward(), camDist) > 0.0f || if(DotProduct(GetForward(), camDist) > 0.0f ||
TheCamera.GetLookDirection() == LOOKING_LEFT || TheCamera.GetLookDirection() == LOOKING_LEFT ||
TheCamera.GetLookDirection() == LOOKING_RIGHT){ TheCamera.GetLookDirection() == LOOKING_RIGHT){
/*
CParticle::AddParticle(PARTICLE_HEATHAZE, pos1, CVector(0.0f, 0.0f, 0.0f)); CParticle::AddParticle(PARTICLE_HEATHAZE, pos1, CVector(0.0f, 0.0f, 0.0f));
if(pHandling->Flags & HANDLING_DBL_EXHAUST) if(pHandling->Flags & HANDLING_DBL_EXHAUST)
CParticle::AddParticle(PARTICLE_HEATHAZE, pos2, CVector(0.0f, 0.0f, 0.0f)); CParticle::AddParticle(PARTICLE_HEATHAZE, pos2, CVector(0.0f, 0.0f, 0.0f));
@ -1992,7 +1989,6 @@ CAutomobile::PreRender(void)
CParticle::AddParticle(PARTICLE_HEATHAZE, pos1, CVector(0.0f, 0.0f, 0.0f)); CParticle::AddParticle(PARTICLE_HEATHAZE, pos1, CVector(0.0f, 0.0f, 0.0f));
if(pHandling->Flags & HANDLING_DBL_EXHAUST) if(pHandling->Flags & HANDLING_DBL_EXHAUST)
CParticle::AddParticle(PARTICLE_HEATHAZE, pos2, CVector(0.0f, 0.0f, 0.0f)); CParticle::AddParticle(PARTICLE_HEATHAZE, pos2, CVector(0.0f, 0.0f, 0.0f));
*/
} }
} }
@ -2004,6 +2000,7 @@ CAutomobile::PreRender(void)
dir2 -= 0.05f*GetRight(); dir2 -= 0.05f*GetRight();
}else }else
i = 99; i = 99;
*/
} }
} }
} }
@ -2023,26 +2020,26 @@ CAutomobile::PreRender(void)
switch(GetModelIndex()){ switch(GetModelIndex()){
case MI_FIRETRUCK: case MI_FIRETRUCK:
pos1 = CVector(1.1f, 1.7f, 2.0f); pos1 = CVector(0.91f, 1.7f, 1.86f);
pos2 = CVector(-1.1f, 1.7f, 2.0f); pos2 = CVector(-0.91f, 1.7f, 1.86f);
r1 = 255; g1 = 0; b1 = 0; r1 = 255; g1 = 0; b1 = 0;
r2 = 255; g2 = 255; b2 = 0; r2 = 255; g2 = 255; b2 = 0;
break; break;
case MI_AMBULAN: case MI_AMBULAN:
pos1 = CVector(1.1f, 0.9f, 1.6f); pos1 = CVector(0.95f, 0.64f, 1.6f);
pos2 = CVector(-1.1f, 0.9f, 1.6f); pos2 = CVector(-0.95f, 0.64f, 1.6f);
r1 = 255; g1 = 0; b1 = 0; r1 = 255; g1 = 0; b1 = 0;
r2 = 255; g2 = 255; b2 = 255; r2 = 255; g2 = 255; b2 = 255;
break; break;
case MI_POLICE: case MI_POLICE:
pos1 = CVector(0.7f, -0.4f, 1.0f); pos1 = CVector(0.47f, -0.4f, 1.0f);
pos2 = CVector(-0.7f, -0.4f, 1.0f); pos2 = CVector(-0.47f, -0.4f, 1.0f);
r1 = 255; g1 = 0; b1 = 0; r1 = 255; g1 = 0; b1 = 0;
r2 = 0; g2 = 0; b2 = 255; r2 = 0; g2 = 0; b2 = 255;
break; break;
case MI_ENFORCER: case MI_ENFORCER:
pos1 = CVector(1.1f, 0.8f, 1.2f); pos1 = CVector(0.7f, 0.98f, 1.55f);
pos2 = CVector(-1.1f, 0.8f, 1.2f); pos2 = CVector(-0.7f, 0.98f, 1.55f);
r1 = 255; g1 = 0; b1 = 0; r1 = 255; g1 = 0; b1 = 0;
r2 = 0; g2 = 0; b2 = 255; r2 = 0; g2 = 0; b2 = 255;
break; break;
@ -2065,7 +2062,7 @@ CAutomobile::PreRender(void)
r *= f; r *= f;
g *= f; g *= f;
b *= f; b *= f;
}else if(t > 412){ }else if(t > (512-100)){
float f = (512-t)/100.0f; float f = (512-t)/100.0f;
r *= f; r *= f;
g *= f; g *= f;
@ -2115,7 +2112,7 @@ CAutomobile::PreRender(void)
} }
break; break;
case MI_FBIRANCH: //case MI_FBIRANCH:
case MI_VICECHEE: case MI_VICECHEE:
if(m_bSirenOrAlarm){ if(m_bSirenOrAlarm){
CVector pos = GetMatrix() * CVector(0.4f, 0.6f, 0.3f); CVector pos = GetMatrix() * CVector(0.4f, 0.6f, 0.3f);
@ -2141,10 +2138,8 @@ CAutomobile::PreRender(void)
break; break;
case MI_TAXI: case MI_TAXI:
case MI_CABBIE:
case MI_BORGNINE:
if(bTaxiLight){ if(bTaxiLight){
CVector pos = GetPosition() + GetUp()*0.95f; CVector pos = GetPosition() + GetForward()*-0.3f + GetUp()*0.9f;
CCoronas::RegisterCorona((uintptr)this + 21, CCoronas::RegisterCorona((uintptr)this + 21,
128, 128, 0, 255, 128, 128, 0, 255,
pos, 0.8f, 50.0f, pos, 0.8f, 50.0f,
@ -2152,8 +2147,39 @@ CAutomobile::PreRender(void)
CCoronas::FLARE_NONE, CCoronas::FLARE_NONE,
CCoronas::REFLECTION_ON, CCoronas::LOSCHECK_OFF, CCoronas::STREAK_OFF, 0.0f); CCoronas::REFLECTION_ON, CCoronas::LOSCHECK_OFF, CCoronas::STREAK_OFF, 0.0f);
CPointLights::AddLight(CPointLights::LIGHT_POINT, CPointLights::AddLight(CPointLights::LIGHT_POINT,
pos, CVector(0.0f, 0.0f, 0.0f), 10.0f, pos, CVector(0.0f, 0.0f, 0.0f), gTaxilightRange,
1.0f, 1.0f, 0.5f, CPointLights::FOG_NONE, true); gTaxilightColour.x, gTaxilightColour.y, gTaxilightColour.z, CPointLights::FOG_NONE, true);
}
break;
case MI_CABBIE:
if(bTaxiLight){
CVector pos = GetPosition() + GetUp()*0.9f;
CCoronas::RegisterCorona((uintptr)this + 21,
128, 128, 0, 255,
pos, 0.8f, 50.0f,
CCoronas::TYPE_NORMAL,
CCoronas::FLARE_NONE,
CCoronas::REFLECTION_ON, CCoronas::LOSCHECK_OFF, CCoronas::STREAK_OFF, 0.0f);
CPointLights::AddLight(CPointLights::LIGHT_POINT,
pos, CVector(0.0f, 0.0f, 0.0f), gTaxilightRange,
gTaxilightColour.x, gTaxilightColour.y, gTaxilightColour.z, CPointLights::FOG_NONE, true);
}
break;
case MI_BORGNINE:
case MI_KAUFMAN:
if(bTaxiLight){
CVector pos = GetPosition() + GetForward()*-0.3f + GetUp()*0.85f;
CCoronas::RegisterCorona((uintptr)this + 21,
128, 128, 0, 255,
pos, 0.8f, 50.0f,
CCoronas::TYPE_NORMAL,
CCoronas::FLARE_NONE,
CCoronas::REFLECTION_ON, CCoronas::LOSCHECK_OFF, CCoronas::STREAK_OFF, 0.0f);
CPointLights::AddLight(CPointLights::LIGHT_POINT,
pos, CVector(0.0f, 0.0f, 0.0f), gTaxilightRange,
gTaxilightColour.x, gTaxilightColour.y, gTaxilightColour.z, CPointLights::FOG_NONE, true);
} }
break; break;
} }
@ -2190,7 +2216,8 @@ CAutomobile::PreRender(void)
else else
alarmOff = true; alarmOff = true;
} }
if(bEngineOn && bLightsOn || alarmOn || alarmOff){ bool playerRemote = this == FindPlayerVehicle() && CWorld::Players[CWorld::PlayerInFocus].m_pRemoteVehicle;
if((bEngineOn && bLightsOn && !m_bGarageTurnedLightsOff || alarmOn || alarmOff) && !playerRemote){
CVector lookVector = GetPosition() - TheCamera.GetPosition(); CVector lookVector = GetPosition() - TheCamera.GetPosition();
float camDist = lookVector.Magnitude(); float camDist = lookVector.Magnitude();
if(camDist != 0.0f) if(camDist != 0.0f)
@ -2306,8 +2333,8 @@ CAutomobile::PreRender(void)
// Taillight coronas // Taillight coronas
if(DotProduct(lightR-TheCamera.GetPosition(), GetForward()) > 0.0f){ if(DotProduct(lightR-TheCamera.GetPosition(), GetForward()) > 0.0f){
// Behind car // Behind car
float intensity = 0.4f*behindness + 0.4f; float intensity = (behindness + 1.0f)*0.4f;
float size = (behindness + 1.0f)/2.0f; float size = (behindness + 1.0f)*0.5f;
if(m_fGasPedal < 0.0f){ if(m_fGasPedal < 0.0f){
// reversing // reversing
@ -2355,10 +2382,11 @@ CAutomobile::PreRender(void)
} }
}else{ }else{
// In front of car // In front of car
// missing LODDistMultiplier probably a BUG
if(Damage.GetLightStatus(VEHLIGHT_REAR_LEFT) == LIGHT_STATUS_OK) if(Damage.GetLightStatus(VEHLIGHT_REAR_LEFT) == LIGHT_STATUS_OK)
CCoronas::UpdateCoronaCoors((uintptr)this + 2, lightL, 50.0f*TheCamera.LODDistMultiplier, angle); CCoronas::UpdateCoronaCoors((uintptr)this + 14, lightL, 50.0f, angle);
if(Damage.GetLightStatus(VEHLIGHT_REAR_RIGHT) == LIGHT_STATUS_OK) if(Damage.GetLightStatus(VEHLIGHT_REAR_RIGHT) == LIGHT_STATUS_OK)
CCoronas::UpdateCoronaCoors((uintptr)this + 3, lightR, 50.0f*TheCamera.LODDistMultiplier, angle); CCoronas::UpdateCoronaCoors((uintptr)this + 15, lightR, 50.0f, angle);
} }
// bright lights // bright lights
@ -2372,27 +2400,52 @@ CAutomobile::PreRender(void)
CVector pos = GetPosition(); CVector pos = GetPosition();
CVector2D fwd(GetForward()); CVector2D fwd(GetForward());
fwd.Normalise(); fwd.Normalise();
float f = headLightPos.y + 6.0f; float f = headLightPos.y + 7.0f;
pos += CVector(f*fwd.x, f*fwd.y, 2.0f); pos += CVector(f*fwd.x, f*fwd.y, 2.0f);
if(Damage.GetLightStatus(VEHLIGHT_FRONT_LEFT) == LIGHT_STATUS_OK || if(Damage.GetLightStatus(VEHLIGHT_FRONT_RIGHT) == LIGHT_STATUS_OK &&
Damage.GetLightStatus(VEHLIGHT_FRONT_RIGHT) == LIGHT_STATUS_OK) Damage.GetLightStatus(VEHLIGHT_FRONT_LEFT) == LIGHT_STATUS_OK)
CShadows::StoreCarLightShadow(this, (uintptr)this + 22, gpShadowHeadLightsTex, &pos, CShadows::StoreCarLightShadow(this, (uintptr)this + 22, gpShadowHeadLightsTex, &pos,
7.0f*fwd.x, 7.0f*fwd.y, 5.5f*fwd.y, -5.5f*fwd.x, 45, 45, 45, 7.0f); 7.0f*fwd.x, 7.0f*fwd.y, -3.5f*fwd.y, 3.5f*fwd.x, 145, 145, 145, 7.0f, true, -0.4f, 1.4f);
else if(Damage.GetLightStatus(VEHLIGHT_FRONT_RIGHT) == LIGHT_STATUS_OK)
CShadows::StoreCarLightShadow(this, (uintptr)this + 22, gpShadowHeadLightsTex, &pos,
7.0f*fwd.x, 7.0f*fwd.y, -3.5f*fwd.y, 3.5f*fwd.x, 145, 145, 145, 7.0f, false, 9.9f, 1.4f);
else if(Damage.GetLightStatus(VEHLIGHT_FRONT_LEFT) == LIGHT_STATUS_OK)
CShadows::StoreCarLightShadow(this, (uintptr)this + 22, gpShadowHeadLightsTex, &pos,
7.0f*fwd.x, 7.0f*fwd.y, -3.5f*fwd.y, 3.5f*fwd.x, 145, 145, 145, 7.0f, false, -0.4f, 1.4f);
f = (tailLightPos.y - 2.5f) - (headLightPos.y + 6.0f); f = (tailLightPos.y - 2.1f) - (headLightPos.y + 7.0f);
pos += CVector(f*fwd.x, f*fwd.y, 0.0f); pos += CVector(f*fwd.x, f*fwd.y, 0.0f);
if(Damage.GetLightStatus(VEHLIGHT_REAR_LEFT) == LIGHT_STATUS_OK || if(m_fGasPedal < 0.0f){
Damage.GetLightStatus(VEHLIGHT_REAR_RIGHT) == LIGHT_STATUS_OK) if(Damage.GetLightStatus(VEHLIGHT_REAR_RIGHT) == LIGHT_STATUS_OK &&
CShadows::StoreCarLightShadow(this, (uintptr)this + 25, gpShadowExplosionTex, &pos, Damage.GetLightStatus(VEHLIGHT_REAR_LEFT) == LIGHT_STATUS_OK)
3.0f, 0.0f, 0.0f, -3.0f, 35, 0, 0, 4.0f); CShadows::StoreCarLightShadow(this, (uintptr)this + 25, gpShadowHeadLightsTex, &pos,
-2.0f*fwd.x, -2.0f*fwd.y, 1.5f*fwd.y, -1.5f*fwd.x, 58, 58, 58, 4.0f, true, -0.5f, 1.5f);
else if(Damage.GetLightStatus(VEHLIGHT_REAR_RIGHT) == LIGHT_STATUS_OK)
CShadows::StoreCarLightShadow(this, (uintptr)this + 25, gpShadowHeadLightsTex, &pos,
-2.0f*fwd.x, -2.0f*fwd.y, 1.5f*fwd.y, -1.5f*fwd.x, 58, 58, 58, 4.0f, false, 9.9f, 1.5f);
else if(Damage.GetLightStatus(VEHLIGHT_REAR_LEFT) == LIGHT_STATUS_OK)
CShadows::StoreCarLightShadow(this, (uintptr)this + 25, gpShadowHeadLightsTex, &pos,
-2.0f*fwd.x, -2.0f*fwd.y, 1.5f*fwd.y, -1.5f*fwd.x, 58, 58, 58, 4.0f, false, -0.5f, 1.5f);
}else{
if(Damage.GetLightStatus(VEHLIGHT_REAR_RIGHT) == LIGHT_STATUS_OK &&
Damage.GetLightStatus(VEHLIGHT_REAR_LEFT) == LIGHT_STATUS_OK)
CShadows::StoreCarLightShadow(this, (uintptr)this + 25, gpShadowHeadLightsTex, &pos,
-2.0f*fwd.x, -2.0f*fwd.y, 1.5f*fwd.y, -1.5f*fwd.x, 56, 0, 0, 4.0f, true, -0.5f, 1.5f);
else if(Damage.GetLightStatus(VEHLIGHT_REAR_RIGHT) == LIGHT_STATUS_OK)
CShadows::StoreCarLightShadow(this, (uintptr)this + 25, gpShadowHeadLightsTex, &pos,
-2.0f*fwd.x, -2.0f*fwd.y, 1.5f*fwd.y, -1.5f*fwd.x, 56, 0, 0, 4.0f, false, 9.9f, 1.5f);
else if(Damage.GetLightStatus(VEHLIGHT_REAR_LEFT) == LIGHT_STATUS_OK)
CShadows::StoreCarLightShadow(this, (uintptr)this + 25, gpShadowHeadLightsTex, &pos,
-2.0f*fwd.x, -2.0f*fwd.y, 1.5f*fwd.y, -1.5f*fwd.x, 56, 0, 0, 4.0f, false, -0.5f, 1.5f);
}
} }
if(this == FindPlayerVehicle() && !alarmOff){ if(this == FindPlayerVehicle() && !alarmOff){
if(Damage.GetLightStatus(VEHLIGHT_FRONT_LEFT) == LIGHT_STATUS_OK || if(Damage.GetLightStatus(VEHLIGHT_FRONT_LEFT) == LIGHT_STATUS_OK ||
Damage.GetLightStatus(VEHLIGHT_FRONT_RIGHT) == LIGHT_STATUS_OK) Damage.GetLightStatus(VEHLIGHT_FRONT_RIGHT) == LIGHT_STATUS_OK)
CPointLights::AddLight(CPointLights::LIGHT_DIRECTIONAL, GetPosition(), GetForward(), CPointLights::AddLight(CPointLights::LIGHT_DIRECTIONAL, GetPosition(), GetForward(),
20.0f, 1.0f, 1.0f, 1.0f, gHeadlightRange, gHeadlightColour.x, gHeadlightColour.y, gHeadlightColour.z,
FindPlayerVehicle()->m_vecMoveSpeed.MagnitudeSqr2D() < sq(0.45f) ? CPointLights::FOG_NORMAL : CPointLights::FOG_NONE, FindPlayerVehicle()->m_vecMoveSpeed.MagnitudeSqr2D() < sq(0.45f) ? CPointLights::FOG_NORMAL : CPointLights::FOG_NONE,
false); false);
CVector pos = GetPosition() - 4.0f*GetForward(); CVector pos = GetPosition() - 4.0f*GetForward();
@ -2400,15 +2453,15 @@ CAutomobile::PreRender(void)
Damage.GetLightStatus(VEHLIGHT_REAR_RIGHT) == LIGHT_STATUS_OK) { Damage.GetLightStatus(VEHLIGHT_REAR_RIGHT) == LIGHT_STATUS_OK) {
if(m_fBrakePedal > 0.0f) if(m_fBrakePedal > 0.0f)
CPointLights::AddLight(CPointLights::LIGHT_POINT, pos, CVector(0.0f, 0.0f, 0.0f), CPointLights::AddLight(CPointLights::LIGHT_POINT, pos, CVector(0.0f, 0.0f, 0.0f),
10.0f, 1.0f, 0.0f, 0.0f, 8.39f, 1.0f, 0.0f, 0.0f,
CPointLights::FOG_NONE, false); CPointLights::FOG_NONE, false);
else else
CPointLights::AddLight(CPointLights::LIGHT_POINT, pos, CVector(0.0f, 0.0f, 0.0f), CPointLights::AddLight(CPointLights::LIGHT_POINT, pos, CVector(0.0f, 0.0f, 0.0f),
7.0f, 0.6f, 0.0f, 0.0f, 5.13f, 0.64f, 0.0f, 0.0f,
CPointLights::FOG_NONE, false); CPointLights::FOG_NONE, false);
} }
} }
}else if(GetStatus() != STATUS_ABANDONED && GetStatus() != STATUS_WRECKED){ }else if(GetStatus() != STATUS_ABANDONED && GetStatus() != STATUS_WRECKED && !m_bGarageTurnedLightsOff && !playerRemote){
// Lights off // Lights off
CVector lightPos = mi->m_positions[CAR_POS_TAILLIGHTS]; CVector lightPos = mi->m_positions[CAR_POS_TAILLIGHTS];
@ -2424,12 +2477,12 @@ CAutomobile::PreRender(void)
if(m_fGasPedal < 0.0f){ if(m_fGasPedal < 0.0f){
// reversing // reversing
if(Damage.GetLightStatus(VEHLIGHT_REAR_LEFT) == LIGHT_STATUS_OK) if(Damage.GetLightStatus(VEHLIGHT_REAR_LEFT) == LIGHT_STATUS_OK)
CCoronas::RegisterCorona((uintptr)this + 2, 120, 120, 120, 255, CCoronas::RegisterCorona((uintptr)this + 14, 120, 120, 120, 255,
lightL, 1.2f, 50.0f*TheCamera.LODDistMultiplier, lightL, 1.2f, 50.0f*TheCamera.LODDistMultiplier,
CCoronas::TYPE_STAR, CCoronas::FLARE_NONE, CCoronas::REFLECTION_ON, CCoronas::TYPE_STAR, CCoronas::FLARE_NONE, CCoronas::REFLECTION_ON,
CCoronas::LOSCHECK_OFF, CCoronas::STREAK_ON, 0.0f); CCoronas::LOSCHECK_OFF, CCoronas::STREAK_ON, 0.0f);
if(Damage.GetLightStatus(VEHLIGHT_REAR_RIGHT) == LIGHT_STATUS_OK) if(Damage.GetLightStatus(VEHLIGHT_REAR_RIGHT) == LIGHT_STATUS_OK)
CCoronas::RegisterCorona((uintptr)this + 3, 120, 120, 120, 255, CCoronas::RegisterCorona((uintptr)this + 15, 120, 120, 120, 255,
lightR, 1.2f, 50.0f*TheCamera.LODDistMultiplier, lightR, 1.2f, 50.0f*TheCamera.LODDistMultiplier,
CCoronas::TYPE_STAR, CCoronas::FLARE_NONE, CCoronas::REFLECTION_ON, CCoronas::TYPE_STAR, CCoronas::FLARE_NONE, CCoronas::REFLECTION_ON,
CCoronas::LOSCHECK_OFF, CCoronas::STREAK_ON, 0.0f); CCoronas::LOSCHECK_OFF, CCoronas::STREAK_ON, 0.0f);
@ -2440,12 +2493,12 @@ CAutomobile::PreRender(void)
}else{ }else{
// braking // braking
if(Damage.GetLightStatus(VEHLIGHT_REAR_LEFT) == LIGHT_STATUS_OK) if(Damage.GetLightStatus(VEHLIGHT_REAR_LEFT) == LIGHT_STATUS_OK)
CCoronas::RegisterCorona((uintptr)this + 2, 120, 0, 0, 255, CCoronas::RegisterCorona((uintptr)this + 14, 120, 0, 0, 255,
lightL, 1.2f, 50.0f*TheCamera.LODDistMultiplier, lightL, 1.2f, 50.0f*TheCamera.LODDistMultiplier,
CCoronas::TYPE_STAR, CCoronas::FLARE_NONE, CCoronas::REFLECTION_ON, CCoronas::TYPE_STAR, CCoronas::FLARE_NONE, CCoronas::REFLECTION_ON,
CCoronas::LOSCHECK_OFF, CCoronas::STREAK_ON, 0.0f); CCoronas::LOSCHECK_OFF, CCoronas::STREAK_ON, 0.0f);
if(Damage.GetLightStatus(VEHLIGHT_REAR_RIGHT) == LIGHT_STATUS_OK) if(Damage.GetLightStatus(VEHLIGHT_REAR_RIGHT) == LIGHT_STATUS_OK)
CCoronas::RegisterCorona((uintptr)this + 3, 120, 0, 0, 255, CCoronas::RegisterCorona((uintptr)this + 15, 120, 0, 0, 255,
lightR, 1.2f, 50.0f*TheCamera.LODDistMultiplier, lightR, 1.2f, 50.0f*TheCamera.LODDistMultiplier,
CCoronas::TYPE_STAR, CCoronas::FLARE_NONE, CCoronas::REFLECTION_ON, CCoronas::TYPE_STAR, CCoronas::FLARE_NONE, CCoronas::REFLECTION_ON,
CCoronas::LOSCHECK_OFF, CCoronas::STREAK_ON, 0.0f); CCoronas::LOSCHECK_OFF, CCoronas::STREAK_ON, 0.0f);
@ -2456,15 +2509,15 @@ CAutomobile::PreRender(void)
} }
}else{ }else{
if(Damage.GetLightStatus(VEHLIGHT_REAR_LEFT) == LIGHT_STATUS_OK) if(Damage.GetLightStatus(VEHLIGHT_REAR_LEFT) == LIGHT_STATUS_OK)
CCoronas::UpdateCoronaCoors((uintptr)this + 2, lightL, 50.0f*TheCamera.LODDistMultiplier, 0.0f); CCoronas::UpdateCoronaCoors((uintptr)this + 14, lightL, 50.0f*TheCamera.LODDistMultiplier, 0.0f);
if(Damage.GetLightStatus(VEHLIGHT_REAR_RIGHT) == LIGHT_STATUS_OK) if(Damage.GetLightStatus(VEHLIGHT_REAR_RIGHT) == LIGHT_STATUS_OK)
CCoronas::UpdateCoronaCoors((uintptr)this + 3, lightR, 50.0f*TheCamera.LODDistMultiplier, 0.0f); CCoronas::UpdateCoronaCoors((uintptr)this + 15, lightR, 50.0f*TheCamera.LODDistMultiplier, 0.0f);
} }
}else{ }else{
if(Damage.GetLightStatus(VEHLIGHT_REAR_LEFT) == LIGHT_STATUS_OK) if(Damage.GetLightStatus(VEHLIGHT_REAR_LEFT) == LIGHT_STATUS_OK)
CCoronas::UpdateCoronaCoors((uintptr)this + 2, lightL, 50.0f*TheCamera.LODDistMultiplier, 0.0f); CCoronas::UpdateCoronaCoors((uintptr)this + 14, lightL, 50.0f*TheCamera.LODDistMultiplier, 0.0f);
if(Damage.GetLightStatus(VEHLIGHT_REAR_RIGHT) == LIGHT_STATUS_OK) if(Damage.GetLightStatus(VEHLIGHT_REAR_RIGHT) == LIGHT_STATUS_OK)
CCoronas::UpdateCoronaCoors((uintptr)this + 3, lightR, 50.0f*TheCamera.LODDistMultiplier, 0.0f); CCoronas::UpdateCoronaCoors((uintptr)this + 15, lightR, 50.0f*TheCamera.LODDistMultiplier, 0.0f);
} }
} }
// end of lights // end of lights
@ -2498,6 +2551,15 @@ CAutomobile::PreRender(void)
CMatrix mat; CMatrix mat;
CVector pos; CVector pos;
// what's this supposed to be? Rhino doesn't have this node
if(GetModelIndex() == MI_RHINO && m_aCarNodes[CAR_BONNET]){
mat.Attach(RwFrameGetMatrix(m_aCarNodes[CAR_BONNET]));
pos = mat.GetPosition();
mat.SetRotateZ(m_fCarGunLR);
mat.Translate(pos);
mat.UpdateRW();
}
RwRGBA hoverParticleCol = { 255, 255, 255, 32 }; RwRGBA hoverParticleCol = { 255, 255, 255, 32 };
// Rear right wheel // Rear right wheel
@ -2519,8 +2581,8 @@ CAutomobile::PreRender(void)
}else{ }else{
CParticle::AddParticle(PARTICLE_CAR_SPLASH, m_aWheelColPoints[CARWHEEL_REAR_RIGHT].point, CParticle::AddParticle(PARTICLE_CAR_SPLASH, m_aWheelColPoints[CARWHEEL_REAR_RIGHT].point,
0.3f*m_vecMoveSpeed+0.15f*GetRight()+CVector(0.0f, 0.0f, 0.1f), nil, 0.15f, hoverParticleCol, 0.3f*m_vecMoveSpeed+0.15f*GetRight()+CVector(0.0f, 0.0f, 0.1f), nil, 0.15f, hoverParticleCol,
CGeneral::GetRandomNumberInRange(0.0f, 90.0f), CGeneral::GetRandomNumberInRange(0.0f, 10.0f),
CGeneral::GetRandomNumberInRange(0.0f, 10.0f), 1); CGeneral::GetRandomNumberInRange(0.0f, 90.0f), 1);
} }
#ifdef BETTER_ALLCARSAREDODO_CHEAT #ifdef BETTER_ALLCARSAREDODO_CHEAT
} else if (bAllDodosCheat && m_nDriveWheelsOnGround == 0 && m_nDriveWheelsOnGroundPrev == 0) { } else if (bAllDodosCheat && m_nDriveWheelsOnGround == 0 && m_nDriveWheelsOnGroundPrev == 0) {
@ -2560,8 +2622,8 @@ CAutomobile::PreRender(void)
}else{ }else{
CParticle::AddParticle(PARTICLE_CAR_SPLASH, m_aWheelColPoints[CARWHEEL_REAR_LEFT].point, CParticle::AddParticle(PARTICLE_CAR_SPLASH, m_aWheelColPoints[CARWHEEL_REAR_LEFT].point,
0.3f*m_vecMoveSpeed-0.15f*GetRight()+CVector(0.0f, 0.0f, 0.1f), nil, 0.15f, hoverParticleCol, 0.3f*m_vecMoveSpeed-0.15f*GetRight()+CVector(0.0f, 0.0f, 0.1f), nil, 0.15f, hoverParticleCol,
CGeneral::GetRandomNumberInRange(0.0f, 90.0f), CGeneral::GetRandomNumberInRange(0.0f, 10.0f),
CGeneral::GetRandomNumberInRange(0.0f, 10.0f), 1); CGeneral::GetRandomNumberInRange(0.0f, 90.0f), 1);
} }
#ifdef BETTER_ALLCARSAREDODO_CHEAT #ifdef BETTER_ALLCARSAREDODO_CHEAT
} else if (bAllDodosCheat && m_nDriveWheelsOnGround == 0 && m_nDriveWheelsOnGroundPrev == 0) { } else if (bAllDodosCheat && m_nDriveWheelsOnGround == 0 && m_nDriveWheelsOnGroundPrev == 0) {
@ -2758,8 +2820,8 @@ CAutomobile::PreRender(void)
}else{ }else{
CParticle::AddParticle(PARTICLE_CAR_SPLASH, m_aWheelColPoints[CARWHEEL_FRONT_RIGHT].point, CParticle::AddParticle(PARTICLE_CAR_SPLASH, m_aWheelColPoints[CARWHEEL_FRONT_RIGHT].point,
0.3f*m_vecMoveSpeed+0.15f*GetRight()+CVector(0.0f, 0.0f, 0.1f), nil, 0.15f, hoverParticleCol, 0.3f*m_vecMoveSpeed+0.15f*GetRight()+CVector(0.0f, 0.0f, 0.1f), nil, 0.15f, hoverParticleCol,
CGeneral::GetRandomNumberInRange(0.0f, 90.0f), CGeneral::GetRandomNumberInRange(0.0f, 10.0f),
CGeneral::GetRandomNumberInRange(0.0f, 10.0f), 1); CGeneral::GetRandomNumberInRange(0.0f, 90.0f), 1);
} }
#ifdef BETTER_ALLCARSAREDODO_CHEAT #ifdef BETTER_ALLCARSAREDODO_CHEAT
} else if (bAllDodosCheat && m_nDriveWheelsOnGround == 0 && m_nDriveWheelsOnGroundPrev == 0) { } else if (bAllDodosCheat && m_nDriveWheelsOnGround == 0 && m_nDriveWheelsOnGroundPrev == 0) {
@ -2799,8 +2861,8 @@ CAutomobile::PreRender(void)
}else{ }else{
CParticle::AddParticle(PARTICLE_CAR_SPLASH, m_aWheelColPoints[CARWHEEL_FRONT_LEFT].point, CParticle::AddParticle(PARTICLE_CAR_SPLASH, m_aWheelColPoints[CARWHEEL_FRONT_LEFT].point,
0.3f*m_vecMoveSpeed-0.15f*GetRight()+CVector(0.0f, 0.0f, 0.1f), nil, 0.15f, hoverParticleCol, 0.3f*m_vecMoveSpeed-0.15f*GetRight()+CVector(0.0f, 0.0f, 0.1f), nil, 0.15f, hoverParticleCol,
CGeneral::GetRandomNumberInRange(0.0f, 90.0f), CGeneral::GetRandomNumberInRange(0.0f, 10.0f),
CGeneral::GetRandomNumberInRange(0.0f, 10.0f), 1); CGeneral::GetRandomNumberInRange(0.0f, 90.0f), 1);
} }
#ifdef BETTER_ALLCARSAREDODO_CHEAT #ifdef BETTER_ALLCARSAREDODO_CHEAT
} else if (bAllDodosCheat && m_nDriveWheelsOnGround == 0 && m_nDriveWheelsOnGroundPrev == 0) { } else if (bAllDodosCheat && m_nDriveWheelsOnGround == 0 && m_nDriveWheelsOnGroundPrev == 0) {
@ -3136,67 +3198,119 @@ CAutomobile::ProcessControlInputs(uint8 pad)
} }
} }
// not sure if global variables
float FIRETRUCK_LR_SPEED = 0.05f;
float FIRETRUCK_UD_SPEED = 0.02f;
void void
CAutomobile::FireTruckControl(void) CAutomobile::FireTruckControl(void)
{ {
if(this == FindPlayerVehicle()){ if(this == FindPlayerVehicle()){
if(!CPad::GetPad(0)->GetCarGunFired()) if(CPad::GetPad(0)->GetCarGunFired()){
return; if(TheCamera.Cams[TheCamera.ActiveCam].Mode == CCam::MODE_CAM_ON_A_STRING){
#ifdef FREE_CAM // android code differs
if (!CCamera::bFreeCam) CVector localFront = Multiply3x3(TheCamera.Cams[TheCamera.ActiveCam].Front, GetMatrix());
#endif float targetDirLR = localFront.Heading();
{ float targetDirUD = Atan2(localFront.z, localFront.Magnitude2D());
m_fCarGunLR += CPad::GetPad(0)->GetCarGunLeftRight() * 0.00025f * CTimer::GetTimeStep();
m_fCarGunUD += CPad::GetPad(0)->GetCarGunUpDown() * 0.0001f * CTimer::GetTimeStep();
}
m_fCarGunUD = Clamp(m_fCarGunUD, 0.05f, 0.3f);
targetDirUD += DEGTORAD(15.0f);
if(m_fCarGunLR + PI < targetDirLR)
targetDirLR -= TWOPI;
else if(m_fCarGunLR - PI > targetDirLR)
targetDirLR += TWOPI;
CVector cannonPos(0.0f, 1.5f, 1.9f); if(targetDirLR - m_fCarGunLR > CTimer::GetTimeStep()*FIRETRUCK_LR_SPEED)
cannonPos = GetMatrix() * cannonPos; m_fCarGunLR += CTimer::GetTimeStep()*FIRETRUCK_LR_SPEED;
CVector cannonDir( else if(targetDirLR - m_fCarGunLR < -CTimer::GetTimeStep()*FIRETRUCK_LR_SPEED)
Sin(m_fCarGunLR) * Cos(m_fCarGunUD), m_fCarGunLR -= CTimer::GetTimeStep()*FIRETRUCK_LR_SPEED;
Cos(m_fCarGunLR) * Cos(m_fCarGunUD), else
Sin(m_fCarGunUD)); m_fCarGunLR = targetDirLR;
cannonDir = Multiply3x3(GetMatrix(), cannonDir);
cannonDir.z += (CGeneral::GetRandomNumber()&0xF)/1000.0f;
CWaterCannons::UpdateOne((uintptr)this, &cannonPos, &cannonDir);
}else if(GetStatus() == STATUS_PHYSICS){
CFire *fire = gFireManager.FindFurthestFire_NeverMindFireMen(GetPosition(), 10.0f, 35.0f);
if(fire == nil)
return;
// Target cannon onto fire if(targetDirUD - m_fCarGunUD > CTimer::GetTimeStep()*FIRETRUCK_UD_SPEED)
float targetAngle = CGeneral::GetATanOfXY(fire->m_vecPos.x-GetPosition().x, fire->m_vecPos.y-GetPosition().y); m_fCarGunUD += CTimer::GetTimeStep()*FIRETRUCK_UD_SPEED;
float fwdAngle = CGeneral::GetATanOfXY(GetForward().x, GetForward().y); else if(targetDirUD - m_fCarGunUD < -CTimer::GetTimeStep()*FIRETRUCK_UD_SPEED)
float targetCannonAngle = fwdAngle - targetAngle; m_fCarGunUD -= CTimer::GetTimeStep()*FIRETRUCK_UD_SPEED;
float angleDelta = CTimer::GetTimeStep()*0.01f; else
float cannonDelta = targetCannonAngle - m_fCarGunLR; m_fCarGunUD = targetDirUD;
while(cannonDelta < PI) cannonDelta += TWOPI; }else{
while(cannonDelta > PI) cannonDelta -= TWOPI; m_fCarGunLR -= CPad::GetPad(0)->GetCarGunLeftRight()/128.0f * FIRETRUCK_LR_SPEED * CTimer::GetTimeStep();
if(Abs(cannonDelta) < angleDelta) m_fCarGunUD += CPad::GetPad(0)->GetCarGunUpDown()/128.0f * FIRETRUCK_UD_SPEED * CTimer::GetTimeStep();
m_fCarGunLR = targetCannonAngle; }
else if(cannonDelta > 0.0f)
m_fCarGunLR += angleDelta;
else
m_fCarGunLR -= angleDelta;
// Go up and down a bit if(m_fCarGunLR < -PI) m_fCarGunLR += TWOPI;
float upDown = Sin((float)(CTimer::GetTimeInMilliseconds() & 0xFFF)/0x1000 * TWOPI); else if(m_fCarGunLR > PI) m_fCarGunLR -= TWOPI;
m_fCarGunUD = 0.2f + 0.2f*upDown; m_fCarGunUD = Clamp(m_fCarGunUD, -0.06f, 0.3f);
// Spray water every once in a while CVector cannonPos, cannonDir;
if((CTimer::GetTimeInMilliseconds()>>10) & 3){ CVector localOffset(0.0f, 0.75f, 0.0f);
CVector cannonPos(0.0f, 0.0f, 2.2f); // different position than player's firetruck! CVector localPos(0.0f, 1.05f, 2.02f);
cannonPos = GetMatrix() * cannonPos; CMatrix rotMat;
CVector cannonDir( rotMat.SetUnity();
Sin(m_fCarGunLR) * Cos(m_fCarGunUD), rotMat.SetRotateZ(m_fCarGunLR);
Cos(m_fCarGunLR) * Cos(m_fCarGunUD), localOffset = rotMat * localOffset;
Sin(m_fCarGunUD)); localPos += localOffset;
cannonDir = Multiply3x3(GetMatrix(), cannonDir); cannonPos = GetMatrix() * localPos;
cannonDir = Multiply3x3(GetMatrix(), CVector(-Sin(m_fCarGunLR) * Cos(m_fCarGunUD),
Cos(m_fCarGunLR) * Cos(m_fCarGunUD),
Sin(m_fCarGunUD)));
cannonDir.z += (CGeneral::GetRandomNumber()&0xF)/1000.0f; cannonDir.z += (CGeneral::GetRandomNumber()&0xF)/1000.0f;
CWaterCannons::UpdateOne((uintptr)this, &cannonPos, &cannonDir); CWaterCannons::UpdateOne((uintptr)this, &cannonPos, &cannonDir);
} }
}else if(GetStatus() == STATUS_PHYSICS){
CFire *fire = gFireManager.FindFurthestFire_NeverMindFireMen(GetPosition(), 10.0f, 35.0f);
if(fire){
// Target cannon onto fire
float targetAngle = CGeneral::GetATanOfXY(fire->m_vecPos.x-GetPosition().x, fire->m_vecPos.y-GetPosition().y);
float fwdAngle = CGeneral::GetATanOfXY(GetForward().x, GetForward().y);
#ifdef FIX_BUGS
// angle direction changed but they didn't notice
targetAngle = TWOPI - targetAngle;
fwdAngle = TWOPI - fwdAngle;
#endif
float targetCannonAngle = fwdAngle - targetAngle;
float angleDelta = CTimer::GetTimeStep()*0.01f;
float cannonDelta = CGeneral::LimitRadianAngle(targetCannonAngle - m_fCarGunLR);
if(Abs(cannonDelta) < angleDelta)
m_fCarGunLR = targetCannonAngle;
else if(cannonDelta > 0.0f)
m_fCarGunLR += angleDelta;
else
m_fCarGunLR -= angleDelta;
// Go up and down a bit
float upDown = Sin((float)(CTimer::GetTimeInMilliseconds() & 0xFFF)/0x1000 * TWOPI);
m_fCarGunUD = 0.2f + 0.2f*upDown;
// Spray water every once in a while
if((CTimer::GetTimeInMilliseconds()>>10) & 3){
CVector cannonPos, cannonDir;
CVector localOffset(0.0f, 0.75f, 0.0f);
CVector localPos(0.0f, 1.05f, 2.02f);
CMatrix rotMat;
rotMat.SetUnity();
rotMat.SetRotateZ(m_fCarGunLR);
localOffset = rotMat * localOffset;
localPos += localOffset;
cannonPos = GetMatrix() * localPos;
cannonDir = Multiply3x3(GetMatrix(), CVector(-Sin(m_fCarGunLR) * Cos(m_fCarGunUD),
Cos(m_fCarGunLR) * Cos(m_fCarGunUD),
Sin(m_fCarGunUD)));
cannonDir.z += (CGeneral::GetRandomNumber()&0xF)/1000.0f;
#ifdef FIX_BUGS
// actual call missing?!?
CWaterCannons::UpdateOne((uintptr)this, &cannonPos, &cannonDir);
#endif
}
}
}
if(m_aCarNodes[CAR_BUMP_REAR]){
CMatrix mat(RwFrameGetMatrix(m_aCarNodes[CAR_BUMP_REAR]));
CVector pos = mat.GetPosition();
mat.SetRotateZ(m_fCarGunLR);
mat.Translate(pos);
mat.UpdateRW();
} }
} }
@ -3217,10 +3331,7 @@ CAutomobile::TankControl(void)
// Rotate turret // Rotate turret
float prevAngle = m_fCarGunLR; float prevAngle = m_fCarGunLR;
#ifdef FREE_CAM m_fCarGunLR -= CPad::GetPad(0)->GetCarGunLeftRight() * 0.00015f * CTimer::GetTimeStep();
if(!CCamera::bFreeCam)
#endif
m_fCarGunLR -= CPad::GetPad(0)->GetCarGunLeftRight() * 0.00015f * CTimer::GetTimeStep();
if(m_fCarGunLR < 0.0f) if(m_fCarGunLR < 0.0f)
m_fCarGunLR += TWOPI; m_fCarGunLR += TWOPI;
@ -3297,6 +3408,14 @@ CAutomobile::TankControl(void)
flashPos += 0.1f*shotDir; flashPos += 0.1f*shotDir;
CParticle::AddParticle(PARTICLE_GUNFLASH, flashPos, nullDir, nil, 0.15f, black, 0, 0, 0, lifeSpan); CParticle::AddParticle(PARTICLE_GUNFLASH, flashPos, nullDir, nil, 0.15f, black, 0, 0, 0, lifeSpan);
} }
if(m_aCarNodes[CAR_WINDSCREEN]){
CMatrix mat(RwFrameGetMatrix(m_aCarNodes[CAR_WINDSCREEN]));
CVector pos = mat.GetPosition();
mat.SetRotateZ(m_fCarGunLR);
mat.Translate(pos);
mat.UpdateRW();
}
} }
#define HYDRAULIC_UPPER_EXT (-0.16f) #define HYDRAULIC_UPPER_EXT (-0.16f)
@ -3601,8 +3720,8 @@ CAutomobile::ProcessBuoyancy(void)
if(mod_Buoyancy.ProcessBuoyancy(this, m_fBuoyancy, &point, &impulse)){ if(mod_Buoyancy.ProcessBuoyancy(this, m_fBuoyancy, &point, &impulse)){
bTouchingWater = true; bTouchingWater = true;
float timeStep = Max(CTimer::GetTimeStep(), 0.01f); float timeStep = Max(CTimer::GetTimeStep(), 0.5f); // this seems awfully high
float impulseRatio = impulse.z / (GRAVITY * m_fMass * timeStep); float impulseRatio = impulse.z / ((bIsHeavy?GRAVITY/3.0f:GRAVITY) * m_fMass * timeStep);
float waterResistance = Pow(1.0f - 0.05f*impulseRatio, CTimer::GetTimeStep()); float waterResistance = Pow(1.0f - 0.05f*impulseRatio, CTimer::GetTimeStep());
m_vecMoveSpeed *= waterResistance; m_vecMoveSpeed *= waterResistance;
m_vecTurnSpeed *= waterResistance; m_vecTurnSpeed *= waterResistance;
@ -3647,8 +3766,11 @@ CAutomobile::ProcessBuoyancy(void)
if(pDriver){ if(pDriver){
pDriver->bIsInWater = true; pDriver->bIsInWater = true;
if(pDriver->IsPlayer() || !bWaterTight) if(pDriver->IsPlayer() || !bWaterTight){
if(pDriver->m_fHealth < 30.0f)
SampleManager.SetMusicFadeVolume(Max(0, SampleManager.GetMusicFadeVolume()-4));
pDriver->InflictDamage(nil, WEAPONTYPE_DROWNING, CTimer::GetTimeStep(), PEDPIECE_TORSO, 0); pDriver->InflictDamage(nil, WEAPONTYPE_DROWNING, CTimer::GetTimeStep(), PEDPIECE_TORSO, 0);
}
} }
for(i = 0; i < m_nNumMaxPassengers; i++) for(i = 0; i < m_nNumMaxPassengers; i++)
if(pPassengers[i]){ if(pPassengers[i]){
@ -4068,14 +4190,14 @@ CAutomobile::VehicleDamage(float impulse, uint16 damagedPiece)
case CAR_PIECE_BUMP_FRONT: case CAR_PIECE_BUMP_FRONT:
GetComponentWorldPosition(CAR_BUMP_FRONT, pos); GetComponentWorldPosition(CAR_BUMP_FRONT, pos);
dmgDrawCarCollidingParticles(pos, impulse*damageMultiplier); dmgDrawCarCollidingParticles(pos, impulse*damageMultiplier);
if(Damage.ApplyDamage(COMPONENT_BUMPER_FRONT, impulse*impulseMult, pHandling->fCollisionDamageMultiplier)) if(Damage.ApplyDamage(COMPONENT_BUMPER_FRONT, impulse*impulseMult, pHandling->GetCollisionDamageMultiplier()))
SetBumperDamage(CAR_BUMP_FRONT, VEHBUMPER_FRONT); SetBumperDamage(CAR_BUMP_FRONT, VEHBUMPER_FRONT);
if(m_aCarNodes[CAR_BONNET] && Damage.GetPanelStatus(VEHBUMPER_FRONT) == PANEL_STATUS_MISSING){ if(m_aCarNodes[CAR_BONNET] && Damage.GetPanelStatus(VEHBUMPER_FRONT) == PANEL_STATUS_MISSING){
case CAR_PIECE_BONNET: case CAR_PIECE_BONNET:
GetComponentWorldPosition(CAR_BONNET, pos); GetComponentWorldPosition(CAR_BONNET, pos);
dmgDrawCarCollidingParticles(pos, impulse*damageMultiplier); dmgDrawCarCollidingParticles(pos, impulse*damageMultiplier);
if(GetModelIndex() != MI_DODO) if(GetModelIndex() != MI_DODO)
if(Damage.ApplyDamage(COMPONENT_DOOR_BONNET, impulse*impulseMult, pHandling->fCollisionDamageMultiplier)) if(Damage.ApplyDamage(COMPONENT_DOOR_BONNET, impulse*impulseMult, pHandling->GetCollisionDamageMultiplier()))
SetDoorDamage(CAR_BONNET, DOOR_BONNET); SetDoorDamage(CAR_BONNET, DOOR_BONNET);
} }
break; break;
@ -4083,13 +4205,13 @@ CAutomobile::VehicleDamage(float impulse, uint16 damagedPiece)
case CAR_PIECE_BUMP_REAR: case CAR_PIECE_BUMP_REAR:
GetComponentWorldPosition(CAR_BUMP_REAR, pos); GetComponentWorldPosition(CAR_BUMP_REAR, pos);
dmgDrawCarCollidingParticles(pos, impulse*damageMultiplier); dmgDrawCarCollidingParticles(pos, impulse*damageMultiplier);
if(Damage.ApplyDamage(COMPONENT_BUMPER_REAR, impulse*impulseMult, pHandling->fCollisionDamageMultiplier)) if(Damage.ApplyDamage(COMPONENT_BUMPER_REAR, impulse*impulseMult, pHandling->GetCollisionDamageMultiplier()))
SetBumperDamage(CAR_BUMP_REAR, VEHBUMPER_REAR); SetBumperDamage(CAR_BUMP_REAR, VEHBUMPER_REAR);
if(m_aCarNodes[CAR_BOOT] && Damage.GetPanelStatus(VEHBUMPER_REAR) == PANEL_STATUS_MISSING){ if(m_aCarNodes[CAR_BOOT] && Damage.GetPanelStatus(VEHBUMPER_REAR) == PANEL_STATUS_MISSING){
case CAR_PIECE_BOOT: case CAR_PIECE_BOOT:
GetComponentWorldPosition(CAR_BOOT, pos); GetComponentWorldPosition(CAR_BOOT, pos);
dmgDrawCarCollidingParticles(pos, impulse*damageMultiplier); dmgDrawCarCollidingParticles(pos, impulse*damageMultiplier);
if(Damage.ApplyDamage(COMPONENT_DOOR_BOOT, impulse*impulseMult, pHandling->fCollisionDamageMultiplier)) if(Damage.ApplyDamage(COMPONENT_DOOR_BOOT, impulse*impulseMult, pHandling->GetCollisionDamageMultiplier()))
SetDoorDamage(CAR_BOOT, DOOR_BOOT); SetDoorDamage(CAR_BOOT, DOOR_BOOT);
} }
break; break;
@ -4097,50 +4219,50 @@ CAutomobile::VehicleDamage(float impulse, uint16 damagedPiece)
case CAR_PIECE_DOOR_LF: case CAR_PIECE_DOOR_LF:
GetComponentWorldPosition(CAR_DOOR_LF, pos); GetComponentWorldPosition(CAR_DOOR_LF, pos);
dmgDrawCarCollidingParticles(pos, impulse*damageMultiplier); dmgDrawCarCollidingParticles(pos, impulse*damageMultiplier);
if(Damage.ApplyDamage(COMPONENT_DOOR_FRONT_LEFT, impulse*impulseMult, pHandling->fCollisionDamageMultiplier)) if(Damage.ApplyDamage(COMPONENT_DOOR_FRONT_LEFT, impulse*impulseMult, pHandling->GetCollisionDamageMultiplier()))
SetDoorDamage(CAR_DOOR_LF, DOOR_FRONT_LEFT); SetDoorDamage(CAR_DOOR_LF, DOOR_FRONT_LEFT);
break; break;
case CAR_PIECE_DOOR_RF: case CAR_PIECE_DOOR_RF:
GetComponentWorldPosition(CAR_DOOR_RF, pos); GetComponentWorldPosition(CAR_DOOR_RF, pos);
dmgDrawCarCollidingParticles(pos, impulse*damageMultiplier); dmgDrawCarCollidingParticles(pos, impulse*damageMultiplier);
if(Damage.ApplyDamage(COMPONENT_DOOR_FRONT_RIGHT, impulse*impulseMult, pHandling->fCollisionDamageMultiplier)) if(Damage.ApplyDamage(COMPONENT_DOOR_FRONT_RIGHT, impulse*impulseMult, pHandling->GetCollisionDamageMultiplier()))
SetDoorDamage(CAR_DOOR_RF, DOOR_FRONT_RIGHT); SetDoorDamage(CAR_DOOR_RF, DOOR_FRONT_RIGHT);
break; break;
case CAR_PIECE_DOOR_LR: case CAR_PIECE_DOOR_LR:
GetComponentWorldPosition(CAR_DOOR_LR, pos); GetComponentWorldPosition(CAR_DOOR_LR, pos);
dmgDrawCarCollidingParticles(pos, impulse*damageMultiplier); dmgDrawCarCollidingParticles(pos, impulse*damageMultiplier);
if(Damage.ApplyDamage(COMPONENT_DOOR_REAR_LEFT, impulse*impulseMult, pHandling->fCollisionDamageMultiplier)) if(Damage.ApplyDamage(COMPONENT_DOOR_REAR_LEFT, impulse*impulseMult, pHandling->GetCollisionDamageMultiplier()))
SetDoorDamage(CAR_DOOR_LR, DOOR_REAR_LEFT); SetDoorDamage(CAR_DOOR_LR, DOOR_REAR_LEFT);
break; break;
case CAR_PIECE_DOOR_RR: case CAR_PIECE_DOOR_RR:
GetComponentWorldPosition(CAR_DOOR_RR, pos); GetComponentWorldPosition(CAR_DOOR_RR, pos);
dmgDrawCarCollidingParticles(pos, impulse*damageMultiplier); dmgDrawCarCollidingParticles(pos, impulse*damageMultiplier);
if(Damage.ApplyDamage(COMPONENT_DOOR_REAR_RIGHT, impulse*impulseMult, pHandling->fCollisionDamageMultiplier)) if(Damage.ApplyDamage(COMPONENT_DOOR_REAR_RIGHT, impulse*impulseMult, pHandling->GetCollisionDamageMultiplier()))
SetDoorDamage(CAR_DOOR_RR, DOOR_REAR_RIGHT); SetDoorDamage(CAR_DOOR_RR, DOOR_REAR_RIGHT);
break; break;
case CAR_PIECE_WING_LF: case CAR_PIECE_WING_LF:
GetComponentWorldPosition(CAR_WING_LF, pos); GetComponentWorldPosition(CAR_WING_LF, pos);
dmgDrawCarCollidingParticles(pos, impulse*damageMultiplier); dmgDrawCarCollidingParticles(pos, impulse*damageMultiplier);
if(Damage.ApplyDamage(COMPONENT_PANEL_FRONT_LEFT, impulse*impulseMult, pHandling->fCollisionDamageMultiplier)) if(Damage.ApplyDamage(COMPONENT_PANEL_FRONT_LEFT, impulse*impulseMult, pHandling->GetCollisionDamageMultiplier()))
SetPanelDamage(CAR_WING_LF, VEHPANEL_FRONT_LEFT); SetPanelDamage(CAR_WING_LF, VEHPANEL_FRONT_LEFT);
break; break;
case CAR_PIECE_WING_RF: case CAR_PIECE_WING_RF:
GetComponentWorldPosition(CAR_WING_RF, pos); GetComponentWorldPosition(CAR_WING_RF, pos);
dmgDrawCarCollidingParticles(pos, impulse*damageMultiplier); dmgDrawCarCollidingParticles(pos, impulse*damageMultiplier);
if(Damage.ApplyDamage(COMPONENT_PANEL_FRONT_RIGHT, impulse*impulseMult, pHandling->fCollisionDamageMultiplier)) if(Damage.ApplyDamage(COMPONENT_PANEL_FRONT_RIGHT, impulse*impulseMult, pHandling->GetCollisionDamageMultiplier()))
SetPanelDamage(CAR_WING_RF, VEHPANEL_FRONT_RIGHT); SetPanelDamage(CAR_WING_RF, VEHPANEL_FRONT_RIGHT);
break; break;
case CAR_PIECE_WING_LR: case CAR_PIECE_WING_LR:
GetComponentWorldPosition(CAR_WING_LR, pos); GetComponentWorldPosition(CAR_WING_LR, pos);
dmgDrawCarCollidingParticles(pos, impulse*damageMultiplier); dmgDrawCarCollidingParticles(pos, impulse*damageMultiplier);
if(Damage.ApplyDamage(COMPONENT_PANEL_REAR_LEFT, impulse*impulseMult, pHandling->fCollisionDamageMultiplier)) if(Damage.ApplyDamage(COMPONENT_PANEL_REAR_LEFT, impulse*impulseMult, pHandling->GetCollisionDamageMultiplier()))
SetPanelDamage(CAR_WING_LR, VEHPANEL_REAR_LEFT); SetPanelDamage(CAR_WING_LR, VEHPANEL_REAR_LEFT);
break; break;
case CAR_PIECE_WING_RR: case CAR_PIECE_WING_RR:
GetComponentWorldPosition(CAR_WING_RR, pos); GetComponentWorldPosition(CAR_WING_RR, pos);
dmgDrawCarCollidingParticles(pos, impulse*damageMultiplier); dmgDrawCarCollidingParticles(pos, impulse*damageMultiplier);
if(Damage.ApplyDamage(COMPONENT_PANEL_REAR_RIGHT, impulse*impulseMult, pHandling->fCollisionDamageMultiplier)) if(Damage.ApplyDamage(COMPONENT_PANEL_REAR_RIGHT, impulse*impulseMult, pHandling->GetCollisionDamageMultiplier()))
SetPanelDamage(CAR_WING_RR, VEHPANEL_REAR_RIGHT); SetPanelDamage(CAR_WING_RR, VEHPANEL_REAR_RIGHT);
break; break;
@ -4151,7 +4273,7 @@ CAutomobile::VehicleDamage(float impulse, uint16 damagedPiece)
break; break;
case CAR_PIECE_WINDSCREEN: case CAR_PIECE_WINDSCREEN:
if(Damage.ApplyDamage(COMPONENT_PANEL_WINDSCREEN, impulse*impulseMult, pHandling->fCollisionDamageMultiplier)){ if(Damage.ApplyDamage(COMPONENT_PANEL_WINDSCREEN, impulse*impulseMult, pHandling->GetCollisionDamageMultiplier())){
uint8 oldStatus = Damage.GetPanelStatus(VEHPANEL_WINDSCREEN); uint8 oldStatus = Damage.GetPanelStatus(VEHPANEL_WINDSCREEN);
SetPanelDamage(CAR_WINDSCREEN, VEHPANEL_WINDSCREEN); SetPanelDamage(CAR_WINDSCREEN, VEHPANEL_WINDSCREEN);
if(oldStatus != Damage.GetPanelStatus(VEHPANEL_WINDSCREEN)){ if(oldStatus != Damage.GetPanelStatus(VEHPANEL_WINDSCREEN)){
@ -4162,7 +4284,7 @@ CAutomobile::VehicleDamage(float impulse, uint16 damagedPiece)
} }
} }
float damage = (impulse-minImpulse)*pHandling->fCollisionDamageMultiplier*0.6f*damageMultiplier; float damage = (impulse-minImpulse)*pHandling->GetCollisionDamageMultiplier()*0.6f*damageMultiplier;
if(GetModelIndex() == MI_SECURICA && m_pDamageEntity && m_pDamageEntity->GetStatus() == STATUS_PLAYER) if(GetModelIndex() == MI_SECURICA && m_pDamageEntity && m_pDamageEntity->GetStatus() == STATUS_PLAYER)
damage *= 7.0f; damage *= 7.0f;
@ -4184,6 +4306,7 @@ CAutomobile::VehicleDamage(float impulse, uint16 damagedPiece)
int oldHealth = m_fHealth; int oldHealth = m_fHealth;
if(this == FindPlayerVehicle()) if(this == FindPlayerVehicle())
// android has other values here
m_fHealth -= bTakeLessDamage ? damage/6.0f : damage/2.0f; m_fHealth -= bTakeLessDamage ? damage/6.0f : damage/2.0f;
else if(bTakeLessDamage) else if(bTakeLessDamage)
m_fHealth -= damage/12.0f; m_fHealth -= damage/12.0f;
@ -4221,6 +4344,35 @@ CAutomobile::VehicleDamage(float impulse, uint16 damagedPiece)
Damage.SetEngineStatus(100); Damage.SetEngineStatus(100);
} }
} }
if(bHitByTrain){
for(i = 0; i < PHYSICAL_MAX_COLLISIONRECORDS; i++){
CVehicle *train = (CVehicle*)m_aCollisionRecords[i];
if(train && train->IsVehicle() &&
train->GetModelIndex() == MI_TRAIN &&
train->GetSpeed(CVector(0.0f, 0.0, 0.0f)).MagnitudeSqr() > SQR(0.001f)){
CPed *ped = KnockPedOutCar(WEAPONTYPE_RAMMEDBYCAR, CAR_DOOR_LF, pDriver);
if(ped){
//TODO(LCS): ped->NailToSubwayTrack();
ped->SetDie();
}
BlowUpCar(train);
}
}
}
if(pDriver && pDriver->IsPlayer()){
for(i = 0; i < PHYSICAL_MAX_COLLISIONRECORDS; i++){
CVehicle *airtrain = (CVehicle*)m_aCollisionRecords[i];
if(airtrain && airtrain->IsVehicle() &&
airtrain->GetModelIndex() == MI_AIRTRAIN){
CPed *ped = KnockPedOutCar(WEAPONTYPE_RAMMEDBYCAR, CAR_DOOR_LF, pDriver);
if(ped)
ped->SetDie();
BlowUpCar(airtrain);
}
}
}
} }
void void
@ -4263,6 +4415,16 @@ CAutomobile::dmgDrawCarCollidingParticles(const CVector &pos, float amount)
CGeneral::GetRandomNumberInRange(0, 4)); CGeneral::GetRandomNumberInRange(0, 4));
} }
float fDamagePosSpeedShift = 0.4f;
float fSpeedMult[] = {
0.8f,
0.75f,
0.85f,
0.9f,
0.85f,
0.85f
};
void void
CAutomobile::AddDamagedVehicleParticles(void) CAutomobile::AddDamagedVehicleParticles(void)
{ {
@ -4275,7 +4437,7 @@ CAutomobile::AddDamagedVehicleParticles(void)
if(m_fHealth >= 650.0f) if(m_fHealth >= 650.0f)
return; return;
CVector direction = 0.85f*m_vecMoveSpeed; CVector direction = fSpeedMult[5]*m_vecMoveSpeed;
CVector damagePos = ((CVehicleModelInfo*)CModelInfo::GetModelInfo(GetModelIndex()))->m_positions[CAR_POS_HEADLIGHTS]; CVector damagePos = ((CVehicleModelInfo*)CModelInfo::GetModelInfo(GetModelIndex()))->m_positions[CAR_POS_HEADLIGHTS];
switch(Damage.GetDoorStatus(DOOR_BONNET)){ switch(Damage.GetDoorStatus(DOOR_BONNET)){
@ -4300,7 +4462,7 @@ CAutomobile::AddDamagedVehicleParticles(void)
damagePos.y = 0.2f*GetColModel()->boundingBox.min.y; damagePos.y = 0.2f*GetColModel()->boundingBox.min.y;
damagePos.z = 0.3f*GetColModel()->boundingBox.max.z; damagePos.z = 0.3f*GetColModel()->boundingBox.max.z;
}else }else
damagePos.z += 0.4f*(GetColModel()->boundingBox.max.z-damagePos.z) * DotProduct(GetForward(), m_vecMoveSpeed); damagePos.z += fDamagePosSpeedShift*(GetColModel()->boundingBox.max.z-damagePos.z) * DotProduct(GetForward(), m_vecMoveSpeed);
damagePos = GetMatrix()*damagePos; damagePos = GetMatrix()*damagePos;
damagePos.z += 0.15f; damagePos.z += 0.15f;
@ -4319,7 +4481,7 @@ CAutomobile::AddDamagedVehicleParticles(void)
direction = 0.85f*m_vecMoveSpeed; direction = 0.85f*m_vecMoveSpeed;
direction += GetRight() * CGeneral::GetRandomNumberInRange(0.0f, 0.04f) * (1.0f - 2.0f*m_vecMoveSpeed.Magnitude()); direction += GetRight() * CGeneral::GetRandomNumberInRange(0.0f, 0.04f) * (1.0f - 2.0f*m_vecMoveSpeed.Magnitude());
direction.z += 0.001f; direction.z += 0.001f;
n = (CGeneral::GetRandomNumber() & 3) + 2; n = (CGeneral::GetRandomNumber() & 3) + 1;
for(i = 0; i < n; i++) for(i = 0; i < n; i++)
CParticle::AddParticle(PARTICLE_SPARK_SMALL, damagePos, direction); CParticle::AddParticle(PARTICLE_SPARK_SMALL, damagePos, direction);
if(((CTimer::GetFrameCounter() + m_randomSeed) & 0xF) == 0) if(((CTimer::GetFrameCounter() + m_randomSeed) & 0xF) == 0)
@ -4327,11 +4489,15 @@ CAutomobile::AddDamagedVehicleParticles(void)
}else if(m_fHealth < 250.0f){ }else if(m_fHealth < 250.0f){
// nothing // nothing
}else if(m_fHealth < 320.0f){ }else if(m_fHealth < 320.0f){
CParticle::AddParticle(PARTICLE_ENGINE_SMOKE2, damagePos, 0.8f*direction); CParticle::AddParticle(PARTICLE_ENGINE_SMOKE2, damagePos, fSpeedMult[0]*direction);
}else if(m_fHealth < 390.0f){ }else if(m_fHealth < 390.0f){
CParticle::AddParticle(PARTICLE_ENGINE_STEAM, damagePos, 0.75f*direction); CParticle::AddParticle(PARTICLE_ENGINE_STEAM, damagePos, fSpeedMult[1]*direction);
CParticle::AddParticle(PARTICLE_ENGINE_SMOKE, damagePos, 0.85f*direction); CParticle::AddParticle(PARTICLE_ENGINE_SMOKE, damagePos, fSpeedMult[2]*direction);
}else if(m_fHealth < 460.0f){ }else if(m_fHealth < 460.0f){
if(((CTimer::GetFrameCounter() + m_randomSeed) & 3) == 0 ||
((CTimer::GetFrameCounter() + m_randomSeed) & 3) == 2)
CParticle::AddParticle(PARTICLE_ENGINE_STEAM, damagePos, fSpeedMult[3]*direction);
}else{
int rnd = CTimer::GetFrameCounter() + m_randomSeed; int rnd = CTimer::GetFrameCounter() + m_randomSeed;
if(rnd < 10 || if(rnd < 10 ||
rnd < 70 && rnd > 25 || rnd < 70 && rnd > 25 ||
@ -4341,7 +4507,6 @@ CAutomobile::AddDamagedVehicleParticles(void)
return; return;
direction.z += 0.05f*Max(1.0f - 1.6f*m_vecMoveSpeed.Magnitude(), 0.0f); direction.z += 0.05f*Max(1.0f - 1.6f*m_vecMoveSpeed.Magnitude(), 0.0f);
if(electric){ if(electric){
// BUG. we had that case already
direction = 0.85f*m_vecMoveSpeed; direction = 0.85f*m_vecMoveSpeed;
direction += GetRight() * CGeneral::GetRandomNumberInRange(0.0f, 0.04f) * (1.0f - 2.0f*m_vecMoveSpeed.Magnitude()); direction += GetRight() * CGeneral::GetRandomNumberInRange(0.0f, 0.04f) * (1.0f - 2.0f*m_vecMoveSpeed.Magnitude());
direction.z += 0.001f; direction.z += 0.001f;
@ -4352,13 +4517,10 @@ CAutomobile::AddDamagedVehicleParticles(void)
CParticle::AddParticle(PARTICLE_ENGINE_SMOKE, damagePos, 0.8f*m_vecMoveSpeed, nil, 0.1f, 0, 0, 0, 1000); CParticle::AddParticle(PARTICLE_ENGINE_SMOKE, damagePos, 0.8f*m_vecMoveSpeed, nil, 0.1f, 0, 0, 0, 1000);
}else{ }else{
if(TheCamera.GetLookDirection() != LOOKING_FORWARD) if(TheCamera.GetLookDirection() != LOOKING_FORWARD)
CParticle::AddParticle(PARTICLE_ENGINE_STEAM, damagePos, 0.75f*direction); CParticle::AddParticle(PARTICLE_ENGINE_STEAM, damagePos, direction);
else if(((CTimer::GetFrameCounter() + m_randomSeed) & 1) == 0) else if(((CTimer::GetFrameCounter() + m_randomSeed) & 1) == 0)
CParticle::AddParticle(PARTICLE_ENGINE_STEAM, damagePos, 0.85f*m_vecMoveSpeed); CParticle::AddParticle(PARTICLE_ENGINE_STEAM, damagePos, fSpeedMult[4]*m_vecMoveSpeed);
} }
}else if(((CTimer::GetFrameCounter() + m_randomSeed) & 3) == 0 ||
((CTimer::GetFrameCounter() + m_randomSeed) & 3) == 2){
CParticle::AddParticle(PARTICLE_ENGINE_STEAM, damagePos, 0.9f*direction);
} }
} }
@ -4408,7 +4570,7 @@ CAutomobile::AddWheelDirtAndWater(CColPoint *colpoint, uint32 belowEffectSpeed)
case SURFACE_SAND: case SURFACE_SAND:
case SURFACE_SAND_BEACH: case SURFACE_SAND_BEACH:
if(CTimer::GetFrameCounter() & 2 || if(CTimer::GetFrameCounter() & 2 ||
CGeneral::GetRandomNumberInRange(CWeather::WetRoads, 1.01f) > 0.5f) CWeather::WetRoads > 0.0f && CGeneral::GetRandomNumberInRange(CWeather::WetRoads, 1.01f) > 0.5f)
return 0; return 0;
dir.x = 0.5f*m_vecMoveSpeed.x; dir.x = 0.5f*m_vecMoveSpeed.x;
dir.y = 0.5f*m_vecMoveSpeed.y; dir.y = 0.5f*m_vecMoveSpeed.y;
@ -4547,6 +4709,19 @@ CAutomobile::ProcessOpenDoor(uint32 component, uint32 anim, float time)
{ {
eDoors door; eDoors door;
if(bIsVan){
if(component == CAR_DOOR_RR){
if(anim == ANIM_STD_VAN_OPEN_DOOR_REAR_RHS || anim == ANIM_STD_VAN_CLOSE_DOOR_REAR_RHS)
if(IsDoorReady(DOOR_REAR_LEFT))
ProcessOpenDoor(CAR_DOOR_LR, anim, time);
}
if(component == CAR_DOOR_LR){
if(anim == ANIM_STD_VAN_OPEN_DOOR_REAR_LHS || anim == ANIM_STD_VAN_CLOSE_DOOR_REAR_LHS)
if(IsDoorReady(DOOR_REAR_RIGHT))
ProcessOpenDoor(CAR_DOOR_RR, anim, time);
}
}
switch(component){ switch(component){
case CAR_DOOR_RF: door = DOOR_FRONT_RIGHT; break; case CAR_DOOR_RF: door = DOOR_FRONT_RIGHT; break;
case CAR_DOOR_RR: door = DOOR_REAR_RIGHT; break; case CAR_DOOR_RR: door = DOOR_REAR_RIGHT; break;
@ -4568,7 +4743,7 @@ CAutomobile::ProcessOpenDoor(uint32 component, uint32 anim, float time)
case ANIM_STD_CAR_CLOSE_DOOR_LO_LHS: case ANIM_STD_CAR_CLOSE_DOOR_LO_LHS:
case ANIM_STD_CAR_CLOSE_DOOR_RHS: case ANIM_STD_CAR_CLOSE_DOOR_RHS:
case ANIM_STD_CAR_CLOSE_DOOR_LO_RHS: case ANIM_STD_CAR_CLOSE_DOOR_LO_RHS:
ProcessDoorCloseAnimation(this, component, door, time, 0.2f, 0.45f); ProcessDoorCloseAnimation(this, component, door, time, 0.2f, 0.63f);
break; break;
case ANIM_STD_CAR_CLOSE_DOOR_ROLLING_LHS: case ANIM_STD_CAR_CLOSE_DOOR_ROLLING_LHS:
case ANIM_STD_CAR_CLOSE_DOOR_ROLLING_LO_LHS: case ANIM_STD_CAR_CLOSE_DOOR_ROLLING_LO_LHS:
@ -4582,7 +4757,7 @@ CAutomobile::ProcessOpenDoor(uint32 component, uint32 anim, float time)
break; break;
case ANIM_STD_CAR_CLOSE_LHS: case ANIM_STD_CAR_CLOSE_LHS:
case ANIM_STD_CAR_CLOSE_RHS: case ANIM_STD_CAR_CLOSE_RHS:
ProcessDoorCloseAnimation(this, component, door, time, 0.1f, 0.23f); ProcessDoorCloseAnimation(this, component, door, time, 0.35f, 0.5f);
break; break;
case ANIM_STD_CAR_PULL_OUT_PED_RHS: case ANIM_STD_CAR_PULL_OUT_PED_RHS:
case ANIM_STD_CAR_PULL_OUT_PED_LO_RHS: case ANIM_STD_CAR_PULL_OUT_PED_LO_RHS:
@ -5403,6 +5578,7 @@ CAutomobile::SpawnFlyingComponent(int32 component, uint32 type)
if(obj == nil) if(obj == nil)
return nil; return nil;
phys_lcs_unk1 = false;
if(component == CAR_WINDSCREEN){ if(component == CAR_WINDSCREEN){
obj->SetModelIndexNoCreate(MI_CAR_BONNET); obj->SetModelIndexNoCreate(MI_CAR_BONNET);
}else switch(type){ }else switch(type){
@ -5441,6 +5617,7 @@ CAutomobile::SpawnFlyingComponent(int32 component, uint32 type)
*RwFrameGetMatrix(frame) = *matrix; *RwFrameGetMatrix(frame) = *matrix;
RpAtomicSetFrame(atomic, frame); RpAtomicSetFrame(atomic, frame);
CVisibilityPlugins::SetAtomicRenderCallback(atomic, nil); CVisibilityPlugins::SetAtomicRenderCallback(atomic, nil);
CStreaming::RegisterInstance(atomic, nil);
obj->AttachToRwObject((RwObject*)atomic); obj->AttachToRwObject((RwObject*)atomic);
obj->bDontStream = true; obj->bDontStream = true;
@ -5485,7 +5662,7 @@ CAutomobile::SpawnFlyingComponent(int32 component, uint32 type)
CVector dist = obj->GetPosition() - GetPosition(); CVector dist = obj->GetPosition() - GetPosition();
dist.Normalise(); dist.Normalise();
if(component == COMPGROUP_BONNET || component == COMPGROUP_BOOT || component == CAR_WINDSCREEN){ if(component == COMPGROUP_BONNET || component == COMPGROUP_BOOT || component == CAR_WINDSCREEN){
// push these up some // push these up some
dist += GetUp(); dist += GetUp();
if(GetUp().z > 0.0f){ if(GetUp().z > 0.0f){
// simulate fast upward movement if going fast // simulate fast upward movement if going fast
@ -5508,9 +5685,9 @@ CAutomobile::SpawnFlyingComponent(int32 component, uint32 type)
ApplyMoveForce(5.0f*dist); ApplyMoveForce(5.0f*dist);
} }
if(CCollision::ProcessColModels(obj->GetMatrix(), *obj->GetColModel(), // if(CCollision::ProcessColModels(obj->GetMatrix(), *obj->GetColModel(),
this->GetMatrix(), *this->GetColModel(), // this->GetMatrix(), *this->GetColModel(),
CWorld::m_aTempColPts, nil, nil) > 0) // CWorld::m_aTempColPts, nil, nil) > 0)
obj->m_pCollidingEntity = this; obj->m_pCollidingEntity = this;
if(bRenderScorched) if(bRenderScorched)
@ -5768,12 +5945,12 @@ CAutomobile::CloseAllDoors(void)
} }
} }
void CPed*
CAutomobile::KnockPedOutCar(eWeaponType weapon, uint16 door, CPed *ped) CAutomobile::KnockPedOutCar(eWeaponType weapon, uint16 door, CPed *ped)
{ {
AnimationId anim = ANIM_STD_KO_FRONT; AnimationId anim = ANIM_STD_KO_FRONT;
if(ped == nil) if(ped == nil)
return; return nil;
ped->m_vehDoor = door; ped->m_vehDoor = door;
ped->SetPedState(PED_IDLE); ped->SetPedState(PED_IDLE);
@ -5808,6 +5985,7 @@ CAutomobile::KnockPedOutCar(eWeaponType weapon, uint16 door, CPed *ped)
ped->m_headingRate = 0.0f; ped->m_headingRate = 0.0f;
} }
ped->m_pMyVehicle = nil; ped->m_pMyVehicle = nil;
return ped;
} }
#ifdef COMPATIBLE_SAVES #ifdef COMPATIBLE_SAVES

View File

@ -164,7 +164,7 @@ public:
void PopBoot(void); void PopBoot(void);
void PopBootUsingPhysics(void); void PopBootUsingPhysics(void);
void CloseAllDoors(void); void CloseAllDoors(void);
void KnockPedOutCar(eWeaponType weapon, uint16 door, CPed *ped); CPed *KnockPedOutCar(eWeaponType weapon, uint16 door, CPed *ped);
#ifdef COMPATIBLE_SAVES #ifdef COMPATIBLE_SAVES
virtual void Save(uint8*& buf); virtual void Save(uint8*& buf);

View File

@ -1672,7 +1672,7 @@ CVehicle::IsLawEnforcementVehicle(void)
case MI_RHINO: case MI_RHINO:
case MI_BARRACKS: case MI_BARRACKS:
// case MI_FBIRANCH: // case MI_FBIRANCH:
// case MI_VICECHEE: case MI_VICECHEE:
return true; return true;
default: default:
return false; return false;
@ -1690,8 +1690,8 @@ CVehicle::UsesSiren(void)
case MI_POLICE: case MI_POLICE:
case MI_ENFORCER: case MI_ENFORCER:
case MI_PREDATOR: case MI_PREDATOR:
// case MI_FBIRANCH: case MI_FBIRANCH:
// case MI_VICECHEE: case MI_VICECHEE:
return true; return true;
default: default:
return false; return false;
@ -1955,12 +1955,11 @@ CVehicle::SetDriver(CPed *driver)
case MI_ENFORCER: case MI_ENFORCER:
driver->m_fArmour = Max(driver->m_fArmour, CWorld::Players[0].m_nMaxArmour); driver->m_fArmour = Max(driver->m_fArmour, CWorld::Players[0].m_nMaxArmour);
break; break;
/*
case MI_CADDY: case MI_CADDY:
if(!(driver->IsPlayer() && ((CPlayerPed*)driver)->DoesPlayerWantNewWeapon(WEAPONTYPE_GOLFCLUB, true))) if(!(driver->IsPlayer() && ((CPlayerPed*)driver)->DoesPlayerWantNewWeapon(WEAPONTYPE_GOLFCLUB, true)))
CStreaming::RequestModel(MI_GOLFCLUB, STREAMFLAGS_DONT_REMOVE); CStreaming::RequestModel(MI_GOLFCLUB, STREAMFLAGS_DONT_REMOVE);
break; break;
*/
} }
} }
@ -2035,12 +2034,10 @@ CVehicle::RemoveDriver(void)
bFreebies = false; bFreebies = false;
} }
CStreaming::SetModelIsDeletable(MI_SHOTGUN); CStreaming::SetModelIsDeletable(MI_SHOTGUN);
/*
}else if(GetModelIndex() == MI_CADDY && CStreaming::HasModelLoaded(MI_GOLFCLUB)){ }else if(GetModelIndex() == MI_CADDY && CStreaming::HasModelLoaded(MI_GOLFCLUB)){
if(((CPlayerPed*)pDriver)->DoesPlayerWantNewWeapon(WEAPONTYPE_GOLFCLUB, true)) if(((CPlayerPed*)pDriver)->DoesPlayerWantNewWeapon(WEAPONTYPE_GOLFCLUB, true))
pDriver->GiveWeapon(WEAPONTYPE_GOLFCLUB, 1, true); pDriver->GiveWeapon(WEAPONTYPE_GOLFCLUB, 1, true);
CStreaming::SetModelIsDeletable(MI_GOLFCLUB); CStreaming::SetModelIsDeletable(MI_GOLFCLUB);
*/
} }
} }
pDriver = nil; pDriver = nil;