diff --git a/server/gameserver/creature.cc b/server/gameserver/creature.cc index 2dff71a0..76fd9631 100644 --- a/server/gameserver/creature.cc +++ b/server/gameserver/creature.cc @@ -12,6 +12,7 @@ Creature::~Creature() delete pair.second; } skill_hash_.clear(); + ClearPassiveSkill(); } bool Creature::HasBuffEffect(int buff_effect_id) @@ -222,10 +223,15 @@ void Creature::FillBuffList(::google::protobuf::RepeatedPtrField<::cs::MFBuff>* } } -void Creature::AddPassiveSkill(MetaData::Skill* skill_meta) +void Creature::AddPassiveSkill(int skill_id) { - if (!HasPassiveSkill(skill_meta)) { - xtimer_list* tmp_timer = room->xtimer.AddRepeatTimerAndAttach + MetaData::Skill* skill_meta = MetaMgr::Instance()->GetSkill(skill_id); + if (skill_meta && !HasPassiveSkill(skill_meta->i->skill_id())) { + Skill* skill = new Skill; + skill->owner = this; + skill->meta = skill_meta; + skill->xtimer_attacher.xtimer = &room->xtimer; + room->xtimer.AddRepeatTimerAndAttach ( SERVER_FRAME_RATE * skill_meta->i->skill_cd(), a8::XParams() @@ -238,8 +244,8 @@ void Creature::AddPassiveSkill(MetaData::Skill* skill_meta) c->ClearPassiveSkillBuff(skill_meta); c->AddPassiveSkillBuff(skill_meta); }, - &xtimer_attacher.timer_list_); - passive_skill_metas_[skill_meta] = tmp_timer; + &skill->xtimer_attacher.timer_list_); + passive_skill_hash_[skill_meta->i->skill_id()] = skill; AddPassiveSkillBuff(skill_meta); if (skill_meta->i->skill_cd() > 10000) { //永久被动被动技能 @@ -248,31 +254,31 @@ void Creature::AddPassiveSkill(MetaData::Skill* skill_meta) } } -void Creature::RemovePassiveSkill(MetaData::Skill* skill_meta) +void Creature::RemovePassiveSkill(int skill_id) { - auto itr = passive_skill_metas_.find(skill_meta); - if (itr != passive_skill_metas_.end()) { - ClearPassiveSkillBuff(skill_meta); - room->xtimer.DeleteTimer(itr->second); - passive_skill_metas_.erase(itr); + auto itr = passive_skill_hash_.find(skill_id); + if (itr != passive_skill_hash_.end()) { + ClearPassiveSkillBuff(itr->second->meta); + delete itr->second; + passive_skill_hash_.erase(itr); } } void Creature::ClearPassiveSkill() { - std::vector del_skills; - del_skills.reserve(passive_skill_metas_.size()); - for (auto& pair : passive_skill_metas_) { + std::vector del_skills; + del_skills.reserve(passive_skill_hash_.size()); + for (auto& pair : passive_skill_hash_) { del_skills.push_back(pair.first); } - for (MetaData::Skill* skill_meta : del_skills) { - RemovePassiveSkill(skill_meta); + for (int skill_id : del_skills) { + RemovePassiveSkill(skill_id); } } -bool Creature::HasPassiveSkill(MetaData::Skill* skill_meta) +bool Creature::HasPassiveSkill(int skill_id) { - return passive_skill_metas_.find(skill_meta) != passive_skill_metas_.end(); + return passive_skill_hash_.find(skill_id) != passive_skill_hash_.end(); } void Creature::ClearPassiveSkillBuff(MetaData::Skill* skill_meta) diff --git a/server/gameserver/creature.h b/server/gameserver/creature.h index cea678af..c78cca3b 100644 --- a/server/gameserver/creature.h +++ b/server/gameserver/creature.h @@ -46,7 +46,7 @@ class Creature : public MoveableEntity Skill* GetSkill(int skill_id); void AddSkill(int skill_id); void ClearSkill(); - void AddPassiveSkill(MetaData::Skill* skill_meta); + void AddPassiveSkill(int skill_id); void ClearPassiveSkill(); virtual void SelectSkillTargets(Skill* skill, @@ -75,10 +75,10 @@ private: void ProcBuffEffect(Creature* caster, Buff* buff); void TriggerOneObjectBuff(Skill* skill, Entity* target, BuffTriggerType_e trigger_type); - bool HasPassiveSkill(MetaData::Skill* skill_meta); + bool HasPassiveSkill(int skill_id); + void RemovePassiveSkill(int skill_id); void ClearPassiveSkillBuff(MetaData::Skill* skill_meta); void AddPassiveSkillBuff(MetaData::Skill* skill_meta); - void RemovePassiveSkill(MetaData::Skill* skill_meta); private: std::array buff_attr_abs_ = {}; @@ -93,5 +93,5 @@ private: int skill_target_id_ = 0; a8::Vec2 skill_target_pos_; std::map skill_hash_; - std::map passive_skill_metas_; + std::map passive_skill_hash_; }; diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index b2d50e38..1a331bdb 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -3383,11 +3383,8 @@ void Human::OnMetaChange() ClearSkill(); AddSkill(meta->i->active_skill()); ResetSkill(); - MetaData::Skill* passive_skill_meta = MetaMgr::Instance()->GetSkill(meta->i->passive_skill()); ClearPassiveSkill(); - if (passive_skill_meta) { - AddPassiveSkill(passive_skill_meta); - } + AddPassiveSkill(meta->i->passive_skill()); } void Human::OnChgToTerminator()