Hotfix OOM in IngameListener

This commit is contained in:
2025-05-18 13:34:42 +02:00
parent 6bbe94150d
commit f7e81f8204
@@ -20,13 +20,13 @@
package de.steamwar.towerrun.listener; package de.steamwar.towerrun.listener;
import de.steamwar.inventory.SWItem; import de.steamwar.inventory.SWItem;
import de.steamwar.network.packets.server.BaumemberUpdatePacket;
import de.steamwar.towerrun.TowerRun; import de.steamwar.towerrun.TowerRun;
import de.steamwar.towerrun.config.Config; import de.steamwar.towerrun.config.Config;
import de.steamwar.towerrun.config.WorldConfig; import de.steamwar.towerrun.config.WorldConfig;
import de.steamwar.towerrun.game.TowerRunGame; import de.steamwar.towerrun.game.TowerRunGame;
import de.steamwar.towerrun.state.GameStateBukkitListener; import de.steamwar.towerrun.state.GameStateBukkitListener;
import de.steamwar.towerrun.state.GameStates; import de.steamwar.towerrun.state.GameStates;
import lombok.AllArgsConstructor;
import org.bukkit.*; import org.bukkit.*;
import org.bukkit.block.Block; import org.bukkit.block.Block;
import org.bukkit.entity.EntityType; import org.bukkit.entity.EntityType;
@@ -43,16 +43,22 @@ import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.scheduler.BukkitRunnable; import org.bukkit.scheduler.BukkitRunnable;
import java.util.*; import java.util.*;
import java.util.function.Function;
import java.util.stream.Stream; import java.util.stream.Stream;
public class IngameListener extends GameStateBukkitListener { public class IngameListener extends GameStateBukkitListener {
private int time = 0; private int time = 0;
private final Map<Integer, List<Block>> blocksToMelt = new HashMap<>(); private final Map<Integer, List<Pos>> blocksToMelt = new HashMap<>();
private BukkitRunnable blocksToMeltRunnable; private BukkitRunnable blocksToMeltRunnable;
private BukkitRunnable antiCampRunnable; private BukkitRunnable antiCampRunnable;
@AllArgsConstructor
private class Pos {
private final int x;
private final int y;
private final int z;
}
public IngameListener() { public IngameListener() {
super(EnumSet.of(GameStates.RUNNING)); super(EnumSet.of(GameStates.RUNNING));
} }
@@ -63,20 +69,21 @@ public class IngameListener extends GameStateBukkitListener {
blocksToMeltRunnable = new BukkitRunnable() { blocksToMeltRunnable = new BukkitRunnable() {
@Override @Override
public void run() { public void run() {
List<Block> blocks = blocksToMelt.remove(time); List<Pos> posList = blocksToMelt.remove(time);
time++; time++;
if (blocks == null) { if (posList == null) {
return; return;
} }
int maxBlocks = 1_000; int maxBlocks = 1_000;
while (maxBlocks > 0 && !blocks.isEmpty()) { while (maxBlocks > 0 && !posList.isEmpty()) {
Block block = blocks.removeFirst(); 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; if (block.getType() == Material.AIR || block.getType() == Material.LAVA) continue;
block.setType(Material.AIR); block.setType(Material.AIR);
block.getWorld().playSound(block.getLocation(), Sound.BLOCK_FIRE_EXTINGUISH, 0.1F, 1); block.getWorld().playSound(block.getLocation(), Sound.BLOCK_FIRE_EXTINGUISH, 0.1F, 1);
maxBlocks--; maxBlocks--;
} }
blocksToMelt.computeIfAbsent(time, __ -> new ArrayList<>()).addAll(0, blocks); blocksToMelt.computeIfAbsent(time, __ -> new ArrayList<>()).addAll(0, posList);
} }
}; };
blocksToMeltRunnable.runTaskTimer(TowerRun.getInstance(), 0, 1); blocksToMeltRunnable.runTaskTimer(TowerRun.getInstance(), 0, 1);
@@ -213,6 +220,8 @@ public class IngameListener extends GameStateBukkitListener {
private void shouldMelt(Block block) { private void shouldMelt(Block block) {
if (block.getType().isBurnable()) return; if (block.getType().isBurnable()) return;
if (block.getType().isAir()) return;
if (block.isLiquid()) return;
int meltingTime = (int) (block.getType().getHardness() * 48 * 20); int meltingTime = (int) (block.getType().getHardness() * 48 * 20);
switch (block.getType()) { switch (block.getType()) {
case TINTED_GLASS: case TINTED_GLASS:
@@ -254,7 +263,7 @@ public class IngameListener extends GameStateBukkitListener {
default: default:
break; 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 @EventHandler