diff --git a/server/gameserver/movehelper.cc b/server/gameserver/movehelper.cc index 16d5f4bf..ba6b19b3 100644 --- a/server/gameserver/movehelper.cc +++ b/server/gameserver/movehelper.cc @@ -4,6 +4,8 @@ #include "moveableentity.h" #include "room.h" #include "mapinstance.h" +#include "creature.h" +#include "metamgr.h" MoveHelper::MoveHelper(class MoveableEntity* owner) { @@ -31,16 +33,36 @@ void MoveHelper::CalcTargetPos(float distance) end.z = target_pos2d.y / 10.0f; MovePathPoint point; - int ret = owner_->room->map_instance->Raycast(0, start, end, hit_point); - if (ret > 1) { - point.pos = hit_point * 10.f; + Creature* c = (Creature*)owner_; + if (c->HasBuffEffect(kBET_ThroughWall) || + c->HasBuffEffect(kBET_Fly)) { + point.tar_pos = end * 10.f; + if (point.tar_pos.x > owner_->room->GetMapMeta()->i->map_width() + 10) { + point.tar_pos.x = owner_->room->GetMapMeta()->i->map_width() - 10; + } + if (point.tar_pos.z > owner_->room->GetMapMeta()->i->map_height() + 10) { + point.tar_pos.z = owner_->room->GetMapMeta()->i->map_height() - 10; + } + if (point.tar_pos.x < 10) { + point.tar_pos.x = 10; + } + if (point.tar_pos.y < 10) { + point.tar_pos.y = 10; + } } else { - point.pos = end * 10.f; + int ret = owner_->room->map_instance->Raycast(0, start, end, hit_point); + if (ret > 1) { + point.tar_pos = hit_point * 10.f; + } else { + point.tar_pos = end * 10.f; + } } a8::Vec2 v2; - v2.x = point.pos.x; - v2.y = point.pos.z; + v2.x = point.tar_pos.x; + v2.y = point.tar_pos.z; point.distance = v2.Distance(owner_->GetPos()); + point.src_pos.x = owner_->GetPos().x; + point.src_pos.z = owner_->GetPos().y; paths_.push_back(point); } diff --git a/server/gameserver/movehelper.h b/server/gameserver/movehelper.h index 5fd66c3b..9cf36799 100644 --- a/server/gameserver/movehelper.h +++ b/server/gameserver/movehelper.h @@ -2,7 +2,9 @@ struct MovePathPoint { - glm::vec3 pos; + glm::vec3 src_pos; + glm::vec3 tar_pos; + glm::vec3 dir; float distance = 0.0f; };