From ab8db131319bb3f3655462069b1a7c8df32a8aa3 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Wed, 21 Jun 2023 23:06:22 +0800 Subject: [PATCH] 1 --- server/gameserver/android_agent.cc | 3 ++ server/gameserver/base_agent.cc | 71 ++---------------------------- server/gameserver/base_agent.h | 70 +---------------------------- server/gameserver/btcontext.cc | 19 ++++++++ server/gameserver/btcontext.h | 19 ++++++++ server/gameserver/btcoroutine.cc | 27 ++++++++++++ server/gameserver/btcoroutine.h | 24 ++++++++++ server/gameserver/btevent.cc | 41 +++++++++++++++++ server/gameserver/btevent.h | 33 ++++++++++++++ server/gameserver/hero_agent.cc | 4 ++ 10 files changed, 174 insertions(+), 137 deletions(-) create mode 100644 server/gameserver/btcontext.cc create mode 100644 server/gameserver/btcontext.h create mode 100644 server/gameserver/btcoroutine.cc create mode 100644 server/gameserver/btcoroutine.h create mode 100644 server/gameserver/btevent.cc create mode 100644 server/gameserver/btevent.h diff --git a/server/gameserver/android_agent.cc b/server/gameserver/android_agent.cc index 54059af2..5f05b208 100644 --- a/server/gameserver/android_agent.cc +++ b/server/gameserver/android_agent.cc @@ -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" diff --git a/server/gameserver/base_agent.cc b/server/gameserver/base_agent.cc index 65cade10..e6dfb37b 100644 --- a/server/gameserver/base_agent.cc +++ b/server/gameserver/base_agent.cc @@ -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 sp) return std::weak_ptr(sp); } -void BtContext::AddHandler(CreatureWeakPtr target, std::weak_ptr 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::Create(int event_id, - a8::Args event_params, - std::function has_event_cb - ) -{ - return std::make_shared( - event_id, - event_params, - has_event_cb - ); -} - -void BtEvent::FireEvent(BaseAgent* agent) -{ - switch (event_id_) { - case kBetOnAttack: - { - agent->FireEvent("OnAttacked", - event_params_.Get(0), - event_params_.Get(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; diff --git a/server/gameserver/base_agent.h b/server/gameserver/base_agent.h index fac9a490..aba2c23d 100644 --- a/server/gameserver/base_agent.h +++ b/server/gameserver/base_agent.h @@ -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 -{ -public: - - CreatureWeakPtr owner; - std::vector> events; - std::vector>> handlers; - - virtual ~BtContext(); - void AddHandler(CreatureWeakPtr target, std::weak_ptr handler); - std::weak_ptr 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 context; - const char* name = nullptr; - std::function runing_cb; - long long sleep_end_frameno = 0; - int sleep_time = 0; - - BtCoroutine(std::shared_ptr 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 Create(int event_id, - a8::Args event_params, - std::function has_event_cb - ); - - BtEvent(int event_id, - a8::Args event_params, - std::function 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 has_event_cb_; -}; - +struct BtCoroutine; class Creature; class BaseAgent : public behaviac::Agent { diff --git a/server/gameserver/btcontext.cc b/server/gameserver/btcontext.cc new file mode 100644 index 00000000..1a58a41d --- /dev/null +++ b/server/gameserver/btcontext.cc @@ -0,0 +1,19 @@ +#include "precompile.h" + +#include "btcontext.h" +#include "creature.h" +#include "trigger.h" + +void BtContext::AddHandler(CreatureWeakPtr target, std::weak_ptr 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)); + } + } +} diff --git a/server/gameserver/btcontext.h b/server/gameserver/btcontext.h new file mode 100644 index 00000000..ac20dfe0 --- /dev/null +++ b/server/gameserver/btcontext.h @@ -0,0 +1,19 @@ +#pragma once + +class BaseAgent; +class BtEvent; +struct EventHandlerPtr; +struct BtContext : public std::enable_shared_from_this +{ +public: + + CreatureWeakPtr owner; + std::vector> events; + std::vector>> handlers; + + virtual ~BtContext(); + void AddHandler(CreatureWeakPtr target, std::weak_ptr handler); + std::weak_ptr GetWp() { return shared_from_this();}; +private: + +}; diff --git a/server/gameserver/btcoroutine.cc b/server/gameserver/btcoroutine.cc new file mode 100644 index 00000000..8c711e2b --- /dev/null +++ b/server/gameserver/btcoroutine.cc @@ -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); + } + } +} diff --git a/server/gameserver/btcoroutine.h b/server/gameserver/btcoroutine.h new file mode 100644 index 00000000..a09bf729 --- /dev/null +++ b/server/gameserver/btcoroutine.h @@ -0,0 +1,24 @@ +#pragma once + +#include "behaviac/behaviac.h" +#include "behaviac_customized_types.h" + +struct BtContext; +class BaseAgent; +struct BtCoroutine +{ + std::shared_ptr context; + const char* name = nullptr; + std::function runing_cb; + long long sleep_end_frameno = 0; + int sleep_time = 0; + + BtCoroutine(std::shared_ptr context, const char* name) + { + this->context = context; + this->name = name; + } + + bool HasEvent(); + void FireEvent(BaseAgent* agent); +}; diff --git a/server/gameserver/btevent.cc b/server/gameserver/btevent.cc new file mode 100644 index 00000000..7ae45981 --- /dev/null +++ b/server/gameserver/btevent.cc @@ -0,0 +1,41 @@ +#include "precompile.h" + +#include "btevent.h" +#include "creature.h" +#include "trigger.h" +#include "base_agent.h" + +std::shared_ptr BtEvent::Create(int event_id, + a8::Args event_params, + std::function has_event_cb + ) +{ + return std::make_shared( + event_id, + event_params, + has_event_cb + ); +} + +void BtEvent::FireEvent(BaseAgent* agent) +{ + switch (event_id_) { + case kBetOnAttack: + { + agent->FireEvent("OnAttacked", + event_params_.Get(0), + event_params_.Get(1)); + } + break; + case kBetOnCrazeMode: + { + agent->FireEvent("OnCrazeMode"); + } + break; + default: + { + abort(); + } + break; + } +} diff --git a/server/gameserver/btevent.h b/server/gameserver/btevent.h new file mode 100644 index 00000000..cdb9b792 --- /dev/null +++ b/server/gameserver/btevent.h @@ -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 Create(int event_id, + a8::Args event_params, + std::function has_event_cb + ); + + BtEvent(int event_id, + a8::Args event_params, + std::function 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 has_event_cb_; +}; diff --git a/server/gameserver/hero_agent.cc b/server/gameserver/hero_agent.cc index be60ac1c..14b85164 100644 --- a/server/gameserver/hero_agent.cc +++ b/server/gameserver/hero_agent.cc @@ -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"