diff --git a/server/gameserver/entity.cc b/server/gameserver/entity.cc new file mode 100644 index 0000000..ba84ffc --- /dev/null +++ b/server/gameserver/entity.cc @@ -0,0 +1,8 @@ +#include "precompile.h" + +#include "entity.h" + +void Entity::Update(int delta_time) +{ + +} diff --git a/server/gameserver/entity.h b/server/gameserver/entity.h new file mode 100644 index 0000000..e1fff2a --- /dev/null +++ b/server/gameserver/entity.h @@ -0,0 +1,25 @@ +#pragma once + +enum EntityType_e +{ + ET_Player = 1, + ET_Obstacle = 2, + ET_Building = 3, + ET_LootSpawner = 4, + ET_Loot = 5, + ET_DeadBody = 6, + ET_Decal = 7, + ET_Projectile = 8, + ET_Smoke = 9 +}; + +class Entity +{ + public: + unsigned short entity_uniid = 0; + Vector2D pos; + Vector2D dir; + int updated_times = 0; + + virtual void Update(int delta_time); +}; diff --git a/server/gameserver/player.cc b/server/gameserver/player.cc index 44c3e84..c8d29d3 100644 --- a/server/gameserver/player.cc +++ b/server/gameserver/player.cc @@ -3,10 +3,26 @@ #include "playermgr.h" #include "player.h" #include "cs_proto.pb.h" +#include "room.h" void Player::Update(int delta_time) { + if (updated_times % 2 == 0) { + cs::SMUpdate msg; + if (updated_times == 0) { + msg.set_active_player_id(entity_uniid); + msg.set_alive_count(room->AliveCount()); + { + int data_flags32 = 0; + a8::SetBitFlag(data_flags32, 5); + a8::SetBitFlag(data_flags32, 15); + + msg.set_data_flags32(data_flags32); + } + } + SendNotifyMsg(msg); + } } void Player::_CMMove(f8::MsgHdr& hdr, const cs::CMMove& msg) diff --git a/server/gameserver/player.h b/server/gameserver/player.h index feb590b..872573c 100644 --- a/server/gameserver/player.h +++ b/server/gameserver/player.h @@ -1,5 +1,8 @@ #pragma once +#include "entity.h" +#include "GGListener.h" + namespace cs { class CMMove; @@ -10,12 +13,13 @@ namespace cs } class Room; -class Player +class Player : public Entity { public: enum { HID = HID_Player }; public: + int socket_handle = 0; Room* room = nullptr; std::string account_id; std::string team_uniid; @@ -25,7 +29,6 @@ class Player bool use_touch = false; std::string avatar_url; - unsigned short obj_uniid = 0; float health = 0.0; bool dead = false; bool downed = false; @@ -41,7 +44,13 @@ class Player int vip = 0; int sdmg = 0; - void Update(int delta_time); + template + void SendNotifyMsg(T& msg) + { + GGListener::Instance()->SendToClient(socket_handle, 0, msg); + } + + virtual void Update(int delta_time) override; void _CMMove(f8::MsgHdr& hdr, const cs::CMMove& msg); void _CMDropItem(f8::MsgHdr& hdr, const cs::CMDropItem& msg); diff --git a/server/gameserver/playermgr.cc b/server/gameserver/playermgr.cc index 10770a8..d312984 100644 --- a/server/gameserver/playermgr.cc +++ b/server/gameserver/playermgr.cc @@ -28,7 +28,7 @@ Player* PlayerMgr::GetPlayerSocket(int socket) Player* PlayerMgr::CreatePlayerByCMJoin(unsigned short obj_uniid, const cs::CMJoin& msg) { Player* hum = new Player(); - hum->obj_uniid = obj_uniid; + hum->entity_uniid = obj_uniid; hum->account_id = msg.account_id(); hum->health = 100; hum->team_uniid = msg.team_uuid(); diff --git a/server/gameserver/room.cc b/server/gameserver/room.cc index 7a9782f..969e1d7 100644 --- a/server/gameserver/room.cc +++ b/server/gameserver/room.cc @@ -9,8 +9,13 @@ const int ROOM_MAX_PLAYER_NUM = 50; void Room::Update(int delta_time) { - for (auto& pair : uniid_hash_) { - pair.second->Update(delta_time); + elapsed_time_ += delta_time; + while (elapsed_time_ >= 50) { + for (auto& pair : uniid_hash_) { + pair.second->Update(50); + pair.second->updated_times++; + } + elapsed_time_ -= 50; } } @@ -36,10 +41,17 @@ Player* Room::GetPlayerByUniId(unsigned short uniid) return itr != uniid_hash_.end() ? itr->second : nullptr; } +int Room::AliveCount() +{ + return accountid_hash_.size(); +} + void Room::AddPlayer(Player* hum) { + hum->pos.x = 100 + rand() % 100; + hum->pos.y = 200 + rand() % 200; hum->room = this; - uniid_hash_[hum->obj_uniid] = hum; + uniid_hash_[hum->entity_uniid] = hum; accountid_hash_[hum->account_id] = hum; } diff --git a/server/gameserver/room.h b/server/gameserver/room.h index bf11c8f..ab0122b 100644 --- a/server/gameserver/room.h +++ b/server/gameserver/room.h @@ -22,6 +22,7 @@ public: void Update(int delta_time); bool IsFull(); int GetPlayerNum(); + int AliveCount(); Player* GetPlayerByAccountId(const std::string& accountid); Player* GetPlayerByUniId(unsigned short uniid); void AddPlayer(Player* hum); @@ -30,6 +31,7 @@ public: private: unsigned short current_uniid = 0; RoomState_e state_ = RS_Inactive; + int elapsed_time_ = 0; std::map accountid_hash_; std::map uniid_hash_; diff --git a/server/gameserver/roommgr.cc b/server/gameserver/roommgr.cc index 20ac6b5..9d7c644 100644 --- a/server/gameserver/roommgr.cc +++ b/server/gameserver/roommgr.cc @@ -41,12 +41,13 @@ void RoomMgr::_CMJoin(f8::MsgHdr& hdr, const cs::CMJoin& msg) } unsigned short new_uniid = room->AllocUniid(); Player* hum = PlayerMgr::Instance()->CreatePlayerByCMJoin(new_uniid, msg); + hum->socket_handle = hdr.socket_handle; room->AddPlayer(hum); { cs::SMJoinedNotify notifymsg; notifymsg.set_team_mode(msg.team_mode()); - notifymsg.set_player_id(hum->obj_uniid); + notifymsg.set_player_id(hum->entity_uniid); notifymsg.set_started(false); GGListener::Instance()->SendToClient(hdr.socket_handle, hdr.seqid, notifymsg); } diff --git a/server/gameserver/types.h b/server/gameserver/types.h index 0ef32e3..ca07750 100755 --- a/server/gameserver/types.h +++ b/server/gameserver/types.h @@ -9,9 +9,8 @@ struct PerfMonitor long long read_count = 0; }; -#define PB_REPEATED_PTR(type) ::google::protobuf::RepeatedPtrField - -namespace GameData +struct Vector2D { - -} + float x = 0.0; + float y = 0.0; +}; diff --git a/server/tools/protobuild/cs_proto.proto b/server/tools/protobuild/cs_proto.proto index fe518fc..07a1edd 100755 --- a/server/tools/protobuild/cs_proto.proto +++ b/server/tools/protobuild/cs_proto.proto @@ -24,7 +24,28 @@ package cs; 0x01 == 1<<0 0x02 == 1<<1 0x04 == 1<<2 - */ + + data_flags字段的意义 + 由于protobuf的二义性无法描述repeated字段是否有值(非repeated的字段可以通过msg.xxx == null来a判断) + 所以给协议添加了data_flags这样的字段用来描述字段是否有值 + data_flags32:描述id 1-31的字段哪些是赋值 + data_flags64: 描述id 31-63直接的字段是否赋值 + data_flags128...... 以此类推 + message MFRoleInfo + { + optional int32 role_id = 1; + optional int32 role_name = 2; + + optional int32 role_level = 34; + + optional uint32 data_flags32 = 256; + optional uint32 data_flags64 = 257; + } + role_id是否赋值 (data_flags32 & (1<<(1 - 1))) != 0 + role_name是否赋值 (data_flags32 & (1<<(2 - 1))) != 0 + role_level是否赋值 (data_flags64 & (1<<(34 - 33)) != 0 + 客户端可以根据protobuf反射得到字段名和字段id的对应关系做到自动化判断 +*/ //心跳 message CMPing @@ -114,21 +135,24 @@ message MFPlayerPart message MFPlayerFull { optional int32 obj_uniid = 1; //唯一id - optional float health = 2; //血量 - optional bool dead = 3; //是否已死亡 - optional bool downed = 4; // - optional bool disconnected = 5; //是否断网 - optional int32 anim_type = 6; // - optional int32 anim_seq = 7; // - optional int32 action_type = 8; // - optional int32 skin = 9; //皮肤id + optional MFVector2D pos = 2; //位置 + optional MFVector2D dir = 3; //朝向 + + optional float health = 6; //血量 + optional bool dead = 7; //是否已死亡 + optional bool downed = 8; // + optional bool disconnected = 9; //是否断网 + optional int32 anim_type = 10; // + optional int32 anim_seq = 11; // + optional int32 action_type = 12; // + optional int32 skin = 13; //皮肤id //backpack - optional int32 helmet = 10; //头盔 - optional int32 chest = 11; // - optional int32 weapon = 12; //武器 - optional int32 energy_shield = 13; //能量护盾 - optional int32 vip = 14; //vip - optional int32 sdmg = 15; + optional int32 helmet = 16; //头盔 + optional int32 chest = 17; // + optional int32 weapon = 18; //武器 + optional int32 energy_shield = 19; //能量护盾 + optional int32 vip = 20; //vip + optional int32 sdmg = 21; } //阻挡物-部分 @@ -143,19 +167,22 @@ message MFObstaclePart message MFObstacleFull { optional int32 obj_uniid = 1; //唯一id - optional int32 obstacle_id = 2; //阻挡物id - optional float health = 3; //血量 - optional bool dead = 4; //是否已死亡 + optional MFVector2D pos = 2; //位置 + optional float scale = 3; //缩放比 - optional bool is_door = 5; //是否门 - optional int32 door_relative_ori = 6; // - optional bool door_can_use = 7; // - optional int32 door_seq = 8; + optional int32 obstacle_id = 6; //阻挡物id + optional float health = 7; //血量 + optional bool dead = 8; //是否已死亡 - optional bool is_button = 10; - optional bool button_onoff = 11; - optional bool button_can_use = 12; - optional int32 button_seq = 13; + optional bool is_door = 9; //是否门 + optional int32 door_relative_ori = 10; // + optional bool door_can_use = 11; // + optional int32 door_seq = 12; + + optional bool is_button = 15; + optional bool button_onoff = 16; + optional bool button_can_use = 17; + optional int32 button_seq = 18; } //建筑物-部分 @@ -171,26 +198,27 @@ message MFBuildingPart message MFBuildingFull { optional int32 obj_uniid = 1; //唯一id - optional int32 building_id = 2; //建筑物id - optional MFVector2D pos = 3; //位置 - optional int32 ori = 4; - optional bool ceiling_dead = 5; + optional MFVector2D pos = 2; //位置 + optional int32 building_id = 3; //建筑物id + optional int32 ori = 4; // + + optional bool ceiling_dead = 6; } //loot出生点-部分 补给箱 message MFLootSpawnerPart { optional int32 obj_uniid = 1; //唯一id - optional int32 loot_id = 2; //id - optional MFVector2D pos = 3; //位置 + optional MFVector2D pos = 2; //位置 + optional int32 loot_id = 3; //id } //loot出生点-全量 message MFLootSpawnerFull { optional int32 obj_uniid = 1; //唯一id - optional int32 loot_id = 2; //id - optional MFVector2D pos = 3; //位置 + optional MFVector2D pos = 2; //位置 + optional int32 loot_id = 3; //id } //loot-部分 @@ -204,9 +232,11 @@ message MFLootPart message MFLootFull { optional int32 obj_uniid = 1; //唯一id - optional string name = 2; - optional int32 count = 3; - optional int32 age_ms = 4; + optional MFVector2D pos = 2; //位置 + + optional string name = 6; + optional int32 count = 7; + optional int32 age_ms = 8; } //尸体-部分 @@ -220,24 +250,25 @@ message MFDeadBodyPart message MFDeadBodyFull { optional int32 obj_uniid = 1; //唯一id - optional int32 player_id = 2; //玩家id - optional int32 inkjet = 3; + optional MFVector2D pos = 2; //位置 + + optional int32 inkjet = 6; } //decal-部分 message MFDecalPart { optional int32 obj_uniid = 1; //唯一id - optional int32 decal_id = 2; //id - optional MFVector2D pos = 3; //位置 + optional MFVector2D pos = 2; //位置 + optional int32 decal_id = 3; //id } //decal-全量 message MFDecalFull { optional int32 obj_uniid = 1; //唯一id - optional int32 decal_id = 2; //id - optional MFVector2D pos = 3; //位置 + optional MFVector2D pos = 2; //位置 + optional int32 decal_id = 3; //id } //发射体-部分 @@ -542,7 +573,7 @@ message CMVoice message SMJoinedNotify { optional int32 team_mode = 1; //队伍模式 0:单人 1:多人 - optional int32 player_id = 2; //玩家id + optional int32 player_id = 2; //玩家id(自己) optional bool started = 3; //游戏是否已开始 repeated MFPlayerInfo player_infos = 4; //玩家信息 @@ -557,7 +588,7 @@ message SMMapInfo optional int32 width = 2; //地图宽度 optional int32 height = 3; //地图高度 optional int32 seed = 4; //没用到 - repeated MFPlace places = 5; //没用到 + repeated MFPlace places = 5; // repeated MFMapObject objects = 6; //地图对象 } @@ -570,11 +601,11 @@ message SMPlayerInfo //帧事件 message SMUpdate { - repeated int32 del_objids = 1; - repeated MFObjectFull full_objects = 2; - repeated MFObjectPart part_objects = 3; - optional int32 active_player_id = 10; //当前活跃玩家id - optional MFPlayerData active_player_data = 11; //活跃玩家数据 + repeated int32 del_objids = 2; + repeated MFObjectFull full_objects = 3; + repeated MFObjectPart part_objects = 4; + optional int32 active_player_id = 5; //当前活跃玩家id + optional MFPlayerData active_player_data = 6; //活跃玩家数据 optional int32 alive_count = 15; //存活数量 optional int32 gasT = 16; optional MFGasData gas_data = 17; @@ -585,6 +616,8 @@ message SMUpdate repeated MFExplosion explosions = 22; repeated MFEmote emotes = 23; optional int32 ack = 24; + + optional uint32 data_flags32 = 256; } //xx