forked from SteamWar/SteamWar
Hotfix OOM in IngameListener
This commit is contained in:
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user