From 5ec9fbb6e0cfc9470fd224f64dad005a9c962816 Mon Sep 17 00:00:00 2001 From: D4rkr34lm Date: Mon, 18 Mar 2024 22:40:41 +0100 Subject: [PATCH 01/12] Fixed Trace id assignment Fixed trace recording of source tnt --- .../src/de/steamwar/bausystem/features/tracer/Recorder.java | 1 + .../src/de/steamwar/bausystem/features/tracer/TraceCommand.java | 2 -- .../src/de/steamwar/bausystem/features/tracer/TraceManager.java | 2 +- 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/Recorder.java b/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/Recorder.java index 30ff7d73..cbc6c444 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/Recorder.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/Recorder.java @@ -192,6 +192,7 @@ public class Recorder implements Listener { trackedTNT.get(region).add((TNTPrimed) event.getEntity()); tntSpawnRegion.put((TNTPrimed) event.getEntity(), region); + record((TNTPrimed) event.getEntity(), activeTraces.get(region), Collections.emptyList()); } } diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceCommand.java b/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceCommand.java index fcbb6665..51a63461 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceCommand.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceCommand.java @@ -81,14 +81,12 @@ public class TraceCommand extends SWCommand { @Register(value = "delete", description = "TRACE_COMMAND_HELP_SHOW") public void delete(Player player){ manager.clear(); - //BauSystem.MESSAGE.send("TRACE_MESSAGE_DELETE_ALL", player); } //TODO Manage non exsistent trace @Register(value = "delete", description = "TRACE_COMMAND_HELP_SHOW") public void delete(Player player, int id){ manager.remove(id); - //BauSystem.MESSAGE.send("TRACE_MESSAGE_DELETE", player); } @ClassMapper(value = BundleFilter.class, local = true) diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceManager.java b/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceManager.java index 786fe8e5..ccd89e1c 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceManager.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceManager.java @@ -63,7 +63,7 @@ public class TraceManager implements Listener { trace.render(player, viewFlagMap.get(player), bundleFilterMap.get(player)); traces.put(nextOpenId, trace); nextOpenId++; - return nextOpenId--; + return nextOpenId; } /** Removes the trace with the given id From 10a63f187662b6cb468d3e0996fbb9b938c5f770 Mon Sep 17 00:00:00 2001 From: D4rkr34lm Date: Mon, 18 Mar 2024 22:47:16 +0100 Subject: [PATCH 02/12] Fixed build destroy and testblock destroy flags --- .../src/de/steamwar/bausystem/features/tracer/TNTRecord.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TNTRecord.java b/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TNTRecord.java index ee22eaeb..a7278e26 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TNTRecord.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TNTRecord.java @@ -107,7 +107,7 @@ public class TNTRecord { if (Region.getRegion(destroyedBlock.getLocation()).inRegion(destroyedBlock.getLocation(), RegionType.BUILD, RegionExtensionType.EXTENSION)) buildDestroy = true; if (Region.getRegion(destroyedBlock.getLocation()).inRegion(destroyedBlock.getLocation(), RegionType.TESTBLOCK, RegionExtensionType.EXTENSION)) - buildDestroy = true; + testblockDestroy = true; } destroyedBuildArea = buildDestroy; From 5a59578a66a5b5c0124de1bcdc861d934bd47e9b Mon Sep 17 00:00:00 2001 From: D4rkr34lm Date: Tue, 19 Mar 2024 16:09:32 +0100 Subject: [PATCH 03/12] Changed Record id from uuid to incremental int --- .../steamwar/bausystem/features/tracer/Recorder.java | 11 +++++++++-- .../steamwar/bausystem/features/tracer/TNTRecord.java | 4 ++-- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/Recorder.java b/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/Recorder.java index cbc6c444..116da2e7 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/Recorder.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/Recorder.java @@ -68,6 +68,11 @@ public class Recorder implements Listener { */ private final Map> historyMap = new HashMap<>(); + /** + * Maps Traces to their next open unique TNTRecord id + */ + private final Map nextOpenTNTRecordIdMap = new HashMap<>(); + /** * Regions where auto-trace is enabled */ @@ -111,6 +116,7 @@ public class Recorder implements Listener { Trace trace = new Trace(region); noExplosionRecorded.add(trace); activeTraces.put(region, trace); + nextOpenTNTRecordIdMap.put(trace, 0); return manager.add(trace); } @@ -152,11 +158,12 @@ public class Recorder implements Listener { */ private void record(TNTPrimed tntPrimed, Trace trace, List destroyedBlocks){ List history = historyMap.getOrDefault(tntPrimed, new ArrayList<>()); - UUID tntID; + int tntID; if(history.size() == 0){ historyMap.put(tntPrimed, history); - tntID = UUID.randomUUID(); + tntID = nextOpenTNTRecordIdMap.get(trace); + nextOpenTNTRecordIdMap.put(trace, tntID + 1); } else tntID = history.get(0).getTntId(); diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TNTRecord.java b/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TNTRecord.java index a7278e26..a6065aaf 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TNTRecord.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TNTRecord.java @@ -38,7 +38,7 @@ public class TNTRecord { /** * Unique number to identify records being of the same tnt */ - private final UUID tntId; + private final int tntId; /** * Whether this is a record of a tnt explosion or an entity @@ -90,7 +90,7 @@ public class TNTRecord { */ private final List history; - public TNTRecord(UUID tntId, TNTPrimed tnt, boolean explosion, boolean afterFirstExplosion, long ticksSinceStart, List history, List destroyedBlocks){ + public TNTRecord(int tntId, TNTPrimed tnt, boolean explosion, boolean afterFirstExplosion, long ticksSinceStart, List history, List destroyedBlocks){ this.tntId = tntId; this.explosion = explosion; this.inWater = tnt.isInWater(); From a94f5747a0bd90905a6e7be4500171b721dd3490 Mon Sep 17 00:00:00 2001 From: D4rkr34lm Date: Thu, 21 Mar 2024 14:03:20 +0100 Subject: [PATCH 04/12] Implemented trace isolate --- .../bausystem/features/tracer/Recorder.java | 19 +++--- .../bausystem/features/tracer/Trace.java | 35 ++++++---- .../features/tracer/TraceCommand.java | 66 +++++++++++++++++-- .../features/tracer/TraceManager.java | 6 ++ .../tracer/rendering/BundleFilter.java | 2 +- .../tracer/rendering/TraceEntity.java | 22 +++++++ .../features/tracer/rendering/ViewFlag.java | 44 +++++++++---- .../rendering/dynamicFlags/IsolateFlag.java | 59 +++++++++++++++++ 8 files changed, 211 insertions(+), 42 deletions(-) create mode 100644 BauSystem_Main/src/de/steamwar/bausystem/features/tracer/rendering/dynamicFlags/IsolateFlag.java diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/Recorder.java b/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/Recorder.java index 116da2e7..30f5d0d9 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/Recorder.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/Recorder.java @@ -63,16 +63,16 @@ public class Recorder implements Listener { */ private final Set noExplosionRecorded = new HashSet<>(); + /** + * A map for records that have been taken in the same tick and now have to be added to the traces + */ + private final Map> recordsToAddMap = new HashMap<>(); + /** * Maps a tracked tnt entity to its entire recording history */ private final Map> historyMap = new HashMap<>(); - /** - * Maps Traces to their next open unique TNTRecord id - */ - private final Map nextOpenTNTRecordIdMap = new HashMap<>(); - /** * Regions where auto-trace is enabled */ @@ -116,7 +116,6 @@ public class Recorder implements Listener { Trace trace = new Trace(region); noExplosionRecorded.add(trace); activeTraces.put(region, trace); - nextOpenTNTRecordIdMap.put(trace, 0); return manager.add(trace); } @@ -147,7 +146,8 @@ public class Recorder implements Listener { for(TNTPrimed tnt : trackedTNT.getOrDefault(region, Collections.emptyList())){ record(tnt, trace, Collections.emptyList()); } - trace.commitAdd(); + trace.addAll(recordsToAddMap.get(trace)); + recordsToAddMap.get(trace).clear(); } } @@ -162,8 +162,7 @@ public class Recorder implements Listener { if(history.size() == 0){ historyMap.put(tntPrimed, history); - tntID = nextOpenTNTRecordIdMap.get(trace); - nextOpenTNTRecordIdMap.put(trace, tntID + 1); + tntID = trace.getAndIncrementNextOpenRecordId(); } else tntID = history.get(0).getTntId(); @@ -176,7 +175,7 @@ public class Recorder implements Listener { TNTRecord record = new TNTRecord(tntID, tntPrimed, isExplosion, afterFirstExplosion, TPSUtils.currentTick.get() - trace.getStartTime(), history, destroyedBlocks); history.add(record); - trace.add(record); + recordsToAddMap.get(trace).add(record); } /** Event for TNTs beeing spawn. diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/Trace.java b/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/Trace.java index 705964fc..0028f6ab 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/Trace.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/Trace.java @@ -50,9 +50,10 @@ public class Trace { private List records = new ArrayList<>(); /** - * Records to be added + * ID that should be asigned to the next record of a unique tnt */ - private List newRecords = new ArrayList<>(); + @Getter + private int nextOpenRecordId = -1; /** * A map of players -> REntityServers for rendering traces to a player @@ -73,28 +74,28 @@ public class Trace { this.region = region; } - /** Methode to add a records to add staging - * - * @param records records to add + /** + * Gets and increments the next open record id + * @return next open record id */ - protected void add (TNTRecord records){ - newRecords.add(records); + protected int getAndIncrementNextOpenRecordId(){ + nextOpenRecordId++; + return nextOpenRecordId; } /** - * Commits the additions made to this trace and updates active renders of this trace + * Adds the given records and updates potential trace renderings */ - protected void commitAdd(){ - records.addAll(newRecords); + protected void addAll(List records){ + this.records.addAll(records); for(Player player: serverMap.keySet()){ REntityServer server = serverMap.get(player); BundleFilter bundleFilter = bundleFilterMap.get(player); ViewFlag[] viewFlags = viewFlagMap.get(player); - render(server, newRecords, viewFlags, bundleFilter); + render(server, records, viewFlags, bundleFilter); } - newRecords.clear(); } /** Internal methode to make records immutable after recording is finished @@ -105,8 +106,9 @@ public class Trace { this.records = records; } - /** + /** Gets the historys of all tnts in this trace * + * @return the historys of this trace */ public Set> getHistories() { Set> histories = new HashSet<>(); @@ -233,6 +235,13 @@ public class Trace { server.close(); } + /** Returns the flags used by the given player to render the trace or null if not present + * + * @param player + * @return + */ + protected ViewFlag[] getViewFlags(Player player){return viewFlagMap.get(player);} + @Override public String toString() { return "Trace{" + diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceCommand.java b/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceCommand.java index 51a63461..d51d7cfc 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceCommand.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceCommand.java @@ -21,20 +21,21 @@ package de.steamwar.bausystem.features.tracer; import de.steamwar.bausystem.BauSystem; import de.steamwar.bausystem.features.tracer.rendering.BundleFilter; +import de.steamwar.bausystem.features.tracer.rendering.TraceEntity; import de.steamwar.bausystem.features.tracer.rendering.ViewFlag; +import de.steamwar.bausystem.features.tracer.rendering.dynamicFlags.IsolateFlag; import de.steamwar.bausystem.region.Region; import de.steamwar.command.PreviousArguments; import de.steamwar.command.SWCommand; import de.steamwar.command.TypeMapper; +import de.steamwar.command.TypeValidator; +import de.steamwar.entity.REntityServer; import de.steamwar.linkage.Linked; import de.steamwar.linkage.LinkedInstance; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.List; +import java.util.*; import java.util.stream.Collectors; @Linked @@ -83,12 +84,67 @@ public class TraceCommand extends SWCommand { manager.clear(); } - //TODO Manage non exsistent trace @Register(value = "delete", description = "TRACE_COMMAND_HELP_SHOW") public void delete(Player player, int id){ manager.remove(id); } + @Register(value = "isolate", description = "TRACE_COMMAND_HELP_SHOW") + public void isolate(Player player, Trace trace, @ErrorMessage("test") TNTRecord... records){ + IsolateFlag isolationFlag = null; + + ViewFlag[] viewFlags = trace.getViewFlags(player); + if(viewFlags != null) + for(ViewFlag flag: viewFlags) + if(flag.name.equals("isolate")) + isolationFlag = (IsolateFlag) flag; + + if(isolationFlag == null) + isolationFlag = new IsolateFlag(); + + for(TNTRecord record: records) + isolationFlag.toggleId(record.getTntId()); + } + + @ClassMapper(value = Trace.class, local = true) + public TypeMapper traceClassMapper(){ + return new TypeMapper() { + @Override + public Trace map(CommandSender commandSender, String[] previousArguments, String s) { + int id = Integer.parseInt(s); + + Optional trace = manager.get(id); + + return trace.orElse(null); + } + + @Override + public Collection tabCompletes(CommandSender sender, PreviousArguments previousArguments, String s) { + return manager.getAllIds().stream() + .map(id -> id.toString()) + .collect(Collectors.toList()); + } + }; + } + + @ClassMapper(value = TNTRecord.class, local = true) + public TypeMapper recordMapper() { + return new TypeMapper() { + @Override + public TNTRecord map(CommandSender commandSender, PreviousArguments previousArguments, String s) { + Trace trace = previousArguments.getFirst(Trace.class).orElse(null); + if(trace == null) return null; + + int id = Integer.parseInt(s); + + return trace.getRecords().stream() + .filter(record -> record.getTntId() == id) + .findFirst() + .orElse(null); + } + }; + } + @ClassMapper(value = BundleFilter.class, local = true) public TypeMapper bundleFilterClassMapper() { return new TypeMapper() { diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceManager.java b/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceManager.java index ccd89e1c..c000c0b1 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceManager.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceManager.java @@ -72,6 +72,7 @@ public class TraceManager implements Listener { */ public boolean remove(int id){ if(id >= nextOpenId) return false; + if(traces.get(id) == null) return false; for(Player player: viewFlagMap.keySet()) traces.get(id).hide(player); traces.remove(id); @@ -119,6 +120,11 @@ public class TraceManager implements Listener { return new ArrayList<>(traces.values()); } + /** + * @return all ids of active traces + */ + public Set getAllIds(){return traces.keySet();} + /** Toggles trace show on for player * * @param player diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/rendering/BundleFilter.java b/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/rendering/BundleFilter.java index 3ce9e03e..e511c923 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/rendering/BundleFilter.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/rendering/BundleFilter.java @@ -26,7 +26,7 @@ import java.util.function.BiFunction; public enum BundleFilter { - + //TODO chagne optional to true flase null LOOSE((TNTRecord a, TNTRecord b) -> { if(a.isExplosion() != b.isExplosion()) return Optional.of(false); if(a.getLocation().distance(b.getLocation()) <= BundleFilter.pixelSize) return Optional.of(false); diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/rendering/TraceEntity.java b/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/rendering/TraceEntity.java index a930ec57..9f6439b3 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/rendering/TraceEntity.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/rendering/TraceEntity.java @@ -19,12 +19,16 @@ package de.steamwar.bausystem.features.tracer.rendering; +import de.steamwar.bausystem.BauSystem; import de.steamwar.bausystem.features.tracer.TNTRecord; import de.steamwar.entity.REntityServer; import de.steamwar.entity.RFallingBlockEntity; import lombok.Getter; import org.bukkit.Location; import org.bukkit.Material; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.EntityInteractEvent; import java.util.List; @@ -40,5 +44,23 @@ public class TraceEntity extends RFallingBlockEntity { super(server, location, isExplosion ? Material.RED_STAINED_GLASS : Material.TNT); setNoGravity(true); this.records = records; + + server.setCallback(((player, rEntity, entityAction) -> { + if (entityAction != REntityServer.EntityAction.INTERACT) return; + + TNTRecord representative = records.get(0); + + BauSystem.MESSAGE.sendPrefixless("TNT_CLICK_HEADER", player); + BauSystem.MESSAGE.sendPrefixless("TNT_CLICK_FUSE_TIME", player, representative.getFuse()); + BauSystem.MESSAGE.sendPrefixless("TNT_CLICK_POSITION_X", player, representative.getLocation().getX() + ""); + BauSystem.MESSAGE.sendPrefixless("TNT_CLICK_POSITION_Y", player, representative.getLocation().getY() + ""); + BauSystem.MESSAGE.sendPrefixless("TNT_CLICK_POSITION_Z", player, representative.getLocation().getZ() + ""); + BauSystem.MESSAGE.sendPrefixless("TNT_CLICK_VELOCITY_X", player, representative.getVelocity().getX() + ""); + BauSystem.MESSAGE.sendPrefixless("TNT_CLICK_VELOCITY_Y", player, representative.getVelocity().getY() + ""); + BauSystem.MESSAGE.sendPrefixless("TNT_CLICK_VELOCITY_Z", player, representative.getVelocity().getZ() + ""); + + })); } + + } diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/rendering/ViewFlag.java b/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/rendering/ViewFlag.java index 7798a679..0a5cd21f 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/rendering/ViewFlag.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/rendering/ViewFlag.java @@ -68,7 +68,7 @@ public abstract class ViewFlag { public void modify(REntityServer server, List entities) {} }; - public static ViewFlag SOURCE = new ViewFlag(true, false, "source") { + public static ViewFlag SOURCE = new ViewFlag(true, false, IGNITE, "source") { @Override public List filter(List records) { return records.stream() @@ -107,7 +107,7 @@ public abstract class ViewFlag { public static ViewFlag MICROMOTION = new ViewFlag(true, false, "micromotion") { @Override public List filter(List records) { - Set seen = new HashSet<>(); + Set seen = new HashSet<>(); Set toRemove = new HashSet<>(); for(TNTRecord uniqueRecord: records){ @@ -146,23 +146,25 @@ public abstract class ViewFlag { @Override public void modify(REntityServer server, List entities) { for(TraceEntity entity: entities) { - TNTRecord example = entity.getRecords().get(0); + TNTRecord representaitv = entity.getRecords().get(0); - if(example.isExplosion()) continue; + if(representaitv.isExplosion()) continue; - Location pos = example.getLocation(); + Location pos = representaitv.getLocation(); - Vector xVelocity = new Vector(example.getVelocity().getX(), 0, 0); - Vector yVelocity = new Vector(0, example.getVelocity().getY(), 0); - Vector zVelocity = new Vector(0, 0, example.getVelocity().getZ()); + double xVelocity = representaitv.getVelocity().getX(); + double yVelocity = representaitv.getVelocity().getY(); + double zVelocity = representaitv.getVelocity().getZ(); - Vector firstVelocity = xVelocity.getX() >= zVelocity.getZ() ? xVelocity : zVelocity; - - pos = pos.add(yVelocity); + pos = pos.add(0,yVelocity,0); RFallingBlockEntity y = new RFallingBlockEntity(server, pos, Material.WHITE_STAINED_GLASS); y.setNoGravity(true); - pos = pos.add(firstVelocity); + if(xVelocity >= zVelocity) + pos.add(xVelocity, 0, 0); + else + pos.add(0,0,zVelocity); + RFallingBlockEntity secound = new RFallingBlockEntity(server, pos, Material.WHITE_STAINED_GLASS); secound.setNoGravity(true); } @@ -215,6 +217,11 @@ public abstract class ViewFlag { */ public final String[] aliases; + /** + * A flag that is used whenever this flag is used + */ + public final ViewFlag required; + public ViewFlag(boolean isStatic, boolean isInverse, String name, String... aliases) { this.name = name; this.aliases = aliases; @@ -222,7 +229,18 @@ public abstract class ViewFlag { flags.add(this); if(isInverse) inverseFlags.add(this); - } + required = null; + } + + public ViewFlag(boolean isStatic, boolean isInverse, ViewFlag required, String name, String... aliases){ + this.name = name; + this.aliases = aliases; + if(isStatic) + flags.add(this); + if(isInverse) + inverseFlags.add(this); + this.required = required; + } /** Filters the given records for a given condition * diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/rendering/dynamicFlags/IsolateFlag.java b/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/rendering/dynamicFlags/IsolateFlag.java new file mode 100644 index 00000000..f112ecb6 --- /dev/null +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/rendering/dynamicFlags/IsolateFlag.java @@ -0,0 +1,59 @@ +/* + * This file is a part of the SteamWar software. + * + * Copyright (C) 2024 SteamWar.de-Serverteam + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package de.steamwar.bausystem.features.tracer.rendering.dynamicFlags; + +import de.steamwar.bausystem.features.tracer.TNTRecord; +import de.steamwar.bausystem.features.tracer.rendering.TraceEntity; +import de.steamwar.bausystem.features.tracer.rendering.ViewFlag; +import de.steamwar.entity.REntityServer; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +public class IsolateFlag extends ViewFlag { + + private final List tntToIsolate = new ArrayList<>(); + + public IsolateFlag(){ + super(false, false, ViewFlag.IGNITE, "isolate"); + } + + /** + * Toggles the given id to be or not to be rendered + * @param id + */ + public void toggleId(int id){ + if(tntToIsolate.contains(id)) + tntToIsolate.remove(id); + else + tntToIsolate.add(id); + } + + @Override + public List filter(List records) { + return records.stream() + .filter(record -> tntToIsolate.contains(record.getTntId())) + .collect(Collectors.toList()); + } + + @Override + public void modify(REntityServer server, List entities) {} +} From be25b71cb813ea34e6dfd62b551343bb8f6f84ee Mon Sep 17 00:00:00 2001 From: D4rkr34lm Date: Thu, 21 Mar 2024 14:45:10 +0100 Subject: [PATCH 05/12] added render call to isolate --- .../de/steamwar/bausystem/features/tracer/TraceCommand.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceCommand.java b/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceCommand.java index d51d7cfc..4b30da51 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceCommand.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceCommand.java @@ -104,6 +104,11 @@ public class TraceCommand extends SWCommand { for(TNTRecord record: records) isolationFlag.toggleId(record.getTntId()); + + ViewFlag[] flags = new ViewFlag [1]; + flags[0] = isolationFlag; + + trace.render(player, viewFlags, BundleFilter.STRICT); } @ClassMapper(value = Trace.class, local = true) From 2d7ae673355d82da8580a732d20f7c82ce53ab92 Mon Sep 17 00:00:00 2001 From: D4rkr34lm Date: Thu, 21 Mar 2024 15:04:09 +0100 Subject: [PATCH 06/12] Added required Flags --- .../src/de/steamwar/bausystem/features/tracer/Recorder.java | 2 ++ .../src/de/steamwar/bausystem/features/tracer/Trace.java | 5 +++++ 2 files changed, 7 insertions(+) diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/Recorder.java b/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/Recorder.java index 30f5d0d9..8eab6d0f 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/Recorder.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/Recorder.java @@ -116,6 +116,7 @@ public class Recorder implements Listener { Trace trace = new Trace(region); noExplosionRecorded.add(trace); activeTraces.put(region, trace); + recordsToAddMap.put(trace, new ArrayList<>()); return manager.add(trace); } @@ -133,6 +134,7 @@ public class Recorder implements Listener { for(TNTPrimed tnt : trackedTNT.getOrDefault(region, Collections.emptyList())) historyMap.remove(tnt); + recordsToAddMap.remove(trace); trackedTNT.put(region, new ArrayList<>()); } diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/Trace.java b/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/Trace.java index 0028f6ab..92146fe2 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/Trace.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/Trace.java @@ -160,6 +160,11 @@ public class Trace { List flagList = new ArrayList<>(); + //Manage required flags + for(ViewFlag flag: flags) + if(flag.required != null) + flagList.add(flag.required); + //Manage inverse flags flagList.addAll(ViewFlag.inverseFlags); for(ViewFlag flag: flags){ From d80e4cf3e0164895642dbe75c78629d81d3ef4b4 Mon Sep 17 00:00:00 2001 From: D4rkr34lm Date: Thu, 21 Mar 2024 16:29:51 +0100 Subject: [PATCH 07/12] Fixed inverse x required flags Fixed exeption handeling in record ClassMapper Fixed advanced flag Added flag aliasses --- .../bausystem/features/tracer/Trace.java | 32 +++++++++++-------- .../features/tracer/TraceCommand.java | 31 +++++++++++++----- .../features/tracer/rendering/ViewFlag.java | 6 ++-- .../rendering/dynamicFlags/IsolateFlag.java | 4 ++- 4 files changed, 49 insertions(+), 24 deletions(-) diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/Trace.java b/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/Trace.java index 92146fe2..eea93171 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/Trace.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/Trace.java @@ -55,6 +55,12 @@ public class Trace { @Getter private int nextOpenRecordId = -1; + /** + * List of all used ids + */ + @Getter + private final List usedIds = new ArrayList(); + /** * A map of players -> REntityServers for rendering traces to a player */ @@ -80,6 +86,7 @@ public class Trace { */ protected int getAndIncrementNextOpenRecordId(){ nextOpenRecordId++; + usedIds.add(Integer.toString(nextOpenRecordId)); return nextOpenRecordId; } @@ -158,21 +165,20 @@ public class Trace { List workingRecords = records; - List flagList = new ArrayList<>(); - - //Manage required flags - for(ViewFlag flag: flags) - if(flag.required != null) - flagList.add(flag.required); + //Manage flags and required flags + Set flagList = new HashSet<>(Arrays.asList(flags)); + for (ViewFlag flag : flags) { + if (flag.required != null) { + flagList.addAll(Arrays.asList(flag.required)); + } + } //Manage inverse flags - flagList.addAll(ViewFlag.inverseFlags); - for(ViewFlag flag: flags){ - if(flagList.contains(flag)) - flagList.remove(flag); - else - flagList.add(flag); - } + ViewFlag.inverseFlags.forEach(viewFlag -> { + if (!flagList.remove(viewFlag)) { + flagList.add(viewFlag); + } + }); //Apply filters for(ViewFlag flag : flagList) diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceCommand.java b/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceCommand.java index 4b30da51..dc3f95c0 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceCommand.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceCommand.java @@ -94,22 +94,28 @@ public class TraceCommand extends SWCommand { IsolateFlag isolationFlag = null; ViewFlag[] viewFlags = trace.getViewFlags(player); - if(viewFlags != null) - for(ViewFlag flag: viewFlags) - if(flag.name.equals("isolate")) - isolationFlag = (IsolateFlag) flag; + if(viewFlags != null) { + isolationFlag = Stream.of(viewFlags) + .filter(IsolateFlag.class::isInstance) + .map(IsolateFlag.class::cast) + .findFirst() + .orElse(null); + } - if(isolationFlag == null) + if (viewFlags == null || isolationFlag == null) { + viewFlags = new ViewFlag[1]; + } + if (isolationFlag == null) { isolationFlag = new IsolateFlag(); + } + viewFlags[0] = isolationFlag; for(TNTRecord record: records) isolationFlag.toggleId(record.getTntId()); - ViewFlag[] flags = new ViewFlag [1]; - flags[0] = isolationFlag; - trace.render(player, viewFlags, BundleFilter.STRICT); } + //TODO warning if nothing is shown @ClassMapper(value = Trace.class, local = true) public TypeMapper traceClassMapper(){ @@ -147,6 +153,15 @@ public class TraceCommand extends SWCommand { .findFirst() .orElse(null); } + + //TODO change when new command framework update + @Override + public Collection tabCompletes(CommandSender sender, PreviousArguments previousArguments, String s) { + Trace trace = previousArguments.getFirst(Trace.class).orElse(null); + if(trace == null) return null; + + return trace.getUsedIds(); + } }; } diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/rendering/ViewFlag.java b/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/rendering/ViewFlag.java index 0a5cd21f..e17bcb48 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/rendering/ViewFlag.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/rendering/ViewFlag.java @@ -104,7 +104,8 @@ public abstract class ViewFlag { public void modify(REntityServer server, List entities) {} }; - public static ViewFlag MICROMOTION = new ViewFlag(true, false, "micromotion") { + //TODO fix? + public static ViewFlag MICROMOTION = new ViewFlag(true, false, "micromotion", "m") { @Override public List filter(List records) { Set seen = new HashSet<>(); @@ -139,7 +140,8 @@ public abstract class ViewFlag { public void modify(REntityServer server, List entities) {} }; - public static ViewFlag ADVANCED = new ViewFlag(true, false, "advanced") { + //TODO fix? + public static ViewFlag ADVANCED = new ViewFlag(true, false, "advanced", "a") { @Override public List filter(List records) {return records;} diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/rendering/dynamicFlags/IsolateFlag.java b/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/rendering/dynamicFlags/IsolateFlag.java index f112ecb6..71e59012 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/rendering/dynamicFlags/IsolateFlag.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/rendering/dynamicFlags/IsolateFlag.java @@ -25,12 +25,14 @@ import de.steamwar.bausystem.features.tracer.rendering.ViewFlag; import de.steamwar.entity.REntityServer; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; +import java.util.Set; import java.util.stream.Collectors; public class IsolateFlag extends ViewFlag { - private final List tntToIsolate = new ArrayList<>(); + private final Set tntToIsolate = new HashSet<>(); public IsolateFlag(){ super(false, false, ViewFlag.IGNITE, "isolate"); From c0dcb99f7b806d71893e4894559c9f8115887273 Mon Sep 17 00:00:00 2001 From: D4rkr34lm Date: Thu, 21 Mar 2024 16:30:10 +0100 Subject: [PATCH 08/12] Changes by jojo --- .../bausystem/features/tracer/Trace.java | 11 ++- .../features/tracer/TraceCommand.java | 9 +- .../features/tracer/rendering/ViewFlag.java | 90 +++++++++---------- .../rendering/dynamicFlags/IsolateFlag.java | 7 +- 4 files changed, 58 insertions(+), 59 deletions(-) diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/Trace.java b/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/Trace.java index eea93171..062e5a8f 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/Trace.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/Trace.java @@ -160,7 +160,7 @@ public class Trace { * @param flags Flags modefieing the rendering * @param bundleFilter Filter to determin bundeling of records */ - private void render (REntityServer server, List records, ViewFlag[] flags, BundleFilter bundleFilter){ + private void render(REntityServer server, List records, ViewFlag[] flags, BundleFilter bundleFilter){ if(records.size() == 0) return; List workingRecords = records; @@ -181,8 +181,9 @@ public class Trace { }); //Apply filters - for(ViewFlag flag : flagList) + for(ViewFlag flag : flagList) { workingRecords = flag.filter(workingRecords); + } //Bundle records at unique positions List> bundles = bundleRecords(workingRecords, bundleFilter); @@ -190,12 +191,14 @@ public class Trace { //Render bundled records List entities = new LinkedList<>(); - for(List bundle : bundles) + for(List bundle : bundles) { entities.add(new TraceEntity(server, bundle.get(0).getLocation(), bundle.get(0).isExplosion(), bundle)); + } //Apply modifiers - for(ViewFlag flag : flags) + for(ViewFlag flag : flags) { flag.modify(server, entities); + } } /** Bundles the passed TNTRecords based on whether they are at the same location diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceCommand.java b/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceCommand.java index dc3f95c0..c40f45dc 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceCommand.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceCommand.java @@ -37,6 +37,7 @@ import org.bukkit.entity.Player; import java.util.*; import java.util.stream.Collectors; +import java.util.stream.Stream; @Linked public class TraceCommand extends SWCommand { @@ -119,7 +120,7 @@ public class TraceCommand extends SWCommand { @ClassMapper(value = Trace.class, local = true) public TypeMapper traceClassMapper(){ - return new TypeMapper() { + return new TypeMapper() { @Override public Trace map(CommandSender commandSender, String[] previousArguments, String s) { int id = Integer.parseInt(s); @@ -199,7 +200,7 @@ public class TraceCommand extends SWCommand { return flag; for(String alias: flag.aliases) - if (s.equals("--" + alias)) + if (s.equals("-" + alias)) return flag; } return null; @@ -207,8 +208,8 @@ public class TraceCommand extends SWCommand { @Override public Collection tabCompletes(CommandSender sender, PreviousArguments previousArguments, String s) { return ViewFlag.flags.stream() - .map(flag -> flag.name) - .map(name -> "--" + name) + .flatMap(viewFlag -> Stream.concat(Stream.of("--" + viewFlag.name), + Arrays.stream(viewFlag.aliases).map(name -> "-" + name))) .collect(Collectors.toList()); } }; diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/rendering/ViewFlag.java b/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/rendering/ViewFlag.java index e17bcb48..6f0bd02f 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/rendering/ViewFlag.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/rendering/ViewFlag.java @@ -20,17 +20,16 @@ package de.steamwar.bausystem.features.tracer.rendering; import de.steamwar.bausystem.features.tracer.TNTRecord; -import de.steamwar.bausystem.features.tracer.rendering.TraceEntity; -import de.steamwar.entity.REntity; import de.steamwar.entity.REntityServer; import de.steamwar.entity.RFallingBlockEntity; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.util.Vector; -import java.util.*; -import java.util.function.BiConsumer; -import java.util.function.UnaryOperator; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; import java.util.stream.Collectors; public abstract class ViewFlag { @@ -44,7 +43,7 @@ public abstract class ViewFlag { */ public static final List inverseFlags = new ArrayList<>(); - public static ViewFlag EXPLOSION = new ViewFlag(true, false,"explosion") { + public static ViewFlag EXPLOSION = new ViewFlag(true, false,"explosion", "e") { @Override public List filter(List records) { return records.stream() @@ -56,7 +55,7 @@ public abstract class ViewFlag { public void modify(REntityServer server, List entities) {} }; - public static ViewFlag IGNITE = new ViewFlag(true, true, "ignite") { + public static ViewFlag IGNITE = new ViewFlag(true, true, "ignite", "i") { @Override public List filter(List records) { return records.stream() @@ -68,7 +67,7 @@ public abstract class ViewFlag { public void modify(REntityServer server, List entities) {} }; - public static ViewFlag SOURCE = new ViewFlag(true, false, IGNITE, "source") { + public static ViewFlag SOURCE = new ViewFlag(true, false, IGNITE, "source", "s") { @Override public List filter(List records) { return records.stream() @@ -148,32 +147,33 @@ public abstract class ViewFlag { @Override public void modify(REntityServer server, List entities) { for(TraceEntity entity: entities) { - TNTRecord representaitv = entity.getRecords().get(0); + TNTRecord current = entity.getRecords().get(0); + if(current.isExplosion()) continue; + TNTRecord next = current.getNext().orElse(null); + if (next == null) continue; - if(representaitv.isExplosion()) continue; + Location pos = current.getLocation().clone(); + pos.setY(next.getLocation().getY()); - Location pos = representaitv.getLocation(); + if (pos.distanceSquared(current.getLocation()) >= 1.0 / 256.0) { + RFallingBlockEntity y = new RFallingBlockEntity(server, pos, Material.WHITE_STAINED_GLASS); + y.setNoGravity(true); + } - double xVelocity = representaitv.getVelocity().getX(); - double yVelocity = representaitv.getVelocity().getY(); - double zVelocity = representaitv.getVelocity().getZ(); - - pos = pos.add(0,yVelocity,0); - RFallingBlockEntity y = new RFallingBlockEntity(server, pos, Material.WHITE_STAINED_GLASS); - y.setNoGravity(true); - - if(xVelocity >= zVelocity) - pos.add(xVelocity, 0, 0); - else - pos.add(0,0,zVelocity); - - RFallingBlockEntity secound = new RFallingBlockEntity(server, pos, Material.WHITE_STAINED_GLASS); - secound.setNoGravity(true); + if (current.getVelocity().getX() >= current.getVelocity().getZ()) { + pos.setX(next.getLocation().getX()); + } else { + pos.setZ(next.getLocation().getZ()); + } + if (pos.distanceSquared(next.getLocation()) >= 1.0 / 256.0) { + RFallingBlockEntity second = new RFallingBlockEntity(server, pos, Material.WHITE_STAINED_GLASS); + second.setNoGravity(true); + } } } }; - public static ViewFlag COUNT = new ViewFlag(true, false, "count") { + public static ViewFlag COUNT = new ViewFlag(true, false, "count", "c") { @Override public List filter(List records) { return records; } @@ -185,7 +185,7 @@ public abstract class ViewFlag { } }; - public static ViewFlag FUSE = new ViewFlag(true, false, "fuse") { + public static ViewFlag FUSE = new ViewFlag(true, false, "fuse", "f") { @Override public List filter(List records) { return records; } @@ -197,7 +197,7 @@ public abstract class ViewFlag { } }; - public static ViewFlag TIME = new ViewFlag(true, false, "time") { + public static ViewFlag TIME = new ViewFlag(true, false, "time", "t") { @Override public List filter(List records) { return records; } @@ -222,27 +222,23 @@ public abstract class ViewFlag { /** * A flag that is used whenever this flag is used */ - public final ViewFlag required; + public final ViewFlag[] required; - public ViewFlag(boolean isStatic, boolean isInverse, String name, String... aliases) { + public ViewFlag(boolean isStatic, boolean isInverse, String name, String... aliases) { + this(isStatic, isInverse, new ViewFlag[0], name, aliases); + } + + public ViewFlag(boolean isStatic, boolean isInverse, ViewFlag required, String name, String... aliases) { + this(isStatic, isInverse, new ViewFlag[] { required }, name, aliases); + } + + public ViewFlag(boolean isStatic, boolean isInverse, ViewFlag[] required, String name, String... aliases){ this.name = name; this.aliases = aliases; - if(isStatic) - flags.add(this); - if(isInverse) - inverseFlags.add(this); - required = null; - } - - public ViewFlag(boolean isStatic, boolean isInverse, ViewFlag required, String name, String... aliases){ - this.name = name; - this.aliases = aliases; - if(isStatic) - flags.add(this); - if(isInverse) - inverseFlags.add(this); - this.required = required; - } + if(isStatic) flags.add(this); + if(isInverse) inverseFlags.add(this); + this.required = required; + } /** Filters the given records for a given condition * diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/rendering/dynamicFlags/IsolateFlag.java b/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/rendering/dynamicFlags/IsolateFlag.java index 71e59012..85d1f1bb 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/rendering/dynamicFlags/IsolateFlag.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/rendering/dynamicFlags/IsolateFlag.java @@ -35,7 +35,7 @@ public class IsolateFlag extends ViewFlag { private final Set tntToIsolate = new HashSet<>(); public IsolateFlag(){ - super(false, false, ViewFlag.IGNITE, "isolate"); + super(false, false, ViewFlag.IGNITE, null); } /** @@ -43,10 +43,9 @@ public class IsolateFlag extends ViewFlag { * @param id */ public void toggleId(int id){ - if(tntToIsolate.contains(id)) - tntToIsolate.remove(id); - else + if (!tntToIsolate.remove(id)) { tntToIsolate.add(id); + } } @Override From 987a00ae51c9a841abcb8749d26a2c0f71f287df Mon Sep 17 00:00:00 2001 From: D4rkr34lm Date: Tue, 26 Mar 2024 22:11:08 +0100 Subject: [PATCH 09/12] Added proper info print to chat Refactored Isolate --- .../bausystem/features/tracer/TNTRecord.java | 11 +++++ .../bausystem/features/tracer/Trace.java | 49 ++++++++++++++++--- .../features/tracer/TraceCommand.java | 24 +-------- .../tracer/rendering/TraceEntity.java | 36 ++++++++------ .../features/tracer/rendering/ViewFlag.java | 2 - 5 files changed, 74 insertions(+), 48 deletions(-) diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TNTRecord.java b/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TNTRecord.java index a6065aaf..27aec28e 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TNTRecord.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TNTRecord.java @@ -136,4 +136,15 @@ public class TNTRecord { ", velocity=" + velocity + '}'; } + + @Override + public boolean equals(Object obj) { + if(!(obj instanceof TNTRecord)) return false; + TNTRecord record = (TNTRecord) obj; + + if(record.isExplosion() != explosion) return false; + if(!record.getLocation().equals(location)) return false; + if(!record.getVelocity().equals(velocity)) return false; + return true; + } } diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/Trace.java b/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/Trace.java index 062e5a8f..e679dcd0 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/Trace.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/Trace.java @@ -23,12 +23,14 @@ import de.steamwar.bausystem.features.tpslimit.TPSUtils; import de.steamwar.bausystem.features.tracer.rendering.BundleFilter; import de.steamwar.bausystem.features.tracer.rendering.TraceEntity; import de.steamwar.bausystem.features.tracer.rendering.ViewFlag; +import de.steamwar.bausystem.features.tracer.rendering.dynamicFlags.IsolateFlag; import de.steamwar.bausystem.region.Region; import de.steamwar.entity.REntityServer; import lombok.Getter; import org.bukkit.entity.Player; import java.util.*; +import java.util.stream.Stream; public class Trace { /** @@ -199,6 +201,15 @@ public class Trace { for(ViewFlag flag : flags) { flag.modify(server, entities); } + + server.setCallback(((player, rEntity, entityAction) -> { + for(TraceEntity entity: entities){ + if(((TraceEntity) rEntity).equals(entity)){ + entity.printIntoChat(player); + return; + } + } + })); } /** Bundles the passed TNTRecords based on whether they are at the same location @@ -236,6 +247,37 @@ public class Trace { return bundles; } + /** Toggles the isolated render for the given records and player + * + * @param player the player the trace is shown to + * @param records the record for which isolation is toggled + */ + public void isolate(Player player, TNTRecord... records){ + IsolateFlag isolationFlag = null; + + ViewFlag[] viewFlags = viewFlagMap.get(player); + if(viewFlags != null) { + isolationFlag = Stream.of(viewFlags) + .filter(IsolateFlag.class::isInstance) + .map(IsolateFlag.class::cast) + .findFirst() + .orElse(null); + } + + if (viewFlags == null || isolationFlag == null) { + viewFlags = new ViewFlag[1]; + } + if (isolationFlag == null) { + isolationFlag = new IsolateFlag(); + } + viewFlags[0] = isolationFlag; + + for(TNTRecord record: records) + isolationFlag.toggleId(record.getTntId()); + + render(player, viewFlags, BundleFilter.STRICT); + } + /** Hides this trail for the given player * * @param player @@ -249,13 +291,6 @@ public class Trace { server.close(); } - /** Returns the flags used by the given player to render the trace or null if not present - * - * @param player - * @return - */ - protected ViewFlag[] getViewFlags(Player player){return viewFlagMap.get(player);} - @Override public String toString() { return "Trace{" + diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceCommand.java b/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceCommand.java index c40f45dc..c294f473 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceCommand.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceCommand.java @@ -92,29 +92,7 @@ public class TraceCommand extends SWCommand { @Register(value = "isolate", description = "TRACE_COMMAND_HELP_SHOW") public void isolate(Player player, Trace trace, @ErrorMessage("test") TNTRecord... records){ - IsolateFlag isolationFlag = null; - - ViewFlag[] viewFlags = trace.getViewFlags(player); - if(viewFlags != null) { - isolationFlag = Stream.of(viewFlags) - .filter(IsolateFlag.class::isInstance) - .map(IsolateFlag.class::cast) - .findFirst() - .orElse(null); - } - - if (viewFlags == null || isolationFlag == null) { - viewFlags = new ViewFlag[1]; - } - if (isolationFlag == null) { - isolationFlag = new IsolateFlag(); - } - viewFlags[0] = isolationFlag; - - for(TNTRecord record: records) - isolationFlag.toggleId(record.getTntId()); - - trace.render(player, viewFlags, BundleFilter.STRICT); + trace.isolate(player, records); } //TODO warning if nothing is shown diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/rendering/TraceEntity.java b/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/rendering/TraceEntity.java index 9f6439b3..ebfb6e43 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/rendering/TraceEntity.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/rendering/TraceEntity.java @@ -26,6 +26,7 @@ import de.steamwar.entity.RFallingBlockEntity; import lombok.Getter; 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.entity.EntityInteractEvent; @@ -44,23 +45,26 @@ public class TraceEntity extends RFallingBlockEntity { super(server, location, isExplosion ? Material.RED_STAINED_GLASS : Material.TNT); setNoGravity(true); this.records = records; - - server.setCallback(((player, rEntity, entityAction) -> { - if (entityAction != REntityServer.EntityAction.INTERACT) return; - - TNTRecord representative = records.get(0); - - BauSystem.MESSAGE.sendPrefixless("TNT_CLICK_HEADER", player); - BauSystem.MESSAGE.sendPrefixless("TNT_CLICK_FUSE_TIME", player, representative.getFuse()); - BauSystem.MESSAGE.sendPrefixless("TNT_CLICK_POSITION_X", player, representative.getLocation().getX() + ""); - BauSystem.MESSAGE.sendPrefixless("TNT_CLICK_POSITION_Y", player, representative.getLocation().getY() + ""); - BauSystem.MESSAGE.sendPrefixless("TNT_CLICK_POSITION_Z", player, representative.getLocation().getZ() + ""); - BauSystem.MESSAGE.sendPrefixless("TNT_CLICK_VELOCITY_X", player, representative.getVelocity().getX() + ""); - BauSystem.MESSAGE.sendPrefixless("TNT_CLICK_VELOCITY_Y", player, representative.getVelocity().getY() + ""); - BauSystem.MESSAGE.sendPrefixless("TNT_CLICK_VELOCITY_Z", player, representative.getVelocity().getZ() + ""); - - })); } + public void printIntoChat(Player player){ + TNTRecord representative = records.get(0); + BauSystem.MESSAGE.sendPrefixless("TNT_CLICK_HEADER", player); + BauSystem.MESSAGE.sendPrefixless("TNT_CLICK_FUSE_TIME", player, representative.getFuse()); + BauSystem.MESSAGE.sendPrefixless("TNT_CLICK_POSITION_X", player, representative.getLocation().getX() + ""); + BauSystem.MESSAGE.sendPrefixless("TNT_CLICK_POSITION_Y", player, representative.getLocation().getY() + ""); + BauSystem.MESSAGE.sendPrefixless("TNT_CLICK_POSITION_Z", player, representative.getLocation().getZ() + ""); + BauSystem.MESSAGE.sendPrefixless("TNT_CLICK_VELOCITY_X", player, representative.getVelocity().getX() + ""); + BauSystem.MESSAGE.sendPrefixless("TNT_CLICK_VELOCITY_Y", player, representative.getVelocity().getY() + ""); + BauSystem.MESSAGE.sendPrefixless("TNT_CLICK_VELOCITY_Z", player, representative.getVelocity().getZ() + ""); + } + + @Override + public boolean equals(Object object) { + if(!(object instanceof TraceEntity)) return false; + TraceEntity entity = (TraceEntity) object; + + return records.get(0).equals(entity.getRecords().get(0)); + } } diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/rendering/ViewFlag.java b/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/rendering/ViewFlag.java index 6f0bd02f..c38c02a7 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/rendering/ViewFlag.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/rendering/ViewFlag.java @@ -103,7 +103,6 @@ public abstract class ViewFlag { public void modify(REntityServer server, List entities) {} }; - //TODO fix? public static ViewFlag MICROMOTION = new ViewFlag(true, false, "micromotion", "m") { @Override public List filter(List records) { @@ -139,7 +138,6 @@ public abstract class ViewFlag { public void modify(REntityServer server, List entities) {} }; - //TODO fix? public static ViewFlag ADVANCED = new ViewFlag(true, false, "advanced", "a") { @Override public List filter(List records) {return records;} From 870578dcf962ba595ef63a7f7b39b686240a8ec8 Mon Sep 17 00:00:00 2001 From: D4rkr34lm Date: Sat, 30 Mar 2024 16:09:06 +0100 Subject: [PATCH 10/12] Added at-Flag --- .../bausystem/features/tracer/Trace.java | 32 ++++++++++ .../tracer/rendering/dynamicFlags/AtFlag.java | 60 +++++++++++++++++++ .../rendering/dynamicFlags/IsolateFlag.java | 3 + 3 files changed, 95 insertions(+) create mode 100644 BauSystem_Main/src/de/steamwar/bausystem/features/tracer/rendering/dynamicFlags/AtFlag.java diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/Trace.java b/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/Trace.java index e679dcd0..baa263d4 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/Trace.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/Trace.java @@ -23,12 +23,14 @@ import de.steamwar.bausystem.features.tpslimit.TPSUtils; import de.steamwar.bausystem.features.tracer.rendering.BundleFilter; import de.steamwar.bausystem.features.tracer.rendering.TraceEntity; import de.steamwar.bausystem.features.tracer.rendering.ViewFlag; +import de.steamwar.bausystem.features.tracer.rendering.dynamicFlags.AtFlag; import de.steamwar.bausystem.features.tracer.rendering.dynamicFlags.IsolateFlag; import de.steamwar.bausystem.region.Region; import de.steamwar.entity.REntityServer; import lombok.Getter; import org.bukkit.entity.Player; +import java.lang.reflect.Array; import java.util.*; import java.util.stream.Stream; @@ -247,6 +249,36 @@ public class Trace { return bundles; } + + /** Modifies the render for the given player, to only show tnts at the given time interval + * + * @param player + * @param from start of time interval + * @param to end of time interval + */ + public void renderAt(Player player, int from, int to){ + ViewFlag[] viewFlags = viewFlagMap.get(player); + if(viewFlags == null) return; + + AtFlag atFlag = null; + atFlag = Stream.of(viewFlags) + .filter(AtFlag.class::isInstance) + .map(AtFlag.class::cast) + .findFirst() + .orElse(null); + + if(atFlag != null){ + atFlag.update(from, to); + } + else { + atFlag = new AtFlag(from, to); + viewFlags = Arrays.copyOf(viewFlags, viewFlags.length + 1); + viewFlags[viewFlags.length - 1] = atFlag; + } + + render(player, viewFlags, BundleFilter.STRICT); + } + /** Toggles the isolated render for the given records and player * * @param player the player the trace is shown to diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/rendering/dynamicFlags/AtFlag.java b/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/rendering/dynamicFlags/AtFlag.java new file mode 100644 index 00000000..cb06685a --- /dev/null +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/rendering/dynamicFlags/AtFlag.java @@ -0,0 +1,60 @@ +/* + * This file is a part of the SteamWar software. + * + * Copyright (C) 2024 SteamWar.de-Serverteam + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package de.steamwar.bausystem.features.tracer.rendering.dynamicFlags; + +import de.steamwar.bausystem.features.tracer.TNTRecord; +import de.steamwar.bausystem.features.tracer.rendering.TraceEntity; +import de.steamwar.bausystem.features.tracer.rendering.ViewFlag; +import de.steamwar.entity.REntityServer; + +import java.util.List; +import java.util.stream.Collectors; + +public class AtFlag extends ViewFlag { + private int start; + private int end; + + + public AtFlag(int start, int end){ + super(false, false, ViewFlag.IGNITE, null); + this.start = start; + this.end = end; + } + + /** Update this flag to represent another time interval + * + * @param start new interval start + * @param end new interval end + */ + public void update(int start, int end){ + this.start = start; + this.end = end; + } + + @Override + public List filter(List records) { + return records.stream() + .filter(record -> record.getTicksSinceStart() <= start && record.getTicksSinceStart() >= end) + .collect(Collectors.toList()); + } + + @Override + public void modify(REntityServer server, List entities) {} +} diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/rendering/dynamicFlags/IsolateFlag.java b/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/rendering/dynamicFlags/IsolateFlag.java index 85d1f1bb..7832636f 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/rendering/dynamicFlags/IsolateFlag.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/rendering/dynamicFlags/IsolateFlag.java @@ -32,6 +32,9 @@ import java.util.stream.Collectors; public class IsolateFlag extends ViewFlag { + /** + * Tnt ids that will be isolated + */ private final Set tntToIsolate = new HashSet<>(); public IsolateFlag(){ From 488866cee6b0031982d869ace1a30c11a24710d0 Mon Sep 17 00:00:00 2001 From: D4rkr34lm Date: Tue, 2 Apr 2024 23:52:18 +0200 Subject: [PATCH 11/12] Added comand for trace at --- .../bausystem/features/tracer/TraceCommand.java | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceCommand.java b/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceCommand.java index c294f473..dbc6d35b 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceCommand.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceCommand.java @@ -91,10 +91,18 @@ public class TraceCommand extends SWCommand { } @Register(value = "isolate", description = "TRACE_COMMAND_HELP_SHOW") - public void isolate(Player player, Trace trace, @ErrorMessage("test") TNTRecord... records){ + public void isolate(Player player, Trace trace, @ErrorMessage("TRACE_RECORD_ID_INVALID") TNTRecord... records){ trace.isolate(player, records); } - //TODO warning if nothing is shown + + @Register(value="at", description = "TRACE_COMMAND_HELP_SHOW") + public void at(Player player, int start, int end){ + for(Trace trace: manager.getAll()){ + trace.renderAt(player, start, end); + } + } + + @ClassMapper(value = Trace.class, local = true) public TypeMapper traceClassMapper(){ From 1fc9a43604dbe0488360e4d32fbf4b043a06c238 Mon Sep 17 00:00:00 2001 From: D4rkr34lm Date: Wed, 3 Apr 2024 00:14:37 +0200 Subject: [PATCH 12/12] Added trace follow --- .../bausystem/features/tracer/Trace.java | 27 +++++++++++++++++++ .../features/tracer/TraceCommand.java | 16 +++++++++++ .../features/tracer/TraceManager.java | 2 +- 3 files changed, 44 insertions(+), 1 deletion(-) diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/Trace.java b/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/Trace.java index baa263d4..1572c1ad 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/Trace.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/Trace.java @@ -310,6 +310,33 @@ public class Trace { render(player, viewFlags, BundleFilter.STRICT); } + /**Makes the first passed player follow the trace render of the second passed player + * + * @param player + * @param toFollow + */ + public void follow(Player player, Player toFollow){ + for(REntityServer server :serverMap.values()){ + server.removePlayer(player); + } + + serverMap.get(toFollow).addPlayer(player); + } + + /** Makes the passed player stop following any other players trace render + * + * @param player + */ + public void unfollow(Player player){ + for(REntityServer server :serverMap.values()){ + server.removePlayer(player); + } + + if(serverMap.get(player) != null){ + serverMap.get(player).addPlayer(player); + } + } + /** Hides this trail for the given player * * @param player diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceCommand.java b/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceCommand.java index dbc6d35b..640b898b 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceCommand.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceCommand.java @@ -101,8 +101,24 @@ public class TraceCommand extends SWCommand { trace.renderAt(player, start, end); } } + @Register(value="share", description = "TRACE_COMMAND_HELP_SHOW") + public void share(Player player){ + //TODO Rücksprache + } + @Register(value="follow", description = "TRACE_COMMAND_HELP_SHOW") + public void follow(Player player, Player toFollow){ + for(Trace trace: manager.getAll()){ + trace.follow(player, toFollow); + } + } + @Register(value="unfollow", description = "TRACE_COMMAND_HELP_SHOW") + public void unfollow(Player player){ + for(Trace trace: manager.getAll()){ + trace.unfollow(player); + } + } @ClassMapper(value = Trace.class, local = true) public TypeMapper traceClassMapper(){ diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceManager.java b/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceManager.java index c000c0b1..1ef128f5 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceManager.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceManager.java @@ -149,5 +149,5 @@ public class TraceManager implements Listener { viewFlagMap.remove(player); bundleFilterMap.remove(player); - }; + } }