diff --git a/TowerRun/src/de/steamwar/towerrun/listener/IngameListener.java b/TowerRun/src/de/steamwar/towerrun/listener/IngameListener.java index bd38466e..cc3723ef 100644 --- a/TowerRun/src/de/steamwar/towerrun/listener/IngameListener.java +++ b/TowerRun/src/de/steamwar/towerrun/listener/IngameListener.java @@ -27,6 +27,7 @@ import de.steamwar.towerrun.game.TowerRunGame; import de.steamwar.towerrun.state.GameStateBukkitListener; import de.steamwar.towerrun.state.GameStates; import lombok.AllArgsConstructor; +import lombok.EqualsAndHashCode; import org.bukkit.*; import org.bukkit.block.Block; import org.bukkit.entity.EntityType; @@ -43,16 +44,18 @@ import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.scheduler.BukkitRunnable; import java.util.*; +import java.util.stream.Collectors; 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 + @EqualsAndHashCode private class Pos { private final int x; private final int y; @@ -69,22 +72,22 @@ public class IngameListener extends GameStateBukkitListener { blocksToMeltRunnable = new BukkitRunnable() { @Override public void run() { - List posList = blocksToMelt.remove(time); + List blocksToBreak = blocksToMelt.entrySet().stream() + .filter(entry -> entry.getValue() == time) + .map(Map.Entry::getKey) + .collect(Collectors.toList()); time++; - if (posList == null) { + if (blocksToBreak.isEmpty()) { return; } - System.out.println(blocksToMelt.size() + " " + posList.size() + " " + blocksToMelt.values().stream().mapToInt(List::size).sum()); - int maxBlocks = 1_000; - while (maxBlocks > 0 && !posList.isEmpty()) { - Pos pos = posList.removeFirst(); + System.out.println(blocksToBreak.size() + "/" + blocksToMelt.size()); + for (Pos pos : blocksToBreak) { + blocksToMelt.remove(pos); 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, posList); } }; blocksToMeltRunnable.runTaskTimer(TowerRun.getInstance(), 0, 1); @@ -264,7 +267,8 @@ public class IngameListener extends GameStateBukkitListener { default: break; } - blocksToMelt.computeIfAbsent(time + meltingTime, integer -> new ArrayList<>()).add(new Pos(block.getLocation().getBlockX(), block.getLocation().getBlockY(), block.getLocation().getBlockZ())); + Pos pos = new Pos(block.getLocation().getBlockX(), block.getLocation().getBlockY(), block.getLocation().getBlockZ()); + blocksToMelt.putIfAbsent(pos, time + meltingTime); } @EventHandler