diff --git a/server/gameserver/metadata.cc b/server/gameserver/metadata.cc index 49bd2c1..e722526 100644 --- a/server/gameserver/metadata.cc +++ b/server/gameserver/metadata.cc @@ -29,6 +29,13 @@ namespace MetaData )); } } + { + std::vector strings; + a8::Split(i->airdrops(), strings, '|'); + for (auto& str : strings) { + airdrops.push_back(a8::XValue(str).GetInt()); + } + } } std::string Map::RandTemplate() diff --git a/server/gameserver/metadata.h b/server/gameserver/metadata.h index db51212..92bd0dd 100755 --- a/server/gameserver/metadata.h +++ b/server/gameserver/metadata.h @@ -22,6 +22,7 @@ namespace MetaData std::vector> template_list; int rand_space = 0; + std::vector airdrops; void Init(); std::string RandTemplate(); diff --git a/server/gameserver/metamgr.cc b/server/gameserver/metamgr.cc index 428da70..3a7f45e 100755 --- a/server/gameserver/metamgr.cc +++ b/server/gameserver/metamgr.cc @@ -64,6 +64,7 @@ public: std::map parameter_hash; std::map gamemap_hash; + std::map airdrop_hash; std::map safearea_hash; std::map item_hash; std::map equip_hash; @@ -500,6 +501,7 @@ private: for (auto& meta : airdrop_meta_list) { MetaData::AirDrop& item = a8::FastAppend(airdrop_list); item.i = &meta; + airdrop_hash[meta.id()] = &item; } for (auto& meta : airline_meta_list) { @@ -716,6 +718,12 @@ std::list& MetaMgr::GetAirDrops() return loader_->airdrop_list; } +MetaData::AirDrop* MetaMgr::GetAirDrop(int airdrop_id) +{ + auto itr = loader_->airdrop_hash.find(airdrop_id); + return itr != loader_->airdrop_hash.end() ? itr->second : nullptr; +} + MetaData::AirLine* MetaMgr::RandAirLine(int map_id) { auto itr = loader_->airline_hash.find(map_id); diff --git a/server/gameserver/metamgr.h b/server/gameserver/metamgr.h index d22470c..183f65d 100755 --- a/server/gameserver/metamgr.h +++ b/server/gameserver/metamgr.h @@ -30,6 +30,7 @@ class MetaMgr : public a8::Singleton MetaData::SafeArea* GetSafeArea(int area_id); std::vector* GetMapTplThing(std::string& map_name); std::list& GetAirDrops(); + MetaData::AirDrop* GetAirDrop(int airdrop_id); MetaData::AirLine* RandAirLine(int map_id); MetaData::Skill* GetSkill(int skill_id); MetaData::Buff* GetBuff(int buff_id); diff --git a/server/gameserver/room.cc b/server/gameserver/room.cc index 590aae3..41d985b 100644 --- a/server/gameserver/room.cc +++ b/server/gameserver/room.cc @@ -1303,23 +1303,46 @@ void Room::CombineTeam() void Room::InitAirDrop() { - std::list& air_drops = MetaMgr::Instance()->GetAirDrops(); - for (auto& air_drop : air_drops) { - if (air_drop.i->id() >= 1 && air_drop.i->id() <= 6) { - xtimer.AddDeadLineTimerAndAttach(SERVER_FRAME_RATE * air_drop.i->time(), - a8::XParams() - .SetSender(this) - .SetParam1(air_drop.i->appear_time()) - .SetParam2(air_drop.i->drop_id()) - .SetParam3(air_drop.i->id()), - [] (const a8::XParams& param) - { - Room* room = (Room*)param.sender.GetUserData(); - if (!room->IsGameOver()) { - room->AirDrop(param.param1, param.param2); - } - }, - &xtimer_attacher_.timer_list_); + if (GetRoomMode() == kZombieMode) { + for (int airdrop_id : map_meta_->airdrops) { + MetaData::AirDrop* airdrop_meta = MetaMgr::Instance()->GetAirDrop(airdrop_id); + if (airdrop_meta) { + xtimer.AddDeadLineTimerAndAttach + (SERVER_FRAME_RATE * airdrop_meta->i->time(), + a8::XParams() + .SetSender(this) + .SetParam1(airdrop_meta->i->appear_time()) + .SetParam2(airdrop_meta->i->drop_id()) + .SetParam3(airdrop_meta->i->id()), + [] (const a8::XParams& param) + { + Room* room = (Room*)param.sender.GetUserData(); + if (!room->IsGameOver()) { + room->AirDrop(param.param1, param.param2); + } + }, + &xtimer_attacher_.timer_list_); + } + } + } else { + std::list& air_drops = MetaMgr::Instance()->GetAirDrops(); + for (auto& air_drop : air_drops) { + if (air_drop.i->id() >= 1 && air_drop.i->id() <= 6) { + xtimer.AddDeadLineTimerAndAttach(SERVER_FRAME_RATE * air_drop.i->time(), + a8::XParams() + .SetSender(this) + .SetParam1(air_drop.i->appear_time()) + .SetParam2(air_drop.i->drop_id()) + .SetParam3(air_drop.i->id()), + [] (const a8::XParams& param) + { + Room* room = (Room*)param.sender.GetUserData(); + if (!room->IsGameOver()) { + room->AirDrop(param.param1, param.param2); + } + }, + &xtimer_attacher_.timer_list_); + } } } } diff --git a/server/tools/protobuild/metatable.proto b/server/tools/protobuild/metatable.proto index 29a9164..84bc87e 100755 --- a/server/tools/protobuild/metatable.proto +++ b/server/tools/protobuild/metatable.proto @@ -26,6 +26,8 @@ message Map optional string map_name = 3; //地图名 optional float map_width = 4; optional float map_height = 5; + optional string airdrops = 6; + optional int32 terminator_airdrop = 7; } message MapThing