2023-12-13 00:40:16 -05:00
|
|
|
#include "Game/LiveActor/HitSensor.hpp"
|
|
|
|
|
#include "Game/LiveActor/LiveActor.hpp"
|
|
|
|
|
#include "Game/LiveActor/SensorHitChecker.hpp"
|
2021-11-14 23:09:48 +00:00
|
|
|
|
2021-11-19 11:28:33 -05:00
|
|
|
// fuck this shit, sensorGroupSize is getting turned into a u32 becuase literally nothing else will match
|
|
|
|
|
// whatever
|
|
|
|
|
HitSensor::HitSensor(u32 type, u32 sensorGroupSize, f32 radius, LiveActor *pActor) {
|
2021-11-14 23:09:48 +00:00
|
|
|
mSensorType = type;
|
|
|
|
|
mPosition.x = 0.0f;
|
|
|
|
|
mPosition.y = 0.0f;
|
|
|
|
|
mPosition.z = 0.0f;
|
|
|
|
|
mRadius = radius;
|
|
|
|
|
mSensorCount = 0;
|
2021-11-15 13:38:51 +00:00
|
|
|
mGroupSize = sensorGroupSize;
|
2021-11-14 23:09:48 +00:00
|
|
|
mSensors = 0;
|
2023-02-13 03:33:10 -05:00
|
|
|
mSensorGroup = nullptr;
|
2021-11-14 23:09:48 +00:00
|
|
|
mValidBySystem = false;
|
|
|
|
|
mValidByHost = true;
|
|
|
|
|
mActor = pActor;
|
|
|
|
|
|
2021-11-19 11:28:33 -05:00
|
|
|
if (sensorGroupSize & 0xFFFF) {
|
2021-11-15 13:38:51 +00:00
|
|
|
mSensors = new HitSensor*[sensorGroupSize];
|
2021-11-14 23:09:48 +00:00
|
|
|
|
2021-11-15 13:38:51 +00:00
|
|
|
for (s32 i = 0; i < mGroupSize; i++) {
|
2023-02-13 03:33:10 -05:00
|
|
|
mSensors[i] = nullptr;
|
2021-11-14 23:09:48 +00:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
MR::initHitSensorGroup(this);
|
|
|
|
|
}
|
|
|
|
|
|
2021-11-21 18:04:19 +00:00
|
|
|
bool HitSensor::receiveMessage(u32 msg, HitSensor *pReceiver) {
|
2021-11-14 23:09:48 +00:00
|
|
|
return mActor->receiveMessage(msg, pReceiver, this);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void HitSensor::setType(u32 type) {
|
|
|
|
|
bool wasRemoved = false;
|
|
|
|
|
|
|
|
|
|
mSensorType = type;
|
|
|
|
|
|
|
|
|
|
if (mValidBySystem) {
|
2021-11-15 13:38:51 +00:00
|
|
|
if (mGroupSize) {
|
2021-11-19 10:10:01 -05:00
|
|
|
if (mValidByHost) {
|
2021-11-14 23:09:48 +00:00
|
|
|
mSensorGroup->remove(this);
|
|
|
|
|
wasRemoved = true;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
MR::initHitSensorGroup(this);
|
|
|
|
|
|
|
|
|
|
if (wasRemoved) {
|
|
|
|
|
mSensorGroup->add(this);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
mSensorCount = 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool HitSensor::isType(u32 type) const {
|
|
|
|
|
return !(type - mSensorType);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void HitSensor::validate() {
|
|
|
|
|
if (mValidByHost) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
mValidByHost = true;
|
|
|
|
|
|
2021-11-15 13:38:51 +00:00
|
|
|
if (!mGroupSize) {
|
2021-11-14 23:09:48 +00:00
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!mValidBySystem) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
mSensorGroup->add(this);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void HitSensor::invalidate() {
|
|
|
|
|
if (mValidByHost) {
|
|
|
|
|
mValidByHost = false;
|
|
|
|
|
|
2021-11-15 13:38:51 +00:00
|
|
|
if (mGroupSize) {
|
2021-11-14 23:09:48 +00:00
|
|
|
if (mValidBySystem) {
|
|
|
|
|
mSensorGroup->remove(this);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
mSensorCount = 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void HitSensor::validateBySystem() {
|
|
|
|
|
if (!mValidBySystem) {
|
2021-11-15 13:38:51 +00:00
|
|
|
if (mGroupSize) {
|
2021-11-14 23:09:48 +00:00
|
|
|
if (mValidByHost) {
|
|
|
|
|
mSensorGroup->add(this);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
mValidBySystem = true;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void HitSensor::invalidateBySystem() {
|
|
|
|
|
if (!mValidBySystem) {
|
2021-11-15 13:38:51 +00:00
|
|
|
if (mGroupSize) {
|
2021-11-14 23:09:48 +00:00
|
|
|
if (mValidByHost) {
|
|
|
|
|
mSensorGroup->remove(this);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
mValidBySystem = false;
|
|
|
|
|
mSensorCount = 0;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void HitSensor::addHitSensor(HitSensor *pSensor) {
|
2021-11-15 13:38:51 +00:00
|
|
|
if (mSensorCount < mGroupSize) {
|
2021-11-14 23:09:48 +00:00
|
|
|
mSensors[mSensorCount] = pSensor;
|
|
|
|
|
mSensorCount++;
|
|
|
|
|
}
|
|
|
|
|
}
|