1
This commit is contained in:
parent
3a665212ca
commit
a72eb798d9
@ -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)
|
||||
|
@ -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;
|
||||
};
|
||||
|
@ -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_;
|
||||
}
|
||||
|
@ -16,4 +16,8 @@ class Skill
|
||||
|
||||
int GetCd();
|
||||
int GetLeftTime();
|
||||
|
||||
void ClearPassiveSkillBuff();
|
||||
void AddPassiveSkillBuff();
|
||||
|
||||
};
|
||||
|
Loading…
x
Reference in New Issue
Block a user