From b4004df698e52c542fde2d906d4ffbeb91decdf3 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Fri, 22 Mar 2019 19:28:45 +0800 Subject: [PATCH 1/4] 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(); From 609ae95ad19b6074ae18fd19e28a5f9b8b9777e8 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Sat, 23 Mar 2019 13:46:36 +0800 Subject: [PATCH 2/4] 1 --- server/gameserver/player.cc | 2 +- server/gameserver/player.h | 4 ++-- server/tools/protobuild/cs_proto.proto | 19 +++++++++++-------- 3 files changed, 14 insertions(+), 11 deletions(-) diff --git a/server/gameserver/player.cc b/server/gameserver/player.cc index 59a79b1..8470eab 100644 --- a/server/gameserver/player.cc +++ b/server/gameserver/player.cc @@ -213,7 +213,7 @@ void Player::_CMVoice(f8::MsgHdr& hdr, const cs::CMVoice& msg) send_func); } -void Player::FillMFPlayerData(cs::MFPlayerData* player_data) +void Player::FillMFPlayerData(cs::MFActivePlayerData* player_data) { player_data->set_has_action(false); } diff --git a/server/gameserver/player.h b/server/gameserver/player.h index 8148980..401394d 100644 --- a/server/gameserver/player.h +++ b/server/gameserver/player.h @@ -10,7 +10,7 @@ namespace cs class CMEmote; class CMSpectate; class CMVoice; - class MFPlayerData; + class MFActivePlayerData; } class Room; @@ -55,7 +55,7 @@ class Player : public Human void _CMSpectate(f8::MsgHdr& hdr, const cs::CMSpectate& msg); void _CMVoice(f8::MsgHdr& hdr, const cs::CMVoice& msg); - void FillMFPlayerData(cs::MFPlayerData* player_data); + void FillMFPlayerData(cs::MFActivePlayerData* player_data); private: cs::SMUpdate* update_msg = nullptr; diff --git a/server/tools/protobuild/cs_proto.proto b/server/tools/protobuild/cs_proto.proto index 37b4719..00740a7 100755 --- a/server/tools/protobuild/cs_proto.proto +++ b/server/tools/protobuild/cs_proto.proto @@ -228,7 +228,7 @@ message MFLootFull optional int32 obj_uniid = 1; //唯一id optional MFVector2D pos = 2; //位置 - optional string name = 6; + optional int32 item_id = 6; optional int32 count = 7; optional int32 age_ms = 8; } @@ -331,8 +331,8 @@ message MFObjectFull optional MFSmokeFull union_obj_9 = 10; } -//玩家数据 -message MFPlayerData +//活跃玩家数据(当前) +message MFActivePlayerData { optional float boost = 1; @@ -352,6 +352,7 @@ message MFPlayerData optional int32 spectator_count = 20; } +//毒气数据 message MFGasData { optional int32 mode = 1; //0:inactive 1:waiting 2:moveing @@ -373,12 +374,14 @@ message MFTeamData optional bool downed = 7; } -message MFTeamInfo +//同队队友数据 +message MFTeammateInfo { optional int32 team_id = 1; repeated int32 player_ids = 2; } +//子弹 message MFBullet { optional int32 player_id = 1; //玩家id @@ -571,12 +574,12 @@ message SMUpdate repeated MFObjectFull full_objects = 3; //对象-全量(出现在视野) repeated MFObjectPart part_objects = 4; //对象-部分(用于插值更新) optional int32 active_player_id = 5; //当前活跃玩家id(如果玩家死亡后是观战对象的id) - optional MFPlayerData active_player_data = 6; //活跃玩家数据(如果玩家死亡后是观战对象的数据) + optional MFActivePlayerData active_player_data = 6; //活跃玩家数据(如果玩家死亡后是观战对象的数据) optional int32 alive_count = 15; //存活数量 - optional int32 gasT = 16; - optional MFGasData gas_data = 17; + optional int32 gasT = 16; //毒气 + optional MFGasData gas_data = 17; //毒气数据 repeated MFTeamData team_data = 18; - repeated MFTeamInfo teams = 19; + repeated MFTeammateInfo teams = 19; //同队队友数据 repeated MFBullet bullets = 20; //子弹 repeated MFShot shots = 21; //射击 repeated MFExplosion explosions = 22; //爆炸 From c64cdb2f3fc54bdc2669b636cb76e0b1ad7df4a5 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Sat, 23 Mar 2019 14:12:17 +0800 Subject: [PATCH 3/4] 1 --- server/gameserver/human.cc | 56 ++++++-------------------------------- 1 file changed, 8 insertions(+), 48 deletions(-) diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index b2d8141..688245e 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -148,8 +148,9 @@ void Human::FindPath() { Vector2D old_pos = pos; { - float dot = Vector2D::UP.Dot(move_dir); - if (std::abs(dot) <= 0.001f) { //相互垂直 + float up_dot = Vector2D::UP.Dot(move_dir); + bool at_left_side = Vector2D::LEFT.Dot(move_dir) > 0.0001f; + if (std::abs(up_dot) <= 0.001f) { //相互垂直 //向上 pos = old_pos + Vector2D::UP; if (!IsCollision()) { @@ -161,9 +162,8 @@ void Human::FindPath() return; } } - } else if (dot > 0.001f) { //基本相同 - //向右 - pos = old_pos + Vector2D::RIGHT; + } else if (up_dot > 0.001f) { //基本相同 + pos = old_pos + (at_left_side ? Vector2D::LEFT : Vector2D::RIGHT); if (!IsCollision()) { return; } else { @@ -173,37 +173,8 @@ void Human::FindPath() return; } } - } else if (dot < 0.001f) { //基本相反 - //向右 - pos = old_pos + Vector2D::RIGHT; - if (IsCollision()) { - //向下 - pos = old_pos + Vector2D::DOWN; - if (!IsCollision()) { - return; - } - } else { - return; - } - } - } - { - float dot = Vector2D::DOWN.Dot(move_dir); - if (std::abs(dot) <= 0.001f) { //相互垂直 - //向下 - pos = old_pos + Vector2D::DOWN; - if (!IsCollision()) { - return; - } else { - //向上 - pos = old_pos + Vector2D::UP; - if (!IsCollision()) { - return; - } - } - } else if (dot > 0.001f) { //基本相同 - //向左 - pos = old_pos + Vector2D::LEFT; + } else if (up_dot < 0.001f) { //基本相反 + pos = old_pos + (at_left_side ? Vector2D::LEFT : Vector2D::RIGHT); if (!IsCollision()) { return; } else { @@ -213,18 +184,7 @@ void Human::FindPath() return; } } - } else if (dot < 0.001f) { //基本相反 - //向左 - pos = old_pos + Vector2D::LEFT; - if (!IsCollision()) { - return; - } else { - //向上 - pos = old_pos + Vector2D::UP; - if (!IsCollision()) { - return; - } - } } } + pos = old_pos; } From 119dffe87e24c9a6c14f1c0b77627aaaeb598627 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Mon, 25 Mar 2019 11:28:41 +0800 Subject: [PATCH 4/4] 1 --- server/gameserver/room.cc | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/server/gameserver/room.cc b/server/gameserver/room.cc index 66fcf6a..1f1e7c9 100644 --- a/server/gameserver/room.cc +++ b/server/gameserver/room.cc @@ -138,10 +138,16 @@ void Room::ShuaAndroid() void Room::ShuaObstacle(Human* hum) { - MetaData::MapThing* thing = MetaMgr::Instance()->GetMapThing(61001); - if (!thing) { + MetaData::MapThing* a_thing = MetaMgr::Instance()->GetMapThing(61001); + MetaData::MapThing* b_thing = MetaMgr::Instance()->GetMapThing(61007); + if (!a_thing || !b_thing) { return; } + { + Obstacle* obj = new Obstalce(); + obj->entity_uniid = AllocUniid(); + obj->room = room; + } } bool Room::RandomPos(Human* hum, float distance, Vector2D& out_pos)