summaryrefslogtreecommitdiff
path: root/src/control
diff options
context:
space:
mode:
authoraap <aap@papnet.eu>2019-07-10 15:06:08 +0200
committerGitHub <noreply@github.com>2019-07-10 15:06:08 +0200
commit80e0409d6a1bfd002b98af8d598ec940b6d6facb (patch)
tree5e0a6dcdbf8f1566974c0514986ab7b61e5c067a /src/control
parentb14be6697bd609bfd957576047754cabd8cd3019 (diff)
parent2ef5e4cd662d642b839a9e65b3176335c6b50448 (diff)
Merge pull request #128 from erorcun/erorcun
Phone start, ped spinning and cop car fix, and some love to CPed
Diffstat (limited to 'src/control')
-rw-r--r--src/control/Phones.cpp37
-rw-r--r--src/control/Phones.h28
2 files changed, 65 insertions, 0 deletions
diff --git a/src/control/Phones.cpp b/src/control/Phones.cpp
index fa4f83e5..1d3a9777 100644
--- a/src/control/Phones.cpp
+++ b/src/control/Phones.cpp
@@ -2,5 +2,42 @@
#include "patcher.h"
#include "Phones.h"
+CPhoneInfo &gPhoneInfo = * (CPhoneInfo*) * (uintptr*)0x732A20;
+
+int
+CPhoneInfo::FindNearestFreePhone(CVector *pos)
+{
+ int nearestPhoneId = -1;
+ float nearestPhoneDist = 60.0f;
+
+ for (int phoneId = 0; phoneId < m_nMax; phoneId++) {
+
+ if (gPhoneInfo.m_aPhones[phoneId].m_nState == 0) {
+ float phoneDist = (m_aPhones[phoneId].m_vecPos - *pos).Magnitude2D();
+
+ if (phoneDist < nearestPhoneDist) {
+ nearestPhoneDist = phoneDist;
+ nearestPhoneId = phoneId;
+ }
+ }
+ }
+ return nearestPhoneId;
+}
+
+bool
+CPhoneInfo::PhoneAtThisPosition(CVector pos)
+{
+ for (int phoneId = 0; phoneId < m_nMax; phoneId++) {
+ if (pos.x == m_aPhones[phoneId].m_vecPos.x && pos.y == m_aPhones[phoneId].m_vecPos.y)
+ return true;
+ }
+ return false;
+}
+
+STARTPATCHES
+ InjectHook(0x42F720, &CPhoneInfo::FindNearestFreePhone, PATCH_JUMP);
+ InjectHook(0x42FD50, &CPhoneInfo::PhoneAtThisPosition, PATCH_JUMP);
+ENDPATCHES
+
WRAPPER void PhonePutDownCB(CAnimBlendAssociation *assoc, void *arg) { EAXJMP(0x42F570); }
WRAPPER void PhonePickUpCB(CAnimBlendAssociation *assoc, void *arg) { EAXJMP(0x42F470); }
diff --git a/src/control/Phones.h b/src/control/Phones.h
index a29043ed..7ac34c3a 100644
--- a/src/control/Phones.h
+++ b/src/control/Phones.h
@@ -1,6 +1,34 @@
#pragma once
+#include "Physical.h"
#include "AnimBlendAssociation.h"
+struct CPhone
+{
+ CVector m_vecPos;
+ uint16 *m_apMessages[6];
+ int32 field_24;
+ CEntity *m_pEntity;
+ int32 m_nState;
+ uint8 field_30;
+};
+
+static_assert(sizeof(CPhone) == 0x34, "CPhone: error");
+
+class CPhoneInfo {
+public:
+ int32 m_nMax;
+ int32 m_nNum;
+ CPhone m_aPhones[50];
+
+ CPhoneInfo() { }
+ ~CPhoneInfo() { }
+
+ int FindNearestFreePhone(CVector*);
+ bool PhoneAtThisPosition(CVector);
+};
+
+extern CPhoneInfo &gPhoneInfo;
+
void PhonePutDownCB(CAnimBlendAssociation *assoc, void *arg);
void PhonePickUpCB(CAnimBlendAssociation *assoc, void *arg); \ No newline at end of file