diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000..8ad0f56 Binary files /dev/null and b/.DS_Store differ diff --git a/pom.xml b/pom.xml index 7a992c2..ff504d2 100644 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ com.songoda UltimateRepairing 4.0.0 - 1.4 + 1.4.1 clean install UltimateRepairing-${project.version} diff --git a/src/main/java/com/songoda/ultimaterepairing/anvil/PlayerAnvilData.java b/src/main/java/com/songoda/ultimaterepairing/anvil/PlayerAnvilData.java index eba0b09..c0f3847 100644 --- a/src/main/java/com/songoda/ultimaterepairing/anvil/PlayerAnvilData.java +++ b/src/main/java/com/songoda/ultimaterepairing/anvil/PlayerAnvilData.java @@ -3,6 +3,7 @@ package com.songoda.ultimaterepairing.anvil; import com.songoda.ultimaterepairing.repair.RepairType; import org.bukkit.Location; import org.bukkit.entity.Item; +import org.bukkit.inventory.EquipmentSlot; import org.bukkit.inventory.ItemStack; public class PlayerAnvilData { @@ -12,6 +13,7 @@ public class PlayerAnvilData { private RepairType type; private Item item; private ItemStack toBeRepaired; + private EquipmentSlot slot = null; private Location locations; private boolean inRepair; private boolean beingRepaired; @@ -79,4 +81,12 @@ public class PlayerAnvilData { public void setBeingRepaired(boolean beingRepaired) { this.beingRepaired = beingRepaired; } + + public EquipmentSlot getSlot() { + return slot; + } + + public void setSlot(EquipmentSlot slot) { + this.slot = slot; + } } \ No newline at end of file diff --git a/src/main/java/com/songoda/ultimaterepairing/handlers/RepairHandler.java b/src/main/java/com/songoda/ultimaterepairing/handlers/RepairHandler.java index e68bc97..b33825c 100644 --- a/src/main/java/com/songoda/ultimaterepairing/handlers/RepairHandler.java +++ b/src/main/java/com/songoda/ultimaterepairing/handlers/RepairHandler.java @@ -2,6 +2,7 @@ package com.songoda.ultimaterepairing.handlers; import com.songoda.core.compatibility.CompatibleMaterial; import com.songoda.core.compatibility.CompatibleSound; +import com.songoda.core.compatibility.ServerVersion; import com.songoda.core.gui.GuiManager; import com.songoda.core.hooks.EconomyManager; import com.songoda.core.utils.PlayerUtils; @@ -14,6 +15,8 @@ import com.songoda.ultimaterepairing.utils.Methods; import org.bukkit.*; import org.bukkit.entity.Item; import org.bukkit.entity.Player; +import org.bukkit.inventory.EntityEquipment; +import org.bukkit.inventory.EquipmentSlot; import org.bukkit.inventory.ItemStack; import org.bukkit.metadata.FixedMetadataValue; import org.bukkit.util.Vector; @@ -47,7 +50,35 @@ public class RepairHandler { public void preRepair(ItemStack itemStack, Player player, RepairType type, Location anvil) { + // Get from Map, put new instance in Map if it doesn't exist + PlayerAnvilData playerData = playerAnvilData.computeIfAbsent(player.getUniqueId(), uuid -> new PlayerAnvilData()); + + EntityEquipment equipment = player.getEquipment(); + if (equipment != null) { + if (equipment.getItemInMainHand().equals(itemStack)) { + equipment.setItemInMainHand(null); + playerData.setSlot(EquipmentSlot.HAND); + } else if (itemStack.equals(equipment.getHelmet())) { + equipment.setHelmet(null); + playerData.setSlot(EquipmentSlot.HEAD); + } else if (itemStack.equals(equipment.getChestplate())) { + equipment.setChestplate(null); + playerData.setSlot(EquipmentSlot.CHEST); + } else if (itemStack.equals(equipment.getLeggings())) { + equipment.setLeggings(null); + playerData.setSlot(EquipmentSlot.LEGS); + } else if (itemStack.equals(equipment.getBoots())) { + equipment.setBoots(null); + playerData.setSlot(EquipmentSlot.FEET); + } else if (ServerVersion.isServerVersionAtLeast(ServerVersion.V1_9)) { + if (itemStack.equals(equipment.getItemInOffHand())) { + equipment.setItemInOffHand(null); + playerData.setSlot(EquipmentSlot.OFF_HAND); + } + } + } player.getInventory().removeItem(itemStack); + Item item = player.getWorld().dropItem(anvil.add(0.5, 2, 0.5), itemStack); // Support for EpicHoppers suction. @@ -62,8 +93,6 @@ public class RepairHandler { item.setPickupDelay(3600); item.setMetadata("UltimateRepairing", new FixedMetadataValue(instance, "")); - // Get from Map, put new instance in Map if it doesn't exist - PlayerAnvilData playerData = playerAnvilData.computeIfAbsent(player.getUniqueId(), uuid -> new PlayerAnvilData()); playerData.setItem(item); playerData.setToBeRepaired(itemStack); playerData.setLocations(anvil.add(0, -2, 0)); @@ -139,26 +168,28 @@ public class RepairHandler { Effect effect = Effect.STEP_SOUND; - Material blockType = Material.REDSTONE_BLOCK; + CompatibleMaterial blockType = CompatibleMaterial.REDSTONE_BLOCK; String typeStr = playerData.getToBeRepaired().getType().name().toUpperCase(); - if (typeStr.contains("DIAMOND")) { - blockType = Material.DIAMOND_BLOCK; + if (typeStr.contains("NETHERITE")) { + blockType = CompatibleMaterial.NETHERITE_BLOCK; + } else if (typeStr.contains("DIAMOND")) { + blockType = CompatibleMaterial.DIAMOND_BLOCK; } else if (typeStr.contains("IRON")) { - blockType = Material.IRON_BLOCK; + blockType = CompatibleMaterial.IRON_BLOCK; } else if (typeStr.contains("GOLD")) { - blockType = Material.GOLD_BLOCK; + blockType = CompatibleMaterial.GOLD_BLOCK; } else if (typeStr.contains("STONE")) { - blockType = Material.STONE; + blockType = CompatibleMaterial.STONE; } else if (typeStr.contains("WOOD")) { - blockType = CompatibleMaterial.OAK_WOOD.getMaterial(); + blockType = CompatibleMaterial.OAK_WOOD; } - final Material blockTypeFinal = blockType; + final Material blockTypeFinal = blockType.getMaterial(); Location location = playerData.getLocations(); - player.getWorld().playEffect(location, effect, blockType); + player.getWorld().playEffect(location, effect, blockType.getMaterial()); Runnable runnable = () -> player.getWorld().playEffect(location, effect, blockTypeFinal); Bukkit.getScheduler().scheduleSyncDelayedTask(instance, runnable, 5L); Bukkit.getScheduler().scheduleSyncDelayedTask(instance, () -> { @@ -175,17 +206,12 @@ public class RepairHandler { instance.getLocale().getMessage("event.repair.success").sendPrefixedMessage(player); playerData.getToBeRepaired().setDurability((short) 0); - HashMap items = player.getInventory().addItem(playerData.getToBeRepaired()); - for (ItemStack item : items.values()) { - player.getWorld().dropItemNaturally(player.getLocation(), item); - } + removeItem(playerData, player); - playerData.getItem().remove(); if (player.getGameMode() != GameMode.CREATIVE && type == RepairType.EXPERIENCE) { player.setLevel(player.getLevel() - playerData.getPrice()); } - this.playerAnvilData.remove(player.getUniqueId()); player.closeInventory(); }, 25L); return; @@ -208,8 +234,34 @@ public class RepairHandler { } public void removeItem(PlayerAnvilData playerData, Player player) { - PlayerUtils.giveItem(player, playerData.getToBeRepaired()); - playerData.getItem().remove(); + EquipmentSlot slot = playerData.getSlot(); + if (slot == null) + PlayerUtils.giveItem(player, playerData.getToBeRepaired()); + else if (player.getEquipment() != null) { + EntityEquipment equipment = player.getEquipment(); + ItemStack item = playerData.getToBeRepaired(); + switch (slot) { + case HAND: + equipment.setItemInMainHand(item); + break; + case OFF_HAND: + equipment.setItemInOffHand(item); + break; + case HEAD: + equipment.setHelmet(item); + break; + case CHEST: + equipment.setChestplate(item); + break; + case LEGS: + equipment.setLeggings(item); + break; + case FEET: + equipment.setBoots(item); + } + } + if (playerData.getItem() != null) + playerData.getItem().remove(); this.playerAnvilData.remove(player.getUniqueId()); }