From ecb9f1d55b95e8d386cede5e2e2ce8add93101c5 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Fri, 2 Apr 2021 11:05:53 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=8E=89=E8=90=BD=E5=8A=A8?= =?UTF-8?q?=E7=94=BB=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/gameserver/loot.cc | 4 +++ server/gameserver/loot.h | 3 ++ server/gameserver/room.cc | 23 +++++++++++--- server/gameserver/room.h | 2 ++ server/tools/protobuild/cs_proto.proto | 43 +++++++++++++------------- 5 files changed, 50 insertions(+), 25 deletions(-) diff --git a/server/gameserver/loot.cc b/server/gameserver/loot.cc index 0033500..d3c8650 100644 --- a/server/gameserver/loot.cc +++ b/server/gameserver/loot.cc @@ -43,8 +43,12 @@ void Loot::FillMFObjectFull(Room* room, Human* hum, cs::MFObjectFull* full_data) cs::MFLootFull* p = full_data->mutable_union_obj_5(); p->set_obj_uniid(GetEntityUniId()); TypeConvert::ToPb(GetPos(), p->mutable_pos()); + TypeConvert::ToPb(born_pos, p->mutable_born_pos()); p->set_item_id(item_id); p->set_count(count); p->set_item_level(item_level); + if (show_anim && room->GetFrameNo() <= create_frame_no + 1) { + p->set_show_anim(true); + } } diff --git a/server/gameserver/loot.h b/server/gameserver/loot.h index 8869cdb..f0be614 100644 --- a/server/gameserver/loot.h +++ b/server/gameserver/loot.h @@ -21,6 +21,9 @@ class Loot : public RoomEntity int bullet_num = 0; float param1 = 0.0f; float param2 = 0.0f; + a8::Vec2 born_pos; + bool show_anim = false; + long long create_frame_no = 0; virtual ~Loot() override; virtual void Initialize() override; diff --git a/server/gameserver/room.cc b/server/gameserver/room.cc index 49730e9..278049a 100644 --- a/server/gameserver/room.cc +++ b/server/gameserver/room.cc @@ -442,14 +442,21 @@ void Room::ScatterDrop(a8::Vec2 center, int drop_id) for (auto& item : drop_items) { a8::Vec2 dir = a8::Vec2::UP; dir.Rotate(a8::RandAngle()); - DropItem(center + dir * (5 + rand() % 50), - std::get<0>(item), std::get<1>(item), - std::get<1>(item)); + DropItemEx(center, + center + dir * (5 + rand() % 50), + std::get<0>(item), std::get<1>(item), + std::get<1>(item), + true); } } } void Room::DropItem(a8::Vec2 pos, int item_id, int item_count, int item_lv) +{ + DropItemEx(pos, pos, item_id, item_count, item_lv, false); +} + +void Room::DropItemEx(a8::Vec2 born_pos, a8::Vec2 pos, int item_id, int item_count, int item_lv, bool show_anim) { MetaData::Equip* equip_meta = MetaMgr::Instance()->GetEquip(item_id); if (equip_meta && equip_meta->i->group_num() > 0 && item_count > 0) { @@ -464,7 +471,7 @@ void Room::DropItem(a8::Vec2 pos, int item_id, int item_count, int item_lv) dir.Rotate(a8::RandAngle()); pos = pos + dir * (25 + rand() % 50); } - CreateLoot(item_id, pos, drop_num, item_lv); + CreateLootEx(item_id, born_pos, pos, drop_num, item_lv, show_anim); total_count -= drop_num; } } @@ -484,6 +491,11 @@ RoomObstacle* Room::CreateObstacle(int id, float x, float y) } int Room::CreateLoot(int equip_id, a8::Vec2 pos, int count, int equip_lv) +{ + return CreateLootEx(equip_id, pos, pos, count, equip_lv, false); +} + +int Room::CreateLootEx(int equip_id, a8::Vec2 born_pos, a8::Vec2 pos, int count, int equip_lv, bool show_anim) { MetaData::Equip* equip_meta = MetaMgr::Instance()->GetEquip(equip_id); if (equip_meta) { @@ -491,6 +503,9 @@ int Room::CreateLoot(int equip_id, a8::Vec2 pos, int count, int equip_lv) entity->room = this; entity->meta = equip_meta; entity->SetPos(pos); + entity->born_pos = born_pos; + entity->show_anim = show_anim; + entity->create_frame_no = GetFrameNo(); #if 1 { if (entity->GetX() >= map_meta_->i->map_width()) { diff --git a/server/gameserver/room.h b/server/gameserver/room.h index 94446e9..e4144bd 100644 --- a/server/gameserver/room.h +++ b/server/gameserver/room.h @@ -100,8 +100,10 @@ public: void ScatterDrop(a8::Vec2 center, int drop_id); void DropItem(a8::Vec2 pos, int item_id, int item_count, int item_lv); + void DropItemEx(a8::Vec2 born_pos, a8::Vec2 pos, int item_id, int item_count, int item_lv, bool show_anim); int CreateLoot(int equip_id, a8::Vec2 pos, int count, int equip_lv); + int CreateLootEx(int equip_id, a8::Vec2 born_pos, a8::Vec2 pos, int count, int equip_lv, bool show_anim); void CreateBullet(Creature* sender, MetaData::Equip* weapon_meta, MetaData::EquipUpgrade* weapon_upgrade_meta, diff --git a/server/tools/protobuild/cs_proto.proto b/server/tools/protobuild/cs_proto.proto index 37f15ba..8605e1c 100755 --- a/server/tools/protobuild/cs_proto.proto +++ b/server/tools/protobuild/cs_proto.proto @@ -319,7 +319,7 @@ message MFLootFull optional int32 obj_uniid = 1; //唯一id optional MFVec2 pos = 2; //位置 optional MFVec2 born_pos = 3; //出生位置 - optional bool drop_at_thisframe = 4; //是否在这帧掉落 + optional bool show_anim = 4; //是否显示动画 optional int32 item_id = 6; //道具id optional int32 count = 7; //数量 @@ -842,31 +842,32 @@ message CMMove { optional int32 seq = 1; //序号 - optional MFVec2 move_dir = 24; //移动-方向 - optional MFVec2 attack_dir = 20; //攻击方向(朝向) + optional MFVec2 move_dir = 2; //移动-方向 + optional MFVec2 attack_dir = 3; //攻击方向(朝向) - optional bool shot_start = 6; //射击-单发 - optional bool shot_hold = 7; //射击-连发 - optional bool reload = 8; //装弹 - optional float fly_distance = 12; //子弹飞行距离(只有手雷和烟雾弹时这个字段才有意义) + optional bool shot_start = 4; //射击-单发 + optional bool shot_hold = 5; //射击-连发 + optional bool reload = 6; //装弹 + optional float fly_distance = 7; //子弹飞行距离(只有手雷和烟雾弹时这个字段才有意义) - optional int32 select_weapon = 10; //切换武器(没切换是不用发) - optional int32 drop_weapon = 11; //丢弃武器 + optional int32 select_weapon = 8; //切换武器(没切换是不用发) + optional int32 drop_weapon = 9; //丢弃武器 - optional bool cancel_action = 26; //取消当前操作(比如取消使用道具装弹等) - optional int32 use_item_idx = 22; //使用道具(对应库存索引0-16) - optional int32 use_item_id = 4; //使用道具 (道具id目前只有伪装) - optional int32 use_scope = 25; //使用倍镜 0-4 + optional bool cancel_action = 10; //取消当前操作(比如取消使用道具装弹等) + optional int32 use_item_idx = 11; //使用道具(对应库存索引0-16) + optional int32 use_item_id = 12; //使用道具 (道具id目前只有伪装) + optional int32 use_scope = 13; //使用倍镜 0-4 - optional bool interaction = 9; //是否有交互 - repeated int32 interaction_objids = 23; //交互的对象id列表 - optional bool aiming = 2; //是否瞄准中 + optional bool interaction = 14; //是否有交互 + repeated int32 interaction_objids = 15; //交互的对象id列表 + optional bool aiming = 16; //是否瞄准中 - optional bool use_skill = 29; //使用技能 - optional int32 skill_id = 37; //技能id - optional int32 skill_target_id = 21; //技能目标(单体攻击) - optional MFVec2 skill_dir = 34; //技能方向 - optional float skill_param1 = 35; //辅助参数 + optional bool use_skill = 17; //使用技能 + optional int32 skill_id = 18; //技能id + optional int32 skill_target_id = 19; //技能目标(单体攻击) + optional MFVec2 skill_dir = 20; //技能方向 + optional float skill_distance = 21; //技能目标距离 + optional float skill_param1 = 22; //辅助参数 optional bool spectate = 30; //自杀