mirror of
https://github.com/GTAmodding/re3.git
synced 2024-12-29 10:35:43 +00:00
CPed and CCivilianPed funcs done
This commit is contained in:
parent
288f99d507
commit
dbc458a4d7
7 changed files with 714 additions and 428 deletions
|
@ -351,6 +351,18 @@ enum
|
||||||
MI_BLOODRA,
|
MI_BLOODRA,
|
||||||
MI_BLOODRB,
|
MI_BLOODRB,
|
||||||
MI_VICECHEE,
|
MI_VICECHEE,
|
||||||
|
// 3 available vehicle slots in here
|
||||||
|
MI_LAST_VEHICLE = 239,
|
||||||
|
|
||||||
|
MI_CAR_DOOR = 240,
|
||||||
|
MI_CAR_BUMPER,
|
||||||
|
MI_CAR_PANEL,
|
||||||
|
MI_CAR_BONNET,
|
||||||
|
MI_CAR_BOOT,
|
||||||
|
MI_CAR_WHEEL,
|
||||||
|
MI_BODYPARTA,
|
||||||
|
MI_BODYPARTB,
|
||||||
|
|
||||||
// HACK
|
// HACK
|
||||||
MI_TRAIN = -1,
|
MI_TRAIN = -1,
|
||||||
MI_DODO = -2,
|
MI_DODO = -2,
|
||||||
|
@ -398,15 +410,6 @@ enum
|
||||||
MI_CUTOBJ04,
|
MI_CUTOBJ04,
|
||||||
MI_CUTOBJ05,
|
MI_CUTOBJ05,
|
||||||
|
|
||||||
MI_CAR_DOOR = 240,
|
|
||||||
MI_CAR_BUMPER,
|
|
||||||
MI_CAR_PANEL,
|
|
||||||
MI_CAR_BONNET,
|
|
||||||
MI_CAR_BOOT,
|
|
||||||
MI_CAR_WHEEL,
|
|
||||||
MI_BODYPARTA,
|
|
||||||
MI_BODYPARTB,
|
|
||||||
|
|
||||||
MI_AIRTRAIN_VLO = 257,
|
MI_AIRTRAIN_VLO = 257,
|
||||||
MI_MOBILE = 258,
|
MI_MOBILE = 258,
|
||||||
|
|
||||||
|
|
|
@ -12,13 +12,33 @@
|
||||||
#include "Weather.h"
|
#include "Weather.h"
|
||||||
#include "PedAttractor.h"
|
#include "PedAttractor.h"
|
||||||
#include "Object.h"
|
#include "Object.h"
|
||||||
|
#include "CarCtrl.h"
|
||||||
|
|
||||||
|
#ifndef _WIN32
|
||||||
|
#include <float.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// --MIAMI: Done
|
||||||
CCivilianPed::CCivilianPed(ePedType pedtype, uint32 mi) : CPed(pedtype)
|
CCivilianPed::CCivilianPed(ePedType pedtype, uint32 mi) : CPed(pedtype)
|
||||||
{
|
{
|
||||||
SetModelIndex(mi);
|
SetModelIndex(mi);
|
||||||
for (int i = 0; i < ARRAY_SIZE(m_nearPeds); i++) {
|
for (int i = 0; i < ARRAY_SIZE(m_nearPeds); i++) {
|
||||||
m_nearPeds[i] = nil;
|
m_nearPeds[i] = nil;
|
||||||
}
|
}
|
||||||
|
m_bLookForVacantCars = false;
|
||||||
|
if (pedtype == PEDTYPE_CRIMINAL)
|
||||||
|
m_bLookForVacantCars = true;
|
||||||
|
|
||||||
|
m_nLookForVacantCarsCounter = 0;
|
||||||
|
m_bJustStoleACar = false;
|
||||||
|
m_bStealCarEvenIfThereIsSomeoneInIt = false;
|
||||||
|
for (int i = 0; i < ARRAY_SIZE(m_nStealWishList); i++) {
|
||||||
|
uint32 randomCarModel = CGeneral::GetRandomNumberInRange(MI_LANDSTAL, MI_LAST_VEHICLE + 1);
|
||||||
|
if (CModelInfo::IsCarModel(randomCarModel) || CModelInfo::IsBikeModel(randomCarModel))
|
||||||
|
m_nStealWishList[i] = randomCarModel;
|
||||||
|
else
|
||||||
|
m_nStealWishList[i] = MI_CHEETAH;
|
||||||
|
}
|
||||||
m_nAttractorCycleState = 0;
|
m_nAttractorCycleState = 0;
|
||||||
m_bAttractorUnk = (CGeneral::GetRandomNumberInRange(0.0f, 1.0f) < 1.25f);
|
m_bAttractorUnk = (CGeneral::GetRandomNumberInRange(0.0f, 1.0f) < 1.25f);
|
||||||
}
|
}
|
||||||
|
@ -384,7 +404,7 @@ CCivilianPed::ProcessControl(void)
|
||||||
CivilianAI();
|
CivilianAI();
|
||||||
|
|
||||||
if (CharCreatedBy == RANDOM_CHAR) {
|
if (CharCreatedBy == RANDOM_CHAR) {
|
||||||
// TODO(Miami): EnterVacantNearbyCars();
|
EnterVacantNearbyCars();
|
||||||
UseNearbyAttractors();
|
UseNearbyAttractors();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -483,3 +503,83 @@ bool CCivilianPed::IsAttractedTo(int8 type)
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// --MIAMI: Done
|
||||||
|
void
|
||||||
|
CCivilianPed::EnterVacantNearbyCars(void)
|
||||||
|
{
|
||||||
|
if (!m_bLookForVacantCars)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (m_bJustStoleACar && bInVehicle && m_carInObjective == m_pMyVehicle) {
|
||||||
|
m_bJustStoleACar = false;
|
||||||
|
m_pMyVehicle->SetStatus(STATUS_PHYSICS);
|
||||||
|
m_pMyVehicle->AutoPilot.m_nCarMission = MISSION_CRUISE;
|
||||||
|
m_pMyVehicle->AutoPilot.m_nCruiseSpeed = 10;
|
||||||
|
m_pMyVehicle->bEngineOn = true;
|
||||||
|
|
||||||
|
} else if (!bHasAlreadyStoleACar) {
|
||||||
|
if (m_nLookForVacantCarsCounter == 8) {
|
||||||
|
m_nLookForVacantCarsCounter = 0;
|
||||||
|
if (IsPedInControl() && m_objective == OBJECTIVE_NONE) {
|
||||||
|
|
||||||
|
CVehicle *foundCar = nil;
|
||||||
|
float closestDist = FLT_MAX;
|
||||||
|
int minX = CWorld::GetSectorIndexX(GetPosition().x - 10.0f);
|
||||||
|
if (minX < 0) minX = 0;
|
||||||
|
int minY = CWorld::GetSectorIndexY(GetPosition().y - 10.0f);
|
||||||
|
if (minY < 0) minY = 0;
|
||||||
|
int maxX = CWorld::GetSectorIndexX(GetPosition().x + 10.0f);
|
||||||
|
if (maxX > NUMSECTORS_X - 1) maxX = NUMSECTORS_X - 1;
|
||||||
|
int maxY = CWorld::GetSectorIndexY(GetPosition().y + 10.0f);
|
||||||
|
if (maxY > NUMSECTORS_Y - 1) maxY = NUMSECTORS_Y - 1;
|
||||||
|
|
||||||
|
for (int curY = minY; curY <= maxY; curY++) {
|
||||||
|
for (int curX = minX; curX <= maxX; curX++) {
|
||||||
|
CSector* sector = CWorld::GetSector(curX, curY);
|
||||||
|
for (CPtrNode* node = sector->m_lists[ENTITYLIST_VEHICLES].first; node; node = node->next) {
|
||||||
|
CVehicle* veh = (CVehicle*)node->item;
|
||||||
|
if (veh && veh->IsCar()) {
|
||||||
|
|
||||||
|
// Looks like PARKED_VEHICLE condition isn't there in Mobile.
|
||||||
|
if (veh->VehicleCreatedBy == RANDOM_VEHICLE || veh->VehicleCreatedBy == PARKED_VEHICLE) {
|
||||||
|
if (IsOnStealWishList(veh->GetModelIndex()) && !veh->IsLawEnforcementVehicle()
|
||||||
|
&& (m_bStealCarEvenIfThereIsSomeoneInIt || !veh->pDriver && !veh->m_nNumPassengers)
|
||||||
|
&& !veh->m_nNumGettingIn && !veh->m_nGettingInFlags && !veh->m_nGettingOutFlags
|
||||||
|
&& !veh->m_pCarFire && veh->m_fHealth > 800.0f
|
||||||
|
&& !veh->IsUpsideDown() && !veh->IsOnItsSide() && veh->CanPedEnterCar()) {
|
||||||
|
float dist = (GetPosition() - veh->GetPosition()).MagnitudeSqr();
|
||||||
|
if (dist < sq(10.0f) && dist < closestDist && veh->IsClearToDriveAway()) {
|
||||||
|
foundCar = veh;
|
||||||
|
closestDist = dist;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (foundCar) {
|
||||||
|
m_bJustStoleACar = true;
|
||||||
|
bHasAlreadyStoleACar = true;
|
||||||
|
CCarCtrl::JoinCarWithRoadSystem(foundCar);
|
||||||
|
SetObjective(OBJECTIVE_ENTER_CAR_AS_DRIVER, foundCar);
|
||||||
|
SetObjectiveTimer(10000);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
++m_nLookForVacantCarsCounter;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
CCivilianPed::IsOnStealWishList(int32 model)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < ARRAY_SIZE(m_nStealWishList); i++) {
|
||||||
|
if (model == m_nStealWishList[i]) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
|
@ -4,6 +4,11 @@
|
||||||
|
|
||||||
class CCivilianPed : public CPed
|
class CCivilianPed : public CPed
|
||||||
{
|
{
|
||||||
|
bool m_bLookForVacantCars;
|
||||||
|
uint32 m_nLookForVacantCarsCounter;
|
||||||
|
bool m_bStealCarEvenIfThereIsSomeoneInIt; // unused
|
||||||
|
bool m_bJustStoleACar;
|
||||||
|
uint32 m_nStealWishList[16];
|
||||||
bool m_bAttractorUnk;
|
bool m_bAttractorUnk;
|
||||||
int32 m_nAttractorCycleState;
|
int32 m_nAttractorCycleState;
|
||||||
public:
|
public:
|
||||||
|
@ -15,6 +20,8 @@ public:
|
||||||
void UseNearbyAttractors(void);
|
void UseNearbyAttractors(void);
|
||||||
void FindNearbyAttractorsSectorList(CPtrList&, float&, C2dEffect*&, CEntity*&);
|
void FindNearbyAttractorsSectorList(CPtrList&, float&, C2dEffect*&, CEntity*&);
|
||||||
bool IsAttractedTo(int8);
|
bool IsAttractedTo(int8);
|
||||||
|
void EnterVacantNearbyCars(void);
|
||||||
|
bool IsOnStealWishList(int32);
|
||||||
};
|
};
|
||||||
#ifndef PED_SKIN
|
#ifndef PED_SKIN
|
||||||
VALIDATE_SIZE(CCivilianPed, 0x53C);
|
VALIDATE_SIZE(CCivilianPed, 0x53C);
|
||||||
|
|
771
src/peds/Ped.cpp
771
src/peds/Ped.cpp
File diff suppressed because it is too large
Load diff
|
@ -458,7 +458,7 @@ public:
|
||||||
uint32 bTurnedAroundOnAttractor : 1;
|
uint32 bTurnedAroundOnAttractor : 1;
|
||||||
|
|
||||||
uint32 bHasAlreadyUsedAttractor : 1;
|
uint32 bHasAlreadyUsedAttractor : 1;
|
||||||
uint32 b155_2 : 1;
|
uint32 bHasAlreadyStoleACar : 1;
|
||||||
uint32 bCarPassenger : 1;
|
uint32 bCarPassenger : 1;
|
||||||
uint32 bFleeWhenStanding : 1;
|
uint32 bFleeWhenStanding : 1;
|
||||||
uint32 bGotUpOfMyOwnAccord : 1;
|
uint32 bGotUpOfMyOwnAccord : 1;
|
||||||
|
@ -468,7 +468,7 @@ public:
|
||||||
|
|
||||||
uint32 bIsDrowning : 1;
|
uint32 bIsDrowning : 1;
|
||||||
uint32 bDrownsInWater : 1;
|
uint32 bDrownsInWater : 1;
|
||||||
uint32 b156_4 : 1;
|
uint32 bWaitForLeaderToComeCloser : 1;
|
||||||
uint32 bHeldHostageInCar : 1;
|
uint32 bHeldHostageInCar : 1;
|
||||||
uint32 bIsPlayerFriend : 1;
|
uint32 bIsPlayerFriend : 1;
|
||||||
uint32 bHeadStuckInCollision : 1;
|
uint32 bHeadStuckInCollision : 1;
|
||||||
|
@ -809,7 +809,6 @@ public:
|
||||||
void GetNearestDoor(CVehicle*, CVector&);
|
void GetNearestDoor(CVehicle*, CVector&);
|
||||||
bool GetNearestPassengerDoor(CVehicle*, CVector&);
|
bool GetNearestPassengerDoor(CVehicle*, CVector&);
|
||||||
int GetNextPointOnRoute(void);
|
int GetNextPointOnRoute(void);
|
||||||
uint8 GetPedRadioCategory(uint32);
|
|
||||||
int GetWeaponSlot(eWeaponType);
|
int GetWeaponSlot(eWeaponType);
|
||||||
bool CanWeRunAndFireWithWeapon(void);
|
bool CanWeRunAndFireWithWeapon(void);
|
||||||
void GoToNearestDoor(CVehicle*);
|
void GoToNearestDoor(CVehicle*);
|
||||||
|
@ -966,6 +965,8 @@ public:
|
||||||
void Dress(void);
|
void Dress(void);
|
||||||
int32 KillCharOnFootMelee(CVector&, CVector&, CVector&);
|
int32 KillCharOnFootMelee(CVector&, CVector&, CVector&);
|
||||||
int32 KillCharOnFootArmed(CVector&, CVector&, CVector&);
|
int32 KillCharOnFootArmed(CVector&, CVector&, CVector&);
|
||||||
|
void SetLook(CEntity* to);
|
||||||
|
void SetLook(float direction);
|
||||||
|
|
||||||
bool HasWeaponSlot(uint8 slot) { return m_weapons[slot].m_eWeaponType != WEAPONTYPE_UNARMED; }
|
bool HasWeaponSlot(uint8 slot) { return m_weapons[slot].m_eWeaponType != WEAPONTYPE_UNARMED; }
|
||||||
CWeapon& GetWeapon(uint8 slot) { return m_weapons[slot]; }
|
CWeapon& GetWeapon(uint8 slot) { return m_weapons[slot]; }
|
||||||
|
|
|
@ -16,7 +16,7 @@ enum ePedType
|
||||||
PEDTYPE_GANG4,
|
PEDTYPE_GANG4,
|
||||||
PEDTYPE_GANG5,
|
PEDTYPE_GANG5,
|
||||||
PEDTYPE_GANG6,
|
PEDTYPE_GANG6,
|
||||||
PEDTYPE_GANG7,
|
PEDTYPE_GANG7, // Vercetti gang
|
||||||
PEDTYPE_GANG8,
|
PEDTYPE_GANG8,
|
||||||
PEDTYPE_GANG9,
|
PEDTYPE_GANG9,
|
||||||
PEDTYPE_EMERGENCY,
|
PEDTYPE_EMERGENCY,
|
||||||
|
|
|
@ -134,7 +134,23 @@ public:
|
||||||
void ReduceHornCounter(void);
|
void ReduceHornCounter(void);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// These functions and function names are made up
|
||||||
|
|
||||||
inline int8 GetBikeDoorFlag(int32 carnode) {
|
inline int8 GetBikeDoorFlag(int32 carnode) {
|
||||||
|
switch (carnode) {
|
||||||
|
case CAR_DOOR_RR:
|
||||||
|
case CAR_DOOR_LR:
|
||||||
|
return CAR_DOOR_FLAG_RR | CAR_DOOR_FLAG_LR;
|
||||||
|
case CAR_DOOR_RF:
|
||||||
|
case CAR_DOOR_LF:
|
||||||
|
return CAR_DOOR_FLAG_RF | CAR_DOOR_FLAG_LF;
|
||||||
|
default:
|
||||||
|
return CAR_DOOR_FLAG_UNKNOWN;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// for m_nGettingOutFlags
|
||||||
|
inline int8 GetBikeDoorFlagInclJumpInFromFront(int32 carnode) {
|
||||||
switch (carnode) {
|
switch (carnode) {
|
||||||
case CAR_DOOR_RR:
|
case CAR_DOOR_RR:
|
||||||
case CAR_DOOR_LR:
|
case CAR_DOOR_LR:
|
||||||
|
|
Loading…
Reference in a new issue