diff --git a/ansible/build.gradle.kts b/ansible/build.gradle.kts index e01cdc242..c9e45cd32 100644 --- a/ansible/build.gradle.kts +++ b/ansible/build.gradle.kts @@ -18,7 +18,7 @@ dependencies { paperPlugin(project(path = ":plugins:factorymod-paper")) paperPlugin(project(path = ":plugins:hiddenore-paper")) paperPlugin(project(path = ":plugins:itemexchange-paper")) - paperPlugin(project(path = ":plugins:jukealert-paper")) + paperPlugin(project(path = ":plugins:jukealert-paper", configuration = "shadow")) paperPlugin(project(path = ":plugins:kirabukkitgateway-paper", configuration = "shadow")) paperPlugin(project(path = ":plugins:namecolors-paper")) paperPlugin(project(path = ":plugins:namelayer-paper")) diff --git a/plugins/jukealert-paper/build.gradle.kts b/plugins/jukealert-paper/build.gradle.kts index 5bac1f3ee..759fe9282 100644 --- a/plugins/jukealert-paper/build.gradle.kts +++ b/plugins/jukealert-paper/build.gradle.kts @@ -1,5 +1,6 @@ plugins { id("io.papermc.paperweight.userdev") + id("com.github.johnrengelman.shadow") } version = "3.0.8" @@ -9,6 +10,7 @@ dependencies { paperDevBundle(libs.versions.paper) } + api("com.github.davidmoten:rtree2:0.9.3") compileOnly(project(":plugins:civmodcore-paper")) compileOnly(project(":plugins:namelayer-paper")) compileOnly(project(":plugins:citadel-paper")) diff --git a/plugins/jukealert-paper/src/main/java/com/untamedears/jukealert/SnitchManager.java b/plugins/jukealert-paper/src/main/java/com/untamedears/jukealert/SnitchManager.java index c58c08a63..88cb9c810 100644 --- a/plugins/jukealert-paper/src/main/java/com/untamedears/jukealert/SnitchManager.java +++ b/plugins/jukealert-paper/src/main/java/com/untamedears/jukealert/SnitchManager.java @@ -1,5 +1,10 @@ package com.untamedears.jukealert; +import com.github.davidmoten.rtree2.Entry; +import com.github.davidmoten.rtree2.RTree; +import com.github.davidmoten.rtree2.geometry.Rectangle; +import com.github.davidmoten.rtree2.geometry.internal.PointDouble; +import com.github.davidmoten.rtree2.geometry.internal.RectangleDouble; import com.untamedears.jukealert.database.JukeAlertDAO; import com.untamedears.jukealert.model.Snitch; import com.untamedears.jukealert.model.SnitchQTEntry; @@ -20,7 +25,6 @@ import com.untamedears.jukealert.model.actions.abstr.LoggablePlayerAction; import org.bukkit.Location; import org.bukkit.block.Block; import org.jetbrains.annotations.NotNull; -import vg.civcraft.mc.civmodcore.world.locations.SparseQuadTree; import vg.civcraft.mc.civmodcore.world.locations.chunkmeta.CacheState; import vg.civcraft.mc.civmodcore.world.locations.chunkmeta.api.SingleBlockAPIView; import vg.civcraft.mc.namelayer.group.Group; @@ -34,13 +38,13 @@ public class SnitchManager { } private final SingleBlockAPIView api; - private final Map> quadTreesByWorld; + private final Map> treesByWorld; private final ScheduledExecutorService scheduler; private final ConcurrentLinkedQueue logs; public SnitchManager(SingleBlockAPIView api) { this.api = api; - this.quadTreesByWorld = new TreeMap<>(); + this.treesByWorld = new TreeMap<>(); this.scheduler = Executors.newScheduledThreadPool(1); this.logs = new ConcurrentLinkedQueue<>(); } @@ -94,18 +98,18 @@ public class SnitchManager { } public void addSnitchToQuadTree(Snitch snitch) { - SparseQuadTree quadTree = getQuadTreeFor(snitch.getLocation()); + RTree tree = getTreeFor(snitch.getLocation()); for (SnitchQTEntry qt : snitch.getFieldManager().getQTEntries()) { - quadTree.add(qt); + treesByWorld.put(snitch.getLocation().getWorld().getUID(), tree.add(qt.getSnitch(), RectangleDouble.create(qt.qtXMin(), qt.qtZMin(), qt.qtXMax(), qt.qtZMax()))); } } - private SparseQuadTree getQuadTreeFor(Location loc) { - SparseQuadTree tree = quadTreesByWorld.get(loc.getWorld().getUID()); + private RTree getTreeFor(Location loc) { + RTree tree = treesByWorld.get(loc.getWorld().getUID()); if (tree == null) { - JukeAlert.getInstance().getLogger().info("Quad tree for world " + loc.getWorld().getUID() + " does not exist, creating"); - tree = new SparseQuadTree<>(1); - quadTreesByWorld.put(loc.getWorld().getUID(), tree); + JukeAlert.getInstance().getLogger().info("Tree for world " + loc.getWorld().getUID() + " does not exist, creating"); + tree = RTree.create(); + treesByWorld.put(loc.getWorld().getUID(), tree); } return tree; } @@ -121,18 +125,18 @@ public class SnitchManager { public void removeSnitch(@NotNull final Snitch snitch) { snitch.setCacheState(CacheState.DELETED); this.api.remove(snitch); - final SparseQuadTree quadTree = getQuadTreeFor(snitch.getLocation()); + final RTree quadTree = getTreeFor(snitch.getLocation()); for (final SnitchQTEntry qt : snitch.getFieldManager().getQTEntries()) { - quadTree.remove(qt); + treesByWorld.put(snitch.getLocation().getWorld().getUID(), quadTree.delete(qt.getSnitch(), RectangleDouble.create(qt.qtXMin(), qt.qtZMin(), qt.qtXMax(), qt.qtZMax()))); } } public Set getSnitchesCovering(Location location) { - Set entries = getQuadTreeFor(location).find(location.getBlockX(), location.getBlockZ(), true); + Iterable> search = getTreeFor(location).search(PointDouble.create(location.getBlockX(), location.getBlockZ())); Set result = new HashSet<>(); - for (SnitchQTEntry qt : entries) { - if (qt.getSnitch().getFieldManager().isInside(location)) { - result.add(qt.getSnitch()); + for (Entry qt : search) { + if (qt.value().getFieldManager().isInside(location)) { + result.add(qt.value()); } } Iterator iter = result.iterator();