diff --git a/server/gameserver/creature.cc b/server/gameserver/creature.cc index 44c5d59..75351e7 100644 --- a/server/gameserver/creature.cc +++ b/server/gameserver/creature.cc @@ -292,33 +292,30 @@ void Creature::AddPassiveSkillBuff(MetaData::Skill* skill_meta) if (!skill_meta) { return; } - MetaData::Skill* old_curr_skill = skill_meta_; int old_skill_target_id_ = skill_target_id_; a8::Vec2 old_skill_target_pos_ = skill_target_pos_; - skill_meta_ = skill_meta; skill_target_id_ = GetEntityUniId(); skill_target_pos_ = GetPos(); std::set target_list; - SelectSkillTargets(GetPos(), target_list); - TriggerBuff(target_list, kBTT_UseSkill); + SelectSkillTargets(CurrentSkill(), GetPos(), target_list); + TriggerBuff(CurrentSkill(), target_list, kBTT_UseSkill); - skill_meta_= old_curr_skill; skill_target_id_ = old_skill_target_id_; skill_target_pos_ = old_skill_target_pos_; } -void Creature::SelectSkillTargets(const a8::Vec2& target_pos, std::set& target_list) +void Creature::SelectSkillTargets(Skill* skill, const a8::Vec2& target_pos, std::set& target_list) { - switch (CurrentSkill()->meta->i->skill_target()) { + switch (skill->meta->i->skill_target()) { case kST_All: { TouchAllLayerHumanList ( - [this, &target_pos, &target_list] (Human* hum, bool& stop) + [this, skill, &target_pos, &target_list] (Human* hum, bool& stop) { - if (hum->GetPos().Distance(target_pos) < CurrentSkill()->meta->i->skill_distance()) { + if (hum->GetPos().Distance(target_pos) < skill->meta->i->skill_distance()) { target_list.insert(hum); } }); @@ -338,7 +335,7 @@ void Creature::SelectSkillTargets(const a8::Vec2& target_pos, std::set& { #if 0 if ((hum == this || hum->team_id == team_id) && - hum->GetPos().Distance(target_pos) < CurrentSkill()->meta->i->skill_distance()) { + hum->GetPos().Distance(target_pos) < skill->meta->i->skill_distance()) { target_list.insert(hum); } #endif @@ -353,7 +350,7 @@ void Creature::SelectSkillTargets(const a8::Vec2& target_pos, std::set& { #if 0 if ((hum != this && hum->team_id == team_id) && - hum->GetPos().Distance(target_pos) < CurrentSkill()->i->skill_distance()) { + hum->GetPos().Distance(target_pos) < skill->i->skill_distance()) { target_list.insert(hum); } #endif @@ -381,7 +378,7 @@ void Creature::SelectSkillTargets(const a8::Vec2& target_pos, std::set& { #if 0 if ((hum->team_id != team_id) && - hum->GetPos().Distance(target_pos) < CurrentSkill()->i->skill_distance()) { + hum->GetPos().Distance(target_pos) < skill->i->skill_distance()) { target_list.insert(hum); } #endif @@ -396,7 +393,7 @@ void Creature::SelectSkillTargets(const a8::Vec2& target_pos, std::set& { #if 0 if ((hum->team_id != team_id) && - hum->GetPos().Distance(target_pos) < CurrentSkill()->i->skill_distance()) { + hum->GetPos().Distance(target_pos) < skill->i->skill_distance()) { target_list.insert(hum); } #endif @@ -411,7 +408,7 @@ void Creature::SelectSkillTargets(const a8::Vec2& target_pos, std::set& { #if 0 if ((hum == this || this->IsEnemy(hum)) && - hum->GetPos().Distance(target_pos) < CurrentSkill()->i->skill_distance()) { + hum->GetPos().Distance(target_pos) < skill->i->skill_distance()) { target_list.insert(hum); } #endif @@ -437,16 +434,54 @@ void Creature::SelectSkillTargets(const a8::Vec2& target_pos, std::set& } } -void Creature::TriggerBuff(std::set& target_list, BuffTriggerType_e trigger_type) +void Creature::TriggerBuff(Skill* skill, std::set& target_list, BuffTriggerType_e trigger_type) { for (Entity* entity : target_list) { - TriggerOneObjectBuff(entity, trigger_type); + TriggerOneObjectBuff(skill, entity, trigger_type); } } -void Creature::TriggerOneObjectBuff(Entity* target, BuffTriggerType_e trigger_type) +void Creature::TriggerOneObjectBuff(Skill* skill, Entity* target, BuffTriggerType_e trigger_type) { - + #if 0 + if (!target->IsEntityType(ET_Player)) { + return; + } + Human* hum = (Human*)target; + if (hum->dead) { + return; + } + auto itr = CurrentSkill()->meta->trigger_type_buffs.find(trigger_type); + if (itr != CurrentSkill()->meta->trigger_type_buffs.end()) { + for (MetaData::Buff* buff_meta : itr->second) { + switch (buff_meta->i->buff_target()) { + case kBuffTargetSelf: //自己 + { + if (hum == this) { + hum->AddBuff(this, buff_meta, 1, CurrentSkill()->meta); + } + } + break; + case kBuffTargetFriendly: //友军 + { + if (hum->team_id == team_id) { + hum->AddBuff(this, buff_meta, 1, CurrentSkill()->meta); + } + } + break; + case kBuffTargetEnemy: //敌军 + { + if (hum->team_id != team_id) { + hum->AddBuff(this, buff_meta, 1, CurrentSkill()->meta); + } + } + break; + default: + break; + } + } + } + #endif } Skill* Creature::GetSkill(int skill_id) @@ -473,7 +508,7 @@ void Creature::DoSkill(int skill_id, int target_id, const a8::Vec2& target_pos) ResetSkill(); playing_skill = true; CurrentSkill()->last_use_frameno = room->GetFrameNo(); - if (skill_meta_->i->skill_target() == kST_Self + if (CurrentSkill()->meta->i->skill_target() == kST_Self ) { skill_target_id_ = GetEntityUniId(); } @@ -482,9 +517,10 @@ void Creature::DoSkill(int skill_id, int target_id, const a8::Vec2& target_pos) Creature* c = (Creature*)entity; std::set target_list; skill_target_pos_ = c->GetPos(); - SelectSkillTargets(c->GetPos(), target_list); - TriggerBuff(target_list, kBTT_UseSkill); - if (!skill_meta_->phases.empty() && skill_meta_->phases[0].time_offset <= 0) { + SelectSkillTargets(c->CurrentSkill(), c->GetPos(), target_list); + TriggerBuff(CurrentSkill(), target_list, kBTT_UseSkill); + if (!CurrentSkill()->meta->phases.empty() && + CurrentSkill()->meta->phases[0].time_offset <= 0) { UpdateSkill(); } } else { @@ -518,9 +554,9 @@ void Creature::ResetSkill() void Creature::UpdateSkill() { - if (skill_meta_) { - if (curr_skill_phase < skill_meta_->phases.size()) { - MetaData::SkillPhase* phase = &skill_meta_->phases[curr_skill_phase]; + if (CurrentSkill()) { + if (curr_skill_phase < CurrentSkill()->meta->phases.size()) { + MetaData::SkillPhase* phase = &CurrentSkill()->meta->phases[curr_skill_phase]; if (phase->time_offset >= CurrentSkill()->GetLeftTime()) { ProcSkillPhase(phase); ++curr_skill_phase; @@ -565,11 +601,11 @@ void Creature::ProcSkillPhase(MetaData::SkillPhase* phase) weapon_upgrade_meta, bullet_meta, 1, - skill_meta_->i->skill_id(), + CurrentSkill() ? CurrentSkill()->meta->i->skill_id() : 0, target_distance, false); - #endif attack_dir = old_attack_dir; + #endif } } } @@ -588,7 +624,8 @@ void Creature::ProcSkillPhase(MetaData::SkillPhase* phase) MetaData::SkillPhase* Creature::GetCurrSkillPhase() { - return curr_skill_phase < skill_meta_->phases.size() ? &skill_meta_->phases[curr_skill_phase] : nullptr; + return curr_skill_phase < CurrentSkill()->meta->phases.size() ? + &CurrentSkill()->meta->phases[curr_skill_phase] : nullptr; } Skill* Creature::CurrentSkill() @@ -748,7 +785,7 @@ void Creature::ProcBuffEffect(Creature* caster, Buff* buff) .SetSender(this) .SetParam1(caster) .SetParam2(buff->meta->param2) - .SetParam3(((Human*)caster)->skill_meta_), + .SetParam3(((Human*)caster)->CurrentSkill()->meta), [] (const a8::XParams& param) { Human* hum = (Human*)param.sender.GetUserData(); @@ -756,7 +793,7 @@ void Creature::ProcBuffEffect(Creature* caster, Buff* buff) int buff_id = param.param2; MetaData::Skill* skill = (MetaData::Skill*)param.param3.GetUserData(); MetaData::Buff* buff_meta = MetaMgr::Instance()->GetBuff(buff_id); - if (buff_meta && skill == caster->skill_meta_ && caster) { + if (buff_meta && skill == caster->CurrentSkill()->meta && caster) { hum->AddBuff(caster, buff_meta, 1, skill); } }, diff --git a/server/gameserver/creature.h b/server/gameserver/creature.h index 7788471..cad6141 100644 --- a/server/gameserver/creature.h +++ b/server/gameserver/creature.h @@ -42,19 +42,17 @@ class Creature : public MoveableEntity float GetBuffAttrAbs(int attr_id); float GetBuffAttrRate(int attr_id); void FillBuffList(::google::protobuf::RepeatedPtrField<::cs::MFBuff>* pb_buff_list); - void TriggerBuff(std::set& target_list, BuffTriggerType_e trigger_type); + void TriggerBuff(Skill* skill, std::set& target_list, BuffTriggerType_e trigger_type); Skill* GetSkill(int skill_id); void AddSkill(int skill_id); void ClearSkill(); - void AddPassiveSkill(MetaData::Skill* skill_meta); void RemovePassiveSkill(MetaData::Skill* skill_meta); void ClearPassiveSkill(); - bool HasPassiveSkill(MetaData::Skill* skill_meta); - void ClearPassiveSkillBuff(MetaData::Skill* skill_meta); - void AddPassiveSkillBuff(MetaData::Skill* skill_meta); - virtual void SelectSkillTargets(const a8::Vec2& target_pos, std::set& target_list); + virtual void SelectSkillTargets(Skill* skill, + const a8::Vec2& target_pos, + std::set& target_list); virtual bool CanUseSkill(int skill_id); void DoSkill(int skill_id, int target_id, const a8::Vec2& target_pos); void ResetSkill(); @@ -69,13 +67,18 @@ private: virtual void AddBuffPostProc(Creature* caster, Buff* buff); virtual void OnBuffRemove(const Buff& buff); virtual void SendDebugMsg(const std::string& debug_msg); - virtual void TriggerOneObjectBuff(Entity* target, BuffTriggerType_e trigger_type); virtual void DoSkillPreProc(int skill_id, int target_id, const a8::Vec2& target_pos); virtual void DoSkillPostProc(bool used, int skill_id, int target_id, const a8::Vec2& target_pos); virtual void _UpdateMove(int speed) {}; + void UpdateSkill(); void ProcSkillPhase(MetaData::SkillPhase* phase); void ProcBuffEffect(Creature* caster, Buff* buff); + void TriggerOneObjectBuff(Skill* skill, Entity* target, BuffTriggerType_e trigger_type); + + bool HasPassiveSkill(MetaData::Skill* skill_meta); + void ClearPassiveSkillBuff(MetaData::Skill* skill_meta); + void AddPassiveSkillBuff(MetaData::Skill* skill_meta); private: std::array buff_attr_abs_ = {}; @@ -86,7 +89,6 @@ private: a8::Vec2 skill_dir; float skill_param1 = 0; bool playing_skill = false; - MetaData::Skill* skill_meta_ = nullptr; size_t curr_skill_phase = 0; int skill_target_id_ = 0; a8::Vec2 skill_target_pos_; diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index 5e260d6..b2d50e3 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -2009,10 +2009,10 @@ void Human::_UpdateSpecMove() metatable::Skill* mutable_skill_meta = (metatable::Skill*)CurrentSkill()->meta->i; float old_skill_distance = CurrentSkill()->meta->i->skill_distance(); mutable_skill_meta->set_skill_distance(CurrentSkill()->meta->phases[0].param1.GetDouble()); - SelectSkillTargets(GetPos(), target_list); + SelectSkillTargets(CurrentSkill(), GetPos(), target_list); mutable_skill_meta->set_skill_distance(old_skill_distance); - TriggerBuff(target_list, kBTT_SkillHit); + TriggerBuff(CurrentSkill(), target_list, kBTT_SkillHit); } RemoveBuffByEffectId(kBET_JumpTo); } @@ -2897,47 +2897,6 @@ Skin* Human::GetSkinByIdx(int idx) return nullptr; } -void Human::TriggerOneObjectBuff(Entity* target, BuffTriggerType_e trigger_type) -{ - if (!target->IsEntityType(ET_Player)) { - return; - } - Human* hum = (Human*)target; - if (hum->dead) { - return; - } - auto itr = CurrentSkill()->meta->trigger_type_buffs.find(trigger_type); - if (itr != CurrentSkill()->meta->trigger_type_buffs.end()) { - for (MetaData::Buff* buff_meta : itr->second) { - switch (buff_meta->i->buff_target()) { - case kBuffTargetSelf: //自己 - { - if (hum == this) { - hum->AddBuff(this, buff_meta, 1, CurrentSkill()->meta); - } - } - break; - case kBuffTargetFriendly: //友军 - { - if (hum->team_id == team_id) { - hum->AddBuff(this, buff_meta, 1, CurrentSkill()->meta); - } - } - break; - case kBuffTargetEnemy: //敌军 - { - if (hum->team_id != team_id) { - hum->AddBuff(this, buff_meta, 1, CurrentSkill()->meta); - } - } - break; - default: - break; - } - } - } -} - void Human::AddBuffPostProc(Creature* caster, Buff* buff) { room->frame_event.AddBuff(this, buff); diff --git a/server/gameserver/human.h b/server/gameserver/human.h index 6979f32..e1f195f 100644 --- a/server/gameserver/human.h +++ b/server/gameserver/human.h @@ -237,7 +237,6 @@ class Human : public Creature void RandSkin(); void SetSkin(int idx, int skin_id); Skin* GetSkinByIdx(int idx); - virtual void TriggerOneObjectBuff(Entity* target, BuffTriggerType_e trigger_type) override; int GetLevel() {return level_;}; int GetExp() {return exp_;}; void OnAttack() {};