diff --git a/server/gameserver/metadata.cc b/server/gameserver/metadata.cc index 575a488..243a6ac 100644 --- a/server/gameserver/metadata.cc +++ b/server/gameserver/metadata.cc @@ -865,6 +865,43 @@ namespace MetaData return 0; } + void AirDrop::Init() + { + { + int total_weight = 0; + std::vector strings; + a8::Split(i->drop_id(), strings, '|'); + for (const std::string& str : strings) { + std::vector strings2; + a8::Split(str, strings2, ':'); + assert(strings2.size() == 2); + int drop_id = a8::XValue(strings2[0]); + int weight = a8::XValue(strings2[1]); + total_weight += weight; + drop.push_back + (std::make_tuple( + drop_id, + total_weight + ) + ); + } + } + } + + int AirDrop::RandDrop() + { + if (HasDrop()) { + int total_weight = std::get<1>(drop[drop.size() - 1]); + int rnd = rand() % total_weight; + for (auto& tuple : drop) { + if (rnd < std::get<1>(tuple)) { + return std::get<0>(tuple); + } + } + } + return 0; + } + void AirRaid::Init() { { diff --git a/server/gameserver/metadata.h b/server/gameserver/metadata.h index 1de3438..89feb22 100644 --- a/server/gameserver/metadata.h +++ b/server/gameserver/metadata.h @@ -200,6 +200,11 @@ namespace MetaData struct AirDrop { const metatable::AirDrop* i = nullptr; + std::vector> drop; + bool HasDrop() { return !drop.empty();}; + + void Init(); + int RandDrop(); }; struct AirRaid diff --git a/server/gameserver/room.cc b/server/gameserver/room.cc index e84f3b0..71d7456 100644 --- a/server/gameserver/room.cc +++ b/server/gameserver/room.cc @@ -1637,7 +1637,7 @@ void Room::InitAirDrop() a8::XParams() .SetSender(this) .SetParam1(air_drop.i->appear_time()) - .SetParam2(air_drop.i->drop_id()) + .SetParam2(air_drop.RandDrop()) .SetParam3(air_drop.i->id()), [] (const a8::XParams& param) { diff --git a/server/tools/protobuild/metatable.proto b/server/tools/protobuild/metatable.proto index ed92562..a0ce3b6 100755 --- a/server/tools/protobuild/metatable.proto +++ b/server/tools/protobuild/metatable.proto @@ -326,7 +326,7 @@ message AirDrop optional int32 id = 1; optional int32 time = 2; optional int32 appear_time = 3; - optional int32 drop_id = 4; + optional string drop_id = 4; } message AirRaid