/* * This file is part of MyPet * * Copyright © 2011-2016 Keyle * MyPet is licensed under the GNU Lesser General Public License. * * MyPet is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * MyPet is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package de.Keyle.MyPet.compat.v1_7_R4.util.inventory; import de.Keyle.MyPet.MyPetApi; import de.Keyle.MyPet.api.util.Compat; import de.keyle.knbt.TagByte; import de.keyle.knbt.TagCompound; import de.keyle.knbt.TagList; import net.minecraft.server.v1_7_R4.*; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.craftbukkit.v1_7_R4.CraftWorld; import org.bukkit.craftbukkit.v1_7_R4.entity.CraftHumanEntity; import org.bukkit.craftbukkit.v1_7_R4.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_7_R4.inventory.CraftItemStack; import org.bukkit.entity.HumanEntity; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.server.PluginDisableEvent; import org.bukkit.inventory.InventoryHolder; import java.util.ArrayList; import java.util.List; @Compat("v1_7_R4") public class CustomInventory implements IInventory, Listener, de.Keyle.MyPet.api.util.inventory.CustomInventory { private String inventroyName = null; private List<ItemStack> items = new ArrayList<>(); private int size = 0; private int stackSize = 64; private List<HumanEntity> transaction = new ArrayList<>(); public CustomInventory() { Bukkit.getPluginManager().registerEvents(this, MyPetApi.getPlugin()); } public CustomInventory(int size, String name) { Bukkit.getPluginManager().registerEvents(this, MyPetApi.getPlugin()); setSize(size); setName(name); } public int getSize() { return size; } public void setSize(int size) { this.size = size; for (int i = items.size(); i < size; i++) { items.add(i, null); } } public String getInventoryName() { return inventroyName; } @Override public boolean k_() { return true; } public String getName() { return inventroyName; } public void setName(String name) { if (name != null && name.length() > 64) { name = name.substring(0, 64); } this.inventroyName = name; } public ItemStack getItem(int i) { if (i < size) { return items.get(i); } return null; } public void setItem(int i, ItemStack itemStack) { if (i < items.size()) { items.set(i, itemStack); } else { for (int x = items.size(); x < i; x++) { items.add(x, null); } items.add(i, itemStack); } update(); } public int addItem(org.bukkit.inventory.ItemStack itemAdd) { if (itemAdd == null) { return 0; } itemAdd = itemAdd.clone(); for (int i = 0; i < this.getSize(); i++) { CraftItemStack craftItem = CraftItemStack.asCraftMirror(getItem(i)); if (ItemStackComparator.compareItem(itemAdd, craftItem)) { if (craftItem.getAmount() >= craftItem.getMaxStackSize()) { continue; } while (craftItem.getAmount() < craftItem.getMaxStackSize() && itemAdd.getAmount() > 0) { craftItem.setAmount(craftItem.getAmount() + 1); itemAdd.setAmount(itemAdd.getAmount() - 1); } if (itemAdd.getAmount() == 0) { break; } } } if (itemAdd.getAmount() > 0) { for (int i = 0; i < this.getSize(); i++) { if (getItem(i) == null) { if (itemAdd.getAmount() <= itemAdd.getMaxStackSize()) { setItem(i, CraftItemStack.asNMSCopy(itemAdd.clone())); itemAdd.setAmount(0); break; } else { CraftItemStack itemStack = (CraftItemStack) itemAdd.clone(); itemStack.setAmount(itemStack.getMaxStackSize()); setItem(i, CraftItemStack.asNMSCopy(itemStack)); itemAdd.setAmount(itemAdd.getAmount() - itemStack.getMaxStackSize()); } if (itemAdd.getAmount() == 0) { break; } } } } return itemAdd.getAmount(); } public void dropContentAt(Location loc) { World world = ((CraftWorld) loc.getWorld()).getHandle(); for (int i = 0; i < this.getSize(); i++) { ItemStack is = this.splitWithoutUpdate(i); if (is != null) { is = is.cloneItemStack(); EntityItem itemEntity = new EntityItem(world, loc.getX(), loc.getY(), loc.getZ(), is); itemEntity.pickupDelay = 20; world.addEntity(itemEntity); } } } public ItemStack splitStack(int slot, int subtract) { if (slot < size && items.get(slot) != null) { if (items.get(slot).count <= subtract) { ItemStack itemStack = items.get(slot); items.set(slot, null); return itemStack; } else { ItemStack itemStack = items.get(slot); // -------------------------------------------------------------------------------------------- // ToDo: replace with cloneAndSubtract(int i) on next Bukkit revision ItemStack splittedStack = new ItemStack(itemStack.getItem(), subtract, itemStack.getData()); if (itemStack.getTag() != null) { splittedStack.setTag(((NBTTagCompound) itemStack.getTag().clone())); } itemStack.count -= subtract; // -------------------------------------------------------------------------------------------- if (items.get(slot).count == 0) { items.set(slot, null); } return splittedStack; } } return null; } public ItemStack[] getContents() { ItemStack[] itemStack = new ItemStack[getSize()]; for (int i = 0; i < getSize(); i++) { itemStack[i] = items.get(i); } return itemStack; } public TagCompound save(TagCompound compound) { List<TagCompound> itemList = new ArrayList<>(); for (int i = 0; i < this.items.size(); i++) { ItemStack itemStack = this.items.get(i); if (itemStack != null) { TagCompound item = ItemStackNBTConverter.itemStackToCompund(itemStack); item.getCompoundData().put("Slot", new TagByte((byte) i)); itemList.add(item); } } compound.getCompoundData().put("Items", new TagList(itemList)); return compound; } public void load(TagCompound nbtTagCompound) { TagList items = nbtTagCompound.getAs("Items", TagList.class); for (int i = 0; i < items.size(); i++) { TagCompound itemCompound = items.getTagAs(i, TagCompound.class); ItemStack itemStack = ItemStackNBTConverter.compundToItemStack(itemCompound); setItem(itemCompound.getAs("Slot", TagByte.class).getByteData(), itemStack); } } public boolean a(EntityHuman entityHuman) { return true; } @Override public void startOpen() { } @Override public void closeContainer() { } public void onOpen(CraftHumanEntity who) { this.transaction.add(who); } public void onClose(CraftHumanEntity who) { this.transaction.remove(who); if (items.size() > this.size) { for (int counterOutside = items.size() - 1; counterOutside >= this.size; counterOutside--) { if (items.get(counterOutside) != null) { for (int counterInside = 0; counterInside < size; counterInside++) { if (items.get(counterInside) == null) { items.set(counterInside, items.get(counterOutside)); items.set(counterOutside, null); } } } if (items.get(counterOutside) == null) { items.remove(counterOutside); } } } } @EventHandler void onPluginDisable(PluginDisableEvent event) { if (event.getPlugin().equals(MyPetApi.getPlugin())) { close(); } } public void close() { if (transaction.size() > 0) { for (HumanEntity humanEntity : new ArrayList<>(transaction)) { humanEntity.closeInventory(); } } } @Override public void open(Player player) { EntityPlayer eh = ((CraftPlayer) player).getHandle(); eh.openContainer(this); } public List<HumanEntity> getViewers() { return this.transaction; } public InventoryHolder getOwner() { return null; } public int getMaxStackSize() { return stackSize; } public void setMaxStackSize(int i) { this.stackSize = i; } public ItemStack splitWithoutUpdate(int i) { if (items.get(i) != null) { ItemStack itemstack = items.get(i); items.set(i, null); return itemstack; } return null; } public void update() { } public boolean b(int paramInt, ItemStack paramItemStack) { return true; } }