From 712404c9b44feb8e94b17e228caaf3b8ea90ccfe Mon Sep 17 00:00:00 2001 From: AzaezelX Date: Fri, 18 Apr 2025 12:28:49 -0500 Subject: [PATCH] hook up Vehicle's getAIMove(Move*); list aiControllerData's in the datablock. though the command is still required to set the controler and look up the relevant db for game specific logic --- Engine/source/T3D/AI/AIController.cpp | 2 +- Engine/source/T3D/player.cpp | 6 ++++-- Engine/source/T3D/vehicles/vehicle.cpp | 25 +++++++++++++++++++++++++ Engine/source/T3D/vehicles/vehicle.h | 4 ++++ 4 files changed, 34 insertions(+), 3 deletions(-) diff --git a/Engine/source/T3D/AI/AIController.cpp b/Engine/source/T3D/AI/AIController.cpp index 974f5e10a..89d1decd3 100644 --- a/Engine/source/T3D/AI/AIController.cpp +++ b/Engine/source/T3D/AI/AIController.cpp @@ -31,6 +31,7 @@ IMPLEMENT_CONOBJECT(AIController); //----------------------------------------------------------------------------- void AIController::throwCallback(const char* name) { + Con::warnf("throwCallback: %s", name); Con::executef(mControllerData, name, getIdString()); //controller data callbacks GameBase* gbo = dynamic_cast(getAIInfo()->mObj.getPointer()); @@ -676,7 +677,6 @@ F32 AIWheeledVehicleControllerData::getSteeringAngle(AIController* obj, Point3F maxSteeringAngle = vd->maxSteeringAngle; Point2F steering = wvo->getSteering(); - if (finalYaw < 5 && steering.x != 0.0f) steerState = Straight; else if (finalYaw < 5) diff --git a/Engine/source/T3D/player.cpp b/Engine/source/T3D/player.cpp index 938fc3e6d..18a0560b7 100644 --- a/Engine/source/T3D/player.cpp +++ b/Engine/source/T3D/player.cpp @@ -461,7 +461,7 @@ PlayerData::PlayerData() physicsPlayerType = StringTable->EmptyString(); mControlMap = StringTable->EmptyString(); - + mAIControllData = NULL; dMemset( actionList, 0, sizeof(actionList) ); } @@ -740,8 +740,10 @@ void PlayerData::initPersistFields() endGroup( "Camera" ); addGroup( "Movement" ); - addField("controlMap", TypeString, Offset(mControlMap, PlayerData), + addField("controlMap", TypeString, Offset(mControlMap, PlayerData), "@brief movemap used by these types of objects.\n\n"); + addField("aiControllerData", TYPEID< AIControllerData >(), Offset(mAIControllData, PlayerData), + "@brief ai controller used by these types of objects.\n\n"); addFieldV( "maxStepHeight", TypeRangedF32, Offset(maxStepHeight, PlayerData), &CommonValidators::PositiveFloat, "@brief Maximum height the player can step up.\n\n" diff --git a/Engine/source/T3D/vehicles/vehicle.cpp b/Engine/source/T3D/vehicles/vehicle.cpp index cd420c9d3..ac01b74e7 100644 --- a/Engine/source/T3D/vehicles/vehicle.cpp +++ b/Engine/source/T3D/vehicles/vehicle.cpp @@ -147,6 +147,7 @@ VehicleData::VehicleData() collDamageThresholdVel = 20; collDamageMultiplier = 0.05f; enablePhysicsRep = true; + mAIControllData = NULL; } @@ -320,6 +321,13 @@ void VehicleData::initPersistFields() "velocity).\n\nCurrently unused." ); endGroup("Collision"); + addGroup("Movement"); + addField("controlMap", TypeString, Offset(mControlMap, VehicleData), + "@brief movemap used by these types of objects.\n\n"); + addField("aiControllerData", TYPEID< AIControllerData >(), Offset(mAIControllData, VehicleData), + "@brief ai controller used by these types of objects.\n\n"); + endGroup("Collision"); + addGroup("Steering"); addFieldV( "jetForce", TypeRangedF32, Offset(jetForce, VehicleData), &CommonValidators::PositiveFloat, "@brief Additional force applied to the vehicle when it is jetting.\n\n" @@ -501,6 +509,12 @@ void Vehicle::processTick(const Move* move) if ( isMounted() ) return; + // If we're not being controlled by a client, let the + // AI sub-module get a chance at producing a move. + Move aiMove; + if (!move && isServerObject() && getAIMove(&aiMove)) + move = &aiMove; + // Warp to catch up to server if (mDelta.warpCount < mDelta.warpTicks) { @@ -1233,6 +1247,17 @@ bool Vehicle::setAIController(SimObjectId controller) return false; } +bool Vehicle::getAIMove(Move* move) +{ + if (mAIController) + { + mAIController->getAIMove(move); //actual result + return true; + } + + return false; +} + DefineEngineMethod(Vehicle, setAIController, bool, (S32 controller), , "") { return object->setAIController(controller); diff --git a/Engine/source/T3D/vehicles/vehicle.h b/Engine/source/T3D/vehicles/vehicle.h index 4dd518552..ee3913a29 100644 --- a/Engine/source/T3D/vehicles/vehicle.h +++ b/Engine/source/T3D/vehicles/vehicle.h @@ -72,6 +72,8 @@ struct VehicleData : public RigidShapeData F32 numDmgEmitterAreas; bool enablePhysicsRep; + StringTableEntry mControlMap; + AIControllerData* mAIControllData; // VehicleData(); @@ -152,6 +154,8 @@ public: F32 getThrottle() { return mThrottle;}; bool setAIController(SimObjectId controller); AIController* getAIController() { return mAIController; }; + virtual bool getAIMove(Move*); + /// Interpolates between move ticks @see processTick /// @param dt Change in time between the last call and this call to the function void advanceTime(F32 dt) override;