UltimateStacker/UltimateStacker/src/main/java/com.craftaro.ultimatestacker/stackable/item/StackedItemImpl.java

124 lines
3.8 KiB
Java

package com.craftaro.ultimatestacker.stackable.item;
import com.craftaro.ultimatestacker.UltimateStacker;
import com.craftaro.ultimatestacker.api.stack.item.StackedItem;
import com.craftaro.ultimatestacker.settings.Settings;
import com.craftaro.ultimatestacker.utils.Methods;
import com.songoda.core.utils.TextUtils;
import org.bukkit.Material;
import org.bukkit.entity.Item;
import org.bukkit.inventory.ItemStack;
import org.bukkit.metadata.FixedMetadataValue;
public class StackedItemImpl implements StackedItem {
private final Item item;
public StackedItemImpl(Item item) {
this.item = item;
}
public StackedItemImpl(Item item, int amount) {
this.item = item;
setAmount(amount);
}
@Override
public int getAmount() {
ItemStack itemStack = item.getItemStack();
int amount = itemStack.getAmount();
if (item.hasMetadata("US_AMT")) {
return item.getMetadata("US_AMT").get(0).asInt();
} else {
return amount;
}
}
@Override
public void setAmount(int amount) {
updateItemAmount(item, amount);
}
@Override
public void add(int amount) {
updateItemAmount(item, getAmount() + amount);
}
@Override
public void take(int amount) {
//check that amount not go below 0
if (getAmount() - amount < 0) {
amount = 0;
}
updateItemAmount(item, getAmount() - amount);
}
private void updateItemAmount(Item item, int newAmount) {
updateItemAmount(item, item.getItemStack(), newAmount);
}
/**
* Change the stacked amount for this item
*
* @param item item entity to update
* @param itemStack StackedItem that will represent this item
* @param newAmount number of items this item represents
*/
private void updateItemAmount(Item item, ItemStack itemStack, int newAmount) {
boolean blacklisted = UltimateStacker.isMaterialBlacklisted(itemStack);
if (newAmount > (itemStack.getMaxStackSize() / 2) && !blacklisted) {
itemStack.setAmount(Math.max(1, itemStack.getMaxStackSize() / 2));
} else {
itemStack.setAmount(newAmount);
}
// If amount is 0, Minecraft change the type to AIR
if (itemStack.getType() == Material.AIR) {
return;
}
updateItemMeta(item, itemStack, newAmount);
}
private void updateItemMeta(Item item, ItemStack itemStack, int newAmount) {
Material material = itemStack.getType();
if (material == Material.AIR)
return;
String name = TextUtils.convertToInvisibleString("IS") + Methods.compileItemName(itemStack, newAmount);
boolean blacklisted = UltimateStacker.isMaterialBlacklisted(itemStack);
if (newAmount > (itemStack.getMaxStackSize() / 2) && !blacklisted) {
item.setMetadata("US_AMT", new FixedMetadataValue(UltimateStacker.getInstance(), newAmount));
} else {
item.removeMetadata("US_AMT", UltimateStacker.getInstance());
}
item.setItemStack(itemStack);
if ((blacklisted && !Settings.ITEM_HOLOGRAM_BLACKLIST.getBoolean())
|| !UltimateStacker.getInstance().getItemFile().getBoolean("Items." + material + ".Has Hologram")
|| !Settings.ITEM_HOLOGRAMS.getBoolean()
|| newAmount < Settings.ITEM_MIN_HOLOGRAM_SIZE.getInt())
return;
item.setCustomName(name);
item.setCustomNameVisible(true);
}
@Override
public Item getItem() {
return item;
}
@Override
public Item destroy() {
item.removeMetadata("US_AMT", UltimateStacker.getInstance());
item.setCustomName(null);
item.setCustomNameVisible(true);
return item;
}
}