|
|
|
@ -3,6 +3,7 @@
|
|
|
|
|
#include "Automobile.h"
|
|
|
|
|
#include "Bridge.h"
|
|
|
|
|
#include "Camera.h"
|
|
|
|
|
#include "CarCtrl.h"
|
|
|
|
|
#include "Cranes.h"
|
|
|
|
|
#include "Darkel.h"
|
|
|
|
|
#include "Explosion.h"
|
|
|
|
@ -34,93 +35,10 @@
|
|
|
|
|
#include "Automobile.h"
|
|
|
|
|
#include "GameLogic.h"
|
|
|
|
|
|
|
|
|
|
// --MIAMI: File done
|
|
|
|
|
|
|
|
|
|
CVector lastPlayerPos;
|
|
|
|
|
|
|
|
|
|
// --MIAMI: Done
|
|
|
|
|
void
|
|
|
|
|
CPlayerInfo::SetPlayerSkin(char *skin)
|
|
|
|
|
{
|
|
|
|
|
strncpy(m_aSkinName, skin, 32);
|
|
|
|
|
LoadPlayerSkin();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// --MIAMI: Done
|
|
|
|
|
const CVector &
|
|
|
|
|
CPlayerInfo::GetPos()
|
|
|
|
|
{
|
|
|
|
|
#ifdef FIX_BUGS
|
|
|
|
|
if (!m_pPed)
|
|
|
|
|
return TheCamera.GetPosition();
|
|
|
|
|
#endif
|
|
|
|
|
if (m_pPed->InVehicle())
|
|
|
|
|
return m_pPed->m_pMyVehicle->GetPosition();
|
|
|
|
|
return m_pPed->GetPosition();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// --MIAMI: Done
|
|
|
|
|
void
|
|
|
|
|
CPlayerInfo::LoadPlayerSkin()
|
|
|
|
|
{
|
|
|
|
|
DeletePlayerSkin();
|
|
|
|
|
|
|
|
|
|
m_pSkinTexture = CPlayerSkin::GetSkinTexture(m_aSkinName);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// --MIAMI: Done
|
|
|
|
|
void
|
|
|
|
|
CPlayerInfo::DeletePlayerSkin()
|
|
|
|
|
{
|
|
|
|
|
if (m_pSkinTexture) {
|
|
|
|
|
RwTextureDestroy(m_pSkinTexture);
|
|
|
|
|
m_pSkinTexture = nil;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// --MIAMI: Done
|
|
|
|
|
void
|
|
|
|
|
CPlayerInfo::KillPlayer()
|
|
|
|
|
{
|
|
|
|
|
if (m_WBState != WBSTATE_PLAYING) return;
|
|
|
|
|
|
|
|
|
|
m_WBState = WBSTATE_WASTED;
|
|
|
|
|
m_nWBTime = CTimer::GetTimeInMilliseconds();
|
|
|
|
|
CDarkel::ResetOnPlayerDeath();
|
|
|
|
|
CMessages::AddBigMessage(TheText.Get("DEAD"), 4000, 2);
|
|
|
|
|
CStats::TimesDied++;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// --MIAMI: Done
|
|
|
|
|
void
|
|
|
|
|
CPlayerInfo::ArrestPlayer()
|
|
|
|
|
{
|
|
|
|
|
if (m_WBState != WBSTATE_PLAYING) return;
|
|
|
|
|
|
|
|
|
|
m_WBState = WBSTATE_BUSTED;
|
|
|
|
|
m_nWBTime = CTimer::GetTimeInMilliseconds();
|
|
|
|
|
m_nBustedAudioStatus = BUSTEDAUDIO_NONE;
|
|
|
|
|
CDarkel::ResetOnPlayerDeath();
|
|
|
|
|
CMessages::AddBigMessage(TheText.Get("BUSTED"), 5000, 2);
|
|
|
|
|
CStats::TimesArrested++;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// --MIAMI: Done
|
|
|
|
|
bool
|
|
|
|
|
CPlayerInfo::IsPlayerInRemoteMode()
|
|
|
|
|
{
|
|
|
|
|
return m_pRemoteVehicle || m_bInRemoteMode;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
CPlayerInfo::PlayerFailedCriticalMission()
|
|
|
|
|
{
|
|
|
|
|
if (m_WBState != WBSTATE_PLAYING)
|
|
|
|
|
return;
|
|
|
|
|
m_WBState = WBSTATE_FAILED_CRITICAL_MISSION;
|
|
|
|
|
m_nWBTime = CTimer::GetTimeInMilliseconds();
|
|
|
|
|
CDarkel::ResetOnPlayerDeath();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// --MIAMI: Done
|
|
|
|
|
void
|
|
|
|
|
CPlayerInfo::Clear(void)
|
|
|
|
|
{
|
|
|
|
@ -181,192 +99,6 @@ CPlayerInfo::Clear(void)
|
|
|
|
|
m_nBustedAudioStatus = BUSTEDAUDIO_NONE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// --MIAMI: Done
|
|
|
|
|
void
|
|
|
|
|
CPlayerInfo::BlowUpRCBuggy(bool actually)
|
|
|
|
|
{
|
|
|
|
|
if (!m_pRemoteVehicle || m_pRemoteVehicle->bRemoveFromWorld)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
CRemote::TakeRemoteControlledCarFromPlayer(actually);
|
|
|
|
|
if (actually)
|
|
|
|
|
m_pRemoteVehicle->BlowUpCar(FindPlayerPed());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// --MIAMI: Done
|
|
|
|
|
void
|
|
|
|
|
CPlayerInfo::CancelPlayerEnteringCars(CVehicle *car)
|
|
|
|
|
{
|
|
|
|
|
if (!car || car == m_pPed->m_pMyVehicle) {
|
|
|
|
|
if (m_pPed->EnteringCar())
|
|
|
|
|
m_pPed->QuitEnteringCar();
|
|
|
|
|
}
|
|
|
|
|
if (m_pPed->m_objective == OBJECTIVE_ENTER_CAR_AS_PASSENGER || m_pPed->m_objective == OBJECTIVE_ENTER_CAR_AS_DRIVER)
|
|
|
|
|
m_pPed->ClearObjective();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// --MIAMI: Done
|
|
|
|
|
void
|
|
|
|
|
CPlayerInfo::MakePlayerSafe(bool toggle)
|
|
|
|
|
{
|
|
|
|
|
if (toggle) {
|
|
|
|
|
m_pPed->m_pWanted->m_bIgnoredByEveryone = true;
|
|
|
|
|
CWorld::StopAllLawEnforcersInTheirTracks();
|
|
|
|
|
CPad::GetPad(0)->SetDisablePlayerControls(PLAYERCONTROL_PLAYERINFO);
|
|
|
|
|
CPad::StopPadsShaking();
|
|
|
|
|
m_pPed->bBulletProof = true;
|
|
|
|
|
m_pPed->bFireProof = true;
|
|
|
|
|
m_pPed->bCollisionProof = true;
|
|
|
|
|
m_pPed->bMeleeProof = true;
|
|
|
|
|
m_pPed->bOnlyDamagedByPlayer = true;
|
|
|
|
|
m_pPed->bExplosionProof = true;
|
|
|
|
|
m_pPed->m_bCanBeDamaged = false;
|
|
|
|
|
((CPlayerPed*)m_pPed)->ClearAdrenaline();
|
|
|
|
|
CancelPlayerEnteringCars(nil);
|
|
|
|
|
gFireManager.ExtinguishPoint(GetPos(), 4000.0f);
|
|
|
|
|
CExplosion::RemoveAllExplosionsInArea(GetPos(), 4000.0f);
|
|
|
|
|
CProjectileInfo::RemoveAllProjectiles();
|
|
|
|
|
CWorld::SetAllCarsCanBeDamaged(false);
|
|
|
|
|
CWorld::ExtinguishAllCarFiresInArea(GetPos(), 4000.0f);
|
|
|
|
|
CReplay::DisableReplays();
|
|
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
m_pPed->m_pWanted->m_bIgnoredByEveryone = false;
|
|
|
|
|
CPad::GetPad(0)->SetEnablePlayerControls(PLAYERCONTROL_PLAYERINFO);
|
|
|
|
|
m_pPed->bBulletProof = false;
|
|
|
|
|
m_pPed->bFireProof = false;
|
|
|
|
|
m_pPed->bCollisionProof = false;
|
|
|
|
|
m_pPed->bMeleeProof = false;
|
|
|
|
|
m_pPed->bOnlyDamagedByPlayer = false;
|
|
|
|
|
m_pPed->bExplosionProof = false;
|
|
|
|
|
m_pPed->m_bCanBeDamaged = true;
|
|
|
|
|
CWorld::SetAllCarsCanBeDamaged(true);
|
|
|
|
|
CReplay::EnableReplays();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// --MIAMI: Done
|
|
|
|
|
bool
|
|
|
|
|
CPlayerInfo::IsRestartingAfterDeath()
|
|
|
|
|
{
|
|
|
|
|
return m_WBState == WBSTATE_WASTED;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// --MIAMI: Done
|
|
|
|
|
bool
|
|
|
|
|
CPlayerInfo::IsRestartingAfterArrest()
|
|
|
|
|
{
|
|
|
|
|
return m_WBState == WBSTATE_BUSTED;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// --MIAMI: Done
|
|
|
|
|
// lastCloseness is passed to other calls of this function
|
|
|
|
|
void
|
|
|
|
|
CPlayerInfo::EvaluateCarPosition(CEntity *carToTest, CPed *player, float carBoundCentrePedDist, float *lastCloseness, CVehicle **closestCarOutput)
|
|
|
|
|
{
|
|
|
|
|
// This dist used for determining the angle to face
|
|
|
|
|
CVector2D dist(carToTest->GetPosition() - player->GetPosition());
|
|
|
|
|
float neededTurn = CGeneral::GetATanOfXY(player->GetForward().x, player->GetForward().y) - CGeneral::GetATanOfXY(dist.x, dist.y);
|
|
|
|
|
while (neededTurn >= PI) {
|
|
|
|
|
neededTurn -= 2 * PI;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
while (neededTurn < -PI) {
|
|
|
|
|
neededTurn += 2 * PI;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// This dist used for evaluating cars' distances, weird...
|
|
|
|
|
// Accounts inverted needed turn (or needed turn in long way) and car dist.
|
|
|
|
|
float closeness = (1.0f - Abs(neededTurn) / TWOPI) * (10.0f - carBoundCentrePedDist);
|
|
|
|
|
if (closeness > *lastCloseness) {
|
|
|
|
|
*lastCloseness = closeness;
|
|
|
|
|
*closestCarOutput = (CVehicle*)carToTest;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// --MIAMI: Done
|
|
|
|
|
void
|
|
|
|
|
CPlayerInfo::SavePlayerInfo(uint8 *buf, uint32 *size)
|
|
|
|
|
{
|
|
|
|
|
// Interesting
|
|
|
|
|
*size = sizeof(CPlayerInfo);
|
|
|
|
|
|
|
|
|
|
#define CopyToBuf(buf, data) memcpy(buf, &data, sizeof(data)); buf += sizeof(data);
|
|
|
|
|
CopyToBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nMoney);
|
|
|
|
|
CopyToBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_WBState);
|
|
|
|
|
CopyToBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nWBTime);
|
|
|
|
|
CopyToBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nTrafficMultiplier);
|
|
|
|
|
CopyToBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_fRoadDensity);
|
|
|
|
|
CopyToBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nVisibleMoney);
|
|
|
|
|
CopyToBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nCollectedPackages);
|
|
|
|
|
CopyToBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nTotalPackages);
|
|
|
|
|
CopyToBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_bInfiniteSprint);
|
|
|
|
|
CopyToBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_bFastReload);
|
|
|
|
|
CopyToBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_bFireproof);
|
|
|
|
|
CopyToBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nMaxHealth);
|
|
|
|
|
CopyToBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nMaxArmour);
|
|
|
|
|
CopyToBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_bGetOutOfJailFree);
|
|
|
|
|
CopyToBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_bGetOutOfHospitalFree);
|
|
|
|
|
CopyToBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_bDriveByAllowed);
|
|
|
|
|
CopyToBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_aPlayerName);
|
|
|
|
|
CopyToBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nBustedAudioStatus);
|
|
|
|
|
CopyToBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nCurrentBustedAudio);
|
|
|
|
|
#undef CopyToBuf
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// --MIAMI: Done
|
|
|
|
|
void
|
|
|
|
|
CPlayerInfo::LoadPlayerInfo(uint8 *buf, uint32 size)
|
|
|
|
|
{
|
|
|
|
|
#define CopyFromBuf(buf, data) memcpy(&data, buf, sizeof(data)); buf += sizeof(data);
|
|
|
|
|
CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nMoney);
|
|
|
|
|
CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_WBState);
|
|
|
|
|
CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nWBTime);
|
|
|
|
|
CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nTrafficMultiplier);
|
|
|
|
|
CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_fRoadDensity);
|
|
|
|
|
CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nVisibleMoney);
|
|
|
|
|
CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nCollectedPackages);
|
|
|
|
|
CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nTotalPackages);
|
|
|
|
|
CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_bInfiniteSprint);
|
|
|
|
|
CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_bFastReload);
|
|
|
|
|
CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_bFireproof);
|
|
|
|
|
CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nMaxHealth);
|
|
|
|
|
CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nMaxArmour);
|
|
|
|
|
CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_bGetOutOfJailFree);
|
|
|
|
|
CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_bGetOutOfHospitalFree);
|
|
|
|
|
CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_bDriveByAllowed);
|
|
|
|
|
CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_aPlayerName);
|
|
|
|
|
CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nBustedAudioStatus);
|
|
|
|
|
CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nCurrentBustedAudio)
|
|
|
|
|
#undef CopyFromBuf
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// --MIAMI: Done
|
|
|
|
|
void
|
|
|
|
|
CPlayerInfo::FindClosestCarSectorList(CPtrList& carList, CPed* ped, float unk1, float unk2, float unk3, float unk4, float* lastCloseness, CVehicle** closestCarOutput)
|
|
|
|
|
{
|
|
|
|
|
for (CPtrNode* node = carList.first; node; node = node->next) {
|
|
|
|
|
CVehicle *car = (CVehicle*)node->item;
|
|
|
|
|
if(car->m_scanCode != CWorld::GetCurrentScanCode()) {
|
|
|
|
|
if (!car->bUsesCollision || !car->IsVehicle())
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
car->m_scanCode = CWorld::GetCurrentScanCode();
|
|
|
|
|
if (car->GetStatus() != STATUS_WRECKED && car->GetStatus() != STATUS_TRAIN_MOVING
|
|
|
|
|
&& (car->GetUp().z > 0.3f || (car->IsVehicle() && ((CVehicle*)car)->m_vehType == VEHICLE_TYPE_BIKE))) {
|
|
|
|
|
CVector carCentre = car->GetBoundCentre();
|
|
|
|
|
|
|
|
|
|
if (Abs(ped->GetPosition().z - carCentre.z) < 2.0f || car->IsCar() && carCentre.z < ped->GetPosition().z && ped->GetPosition().z - 4.f < carCentre.z) {
|
|
|
|
|
float dist = (ped->GetPosition() - carCentre).Magnitude2D();
|
|
|
|
|
if (dist <= 10.0f && !CCranes::IsThisCarBeingCarriedByAnyCrane(car)) {
|
|
|
|
|
EvaluateCarPosition(car, ped, dist, lastCloseness, closestCarOutput);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
CPlayerInfo::Process(void)
|
|
|
|
|
{
|
|
|
|
@ -796,3 +528,355 @@ CPlayerInfo::Process(void)
|
|
|
|
|
m_nMoney = Min(999999999, m_nMoney);
|
|
|
|
|
m_nVisibleMoney = Min(999999999, m_nVisibleMoney);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool
|
|
|
|
|
CPlayerInfo::IsPlayerInRemoteMode()
|
|
|
|
|
{
|
|
|
|
|
return m_pRemoteVehicle || m_bInRemoteMode;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
CPlayerInfo::SavePlayerInfo(uint8 *buf, uint32 *size)
|
|
|
|
|
{
|
|
|
|
|
// Interesting
|
|
|
|
|
*size = sizeof(CPlayerInfo);
|
|
|
|
|
|
|
|
|
|
#define CopyToBuf(buf, data) memcpy(buf, &data, sizeof(data)); buf += sizeof(data);
|
|
|
|
|
CopyToBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nMoney);
|
|
|
|
|
CopyToBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_WBState);
|
|
|
|
|
CopyToBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nWBTime);
|
|
|
|
|
CopyToBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nTrafficMultiplier);
|
|
|
|
|
CopyToBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_fRoadDensity);
|
|
|
|
|
CopyToBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nVisibleMoney);
|
|
|
|
|
CopyToBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nCollectedPackages);
|
|
|
|
|
CopyToBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nTotalPackages);
|
|
|
|
|
CopyToBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_bInfiniteSprint);
|
|
|
|
|
CopyToBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_bFastReload);
|
|
|
|
|
CopyToBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_bFireproof);
|
|
|
|
|
CopyToBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nMaxHealth);
|
|
|
|
|
CopyToBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nMaxArmour);
|
|
|
|
|
CopyToBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_bGetOutOfJailFree);
|
|
|
|
|
CopyToBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_bGetOutOfHospitalFree);
|
|
|
|
|
CopyToBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_bDriveByAllowed);
|
|
|
|
|
CopyToBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_aPlayerName);
|
|
|
|
|
CopyToBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nBustedAudioStatus);
|
|
|
|
|
CopyToBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nCurrentBustedAudio);
|
|
|
|
|
#undef CopyToBuf
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
CPlayerInfo::LoadPlayerInfo(uint8 *buf, uint32 size)
|
|
|
|
|
{
|
|
|
|
|
#define CopyFromBuf(buf, data) memcpy(&data, buf, sizeof(data)); buf += sizeof(data);
|
|
|
|
|
CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nMoney);
|
|
|
|
|
CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_WBState);
|
|
|
|
|
CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nWBTime);
|
|
|
|
|
CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nTrafficMultiplier);
|
|
|
|
|
CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_fRoadDensity);
|
|
|
|
|
CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nVisibleMoney);
|
|
|
|
|
CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nCollectedPackages);
|
|
|
|
|
CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nTotalPackages);
|
|
|
|
|
CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_bInfiniteSprint);
|
|
|
|
|
CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_bFastReload);
|
|
|
|
|
CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_bFireproof);
|
|
|
|
|
CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nMaxHealth);
|
|
|
|
|
CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nMaxArmour);
|
|
|
|
|
CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_bGetOutOfJailFree);
|
|
|
|
|
CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_bGetOutOfHospitalFree);
|
|
|
|
|
CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_bDriveByAllowed);
|
|
|
|
|
CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_aPlayerName);
|
|
|
|
|
CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nBustedAudioStatus);
|
|
|
|
|
CopyFromBuf(buf, CWorld::Players[CWorld::PlayerInFocus].m_nCurrentBustedAudio)
|
|
|
|
|
#undef CopyFromBuf
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
CPlayerInfo::FindClosestCarSectorList(CPtrList& carList, CPed* ped, float unk1, float unk2, float unk3, float unk4, float* lastCloseness, CVehicle** closestCarOutput)
|
|
|
|
|
{
|
|
|
|
|
for (CPtrNode* node = carList.first; node; node = node->next) {
|
|
|
|
|
CVehicle *car = (CVehicle*)node->item;
|
|
|
|
|
if(car->m_scanCode != CWorld::GetCurrentScanCode()) {
|
|
|
|
|
if (!car->bUsesCollision || !car->IsVehicle())
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
car->m_scanCode = CWorld::GetCurrentScanCode();
|
|
|
|
|
if (car->GetStatus() != STATUS_WRECKED && car->GetStatus() != STATUS_TRAIN_MOVING
|
|
|
|
|
&& (car->GetUp().z > 0.3f || (car->IsVehicle() && ((CVehicle*)car)->m_vehType == VEHICLE_TYPE_BIKE))) {
|
|
|
|
|
CVector carCentre = car->GetBoundCentre();
|
|
|
|
|
|
|
|
|
|
if (Abs(ped->GetPosition().z - carCentre.z) < 2.0f || car->IsCar() && carCentre.z < ped->GetPosition().z && ped->GetPosition().z - 4.f < carCentre.z) {
|
|
|
|
|
float dist = (ped->GetPosition() - carCentre).Magnitude2D();
|
|
|
|
|
if (dist <= 10.0f && !CCranes::IsThisCarBeingCarriedByAnyCrane(car)) {
|
|
|
|
|
EvaluateCarPosition(car, ped, dist, lastCloseness, closestCarOutput);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// lastCloseness is passed to other calls of this function
|
|
|
|
|
void
|
|
|
|
|
CPlayerInfo::EvaluateCarPosition(CEntity *carToTest, CPed *player, float carBoundCentrePedDist, float *lastCloseness, CVehicle **closestCarOutput)
|
|
|
|
|
{
|
|
|
|
|
// This dist used for determining the angle to face
|
|
|
|
|
CVector2D dist(carToTest->GetPosition() - player->GetPosition());
|
|
|
|
|
float neededTurn = CGeneral::GetATanOfXY(player->GetForward().x, player->GetForward().y) - CGeneral::GetATanOfXY(dist.x, dist.y);
|
|
|
|
|
while (neededTurn >= PI) {
|
|
|
|
|
neededTurn -= 2 * PI;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
while (neededTurn < -PI) {
|
|
|
|
|
neededTurn += 2 * PI;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// This dist used for evaluating cars' distances, weird...
|
|
|
|
|
// Accounts inverted needed turn (or needed turn in long way) and car dist.
|
|
|
|
|
float closeness = (1.0f - Abs(neededTurn) / TWOPI) * (10.0f - carBoundCentrePedDist);
|
|
|
|
|
if (closeness > *lastCloseness) {
|
|
|
|
|
*lastCloseness = closeness;
|
|
|
|
|
*closestCarOutput = (CVehicle*)carToTest;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const CVector &
|
|
|
|
|
CPlayerInfo::GetPos()
|
|
|
|
|
{
|
|
|
|
|
#ifdef FIX_BUGS
|
|
|
|
|
if (!m_pPed)
|
|
|
|
|
return TheCamera.GetPosition();
|
|
|
|
|
#endif
|
|
|
|
|
if (m_pPed->InVehicle())
|
|
|
|
|
return m_pPed->m_pMyVehicle->GetPosition();
|
|
|
|
|
return m_pPed->GetPosition();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
CVector
|
|
|
|
|
FindPlayerCoors(void)
|
|
|
|
|
{
|
|
|
|
|
#ifdef FIX_BUGS
|
|
|
|
|
if (CReplay::IsPlayingBack())
|
|
|
|
|
return TheCamera.GetPosition();
|
|
|
|
|
#endif
|
|
|
|
|
CPlayerPed *ped = FindPlayerPed();
|
|
|
|
|
if(ped->InVehicle())
|
|
|
|
|
return ped->m_pMyVehicle->GetPosition();
|
|
|
|
|
else
|
|
|
|
|
return ped->GetPosition();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const CVector &
|
|
|
|
|
FindPlayerSpeed(void)
|
|
|
|
|
{
|
|
|
|
|
#ifdef FIX_BUGS
|
|
|
|
|
static CVector vecTmpVector(0.0f, 0.0f, 0.0f);
|
|
|
|
|
if (CReplay::IsPlayingBack())
|
|
|
|
|
return vecTmpVector;
|
|
|
|
|
#endif
|
|
|
|
|
CPlayerPed *ped = FindPlayerPed();
|
|
|
|
|
if(ped->InVehicle())
|
|
|
|
|
return ped->m_pMyVehicle->m_vecMoveSpeed;
|
|
|
|
|
else
|
|
|
|
|
return ped->m_vecMoveSpeed;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
CVehicle *
|
|
|
|
|
FindPlayerVehicle(void)
|
|
|
|
|
{
|
|
|
|
|
CPlayerPed *ped = FindPlayerPed();
|
|
|
|
|
if(ped && ped->InVehicle()) return ped->m_pMyVehicle;
|
|
|
|
|
return nil;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
CEntity *
|
|
|
|
|
FindPlayerEntity(void)
|
|
|
|
|
{
|
|
|
|
|
CPlayerPed *ped = FindPlayerPed();
|
|
|
|
|
if(ped->InVehicle())
|
|
|
|
|
return ped->m_pMyVehicle;
|
|
|
|
|
else
|
|
|
|
|
return ped;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
CVehicle *
|
|
|
|
|
FindPlayerTrain(void)
|
|
|
|
|
{
|
|
|
|
|
if(FindPlayerVehicle() && FindPlayerVehicle()->IsTrain())
|
|
|
|
|
return FindPlayerVehicle();
|
|
|
|
|
else
|
|
|
|
|
return nil;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
CPlayerPed *
|
|
|
|
|
FindPlayerPed(void)
|
|
|
|
|
{
|
|
|
|
|
return CWorld::Players[CWorld::PlayerInFocus].m_pPed;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const CVector &
|
|
|
|
|
FindPlayerCentreOfWorld(int32 player)
|
|
|
|
|
{
|
|
|
|
|
#ifdef FIX_BUGS
|
|
|
|
|
if(CReplay::IsPlayingBack()) return TheCamera.GetPosition();
|
|
|
|
|
#endif
|
|
|
|
|
if(CCarCtrl::bCarsGeneratedAroundCamera) return TheCamera.GetPosition();
|
|
|
|
|
if(CWorld::Players[player].m_pRemoteVehicle) return CWorld::Players[player].m_pRemoteVehicle->GetPosition();
|
|
|
|
|
if(FindPlayerVehicle()) return FindPlayerVehicle()->GetPosition();
|
|
|
|
|
return CWorld::Players[player].m_pPed->GetPosition();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const CVector &
|
|
|
|
|
FindPlayerCentreOfWorld_NoSniperShift(void)
|
|
|
|
|
{
|
|
|
|
|
#ifdef FIX_BUGS
|
|
|
|
|
if (CReplay::IsPlayingBack()) return TheCamera.GetPosition();
|
|
|
|
|
#endif
|
|
|
|
|
if(CCarCtrl::bCarsGeneratedAroundCamera) return TheCamera.GetPosition();
|
|
|
|
|
if(CWorld::Players[CWorld::PlayerInFocus].m_pRemoteVehicle)
|
|
|
|
|
return CWorld::Players[CWorld::PlayerInFocus].m_pRemoteVehicle->GetPosition();
|
|
|
|
|
if(FindPlayerVehicle()) return FindPlayerVehicle()->GetPosition();
|
|
|
|
|
return FindPlayerPed()->GetPosition();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
float
|
|
|
|
|
FindPlayerHeading(void)
|
|
|
|
|
{
|
|
|
|
|
if(CWorld::Players[CWorld::PlayerInFocus].m_pRemoteVehicle)
|
|
|
|
|
return CWorld::Players[CWorld::PlayerInFocus].m_pRemoteVehicle->GetForward().Heading();
|
|
|
|
|
if(FindPlayerVehicle()) return FindPlayerVehicle()->GetForward().Heading();
|
|
|
|
|
return FindPlayerPed()->GetForward().Heading();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool
|
|
|
|
|
CPlayerInfo::IsRestartingAfterDeath()
|
|
|
|
|
{
|
|
|
|
|
return m_WBState == WBSTATE_WASTED;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool
|
|
|
|
|
CPlayerInfo::IsRestartingAfterArrest()
|
|
|
|
|
{
|
|
|
|
|
return m_WBState == WBSTATE_BUSTED;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
CPlayerInfo::KillPlayer()
|
|
|
|
|
{
|
|
|
|
|
if (m_WBState != WBSTATE_PLAYING) return;
|
|
|
|
|
|
|
|
|
|
m_WBState = WBSTATE_WASTED;
|
|
|
|
|
m_nWBTime = CTimer::GetTimeInMilliseconds();
|
|
|
|
|
CDarkel::ResetOnPlayerDeath();
|
|
|
|
|
CMessages::AddBigMessage(TheText.Get("DEAD"), 4000, 2);
|
|
|
|
|
CStats::TimesDied++;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
CPlayerInfo::ArrestPlayer()
|
|
|
|
|
{
|
|
|
|
|
if (m_WBState != WBSTATE_PLAYING) return;
|
|
|
|
|
|
|
|
|
|
m_WBState = WBSTATE_BUSTED;
|
|
|
|
|
m_nWBTime = CTimer::GetTimeInMilliseconds();
|
|
|
|
|
m_nBustedAudioStatus = BUSTEDAUDIO_NONE;
|
|
|
|
|
CDarkel::ResetOnPlayerDeath();
|
|
|
|
|
CMessages::AddBigMessage(TheText.Get("BUSTED"), 5000, 2);
|
|
|
|
|
CStats::TimesArrested++;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
CPlayerInfo::PlayerFailedCriticalMission()
|
|
|
|
|
{
|
|
|
|
|
if (m_WBState != WBSTATE_PLAYING)
|
|
|
|
|
return;
|
|
|
|
|
m_WBState = WBSTATE_FAILED_CRITICAL_MISSION;
|
|
|
|
|
m_nWBTime = CTimer::GetTimeInMilliseconds();
|
|
|
|
|
CDarkel::ResetOnPlayerDeath();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
CPlayerInfo::CancelPlayerEnteringCars(CVehicle *car)
|
|
|
|
|
{
|
|
|
|
|
if (!car || car == m_pPed->m_pMyVehicle) {
|
|
|
|
|
if (m_pPed->EnteringCar())
|
|
|
|
|
m_pPed->QuitEnteringCar();
|
|
|
|
|
}
|
|
|
|
|
if (m_pPed->m_objective == OBJECTIVE_ENTER_CAR_AS_PASSENGER || m_pPed->m_objective == OBJECTIVE_ENTER_CAR_AS_DRIVER)
|
|
|
|
|
m_pPed->ClearObjective();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
CPlayerInfo::MakePlayerSafe(bool toggle)
|
|
|
|
|
{
|
|
|
|
|
if (toggle) {
|
|
|
|
|
m_pPed->m_pWanted->m_bIgnoredByEveryone = true;
|
|
|
|
|
CWorld::StopAllLawEnforcersInTheirTracks();
|
|
|
|
|
CPad::GetPad(0)->SetDisablePlayerControls(PLAYERCONTROL_PLAYERINFO);
|
|
|
|
|
CPad::StopPadsShaking();
|
|
|
|
|
m_pPed->bBulletProof = true;
|
|
|
|
|
m_pPed->bFireProof = true;
|
|
|
|
|
m_pPed->bCollisionProof = true;
|
|
|
|
|
m_pPed->bMeleeProof = true;
|
|
|
|
|
m_pPed->bOnlyDamagedByPlayer = true;
|
|
|
|
|
m_pPed->bExplosionProof = true;
|
|
|
|
|
m_pPed->m_bCanBeDamaged = false;
|
|
|
|
|
((CPlayerPed*)m_pPed)->ClearAdrenaline();
|
|
|
|
|
CancelPlayerEnteringCars(nil);
|
|
|
|
|
gFireManager.ExtinguishPoint(GetPos(), 4000.0f);
|
|
|
|
|
CExplosion::RemoveAllExplosionsInArea(GetPos(), 4000.0f);
|
|
|
|
|
CProjectileInfo::RemoveAllProjectiles();
|
|
|
|
|
CWorld::SetAllCarsCanBeDamaged(false);
|
|
|
|
|
CWorld::ExtinguishAllCarFiresInArea(GetPos(), 4000.0f);
|
|
|
|
|
CReplay::DisableReplays();
|
|
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
m_pPed->m_pWanted->m_bIgnoredByEveryone = false;
|
|
|
|
|
CPad::GetPad(0)->SetEnablePlayerControls(PLAYERCONTROL_PLAYERINFO);
|
|
|
|
|
m_pPed->bBulletProof = false;
|
|
|
|
|
m_pPed->bFireProof = false;
|
|
|
|
|
m_pPed->bCollisionProof = false;
|
|
|
|
|
m_pPed->bMeleeProof = false;
|
|
|
|
|
m_pPed->bOnlyDamagedByPlayer = false;
|
|
|
|
|
m_pPed->bExplosionProof = false;
|
|
|
|
|
m_pPed->m_bCanBeDamaged = true;
|
|
|
|
|
CWorld::SetAllCarsCanBeDamaged(true);
|
|
|
|
|
CReplay::EnableReplays();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
CPlayerInfo::BlowUpRCBuggy(bool actually)
|
|
|
|
|
{
|
|
|
|
|
if (!m_pRemoteVehicle || m_pRemoteVehicle->bRemoveFromWorld)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
CRemote::TakeRemoteControlledCarFromPlayer(actually);
|
|
|
|
|
if (actually)
|
|
|
|
|
m_pRemoteVehicle->BlowUpCar(FindPlayerPed());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#ifdef GTA_PC
|
|
|
|
|
void
|
|
|
|
|
CPlayerInfo::SetPlayerSkin(const char *skin)
|
|
|
|
|
{
|
|
|
|
|
strncpy(m_aSkinName, skin, 32);
|
|
|
|
|
LoadPlayerSkin();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
CPlayerInfo::LoadPlayerSkin()
|
|
|
|
|
{
|
|
|
|
|
DeletePlayerSkin();
|
|
|
|
|
|
|
|
|
|
m_pSkinTexture = CPlayerSkin::GetSkinTexture(m_aSkinName);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
CPlayerInfo::DeletePlayerSkin()
|
|
|
|
|
{
|
|
|
|
|
if (m_pSkinTexture) {
|
|
|
|
|
RwTextureDestroy(m_pSkinTexture);
|
|
|
|
|
m_pSkinTexture = nil;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|