Working about pathfinding
This commit is contained in:
1 parent
6a5adb1c79
commit
c6d98bd72a
25 files changed
+1997
-508
No files matched your search
+34
-2
@@ -9,6 +9,7 @@
|
||||
#include <Eigen/Geometry>
|
||||
#include "external/nlohmann/json.hpp"
|
||||
#include "ISaveable.h"
|
||||
#include "navigation/PathFinder.h"
|
||||
|
||||
namespace FRG {
|
||||
|
||||
@@ -110,8 +111,12 @@ public:
|
||||
float modelScale = 0.12f;
|
||||
Eigen::Quaternionf modelCorrectionRotation = Eigen::Quaternionf::Identity();
|
||||
bool useGpuSkinning = true;
|
||||
// Full clearance used while planning around stationary characters.
|
||||
float collisionRadius = 0.45f;
|
||||
// Smaller physical contact threshold used by the movement guard.
|
||||
float movementContactRadius = 0.32f;
|
||||
float interactionRadius = 0.0f;
|
||||
bool movedLastTick = false;
|
||||
|
||||
// --- Pathfinding data (serializable parts) ---
|
||||
Eigen::Vector3f walkTarget = Eigen::Vector3f::Zero();
|
||||
@@ -121,6 +126,11 @@ public:
|
||||
|
||||
// Internal drift-check timer (serializable so it survives save/load).
|
||||
float homeDriftCheckTimer = 5.0f;
|
||||
int movementBlockedTicks = 0;
|
||||
int navigationRetryTicks = 0;
|
||||
std::string blockingCharacterId;
|
||||
std::vector<int> navigationRetryCooldownTicks;
|
||||
std::size_t navigationRetryCooldownIndex = 0;
|
||||
|
||||
// Global Lua function called when the character reaches the final waypoint.
|
||||
// The name is serialized, so no runtime callback needs to be rehydrated.
|
||||
@@ -131,6 +141,9 @@ public:
|
||||
|
||||
// --- Pure-state methods ---
|
||||
void configureAsPlayer();
|
||||
void configureNavigationRetryCooldowns(
|
||||
const std::string& entityId,
|
||||
std::vector<int> cooldownTicks = {});
|
||||
bool isMoving() const;
|
||||
const Eigen::Vector3f& getRequestedWalkTarget() const { return requestedWalkTarget; }
|
||||
Eigen::Vector3f getCurrentNavigationTarget() const;
|
||||
@@ -138,9 +151,13 @@ public:
|
||||
void setTarget(const Eigen::Vector3f& target,
|
||||
std::string callbackName,
|
||||
const LocationNetworkState& location,
|
||||
const std::string& entityId);
|
||||
const std::string& entityId,
|
||||
const std::vector<PathFinder::DynamicObstacle>&
|
||||
dynamicObstacles = {});
|
||||
void forceReplan(const LocationNetworkState& location,
|
||||
const std::string& entityId);
|
||||
const std::string& entityId,
|
||||
const std::vector<PathFinder::DynamicObstacle>&
|
||||
dynamicObstacles = {});
|
||||
void stopAndRotateToTarget(std::string characterId);
|
||||
void resetPlayerAfterDeath();
|
||||
void tryAttackCombo();
|
||||
@@ -151,6 +168,9 @@ public:
|
||||
// --- Serialisation (runtime mutable fields only; creation info is reloaded from config) ---
|
||||
void save(nlohmann::json& out) const override;
|
||||
void load(const nlohmann::json& in) override;
|
||||
|
||||
private:
|
||||
void scheduleNextNavigationRetry();
|
||||
};
|
||||
|
||||
using PlayerStateMap =
|
||||
@@ -161,16 +181,28 @@ struct CharacterObservation {
|
||||
float hp = 0.f;
|
||||
};
|
||||
|
||||
struct CharacterMovementObstacle {
|
||||
std::string id;
|
||||
Eigen::Vector3f position = Eigen::Vector3f::Zero();
|
||||
float radius = 0.f;
|
||||
bool moving = false;
|
||||
Eigen::Vector3f movementDirection = Eigen::Vector3f::Zero();
|
||||
};
|
||||
|
||||
struct CharacterUpdateContext {
|
||||
std::string characterId;
|
||||
const CharacterObservation* attackTarget = nullptr;
|
||||
const CharacterObservation* faceTarget = nullptr;
|
||||
const std::vector<CharacterMovementObstacle>* movementObstacles = nullptr;
|
||||
};
|
||||
|
||||
struct CharacterUpdateEvents {
|
||||
bool attackImpact = false;
|
||||
bool deathAnimationComplete = false;
|
||||
bool navigationRequested = false;
|
||||
bool forceNavigationReplan = false;
|
||||
Eigen::Vector3f navigationTarget = Eigen::Vector3f::Zero();
|
||||
std::string blockingCharacterId;
|
||||
std::string arrivedCallbackName;
|
||||
std::string attackTargetId;
|
||||
Eigen::Vector3f attackDirection = Eigen::Vector3f::Zero();
|
||||
|
||||
Reference in new issue
Block a user