diff --git a/server/gameserver/bullet.cc b/server/gameserver/bullet.cc index e768a937..430c563b 100644 --- a/server/gameserver/bullet.cc +++ b/server/gameserver/bullet.cc @@ -19,6 +19,7 @@ #include "skillhelper.h" #include "trigger.h" #include "ability.h" +#include "buff.h" #include "mt/Param.h" #include "mt/Equip.h" diff --git a/server/gameserver/car.cc b/server/gameserver/car.cc index 164438ac..f4725433 100644 --- a/server/gameserver/car.cc +++ b/server/gameserver/car.cc @@ -20,6 +20,7 @@ #include "trigger.h" #include "ability.h" #include "battledatacontext.h" +#include "buff.h" #include "mt/Hero.h" #include "mt/Equip.h" diff --git a/server/gameserver/creature.cc b/server/gameserver/creature.cc index 2478b80f..54838c14 100644 --- a/server/gameserver/creature.cc +++ b/server/gameserver/creature.cc @@ -18,6 +18,7 @@ #include "trigger.h" #include "ability.h" #include "battledatacontext.h" +#include "buff.h" #include "mt/Param.h" #include "mt/Hero.h" @@ -93,9 +94,9 @@ Buff* Creature::GetBuffByEffectId(int effect_id) Buff* Creature::GetBuffById(int buff_id) { - for (Buff& buff : buff_list_) { - if (buff.meta->buff_id() == buff_id) { - return &buff; + for (auto buff : buff_list_) { + if (buff->meta->buff_id() == buff_id) { + return buff.get(); } } return nullptr; @@ -103,9 +104,9 @@ Buff* Creature::GetBuffById(int buff_id) Buff* Creature::GetBuffByUniId(int buff_uniid) { - for (Buff& buff : buff_list_) { - if (buff.buff_uniid == buff_uniid) { - return &buff; + for (auto buff : buff_list_) { + if (buff->buff_uniid == buff_uniid) { + return buff.get(); } } return nullptr; @@ -114,8 +115,8 @@ Buff* Creature::GetBuffByUniId(int buff_uniid) int Creature::GetBuffNum(int buff_id) { int num = 0; - for (Buff& buff : buff_list_) { - if (buff.meta->buff_id() == buff_id) { + for (auto buff : buff_list_) { + if (buff->meta->buff_id() == buff_id) { ++num; } } @@ -185,7 +186,8 @@ int Creature::AddBuff(Creature* caster, } ++buff_uniid_; int new_buff_uniid = buff_uniid_; - Buff* buff = &a8::FastAppend(buff_list_); + auto buff = std::make_shared(); + buff_list_.push_back(buff); buff->buff_uniid = new_buff_uniid; buff->SetCaster(caster); buff->owner = this; @@ -196,7 +198,7 @@ int Creature::AddBuff(Creature* caster, buff->Init(); buff->PreProcess(); if (on_add_buff) { - on_add_buff(buff); + on_add_buff(buff.get()); } if (buff->meta->lock_move()) { IncDisableMoveTimes(); @@ -235,7 +237,7 @@ int Creature::AddBuff(Creature* caster, } } #endif - ProcBuffEffect(caster, buff); + ProcBuffEffect(caster, buff.get()); #ifdef DEBUG if (!f8::IsTestEnv()) { if (!GetBuffByUniId(new_buff_uniid)) { @@ -243,7 +245,7 @@ int Creature::AddBuff(Creature* caster, } } #endif - AddBuffPostProc(caster, buff); + AddBuffPostProc(caster, buff.get()); #ifdef DEBUG if (!f8::IsTestEnv()) { if (!GetBuffByUniId(new_buff_uniid)) { @@ -252,7 +254,7 @@ int Creature::AddBuff(Creature* caster, } #endif if (!buff->meta->only_server()) { - room->frame_event.AddBuff(GetWeakPtrRef(), buff); + room->frame_event.AddBuff(GetWeakPtrRef(), buff.get()); } #ifdef DEBUG { @@ -284,8 +286,8 @@ int Creature::AddBuff(Creature* caster, bool Creature::IsImmuneBuffEffect(int buff_effect) { - for (auto itr = buff_list_.begin(); itr != buff_list_.end(); ++itr) { - if (itr->meta->IsImmuneBuffEffect(buff_effect)) { + for (auto buff : buff_list_) { + if (buff->meta->IsImmuneBuffEffect(buff_effect)) { return true; } } @@ -385,10 +387,9 @@ int Creature::TryAddBuffWithTarget(Creature* caster, int buff_id) void Creature::RemoveBuffById(int buff_id) { int buff_uniid = 0; - for (auto itr = buff_list_.begin(); itr != buff_list_.end(); ++itr) { - Buff& buff = *itr; - if (buff.meta->buff_id() == buff_id) { - buff_uniid = buff.buff_uniid; + for (auto buff : buff_list_) { + if (buff->meta->buff_id() == buff_id) { + buff_uniid = buff->buff_uniid; break; } } @@ -402,12 +403,12 @@ void Creature::RemoveBuffByUniId(int buff_uniid) int buff_id = 0; std::vector> removed_buffs; for (auto itr = buff_list_.begin(); itr != buff_list_.end(); ++itr) { - Buff& buff = *itr; - if (buff.buff_uniid == buff_uniid) { - buff_id = buff.meta->buff_id(); - removed_buffs.push_back(std::make_tuple(buff.meta, buff.GetCaster().Get())); - OnBuffRemove(buff); - buff.UnInit(); + auto buff = *itr; + if (buff->buff_uniid == buff_uniid) { + buff_id = buff->meta->buff_id(); + removed_buffs.push_back(std::make_tuple(buff->meta, buff->GetCaster().Get())); + OnBuffRemove(*buff.get()); + buff->UnInit(); buff_list_.erase(itr); break; } @@ -495,25 +496,25 @@ void Creature::RecalcBuffAttr() ability_->Clear(); bool need_refresh_hp = false; for (auto& buff : buff_list_) { - if (buff.meta->buff_effect() == kBET_ChgAttr || - buff.meta->buff_effect() == kBET_Car || - buff.meta->buff_effect() == kBET_CrazyMode) { - int attr_type = (int)buff.meta->_param1; - int calc_type = (int)buff.meta->_param2; + if (buff->meta->buff_effect() == kBET_ChgAttr || + buff->meta->buff_effect() == kBET_Car || + buff->meta->buff_effect() == kBET_CrazyMode) { + int attr_type = (int)buff->meta->_param1; + int calc_type = (int)buff->meta->_param2; if (IsValidHumanAttr(attr_type)) { if (calc_type == 1) { float* p = ability_->GetBuffAttrAbsPtr(attr_type); if (p) { - *p += buff.meta->_param3; + *p += buff->meta->_param3; } } else if (calc_type == 2) { float* p = ability_->GetBuffAttrRatePtr(attr_type); if (p) { - *p += buff.meta->_param3; + *p += buff->meta->_param3; } } } - if (buff.add_frameno == room->GetFrameNo() && + if (buff->add_frameno == room->GetFrameNo() && attr_type == kHAT_MaxHp) { need_refresh_hp = true; } @@ -648,9 +649,9 @@ void Creature::RemoveBuffByEffectId(int buff_effect_id) void Creature::ClearBuffList() { - for (auto itr = buff_list_.begin(); itr != buff_list_.end(); ++itr) { - list_del_init(&itr->effect_entry); - OnBuffRemove(*itr); + for (auto buff : buff_list_) { + list_del_init(&buff->effect_entry); + OnBuffRemove(*buff.get()); } buff_list_.clear(); buff_effect_ = {}; @@ -2753,7 +2754,7 @@ void Creature::TraverseBuff(std::function func) { bool stop = false; for (auto& buff : buff_list_) { - func(&buff, stop); + func(buff.get(), stop); if (stop) { return; } @@ -2871,8 +2872,8 @@ std::string Creature::DebugOutBuffList() for (auto& itr : buff_list_) { data += a8::Format("buffid:%d effect:%d\n", { - itr.meta->buff_id(), - itr.meta->buff_effect() + itr->meta->buff_id(), + itr->meta->buff_effect() }); } return data; @@ -3018,9 +3019,9 @@ void Creature::OnBattleStart(Room* room) std::vector del_buffs; del_buffs.reserve(buff_list_.size()); for (auto& buff : buff_list_) { - if (!buff.meta->post_battle_valid()) { - if (!buff.skill_meta || buff.skill_meta->skill_type() != kPassiveSkill) { - del_buffs.push_back(buff.buff_uniid); + if (!buff->meta->post_battle_valid()) { + if (!buff->skill_meta || buff->skill_meta->skill_type() != kPassiveSkill) { + del_buffs.push_back(buff->buff_uniid); } } } diff --git a/server/gameserver/creature.h b/server/gameserver/creature.h index b3520bee..dcfa4e34 100644 --- a/server/gameserver/creature.h +++ b/server/gameserver/creature.h @@ -1,7 +1,6 @@ #pragma once #include "moveableentity.h" -#include "buff.h" #include "weapon.h" namespace cs @@ -50,6 +49,7 @@ struct HumanAbility float fire_rate = 0.0f; }; +struct Buff; struct BattleDataContext; class Ability; class Skill; @@ -350,7 +350,7 @@ private: std::array buff_effect_ = {}; std::array depend_effect_ = {}; std::array cond_buffs_ = {}; - std::list buff_list_; + std::list> buff_list_; std::list> slave_heros_; std::list> slave_things_; a8::XTimerWp auto_switch_weapon_timer_; diff --git a/server/gameserver/player.cc b/server/gameserver/player.cc index 0e7d93a1..0accc8b9 100644 --- a/server/gameserver/player.cc +++ b/server/gameserver/player.cc @@ -28,6 +28,7 @@ #include "movehelper.h" #include "trigger.h" #include "ability.h" +#include "buff.h" #include "mt/Param.h" #include "mt/Equip.h" diff --git a/server/gameserver/shot.cc b/server/gameserver/shot.cc index e78f283b..ea9c3992 100644 --- a/server/gameserver/shot.cc +++ b/server/gameserver/shot.cc @@ -9,6 +9,7 @@ #include "room.h" #include "car.h" #include "trigger.h" +#include "buff.h" #include "mt/Param.h" #include "mt/Hero.h" diff --git a/server/gameserver/trigger.cc b/server/gameserver/trigger.cc index 8b4a2a9b..3e863f75 100644 --- a/server/gameserver/trigger.cc +++ b/server/gameserver/trigger.cc @@ -9,6 +9,7 @@ #include "human.h" #include "car.h" #include "bullet.h" +#include "buff.h" #include "mt/Buff.h" #include "mt/Skill.h"