From c25560e035cd4e3438bb2e49c2ea0748346f7200 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Sun, 28 Apr 2019 19:57:06 +0800 Subject: [PATCH] 1 --- server/gameserver/human.cc | 38 +++++++++++++++++++++++++++++++++++++ server/gameserver/human.h | 14 +++++++++++++- server/gameserver/player.cc | 27 -------------------------- server/gameserver/player.h | 13 +------------ 4 files changed, 52 insertions(+), 40 deletions(-) diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index 8747de0..ee8d3c5 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -1154,3 +1154,41 @@ void Human::SummonHero() BroadcastFullState(); } } + +void Human::AddObserver(Human* observer) +{ + observers_.insert(observer); +} + +void Human::RemoveObserver(Human* observer) +{ + observers_.erase(observer); +} + +void Human::SendUpdateMsg() +{ + if (!follow_) { + cs::SMUpdate* msg = room->frame_maker.MakeUpdateMsg(this); + if (msg) { + SendNotifyMsg(*msg); + delete msg; + msg = nullptr; + } + } + if (send_gameover) { + UpdateGameOver(); + } + { + if (!new_objects.empty()) { + new_objects.clear(); + } + } +} + +void Human::UpdateGameOver() +{ + cs::SMGameOver msg; + FillSMGameOver(msg); + SendNotifyMsg(msg); + send_gameover = false; +} diff --git a/server/gameserver/human.h b/server/gameserver/human.h index 305bf86..42d9fad 100644 --- a/server/gameserver/human.h +++ b/server/gameserver/human.h @@ -2,6 +2,7 @@ #include "entity.h" #include "cs_proto.pb.h" +#include "GGListener.h" namespace MetaData { @@ -32,6 +33,7 @@ class Obstacle; class Human : public Entity { public: + int socket_handle = 0; int team_id = 0; std::string account_id; std::string team_uuid; @@ -152,6 +154,15 @@ class Human : public Entity void RecoverHp(int inc_hp); void FillBodyState(::google::protobuf::RepeatedPtrField<::cs::MFBodyState>* states); void SummonHero(); + void AddObserver(Human* observer); + void RemoveObserver(Human* observer); + void SendUpdateMsg(); + template + void SendNotifyMsg(T& msg) + { + GGListener::Instance()->SendToClient(socket_handle, 0, msg); + } + void UpdateGameOver(); protected: long long last_shot_frameno_ = 0; @@ -175,7 +186,8 @@ protected: std::vector bullets_; std::vector smokes_; std::vector explosions_; - std::list observers_; + std::set observers_; + Human* follow_ = nullptr; private: CircleCollider* self_collider_ = nullptr; diff --git a/server/gameserver/player.cc b/server/gameserver/player.cc index 2a81f57..0c0b3ba 100644 --- a/server/gameserver/player.cc +++ b/server/gameserver/player.cc @@ -378,14 +378,6 @@ void Player::UpdateSpectate() spectate = false; } -void Player::UpdateGameOver() -{ - cs::SMGameOver msg; - FillSMGameOver(msg); - SendNotifyMsg(msg); - send_gameover = false; -} - void Player::UpdateEmote() { if (a8::HasBitFlag(status, HS_Fly)) { @@ -768,25 +760,6 @@ void Player::HumanInteraction(Human* hum) ); } -void Player::SendUpdateMsg() -{ - cs::SMUpdate* msg = room->frame_maker.MakeUpdateMsg(this); - if (msg) { - SendNotifyMsg(*msg); - delete msg; - msg = nullptr; - } - if (send_gameover) { - UpdateGameOver(); - } - { - if (!new_objects.empty()) { - new_objects.clear(); - } - } - ++send_update_msg_times; -} - void Player::_CMMove(f8::MsgHdr& hdr, const cs::CMMove& msg) { bool has_move_dir = msg.has_move_dir(); diff --git a/server/gameserver/player.h b/server/gameserver/player.h index 38dd1a0..3ba7847 100644 --- a/server/gameserver/player.h +++ b/server/gameserver/player.h @@ -1,7 +1,6 @@ #pragma once #include "human.h" -#include "GGListener.h" namespace cs { @@ -22,7 +21,6 @@ class Player : public Human enum { HID = HID_Player }; public: - int socket_handle = 0; int team_mode = 0; int player_count = 0; bool auto_fill = false; @@ -64,12 +62,6 @@ class Player : public Human ::google::protobuf::RepeatedField< ::google::protobuf::int32 > interaction_objids; - template - void SendNotifyMsg(T& msg) - { - GGListener::Instance()->SendToClient(socket_handle, 0, msg); - } - Player(); virtual ~Player() override; virtual void Initialize() override; @@ -84,7 +76,6 @@ class Player : public Human void UpdateCancelAction(); void UpdateUseItemIdx(); void UpdateSpectate(); - void UpdateGameOver(); void UpdateEmote(); void UpdateJump(); void UpdateUseSkill(); @@ -93,11 +84,9 @@ class Player : public Human void ObstacleInteraction(Obstacle* entity); void LootInteraction(Loot* entity); void HumanInteraction(Human* hum); - void SendUpdateMsg(); void _CMMove(f8::MsgHdr& hdr, const cs::CMMove& msg); void _CMEmote(f8::MsgHdr& hdr, const cs::CMEmote& msg); void _CMVoice(f8::MsgHdr& hdr, const cs::CMVoice& msg); -private: - int send_update_msg_times = 0; + };