mirror of
https://github.com/songoda/SongodaCore.git
synced 2024-12-04 16:03:35 +01:00
Large update to CompatibleHand.
This commit is contained in:
parent
6c5b11f15a
commit
0f16d7d53c
@ -1,6 +1,12 @@
|
|||||||
package com.songoda.core.compatibility;
|
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.EquipmentSlot;
|
||||||
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
|
||||||
import java.lang.reflect.InvocationTargetException;
|
import java.lang.reflect.InvocationTargetException;
|
||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
@ -32,11 +38,118 @@ public enum CompatibleHand {
|
|||||||
}
|
}
|
||||||
EquipmentSlot slot = (EquipmentSlot) method.invoke(event);
|
EquipmentSlot slot = (EquipmentSlot) method.invoke(event);
|
||||||
if (slot == EquipmentSlot.OFF_HAND) return OFF_HAND;
|
if (slot == EquipmentSlot.OFF_HAND) return OFF_HAND;
|
||||||
} catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException ignored) {}
|
} catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException ignored) {
|
||||||
|
}
|
||||||
return MAIN_HAND;
|
return MAIN_HAND;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static CompatibleHand getHand(EquipmentSlot equipmentSlot) {
|
public static CompatibleHand getHand(EquipmentSlot equipmentSlot) {
|
||||||
return equipmentSlot == EquipmentSlot.HAND ? MAIN_HAND : OFF_HAND;
|
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 player player to grab item from
|
||||||
* @param hand the hand to take the item from.
|
* @param hand the hand to take the item from.
|
||||||
*/
|
*/
|
||||||
|
@Deprecated
|
||||||
public static void takeActiveItem(Player player, CompatibleHand hand) {
|
public static void takeActiveItem(Player player, CompatibleHand hand) {
|
||||||
takeActiveItem(player, hand, 1);
|
takeActiveItem(player, hand, 1);
|
||||||
}
|
}
|
||||||
@ -404,17 +405,9 @@ public class ItemUtils {
|
|||||||
* @param hand the hand to take the item from.
|
* @param hand the hand to take the item from.
|
||||||
* @param amount number of items to use up
|
* @param amount number of items to use up
|
||||||
*/
|
*/
|
||||||
|
@Deprecated
|
||||||
public static void takeActiveItem(Player player, CompatibleHand hand, int amount) {
|
public static void takeActiveItem(Player player, CompatibleHand hand, int amount) {
|
||||||
ItemStack item = hand == CompatibleHand.MAIN_HAND
|
hand.takeItem(player, amount);
|
||||||
? 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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Loading…
Reference in New Issue
Block a user