behavioural change: feeding an AInfo an object with a 0 radius causes the class to fill in radius from that objects bounds box

also, vehicle direct hooks
This commit is contained in:
AzaezelX 2025-04-18 11:36:27 -05:00
parent 78a26b0108
commit 2d0bcbcf8d
4 changed files with 32 additions and 3 deletions

View file

@ -39,6 +39,8 @@ AIInfo::AIInfo(AIController* controller, SimObjectPtr<SceneObject> objIn, F32 ra
mPosition = mLastPos = objIn->getPosition(); mPosition = mLastPos = objIn->getPosition();
mRadius = radIn; mRadius = radIn;
mPosSet = false; mPosSet = false;
if (radIn == 0.0f)
mRadius = mMax(objIn->getObjBox().len_x(), objIn->getObjBox().len_y()) * 0.5;
}; };
AIInfo::AIInfo(AIController* controller, Point3F pointIn, F32 radIn) AIInfo::AIInfo(AIController* controller, Point3F pointIn, F32 radIn)

View file

@ -2264,7 +2264,7 @@ bool Player::setAIController(SimObjectId controller)
{ {
if (Sim::findObject(controller, mAIController) && mAIController->mControllerData) if (Sim::findObject(controller, mAIController) && mAIController->mControllerData)
{ {
mAIController->setAIInfo(this, mAIController->mControllerData->mMoveTolerance); mAIController->setAIInfo(this);
return true; return true;
} }
Con::errorf("unable to find AIController : %i", controller); Con::errorf("unable to find AIController : %i", controller);

View file

@ -405,6 +405,7 @@ Vehicle::Vehicle()
mWorkingQueryBoxCountDown = sWorkingQueryBoxStaleThreshold; mWorkingQueryBoxCountDown = sWorkingQueryBoxStaleThreshold;
mPhysicsRep = NULL; mPhysicsRep = NULL;
mAIController = NULL;
} }
U32 Vehicle::getCollisionMask() U32 Vehicle::getCollisionMask()
@ -471,7 +472,7 @@ bool Vehicle::onAdd()
void Vehicle::onRemove() void Vehicle::onRemove()
{ {
SAFE_DELETE(mPhysicsRep); SAFE_DELETE(mPhysicsRep);
if (mAIController) mAIController->deleteObject();
U32 i=0; U32 i=0;
for( i=0; i<VehicleData::VC_NUM_DAMAGE_EMITTERS; i++ ) for( i=0; i<VehicleData::VC_NUM_DAMAGE_EMITTERS; i++ )
@ -1219,3 +1220,25 @@ void Vehicle::_renderMuzzleVector( ObjectRenderInst *ri, SceneRenderState *state
PrimBuild::end(); PrimBuild::end();
} }
bool Vehicle::setAIController(SimObjectId controller)
{
if (Sim::findObject(controller, mAIController) && mAIController->mControllerData)
{
mAIController->setAIInfo(this);
return true;
}
Con::errorf("unable to find AIController : %i", controller);
mAIController = NULL;
return false;
}
DefineEngineMethod(Vehicle, setAIController, bool, (S32 controller), , "")
{
return object->setAIController(controller);
}
DefineEngineMethod(Vehicle, getAIController, AIController*, (), , "")
{
return object->getAIController();
}

View file

@ -27,6 +27,8 @@
#include "T3D/rigidShape.h" #include "T3D/rigidShape.h"
#endif #endif
#include "T3D/AI/AIController.h"
class ParticleEmitter; class ParticleEmitter;
class ParticleEmitterData; class ParticleEmitterData;
class ClippedPolyList; class ClippedPolyList;
@ -98,7 +100,7 @@ class Vehicle : public RigidShape
Point2F mSteering; Point2F mSteering;
F32 mThrottle; F32 mThrottle;
bool mJetting; bool mJetting;
AIController* mAIController;
GFXStateBlockRef mSolidSB; GFXStateBlockRef mSolidSB;
SimObjectPtr<ParticleEmitter> mDamageEmitterList[VehicleData::VC_NUM_DAMAGE_EMITTERS]; SimObjectPtr<ParticleEmitter> mDamageEmitterList[VehicleData::VC_NUM_DAMAGE_EMITTERS];
@ -148,6 +150,8 @@ public:
Point2F getSteering() { return mSteering; }; Point2F getSteering() { return mSteering; };
F32 getThrottle() { return mThrottle;}; F32 getThrottle() { return mThrottle;};
bool setAIController(SimObjectId controller);
AIController* getAIController() { return mAIController; };
/// Interpolates between move ticks @see processTick /// Interpolates between move ticks @see processTick
/// @param dt Change in time between the last call and this call to the function /// @param dt Change in time between the last call and this call to the function
void advanceTime(F32 dt) override; void advanceTime(F32 dt) override;