diff --git a/.github/workflows/modrinth-publish.yml b/.github/workflows/modrinth-publish.yml
new file mode 100644
index 0000000..0f432e0
--- /dev/null
+++ b/.github/workflows/modrinth-publish.yml
@@ -0,0 +1,43 @@
+name: Publish
+
+on:
+ release:
+ types: [published]
+
+jobs:
+ publish:
+ name: Publish
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@v4
+
+ - name: Set up JDK 21
+ uses: actions/setup-java@v4
+ with:
+ java-version: 21
+ distribution: adopt
+ cache: maven
+
+ # This step will take the version tag from the release and replace it in `pom.xml` before building.
+ #- name: Set version from release tag
+ # run: mvn -B versions:set -DnewVersion=${{ github.event.release.tag_name }} -DgenerateBackupPoms=false
+
+ - name: Build and package with Maven
+ run: mvn -B clean package -DskipTests -DgenerateBackupPoms=false -Pmaster --file pom.xml
+
+ - name: Upload to Modrinth
+ uses: cloudnode-pro/modrinth-publish@v2
+ with:
+ token: ${{ secrets.MODRINTH_TOKEN }}
+ project: wvEhk1hC
+ name: ${{ github.event.release.name }}
+ version: ${{ github.event.release.tag_name }}
+ changelog: ${{ github.event.release.body }}
+ loaders: |-
+ paper
+ spigot
+ game-versions: |-
+ 1.21.4
+ 1.21.5
+ files: /home/runner/work/BentoBox/Border/target/Border-${{ github.event.release.tag_name }}.jar
diff --git a/pom.xml b/pom.xml
index 975baca..9c46476 100644
--- a/pom.xml
+++ b/pom.xml
@@ -50,7 +50,7 @@
${build.version}-SNAPSHOT
- 4.4.2
+ 4.5.0
-LOCAL
BentoBoxWorld_Border
diff --git a/src/main/java/world/bentobox/border/BorderPladdon.java b/src/main/java/world/bentobox/border/BorderPladdon.java
new file mode 100644
index 0000000..9d6f364
--- /dev/null
+++ b/src/main/java/world/bentobox/border/BorderPladdon.java
@@ -0,0 +1,20 @@
+package world.bentobox.border;
+
+
+import world.bentobox.bentobox.api.addons.Addon;
+import world.bentobox.bentobox.api.addons.Pladdon;
+
+
+public class BorderPladdon extends Pladdon {
+
+ private Border addon;
+
+ @Override
+ public Addon getAddon() {
+ if (addon == null) {
+ addon = new Border();
+ }
+ return addon;
+ }
+
+}
diff --git a/src/main/java/world/bentobox/border/PerPlayerBorderProxy.java b/src/main/java/world/bentobox/border/PerPlayerBorderProxy.java
index 196cf5d..f5b2901 100644
--- a/src/main/java/world/bentobox/border/PerPlayerBorderProxy.java
+++ b/src/main/java/world/bentobox/border/PerPlayerBorderProxy.java
@@ -74,4 +74,14 @@ private BorderType getBorderType(User user) {
private BorderType getDefaultBorderType() {
return addon.getSettings().getType();
}
+
+ @Override
+ public void teleportPlayer(Player player) {
+ if (getBorderType(User.getInstance(player)) == BorderType.BARRIER) {
+ customBorder.teleportPlayer(player);
+ } else {
+ vanillaBorder.teleportPlayer(player);
+ }
+
+ }
}
diff --git a/src/main/java/world/bentobox/border/listeners/BorderShower.java b/src/main/java/world/bentobox/border/listeners/BorderShower.java
index d7b4910..e42d5da 100644
--- a/src/main/java/world/bentobox/border/listeners/BorderShower.java
+++ b/src/main/java/world/bentobox/border/listeners/BorderShower.java
@@ -43,4 +43,10 @@ public default void refreshView(User user, Island island){
// Do nothing
}
+ /**
+ * Teleports player back within the island space they are in
+ * @param player player
+ */
+ public void teleportPlayer(Player player);
+
}
diff --git a/src/main/java/world/bentobox/border/listeners/PlayerListener.java b/src/main/java/world/bentobox/border/listeners/PlayerListener.java
index 1258bfb..464b64d 100644
--- a/src/main/java/world/bentobox/border/listeners/PlayerListener.java
+++ b/src/main/java/world/bentobox/border/listeners/PlayerListener.java
@@ -18,6 +18,8 @@
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
+import org.bukkit.event.entity.EntityDamageEvent;
+import org.bukkit.event.entity.EntityDamageEvent.DamageCause;
import org.bukkit.event.entity.EntityDismountEvent;
import org.bukkit.event.entity.EntityMountEvent;
import org.bukkit.event.player.PlayerJoinEvent;
@@ -32,12 +34,14 @@
import org.bukkit.util.RayTraceResult;
import org.bukkit.util.Vector;
+import world.bentobox.bentobox.BentoBox;
import world.bentobox.bentobox.api.events.island.IslandProtectionRangeChangeEvent;
import world.bentobox.bentobox.api.flags.Flag;
import world.bentobox.bentobox.api.metadata.MetaDataValue;
import world.bentobox.bentobox.api.user.User;
import world.bentobox.bentobox.util.Util;
import world.bentobox.border.Border;
+import world.bentobox.border.BorderType;
import world.bentobox.border.PerPlayerBorderProxy;
import world.bentobox.border.commands.IslandBorderCommand;
@@ -98,6 +102,20 @@ protected void processEvent(PlayerJoinEvent e) {
show.showBorder(e.getPlayer(), i)));
}
+ @EventHandler(priority = EventPriority.NORMAL)
+ public void onPlayerDamage(EntityDamageEvent e) {
+ // Only deal with fall damage in the right world if the barrier is on
+ if (e.getCause() != DamageCause.FALL || addon.getSettings().getType() != BorderType.BARRIER
+ || !(e.getEntity() instanceof Player p) || !isOn(p) || !addon.inGameWorld(e.getEntity().getWorld())) {
+ return;
+ }
+ Material type = p.getLocation().getBlock().getRelative(BlockFace.DOWN).getType();
+ if (type == Material.AIR) {
+ ((BorderShower) show).teleportPlayer(p);
+ e.setCancelled(true);
+ }
+ }
+
@EventHandler(priority = EventPriority.NORMAL)
public void onPlayerQuit(PlayerQuitEvent e) {
show.clearUser(User.getInstance(e.getPlayer()));
@@ -331,8 +349,6 @@ public void onVehicleMove(VehicleMoveEvent e) {
*/
@EventHandler(priority = EventPriority.NORMAL)
public void onProtectionRangeChange(IslandProtectionRangeChangeEvent e) {
- // Get default game mode
- GameMode gm = this.addon.getPlugin().getIWM().getDefaultGameMode(e.getIsland().getWorld());
// Hide and show again
e.getIsland().getPlayersOnIsland().forEach(player -> {
if (isOn(player)) {
diff --git a/src/main/java/world/bentobox/border/listeners/ShowBarrier.java b/src/main/java/world/bentobox/border/listeners/ShowBarrier.java
index 7267913..f235c4d 100644
--- a/src/main/java/world/bentobox/border/listeners/ShowBarrier.java
+++ b/src/main/java/world/bentobox/border/listeners/ShowBarrier.java
@@ -18,6 +18,7 @@
import com.google.common.base.Enums;
+import world.bentobox.bentobox.BentoBox;
import world.bentobox.bentobox.api.metadata.MetaDataValue;
import world.bentobox.bentobox.api.user.User;
import world.bentobox.bentobox.database.objects.Island;
@@ -123,13 +124,19 @@ private void showWalls(Player player, Location loc, int xMin, int xMax, int zMin
}
+ /**
+ * @param player player
+ * @param i
+ * @param j
+ * @param k
+ * @param max
+ */
private void showPlayer(Player player, int i, int j, int k, boolean max) {
// Get if on or in border
if (addon.getSettings().isUseBarrierBlocks()
&& player.getLocation().getBlockX() == i
&& player.getLocation().getBlockZ() == k) {
teleportPlayer(player);
- return;
}
Location l = new Location(player.getWorld(), i, j, k);
@@ -148,13 +155,15 @@ private void showPlayer(Player player, int i, int j, int k, boolean max) {
});
}
- private void teleportPlayer(Player p) {
+ /**
+ * Teleport player back within the island space they are in
+ * @param p player
+ */
+ public void teleportPlayer(Player p) {
addon.getIslands().getIslandAt(p.getLocation()).ifPresent(i -> {
Vector unitVector = i.getCenter().toVector().subtract(p.getLocation().toVector()).normalize()
- .multiply(new Vector(1,0,1));
- p.setVelocity(new Vector (0,0,0));
+ .multiply(new Vector(1, 0, 1));
// Get distance from border
-
Location to = p.getLocation().toVector().add(unitVector).toLocation(p.getWorld());
to.setPitch(p.getLocation().getPitch());
to.setYaw(p.getLocation().getYaw());
diff --git a/src/main/java/world/bentobox/border/listeners/ShowVirtualWorldBorder.java b/src/main/java/world/bentobox/border/listeners/ShowVirtualWorldBorder.java
index 9690863..309044d 100644
--- a/src/main/java/world/bentobox/border/listeners/ShowVirtualWorldBorder.java
+++ b/src/main/java/world/bentobox/border/listeners/ShowVirtualWorldBorder.java
@@ -4,13 +4,16 @@
import org.bukkit.Bukkit;
import org.bukkit.Location;
-import org.bukkit.WorldBorder;
import org.bukkit.World.Environment;
+import org.bukkit.WorldBorder;
import org.bukkit.entity.Player;
+import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause;
+import org.bukkit.util.Vector;
import world.bentobox.bentobox.api.metadata.MetaDataValue;
import world.bentobox.bentobox.api.user.User;
import world.bentobox.bentobox.database.objects.Island;
+import world.bentobox.bentobox.util.Util;
import world.bentobox.border.Border;
/**
@@ -49,4 +52,20 @@ public void hideBorder(User user) {
user.getPlayer().setWorldBorder(null);
}
+ /**
+ * Teleport player back within the island space they are in
+ * @param p player
+ */
+ public void teleportPlayer(Player p) {
+ addon.getIslands().getIslandAt(p.getLocation()).ifPresent(i -> {
+ Vector unitVector = i.getCenter().toVector().subtract(p.getLocation().toVector()).normalize()
+ .multiply(new Vector(1, 0, 1));
+ // Get distance from border
+ Location to = p.getLocation().toVector().add(unitVector).toLocation(p.getWorld());
+ to.setPitch(p.getLocation().getPitch());
+ to.setYaw(p.getLocation().getYaw());
+ Util.teleportAsync(p, to, TeleportCause.PLUGIN);
+ });
+ }
+
}
diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml
new file mode 100644
index 0000000..f093450
--- /dev/null
+++ b/src/main/resources/plugin.yml
@@ -0,0 +1,9 @@
+name: BentoBox-Border
+main: world.bentobox.border.BorderPladdon
+version: ${project.version}${build.number}
+api-version: "1.21"
+
+authors: [tastybento]
+contributors: ["The BentoBoxWorld Community"]
+website: https://bentobox.world
+description: ${project.description}