More record types:

+ Can now specify a cordinate to path find to
+ Can now enable/disable the combat AI
This commit is contained in:
wincent 2023-11-14 13:24:09 +01:00
parent a09bbdba32
commit 14d4c87a2f
2 changed files with 158 additions and 1 deletions

View File

@ -8,6 +8,8 @@
#include "EntityManager.h" #include "EntityManager.h"
#include "EntityInfo.h" #include "EntityInfo.h"
#include "ServerPreconditions.hpp" #include "ServerPreconditions.hpp"
#include "MovementAIComponent.h"
#include "BaseCombatAIComponent.h"
using namespace Cinema::Recording; using namespace Cinema::Recording;
@ -273,6 +275,24 @@ void Recorder::ActingDispatch(Entity* actor, const std::vector<Record*>& records
}); });
} }
// Check if the record is a path find record
auto* pathFindRecord = dynamic_cast<PathFindRecord*>(record);
if (pathFindRecord) {
auto* movementAiComponent = actor->GetComponent<MovementAIComponent>();
if (movementAiComponent == nullptr) {
movementAiComponent = actor->AddComponent<MovementAIComponent>(MovementAIInfo{});
}
movementAiComponent->SetDestination(pathFindRecord->position);
movementAiComponent->SetMaxSpeed(pathFindRecord->speed);
PathFindDispatch(actor, records, index, variables);
return;
}
actor->AddCallbackTimer(delay, [actor, records, index, variables]() { actor->AddCallbackTimer(delay, [actor, records, index, variables]() {
ActingDispatch(actor, records, index + 1, variables); ActingDispatch(actor, records, index + 1, variables);
}); });
@ -310,6 +330,29 @@ void Cinema::Recording::Recorder::PlayerProximityDispatch(Entity* actor, const s
}); });
} }
void Cinema::Recording::Recorder::PathFindDispatch(Entity* actor, const std::vector<Record*>& records, size_t index, Play* variables) {
auto* record = dynamic_cast<PathFindRecord*>(records[index]);
if (record == nullptr) {
return;
}
auto* movementAiComponent = actor->GetComponent<MovementAIComponent>();
if (movementAiComponent == nullptr) {
return;
}
if (movementAiComponent->AtFinalWaypoint()) {
ActingDispatch(actor, records, index + 1, variables);
return;
}
Game::entityManager->GetZoneControlEntity()->AddCallbackTimer(1.0f, [actor, records, index, variables]() {
PathFindDispatch(actor, records, index, variables);
});
}
void Cinema::Recording::Recorder::LoadRecords(tinyxml2::XMLElement* root, std::vector<Record*>& records) { void Cinema::Recording::Recorder::LoadRecords(tinyxml2::XMLElement* root, std::vector<Record*>& records) {
for (auto* element = root->FirstChildElement(); element; element = element->NextSiblingElement()) { for (auto* element = root->FirstChildElement(); element; element = element->NextSiblingElement()) {
@ -360,6 +403,13 @@ void Cinema::Recording::Recorder::LoadRecords(tinyxml2::XMLElement* root, std::v
record = new PlayEffectRecord(); record = new PlayEffectRecord();
} else if (name == "CoroutineRecord") { } else if (name == "CoroutineRecord") {
record = new CoroutineRecord(); record = new CoroutineRecord();
} else if (name == "PathFindRecord") {
record = new PathFindRecord();
} else if (name == "CombatAIRecord") {
record = new CombatAIRecord();
} else {
LOG("Unknown record type: %s", name.c_str());
continue;
} }
record->Deserialize(element); record->Deserialize(element);
@ -1067,8 +1117,79 @@ void Cinema::Recording::CoroutineRecord::Act(Entity* actor) {
} }
void Cinema::Recording::CoroutineRecord::Serialize(tinyxml2::XMLDocument& document, tinyxml2::XMLElement* parent) { void Cinema::Recording::CoroutineRecord::Serialize(tinyxml2::XMLDocument& document, tinyxml2::XMLElement* parent) {
auto* element = document.NewElement("CoroutineRecord");
for (auto* record : records) {
record->Serialize(document, element);
}
element->SetAttribute("t", m_Delay);
parent->InsertEndChild(element);
} }
void Cinema::Recording::CoroutineRecord::Deserialize(tinyxml2::XMLElement* element) { void Cinema::Recording::CoroutineRecord::Deserialize(tinyxml2::XMLElement* element) {
Recorder::LoadRecords(element, records); Recorder::LoadRecords(element, records);
} }
Cinema::Recording::PathFindRecord::PathFindRecord(const NiPoint3& position, float speed) {
this->position = position;
this->speed = speed;
}
void Cinema::Recording::PathFindRecord::Act(Entity* actor) {
}
void Cinema::Recording::PathFindRecord::Serialize(tinyxml2::XMLDocument& document, tinyxml2::XMLElement* parent) {
auto* element = document.NewElement("PathFindRecord");
element->SetAttribute("x", position.x);
element->SetAttribute("y", position.y);
element->SetAttribute("z", position.z);
element->SetAttribute("speed", speed);
element->SetAttribute("t", m_Delay);
parent->InsertEndChild(element);
}
void Cinema::Recording::PathFindRecord::Deserialize(tinyxml2::XMLElement* element) {
position.x = element->FloatAttribute("x");
position.y = element->FloatAttribute("y");
position.z = element->FloatAttribute("z");
speed = element->FloatAttribute("speed");
m_Delay = element->DoubleAttribute("t");
}
Cinema::Recording::CombatAIRecord::CombatAIRecord(bool enabled) {
this->enabled = enabled;
}
void Cinema::Recording::CombatAIRecord::Act(Entity* actor) {
auto* baseCombatAIComponent = actor->GetComponent<BaseCombatAIComponent>();
if (baseCombatAIComponent == nullptr) {
return;
}
baseCombatAIComponent->SetDisabled(!enabled);
}
void Cinema::Recording::CombatAIRecord::Serialize(tinyxml2::XMLDocument& document, tinyxml2::XMLElement* parent) {
auto* element = document.NewElement("CombatAIRecord");
element->SetAttribute("enabled", enabled);
element->SetAttribute("t", m_Delay);
parent->InsertEndChild(element);
}
void Cinema::Recording::CombatAIRecord::Deserialize(tinyxml2::XMLElement* element) {
enabled = element->BoolAttribute("enabled");
m_Delay = element->DoubleAttribute("t");
}

View File

@ -62,9 +62,11 @@ public:
static void ActingDispatch(Entity* actor, const std::vector<Record*>& records, size_t index, Play* variables); static void ActingDispatch(Entity* actor, const std::vector<Record*>& records, size_t index, Play* variables);
private:
static void PlayerProximityDispatch(Entity* actor, const std::vector<Record*>& records, size_t index, Play* variables, std::shared_ptr<bool> actionTaken); static void PlayerProximityDispatch(Entity* actor, const std::vector<Record*>& records, size_t index, Play* variables, std::shared_ptr<bool> actionTaken);
private: static void PathFindDispatch(Entity* actor, const std::vector<Record*>& records, size_t index, Play* variables);
std::vector<Record*> m_Records; std::vector<Record*> m_Records;
bool m_IsRecording; bool m_IsRecording;
@ -361,5 +363,39 @@ public:
void Deserialize(tinyxml2::XMLElement* element) override; void Deserialize(tinyxml2::XMLElement* element) override;
}; };
class PathFindRecord : public Record
{
public:
NiPoint3 position;
float speed = 1.0f;
PathFindRecord() = default;
PathFindRecord(const NiPoint3& position, float speed);
void Act(Entity* actor) override;
void Serialize(tinyxml2::XMLDocument& document, tinyxml2::XMLElement* parent) override;
void Deserialize(tinyxml2::XMLElement* element) override;
};
class CombatAIRecord : public Record
{
public:
bool enabled = false;
CombatAIRecord() = default;
CombatAIRecord(bool enabled);
void Act(Entity* actor) override;
void Serialize(tinyxml2::XMLDocument& document, tinyxml2::XMLElement* parent) override;
void Deserialize(tinyxml2::XMLElement* element) override;
};
} }