From 3cb9a0e4dfa4a9bd1db98efedcd5f1bcf06d337e Mon Sep 17 00:00:00 2001 From: tastybento Date: Wed, 15 May 2019 14:18:51 -0700 Subject: [PATCH] Adds protection when pasting against unsupported blocks. Will fix signs and wall signs from 1.13 to 1.14. --- .../bentobox/blueprints/BlueprintPaster.java | 39 +++++++++++++++---- 1 file changed, 31 insertions(+), 8 deletions(-) diff --git a/src/main/java/world/bentobox/bentobox/blueprints/BlueprintPaster.java b/src/main/java/world/bentobox/bentobox/blueprints/BlueprintPaster.java index 844c38cd8..b151a6eea 100644 --- a/src/main/java/world/bentobox/bentobox/blueprints/BlueprintPaster.java +++ b/src/main/java/world/bentobox/bentobox/blueprints/BlueprintPaster.java @@ -1,5 +1,11 @@ package world.bentobox.bentobox.blueprints; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; + import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.Location; @@ -9,6 +15,7 @@ import org.bukkit.block.Block; import org.bukkit.block.BlockState; import org.bukkit.block.CreatureSpawner; import org.bukkit.block.Sign; +import org.bukkit.block.data.BlockData; import org.bukkit.entity.AbstractHorse; import org.bukkit.entity.Ageable; import org.bukkit.entity.ChestedHorse; @@ -22,6 +29,9 @@ import org.bukkit.scheduler.BukkitTask; import org.bukkit.util.Vector; import org.eclipse.jdt.annotation.NonNull; import org.eclipse.jdt.annotation.Nullable; + +import com.google.common.collect.ImmutableMap; + import world.bentobox.bentobox.BentoBox; import world.bentobox.bentobox.api.localization.TextVariables; import world.bentobox.bentobox.api.user.User; @@ -31,12 +41,6 @@ import world.bentobox.bentobox.blueprints.dataobjects.BlueprintEntity; import world.bentobox.bentobox.database.objects.Island; import world.bentobox.bentobox.util.Util; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; - /** * This class pastes the clipboard it is given * @author tastybento @@ -52,6 +56,8 @@ public class BlueprintPaster { CANCEL } + private Map BLOCK_CONVERSION = ImmutableMap.of("sign", "oak_sign", "wall_sign", "oak_wall_sign"); + private BentoBox plugin; // The minimum block position (x,y,z) private Location pos1; @@ -173,8 +179,25 @@ public class BlueprintPaster { Location pasteTo = location.clone().add(entry.getKey()); BlueprintBlock bpBlock = entry.getValue(); Block block = pasteTo.getBlock(); - // Set the block data - block.setBlockData(Bukkit.createBlockData(bpBlock.getBlockData())); + // Set the block data - default is AIR + BlockData bd = Bukkit.createBlockData(Material.AIR); + try { + bd = Bukkit.createBlockData(bpBlock.getBlockData()); + } catch (Exception e) { + // This may happen if the block type is no longer supported by the server + plugin.logWarning("Blueprint references materials not supported on this server version."); + plugin.logWarning("Load blueprint manually, check and save to fix for this server version."); + plugin.logWarning("World: " + world.getName() + " Failed block data: " + bpBlock.getBlockData()); + // Try to fix + for (Entry en : BLOCK_CONVERSION.entrySet()) { + if (bpBlock.getBlockData().startsWith("minecraft:" + en.getKey())) { + bd = Bukkit.createBlockData( + bpBlock.getBlockData().replace("minecraft:" + en.getKey(), "minecraft:" + en.getValue())); + break; + } + } + } + block.setBlockData(bd); setBlockState(island, block, bpBlock); // pos1 and pos2 update updatePos(world, entry.getKey());