1#include "Game/LiveActor/SensorHitChecker.hpp"
2#include "Game/Scene/SceneObjHolder.hpp"
3#include "Game/Util.hpp"
6 MR::connectToScene(
this, 5, -1, -1, -1);
9void SensorHitChecker::initGroup(
HitSensor *pSensor) {
10 if (MR::isSensorPlayer(pSensor)) {
11 pSensor->mSensorGroup = mPlayerGroup;
13 else if (MR::isSensorRide(pSensor)) {
14 pSensor->mSensorGroup = mRideGroup;
16 else if (pSensor->isType(0x7F)) {
17 pSensor->mSensorGroup = mRideGroup;
19 else if (pSensor->isType(0x4A) || pSensor->isType(0x4C)
20 || pSensor->isType(0x15) || pSensor->isType(0x47)
21 || pSensor->isType(0x1F) || MR::isSensorRush(pSensor) || MR::isSensorAutoRush(pSensor)) {
22 pSensor->mSensorGroup = mSimpleGroup;
25 if (MR::isSensorMapObj(pSensor)) {
26 pSensor->mSensorGroup = mMapObjGroup;
29 pSensor->mSensorGroup = mCharacterGroup;
34void SensorHitChecker::movement() {
35 mPlayerGroup->clear();
38 mSimpleGroup->clear();
39 mMapObjGroup->clear();
40 mCharacterGroup->clear();
41 doObjColGroup(mPlayerGroup, mCharacterGroup);
42 doObjColGroup(mPlayerGroup, mMapObjGroup);
43 doObjColGroup(mPlayerGroup, mRideGroup);
44 doObjColGroup(mPlayerGroup, mSimpleGroup);
45 doObjColGroup(mPlayerGroup, mEyeGroup);
46 doObjColGroup(mRideGroup, mCharacterGroup);
47 doObjColGroup(mRideGroup, mMapObjGroup);
48 doObjColGroup(mRideGroup, mSimpleGroup);
49 doObjColGroup(mRideGroup, mEyeGroup);
50 doObjColGroup(mEyeGroup, mCharacterGroup);
51 doObjColGroup(mEyeGroup, mMapObjGroup);
52 doObjColGroup(mEyeGroup, mSimpleGroup);
53 doObjColGroup(mCharacterGroup, mMapObjGroup);
54 doObjColInSameGroup(mCharacterGroup);
59 s32 group1SensorCount = pGroup1->mSensorCount;
60 for (s32 i = 0; i < group1SensorCount; i++) {
61 HitSensor* curGroup1Sensor = pGroup1->mSensors[i];
62 bool group1Sensorvalidated =
false;
64 if (curGroup1Sensor->mValidByHost && curGroup1Sensor->mValidBySystem) {
65 group1Sensorvalidated =
true;
68 if (group1Sensorvalidated && !MR::isClipped(curGroup1Sensor->mActor)) {
69 s32 group2SensorCount = pGroup2->mSensorCount;
70 for (s32 x = 0; x < group2SensorCount; x++) {
71 HitSensor* curGroup2Sensor = pGroup2->mSensors[x];
72 bool group2Validated =
false;
74 if (curGroup2Sensor->mValidByHost && curGroup2Sensor->mValidBySystem) {
75 group2Validated =
true;
78 if (group2Validated && !MR::isClipped(curGroup2Sensor->mActor)) {
79 checkAttack(curGroup1Sensor, curGroup2Sensor);
88void SensorHitChecker::doObjColInSameGroup(
SensorGroup *pSensorGroup)
const {
89 s32 sensorGroupCount = pSensorGroup->mSensorCount;
90 for (s32 i = 0; i < sensorGroupCount; i++) {
91 HitSensor* pFirstSensor = pSensorGroup->mSensors[i];
92 bool isFirstSensorValid =
false;
94 if (pFirstSensor->mValidByHost && pFirstSensor->mValidBySystem) {
95 isFirstSensorValid =
true;
98 if (isFirstSensorValid && !MR::isClipped(pFirstSensor->mActor)) {
99 for (s32 x = 0; x < sensorGroupCount; x++) {
100 HitSensor* pSecondSensor = pSensorGroup->mSensors[x];
101 bool isSecondSensorValid =
false;
103 if (pSecondSensor->mValidByHost && pSecondSensor->mValidBySystem) {
104 isSecondSensorValid =
true;
107 if (isSecondSensorValid && !MR::isClipped(pSecondSensor->mActor)) {
108 checkAttack(pFirstSensor, pSecondSensor);
118 if (pSensor1->mActor != pSensor2->mActor) {
119 f32 xPos = pSensor1->mPosition.x - pSensor2->mPosition.x;
120 f32 yPos = pSensor1->mPosition.y - pSensor2->mPosition.y;
121 f32 zPos = pSensor1->mPosition.z - pSensor2->mPosition.z;
122 f32 totalSize = pSensor2->mRadius + pSensor1->mRadius;
124 if (!((((yPos * yPos) + (xPos * xPos)) + (zPos * zPos)) >= (totalSize * totalSize))) {
125 if (!pSensor2->isType(127)) {
126 pSensor1->addHitSensor(pSensor2);
129 if (!pSensor1->isType(127)) {
130 pSensor2->addHitSensor(pSensor1);
138 void initHitSensorGroup(
HitSensor *pSensor) {
139 reinterpret_cast<SensorHitChecker*
>(MR::getSceneObjHolder()->getObj(0))->initGroup(pSensor);
143SensorHitChecker::~SensorHitChecker() {}
145SensorHitChecker::SensorHitChecker(
const char *pName) :
NameObj(pName) {
146 mPlayerGroup =
nullptr;
147 mRideGroup =
nullptr;
149 mSimpleGroup =
nullptr;
150 mMapObjGroup =
nullptr;
151 mCharacterGroup =
nullptr;
158 mCharacterGroup =
new SensorGroup(0x400,
"Character");
161SensorGroup::SensorGroup(
int maxSensors,
const char *a2) {
162 mMaxSensors = maxSensors;
167 for (s32 i = 0; i < mMaxSensors; i++) {
168 mSensors[i] =
nullptr;
172void SensorGroup::add(
HitSensor *pSensor) {
173 mSensors[mSensorCount] = pSensor;
175 pSensor->mSensorGroup =
this;
178void SensorGroup::remove(
HitSensor *pSensor) {
179 for (s32 i = 0; i < mSensorCount; i++) {
180 if (mSensors[i] == pSensor) {
181 u32 count = mSensorCount -1;
182 mSensors[i] = mSensors[count];
189void SensorGroup::clear()
const {
190 for (s32 i = 0; i < mSensorCount; i++) {
191 mSensors[i]->mSensorCount =
nullptr;
The most basic form of an object.
virtual void init(const JMapInfoIter &)
Intializes the NameObj and can set various settings and construct necessary classes.