Skip to content
This repository has been archived by the owner. It is now read-only.
Permalink
Browse files
CPlayerPed continues
  • Loading branch information
erorcun committed Jan 23, 2020
1 parent 77515f0 commit 74d1774c9087b1a4b3ca235977d50517cb9fd9ba
@@ -66,6 +66,7 @@ CPedPath
CPlayerPed CPlayerPed
CRoadBlocks CRoadBlocks
CRunningScript - being worked on CRunningScript - being worked on
CShotInfo
CStats CStats
CSpecialFX CSpecialFX
CTrafficLights CTrafficLights
@@ -1379,6 +1379,21 @@ CCamera::SetWideScreenOff(void)
m_bWantsToSwitchWidescreenOff = m_WideScreenOn; m_bWantsToSwitchWidescreenOff = m_WideScreenOn;
} }


void
CCamera::SetNewPlayerWeaponMode(int16 mode, int16 minZoom, int16 maxZoom)
{
PlayerWeaponMode.Mode = mode;
PlayerWeaponMode.MaxZoom = maxZoom;
PlayerWeaponMode.MinZoom = minZoom;
PlayerWeaponMode.Duration = 0.0f;
}

void
CCamera::UpdateAimingCoors(CVector const &coors)
{
m_cvecAimingTargetCoors = coors;
}

STARTPATCHES STARTPATCHES
InjectHook(0x42C760, (bool (CCamera::*)(const CVector &center, float radius, const CMatrix *mat))&CCamera::IsSphereVisible, PATCH_JUMP); InjectHook(0x42C760, (bool (CCamera::*)(const CVector &center, float radius, const CMatrix *mat))&CCamera::IsSphereVisible, PATCH_JUMP);
InjectHook(0x46FD00, &CCamera::SetFadeColour, PATCH_JUMP); InjectHook(0x46FD00, &CCamera::SetFadeColour, PATCH_JUMP);
@@ -494,6 +494,8 @@ int m_iModeObbeCamIsInForCar;
void SetCameraDirectlyBehindForFollowPed_CamOnAString(void); void SetCameraDirectlyBehindForFollowPed_CamOnAString(void);
void SetZoomValueFollowPedScript(int16); void SetZoomValueFollowPedScript(int16);
void SetZoomValueCamStringScript(int16); void SetZoomValueCamStringScript(int16);
void SetNewPlayerWeaponMode(int16, int16, int16);
void UpdateAimingCoors(CVector const &);


void dtor(void) { this->CCamera::~CCamera(); } void dtor(void) { this->CCamera::~CCamera(); }
}; };
@@ -212,9 +212,9 @@ CPlayerInfo::IsRestartingAfterArrest()
return m_WBState == WBSTATE_BUSTED; return m_WBState == WBSTATE_BUSTED;
} }


// lastClosestness is passed to other calls of this function // lastCloseness is passed to other calls of this function
void void
CPlayerInfo::EvaluateCarPosition(CEntity *carToTest, CPed *player, float carBoundCentrePedDist, float *lastClosestness, CVehicle **closestCarOutput) CPlayerInfo::EvaluateCarPosition(CEntity *carToTest, CPed *player, float carBoundCentrePedDist, float *lastCloseness, CVehicle **closestCarOutput)
{ {
// This dist used for determining the angle to face // This dist used for determining the angle to face
CVector2D dist(carToTest->GetPosition() - player->GetPosition()); CVector2D dist(carToTest->GetPosition() - player->GetPosition());
@@ -229,9 +229,9 @@ CPlayerInfo::EvaluateCarPosition(CEntity *carToTest, CPed *player, float carBoun


// This dist used for evaluating cars' distances, weird... // This dist used for evaluating cars' distances, weird...
// Accounts inverted needed turn (or needed turn in long way) and car dist. // Accounts inverted needed turn (or needed turn in long way) and car dist.
float closestness = (1.0f - Abs(neededTurn) / TWOPI) * (10.0f - carBoundCentrePedDist); float closeness = (1.0f - Abs(neededTurn) / TWOPI) * (10.0f - carBoundCentrePedDist);
if (closestness > *lastClosestness) { if (closeness > *lastCloseness) {
*lastClosestness = closestness; *lastCloseness = closeness;
*closestCarOutput = (CVehicle*)carToTest; *closestCarOutput = (CVehicle*)carToTest;
} }
} }
@@ -312,7 +312,7 @@ INITSAVEBUF
} }


void void
CPlayerInfo::FindClosestCarSectorList(CPtrList& carList, CPed* ped, float unk1, float unk2, float unk3, float unk4, float* lastClosestness, CVehicle** closestCarOutput) 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) { for (CPtrNode* node = carList.first; node; node = node->next) {
CVehicle *car = (CVehicle*)node->item; CVehicle *car = (CVehicle*)node->item;
@@ -328,7 +328,7 @@ CPlayerInfo::FindClosestCarSectorList(CPtrList& carList, CPed* ped, float unk1,
if (Abs(ped->GetPosition().z - carCentre.z) < 2.0f) { if (Abs(ped->GetPosition().z - carCentre.z) < 2.0f) {
float dist = (ped->GetPosition() - carCentre).Magnitude2D(); float dist = (ped->GetPosition() - carCentre).Magnitude2D();
if (dist <= 10.0f && !CCranes::IsThisCarBeingCarriedByAnyCrane(car)) { if (dist <= 10.0f && !CCranes::IsThisCarBeingCarriedByAnyCrane(car)) {
EvaluateCarPosition(car, ped, dist, lastClosestness, closestCarOutput); EvaluateCarPosition(car, ped, dist, lastCloseness, closestCarOutput);
} }
} }
} }
@@ -434,7 +434,7 @@ CPlayerInfo::Process(void)
// Enter vehicle // Enter vehicle
if (CPad::GetPad(0)->ExitVehicleJustDown()) { if (CPad::GetPad(0)->ExitVehicleJustDown()) {
bool weAreOnBoat = false; bool weAreOnBoat = false;
float lastClosestness = 0.0f; float lastCloseness = 0.0f;
CVehicle *carBelow = nil; CVehicle *carBelow = nil;
CEntity *surfaceBelow = m_pPed->m_pCurrentPhysSurface; CEntity *surfaceBelow = m_pPed->m_pCurrentPhysSurface;
if (surfaceBelow && surfaceBelow->IsVehicle()) { if (surfaceBelow && surfaceBelow->IsVehicle()) {
@@ -472,9 +472,9 @@ CPlayerInfo::Process(void)
for (int curX = minXSector; curX <= maxXSector; curX++) { for (int curX = minXSector; curX <= maxXSector; curX++) {
CSector *sector = CWorld::GetSector(curX, curY); CSector *sector = CWorld::GetSector(curX, curY);
FindClosestCarSectorList(sector->m_lists[ENTITYLIST_VEHICLES], m_pPed, FindClosestCarSectorList(sector->m_lists[ENTITYLIST_VEHICLES], m_pPed,
minX, minY, maxX, maxY, &lastClosestness, &carBelow); minX, minY, maxX, maxY, &lastCloseness, &carBelow);
FindClosestCarSectorList(sector->m_lists[ENTITYLIST_VEHICLES_OVERLAP], m_pPed, FindClosestCarSectorList(sector->m_lists[ENTITYLIST_VEHICLES_OVERLAP], m_pPed,
minX, minY, maxX, maxY, &lastClosestness, &carBelow); minX, minY, maxX, maxY, &lastCloseness, &carBelow);
} }
} }
} }
@@ -60,30 +60,21 @@ CCivilianPed::CivilianAI(void)
if (!threatPed->IsPlayer() || !RunToReportCrime(CRIME_POSSESSION_GUN)) { if (!threatPed->IsPlayer() || !RunToReportCrime(CRIME_POSSESSION_GUN)) {
if (threatDistSqr < sq(10.0f)) { if (threatDistSqr < sq(10.0f)) {
Say(SOUND_PED_FLEE_SPRINT); Say(SOUND_PED_FLEE_SPRINT);
SetFlee(m_threatEntity, 10000); SetFindPathAndFlee(m_threatEntity, 10000);
bUsePedNodeSeek = true;
m_pNextPathNode = nil;
} else { } else {
SetFlee(m_threatEntity->GetPosition(), 5000); SetFindPathAndFlee(m_threatEntity->GetPosition(), 5000, true);
bUsePedNodeSeek = true;
m_pNextPathNode = nil;
SetMoveState(PEDMOVE_WALK);
} }
} }
} else if (m_objective != OBJECTIVE_NONE || GetWeapon()->IsTypeMelee()) { } else if (m_objective != OBJECTIVE_NONE || GetWeapon()->IsTypeMelee()) {
SetFlee(m_threatEntity, 5000); SetFindPathAndFlee(m_threatEntity, 5000);
bUsePedNodeSeek = true;
m_pNextPathNode = nil;
if (threatDistSqr < sq(20.0f)) { if (threatDistSqr < sq(20.0f)) {
SetMoveState(PEDMOVE_RUN); SetMoveState(PEDMOVE_RUN);
Say(SOUND_PED_FLEE_SPRINT); Say(SOUND_PED_FLEE_SPRINT);
} else { } else {
SetMoveState(PEDMOVE_WALK); SetMoveState(PEDMOVE_WALK);
} }
} else if (threatPed->IsPlayer() && FindPlayerPed()->m_pWanted->m_CurrentCops) { } else if (threatPed->IsPlayer() && FindPlayerPed()->m_pWanted->m_CurrentCops) {
SetFlee(m_threatEntity, 5000); SetFindPathAndFlee(m_threatEntity, 5000);
bUsePedNodeSeek = true;
m_pNextPathNode = nil;
if (threatDistSqr < sq(10.0f)) { if (threatDistSqr < sq(10.0f)) {
SetMoveState(PEDMOVE_RUN); SetMoveState(PEDMOVE_RUN);
} else { } else {
@@ -95,15 +86,11 @@ CCivilianPed::CivilianAI(void)
} else { } else {
if (threatDistSqr < sq(10.0f)) { if (threatDistSqr < sq(10.0f)) {
Say(SOUND_PED_FLEE_SPRINT); Say(SOUND_PED_FLEE_SPRINT);
SetFlee(m_threatEntity, 10000); SetFindPathAndFlee(m_threatEntity, 10000);
bUsePedNodeSeek = true;
m_pNextPathNode = nil;
SetMoveState(PEDMOVE_SPRINT); SetMoveState(PEDMOVE_SPRINT);
} else { } else {
Say(SOUND_PED_FLEE_SPRINT); Say(SOUND_PED_FLEE_SPRINT);
SetFlee(m_threatEntity, 5000); SetFindPathAndFlee(m_threatEntity, 5000);
bUsePedNodeSeek = true;
m_pNextPathNode = nil;
SetMoveState(PEDMOVE_RUN); SetMoveState(PEDMOVE_RUN);
} }
} }
@@ -113,9 +100,7 @@ CCivilianPed::CivilianAI(void)
float eventDistSqr = (m_pEventEntity->GetPosition() - GetPosition()).MagnitudeSqr2D(); float eventDistSqr = (m_pEventEntity->GetPosition() - GetPosition()).MagnitudeSqr2D();
if (IsGangMember() && m_nPedType == ((CPed*)m_pEventEntity)->m_nPedType) { if (IsGangMember() && m_nPedType == ((CPed*)m_pEventEntity)->m_nPedType) {
if (eventDistSqr < sq(5.0f)) { if (eventDistSqr < sq(5.0f)) {
SetFlee(m_pEventEntity, 2000); SetFindPathAndFlee(m_pEventEntity, 2000);
bUsePedNodeSeek = true;
m_pNextPathNode = nil;
SetMoveState(PEDMOVE_RUN); SetMoveState(PEDMOVE_RUN);
} }
} else if (IsGangMember() || eventDistSqr > sq(5.0f)) { } else if (IsGangMember() || eventDistSqr > sq(5.0f)) {
@@ -150,9 +135,7 @@ CCivilianPed::CivilianAI(void)
if(!eligibleToReport || !RunToReportCrime(crime)) if(!eligibleToReport || !RunToReportCrime(crime))
#endif #endif
{ {
SetFlee(m_pEventEntity, 5000); SetFindPathAndFlee(m_pEventEntity, 5000);
bUsePedNodeSeek = true;
m_pNextPathNode = nil;
SetMoveState(PEDMOVE_RUN); SetMoveState(PEDMOVE_RUN);
} }
} }
@@ -188,19 +171,14 @@ CCivilianPed::CivilianAI(void)
if (threatPed->GetWeapon()->IsTypeMelee() || !GetWeapon()->IsTypeMelee()) { if (threatPed->GetWeapon()->IsTypeMelee() || !GetWeapon()->IsTypeMelee()) {
if (threatPed->IsPlayer() && FindPlayerPed()->m_pWanted->m_CurrentCops) { if (threatPed->IsPlayer() && FindPlayerPed()->m_pWanted->m_CurrentCops) {
if (m_objective == OBJECTIVE_KILL_CHAR_ON_FOOT || m_objective == OBJECTIVE_KILL_CHAR_ANY_MEANS) { if (m_objective == OBJECTIVE_KILL_CHAR_ON_FOOT || m_objective == OBJECTIVE_KILL_CHAR_ANY_MEANS) {
SetFlee(m_threatEntity, 10000); SetFindPathAndFlee(m_threatEntity, 10000);
bUsePedNodeSeek = true;
m_pNextPathNode = nil;
} }
} else { } else {
SetObjective(OBJECTIVE_KILL_CHAR_ON_FOOT, m_threatEntity); SetObjective(OBJECTIVE_KILL_CHAR_ON_FOOT, m_threatEntity);
} }
} }
} else { } else {
SetFlee(m_threatEntity, 10000); SetFindPathAndFlee(m_threatEntity, 10000, true);
bUsePedNodeSeek = true;
m_pNextPathNode = nil;
SetMoveState(PEDMOVE_WALK);
} }
} }
} }
@@ -1068,7 +1068,7 @@ CPed::FinishedAttackCB(CAnimBlendAssociation *attackAssoc, void *arg)
if (attackAssoc) { if (attackAssoc) {
switch (attackAssoc->animId) { switch (attackAssoc->animId) {
case ANIM_WEAPON_START_THROW: case ANIM_WEAPON_START_THROW:
if ((!ped->IsPlayer() || ((CPlayerPed*)ped)->field_1380) && ped->IsPlayer()) { if ((!ped->IsPlayer() || ((CPlayerPed*)ped)->m_bHaveTargetSelected) && ped->IsPlayer()) {
attackAssoc->blendDelta = -1000.0f; attackAssoc->blendDelta = -1000.0f;
newAnim = CAnimManager::AddAnimation(ped->GetClump(), ASSOCGRP_STD, ANIM_WEAPON_THROWU); newAnim = CAnimManager::AddAnimation(ped->GetClump(), ASSOCGRP_STD, ANIM_WEAPON_THROWU);
} else { } else {
@@ -1141,7 +1141,7 @@ CPed::Attack(void)
return; return;


if (reloadAnimAssoc) { if (reloadAnimAssoc) {
if (!IsPlayer() || ((CPlayerPed*)this)->field_1380) if (!IsPlayer() || ((CPlayerPed*)this)->m_bHaveTargetSelected)
ClearAttack(); ClearAttack();


return; return;
@@ -1162,7 +1162,7 @@ CPed::Attack(void)


if (!weaponAnimAssoc) { if (!weaponAnimAssoc) {
if (attackShouldContinue) { if (attackShouldContinue) {
if (ourWeaponFire != WEAPON_FIRE_PROJECTILE || !IsPlayer() || ((CPlayerPed*)this)->field_1380) { if (ourWeaponFire != WEAPON_FIRE_PROJECTILE || !IsPlayer() || ((CPlayerPed*)this)->m_bHaveTargetSelected) {
if (!CGame::nastyGame || ourWeaponFire != WEAPON_FIRE_MELEE || CheckForPedsOnGroundToAttack(this, nil) < PED_ON_THE_FLOOR) { if (!CGame::nastyGame || ourWeaponFire != WEAPON_FIRE_MELEE || CheckForPedsOnGroundToAttack(this, nil) < PED_ON_THE_FLOOR) {
weaponAnimAssoc = CAnimManager::BlendAnimation(GetClump(), ASSOCGRP_STD, ourWeapon->m_AnimToPlay, 8.0f); weaponAnimAssoc = CAnimManager::BlendAnimation(GetClump(), ASSOCGRP_STD, ourWeapon->m_AnimToPlay, 8.0f);
} }
@@ -1178,7 +1178,7 @@ CPed::Attack(void)


if (IsPlayer()) { if (IsPlayer()) {
((CPlayerPed*)this)->field_1376 = 0.0f; ((CPlayerPed*)this)->field_1376 = 0.0f;
((CPlayerPed*)this)->field_1380 = false; ((CPlayerPed*)this)->m_bHaveTargetSelected = false;
} }
} }
} else } else
@@ -4641,7 +4641,7 @@ CPed::SetAttack(CEntity *victim)
} }


if (RpAnimBlendClumpGetAssociation(GetClump(), ANIM_AK_RELOAD)) { if (RpAnimBlendClumpGetAssociation(GetClump(), ANIM_AK_RELOAD)) {
if (!IsPlayer() || m_nPedState != PED_ATTACK || ((CPlayerPed*)this)->field_1380) if (!IsPlayer() || m_nPedState != PED_ATTACK || ((CPlayerPed*)this)->m_bHaveTargetSelected)
bIsAttacking = false; bIsAttacking = false;
else else
bIsAttacking = true; bIsAttacking = true;
@@ -5720,15 +5720,8 @@ CPed::CollideWithPed(CPed *collideWith)
SetLookTimer(800); SetLookTimer(800);
} }
} else { } else {
bool doWeRun = true; bool isRunning = m_nMoveState == PEDMOVE_RUN || m_nMoveState == PEDMOVE_SPRINT;
if (m_nMoveState != PEDMOVE_RUN && m_nMoveState != PEDMOVE_SPRINT) SetFindPathAndFlee(collideWith, 5000, !isRunning);
doWeRun = false;

SetFlee(collideWith, 5000);
bUsePedNodeSeek = true;
m_pNextPathNode = nil;
if (!doWeRun)
SetMoveState(PEDMOVE_WALK);
} }
} }


@@ -12982,9 +12975,7 @@ CPed::ProcessObjective(void)
else else
time = 6000; time = 6000;


SetFlee(m_pedInObjective, time); SetFindPathAndFlee(m_pedInObjective, time);
bUsePedNodeSeek = true;
m_pNextPathNode = nil;
} }
break; break;
} }
@@ -13506,10 +13497,7 @@ CPed::ProcessObjective(void)
if (m_pedInObjective->m_nPedState == PED_FLEE_ENTITY && m_fleeFrom == this if (m_pedInObjective->m_nPedState == PED_FLEE_ENTITY && m_fleeFrom == this
|| m_pedInObjective->m_objective == OBJECTIVE_FLEE_CHAR_ON_FOOT_TILL_SAFE && m_pedInObjective->m_pedInObjective == this) { || m_pedInObjective->m_objective == OBJECTIVE_FLEE_CHAR_ON_FOOT_TILL_SAFE && m_pedInObjective->m_pedInObjective == this) {
ClearObjective(); ClearObjective();
SetFlee(m_pedInObjective, 15000); SetFindPathAndFlee(m_pedInObjective, 15000, true);
bUsePedNodeSeek = true;
m_pNextPathNode = nil;
SetMoveState(PEDMOVE_WALK);
return; return;
} }
float distWithTargetScSqr = distWithTarget.MagnitudeSqr(); float distWithTargetScSqr = distWithTarget.MagnitudeSqr();
@@ -13536,10 +13524,7 @@ CPed::ProcessObjective(void)
ClearObjective(); ClearObjective();
if (m_pedInObjective->m_objective != OBJECTIVE_KILL_CHAR_ON_FOOT if (m_pedInObjective->m_objective != OBJECTIVE_KILL_CHAR_ON_FOOT
|| m_pedInObjective->m_pedInObjective != this) { || m_pedInObjective->m_pedInObjective != this) {
SetFlee(m_pedInObjective, 15000); SetFindPathAndFlee(m_pedInObjective, 15000, true);
bUsePedNodeSeek = true;
m_pNextPathNode = nil;
SetMoveState(PEDMOVE_WALK);
m_nLastPedState = PED_WANDER_PATH; m_nLastPedState = PED_WANDER_PATH;
} else { } else {
SetObjective(OBJECTIVE_FLEE_CHAR_ON_FOOT_TILL_SAFE, m_pedInObjective); SetObjective(OBJECTIVE_FLEE_CHAR_ON_FOOT_TILL_SAFE, m_pedInObjective);
@@ -13783,11 +13768,7 @@ CPed::SetDirectionToWalkAroundObject(CEntity *obj)
#endif #endif
if (CharCreatedBy != MISSION_CHAR && obj->m_modelIndex == MI_PHONEBOOTH1) { if (CharCreatedBy != MISSION_CHAR && obj->m_modelIndex == MI_PHONEBOOTH1) {
bool isRunning = m_nMoveState == PEDMOVE_RUN || m_nMoveState == PEDMOVE_SPRINT; bool isRunning = m_nMoveState == PEDMOVE_RUN || m_nMoveState == PEDMOVE_SPRINT;
SetFlee(obj, 5000); SetFindPathAndFlee(obj, 5000, !isRunning);
bUsePedNodeSeek = true;
m_pNextPathNode = nil;
if (!isRunning)
SetMoveState(PEDMOVE_WALK);
return; return;
} }


@@ -792,6 +792,24 @@ class CPed : public CPhysical
void ReplaceWeaponWhenExitingVehicle(void); void ReplaceWeaponWhenExitingVehicle(void);
void RemoveWeaponWhenEnteringVehicle(void); void RemoveWeaponWhenEnteringVehicle(void);
bool IsNotInWreckedVehicle(); bool IsNotInWreckedVehicle();
// My additions, because there were many, many instances of that.
inline void SetFindPathAndFlee(CEntity *fleeFrom, int time, bool walk = false)
{
SetFlee(fleeFrom, time);
bUsePedNodeSeek = true;
m_pNextPathNode = nil;
if (walk)
SetMoveState(PEDMOVE_WALK);
}

inline void SetFindPathAndFlee(CVector2D const &from, int time, bool walk = false)
{
SetFlee(from, time);
bUsePedNodeSeek = true;
m_pNextPathNode = nil;
if (walk)
SetMoveState(PEDMOVE_WALK);
}


// set by 0482:set_threat_reaction_range_multiplier opcode // set by 0482:set_threat_reaction_range_multiplier opcode
static uint16 &nThreatReactionRangeMultiplier; static uint16 &nThreatReactionRangeMultiplier;

0 comments on commit 74d1774

Please sign in to comment.