Little CPed fixes & Peddebug
This commit is contained in:
parent
82dc813ab3
commit
cf8b27c453
@ -213,7 +213,7 @@ CAnimViewer::Update(void)
|
|||||||
AssocGroupId animGroup = ASSOCGRP_STD;
|
AssocGroupId animGroup = ASSOCGRP_STD;
|
||||||
int nextModelId = modelId;
|
int nextModelId = modelId;
|
||||||
CBaseModelInfo *modelInfo = CModelInfo::GetModelInfo(modelId);
|
CBaseModelInfo *modelInfo = CModelInfo::GetModelInfo(modelId);
|
||||||
CEntity *entity = nil;
|
CEntity *newEntity = nil;
|
||||||
|
|
||||||
if (modelInfo->m_type == MITYPE_PED) {
|
if (modelInfo->m_type == MITYPE_PED) {
|
||||||
int animGroup = ((CPedModelInfo*)modelInfo)->m_animGroup;
|
int animGroup = ((CPedModelInfo*)modelInfo)->m_animGroup;
|
||||||
@ -256,34 +256,34 @@ CAnimViewer::Update(void)
|
|||||||
{
|
{
|
||||||
v33 = (CBoat*)CVehicle::operator new((CVehicle*)0x488, v6);
|
v33 = (CBoat*)CVehicle::operator new((CVehicle*)0x488, v6);
|
||||||
CBoat::CBoat(v33, modelId, 1u);
|
CBoat::CBoat(v33, modelId, 1u);
|
||||||
entity = (int)v33;
|
newEntity = (int)v33;
|
||||||
pTarget = (int)v33;
|
pTarget = (int)v33;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
*/ entity = pTarget = new CObject(modelId, true);
|
*/ newEntity = pTarget = new CObject(modelId, true);
|
||||||
if (!modelInfo->GetColModel()) {
|
if (!modelInfo->GetColModel()) {
|
||||||
modelInfo->SetColModel(&CTempColModels::ms_colModelWheel1);
|
modelInfo->SetColModel(&CTempColModels::ms_colModelWheel1);
|
||||||
}
|
}
|
||||||
// }
|
// }
|
||||||
} else {
|
} else {
|
||||||
entity = pTarget = new CAutomobile(modelId, RANDOM_VEHICLE);
|
newEntity = pTarget = new CAutomobile(modelId, RANDOM_VEHICLE);
|
||||||
entity->m_status = STATUS_ABANDONED;
|
newEntity->m_status = STATUS_ABANDONED;
|
||||||
}
|
}
|
||||||
entity->bIsStuck = true;
|
newEntity->bIsStuck = true;
|
||||||
} else if (modelInfo->m_type == MITYPE_PED) {
|
} else if (modelInfo->m_type == MITYPE_PED) {
|
||||||
pTarget = entity = new CPed(PEDTYPE_CIVMALE);
|
pTarget = newEntity = new CPed(PEDTYPE_CIVMALE);
|
||||||
entity->SetModelIndex(modelId);
|
newEntity->SetModelIndex(modelId);
|
||||||
} else {
|
} else {
|
||||||
entity = pTarget = new CObject(modelId, true);
|
newEntity = pTarget = new CObject(modelId, true);
|
||||||
if (!modelInfo->GetColModel())
|
if (!modelInfo->GetColModel())
|
||||||
{
|
{
|
||||||
modelInfo->SetColModel(&CTempColModels::ms_colModelWheel1);
|
modelInfo->SetColModel(&CTempColModels::ms_colModelWheel1);
|
||||||
}
|
}
|
||||||
entity->bIsStuck = true;
|
newEntity->bIsStuck = true;
|
||||||
}
|
}
|
||||||
entity->GetPosition() = CVector(0.0f, 0.0f, 0.0f);
|
newEntity->GetPosition() = CVector(0.0f, 0.0f, 0.0f);
|
||||||
CWorld::Add(entity);
|
CWorld::Add(newEntity);
|
||||||
TheCamera.TakeControl(pTarget, 9, 2, 1);
|
TheCamera.TakeControl(pTarget, 9, 2, 1);
|
||||||
}
|
}
|
||||||
if (pTarget->m_type == ENTITY_TYPE_VEHICLE || pTarget->m_type == ENTITY_TYPE_PED || pTarget->m_type == ENTITY_TYPE_OBJECT) {
|
if (pTarget->m_type == ENTITY_TYPE_VEHICLE || pTarget->m_type == ENTITY_TYPE_PED || pTarget->m_type == ENTITY_TYPE_OBJECT) {
|
||||||
|
@ -538,6 +538,12 @@ void CPad::AddToPCCheatString(char c)
|
|||||||
KangarooCheat();
|
KangarooCheat();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef MASTER
|
||||||
|
// "PEDDEBUG"
|
||||||
|
if (!_CHEATCMP("GUBEDDEP"))
|
||||||
|
CPed::SwitchDebugDisplay();
|
||||||
|
#endif
|
||||||
|
|
||||||
#undef _CHEATCMP
|
#undef _CHEATCMP
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -351,7 +351,7 @@ DebugMenuPopulate(void)
|
|||||||
DebugMenuAddVarBool8("Debug", "Don't render Objects", (int8*)&gbDontRenderObjects, nil);
|
DebugMenuAddVarBool8("Debug", "Don't render Objects", (int8*)&gbDontRenderObjects, nil);
|
||||||
|
|
||||||
DebugMenuAddCmd("Debug", "Make peds around you follow you", LetThemFollowYou);
|
DebugMenuAddCmd("Debug", "Make peds around you follow you", LetThemFollowYou);
|
||||||
#ifndef FINAL
|
#ifndef MASTER
|
||||||
DebugMenuAddVarBool8("Debug", "Toggle unused fight feature", (int8*)&CPed::bUnusedFightThingOnPlayer, nil);
|
DebugMenuAddVarBool8("Debug", "Toggle unused fight feature", (int8*)&CPed::bUnusedFightThingOnPlayer, nil);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
285
src/peds/Ped.cpp
285
src/peds/Ped.cpp
@ -34,6 +34,10 @@
|
|||||||
#include "Train.h"
|
#include "Train.h"
|
||||||
#include "TrafficLights.h"
|
#include "TrafficLights.h"
|
||||||
#include "PedRoutes.h"
|
#include "PedRoutes.h"
|
||||||
|
#include "Sprite.h"
|
||||||
|
#include "RwHelper.h"
|
||||||
|
#include "Font.h"
|
||||||
|
#include "Text.h"
|
||||||
|
|
||||||
WRAPPER void CPed::KillPedWithCar(CVehicle *veh, float impulse) { EAXJMP(0x4EC430); }
|
WRAPPER void CPed::KillPedWithCar(CVehicle *veh, float impulse) { EAXJMP(0x4EC430); }
|
||||||
WRAPPER void CPed::SpawnFlyingComponent(int, int8) { EAXJMP(0x4EB060); }
|
WRAPPER void CPed::SpawnFlyingComponent(int, int8) { EAXJMP(0x4EB060); }
|
||||||
@ -81,64 +85,11 @@ CVector &vecPedTrainDoorAnimOffset = *(CVector*)0x62E054;
|
|||||||
|
|
||||||
CVector2D &CPed::ms_vec2DFleePosition = *(CVector2D*)0x6EDF70;
|
CVector2D &CPed::ms_vec2DFleePosition = *(CVector2D*)0x6EDF70;
|
||||||
|
|
||||||
#ifndef FINAL
|
|
||||||
bool CPed::bUnusedFightThingOnPlayer = false;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void *CPed::operator new(size_t sz) { return CPools::GetPedPool()->New(); }
|
void *CPed::operator new(size_t sz) { return CPools::GetPedPool()->New(); }
|
||||||
void *CPed::operator new(size_t sz, int handle) { return CPools::GetPedPool()->New(handle); }
|
void *CPed::operator new(size_t sz, int handle) { return CPools::GetPedPool()->New(handle); }
|
||||||
void CPed::operator delete(void *p, size_t sz) { CPools::GetPedPool()->Delete((CPed*)p); }
|
void CPed::operator delete(void *p, size_t sz) { CPools::GetPedPool()->Delete((CPed*)p); }
|
||||||
void CPed::operator delete(void *p, int handle) { CPools::GetPedPool()->Delete((CPed*)p); }
|
void CPed::operator delete(void *p, int handle) { CPools::GetPedPool()->Delete((CPed*)p); }
|
||||||
|
|
||||||
CPed::~CPed(void)
|
|
||||||
{
|
|
||||||
CWorld::Remove(this);
|
|
||||||
CRadar::ClearBlipForEntity(BLIP_CHAR, CPools::GetPedPool()->GetIndex(this));
|
|
||||||
if (bInVehicle && m_pMyVehicle){
|
|
||||||
uint8 door_flag = GetCarDoorFlag(m_vehEnterType);
|
|
||||||
if (m_pMyVehicle->pDriver == this)
|
|
||||||
m_pMyVehicle->pDriver = nil;
|
|
||||||
else {
|
|
||||||
for (int i = 0; i < m_pMyVehicle->m_nNumMaxPassengers; i++) {
|
|
||||||
if (m_pMyVehicle->pPassengers[i] == this)
|
|
||||||
m_pMyVehicle->pPassengers[i] = nil;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (m_nPedState == PED_EXIT_CAR || m_nPedState == PED_DRAG_FROM_CAR)
|
|
||||||
m_pMyVehicle->m_nGettingOutFlags &= ~door_flag;
|
|
||||||
bInVehicle = false;
|
|
||||||
m_pMyVehicle = nil;
|
|
||||||
}else if (m_nPedState == PED_ENTER_CAR || m_nPedState == PED_CARJACK){
|
|
||||||
QuitEnteringCar();
|
|
||||||
}
|
|
||||||
if (m_pFire)
|
|
||||||
m_pFire->Extinguish();
|
|
||||||
CPopulation::UpdatePedCount(m_nPedType, true);
|
|
||||||
DMAudio.DestroyEntity(m_audioEntityId);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
CPed::FlagToDestroyWhenNextProcessed(void)
|
|
||||||
{
|
|
||||||
bRemoveFromWorld = true;
|
|
||||||
if (!bInVehicle || !m_pMyVehicle)
|
|
||||||
return;
|
|
||||||
if (m_pMyVehicle->pDriver == this){
|
|
||||||
m_pMyVehicle->pDriver = nil;
|
|
||||||
if (IsPlayer() && m_pMyVehicle->m_status != STATUS_WRECKED)
|
|
||||||
m_pMyVehicle->m_status = STATUS_ABANDONED;
|
|
||||||
}else{
|
|
||||||
m_pMyVehicle->RemovePassenger(this);
|
|
||||||
}
|
|
||||||
bInVehicle = false;
|
|
||||||
m_pMyVehicle = nil;
|
|
||||||
if (CharCreatedBy == MISSION_CHAR)
|
|
||||||
m_nPedState = PED_DEAD;
|
|
||||||
else
|
|
||||||
m_nPedState = PED_NONE;
|
|
||||||
m_pVehicleAnim = nil;
|
|
||||||
}
|
|
||||||
|
|
||||||
static char ObjectiveText[34][28] = {
|
static char ObjectiveText[34][28] = {
|
||||||
"No Obj",
|
"No Obj",
|
||||||
"Wait on Foot",
|
"Wait on Foot",
|
||||||
@ -294,6 +245,107 @@ static char WaitStateText[21][16] = {
|
|||||||
"Finish Flee",
|
"Finish Flee",
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef MASTER
|
||||||
|
int nDisplayDebugInfo = 0;
|
||||||
|
bool CPed::bUnusedFightThingOnPlayer = false;
|
||||||
|
|
||||||
|
void
|
||||||
|
CPed::SwitchDebugDisplay(void)
|
||||||
|
{
|
||||||
|
nDisplayDebugInfo = !nDisplayDebugInfo;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
CPed::DebugRenderOnePedText(void)
|
||||||
|
{
|
||||||
|
if ((GetPosition() - TheCamera.GetPosition()).MagnitudeSqr() < 900.0f) {
|
||||||
|
float width, height;
|
||||||
|
RwV3d screenCoords;
|
||||||
|
CVector bitAbove = GetPosition();
|
||||||
|
bitAbove.z += 2.0f;
|
||||||
|
if (CSprite::CalcScreenCoors(bitAbove, &screenCoords, &width, &height, true)) {
|
||||||
|
|
||||||
|
float lineHeight = SCREEN_SCALE_Y(min(height/100.0f, 0.7f) * 22.0f);
|
||||||
|
|
||||||
|
DefinedState();
|
||||||
|
CFont::SetPropOn();
|
||||||
|
CFont::SetBackgroundOn();
|
||||||
|
|
||||||
|
// Originally both of them were being divided by 60.0f.
|
||||||
|
float xScale = min(width / 190.0f, 0.7f);
|
||||||
|
float yScale = min(height / 80.0f, 0.7f);
|
||||||
|
|
||||||
|
CFont::SetScale(SCREEN_SCALE_X(xScale), SCREEN_SCALE_Y(yScale));
|
||||||
|
CFont::SetCentreOn();
|
||||||
|
CFont::SetCentreSize(SCREEN_WIDTH);
|
||||||
|
CFont::SetJustifyOff();
|
||||||
|
CFont::SetColor(CRGBA(255, 255, 0, 255));
|
||||||
|
CFont::SetBackGroundOnlyTextOn();
|
||||||
|
CFont::SetFontStyle(0);
|
||||||
|
AsciiToUnicode(StateText[m_nPedState], gUString);
|
||||||
|
CFont::PrintString(screenCoords.x, screenCoords.y, gUString);
|
||||||
|
AsciiToUnicode(ObjectiveText[m_objective], gUString);
|
||||||
|
CFont::PrintString(screenCoords.x, screenCoords.y + lineHeight, gUString);
|
||||||
|
AsciiToUnicode(PersonalityTypeText[m_pedStats->m_type], gUString);
|
||||||
|
CFont::PrintString(screenCoords.x, screenCoords.y + 2 * lineHeight, gUString);
|
||||||
|
AsciiToUnicode(WaitStateText[m_nWaitState], gUString);
|
||||||
|
CFont::PrintString(screenCoords.x, screenCoords.y + 3 * lineHeight, gUString);
|
||||||
|
DefinedState();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
CPed::~CPed(void)
|
||||||
|
{
|
||||||
|
CWorld::Remove(this);
|
||||||
|
CRadar::ClearBlipForEntity(BLIP_CHAR, CPools::GetPedPool()->GetIndex(this));
|
||||||
|
if (bInVehicle && m_pMyVehicle){
|
||||||
|
uint8 door_flag = GetCarDoorFlag(m_vehEnterType);
|
||||||
|
if (m_pMyVehicle->pDriver == this)
|
||||||
|
m_pMyVehicle->pDriver = nil;
|
||||||
|
else {
|
||||||
|
for (int i = 0; i < m_pMyVehicle->m_nNumMaxPassengers; i++) {
|
||||||
|
if (m_pMyVehicle->pPassengers[i] == this)
|
||||||
|
m_pMyVehicle->pPassengers[i] = nil;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (m_nPedState == PED_EXIT_CAR || m_nPedState == PED_DRAG_FROM_CAR)
|
||||||
|
m_pMyVehicle->m_nGettingOutFlags &= ~door_flag;
|
||||||
|
bInVehicle = false;
|
||||||
|
m_pMyVehicle = nil;
|
||||||
|
}else if (m_nPedState == PED_ENTER_CAR || m_nPedState == PED_CARJACK){
|
||||||
|
QuitEnteringCar();
|
||||||
|
}
|
||||||
|
if (m_pFire)
|
||||||
|
m_pFire->Extinguish();
|
||||||
|
CPopulation::UpdatePedCount(m_nPedType, true);
|
||||||
|
DMAudio.DestroyEntity(m_audioEntityId);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
CPed::FlagToDestroyWhenNextProcessed(void)
|
||||||
|
{
|
||||||
|
bRemoveFromWorld = true;
|
||||||
|
if (!bInVehicle || !m_pMyVehicle)
|
||||||
|
return;
|
||||||
|
if (m_pMyVehicle->pDriver == this){
|
||||||
|
m_pMyVehicle->pDriver = nil;
|
||||||
|
if (IsPlayer() && m_pMyVehicle->m_status != STATUS_WRECKED)
|
||||||
|
m_pMyVehicle->m_status = STATUS_ABANDONED;
|
||||||
|
}else{
|
||||||
|
m_pMyVehicle->RemovePassenger(this);
|
||||||
|
}
|
||||||
|
bInVehicle = false;
|
||||||
|
m_pMyVehicle = nil;
|
||||||
|
if (CharCreatedBy == MISSION_CHAR)
|
||||||
|
m_nPedState = PED_DEAD;
|
||||||
|
else
|
||||||
|
m_nPedState = PED_NONE;
|
||||||
|
m_pVehicleAnim = nil;
|
||||||
|
}
|
||||||
|
|
||||||
CPed::CPed(uint32 pedType) : m_pedIK(this)
|
CPed::CPed(uint32 pedType) : m_pedIK(this)
|
||||||
{
|
{
|
||||||
m_type = ENTITY_TYPE_PED;
|
m_type = ENTITY_TYPE_PED;
|
||||||
@ -2095,6 +2147,12 @@ CPed::SetupLighting(void)
|
|||||||
ActivateDirectional();
|
ActivateDirectional();
|
||||||
SetAmbientColoursForPedsCarsAndObjects();
|
SetAmbientColoursForPedsCarsAndObjects();
|
||||||
|
|
||||||
|
#ifndef MASTER
|
||||||
|
// Originally this was being called through iteration of Sectors, but putting it here is better.
|
||||||
|
if (nDisplayDebugInfo && !IsPlayer())
|
||||||
|
DebugRenderOnePedText();
|
||||||
|
#endif
|
||||||
|
|
||||||
if (bRenderScorched) {
|
if (bRenderScorched) {
|
||||||
WorldReplaceNormalLightsWithScorched(Scene.world, 0.1f);
|
WorldReplaceNormalLightsWithScorched(Scene.world, 0.1f);
|
||||||
} else {
|
} else {
|
||||||
@ -4472,7 +4530,7 @@ CPed::StartFightAttack(uint8 buttonPressure)
|
|||||||
animAssoc->SetFinishCallback(FinishFightMoveCB, this);
|
animAssoc->SetFinishCallback(FinishFightMoveCB, this);
|
||||||
m_fightUnk2 = 0;
|
m_fightUnk2 = 0;
|
||||||
m_takeAStepAfterAttack = false;
|
m_takeAStepAfterAttack = false;
|
||||||
#ifndef FINAL
|
#ifndef MASTER
|
||||||
m_takeAStepAfterAttack = IsPlayer() && bUnusedFightThingOnPlayer;
|
m_takeAStepAfterAttack = IsPlayer() && bUnusedFightThingOnPlayer;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -4567,7 +4625,7 @@ CPed::LoadFightData(void)
|
|||||||
|
|
||||||
// Actually GetLocalDirectionTo(Turn/Look)
|
// Actually GetLocalDirectionTo(Turn/Look)
|
||||||
int
|
int
|
||||||
CPed::GetLocalDirection(CVector2D &posOffset)
|
CPed::GetLocalDirection(CVector2D const &posOffset)
|
||||||
{
|
{
|
||||||
float direction;
|
float direction;
|
||||||
|
|
||||||
@ -4804,7 +4862,7 @@ CPed::SetFlee(CEntity* fleeFrom, int time)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
CPed::SetFlee(CVector2D &from, int time)
|
CPed::SetFlee(CVector2D const &from, int time)
|
||||||
{
|
{
|
||||||
if (CTimer::GetTimeInMilliseconds() < m_nPedStateTimer || !IsPedInControl() || bKindaStayInSamePlace)
|
if (CTimer::GetTimeInMilliseconds() < m_nPedStateTimer || !IsPedInControl() || bKindaStayInSamePlace)
|
||||||
return;
|
return;
|
||||||
@ -5186,7 +5244,8 @@ CPed::CollideWithPed(CPed *collideWith)
|
|||||||
animAssoc = CAnimManager::BlendAnimation(GetClump(), ASSOCGRP_STD, ANIM_FIGHT_PPUNCH, 8.0f);
|
animAssoc = CAnimManager::BlendAnimation(GetClump(), ASSOCGRP_STD, ANIM_FIGHT_PPUNCH, 8.0f);
|
||||||
animAssoc->flags |= ASSOC_FADEOUTWHENDONE;
|
animAssoc->flags |= ASSOC_FADEOUTWHENDONE;
|
||||||
if (!heIsMissionChar) {
|
if (!heIsMissionChar) {
|
||||||
int direction = collideWith->GetLocalDirection(CVector2D(posDiff.x, posDiff.y));
|
CVector2D posDiff2D(posDiff);
|
||||||
|
int direction = collideWith->GetLocalDirection(posDiff2D);
|
||||||
collideWith->StartFightDefend(direction, 4, 5);
|
collideWith->StartFightDefend(direction, 4, 5);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -7273,61 +7332,63 @@ CPed::GetNearestPassengerDoor(CVehicle *veh, CVector &posToOpen)
|
|||||||
|
|
||||||
CVehicleModelInfo *vehModel = (CVehicleModelInfo*)CModelInfo::GetModelInfo(veh->m_modelIndex);
|
CVehicleModelInfo *vehModel = (CVehicleModelInfo*)CModelInfo::GetModelInfo(veh->m_modelIndex);
|
||||||
|
|
||||||
if (veh->m_modelIndex > MI_RHINO || veh->m_modelIndex != MI_BUS) {
|
switch (veh->m_modelIndex) {
|
||||||
|
case MI_BUS:
|
||||||
CVector2D rfPosDist(999.0f, 999.0f);
|
m_vehEnterType = CAR_DOOR_RF;
|
||||||
CVector2D lrPosDist(999.0f, 999.0f);
|
posToOpen = GetPositionToOpenCarDoor(veh, CAR_DOOR_RF);
|
||||||
CVector2D rrPosDist(999.0f, 999.0f);
|
return true;
|
||||||
|
case MI_RHINO:
|
||||||
if (!veh->pPassengers[0]
|
default:
|
||||||
&& !(veh->m_nGettingInFlags & CAR_DOOR_FLAG_RF)
|
break;
|
||||||
&& veh->IsRoomForPedToLeaveCar(CAR_DOOR_RF, nil)) {
|
|
||||||
|
|
||||||
rfPos = GetPositionToOpenCarDoor(veh, CAR_DOOR_RF);
|
|
||||||
canEnter = true;
|
|
||||||
rfPosDist = rfPos - GetPosition();
|
|
||||||
}
|
|
||||||
if (vehModel->m_numDoors == 4) {
|
|
||||||
if (!veh->pPassengers[1]
|
|
||||||
&& !(veh->m_nGettingInFlags & CAR_DOOR_FLAG_LR)
|
|
||||||
&& veh->IsRoomForPedToLeaveCar(CAR_DOOR_LR, nil)) {
|
|
||||||
lrPos = GetPositionToOpenCarDoor(veh, CAR_DOOR_LR);
|
|
||||||
canEnter = true;
|
|
||||||
lrPosDist = lrPos - GetPosition();
|
|
||||||
}
|
|
||||||
if (!veh->pPassengers[2]
|
|
||||||
&& !(veh->m_nGettingInFlags & CAR_DOOR_FLAG_RR)
|
|
||||||
&& veh->IsRoomForPedToLeaveCar(CAR_DOOR_RR, nil)) {
|
|
||||||
rrPos = GetPositionToOpenCarDoor(veh, CAR_DOOR_RR);
|
|
||||||
canEnter = true;
|
|
||||||
rrPosDist = rrPos - GetPosition();
|
|
||||||
}
|
|
||||||
|
|
||||||
// When the door we should enter is blocked by some object.
|
|
||||||
if (!canEnter)
|
|
||||||
veh->ShufflePassengersToMakeSpace();
|
|
||||||
}
|
|
||||||
|
|
||||||
CVector2D nextToCompare = rfPosDist;
|
|
||||||
posToOpen = rfPos;
|
|
||||||
m_vehEnterType = CAR_DOOR_RF;
|
|
||||||
if (lrPosDist.MagnitudeSqr() < nextToCompare.MagnitudeSqr()) {
|
|
||||||
m_vehEnterType = CAR_DOOR_LR;
|
|
||||||
posToOpen = lrPos;
|
|
||||||
nextToCompare = lrPosDist;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (rrPosDist.MagnitudeSqr() < nextToCompare.MagnitudeSqr()) {
|
|
||||||
m_vehEnterType = CAR_DOOR_RR;
|
|
||||||
posToOpen = rrPos;
|
|
||||||
}
|
|
||||||
return canEnter;
|
|
||||||
|
|
||||||
} else {
|
|
||||||
m_vehEnterType = CAR_DOOR_RF;
|
|
||||||
posToOpen = GetPositionToOpenCarDoor(veh, CAR_DOOR_RF);
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CVector2D rfPosDist(999.0f, 999.0f);
|
||||||
|
CVector2D lrPosDist(999.0f, 999.0f);
|
||||||
|
CVector2D rrPosDist(999.0f, 999.0f);
|
||||||
|
|
||||||
|
if (!veh->pPassengers[0]
|
||||||
|
&& !(veh->m_nGettingInFlags & CAR_DOOR_FLAG_RF)
|
||||||
|
&& veh->IsRoomForPedToLeaveCar(CAR_DOOR_RF, nil)) {
|
||||||
|
|
||||||
|
rfPos = GetPositionToOpenCarDoor(veh, CAR_DOOR_RF);
|
||||||
|
canEnter = true;
|
||||||
|
rfPosDist = rfPos - GetPosition();
|
||||||
|
}
|
||||||
|
if (vehModel->m_numDoors == 4) {
|
||||||
|
if (!veh->pPassengers[1]
|
||||||
|
&& !(veh->m_nGettingInFlags & CAR_DOOR_FLAG_LR)
|
||||||
|
&& veh->IsRoomForPedToLeaveCar(CAR_DOOR_LR, nil)) {
|
||||||
|
lrPos = GetPositionToOpenCarDoor(veh, CAR_DOOR_LR);
|
||||||
|
canEnter = true;
|
||||||
|
lrPosDist = lrPos - GetPosition();
|
||||||
|
}
|
||||||
|
if (!veh->pPassengers[2]
|
||||||
|
&& !(veh->m_nGettingInFlags & CAR_DOOR_FLAG_RR)
|
||||||
|
&& veh->IsRoomForPedToLeaveCar(CAR_DOOR_RR, nil)) {
|
||||||
|
rrPos = GetPositionToOpenCarDoor(veh, CAR_DOOR_RR);
|
||||||
|
canEnter = true;
|
||||||
|
rrPosDist = rrPos - GetPosition();
|
||||||
|
}
|
||||||
|
|
||||||
|
// When the door we should enter is blocked by some object.
|
||||||
|
if (!canEnter)
|
||||||
|
veh->ShufflePassengersToMakeSpace();
|
||||||
|
}
|
||||||
|
|
||||||
|
CVector2D nextToCompare = rfPosDist;
|
||||||
|
posToOpen = rfPos;
|
||||||
|
m_vehEnterType = CAR_DOOR_RF;
|
||||||
|
if (lrPosDist.MagnitudeSqr() < nextToCompare.MagnitudeSqr()) {
|
||||||
|
m_vehEnterType = CAR_DOOR_LR;
|
||||||
|
posToOpen = lrPos;
|
||||||
|
nextToCompare = lrPosDist;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (rrPosDist.MagnitudeSqr() < nextToCompare.MagnitudeSqr()) {
|
||||||
|
m_vehEnterType = CAR_DOOR_RR;
|
||||||
|
posToOpen = rrPos;
|
||||||
|
}
|
||||||
|
return canEnter;
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
@ -7795,7 +7856,7 @@ STARTPATCHES
|
|||||||
InjectHook(0x4E5A10, &CPed::Say, PATCH_JUMP);
|
InjectHook(0x4E5A10, &CPed::Say, PATCH_JUMP);
|
||||||
InjectHook(0x4D58D0, &CPed::SetWaitState, PATCH_JUMP);
|
InjectHook(0x4D58D0, &CPed::SetWaitState, PATCH_JUMP);
|
||||||
InjectHook(0x4D1D70, (void (CPed::*)(CEntity*, int)) &CPed::SetFlee, PATCH_JUMP);
|
InjectHook(0x4D1D70, (void (CPed::*)(CEntity*, int)) &CPed::SetFlee, PATCH_JUMP);
|
||||||
InjectHook(0x4D1C40, (void (CPed::*)(CVector2D&, int)) &CPed::SetFlee, PATCH_JUMP);
|
InjectHook(0x4D1C40, (void (CPed::*)(CVector2D const &, int)) &CPed::SetFlee, PATCH_JUMP);
|
||||||
InjectHook(0x4EB9A0, &CPed::CollideWithPed, PATCH_JUMP);
|
InjectHook(0x4EB9A0, &CPed::CollideWithPed, PATCH_JUMP);
|
||||||
InjectHook(0x433490, &CPed::CreateDeadPedMoney, PATCH_JUMP);
|
InjectHook(0x433490, &CPed::CreateDeadPedMoney, PATCH_JUMP);
|
||||||
InjectHook(0x433660, &CPed::CreateDeadPedWeaponPickups, PATCH_JUMP);
|
InjectHook(0x433660, &CPed::CreateDeadPedWeaponPickups, PATCH_JUMP);
|
||||||
|
@ -574,12 +574,12 @@ public:
|
|||||||
void StartFightAttack(uint8);
|
void StartFightAttack(uint8);
|
||||||
void SetWaitState(eWaitState, void*);
|
void SetWaitState(eWaitState, void*);
|
||||||
bool FightStrike(CVector&);
|
bool FightStrike(CVector&);
|
||||||
int GetLocalDirection(CVector2D&);
|
int GetLocalDirection(CVector2D const &);
|
||||||
void StartFightDefend(uint8, uint8, uint8);
|
void StartFightDefend(uint8, uint8, uint8);
|
||||||
void PlayHitSound(CPed*);
|
void PlayHitSound(CPed*);
|
||||||
void SetFall(int, AnimationId, uint8);
|
void SetFall(int, AnimationId, uint8);
|
||||||
void SetFlee(CEntity*, int);
|
void SetFlee(CEntity*, int);
|
||||||
void SetFlee(CVector2D&, int);
|
void SetFlee(CVector2D const &, int);
|
||||||
void RemoveInCarAnims(void);
|
void RemoveInCarAnims(void);
|
||||||
void CollideWithPed(CPed*);
|
void CollideWithPed(CPed*);
|
||||||
void SetDirectionToWalkAroundObject(CEntity*);
|
void SetDirectionToWalkAroundObject(CEntity*);
|
||||||
@ -698,7 +698,9 @@ public:
|
|||||||
static CVector2D &ms_vec2DFleePosition;
|
static CVector2D &ms_vec2DFleePosition;
|
||||||
static CPedAudioData (&CommentWaitTime)[38];
|
static CPedAudioData (&CommentWaitTime)[38];
|
||||||
|
|
||||||
#ifndef FINAL
|
#ifndef MASTER
|
||||||
|
static void SwitchDebugDisplay(void);
|
||||||
|
void DebugRenderOnePedText(void);
|
||||||
static bool bUnusedFightThingOnPlayer;
|
static bool bUnusedFightThingOnPlayer;
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user