Peds & fixes

This commit is contained in:
eray orçunus 2020-07-04 15:31:28 +03:00
parent 49a8dd7459
commit 716740f918
10 changed files with 220 additions and 235 deletions

View File

@ -113,7 +113,7 @@ enum eSound : uint16
SOUND_PED_BURNING, SOUND_PED_BURNING,
SOUND_PED_PLAYER_REACTTOCOP, SOUND_PED_PLAYER_REACTTOCOP,
SOUND_PED_ARREST_COP, SOUND_PED_ARREST_COP,
SOUND_111, SOUND_PED_MIAMIVICE_EXITING_CAR,
SOUND_PED_COP_HELIPILOTPHRASE, SOUND_PED_COP_HELIPILOTPHRASE,
SOUND_PED_PULLOUTWEAPON, SOUND_PED_PULLOUTWEAPON,
SOUND_PED_HELI_PLAYER_FOUND, SOUND_PED_HELI_PLAYER_FOUND,

View File

@ -93,7 +93,7 @@ CCutsceneObject::SetupLighting(void)
}else{ }else{
CVector coors = GetPosition(); CVector coors = GetPosition();
float lighting = CPointLights::GenerateLightsAffectingObject(&coors); float lighting = CPointLights::GenerateLightsAffectingObject(&coors);
if(!bHasBlip && lighting != 1.0f){ if(lighting != 1.0f){
SetAmbientAndDirectionalColours(lighting); SetAmbientAndDirectionalColours(lighting);
return true; return true;
} }

View File

@ -170,9 +170,13 @@ CCivilianPed::CivilianAI(void)
} }
} }
// --MIAMI: Done except comments
void void
CCivilianPed::ProcessControl(void) CCivilianPed::ProcessControl(void)
{ {
if (CharCreatedBy == TODO_CHAR)
return;
CPed::ProcessControl(); CPed::ProcessControl();
if (bWasPostponed) if (bWasPostponed)
@ -198,7 +202,8 @@ CCivilianPed::ProcessControl(void)
// fall through // fall through
case PED_SEEK_POS: case PED_SEEK_POS:
if (Seek()) { if (Seek()) {
if ((m_objective == OBJECTIVE_GOTO_AREA_ON_FOOT || m_objective == OBJECTIVE_RUN_TO_AREA || IsUseAttractorObjective(m_objective)) && m_pNextPathNode) { if ((m_objective == OBJECTIVE_GOTO_AREA_ON_FOOT || m_objective == OBJECTIVE_RUN_TO_AREA || m_objective == OBJECTIVE_SPRINT_TO_AREA ||
IsUseAttractorObjective(m_objective)) && m_pNextPathNode) {
m_pNextPathNode = nil; m_pNextPathNode = nil;
} else if (bRunningToPhone) { } else if (bRunningToPhone) {
@ -207,10 +212,10 @@ CCivilianPed::ProcessControl(void)
m_phoneId = -1; m_phoneId = -1;
} else { } else {
gPhoneInfo.m_aPhones[m_phoneId].m_nState = PHONE_STATE_REPORTING_CRIME; gPhoneInfo.m_aPhones[m_phoneId].m_nState = PHONE_STATE_REPORTING_CRIME;
m_nPedState = PED_FACE_PHONE; SetPedState(PED_FACE_PHONE);
} }
} else if (m_objective != OBJECTIVE_KILL_CHAR_ANY_MEANS && m_objective != OBJECTIVE_KILL_CHAR_ON_FOOT) { } else if (m_objective != OBJECTIVE_KILL_CHAR_ANY_MEANS && m_objective != OBJECTIVE_KILL_CHAR_ON_FOOT) {
if (m_objective == OBJECTIVE_FOLLOW_CHAR_IN_FORMATION) { if (m_pedInObjective && m_objective == OBJECTIVE_FOLLOW_CHAR_IN_FORMATION) {
if (m_moved.Magnitude() == 0.0f) { if (m_moved.Magnitude() == 0.0f) {
if (m_pedInObjective->m_nMoveState == PEDMOVE_STILL) if (m_pedInObjective->m_nMoveState == PEDMOVE_STILL)
m_fRotationDest = m_pedInObjective->m_fRotationCur; m_fRotationDest = m_pedInObjective->m_fRotationCur;
@ -218,7 +223,8 @@ CCivilianPed::ProcessControl(void)
} else if (m_objective == OBJECTIVE_GOTO_CHAR_ON_FOOT } else if (m_objective == OBJECTIVE_GOTO_CHAR_ON_FOOT
&& m_pedInObjective && m_pedInObjective->m_nMoveState != PEDMOVE_STILL) { && m_pedInObjective && m_pedInObjective->m_nMoveState != PEDMOVE_STILL) {
SetMoveState(m_pedInObjective->m_nMoveState); SetMoveState(m_pedInObjective->m_nMoveState);
} else if (m_objective == OBJECTIVE_GOTO_AREA_ON_FOOT || m_objective == OBJECTIVE_RUN_TO_AREA || IsUseAttractorObjective(m_objective)) { } else if (m_objective == OBJECTIVE_GOTO_AREA_ON_FOOT || m_objective == OBJECTIVE_RUN_TO_AREA || m_objective == OBJECTIVE_SPRINT_TO_AREA ||
IsUseAttractorObjective(m_objective)) {
SetIdle(); SetIdle();
} else { } else {
RestorePreviousState(); RestorePreviousState();
@ -228,7 +234,7 @@ CCivilianPed::ProcessControl(void)
break; break;
case PED_FACE_PHONE: case PED_FACE_PHONE:
if (FacePhone()) if (FacePhone())
m_nPedState = PED_MAKE_CALL; SetPedState(PED_MAKE_CALL);
break; break;
case PED_MAKE_CALL: case PED_MAKE_CALL:
if (MakePhonecall()) if (MakePhonecall())
@ -284,6 +290,8 @@ CCivilianPed::ProcessControl(void)
GetPosition().x - m_pMyVehicle->GetPosition().x, GetPosition().y - m_pMyVehicle->GetPosition().y, 0.0f); GetPosition().x - m_pMyVehicle->GetPosition().x, GetPosition().y - m_pMyVehicle->GetPosition().y, 0.0f);
DMAudio.PlayOneShot(m_pMyVehicle->m_audioEntityId, SOUND_CAR_JERK, 0.0f); DMAudio.PlayOneShot(m_pMyVehicle->m_audioEntityId, SOUND_CAR_JERK, 0.0f);
m_pMyVehicle->pDriver->Say(SOUND_PED_PLAYER_BEFORESEX);
Say(SOUND_PED_PLAYER_BEFORESEX);
int playerSexFrequency = CWorld::Players[CWorld::PlayerInFocus].m_nSexFrequency; int playerSexFrequency = CWorld::Players[CWorld::PlayerInFocus].m_nSexFrequency;
if (CWorld::Players[CWorld::PlayerInFocus].m_nMoney >= 10 && playerSexFrequency > 250) { if (CWorld::Players[CWorld::PlayerInFocus].m_nMoney >= 10 && playerSexFrequency > 250) {
@ -300,13 +308,17 @@ CCivilianPed::ProcessControl(void)
} else { } else {
bWanderPathAfterExitingCar = true; bWanderPathAfterExitingCar = true;
CWorld::Players[CWorld::PlayerInFocus].m_pHooker = nil; CWorld::Players[CWorld::PlayerInFocus].m_pHooker = nil;
ClearLeader();
SetObjective(OBJECTIVE_LEAVE_CAR, m_pMyVehicle); SetObjective(OBJECTIVE_LEAVE_CAR, m_pMyVehicle);
m_pMyVehicle->pDriver->Say(SOUND_PED_PLAYER_AFTERSEX);
} }
} else { } else {
bWanderPathAfterExitingCar = true; bWanderPathAfterExitingCar = true;
CWorld::Players[CWorld::PlayerInFocus].m_pHooker = nil; CWorld::Players[CWorld::PlayerInFocus].m_pHooker = nil;
m_pMyVehicle->pDriver->m_fHealth = CWorld::Players[0].m_nMaxHealth + 25.0f; m_pMyVehicle->pDriver->m_fHealth = CWorld::Players[0].m_nMaxHealth + 25.0f;
ClearLeader();
SetObjective(OBJECTIVE_LEAVE_CAR, m_pMyVehicle); SetObjective(OBJECTIVE_LEAVE_CAR, m_pMyVehicle);
m_pMyVehicle->pDriver->Say(SOUND_PED_PLAYER_AFTERSEX);
} }
} else { } else {
CWorld::Players[CWorld::PlayerInFocus].m_nNextSexFrequencyUpdateTime = CTimer::GetTimeInMilliseconds() + 3000; CWorld::Players[CWorld::PlayerInFocus].m_nNextSexFrequencyUpdateTime = CTimer::GetTimeInMilliseconds() + 3000;
@ -319,6 +331,7 @@ CCivilianPed::ProcessControl(void)
} else { } else {
bWanderPathAfterExitingCar = true; bWanderPathAfterExitingCar = true;
CWorld::Players[CWorld::PlayerInFocus].m_pHooker = nil; CWorld::Players[CWorld::PlayerInFocus].m_pHooker = nil;
ClearLeader();
SetObjective(OBJECTIVE_LEAVE_CAR, m_pMyVehicle); SetObjective(OBJECTIVE_LEAVE_CAR, m_pMyVehicle);
} }
} }
@ -340,6 +353,7 @@ CCivilianPed::ProcessControl(void)
CivilianAI(); CivilianAI();
if (CharCreatedBy == RANDOM_CHAR) { if (CharCreatedBy == RANDOM_CHAR) {
// TODO(Miami): EnterVacantNearbyCars();
UseNearbyAttractors(); UseNearbyAttractors();
} }

View File

@ -86,6 +86,7 @@ CCopPed::CCopPed(eCopType copType, int32 modifier) : CPed(PEDTYPE_COP)
m_fAbseilPos = 0.0f; m_fAbseilPos = 0.0f;
m_bBeatingSuspect = false; m_bBeatingSuspect = false;
m_pPointGunAt = nil; m_pPointGunAt = nil;
field_624 = 0;
} }
CCopPed::~CCopPed() CCopPed::~CCopPed()

View File

@ -25,6 +25,7 @@ public:
bool m_bZoneDisabled; bool m_bZoneDisabled;
float m_fAbseilPos; float m_fAbseilPos;
eCopType m_nCopType; eCopType m_nCopType;
int32 field_624;
int8 field_628; int8 field_628;
CCopPed(eCopType, int32 modifier = 0); CCopPed(eCopType, int32 modifier = 0);

View File

@ -401,8 +401,6 @@ CPed::CPed(uint32 pedType) : m_pedIK(this)
m_ped_flagI80 = false; m_ped_flagI80 = false;
#endif #endif
m_gangFlags = 0xFF;
bReachedAttractorHeadingTarget = false; bReachedAttractorHeadingTarget = false;
bTurnedAroundOnAttractor = false; bTurnedAroundOnAttractor = false;
bCarPassenger = false; bCarPassenger = false;
@ -412,22 +410,26 @@ CPed::CPed(uint32 pedType) : m_pedIK(this)
bIsDrowning = false; bIsDrowning = false;
bDrownsInWater = true; bDrownsInWater = true;
#ifdef VC_PED_PORTS
bHeadStuckInCollision = false; bHeadStuckInCollision = false;
#endif b156_8 = false;
bIsPlayerFriend = true; bIsPlayerFriend = true;
bDeadPedInFrontOfCar = false; bDeadPedInFrontOfCar = false;
m_gangFlags = 0xFF;
bStayInCarOnJack = false; bStayInCarOnJack = false;
bDontFight = false; bDontFight = false;
bDoomAim = true; bDoomAim = true;
bCanBeShotInVehicle = true; bCanBeShotInVehicle = true;
bPushedAlongByCar = false;
b157_40 = false; b157_40 = false;
bIgnoreThreatsBehindObjects = false; bIgnoreThreatsBehindObjects = false;
bNeverEverTargetThisPed = false; bNeverEverTargetThisPed = false;
b158_10 = false; b158_10 = false;
bBoughtIceCream = false; bBoughtIceCream = false;
b158_40 = false;
if ((CGeneral::GetRandomNumber() & 3) == 0) if ((CGeneral::GetRandomNumber() & 3) == 0)
bHasACamera = true; bHasACamera = true;
@ -477,6 +479,8 @@ CPed::CPed(uint32 pedType) : m_pedIK(this)
#ifdef PED_SKIN #ifdef PED_SKIN
m_pWeaponModel = nil; m_pWeaponModel = nil;
#endif #endif
m_delayedSoundID = -1;
m_delayedSoundTimer = 0;
CPopulation::UpdatePedCount((ePedType)m_nPedType, false); CPopulation::UpdatePedCount((ePedType)m_nPedType, false);
} }
@ -2674,6 +2678,7 @@ CPed::SetModelIndex(uint32 mi)
#endif #endif
} }
// --MIAMI: Done
void void
CPed::RemoveLighting(bool reset) CPed::RemoveLighting(bool reset)
{ {
@ -2686,6 +2691,7 @@ CPed::RemoveLighting(bool reset)
DeActivateDirectional(); DeActivateDirectional();
} }
// --MIAMI: Done
bool bool
CPed::SetupLighting(void) CPed::SetupLighting(void)
{ {
@ -2703,7 +2709,7 @@ CPed::SetupLighting(void)
} else { } else {
// Note that this lightMult is only affected by LIGHT_DARKEN. If there's no LIGHT_DARKEN, it will be 1.0. // Note that this lightMult is only affected by LIGHT_DARKEN. If there's no LIGHT_DARKEN, it will be 1.0.
float lightMult = CPointLights::GenerateLightsAffectingObject(&GetPosition()); float lightMult = CPointLights::GenerateLightsAffectingObject(&GetPosition());
if (!bHasBlip && lightMult != 1.0f) { if (lightMult != 1.0f) {
SetAmbientAndDirectionalColours(lightMult); SetAmbientAndDirectionalColours(lightMult);
return true; return true;
} }
@ -2711,6 +2717,7 @@ CPed::SetupLighting(void)
return false; return false;
} }
// --MIAMI: Done
void void
CPed::Teleport(CVector pos) CPed::Teleport(CVector pos)
{ {
@ -2724,6 +2731,7 @@ CPed::Teleport(CVector pos)
CWorld::Add(this); CWorld::Add(this);
} }
// --MIAMI: Done
void void
CPed::CalculateNewOrientation(void) CPed::CalculateNewOrientation(void)
{ {
@ -3067,47 +3075,52 @@ CPed::RestorePreviousObjective(void)
bObjectiveCompleted = false; bObjectiveCompleted = false;
} }
// --MIAMI: Done
void void
CPed::SetLeader(CEntity *leader) CPed::SetLeader(CEntity *leader)
{ {
m_leader = (CPed*)leader; m_leader = (CPed*)leader;
if(m_leader) if (m_leader) {
m_leader->RegisterReference((CEntity **)&m_leader); m_leader->bIsLeader = true;
m_leader->RegisterReference((CEntity**)&m_leader);
}
} }
// TODO(Miami) // --MIAMI: Done except comments
void void
CPed::SetObjective(eObjective newObj, void *entity) CPed::SetObjective(eObjective newObj, void *entity)
{ {
if (DyingOrDead()) if (DyingOrDead())
return; return;
if (m_prevObjective == newObj) { if (m_prevObjective == newObj && m_prevObjective != OBJECTIVE_NONE)
// Why? return;
if (m_prevObjective != OBJECTIVE_NONE)
return;
}
if (entity == this) if (entity == this)
return; return;
if (m_attachedTo && newObj != OBJECTIVE_KILL_CHAR_ON_FOOT && newObj != OBJECTIVE_KILL_CHAR_ANY_MEANS && newObj != OBJECTIVE_DESTROY_OBJECT && newObj != OBJECTIVE_DESTROY_CAR)
return;
if (m_objective == newObj) { if (m_objective == newObj) {
switch (newObj) { switch (newObj) {
case OBJECTIVE_KILL_CHAR_ON_FOOT: case OBJECTIVE_KILL_CHAR_ON_FOOT:
case OBJECTIVE_KILL_CHAR_ANY_MEANS: case OBJECTIVE_KILL_CHAR_ANY_MEANS:
case OBJECTIVE_GOTO_CHAR_ON_FOOT: case OBJECTIVE_GOTO_CHAR_ON_FOOT:
case OBJECTIVE_GOTO_CHAR_ON_FOOT_WALKING:
case OBJECTIVE_HASSLE_CHAR:
case OBJECTIVE_FOLLOW_CHAR_IN_FORMATION: case OBJECTIVE_FOLLOW_CHAR_IN_FORMATION:
case OBJECTIVE_GOTO_AREA_ANY_MEANS: case OBJECTIVE_GOTO_AREA_ANY_MEANS:
case OBJECTIVE_GUARD_ATTACK: case OBJECTIVE_GUARD_ATTACK:
case OBJECTIVE_KILL_CHAR_ON_BOAT:
case OBJECTIVE_SOLICIT_FOOT:
if (m_pedInObjective == entity) if (m_pedInObjective == entity)
return; return;
break; break;
case OBJECTIVE_LEAVE_CAR: case OBJECTIVE_LEAVE_CAR:
case OBJECTIVE_FLEE_CAR: case OBJECTIVE_FLEE_CAR:
#ifdef VC_PED_PORTS
case OBJECTIVE_LEAVE_CAR_AND_DIE: case OBJECTIVE_LEAVE_CAR_AND_DIE:
#endif
return; return;
case OBJECTIVE_ENTER_CAR_AS_PASSENGER: case OBJECTIVE_ENTER_CAR_AS_PASSENGER:
case OBJECTIVE_ENTER_CAR_AS_DRIVER: case OBJECTIVE_ENTER_CAR_AS_DRIVER:
@ -3116,6 +3129,10 @@ CPed::SetObjective(eObjective newObj, void *entity)
case OBJECTIVE_BUY_ICE_CREAM: case OBJECTIVE_BUY_ICE_CREAM:
if (m_carInObjective == entity) if (m_carInObjective == entity)
return; return;
if (newObj == OBJECTIVE_BUY_ICE_CREAM && bBoughtIceCream)
return;
break; break;
case OBJECTIVE_SET_LEADER: case OBJECTIVE_SET_LEADER:
if (m_leader == entity) if (m_leader == entity)
@ -3129,17 +3146,14 @@ CPed::SetObjective(eObjective newObj, void *entity)
break; break;
} }
} else { } else {
if ((newObj == OBJECTIVE_LEAVE_CAR if ((newObj == OBJECTIVE_LEAVE_CAR || newObj == OBJECTIVE_LEAVE_CAR_AND_DIE || newObj == OBJECTIVE_WAIT_IN_CAR_THEN_GET_OUT)
#ifdef VC_PED_PORTS && !bInVehicle)
|| newObj == OBJECTIVE_LEAVE_CAR_AND_DIE
#endif
) && !bInVehicle)
return; return;
} }
bObjectiveCompleted = false;
ClearPointGunAt(); ClearPointGunAt();
m_objectiveTimer = 0; m_objectiveTimer = 0;
bObjectiveCompleted = false;
if (!IsTemporaryObjective(m_objective) || IsTemporaryObjective(newObj)) { if (!IsTemporaryObjective(m_objective) || IsTemporaryObjective(newObj)) {
if (m_objective != newObj) { if (m_objective != newObj) {
if (IsTemporaryObjective(newObj)) if (IsTemporaryObjective(newObj))
@ -3153,6 +3167,13 @@ CPed::SetObjective(eObjective newObj, void *entity)
} }
switch (newObj) { switch (newObj) {
case OBJECTIVE_WAIT_ON_FOOT_FOR_COP:
m_pedInObjective = (CPed*)entity;
m_pedInObjective->RegisterReference((CEntity**)&m_pedInObjective);
SetIdle();
// TODO(Miami)
// SetLook(m_pedInObjective);
break;
case OBJECTIVE_WAIT_IN_CAR_THEN_GET_OUT: case OBJECTIVE_WAIT_IN_CAR_THEN_GET_OUT:
// In this special case, entity parameter isn't CEntity, but int. // In this special case, entity parameter isn't CEntity, but int.
@ -3161,10 +3182,15 @@ CPed::SetObjective(eObjective newObj, void *entity)
case OBJECTIVE_KILL_CHAR_ON_FOOT: case OBJECTIVE_KILL_CHAR_ON_FOOT:
case OBJECTIVE_KILL_CHAR_ANY_MEANS: case OBJECTIVE_KILL_CHAR_ANY_MEANS:
case OBJECTIVE_MUG_CHAR: case OBJECTIVE_MUG_CHAR:
case OBJECTIVE_KILL_CHAR_ON_BOAT:
m_pNextPathNode = nil; m_pNextPathNode = nil;
bUsePedNodeSeek = false; bUsePedNodeSeek = false;
m_vecSeekPos = CVector(0.0f, 0.0f, 0.0f);
// TODO(Miami): Clean up old references
// m_pLookTarget = (CEntity*)entity; // duplicate
m_pedInObjective = (CPed*)entity; m_pedInObjective = (CPed*)entity;
m_vecSeekPos = CVector(0.0f, 0.0f, 0.0f);
m_pedInObjective->RegisterReference((CEntity**)&m_pedInObjective); m_pedInObjective->RegisterReference((CEntity**)&m_pedInObjective);
m_pLookTarget = (CEntity*)entity; m_pLookTarget = (CEntity*)entity;
m_pLookTarget->RegisterReference((CEntity**)&m_pLookTarget); m_pLookTarget->RegisterReference((CEntity**)&m_pLookTarget);
@ -3175,6 +3201,8 @@ CPed::SetObjective(eObjective newObj, void *entity)
case OBJECTIVE_GOTO_CHAR_ON_FOOT_WALKING: case OBJECTIVE_GOTO_CHAR_ON_FOOT_WALKING:
case OBJECTIVE_HASSLE_CHAR: case OBJECTIVE_HASSLE_CHAR:
case OBJECTIVE_GUARD_ATTACK: case OBJECTIVE_GUARD_ATTACK:
// TODO(Miami): Clean up old references
m_vecSeekPos = CVector(0.0f, 0.0f, 0.0f); m_vecSeekPos = CVector(0.0f, 0.0f, 0.0f);
m_pedInObjective = (CPed*)entity; m_pedInObjective = (CPed*)entity;
m_pedInObjective->RegisterReference((CEntity**)&m_pedInObjective); m_pedInObjective->RegisterReference((CEntity**)&m_pedInObjective);
@ -3185,13 +3213,11 @@ CPed::SetObjective(eObjective newObj, void *entity)
m_pedFormation = FORMATION_REAR; m_pedFormation = FORMATION_REAR;
break; break;
case OBJECTIVE_LEAVE_CAR: case OBJECTIVE_LEAVE_CAR:
#ifdef VC_PED_PORTS
case OBJECTIVE_LEAVE_CAR_AND_DIE: case OBJECTIVE_LEAVE_CAR_AND_DIE:
#endif
case OBJECTIVE_FLEE_CAR: case OBJECTIVE_FLEE_CAR:
m_carInObjective = (CVehicle*)entity; m_carInObjective = (CVehicle*)entity;
m_carInObjective->RegisterReference((CEntity **)&m_carInObjective); m_carInObjective->RegisterReference((CEntity **)&m_carInObjective);
if (!m_carInObjective->bIsBus || m_leaveCarTimer) if (!m_carInObjective->bIsBus || m_leaveCarTimer != 0)
break; break;
for (int i = 0; i < m_carInObjective->m_nNumMaxPassengers; i++) { for (int i = 0; i < m_carInObjective->m_nNumMaxPassengers; i++) {
@ -3202,12 +3228,19 @@ CPed::SetObjective(eObjective newObj, void *entity)
} }
break; break;
case OBJECTIVE_DESTROY_OBJECT:
// TODO(Miami): Clean up old references
m_pPointGunAt = (CPed*)entity;
if (entity)
((CEntity*)entity)->RegisterReference((CEntity**) &m_pPointGunAt);
break;
case OBJECTIVE_ENTER_CAR_AS_PASSENGER: case OBJECTIVE_ENTER_CAR_AS_PASSENGER:
case OBJECTIVE_ENTER_CAR_AS_DRIVER: case OBJECTIVE_ENTER_CAR_AS_DRIVER:
if (m_nMoveState == PEDMOVE_STILL) if (m_nMoveState == PEDMOVE_STILL)
SetMoveState(PEDMOVE_RUN); SetMoveState(PEDMOVE_RUN);
if (((CVehicle*)entity)->m_vehType == VEHICLE_TYPE_BOAT && !IsPlayer()) { if (((CVehicle*)entity)->m_vehType == VEHICLE_TYPE_BOAT && !IsPlayer() && m_pCurrentPhysSurface != entity) {
RestorePreviousObjective(); RestorePreviousObjective();
break; break;
} }
@ -3237,6 +3270,10 @@ CPed::SetObjective(eObjective newObj, void *entity)
m_pedInObjective = (CPed*)entity; m_pedInObjective = (CPed*)entity;
m_pedInObjective->RegisterReference((CEntity**)&m_pedInObjective); m_pedInObjective->RegisterReference((CEntity**)&m_pedInObjective);
break; break;
case OBJECTIVE_SOLICIT_FOOT:
m_pedInObjective = (CPed*)entity;
m_pedInObjective->RegisterReference((CEntity**)&m_pedInObjective);
break;
default: default:
break; break;
} }
@ -3371,6 +3408,7 @@ CPed::IsGangMember(void)
return m_nPedType >= PEDTYPE_GANG1 && m_nPedType <= PEDTYPE_GANG9; return m_nPedType >= PEDTYPE_GANG1 && m_nPedType <= PEDTYPE_GANG9;
} }
// --MIAMI: Done
void void
CPed::InformMyGangOfAttack(CEntity *attacker) CPed::InformMyGangOfAttack(CEntity *attacker)
{ {
@ -3616,6 +3654,7 @@ CPed::Chat(void)
} }
} }
// --MIAMI: Done
void void
CPed::CheckAroundForPossibleCollisions(void) CPed::CheckAroundForPossibleCollisions(void)
{ {
@ -4861,7 +4900,7 @@ CPed::RestorePreviousState(void)
case PED_WANDER_PATH: case PED_WANDER_PATH:
SetPedState(PED_WANDER_PATH); SetPedState(PED_WANDER_PATH);
bIsRunning = false; bIsRunning = false;
if (!bFindNewNodeAfterStateRestore) { if (bFindNewNodeAfterStateRestore) {
if (m_pNextPathNode) { if (m_pNextPathNode) {
CVector nextNode = CPathFind::TakeWidthIntoAccountForWandering(m_pNextPathNode, m_randomSeed); CVector nextNode = CPathFind::TakeWidthIntoAccountForWandering(m_pNextPathNode, m_randomSeed);
CVector diff = nextNode - GetPosition(); CVector diff = nextNode - GetPosition();
@ -8291,7 +8330,7 @@ CPed::Seek(void)
m_objective != OBJECTIVE_ENTER_CAR_AS_PASSENGER && m_objective != OBJECTIVE_SOLICIT_VEHICLE && !bDuckAndCover) { m_objective != OBJECTIVE_ENTER_CAR_AS_PASSENGER && m_objective != OBJECTIVE_SOLICIT_VEHICLE && !bDuckAndCover) {
if ((!m_pedInObjective || !m_pedInObjective->bInVehicle) if ((!m_pedInObjective || !m_pedInObjective->bInVehicle)
&& !((CTimer::GetFrameCounter() + (m_randomSeed % 256) + 17) & 7)) { && (CTimer::GetFrameCounter() + m_randomSeed + 60) % 32 == 0) {
CEntity *obstacle = CWorld::TestSphereAgainstWorld(m_vecSeekPos, 0.4f, nil, CEntity *obstacle = CWorld::TestSphereAgainstWorld(m_vecSeekPos, 0.4f, nil,
false, true, false, false, false, false); false, true, false, false, false, false);
@ -8390,8 +8429,8 @@ CPed::Seek(void)
CVector2D moveDist(GetPosition().x - m_actionX, GetPosition().y - m_actionY); CVector2D moveDist(GetPosition().x - m_actionX, GetPosition().y - m_actionY);
if (moveDist.Magnitude() < 0.5f) { if (moveDist.Magnitude() < 0.5f) {
m_nPedStateTimer = 0; m_nPedStateTimer = 0;
m_actionX = 0; m_actionX = 0.f;
m_actionY = 0; m_actionY = 0.f;
} }
} }
@ -8433,8 +8472,8 @@ CPed::Seek(void)
if ((m_objective != OBJECTIVE_FOLLOW_CHAR_IN_FORMATION || m_pedInObjective->m_nMoveState == PEDMOVE_STILL) && m_nMoveState != PEDMOVE_STILL) { if ((m_objective != OBJECTIVE_FOLLOW_CHAR_IN_FORMATION || m_pedInObjective->m_nMoveState == PEDMOVE_STILL) && m_nMoveState != PEDMOVE_STILL) {
m_nPedStateTimer = 0; m_nPedStateTimer = 0;
m_actionX = 0; m_actionX = 0.f;
m_actionY = 0; m_actionY = 0.f;
} }
if (m_objective == OBJECTIVE_GOTO_AREA_ON_FOOT || m_objective == OBJECTIVE_RUN_TO_AREA || m_objective == OBJECTIVE_SPRINT_TO_AREA || if (m_objective == OBJECTIVE_GOTO_AREA_ON_FOOT || m_objective == OBJECTIVE_RUN_TO_AREA || m_objective == OBJECTIVE_SPRINT_TO_AREA ||
@ -8451,6 +8490,7 @@ CPed::Seek(void)
return true; return true;
} }
// --MIAMI: Done
CVector* CVector*
CPed::SeekFollowingPath(void) CPed::SeekFollowingPath(void)
{ {
@ -9441,7 +9481,6 @@ CPed::IsPedDoingDriveByShooting(void)
return false; return false;
} }
// --MIAMI: Done // --MIAMI: Done
bool bool
CPed::IsPedShootable(void) CPed::IsPedShootable(void)
@ -10370,12 +10409,16 @@ CPed::PedAnimAlignCB(CAnimBlendAssociation *animAssoc, void *arg)
} }
} }
// --MIAMI: Done?
void void
CPed::ProcessControl(void) CPed::ProcessControl(void)
{ {
CColPoint foundCol; CColPoint foundCol;
CEntity *foundEnt = nil; CEntity *foundEnt = nil;
if (CTimer::GetFrameCounter() + m_randomSeed % 32 == 0)
PruneReferences();
int alpha = CVisibilityPlugins::GetClumpAlpha(GetClump()); int alpha = CVisibilityPlugins::GetClumpAlpha(GetClump());
if (!bFadeOut) { if (!bFadeOut) {
if (alpha < 255) { if (alpha < 255) {
@ -10391,6 +10434,7 @@ CPed::ProcessControl(void)
CVisibilityPlugins::SetClumpAlpha(GetClump(), alpha); CVisibilityPlugins::SetClumpAlpha(GetClump(), alpha);
bIsShooting = false; bIsShooting = false;
b158_40 = false;
BuildPedLists(); BuildPedLists();
bIsInWater = false; bIsInWater = false;
bIsDrowning = false; bIsDrowning = false;
@ -10426,6 +10470,7 @@ CPed::ProcessControl(void)
if (!nearPed->bIsLooking && nearPed->m_nPedState != PED_ATTACK) { if (!nearPed->bIsLooking && nearPed->m_nPedState != PED_ATTACK) {
int16 camMode = TheCamera.Cams[TheCamera.ActiveCam].Mode; int16 camMode = TheCamera.Cams[TheCamera.ActiveCam].Mode;
if (camMode != CCam::MODE_SNIPER if (camMode != CCam::MODE_SNIPER
&& camMode != CCam::MODE_CAMERA
&& camMode != CCam::MODE_ROCKETLAUNCHER && camMode != CCam::MODE_ROCKETLAUNCHER
&& camMode != CCam::MODE_M16_1STPERSON && camMode != CCam::MODE_M16_1STPERSON
&& camMode != CCam::MODE_1STPERSON && camMode != CCam::MODE_1STPERSON
@ -10461,13 +10506,11 @@ CPed::ProcessControl(void)
if (ServiceTalkingWhenDead()) if (ServiceTalkingWhenDead())
ServiceTalking(); ServiceTalking();
#ifdef VC_PED_PORTS
if (bIsInWater) { if (bIsInWater) {
bIsStanding = false; bIsStanding = false;
bWasStanding = false; bWasStanding = false;
CPhysical::ProcessControl(); CPhysical::ProcessControl();
} }
#endif
return; return;
} }
@ -10490,14 +10533,13 @@ CPed::ProcessControl(void)
if (m_fHealth <= 1.0f && m_nPedState <= PED_STATES_NO_AI && !bIsInTheAir && !bIsLanding) if (m_fHealth <= 1.0f && m_nPedState <= PED_STATES_NO_AI && !bIsInTheAir && !bIsLanding)
SetDie(); SetDie();
if (bIsStanding)
bPushedAlongByCar = false;
bCollidedWithMyVehicle = false; bCollidedWithMyVehicle = false;
CEntity *collidingEnt = m_pDamageEntity; CEntity *collidingEnt = m_pDamageEntity;
#ifndef VC_PED_PORTS if (!bUsesCollision || ((!collidingEnt || m_fDamageImpulse <= 0.0f) && (!IsPlayer() || !bIsStuck)) || m_nPedState == PED_DIE) {
if (!bUsesCollision || m_fDamageImpulse <= 0.0f || m_nPedState == PED_DIE || !collidingEnt) {
#else
if (!bUsesCollision || ((!collidingEnt || m_fDamageImpulse <= 0.0f) && (!IsPlayer() || !bIsStuck)) || m_nPedState == PED_DIE) {
#endif
bHitSomethingLastFrame = false; bHitSomethingLastFrame = false;
if (m_nPedStateTimer <= 500 && bIsInTheAir) { if (m_nPedStateTimer <= 500 && bIsInTheAir) {
if (m_nPedStateTimer) if (m_nPedStateTimer)
@ -10516,11 +10558,7 @@ CPed::ProcessControl(void)
} }
*/ */
#ifndef VC_PED_PORTS
} else {
#else
} else if (collidingEnt) { } else if (collidingEnt) {
#endif
switch (collidingEnt->GetType()) switch (collidingEnt->GetType())
{ {
case ENTITY_TYPE_BUILDING: case ENTITY_TYPE_BUILDING:
@ -10570,6 +10608,9 @@ CPed::ProcessControl(void)
if (CanPedJumpThis(collidingEnt)) { if (CanPedJumpThis(collidingEnt)) {
SetJump(); SetJump();
} else if (m_objective == OBJECTIVE_KILL_CHAR_ON_FOOT) { } else if (m_objective == OBJECTIVE_KILL_CHAR_ON_FOOT) {
if (m_nPedType == PEDTYPE_COP && m_nWaitState != WAITSTATE_LOOK_ABOUT)
((CCopPed*)this)->field_624++;
SetWaitState(WAITSTATE_LOOK_ABOUT, nil); SetWaitState(WAITSTATE_LOOK_ABOUT, nil);
} else { } else {
SetWaitState(WAITSTATE_PLAYANIM_TAXI, nil); SetWaitState(WAITSTATE_PLAYANIM_TAXI, nil);
@ -10579,6 +10620,8 @@ CPed::ProcessControl(void)
Say(SOUND_PED_TAXI_CALL); Say(SOUND_PED_TAXI_CALL);
} }
} else { } else {
// TODO(Miami): CleanUpOldReference
m_pLookTarget = m_pedInObjective; m_pLookTarget = m_pedInObjective;
m_pLookTarget->RegisterReference((CEntity **) &m_pLookTarget); m_pLookTarget->RegisterReference((CEntity **) &m_pLookTarget);
TurnBody(); TurnBody();
@ -10608,10 +10651,10 @@ CPed::ProcessControl(void)
m_collidingEntityWhileFleeing = collidingEnt; m_collidingEntityWhileFleeing = collidingEnt;
m_collidingEntityWhileFleeing->RegisterReference((CEntity **) &m_collidingEntityWhileFleeing); m_collidingEntityWhileFleeing->RegisterReference((CEntity **) &m_collidingEntityWhileFleeing);
uint8 currentDir = floorf((PI + m_fRotationCur) / DEGTORAD(45.0f)); if (m_nWaitState != WAITSTATE_HITWALL)
uint8 nextDir; SetWaitState(WAITSTATE_TURN180, nil);
ThePaths.FindNextNodeWandering(PATH_PED, GetPosition(), &m_pLastPathNode, &m_pNextPathNode, currentDir, &nextDir); m_nPedStateTimer = CTimer::GetTimeInMilliseconds() + 5000;
Flee();
} else { } else {
if (neededTurn < DEGTORAD(60.0f)) { if (neededTurn < DEGTORAD(60.0f)) {
CVector posToHead = m_vecDamageNormal * 4.0f; CVector posToHead = m_vecDamageNormal * 4.0f;
@ -10625,9 +10668,17 @@ CPed::ProcessControl(void)
if (m_nPedState != PED_SEEK_POS && m_nPedState != PED_SEEK_CAR) { if (m_nPedState != PED_SEEK_POS && m_nPedState != PED_SEEK_CAR) {
if (m_nPedState == PED_WANDER_PATH) { if (m_nPedState == PED_WANDER_PATH) {
m_pNextPathNode = &ThePaths.m_pathNodes[closestNodeId]; m_pNextPathNode = &ThePaths.m_pathNodes[closestNodeId];
CVector bestCoords = CPathFind::TakeWidthIntoAccountForWandering(m_pNextPathNode, m_randomSeed);
angleToFace = CGeneral::GetRadianAngleBetweenPoints( angleToFace = CGeneral::GetRadianAngleBetweenPoints(
m_pNextPathNode->GetX(), m_pNextPathNode->GetY(), bestCoords.x, bestCoords.y,
GetPosition().x, GetPosition().y); GetPosition().x, GetPosition().y);
} else if (m_nPedState == PED_FOLLOW_PATH) {
CVector bestCoords = m_pathNodesToGo[m_nCurPathNodeId]->GetPosition();
angleToFace = CGeneral::GetRadianAngleBetweenPoints(
bestCoords.x, bestCoords.y,
GetPosition().x, GetPosition().y);
} else { } else {
if (ThePaths.m_pathNodes[closestNodeId].GetX() == 0.0f if (ThePaths.m_pathNodes[closestNodeId].GetX() == 0.0f
|| ThePaths.m_pathNodes[closestNodeId].GetY() == 0.0f) { || ThePaths.m_pathNodes[closestNodeId].GetY() == 0.0f) {
@ -10637,6 +10688,7 @@ CPed::ProcessControl(void)
} else { } else {
posToHead.x = ThePaths.m_pathNodes[closestNodeId].GetX(); posToHead.x = ThePaths.m_pathNodes[closestNodeId].GetX();
posToHead.y = ThePaths.m_pathNodes[closestNodeId].GetY(); posToHead.y = ThePaths.m_pathNodes[closestNodeId].GetY();
posToHead.z = ThePaths.m_pathNodes[closestNodeId].GetZ();
} }
angleToFace = CGeneral::GetRadianAngleBetweenPoints( angleToFace = CGeneral::GetRadianAngleBetweenPoints(
posToHead.x, posToHead.y, posToHead.x, posToHead.y,
@ -10733,7 +10785,7 @@ CPed::ProcessControl(void)
if (collidingVeh == m_pMyVehicle) if (collidingVeh == m_pMyVehicle)
bCollidedWithMyVehicle = true; bCollidedWithMyVehicle = true;
#ifdef VC_PED_PORTS
float oldHealth = m_fHealth; float oldHealth = m_fHealth;
bool playerSufferSound = false; bool playerSufferSound = false;
@ -10743,7 +10795,8 @@ CPed::ProcessControl(void)
|| m_objective == OBJECTIVE_GOTO_AREA_ON_FOOT || m_objective == OBJECTIVE_GOTO_AREA_ON_FOOT
|| m_objective == OBJECTIVE_RUN_TO_AREA || m_objective == OBJECTIVE_RUN_TO_AREA
|| m_objective == OBJECTIVE_SPRINT_TO_AREA || m_objective == OBJECTIVE_SPRINT_TO_AREA
|| m_objective == OBJECTIVE_ENTER_CAR_AS_DRIVER)) { || m_objective == OBJECTIVE_ENTER_CAR_AS_DRIVER
|| IsUseAttractorObjective(m_objective))) {
if (collidingVeh != m_pCurrentPhysSurface || IsPlayer()) { if (collidingVeh != m_pCurrentPhysSurface || IsPlayer()) {
if (!bVehEnterDoorIsBlocked) { if (!bVehEnterDoorIsBlocked) {
@ -10788,10 +10841,11 @@ CPed::ProcessControl(void)
SetLookTimer(1300); SetLookTimer(1300);
eWeaponType weaponType = GetWeapon()->m_eWeaponType; eWeaponType weaponType = GetWeapon()->m_eWeaponType;
uint32 weaponSlot = CWeaponInfo::GetWeaponInfo(weaponType)->m_nWeaponSlot;
if (weaponType == WEAPONTYPE_UNARMED if (weaponType == WEAPONTYPE_UNARMED
|| weaponType == WEAPONTYPE_BASEBALLBAT || weaponSlot == 3
|| weaponType == WEAPONTYPE_COLT45 || weaponSlot == 5
|| weaponType == WEAPONTYPE_UZI) { || weaponSlot == 1) {
bShakeFist = true; bShakeFist = true;
} }
} else { } else {
@ -10897,142 +10951,12 @@ CPed::ProcessControl(void)
KillPedWithCar(collidingVeh, m_fDamageImpulse); KillPedWithCar(collidingVeh, m_fDamageImpulse);
} }
/* VC specific
if (m_pCollidingEntity != collidingEnt) if (m_pCollidingEntity != collidingEnt)
bPushedAlongByCar = true; bPushedAlongByCar = true;
*/
} }
if (m_fHealth < oldHealth && playerSufferSound) if (m_fHealth < oldHealth && playerSufferSound)
Say(SOUND_PED_HIT); Say(SOUND_PED_HIT);
#else
if (collidingVehSpeedSqr <= 1.0f / 400.0f) {
if (!IsPedInControl()
|| IsPlayer()
&& m_objective != OBJECTIVE_GOTO_AREA_ON_FOOT
&& m_objective != OBJECTIVE_ENTER_CAR_AS_DRIVER
&& m_objective != OBJECTIVE_RUN_TO_AREA) {
if (IsPlayer() && !bIsInTheAir) {
if (IsPedInControl()
&& ((CPlayerPed*)this)->m_fMoveSpeed == 0.0f
&& !bIsLooking
&& CTimer::GetTimeInMilliseconds() > m_lookTimer
&& collidingVeh->pDriver) {
((CPlayerPed*)this)->AnnoyPlayerPed(false);
SetLookFlag(collidingVeh, true);
SetLookTimer(1300);
eWeaponType weaponType = GetWeapon()->m_eWeaponType;
if (weaponType == WEAPONTYPE_UNARMED
|| weaponType == WEAPONTYPE_BASEBALLBAT
|| weaponType == WEAPONTYPE_COLT45
|| weaponType == WEAPONTYPE_UZI) {
bShakeFist = true;
}
} else {
SetLookFlag(collidingVeh, true);
SetLookTimer(500);
}
}
} else if (!bVehEnterDoorIsBlocked) {
if (collidingVeh->GetStatus() != STATUS_PLAYER || CharCreatedBy == MISSION_CHAR) {
SetDirectionToWalkAroundObject(collidingVeh);
} else if (CTimer::GetTimeInMilliseconds() >= CWorld::Players[CWorld::PlayerInFocus].m_nLastBumpPlayerCarTimer
|| m_nPedStateTimer >= CTimer::GetTimeInMilliseconds()) {
CPed::SetDirectionToWalkAroundObject(collidingVeh);
CWorld::Players[CWorld::PlayerInFocus].m_nLastBumpPlayerCarTimer = m_nPedStateTimer;
} else if (m_fleeFrom != collidingVeh) {
SetFlee(collidingVeh, 4000);
bUsePedNodeSeek = false;
SetMoveState(PEDMOVE_WALK);
}
}
} else {
DMAudio.PlayOneShot(collidingVeh->m_audioEntityId, SOUND_CAR_PED_COLLISION, m_fDamageImpulse);
if (IsPlayer()) {
CColModel *collidingCol = CModelInfo::GetModelInfo(collidingVeh->GetModelIndex())->GetColModel();
CVector colMinVec = collidingCol->boundingBox.min;
CVector colMaxVec = collidingCol->boundingBox.max;
CVector vehColCenterDist = collidingVeh->GetMatrix() * ((colMinVec + colMaxVec) * 0.5f) - GetPosition();
// TLVC = To look vehicle center
float angleToVehFront = collidingVeh->GetForward().Heading();
float angleDiffFromLookingFrontTLVC = angleToVehFront - vehColCenterDist.Heading();
angleDiffFromLookingFrontTLVC = CGeneral::LimitRadianAngle(angleDiffFromLookingFrontTLVC);
// I don't know why do we use that
float vehTopRightHeading = Atan2(colMaxVec.x - colMinVec.x, colMaxVec.y - colMinVec.y);
CVector vehDist = GetPosition() - collidingVeh->GetPosition();
vehDist.Normalise();
float vehRightVecAndSpeedDotProd;
if (Abs(angleDiffFromLookingFrontTLVC) >= vehTopRightHeading && Abs(angleDiffFromLookingFrontTLVC) < PI - vehTopRightHeading) {
if (angleDiffFromLookingFrontTLVC <= 0.0f) {
vehRightVecAndSpeedDotProd = DotProduct(collidingVeh->GetRight(), collidingVeh->m_vecMoveSpeed);
// vehRightVecAndSpeedDotProd < 0.1f = Vehicle being overturned or spinning to it's right?
if (collidingVehSpeedSqr > 1.0f / 100.0f && vehRightVecAndSpeedDotProd < 0.1f) {
// Car's right faces towards us and isn't coming directly to us
if (DotProduct(collidingVeh->GetRight(), GetForward()) < 0.0f
&& DotProduct(vehDist, collidingVeh->m_vecMoveSpeed) > 0.0f) {
SetEvasiveStep(collidingVeh, 1);
}
}
} else {
vehRightVecAndSpeedDotProd = DotProduct(-1.0f * collidingVeh->GetRight(), collidingVeh->m_vecMoveSpeed);
if (collidingVehSpeedSqr > 1.0f / 100.0f && vehRightVecAndSpeedDotProd < 0.1f) {
if (DotProduct(collidingVeh->GetRight(), GetForward()) > 0.0f
&& DotProduct(vehDist, collidingVeh->m_vecMoveSpeed) > 0.0f) {
SetEvasiveStep(collidingVeh, 1);
}
}
}
} else {
vehRightVecAndSpeedDotProd = DotProduct(vehDist, collidingVeh->m_vecMoveSpeed);
}
if (vehRightVecAndSpeedDotProd <= 0.1f) {
if (m_nPedState != PED_FIGHT) {
SetLookFlag(collidingVeh, true);
SetLookTimer(700);
}
} else {
bIsStanding = false;
CVector2D collidingEntMoveDir = -collidingVeh->m_vecMoveSpeed;
int dir = GetLocalDirection(collidingEntMoveDir);
SetFall(1000, (AnimationId)(dir + ANIM_KO_SKID_FRONT), false);
CPed *driver = collidingVeh->pDriver;
float damage;
if (driver && driver->IsPlayer()) {
damage = vehRightVecAndSpeedDotProd * 1000.0f;
} else if (collidingVeh->GetModelIndex() == MI_TRAIN) {
damage = 50.0f;
} else {
damage = 20.0f;
}
InflictDamage(collidingVeh, WEAPONTYPE_RAMMEDBYCAR, damage, PEDPIECE_TORSO, dir);
Say(SOUND_PED_DAMAGE);
}
} else {
KillPedWithCar(collidingVeh, m_fDamageImpulse);
}
}
#endif
break; break;
} }
case ENTITY_TYPE_PED: case ENTITY_TYPE_PED:
@ -11048,11 +10972,12 @@ CPed::ProcessControl(void)
player->AnnoyPlayerPed(false); player->AnnoyPlayerPed(false);
player->SetLookFlag(this, true); player->SetLookFlag(this, true);
player->SetLookTimer(1300); player->SetLookTimer(1300);
eWeaponType weapon = player->GetWeapon()->m_eWeaponType; eWeaponType weaponType = player->GetWeapon()->m_eWeaponType;
if (weapon == WEAPONTYPE_UNARMED uint32 weaponSlot = CWeaponInfo::GetWeaponInfo(weaponType)->m_nWeaponSlot;
|| weapon == WEAPONTYPE_BASEBALLBAT if (weaponType == WEAPONTYPE_UNARMED
|| weapon == WEAPONTYPE_COLT45 || weaponSlot == 3
|| weapon == WEAPONTYPE_UZI) { || weaponSlot == 5
|| weaponSlot == 1) {
player->bShakeFist = true; player->bShakeFist = true;
} }
} }
@ -11067,12 +10992,7 @@ CPed::ProcessControl(void)
} }
} }
CVector forceDir; CVector forceDir;
if (!bIsInTheAir && m_nPedState != PED_JUMP if (!bIsInTheAir && m_nPedState != PED_JUMP && m_fDamageImpulse > 0.0f) {
#ifdef VC_PED_PORTS
&& m_fDamageImpulse > 0.0f
#endif
) {
forceDir = m_vecDamageNormal; forceDir = m_vecDamageNormal;
forceDir.z = 0.0f; forceDir.z = 0.0f;
if (!bIsStanding) { if (!bIsStanding) {
@ -11088,7 +11008,7 @@ CPed::ProcessControl(void)
|| (!bIsStanding && !bWasStanding && m_nPedState == PED_FALL) || (!bIsStanding && !bWasStanding && m_nPedState == PED_FALL)
#endif #endif
) { ) {
if (m_nPedStateTimer <= 1000 && m_nPedStateTimer) { if (m_nPedStateTimer <= 1000 && m_nPedStateTimer != 0) {
forceDir = GetPosition() - m_vecHitLastPos; forceDir = GetPosition() - m_vecHitLastPos;
} else { } else {
m_nPedStateTimer = 0; m_nPedStateTimer = 0;
@ -11284,15 +11204,15 @@ CPed::ProcessControl(void)
} else if (m_nPedState == PED_DRIVING) { } else if (m_nPedState == PED_DRIVING) {
bWanderPathAfterExitingCar = true; bWanderPathAfterExitingCar = true;
SetObjective(OBJECTIVE_LEAVE_CAR, m_pMyVehicle); SetObjective(OBJECTIVE_LEAVE_CAR, m_pMyVehicle);
bStartWanderPathOnFoot = false;
} }
} }
if (!bIsStanding && m_vecMoveSpeed.z > 0.25f) { if (!bIsStanding && m_vecMoveSpeed.z > 0.25) {
float airResistance = Pow(0.95f, CTimer::GetTimeStep()); float airResistance = Pow(0.95f, CTimer::GetTimeStep());
m_vecMoveSpeed *= airResistance; m_vecMoveSpeed *= airResistance;
} }
#ifdef VC_PED_PORTS
if (IsPlayer() || !bIsStanding || m_vecMoveSpeed.x != 0.0f || m_vecMoveSpeed.y != 0.0f || m_vecMoveSpeed.z != 0.0f if (IsPlayer() || !bIsStanding || m_vecMoveSpeed.x != 0.0f || m_vecMoveSpeed.y != 0.0f || m_vecMoveSpeed.z != 0.0f
|| (m_nMoveState != PEDMOVE_NONE && m_nMoveState != PEDMOVE_STILL) || (m_nMoveState != PEDMOVE_NONE && m_nMoveState != PEDMOVE_STILL)
|| m_vecAnimMoveDelta.x != 0.0f || m_vecAnimMoveDelta.y != 0.0f || m_vecAnimMoveDelta.x != 0.0f || m_vecAnimMoveDelta.y != 0.0f
@ -11314,9 +11234,7 @@ CPed::ProcessControl(void)
m_vecTurnFriction = CVector(0.0f, 0.0f, 0.0f); m_vecTurnFriction = CVector(0.0f, 0.0f, 0.0f);
m_vecMoveFriction = CVector(0.0f, 0.0f, 0.0f); m_vecMoveFriction = CVector(0.0f, 0.0f, 0.0f);
} }
#else
CPhysical::ProcessControl();
#endif
if (m_nPedState != PED_DIE || bIsPedDieAnimPlaying) { if (m_nPedState != PED_DIE || bIsPedDieAnimPlaying) {
RequestDelayedWeapon(); RequestDelayedWeapon();
PlayFootSteps(); PlayFootSteps();
@ -11333,14 +11251,12 @@ CPed::ProcessControl(void)
bHeadStuckInCollision = false; bHeadStuckInCollision = false;
} }
} }
#ifdef VC_PED_PORTS
if (bHeadStuckInCollision) { if (bHeadStuckInCollision) {
CVector posToCheck = GetPosition(); CVector posToCheck = GetPosition();
posToCheck.z += 0.9f; posToCheck.z += 0.9f;
if (!CWorld::TestSphereAgainstWorld(posToCheck, 0.2f, this, true, true, false, true, false, false)) if (!CWorld::TestSphereAgainstWorld(posToCheck, 0.2f, this, true, true, false, true, false, false))
bHeadStuckInCollision = false; bHeadStuckInCollision = false;
} }
#endif
ProcessObjective(); ProcessObjective();
if (!bIsAimingGun) { if (!bIsAimingGun) {
if (bIsRestoringGun) if (bIsRestoringGun)
@ -11378,8 +11294,11 @@ CPed::ProcessControl(void)
Look(); Look();
break; break;
case PED_WANDER_RANGE: case PED_WANDER_RANGE:
// III has these in here(and they were unused):
/*
WanderRange(); WanderRange();
CheckAroundForPossibleCollisions(); CheckAroundForPossibleCollisions();
*/
break; break;
case PED_WANDER_PATH: case PED_WANDER_PATH:
WanderPath(); WanderPath();
@ -11398,8 +11317,13 @@ CPed::ProcessControl(void)
case PED_CPR: case PED_CPR:
case PED_SOLICIT: case PED_SOLICIT:
case PED_STEP_AWAY: case PED_STEP_AWAY:
case PED_SUN_BATHE:
case PED_FLASH:
case PED_JOG:
case PED_UNKNOWN: case PED_UNKNOWN:
case PED_STATES_NO_AI: case PED_STATES_NO_AI:
case PED_ABSEIL:
case PED_SIT:
case PED_JUMP: case PED_JUMP:
case PED_STAGGER: case PED_STAGGER:
case PED_DIVE_AWAY: case PED_DIVE_AWAY:
@ -11410,8 +11334,8 @@ CPed::ProcessControl(void)
case PED_OPEN_DOOR: case PED_OPEN_DOOR:
case PED_DEAD: case PED_DEAD:
case PED_DRAG_FROM_CAR: case PED_DRAG_FROM_CAR:
case PED_EXIT_CAR:
case PED_STEAL_CAR: case PED_STEAL_CAR:
case PED_EXIT_CAR:
break; break;
case PED_ENTER_CAR: case PED_ENTER_CAR:
case PED_CARJACK: case PED_CARJACK:
@ -11450,6 +11374,7 @@ CPed::ProcessControl(void)
break; break;
case PED_FLEE_ENTITY: case PED_FLEE_ENTITY:
if (!m_fleeFrom) { if (!m_fleeFrom) {
b157_10 = false;
SetIdle(); SetIdle();
break; break;
} }
@ -11498,13 +11423,19 @@ CPed::ProcessControl(void)
break; break;
if (CTimer::GetTimeInMilliseconds() <= m_fleeTimer) { if (CTimer::GetTimeInMilliseconds() <= m_fleeTimer) {
if (m_fleeFrom) { if (m_pFire) {
ms_vec2DFleePosition = m_fleeFrom->GetPosition(); if (m_fleeFrom) {
ms_vec2DFleePosition = m_fleeFrom->GetPosition();
} else {
ms_vec2DFleePosition.x = m_fleeFromPosX;
ms_vec2DFleePosition.y = m_fleeFromPosY;
}
Flee();
} else { } else {
ms_vec2DFleePosition.x = m_fleeFromPosX; m_nLastPedState = PED_NONE;
ms_vec2DFleePosition.y = m_fleeFromPosY; SetWanderPath(0);
SetWaitState(WAITSTATE_FINISH_FLEE, 0);
} }
Flee();
} else { } else {
if (m_pFire) if (m_pFire)
m_pFire->Extinguish(); m_pFire->Extinguish();
@ -11590,7 +11521,7 @@ CPed::ProcessControl(void)
Die(); Die();
break; break;
case PED_HANDS_UP: case PED_HANDS_UP:
if (m_pedStats->m_temper <= 50) { if (m_pedStats->m_flags & STAT_GUN_PANIC) {
if (!RpAnimBlendClumpGetAssociation(GetClump(), ANIM_HANDSCOWER)) { if (!RpAnimBlendClumpGetAssociation(GetClump(), ANIM_HANDSCOWER)) {
CAnimManager::AddAnimation(GetClump(), ASSOCGRP_STD, ANIM_HANDSCOWER); CAnimManager::AddAnimation(GetClump(), ASSOCGRP_STD, ANIM_HANDSCOWER);
Say(SOUND_PED_HANDS_COWER); Say(SOUND_PED_HANDS_COWER);
@ -11600,7 +11531,8 @@ CPed::ProcessControl(void)
Say(SOUND_PED_HANDS_UP); Say(SOUND_PED_HANDS_UP);
} }
break; break;
default: break; default:
break;
} }
SetMoveAnim(); SetMoveAnim();
if (bPedIsBleeding || m_bleedCounter != 0) { if (bPedIsBleeding || m_bleedCounter != 0) {
@ -11628,9 +11560,19 @@ CPed::ProcessControl(void)
ServiceTalking(); ServiceTalking();
if (bInVehicle && !m_pMyVehicle) if (bInVehicle && !m_pMyVehicle)
bInVehicle = false; bInVehicle = false;
#ifndef VC_PED_PORTS
m_pCurrentPhysSurface = nil; if (b156_8) {
#endif if (m_pMyVehicle && m_pMyVehicle->pDriver && m_pMyVehicle->pDriver->IsPlayer()) {
Say(SOUND_PED_FLEE_SPRINT);
}
}
if (m_delayedSoundID >= 0 && CTimer::GetTimeInMilliseconds() > m_delayedSoundTimer) {
Say(m_delayedSoundID);
m_delayedSoundID = -1;
m_delayedSoundTimer = 0;
}
if (bFannyMagnetCheat && m_nPedType == PEDTYPE_CIVFEMALE if (bFannyMagnetCheat && m_nPedType == PEDTYPE_CIVFEMALE
&& m_pedStats->m_sexiness > 40 && !m_leader) { && m_pedStats->m_sexiness > 40 && !m_leader) {
SetLeader(FindPlayerPed()); SetLeader(FindPlayerPed());
@ -13054,14 +12996,17 @@ CPed::PedSetOutCarCB(CAnimBlendAssociation *animAssoc, void *arg)
} }
ped->bInVehicle = false; ped->bInVehicle = false;
if (veh && veh->IsCar() && !veh->IsRoomForPedToLeaveCar(ped->m_vehEnterType, nil)) { if (veh && (veh->IsCar() || veh->IsBike()) && !veh->IsRoomForPedToLeaveCar(ped->m_vehEnterType, nil)) {
ped->PositionPedOutOfCollision(); ped->PositionPedOutOfCollision();
} }
if (ped->m_nPedState == PED_EXIT_CAR) { if (ped->m_nPedState == PED_EXIT_CAR) {
if (ped->m_nPedType == PEDTYPE_COP) if (ped->m_nPedType == PEDTYPE_COP) {
ped->SetIdle(); ped->SetIdle();
else if (((CCopPed*)ped)->m_nCopType == COP_MIAMIVICE && ped->m_pMyVehicle && ped->m_pMyVehicle->pDriver == ped) {
DMAudio.PlayOneShot(ped->m_audioEntityId, SOUND_PED_MIAMIVICE_EXITING_CAR, 0.f);
}
} else
ped->RestorePreviousState(); ped->RestorePreviousState();
veh = ped->m_pMyVehicle; veh = ped->m_pMyVehicle;
@ -14880,7 +14825,6 @@ CPed::ProcessObjective(void)
#endif #endif
if (m_pMyVehicle->IsBoat()) if (m_pMyVehicle->IsBoat())
SetExitBoat(m_pMyVehicle); SetExitBoat(m_pMyVehicle);
else else
SetExitCar(m_pMyVehicle, 0); SetExitCar(m_pMyVehicle, 0);
} }
@ -14888,6 +14832,15 @@ CPed::ProcessObjective(void)
RestorePreviousObjective(); RestorePreviousObjective();
} }
} }
if (b156_8) {
if (CTheScripts::IsPlayerOnAMission()) {
CVehicle *playerVeh = FindPlayerVehicle();
if (playerVeh && playerVeh->IsPassenger(this)) {
if (m_leaveCarTimer != 0)
m_leaveCarTimer = 0;
}
}
}
break; break;
case OBJECTIVE_AIM_GUN_AT: case OBJECTIVE_AIM_GUN_AT:
if (m_pedInObjective) { if (m_pedInObjective) {
@ -19190,7 +19143,7 @@ CPed::SetCarJack_AllClear(CVehicle* car, uint32 doorNode, uint32 doorFlag)
if (m_nPedType == PEDTYPE_COP) if (m_nPedType == PEDTYPE_COP)
Say(SOUND_PED_ARREST_COP); Say(SOUND_PED_ARREST_COP);
else if (car->m_nDoorLock == CARLOCK_UNLOCKED) else if (car->m_nDoorLock == CARLOCK_UNLOCKED)
Say(SOUND_PED_CAR_JACKING); Say(SOUND_PED_CAR_JACKING, 1000);
CVector carEnterPos; CVector carEnterPos;
carEnterPos = GetPositionToOpenCarDoor(car, m_vehEnterType); carEnterPos = GetPositionToOpenCarDoor(car, m_vehEnterType);

View File

@ -459,9 +459,7 @@ public:
//uint32 b156_4 //uint32 b156_4
uint32 b156_8 : 1; uint32 b156_8 : 1;
uint32 bIsPlayerFriend : 1; uint32 bIsPlayerFriend : 1;
#ifdef VC_PED_PORTS
uint32 bHeadStuckInCollision : 1; uint32 bHeadStuckInCollision : 1;
#endif
uint32 bDeadPedInFrontOfCar : 1; uint32 bDeadPedInFrontOfCar : 1;
uint32 bStayInCarOnJack : 1; uint32 bStayInCarOnJack : 1;
@ -469,8 +467,8 @@ public:
uint32 bDoomAim : 1; uint32 bDoomAim : 1;
uint32 bCanBeShotInVehicle : 1; uint32 bCanBeShotInVehicle : 1;
//uint32 b157_8 //uint32 b157_8
//uint32 b157_10 uint32 b157_10 : 1;
//uint32 b157_20 uint32 bPushedAlongByCar : 1;
uint32 b157_40 : 1; uint32 b157_40 : 1;
uint32 bIgnoreThreatsBehindObjects : 1; uint32 bIgnoreThreatsBehindObjects : 1;
@ -480,7 +478,7 @@ public:
//uint32 b158_8 //uint32 b158_8
uint32 b158_10 : 1; uint32 b158_10 : 1;
uint32 bBoughtIceCream : 1; uint32 bBoughtIceCream : 1;
//uint32 b158_40 uint32 b158_40 : 1;
//uint32 b158_80 //uint32 b158_80
// our own flags // our own flags
@ -631,8 +629,8 @@ public:
uint32 m_threatFlags; uint32 m_threatFlags;
uint32 m_threatCheck; uint32 m_threatCheck;
uint32 m_lastThreatCheck; uint32 m_lastThreatCheck;
uint32 m_sayType; uint32 m_delayedSoundID;
uint32 m_sayTimer; uint32 m_delayedSoundTimer;
uint32 m_lastSoundStart; uint32 m_lastSoundStart;
uint32 m_soundStart; uint32 m_soundStart;
uint16 m_lastQueuedSound; uint16 m_lastQueuedSound;
@ -664,6 +662,7 @@ public:
void AimGun(void); void AimGun(void);
void KillPedWithCar(CVehicle *veh, float impulse); void KillPedWithCar(CVehicle *veh, float impulse);
void Say(uint16 audio); void Say(uint16 audio);
void Say(uint16 audio, int32 time);
void SetLookFlag(CEntity* target, bool keepTryingToLook, bool cancelPrevious = false); void SetLookFlag(CEntity* target, bool keepTryingToLook, bool cancelPrevious = false);
void SetLookFlag(float direction, bool keepTryingToLook, bool cancelPrevious = false); void SetLookFlag(float direction, bool keepTryingToLook, bool cancelPrevious = false);
void SetLookTimer(int time); void SetLookTimer(int time);

View File

@ -155,4 +155,14 @@ CPed::Say(uint16 audio)
m_queuedSound = audioToPlay; m_queuedSound = audioToPlay;
} }
} }
}
// --MIAMI: Done
void
CPed::Say(uint16 audio, int32 time)
{
if (m_delayedSoundID == -1) {
m_delayedSoundID = audio;
m_delayedSoundTimer = CTimer::GetTimeInMilliseconds() + time;
}
} }

View File

@ -82,8 +82,14 @@ static char StateText[][18] = {
"Investigate", "Investigate",
"Step away", "Step away",
"On Fire", "On Fire",
"Sun Bathe",
"Flash",
"Jog",
"Answer Mobile",
"Unknown", "Unknown",
"STATES_NO_AI", "STATES_NO_AI",
"Abseil",
"Sit",
"Jump", "Jump",
"Fall", "Fall",
"GetUp", "GetUp",
@ -106,6 +112,7 @@ static char StateText[][18] = {
"Exit Car", "Exit Car",
"Hands Up", "Hands Up",
"Arrested", "Arrested",
"Deploying Stinger"
}; };
static char PersonalityTypeText[][18] = { static char PersonalityTypeText[][18] = {
@ -283,7 +290,7 @@ CPed::DebugRenderOnePedText(void)
CFont::SetJustifyOff(); CFont::SetJustifyOff();
CFont::SetColor(CRGBA(255, 255, 0, 255)); CFont::SetColor(CRGBA(255, 255, 0, 255));
CFont::SetBackGroundOnlyTextOn(); CFont::SetBackGroundOnlyTextOn();
CFont::SetFontStyle(0); CFont::SetFontStyle(1);
AsciiToUnicode(StateText[m_nPedState], gUString); AsciiToUnicode(StateText[m_nPedState], gUString);
CFont::PrintString(screenCoords.x, screenCoords.y, gUString); CFont::PrintString(screenCoords.x, screenCoords.y, gUString);
AsciiToUnicode(ObjectiveText[m_objective], gUString); AsciiToUnicode(ObjectiveText[m_objective], gUString);

View File

@ -232,7 +232,7 @@ CVehicle::SetupLighting(void)
}else{ }else{
CVector coors = GetPosition(); CVector coors = GetPosition();
float lighting = CPointLights::GenerateLightsAffectingObject(&coors); float lighting = CPointLights::GenerateLightsAffectingObject(&coors);
if(!bHasBlip && lighting != 1.0f){ if(lighting != 1.0f){
SetAmbientAndDirectionalColours(lighting); SetAmbientAndDirectionalColours(lighting);
return true; return true;
} }