diff --git a/server/gameserver/constant.h b/server/gameserver/constant.h index 62fae9b..0f6be62 100755 --- a/server/gameserver/constant.h +++ b/server/gameserver/constant.h @@ -186,6 +186,7 @@ enum BuffTriggerType_e enum BuffEffectType_e { + BET_Begin = 0, BET_ChgAttr = 1, //改变属性 BET_Vertigo = 2, //眩晕 BET_LastDmg = 3, //持续伤害 @@ -193,6 +194,7 @@ enum BuffEffectType_e BET_Invincible = 5, //无敌 BET_Hide = 6, //隐身 BET_Dcgr = 7, //电磁干扰 + BET_End }; enum SkillFunc_e diff --git a/server/gameserver/global.cc b/server/gameserver/global.cc index ea6bb11..68c87c4 100755 --- a/server/gameserver/global.cc +++ b/server/gameserver/global.cc @@ -48,3 +48,8 @@ SkillFunc_e Str2SkillFunc(const std::string& func_str) } return Skill_FuncNone; } + +bool IsValidBuffEffect(int buff_effect) +{ + return buff_effect > BET_Begin && buff_effect < BET_End; +} diff --git a/server/gameserver/global.h b/server/gameserver/global.h index 3c7aa95..45694b4 100755 --- a/server/gameserver/global.h +++ b/server/gameserver/global.h @@ -23,3 +23,4 @@ class Global : public a8::Singleton bool IsValidSlotId(int slot_id); SkillFunc_e Str2SkillFunc(const std::string& func_str); +bool IsValidBuffEffect(int buff_effect); diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index 7ee6c39..f3cf691 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -1352,7 +1352,7 @@ void Human::AddBuff(MetaData::Buff* buff_meta) //buff->skill_meta buff->add_frameno = room->frame_no; buff->xtimer_attacher.xtimer = &room->xtimer; - buff_effect_hash_[buff->meta->i->buff_id()] = buff; + buff_effect_[buff->meta->i->buff_effect()] = buff; room->frame_event.AddBuff(this, buff); { room->xtimer.AddDeadLineTimerAndAttach( @@ -1374,7 +1374,9 @@ void Human::RemoveBuff(int buff_id) { for (auto itr = buff_list_.begin(); itr != buff_list_.end(); ++itr) { if (itr->meta->i->buff_id() == buff_id) { - buff_effect_hash_.erase(itr->meta->i->buff_effect()); + if (buff_effect_[itr->meta->i->buff_effect()] == &(*itr)) { + buff_effect_[itr->meta->i->buff_effect()] = nullptr; + } buff_list_.erase(itr); room->frame_event.RemoveBuff(this, buff_id); break; @@ -1546,6 +1548,5 @@ Buff* Human::GetBuffById(int buff_id) Buff* Human::GetBuffByEffectId(int effect_id) { - auto itr = buff_effect_hash_.find(effect_id); - return itr != buff_effect_hash_.end() ? itr->second : nullptr; + return IsValidBuffEffect(effect_id) ? buff_effect_[effect_id] : nullptr; } diff --git a/server/gameserver/human.h b/server/gameserver/human.h index c8a3852..91669bb 100644 --- a/server/gameserver/human.h +++ b/server/gameserver/human.h @@ -250,7 +250,7 @@ private: CircleCollider* self_collider_ = nullptr; long long last_sync_gas_frameno = 0; std::list buff_list_; - std::map buff_effect_hash_; + std::array buff_effect_ = {}; bool already_report_battle_ = false; bool sent_game_end_ = false; diff --git a/server/gameserver/metamgr.cc b/server/gameserver/metamgr.cc index 7a60d71..984f44a 100755 --- a/server/gameserver/metamgr.cc +++ b/server/gameserver/metamgr.cc @@ -248,6 +248,9 @@ private: } for (auto& meta : buff_meta_list) { + if (!IsValidBuffEffect(meta.buff_effect())) { + abort(); + } MetaData::Buff& item = a8::FastAppend(buff_list); item.i = &meta; item.Init();