From f7e81f82047a59f256cd44f6de31dbedcbe94bac Mon Sep 17 00:00:00 2001 From: YoyoNow Date: Sun, 18 May 2025 13:34:42 +0200 Subject: [PATCH] Hotfix OOM in IngameListener --- .../towerrun/listener/IngameListener.java | 27 ++++++++++++------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/TowerRun/src/de/steamwar/towerrun/listener/IngameListener.java b/TowerRun/src/de/steamwar/towerrun/listener/IngameListener.java index a4e2bec6..a7dcd60a 100644 --- a/TowerRun/src/de/steamwar/towerrun/listener/IngameListener.java +++ b/TowerRun/src/de/steamwar/towerrun/listener/IngameListener.java @@ -20,13 +20,13 @@ package de.steamwar.towerrun.listener; import de.steamwar.inventory.SWItem; -import de.steamwar.network.packets.server.BaumemberUpdatePacket; import de.steamwar.towerrun.TowerRun; import de.steamwar.towerrun.config.Config; import de.steamwar.towerrun.config.WorldConfig; import de.steamwar.towerrun.game.TowerRunGame; import de.steamwar.towerrun.state.GameStateBukkitListener; import de.steamwar.towerrun.state.GameStates; +import lombok.AllArgsConstructor; import org.bukkit.*; import org.bukkit.block.Block; import org.bukkit.entity.EntityType; @@ -43,16 +43,22 @@ import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.scheduler.BukkitRunnable; import java.util.*; -import java.util.function.Function; import java.util.stream.Stream; public class IngameListener extends GameStateBukkitListener { private int time = 0; - private final Map> blocksToMelt = new HashMap<>(); + private final Map> blocksToMelt = new HashMap<>(); private BukkitRunnable blocksToMeltRunnable; private BukkitRunnable antiCampRunnable; + @AllArgsConstructor + private class Pos { + private final int x; + private final int y; + private final int z; + } + public IngameListener() { super(EnumSet.of(GameStates.RUNNING)); } @@ -63,20 +69,21 @@ public class IngameListener extends GameStateBukkitListener { blocksToMeltRunnable = new BukkitRunnable() { @Override public void run() { - List blocks = blocksToMelt.remove(time); + List posList = blocksToMelt.remove(time); time++; - if (blocks == null) { + if (posList == null) { return; } int maxBlocks = 1_000; - while (maxBlocks > 0 && !blocks.isEmpty()) { - Block block = blocks.removeFirst(); + while (maxBlocks > 0 && !posList.isEmpty()) { + Pos pos = posList.removeFirst(); + Block block = Bukkit.getWorlds().get(0).getBlockAt(pos.x, pos.y, pos.z); if (block.getType() == Material.AIR || block.getType() == Material.LAVA) continue; block.setType(Material.AIR); block.getWorld().playSound(block.getLocation(), Sound.BLOCK_FIRE_EXTINGUISH, 0.1F, 1); maxBlocks--; } - blocksToMelt.computeIfAbsent(time, __ -> new ArrayList<>()).addAll(0, blocks); + blocksToMelt.computeIfAbsent(time, __ -> new ArrayList<>()).addAll(0, posList); } }; blocksToMeltRunnable.runTaskTimer(TowerRun.getInstance(), 0, 1); @@ -213,6 +220,8 @@ public class IngameListener extends GameStateBukkitListener { private void shouldMelt(Block block) { if (block.getType().isBurnable()) return; + if (block.getType().isAir()) return; + if (block.isLiquid()) return; int meltingTime = (int) (block.getType().getHardness() * 48 * 20); switch (block.getType()) { case TINTED_GLASS: @@ -254,7 +263,7 @@ public class IngameListener extends GameStateBukkitListener { default: break; } - blocksToMelt.computeIfAbsent(time + meltingTime, integer -> new ArrayList<>()).add(block); + blocksToMelt.computeIfAbsent(time + meltingTime, integer -> new ArrayList<>()).add(new Pos(block.getLocation().getBlockX(), block.getLocation().getBlockY(), block.getLocation().getBlockZ())); } @EventHandler