diff --git a/Docs/BukkitPlugins.md b/Docs/BukkitPlugins.md
index 66186808a..f2971c8de 100644
--- a/Docs/BukkitPlugins.md
+++ b/Docs/BukkitPlugins.md
@@ -10,6 +10,7 @@ Supported Plugins: (And the sources we acquired Jar files from.)
- BossShopPro (https://www.spigotmc.org/resources/bossshop.222/)
- ChestShop (https://www.spigotmc.org/resources/chestshop.51856/)
- CoreProtect (https://www.spigotmc.org/resources/coreprotect.8631/)
+- CoordinateOffset (https://github.com/joshuaprince/CoordinateOffset)
- CrackShot (https://www.spigotmc.org/resources/crackshot-guns.48301/)
- EffectLib (https://dev.bukkit.org/projects/effectlib)
- EssentialsX (https://www.spigotmc.org/resources/essentialsx.9089/)
diff --git a/pom.xml b/pom.xml
index 6ab627aa0..557b67632 100644
--- a/pom.xml
+++ b/pom.xml
@@ -142,6 +142,13 @@
system
${project.basedir}/lib/CoreProtect.jar
+
+ com.jtprince
+ CoordinateOffset
+ 6.1.8-SNAPSHOT
+ system
+ ${project.basedir}/lib/CoordinateOffset.jar
+
de.slikey
EffectLib
@@ -403,6 +410,7 @@
system
${basedir}/lib/BigDoors.jar
+
diff --git a/src/main/java/com/denizenscript/depenizen/bukkit/Depenizen.java b/src/main/java/com/denizenscript/depenizen/bukkit/Depenizen.java
index 5fe5e8906..b71a4006b 100644
--- a/src/main/java/com/denizenscript/depenizen/bukkit/Depenizen.java
+++ b/src/main/java/com/denizenscript/depenizen/bukkit/Depenizen.java
@@ -124,6 +124,7 @@ public void registerCoreBridges() {
registerBridge("BigDoors", () -> new BigDoorsBridge());
registerBridge("BossShopPro", () -> new BossShopBridge());
registerBridge("ChestShop", () -> new ChestShopBridge());
+ registerBridge("CoordinateOffset", () -> new CoordinateOffsetBridge());
registerBridge("CoreProtect", () -> new CoreProtectBridge());
registerBridge("CrackShot", () -> new CrackShotBridge());
registerBridge("EffectLib", () -> new EffectLibBridge());
@@ -170,3 +171,4 @@ public void registerBridge(String name, String classCheck, Supplier brid
allBridges.put(name, new BridgeData(classCheck, bridgeSupplier));
}
}
+
diff --git a/src/main/java/com/denizenscript/depenizen/bukkit/bridges/CoordinateOffsetBridge.java b/src/main/java/com/denizenscript/depenizen/bukkit/bridges/CoordinateOffsetBridge.java
new file mode 100644
index 000000000..f4c3f7e76
--- /dev/null
+++ b/src/main/java/com/denizenscript/depenizen/bukkit/bridges/CoordinateOffsetBridge.java
@@ -0,0 +1,12 @@
+package com.denizenscript.depenizen.bukkit.bridges;
+
+import com.denizenscript.depenizen.bukkit.Bridge;
+import com.denizenscript.depenizen.bukkit.properties.coordinateoffset.CoordinateOffsetPlayerExtensions;
+
+public class CoordinateOffsetBridge extends Bridge {
+
+ @Override
+ public void init() {
+ CoordinateOffsetPlayerExtensions.register();
+ }
+}
diff --git a/src/main/java/com/denizenscript/depenizen/bukkit/properties/coordinateoffset/CoordinateOffsetPlayerExtensions.java b/src/main/java/com/denizenscript/depenizen/bukkit/properties/coordinateoffset/CoordinateOffsetPlayerExtensions.java
new file mode 100644
index 000000000..0dd2dc3b6
--- /dev/null
+++ b/src/main/java/com/denizenscript/depenizen/bukkit/properties/coordinateoffset/CoordinateOffsetPlayerExtensions.java
@@ -0,0 +1,62 @@
+package com.denizenscript.depenizen.bukkit.properties.coordinateoffset;
+
+import com.denizenscript.denizen.objects.LocationTag;
+import com.denizenscript.denizen.objects.PlayerTag;
+import com.jtprince.coordinateoffset.FixedOffset;
+import com.jtprince.coordinateoffset.Offset;
+import com.jtprince.coordinateoffset.api.CoordinateOffset;
+import com.jtprince.coordinateoffset.adapter.OffsetPlayer;
+
+public class CoordinateOffsetPlayerExtensions {
+
+ public static CoordinateOffset getApi() {
+ return CoordinateOffset.api();
+ }
+
+ public static OffsetPlayer getOffsetPlayer(PlayerTag player) {
+ return getApi().adaptPlayer(player.getPlayerEntity());
+ }
+
+ public static void register() {
+
+ // <--[tag]
+ // @attribute
+ // @returns LocationTag
+ // @mechanism PlayerTag.coordinate_offset
+ // @plugin Depenizen, CoordinateOffset
+ // @description
+ // Returns the player's current coordinate offset as a LocationTag (x, y, z).
+ // -->
+ PlayerTag.registerOnlineOnlyTag(LocationTag.class, "coordinate_offset", (attribute, player) -> {
+ OffsetPlayer offsetPlayer = getOffsetPlayer(player);
+ FixedOffset offset = getApi().getOffset(offsetPlayer);
+ if (offset.isZero()) {
+ return null;
+ }
+ return new LocationTag(null, offset.x(), offset.y(), offset.z());
+ });
+
+ // <--[mechanism]
+ // @object PlayerTag
+ // @name coordinate_offset
+ // @input LocationTag
+ // @plugin Depenizen, CoordinateOffset
+ // @description
+ // Sets the player's coordinate offset.
+ // @tags
+ //
+ // -->
+ PlayerTag.registerOnlineOnlyMechanism("coordinate_offset", LocationTag.class, (player, mechanism, loc) -> {
+ int x = (int) Math.round(loc.getX());
+ int y = (int) Math.round(loc.getY());
+ int z = (int) Math.round(loc.getZ());
+
+ // Align using ConstantOffsetProvider logic (multiples of configured blocks)
+ int alignedX = Offset.alignComponentToConfiguredMultiple(x);
+ int alignedZ = Offset.alignComponentToConfiguredMultiple(z);
+
+ OffsetPlayer offsetPlayer = getOffsetPlayer(player);
+ getApi().setOffset(offsetPlayer, Offset.scalable(alignedX, y, alignedZ));
+ });
+ }
+}
diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml
index 1d729e375..b1cd6755c 100644
--- a/src/main/resources/plugin.yml
+++ b/src/main/resources/plugin.yml
@@ -16,6 +16,7 @@ softdepend:
- BossShopPro
- ChestShop
- CoreProtect
+ - CoordinateOffset
- CrackShot
- EffectLib
- Essentials