From 9679a85aeefaf5683eefbe5b77096ad7bbd65c77 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Thu, 11 Apr 2019 09:58:48 +0800 Subject: [PATCH 1/4] rename ProcDrop -> ScatterDrop --- server/gameserver/app.cc | 2 +- server/gameserver/bullet.cc | 2 +- server/gameserver/room.cc | 34 ++++++---------------------------- server/gameserver/room.h | 7 ++++--- server/gameserver/roommgr.cc | 2 +- 5 files changed, 13 insertions(+), 34 deletions(-) diff --git a/server/gameserver/app.cc b/server/gameserver/app.cc index 1855f05..2c85ec9 100755 --- a/server/gameserver/app.cc +++ b/server/gameserver/app.cc @@ -219,8 +219,8 @@ void App::QuickExecute(int delta_time) { ProcessIMMsg(); DispatchMsg(); - a8::Timer::Instance()->Update(); RoomMgr::Instance()->Update(delta_time); + a8::Timer::Instance()->Update(); } void App::SlowerExecute(int delta_time) diff --git a/server/gameserver/bullet.cc b/server/gameserver/bullet.cc index 370f3ee..2297c72 100644 --- a/server/gameserver/bullet.cc +++ b/server/gameserver/bullet.cc @@ -93,7 +93,7 @@ void Bullet::OnHit(std::vector& objects) obstacle->dead_frameno = room->frame_no; if (obstacle->dead) { obstacle->ClearColliders(); - room->ProcDrop(obstacle->pos, obstacle->meta->i->drop()); + room->ScatterDrop(obstacle->pos, obstacle->meta->i->drop()); } room->TouchPlayerList(a8::XParams() .SetSender(obstacle), diff --git a/server/gameserver/room.cc b/server/gameserver/room.cc index c3d0051..aa58830 100644 --- a/server/gameserver/room.cc +++ b/server/gameserver/room.cc @@ -17,6 +17,11 @@ const int ROOM_MAX_PLAYER_NUM = 50; const int ANDROID_NUM = 10; +void Room::Initialize() +{ + ShuaAndroid(); +} + void Room::Update(int delta_time) { elapsed_time_ += delta_time; @@ -169,33 +174,6 @@ void Room::ShuaAndroid() } } -bool Room::RandomPos(Human* hum, float distance, Vector2D& out_pos) -{ - Vector2D dir = hum->pos; - dir.Rotate(a8::RandAngle()); - dir.Normalize(); - CircleCollider collider; - collider.owner = hum; - collider.pos = dir * distance; - collider.rad = hum->meta->i->radius(); - - for (auto& pair : uniid_hash_) { - if (pair.second->entity_type == ET_Player || - pair.second->entity_type == ET_Bullet - ) { - continue; - } else { - for (auto& itr : pair.second->colliders) { - if (collider.Intersect(itr)) { - return false; - } - } - } - } - out_pos = hum->pos + collider.pos; - return true; -} - Human* Room::FindEnemy(Human* hum) { std::vector enemys; @@ -285,7 +263,7 @@ void Room::ResetFrameData() frame_data.emotes.Clear(); } -void Room::ProcDrop(Vector2D center, int drop_id) +void Room::ScatterDrop(Vector2D center, int drop_id) { MetaData::Drop* drop_meta = MetaMgr::Instance()->GetDrop(drop_id); if (drop_meta) { diff --git a/server/gameserver/room.h b/server/gameserver/room.h index cc05eb3..2ee2200 100644 --- a/server/gameserver/room.h +++ b/server/gameserver/room.h @@ -23,6 +23,7 @@ public: long long frame_no = 0; GasData gas_data; + void Initialize(); void Update(int delta_time); bool IsFull(); int GetPlayerNum(); @@ -31,8 +32,6 @@ public: Player* GetPlayerByUniId(unsigned short uniid); Entity* GetEntityByUniId(unsigned short uniid); void AddPlayer(Player* hum); - void ShuaAndroid(); - bool RandomPos(Human* hum, float distance, Vector2D& out_pos); Human* FindEnemy(Human* hum); void CollisionDetection(Entity* sender, int detection_flags, std::vector& objects); void AddDeletedObject(unsigned short obj_uniid); @@ -42,7 +41,7 @@ public: void TouchHumanList(a8::XParams param, std::function func); void BeAddedObject(Entity* entity); - void ProcDrop(Vector2D center, int drop_id); + void ScatterDrop(Vector2D center, int drop_id); void CreateThings(); void FillSMMapInfo(cs::SMMapInfo& map_info); void DropItem(Vector2D pos, int item_id); @@ -56,6 +55,7 @@ public: private: unsigned short AllocUniid(); + void ShuaAndroid(); void ResetFrameData(); void ClearDeletedObjects(); void ProcAddedObjects(); @@ -64,6 +64,7 @@ private: Vector2D& out_pos); private: + a8::TimerAttacher timer_attacher_; int elapsed_time_ = 0; int alive_count_ = 0; diff --git a/server/gameserver/roommgr.cc b/server/gameserver/roommgr.cc index ca4bc32..8d8c474 100644 --- a/server/gameserver/roommgr.cc +++ b/server/gameserver/roommgr.cc @@ -41,7 +41,7 @@ void RoomMgr::_CMJoin(f8::MsgHdr& hdr, const cs::CMJoin& msg) abort(); } room->map_meta = MetaMgr::Instance()->GetMap(1001); - room->ShuaAndroid(); + room->Initialize(); room_hash_[room->room_uuid] = room; } Player* hum = PlayerMgr::Instance()->CreatePlayerByCMJoin(hdr.socket_handle, msg); From 7d070ea9f529aa37829337f26dbf9c86e654fb56 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Thu, 11 Apr 2019 10:03:09 +0800 Subject: [PATCH 2/4] 1 --- server/gameserver/room.h | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/server/gameserver/room.h b/server/gameserver/room.h index 2ee2200..d7ce527 100644 --- a/server/gameserver/room.h +++ b/server/gameserver/room.h @@ -31,26 +31,33 @@ public: Player* GetPlayerByAccountId(const std::string& accountid); Player* GetPlayerByUniId(unsigned short uniid); Entity* GetEntityByUniId(unsigned short uniid); + void AddPlayer(Player* hum); Human* FindEnemy(Human* hum); + void CollisionDetection(Entity* sender, int detection_flags, std::vector& objects); void AddDeletedObject(unsigned short obj_uniid); + void BeAddedObject(Entity* entity); + + void FetchBuilding(Human* hum); void FillSMJoinedNotify(Player* self_hum, cs::SMJoinedNotify& msg); + void FillSMMapInfo(cs::SMMapInfo& map_info); + void TouchPlayerList(a8::XParams param, std::function func); void TouchHumanList(a8::XParams param, std::function func); - void BeAddedObject(Entity* entity); + void ScatterDrop(Vector2D center, int drop_id); - void CreateThings(); - void FillSMMapInfo(cs::SMMapInfo& map_info); void DropItem(Vector2D pos, int item_id); + + void CreateThings(); void CreateDoor(Building* building, int door_idx); void CreateHouseObstacle(Building* building, int id, float x, float y); void CreateLoot(int equip_id, Vector2D pos, int count); void CreateBullet(Human* hum, MetaData::Equip* gun_meta, Vector2D pos, Vector2D dir, float fly_distance); - void FetchBuilding(Human* hum); + void OnHumanDie(Human* hum); private: From dbf0d5e8f86c6f4d15d785a7a10bb252ee1d4953 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Thu, 11 Apr 2019 10:07:53 +0800 Subject: [PATCH 3/4] 1 --- server/gameserver/room.cc | 23 +++-------------------- 1 file changed, 3 insertions(+), 20 deletions(-) diff --git a/server/gameserver/room.cc b/server/gameserver/room.cc index aa58830..bb7e2c4 100644 --- a/server/gameserver/room.cc +++ b/server/gameserver/room.cc @@ -270,26 +270,9 @@ void Room::ScatterDrop(Vector2D center, int drop_id) std::vector> drop_items; drop_meta->RandItems(drop_items); for (auto& item : drop_items) { - MetaData::Equip* equip_meta = MetaMgr::Instance()->GetEquip(std::get<0>(item)); - if (equip_meta) { - Loot* entity = new Loot(); - entity->room = this; - entity->meta = equip_meta; - entity->entity_uniid = AllocUniid(); - { - Vector2D dir = Vector2D::UP; - dir.Rotate(a8::RandAngle()); - entity->pos = center + dir * (5 + rand() % 50); - } - entity->item_id = std::get<0>(item); - entity->count = std::get<1>(item); - entity->Initialize(); - uniid_hash_[entity->entity_uniid] = entity; - for (auto& pair : human_hash_) { - pair.second->new_objects.insert(entity); - pair.second->part_objects.insert(entity); - } - } + Vector2D dir = Vector2D::UP; + dir.Rotate(a8::RandAngle()); + DropItem(center + dir * (5 + rand() % 50), std::get<0>(item)); } } } From 1faa08e1c0872e936fa9ceafcea72149001f51f5 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Thu, 11 Apr 2019 11:02:47 +0800 Subject: [PATCH 4/4] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E8=A1=A8=E6=83=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/gameserver/framedata.h | 2 +- server/gameserver/player.cc | 34 ++++++++++++++++++++++++++ server/gameserver/player.h | 4 +++ server/gameserver/room.cc | 30 ++++++++++++++++++++++- server/gameserver/room.h | 1 + server/tools/protobuild/cs_proto.proto | 6 ++--- 6 files changed, 72 insertions(+), 5 deletions(-) diff --git a/server/gameserver/framedata.h b/server/gameserver/framedata.h index 9328ee6..446242b 100644 --- a/server/gameserver/framedata.h +++ b/server/gameserver/framedata.h @@ -7,7 +7,7 @@ struct RoomFrameData std::set deleted_objects; std::map> explosions_hash; std::map> smokes_hash; - ::google::protobuf::RepeatedPtrField<::cs::MFEmote> emotes; + std::map> emotes_hash; ::google::protobuf::RepeatedPtrField<::cs::MFBullet> bullets; ::google::protobuf::RepeatedPtrField<::cs::MFShot> shots; }; diff --git a/server/gameserver/player.cc b/server/gameserver/player.cc index ea1bd99..962d573 100644 --- a/server/gameserver/player.cc +++ b/server/gameserver/player.cc @@ -75,6 +75,9 @@ void Player::Update(int delta_time) if (spectate) { UpdateSpectate(); } + if (emote) { + UpdateEmote(); + } MakeUpdateMsg(); SendNotifyMsg(*update_msg); if (send_gameover) { @@ -267,6 +270,26 @@ void Player::UpdateGameOver() send_gameover = false; } +void Player::UpdateEmote() +{ + ::google::protobuf::RepeatedPtrField<::cs::MFEmote>* emotes = nullptr; + { + auto itr = room->frame_data.emotes_hash.find(room->frame_no); + if (itr == room->frame_data.emotes_hash.end()) { + room->frame_data.emotes_hash[room->frame_no] = ::google::protobuf::RepeatedPtrField<::cs::MFEmote>(); + itr = room->frame_data.emotes_hash.find(room->frame_no); + } + emotes = &itr->second; + } + + cs::MFEmote* emote = emotes->Add(); + emote->set_emote_id(emote_id); + emote->set_player_id(entity_uniid); + + emote = false; + emote_id = 0; +} + void Player::Shot() { if (!curr_weapon->meta) { @@ -599,6 +622,10 @@ void Player::_CMMove(f8::MsgHdr& hdr, const cs::CMMove& msg) if (msg.has_spectate()) { spectate = true; } + if (msg.has_emote()) { + emote = true; + emote_id = msg.emote(); + } } void Player::UpdateDropWeapon() @@ -788,6 +815,13 @@ void Player::MakeUpdateMsg() } } } + for (auto& pair : room->frame_data.emotes_hash) { + if (pair.first <= room->frame_no) { + for (auto& itr : pair.second) { + *update_msg->add_emotes() = itr; + } + } + } } if (updated_times == 0) { room->FetchBuilding(this); diff --git a/server/gameserver/player.h b/server/gameserver/player.h index 6133f0e..ced58de 100644 --- a/server/gameserver/player.h +++ b/server/gameserver/player.h @@ -55,6 +55,9 @@ class Player : public Human bool spectate = false; + bool emote = false; + int emote_id = 0; + ::google::protobuf::RepeatedField< ::google::protobuf::int32 > interaction_objids; template @@ -78,6 +81,7 @@ class Player : public Human void UpdateUseItemIdx(); void UpdateSpectate(); void UpdateGameOver(); + void UpdateEmote(); void Shot(); void ProcInteraction(); void ObstacleInteraction(Obstacle* entity); diff --git a/server/gameserver/room.cc b/server/gameserver/room.cc index bb7e2c4..1b4a402 100644 --- a/server/gameserver/room.cc +++ b/server/gameserver/room.cc @@ -1,5 +1,7 @@ #include "precompile.h" +#include + #include "playermgr.h" #include "player.h" #include "cs_proto.pb.h" @@ -20,6 +22,16 @@ const int ANDROID_NUM = 10; void Room::Initialize() { ShuaAndroid(); + #if 0 + a8::Timer::Instance()->AddRepeatTimer( + 1000 * 5, + a8::XParams(), + [] (const a8::XParams& param) + { + + } + ); + #endif } void Room::Update(int delta_time) @@ -60,6 +72,17 @@ void Room::Update(int delta_time) frame_data.smokes_hash.erase(id); } } + { + std::vector del_ids; + for (auto& pair : frame_data.emotes_hash) { + if (pair.first < frame_no) { + del_ids.push_back(pair.first); + } + } + for (long long id : del_ids) { + frame_data.emotes_hash.erase(id); + } + } } } ++frame_no; @@ -256,11 +279,11 @@ void Room::ResetFrameData() { frame_data.explosions_hash.clear(); frame_data.smokes_hash.clear(); + frame_data.emotes_hash.Clear(); } #endif frame_data.bullets.Clear(); frame_data.shots.Clear(); - frame_data.emotes.Clear(); } void Room::ScatterDrop(Vector2D center, int drop_id) @@ -684,3 +707,8 @@ bool Room::GenSmallCircle(Vector2D big_circle_pos, float big_circle_rad, float s out_pos = big_circle_pos + dir * rad; return true; } + + void Room::OutputDebugLog() + { + + } diff --git a/server/gameserver/room.h b/server/gameserver/room.h index d7ce527..5841507 100644 --- a/server/gameserver/room.h +++ b/server/gameserver/room.h @@ -69,6 +69,7 @@ private: void UpdateGas(); bool GenSmallCircle(Vector2D big_circle_pos, float big_circle_rad, float small_circle_rad, Vector2D& out_pos); + void OutputDebugLog(); private: a8::TimerAttacher timer_attacher_; diff --git a/server/tools/protobuild/cs_proto.proto b/server/tools/protobuild/cs_proto.proto index 1ba1159..2302e2c 100755 --- a/server/tools/protobuild/cs_proto.proto +++ b/server/tools/protobuild/cs_proto.proto @@ -462,10 +462,8 @@ message MFSmoke //表情 message MFEmote { - optional int32 type = 1; - optional int32 is_ping = 2; + optional int32 emote_id = 1; //表情id optional int32 player_id = 3; //玩家id - optional MFVector2D pos = 4; //位置 optional string msg = 5; } @@ -545,6 +543,8 @@ message CMMove repeated int32 interaction_objids = 23; //交互的对象id列表 optional bool spectate = 30; //自杀 + + optional int32 emote = 31; //表情id } //丢弃道具