diff --git a/server/gameserver/creature.cc b/server/gameserver/creature.cc index 8f93f6f..4c15d9f 100644 --- a/server/gameserver/creature.cc +++ b/server/gameserver/creature.cc @@ -339,7 +339,7 @@ void Creature::DoSkill(int skill_id, int target_id, const a8::Vec2& target_pos) if (CanUseSkill(skill_id)) { ResetSkill(); playing_skill = true; - last_use_skill_frameno_ = room->GetFrameNo(); + CurrentSkill()->last_use_frameno = room->GetFrameNo(); if (skill_meta_->i->skill_target() == kST_Self ) { skill_target_id_ = GetEntityUniId(); @@ -391,7 +391,7 @@ void Creature::UpdateSkill() if (skill_meta_) { if (curr_skill_phase < skill_meta_->phases.size()) { MetaData::SkillPhase* phase = &skill_meta_->phases[curr_skill_phase]; - if (phase->time_offset >= (int)((room->GetFrameNo() - last_use_skill_frameno_) * FRAME_RATE_MS)) { + if (phase->time_offset >= CurrentSkill()->GetLeftTime()) { ProcSkillPhase(phase); ++curr_skill_phase; } @@ -455,3 +455,13 @@ void Creature::ProcSkillPhase(MetaData::SkillPhase* phase) break; } } + +MetaData::SkillPhase* Creature::GetCurrSkillPhase() +{ + return curr_skill_phase < skill_meta_->phases.size() ? &skill_meta_->phases[curr_skill_phase] : nullptr; +} + +Skill* Creature::CurrentSkill() +{ + return nullptr; +} diff --git a/server/gameserver/creature.h b/server/gameserver/creature.h index a9fdfaf..9659b85 100644 --- a/server/gameserver/creature.h +++ b/server/gameserver/creature.h @@ -51,19 +51,21 @@ class Creature : public MoveableEntity virtual bool CanUseSkill(int skill_id); void DoSkill(int skill_id, int target_id, const a8::Vec2& target_pos); void ResetSkill(); + Skill* CurrentSkill(); + MetaData::SkillPhase* GetCurrSkillPhase(); protected: - size_t curr_skill_phase = 0; a8::Vec2 skill_dir; float skill_param1 = 0; bool playing_skill = false; int skill_target_id_ = 0; a8::Vec2 skill_target_pos_; + #if 0 long long last_use_skill_frameno_ = 0; + #endif a8::XTimerAttacher skill_xtimer_attacher_; MetaData::Skill* skill_meta_ = nullptr; - std::map skill_hash_; private: @@ -82,5 +84,7 @@ private: std::array buff_effect_ = {}; std::list buff_list_; + size_t curr_skill_phase = 0; + std::map skill_hash_; std::map passive_skill_metas_; }; diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index 2b0f5bb..702b13f 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -2908,11 +2908,6 @@ Skin* Human::GetSkinByIdx(int idx) return nullptr; } -MetaData::Skill* Human::CurrentSkillMeta() -{ - return skill_meta_; -} - void Human::TriggerOneObjectBuff(Entity* target, BuffTriggerType_e trigger_type) { if (!target->IsEntityType(ET_Player)) { @@ -2984,16 +2979,17 @@ void Human::AddBuffPostProc(Creature* caster, Buff* buff) break; case kBET_TurnOver: { - if (curr_skill_phase < skill_meta_->phases.size()) { - MetaData::SkillPhase* phase = &skill_meta_->phases[curr_skill_phase]; - if (phase->time_offset >= (int)((room->GetFrameNo() - last_use_skill_frameno_) * FRAME_RATE_MS)) { - if (HasBuffEffect(kBET_Car)) { - _UpdateMove(phase->param1.GetDouble() * 1.5); - } else { - _UpdateMove(phase->param1); - } + MetaData::SkillPhase* phase = GetCurrSkillPhase(); + #if 0 + if (phase && + phase->time_offset >= (int)((room->GetFrameNo() - last_use_skill_frameno_) * FRAME_RATE_MS)) { + if (HasBuffEffect(kBET_Car)) { + _UpdateMove(phase->param1.GetDouble() * 1.5); + } else { + _UpdateMove(phase->param1); } } + #endif } break; case kBET_Camouflage: diff --git a/server/gameserver/human.h b/server/gameserver/human.h index 4189c9a..a4b481c 100644 --- a/server/gameserver/human.h +++ b/server/gameserver/human.h @@ -194,7 +194,6 @@ class Human : public Creature void DoJump(); virtual bool CanUseSkill(int skill_id) override; virtual int SelectSkillId(); - MetaData::Skill* CurrentSkillMeta(); void DoGetOn(int obj_uniid); void DoGetDown(); void FindLocation(); diff --git a/server/gameserver/zombiemode.ai.cc b/server/gameserver/zombiemode.ai.cc index 94677f7..22f78f4 100644 --- a/server/gameserver/zombiemode.ai.cc +++ b/server/gameserver/zombiemode.ai.cc @@ -7,6 +7,7 @@ #include "room.h" #include "metamgr.h" #include "player.h" +#include "skill.h" const int SHUA_RANGE = 580; @@ -191,8 +192,8 @@ void ZombieModeAI::UpdateAttack() float distance = myself->GetPos().Distance(node_->target->GetPos()); if (distance > GetAttackRange()) { if (myself->CanUseSkill(myself->SelectSkillId()) && - myself->CurrentSkillMeta()->i->skill_id() != TURN_OVER_SKILL_ID && - distance < myself->CurrentSkillMeta()->i->skill_distance()) { + myself->CurrentSkill()->meta->i->skill_id() != TURN_OVER_SKILL_ID && + distance < myself->CurrentSkill()->meta->i->skill_distance()) { DoSkill(); } else if (node_->ai_meta->i->pursuit_radius() <= 0) { //站桩