This commit is contained in:
aozhiwei 2023-06-21 23:06:22 +08:00
parent 0eca84937a
commit ab8db13131
10 changed files with 174 additions and 137 deletions

View File

@ -10,6 +10,9 @@
#include "trigger.h"
#include "glmhelper.h"
#include "skill.h"
#include "btcontext.h"
#include "btevent.h"
#include "btcoroutine.h"
#include "mt/Robot.h"

View File

@ -8,6 +8,9 @@
#include "glmhelper.h"
#include "trigger.h"
#include "skill.h"
#include "btcontext.h"
#include "btevent.h"
#include "btcoroutine.h"
#include "f8/btmgr.h"
@ -22,74 +25,6 @@ static auto SpToWp(std::shared_ptr<T> sp)
return std::weak_ptr<T>(sp);
}
void BtContext::AddHandler(CreatureWeakPtr target, std::weak_ptr<EventHandlerPtr> handler)
{
handlers.push_back(std::make_tuple(target, handler));
}
BtContext::~BtContext()
{
for (auto& tuple : handlers) {
if (std::get<0>(tuple).Get() && !std::get<1>(tuple).expired()) {
std::get<0>(tuple).Get()->GetTrigger()->RemoveEventHandler(std::get<1>(tuple));
}
}
}
std::shared_ptr<BtEvent> BtEvent::Create(int event_id,
a8::Args event_params,
std::function<bool()> has_event_cb
)
{
return std::make_shared<BtEvent>(
event_id,
event_params,
has_event_cb
);
}
void BtEvent::FireEvent(BaseAgent* agent)
{
switch (event_id_) {
case kBetOnAttack:
{
agent->FireEvent("OnAttacked",
event_params_.Get<int>(0),
event_params_.Get<long long>(1));
}
break;
case kBetOnCrazeMode:
{
agent->FireEvent("OnCrazeMode");
}
break;
default:
{
abort();
}
break;
}
}
bool BtCoroutine::HasEvent()
{
if (!context->events.empty()) {
auto event = context->events.at(context->events.size() - 1);
return event->HasEvent();
}
return false;
}
void BtCoroutine::FireEvent(BaseAgent* agent)
{
if (!context->events.empty()) {
auto event = context->events.at(context->events.size() - 1);
if (event->HasEvent()) {
event->FireEvent(agent);
}
}
}
void DumpBt(BaseAgent* agent)
{
static std::string last_bt_name;

View File

@ -1,28 +1,9 @@
#pragma once
#include "precompile.h"
#include "behaviac/behaviac.h"
#include "behaviac_customized_types.h"
class BaseAgent;
class BtEvent;
struct EventHandlerPtr;
struct BtContext : public std::enable_shared_from_this<BtContext>
{
public:
CreatureWeakPtr owner;
std::vector<std::shared_ptr<BtEvent>> events;
std::vector<std::tuple<CreatureWeakPtr, std::weak_ptr<EventHandlerPtr>>> handlers;
virtual ~BtContext();
void AddHandler(CreatureWeakPtr target, std::weak_ptr<EventHandlerPtr> handler);
std::weak_ptr<BtContext> GetWp() { return shared_from_this();};
private:
};
#define MAKE_BTCONTEXT(...) \
[] (CreatureWeakPtr owner, BaseAgent* agent) \
{ \
@ -37,56 +18,7 @@ context->owner = owner; \
return context; \
}(GetOwner()->GetWeakPtrRef(), this)
struct BtCoroutine
{
std::shared_ptr<BtContext> context;
const char* name = nullptr;
std::function<behaviac::EBTStatus()> runing_cb;
long long sleep_end_frameno = 0;
int sleep_time = 0;
BtCoroutine(std::shared_ptr<BtContext> context, const char* name)
{
this->context = context;
this->name = name;
}
bool HasEvent();
void FireEvent(BaseAgent* agent);
};
enum BtEventType_e
{
kBetOnAttack = 1,
kBetOnCrazeMode,
};
class BaseAgent;
class BtEvent
{
public:
int GetEventId() const { return event_id_; }
const a8::Args& GetParams() const { return event_params_; }
bool HasEvent() const { return has_event_cb_(); }
void FireEvent(BaseAgent* agent);
static std::shared_ptr<BtEvent> Create(int event_id,
a8::Args event_params,
std::function<bool()> has_event_cb
);
BtEvent(int event_id,
a8::Args event_params,
std::function<bool()> has_event_cb):
event_id_(event_id), event_params_(event_params), has_event_cb_(has_event_cb) {}
private:
int event_id_ = 0;
a8::Args event_params_;
std::function<bool()> has_event_cb_;
};
struct BtCoroutine;
class Creature;
class BaseAgent : public behaviac::Agent
{

View File

@ -0,0 +1,19 @@
#include "precompile.h"
#include "btcontext.h"
#include "creature.h"
#include "trigger.h"
void BtContext::AddHandler(CreatureWeakPtr target, std::weak_ptr<EventHandlerPtr> handler)
{
handlers.push_back(std::make_tuple(target, handler));
}
BtContext::~BtContext()
{
for (auto& tuple : handlers) {
if (std::get<0>(tuple).Get() && !std::get<1>(tuple).expired()) {
std::get<0>(tuple).Get()->GetTrigger()->RemoveEventHandler(std::get<1>(tuple));
}
}
}

View File

@ -0,0 +1,19 @@
#pragma once
class BaseAgent;
class BtEvent;
struct EventHandlerPtr;
struct BtContext : public std::enable_shared_from_this<BtContext>
{
public:
CreatureWeakPtr owner;
std::vector<std::shared_ptr<BtEvent>> events;
std::vector<std::tuple<CreatureWeakPtr, std::weak_ptr<EventHandlerPtr>>> handlers;
virtual ~BtContext();
void AddHandler(CreatureWeakPtr target, std::weak_ptr<EventHandlerPtr> handler);
std::weak_ptr<BtContext> GetWp() { return shared_from_this();};
private:
};

View File

@ -0,0 +1,27 @@
#include "precompile.h"
#include "btcoroutine.h"
#include "creature.h"
#include "trigger.h"
#include "base_agent.h"
#include "btcontext.h"
#include "btevent.h"
bool BtCoroutine::HasEvent()
{
if (!context->events.empty()) {
auto event = context->events.at(context->events.size() - 1);
return event->HasEvent();
}
return false;
}
void BtCoroutine::FireEvent(BaseAgent* agent)
{
if (!context->events.empty()) {
auto event = context->events.at(context->events.size() - 1);
if (event->HasEvent()) {
event->FireEvent(agent);
}
}
}

View File

@ -0,0 +1,24 @@
#pragma once
#include "behaviac/behaviac.h"
#include "behaviac_customized_types.h"
struct BtContext;
class BaseAgent;
struct BtCoroutine
{
std::shared_ptr<BtContext> context;
const char* name = nullptr;
std::function<behaviac::EBTStatus()> runing_cb;
long long sleep_end_frameno = 0;
int sleep_time = 0;
BtCoroutine(std::shared_ptr<BtContext> context, const char* name)
{
this->context = context;
this->name = name;
}
bool HasEvent();
void FireEvent(BaseAgent* agent);
};

View File

@ -0,0 +1,41 @@
#include "precompile.h"
#include "btevent.h"
#include "creature.h"
#include "trigger.h"
#include "base_agent.h"
std::shared_ptr<BtEvent> BtEvent::Create(int event_id,
a8::Args event_params,
std::function<bool()> has_event_cb
)
{
return std::make_shared<BtEvent>(
event_id,
event_params,
has_event_cb
);
}
void BtEvent::FireEvent(BaseAgent* agent)
{
switch (event_id_) {
case kBetOnAttack:
{
agent->FireEvent("OnAttacked",
event_params_.Get<int>(0),
event_params_.Get<long long>(1));
}
break;
case kBetOnCrazeMode:
{
agent->FireEvent("OnCrazeMode");
}
break;
default:
{
abort();
}
break;
}
}

View File

@ -0,0 +1,33 @@
#pragma once
enum BtEventType_e
{
kBetOnAttack = 1,
kBetOnCrazeMode,
};
class BaseAgent;
class BtEvent
{
public:
int GetEventId() const { return event_id_; }
const a8::Args& GetParams() const { return event_params_; }
bool HasEvent() const { return has_event_cb_(); }
void FireEvent(BaseAgent* agent);
static std::shared_ptr<BtEvent> Create(int event_id,
a8::Args event_params,
std::function<bool()> has_event_cb
);
BtEvent(int event_id,
a8::Args event_params,
std::function<bool()> has_event_cb):
event_id_(event_id), event_params_(event_params), has_event_cb_(has_event_cb) {}
private:
int event_id_ = 0;
a8::Args event_params_;
std::function<bool()> has_event_cb_;
};

View File

@ -10,6 +10,10 @@
#include "glmhelper.h"
#include "mapinstance.h"
#include "human.h"
#include "btcontext.h"
#include "btevent.h"
#include "btcoroutine.h"
#include "mt/Map.h"
#include "mt/Hero.h"