diff options
Diffstat (limited to 'src/main/java/kubatech/api/DynamicInventory.java')
-rw-r--r-- | src/main/java/kubatech/api/DynamicInventory.java | 469 |
1 files changed, 0 insertions, 469 deletions
diff --git a/src/main/java/kubatech/api/DynamicInventory.java b/src/main/java/kubatech/api/DynamicInventory.java deleted file mode 100644 index ef89c3a341..0000000000 --- a/src/main/java/kubatech/api/DynamicInventory.java +++ /dev/null @@ -1,469 +0,0 @@ -package kubatech.api; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.function.Supplier; - -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.item.ItemStack; -import net.minecraft.util.EnumChatFormatting; - -import org.lwjgl.opengl.GL11; - -import com.gtnewhorizons.modularui.api.GlStateManager; -import com.gtnewhorizons.modularui.api.ModularUITextures; -import com.gtnewhorizons.modularui.api.drawable.IDrawable; -import com.gtnewhorizons.modularui.api.drawable.ItemDrawable; -import com.gtnewhorizons.modularui.api.drawable.Text; -import com.gtnewhorizons.modularui.api.drawable.UITexture; -import com.gtnewhorizons.modularui.api.math.Alignment; -import com.gtnewhorizons.modularui.api.math.Color; -import com.gtnewhorizons.modularui.api.screen.ModularWindow; -import com.gtnewhorizons.modularui.api.screen.UIBuildContext; -import com.gtnewhorizons.modularui.api.widget.Widget; -import com.gtnewhorizons.modularui.common.internal.Theme; -import com.gtnewhorizons.modularui.common.internal.wrapper.ModularGui; -import com.gtnewhorizons.modularui.common.widget.ButtonWidget; -import com.gtnewhorizons.modularui.common.widget.ChangeableWidget; -import com.gtnewhorizons.modularui.common.widget.DynamicPositionedRow; -import com.gtnewhorizons.modularui.common.widget.FakeSyncWidget; -import com.gtnewhorizons.modularui.common.widget.Scrollable; -import com.kuba6000.mobsinfo.api.utils.ItemID; - -import kubatech.api.helpers.GTHelper; -import kubatech.api.utils.ModUtils; - -public class DynamicInventory<T> { - - int width, height; - Supplier<Integer> slotsGetter; - private int slots = 0; - private int usedSlots = 0; - List<T> inventory; - TInventoryGetter<T> inventoryGetter; - TInventoryInjector inventoryInjector = null; - TInventoryExtractor<T> inventoryExtractor = null; - TInventoryReplacerOrMerger inventoryReplacer = null; - Supplier<Boolean> isEnabledGetter = null; - boolean isEnabled = true; - - public DynamicInventory(int width, int height, Supplier<Integer> slotsGetter, List<T> inventory, - TInventoryGetter<T> inventoryGetter) { - this.width = width; - this.height = height; - this.slotsGetter = slotsGetter; - this.inventory = inventory; - this.inventoryGetter = inventoryGetter; - } - - public DynamicInventory<T> allowInventoryInjection(TInventoryInjector inventoryInjector) { - this.inventoryInjector = inventoryInjector; - return this; - } - - public DynamicInventory<T> allowInventoryExtraction(TInventoryExtractor<T> inventoryExtractor) { - this.inventoryExtractor = inventoryExtractor; - return this; - } - - public DynamicInventory<T> allowInventoryReplace(TInventoryReplacerOrMerger inventoryReplacer) { - this.inventoryReplacer = inventoryReplacer; - return this; - } - - public DynamicInventory<T> setEnabled(Supplier<Boolean> isEnabled) { - this.isEnabledGetter = isEnabled; - return this; - } - - public UITexture getItemSlot() { - return ModularUITextures.ITEM_SLOT; - } - - @SuppressWarnings("UnstableApiUsage") - public Widget asWidget(ModularWindow.Builder builder, UIBuildContext buildContext) { - ChangeableWidget container = new ChangeableWidget(() -> createWidget(buildContext.getPlayer())); - - // TODO: Only reset the widget when there are more slot stacks, otherwise just refresh them somehow - - container.attachSyncer(new FakeSyncWidget.IntegerSyncer(() -> { - if (slots != slotsGetter.get()) { - slots = slotsGetter.get(); - container.notifyChangeNoSync(); - } - return slots; - }, i -> { - if (slots != i) { - slots = i; - container.notifyChangeNoSync(); - } - }), builder) - .attachSyncer(new FakeSyncWidget.IntegerSyncer(() -> { - if (usedSlots != inventory.size()) { - usedSlots = inventory.size(); - container.notifyChangeNoSync(); - } - return usedSlots; - }, i -> { - if (usedSlots != i) { - usedSlots = i; - container.notifyChangeNoSync(); - } - }), builder) - .attachSyncer(new FakeSyncWidget.ListSyncer<>(() -> { - HashMap<ItemID, Integer> itemMap = new HashMap<>(); - HashMap<ItemID, ItemStack> stackMap = new HashMap<>(); - HashMap<ItemID, ArrayList<Integer>> realSlotMap = new HashMap<>(); - for (int i = 0, mStorageSize = inventory.size(); i < mStorageSize; i++) { - ItemStack stack = inventoryGetter.get(inventory.get(i)); - ItemID id = ItemID.createNoCopy(stack, false); - itemMap.merge(id, 1, Integer::sum); - stackMap.putIfAbsent(id, stack); - realSlotMap.computeIfAbsent(id, unused -> new ArrayList<>()) - .add(i); - } - List<GTHelper.StackableItemSlot> newDrawables = new ArrayList<>(); - for (Map.Entry<ItemID, Integer> entry : itemMap.entrySet()) { - newDrawables.add( - new GTHelper.StackableItemSlot( - entry.getValue(), - stackMap.get(entry.getKey()), - realSlotMap.get(entry.getKey()))); - } - if (!Objects.equals(newDrawables, drawables)) { - drawables = newDrawables; - container.notifyChangeNoSync(); - } - return drawables; - }, l -> { - drawables.clear(); - drawables.addAll(l); - container.notifyChangeNoSync(); - }, (buffer, i) -> { - try { - i.write(buffer); - } catch (IOException e) { - throw new RuntimeException(e); - } - }, buffer -> { - try { - return GTHelper.StackableItemSlot.read(buffer); - } catch (IOException e) { - throw new RuntimeException(e); - } - }), builder); - if (isEnabledGetter != null) { - container.attachSyncer(new FakeSyncWidget.BooleanSyncer(isEnabledGetter, i -> isEnabled = i), builder); - } - return container; - } - - List<GTHelper.StackableItemSlot> drawables = new ArrayList<>(); - - private Widget createWidget(EntityPlayer player) { - Scrollable dynamicInventoryWidget = new Scrollable().setVerticalScroll(); - - ArrayList<Widget> buttons = new ArrayList<>(); - - if (!ModUtils.isClientThreaded()) { - HashMap<ItemID, Integer> itemMap = new HashMap<>(); - HashMap<ItemID, ItemStack> stackMap = new HashMap<>(); - HashMap<ItemID, ArrayList<Integer>> realSlotMap = new HashMap<>(); - for (int i = 0, inventorySize = inventory.size(); i < inventorySize; i++) { - ItemStack stack = inventoryGetter.get(inventory.get(i)); - ItemID id = ItemID.createNoCopy(stack, false); - itemMap.merge(id, 1, Integer::sum); - stackMap.putIfAbsent(id, stack); - realSlotMap.computeIfAbsent(id, unused -> new ArrayList<>()) - .add(i); - } - drawables = new ArrayList<>(); - for (Map.Entry<ItemID, Integer> entry : itemMap.entrySet()) { - drawables.add( - new GTHelper.StackableItemSlot( - entry.getValue(), - stackMap.get(entry.getKey()), - realSlotMap.get(entry.getKey()))); - } - } - - for (int ID = 0; ID < drawables.size(); ID++) { - final int finalID = ID; - buttons.add(new ButtonWidget() { - - @Override - public void drawBackground(float partialTicks) { - super.drawBackground(partialTicks); - if (!isEnabled) { - GL11.glDisable(GL11.GL_LIGHTING); - GL11.glEnable(GL11.GL_BLEND); - GlStateManager.colorMask(true, true, true, false); - ModularGui.drawSolidRect(1, 1, 16, 16, Color.withAlpha(Color.BLACK.normal, 0x80)); - GlStateManager.colorMask(true, true, true, true); - GL11.glDisable(GL11.GL_BLEND); - } - // Copied from SlotWidget#draw - else if (isHovering() && !getContext().getCursor() - .hasDraggable()) { - GL11.glDisable(GL11.GL_LIGHTING); - GL11.glEnable(GL11.GL_BLEND); - GlStateManager.colorMask(true, true, true, false); - ModularGui.drawSolidRect(1, 1, 16, 16, Theme.INSTANCE.getSlotHighlight()); - GlStateManager.colorMask(true, true, true, true); - GL11.glDisable(GL11.GL_BLEND); - } - } - }.setPlayClickSound(false) - .setOnClick((clickData, widget) -> { - if (!(player instanceof EntityPlayerMP)) return; - if (!isEnabledGetter.get()) return; - - if (clickData.mouseButton == 2) { - // special button handler goes here - if (drawables.size() <= finalID) return; - if (player.capabilities.isCreativeMode && player.inventory.getItemStack() == null) { - int realID = drawables.get(finalID).realSlots.get(0); - ItemStack stack = inventoryGetter.get(inventory.get(realID)) - .copy(); - stack.stackSize = stack.getMaxStackSize(); - player.inventory.setItemStack(stack); - ((EntityPlayerMP) player).isChangingQuantityOnly = false; - ((EntityPlayerMP) player).updateHeldItem(); - return; - } - } else if (clickData.shift) { - if (inventoryExtractor == null) return; - if (drawables.size() <= finalID) return; - int realID = drawables.get(finalID).realSlots.get(0); - T removed = inventoryExtractor.extract(realID); - if (removed != null) { - ItemStack stack = inventoryGetter.get(removed); - if (player.inventory.addItemStackToInventory(stack)) - player.inventoryContainer.detectAndSendChanges(); - else player.entityDropItem(stack, 0.f); - return; - } - } else { - ItemStack input = player.inventory.getItemStack(); - if (input != null) { - if (drawables.size() > finalID) { - if (inventoryReplacer == null) return; - int realID = drawables.get(finalID).realSlots.get(0); - ItemStack removed = inventoryReplacer.replaceOrMerge(realID, input); - if (removed == null) return; - player.inventory.setItemStack(removed.stackSize == 0 ? null : removed); - } else { - if (inventoryInjector == null) return; - if (clickData.mouseButton == 1) { - ItemStack copy = input.copy(); - copy.stackSize = 1; - ItemStack leftover = inventoryInjector.inject(copy); - if (leftover == null) return; - input.stackSize--; - if (input.stackSize > 0) { - ((EntityPlayerMP) player).isChangingQuantityOnly = true; - ((EntityPlayerMP) player).updateHeldItem(); - return; - } else player.inventory.setItemStack(null); - } else { - ItemStack leftover = inventoryInjector.inject(input); - if (leftover == null) return; - if (input.stackSize > 0) { - ((EntityPlayerMP) player).isChangingQuantityOnly = true; - ((EntityPlayerMP) player).updateHeldItem(); - return; - } else player.inventory.setItemStack(null); - } - } - ((EntityPlayerMP) player).isChangingQuantityOnly = false; - ((EntityPlayerMP) player).updateHeldItem(); - return; - } - if (drawables.size() > finalID) { - if (inventoryExtractor == null) return; - int realID = drawables.get(finalID).realSlots.get(0); - T removed = inventoryExtractor.extract(realID); - if (removed != null) { - ItemStack stack = inventoryGetter.get(removed); - player.inventory.setItemStack(stack); - ((EntityPlayerMP) player).isChangingQuantityOnly = false; - ((EntityPlayerMP) player).updateHeldItem(); - return; - } - } - } - }) - .setBackground( - () -> new IDrawable[] { getItemSlot(), - new ItemDrawable(drawables.size() > finalID ? drawables.get(finalID).stack : null) - .withFixedSize(16, 16, 1, 1), - new Text( - (drawables.size() > finalID && drawables.get(finalID).count > 1) - ? (drawables.get(finalID).count > 99 ? "+99" - : String.valueOf(drawables.get(finalID).count)) - : "").color(Color.WHITE.normal) - .alignment(Alignment.TopLeft) - .withOffset(1, 1), - new Text( - (drawables.size() > finalID && drawables.get(finalID).stack.stackSize > 1) - ? String.valueOf(drawables.get(finalID).stack.stackSize) - : "").color(Color.WHITE.normal) - .shadow() - .alignment(Alignment.BottomRight) }) - .dynamicTooltip(() -> { - if (drawables.size() > finalID) { - List<String> tip = new ArrayList<>( - Collections.singletonList(drawables.get(finalID).stack.getDisplayName())); - if (drawables.get(finalID).count > 1) tip.add( - EnumChatFormatting.DARK_PURPLE + "There are " - + drawables.get(finalID).count - + " identical slots"); - return tip; - } - return Collections.emptyList(); - }) - .setSize(18, 18)); - } - - buttons.add(new ButtonWidget() { - - @Override - public void drawBackground(float partialTicks) { - super.drawBackground(partialTicks); - if (!isEnabled) { - GL11.glDisable(GL11.GL_LIGHTING); - GL11.glEnable(GL11.GL_BLEND); - GlStateManager.colorMask(true, true, true, false); - ModularGui.drawSolidRect(1, 1, 16, 16, Color.withAlpha(Color.BLACK.normal, 0x80)); - GlStateManager.colorMask(true, true, true, true); - GL11.glDisable(GL11.GL_BLEND); - } - // Copied from SlotWidget#draw - else if (isHovering() && !getContext().getCursor() - .hasDraggable()) { - GL11.glDisable(GL11.GL_LIGHTING); - GL11.glEnable(GL11.GL_BLEND); - GlStateManager.colorMask(true, true, true, false); - ModularGui.drawSolidRect(1, 1, 16, 16, Theme.INSTANCE.getSlotHighlight()); - GlStateManager.colorMask(true, true, true, true); - GL11.glDisable(GL11.GL_BLEND); - } - } - }.setPlayClickSound(false) - .setOnClick((clickData, widget) -> { - if (!(player instanceof EntityPlayerMP)) return; - if (!isEnabledGetter.get()) return; - ItemStack input = player.inventory.getItemStack(); - if (input != null) { - if (clickData.mouseButton == 1) { - ItemStack copy = input.copy(); - copy.stackSize = 1; - ItemStack leftover = inventoryInjector.inject(copy); - if (leftover == null) return; - input.stackSize--; - if (input.stackSize > 0) { - ((EntityPlayerMP) player).isChangingQuantityOnly = true; - ((EntityPlayerMP) player).updateHeldItem(); - return; - } else player.inventory.setItemStack(null); - } else { - ItemStack leftover = inventoryInjector.inject(input); - if (leftover == null) return; - if (input.stackSize > 0) { - ((EntityPlayerMP) player).isChangingQuantityOnly = true; - ((EntityPlayerMP) player).updateHeldItem(); - return; - } else player.inventory.setItemStack(null); - } - ((EntityPlayerMP) player).isChangingQuantityOnly = false; - ((EntityPlayerMP) player).updateHeldItem(); - return; - } - }) - .setBackground( - () -> new IDrawable[] { getItemSlot(), - new Text( - (slots - usedSlots) <= 1 ? "" - : ((slots - usedSlots) > 99 ? "+99" : String.valueOf((slots - usedSlots)))) - .color(Color.WHITE.normal) - .alignment(Alignment.TopLeft) - .withOffset(1, 1) }) - .dynamicTooltip(() -> { - List<String> tip = new ArrayList<>(Collections.singleton(EnumChatFormatting.GRAY + "Empty slot")); - if (slots - usedSlots > 1) - tip.add(EnumChatFormatting.DARK_PURPLE + "There are " + (slots - usedSlots) + " identical slots"); - return tip; - }) - .setSize(18, 18)); - - final int perRow = width / 18; - for (int i = 0, imax = ((buttons.size() - 1) / perRow); i <= imax; i++) { - DynamicPositionedRow row = new DynamicPositionedRow().setSynced(false); - for (int j = 0, jmax = (i == imax ? (buttons.size() - 1) % perRow : (perRow - 1)); j <= jmax; j++) { - final int finalI = i * perRow; - final int finalJ = j; - final int ID = finalI + finalJ; - row.widget(buttons.get(ID)); - } - dynamicInventoryWidget.widget(row.setPos(0, i * 18)); - } - - return dynamicInventoryWidget.setSize(width, height); - } - - @FunctionalInterface - public interface TInventoryGetter<T> { - - /** - * Allows to get an ItemStack from the dynamic inventory - * - * @param from Dynamic inventory item from which we want to take an item out - * @return ItemStack or null if inaccessible - */ - ItemStack get(T from); - } - - @FunctionalInterface - public interface TInventoryInjector { - - /** - * Allows to insert an item to the dynamic inventory - * - * @param what ItemStack which we are trying to insert - * @return Leftover ItemStack (stackSize == 0 if everything has been inserted) or null - */ - ItemStack inject(ItemStack what); - } - - @FunctionalInterface - public interface TInventoryExtractor<T> { - - /** - * Allows to extract an item from the dynamic inventory - * - * @param where Index from where we want to take an item out - * @return Item that we took out or null - */ - T extract(int where); - } - - @FunctionalInterface - public interface TInventoryReplacerOrMerger { - - /** - * Allows to replace an item in Dynamic Inventory - * - * @param where which index we want to replace - * @param stack what stack we want to replace it with - * @return Stack that we are left with or null - */ - ItemStack replaceOrMerge(int where, ItemStack stack); - } - -} |