This commit is contained in:
aozhiwei 2021-03-19 15:40:20 +08:00
parent 3d78d8d1d5
commit 3a665212ca
3 changed files with 29 additions and 26 deletions

View File

@ -12,6 +12,7 @@ Creature::~Creature()
delete pair.second; delete pair.second;
} }
skill_hash_.clear(); skill_hash_.clear();
ClearPassiveSkill();
} }
bool Creature::HasBuffEffect(int buff_effect_id) 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)) { MetaData::Skill* skill_meta = MetaMgr::Instance()->GetSkill(skill_id);
xtimer_list* tmp_timer = room->xtimer.AddRepeatTimerAndAttach 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(), SERVER_FRAME_RATE * skill_meta->i->skill_cd(),
a8::XParams() a8::XParams()
@ -238,8 +244,8 @@ void Creature::AddPassiveSkill(MetaData::Skill* skill_meta)
c->ClearPassiveSkillBuff(skill_meta); c->ClearPassiveSkillBuff(skill_meta);
c->AddPassiveSkillBuff(skill_meta); c->AddPassiveSkillBuff(skill_meta);
}, },
&xtimer_attacher.timer_list_); &skill->xtimer_attacher.timer_list_);
passive_skill_metas_[skill_meta] = tmp_timer; passive_skill_hash_[skill_meta->i->skill_id()] = skill;
AddPassiveSkillBuff(skill_meta); AddPassiveSkillBuff(skill_meta);
if (skill_meta->i->skill_cd() > 10000) { 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); auto itr = passive_skill_hash_.find(skill_id);
if (itr != passive_skill_metas_.end()) { if (itr != passive_skill_hash_.end()) {
ClearPassiveSkillBuff(skill_meta); ClearPassiveSkillBuff(itr->second->meta);
room->xtimer.DeleteTimer(itr->second); delete itr->second;
passive_skill_metas_.erase(itr); passive_skill_hash_.erase(itr);
} }
} }
void Creature::ClearPassiveSkill() void Creature::ClearPassiveSkill()
{ {
std::vector<MetaData::Skill*> del_skills; std::vector<int> del_skills;
del_skills.reserve(passive_skill_metas_.size()); del_skills.reserve(passive_skill_hash_.size());
for (auto& pair : passive_skill_metas_) { for (auto& pair : passive_skill_hash_) {
del_skills.push_back(pair.first); del_skills.push_back(pair.first);
} }
for (MetaData::Skill* skill_meta : del_skills) { for (int skill_id : del_skills) {
RemovePassiveSkill(skill_meta); 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) void Creature::ClearPassiveSkillBuff(MetaData::Skill* skill_meta)

View File

@ -46,7 +46,7 @@ class Creature : public MoveableEntity
Skill* GetSkill(int skill_id); Skill* GetSkill(int skill_id);
void AddSkill(int skill_id); void AddSkill(int skill_id);
void ClearSkill(); void ClearSkill();
void AddPassiveSkill(MetaData::Skill* skill_meta); void AddPassiveSkill(int skill_id);
void ClearPassiveSkill(); void ClearPassiveSkill();
virtual void SelectSkillTargets(Skill* skill, virtual void SelectSkillTargets(Skill* skill,
@ -75,10 +75,10 @@ private:
void ProcBuffEffect(Creature* caster, Buff* buff); void ProcBuffEffect(Creature* caster, Buff* buff);
void TriggerOneObjectBuff(Skill* skill, Entity* target, BuffTriggerType_e trigger_type); 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 ClearPassiveSkillBuff(MetaData::Skill* skill_meta);
void AddPassiveSkillBuff(MetaData::Skill* skill_meta); void AddPassiveSkillBuff(MetaData::Skill* skill_meta);
void RemovePassiveSkill(MetaData::Skill* skill_meta);
private: private:
std::array<float, kHAT_End> buff_attr_abs_ = {}; std::array<float, kHAT_End> buff_attr_abs_ = {};
@ -93,5 +93,5 @@ private:
int skill_target_id_ = 0; int skill_target_id_ = 0;
a8::Vec2 skill_target_pos_; a8::Vec2 skill_target_pos_;
std::map<int, Skill*> skill_hash_; std::map<int, Skill*> skill_hash_;
std::map<MetaData::Skill*, xtimer_list*> passive_skill_metas_; std::map<int, Skill*> passive_skill_hash_;
}; };

View File

@ -3383,11 +3383,8 @@ void Human::OnMetaChange()
ClearSkill(); ClearSkill();
AddSkill(meta->i->active_skill()); AddSkill(meta->i->active_skill());
ResetSkill(); ResetSkill();
MetaData::Skill* passive_skill_meta = MetaMgr::Instance()->GetSkill(meta->i->passive_skill());
ClearPassiveSkill(); ClearPassiveSkill();
if (passive_skill_meta) { AddPassiveSkill(meta->i->passive_skill());
AddPassiveSkill(passive_skill_meta);
}
} }
void Human::OnChgToTerminator() void Human::OnChgToTerminator()