diff --git a/server/gameserver/mapinstance.cc b/server/gameserver/mapinstance.cc index b5beacc..1038dae 100644 --- a/server/gameserver/mapinstance.cc +++ b/server/gameserver/mapinstance.cc @@ -96,7 +96,8 @@ void MapInstance::CreateThings() case kMOT_Object: { { - int thing_id = thing_tpl.RandThing(); + int num = 0; + int thing_id = thing_tpl.RandThing(num); if (MetaMgr::Instance()->level0room_spec_things_set.find(thing_id) != MetaMgr::Instance()->level0room_spec_things_set.end()) { level0room_spec_things_.push_back(&thing_tpl); @@ -323,7 +324,8 @@ void MapInstance::CreateBlock() void MapInstance::CreateMapObject(MetaData::MapTplThing& thing_tpl) { - int thing_id = thing_tpl.RandThing(); + int num = 0; + int thing_id = thing_tpl.RandThing(num); MetaData::MapThing* thing_meta = MetaMgr::Instance()->GetMapThing(thing_id); if (thing_meta) { if (thing_meta->i->is_house()) { diff --git a/server/gameserver/metadata.cc b/server/gameserver/metadata.cc index cbdd8f9..83304c1 100644 --- a/server/gameserver/metadata.cc +++ b/server/gameserver/metadata.cc @@ -672,25 +672,30 @@ namespace MetaData for (auto& str : strings) { std::vector strings2; a8::Split(str, strings2, ':'); - assert(strings2.size() == 2); + assert(strings2.size() >= 2); rand_space += a8::XValue(strings2[1]).GetInt(); + int num = strings2.size() > 2 ? a8::XValue(strings2[2]).GetInt() : 1; + num = std::max(num, 1); things.push_back(std::make_tuple( a8::XValue(strings2[0]), - rand_space + rand_space, + num ) ); } } } - int MapTplThing::RandThing() + int MapTplThing::RandThing(int& num) { + num = 0; if (rand_space <= 0) { return 0; } int rnd = rand() % rand_space; for (auto& tuple : things) { if (std::get<1>(tuple) > rnd) { + num = std::get<2>(tuple); return std::get<0>(tuple); } } diff --git a/server/gameserver/metadata.h b/server/gameserver/metadata.h index daa8388..f4870e2 100644 --- a/server/gameserver/metadata.h +++ b/server/gameserver/metadata.h @@ -159,9 +159,9 @@ namespace MetaData const metatable::MapTplThingJson* i = nullptr; void Init(); - int RandThing(); + int RandThing(int& num); - std::vector> things; + std::vector> things; std::vector heros; int param1_int = 0; int rand_space = 0; diff --git a/server/gameserver/room.cc b/server/gameserver/room.cc index 7b0c63c..a0b143c 100644 --- a/server/gameserver/room.cc +++ b/server/gameserver/room.cc @@ -2143,7 +2143,8 @@ void Room::CreateLoots() { std::vector> car_equips; for (auto& thing_tpl : *loots_) { - int thing_id = thing_tpl->RandThing(); + int num = 0; + int thing_id = thing_tpl->RandThing(num); MetaData::Equip* equip_meta = MetaMgr::Instance()->GetEquip(thing_id); if (equip_meta) { if (equip_meta->i->equip_type() == EQUIP_TYPE_CAR) { @@ -2156,7 +2157,7 @@ void Room::CreateLoots() thing_tpl->i->x(), thing_tpl->i->y() ), - 1, + num, 1 ); } @@ -3416,7 +3417,8 @@ void Room::CreateLevel0RoomSpecThings() { if (level0room_spec_things_) { for (auto& thing_tpl : *level0room_spec_things_) { - int thing_id = thing_tpl->RandThing(); + int num = 0; + int thing_id = thing_tpl->RandThing(num); MetaData::MapThing* thing_meta = MetaMgr::Instance()->GetMapThing(thing_id); if (thing_meta) { InternalCreateObstacle(thing_id, thing_tpl->i->x(), thing_tpl->i->y(),