Skip to content

Commit

Permalink
make inventory sets not fail on offline players
Browse files Browse the repository at this point in the history
using the power of NMS
  • Loading branch information
mcmonkey4eva committed Sep 2, 2019
1 parent 76a0abd commit db95e46
Show file tree
Hide file tree
Showing 7 changed files with 43 additions and 23 deletions.
Expand Up @@ -5,27 +5,32 @@
import com.denizenscript.denizen.nms.util.jnbt.Tag;
import org.bukkit.Color;
import org.bukkit.Material;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import org.bukkit.potion.PotionEffect;
import org.bukkit.potion.PotionEffectType;

public interface ItemHelper {
public abstract class ItemHelper {

String getInternalNameFromMaterial(Material material);
public abstract String getInternalNameFromMaterial(Material material);

Material getMaterialFromInternalName(String internalName);
public abstract Material getMaterialFromInternalName(String internalName);

String getJsonString(ItemStack itemStack);
public abstract String getJsonString(ItemStack itemStack);

PlayerProfile getSkullSkin(ItemStack itemStack);
public abstract PlayerProfile getSkullSkin(ItemStack itemStack);

ItemStack setSkullSkin(ItemStack itemStack, PlayerProfile playerProfile);
public abstract ItemStack setSkullSkin(ItemStack itemStack, PlayerProfile playerProfile);

ItemStack addNbtData(ItemStack itemStack, String key, Tag value);
public abstract ItemStack addNbtData(ItemStack itemStack, String key, Tag value);

CompoundTag getNbtData(ItemStack itemStack);
public abstract CompoundTag getNbtData(ItemStack itemStack);

ItemStack setNbtData(ItemStack itemStack, CompoundTag compoundTag);
public abstract ItemStack setNbtData(ItemStack itemStack, CompoundTag compoundTag);

PotionEffect getPotionEffect(PotionEffectType type, int duration, int amplifier, boolean ambient, boolean particles, Color color, boolean icon);
public abstract PotionEffect getPotionEffect(PotionEffectType type, int duration, int amplifier, boolean ambient, boolean particles, Color color, boolean icon);

public void setInventoryItem(Inventory inventory, ItemStack item, int slot) {
inventory.setItem(slot, item);
}
}
Expand Up @@ -433,15 +433,15 @@ public boolean removeItem(ItemTag item, int amount) {
String newItem = CoreUtilities.toLowerCase(ItemTag.valueOf(new ItemTag(is).getFullString(), false).getFullString());
if (myItem.equals(newItem)) {
if (count <= amount) {
inventory.setItem(i, null);
NMSHandler.getItemHelper().setInventoryItem(inventory, null, i);
amount -= count;
if (amount == 0) {
return true;
}
}
else if (count > amount) {
is.setAmount(count - amount);
inventory.setItem(i, is);
NMSHandler.getItemHelper().setInventoryItem(inventory, is, i);
return true;
}
}
Expand Down Expand Up @@ -763,12 +763,12 @@ public InventoryTag add(int slot, ItemStack... items) {
if (amount > max) {
ItemStack clone = item.clone();
clone.setAmount(max);
inventory.setItem(firstFree, clone);
NMSHandler.getItemHelper().setInventoryItem(inventory, clone, firstFree);
item.setAmount(amount -= max);
}
else {
// Just store it
inventory.setItem(firstFree, item);
NMSHandler.getItemHelper().setInventoryItem(inventory, item, firstFree);
break;
}
}
Expand Down Expand Up @@ -835,12 +835,12 @@ public List<ItemStack> addWithLeftovers(int slot, boolean keepMaxStackSize, Item
if (amount > max) {
ItemStack clone = item.clone();
clone.setAmount(max);
inventory.setItem(firstFree, clone);
NMSHandler.getItemHelper().setInventoryItem(inventory, clone, firstFree);
item.setAmount(amount -= max);
}
else {
// Just store it
inventory.setItem(firstFree, item);
NMSHandler.getItemHelper().setInventoryItem(inventory, item, firstFree);
break;
}
}
Expand Down Expand Up @@ -878,7 +878,7 @@ public List<ItemStack> setWithLeftovers(int slot, ItemStack... items) {
for (int i = 0; i < items.length; i++) {
ItemStack item = items[i];
try {
inventory.setItem(i + slot, item);
NMSHandler.getItemHelper().setInventoryItem(inventory, item, i + slot);
}
catch (Exception e) {
leftovers.add(i + slot, item);
Expand Down Expand Up @@ -1178,13 +1178,13 @@ public InventoryTag setSlots(int slot, ItemStack[] items, int c) {

for (int i = 0; i < c; i++) {
if (i >= items.length || items[i] == null) {
inventory.setItem(slot + i, new ItemStack(Material.AIR));
NMSHandler.getItemHelper().setInventoryItem(inventory, new ItemStack(Material.AIR), slot + i);
}
ItemStack item = items[i];
if (slot + i < 0 || slot + i >= inventory.getSize()) {
break;
}
inventory.setItem(slot + i, item);
NMSHandler.getItemHelper().setInventoryItem(inventory, item, slot + i);
}
if (Depends.citizens != null && NPCTag.matches(idHolder)) { // TODO: Directly store holder
NPCTag.valueOf(idHolder).getInventoryTrait().setContents(inventory.getContents());
Expand Down
@@ -1,5 +1,6 @@
package com.denizenscript.denizen.scripts.commands.item;

import com.denizenscript.denizen.nms.NMSHandler;
import com.denizenscript.denizen.utilities.Conversion;
import com.denizenscript.denizen.utilities.Utilities;
import com.denizenscript.denizen.utilities.debugging.Debug;
Expand Down Expand Up @@ -342,7 +343,7 @@ public void execute(final ScriptEntry scriptEntry) {
case ADJUST:
ItemTag toAdjust = new ItemTag(destination.getInventory().getItem(slotId));
toAdjust.safeAdjust(new Mechanism(mechanism, mechanismValue, scriptEntry.entryData.getTagContext()));
destination.getInventory().setItem(slotId, toAdjust.getItemStack());
NMSHandler.getItemHelper().setInventoryItem(destination.getInventory(), toAdjust.getItemStack(), slotId);
break;
}
}
Expand Down
@@ -1,5 +1,6 @@
package com.denizenscript.denizen.scripts.commands.item;

import com.denizenscript.denizen.nms.NMSHandler;
import com.denizenscript.denizen.scripts.containers.core.BookScriptContainer;
import com.denizenscript.denizen.utilities.Utilities;
import com.denizenscript.denizen.utilities.debugging.Debug;
Expand Down Expand Up @@ -237,6 +238,7 @@ private void equipBook(Player player, ItemStack book) {
}
// move current held item to empty spot, set item in hand to the book
else {
NMSHandler.getItemHelper().setInventoryItem(inv, currItem, emptySpot);
inv.setItem(emptySpot, currItem);
player.setItemInHand(book);
Debug.log("...added book to player hand, moved original item");
Expand Down
Expand Up @@ -19,7 +19,7 @@

import java.util.HashMap;

public class ItemHelperImpl implements ItemHelper {
public class ItemHelperImpl extends ItemHelper {

@Override
public String getInternalNameFromMaterial(Material material) {
Expand Down
Expand Up @@ -19,7 +19,7 @@

import java.util.HashMap;

public class ItemHelperImpl implements ItemHelper {
public class ItemHelperImpl extends ItemHelper {

@Override
public String getInternalNameFromMaterial(Material material) {
Expand Down
Expand Up @@ -12,14 +12,16 @@
import net.minecraft.server.v1_14_R1.NBTTagCompound;
import org.bukkit.Color;
import org.bukkit.Material;
import org.bukkit.craftbukkit.v1_14_R1.inventory.CraftInventory;
import org.bukkit.craftbukkit.v1_14_R1.inventory.CraftItemStack;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import org.bukkit.potion.PotionEffect;
import org.bukkit.potion.PotionEffectType;

import java.util.*;

public class ItemHelperImpl implements ItemHelper {
public class ItemHelperImpl extends ItemHelper {

@Override
public String getInternalNameFromMaterial(Material material) {
Expand Down Expand Up @@ -104,4 +106,14 @@ public ItemStack setNbtData(ItemStack itemStack, CompoundTag compoundTag) {
public PotionEffect getPotionEffect(PotionEffectType type, int duration, int amplifier, boolean ambient, boolean particles, Color color, boolean icon) {
return new PotionEffect(type, duration, amplifier, ambient, particles, icon);
}

@Override
public void setInventoryItem(Inventory inventory, ItemStack item, int slot) {
if (inventory instanceof CraftInventory) {
((CraftInventory) inventory).getInventory().setItem(slot, CraftItemStack.asNMSCopy(item));
}
else {
inventory.setItem(slot, item);
}
}
}

0 comments on commit db95e46

Please sign in to comment.