mirror of
https://github.com/songoda/SongodaCore.git
synced 2024-12-03 15:33:32 +01:00
Large update to CompatibleHand.
This commit is contained in:
parent
6c5b11f15a
commit
0f16d7d53c
@ -1,6 +1,12 @@
|
||||
package com.songoda.core.compatibility;
|
||||
|
||||
import com.songoda.core.utils.NMSUtils;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.GameMode;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.player.PlayerItemBreakEvent;
|
||||
import org.bukkit.inventory.EquipmentSlot;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
import java.lang.reflect.Method;
|
||||
@ -32,11 +38,118 @@ public enum CompatibleHand {
|
||||
}
|
||||
EquipmentSlot slot = (EquipmentSlot) method.invoke(event);
|
||||
if (slot == EquipmentSlot.OFF_HAND) return OFF_HAND;
|
||||
} catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException ignored) {}
|
||||
} catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException ignored) {
|
||||
}
|
||||
return MAIN_HAND;
|
||||
}
|
||||
|
||||
public static CompatibleHand getHand(EquipmentSlot equipmentSlot) {
|
||||
return equipmentSlot == EquipmentSlot.HAND ? MAIN_HAND : OFF_HAND;
|
||||
}
|
||||
|
||||
/**
|
||||
* Use up whatever item the player is holding in their main hand
|
||||
*
|
||||
* @param player player to grab item from
|
||||
*/
|
||||
public void takeItem(Player player) {
|
||||
takeItem(player, 1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Use up whatever item the player is holding in their main hand
|
||||
*
|
||||
* @param player player to grab item from
|
||||
* @param amount number of items to use up
|
||||
*/
|
||||
public void takeItem(Player player, int amount) {
|
||||
ItemStack item = this == CompatibleHand.MAIN_HAND
|
||||
? player.getInventory().getItemInHand() : player.getInventory().getItemInOffHand();
|
||||
|
||||
int result = item.getAmount() - amount;
|
||||
item.setAmount(result);
|
||||
|
||||
if (this == CompatibleHand.MAIN_HAND)
|
||||
player.setItemInHand(result > 0 ? item : null);
|
||||
else
|
||||
player.getInventory().setItemInOffHand(result > 0 ? item : null);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get item in the selected hand
|
||||
*
|
||||
* @param player the player to get the item from
|
||||
* @return the item
|
||||
*/
|
||||
public ItemStack getItem(Player player) {
|
||||
if (this == MAIN_HAND)
|
||||
return player.getItemInHand();
|
||||
else
|
||||
return player.getInventory().getItemInOffHand();
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the item in the selected hand
|
||||
*
|
||||
* @param player the player to set the item of
|
||||
* @param item the item to set
|
||||
*/
|
||||
public void setItem(Player player, ItemStack item) {
|
||||
if (this == MAIN_HAND)
|
||||
player.setItemInHand(item);
|
||||
else
|
||||
player.getInventory().setItemInOffHand(item);
|
||||
}
|
||||
|
||||
private static Class<?> cb_CraftPlayer;
|
||||
private static Method getHandle, playBreak, asNMSCopy;
|
||||
|
||||
/**
|
||||
* Damage the selected item
|
||||
*
|
||||
* @param player the player who's item you want to damage
|
||||
* @param damage the amount of damage to apply to the item
|
||||
*/
|
||||
public void damageItem(Player player, short damage) {
|
||||
if (player.getGameMode() == GameMode.CREATIVE) return;
|
||||
|
||||
if (cb_CraftPlayer == null) {
|
||||
try {
|
||||
cb_CraftPlayer = NMSUtils.getCraftClass("entity.CraftPlayer");
|
||||
Class<?> mc_EntityLiving = NMSUtils.getNMSClass("EntityLiving");
|
||||
Class<?> cb_ItemStack = NMSUtils.getCraftClass("inventory.CraftItemStack");
|
||||
Class<?> mc_ItemStack = NMSUtils.getNMSClass("ItemStack");
|
||||
getHandle = cb_CraftPlayer.getMethod("getHandle");
|
||||
if (ServerVersion.isServerVersionAtLeast(ServerVersion.V1_13))
|
||||
playBreak = mc_EntityLiving.getDeclaredMethod("a", mc_ItemStack, int.class); //Consistent from 1.16-1.13
|
||||
else
|
||||
playBreak = mc_EntityLiving.getDeclaredMethod("b", mc_ItemStack); //Consistent from 1.12-1.8
|
||||
playBreak.setAccessible(true);
|
||||
asNMSCopy = cb_ItemStack.getDeclaredMethod("asNMSCopy", ItemStack.class);
|
||||
} catch (NoSuchMethodException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
ItemStack item = getItem(player);
|
||||
|
||||
short newDurability = (short) (item.getDurability() + damage);
|
||||
|
||||
if (newDurability >= item.getType().getMaxDurability()) {
|
||||
PlayerItemBreakEvent breakEvent = new PlayerItemBreakEvent(player, item);
|
||||
Bukkit.getServer().getPluginManager().callEvent(breakEvent);
|
||||
try {
|
||||
if (playBreak.getParameterCount() == 2)
|
||||
playBreak.invoke(getHandle.invoke(cb_CraftPlayer.cast(player)), asNMSCopy.invoke(null, item), 1);
|
||||
else
|
||||
playBreak.invoke(getHandle.invoke(cb_CraftPlayer.cast(player)), asNMSCopy.invoke(item));
|
||||
} catch (IllegalAccessException | InvocationTargetException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
setItem(player, null);
|
||||
return;
|
||||
}
|
||||
|
||||
item.setDurability(newDurability);
|
||||
}
|
||||
}
|
||||
|
@ -393,6 +393,7 @@ public class ItemUtils {
|
||||
* @param player player to grab item from
|
||||
* @param hand the hand to take the item from.
|
||||
*/
|
||||
@Deprecated
|
||||
public static void takeActiveItem(Player player, CompatibleHand hand) {
|
||||
takeActiveItem(player, hand, 1);
|
||||
}
|
||||
@ -404,17 +405,9 @@ public class ItemUtils {
|
||||
* @param hand the hand to take the item from.
|
||||
* @param amount number of items to use up
|
||||
*/
|
||||
@Deprecated
|
||||
public static void takeActiveItem(Player player, CompatibleHand hand, int amount) {
|
||||
ItemStack item = hand == CompatibleHand.MAIN_HAND
|
||||
? player.getInventory().getItemInHand() : player.getInventory().getItemInOffHand();
|
||||
|
||||
int result = item.getAmount() - amount;
|
||||
item.setAmount(result);
|
||||
|
||||
if (hand == CompatibleHand.MAIN_HAND)
|
||||
player.setItemInHand(result > 0 ? item : null);
|
||||
else
|
||||
player.getInventory().setItemInOffHand(result > 0 ? item : null);
|
||||
hand.takeItem(player, amount);
|
||||
}
|
||||
|
||||
/**
|
||||
|
Loading…
Reference in New Issue
Block a user