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)
|
void Creature::AddPassiveSkill(int skill_id)
|
||||||
{
|
{
|
||||||
MetaData::Skill* skill_meta = MetaMgr::Instance()->GetSkill(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* skill = new Skill;
|
||||||
skill->owner = this;
|
skill->owner = this;
|
||||||
skill->meta = skill_meta;
|
skill->meta = skill_meta;
|
||||||
@ -236,20 +236,22 @@ void Creature::AddPassiveSkill(int skill_id)
|
|||||||
SERVER_FRAME_RATE * skill_meta->i->skill_cd(),
|
SERVER_FRAME_RATE * skill_meta->i->skill_cd(),
|
||||||
a8::XParams()
|
a8::XParams()
|
||||||
.SetSender(this)
|
.SetSender(this)
|
||||||
.SetParam1(skill_meta),
|
.SetParam1(skill_id),
|
||||||
[] (const a8::XParams& param)
|
[] (const a8::XParams& param)
|
||||||
{
|
{
|
||||||
Creature* c = (Creature*)param.sender.GetUserData();
|
Creature* c = (Creature*)param.sender.GetUserData();
|
||||||
MetaData::Skill* skill_meta = (MetaData::Skill*)param.param1.GetUserData();
|
Skill* skill = c->GetPassiveSkill(param.param1);
|
||||||
c->ClearPassiveSkillBuff(skill_meta);
|
if (skill) {
|
||||||
c->AddPassiveSkillBuff(skill_meta);
|
skill->ClearPassiveSkillBuff();
|
||||||
|
skill->AddPassiveSkillBuff();
|
||||||
|
}
|
||||||
},
|
},
|
||||||
&skill->xtimer_attacher.timer_list_);
|
&skill->xtimer_attacher.timer_list_);
|
||||||
passive_skill_hash_[skill_meta->i->skill_id()] = skill;
|
passive_skill_hash_[skill_meta->i->skill_id()] = skill;
|
||||||
AddPassiveSkillBuff(skill_meta);
|
skill->AddPassiveSkillBuff();
|
||||||
if (skill_meta->i->skill_cd() > 10000) {
|
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);
|
auto itr = passive_skill_hash_.find(skill_id);
|
||||||
if (itr != passive_skill_hash_.end()) {
|
if (itr != passive_skill_hash_.end()) {
|
||||||
ClearPassiveSkillBuff(itr->second->meta);
|
itr->second->ClearPassiveSkillBuff();
|
||||||
delete itr->second;
|
delete itr->second;
|
||||||
passive_skill_hash_.erase(itr);
|
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();
|
auto itr = passive_skill_hash_.find(skill_id);
|
||||||
}
|
return itr != passive_skill_hash_.end() ? itr->second : nullptr;
|
||||||
|
|
||||||
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_;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Creature::SelectSkillTargets(Skill* skill, const a8::Vec2& target_pos, std::set<Entity*>& target_list)
|
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 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(int skill_id);
|
Skill* GetPassiveSkill(int skill_id);
|
||||||
void RemovePassiveSkill(int skill_id);
|
void RemovePassiveSkill(int skill_id);
|
||||||
void ClearPassiveSkillBuff(MetaData::Skill* skill_meta);
|
|
||||||
void AddPassiveSkillBuff(MetaData::Skill* skill_meta);
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::array<float, kHAT_End> buff_attr_abs_ = {};
|
std::array<float, kHAT_End> buff_attr_abs_ = {};
|
||||||
@ -94,4 +92,6 @@ private:
|
|||||||
a8::Vec2 skill_target_pos_;
|
a8::Vec2 skill_target_pos_;
|
||||||
std::map<int, Skill*> skill_hash_;
|
std::map<int, Skill*> skill_hash_;
|
||||||
std::map<int, Skill*> passive_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);
|
int skill_left_time = std::max(0, GetCd() - passed_time);
|
||||||
return skill_left_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 GetCd();
|
||||||
int GetLeftTime();
|
int GetLeftTime();
|
||||||
|
|
||||||
|
void ClearPassiveSkillBuff();
|
||||||
|
void AddPassiveSkillBuff();
|
||||||
|
|
||||||
};
|
};
|
||||||
|
Loading…
x
Reference in New Issue
Block a user