diff --git a/server/gameserver/frameevent.cc b/server/gameserver/frameevent.cc index fbbac4c..71e03d1 100644 --- a/server/gameserver/frameevent.cc +++ b/server/gameserver/frameevent.cc @@ -7,12 +7,13 @@ #include "typeconvert.h" #include "room.h" -void FrameEvent::AddAirDrop(int appear_time, int box_id, a8::Vec2 box_pos) +void FrameEvent::AddAirDrop(int appear_time, std::vector& pos_list) { cs::MFAirDrop* airdrop = airdrops_.Add(); airdrop->set_appear_time(appear_time); - airdrop->set_box_id(box_id); - TypeConvert::ToPb(box_pos, airdrop->mutable_pos()); + for (auto& pos : pos_list) { + TypeConvert::ToPb(pos, airdrop->add_pos_list()); + } } void FrameEvent::AddEmote(Human* hum, int emote_id) diff --git a/server/gameserver/frameevent.h b/server/gameserver/frameevent.h index aec539f..ee88929 100644 --- a/server/gameserver/frameevent.h +++ b/server/gameserver/frameevent.h @@ -12,7 +12,7 @@ public: Room* room = nullptr; public: - void AddAirDrop(int appear_time, int box_id, a8::Vec2 box_pos); + void AddAirDrop(int appear_time, std::vector& pos_list); void AddEmote(Human* hum, int emote_id); void AddShot(Human* hum); void AddBullet(Human* hum, int bullet_id, int bullet_lv, a8::Vec2 born_pos, a8::Vec2 dir, diff --git a/server/gameserver/room.cc b/server/gameserver/room.cc index bc3dcd7..9e3a679 100644 --- a/server/gameserver/room.cc +++ b/server/gameserver/room.cc @@ -1135,12 +1135,43 @@ void Room::InitAirDrop() void Room::AirDrop(MetaData::AirDrop* air_drop) { - frame_event.AddAirDrop(air_drop->i->appear_time(), 0, a8::Vec2()); + auto gen_func = + [] (const a8::XParams& param) { + Room* room = (Room*)param.sender.GetUserData(); + MetaData::AirDrop* air_drop = (MetaData::AirDrop*)param.param1.GetUserData(); + std::vector> drop_items; + air_drop->RandItems(drop_items); + for (auto& tuple : drop_items) { + room->GenDrop(air_drop, std::get<1>(tuple), std::get<0>(tuple)); + } + }; + + std::vector pos_list; std::vector> drop_items; air_drop->RandItems(drop_items); for (auto& tuple : drop_items) { - GenDrop(air_drop, std::get<1>(tuple), std::get<0>(tuple)); + int drop_id = std::get<1>(tuple); + int airdrop_point_id = std::get<0>(tuple); + if (airdrop_hash_.find(airdrop_point_id) == airdrop_hash_.end()) { + MetaData::MapTplThing* point_meta = MetaMgr::Instance()->GetMapAirDropPoint(map_tpl_name, + airdrop_point_id); + MetaData::Drop* drop_meta = MetaMgr::Instance()->GetDrop(drop_id); + if (point_meta && drop_meta) { + pos_list.push_back(a8::Vec2( + point_meta->i->x(), + point_meta->i->y() + ) + ); + } + } } + frame_event.AddAirDrop(air_drop->i->appear_time(), pos_list); + xtimer.AddDeadLineTimerAndAttach(air_drop->i->appear_time() / kFRAME_RATE_MS, + a8::XParams() + .SetSender(this) + .SetParam1(air_drop), + gen_func, + &xtimer_attacher.timer_list_); } void Room::GenDrop(MetaData::AirDrop* air_drop, int drop_id, int airdrop_point_id) diff --git a/server/tools/protobuild/cs_proto.proto b/server/tools/protobuild/cs_proto.proto index 0ea1039..49eef30 100755 --- a/server/tools/protobuild/cs_proto.proto +++ b/server/tools/protobuild/cs_proto.proto @@ -560,8 +560,7 @@ message MFPlayerBattlingStats message MFAirDrop { optional int32 appear_time = 1; //箱子出现时间(毫秒) - optional int32 box_id = 2; //箱子id - optional MFVec2 pos = 3; //位置 + repeated MFVec2 pos_list = 3; //位置列表 } //buff