diff --git a/server/gameserver/car.cc b/server/gameserver/car.cc index e5a2909e..9c2ee75f 100644 --- a/server/gameserver/car.cc +++ b/server/gameserver/car.cc @@ -470,7 +470,10 @@ float Car::GetMaxOil() void Car::DropItems(Obstacle* obstacle) { if (obstacle->meta->HasDrop()) { - room->ScatterDrop(obstacle->GetPos().ToGlmVec3(), obstacle->meta->RandDrop()); + std::vector drops = obstacle->meta->RandDrop(); + for (int drop_id : drops) { + room->ScatterDrop(obstacle->GetPos().ToGlmVec3(), drop_id); + } } } diff --git a/server/gameserver/hero.cc b/server/gameserver/hero.cc index 666833a2..b9fdf22c 100644 --- a/server/gameserver/hero.cc +++ b/server/gameserver/hero.cc @@ -301,9 +301,8 @@ std::string Hero::GetName() void Hero::DropItems(Obstacle* obstacle) { bool is_treasure_box = false; - int drop_id = obstacle->meta->RandDrop(); - if (drop_id == 0) { - return; + std::vector drops = obstacle->meta->RandDrop(); + for (int drop_id : drops) { + room->ScatterDrop(obstacle->GetPos().ToGlmVec3(), drop_id); } - room->ScatterDrop(obstacle->GetPos().ToGlmVec3(), drop_id); } diff --git a/server/gameserver/human.cc b/server/gameserver/human.cc index 94aab1dc..b8e1f425 100644 --- a/server/gameserver/human.cc +++ b/server/gameserver/human.cc @@ -1903,15 +1903,10 @@ void Human::DecItem(int item_id, int item_num) void Human::DropItems(Obstacle* obstacle) { bool is_treasure_box = false; - int drop_id = obstacle->meta->RandDrop(); - if (drop_id == 0) { - return; + std::vector drops = obstacle->meta->RandDrop(); + for (int drop_id : drops) { + room->ScatterDrop(obstacle->GetPos().ToGlmVec3(), drop_id); } - - if (drop_id == 0) { - drop_id = obstacle->meta->RandDrop(); - } - room->ScatterDrop(obstacle->GetPos().ToGlmVec3(), drop_id); if (is_treasure_box) { ++box_drop_times_; } else { diff --git a/server/gameserver/mt/MapThing.cc b/server/gameserver/mt/MapThing.cc index 2c790958..68171b95 100644 --- a/server/gameserver/mt/MapThing.cc +++ b/server/gameserver/mt/MapThing.cc @@ -120,18 +120,22 @@ namespace mt } } - int MapThing::RandDrop() const + std::vector MapThing::RandDrop() const { 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)) { +#if 0 return std::get<0>(tuple); +#endif } } } +#if 0 return 0; +#endif } } diff --git a/server/gameserver/mt/MapThing.h b/server/gameserver/mt/MapThing.h index 822013e1..95cf8997 100644 --- a/server/gameserver/mt/MapThing.h +++ b/server/gameserver/mt/MapThing.h @@ -26,7 +26,7 @@ namespace mt bool HasDrop() const { return !_drop.empty();}; void Init1(); - int RandDrop() const; + std::vector RandDrop() const; }; diff --git a/server/gameserver/obstacle.cc b/server/gameserver/obstacle.cc index 4ba87e89..fd963995 100644 --- a/server/gameserver/obstacle.cc +++ b/server/gameserver/obstacle.cc @@ -224,7 +224,10 @@ void Obstacle::OnExplosionHit(Explosion* e) if (IsDead(e->GetRoom())) { ProcDieExplosion(e->GetRoom()); if (meta->HasDrop()) { - e->GetRoom()->ScatterDrop(GetPos().ToGlmVec3(), meta->RandDrop()); + std::vector drops = meta->RandDrop(); + for (int drop_id : drops) { + e->GetRoom()->ScatterDrop(GetPos().ToGlmVec3(), drop_id); + } } if (meta->thing_type() == kObstacleOilBucket) { const mt::MapThing* bomb_meta = mt::MapThing::GetById(meta->_int_param1);