mirror of
https://github.com/BentoBoxWorld/BentoBox.git
synced 2024-11-30 06:33:49 +01:00
Fixes Range Display command crashes.
Spigot in 1.18 introduce new way how block particles should be displayed. However, BentoBox never fully implemented it. To avoid such issues in-future, I added checks for each particle type that requires extra data object. Fixes #1989
This commit is contained in:
parent
85b52f4bfb
commit
d984955af3
@ -7,10 +7,9 @@ import java.util.Map;
|
|||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
import org.bukkit.Color;
|
import org.bukkit.Color;
|
||||||
import org.bukkit.Location;
|
import org.bukkit.Location;
|
||||||
|
import org.bukkit.Material;
|
||||||
import org.bukkit.Particle;
|
import org.bukkit.Particle;
|
||||||
|
|
||||||
import com.google.common.base.Enums;
|
|
||||||
|
|
||||||
import world.bentobox.bentobox.api.commands.CompositeCommand;
|
import world.bentobox.bentobox.api.commands.CompositeCommand;
|
||||||
import world.bentobox.bentobox.api.user.User;
|
import world.bentobox.bentobox.api.user.User;
|
||||||
import world.bentobox.bentobox.database.objects.Island;
|
import world.bentobox.bentobox.database.objects.Island;
|
||||||
@ -24,8 +23,6 @@ public class AdminRangeDisplayCommand extends CompositeCommand {
|
|||||||
private static final String DISPLAY = "display";
|
private static final String DISPLAY = "display";
|
||||||
private static final String SHOW = "show";
|
private static final String SHOW = "show";
|
||||||
private static final String HIDE = "hide";
|
private static final String HIDE = "hide";
|
||||||
// Since 1.18, the Particle.BARRIER was replaced by BLOCK_MARKER
|
|
||||||
private static final Particle BARRIER = Enums.getIfPresent(Particle.class, "BARRIER").or(Enums.getIfPresent(Particle.class, "BLOCK_MARKER").or(Particle.LAVA));
|
|
||||||
|
|
||||||
// Map of users to which ranges must be displayed
|
// Map of users to which ranges must be displayed
|
||||||
private final Map<User, Integer> displayRanges = new HashMap<>();
|
private final Map<User, Integer> displayRanges = new HashMap<>();
|
||||||
@ -75,7 +72,7 @@ public class AdminRangeDisplayCommand extends CompositeCommand {
|
|||||||
|
|
||||||
getIslands().getIslandAt(user.getLocation()).ifPresent(island -> {
|
getIslands().getIslandAt(user.getLocation()).ifPresent(island -> {
|
||||||
// Draw the island protected area
|
// Draw the island protected area
|
||||||
drawZone(user, BARRIER, null, island, island.getProtectionRange());
|
drawZone(user, Particle.BLOCK_MARKER, Material.BARRIER.createBlockData(), island, island.getProtectionRange());
|
||||||
|
|
||||||
// Draw the default protected area if island protected zone is different
|
// Draw the default protected area if island protected zone is different
|
||||||
if (island.getProtectionRange() != getPlugin().getIWM().getIslandProtectionRange(getWorld())) {
|
if (island.getProtectionRange() != getPlugin().getIWM().getIslandProtectionRange(getWorld())) {
|
||||||
@ -94,7 +91,7 @@ public class AdminRangeDisplayCommand extends CompositeCommand {
|
|||||||
displayRanges.remove(user);
|
displayRanges.remove(user);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void drawZone(User user, Particle particle, Particle.DustOptions dustOptions, Island island, int range) {
|
private void drawZone(User user, Particle particle, Object dustOptions, Island island, int range) {
|
||||||
Location center = island.getProtectionCenter();
|
Location center = island.getProtectionCenter();
|
||||||
// Get player Y coordinate
|
// Get player Y coordinate
|
||||||
int playerY = user.getPlayer().getLocation().getBlockY() + 1;
|
int playerY = user.getPlayer().getLocation().getBlockY() + 1;
|
||||||
|
@ -17,10 +17,13 @@ import org.bukkit.GameMode;
|
|||||||
import org.bukkit.Location;
|
import org.bukkit.Location;
|
||||||
import org.bukkit.OfflinePlayer;
|
import org.bukkit.OfflinePlayer;
|
||||||
import org.bukkit.Particle;
|
import org.bukkit.Particle;
|
||||||
|
import org.bukkit.Vibration;
|
||||||
import org.bukkit.World;
|
import org.bukkit.World;
|
||||||
|
import org.bukkit.block.data.BlockData;
|
||||||
import org.bukkit.command.CommandSender;
|
import org.bukkit.command.CommandSender;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
import org.bukkit.event.player.PlayerCommandPreprocessEvent;
|
import org.bukkit.event.player.PlayerCommandPreprocessEvent;
|
||||||
|
import org.bukkit.inventory.ItemStack;
|
||||||
import org.bukkit.inventory.PlayerInventory;
|
import org.bukkit.inventory.PlayerInventory;
|
||||||
import org.bukkit.permissions.PermissionAttachment;
|
import org.bukkit.permissions.PermissionAttachment;
|
||||||
import org.bukkit.permissions.PermissionAttachmentInfo;
|
import org.bukkit.permissions.PermissionAttachmentInfo;
|
||||||
@ -597,22 +600,90 @@ public class User implements MetaDataAble {
|
|||||||
* @param y Y coordinate of the particle to display.
|
* @param y Y coordinate of the particle to display.
|
||||||
* @param z Z coordinate of the particle to display.
|
* @param z Z coordinate of the particle to display.
|
||||||
*/
|
*/
|
||||||
public void spawnParticle(Particle particle, Particle.DustOptions dustOptions, double x, double y, double z) {
|
public void spawnParticle(Particle particle, Object dustOptions, double x, double y, double z)
|
||||||
if (particle.equals(Particle.REDSTONE) && dustOptions == null) {
|
{
|
||||||
// Security check that will avoid later unexpected exceptions.
|
// Improve particle validation.
|
||||||
throw new IllegalArgumentException("A non-null Particle.DustOptions must be provided when using Particle.REDSTONE as particle.");
|
switch (particle)
|
||||||
|
{
|
||||||
|
case REDSTONE ->
|
||||||
|
{
|
||||||
|
if (!(dustOptions instanceof Particle.DustOptions))
|
||||||
|
{
|
||||||
|
throw new IllegalArgumentException("A non-null Particle.DustOptions must be provided when using Particle.REDSTONE as particle.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case ITEM_CRACK ->
|
||||||
|
{
|
||||||
|
if (!(dustOptions instanceof ItemStack))
|
||||||
|
{
|
||||||
|
throw new IllegalArgumentException("A non-null ItemStack must be provided when using Particle.ITEM_CRACK as particle.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case BLOCK_CRACK, BLOCK_DUST, FALLING_DUST, BLOCK_MARKER ->
|
||||||
|
{
|
||||||
|
if (!(dustOptions instanceof BlockData))
|
||||||
|
{
|
||||||
|
throw new IllegalArgumentException("A non-null BlockData must be provided when using Particle." + particle + " as particle.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case DUST_COLOR_TRANSITION ->
|
||||||
|
{
|
||||||
|
if (!(dustOptions instanceof Particle.DustTransition))
|
||||||
|
{
|
||||||
|
throw new IllegalArgumentException("A non-null Particle.DustTransition must be provided when using Particle.DUST_COLOR_TRANSITION as particle.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case VIBRATION ->
|
||||||
|
{
|
||||||
|
if (!(dustOptions instanceof Vibration))
|
||||||
|
{
|
||||||
|
throw new IllegalArgumentException("A non-null Vibration must be provided when using Particle.VIBRATION as particle.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case SCULK_CHARGE ->
|
||||||
|
{
|
||||||
|
if (!(dustOptions instanceof Float))
|
||||||
|
{
|
||||||
|
throw new IllegalArgumentException("A non-null Float must be provided when using Particle.SCULK_CHARGE as particle.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case SHRIEK ->
|
||||||
|
{
|
||||||
|
if (!(dustOptions instanceof Integer))
|
||||||
|
{
|
||||||
|
throw new IllegalArgumentException("A non-null Integer must be provided when using Particle.SHRIEK as particle.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case LEGACY_BLOCK_CRACK, LEGACY_BLOCK_DUST, LEGACY_FALLING_DUST ->
|
||||||
|
{
|
||||||
|
if (!(dustOptions instanceof BlockData))
|
||||||
|
{
|
||||||
|
throw new IllegalArgumentException("A non-null MaterialData must be provided when using Particle." + particle + " as particle.");
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if this particle is beyond the viewing distance of the server
|
// Check if this particle is beyond the viewing distance of the server
|
||||||
if (player.getLocation().toVector().distanceSquared(new Vector(x,y,z)) < (Bukkit.getServer().getViewDistance()*256*Bukkit.getServer().getViewDistance())) {
|
if (this.player != null &&
|
||||||
if (particle.equals(Particle.REDSTONE)) {
|
this.player.getLocation().toVector().distanceSquared(new Vector(x, y, z)) <
|
||||||
|
(Bukkit.getServer().getViewDistance() * 256 * Bukkit.getServer().getViewDistance()))
|
||||||
|
{
|
||||||
|
if (particle.equals(Particle.REDSTONE))
|
||||||
|
{
|
||||||
player.spawnParticle(particle, x, y, z, 1, 0, 0, 0, 1, dustOptions);
|
player.spawnParticle(particle, x, y, z, 1, 0, 0, 0, 1, dustOptions);
|
||||||
} else {
|
}
|
||||||
|
else if (dustOptions != null)
|
||||||
|
{
|
||||||
|
player.spawnParticle(particle, x, y, z, 1, dustOptions);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
player.spawnParticle(particle, x, y, z, 1);
|
player.spawnParticle(particle, x, y, z, 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Spawn particles to the player.
|
* Spawn particles to the player.
|
||||||
* They are only displayed if they are within the server's view distance.
|
* They are only displayed if they are within the server's view distance.
|
||||||
|
Loading…
Reference in New Issue
Block a user