diff --git a/BauSystem_19/src/de/steamwar/bausystem/features/simulator/preview/AxisMovementLimiter.java b/BauSystem_19/src/de/steamwar/bausystem/features/simulator/preview/AxisMovementLimiter.java index 17d2df1b..a83fd36b 100644 --- a/BauSystem_19/src/de/steamwar/bausystem/features/simulator/preview/AxisMovementLimiter.java +++ b/BauSystem_19/src/de/steamwar/bausystem/features/simulator/preview/AxisMovementLimiter.java @@ -49,14 +49,14 @@ public class AxisMovementLimiter { this.movement = movement; // Calculate the min and max values for the movement - minX = x; - maxX = x + 0.98; + minX = x - 0.49; + maxX = x + 0.49; minY = y; maxY = y + 0.98; - minZ = z; - maxZ = z + 0.98; + minZ = z - 0.49; + maxZ = z + 0.49; switch (axis) { case X: diff --git a/BauSystem_19/src/de/steamwar/bausystem/features/simulator/preview/Simulator19.java b/BauSystem_19/src/de/steamwar/bausystem/features/simulator/preview/Simulator19.java index e1d00dd2..fddb97ec 100644 --- a/BauSystem_19/src/de/steamwar/bausystem/features/simulator/preview/Simulator19.java +++ b/BauSystem_19/src/de/steamwar/bausystem/features/simulator/preview/Simulator19.java @@ -61,6 +61,9 @@ public class Simulator19 implements Simulator { @Override public synchronized PreviewRecord run(Pair>>>> toCalculate) { PreviewRecord previewRecord = new PreviewRecord(); + if (toCalculate == null) { + return previewRecord; + } int currentTick = 0; long time = System.currentTimeMillis(); @@ -74,7 +77,7 @@ public class Simulator19 implements Simulator { pairs.forEach(pair -> { if (pair.getValue() > 0) { hasSomeLeft.set(true); - TNT tnt = new TNT(pair.getKey().location.getX() - 0.49, pair.getKey().location.getY(), pair.getKey().location.getZ() - 0.49); + TNT tnt = new TNT(pair.getKey().location.getX(), pair.getKey().location.getY(), pair.getKey().location.getZ()); if (!pair.getKey().xVelocity) tnt.setVx(0.0); if (!pair.getKey().yVelocity) tnt.setVy(0.0); if (!pair.getKey().zVelocity) tnt.setVz(0.0); @@ -97,7 +100,6 @@ public class Simulator19 implements Simulator { } tntList.removeAll(remove); } - System.out.println(AIR_BLOCKS); AIR_BLOCKS.forEach(pos -> previewRecord.addAir(new Vector(pos.x, pos.y, pos.z))); System.out.println("Time: " + (System.currentTimeMillis() - time) + "ms " + cacheMisses + "/" + accessed + "/" + aired); diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/SimulatorCursor.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/SimulatorCursor.java index c0d1bab5..ba072bea 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/SimulatorCursor.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/SimulatorCursor.java @@ -44,7 +44,7 @@ public class SimulatorCursor { private Map rEntityServerMap = new HashMap<>(); public void show(Player player, TNTSimulator tntSimulator, RayTraceUtils.RRayTraceResult result) { - REntityServer cursor = rEntityServerMap.get(player); + REntityServer cursor = rEntityServerMap.remove(player); if (cursor != null) cursor.close(); @@ -140,4 +140,8 @@ public class SimulatorCursor { return pos; } + + public boolean has(Player player) { + return rEntityServerMap.containsKey(player); + } } diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/SimulatorStorage.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/SimulatorStorage.java index a549e0a2..ea6dd0ea 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/SimulatorStorage.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/SimulatorStorage.java @@ -178,7 +178,7 @@ public class SimulatorStorage implements Enable, Disable { if (content.isEmpty()) continue; TNTSimulator tntSimulator = new TNTSimulator(); for (YAPIONObject element : content.streamObject().collect(Collectors.toList())) { - tntSimulator.getTntElementList().add(new TNTElement(element, null, tntSimulator.getEntityServer())); + tntSimulator.getTntElementList().add(new TNTElement(element, tntSimulator, null, tntSimulator.getEntityServer())); } tntSimulators.put(newName, tntSimulator); } diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/TNTSimulator.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/TNTSimulator.java index e936fa0b..711ecd8f 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/TNTSimulator.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/TNTSimulator.java @@ -23,6 +23,8 @@ import de.steamwar.bausystem.BauSystem; import de.steamwar.bausystem.configplayer.Config; import de.steamwar.bausystem.features.simulator.gui.TNTElementGUI; import de.steamwar.bausystem.features.simulator.gui.TNTSimulatorGui; +import de.steamwar.bausystem.features.simulator.preview.PreviewRecord; +import de.steamwar.bausystem.features.simulator.preview.Simulator; import de.steamwar.bausystem.features.simulator.tnt.SimulatorElement; import de.steamwar.bausystem.features.simulator.tnt.TNTElement; import de.steamwar.bausystem.features.simulator.tnt.TNTGroup; @@ -34,7 +36,6 @@ import de.steamwar.bausystem.utils.RayTraceUtils; import de.steamwar.entity.REntity; import de.steamwar.entity.REntityServer; import lombok.Getter; -import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.entity.Player; import org.bukkit.entity.TNTPrimed; @@ -57,8 +58,9 @@ public class TNTSimulator { private List tntElementList = new ArrayList<>(); - public TNTSimulator() { + private PreviewRecord previewRecord = null; + public TNTSimulator() { } public TNTSimulator(YAPIONObject yapionObject) { @@ -66,9 +68,9 @@ public class TNTSimulator { YAPIONArray yapionArray = yapionObject.getArrayOrDefault("tntElements", new YAPIONArray()); for (YAPIONObject element : yapionArray.streamObject().collect(Collectors.toList())) { if (element.containsKey("elements", YAPIONType.ARRAY)) { - tntElementList.add(new TNTGroup(element, entityServer)); + tntElementList.add(new TNTGroup(element, this, entityServer)); } else { - tntElementList.add(new TNTElement(element, null, entityServer)); + tntElementList.add(new TNTElement(element, this, null, entityServer)); } } } @@ -100,10 +102,39 @@ public class TNTSimulator { entityServer.removePlayer(player); players.remove(player); } + hidePreview(player); } - void _hide(Player player) { - players.remove(player); + public void showPreview(Player player) { + if (previewRecord == null) { + calcPreview(true); + } + if (previewRecord != null) { + previewRecord.show(player); + } + } + + public void hidePreview(Player player) { + if (previewRecord != null && previewRecord.hide(player)) { + previewRecord = null; + } + } + + public void calcPreview(boolean force) { + if (!force && previewRecord == null) { + return; + } + + PreviewRecord newRecord = Simulator.impl.run(locations()); + PreviewRecord oldRecord = previewRecord; + previewRecord = newRecord; + if (newRecord == null) return; + if (oldRecord != null) { + new HashSet<>(oldRecord.getPlayers()).forEach(player -> { + oldRecord.hide(player); + newRecord.show(player); + }); + } } public List getEntities() { @@ -120,6 +151,7 @@ public class TNTSimulator { public void clear() { new ArrayList<>(tntElementList).forEach(this::remove); + calcPreview(false); } public void remove(SimulatorElement element) { @@ -142,6 +174,7 @@ public class TNTSimulator { } element.close(); tntElementList.remove(element); + calcPreview(false); } public void change() { @@ -151,6 +184,7 @@ public class TNTSimulator { ((TNTGroup) simulatorElement).getElements().forEach(SimulatorElement::change); } }); + calcPreview(false); } public void edit(Player player, RayTraceUtils.RRayTraceResult result) { @@ -200,16 +234,15 @@ public class TNTSimulator { return; } - TNTElement tntElement = new TNTElement(SimulatorCursor.getPos(player, result), null, entityServer); + TNTElement tntElement = new TNTElement(this, SimulatorCursor.getPos(player, result), null, entityServer); tntElementList.add(tntElement); TNTElementGUI.open(player, tntElement, null); } - public Pair>>>> locations(Player p) { - Region region = Region.getRegion(p.getLocation()); + public Pair>>>> locations() { Map>>> result = new HashMap<>(); for (SimulatorElement element : tntElementList) { - if (element.locations(result, region, p.getLocation())) { + if (element.locations(result)) { return null; } } @@ -234,7 +267,7 @@ public class TNTSimulator { public void start(Player p) { Region region = Region.getRegion(p.getLocation()); - Pair>>>> result = locations(p); + Pair>>>> result = locations(); if (result == null) { BauSystem.MESSAGE.send("SIMULATOR_REGION_FROZEN", p); return; diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/TNTSimulatorListener.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/TNTSimulatorListener.java index a8e5aa8e..1d66457e 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/TNTSimulatorListener.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/TNTSimulatorListener.java @@ -28,23 +28,24 @@ import de.steamwar.bausystem.shared.Pair; import de.steamwar.bausystem.utils.ItemUtils; import de.steamwar.bausystem.utils.RayTraceUtils; import de.steamwar.linkage.Linked; +import org.bukkit.Bukkit; import org.bukkit.Location; +import org.bukkit.Material; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; +import org.bukkit.event.block.BlockBreakEvent; +import org.bukkit.event.block.BlockPlaceEvent; import org.bukkit.event.player.*; import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.PlayerInventory; import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.function.Function; @Linked public class TNTSimulatorListener implements Listener { - private Map previewRecordMap = new HashMap<>(); private Map currentSimulator = new HashMap<>(); private boolean permissionCheck(Player player) { @@ -55,114 +56,125 @@ public class TNTSimulatorListener implements Listener { return true; } - private Pair getSimulator(Player player) { - if (ItemUtils.isItem(player.getInventory().getItemInOffHand(), "simulator")) { - return new Pair<>(SimulatorStorage.getSimulator(player.getInventory().getItemInOffHand()), true); + private Pair getSimulator(ItemStack offHand, ItemStack mainHand) { + if (ItemUtils.isItem(offHand, "simulator")) { + return new Pair<>(SimulatorStorage.getSimulator(offHand), true); } - if (ItemUtils.isItem(player.getInventory().getItemInMainHand(), "simulator")) { - return new Pair<>(SimulatorStorage.getSimulator(player.getInventory().getItemInMainHand()), false); + if (ItemUtils.isItem(mainHand, "simulator")) { + return new Pair<>(SimulatorStorage.getSimulator(mainHand), false); } return new Pair<>(null, false); } + private Pair getSimulator(Player player) { + return getSimulator(player.getInventory().getItemInOffHand(), player.getInventory().getItemInMainHand()); + } + static RayTraceUtils.RRayTraceResult trace(Player player, Location to, TNTSimulator simulator) { return RayTraceUtils.traceREntity(player, to, simulator.getEntities()); } - private void hideShow(Player player, TNTSimulator simulator) { + private void hideShow(Player player, Pair simulatorPair) { + TNTSimulator simulator = simulatorPair.getKey(); TNTSimulator tntSimulator = currentSimulator.remove(player); if (tntSimulator == simulator) return; if (tntSimulator != null) tntSimulator.hide(player); - if (simulator != null) { - simulator.show(player); - SimulatorCursor.show(player, simulator, trace(player, player.getLocation(), simulator)); + if (simulator == null) return; + currentSimulator.put(player, simulator); + simulator.show(player); + SimulatorCursor.show(player, simulator, trace(player, player.getLocation(), simulator)); + if (simulatorPair.getValue()) { + simulator.showPreview(player); + } else { + simulator.hidePreview(player); } } @EventHandler public void onPlayerMove(PlayerMoveEvent e) { Pair simulatorPair = getSimulator(e.getPlayer()); - hideShow(e.getPlayer(), simulatorPair.getKey()); + hideShow(e.getPlayer(), simulatorPair); } @EventHandler public void onPlayerItemHeld(PlayerItemHeldEvent e) { - Pair simulatorPair = getSimulator(e.getPlayer()); - hideShow(e.getPlayer(), simulatorPair.getKey()); + Pair simulatorPair = getSimulator(e.getPlayer().getInventory().getItemInOffHand(), e.getPlayer().getInventory().getItem(e.getNewSlot())); + hideShow(e.getPlayer(), simulatorPair); } @EventHandler public void onPlayerDropItem(PlayerDropItemEvent e) { - Pair simulatorPair = getSimulator(e.getPlayer()); - hideShow(e.getPlayer(), simulatorPair.getKey()); + Pair simulatorPair = getSimulator(e.getPlayer().getInventory().getItemInOffHand(), new ItemStack(Material.AIR)); + hideShow(e.getPlayer(), simulatorPair); } @EventHandler public void onPlayerJoin(PlayerJoinEvent e) { Pair simulatorPair = getSimulator(e.getPlayer()); - hideShow(e.getPlayer(), simulatorPair.getKey()); + hideShow(e.getPlayer(), simulatorPair); } @EventHandler public void onPlayerQuit(PlayerQuitEvent e) { - hideShow(e.getPlayer(), null); + hideShow(e.getPlayer(), new Pair<>(null, false)); } @EventHandler public void onPlayerSwapHandItems(PlayerSwapHandItemsEvent e) { - Pair simulatorPair = getSimulator(e.getPlayer()); - hideShow(e.getPlayer(), simulatorPair.getKey()); - - if (!simulatorPair.getValue()) return; - - TNTSimulator simulator = SimulatorStorage.getSimulator(e.getOffHandItem()); - if (preview(e.getPlayer(), simulator)) { - e.setCancelled(true); - } - } - - private boolean preview(Player player, TNTSimulator simulator) { - if (simulator == null) return false; - Pair>>>> toCalculate = simulator.locations(player); - PreviewRecord previewRecord = Simulator.impl.run(toCalculate); - if (previewRecord == null) { - return true; - } - previewRecord.add(player); - previewRecordMap.put(player, previewRecord); - return false; + Pair simulatorPair = getSimulator(e.getOffHandItem(), e.getMainHandItem()); + hideShow(e.getPlayer(), simulatorPair); } @EventHandler - public void onPlayerInteract(PlayerInteractEvent event) { - if (!ItemUtils.isItem(event.getItem(), "simulator")) { + public void onPlayerInteract(PlayerInteractEvent e) { + if (!ItemUtils.isItem(e.getItem(), "simulator")) { return; } - event.setCancelled(true); - if (!permissionCheck(event.getPlayer())) { + Pair simulatorPair = getSimulator(e.getPlayer()); + if (!SimulatorCursor.has(e.getPlayer()) && simulatorPair.getValue()) { return; } - TNTSimulator simulator = SimulatorStorage.getSimulator(event.getItem()); + e.setCancelled(true); + if (!permissionCheck(e.getPlayer())) { + return; + } + TNTSimulator simulator = simulatorPair.getKey(); - switch (event.getAction()) { + switch (e.getAction()) { case LEFT_CLICK_BLOCK: case LEFT_CLICK_AIR: - if (simulator == null) { + if (simulator == null || simulatorPair.getValue()) { return; } - simulator.start(event.getPlayer()); + simulator.start(e.getPlayer()); break; case RIGHT_CLICK_BLOCK: case RIGHT_CLICK_AIR: if (simulator == null) { - SimulatorSelectionGUI.open(event.getPlayer(), event.getItem()); + SimulatorSelectionGUI.open(e.getPlayer(), e.getItem()); } else { - simulator.edit(event.getPlayer(), trace(event.getPlayer(), event.getPlayer().getLocation(), simulator)); + simulator.edit(e.getPlayer(), trace(e.getPlayer(), e.getPlayer().getLocation(), simulator)); } break; default: break; } } + + @EventHandler + public void onBlockPlace(BlockPlaceEvent event) { // TODO: Optimize this + currentSimulator.values().forEach(simulator -> { + simulator.calcPreview(false); + }); + } + + @EventHandler + public void onBlockBreak(BlockBreakEvent event) { // TODO: Optimize this + Bukkit.getScheduler().runTaskLater(BauSystem.getInstance(), () -> { + currentSimulator.values().forEach(simulator -> { + simulator.calcPreview(false); + }); + }, 0); + } } diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/TNTElementGUI.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/TNTElementGUI.java index 93181f90..45dad485 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/TNTElementGUI.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/gui/TNTElementGUI.java @@ -310,7 +310,7 @@ public class TNTElementGUI { tntSimulator.getTntElementList().remove(tntElement); Vector vector = tntElement.getOwnPosition().clone(); int tickOffset = tntElement.getOwnTickOffset(); - TNTGroup tntGroup = new TNTGroup(vector); + TNTGroup tntGroup = new TNTGroup(tntSimulator, vector); tntGroup.setTickOffset(tickOffset); tntGroup.add(tntElement); tntElement.setTickOffset(0); @@ -318,7 +318,7 @@ public class TNTElementGUI { tntSimulator.getTntElementList().add(tntGroup); // Add new TNT - TNTElement newElement = new TNTElement(new Vector(0, 0, 0), tntGroup, tntSimulator.getEntityServer()); + TNTElement newElement = new TNTElement(tntSimulator, new Vector(0, 0, 0), tntGroup, tntSimulator.getEntityServer()); newElement.setTickOffset(1); tntGroup.add(newElement); @@ -334,7 +334,7 @@ public class TNTElementGUI { inv.setItem(25, new SWItem(Material.DISPENSER, BauSystem.MESSAGE.parse("SIMULATOR_TNT_SPAWN_ADD_TNT", player), clickType -> { if (clickType == ClickType.DOUBLE_CLICK) return; Vector vector = tntElement.getOwnPosition().clone(); - TNTElement newElement = new TNTElement(vector, null, tntSimulator.getEntityServer()); + TNTElement newElement = new TNTElement(tntSimulator, vector, null, tntSimulator.getEntityServer()); if (tntElement.hasParent()) { newElement.setTickOffset(tntElement.getOwnTickOffset() + 1); tntElement.getParent().add(newElement); diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/preview/PreviewRecord.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/preview/PreviewRecord.java index caa621c3..84362514 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/preview/PreviewRecord.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/preview/PreviewRecord.java @@ -21,8 +21,11 @@ package de.steamwar.bausystem.features.simulator.preview; import de.steamwar.entity.REntityServer; import de.steamwar.entity.RFallingBlockEntity; +import lombok.Getter; +import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.Material; +import org.bukkit.World; import org.bukkit.block.data.BlockData; import org.bukkit.entity.Player; import org.bukkit.util.Vector; @@ -32,43 +35,45 @@ import java.util.Set; public class PreviewRecord { + private static final World WORLD = Bukkit.getWorlds().get(0); private static final BlockData AIR_BLOCK_DATA = Material.AIR.createBlockData(); private Set vectorList = new HashSet<>(); private Set destroyedBlocks = new HashSet<>(); - private REntityServer rEntityServer; + + @Getter + private Set players = new HashSet<>(); + private REntityServer rEntityServer = new REntityServer(); public void add(double x, double y, double z) { - vectorList.add(new Vector(x + 0.49, y, z + 0.49)); + Vector vector = new Vector(x, y, z); + if (vectorList.add(vector)) { + RFallingBlockEntity entity = new RFallingBlockEntity(rEntityServer, vector.toLocation(WORLD), Material.RED_STAINED_GLASS); + entity.setNoGravity(true); + } } public void addAir(Vector destroyed) { destroyedBlocks.add(destroyed); } - public void add(Player player) { - if (rEntityServer == null) { - rEntityServer = new REntityServer(); - - vectorList.forEach(vector -> { - RFallingBlockEntity entity = new RFallingBlockEntity(rEntityServer, vector.toLocation(player.getWorld()), Material.RED_STAINED_GLASS); - entity.setNoGravity(true); + public void show(Player player) { + if (players.add(player)) { + rEntityServer.addPlayer(player); + destroyedBlocks.forEach(vector -> { + player.sendBlockChange(vector.toLocation(player.getWorld()), AIR_BLOCK_DATA); }); } - rEntityServer.addPlayer(player); - - destroyedBlocks.forEach(vector -> { - player.sendBlockChange(vector.toLocation(player.getWorld()), AIR_BLOCK_DATA); - }); } - public void close(Player player) { - rEntityServer.close(); - rEntityServer = null; - - destroyedBlocks.forEach(vector -> { - Location location = vector.toLocation(player.getWorld()); - player.sendBlockChange(location, location.getBlock().getBlockData()); - }); + public boolean hide(Player player) { + if (players.remove(player)) { + rEntityServer.removePlayer(player); + destroyedBlocks.forEach(vector -> { + Location location = vector.toLocation(player.getWorld()); + player.sendBlockChange(location, location.getBlock().getBlockData()); + }); + } + return players.isEmpty(); } } diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/tnt/SimulatorElement.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/tnt/SimulatorElement.java index c0c67067..0559834d 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/tnt/SimulatorElement.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/tnt/SimulatorElement.java @@ -47,7 +47,7 @@ public interface SimulatorElement { void remove(TNTElement tntElement); SWItem menu(Player p); - boolean locations(Map>>> result, Region region, Location location); // Ticks to subtick order to spawning runnable to count of activations + boolean locations(Map>>> result); // Ticks to subtick order to spawning runnable to count of activations int tntCount(); int tick(); diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/tnt/TNTElement.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/tnt/TNTElement.java index 6828566b..2033b868 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/tnt/TNTElement.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/tnt/TNTElement.java @@ -23,6 +23,7 @@ import de.steamwar.bausystem.BauSystem; import de.steamwar.bausystem.features.simulator.OrderUtils; import de.steamwar.bausystem.features.simulator.SimulatorStorage; import de.steamwar.bausystem.features.simulator.TNTData; +import de.steamwar.bausystem.features.simulator.TNTSimulator; import de.steamwar.bausystem.region.Region; import de.steamwar.bausystem.region.flags.Flag; import de.steamwar.bausystem.region.flags.flagvalues.FreezeMode; @@ -55,6 +56,7 @@ public class TNTElement implements SimulatorElement { private RFallingBlockEntity entity; TNTGroup tntGroup = null; + private final TNTSimulator tntSimulator; private final Vector position; private int fuseTicks = 80; private int count = 1; @@ -72,14 +74,16 @@ public class TNTElement implements SimulatorElement { private Material material = Material.TNT; private boolean disabled = false; - public TNTElement(Vector position, TNTGroup tntGroup, REntityServer entityServer) { + public TNTElement(TNTSimulator tntSimulator, Vector position, TNTGroup tntGroup, REntityServer entityServer) { + this.tntSimulator = tntSimulator; this.entityServer = entityServer; this.tntGroup = tntGroup; this.position = position; initEntity(); } - public TNTElement(YAPIONObject yapionObject, TNTGroup tntGroup, REntityServer entityServer) { + public TNTElement(YAPIONObject yapionObject, TNTSimulator tntSimulator, TNTGroup tntGroup, REntityServer entityServer) { + this.tntSimulator = tntSimulator; this.entityServer = entityServer; this.tntGroup = tntGroup; this.position = new Vector(yapionObject.getDoubleOrDefault("x", yapionObject.getDoubleOrDefault("positionX", 0)), yapionObject.getDoubleOrDefault("y", yapionObject.getDoubleOrDefault("positionY", 0)), yapionObject.getDoubleOrDefault("z", yapionObject.getDoubleOrDefault("positionZ", 0))); @@ -147,6 +151,7 @@ public class TNTElement implements SimulatorElement { this.position.setY(position.getY()); this.position.setZ(position.getZ()); _updatePosition(); + tntSimulator.calcPreview(false); } void _updatePosition() { @@ -168,6 +173,7 @@ public class TNTElement implements SimulatorElement { @Override public void remove(TNTElement tntElement) { entity.die(); + tntSimulator.calcPreview(false); } @Override @@ -190,15 +196,9 @@ public class TNTElement implements SimulatorElement { } @Override - public boolean locations(Map>>> result, Region region, Location radius) { + public boolean locations(Map>>> result) { if (disabled) return false; Location location = getPosition().toLocation(SimulatorStorage.WORLD); - if (region.isGlobal() && location.distanceSquared(radius) > 10000) { - return false; - } - if (!region.inRegion(location, RegionType.NORMAL, RegionExtensionType.NORMAL)) { - return false; - } Region thisRegion = Region.getRegion(location); if (thisRegion.getFlagStorage().get(Flag.FREEZE) == FreezeMode.ACTIVE) { return true; @@ -224,6 +224,7 @@ public class TNTElement implements SimulatorElement { if (count < 0) count = 0; if (count > 400) count = 400; this.count = count; + tntSimulator.calcPreview(false); } public int getOwnTickOffset() { @@ -240,19 +241,23 @@ public class TNTElement implements SimulatorElement { public void setTickOffset(int tickOffset) { if (getTickOffset() - this.tickOffset + tickOffset < 0) { this.tickOffset = -this.getParentTickOffset(); + tntSimulator.calcPreview(false); return; } if (getTickOffset() - this.tickOffset + tickOffset > 400) { this.tickOffset = 400 - this.getParentTickOffset(); + tntSimulator.calcPreview(false); return; } this.tickOffset = tickOffset; + tntSimulator.calcPreview(false); } public void setFuseTicks(int fuseTicks) { if (fuseTicks < 0) fuseTicks = 0; if (fuseTicks > 160) fuseTicks = 160; this.fuseTicks = fuseTicks; + tntSimulator.calcPreview(false); } public Vector getOwnPosition() { @@ -261,6 +266,7 @@ public class TNTElement implements SimulatorElement { public void setOrder(Material material) { this.order = material; + tntSimulator.calcPreview(false); } public void setMaterial(Material material) { @@ -278,6 +284,7 @@ public class TNTElement implements SimulatorElement { public void setDisabled(boolean disabled) { this.disabled = disabled; _updatePosition(); + tntSimulator.calcPreview(false); } public void align(Vector offset) { diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/tnt/TNTGroup.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/tnt/TNTGroup.java index 2e4e85b9..3bfa0553 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/tnt/TNTGroup.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/tnt/TNTGroup.java @@ -21,6 +21,7 @@ package de.steamwar.bausystem.features.simulator.tnt; import de.steamwar.bausystem.BauSystem; import de.steamwar.bausystem.features.simulator.TNTData; +import de.steamwar.bausystem.features.simulator.TNTSimulator; import de.steamwar.bausystem.region.Region; import de.steamwar.bausystem.shared.Pair; import de.steamwar.entity.REntity; @@ -43,24 +44,27 @@ import java.util.stream.Collectors; @Getter public class TNTGroup implements SimulatorElement { + private final TNTSimulator tntSimulator; private final Vector position; private int tickOffset = 0; private Material material = Material.BARREL; private boolean disabled = false; private List elements = new ArrayList<>(); - public TNTGroup(Vector position) { + public TNTGroup(TNTSimulator tntSimulator, Vector position) { + this.tntSimulator = tntSimulator; this.position = position; } - public TNTGroup(YAPIONObject yapionObject, REntityServer entityServer) { + public TNTGroup(YAPIONObject yapionObject, TNTSimulator tntSimulator, REntityServer entityServer) { + this.tntSimulator = tntSimulator; this.position = new Vector(yapionObject.getDoubleOrDefault("x", 0), yapionObject.getDoubleOrDefault("y", 0), yapionObject.getDoubleOrDefault("z", 0)); this.tickOffset = yapionObject.getIntOrDefault("tickOffset", 0); this.material = Material.getMaterial(yapionObject.getStringOrDefault("material", "BARREL")); this.disabled = yapionObject.getBooleanOrDefault("disabled", false); YAPIONArray elements = yapionObject.getArrayOrDefault("elements", new YAPIONArray()); for (YAPIONObject element : elements.streamObject().collect(Collectors.toList())) { - TNTElement tntElement = new TNTElement(element, this, entityServer); + TNTElement tntElement = new TNTElement(element, tntSimulator, this, entityServer); this.elements.add(tntElement); tntElement._updatePosition(); } @@ -86,6 +90,7 @@ public class TNTGroup implements SimulatorElement { public void add(TNTElement tntElement) { tntElement.tntGroup = this; elements.add(tntElement); + tntSimulator.calcPreview(false); } @Override @@ -113,6 +118,7 @@ public class TNTGroup implements SimulatorElement { this.position.setY(position.getY()); this.position.setZ(position.getZ()); elements.forEach(TNTElement::_updatePosition); + tntSimulator.calcPreview(false); } @Override @@ -141,10 +147,10 @@ public class TNTGroup implements SimulatorElement { } @Override - public boolean locations(Map>>> result, Region region, Location location) { + public boolean locations(Map>>> result) { if (disabled) return false; for (TNTElement element : elements) { - if (element.locations(result, region, location)) { + if (element.locations(result)) { return true; } } @@ -174,6 +180,7 @@ public class TNTGroup implements SimulatorElement { } } this.tickOffset = tickOffset; + tntSimulator.calcPreview(false); } public void setMaterial(Material material) { @@ -183,5 +190,6 @@ public class TNTGroup implements SimulatorElement { public void setDisabled(boolean disabled) { this.disabled = disabled; elements.forEach(TNTElement::_updatePosition); + tntSimulator.calcPreview(false); } }