添加depend_effect child_buff机制

This commit is contained in:
aozhiwei 2021-06-10 19:37:25 +08:00
parent 242db70a3f
commit d593b8f126
7 changed files with 78 additions and 8 deletions

View File

@ -9,6 +9,16 @@
#include "incubator.h"
#include "car.h"
Buff::Buff()
{
}
void Buff::Initialize()
{
}
int Buff::GetLeftTime()
{
int passed_ms = (owner->room->GetFrameNo() - add_frameno) * FRAME_RATE_MS;

View File

@ -26,7 +26,11 @@ class Buff
a8::XTimerAttacher xtimer_attacher;
long long add_frameno = 0;
int skill_lv = 0;
list_head effect_entry;
list_head depend_entry;
Buff();
void Initialize();
int GetLeftTime();
int GetLastingTime();
bool NeedSync(Human* hum);

View File

@ -133,7 +133,16 @@ bool Creature::HasBuffEffect(int buff_effect_id)
Buff* Creature::GetBuffByEffectId(int effect_id)
{
return IsValidBuffEffect(effect_id) ? buff_effect_[effect_id] : nullptr;
if (!IsValidBuffEffect(effect_id)) {
return nullptr;
}
list_head* list = &buff_effect_[effect_id];
if (list_empty(list)) {
return nullptr;
} else {
Buff* buff = list_first_entry(list, Buff, effect_entry);
return buff;
}
}
Buff* Creature::GetBuffById(int buff_id)
@ -159,6 +168,9 @@ void Creature::AddBuff(Creature* caster,
if (IsImmuneBuffEffect(buff_meta->i->buff_effect())) {
return;
}
if (buff_meta->i->depend_effect() != 0 && !HasBuffEffect(buff_meta->i->depend_effect())) {
return;
}
if (!buff_meta->EffectCanStack()) {
Buff* buff = GetBuffByEffectId(buff_meta->i->buff_effect());
if (buff) {
@ -186,7 +198,14 @@ void Creature::AddBuff(Creature* caster,
buff->skill_meta = buff_skill_meta;
buff->add_frameno = room->GetFrameNo();
buff->xtimer_attacher.xtimer = &room->xtimer;
buff_effect_[buff->meta->i->buff_effect()] = buff;
list_add_tail(&buff_effect_[buff->meta->i->buff_effect()], &buff->effect_entry);
if (buff->meta->i->depend_effect() != 0 &&
IsValidBuffEffect(buff->meta->i->depend_effect())) {
list_add_tail(&depend_effect_[buff->meta->i->depend_effect()], &buff->depend_entry);
} else {
INIT_LIST_HEAD(&buff->depend_entry);
}
buff->Initialize();
{
room->xtimer.AddDeadLineTimerAndAttach
(
@ -207,6 +226,14 @@ void Creature::AddBuff(Creature* caster,
if (!buff->meta->i->only_server()) {
room->frame_event.AddBuff(GetWeakPtrRef(), buff);
}
if (!buff->meta->child_buff_list.empty()) {
for (int child_buff_id : buff->meta->child_buff_list) {
MetaData::Buff* child_buff_meta = MetaMgr::Instance()->GetBuff(child_buff_id);
if (child_buff_meta) {
AddBuff(caster, child_buff_meta, skill_lv, buff_skill_meta);
}
}
}
#ifdef DEBUG
SendDebugMsg(a8::Format("添加buff_id:%d buff_effect:%d",
{
@ -249,8 +276,9 @@ void Creature::RemoveBuffById(int buff_id)
for (auto itr = buff_list_.begin(); itr != buff_list_.end(); ++itr) {
Buff& buff = *itr;
if (buff.meta->i->buff_id() == buff_id) {
if (buff_effect_[buff.meta->i->buff_effect()] == &(*itr)) {
buff_effect_[buff.meta->i->buff_effect()] = nullptr;
list_del_init(&buff.effect_entry);
if (!list_empty(&buff.depend_entry)) {
list_del_init(&buff.depend_entry);
}
removed_buffs.push_back(buff.meta);
OnBuffRemove(buff);
@ -279,6 +307,18 @@ void Creature::RemoveBuffById(int buff_id)
break;
}
}
for (int child_buff_id : buff_meta->child_buff_list) {
RemoveBuffById(child_buff_id);
}
if (!HasBuffEffect(buff_meta->i->buff_effect()) &&
!list_empty(&depend_effect_[buff_meta->i->buff_effect()])) {
struct list_head work_list;
list_replace_init(&depend_effect_[buff_meta->i->buff_effect()], &work_list);
while (!list_empty(&work_list)) {
Buff* buff = list_first_entry(&work_list, Buff, depend_entry);
RemoveBuffById(buff->meta->i->buff_id());
}
}
}
RecalcBuffAttr();
#ifdef DEBUG
@ -337,9 +377,7 @@ void Creature::RemoveBuffByEffectId(int buff_effect_id)
void Creature::ClearBuffList()
{
for (auto itr = buff_list_.begin(); itr != buff_list_.end(); ++itr) {
if (buff_effect_[itr->meta->i->buff_effect()] == &(*itr)) {
buff_effect_[itr->meta->i->buff_effect()] = nullptr;
}
list_del_init(&itr->effect_entry);
OnBuffRemove(*itr);
}
buff_list_.clear();
@ -945,6 +983,12 @@ void Creature::ProcBuffEffect(Creature* caster, Buff* buff)
void Creature::Initialize()
{
MoveableEntity::Initialize();
for (auto& node : buff_effect_) {
INIT_LIST_HEAD(&node);
}
for (auto& node : depend_effect_) {
INIT_LIST_HEAD(&node);
}
}
void Creature::SetMoveDir(const a8::Vec2& move_dir)

View File

@ -213,7 +213,8 @@ private:
CreatureWeakPtrChunk weak_ptr_chunk_;
std::array<float, kHAT_End> buff_attr_abs_ = {};
std::array<float, kHAT_End> buff_attr_rate_ = {};
std::array<Buff*, kBET_End> buff_effect_ = {};
std::array<list_head, kBET_End> buff_effect_ = {};
std::array<list_head, kBET_End> depend_effect_ = {};
std::list<Buff> buff_list_;
std::list<std::tuple<int, Hero*>> slave_heros_;
std::list<std::tuple<int, RoomObstacle*>> slave_things_;

View File

@ -719,6 +719,13 @@ namespace MetaData
int_param2 = a8::XValue(i->buff_param2());
int_param3 = a8::XValue(i->buff_param3());
int_param4 = a8::XValue(i->buff_param4());
{
std::vector<std::string> strings;
a8::Split(i->child_buff(), strings, '|');
for (auto& str : strings) {
child_buff_list.push_back(a8::XValue(str));
}
}
{
std::vector<std::string> strings;
a8::Split(i->immune_buffeffect_list(), strings, '|');

View File

@ -204,6 +204,8 @@ namespace MetaData
std::vector<std::tuple<int, std::vector<int>>> post_remove_action;
std::set<int> immune_buffeffect;
std::vector<std::tuple<int, float, float, int, int>> hero_infos;
std::vector<int> child_buff_list;
};
struct SkillPhase

View File

@ -236,6 +236,8 @@ message Buff
optional string post_remove_action = 13;
optional int32 only_server = 14;
optional int32 only_self = 15;
optional int32 depend_effect = 16;
optional string child_buff = 17;
}
message Drop