From c29956f6dc677dc06d6efbf67f3ff3b6ec31a8b7 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Wed, 28 Sep 2022 14:45:52 +0800 Subject: [PATCH] 1 --- server/gameserver/buff.cc | 2 +- server/gameserver/creature.h | 2 ++ server/gameserver/framedata.cc | 3 +++ server/gameserver/framedata.h | 1 + server/gameserver/framemaker.cc | 11 +++++++++++ server/gameserver/framemaker.h | 1 + server/gameserver/human.cc | 12 ++++++++++++ server/gameserver/human.h | 2 ++ server/gameserver/moveableentity.cc | 13 +++++++++++++ server/gameserver/moveableentity.h | 1 + server/tools/protobuild/cs_proto.proto | 10 ++++++++++ 11 files changed, 57 insertions(+), 1 deletion(-) diff --git a/server/gameserver/buff.cc b/server/gameserver/buff.cc index f7d7254f..0b0b58d2 100644 --- a/server/gameserver/buff.cc +++ b/server/gameserver/buff.cc @@ -945,7 +945,7 @@ void Buff::ProcMachineGun() } } caster_.Get()->need_sync_active_player = true; - caster_.Get()->SyncAroundPlayers(__FILE__, __LINE__, __func__); + caster_.Get()->UpdateCharImage(__FILE__, __LINE__, __func__); } } diff --git a/server/gameserver/creature.h b/server/gameserver/creature.h index 86c81018..be5ec490 100644 --- a/server/gameserver/creature.h +++ b/server/gameserver/creature.h @@ -112,6 +112,7 @@ class Creature : public MoveableEntity virtual void AddToNewObjects(Entity* entity) {}; virtual void AddToPartObjects(Entity* entity) {}; virtual void RemovePartObjects(Entity* entity) {}; + virtual void AddToImageObjects(Creature* c) {}; virtual bool InNewObjects(Entity* target) { return false; }; virtual bool InPartObjects(Entity* target) { return false; }; virtual int GetPartObjectsCount() { return 0; }; @@ -123,6 +124,7 @@ class Creature : public MoveableEntity virtual bool IsCreature(Room* room) override { return true;}; virtual void OnBattleStart(Room* room) override; virtual MetaData::Player* GetHeroMeta() { return nullptr; }; + virtual void FillMFObjectImage(Room* room, Human* hum, cs::MFCharacterImage* image_data) {}; bool HasBuffEffect(int buff_effect_id); Buff* GetBuffByEffectId(int effect_id); Buff* GetBuffById(int buff_id); diff --git a/server/gameserver/framedata.cc b/server/gameserver/framedata.cc index 384d3df9..ef770eb0 100644 --- a/server/gameserver/framedata.cc +++ b/server/gameserver/framedata.cc @@ -9,6 +9,9 @@ void FrameData::ClearFrameData(Human* hum) if (!new_objects.empty()) { new_objects.clear(); } + if (!image_objects.empty()) { + image_objects.clear(); + } if (!block_objects.empty()) { if (hum->IsAndroid() && !hum->HasObserver()) { block_objects.clear(); diff --git a/server/gameserver/framedata.h b/server/gameserver/framedata.h index 67897d0f..c104f70a 100644 --- a/server/gameserver/framedata.h +++ b/server/gameserver/framedata.h @@ -19,6 +19,7 @@ class FrameData private: std::map new_objects; + std::map image_objects; std::map block_objects; std::map loot_objects; std::map part_objects; diff --git a/server/gameserver/framemaker.cc b/server/gameserver/framemaker.cc index c9e975f5..16b2f96e 100644 --- a/server/gameserver/framemaker.cc +++ b/server/gameserver/framemaker.cc @@ -98,6 +98,7 @@ cs::SMUpdate* FrameMaker::MakeUpdateMsg(Human* hum) SerializeLootObjects(msg, room, hum, framedata); SerializeMapBlockObjects(msg, room, hum, framedata); SerializeNewObjects(msg, room, hum, framedata); + SerializeImageObjects(msg, room, hum, framedata); SerializePartObjects(msg, room, hum, framedata); SerializeDelObjects(msg, room, hum, framedata); SerializeOutObjects(msg, room, hum, framedata); @@ -225,6 +226,16 @@ void FrameMaker::SerializeNewObjects(cs::SMUpdate* msg, Room* room, Human* hum, } } +void FrameMaker::SerializeImageObjects(cs::SMUpdate* msg, Room* room, Human* hum, FrameData* framedata) +{ + for (auto& pair : framedata->image_objects) { + Creature* c = pair.second.Get(); + if (c) { + c->FillMFObjectImage(room, (Human*)hum, msg->add_image_objects()); + } + } +} + void FrameMaker::SerializePartObjects(cs::SMUpdate* msg, Room* room, Human* hum, FrameData* framedata) { if (!framedata->part_objects.empty()) { diff --git a/server/gameserver/framemaker.h b/server/gameserver/framemaker.h index 5ad0e684..05b7bf10 100644 --- a/server/gameserver/framemaker.h +++ b/server/gameserver/framemaker.h @@ -20,6 +20,7 @@ private: void SerializeLootObjects(cs::SMUpdate* msg, Room* room, Human* hum, FrameData* framedata); void SerializeMapBlockObjects(cs::SMUpdate* msg, Room* room, Human* hum, FrameData* framedata); void SerializeNewObjects(cs::SMUpdate* msg, Room* room, Human* hum, FrameData* framedata); + void SerializeImageObjects(cs::SMUpdate* msg, Room* room, Human* hum, FrameData* framedata); void SerializePartObjects(cs::SMUpdate* msg, Room* room, Human* hum, FrameData* framedata); void SerializeDelObjects(cs::SMUpdate* msg, Room* room, Human* hum, FrameData* framedata); void SerializeOutObjects(cs::SMUpdate* msg, Room* room, Human* hum, FrameData* framedata); diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index 944851df..6d03e242 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -577,6 +577,13 @@ void Human::FillMFObjectFull(Room* room, Human* hum, cs::MFObjectFull* full_data } } +void Human::FillMFObjectImage(Room* room, Human* hum, cs::MFCharacterImage* image_data) +{ + image_data->set_obj_uniid(GetUniId()); + image_data->set_cur_weapon_idx(GetCurrWeapon()->weapon_idx); + GetCurrWeapon()->ToPB(this, image_data->mutable_weapon()); +} + void Human::FillMFPlayerStats(cs::MFPlayerStats* stats_pb) { stats_pb->set_player_id(GetUniId()); @@ -1246,6 +1253,11 @@ void Human::AddToNewObjects(Entity* entity) } } +void Human::AddToImageObjects(Creature* c) +{ + framedata_.image_objects[c->GetUniId()] = c->GetWeakPtrRef(); +} + void Human::AddToPartObjects(Entity* entity) { #ifdef DEBUG1 diff --git a/server/gameserver/human.h b/server/gameserver/human.h index 2e46158c..e09bf58a 100644 --- a/server/gameserver/human.h +++ b/server/gameserver/human.h @@ -239,6 +239,7 @@ class Human : public Creature virtual void FillMFObjectPart(Room* room, Human* hum, cs::MFObjectPart* part_data) override; void FillMFObjectLess(Room* room, Human* hum, cs::MFPlayerFull* full_data); virtual void FillMFObjectFull(Room* room, Human* hum, cs::MFObjectFull* full_data) override; + virtual void FillMFObjectImage(Room* room, Human* hum, cs::MFCharacterImage* image_data) override; virtual void FillMFPlayerStats(cs::MFPlayerStats* stats); virtual float GetRadius() override; virtual float GetHitRadius() override; @@ -258,6 +259,7 @@ class Human : public Creature virtual void DecHP(float dec_hp, int killer_id, const std::string& killer_name, int weapon_id) override; virtual void AddToNewObjects(Entity* entity) override; virtual void AddToPartObjects(Entity* entity) override; + virtual void AddToImageObjects(Creature* c) override; virtual void RemovePartObjects(Entity* entity) override; virtual bool InNewObjects(Entity* target) override; virtual bool InPartObjects(Entity* target) override; diff --git a/server/gameserver/moveableentity.cc b/server/gameserver/moveableentity.cc index c3e834f2..1ae22fa6 100644 --- a/server/gameserver/moveableentity.cc +++ b/server/gameserver/moveableentity.cc @@ -64,6 +64,19 @@ void MoveableEntity::SyncAroundPlayers(const char* file, int line, const char* f }); } +void MoveableEntity::UpdateCharImage(const char* file, int line, const char* func) +{ + if (IsCreature(room)) { + Creature* c = (Creature*)this; + TraverseAllLayerHumanList + ( + [c, file, line, func] (Human* hum, bool& stop) + { + hum->AddToImageObjects(c); + }); + } +} + void MoveableEntity::TraverseCreatures(std::function func) { room->grid_service->TraverseCreatures(room->GetRoomIdx(), diff --git a/server/gameserver/moveableentity.h b/server/gameserver/moveableentity.h index b7b4c6fc..9bfbe646 100644 --- a/server/gameserver/moveableentity.h +++ b/server/gameserver/moveableentity.h @@ -23,6 +23,7 @@ class MoveableEntity : public RoomEntity std::set& dec_grids ); virtual void SyncAroundPlayers(const char* file, int line, const char* func); + virtual void UpdateCharImage(const char* file, int line, const char* func); virtual const a8::Vec2& GetMoveDir() { return move_dir_; }; virtual void SetMoveDir(const a8::Vec2& move_dir); virtual const a8::Vec2& GetAttackDir() { return attack_dir_; }; diff --git a/server/tools/protobuild/cs_proto.proto b/server/tools/protobuild/cs_proto.proto index d89b9f7f..cf7e587c 100755 --- a/server/tools/protobuild/cs_proto.proto +++ b/server/tools/protobuild/cs_proto.proto @@ -219,6 +219,14 @@ message MFAttrAddition optional float rate_val = 3; //百分比 } +//角色形象-本地如果没有full信息则忽略 +message MFCharacterImage +{ + optional int32 obj_uniid = 1; //唯一id + optional int32 cur_weapon_idx = 2; //当前武器索引 0-4 + optional MFWeapon weapon = 3; //武器 +} + //玩家信息-全量 message MFPlayerFull { @@ -1129,6 +1137,8 @@ message SMUpdate optional int32 game_left_time = 45; //游戏剩余时间(毫秒, 战斗开始后字段才有意义) optional int32 frameno = 46; repeated int32 del_bullets = 47; //子弹删除 + + repeated MFCharacterImage image_objects = 50; //角色形象-本地如果没有full信息则忽略 } //滚动消息