From 1655c7f443547eed4ba2d965ca8064dd6b94c7da Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Thu, 17 Jun 2021 22:34:39 +0800 Subject: [PATCH] =?UTF-8?q?22.=E5=8D=95=E4=BA=BA=E6=9C=BA=E7=94=B2?= =?UTF-8?q?=EF=BC=8C=E5=9C=B0=E5=9B=BE=E4=B8=8A=E5=A4=9A=E4=B8=AA=E4=BD=8D?= =?UTF-8?q?=E7=BD=AE=E5=88=B7=E6=96=B0X=E4=B8=AA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/gameserver/metadata.cc | 15 ++++++++ server/gameserver/metadata.h | 2 ++ server/gameserver/room.cc | 48 ++++++++++++++++--------- server/tools/protobuild/metatable.proto | 1 + 4 files changed, 50 insertions(+), 16 deletions(-) diff --git a/server/gameserver/metadata.cc b/server/gameserver/metadata.cc index cdae379..2c9dce2 100644 --- a/server/gameserver/metadata.cc +++ b/server/gameserver/metadata.cc @@ -45,6 +45,15 @@ namespace MetaData airraids.push_back(a8::XValue(str).GetInt()); } } + { + std::vector strings; + a8::Split(i->car_num_limit(), strings, '|'); + for (auto& str : strings) { + std::vector strings2; + a8::Split(str, strings2, ':'); + car_num_limit[a8::XValue(strings2[0]).GetInt()] = a8::XValue(strings2[1]).GetInt(); + } + } { std::vector strings; a8::Split(i->game_start_buff_list(), strings, ':'); @@ -117,6 +126,12 @@ namespace MetaData return ""; } + int Map::GetCarLimit(int car_id) + { + auto itr = car_num_limit.find(car_id); + return itr != car_num_limit.end() ? itr->second : 666; + } + void MapThing::Init() { { diff --git a/server/gameserver/metadata.h b/server/gameserver/metadata.h index dde1b9b..8ca15c6 100755 --- a/server/gameserver/metadata.h +++ b/server/gameserver/metadata.h @@ -30,9 +30,11 @@ namespace MetaData int refresh_robot_max_time = 0; std::vector buff_list; a8::Vec2 first_safearea_center; + std::map car_num_limit; void Init(); std::string RandTemplate(); + int GetCarLimit(int car_id); }; struct Attr diff --git a/server/gameserver/room.cc b/server/gameserver/room.cc index 21e2fa9..59a4f54 100644 --- a/server/gameserver/room.cc +++ b/server/gameserver/room.cc @@ -2147,27 +2147,13 @@ void Room::CreateMonsterSpawnPoints() void Room::CreateLoots() { + std::vector> car_equips; for (auto& thing_tpl : *loots_) { int thing_id = thing_tpl->RandThing(); MetaData::Equip* equip_meta = MetaMgr::Instance()->GetEquip(thing_id); if (equip_meta) { if (equip_meta->i->equip_type() == EQUIP_TYPE_CAR) { - int car_uniid = AllocUniid(); - Car* c = CreateCar(nullptr, - car_uniid, - equip_meta, - a8::Vec2 - ( - thing_tpl->i->x(), - thing_tpl->i->y() - ), - 0); - if (c) { - CarObject car; - car.car_id = equip_meta->i->id(); - car.pos = c->GetPos(); - car_hash_[c->GetUniId()] = car; - } + car_equips.push_back(std::make_tuple(equip_meta, thing_tpl)); } else { int loot_uniid = CreateLoot( equip_meta->i->id(), @@ -2196,6 +2182,36 @@ void Room::CreateLoots() #endif } } + + std::map car_nums; + std::random_shuffle(car_equips.begin(), car_equips.end()); + for (size_t i = 0; i < car_equips.size(); ++i) { + MetaData::Equip* equip_meta = std::get<0>(car_equips[i]); + MetaData::MapTplThing* thing_tpl = std::get<1>(car_equips[i]); + + if (car_nums.find(equip_meta->i->id()) == car_nums.end()) { + car_nums[equip_meta->i->id()] = 0; + } + car_nums[equip_meta->i->id()] += 1; + if (car_nums[equip_meta->i->id()] <= ((MetaData::Map*)map_meta_)->GetCarLimit(equip_meta->i->id())) { + int car_uniid = AllocUniid(); + Car* c = CreateCar(nullptr, + car_uniid, + equip_meta, + a8::Vec2 + ( + thing_tpl->i->x(), + thing_tpl->i->y() + ), + 0); + if (c) { + CarObject car; + car.car_id = equip_meta->i->id(); + car.pos = c->GetPos(); + car_hash_[c->GetUniId()] = car; + } + } + } } void Room::CreateDropObjs() diff --git a/server/tools/protobuild/metatable.proto b/server/tools/protobuild/metatable.proto index ecb2b42..9ee02f1 100755 --- a/server/tools/protobuild/metatable.proto +++ b/server/tools/protobuild/metatable.proto @@ -37,6 +37,7 @@ message Map optional string first_safearea_center = 14; optional int32 init_gas_ring = 15; optional string airraids = 16; + optional string car_num_limit = 17; } message MapThing