From 8a080a037f43a95df9a3b04289a1557a4f9ca6c6 Mon Sep 17 00:00:00 2001 From: Boblet Date: Tue, 7 Jun 2022 16:05:31 +0200 Subject: [PATCH] stack matching settings for extractor crane --- ...titytemWaste.java => EntityItemWaste.java} | 8 +- .../container/ContainerCraneExtractor.java | 34 ++-- .../hbm/inventory/gui/GUICraneExtractor.java | 32 ++++ .../hbm/items/machine/ItemDepletedFuel.java | 3 - .../hbm/items/special/ItemNuclearWaste.java | 6 +- .../com/hbm/module/ModulePatternMatcher.java | 147 ++++++++++++++++++ .../network/TileEntityCraneExtractor.java | 13 +- 7 files changed, 219 insertions(+), 24 deletions(-) rename src/main/java/com/hbm/entity/item/{EntitytemWaste.java => EntityItemWaste.java} (64%) create mode 100644 src/main/java/com/hbm/module/ModulePatternMatcher.java diff --git a/src/main/java/com/hbm/entity/item/EntitytemWaste.java b/src/main/java/com/hbm/entity/item/EntityItemWaste.java similarity index 64% rename from src/main/java/com/hbm/entity/item/EntitytemWaste.java rename to src/main/java/com/hbm/entity/item/EntityItemWaste.java index 64cf56896..8f307c96b 100644 --- a/src/main/java/com/hbm/entity/item/EntitytemWaste.java +++ b/src/main/java/com/hbm/entity/item/EntityItemWaste.java @@ -5,17 +5,17 @@ import net.minecraft.item.ItemStack; import net.minecraft.util.DamageSource; import net.minecraft.world.World; -public class EntitytemWaste extends EntityItem { +public class EntityItemWaste extends EntityItem { - public EntitytemWaste(World world) { + public EntityItemWaste(World world) { super(world); } - public EntitytemWaste(World world, double x, double y, double z) { + public EntityItemWaste(World world, double x, double y, double z) { super(world, x, y, z); } - public EntitytemWaste(World world, double x, double y, double z, ItemStack stack) { + public EntityItemWaste(World world, double x, double y, double z, ItemStack stack) { super(world, x, y, z, stack); } diff --git a/src/main/java/com/hbm/inventory/container/ContainerCraneExtractor.java b/src/main/java/com/hbm/inventory/container/ContainerCraneExtractor.java index c12d09b57..fa68c7f10 100644 --- a/src/main/java/com/hbm/inventory/container/ContainerCraneExtractor.java +++ b/src/main/java/com/hbm/inventory/container/ContainerCraneExtractor.java @@ -12,10 +12,10 @@ import net.minecraft.item.ItemStack; public class ContainerCraneExtractor extends Container { - protected TileEntityCraneExtractor inserter; + protected TileEntityCraneExtractor extractor; public ContainerCraneExtractor(InventoryPlayer invPlayer, TileEntityCraneExtractor inserter) { - this.inserter = inserter; + this.extractor = inserter; //filter for(int i = 0; i < 3; i++) { @@ -59,8 +59,8 @@ public class ContainerCraneExtractor extends Container { return null; } - if(slot <= inserter.getSizeInventory() - 1) { - if(!this.mergeItemStack(var5, inserter.getSizeInventory(), this.inventorySlots.size(), true)) { + if(slot <= extractor.getSizeInventory() - 1) { + if(!this.mergeItemStack(var5, extractor.getSizeInventory(), this.inventorySlots.size(), true)) { return null; } } else { @@ -71,7 +71,7 @@ public class ContainerCraneExtractor extends Container { } else if(var3.getItem() == ModItems.upgrade_crystallizer) { if(!this.mergeItemStack(var5, 19, 20, false)) return null; - } else if(!this.mergeItemStack(var5, 9, inserter.getSizeInventory(), false)) { + } else if(!this.mergeItemStack(var5, 9, extractor.getSizeInventory(), false)) { return null; } @@ -92,7 +92,7 @@ public class ContainerCraneExtractor extends Container { @Override public boolean canInteractWith(EntityPlayer player) { - return inserter.isUseableByPlayer(player); + return extractor.isUseableByPlayer(player); } @Override @@ -116,15 +116,21 @@ public class ContainerCraneExtractor extends Container { if(slot.getHasStack()) ret = slot.getStack().copy(); - - slot.putStack(held != null ? held.copy() : null); - if(slot.getHasStack()) { - slot.getStack().stackSize = 1; + if(button == 1 && mode == 0 && slot.getHasStack()) { + extractor.nextMode(index); + return ret; + + } else { + slot.putStack(held != null ? held.copy() : null); + + if(slot.getHasStack()) { + slot.getStack().stackSize = 1; + } + + slot.onSlotChanged(); + + return ret; } - - slot.onSlotChanged(); - - return ret; } } diff --git a/src/main/java/com/hbm/inventory/gui/GUICraneExtractor.java b/src/main/java/com/hbm/inventory/gui/GUICraneExtractor.java index 04ccad591..ab99a9e40 100644 --- a/src/main/java/com/hbm/inventory/gui/GUICraneExtractor.java +++ b/src/main/java/com/hbm/inventory/gui/GUICraneExtractor.java @@ -1,5 +1,7 @@ package com.hbm.inventory.gui; +import java.util.Arrays; + import org.lwjgl.opengl.GL11; import com.hbm.inventory.container.ContainerCraneExtractor; @@ -12,7 +14,9 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.audio.PositionedSoundRecord; import net.minecraft.client.resources.I18n; import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.inventory.Slot; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.EnumChatFormatting; import net.minecraft.util.ResourceLocation; public class GUICraneExtractor extends GuiInfoContainer { @@ -27,6 +31,30 @@ public class GUICraneExtractor extends GuiInfoContainer { this.xSize = 176; this.ySize = 185; } + + @Override + public void drawScreen(int x, int y, float interp) { + super.drawScreen(x, y, interp); + + if(this.mc.thePlayer.inventory.getItemStack() == null) { + for(int i = 0; i < 9; ++i) { + Slot slot = (Slot) this.inventorySlots.inventorySlots.get(i); + + if(this.isMouseOverSlot(slot, x, y) && inserter.matcher.modes[i] != null) { + + String label = EnumChatFormatting.YELLOW + ""; + + switch(inserter.matcher.modes[i]) { + case "exact": label += "Item and meta match"; break; + case "wildcard": label += "Item matches"; break; + default: label += "Ore dict key matches: " + inserter.matcher.modes[i]; break; + } + + this.func_146283_a(Arrays.asList(new String[] { EnumChatFormatting.RED + "Right click to change", label }), x, y - 30); + } + } + } + } @Override protected void mouseClicked(int x, int y, int i) { @@ -60,4 +88,8 @@ public class GUICraneExtractor extends GuiInfoContainer { drawTexturedModalRect(guiLeft + 139, guiTop + 47, 176, 0, 3, 6); } } + + protected boolean isMouseOverSlot(Slot slot, int x, int y) { + return this.func_146978_c(slot.xDisplayPosition, slot.yDisplayPosition, 16, 16, x, y); + } } diff --git a/src/main/java/com/hbm/items/machine/ItemDepletedFuel.java b/src/main/java/com/hbm/items/machine/ItemDepletedFuel.java index 11ead81e9..fe839a410 100644 --- a/src/main/java/com/hbm/items/machine/ItemDepletedFuel.java +++ b/src/main/java/com/hbm/items/machine/ItemDepletedFuel.java @@ -3,8 +3,6 @@ package com.hbm.items.machine; import java.util.List; import com.hbm.items.special.ItemNuclearWaste; -import com.hbm.lib.Library; -import com.hbm.main.MainRegistry; import com.hbm.util.I18nUtil; import cpw.mods.fml.relauncher.Side; @@ -14,7 +12,6 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.util.EnumChatFormatting; -import net.minecraft.util.IIcon; public class ItemDepletedFuel extends ItemNuclearWaste { diff --git a/src/main/java/com/hbm/items/special/ItemNuclearWaste.java b/src/main/java/com/hbm/items/special/ItemNuclearWaste.java index aa114abe3..a4ce9b68c 100644 --- a/src/main/java/com/hbm/items/special/ItemNuclearWaste.java +++ b/src/main/java/com/hbm/items/special/ItemNuclearWaste.java @@ -1,6 +1,6 @@ package com.hbm.items.special; -import com.hbm.entity.item.EntitytemWaste; +import com.hbm.entity.item.EntityItemWaste; import net.minecraft.entity.Entity; import net.minecraft.item.Item; @@ -22,12 +22,14 @@ public class ItemNuclearWaste extends Item { @Override public Entity createEntity(World world, Entity entityItem, ItemStack itemstack) { - EntitytemWaste entity = new EntitytemWaste(world, entityItem.posX, entityItem.posY, entityItem.posZ, itemstack); + EntityItemWaste entity = new EntityItemWaste(world, entityItem.posX, entityItem.posY, entityItem.posZ, itemstack); entity.motionX = entityItem.motionX; entity.motionY = entityItem.motionY; entity.motionZ = entityItem.motionZ; entity.delayBeforeCanPickup = 10; + entityItem.setDead(); + return entity; } } diff --git a/src/main/java/com/hbm/module/ModulePatternMatcher.java b/src/main/java/com/hbm/module/ModulePatternMatcher.java new file mode 100644 index 000000000..ff8c10ff0 --- /dev/null +++ b/src/main/java/com/hbm/module/ModulePatternMatcher.java @@ -0,0 +1,147 @@ +package com.hbm.module; + +import java.util.List; + +import com.hbm.util.ItemStackUtil; + +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.world.World; + +public class ModulePatternMatcher { + + public static final String MODE_EXACT = "exact"; + public static final String MODE_WILDCARD = "wildcard"; + public String[] modes; + + public ModulePatternMatcher() { + this.modes = new String[1]; + } + + public ModulePatternMatcher(int count) { + this.modes = new String[count]; + } + + public void initPatternSmart(World world, ItemStack stack, int i) { + + if(world.isRemote) return; + + if(stack == null) { + modes[i] = null; + return; + } + + List names = ItemStackUtil.getOreDictNames(stack); + + if(iterateAndCheck(names, i ,"ingot")) return; + if(iterateAndCheck(names, i ,"block")) return; + if(iterateAndCheck(names, i ,"dust")) return; + if(iterateAndCheck(names, i ,"nugget")) return; + if(iterateAndCheck(names, i ,"plate")) return; + + if(stack.getHasSubtypes()) { + modes[i] = MODE_EXACT; + } else { + modes[i] = MODE_WILDCARD; + } + } + + private boolean iterateAndCheck(List names, int i, String prefix) { + + for(String s : names) { + if(s.startsWith(prefix)) { + modes[i] = s; + return true; + } + } + + return false; + } + + public void initPatternStandard(World world, ItemStack stack, int i) { + + if(world.isRemote) return; + + if(stack == null) { + modes[i] = null; + return; + } + + if(stack.getHasSubtypes()) { + modes[i] = MODE_EXACT; + } else { + modes[i] = MODE_WILDCARD; + } + } + + public void nextMode(World world, ItemStack pattern, int i) { + + if(world.isRemote) return; + + if(pattern == null) { + modes[i] = null; + return; + } + + if(modes[i] == null) { + modes[i] = MODE_EXACT; + } else if(MODE_EXACT.equals(modes[i])) { + modes[i] = MODE_WILDCARD; + } else if(MODE_WILDCARD.equals(modes[i])) { + + List names = ItemStackUtil.getOreDictNames(pattern); + + if(names.isEmpty()) { + modes[i] = MODE_EXACT; + } else { + modes[i] = names.get(0); + } + } else { + + List names = ItemStackUtil.getOreDictNames(pattern); + + if(names.size() < 2 || modes[i].equals(names.get(names.size() - 1))) { + modes[i] = MODE_EXACT; + } else { + + for(int j = 0; j < names.size() - 1; j++) { + + if(modes[i].equals(names.get(j))) { + modes[i] = names.get(j + 1); + return; + } + } + } + } + } + + public boolean isValidForFilter(ItemStack filter, int index, ItemStack input) { + + String mode = modes[index]; + switch(mode) { + case MODE_EXACT: return input.isItemEqual(filter) && ItemStack.areItemStackTagsEqual(input, filter); + case MODE_WILDCARD: return input.getItem() == filter.getItem() && ItemStack.areItemStackTagsEqual(input, filter); + default: + List keys = ItemStackUtil.getOreDictNames(input); + return keys.contains(mode); + } + } + + public void readFromNBT(NBTTagCompound nbt) { + + for(int i = 0; i < modes.length; i++) { + if(nbt.hasKey("mode" + i)) { + modes[i] = nbt.getString("mode" + i); + } + } + } + + public void writeToNBT(NBTTagCompound nbt) { + + for(int i = 0; i < modes.length; i++) { + if(modes[i] != null) { + nbt.setString("mode" + i, modes[i]); + } + } + } +} diff --git a/src/main/java/com/hbm/tileentity/network/TileEntityCraneExtractor.java b/src/main/java/com/hbm/tileentity/network/TileEntityCraneExtractor.java index 0072fd325..550c2b4c8 100644 --- a/src/main/java/com/hbm/tileentity/network/TileEntityCraneExtractor.java +++ b/src/main/java/com/hbm/tileentity/network/TileEntityCraneExtractor.java @@ -4,6 +4,7 @@ import com.hbm.entity.item.EntityMovingItem; import com.hbm.interfaces.IControlReceiver; import com.hbm.inventory.container.ContainerCraneExtractor; import com.hbm.inventory.gui.GUICraneExtractor; +import com.hbm.module.ModulePatternMatcher; import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.TileEntityMachineBase; @@ -26,9 +27,11 @@ import net.minecraftforge.common.util.ForgeDirection; public class TileEntityCraneExtractor extends TileEntityMachineBase implements IGUIProvider, IControlReceiver { public boolean isWhitelist = false; + public ModulePatternMatcher matcher; public TileEntityCraneExtractor() { super(20); + this.matcher = new ModulePatternMatcher(9); } @Override @@ -89,12 +92,14 @@ public class TileEntityCraneExtractor extends TileEntityMachineBase implements I NBTTagCompound data = new NBTTagCompound(); data.setBoolean("isWhitelist", isWhitelist); + this.matcher.writeToNBT(data); this.networkPack(data, 15); } } public void networkUnpack(NBTTagCompound nbt) { this.isWhitelist = nbt.getBoolean("isWhitelist"); + this.matcher.readFromNBT(nbt); } public boolean matchesFilter(ItemStack stack) { @@ -102,13 +107,17 @@ public class TileEntityCraneExtractor extends TileEntityMachineBase implements I for(int i = 0; i < 9; i++) { ItemStack filter = slots[i]; - if(filter != null && filter.isItemEqual(stack)) { + if(this.matcher.isValidForFilter(filter, i, stack)) { return true; } } return false; } + + public void nextMode(int i) { + this.matcher.nextMode(worldObj, slots[i], i); + } @Override public boolean isItemValidForSlot(int i, ItemStack itemStack) { @@ -130,12 +139,14 @@ public class TileEntityCraneExtractor extends TileEntityMachineBase implements I public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); this.isWhitelist = nbt.getBoolean("isWhitelist"); + this.matcher.readFromNBT(nbt); } @Override public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); nbt.setBoolean("isWhitelist", this.isWhitelist); + this.matcher.writeToNBT(nbt); } @Override