diff --git a/server/gameserver/boxdrop.cc b/server/gameserver/boxdrop.cc index c55bedf8..e7e1a904 100644 --- a/server/gameserver/boxdrop.cc +++ b/server/gameserver/boxdrop.cc @@ -67,22 +67,26 @@ void BoxDrop::OnHumanDeadDrop(Human* hum) if (room_->GetVictoryTeam()) { return; } - int rnd = a8::RandEx(0, 100); - if (hum->stats->abandon_battle) { - if (rnd <= mt::Param::s().battle_event_end_loss_rate_quit * 100) { - Drop(hum->box_num, hum->GetPos().ToGlmVec3()); - hum->box_num = 0; - room_->frame_event.AddPropChgEx(hum->GetWeakPtrRef(), kPropBoxNum, 0, hum->box_num, - 0, 0, false); - } - } else { - if (rnd <= mt::Param::s().battle_event_end_loss_rate_dead * 100) { - Drop(hum->box_num, hum->GetPos().ToGlmVec3()); - hum->box_num = 0; - room_->frame_event.AddPropChgEx(hum->GetWeakPtrRef(), kPropBoxNum, 0, hum->box_num, - 0, 0, false); + int drop_num = 0; + for (int i = 0; i < hum->box_num; ++i) { + int rnd = a8::RandEx(0, 100); + if (hum->stats->abandon_battle) { + if (rnd <= mt::Param::s().battle_event_end_loss_rate_quit * 100) { + ++drop_num; + } + } else { + if (rnd <= mt::Param::s().battle_event_end_loss_rate_dead * 100) { + ++drop_num; + } } } + drop_num = std::max(drop_num, hum->box_num); + if (drop_num > 0) { + Drop(drop_num, hum->GetPos().ToGlmVec3()); + hum->box_num -= drop_num; + room_->frame_event.AddPropChgEx(hum->GetWeakPtrRef(), kPropBoxNum, 0, hum->box_num, + 0, 0, false); + } } void BoxDrop::Drop(int num, const glm::vec3& center)