diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index 9dd933a..703d3ad 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -148,79 +148,45 @@ 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 = 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()) { + } else if (up_dot > 0.001f) { //基本相同 + pos = old_pos + (at_left_side ? Vector2D::LEFT : 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; - if (IsCollision()) { + } else if (up_dot < 0.001f) { //基本相反 + pos = old_pos + (at_left_side ? Vector2D::LEFT : Vector2D::RIGHT); + if (!IsCollision()) { + return; + } else { //向下 - pos = old_pos; - pos = pos + Vector2D::DOWN; - if (IsCollision()) { - return; - } - } - } - } - { - float dot = Vector2D::DOWN.Dot(move_dir); - if (std::abs(dot) <= 0.001f) { //相互垂直 - //向下 - pos = pos + Vector2D::DOWN; - if (IsCollision()) { - //向上 - pos = old_pos; - pos = pos + Vector2D::UP; - if (IsCollision()) { - return; - } - } - } else if (dot > 0.001f) { //基本相同 - //向左 - pos = pos + Vector2D::LEFT; - if (IsCollision()) { - //向下 - pos = old_pos; - pos = pos + Vector2D::DOWN; - if (IsCollision()) { - return; - } - } - } else if (dot < 0.001f) { //基本相反 - //向左 - pos = pos + Vector2D::LEFT; - if (IsCollision()) { - //向上 - pos = old_pos; - pos = pos + Vector2D::UP; - if (IsCollision()) { + pos = old_pos + Vector2D::DOWN; + if (!IsCollision()) { return; } } } } + pos = old_pos; } float Human::GetRadius() diff --git a/server/gameserver/player.cc b/server/gameserver/player.cc index cdac81e..ab15954 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(); @@ -201,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/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/room.cc b/server/gameserver/room.cc index 5168952..60ba4d9 100644 --- a/server/gameserver/room.cc +++ b/server/gameserver/room.cc @@ -139,6 +139,7 @@ void Room::ShuaAndroid() void Room::ShuaObstacle(Human* hum) { +#if 0 MetaData::MapThing* thing = MetaMgr::Instance()->GetMapThing(61001); if (thing) { Obstacle* entity = new Obstacle(); @@ -157,6 +158,16 @@ void Room::ShuaObstacle(Human* hum) pair.second->new_objects.insert(entity); pair.second->part_objects.insert(entity); } +#endif + 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 Obstacle(); + obj->entity_uniid = AllocUniid(); + obj->room = this; } } 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(); 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; //爆炸