From 704fc53e9e9550ec2dc082cd97869591f04ff7ca Mon Sep 17 00:00:00 2001 From: YoyoNow Date: Wed, 7 Aug 2024 09:22:30 +0200 Subject: [PATCH 01/21] Possible fix for Tablist --- .../src/de/steamwar/velocitycore/tablist/Tablist.java | 2 ++ .../steamwar/velocitycore/tablist/TablistManager.java | 10 +++++++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/VelocityCore/src/de/steamwar/velocitycore/tablist/Tablist.java b/VelocityCore/src/de/steamwar/velocitycore/tablist/Tablist.java index f8dc1783..92484166 100644 --- a/VelocityCore/src/de/steamwar/velocitycore/tablist/Tablist.java +++ b/VelocityCore/src/de/steamwar/velocitycore/tablist/Tablist.java @@ -139,7 +139,9 @@ public class Tablist extends ChannelInboundHandlerAdapter { synchronized (directTabItems) { directTabItems.clear(); } + } + public void onServerPostSwitch() { if(player.getProtocolVersion().greaterThan(ProtocolVersion.MINECRAFT_1_20)) { current.clear(); sendPacket(player, createTeamPacket); diff --git a/VelocityCore/src/de/steamwar/velocitycore/tablist/TablistManager.java b/VelocityCore/src/de/steamwar/velocitycore/tablist/TablistManager.java index 2b8b47bd..6429fded 100644 --- a/VelocityCore/src/de/steamwar/velocitycore/tablist/TablistManager.java +++ b/VelocityCore/src/de/steamwar/velocitycore/tablist/TablistManager.java @@ -22,6 +22,7 @@ package de.steamwar.velocitycore.tablist; import com.velocitypowered.api.event.Subscribe; import com.velocitypowered.api.event.connection.DisconnectEvent; import com.velocitypowered.api.event.connection.PostLoginEvent; +import com.velocitypowered.api.event.player.ServerConnectedEvent; import com.velocitypowered.api.event.player.ServerPostConnectEvent; import com.velocitypowered.api.proxy.Player; import com.velocitypowered.api.proxy.server.RegisteredServer; @@ -67,12 +68,19 @@ public class TablistManager extends BasicListener { } @Subscribe - public void onServerConnection(ServerPostConnectEvent event) { + public void onServerConnection(ServerConnectedEvent event) { synchronized (tablists) { tablists.get(event.getPlayer()).onServerSwitch(); } } + @Subscribe + public void onServerPostConnection(ServerPostConnectEvent event) { + synchronized (tablists) { + tablists.get(event.getPlayer()).onServerPostSwitch(); + } + } + @Subscribe public void onLeave(DisconnectEvent event) { synchronized (tablists) { From 4efd30bdfb5667d2f3aabdf67c6302c993dcbb67 Mon Sep 17 00:00:00 2001 From: YoyoNow Date: Wed, 7 Aug 2024 09:33:31 +0200 Subject: [PATCH 02/21] Fix possible NPE! --- .../velocitycore/tablist/TablistManager.java | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/VelocityCore/src/de/steamwar/velocitycore/tablist/TablistManager.java b/VelocityCore/src/de/steamwar/velocitycore/tablist/TablistManager.java index 6429fded..69739dc2 100644 --- a/VelocityCore/src/de/steamwar/velocitycore/tablist/TablistManager.java +++ b/VelocityCore/src/de/steamwar/velocitycore/tablist/TablistManager.java @@ -61,16 +61,17 @@ public class TablistManager extends BasicListener { @Subscribe public void onJoin(PostLoginEvent event) { - synchronized (tablists) { - tablists.put(event.getPlayer(), new Tablist(event.getPlayer())); - } Tablist.sendPacket(event.getPlayer(), Tablist.createTeamPacket); } @Subscribe public void onServerConnection(ServerConnectedEvent event) { synchronized (tablists) { - tablists.get(event.getPlayer()).onServerSwitch(); + if (tablists.containsKey(event.getPlayer())) { + tablists.get(event.getPlayer()).onServerSwitch(); + } else { + tablists.put(event.getPlayer(), new Tablist(event.getPlayer())); + } } } @@ -98,14 +99,14 @@ public class TablistManager extends BasicListener { private void updateTablist() { List subservers = new ArrayList<>(); - for (RegisteredServer server : new ArrayList<>(VelocityCore.getProxy().getAllServers())){ - if(server.getPlayersConnected().isEmpty()) + for (RegisteredServer server : new ArrayList<>(VelocityCore.getProxy().getAllServers())) { + if (server.getPlayersConnected().isEmpty()) continue; Subserver subserver = Subserver.getSubserver(server.getServerInfo()); - if(fightInfos.containsKey(server)) + if (fightInfos.containsKey(server)) subservers.add(new TablistServer(server, fightInfos.get(server))); - else if(subserver == null || subserver.getType() != Servertype.BAUSERVER) + else if (subserver == null || subserver.getType() != Servertype.BAUSERVER) subservers.add(new TablistServer(server)); } subservers.add(new TablistBuild()); From f4fef76562ea1983d91e4496e199b711953ce0c3 Mon Sep 17 00:00:00 2001 From: D4rkr34lm Date: Tue, 6 Aug 2024 17:26:15 +0200 Subject: [PATCH 03/21] Added VS Code configuration to gitignore --- .gitignore | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.gitignore b/.gitignore index 36e1257e..e038e02a 100644 --- a/.gitignore +++ b/.gitignore @@ -11,5 +11,9 @@ steamwar.properties .idea *.iml +# VSCode +bin/ +.vscode + # Other lib \ No newline at end of file From 6c7b0f7bb5d7c2691f39a9f365ac6b7c3ff0e44b Mon Sep 17 00:00:00 2001 From: D4rkr34lm Date: Tue, 6 Aug 2024 17:48:15 +0200 Subject: [PATCH 04/21] Added workspace config for VsCode workspace --- steamwar.code-workspace | 42 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 steamwar.code-workspace diff --git a/steamwar.code-workspace b/steamwar.code-workspace new file mode 100644 index 00000000..8277f7a5 --- /dev/null +++ b/steamwar.code-workspace @@ -0,0 +1,42 @@ +{ + "extensions": { + "recommendations": [ + "vscjava.vscode-java-pack", + "sonarsource.sonarlint-vscode" + ] + }, + "folders": [ + {"name": "BauSystem", "path": "./BauSystem"}, + {"name": "FightSystem", "path": "./FightSystem"}, + {"name": "TowerRun", "path": "./TowerRun"}, + {"name": "TutorialSystem", "path": "./TutorialSystem"}, + {"name": "LobbySystem", "path": "./LobbySystem"}, + {"name": "MissileWars", "path": "./MissileWars"}, + + {"name": "Teamserver", "path": "./Teamserver"}, + + {"name": "Realtime", "path": "./Realtime"}, + {"name": "CommandFramework", "path": "./CommandFramework"}, + {"name": "KotlinCore", "path": "./KotlinCore"}, + {"name": "CommonCore", "path": "./CommonCore"}, + + {"name": "SpigotCore", "path": "./SpigotCore"}, + {"name": "VelocityCore", "path": "./VelocityCore"}, + {"name": "SchematicSystem", "path": "./SchematicSystem"}, + {"name": "root", "path": "."} + ] + , + "settings": { + "workbench.colorCustomizations": { + "activityBar.background": "#ffff44", + "activityBar.foreground": "#555555", + "titleBar.activeBackground": "#333330", + "titleBar.activeForeground": "#dadada" + }, + "editor.wordWrap": "off", + "editor.formatOnSave": true, + "cSpell.words": [ + "Teamserver" + ] + } +} \ No newline at end of file From 3b378977b7f4cb4188591e57d2dfa0e8a1dd3387 Mon Sep 17 00:00:00 2001 From: D4rkr34lm Date: Tue, 6 Aug 2024 18:43:46 +0200 Subject: [PATCH 05/21] removed vscode config from repo --- steamwar.code-workspace | 42 ----------------------------------------- 1 file changed, 42 deletions(-) delete mode 100644 steamwar.code-workspace diff --git a/steamwar.code-workspace b/steamwar.code-workspace deleted file mode 100644 index 8277f7a5..00000000 --- a/steamwar.code-workspace +++ /dev/null @@ -1,42 +0,0 @@ -{ - "extensions": { - "recommendations": [ - "vscjava.vscode-java-pack", - "sonarsource.sonarlint-vscode" - ] - }, - "folders": [ - {"name": "BauSystem", "path": "./BauSystem"}, - {"name": "FightSystem", "path": "./FightSystem"}, - {"name": "TowerRun", "path": "./TowerRun"}, - {"name": "TutorialSystem", "path": "./TutorialSystem"}, - {"name": "LobbySystem", "path": "./LobbySystem"}, - {"name": "MissileWars", "path": "./MissileWars"}, - - {"name": "Teamserver", "path": "./Teamserver"}, - - {"name": "Realtime", "path": "./Realtime"}, - {"name": "CommandFramework", "path": "./CommandFramework"}, - {"name": "KotlinCore", "path": "./KotlinCore"}, - {"name": "CommonCore", "path": "./CommonCore"}, - - {"name": "SpigotCore", "path": "./SpigotCore"}, - {"name": "VelocityCore", "path": "./VelocityCore"}, - {"name": "SchematicSystem", "path": "./SchematicSystem"}, - {"name": "root", "path": "."} - ] - , - "settings": { - "workbench.colorCustomizations": { - "activityBar.background": "#ffff44", - "activityBar.foreground": "#555555", - "titleBar.activeBackground": "#333330", - "titleBar.activeForeground": "#dadada" - }, - "editor.wordWrap": "off", - "editor.formatOnSave": true, - "cSpell.words": [ - "Teamserver" - ] - } -} \ No newline at end of file From a9393f878ffe7f4ff44e9b237311322109f422a4 Mon Sep 17 00:00:00 2001 From: D4rkr34lm Date: Thu, 8 Aug 2024 15:01:57 +0200 Subject: [PATCH 06/21] Extracted Trace Deserialisation/Serialisation process into Repo --- .../features/tracer/TraceRepository.java | 96 +++++++++++++++++++ 1 file changed, 96 insertions(+) create mode 100644 BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceRepository.java diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceRepository.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceRepository.java new file mode 100644 index 00000000..de33bfef --- /dev/null +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceRepository.java @@ -0,0 +1,96 @@ +package de.steamwar.bausystem.features.tracer; + +import de.steamwar.bausystem.region.Region; +import lombok.Cleanup; +import lombok.SneakyThrows; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.util.Vector; + +import java.io.EOFException; +import java.io.File; +import java.io.FileInputStream; +import java.io.ObjectInputStream; +import java.util.*; +import java.util.zip.GZIPInputStream; + +public class TraceRepository { + + /** + * Increment this when changing serialisation format + */ + public static final int SERIALISATION_VERSION = 1; + + @SneakyThrows + protected static int getVersion(File metadataFile) { + @Cleanup + ObjectInputStream reader = new ObjectInputStream(new FileInputStream(metadataFile)); + reader.readUTF(); + reader.readUTF(); + reader.readObject(); + try { + int version = reader.readInt(); + return version; + } catch (EOFException e) { + return 0; + } + } + + @SneakyThrows + protected static Trace readTrace(File metadataFile) { + @Cleanup + ObjectInputStream reader = new ObjectInputStream(new FileInputStream(metadataFile)); + UUID uuid = UUID.fromString(reader.readUTF()); + Region region = Region.getREGION_MAP().get(reader.readUTF()); + Date date = (Date) reader.readObject(); + File recordsFile = new File(uuid + ".records"); + int recordsCount = reader.readInt(); + + return new Trace(uuid, region, date, metadataFile, recordsFile, recordsCount); + } + + @SneakyThrows + protected static TNTPoint readTraceRecord(ObjectInputStream objectInput) { + + int tntId = objectInput.readInt(); + boolean explosion = objectInput.readBoolean(); + boolean inWater = objectInput.readBoolean(); + boolean afterFirstExplosion = objectInput.readBoolean(); + boolean destroyedBuildArea = objectInput.readBoolean(); + boolean destroyedTestBlock = objectInput.readBoolean(); + long ticksSinceStart = objectInput.readLong(); + int fuse = objectInput.readInt(); + double locX = objectInput.readDouble(); + double locY = objectInput.readDouble(); + double locZ = objectInput.readDouble(); + Location location = new Location(Bukkit.getWorlds().get(0), locX, locY, locZ); + double velX = objectInput.readDouble(); + double velY = objectInput.readDouble(); + double velZ = objectInput.readDouble(); + Vector velocity = new Vector(velX, velY, velZ); + + return new TNTPoint(tntId, explosion, inWater, afterFirstExplosion, destroyedBuildArea, destroyedTestBlock, ticksSinceStart, fuse, location, velocity); + } + + @SneakyThrows + protected static List readTraceRecords(Trace trace) { + File recordsFile = trace.getRecordsSaveFile(); + @Cleanup + ObjectInputStream inputStream = new ObjectInputStream(new GZIPInputStream(new FileInputStream(recordsFile))); + + List records = new ArrayList<>(); + for (int i = 0; i < trace.getRecordsCount(); i++) { + records.add(readTraceRecord(inputStream)); + } + + Map> histories = new HashMap<>(); + for (TNTPoint record : records) { + int tntId = record.getTntId(); + List history = histories.computeIfAbsent(tntId, id -> new ArrayList<>()); + history.add(record); + record.setHistory(history); + } + + return records; + } +} From be848ac67a638f596ca383758123fba48b09036d Mon Sep 17 00:00:00 2001 From: D4rkr34lm Date: Thu, 8 Aug 2024 15:33:01 +0200 Subject: [PATCH 07/21] Improved trace serialisation through versioning --- .../bausystem/features/tracer/TNTPoint.java | 20 +++- .../bausystem/features/tracer/Trace.java | 94 +++++-------------- .../features/tracer/TraceManager.java | 2 +- .../tracer/TraceRecordingWrapper.java | 25 +---- .../features/tracer/TraceRepository.java | 46 ++++++++- 5 files changed, 86 insertions(+), 101 deletions(-) diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TNTPoint.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TNTPoint.java index ed0f1306..432241c2 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TNTPoint.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TNTPoint.java @@ -99,7 +99,25 @@ public class TNTPoint implements Externalizable { /** * Constructor for deserialization only !! Do not Call !! */ - public TNTPoint() { + protected TNTPoint(int tntId, boolean explosion, + boolean inWater, + boolean afterFirstExplosion, + boolean destroyedBuildArea, + boolean destroyedTestBlock, + long ticksSinceStart, + int fuse, + Location location, + Vector velocity) { + this.tntId = tntId; + this.explosion = explosion; + this.inWater = inWater; + this.afterFirstExplosion = afterFirstExplosion; + this.destroyedBuildArea = destroyedBuildArea; + this.destroyedTestBlock = destroyedTestBlock; + this.ticksSinceStart = ticksSinceStart; + this.fuse = fuse; + this.location = location; + this.velocity = velocity; } public TNTPoint(int tntId, TNTPrimed tnt, boolean explosion, boolean afterFirstExplosion, long ticksSinceStart, diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/Trace.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/Trace.java index e3305def..a637a181 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/Trace.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/Trace.java @@ -26,20 +26,15 @@ import de.steamwar.bausystem.features.tracer.rendering.ViewFlag; import de.steamwar.bausystem.region.Region; import de.steamwar.entity.REntity; import de.steamwar.entity.REntityServer; -import lombok.Cleanup; import lombok.Getter; import lombok.SneakyThrows; -import org.bukkit.Bukkit; import org.bukkit.entity.Player; -import java.io.*; +import java.io.File; import java.lang.ref.SoftReference; import java.util.*; -import java.util.logging.Level; -import java.util.logging.Logger; import java.util.stream.Collectors; import java.util.stream.Stream; -import java.util.zip.GZIPInputStream; public class Trace { /** @@ -77,6 +72,9 @@ public class Trace { */ private SoftReference> records; + @Getter + private final int recordsCount; + /** * A map of all REntityServers rendering this trace */ @@ -91,46 +89,26 @@ public class Trace { @SneakyThrows public Trace(Region region, List recordList) { this.uuid = UUID.randomUUID(); - recordsSaveFile = new File(TraceManager.tracesFolder, uuid + ".records"); this.region = region; this.date = new Date(); + recordsCount = recordList.size(); records = new SoftReference<>(recordList); + recordsSaveFile = new File(TraceManager.tracesFolder, uuid + ".records"); metadataSaveFile = new File(TraceManager.tracesFolder, uuid + ".meta"); - - @Cleanup - ObjectOutputStream outputStream = new ObjectOutputStream(new FileOutputStream(metadataSaveFile)); - outputStream.writeUTF(uuid.toString()); - outputStream.writeUTF(region.getName()); - outputStream.writeObject(date); } /** - * Constructor for serialising a trace from the file system - * - * @param metadataSaveFile the file for this traces metadata + * Constructor for deserialising a trace from the file system */ @SneakyThrows - public Trace(File metadataSaveFile) { - String uuid = null; - Region region = null; - Date date = null; - - this.metadataSaveFile = metadataSaveFile; - - try { - @Cleanup - ObjectInputStream inputStream = new ObjectInputStream(new FileInputStream(metadataSaveFile)); - uuid = inputStream.readUTF(); - region = Region.getREGION_MAP().get(inputStream.readUTF()); - date = (Date) inputStream.readObject(); - inputStream.close(); - } finally { - this.uuid = UUID.fromString(uuid); - this.region = region; - this.date = date; - recordsSaveFile = new File(TraceManager.tracesFolder, uuid + ".records"); - this.records = new SoftReference<>(null); - } + protected Trace(UUID uuid, Region region, Date date, File metadataFile, File recordsFile, int recordsCount) { + this.metadataSaveFile = metadataFile; + recordsSaveFile = recordsFile; + this.uuid = uuid; + this.region = region; + this.date = date; + this.records = new SoftReference<>(null); + this.recordsCount = recordsCount; } /** @@ -173,7 +151,8 @@ public class Trace { entityServer = new REntityServer(); entityServer.addPlayer(player); entityServer.setCallback((p, rEntity, entityAction) -> { - if (entityAction != REntityServer.EntityAction.INTERACT) return; + if (entityAction != REntityServer.EntityAction.INTERACT) + return; if (rEntity instanceof TraceEntity) { ((TraceEntity) rEntity).printIntoChat(p); } @@ -195,7 +174,8 @@ public class Trace { REntityServer newEntityServer = new REntityServer(); newEntityServer.addPlayer(k); newEntityServer.setCallback((p, rEntity, entityAction) -> { - if (entityAction != REntityServer.EntityAction.INTERACT) return; + if (entityAction != REntityServer.EntityAction.INTERACT) + return; if (rEntity instanceof TraceEntity) { ((TraceEntity) rEntity).printIntoChat(p); } @@ -234,7 +214,8 @@ public class Trace { List entities = new LinkedList<>(); for (List bundle : bundles) { - entities.add(new TraceEntity(entityServer, bundle.get(0).getLocation(), bundle.get(0).isExplosion(), bundle, this)); + entities.add(new TraceEntity(entityServer, bundle.get(0).getLocation(), bundle.get(0).isExplosion(), bundle, + this)); } // Apply modifiers @@ -312,38 +293,7 @@ public class Trace { * Loads the records of this trace from storage to memory */ private void loadRecords() { - List records = new ArrayList<>(); - long readBytes = 0; - try { - FileInputStream fileInputStream = new FileInputStream(recordsSaveFile); - - @Cleanup - ObjectInputStream inputStream = new ObjectInputStream(new GZIPInputStream(fileInputStream)); - long fileLenght = recordsSaveFile.length(); - while (fileInputStream.getChannel().position() < fileLenght) { - records.add((TNTPoint) inputStream.readObject()); - readBytes = fileInputStream.getChannel().position(); - } - } catch (EOFException e) { - Logger logger = Bukkit.getLogger(); - logger.log(Level.WARNING, "EOF in trace read detected in " + uuid); - logger.log(Level.WARNING, "Read " + readBytes + "/" + recordsSaveFile.length() + " Bytes"); - logger.log(Level.WARNING, "Read so far: " + records); - - e.printStackTrace(); - } catch (IOException | ClassNotFoundException e) { - e.printStackTrace(); - } - - Map> histories = new HashMap<>(); - for (TNTPoint record : records) { - int tntId = record.getTntId(); - List history = histories.computeIfAbsent(tntId, id -> new ArrayList<>()); - history.add(record); - record.setHistory(history); - } - - this.records = new SoftReference<>(records); + records = new SoftReference<>(TraceRepository.readTraceRecords(this)); } public synchronized List getRecords() { diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceManager.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceManager.java index 8ab7437c..6596d46d 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceManager.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceManager.java @@ -58,7 +58,7 @@ public class TraceManager implements Listener { if (traceFile.getName().contains(".records")) continue; - add(new Trace(traceFile)); + add(TraceRepository.readTrace(traceFile)); } } diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceRecordingWrapper.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceRecordingWrapper.java index 7f23bb32..c7d2a043 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceRecordingWrapper.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceRecordingWrapper.java @@ -24,28 +24,21 @@ import de.steamwar.bausystem.region.Region; import lombok.Getter; import lombok.SneakyThrows; -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.ObjectOutputStream; import java.util.ArrayList; import java.util.List; -import java.util.zip.GZIPOutputStream; public class TraceRecordingWrapper { + private final Trace trace; + @Getter private final long startTick; private final List recordsToAdd; private final List recordList; - private final ObjectOutputStream recordsOutputStream; private int nextOpenRecordId = 0; @Getter private boolean explosionRecorded = false; - @Getter - private final Trace trace; - @SneakyThrows public TraceRecordingWrapper(Region region) { startTick = TPSUtils.currentRealTick.get(); @@ -53,8 +46,6 @@ public class TraceRecordingWrapper { recordList = new ArrayList<>(); trace = new Trace(region, recordList); - File recordsSaveFile = new File(TraceManager.tracesFolder, trace.getUuid() + ".records"); - recordsOutputStream = new ObjectOutputStream(new GZIPOutputStream(new FileOutputStream(recordsSaveFile))); } public int getNextOpenRecordIdAndIncrement() { @@ -72,23 +63,13 @@ public class TraceRecordingWrapper { public void commitRecorded() { TraceManager.instance.showPartial(trace, recordsToAdd); - recordsToAdd.forEach(record -> { - try { - recordsOutputStream.writeObject(record); - recordsOutputStream.flush(); - } catch (IOException e) { - e.printStackTrace(); - } - }); - recordList.addAll(recordsToAdd); recordsToAdd.clear(); } @SneakyThrows protected void finalizeRecording() { - recordsOutputStream.flush(); - recordsOutputStream.close(); + TraceRepository.writeTrace(trace, recordList); TraceManager.instance.add(trace); } } diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceRepository.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceRepository.java index de33bfef..424472d3 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceRepository.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceRepository.java @@ -7,10 +7,7 @@ import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.util.Vector; -import java.io.EOFException; -import java.io.File; -import java.io.FileInputStream; -import java.io.ObjectInputStream; +import java.io.*; import java.util.*; import java.util.zip.GZIPInputStream; @@ -37,7 +34,7 @@ public class TraceRepository { } @SneakyThrows - protected static Trace readTrace(File metadataFile) { + public static Trace readTrace(File metadataFile) { @Cleanup ObjectInputStream reader = new ObjectInputStream(new FileInputStream(metadataFile)); UUID uuid = UUID.fromString(reader.readUTF()); @@ -49,6 +46,43 @@ public class TraceRepository { return new Trace(uuid, region, date, metadataFile, recordsFile, recordsCount); } + @SneakyThrows + protected static void writeTrace(Trace trace, List records) { + @Cleanup + ObjectOutputStream outputStream = new ObjectOutputStream(new FileOutputStream(trace.getMetadataSaveFile())); + outputStream.writeUTF(trace.getUuid().toString()); + outputStream.writeUTF(trace.getRegion().getName()); + outputStream.writeObject(trace.getDate()); + outputStream.writeInt(SERIALISATION_VERSION); + outputStream.writeInt(records.size()); + + + writeTraceRecords(trace.getRecordsSaveFile(), records); + } + + @SneakyThrows + protected static void writeTraceRecords(File recordsFile, List records) { + ObjectOutputStream outputStream = new ObjectOutputStream(new FileOutputStream(recordsFile)); + for (TNTPoint record : records) { + outputStream.writeInt(record.getTntId()); + outputStream.writeBoolean(record.isExplosion()); + outputStream.writeBoolean(record.isInWater()); + outputStream.writeBoolean(record.isAfterFirstExplosion()); + outputStream.writeBoolean(record.isDestroyedBuildArea()); + outputStream.writeBoolean(record.isDestroyedTestBlock()); + outputStream.writeLong(record.getTicksSinceStart()); + outputStream.writeInt(record.getFuse()); + Location location = record.getLocation(); + outputStream.writeDouble(location.getX()); + outputStream.writeDouble(location.getY()); + outputStream.writeDouble(location.getZ()); + Vector velocity = record.getVelocity(); + outputStream.writeDouble(velocity.getX()); + outputStream.writeDouble(velocity.getY()); + outputStream.writeDouble(velocity.getZ()); + } + } + @SneakyThrows protected static TNTPoint readTraceRecord(ObjectInputStream objectInput) { @@ -60,10 +94,12 @@ public class TraceRepository { boolean destroyedTestBlock = objectInput.readBoolean(); long ticksSinceStart = objectInput.readLong(); int fuse = objectInput.readInt(); + double locX = objectInput.readDouble(); double locY = objectInput.readDouble(); double locZ = objectInput.readDouble(); Location location = new Location(Bukkit.getWorlds().get(0), locX, locY, locZ); + double velX = objectInput.readDouble(); double velY = objectInput.readDouble(); double velZ = objectInput.readDouble(); From ead144d974458a073f6144dfd74530ac669264e7 Mon Sep 17 00:00:00 2001 From: D4rkr34lm Date: Thu, 8 Aug 2024 15:34:36 +0200 Subject: [PATCH 08/21] Removed compression from TraceRecord serialisation --- .../steamwar/bausystem/features/tracer/TraceRepository.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceRepository.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceRepository.java index 424472d3..1cc27188 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceRepository.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceRepository.java @@ -9,7 +9,6 @@ import org.bukkit.util.Vector; import java.io.*; import java.util.*; -import java.util.zip.GZIPInputStream; public class TraceRepository { @@ -99,7 +98,7 @@ public class TraceRepository { double locY = objectInput.readDouble(); double locZ = objectInput.readDouble(); Location location = new Location(Bukkit.getWorlds().get(0), locX, locY, locZ); - + double velX = objectInput.readDouble(); double velY = objectInput.readDouble(); double velZ = objectInput.readDouble(); @@ -112,7 +111,7 @@ public class TraceRepository { protected static List readTraceRecords(Trace trace) { File recordsFile = trace.getRecordsSaveFile(); @Cleanup - ObjectInputStream inputStream = new ObjectInputStream(new GZIPInputStream(new FileInputStream(recordsFile))); + ObjectInputStream inputStream = new ObjectInputStream(new FileInputStream(recordsFile)); List records = new ArrayList<>(); for (int i = 0; i < trace.getRecordsCount(); i++) { From 0d2e028facb3a645f6470c3911c0d284bdb0af0c Mon Sep 17 00:00:00 2001 From: D4rkr34lm Date: Thu, 8 Aug 2024 15:38:58 +0200 Subject: [PATCH 09/21] Moved init functionality in onEnable --- .../steamwar/bausystem/features/tracer/TraceManager.java | 4 +++- .../bausystem/features/tracer/TraceRecorder.java | 9 +++++---- .../bausystem/features/tracer/TraceRecordingWrapper.java | 1 + 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceManager.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceManager.java index 6596d46d..3972a034 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceManager.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceManager.java @@ -30,6 +30,7 @@ import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerQuitEvent; +import org.bukkit.event.server.PluginEnableEvent; import java.io.File; import java.util.*; @@ -46,7 +47,8 @@ public class TraceManager implements Listener { public static File tracesFolder = new File(Bukkit.getWorlds().get(0).getWorldFolder(), "traces"); - public TraceManager() { + @EventHandler + public void init(PluginEnableEvent event) { if (!tracesFolder.exists()) tracesFolder.mkdir(); diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceRecorder.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceRecorder.java index fd0274fc..89b10c7f 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceRecorder.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceRecorder.java @@ -31,6 +31,7 @@ import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.bukkit.event.entity.EntityExplodeEvent; import org.bukkit.event.entity.EntitySpawnEvent; +import org.bukkit.event.server.PluginEnableEvent; import java.util.*; import java.util.logging.Level; @@ -70,7 +71,8 @@ public class TraceRecorder implements Listener { */ private final Set autoTraceRegions = new HashSet<>(); - public TraceRecorder() { + @EventHandler + public void init(PluginEnableEvent event) { BauSystem.runTaskTimer(BauSystem.getInstance(), () -> { record(); checkForAutoTraceFinish(); @@ -170,14 +172,13 @@ public class TraceRecorder implements Listener { if (history.size() == 0) { try { historyMap.put(tntPrimed, history); - } - catch (NullPointerException e) { + } catch (NullPointerException e) { Logger logger = Bukkit.getLogger(); //TODO remove when no longer neccecary logger.log(Level.WARNING, "Nullpointer thrown by historyMap"); logger.log(Level.WARNING, "TNT History: " + history); logger.log(Level.WARNING, "History Map: " + historyMap); - throw e; + throw e; } tntID = wrappedTrace.getNextOpenRecordIdAndIncrement(); } else { diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceRecordingWrapper.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceRecordingWrapper.java index c7d2a043..bf104e1f 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceRecordingWrapper.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceRecordingWrapper.java @@ -29,6 +29,7 @@ import java.util.List; public class TraceRecordingWrapper { + @Getter private final Trace trace; @Getter From 963f798e7cdbd0550c0871ba296d5c088472a4a3 Mon Sep 17 00:00:00 2001 From: D4rkr34lm Date: Thu, 8 Aug 2024 15:59:05 +0200 Subject: [PATCH 10/21] Added removal of outdated save files and usage of safe file versioning --- .../bausystem/features/tracer/TraceManager.java | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceManager.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceManager.java index 3972a034..e801708d 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceManager.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceManager.java @@ -60,7 +60,15 @@ public class TraceManager implements Listener { if (traceFile.getName().contains(".records")) continue; - add(TraceRepository.readTrace(traceFile)); + if (TraceRepository.getVersion(traceFile) == TraceRepository.SERIALISATION_VERSION) { + add(TraceRepository.readTrace(traceFile)); + } else { + String uuid = traceFile.getName().replace(".records", ""); + + new File(tracesFolder, uuid + ".records").delete(); + new File(tracesFolder, uuid + ".meta").delete(); + } + } } From 642e9ffd50cc59d4f6a23ab7ad21b7c183f8627d Mon Sep 17 00:00:00 2001 From: D4rkr34lm Date: Fri, 16 Aug 2024 17:18:02 +0200 Subject: [PATCH 11/21] Fixed deletion of old traces --- .../bausystem/features/tracer/Trace.java | 4 ++-- .../features/tracer/TraceManager.java | 19 ++++++++++++------- .../features/tracer/TraceRecorder.java | 1 + .../features/tracer/TraceRepository.java | 3 ++- 4 files changed, 17 insertions(+), 10 deletions(-) diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/Trace.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/Trace.java index a637a181..29bf38cf 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/Trace.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/Trace.java @@ -93,8 +93,8 @@ public class Trace { this.date = new Date(); recordsCount = recordList.size(); records = new SoftReference<>(recordList); - recordsSaveFile = new File(TraceManager.tracesFolder, uuid + ".records"); - metadataSaveFile = new File(TraceManager.tracesFolder, uuid + ".meta"); + recordsSaveFile = new File(TraceRepository.tracesFolder, uuid + ".records"); + metadataSaveFile = new File(TraceRepository.tracesFolder, uuid + ".meta"); } /** diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceManager.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceManager.java index e801708d..ffd46848 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceManager.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceManager.java @@ -36,6 +36,8 @@ import java.io.File; import java.util.*; import java.util.stream.Collectors; +import static de.steamwar.bausystem.features.tracer.TraceRepository.tracesFolder; + @Linked public class TraceManager implements Listener { @@ -45,10 +47,11 @@ public class TraceManager implements Listener { instance = this; } - public static File tracesFolder = new File(Bukkit.getWorlds().get(0).getWorldFolder(), "traces"); + @EventHandler public void init(PluginEnableEvent event) { + if(!event.getPlugin().getName().equalsIgnoreCase("BauSystem")) {return;} if (!tracesFolder.exists()) tracesFolder.mkdir(); @@ -61,12 +64,14 @@ public class TraceManager implements Listener { continue; if (TraceRepository.getVersion(traceFile) == TraceRepository.SERIALISATION_VERSION) { - add(TraceRepository.readTrace(traceFile)); + Trace t = TraceRepository.readTrace(traceFile); + add(t); + System.out.println(t); } else { - String uuid = traceFile.getName().replace(".records", ""); + String uuid = traceFile.getName().replace(".meta", ""); - new File(tracesFolder, uuid + ".records").delete(); - new File(tracesFolder, uuid + ".meta").delete(); + new File(tracesFolder, uuid + ".records").deleteOnExit(); + new File(tracesFolder, uuid + ".meta").deleteOnExit(); } } @@ -170,8 +175,8 @@ public class TraceManager implements Listener { tracesByRegion.getOrDefault(region, new HashMap<>()) .forEach((i, trace) -> { if (trace.getRegion() != region) return; - trace.getMetadataSaveFile().delete(); - trace.getRecordsSaveFile().delete(); + trace.getMetadataSaveFile().deleteOnExit(); + trace.getRecordsSaveFile().deleteOnExit(); }); tracesByRegion.getOrDefault(region, new HashMap<>()).clear(); } diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceRecorder.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceRecorder.java index 89b10c7f..17218902 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceRecorder.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceRecorder.java @@ -73,6 +73,7 @@ public class TraceRecorder implements Listener { @EventHandler public void init(PluginEnableEvent event) { + if(!event.getPlugin().getName().equalsIgnoreCase("BauSystem")) {return;} BauSystem.runTaskTimer(BauSystem.getInstance(), () -> { record(); checkForAutoTraceFinish(); diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceRepository.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceRepository.java index 1cc27188..43a144b5 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceRepository.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceRepository.java @@ -16,6 +16,7 @@ public class TraceRepository { * Increment this when changing serialisation format */ public static final int SERIALISATION_VERSION = 1; + public static File tracesFolder = new File(Bukkit.getWorlds().get(0).getWorldFolder(), "traces"); @SneakyThrows protected static int getVersion(File metadataFile) { @@ -39,7 +40,7 @@ public class TraceRepository { UUID uuid = UUID.fromString(reader.readUTF()); Region region = Region.getREGION_MAP().get(reader.readUTF()); Date date = (Date) reader.readObject(); - File recordsFile = new File(uuid + ".records"); + File recordsFile = new File(tracesFolder,uuid + ".records"); int recordsCount = reader.readInt(); return new Trace(uuid, region, date, metadataFile, recordsFile, recordsCount); From 25f6b3c223cd35a30134256275d061e4c6a8f778 Mon Sep 17 00:00:00 2001 From: D4rkr34lm Date: Fri, 16 Aug 2024 17:35:11 +0200 Subject: [PATCH 12/21] Fixed trace record count in trace objects created through recording --- .../src/de/steamwar/bausystem/features/tracer/Trace.java | 6 ++++-- .../bausystem/features/tracer/TraceRecordingWrapper.java | 1 + 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/Trace.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/Trace.java index 29bf38cf..9628570a 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/Trace.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/Trace.java @@ -27,6 +27,7 @@ import de.steamwar.bausystem.region.Region; import de.steamwar.entity.REntity; import de.steamwar.entity.REntityServer; import lombok.Getter; +import lombok.Setter; import lombok.SneakyThrows; import org.bukkit.entity.Player; @@ -72,8 +73,9 @@ public class Trace { */ private SoftReference> records; + @Setter @Getter - private final int recordsCount; + private int recordsCount; /** * A map of all REntityServers rendering this trace @@ -91,7 +93,6 @@ public class Trace { this.uuid = UUID.randomUUID(); this.region = region; this.date = new Date(); - recordsCount = recordList.size(); records = new SoftReference<>(recordList); recordsSaveFile = new File(TraceRepository.tracesFolder, uuid + ".records"); metadataSaveFile = new File(TraceRepository.tracesFolder, uuid + ".meta"); @@ -310,6 +311,7 @@ public class Trace { ", region=" + region + ", creationTime=" + date + ", recordsSaveFile=" + recordsSaveFile.getName() + + ", recordCount=" + recordsCount + ", records=" + getRecords() + '}'; } diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceRecordingWrapper.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceRecordingWrapper.java index bf104e1f..82eb3019 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceRecordingWrapper.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceRecordingWrapper.java @@ -65,6 +65,7 @@ public class TraceRecordingWrapper { TraceManager.instance.showPartial(trace, recordsToAdd); recordList.addAll(recordsToAdd); + trace.setRecordsCount(recordList.size()); recordsToAdd.clear(); } From 15654394b5cabaff21bee53d5eee8e06eab69c28 Mon Sep 17 00:00:00 2001 From: D4rkr34lm Date: Fri, 16 Aug 2024 17:36:43 +0200 Subject: [PATCH 13/21] Fixed false record count being red --- .../de/steamwar/bausystem/features/tracer/TraceRepository.java | 1 + 1 file changed, 1 insertion(+) diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceRepository.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceRepository.java index 43a144b5..5a773942 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceRepository.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceRepository.java @@ -41,6 +41,7 @@ public class TraceRepository { Region region = Region.getREGION_MAP().get(reader.readUTF()); Date date = (Date) reader.readObject(); File recordsFile = new File(tracesFolder,uuid + ".records"); + reader.readInt(); int recordsCount = reader.readInt(); return new Trace(uuid, region, date, metadataFile, recordsFile, recordsCount); From 4f4e0bab698ebca9062259b72293bc1dc7ac43dd Mon Sep 17 00:00:00 2001 From: Lixfel Date: Sat, 17 Aug 2024 19:03:32 +0200 Subject: [PATCH 14/21] Fix tablist (some tests done, potentielly fixed) --- .../steamwar/velocitycore/tablist/Tablist.java | 12 +++++++++--- .../velocitycore/tablist/TablistManager.java | 16 +++++----------- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/VelocityCore/src/de/steamwar/velocitycore/tablist/Tablist.java b/VelocityCore/src/de/steamwar/velocitycore/tablist/Tablist.java index 92484166..315717a6 100644 --- a/VelocityCore/src/de/steamwar/velocitycore/tablist/Tablist.java +++ b/VelocityCore/src/de/steamwar/velocitycore/tablist/Tablist.java @@ -43,6 +43,7 @@ import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; import java.util.*; +import java.util.logging.Level; import java.util.stream.IntStream; @ChannelHandler.Sharable @@ -63,7 +64,6 @@ public class Tablist extends ChannelInboundHandlerAdapter { this.player = player; this.viewer = Chatter.of(player); this.directTabItems = Storage.directTabItems.computeIfAbsent(player, p -> new HashMap<>()); - injection(); } public void update(TablistPart global, int seconds) { @@ -150,8 +150,14 @@ public class Tablist extends ChannelInboundHandlerAdapter { private void injection() { connection = (VelocityServerConnection) player.getCurrentServer().orElse(null); - if(connection == null) - return; + if(connection == null) { + connection = ((ConnectedPlayer) player).getConnectionInFlight(); + + if(connection == null) { + VelocityCore.getLogger().log(Level.WARNING, "Could not inject Tablist: %s".formatted(player)); + return; + } + } ChannelPipeline pipeline = connection.getConnection().getChannel().pipeline(); if(pipeline.get("steamwar-tablist") != null) //Catch unclean exit diff --git a/VelocityCore/src/de/steamwar/velocitycore/tablist/TablistManager.java b/VelocityCore/src/de/steamwar/velocitycore/tablist/TablistManager.java index 69739dc2..29cebb38 100644 --- a/VelocityCore/src/de/steamwar/velocitycore/tablist/TablistManager.java +++ b/VelocityCore/src/de/steamwar/velocitycore/tablist/TablistManager.java @@ -21,9 +21,9 @@ package de.steamwar.velocitycore.tablist; import com.velocitypowered.api.event.Subscribe; import com.velocitypowered.api.event.connection.DisconnectEvent; -import com.velocitypowered.api.event.connection.PostLoginEvent; import com.velocitypowered.api.event.player.ServerConnectedEvent; import com.velocitypowered.api.event.player.ServerPostConnectEvent; +import com.velocitypowered.api.network.ProtocolVersion; import com.velocitypowered.api.proxy.Player; import com.velocitypowered.api.proxy.server.RegisteredServer; import de.steamwar.network.packets.common.FightInfoPacket; @@ -59,20 +59,14 @@ public class TablistManager extends BasicListener { } } - @Subscribe - public void onJoin(PostLoginEvent event) { - Tablist.sendPacket(event.getPlayer(), Tablist.createTeamPacket); - } - @Subscribe public void onServerConnection(ServerConnectedEvent event) { synchronized (tablists) { - if (tablists.containsKey(event.getPlayer())) { - tablists.get(event.getPlayer()).onServerSwitch(); - } else { - tablists.put(event.getPlayer(), new Tablist(event.getPlayer())); - } + tablists.computeIfAbsent(event.getPlayer(), Tablist::new).onServerSwitch(); } + + if(event.getPlayer().getProtocolVersion().noGreaterThan(ProtocolVersion.MINECRAFT_1_20)) + Tablist.sendPacket(event.getPlayer(), Tablist.createTeamPacket); } @Subscribe From 817c522d9ae13700dc8645a0203b7f21c9d6120f Mon Sep 17 00:00:00 2001 From: D4rkr34lm Date: Sun, 18 Aug 2024 11:14:42 +0200 Subject: [PATCH 15/21] Added flushing of trace write to prevent eof on read --- .../steamwar/bausystem/features/tracer/TraceManager.java | 4 +--- .../bausystem/features/tracer/TraceRepository.java | 8 ++++++-- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceManager.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceManager.java index ffd46848..2f9d6dfc 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceManager.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceManager.java @@ -64,9 +64,7 @@ public class TraceManager implements Listener { continue; if (TraceRepository.getVersion(traceFile) == TraceRepository.SERIALISATION_VERSION) { - Trace t = TraceRepository.readTrace(traceFile); - add(t); - System.out.println(t); + add(TraceRepository.readTrace(traceFile)); } else { String uuid = traceFile.getName().replace(".meta", ""); diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceRepository.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceRepository.java index 5a773942..8d23645b 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceRepository.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceRepository.java @@ -41,7 +41,7 @@ public class TraceRepository { Region region = Region.getREGION_MAP().get(reader.readUTF()); Date date = (Date) reader.readObject(); File recordsFile = new File(tracesFolder,uuid + ".records"); - reader.readInt(); + int serialisationVersion = reader.readInt(); int recordsCount = reader.readInt(); return new Trace(uuid, region, date, metadataFile, recordsFile, recordsCount); @@ -49,13 +49,14 @@ public class TraceRepository { @SneakyThrows protected static void writeTrace(Trace trace, List records) { - @Cleanup ObjectOutputStream outputStream = new ObjectOutputStream(new FileOutputStream(trace.getMetadataSaveFile())); outputStream.writeUTF(trace.getUuid().toString()); outputStream.writeUTF(trace.getRegion().getName()); outputStream.writeObject(trace.getDate()); outputStream.writeInt(SERIALISATION_VERSION); outputStream.writeInt(records.size()); + outputStream.flush(); + outputStream.close(); writeTraceRecords(trace.getRecordsSaveFile(), records); @@ -82,6 +83,8 @@ public class TraceRepository { outputStream.writeDouble(velocity.getY()); outputStream.writeDouble(velocity.getZ()); } + outputStream.flush(); + outputStream.close(); } @SneakyThrows @@ -118,6 +121,7 @@ public class TraceRepository { List records = new ArrayList<>(); for (int i = 0; i < trace.getRecordsCount(); i++) { records.add(readTraceRecord(inputStream)); + System.out.println("Read record " + i + " of " + trace.getRecordsCount()); } Map> histories = new HashMap<>(); From a780385599118d8bfd2e01a085bf02a651c7a52e Mon Sep 17 00:00:00 2001 From: D4rkr34lm Date: Sun, 18 Aug 2024 11:19:35 +0200 Subject: [PATCH 16/21] Removed debug statement --- .../de/steamwar/bausystem/features/tracer/TraceRepository.java | 1 - 1 file changed, 1 deletion(-) diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceRepository.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceRepository.java index 8d23645b..a1577f48 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceRepository.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceRepository.java @@ -121,7 +121,6 @@ public class TraceRepository { List records = new ArrayList<>(); for (int i = 0; i < trace.getRecordsCount(); i++) { records.add(readTraceRecord(inputStream)); - System.out.println("Read record " + i + " of " + trace.getRecordsCount()); } Map> histories = new HashMap<>(); From 44faab995094bce70bc2ace3d1fed0f20c74d52a Mon Sep 17 00:00:00 2001 From: D4rkr34lm Date: Sun, 18 Aug 2024 11:45:38 +0200 Subject: [PATCH 17/21] Added all args through lombok --- .../bausystem/features/tracer/TNTPoint.java | 25 +++---------------- 1 file changed, 3 insertions(+), 22 deletions(-) diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TNTPoint.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TNTPoint.java index 432241c2..1a34a684 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TNTPoint.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TNTPoint.java @@ -22,6 +22,7 @@ package de.steamwar.bausystem.features.tracer; import de.steamwar.bausystem.region.Region; import de.steamwar.bausystem.region.utils.RegionExtensionType; import de.steamwar.bausystem.region.utils.RegionType; +import lombok.AllArgsConstructor; import lombok.Getter; import org.bukkit.Bukkit; import org.bukkit.Location; @@ -40,6 +41,7 @@ import java.util.Optional; * Recording of a tnt at a specific tick */ @Getter +@AllArgsConstructor public class TNTPoint implements Externalizable { /** * Unique number to identify records being of the same tnt @@ -97,29 +99,8 @@ public class TNTPoint implements Externalizable { private List history; /** - * Constructor for deserialization only !! Do not Call !! + * Constructor for creating a new trace point in trace recording */ - protected TNTPoint(int tntId, boolean explosion, - boolean inWater, - boolean afterFirstExplosion, - boolean destroyedBuildArea, - boolean destroyedTestBlock, - long ticksSinceStart, - int fuse, - Location location, - Vector velocity) { - this.tntId = tntId; - this.explosion = explosion; - this.inWater = inWater; - this.afterFirstExplosion = afterFirstExplosion; - this.destroyedBuildArea = destroyedBuildArea; - this.destroyedTestBlock = destroyedTestBlock; - this.ticksSinceStart = ticksSinceStart; - this.fuse = fuse; - this.location = location; - this.velocity = velocity; - } - public TNTPoint(int tntId, TNTPrimed tnt, boolean explosion, boolean afterFirstExplosion, long ticksSinceStart, List history, List destroyedBlocks) { this.tntId = tntId; From fbb6d84dae396db27c3f09831681b7e038cb2a6e Mon Sep 17 00:00:00 2001 From: D4rkr34lm Date: Sun, 18 Aug 2024 11:53:14 +0200 Subject: [PATCH 18/21] Moved trace system init to plugin enable --- .../src/de/steamwar/bausystem/BauSystem.java | 5 ++++ .../bausystem/features/tracer/TNTPoint.java | 27 +++++++++++++++++-- .../features/tracer/TraceManager.java | 4 +-- .../features/tracer/TraceRecorder.java | 4 +-- 4 files changed, 32 insertions(+), 8 deletions(-) diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/BauSystem.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/BauSystem.java index b37e8e8b..9afe6154 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/BauSystem.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/BauSystem.java @@ -28,6 +28,8 @@ import de.steamwar.bausystem.features.script.lua.libs.LuaLib; import de.steamwar.bausystem.features.slaves.panzern.Panzern; import de.steamwar.bausystem.features.slaves.panzern.PanzernAlgorithm; import de.steamwar.bausystem.features.tpslimit.TPSFreezeUtils; +import de.steamwar.bausystem.features.tracer.TraceManager; +import de.steamwar.bausystem.features.tracer.TraceRecorder; import de.steamwar.bausystem.features.world.BauScoreboard; import de.steamwar.bausystem.linkage.specific.BauGuiItem; import de.steamwar.bausystem.region.loader.PrototypeLoader; @@ -197,6 +199,9 @@ public class BauSystem extends JavaPlugin implements Listener { }); TickListener.impl.init(); + + TraceManager.instance.init(); + TraceRecorder.instance.init(); } @Override diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TNTPoint.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TNTPoint.java index 1a34a684..182102d4 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TNTPoint.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TNTPoint.java @@ -41,7 +41,6 @@ import java.util.Optional; * Recording of a tnt at a specific tick */ @Getter -@AllArgsConstructor public class TNTPoint implements Externalizable { /** * Unique number to identify records being of the same tnt @@ -99,7 +98,31 @@ public class TNTPoint implements Externalizable { private List history; /** - * Constructor for creating a new trace point in trace recording + * Constructor for deserialization only !! Do not Call !! + */ + protected TNTPoint(int tntId, boolean explosion, + boolean inWater, + boolean afterFirstExplosion, + boolean destroyedBuildArea, + boolean destroyedTestBlock, + long ticksSinceStart, + int fuse, + Location location, + Vector velocity) { + this.tntId = tntId; + this.explosion = explosion; + this.inWater = inWater; + this.afterFirstExplosion = afterFirstExplosion; + this.destroyedBuildArea = destroyedBuildArea; + this.destroyedTestBlock = destroyedTestBlock; + this.ticksSinceStart = ticksSinceStart; + this.fuse = fuse; + this.location = location; + this.velocity = velocity; + } + + /** + * */ public TNTPoint(int tntId, TNTPrimed tnt, boolean explosion, boolean afterFirstExplosion, long ticksSinceStart, List history, List destroyedBlocks) { diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceManager.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceManager.java index 2f9d6dfc..1f0c5140 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceManager.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceManager.java @@ -49,9 +49,7 @@ public class TraceManager implements Listener { - @EventHandler - public void init(PluginEnableEvent event) { - if(!event.getPlugin().getName().equalsIgnoreCase("BauSystem")) {return;} + public void init() { if (!tracesFolder.exists()) tracesFolder.mkdir(); diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceRecorder.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceRecorder.java index 17218902..6a0a2314 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceRecorder.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceRecorder.java @@ -71,9 +71,7 @@ public class TraceRecorder implements Listener { */ private final Set autoTraceRegions = new HashSet<>(); - @EventHandler - public void init(PluginEnableEvent event) { - if(!event.getPlugin().getName().equalsIgnoreCase("BauSystem")) {return;} + public void init() { BauSystem.runTaskTimer(BauSystem.getInstance(), () -> { record(); checkForAutoTraceFinish(); From 3e6dd614281708d858e27a9b0d19f38b306107f1 Mon Sep 17 00:00:00 2001 From: D4rkr34lm Date: Sun, 18 Aug 2024 12:08:57 +0200 Subject: [PATCH 19/21] Readd allArgs and history place holder --- .../bausystem/features/tracer/TNTPoint.java | 69 ++----------------- .../features/tracer/TraceRepository.java | 2 +- 2 files changed, 5 insertions(+), 66 deletions(-) diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TNTPoint.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TNTPoint.java index 182102d4..785aca63 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TNTPoint.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TNTPoint.java @@ -40,8 +40,9 @@ import java.util.Optional; /** * Recording of a tnt at a specific tick */ +@AllArgsConstructor @Getter -public class TNTPoint implements Externalizable { +public class TNTPoint{ /** * Unique number to identify records being of the same tnt */ @@ -98,33 +99,9 @@ public class TNTPoint implements Externalizable { private List history; /** - * Constructor for deserialization only !! Do not Call !! + * Constructor fo object creation in trace recording */ - protected TNTPoint(int tntId, boolean explosion, - boolean inWater, - boolean afterFirstExplosion, - boolean destroyedBuildArea, - boolean destroyedTestBlock, - long ticksSinceStart, - int fuse, - Location location, - Vector velocity) { - this.tntId = tntId; - this.explosion = explosion; - this.inWater = inWater; - this.afterFirstExplosion = afterFirstExplosion; - this.destroyedBuildArea = destroyedBuildArea; - this.destroyedTestBlock = destroyedTestBlock; - this.ticksSinceStart = ticksSinceStart; - this.fuse = fuse; - this.location = location; - this.velocity = velocity; - } - - /** - * - */ - public TNTPoint(int tntId, TNTPrimed tnt, boolean explosion, boolean afterFirstExplosion, long ticksSinceStart, + protected TNTPoint(int tntId, TNTPrimed tnt, boolean explosion, boolean afterFirstExplosion, long ticksSinceStart, List history, List destroyedBlocks) { this.tntId = tntId; this.explosion = explosion; @@ -183,44 +160,6 @@ public class TNTPoint implements Externalizable { this.history = history; } - @Override - public void writeExternal(ObjectOutput objectOutput) throws IOException { - objectOutput.writeInt(tntId); - objectOutput.writeBoolean(explosion); - objectOutput.writeBoolean(inWater); - objectOutput.writeBoolean(afterFirstExplosion); - objectOutput.writeBoolean(destroyedBuildArea); - objectOutput.writeBoolean(destroyedTestBlock); - objectOutput.writeLong(ticksSinceStart); - objectOutput.writeInt(fuse); - objectOutput.writeDouble(location.getX()); - objectOutput.writeDouble(location.getY()); - objectOutput.writeDouble(location.getZ()); - objectOutput.writeDouble(velocity.getX()); - objectOutput.writeDouble(velocity.getY()); - objectOutput.writeDouble(velocity.getZ()); - } - - @Override - public void readExternal(ObjectInput objectInput) throws IOException { - tntId = objectInput.readInt(); - explosion = objectInput.readBoolean(); - inWater = objectInput.readBoolean(); - afterFirstExplosion = objectInput.readBoolean(); - destroyedBuildArea = objectInput.readBoolean(); - destroyedTestBlock = objectInput.readBoolean(); - ticksSinceStart = objectInput.readLong(); - fuse = objectInput.readInt(); - double locX = objectInput.readDouble(); - double locY = objectInput.readDouble(); - double locZ = objectInput.readDouble(); - location = new Location(Bukkit.getWorlds().get(0), locX, locY, locZ); - double velX = objectInput.readDouble(); - double velY = objectInput.readDouble(); - double velZ = objectInput.readDouble(); - velocity = new Vector(velX, velY, velZ); - } - @Override public String toString() { return "TNTPoint{" + diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceRepository.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceRepository.java index a1577f48..c88ab2f2 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceRepository.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceRepository.java @@ -109,7 +109,7 @@ public class TraceRepository { double velZ = objectInput.readDouble(); Vector velocity = new Vector(velX, velY, velZ); - return new TNTPoint(tntId, explosion, inWater, afterFirstExplosion, destroyedBuildArea, destroyedTestBlock, ticksSinceStart, fuse, location, velocity); + return new TNTPoint(tntId, explosion, inWater, afterFirstExplosion, destroyedBuildArea, destroyedTestBlock, ticksSinceStart, fuse, location, velocity, Collections.emptyList()); } @SneakyThrows From 67d4f3432a6c623c1f6304101fdb6a0521b57107 Mon Sep 17 00:00:00 2001 From: D4rkr34lm Date: Sun, 18 Aug 2024 12:23:05 +0200 Subject: [PATCH 20/21] Changed trace record output to data output/input instead of object output/input --- .../steamwar/bausystem/features/tracer/TraceRepository.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceRepository.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceRepository.java index c88ab2f2..39f50fe1 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceRepository.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceRepository.java @@ -64,7 +64,7 @@ public class TraceRepository { @SneakyThrows protected static void writeTraceRecords(File recordsFile, List records) { - ObjectOutputStream outputStream = new ObjectOutputStream(new FileOutputStream(recordsFile)); + DataOutputStream outputStream = new DataOutputStream(new FileOutputStream(recordsFile)); for (TNTPoint record : records) { outputStream.writeInt(record.getTntId()); outputStream.writeBoolean(record.isExplosion()); @@ -88,7 +88,7 @@ public class TraceRepository { } @SneakyThrows - protected static TNTPoint readTraceRecord(ObjectInputStream objectInput) { + protected static TNTPoint readTraceRecord(DataInputStream objectInput) { int tntId = objectInput.readInt(); boolean explosion = objectInput.readBoolean(); @@ -116,7 +116,7 @@ public class TraceRepository { protected static List readTraceRecords(Trace trace) { File recordsFile = trace.getRecordsSaveFile(); @Cleanup - ObjectInputStream inputStream = new ObjectInputStream(new FileInputStream(recordsFile)); + DataInputStream inputStream = new DataInputStream(new FileInputStream(recordsFile)); List records = new ArrayList<>(); for (int i = 0; i < trace.getRecordsCount(); i++) { From 50175b2518355adba535397067abc815d0c50e8b Mon Sep 17 00:00:00 2001 From: D4rkr34lm Date: Sun, 18 Aug 2024 20:53:36 +0200 Subject: [PATCH 21/21] Fixed access --- .../src/de/steamwar/bausystem/features/tracer/TNTPoint.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TNTPoint.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TNTPoint.java index 785aca63..1e9fd38d 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TNTPoint.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TNTPoint.java @@ -22,6 +22,7 @@ package de.steamwar.bausystem.features.tracer; import de.steamwar.bausystem.region.Region; import de.steamwar.bausystem.region.utils.RegionExtensionType; import de.steamwar.bausystem.region.utils.RegionType; +import lombok.AccessLevel; import lombok.AllArgsConstructor; import lombok.Getter; import org.bukkit.Bukkit; @@ -40,7 +41,7 @@ import java.util.Optional; /** * Recording of a tnt at a specific tick */ -@AllArgsConstructor +@AllArgsConstructor(access = AccessLevel.PACKAGE) @Getter public class TNTPoint{ /** @@ -99,7 +100,7 @@ public class TNTPoint{ private List history; /** - * Constructor fo object creation in trace recording + * Constructor for object creation in trace recording */ protected TNTPoint(int tntId, TNTPrimed tnt, boolean explosion, boolean afterFirstExplosion, long ticksSinceStart, List history, List destroyedBlocks) {