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());
}