diff --git a/server/gameserver/android.ai.cc b/server/gameserver/android.ai.cc index 3c0bd22..d675bce 100644 --- a/server/gameserver/android.ai.cc +++ b/server/gameserver/android.ai.cc @@ -429,6 +429,9 @@ void AndroidNewAI::UpdateNewAI() abort(); } } + if (hum->playing_skill) { + hum->UpdateSkill(); + } ++node_.exec_frame_num; hum->shot_hold = false; switch (node_.main_state) { diff --git a/server/gameserver/creature.cc b/server/gameserver/creature.cc index d83a098..dd5eb4d 100644 --- a/server/gameserver/creature.cc +++ b/server/gameserver/creature.cc @@ -482,6 +482,12 @@ bool Creature::CanUseSkill(int skill_id) if (!skill) { return false; } + if (dead) { + return false; + } + if (playing_skill) { + return false; + } return skill->GetCurrTimes() > 0; } @@ -562,7 +568,7 @@ void Creature::ResetSkill() void Creature::UpdateSkill() { - if (CurrentSkill()) { + if (CurrentSkill() && !dead) { if (curr_skill_phase < CurrentSkill()->meta->phases.size()) { MetaData::SkillPhase* phase = &CurrentSkill()->meta->phases[curr_skill_phase]; if (phase->time_offset >= CurrentSkill()->GetPassedTime()) { @@ -572,6 +578,8 @@ void Creature::UpdateSkill() } else { playing_skill = false; } + } else { + playing_skill = false; } } diff --git a/server/gameserver/creature.h b/server/gameserver/creature.h index f947c9e..6dcfeac 100644 --- a/server/gameserver/creature.h +++ b/server/gameserver/creature.h @@ -45,6 +45,7 @@ class Creature : public MoveableEntity std::function on_move_collision; bool poisoning = false; long long poisoning_time = 0; + bool playing_skill = false; Weapon car_weapon; a8::Vec2 buff_vec2_param1; @@ -140,6 +141,7 @@ class Creature : public MoveableEntity Weapon* GetCurrWeapon() { return curr_weapon_; }; void SetCurrWeapon(Weapon* weapon); void ResetAllSkillCd(); + void UpdateSkill(); private: @@ -148,7 +150,6 @@ private: 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); - void UpdateSkill(); void ProcSkillPhase(MetaData::SkillPhase* phase); void ProcBuffEffect(Creature* caster, Buff* buff); void TriggerOneObjectBuff(Skill* skill, Creature* target, BuffTriggerType_e trigger_type); @@ -177,7 +178,6 @@ private: a8::Vec2 skill_dir_; float skill_param1 = 0; - bool playing_skill = false; size_t curr_skill_phase = 0; Skill* curr_skill_ = nullptr; int skill_target_id_ = 0; diff --git a/server/gameserver/player.cc b/server/gameserver/player.cc index 68795aa..e2393bb 100644 --- a/server/gameserver/player.cc +++ b/server/gameserver/player.cc @@ -129,7 +129,10 @@ void Player::InternalUpdate(int delta_time) if (has_use_item_id) { UpdateUseItemId(); } - } + if (playing_skill) { + UpdateSkill(); + } + } } void Player::UpdateMove() @@ -624,7 +627,7 @@ void Player::LootInteraction(Loot* entity) case IS_15XSCOPE: { if (item_meta->i->_inventory_slot() - IS_1XSCOPE > curr_scope_idx) { - curr_scope_idx = item_meta->i->_inventory_slot() - IS_1XSCOPE; + curr_scope_idx = item_meta->i->_inventory_slot() - IS_1XSCOPE; } } break; diff --git a/server/gameserver/zombiemode.ai.cc b/server/gameserver/zombiemode.ai.cc index 18441df..0cbedbe 100644 --- a/server/gameserver/zombiemode.ai.cc +++ b/server/gameserver/zombiemode.ai.cc @@ -93,6 +93,9 @@ void ZombieModeAI::UpdateAI() abort(); } } + if (hum->playing_skill) { + hum->UpdateSkill(); + } ++node_->exec_frame_num; hum->shot_hold = false; switch (node_->main_state) {