Skip to content
This repository has been archived by the owner. It is now read-only.

PathFind fix and some Peds #243

Merged
merged 1 commit into from Oct 13, 2019
Merged
Changes from all commits
Commits
File filter
Filter file types
Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.

Always

Just for now

PathFind fix and some Peds
  • Loading branch information
erorcun committed Oct 13, 2019
commit 37f0bbc05e87a2a7c0858c6da4a6d51c485fdf64
@@ -9,6 +9,8 @@

CPathFind &ThePaths = *(CPathFind*)0x8F6754;

WRAPPER bool CPedPath::CalcPedRoute(uint8, CVector, CVector, CVector*, int16*, int16) { EAXJMP(0x42E680); }

enum
{
NodeTypeExtern = 1,
@@ -1197,22 +1199,22 @@ CPathFind::FindNextNodeWandering(uint8 type, CVector coors, CPathNode **lastNode
CTreadable *obj = FindRoadObjectClosestToCoors(coors, type);
float nodeDist = 1000000000.0f;
for(i = 0; i < 12; i++){
if(obj->m_nodeIndices[i] < 0)
if(obj->m_nodeIndices[type][i] < 0)
break;
float dist = (coors - m_pathNodes[obj->m_nodeIndices[type][i]].pos).Magnitude2D();
float dist = (coors - m_pathNodes[obj->m_nodeIndices[type][i]].pos).MagnitudeSqr();
if(dist < nodeDist){
nodeDist = dist;
node = &m_pathNodes[obj->m_nodeIndices[type][i]];
}
}
}

CVector2D vCurDir(Cos(curDir*PI/4.0f), Sin(curDir*PI/4.0f));
CVector2D vCurDir(Sin(curDir*PI/4.0f), Cos(curDir * PI / 4.0f));
*nextNode = 0;
float bestDot = -999999.0f;
for(i = 0; i < node->numLinks; i++){
int next = m_connections[node->firstLink+i];
if(node->bDisabled || m_pathNodes[next].bDisabled)
if(!node->bDisabled && m_pathNodes[next].bDisabled)
continue;
CVector pedCoors = coors;
pedCoors.z += 1.0f;
@@ -1221,9 +1223,9 @@ CPathFind::FindNextNodeWandering(uint8 type, CVector coors, CPathNode **lastNode
if(!CWorld::GetIsLineOfSightClear(pedCoors, nodeCoors, true, false, false, false, false, false))
continue;
CVector2D nodeDir = m_pathNodes[next].pos - node->pos;
nodeDir /= nodeDir.Magnitude();
nodeDir.Normalise();
float dot = DotProduct2D(nodeDir, vCurDir);
if(dot > bestDot){
if(dot >= bestDot){
*nextNode = &m_pathNodes[next];
bestDot = dot;

@@ -4,6 +4,11 @@

class CVehicle;

class CPedPath {
public:
static bool CalcPedRoute(uint8, CVector, CVector, CVector*, int16*, int16);
};

enum
{
PATH_CAR = 0,
@@ -53,7 +53,6 @@
WRAPPER void CPed::SpawnFlyingComponent(int, int8) { EAXJMP(0x4EB060); }
WRAPPER void CPed::SetPedPositionInCar(void) { EAXJMP(0x4D4970); }
WRAPPER void CPed::SetMoveAnim(void) { EAXJMP(0x4C5A40); }
WRAPPER void CPed::SetFollowPath(CVector) { EAXJMP(0x4D2EA0); }
WRAPPER void CPed::StartFightDefend(uint8, uint8, uint8) { EAXJMP(0x4E7780); }
WRAPPER void CPed::ServiceTalking(void) { EAXJMP(0x4E5870); }
WRAPPER void CPed::UpdatePosition(void) { EAXJMP(0x4C7A00); }
@@ -14879,6 +14878,37 @@ CPed::SetSolicit(uint32 time)
}
}

bool
CPed::SetFollowPath(CVector dest)
{
if (m_nPedState == PED_FOLLOW_PATH)
return false;

if (FindPlayerPed() != this)
return false;

if ((dest - GetPosition()).Magnitude() <= 2.0f)
return false;

CVector pointPoses[7];
int16 pointsFound;
CPedPath::CalcPedRoute(0, GetPosition(), dest, pointPoses, &pointsFound, 7);
for(int i = 0; i < pointsFound; i++) {
m_stPathNodeStates[i].x = pointPoses[i].x;
m_stPathNodeStates[i].y = pointPoses[i].y;
}

m_nCurPathNode = 0;
m_nPathNodes = pointsFound;
if (m_nPathNodes < 1)
return false;

SetStoredState();
m_nPedState = PED_FOLLOW_PATH;
SetMoveState(PEDMOVE_WALK);
return true;
}

class CPed_ : public CPed
{
public:
@@ -15092,4 +15122,5 @@ STARTPATCHES
InjectHook(0x4D7BC0, &CPed::SetRadioStation, PATCH_JUMP);
InjectHook(0x4C7FF0, &CPed::ProcessBuoyancy, PATCH_JUMP);
InjectHook(0x4D6620, &CPed::SetSolicit, PATCH_JUMP);
InjectHook(0x4D2EA0, &CPed::SetFollowPath, PATCH_JUMP);
ENDPATCHES
@@ -574,7 +574,7 @@ class CPed : public CPhysical
void SetPointGunAt(CEntity*);
bool Seek(void);
bool SetWanderPath(int8);
void SetFollowPath(CVector);
bool SetFollowPath(CVector);
void ClearAttackByRemovingAnim(void);
void SetStoredState(void);
void StopNonPartialAnims(void);