From 0d6d0cfac4d91421cc53a90c377803307ecb68d0 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Wed, 30 Nov 2022 10:34:24 +0800 Subject: [PATCH] 1 --- server/gameserver/human.cc | 20 ++++++++++---------- server/gameserver/mapinstance.cc | 8 ++++---- server/gameserver/mapinstance.h | 2 +- server/gameserver/moveableentity.cc | 23 ++++++++++++++++++++++- server/gameserver/moveableentity.h | 7 ++++--- server/gameserver/player.cc | 8 ++++++-- server/gameserver/precompile.h | 3 +++ 7 files changed, 50 insertions(+), 21 deletions(-) diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index ad2ab25b..8041bc41 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -2014,6 +2014,15 @@ void Human::_UpdateMove(int speed) if (GetDisableMoveTimes() > 0) { return; } +#ifdef MAP3D + { + if (HasBuffEffect(kBET_Hide)) { + RemoveBuffByEffectId(kBET_Hide); + } + + CheckSpecObject(); + } +#else { a8::UnSetBitFlag(status, CS_Collisioning); do { @@ -2023,19 +2032,11 @@ void Human::_UpdateMove(int speed) } while (speed > 0 && !a8::HasBitFlag(status, CS_Collisioning)); CheckSpecObject(); } +#endif } void Human::_InternalUpdateMove(float speed) { -#ifdef MAP3D - a8::Vec2 old_pos = GetPos(); - - if (HasBuffEffect(kBET_Hide)) { - RemoveBuffByEffectId(kBET_Hide); - } - - room->grid_service->MoveCreature(this); -#else float nx = GetMoveDir().x * speed; float ny = GetMoveDir().y * speed; a8::Vec2 old_pos = GetPos(); @@ -2107,7 +2108,6 @@ void Human::_InternalUpdateMove(float speed) SetPos(old_pos + a8::Vec2(nx, ny)); room->grid_service->MoveCreature(this); -#endif } void Human::GenBattleReportData(a8::MutableXObject* params) diff --git a/server/gameserver/mapinstance.cc b/server/gameserver/mapinstance.cc index 6fd2e0b6..7b46718b 100644 --- a/server/gameserver/mapinstance.cc +++ b/server/gameserver/mapinstance.cc @@ -158,9 +158,9 @@ void MapInstance::Init() dtTileRef tile_ref = navmesh_->getTileRefAt(0, 0, 0); int i = 0; - a8::Vec3 start; - a8::Vec3 end; - a8::Vec3 hit_point; + glm::vec3 start; + glm::vec3 end; + glm::vec3 hit_point; start.x = 10; //start.y = 0.166666701; start.y = 0.0; @@ -664,7 +664,7 @@ int MapInstance::FindRandomPointAroundCircle(int layer, return 0; } -int MapInstance::Raycast(int layer, const a8::Vec3& start, const a8::Vec3& end, a8::Vec3& hit_point) +int MapInstance::Raycast(int layer, const glm::vec3& start, const glm::vec3& end, glm::vec3& hit_point) { float hitPoint[3]; diff --git a/server/gameserver/mapinstance.h b/server/gameserver/mapinstance.h index 5a5fe165..cd4b080e 100644 --- a/server/gameserver/mapinstance.h +++ b/server/gameserver/mapinstance.h @@ -49,7 +49,7 @@ class MapInstance std::vector& points, unsigned int max_points, float max_radius); - int Raycast(int layer, const a8::Vec3& start, const a8::Vec3& end, a8::Vec3& hit_point); + int Raycast(int layer, const glm::vec3& start, const glm::vec3& end, glm::vec3& hit_point); bool FindNearestPoint(const a8::Vec3& center, float radius, a8::Vec3& nearestPt); private: diff --git a/server/gameserver/moveableentity.cc b/server/gameserver/moveableentity.cc index ee11cc02..34c45088 100644 --- a/server/gameserver/moveableentity.cc +++ b/server/gameserver/moveableentity.cc @@ -1,7 +1,9 @@ #include "precompile.h" + #include "moveableentity.h" #include "room.h" #include "human.h" +#include "mapinstance.h" void MoveableEntity::TraverseAllLayerEntityList(std::function func) { @@ -90,7 +92,7 @@ void MoveableEntity::SetMoveDir(const a8::Vec2& move_dir) ++chg_move_dir_times_; } -void MoveableEntity::SetTargetPos(const a8::Vec3& target_pos) +void MoveableEntity::SetTargetPos(const glm::vec3& target_pos) { target_pos_ = target_pos; ++chg_target_pos_times_; @@ -123,3 +125,22 @@ float MoveableEntity::GetAttackDirRotate() } return angle; } + +void MoveableEntity::CalcTargetPos(float distance) +{ + glm::vec3 start; + glm::vec3 end; + glm::vec3 hit_point; + + start.x = GetPos().x / 10; + start.z = GetPos().y / 10; + + a8::Vec2 target_pos2d = GetPos() + GetMoveDir() * distance; + end.x = target_pos2d.x / 10; + end.z = target_pos2d.y / 10; + + int ret = room->map_instance->Raycast(0, start, end, hit_point); + if (ret > 1) { + } else { + } +} diff --git a/server/gameserver/moveableentity.h b/server/gameserver/moveableentity.h index d398f90b..fee9600b 100644 --- a/server/gameserver/moveableentity.h +++ b/server/gameserver/moveableentity.h @@ -26,8 +26,8 @@ class MoveableEntity : public RoomEntity virtual void UpdateCharImage(const char* file, int line, const char* func); virtual const a8::Vec2& GetMoveDir() { return move_dir_; }; virtual void SetMoveDir(const a8::Vec2& move_dir); - virtual const a8::Vec3& GetTargetPos() { return target_pos_; }; - virtual void SetTargetPos(const a8::Vec3& target_pos); + virtual const glm::vec3& GetTargetPos() { return target_pos_; }; + virtual void SetTargetPos(const glm::vec3& target_pos); virtual const a8::Vec2& GetAttackDir() { return attack_dir_; }; virtual void SetAttackDir(const a8::Vec2& attack_dir); virtual const a8::Vec2& GetShotDir() { return attack_dir_; }; @@ -35,6 +35,7 @@ class MoveableEntity : public RoomEntity int GetChgAttackDirTimes() { return chg_attack_dir_times_; } float GetAttackDirRotate(); int GetChgTargetPosTimes() { return chg_target_pos_times_; } + void CalcTargetPos(float distance); protected: int updated_times_ = 0; @@ -42,7 +43,7 @@ protected: private: a8::Vec2 move_dir_; a8::Vec2 attack_dir_; - a8::Vec3 target_pos_; + glm::vec3 target_pos_; std::set grid_list_; int chg_move_dir_times_ = 0; int chg_attack_dir_times_ = 0; diff --git a/server/gameserver/player.cc b/server/gameserver/player.cc index e982fffd..97f876e7 100644 --- a/server/gameserver/player.cc +++ b/server/gameserver/player.cc @@ -783,8 +783,12 @@ void Player::_CMMove(f8::MsgHdr& hdr, const cs::CMMove& msg) if (!(HasBuffEffect(kBET_Jump) && follow_target.Get())) { if (GetDisableMoveDirTimes() <= 0) { new_move_dir.Normalize(); - SetMoveDir(new_move_dir); - moving = true; + if (std::fabs(new_move_dir.x - GetMoveDir().x) > 0.00001f || + std::fabs(new_move_dir.y - GetMoveDir().y) > 0.00001f) { + SetMoveDir(new_move_dir); + CalcTargetPos(500); + moving = true; + } } } } diff --git a/server/gameserver/precompile.h b/server/gameserver/precompile.h index 6d665724..2aa8b558 100644 --- a/server/gameserver/precompile.h +++ b/server/gameserver/precompile.h @@ -10,6 +10,9 @@ #include #include +#include +#include + typedef std::function&)> CommonCbProc; #include "constant.h"