From 675bdfe6b31c83fb8110bb4def04c33fb9e6765f Mon Sep 17 00:00:00 2001 From: AzaezelX Date: Fri, 25 Apr 2025 18:50:16 -0500 Subject: [PATCH] fix pack/unpack data for AIControllerData's (though we still send nothing, we do need to mark it clientside as false) more pitchwork for flying vehicle drivers when flocking is irrelevant just path to next node --- Engine/source/T3D/AI/AIController.cpp | 13 ++++++------- Engine/source/T3D/AI/AIController.h | 4 ++-- Engine/source/T3D/AI/AINavigation.cpp | 18 +++++++++++------- Engine/source/T3D/AI/AINavigation.h | 2 +- 4 files changed, 20 insertions(+), 17 deletions(-) diff --git a/Engine/source/T3D/AI/AIController.cpp b/Engine/source/T3D/AI/AIController.cpp index 2cf2c50e5..7e383a5e8 100644 --- a/Engine/source/T3D/AI/AIController.cpp +++ b/Engine/source/T3D/AI/AIController.cpp @@ -777,17 +777,18 @@ void AIFlyingVehicleControllerData::resolvePitch(AIController* obj, Point3F loca Point3F toTarg = location - aimLoc; toTarg.normalize(); F32 lastPitch = fvo->getSteering().y; + movePtr->pitch = 0.0f; - F32 dotPitch = -mDot(up, toTarg); + F32 dotPitch = mDot(up, toTarg); FlyingVehicleData* db = static_cast(fvo->getDataBlock()); - F32 rollAmt = mFabs(fvo->getThrottle()* movePtr->yaw * db->steeringRollForce); + F32 rollAmt = mFabs(fvo->getThrottle()* movePtr->yaw / (db->steeringRollForce+1.0)); dotPitch *= 1.0-(mClampF(rollAmt, 0.0,1.0)); // reduce pitch by how much we're rolling - dotPitch *= M_PI_F; + dotPitch *= M_2PI_F; if (mFabs(dotPitch) > 0.05f) - movePtr->pitch = dotPitch - lastPitch; + movePtr->pitch = dotPitch; } @@ -803,9 +804,7 @@ void AIFlyingVehicleControllerData::resolveSpeed(AIController* obj, Point3F loca } if (!fvo) return;//not a FlyingVehicle - Parent::resolveSpeed(obj, location, movePtr); - movePtr->x = 0; - movePtr->y = mMax(movePtr->y, 0.0f); + movePtr->y = obj->mMovement.mMoveSpeed; } #endif //_AICONTROLLER_H_ diff --git a/Engine/source/T3D/AI/AIController.h b/Engine/source/T3D/AI/AIController.h index b2fe8ffb7..92aa481ea 100644 --- a/Engine/source/T3D/AI/AIController.h +++ b/Engine/source/T3D/AI/AIController.h @@ -147,8 +147,8 @@ public: AIControllerData(); ~AIControllerData() {}; - void packData(BitStream* stream) override {}; - void unpackData(BitStream* stream) override {}; + void packData(BitStream* stream) override { Parent::packData(stream); }; + void unpackData(BitStream* stream) override { Parent::unpackData(stream); }; static void initPersistFields(); DECLARE_CONOBJECT(AIControllerData); diff --git a/Engine/source/T3D/AI/AINavigation.cpp b/Engine/source/T3D/AI/AINavigation.cpp index ff3e25b22..9534313ea 100644 --- a/Engine/source/T3D/AI/AINavigation.cpp +++ b/Engine/source/T3D/AI/AINavigation.cpp @@ -126,9 +126,8 @@ void AINavigation::repath() if (mPathData.path.isNull() || !mPathData.owned) return; - if (mRandI(0, 100) < getCtrl()->mControllerData->mFlocking.mChance) + if (mRandI(0, 100) < getCtrl()->mControllerData->mFlocking.mChance && flock()) { - flock(); mPathData.path->mTo = mMoveDestination; } else @@ -296,7 +295,7 @@ void AINavigation::clearPath() mPathData = PathData(); } -void AINavigation::flock() +bool AINavigation::flock() { AIControllerData::Flocking flockingData = getCtrl()->mControllerData->mFlocking; SimObjectPtr obj = getCtrl()->getAIInfo()->mObj; @@ -306,7 +305,7 @@ void AINavigation::flock() Point3F searchArea = Point3F(flockingData.mMin / 2, flockingData.mMax / 2, getCtrl()->getAIInfo()->mObj->getObjBox().maxExtents.z / 2); F32 maxFlocksq = flockingData.mMax * flockingData.mMax; - + bool flocking = false; if (getCtrl()->getGoal()) { Point3F dest = mMoveDestination; @@ -403,17 +402,22 @@ void AINavigation::flock() //if we're not jumping... if (mJump == None) { - dest.z -= obj->getObjBox().len_z()*0.5; + dest.z = obj->getPosition().z; //make sure we don't run off a cliff - Point3F zlen(0, 0, getCtrl()->getAIInfo()->mRadius); + Point3F zlen(0, 0, getCtrl()->mControllerData->mHeightTolerance); if (obj->getContainer()->castRay(dest + zlen, dest - zlen, TerrainObjectType | StaticShapeObjectType | StaticObjectType, &info)) { - mMoveDestination = dest; + if ((mMoveDestination - dest).len() > getCtrl()->mControllerData->mMoveTolerance) + { + mMoveDestination = dest; + flocking = true; + } } } } } obj->enableCollision(); + return flocking; } DefineEngineMethod(AIController, setMoveDestination, void, (Point3F goal, bool slowDown), (true), diff --git a/Engine/source/T3D/AI/AINavigation.h b/Engine/source/T3D/AI/AINavigation.h index acc0aadf2..39b1276a4 100644 --- a/Engine/source/T3D/AI/AINavigation.h +++ b/Engine/source/T3D/AI/AINavigation.h @@ -97,7 +97,7 @@ struct AINavigation /// Move to the specified node in the current path. void moveToNode(S32 node); - void flock(); + bool flock(); }; #endif