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}