From 02e39e1cc01b3484b04ff8b45435d95e5911dc7e Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Mon, 18 Mar 2019 14:41:55 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84updatemsg?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/gameserver/android.ai.cc | 28 +++++++- server/gameserver/entity.h | 1 + server/gameserver/human.cc | 6 ++ server/gameserver/human.h | 10 +++ server/gameserver/player.cc | 96 +++++++++++++++++--------- server/gameserver/player.h | 6 ++ server/gameserver/room.cc | 10 +++ server/gameserver/room.h | 11 +++ server/tools/protobuild/cs_proto.proto | 4 +- 9 files changed, 136 insertions(+), 36 deletions(-) diff --git a/server/gameserver/android.ai.cc b/server/gameserver/android.ai.cc index b7ae562..daf0df9 100644 --- a/server/gameserver/android.ai.cc +++ b/server/gameserver/android.ai.cc @@ -3,6 +3,7 @@ #include "android.ai.h" #include "android.h" #include "movement.h" +#include "room.h" void AndroidAI::Update(int delta_time) { @@ -82,17 +83,42 @@ void AndroidAI::DoMove() { if (owner->movement) { if (owner->movement->Arrived()) { - + float distance = 8.0f + rand() % 10; + Vector2D out_pos; + if (owner->room->RandomPos((Human*)owner, distance, out_pos)) { + owner->movement->ClearPath(); + owner->movement->AddPathPoint(out_pos, distance, owner->GetSpeed()); + } } } } void AndroidAI::DoAttack() { + if (owner->updated_times % 2 == 0) { + Human* enemy = owner->room->SearchEnemy((Human*)owner); + if (enemy) { + } + } } void AndroidAI::DoMoveAndAttack() { + if (owner->movement) { + if (owner->movement->Arrived()) { + float distance = 8.0f + rand() % 10; + Vector2D out_pos; + if (owner->room->RandomPos((Human*)owner, distance, out_pos)) { + owner->movement->ClearPath(); + owner->movement->AddPathPoint(out_pos, distance, owner->GetSpeed()); + } + } + if (owner->updated_times % 2 == 0) { + Human* enemy = owner->room->SearchEnemy((Human*)owner); + if (enemy) { + } + } + } } diff --git a/server/gameserver/entity.h b/server/gameserver/entity.h index f05041a..ecdeb03 100644 --- a/server/gameserver/entity.h +++ b/server/gameserver/entity.h @@ -49,4 +49,5 @@ class Entity virtual void Update(int delta_time) {}; virtual void FillMFObjectPart(cs::MFObjectPart* part_data) {}; virtual void FillMFObjectFull(cs::MFObjectFull* full_data) {}; + virtual float GetSpeed() { return 1.0f;}; }; diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index 9640744..e782d75 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -3,6 +3,7 @@ #include "human.h" #include "cs_proto.pb.h" #include "movement.h" +#include "metamgr.h" Human::Human() { @@ -15,6 +16,11 @@ Human::~Human() movement = nullptr; } +float Human::GetSpeed() +{ + return meta->i->move_speed(); +} + void Human::FillMFObjectPart(cs::MFObjectPart* part_data) { part_data->set_object_type(ET_Player); diff --git a/server/gameserver/human.h b/server/gameserver/human.h index 2e4eee2..d1b0567 100644 --- a/server/gameserver/human.h +++ b/server/gameserver/human.h @@ -1,12 +1,19 @@ #pragma once #include "entity.h" +#include "cs_proto.pb.h" namespace MetaData { struct Player; } +struct HumanFrameData +{ + ::google::protobuf::RepeatedPtrField<::cs::MFBullet> bullets; + ::google::protobuf::RepeatedPtrField<::cs::MFShot> shots; +}; + class Human : public Entity { public: @@ -29,6 +36,8 @@ class Human : public Entity int vip = 0; int sdmg = 0; + HumanFrameData frame_data; + bool moving = false; Vector2D move_dir; @@ -39,6 +48,7 @@ class Human : public Entity Human(); virtual ~Human() override; + virtual float GetSpeed() override; virtual void FillMFObjectPart(cs::MFObjectPart* part_data) override; virtual void FillMFObjectFull(cs::MFObjectFull* full_data) override; diff --git a/server/gameserver/player.cc b/server/gameserver/player.cc index a1d0643..876d701 100644 --- a/server/gameserver/player.cc +++ b/server/gameserver/player.cc @@ -26,6 +26,13 @@ const int F_ack = 24; Player::Player() { entity_subtype = EST_Player; + update_msg = new cs::SMUpdate(); +} + +Player::~Player() +{ + delete update_msg; + update_msg = nullptr; } void Player::Initialize() @@ -37,39 +44,8 @@ void Player::Update(int delta_time) { movement->Update(delta_time); if (updated_times % 2 == 0) { - cs::SMUpdate msg; - { - for (auto& itr : new_players) { - itr->FillMFObjectFull(msg.add_full_objects()); - } - for (auto& itr : part_players) { - itr->FillMFObjectPart(msg.add_part_objects()); - } - if (updated_times == 0) { - msg.set_active_player_id(entity_uniid); - FillMFPlayerData(msg.mutable_active_player_data()); - } - msg.set_alive_count(room->AliveCount()); - - { - int data_flags32 = 0; - if (!new_players.empty()) { - a8::SetBitFlag(data_flags32, F_full_objects); - } - if (!part_players.empty()) { - a8::SetBitFlag(data_flags32, F_part_objects); - } - - if (updated_times == 0) { - a8::SetBitFlag(data_flags32, F_active_player_id); - a8::SetBitFlag(data_flags32, F_active_player_data); - } - a8::SetBitFlag(data_flags32, F_alive_count); - - msg.set_data_flags32(data_flags32); - } - } - SendNotifyMsg(msg); + MakeUpdateMsg(); + SendNotifyMsg(*update_msg); { if (!new_players.empty()) { new_players.clear(); @@ -107,3 +83,57 @@ void Player::FillMFPlayerData(cs::MFPlayerData* player_data) { player_data->set_has_action(false); } + +void Player::MakeUpdateMsg() +{ + update_msg->Clear(); + { + for (auto& itr : new_players) { + itr->FillMFObjectFull(update_msg->add_full_objects()); + if (itr->frame_data.bullets.size() > 0) { + update_msg->mutable_bullets()->MergeFrom(itr->frame_data.bullets); + } + if (itr->frame_data.shots.size() > 0) { + update_msg->mutable_shots()->MergeFrom(itr->frame_data.shots); + } + } + for (auto& itr : part_players) { + itr->FillMFObjectPart(update_msg->add_part_objects()); + if (itr->frame_data.bullets.size() > 0) { + update_msg->mutable_bullets()->MergeFrom(itr->frame_data.bullets); + } + if (itr->frame_data.shots.size() > 0) { + update_msg->mutable_shots()->MergeFrom(itr->frame_data.shots); + } + } + if (updated_times == 0) { + update_msg->set_active_player_id(entity_uniid); + FillMFPlayerData(update_msg->mutable_active_player_data()); + } + update_msg->set_alive_count(room->AliveCount()); + + { + int data_flags32 = 0; + if (!new_players.empty()) { + a8::SetBitFlag(data_flags32, F_full_objects); + } + if (!part_players.empty()) { + a8::SetBitFlag(data_flags32, F_part_objects); + } + if (update_msg->bullets_size() > 0) { + a8::SetBitFlag(data_flags32, F_bullets); + } + if (update_msg->shots_size() > 0) { + a8::SetBitFlag(data_flags32, F_shots); + } + + if (updated_times == 0) { + a8::SetBitFlag(data_flags32, F_active_player_id); + a8::SetBitFlag(data_flags32, F_active_player_data); + } + a8::SetBitFlag(data_flags32, F_alive_count); + + update_msg->set_data_flags32(data_flags32); + } + } +} diff --git a/server/gameserver/player.h b/server/gameserver/player.h index 0ad69c6..4e5b6b9 100644 --- a/server/gameserver/player.h +++ b/server/gameserver/player.h @@ -35,6 +35,7 @@ class Player : public Human } Player(); + virtual ~Player() override; virtual void Initialize() override; virtual void Update(int delta_time) override; @@ -45,4 +46,9 @@ class Player : public Human void _CMVoice(f8::MsgHdr& hdr, const cs::CMVoice& msg); void FillMFPlayerData(cs::MFPlayerData* player_data); + +private: + cs::SMUpdate* update_msg = nullptr; + + void MakeUpdateMsg(); }; diff --git a/server/gameserver/room.cc b/server/gameserver/room.cc index 3dc3104..e83f3e6 100644 --- a/server/gameserver/room.cc +++ b/server/gameserver/room.cc @@ -86,3 +86,13 @@ void Room::ShuaAndroid() moveable_hash_[hum->entity_uniid] = hum; } } + +bool Room::RandomPos(Human* hum, float distance, Vector2D& out_pos) +{ + return false; +} + +Human* Room::SearchEnemy(Human* hum) +{ + return nullptr; +} diff --git a/server/gameserver/room.h b/server/gameserver/room.h index 792d322..74a986a 100644 --- a/server/gameserver/room.h +++ b/server/gameserver/room.h @@ -1,5 +1,7 @@ #pragma once +#include "cs_proto.pb.h" + enum RoomState_e { RS_Inactive = 0, @@ -12,7 +14,14 @@ namespace MetaData struct Map; } +struct RoomFrameData +{ + ::google::protobuf::RepeatedPtrField<::cs::MFExplosion> explosions; + ::google::protobuf::RepeatedPtrField<::cs::MFEmote> emotes; +}; + class Entity; +class Human; class Player; class Room { @@ -29,6 +38,8 @@ public: void AddPlayer(Player* hum); unsigned short AllocUniid(); void ShuaAndroid(); + bool RandomPos(Human* hum, float distance, Vector2D& out_pos); + Human* SearchEnemy(Human* hum); private: unsigned short current_uniid = 0; diff --git a/server/tools/protobuild/cs_proto.proto b/server/tools/protobuild/cs_proto.proto index 4d381e6..cd5cf1c 100755 --- a/server/tools/protobuild/cs_proto.proto +++ b/server/tools/protobuild/cs_proto.proto @@ -612,8 +612,8 @@ message SMUpdate repeated MFTeamData teams = 19; repeated MFBullet bullets = 20; //子弹 repeated MFShot shots = 21; //射击 - repeated MFExplosion explosions = 22; - repeated MFEmote emotes = 23; + repeated MFExplosion explosions = 22; //爆炸 + repeated MFEmote emotes = 23; //表情 optional int32 ack = 24; optional uint32 data_flags32 = 256;