Skip to content

Commit

Permalink
Fixes #142 when players can die from falling into barrier (#143)
Browse files Browse the repository at this point in the history
  • Loading branch information
tastybento authored Jan 12, 2025
1 parent 2cd874d commit 9ba484b
Show file tree
Hide file tree
Showing 5 changed files with 68 additions and 8 deletions.
10 changes: 10 additions & 0 deletions src/main/java/world/bentobox/border/PerPlayerBorderProxy.java
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}

}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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);

}
20 changes: 18 additions & 2 deletions src/main/java/world/bentobox/border/listeners/PlayerListener.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;

Expand Down Expand Up @@ -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()));
Expand Down Expand Up @@ -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)) {
Expand Down
19 changes: 14 additions & 5 deletions src/main/java/world/bentobox/border/listeners/ShowBarrier.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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);
Expand All @@ -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());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;

/**
Expand Down Expand Up @@ -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);
});
}

}

0 comments on commit 9ba484b

Please sign in to comment.