From 8e54caefc23ed23160969dbd7199d690dded63cd Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Wed, 7 Dec 2022 15:04:01 +0800 Subject: [PATCH] 1 --- server/gameserver/movehelper.cc | 132 +++++++++++++++----------------- server/gameserver/movehelper.h | 12 ++- 2 files changed, 70 insertions(+), 74 deletions(-) diff --git a/server/gameserver/movehelper.cc b/server/gameserver/movehelper.cc index 08db43e9..7e1ec075 100644 --- a/server/gameserver/movehelper.cc +++ b/server/gameserver/movehelper.cc @@ -10,15 +10,6 @@ #include "creature.h" #include "metamgr.h" -struct MovePathPoint -{ - glm::vec3 src_pos; - glm::vec3 tar_pos; - glm::vec3 curr_pos; - glm::vec3 dir; - float distance = 0.0f; -}; - MoveHelper::MoveHelper(Creature* owner) { owner_ = owner; @@ -34,35 +25,35 @@ bool MoveHelper::GetMovePosition(glm::vec3& out_pos) a8::Vec2 dir; auto& point = paths_[path_index_]; - src_pos.x = point->src_pos.x; - src_pos.y = point->src_pos.z; + src_pos.x = point.src_pos.x; + src_pos.y = point.src_pos.z; - curr_pos.x = point->curr_pos.x; - curr_pos.y = point->curr_pos.z; + curr_pos.x = point.curr_pos.x; + curr_pos.y = point.curr_pos.z; - tar_pos.x = point->tar_pos.x; - tar_pos.y = point->tar_pos.z; + tar_pos.x = point.tar_pos.x; + tar_pos.y = point.tar_pos.z; - dir.x = point->dir.x; - dir.y = point->dir.z; + dir.x = point.dir.x; + dir.y = point.dir.z; curr_pos = (curr_pos + dir * owner_->GetSpeed() * 1); - point->curr_pos.x = curr_pos.x; - point->curr_pos.z = curr_pos.y; + point.curr_pos.x = curr_pos.x; + point.curr_pos.z = curr_pos.y; owner_->SetPos(curr_pos); - if (owner_->GetPos().Distance(src_pos) - point->distance >= 0.0001f) { + if (owner_->GetPos().Distance(src_pos) - point.distance >= 0.0001f) { owner_->SetPos(tar_pos); ++path_index_; if (path_index_ < paths_.size()) { auto& next_point = paths_[path_index_]; a8::Vec2 v2; - v2.x = next_point->tar_pos.x; - v2.y = next_point->tar_pos.z; + v2.x = next_point.tar_pos.x; + v2.y = next_point.tar_pos.z; a8::Vec2 dir = (v2 - owner_->GetPos()); dir.Normalize(); - next_point->dir.x = dir.x; - next_point->dir.z = dir.y; + next_point.dir.x = dir.x; + next_point.dir.z = dir.y; } } if (owner_->GetPos().x < 0 || @@ -99,52 +90,52 @@ void MoveHelper::CalcTargetPos(float distance) end.z = target_pos2d.y / 10.0f; bool is_hit = false; - MovePathPoint* point = new MovePathPoint(); + MovePathPoint point; if (c->HasBuffEffect(kBET_ThroughWall) || c->HasBuffEffect(kBET_Fly) || c->HasBuffEffect(kBET_Jump)) { - 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; + 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.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.x < 10) { + point.tar_pos.x = 10; } - if (point->tar_pos.z < 10) { - point->tar_pos.z = 10; + if (point.tar_pos.z < 10) { + point.tar_pos.z = 10; } } else { int ret = owner_->room->map_instance->Raycast(0, start, end, hit_point); if (ret > 0) { is_hit = true; - point->tar_pos = hit_point * 10.f; + point.tar_pos = hit_point * 10.f; } else { - point->tar_pos = end * 10.f; + point.tar_pos = end * 10.f; } } a8::Vec2 v2; - 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; - point->curr_pos.x = owner_->GetPos().x; - point->curr_pos.z = owner_->GetPos().y; + 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; + point.curr_pos.x = owner_->GetPos().x; + point.curr_pos.z = owner_->GetPos().y; - if (point->tar_pos.x < 0 || - point->tar_pos.z < 0) { + if (point.tar_pos.x < 0 || + point.tar_pos.z < 0) { abort(); } #ifdef DEBUG a8::XPrintf("CalcTargetPos src_pos:%f,%f tar_pos:%f,%f is_hit:%d start:%f,%f,%f end:%f,%f,%f distance:%f\n", { - point->src_pos.x, - point->src_pos.z, - point->tar_pos.x, - point->tar_pos.z, + point.src_pos.x, + point.src_pos.z, + point.tar_pos.x, + point.tar_pos.z, is_hit ? 1 : 0, start.x, @@ -154,7 +145,7 @@ void MoveHelper::CalcTargetPos(float distance) end.x, end.y, end.z, - point->distance + point.distance }); #endif @@ -164,8 +155,8 @@ void MoveHelper::CalcTargetPos(float distance) a8::Vec2 dir = (v2 - owner_->GetPos()); dir.Normalize(); - point->dir.x = dir.x; - point->dir.z = dir.y; + point.dir.x = dir.x; + point.dir.z = dir.y; paths_.push_back(point); } @@ -173,9 +164,6 @@ void MoveHelper::CalcTargetPos(float distance) void MoveHelper::ClearPath() { path_index_ = 0; - for (size_t i = 0; i < paths_.size(); ++i) { - delete paths_[i]; - } paths_.clear(); } @@ -199,26 +187,26 @@ void MoveHelper::AddPaths(const a8::Vec3& start, std::vector& paths) ++i; } for (; i < paths.size(); ++i) { - MovePathPoint* p = new MovePathPoint(); - p->src_pos = last_pos; - p->src_pos.x *= 10.f; - p->src_pos.y *= 10.f; - p->src_pos.z *= 10.f; + MovePathPoint p; + p.src_pos = last_pos; + p.src_pos.x *= 10.f; + p.src_pos.y *= 10.f; + p.src_pos.z *= 10.f; - p->tar_pos.x = paths[i].x * 10.f; - p->tar_pos.y = paths[i].y * 10.f; - p->tar_pos.z = paths[i].z * 10.f; + p.tar_pos.x = paths[i].x * 10.f; + p.tar_pos.y = paths[i].y * 10.f; + p.tar_pos.z = paths[i].z * 10.f; - p->curr_pos = p->src_pos; + p.curr_pos = p.src_pos; glm::vec2 src_pos; glm::vec2 tar_pos; - src_pos.x = p->src_pos.x; - src_pos.y = p->src_pos.z; + src_pos.x = p.src_pos.x; + src_pos.y = p.src_pos.z; - tar_pos.x = p->tar_pos.x; - tar_pos.y = p->tar_pos.z; + tar_pos.x = p.tar_pos.x; + tar_pos.y = p.tar_pos.z; { a8::Vec2 v1; @@ -229,7 +217,7 @@ void MoveHelper::AddPaths(const a8::Vec3& start, std::vector& paths) v2.x = src_pos.x; v2.y = src_pos.y; - p->distance = v1.Distance(v2); + p.distance = v1.Distance(v2); } glm::vec2 dir = tar_pos - src_pos; dir = glm::normalize(dir); @@ -241,9 +229,9 @@ void MoveHelper::AddPaths(const a8::Vec3& start, std::vector& paths) abort(); } - p->dir.x = dir.x; - p->dir.y = 0; - p->dir.z = dir.y; + p.dir.x = dir.x; + p.dir.y = 0; + p.dir.z = dir.y; last_pos.x = paths[i].x; last_pos.y = paths[i].y; diff --git a/server/gameserver/movehelper.h b/server/gameserver/movehelper.h index 4f1bc5e5..5e416168 100644 --- a/server/gameserver/movehelper.h +++ b/server/gameserver/movehelper.h @@ -1,6 +1,14 @@ #pragma once -struct MovePathPoint; +struct MovePathPoint +{ + glm::vec3 src_pos; + glm::vec3 tar_pos; + glm::vec3 curr_pos; + glm::vec3 dir; + float distance = 0.0f; +}; + class Creature; class MoveHelper { @@ -14,7 +22,7 @@ class MoveHelper size_t GetPathSize(); private: - std::vector paths_; + std::vector paths_; int path_index_ = 0; Creature* owner_ = nullptr; };