Fixes&Peds
This commit is contained in:
parent
d61430fbba
commit
2d998b2416
@ -80,12 +80,15 @@ WRAPPER void CGame::Initialise(const char *datFile) { EAXJMP(0x48BED0); }
|
|||||||
#if 0
|
#if 0
|
||||||
WRAPPER void CGame::Process(void) { EAXJMP(0x48C850); }
|
WRAPPER void CGame::Process(void) { EAXJMP(0x48C850); }
|
||||||
#else
|
#else
|
||||||
|
extern void (*DebugMenuProcess)(void);
|
||||||
void CGame::Process(void)
|
void CGame::Process(void)
|
||||||
{
|
{
|
||||||
CPad::UpdatePads();
|
CPad::UpdatePads();
|
||||||
TheCamera.SetMotionBlurAlpha(0);
|
TheCamera.SetMotionBlurAlpha(0);
|
||||||
if (TheCamera.m_BlurType == MBLUR_NONE || TheCamera.m_BlurType == MBLUR_SNIPER || TheCamera.m_BlurType == MBLUR_NORMAL)
|
if (TheCamera.m_BlurType == MBLUR_NONE || TheCamera.m_BlurType == MBLUR_SNIPER || TheCamera.m_BlurType == MBLUR_NORMAL)
|
||||||
TheCamera.SetMotionBlur(0, 0, 0, 0, MBLUR_NONE);
|
TheCamera.SetMotionBlur(0, 0, 0, 0, MBLUR_NONE);
|
||||||
|
|
||||||
|
DebugMenuProcess();
|
||||||
CCutsceneMgr::Update();
|
CCutsceneMgr::Update();
|
||||||
if (!CCutsceneMgr::IsCutsceneProcessing() && !CTimer::GetIsCodePaused())
|
if (!CCutsceneMgr::IsCutsceneProcessing() && !CTimer::GetIsCodePaused())
|
||||||
FrontEndMenuManager.Process();
|
FrontEndMenuManager.Process();
|
||||||
|
@ -18,6 +18,7 @@
|
|||||||
#include "Automobile.h"
|
#include "Automobile.h"
|
||||||
#include "Ped.h"
|
#include "Ped.h"
|
||||||
#include "debugmenu_public.h"
|
#include "debugmenu_public.h"
|
||||||
|
#include "Particle.h"
|
||||||
|
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <list>
|
#include <list>
|
||||||
@ -352,6 +353,7 @@ DebugMenuPopulate(void)
|
|||||||
DebugMenuAddCmd("Debug", "Make peds follow you in formation", LetThemFollowYou);
|
DebugMenuAddCmd("Debug", "Make peds follow you in formation", LetThemFollowYou);
|
||||||
#ifndef MASTER
|
#ifndef MASTER
|
||||||
DebugMenuAddVarBool8("Debug", "Toggle unused fight feature", (int8*)&CPed::bUnusedFightThingOnPlayer, nil);
|
DebugMenuAddVarBool8("Debug", "Toggle unused fight feature", (int8*)&CPed::bUnusedFightThingOnPlayer, nil);
|
||||||
|
DebugMenuAddVarBool8("Debug", "Toggle banned particles", (int8*)&CParticle::bEnableBannedParticles, nil);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
DebugMenuAddCmd("Debug", "Start Credits", CCredits::Start);
|
DebugMenuAddCmd("Debug", "Start Credits", CCredits::Start);
|
||||||
|
347
src/peds/Ped.cpp
347
src/peds/Ped.cpp
@ -59,7 +59,6 @@ WRAPPER void CPed::UpdatePosition(void) { EAXJMP(0x4C7A00); }
|
|||||||
WRAPPER void CPed::WanderPath(void) { EAXJMP(0x4D28D0); }
|
WRAPPER void CPed::WanderPath(void) { EAXJMP(0x4D28D0); }
|
||||||
WRAPPER void CPed::SeekCar(void) { EAXJMP(0x4D3F90); }
|
WRAPPER void CPed::SeekCar(void) { EAXJMP(0x4D3F90); }
|
||||||
WRAPPER void CPed::UpdateFromLeader(void) { EAXJMP(0x4D8F30); }
|
WRAPPER void CPed::UpdateFromLeader(void) { EAXJMP(0x4D8F30); }
|
||||||
WRAPPER int CPed::ScanForThreats(void) { EAXJMP(0x4C5FE0); }
|
|
||||||
WRAPPER void CPed::SetEnterCar_AllClear(CVehicle*, uint32, uint32) { EAXJMP(0x4E0A40); }
|
WRAPPER void CPed::SetEnterCar_AllClear(CVehicle*, uint32, uint32) { EAXJMP(0x4E0A40); }
|
||||||
WRAPPER bool CPed::WarpPedToNearEntityOffScreen(CEntity*) { EAXJMP(0x4E5570); }
|
WRAPPER bool CPed::WarpPedToNearEntityOffScreen(CEntity*) { EAXJMP(0x4E5570); }
|
||||||
WRAPPER void CPed::SetObjective(eObjective, CVector) { EAXJMP(0x4D8A90); }
|
WRAPPER void CPed::SetObjective(eObjective, CVector) { EAXJMP(0x4D8A90); }
|
||||||
@ -3245,7 +3244,7 @@ CPed::CheckForGunShots(void)
|
|||||||
int event;
|
int event;
|
||||||
if (CEventList::FindClosestEvent(EVENT_GUNSHOT, GetPosition(), &event)) {
|
if (CEventList::FindClosestEvent(EVENT_GUNSHOT, GetPosition(), &event)) {
|
||||||
if (gaEvent[event].entityType == EVENT_ENTITY_PED) {
|
if (gaEvent[event].entityType == EVENT_ENTITY_PED) {
|
||||||
// Is that a bug?!? (same on VC)
|
// Probably due to we don't want peds to go gunshot area? (same on VC)
|
||||||
m_ped_flagD2 = false;
|
m_ped_flagD2 = false;
|
||||||
return CPools::GetPed(gaEvent[event].entityRef);
|
return CPools::GetPed(gaEvent[event].entityRef);
|
||||||
}
|
}
|
||||||
@ -12357,7 +12356,7 @@ CPed::ProcessObjective(void)
|
|||||||
SetLookTimer(CGeneral::GetRandomNumberInRange(500, 1500));
|
SetLookTimer(CGeneral::GetRandomNumberInRange(500, 1500));
|
||||||
|
|
||||||
// Second condition is pointless and isn't there in Mobile.
|
// Second condition is pointless and isn't there in Mobile.
|
||||||
if (threatType == 0x100000 || (threatType == 0x800000 && m_threatEntity) || m_threatEntity) {
|
if (threatType == PED_FLAG_GUN || (threatType == PED_FLAG_EXPLOSION && m_threatEntity) || m_threatEntity) {
|
||||||
if (m_threatEntity->IsPed())
|
if (m_threatEntity->IsPed())
|
||||||
SetObjective(OBJECTIVE_KILL_CHAR_ON_FOOT, m_threatEntity);
|
SetObjective(OBJECTIVE_KILL_CHAR_ON_FOOT, m_threatEntity);
|
||||||
}
|
}
|
||||||
@ -15236,6 +15235,346 @@ CPed::SetExitCar(CVehicle *veh, uint32 wantedDoorNode)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
CPed::ScanForInterestingStuff(void)
|
||||||
|
{
|
||||||
|
if (!IsPedInControl())
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (m_objective != OBJECTIVE_NONE)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (CharCreatedBy == MISSION_CHAR)
|
||||||
|
return;
|
||||||
|
|
||||||
|
LookForSexyPeds();
|
||||||
|
LookForSexyCars();
|
||||||
|
if (LookForInterestingNodes())
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (m_nPedType == PEDTYPE_CRIMINAL && m_hitRecoverTimer < CTimer::GetTimeInMilliseconds()) {
|
||||||
|
if (CGeneral::GetRandomNumber() % 100 >= 10) {
|
||||||
|
if (m_objective != OBJECTIVE_MUG_CHAR && !(CGeneral::GetRandomNumber() & 7)) {
|
||||||
|
CPed *charToMug = nil;
|
||||||
|
for (int i = 0; i < m_numNearPeds; ++i) {
|
||||||
|
CPed *nearPed = m_nearPeds[i];
|
||||||
|
|
||||||
|
if ((nearPed->GetPosition() - GetPosition()).MagnitudeSqr() > 49.0f)
|
||||||
|
break;
|
||||||
|
|
||||||
|
if ((nearPed->m_nPedType == PEDTYPE_CIVFEMALE || nearPed->m_nPedType == PEDTYPE_CIVMALE
|
||||||
|
|| nearPed->m_nPedType == PEDTYPE_CRIMINAL || nearPed->m_nPedType == PEDTYPE_UNUSED1
|
||||||
|
|| nearPed->m_nPedType == PEDTYPE_PROSTITUTE)
|
||||||
|
&& nearPed->CharCreatedBy != MISSION_CHAR
|
||||||
|
&& nearPed->IsPedShootable()
|
||||||
|
&& nearPed->m_objective != OBJECTIVE_MUG_CHAR) {
|
||||||
|
charToMug = nearPed;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (charToMug)
|
||||||
|
SetObjective(OBJECTIVE_MUG_CHAR, charToMug);
|
||||||
|
|
||||||
|
m_hitRecoverTimer = CTimer::GetTimeInMilliseconds() + 5000;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
int mostExpensiveVehAround = -1;
|
||||||
|
int bestMonetaryValue = 0;
|
||||||
|
|
||||||
|
CVector pos = GetPosition();
|
||||||
|
int16 lastVehicle;
|
||||||
|
CEntity *vehicles[8];
|
||||||
|
CWorld::FindObjectsInRange(pos, 10.0f, true, &lastVehicle, 6, vehicles, false, true, false, false, false);
|
||||||
|
|
||||||
|
for (int i = 0; i < lastVehicle; i++) {
|
||||||
|
CVehicle* veh = (CVehicle*)vehicles[i];
|
||||||
|
|
||||||
|
if (veh->VehicleCreatedBy != MISSION_VEHICLE) {
|
||||||
|
if (veh->m_vecMoveSpeed.Magnitude() <= 0.1f && veh->IsVehicleNormal()
|
||||||
|
&& veh->IsCar() && bestMonetaryValue < veh->pHandling->nMonetaryValue) {
|
||||||
|
mostExpensiveVehAround = i;
|
||||||
|
bestMonetaryValue = veh->pHandling->nMonetaryValue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (bestMonetaryValue > 2000 && mostExpensiveVehAround != -1 && vehicles[mostExpensiveVehAround]) {
|
||||||
|
SetObjective(OBJECTIVE_ENTER_CAR_AS_DRIVER, vehicles[mostExpensiveVehAround]);
|
||||||
|
m_hitRecoverTimer = CTimer::GetTimeInMilliseconds() + 5000;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
m_hitRecoverTimer = CTimer::GetTimeInMilliseconds() + 5000;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (m_nPedState == PEDTYPE_CIVFEMALE) {
|
||||||
|
#ifndef VC_PED_PORTS
|
||||||
|
if (CTimer::GetTimeInMilliseconds() > m_standardTimer) {
|
||||||
|
|
||||||
|
// += 2 is weird
|
||||||
|
for (int i = 0; i < m_numNearPeds; i += 2) {
|
||||||
|
if (m_nearPeds[i]->m_nPedState == PED_WANDER_PATH && WillChat(m_nearPeds[i])) {
|
||||||
|
if (CGeneral::GetRandomNumberInRange(0, 100) >= 100)
|
||||||
|
m_standardTimer = CTimer::GetTimeInMilliseconds() + 30000;
|
||||||
|
else {
|
||||||
|
if ((GetPosition() - m_nearPeds[i]->GetPosition()).Magnitude() >= 1.8f) {
|
||||||
|
m_standardTimer = CTimer::GetTimeInMilliseconds() + 30000;
|
||||||
|
} else if (CanSeeEntity(m_nearPeds[i], DEGTORAD(60.0f))) {
|
||||||
|
int time = CGeneral::GetRandomNumber() % 4000 + 10000;
|
||||||
|
SetChat(m_nearPeds[i], time);
|
||||||
|
m_nearPeds[i]->SetChat(this, time);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
if (CGeneral::GetRandomNumberInRange(0.0f, 1.0f) >= 0.5f) {
|
||||||
|
m_standardTimer = CTimer::GetTimeInMilliseconds() + 200;
|
||||||
|
} else {
|
||||||
|
if (CTimer::GetTimeInMilliseconds() > m_standardTimer) {
|
||||||
|
for (int i = 0; i < m_numNearPeds; i ++) {
|
||||||
|
if (m_nearPeds[i]->m_nPedState == PED_WANDER_PATH) {
|
||||||
|
if ((GetPosition() - m_nearPeds[i]->GetPosition()).Magnitude() < 1.8f
|
||||||
|
&& CanSeeEntity(m_nearPeds[i], DEGTORAD(60.0f)
|
||||||
|
&& m_nearPeds[i]->CanSeeEntity(this, DEGTORAD(60.0f)))
|
||||||
|
&& WillChat(m_nearPeds[i])) {
|
||||||
|
|
||||||
|
int time = CGeneral::GetRandomNumber() % 4000 + 10000;
|
||||||
|
SetChat(m_nearPeds[i], time);
|
||||||
|
m_nearPeds[i]->SetChat(this, time);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
// Parts below aren't there in VC, they're in somewhere else.
|
||||||
|
if (!CGame::noProstitutes && m_nPedType == PEDTYPE_PROSTITUTE && CharCreatedBy != MISSION_CHAR
|
||||||
|
&& m_objectiveTimer < CTimer::GetTimeInMilliseconds() && !CTheScripts::IsPlayerOnAMission()) {
|
||||||
|
|
||||||
|
CVector pos = GetPosition();
|
||||||
|
int16 lastVehicle;
|
||||||
|
CEntity* vehicles[8];
|
||||||
|
CWorld::FindObjectsInRange(pos, 15.0f, true, &lastVehicle, 6, vehicles, false, true, false, false, false);
|
||||||
|
|
||||||
|
for (int i = 0; i < lastVehicle; i++) {
|
||||||
|
CVehicle* veh = (CVehicle*)vehicles[i];
|
||||||
|
|
||||||
|
if (veh->IsVehicleNormal()) {
|
||||||
|
if (veh->IsCar()) {
|
||||||
|
if ((GetPosition() - veh->GetPosition()).Magnitude() < 5.0f && veh->IsRoomForPedToLeaveCar(CAR_DOOR_LF, nil)) {
|
||||||
|
SetObjective(OBJECTIVE_SOLICIT, veh);
|
||||||
|
Say(SOUND_PED_SOLICIT);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (m_nPedType == PEDTYPE_CIVMALE || m_nPedType == PEDTYPE_CIVFEMALE) {
|
||||||
|
CVector pos = GetPosition();
|
||||||
|
int16 lastVehicle;
|
||||||
|
CEntity* vehicles[8];
|
||||||
|
CWorld::FindObjectsInRange(pos, 15.0f, true, &lastVehicle, 6, vehicles, false, true, false, false, false);
|
||||||
|
|
||||||
|
for (int i = 0; i < lastVehicle; i++) {
|
||||||
|
CVehicle* veh = (CVehicle*)vehicles[i];
|
||||||
|
|
||||||
|
if (veh->m_modelIndex == MI_MRWHOOP) {
|
||||||
|
if (veh->m_status != STATUS_ABANDONED && veh->m_status != STATUS_WRECKED) {
|
||||||
|
if ((GetPosition() - veh->GetPosition()).Magnitude() < 5.0f) {
|
||||||
|
SetObjective(OBJECTIVE_BUY_ICE_CREAM, veh);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32
|
||||||
|
CPed::ScanForThreats(void)
|
||||||
|
{
|
||||||
|
int fearFlags = m_fearFlags;
|
||||||
|
CVector ourPos = GetPosition();
|
||||||
|
float closestPedDist = 60.0f;
|
||||||
|
CVector2D explosionPos = GetPosition();
|
||||||
|
if (fearFlags & PED_FLAG_EXPLOSION && CheckForExplosions(explosionPos)) {
|
||||||
|
m_eventOrThreat = explosionPos;
|
||||||
|
return PED_FLAG_EXPLOSION;
|
||||||
|
}
|
||||||
|
|
||||||
|
CPed *shooter = nil;
|
||||||
|
if ((fearFlags & PED_FLAG_GUN) && (shooter = CheckForGunShots()) && (m_nPedType != shooter->m_nPedType || m_nPedType == PEDTYPE_CIVMALE || m_nPedType == PEDTYPE_CIVFEMALE)) {
|
||||||
|
if (!IsGangMember()) {
|
||||||
|
m_threatEntity = shooter;
|
||||||
|
m_threatEntity->RegisterReference((CEntity **) &m_threatEntity);
|
||||||
|
return PED_FLAG_GUN;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (CPedType::GetFlag(shooter->m_nPedType) & fearFlags) {
|
||||||
|
m_threatEntity = shooter;
|
||||||
|
m_threatEntity->RegisterReference((CEntity **) &m_threatEntity);
|
||||||
|
return CPedType::GetFlag(shooter->m_nPedType);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
CPed *deadPed = nil;
|
||||||
|
if (fearFlags & PED_FLAG_DEADPEDS && CharCreatedBy != MISSION_CHAR
|
||||||
|
&& (deadPed = CheckForDeadPeds()) != nil && (deadPed->GetPosition() - ourPos).MagnitudeSqr() < 400.0f) {
|
||||||
|
m_pEventEntity = deadPed;
|
||||||
|
m_pEventEntity->RegisterReference((CEntity **) &m_pEventEntity);
|
||||||
|
return PED_FLAG_DEADPEDS;
|
||||||
|
} else {
|
||||||
|
uint32 flagsOfSomePed = 0;
|
||||||
|
|
||||||
|
CPed *pedToFearFrom = nil;
|
||||||
|
#ifndef VC_PED_PORTS
|
||||||
|
for (int i = 0; i < m_numNearPeds; i++) {
|
||||||
|
if (CharCreatedBy != RANDOM_CHAR || m_nearPeds[i]->CharCreatedBy != MISSION_CHAR || m_nearPeds[i]->IsPlayer()) {
|
||||||
|
CPed *nearPed = m_nearPeds[i];
|
||||||
|
|
||||||
|
// BUG: WTF Rockstar?! Putting this here will result in returning the flags of farthest ped to us, since m_nearPeds is sorted by distance.
|
||||||
|
// Fixed at the bottom of the function.
|
||||||
|
flagsOfSomePed = CPedType::GetFlag(nearPed->m_nPedType);
|
||||||
|
|
||||||
|
if (CPedType::GetFlag(nearPed->m_nPedType) & fearFlags) {
|
||||||
|
if (nearPed->m_fHealth > 0.0f && OurPedCanSeeThisOne(m_nearPeds[i])) {
|
||||||
|
// FIX: Taken from VC
|
||||||
|
#ifdef FIX_BUGS
|
||||||
|
float nearPedDistSqr = (nearPed->GetPosition() - ourPos).MagnitudeSqr2D();
|
||||||
|
#else
|
||||||
|
float nearPedDistSqr = (CVector2D(ourPos) - explosionPos).MagnitudeSqr();
|
||||||
|
#endif
|
||||||
|
if (sq(closestPedDist) > nearPedDistSqr) {
|
||||||
|
closestPedDist = Sqrt(nearPedDistSqr);
|
||||||
|
pedToFearFrom = m_nearPeds[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
bool weSawOurEnemy = false;
|
||||||
|
bool weMaySeeOurEnemy = false;
|
||||||
|
float closestEnemyDist = 60.0f;
|
||||||
|
if ((CTimer::GetFrameCounter() + (uint8)m_randomSeed + 16) & 4) {
|
||||||
|
|
||||||
|
for (int i = 0; i < m_numNearPeds; ++i) {
|
||||||
|
if (CharCreatedBy == RANDOM_CHAR && m_nearPeds[i]->CharCreatedBy == MISSION_CHAR && !m_nearPeds[i]->IsPlayer()) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// BUG: Explained at the same occurence of this bug above. Fixed at the bottom of the function.
|
||||||
|
flagsOfSomePed = CPedType::GetFlag(m_nearPeds[i]->m_nPedType);
|
||||||
|
|
||||||
|
if (flagsOfSomePed & fearFlags) {
|
||||||
|
if (m_nearPeds[i]->m_fHealth > 0.0f) {
|
||||||
|
|
||||||
|
// VC also has ability to include objects to line of sight check here (via last bit of flagsL)
|
||||||
|
if (OurPedCanSeeThisOne(m_nearPeds[i])) {
|
||||||
|
if (m_nearPeds[i]->m_nPedState == PED_ATTACK) {
|
||||||
|
if (m_nearPeds[i]->m_pedInObjective == this) {
|
||||||
|
|
||||||
|
float enemyDistSqr = (m_nearPeds[i]->GetPosition() - ourPos).MagnitudeSqr2D();
|
||||||
|
if (sq(closestEnemyDist) > enemyDistSqr) {
|
||||||
|
float enemyDist = Sqrt(enemyDistSqr);
|
||||||
|
weSawOurEnemy = true;
|
||||||
|
closestPedDist = enemyDist;
|
||||||
|
closestEnemyDist = enemyDist;
|
||||||
|
pedToFearFrom = m_nearPeds[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
float nearPedDistSqr = (m_nearPeds[i]->GetPosition() - ourPos).MagnitudeSqr2D();
|
||||||
|
if (sq(closestPedDist) > nearPedDistSqr && !weSawOurEnemy) {
|
||||||
|
closestPedDist = Sqrt(nearPedDistSqr);
|
||||||
|
pedToFearFrom = m_nearPeds[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (!weSawOurEnemy) {
|
||||||
|
CPed *nearPed = m_nearPeds[i];
|
||||||
|
if (nearPed->m_nPedState == PED_ATTACK) {
|
||||||
|
CColPoint foundCol;
|
||||||
|
CEntity *foundEnt;
|
||||||
|
|
||||||
|
// We don't see him yet but he's behind a ped, vehicle or object
|
||||||
|
// VC also has ability to include objects to line of sight check here (via last bit of flagsL)
|
||||||
|
if (!CWorld::ProcessLineOfSight(ourPos, nearPed->GetPosition(), foundCol, foundEnt,
|
||||||
|
true, false, false, false, false, false, false)) {
|
||||||
|
|
||||||
|
if (nearPed->m_pedInObjective == this) {
|
||||||
|
float enemyDistSqr = (m_nearPeds[i]->GetPosition() - ourPos).MagnitudeSqr2D();
|
||||||
|
if (sq(closestEnemyDist) > enemyDistSqr) {
|
||||||
|
float enemyDist = Sqrt(enemyDistSqr);
|
||||||
|
weMaySeeOurEnemy = true;
|
||||||
|
closestPedDist = enemyDist;
|
||||||
|
closestEnemyDist = enemyDist;
|
||||||
|
pedToFearFrom = m_nearPeds[i];
|
||||||
|
}
|
||||||
|
} else if (!nearPed->GetWeapon()->IsTypeMelee() && !weMaySeeOurEnemy) {
|
||||||
|
float nearPedDistSqr = (m_nearPeds[i]->GetPosition() - ourPos).MagnitudeSqr2D();
|
||||||
|
if (sq(closestPedDist) > nearPedDistSqr) {
|
||||||
|
weMaySeeOurEnemy = true;
|
||||||
|
closestPedDist = Sqrt(nearPedDistSqr);
|
||||||
|
pedToFearFrom = m_nearPeds[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
int16 lastVehicle;
|
||||||
|
CEntity* vehicles[8];
|
||||||
|
CWorld::FindObjectsInRange(ourPos, 20.0f, true, &lastVehicle, 6, vehicles, false, true, false, false, false);
|
||||||
|
CVehicle* foundVeh = nil;
|
||||||
|
for (int i = 0; i < lastVehicle; i++) {
|
||||||
|
CVehicle* nearVeh = (CVehicle*)vehicles[i];
|
||||||
|
|
||||||
|
CPed *driver = nearVeh->pDriver;
|
||||||
|
if (driver) {
|
||||||
|
|
||||||
|
// BUG: Same bug as above. Fixed at the bottom of function.
|
||||||
|
flagsOfSomePed = CPedType::GetFlag(driver->m_nPedType);
|
||||||
|
if (CPedType::GetFlag(driver->m_nPedType) & fearFlags) {
|
||||||
|
if (driver->m_fHealth > 0.0f && OurPedCanSeeThisOne(nearVeh->pDriver)) {
|
||||||
|
// FIX: Taken from VC
|
||||||
|
#ifdef FIX_BUGS
|
||||||
|
float driverDistSqr = (driver->GetPosition() - ourPos).MagnitudeSqr2D();
|
||||||
|
#else
|
||||||
|
float driverDistSqr = (CVector2D(ourPos) - explosionPos).MagnitudeSqr();
|
||||||
|
#endif
|
||||||
|
if (sq(closestPedDist) > driverDistSqr) {
|
||||||
|
closestPedDist = Sqrt(driverDistSqr);
|
||||||
|
pedToFearFrom = nearVeh->pDriver;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
m_threatEntity = pedToFearFrom;
|
||||||
|
if (m_threatEntity)
|
||||||
|
m_threatEntity->RegisterReference((CEntity **) &m_threatEntity);
|
||||||
|
|
||||||
|
#ifdef FIX_BUGS
|
||||||
|
if (pedToFearFrom)
|
||||||
|
flagsOfSomePed = CPedType::GetFlag(((CPed*)m_threatEntity)->m_nPedType);
|
||||||
|
else
|
||||||
|
flagsOfSomePed = 0;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return flagsOfSomePed;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
class CPed_ : public CPed
|
class CPed_ : public CPed
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@ -15451,4 +15790,6 @@ STARTPATCHES
|
|||||||
InjectHook(0x4D6620, &CPed::SetSolicit, PATCH_JUMP);
|
InjectHook(0x4D6620, &CPed::SetSolicit, PATCH_JUMP);
|
||||||
InjectHook(0x4D2EA0, &CPed::SetFollowPath, PATCH_JUMP);
|
InjectHook(0x4D2EA0, &CPed::SetFollowPath, PATCH_JUMP);
|
||||||
InjectHook(0x4E1010, &CPed::SetExitCar, PATCH_JUMP);
|
InjectHook(0x4E1010, &CPed::SetExitCar, PATCH_JUMP);
|
||||||
|
InjectHook(0x4C5FE0, &CPed::ScanForThreats, PATCH_JUMP);
|
||||||
|
InjectHook(0x4C6C10, &CPed::ScanForInterestingStuff, PATCH_JUMP);
|
||||||
ENDPATCHES
|
ENDPATCHES
|
@ -669,7 +669,7 @@ public:
|
|||||||
bool PlacePedOnDryLand(void);
|
bool PlacePedOnDryLand(void);
|
||||||
bool PossiblyFindBetterPosToSeekCar(CVector*, CVehicle*);
|
bool PossiblyFindBetterPosToSeekCar(CVector*, CVehicle*);
|
||||||
void UpdateFromLeader(void);
|
void UpdateFromLeader(void);
|
||||||
int ScanForThreats(void);
|
uint32 ScanForThreats(void);
|
||||||
void SetEnterCar(CVehicle*, uint32);
|
void SetEnterCar(CVehicle*, uint32);
|
||||||
bool WarpPedToNearEntityOffScreen(CEntity*);
|
bool WarpPedToNearEntityOffScreen(CEntity*);
|
||||||
void SetExitCar(CVehicle*, uint32);
|
void SetExitCar(CVehicle*, uint32);
|
||||||
@ -678,6 +678,7 @@ public:
|
|||||||
void SetEnterTrain(CVehicle*, uint32);
|
void SetEnterTrain(CVehicle*, uint32);
|
||||||
void SetEnterCar_AllClear(CVehicle*, uint32, uint32);
|
void SetEnterCar_AllClear(CVehicle*, uint32, uint32);
|
||||||
void SetSolicit(uint32 time);
|
void SetSolicit(uint32 time);
|
||||||
|
void ScanForInterestingStuff(void);
|
||||||
|
|
||||||
// Static methods
|
// Static methods
|
||||||
static CVector GetLocalPositionToOpenCarDoor(CVehicle *veh, uint32 component, float offset);
|
static CVector GetLocalPositionToOpenCarDoor(CVehicle *veh, uint32 component, float offset);
|
||||||
|
@ -637,6 +637,7 @@ void CHud::Draw()
|
|||||||
/*
|
/*
|
||||||
DrawOnScreenTimer
|
DrawOnScreenTimer
|
||||||
*/
|
*/
|
||||||
|
|
||||||
wchar sTimer[16];
|
wchar sTimer[16];
|
||||||
|
|
||||||
if (!CUserDisplay::OnscnTimer.m_sEntries[0].m_bTimerProcessed)
|
if (!CUserDisplay::OnscnTimer.m_sEntries[0].m_bTimerProcessed)
|
||||||
@ -697,7 +698,7 @@ void CHud::Draw()
|
|||||||
if (CTimer::GetFrameCounter() & 4 || !CounterFlashTimer) {
|
if (CTimer::GetFrameCounter() & 4 || !CounterFlashTimer) {
|
||||||
if (CUserDisplay::OnscnTimer.m_sEntries[0].m_nType) {
|
if (CUserDisplay::OnscnTimer.m_sEntries[0].m_nType) {
|
||||||
CSprite2d::DrawRect(CRect(SCREEN_SCALE_FROM_RIGHT(27.0f) - SCREEN_SCALE_X(100.0f) / 2 + SCREEN_SCALE_X(4.0f), SCREEN_SCALE_Y(132.0f) + SCREEN_SCALE_Y(8.0f), SCREEN_SCALE_FROM_RIGHT(27.0f) + SCREEN_SCALE_X(4.0f), SCREEN_SCALE_Y(132.0f) + SCREEN_SCALE_Y(11.0f) + SCREEN_SCALE_Y(8.0f)), CRGBA(0, 106, 164, 80));
|
CSprite2d::DrawRect(CRect(SCREEN_SCALE_FROM_RIGHT(27.0f) - SCREEN_SCALE_X(100.0f) / 2 + SCREEN_SCALE_X(4.0f), SCREEN_SCALE_Y(132.0f) + SCREEN_SCALE_Y(8.0f), SCREEN_SCALE_FROM_RIGHT(27.0f) + SCREEN_SCALE_X(4.0f), SCREEN_SCALE_Y(132.0f) + SCREEN_SCALE_Y(11.0f) + SCREEN_SCALE_Y(8.0f)), CRGBA(0, 106, 164, 80));
|
||||||
CSprite2d::DrawRect(CRect(SCREEN_SCALE_FROM_RIGHT(27.0f) - SCREEN_SCALE_X(100.0f) / 2 + SCREEN_SCALE_X(4.0f), SCREEN_SCALE_Y(132.0f) + SCREEN_SCALE_Y(8.0f), SCREEN_SCALE_X(atoi(CUserDisplay::OnscnTimer.m_sEntries[0].m_bCounterBuffer)) / 2 + SCREEN_SCALE_FROM_RIGHT(27.0f) - SCREEN_SCALE_X(100.0f) / 2 + SCREEN_SCALE_X(4.0f), SCREEN_SCALE_Y(132.0f) + SCREEN_SCALE_Y(11.0f) + SCREEN_SCALE_Y(8.0f)), CRGBA(0, 106, 164, 255));
|
CSprite2d::DrawRect(CRect(SCREEN_SCALE_FROM_RIGHT(27.0f) - SCREEN_SCALE_X(100.0f) / 2 + SCREEN_SCALE_X(4.0f), SCREEN_SCALE_Y(132.0f) + SCREEN_SCALE_Y(8.0f), SCREEN_SCALE_X(atoi(CUserDisplay::OnscnTimer.m_sEntries[0].m_bCounterBuffer)) / 2 + SCREEN_SCALE_FROM_RIGHT(27.0f + 50.0f) + SCREEN_SCALE_X(4.0f), SCREEN_SCALE_Y(132.0f) + SCREEN_SCALE_Y(11.0f) + SCREEN_SCALE_Y(8.0f)), CRGBA(0, 106, 164, 255));
|
||||||
} else {
|
} else {
|
||||||
AsciiToUnicode(CUserDisplay::OnscnTimer.m_sEntries[0].m_bCounterBuffer, sTimer);
|
AsciiToUnicode(CUserDisplay::OnscnTimer.m_sEntries[0].m_bCounterBuffer, sTimer);
|
||||||
CFont::SetPropOn();
|
CFont::SetPropOn();
|
||||||
|
@ -12,6 +12,10 @@
|
|||||||
#include "ParticleObject.h"
|
#include "ParticleObject.h"
|
||||||
#include "Particle.h"
|
#include "Particle.h"
|
||||||
|
|
||||||
|
#ifndef MASTER
|
||||||
|
bool CParticle::bEnableBannedParticles = false;
|
||||||
|
#endif
|
||||||
|
|
||||||
#define MAX_PARTICLES_ON_SCREEN (1000)
|
#define MAX_PARTICLES_ON_SCREEN (1000)
|
||||||
|
|
||||||
|
|
||||||
@ -768,7 +772,9 @@ CParticle *CParticle::AddParticle(tParticleType type, CVector const &vecPos, CVe
|
|||||||
{
|
{
|
||||||
if ( CTimer::GetIsPaused() )
|
if ( CTimer::GetIsPaused() )
|
||||||
return NULL;
|
return NULL;
|
||||||
|
#ifndef MASTER
|
||||||
|
if(!bEnableBannedParticles)
|
||||||
|
#endif
|
||||||
if ( ( type == PARTICLE_ENGINE_SMOKE
|
if ( ( type == PARTICLE_ENGINE_SMOKE
|
||||||
|| type == PARTICLE_ENGINE_SMOKE2
|
|| type == PARTICLE_ENGINE_SMOKE2
|
||||||
|| type == PARTICLE_ENGINE_STEAM
|
|| type == PARTICLE_ENGINE_STEAM
|
||||||
@ -1456,6 +1462,9 @@ void CParticle::Render()
|
|||||||
|
|
||||||
tParticleType type = psystem->m_Type;
|
tParticleType type = psystem->m_Type;
|
||||||
|
|
||||||
|
#ifndef MASTER
|
||||||
|
if (!bEnableBannedParticles)
|
||||||
|
#endif
|
||||||
if ( type == PARTICLE_ENGINE_SMOKE
|
if ( type == PARTICLE_ENGINE_SMOKE
|
||||||
|| type == PARTICLE_ENGINE_SMOKE2
|
|| type == PARTICLE_ENGINE_SMOKE2
|
||||||
|| type == PARTICLE_ENGINE_STEAM
|
|| type == PARTICLE_ENGINE_STEAM
|
||||||
|
@ -97,6 +97,9 @@ public:
|
|||||||
static void AddJetExplosion(CVector const &vecPos, float fPower, float fSize);
|
static void AddJetExplosion(CVector const &vecPos, float fPower, float fSize);
|
||||||
static void AddYardieDoorSmoke(CVector const &vecPos, CMatrix const &matMatrix);
|
static void AddYardieDoorSmoke(CVector const &vecPos, CMatrix const &matMatrix);
|
||||||
|
|
||||||
|
#ifndef MASTER
|
||||||
|
static bool bEnableBannedParticles;
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
VALIDATE_SIZE(CParticle, 0x68);
|
VALIDATE_SIZE(CParticle, 0x68);
|
Loading…
Reference in New Issue
Block a user