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 8c965f97..0b7b312b 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/SimulatorStorage.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/SimulatorStorage.java @@ -105,10 +105,7 @@ public class SimulatorStorage implements Enable, Disable { public static void delete(String name) { TNTSimulator tntSimulator = tntSimulators.remove(name); if (tntSimulator != null) { - new HashMap<>(tntSimulator.getPlayerShowMode()).forEach((player, simulatorEntityShowMode) -> { - SimulatorCursor.hide(player, tntSimulator); - }); - tntSimulator.hide(); + tntSimulator.close(); } new File(simulatorsDir, name + ".simulator").delete(); } @@ -181,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)); + tntSimulator.getTntElementList().add(new TNTElement(element, 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 27988cdc..5a62e119 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/TNTSimulator.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/TNTSimulator.java @@ -32,11 +32,11 @@ import de.steamwar.bausystem.features.tracer.record.SingleTraceRecorder; import de.steamwar.bausystem.region.Region; import de.steamwar.bausystem.shared.Pair; 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.Entity; import org.bukkit.entity.Player; import yapion.hierarchy.types.YAPIONArray; import yapion.hierarchy.types.YAPIONObject; @@ -66,9 +66,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)); + tntElementList.add(new TNTGroup(element, entityServer)); } else { - tntElementList.add(new TNTElement(element)); + tntElementList.add(new TNTElement(element, entityServer)); } } } @@ -88,6 +88,11 @@ public class TNTSimulator { entityServer.close(); } + public void show(Player player) { + entityServer.addPlayer(player); + players.add(player); + } + public void hide(Player player) { entityServer.removePlayer(player); players.remove(player); @@ -109,22 +114,17 @@ public class TNTSimulator { }); } - public void show(Player player) { - entityServer.addPlayer(player); - players.add(player); - } - public void show(SimulatorElement simulatorElement) { playerShowMode.forEach((player, simulatorEntityShowMode) -> { simulatorElement.show(simulatorEntityShowMode); }); } - public List getEntities() { + public List getEntities() { return tntElementList.stream().flatMap(element -> element.getEntities().stream()).collect(Collectors.toList()); } - public List getEntity(Entity entity) { + public List getEntity(REntity entity) { List tntSpawns = new ArrayList<>(); for (SimulatorElement spawn : tntElementList) { spawn.getEntity(tntSpawns, entity); @@ -184,7 +184,7 @@ public class TNTSimulator { return; } - TNTElement tntElement = new TNTElement(SimulatorCursor.getPos(player, result)); + TNTElement tntElement = new TNTElement(SimulatorCursor.getPos(player, result), entityServer); tntElementList.add(tntElement); TNTElementGUI.open(player, tntElement, null); } 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 10ce5cd2..181e3389 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 @@ -19,13 +19,12 @@ package de.steamwar.bausystem.features.simulator.tnt; -import de.steamwar.bausystem.features.simulator.show.SimulatorEntityShowMode; import de.steamwar.bausystem.region.Region; import de.steamwar.bausystem.shared.Pair; +import de.steamwar.entity.REntity; import de.steamwar.inventory.SWItem; import org.bukkit.Location; import org.bukkit.Material; -import org.bukkit.entity.Entity; import org.bukkit.entity.Player; import org.bukkit.util.Vector; import yapion.hierarchy.types.YAPIONObject; @@ -38,15 +37,13 @@ public interface SimulatorElement { Map closeObserver = new HashMap<>(); YAPIONObject toYAPION(); - List getEntities(); - void getEntity(List elements, Entity entity); - default Vector getPosition() { - return new Vector(0, 0, 0); - } + List getEntities(); + void getEntity(List elements, REntity entity); + + Vector getPosition(); + void setPosition(Vector position); void remove(TNTElement tntElement); - void show(SimulatorEntityShowMode showMode); - void hide(SimulatorEntityShowMode showMode); SWItem menu(Player p); boolean locations(Map>>> result, Region region, Location location); // Ticks to subtick order to spawning runnable to count of activations 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 7b2cc3f5..df762600 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 @@ -20,25 +20,24 @@ package de.steamwar.bausystem.features.simulator.tnt; import de.steamwar.bausystem.BauSystem; -import de.steamwar.bausystem.features.simulator.AbstractSimulatorEntity; import de.steamwar.bausystem.features.simulator.OrderUtils; -import de.steamwar.bausystem.features.simulator.SimulatorPreview; import de.steamwar.bausystem.features.simulator.SimulatorStorage; -import de.steamwar.bausystem.features.simulator.show.SimulatorEntityShowMode; import de.steamwar.bausystem.region.Region; import de.steamwar.bausystem.region.flags.Flag; import de.steamwar.bausystem.region.flags.flagvalues.FreezeMode; import de.steamwar.bausystem.region.utils.RegionExtensionType; import de.steamwar.bausystem.region.utils.RegionType; import de.steamwar.bausystem.shared.Pair; -import de.steamwar.bausystem.shared.Position; +import de.steamwar.entity.REntity; +import de.steamwar.entity.REntityServer; import de.steamwar.entity.RFallingBlockEntity; import de.steamwar.inventory.SWItem; import lombok.Getter; import lombok.Setter; +import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.Material; -import org.bukkit.entity.Entity; +import org.bukkit.World; import org.bukkit.entity.Player; import org.bukkit.entity.TNTPrimed; import org.bukkit.util.Vector; @@ -49,6 +48,8 @@ import java.util.*; @Getter public class TNTElement implements SimulatorElement { + private static final World WORLD = Bukkit.getWorlds().get(0); + private final RFallingBlockEntity entity; TNTGroup tntGroup = null; @@ -69,14 +70,18 @@ public class TNTElement implements SimulatorElement { private Material material = Material.TNT; private boolean disabled = false; - public TNTElement(Vector position) { + public TNTElement(Vector position, REntityServer entityServer) { this.position = position; - this.entity = SimulatorEntityShowMode.createEntity(position, false); + this.entity = new RFallingBlockEntity(entityServer, position.toLocation(WORLD), Material.TNT); + this.entity.setNoGravity(true); } - public TNTElement(YAPIONObject yapionObject) { + public TNTElement(YAPIONObject yapionObject, REntityServer entityServer) { 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))); - this.entity = SimulatorEntityShowMode.createEntity(position, false); + this.disabled = yapionObject.getBooleanOrDefault("disabled", false); + this.entity = new RFallingBlockEntity(entityServer, position.toLocation(WORLD), Material.TNT); + this.entity.setNoGravity(true); + this.entity.setInvisible(disabled); this.fuseTicks = yapionObject.getIntOrDefault("fuseTicks", 80); this.count = yapionObject.getIntOrDefault("count", 1); this.tickOffset = yapionObject.getIntOrDefault("tickOffset", 0); @@ -101,21 +106,20 @@ public class TNTElement implements SimulatorElement { yapionObject.add("zVelocity", zVelocity); yapionObject.add("order", order.name()); yapionObject.add("material", material.name()); + yapionObject.add("disabled", disabled); return yapionObject; } @Override - public List getEntities() { + public List getEntities() { if (disabled) return new ArrayList<>(); - entity.setPosition(getPosition()); - return Arrays.asList(entity.getBukkitEntity()); + return Arrays.asList(entity); } @Override - public void getEntity(List elements, Entity entity) { + public void getEntity(List elements, REntity entity) { if (disabled) return; - this.entity.setPosition(getPosition()); - if (this.entity.getId() == entity.getEntityId() || getPosition().equals(entity.getLocation().toVector())) { + if (this.entity.getEntityId() == entity.getEntityId() || getPosition().equals(new Vector(entity.getX(), entity.getY(), entity.getZ()))) { elements.add(this); } } @@ -128,6 +132,19 @@ public class TNTElement implements SimulatorElement { return position.clone(); } + @Override + public void setPosition(Vector position) { + this.position.setX(position.getX()); + this.position.setY(position.getY()); + this.position.setZ(position.getZ()); + _updatePosition(); + } + + void _updatePosition() { + Vector position = getPosition(); + entity.move(position.getX(), position.getY(), position.getZ(), 0F, 0F, (byte) 0); + } + public int getTickOffset() { if (tntGroup != null) { return tntGroup.getTickOffset() + tickOffset; @@ -137,20 +154,7 @@ public class TNTElement implements SimulatorElement { @Override public void remove(TNTElement tntElement) { - } - - @Override - public void show(SimulatorEntityShowMode showMode) { - if (disabled) return; - entity.setPosition(getPosition()); - showMode.show(new Position(getPosition())); - } - - @Override - public void hide(SimulatorEntityShowMode showMode) { - if (disabled) return; - entity.setPosition(getPosition()); - showMode.hide(new Position(getPosition())); + entity.die(); } @Override @@ -246,14 +250,7 @@ public class TNTElement implements SimulatorElement { } public Vector getOwnPosition() { - return position; - } - - public Vector getParentPosition() { - if (tntGroup != null) { - return tntGroup.getPosition(); - } - return new Vector(0, 0, 0); + return position.clone(); } public void setOrder(Material material) { @@ -274,5 +271,10 @@ public class TNTElement implements SimulatorElement { public void setDisabled(boolean disabled) { this.disabled = disabled; + entity.setInvisible(disabled); + } + + void _setDisabled(boolean disabled) { + entity.setInvisible(disabled); } } 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 30a69044..3ab48778 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 @@ -20,15 +20,14 @@ package de.steamwar.bausystem.features.simulator.tnt; import de.steamwar.bausystem.BauSystem; -import de.steamwar.bausystem.features.simulator.SimulatorPreview; -import de.steamwar.bausystem.features.simulator.show.SimulatorEntityShowMode; import de.steamwar.bausystem.region.Region; import de.steamwar.bausystem.shared.Pair; +import de.steamwar.entity.REntity; +import de.steamwar.entity.REntityServer; import de.steamwar.inventory.SWItem; import lombok.Getter; import org.bukkit.Location; import org.bukkit.Material; -import org.bukkit.entity.Entity; import org.bukkit.entity.Player; import org.bukkit.util.Vector; import yapion.hierarchy.types.YAPIONArray; @@ -53,14 +52,14 @@ public class TNTGroup implements SimulatorElement { this.position = position; } - public TNTGroup(YAPIONObject yapionObject) { + public TNTGroup(YAPIONObject yapionObject, REntityServer entityServer) { 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); + TNTElement tntElement = new TNTElement(element, entityServer); tntElement.tntGroup = this; this.elements.add(tntElement); } @@ -89,38 +88,37 @@ public class TNTGroup implements SimulatorElement { } @Override - public List getEntities() { + public List getEntities() { if (disabled) new ArrayList<>(); return elements.stream().flatMap(tntElement -> tntElement.getEntities().stream()).collect(Collectors.toList()); } @Override - public void getEntity(List elements, Entity entity) { + public void getEntity(List elements, REntity entity) { if (disabled) return; for (TNTElement tntElement : this.elements) { tntElement.getEntity(elements, entity); } } + @Override + public Vector getPosition() { + return position.clone(); + } + + @Override + public void setPosition(Vector position) { + this.position.setX(position.getX()); + this.position.setY(position.getY()); + this.position.setZ(position.getZ()); + elements.forEach(TNTElement::_updatePosition); + } + @Override public void remove(TNTElement tntElement) { - elements.remove(tntElement); - } - - @Override - public void show(SimulatorEntityShowMode showMode) { - if (disabled) return; - elements.forEach(tntElement -> { - tntElement.show(showMode); - }); - } - - @Override - public void hide(SimulatorEntityShowMode showMode) { - if (disabled) return; - elements.forEach(tntElement -> { - tntElement.hide(showMode); - }); + if (elements.remove(tntElement)) { + tntElement.remove(tntElement); + } } @Override @@ -183,5 +181,8 @@ public class TNTGroup implements SimulatorElement { public void setDisabled(boolean disabled) { this.disabled = disabled; + elements.forEach(tntElement -> { + tntElement._setDisabled(disabled); + }); } } diff --git a/BauSystem_Main/src/de/steamwar/bausystem/utils/RayTraceUtils.java b/BauSystem_Main/src/de/steamwar/bausystem/utils/RayTraceUtils.java index 3bbf8310..013aff47 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/utils/RayTraceUtils.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/utils/RayTraceUtils.java @@ -20,7 +20,6 @@ package de.steamwar.bausystem.utils; import de.steamwar.entity.REntity; -import de.steamwar.entity.RFallingBlockEntity; import lombok.Data; import lombok.experimental.UtilityClass; import org.bukkit.FluidCollisionMode; @@ -28,9 +27,7 @@ import org.bukkit.GameMode; import org.bukkit.Location; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; -import org.bukkit.entity.Entity; import org.bukkit.entity.Player; -import org.bukkit.util.BoundingBox; import org.bukkit.util.RayTraceResult; import org.bukkit.util.Vector; @@ -39,7 +36,7 @@ import java.util.List; @UtilityClass public class RayTraceUtils { - public static RRayTraceResult traceREntity(Player player, Location to, List entityList) { + public static RRayTraceResult traceREntity(Player player, Location to, List entityList) { if (player.getGameMode() == GameMode.SPECTATOR) { return null; }