diff --git a/server/gameserver/airraid.cc b/server/gameserver/airraid.cc index 40e532fe..6a2dc2d3 100644 --- a/server/gameserver/airraid.cc +++ b/server/gameserver/airraid.cc @@ -115,6 +115,51 @@ bool AirRaid::GenAirRaidPos(const mt::AirRaid* raid_meta, glm::vec3& center) void AirRaid::ExecOneRoundAirRaid(const mt::AirRaid* raid_meta, const glm::vec3& pos) { #if 1 + int continue_time = std::get<0>(raid_meta->_bombling_time); + int interval_time = std::get<1>(raid_meta->_bombling_time); + int bomb_times = continue_time / std::max(1, interval_time); + for (int i = 0; i < bomb_times; ++i) { + glm::vec3 born_pos = pos; + int num = 1; + int delay = i * interval_time * 1000; + + auto bomb_cb = + [this, raid_meta, num, delay, born_pos] + (int event, const a8::Args* args) + { + if (a8::TIMER_EXEC_EVENT == event) { + if (room_->IsGameOver()) { + return; + } + glm::vec3 center = born_pos; + room_->map_instance->Scale(center); + glm::vec3 point; + if (room_->map_instance->FindRandomPointAroundCircle + ( + center, + 100 * room_->GetMapMeta()->scale(), + point + )) { + room_->map_instance->UnScale(point); + for (auto bomb_id : raid_meta->_bomb_ids) { + RoomObstacle* obstacle = room_->CreateObstacle + ( + bomb_id, + point.x, + point.y, + point.z + ); + obstacle->Active(); + } + } + } + }; + + room_->xtimer.SetTimeoutEx + (delay / FRAME_RATE_MS, + bomb_cb, + &room_->xtimer_attacher_); + } #else for (auto& tuple : raid_meta->_raid_waves) { int num = std::get<0>(tuple);