diff --git a/server/gameserver/android.ai.cc b/server/gameserver/android.ai.cc index 70468246..e4b03d06 100644 --- a/server/gameserver/android.ai.cc +++ b/server/gameserver/android.ai.cc @@ -101,6 +101,9 @@ void AndroidAI::Update(int delta_time) DefaultAi(); return; } + if (hum->HasSpecMove()) { + hum->_UpdateSpecMove(); + } UpdateNewAI(); } diff --git a/server/gameserver/buff.cc b/server/gameserver/buff.cc index 5e6389bb..1283afb7 100644 --- a/server/gameserver/buff.cc +++ b/server/gameserver/buff.cc @@ -542,10 +542,36 @@ void Buff::ProcTurnOver() return; } #endif + a8::Vec2 old_dir = owner->GetMoveDir(); a8::Vec2 old_pos = owner->GetPos(); float distance = owner->HasBuffEffect(kBET_Car) ? phase->param1.GetDouble() * 1.5 : phase->param1.GetDouble(); +#ifdef DEBUG + caster_.Get()->SendDebugMsg(a8::Format("ProcBecome currTimes:%d last_pos:%d,%d curr_pos:%d,%d", + { + skill->GetCurrTimes(), + owner->last_turn_over_pos.x, + owner->last_turn_over_pos.y, + owner->GetPos().x, + owner->GetPos().y + })); +#endif + if (phase->param2.GetInt() == 1) { + if (owner->turn_over_times % 2 == 1) { + distance = old_pos.Distance(owner->last_turn_over_pos); + if (distance > 0.01f) { + a8::Vec2 new_dir = owner->last_turn_over_pos - old_pos; + new_dir.Normalize(); + owner->SetMoveDir(new_dir); + } + } + } owner->_UpdateMove(distance); + owner->SetMoveDir(old_dir); + if (phase->param2.GetInt() == 1) { + ++owner->turn_over_times; + owner->last_turn_over_pos = old_pos; + } int moved_distance = (int)owner->GetPos().Distance(old_pos); moved_distance = std::min(moved_distance, 200); if (!meta->param1_int_list.empty() && moved_distance > 2) { diff --git a/server/gameserver/creature.cc b/server/gameserver/creature.cc index d535f940..04f99d40 100644 --- a/server/gameserver/creature.cc +++ b/server/gameserver/creature.cc @@ -689,6 +689,11 @@ void Creature::OnBuffRemove(Buff& buff) DecDisableMoveDirTimes(); } break; + case kBET_BePull: + { + int i = 0; + } + break; default: { } @@ -3079,3 +3084,70 @@ void Creature::SetBattleContext(std::shared_ptr c) { battle_context_ = c; } + + +bool Creature::HasSpecMove() +{ + return GetBuffByEffectId(kBET_JumpTo) || + GetBuffByEffectId(kBET_BePull); +} + +void Creature::_UpdateSpecMove() +{ + if (!HasSpecMove()) { + return; + } + bool move_end = false; + float target_distance = target_pos.Distance(GetPos()); + if (target_distance <= 0.000001f) { + move_end = true; + } else { + a8::Vec2 old_move_dir = GetMoveDir(); + a8::Vec2 move_dir = target_pos - GetPos(); + move_dir.Normalize(); + SetMoveDir(move_dir); + bool is_collision = false; + std::function old_on_move_collision = on_move_collision; + on_move_collision = + [&is_collision] () { + is_collision = true; + return false; + }; + + _UpdateMove(std::min((int)target_distance, (int)GetSpeed())); + + on_move_collision = old_on_move_collision; + move_dir = old_move_dir; + target_distance = target_pos.Distance(GetPos()); + if (is_collision || target_distance <= 1.0001f) { + move_end = true; + } + } + if (move_end) { + Buff* buff = GetBuffByEffectId(kBET_JumpTo); + if (buff) { + if (CurrentSkill() && + buff->skill_meta == CurrentSkill()->meta && + !CurrentSkill()->meta->phases.empty()) { + std::set target_list; + 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(CurrentSkill(), GetPos(), target_list); + mutable_skill_meta->set_skill_distance(old_skill_distance); + + TriggerBuff(CurrentSkill(), target_list, kBTT_SkillHit); + } + RemoveBuffByEffectId(kBET_JumpTo); + } + buff = GetBuffByEffectId(kBET_BePull); + if (buff) { + MetaData::Buff* new_buff = MetaMgr::Instance()->GetBuff(1039); + if (new_buff) { + AddBuff(this, new_buff, 1); + } + RemoveBuffByEffectId(kBET_BePull); + } + } +} + diff --git a/server/gameserver/creature.h b/server/gameserver/creature.h index af76af76..c3fee37b 100644 --- a/server/gameserver/creature.h +++ b/server/gameserver/creature.h @@ -101,6 +101,9 @@ class Creature : public MoveableEntity std::function on_loading_bullet; CreatureWeakPtr follow_target; + int turn_over_times = 0; + a8::Vec2 last_turn_over_pos; + Creature(); virtual ~Creature() override; virtual void Initialize() override; @@ -204,6 +207,8 @@ class Creature : public MoveableEntity void DecInventory(int slot_id, int num); std::array& GetInventoryData() { return inventory_; }; virtual void _UpdateMove(int speed) {}; + bool HasSpecMove(); + void _UpdateSpecMove(); void CheckSpecObject(); bool CollisonDetection(); diff --git a/server/gameserver/hero.ai.cc b/server/gameserver/hero.ai.cc index f31ecc7c..87b90a27 100644 --- a/server/gameserver/hero.ai.cc +++ b/server/gameserver/hero.ai.cc @@ -33,6 +33,9 @@ void HeroAI::Update(int delta_time) if (hero->dead) { return; } + if (hero->HasSpecMove()) { + hero->_UpdateSpecMove(); + } UpdateAI(); } diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index 9830863d..1f0ed11c 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -1806,71 +1806,6 @@ int Human::GetSkinConfigLv(int skin_id) return itr != skin_configs.end() ? itr->second : 0; } -bool Human::HasSpecMove() -{ - return GetBuffByEffectId(kBET_JumpTo) || - GetBuffByEffectId(kBET_BePull); -} - -void Human::_UpdateSpecMove() -{ - if (!HasSpecMove()) { - return; - } - bool move_end = false; - float target_distance = target_pos.Distance(GetPos()); - if (target_distance <= 0.000001f) { - move_end = true; - } else { - a8::Vec2 old_move_dir = GetMoveDir(); - a8::Vec2 move_dir = target_pos - GetPos(); - move_dir.Normalize(); - SetMoveDir(move_dir); - bool is_collision = false; - std::function old_on_move_collision = on_move_collision; - on_move_collision = - [&is_collision] () { - is_collision = true; - return false; - }; - - _UpdateMove(std::min((int)target_distance, (int)GetSpeed())); - - on_move_collision = old_on_move_collision; - move_dir = old_move_dir; - target_distance = target_pos.Distance(GetPos()); - if (is_collision || target_distance <= 1.0001f) { - move_end = true; - } - } - if (move_end) { - Buff* buff = GetBuffByEffectId(kBET_JumpTo); - if (buff) { - if (CurrentSkill() && - buff->skill_meta == CurrentSkill()->meta && - !CurrentSkill()->meta->phases.empty()) { - std::set target_list; - 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(CurrentSkill(), GetPos(), target_list); - mutable_skill_meta->set_skill_distance(old_skill_distance); - - TriggerBuff(CurrentSkill(), target_list, kBTT_SkillHit); - } - RemoveBuffByEffectId(kBET_JumpTo); - } - buff = GetBuffByEffectId(kBET_BePull); - if (buff) { - MetaData::Buff* new_buff = MetaMgr::Instance()->GetBuff(1039); - if (new_buff) { - AddBuff(this, new_buff, 1); - } - RemoveBuffByEffectId(kBET_BePull); - } - } -} - void Human::_UpdateMove(int speed) { if (HasBuffEffect(kBET_Vertigo)) { diff --git a/server/gameserver/human.h b/server/gameserver/human.h index 140e7250..ea286563 100644 --- a/server/gameserver/human.h +++ b/server/gameserver/human.h @@ -326,8 +326,6 @@ class Human : public Creature void OnEnable(); void OnDisable(); ObjectSyncFlags* GetObjectSyncFlags(int obj_uniid); - bool HasSpecMove(); - void _UpdateSpecMove(); virtual void _UpdateMove(int speed) override; Car* GetCar() { return car_; } void SetCar(Car* car) { car_ = car; }