diff --git a/server/gameserver/room.cc b/server/gameserver/room.cc index 073d150..21e2fa9 100644 --- a/server/gameserver/room.cc +++ b/server/gameserver/room.cc @@ -3949,6 +3949,7 @@ void Room::AirRaid(int airraid_id) pos.x, pos.y ); + obstacle->Active(); if (obstacle) { } #if 1 diff --git a/server/gameserver/roomobstacle.cc b/server/gameserver/roomobstacle.cc index bd30797..baca6a5 100644 --- a/server/gameserver/roomobstacle.cc +++ b/server/gameserver/roomobstacle.cc @@ -283,21 +283,29 @@ void RoomObstacle::SpecExplosion() bomb_born_offset = bomb_born_offset * a8::RandEx(1, std::max(2, meta->i->explosion_float())); a8::Vec2 bomb_pos = GetPos() + bomb_born_offset; std::set objects; + Creature* dumy_c = nullptr; room->grid_service->TraverseAllLayerHumanList ( room->GetRoomIdx(), *grid_list_, - [this, &objects, &bomb_pos] (Human* hum, bool& stop) + [this, &objects, &bomb_pos, &dumy_c] (Human* hum, bool& stop) { + if (!dumy_c) { + dumy_c = hum; + } float distance = (hum->GetPos() - bomb_pos).Norm(); - if (master.Get()->team_id != hum->team_id && distance < meta->i->damage_dia()) { - objects.insert(hum); + if ((!master.Get() || master.Get()->team_id != hum->team_id) && + distance < meta->i->damage_dia()) { + dumy_c = hum; + objects.insert(hum); } }); - room->frame_event.AddExplosionEx(master, - meta->i->thing_id(), - bomb_pos, - meta->i->explosion_effect()); + if (dumy_c) { + room->frame_event.AddExplosionEx(dumy_c->GetWeakPtrRef(), + meta->i->thing_id(), + bomb_pos, + meta->i->explosion_effect()); + } for (auto& target : objects) { switch (target->GetEntityType()) { case ET_Player: