forked from SteamWar/SteamWar
Fix IngameListener
This commit is contained in:
@@ -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<Integer, List<Pos>> blocksToMelt = new HashMap<>();
|
||||
private final Map<Pos, Integer> 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<Pos> posList = blocksToMelt.remove(time);
|
||||
List<Pos> 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
|
||||
|
||||
Reference in New Issue
Block a user