From 1af342d2c31f42ae31087f282d53df22538c31ba Mon Sep 17 00:00:00 2001 From: yoyosource Date: Thu, 7 Sep 2023 15:35:45 +0200 Subject: [PATCH] Implement advanced TNTSimulator PreviewRecord Signed-off-by: yoyosource --- .../simulator/preview/Simulator19.java | 10 +++- .../features/simulator/TNTSimulator.java | 2 +- .../simulator/preview/PreviewRecord.java | 47 ++++++++++--------- .../features/tracer/show/EntityShowMode.java | 6 +-- .../features/tracer/show/Record.java | 4 -- .../tracer/show/ShowModeParameter.java | 11 +++++ 6 files changed, 50 insertions(+), 30 deletions(-) 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 fddb97ec..4cc36085 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 @@ -20,6 +20,7 @@ package de.steamwar.bausystem.features.simulator.preview; import de.steamwar.bausystem.features.simulator.TNTData; +import de.steamwar.bausystem.features.tracer.show.Record; import de.steamwar.bausystem.shared.Pair; import org.bukkit.Bukkit; import org.bukkit.Material; @@ -66,10 +67,12 @@ public class Simulator19 implements Simulator { } int currentTick = 0; + Map recordMap = new HashMap<>(); long time = System.currentTimeMillis(); while (!tntList.isEmpty() || currentTick <= toCalculate.getKey()) { List>> toSpawnInTick = toCalculate.getValue().get(currentTick); if (toSpawnInTick != null) { + int finalCurrentTick = currentTick; toSpawnInTick.forEach(pairs -> { AtomicBoolean hasSomeLeft = new AtomicBoolean(true); while(hasSomeLeft.get()) { @@ -84,6 +87,9 @@ public class Simulator19 implements Simulator { tnt.setFuse(tnt.getFuse()); tntList.add(tnt); pair.setValue(pair.getValue() - 1); + Record.TNTRecord record = previewRecord.getRecord().spawn(finalCurrentTick); + record.source(pair.getKey().location.toVector(), new Vector(tnt.getVx(), tnt.getVy(), tnt.getVz()), tnt.getFuse()); + recordMap.put(tnt, record); } }); } @@ -95,8 +101,10 @@ public class Simulator19 implements Simulator { for (TNT tnt : tntList) { if (tnt.tick()) { remove.add(tnt); + recordMap.remove(tnt).explode(new Vector(tnt.getX(), tnt.getY(), tnt.getZ()), new Vector(tnt.getVx(), tnt.getVy(), tnt.getVz()), tnt.getFuse()); + } else { + recordMap.get(tnt).location(new Vector(tnt.getX(), tnt.getY(), tnt.getZ()), new Vector(tnt.getVx(), tnt.getVy(), tnt.getVz()), tnt.getFuse()); } - previewRecord.add(tnt.getX(), tnt.getY(), tnt.getZ()); } tntList.removeAll(remove); } 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 711ecd8f..22078942 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/TNTSimulator.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/TNTSimulator.java @@ -130,7 +130,7 @@ public class TNTSimulator { previewRecord = newRecord; if (newRecord == null) return; if (oldRecord != null) { - new HashSet<>(oldRecord.getPlayers()).forEach(player -> { + oldRecord.getPlayers().forEach(player -> { oldRecord.hide(player); newRecord.show(player); }); 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 84362514..6a8094f3 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 @@ -19,38 +19,34 @@ package de.steamwar.bausystem.features.simulator.preview; -import de.steamwar.entity.REntityServer; -import de.steamwar.entity.RFallingBlockEntity; +import de.steamwar.bausystem.features.tracer.show.EntityShowMode; +import de.steamwar.bausystem.features.tracer.show.Record; +import de.steamwar.bausystem.features.tracer.show.ShowModeParameter; 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; +import java.util.HashMap; import java.util.HashSet; +import java.util.Map; 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<>(); @Getter - private Set players = new HashSet<>(); - private REntityServer rEntityServer = new REntityServer(); + private Record record = new Record(null, (region, tntPosition) -> {}); - public void add(double x, double y, double z) { - 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); - } + private Map showModeMap = new HashMap<>(); + + public Set getPlayers() { + return new HashSet<>(showModeMap.keySet()); } public void addAir(Vector destroyed) { @@ -58,22 +54,31 @@ public class PreviewRecord { } public void show(Player player) { - if (players.add(player)) { - rEntityServer.addPlayer(player); + showModeMap.computeIfAbsent(player, p -> { destroyedBlocks.forEach(vector -> { - player.sendBlockChange(vector.toLocation(player.getWorld()), AIR_BLOCK_DATA); + p.sendBlockChange(vector.toLocation(player.getWorld()), AIR_BLOCK_DATA); }); - } + ShowModeParameter showModeParameter = new ShowModeParameter(); + showModeParameter.enableInterpolateY(); + showModeParameter.enableInterpolateXZ(); + showModeParameter.enableWater(); + showModeParameter.enableCount(); + showModeParameter.setTntPositionMaterial(Material.RED_STAINED_GLASS); + showModeParameter.setUpdatePositionMaterial(Material.WHITE_STAINED_GLASS); + showModeParameter.setExplosePositionMaterial(Material.RED_WOOL); + return new EntityShowMode(p, showModeParameter, 10); + }); } public boolean hide(Player player) { - if (players.remove(player)) { - rEntityServer.removePlayer(player); + EntityShowMode showMode = showModeMap.remove(player); + if (showMode != null) { + showMode.hide(); destroyedBlocks.forEach(vector -> { Location location = vector.toLocation(player.getWorld()); player.sendBlockChange(location, location.getBlock().getBlockData()); }); } - return players.isEmpty(); + return showModeMap.isEmpty(); } } diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/show/EntityShowMode.java b/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/show/EntityShowMode.java index 0828ce73..d6f6af3e 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/show/EntityShowMode.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/show/EntityShowMode.java @@ -166,11 +166,11 @@ public class EntityShowMode implements ShowMode { private REntity createEntity(Vector position, PositionType positionType) { Material material; if (positionType == PositionType.TNT) { - material = Material.TNT; + material = showModeParameter.getTntPositionMaterial(); } else if (positionType == PositionType.EXPLODE) { - material = Material.RED_STAINED_GLASS; + material = showModeParameter.getExplosePositionMaterial(); } else { - material = Material.WHITE_STAINED_GLASS; + material = showModeParameter.getUpdatePositionMaterial(); } RFallingBlockEntity entity = new RFallingBlockEntity(entityServer, position.toLocation(player.getWorld()), material); entity.setNoGravity(true); diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/show/Record.java b/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/show/Record.java index 7b22a424..5ecefef7 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/show/Record.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/show/Record.java @@ -45,10 +45,6 @@ public class Record { return tnt.size(); } - public void showAll(ShowMode traceShowMode) { - tnt.forEach(tntRecord -> tntRecord.getPositions().forEach(traceShowMode::show)); - } - public TNTRecord spawn(long offset) { TNTRecord record = new TNTRecord(this, offset, region); tnt.add(record); diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/show/ShowModeParameter.java b/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/show/ShowModeParameter.java index 802c1eba..7ade32f4 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/show/ShowModeParameter.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/show/ShowModeParameter.java @@ -20,6 +20,8 @@ package de.steamwar.bausystem.features.tracer.show; import lombok.Getter; +import lombok.Setter; +import org.bukkit.Material; @Getter public class ShowModeParameter { @@ -34,6 +36,15 @@ public class ShowModeParameter { private boolean ticksSinceStart = false; private boolean microMotion = false; + @Setter + private Material tntPositionMaterial = Material.TNT; + + @Setter + private Material updatePositionMaterial = Material.WHITE_STAINED_GLASS; + + @Setter + private Material explosePositionMaterial = Material.RED_STAINED_GLASS; + public void enableWater() { this.water = true; }