This commit is contained in:
aozhiwei 2021-03-19 15:54:10 +08:00
parent 3a665212ca
commit a72eb798d9
4 changed files with 48 additions and 44 deletions

View File

@ -226,7 +226,7 @@ void Creature::FillBuffList(::google::protobuf::RepeatedPtrField<::cs::MFBuff>*
void Creature::AddPassiveSkill(int skill_id)
{
MetaData::Skill* skill_meta = MetaMgr::Instance()->GetSkill(skill_id);
if (skill_meta && !HasPassiveSkill(skill_meta->i->skill_id())) {
if (skill_meta && !GetPassiveSkill(skill_meta->i->skill_id())) {
Skill* skill = new Skill;
skill->owner = this;
skill->meta = skill_meta;
@ -236,20 +236,22 @@ void Creature::AddPassiveSkill(int skill_id)
SERVER_FRAME_RATE * skill_meta->i->skill_cd(),
a8::XParams()
.SetSender(this)
.SetParam1(skill_meta),
.SetParam1(skill_id),
[] (const a8::XParams& param)
{
Creature* c = (Creature*)param.sender.GetUserData();
MetaData::Skill* skill_meta = (MetaData::Skill*)param.param1.GetUserData();
c->ClearPassiveSkillBuff(skill_meta);
c->AddPassiveSkillBuff(skill_meta);
Skill* skill = c->GetPassiveSkill(param.param1);
if (skill) {
skill->ClearPassiveSkillBuff();
skill->AddPassiveSkillBuff();
}
},
&skill->xtimer_attacher.timer_list_);
passive_skill_hash_[skill_meta->i->skill_id()] = skill;
AddPassiveSkillBuff(skill_meta);
skill->AddPassiveSkillBuff();
if (skill_meta->i->skill_cd() > 10000) {
//永久被动被动技能
AddPassiveSkillBuff(skill_meta);
skill->AddPassiveSkillBuff();
}
}
}
@ -258,7 +260,7 @@ void Creature::RemovePassiveSkill(int skill_id)
{
auto itr = passive_skill_hash_.find(skill_id);
if (itr != passive_skill_hash_.end()) {
ClearPassiveSkillBuff(itr->second->meta);
itr->second->ClearPassiveSkillBuff();
delete itr->second;
passive_skill_hash_.erase(itr);
}
@ -276,40 +278,10 @@ void Creature::ClearPassiveSkill()
}
}
bool Creature::HasPassiveSkill(int skill_id)
Skill* Creature::GetPassiveSkill(int skill_id)
{
return passive_skill_hash_.find(skill_id) != passive_skill_hash_.end();
}
void Creature::ClearPassiveSkillBuff(MetaData::Skill* skill_meta)
{
for (int buff_id : skill_meta->buff_list) {
Buff* buff = GetBuffById(buff_id);
if (buff &&
(buff->meta->i->buff_target() == kBuffTargetSelf ||
buff->meta->i->buff_target() == kBuffTargetFriendly)) {
RemoveBuffById(buff_id);
}
}
}
void Creature::AddPassiveSkillBuff(MetaData::Skill* skill_meta)
{
if (!skill_meta) {
return;
}
int old_skill_target_id_ = skill_target_id_;
a8::Vec2 old_skill_target_pos_ = skill_target_pos_;
skill_target_id_ = GetEntityUniId();
skill_target_pos_ = GetPos();
std::set<Entity*> target_list;
SelectSkillTargets(CurrentSkill(), GetPos(), target_list);
TriggerBuff(CurrentSkill(), target_list, kBTT_UseSkill);
skill_target_id_ = old_skill_target_id_;
skill_target_pos_ = old_skill_target_pos_;
auto itr = passive_skill_hash_.find(skill_id);
return itr != passive_skill_hash_.end() ? itr->second : nullptr;
}
void Creature::SelectSkillTargets(Skill* skill, const a8::Vec2& target_pos, std::set<Entity*>& target_list)

View File

@ -75,10 +75,8 @@ private:
void ProcBuffEffect(Creature* caster, Buff* buff);
void TriggerOneObjectBuff(Skill* skill, Entity* target, BuffTriggerType_e trigger_type);
bool HasPassiveSkill(int skill_id);
Skill* GetPassiveSkill(int skill_id);
void RemovePassiveSkill(int skill_id);
void ClearPassiveSkillBuff(MetaData::Skill* skill_meta);
void AddPassiveSkillBuff(MetaData::Skill* skill_meta);
private:
std::array<float, kHAT_End> buff_attr_abs_ = {};
@ -94,4 +92,6 @@ private:
a8::Vec2 skill_target_pos_;
std::map<int, Skill*> skill_hash_;
std::map<int, Skill*> passive_skill_hash_;
friend class Skill;
};

View File

@ -16,3 +16,31 @@ int Skill::GetLeftTime()
int skill_left_time = std::max(0, GetCd() - passed_time);
return skill_left_time;
}
void Skill::ClearPassiveSkillBuff()
{
for (int buff_id : meta->buff_list) {
Buff* buff = owner->GetBuffById(buff_id);
if (buff &&
(buff->meta->i->buff_target() == kBuffTargetSelf ||
buff->meta->i->buff_target() == kBuffTargetFriendly)) {
owner->RemoveBuffById(buff_id);
}
}
}
void Skill::AddPassiveSkillBuff()
{
int old_skill_target_id_ = owner->skill_target_id_;
a8::Vec2 old_skill_target_pos_ = owner->skill_target_pos_;
owner->skill_target_id_ = owner->GetEntityUniId();
owner->skill_target_pos_ = owner->GetPos();
std::set<Entity*> target_list;
owner->SelectSkillTargets(this, owner->GetPos(), target_list);
owner->TriggerBuff(this, target_list, kBTT_UseSkill);
owner->skill_target_id_ = old_skill_target_id_;
owner->skill_target_pos_ = old_skill_target_pos_;
}

View File

@ -16,4 +16,8 @@ class Skill
int GetCd();
int GetLeftTime();
void ClearPassiveSkillBuff();
void AddPassiveSkillBuff();
};