From b4004df698e52c542fde2d906d4ffbeb91decdf3 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Fri, 22 Mar 2019 19:28:45 +0800 Subject: [PATCH] 1 --- server/gameserver/human.cc | 64 +++++++++++++++++++--------------- server/gameserver/player.cc | 16 +++++++-- server/gameserver/playermgr.cc | 3 +- server/gameserver/playermgr.h | 2 +- server/gameserver/roommgr.cc | 2 +- 5 files changed, 53 insertions(+), 34 deletions(-) diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index 975cc74..b2d8141 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -151,36 +151,39 @@ void Human::FindPath() float dot = Vector2D::UP.Dot(move_dir); if (std::abs(dot) <= 0.001f) { //相互垂直 //向上 - pos = pos + Vector2D::UP; - if (IsCollision()) { + pos = old_pos + Vector2D::UP; + if (!IsCollision()) { + return; + } else { //向下 - pos = old_pos; - pos = pos + Vector2D::DOWN; - if (IsCollision()) { + pos = old_pos + Vector2D::DOWN; + if (!IsCollision()) { return; } } } else if (dot > 0.001f) { //基本相同 //向右 - pos = pos + Vector2D::RIGHT; - if (IsCollision()) { + pos = old_pos + Vector2D::RIGHT; + if (!IsCollision()) { + return; + } else { //向上 - pos = old_pos; - pos = pos + Vector2D::UP; - if (IsCollision()) { + pos = old_pos + Vector2D::UP; + if (!IsCollision()) { return; } } } else if (dot < 0.001f) { //基本相反 //向右 - pos = pos + Vector2D::RIGHT; + pos = old_pos + Vector2D::RIGHT; if (IsCollision()) { //向下 - pos = old_pos; - pos = pos + Vector2D::DOWN; - if (IsCollision()) { + pos = old_pos + Vector2D::DOWN; + if (!IsCollision()) { return; } + } else { + return; } } } @@ -188,34 +191,37 @@ void Human::FindPath() float dot = Vector2D::DOWN.Dot(move_dir); if (std::abs(dot) <= 0.001f) { //相互垂直 //向下 - pos = pos + Vector2D::DOWN; - if (IsCollision()) { + pos = old_pos + Vector2D::DOWN; + if (!IsCollision()) { + return; + } else { //向上 - pos = old_pos; - pos = pos + Vector2D::UP; - if (IsCollision()) { + pos = old_pos + Vector2D::UP; + if (!IsCollision()) { return; } } } else if (dot > 0.001f) { //基本相同 //向左 - pos = pos + Vector2D::LEFT; - if (IsCollision()) { + pos = old_pos + Vector2D::LEFT; + if (!IsCollision()) { + return; + } else { //向下 - pos = old_pos; - pos = pos + Vector2D::DOWN; - if (IsCollision()) { + pos = old_pos + Vector2D::DOWN; + if (!IsCollision()) { return; } } } else if (dot < 0.001f) { //基本相反 //向左 - pos = pos + Vector2D::LEFT; - if (IsCollision()) { + pos = old_pos + Vector2D::LEFT; + if (!IsCollision()) { + return; + } else { //向上 - pos = old_pos; - pos = pos + Vector2D::UP; - if (IsCollision()) { + pos = old_pos + Vector2D::UP; + if (!IsCollision()) { return; } } diff --git a/server/gameserver/player.cc b/server/gameserver/player.cc index 64027f2..59a79b1 100644 --- a/server/gameserver/player.cc +++ b/server/gameserver/player.cc @@ -1,5 +1,7 @@ #include "precompile.h" +#include + #include "playermgr.h" #include "player.h" #include "cs_proto.pb.h" @@ -147,11 +149,21 @@ void Player::Shot() void Player::_CMMove(f8::MsgHdr& hdr, const cs::CMMove& msg) { + bool has_move_dir = msg.has_move_dir(); + moving = false; if (msg.has_move_dir()) { - move_dir.FromPB(&msg.move_dir()); - move_dir.Normalize(); + if (std::abs(msg.move_dir().x()) > FLT_EPSILON || + std::abs(msg.move_dir().y()) > FLT_EPSILON + ) { + move_dir.FromPB(&msg.move_dir()); + move_dir.Normalize(); + moving = true; + } } + assert(!isnan(move_dir.x) && !isnan(move_dir.y)); + #if 0 moving = msg.has_move_dir(); + #endif if (msg.has_attack_dir()) { attack_dir.FromPB(&msg.attack_dir()); attack_dir.Normalize(); diff --git a/server/gameserver/playermgr.cc b/server/gameserver/playermgr.cc index 02eed06..57a2e85 100644 --- a/server/gameserver/playermgr.cc +++ b/server/gameserver/playermgr.cc @@ -25,7 +25,7 @@ Player* PlayerMgr::GetPlayerBySocket(int socket) return itr != socket_hash_.end() ? itr->second : nullptr; } -Player* PlayerMgr::CreatePlayerByCMJoin(unsigned short obj_uniid, const cs::CMJoin& msg) +Player* PlayerMgr::CreatePlayerByCMJoin(int socket, unsigned short obj_uniid, const cs::CMJoin& msg) { Player* hum = new Player(); hum->entity_uniid = obj_uniid; @@ -39,6 +39,7 @@ Player* PlayerMgr::CreatePlayerByCMJoin(unsigned short obj_uniid, const cs::CMJo hum->use_touch = msg.use_touch(); hum->avatar_url = msg.avatar_url(); hum->energy_shield = msg.energy_shield(); + socket_hash_[socket] = hum; // hum->baseskin = msg.baseskin(); // hum->basemelee = msg.basemelee(); // hum->elo_score = msg.elo_score(); diff --git a/server/gameserver/playermgr.h b/server/gameserver/playermgr.h index 1b878e3..c84e674 100644 --- a/server/gameserver/playermgr.h +++ b/server/gameserver/playermgr.h @@ -21,7 +21,7 @@ class PlayerMgr : public a8::Singleton void Update(); Player* GetPlayerBySocket(int socket); - Player* CreatePlayerByCMJoin(unsigned short obj_uniid, const cs::CMJoin& msg); + Player* CreatePlayerByCMJoin(int socket, unsigned short obj_uniid, const cs::CMJoin& msg); private: std::map socket_hash_; diff --git a/server/gameserver/roommgr.cc b/server/gameserver/roommgr.cc index 20f8b96..7373718 100644 --- a/server/gameserver/roommgr.cc +++ b/server/gameserver/roommgr.cc @@ -47,7 +47,7 @@ void RoomMgr::_CMJoin(f8::MsgHdr& hdr, const cs::CMJoin& msg) room_hash_[room->room_uuid] = room; } unsigned short new_uniid = room->AllocUniid(); - Player* hum = PlayerMgr::Instance()->CreatePlayerByCMJoin(new_uniid, msg); + Player* hum = PlayerMgr::Instance()->CreatePlayerByCMJoin(hdr.socket_handle, new_uniid, msg); hum->meta = hum_meta; hum->socket_handle = hdr.socket_handle; hum->Initialize();