From 87de3a410f783757b15005668cfc9cf913ee5b04 Mon Sep 17 00:00:00 2001 From: Pierce Corcoran Date: Sat, 5 Dec 2015 22:26:31 -0600 Subject: [PATCH 1/4] Add Pre-Chewed Food --- src/main/java/practicalities/ConfigMan.java | 5 + src/main/java/practicalities/Getter.java | 11 + .../practicalities/PracticalitiesMod.java | 2 + .../java/practicalities/blocks/ModBlocks.java | 17 + .../prechewedfood/BlockPreChewedFood.java | 57 ++++ .../practicalities/gui/ContainerBase.java | 64 ++-- .../practicalities/gui/ElementEnergyBar.java | 59 ++++ .../practicalities/gui/ElementProgress.java | 48 +++ .../gui/InventorySingleStack.java | 35 +++ .../java/practicalities/gui/SlotRegion.java | 2 +- .../ContainerInventoryFilter.java | 24 +- .../inventoryfilter/GuiInventoryFilter.java | 1 - .../inventoryfilter/TileInventoryFilter.java | 99 ++---- .../machine/masher/BlockMasher.java | 39 +++ .../machine/masher/ContainerMasher.java | 45 +++ .../machine/masher/GuiMasher.java | 49 +++ .../machine/masher/TileMasher.java | 293 ++++++++++++++++++ .../shippingcrate/ContainerShippingCrate.java | 17 +- .../textures/blocks/preChewedFood/flow.png | Bin 0 -> 8878 bytes .../blocks/preChewedFood/flow.png.mcmeta | 3 + .../textures/blocks/preChewedFood/static.png | Bin 0 -> 11405 bytes .../textures/blocks/preChewedFood/still.png | Bin 0 -> 11398 bytes .../blocks/preChewedFood/still.png.mcmeta | 5 + .../textures/gui/element/energy.png | Bin 0 -> 1480 bytes .../practicalities/textures/gui/masher.png | Bin 0 -> 1170 bytes 25 files changed, 745 insertions(+), 130 deletions(-) create mode 100644 src/main/java/practicalities/Getter.java create mode 100644 src/main/java/practicalities/fluid/prechewedfood/BlockPreChewedFood.java create mode 100644 src/main/java/practicalities/gui/ElementEnergyBar.java create mode 100644 src/main/java/practicalities/gui/ElementProgress.java create mode 100644 src/main/java/practicalities/gui/InventorySingleStack.java create mode 100644 src/main/java/practicalities/machine/masher/BlockMasher.java create mode 100644 src/main/java/practicalities/machine/masher/ContainerMasher.java create mode 100644 src/main/java/practicalities/machine/masher/GuiMasher.java create mode 100644 src/main/java/practicalities/machine/masher/TileMasher.java create mode 100644 src/main/resources/assets/practicalities/textures/blocks/preChewedFood/flow.png create mode 100755 src/main/resources/assets/practicalities/textures/blocks/preChewedFood/flow.png.mcmeta create mode 100644 src/main/resources/assets/practicalities/textures/blocks/preChewedFood/static.png create mode 100644 src/main/resources/assets/practicalities/textures/blocks/preChewedFood/still.png create mode 100755 src/main/resources/assets/practicalities/textures/blocks/preChewedFood/still.png.mcmeta create mode 100644 src/main/resources/assets/practicalities/textures/gui/element/energy.png create mode 100644 src/main/resources/assets/practicalities/textures/gui/masher.png diff --git a/src/main/java/practicalities/ConfigMan.java b/src/main/java/practicalities/ConfigMan.java index 6ff051a..7050477 100755 --- a/src/main/java/practicalities/ConfigMan.java +++ b/src/main/java/practicalities/ConfigMan.java @@ -25,6 +25,8 @@ public class ConfigMan public static boolean enableSitisStick; public static boolean enabledImbuedItems; + public static boolean enablePreChewedFood; + public static void init(Configuration configuration) { config = configuration; @@ -47,5 +49,8 @@ public static void hydrateConifg() enableSitisStick = config.getBoolean("enableSitisStick", "general", true, ""); enabledImbuedItems = config.getBoolean("enableImbuedItems", "general", true, ""); + enablePreChewedFood = config.getBoolean("enablePreChewedFood", "general", true, ""); + + } } diff --git a/src/main/java/practicalities/Getter.java b/src/main/java/practicalities/Getter.java new file mode 100644 index 0000000..1e1e43c --- /dev/null +++ b/src/main/java/practicalities/Getter.java @@ -0,0 +1,11 @@ +package practicalities; + +public abstract class Getter { + public Operand op; + + public Getter(Operand op) { + this.op = op; + } + + public abstract DataType get(); +} diff --git a/src/main/java/practicalities/PracticalitiesMod.java b/src/main/java/practicalities/PracticalitiesMod.java index a1cf228..2b24b4d 100755 --- a/src/main/java/practicalities/PracticalitiesMod.java +++ b/src/main/java/practicalities/PracticalitiesMod.java @@ -7,6 +7,7 @@ import practicalities.gui.GuiHandler; import practicalities.items.ModItems; import practicalities.machine.inventoryfilter.TileInventoryFilter; +import practicalities.machine.masher.TileMasher; import practicalities.machine.shippingcrate.TileShippingCrate; import practicalities.machine.vampiricgenerator.TileVampiricGenerator; import cpw.mods.fml.common.FMLCommonHandler; @@ -63,6 +64,7 @@ private void initMachines() { TileShippingCrate.initialize(); TileVampiricGenerator.initialize(); TileInventoryFilter.initialize(); + TileMasher.initialize(); initializedMachines = true; } } diff --git a/src/main/java/practicalities/blocks/ModBlocks.java b/src/main/java/practicalities/blocks/ModBlocks.java index 9889025..6c6db76 100755 --- a/src/main/java/practicalities/blocks/ModBlocks.java +++ b/src/main/java/practicalities/blocks/ModBlocks.java @@ -2,8 +2,12 @@ import net.minecraft.block.Block; import net.minecraft.block.material.Material; +import net.minecraftforge.fluids.Fluid; +import net.minecraftforge.fluids.FluidRegistry; import practicalities.ConfigMan; +import practicalities.fluid.prechewedfood.BlockPreChewedFood; import practicalities.machine.inventoryfilter.BlockInventoryFilter; +import practicalities.machine.masher.BlockMasher; import practicalities.machine.polaritynegator.BlockPolarityNegator; import practicalities.machine.shippingcrate.BlockShippingCrate; import practicalities.machine.vampiricgenerator.BlockVampiricGenerator; @@ -14,11 +18,24 @@ public class ModBlocks { public static Block vampiricGenerator; public static Block polarityNegator; public static Block inventoryFilter; + public static Block masher; + public static Block blockPreChewedFood; + + public static Fluid preChewedFood; public static void init() { + preChewedFood = new Fluid("preChewedFood"); + preChewedFood.setDensity(2000).setTemperature(310).setViscosity(15000); + FluidRegistry.registerFluid(preChewedFood); + stoneWall = new BlockDecor(Material.rock, "stonewall", 1, Block.soundTypeStone); + if(ConfigMan.enablePreChewedFood) { + blockPreChewedFood = new BlockPreChewedFood(preChewedFood); + masher = new BlockMasher(); + } + if(ConfigMan.enableInventoryFilter) inventoryFilter = new BlockInventoryFilter(); diff --git a/src/main/java/practicalities/fluid/prechewedfood/BlockPreChewedFood.java b/src/main/java/practicalities/fluid/prechewedfood/BlockPreChewedFood.java new file mode 100644 index 0000000..8a5c99a --- /dev/null +++ b/src/main/java/practicalities/fluid/prechewedfood/BlockPreChewedFood.java @@ -0,0 +1,57 @@ +package practicalities.fluid.prechewedfood; + +import practicalities.PracticalitiesMod; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.util.IIcon; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; +import net.minecraftforge.fluids.BlockFluidClassic; +import net.minecraftforge.fluids.Fluid; +import cpw.mods.fml.common.registry.GameRegistry; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class BlockPreChewedFood extends BlockFluidClassic { + + @SideOnly(Side.CLIENT) + protected IIcon stillIcon; + @SideOnly(Side.CLIENT) + protected IIcon flowingIcon; + protected Fluid fluid; + + public BlockPreChewedFood(Fluid fluid) { + super(fluid, Material.water); + this.fluid = fluid; + setCreativeTab(CreativeTabs.tabMisc); + GameRegistry.registerBlock(this, fluid.getUnlocalizedName()); + } + + @Override + public IIcon getIcon(int side, int meta) { + return (side == 0 || side == 1)? stillIcon : flowingIcon; + } + + @SideOnly(Side.CLIENT) + @Override + public void registerBlockIcons(IIconRegister register) { + stillIcon = register.registerIcon(PracticalitiesMod.TEXTURE_BASE + "preChewedFood/still"); + flowingIcon = register.registerIcon(PracticalitiesMod.TEXTURE_BASE + "preChewedFood/flow"); + fluid.setStillIcon(stillIcon); + fluid.setFlowingIcon(flowingIcon); + } + + @Override + public boolean canDisplace(IBlockAccess world, int x, int y, int z) { + if (world.getBlock(x, y, z).getMaterial().isLiquid()) return false; + return super.canDisplace(world, x, y, z); + } + + @Override + public boolean displaceIfPossible(World world, int x, int y, int z) { + if (world.getBlock(x, y, z).getMaterial().isLiquid()) return false; + return super.displaceIfPossible(world, x, y, z); + } + +} diff --git a/src/main/java/practicalities/gui/ContainerBase.java b/src/main/java/practicalities/gui/ContainerBase.java index 3554e7c..ae7e312 100755 --- a/src/main/java/practicalities/gui/ContainerBase.java +++ b/src/main/java/practicalities/gui/ContainerBase.java @@ -5,7 +5,6 @@ import cofh.lib.util.helpers.MathHelper; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; - import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.inventory.Container; @@ -16,6 +15,10 @@ //todo: remove this once CoFHLib ships with it. public abstract class ContainerBase extends Container { + @SuppressWarnings("unused") + protected SlotRegion mainInv, hotbar; + private SlotRegion[] regions; + public ContainerBase() { } @@ -28,7 +31,9 @@ protected int getPlayerInventoryHorizontalOffset() { } protected void bindPlayerInventory(InventoryPlayer inventoryPlayer) { - + + int firstIndex = this.inventorySlots.size(); + int yOff = getPlayerInventoryVerticalOffset(); int xOff = getPlayerInventoryHorizontalOffset(); for (int i = 0; i < 3; i++) { @@ -40,10 +45,17 @@ protected void bindPlayerInventory(InventoryPlayer inventoryPlayer) { for (int i = 0; i < 9; i++) { addSlotToContainer(new Slot(inventoryPlayer, i, xOff + i * 18, yOff + 58)); } + + mainInv = new SlotRegion("mainInventory", firstIndex + 0, firstIndex + 26); + hotbar = new SlotRegion("hotbar", firstIndex + 27, firstIndex + 35); } protected abstract int getSizeInventory(); + protected void setShiftClickRegions(SlotRegion... regions) { + this.regions = regions; + } + protected boolean supportsShiftClick(EntityPlayer player, int slotIndex) { return supportsShiftClick(slotIndex); @@ -69,7 +81,7 @@ protected boolean performMerge(int slotIndex, ItemStack stack) { } return mergeItemStack(stack, 0, invBase, true); } - + @Override public ItemStack transferStackInSlot(EntityPlayer player, int slotIndex) { @@ -77,29 +89,29 @@ public ItemStack transferStackInSlot(EntityPlayer player, int slotIndex) { return null; } - ItemStack stack = null; - Slot slot = (Slot) inventorySlots.get(slotIndex); - - if (slot != null && slot.getHasStack()) { - ItemStack stackInSlot = slot.getStack(); - stack = stackInSlot.copy(); - - if (!performMerge(player, slotIndex, stackInSlot)) { - return null; - } - - if (stackInSlot.stackSize <= 0) { - slot.putStack((ItemStack) null); - } else { - slot.putStack(stackInSlot); - } - - if (stackInSlot.stackSize == stack.stackSize) { - return null; - } - slot.onPickupFromSlot(player, stackInSlot); - } - return stack; +// ItemStack stack = null; +// Slot slot = (Slot) inventorySlots.get(slotIndex); +// +// if (slot != null && slot.getHasStack()) { +// ItemStack stackInSlot = slot.getStack(); +// stack = stackInSlot.copy(); +// +// if (!performMerge(player, slotIndex, stackInSlot)) { +// return null; +// } +// +// if (stackInSlot.stackSize <= 0) { +// slot.putStack((ItemStack) null); +// } else { +// slot.putStack(stackInSlot); +// } +// +// if (stackInSlot.stackSize == stack.stackSize) { +// return null; +// } +// slot.onPickupFromSlot(player, stackInSlot); +// } + return SlotRegion.shiftClick(this, slotIndex, player, regions); } @SuppressWarnings("unchecked") diff --git a/src/main/java/practicalities/gui/ElementEnergyBar.java b/src/main/java/practicalities/gui/ElementEnergyBar.java new file mode 100644 index 0000000..2dd3cee --- /dev/null +++ b/src/main/java/practicalities/gui/ElementEnergyBar.java @@ -0,0 +1,59 @@ +package practicalities.gui; + +import practicalities.PracticalitiesMod; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.util.ResourceLocation; +import cofh.api.energy.IEnergyStorage; +import cofh.lib.gui.GuiBase; +import cofh.lib.gui.element.ElementEnergyStored; +import cofh.lib.render.RenderHelper; +import cofh.lib.util.helpers.MathHelper; + +public class ElementEnergyBar extends ElementEnergyStored { + + public ElementEnergyBar(GuiBase gui, int x, int y, IEnergyStorage storage, int width, int height) { + super(gui, x, y, storage); + this.sizeX = width; + this.sizeY = height; + this.texW = 128; + this.texH = 32; + texture = new ResourceLocation(PracticalitiesMod.TEXTURE_BASE + "textures/gui/element/energy.png"); + } + + + int getPixelsFull() + { + if (this.storage.getMaxEnergyStored() <= 0) { + return 0; + } + double percentage = this.storage.getEnergyStored() / (double)this.storage.getMaxEnergyStored(); + int pixels = (int)( this.sizeY * percentage ); + + return (this.alwaysShowMinimum) && (this.storage.getEnergyStored() > 0) ? Math.max(1, MathHelper.round(pixels)) : MathHelper.round(pixels); + } + + public void drawRect(int x, int y, int w, int h, double u, double v, double texW, double texH) { + Tessellator localTessellator = Tessellator.instance; + localTessellator.startDrawingQuads(); + localTessellator.addVertexWithUV(x+0, y+h, 10, u, v+texH); + localTessellator.addVertexWithUV(x+w, y+h, 10, u+texW, v+texH); + localTessellator.addVertexWithUV(x+w, y+0, 10, u+texW, v ); + localTessellator.addVertexWithUV(x+0, y+0, 10, u, v ); + localTessellator.draw(); + } + + public void drawBackground(int paramInt1, int paramInt2, float paramFloat) { + int i = getScaled(); + + RenderHelper.bindTexture(this.texture); + + int bottom = this.posY + this.sizeY; + + drawRect(this.posX, this.posY, this.sizeX, this.sizeY, + 0, 0, 0.5, 1); + + drawRect(this.posX, bottom -i, this.sizeX, i, + 0.5, 0, 0.5, 1); + } + +} diff --git a/src/main/java/practicalities/gui/ElementProgress.java b/src/main/java/practicalities/gui/ElementProgress.java new file mode 100644 index 0000000..65bf8ea --- /dev/null +++ b/src/main/java/practicalities/gui/ElementProgress.java @@ -0,0 +1,48 @@ +package practicalities.gui; + +import practicalities.Getter; +import cofh.lib.gui.GuiBase; +import cofh.lib.gui.element.ElementBase; + +public class ElementProgress extends ElementBase { + + public Getter getter; + + public int zeroX, zeroY, zeroU, zeroV, zeroWidth, zeroHeight; + public int fullX, fullY, fullU, fullV, fullWidth, fullHeight; + + public ElementProgress(GuiBase gui, + int zeroX, int zeroY, int zeroU, int zeroV, int zeroWidth, int zeroHeight, + int fullX, int fullY, int fullU, int fullV, int fullWidth, int fullHeight, + Getter getter) { + + super(gui, zeroX, zeroY); + + this.zeroX = zeroX; this.zeroY = zeroY; this.zeroU = zeroU; this.zeroV = zeroV; this.zeroWidth = zeroWidth; this.zeroHeight = zeroHeight; + this.fullX = fullX; this.fullY = fullY; this.fullU = fullU; this.fullV = fullV; this.fullWidth = fullWidth; this.fullHeight = fullHeight; + + this.getter = getter; + } + + @Override + public void drawBackground(int paramInt1, int paramInt2, float paramFloat) { + double p = getter.get(); + int x = animateBetween(zeroX, fullX, p); + int y = animateBetween(zeroY, fullY, p); + int u = animateBetween(zeroU, fullU, p); + int v = animateBetween(zeroV, fullV, p); + int w = animateBetween(zeroWidth, fullWidth, p); + int h = animateBetween(zeroHeight, fullHeight, p); + + gui.drawTexturedModalRect(x, y, u, v, w, h); + + } + + @Override + public void drawForeground(int paramInt1, int paramInt2) {} + + public int animateBetween(int zero, int one, double progress) { + return (int) ( zero + (( one-zero )*progress) ); + } + +} diff --git a/src/main/java/practicalities/gui/InventorySingleStack.java b/src/main/java/practicalities/gui/InventorySingleStack.java new file mode 100644 index 0000000..6b14abb --- /dev/null +++ b/src/main/java/practicalities/gui/InventorySingleStack.java @@ -0,0 +1,35 @@ +package practicalities.gui; + +import net.minecraft.item.ItemStack; +import codechicken.lib.inventory.InventorySimple; + +public abstract class InventorySingleStack extends InventorySimple { + + protected String name; + public T data; + + public InventorySingleStack(String name, T data) { + super(1); + this.name = name; + this.data = data; + } + + public ItemStack get() { + return this.items[0]; + } + + public void set(ItemStack stack) { + this.items[0] = stack; + } + + @Override + public boolean isItemValidForSlot(int i, ItemStack stack) { + return stack != null && stack.getItem() != null && validate(stack); + } + + public abstract boolean validate(ItemStack stack); + public String getInventoryName() { + return name; + } + +} diff --git a/src/main/java/practicalities/gui/SlotRegion.java b/src/main/java/practicalities/gui/SlotRegion.java index b900474..f8abe4a 100644 --- a/src/main/java/practicalities/gui/SlotRegion.java +++ b/src/main/java/practicalities/gui/SlotRegion.java @@ -21,7 +21,7 @@ public class SlotRegion { * @param name * @param slots */ - public SlotRegion(String name, int[] slots) { + public SlotRegion(String name, int... slots) { this.name = name; this.slots = slots; } diff --git a/src/main/java/practicalities/machine/inventoryfilter/ContainerInventoryFilter.java b/src/main/java/practicalities/machine/inventoryfilter/ContainerInventoryFilter.java index f3960bc..afb7a8d 100755 --- a/src/main/java/practicalities/machine/inventoryfilter/ContainerInventoryFilter.java +++ b/src/main/java/practicalities/machine/inventoryfilter/ContainerInventoryFilter.java @@ -15,21 +15,21 @@ public class ContainerInventoryFilter extends ContainerBase implements IContaine private TileInventoryFilter tile; private IInventory inv; - private SlotRegion mainInv, hotbar, card; + private SlotRegion card; public ContainerInventoryFilter(InventoryPlayer player, TileInventoryFilter tile) { this.tile = tile; bindPlayerInventory(player); Slot cardSlot; - addSlotToContainer(cardSlot = new SlotAcceptValid(inv = tile.getFilterInventory(), 0, 102, 10)); + addSlotToContainer(cardSlot = new SlotAcceptValid(inv = tile.filterCard, 0, 102, 10)); - mainInv = new SlotRegion("mainInventory", 0, 26); - hotbar = new SlotRegion("hotbar", 27, 35); card = new SlotRegion("filterCard", new int[] { cardSlot.slotNumber }); hotbar.addShiftTargets(card, mainInv); mainInv.addShiftTargets(card, hotbar); card.addShiftTargets(hotbar, mainInv); + + setShiftClickRegions(card, mainInv, hotbar); } @Override @@ -70,13 +70,13 @@ public void buttonClick(int button, int action) { tile.markFilthy(); } - @Override - public ItemStack transferStackInSlot(EntityPlayer player, int slotIndex) { - if (!supportsShiftClick(player, slotIndex)) { - return null; - } - - return SlotRegion.shiftClick(this, slotIndex, player, card, mainInv, hotbar); - } +// @Override +// public ItemStack transferStackInSlot(EntityPlayer player, int slotIndex) { +// if (!supportsShiftClick(player, slotIndex)) { +// return null; +// } +// +// return SlotRegion.shiftClick(this, slotIndex, player, card, mainInv, hotbar); +// } } diff --git a/src/main/java/practicalities/machine/inventoryfilter/GuiInventoryFilter.java b/src/main/java/practicalities/machine/inventoryfilter/GuiInventoryFilter.java index 3a1b859..a304a93 100755 --- a/src/main/java/practicalities/machine/inventoryfilter/GuiInventoryFilter.java +++ b/src/main/java/practicalities/machine/inventoryfilter/GuiInventoryFilter.java @@ -9,7 +9,6 @@ import practicalities.network.Net; import practicalities.network.TextFieldPacket; import cofh.lib.gui.GuiBase; -import cofh.lib.gui.element.ElementBase; import cofh.lib.gui.element.ElementTextField; import cofh.lib.gui.element.ElementTextFieldFiltered; diff --git a/src/main/java/practicalities/machine/inventoryfilter/TileInventoryFilter.java b/src/main/java/practicalities/machine/inventoryfilter/TileInventoryFilter.java index d544724..074a9e8 100644 --- a/src/main/java/practicalities/machine/inventoryfilter/TileInventoryFilter.java +++ b/src/main/java/practicalities/machine/inventoryfilter/TileInventoryFilter.java @@ -4,6 +4,7 @@ import java.util.List; import practicalities.IItemFilter; +import practicalities.gui.InventorySingleStack; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.inventory.IInventory; @@ -26,7 +27,19 @@ public class TileInventoryFilter extends TileCoFHBase implements ISidedInventory public int slotStart = 0; public int slotEnd = 65536; public boolean invert = false; - public ItemStack filterCard = null; + public InventorySingleStack filterCard = new InventorySingleStack("inventory.inventoryFilter.slotFilter", this) { + + @Override + public boolean validate(ItemStack stack) { + return stack.getItem() instanceof IItemFilter; + }; + + public void markDirty() { + super.markDirty(); + data.markFilthy(); + }; + + }; /** * Call both markDirty() and worldObj.markBlockForUpdate @@ -57,79 +70,11 @@ public int getType() { return 0; } - public IInventory getFilterInventory() { - final TileInventoryFilter tile = this; - return new IInventory() { - - @Override - public void setInventorySlotContents(int slot, ItemStack stack) { - tile.filterCard = stack; - } - - @Override - public void openInventory() {} - - @Override - public void markDirty() { - tile.markFilthy(); - } - - @Override - public boolean isUseableByPlayer(EntityPlayer player) { - return true; - } - - @Override - public boolean isItemValidForSlot(int slot, ItemStack stack) { - return stack != null && stack.getItem() != null && stack.getItem() instanceof IItemFilter; - } - - @Override - public boolean hasCustomInventoryName() { return false; } - - @Override - public ItemStack getStackInSlotOnClosing(int p_70304_1_) { - return null; - } - - @Override - public ItemStack getStackInSlot(int p_70301_1_) { - return tile.filterCard; - } - - @Override - public int getSizeInventory() { - return 1; - } - - @Override - public int getInventoryStackLimit() { - return 64; - } - - @Override - public String getInventoryName() { - return "inventory.inventoryFilter.slotFilter"; - } - - @Override - public ItemStack decrStackSize(int slot, int amt) { - ItemStack ret = tile.filterCard.copy(); - tile.filterCard.stackSize -= amt; - ret.stackSize = amt; - return ret; - } - - @Override - public void closeInventory() {} - }; - } - @SuppressWarnings("unchecked") public IItemFilter getFilter() { IItemFilter f = null; - if(filterCard != null && filterCard.getItem() instanceof IItemFilter) { - f = (IItemFilter)filterCard.getItem(); + if(filterCard.get() != null && filterCard.get().getItem() instanceof IItemFilter) { + f = (IItemFilter)filterCard.get().getItem(); } return f; } @@ -146,9 +91,9 @@ public void writeToNBT(NBTTagCompound tag) { tag.setInteger("end", slotEnd); tag.setBoolean("invert", invert); - if(filterCard != null) { + if(filterCard.get() != null) { NBTTagCompound stackTag = new NBTTagCompound(); - filterCard.writeToNBT(stackTag); + filterCard.get().writeToNBT(stackTag); tag.setTag("filter", stackTag); } else { tag.removeTag("filter"); @@ -163,7 +108,9 @@ public void readFromNBT(NBTTagCompound tag) { slotEnd = tag.getInteger("end"); invert = tag.getBoolean("invert"); if(tag.hasKey("filter")) { - filterCard = ItemStack.loadItemStackFromNBT(tag.getCompoundTag("filter")); + filterCard.set( ItemStack.loadItemStackFromNBT(tag.getCompoundTag("filter")) ); + } else { + filterCard.set(null); } } @@ -335,7 +282,7 @@ public int[] getAccessibleSlotsFromSide(int p_94128_1_) { public boolean canInsertItem(int p_102007_1_, ItemStack p_102007_2_, int p_102007_3_) { if(!isFacingInventory()) return false; IItemFilter f = getFilter(); - if(f != null && f.filter(filterCard, p_102007_2_) == invert) return false; + if(f != null && f.filter(filterCard.get(), p_102007_2_) == invert) return false; if(getInventoryFacing() instanceof ISidedInventory) ((ISidedInventory)getInventoryFacing()).canInsertItem(p_102007_1_, p_102007_2_, facing.getOpposite().ordinal()); return true; @@ -345,7 +292,7 @@ public boolean canInsertItem(int p_102007_1_, ItemStack p_102007_2_, int p_10200 public boolean canExtractItem(int p_102008_1_, ItemStack p_102008_2_, int p_102008_3_) { if(!isFacingInventory()) return false; IItemFilter f = getFilter(); - if(f != null && f.filter(filterCard, p_102008_2_) == invert) return false; + if(f != null && f.filter(filterCard.get(), p_102008_2_) == invert) return false; if(getInventoryFacing() instanceof ISidedInventory) ((ISidedInventory)getInventoryFacing()).canExtractItem(p_102008_1_, p_102008_2_, facing.getOpposite().ordinal()); return true; diff --git a/src/main/java/practicalities/machine/masher/BlockMasher.java b/src/main/java/practicalities/machine/masher/BlockMasher.java new file mode 100644 index 0000000..a537e1e --- /dev/null +++ b/src/main/java/practicalities/machine/masher/BlockMasher.java @@ -0,0 +1,39 @@ +package practicalities.machine.masher; + +import net.minecraft.block.material.Material; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; +import practicalities.PracticalitiesMod; +import practicalities.blocks.BlockBase; +import practicalities.gui.GuiHandler; + +public class BlockMasher extends BlockBase { + + public BlockMasher() { + super(Material.rock, "masher", 1, null); + // TODO Auto-generated constructor stub + } + + @Override + public boolean hasTileEntity() { + return true; + } + + @Override + public TileEntity createTileEntity(World world, int metadata) { + return new TileMasher(); + } + + + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int p6, float p7, float p8, + float p9) { + + player.openGui(PracticalitiesMod.instance, GuiHandler.TILE_ID, world, x, y, z); + + return true; + + } + +} diff --git a/src/main/java/practicalities/machine/masher/ContainerMasher.java b/src/main/java/practicalities/machine/masher/ContainerMasher.java new file mode 100644 index 0000000..9014a73 --- /dev/null +++ b/src/main/java/practicalities/machine/masher/ContainerMasher.java @@ -0,0 +1,45 @@ +package practicalities.machine.masher; + +import cofh.lib.gui.slot.SlotAcceptValid; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.inventory.Slot; +import practicalities.gui.ContainerBase; +import practicalities.gui.SlotRegion; + +public class ContainerMasher extends ContainerBase { + + private SlotRegion food; + + public ContainerMasher(InventoryPlayer player, TileMasher tile) { + bindPlayerInventory(player); + + Slot s = new SlotAcceptValid(tile.food, 0, 80, 28); + addSlotToContainer(s); + int index = s.slotNumber; + + food = new SlotRegion("foodSlot", new int[] { index }); + + mainInv.addShiftTargets(food, hotbar); + hotbar.addShiftTargets(food, mainInv); + food.addShiftTargets(hotbar, mainInv); + + setShiftClickRegions(food, mainInv, hotbar); + } + + @Override + protected int getPlayerInventoryVerticalOffset() { + return 84; + } + + @Override + protected int getSizeInventory() { + return 1; + } + + @Override + public boolean canInteractWith(EntityPlayer p_75145_1_) { + return true; + } + +} diff --git a/src/main/java/practicalities/machine/masher/GuiMasher.java b/src/main/java/practicalities/machine/masher/GuiMasher.java new file mode 100644 index 0000000..1cf385f --- /dev/null +++ b/src/main/java/practicalities/machine/masher/GuiMasher.java @@ -0,0 +1,49 @@ +package practicalities.machine.masher; + +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.util.ResourceLocation; +import practicalities.Getter; +import practicalities.PracticalitiesMod; +import practicalities.gui.ElementEnergyBar; +import practicalities.gui.ElementProgress; +import cofh.lib.gui.GuiBase; +import cofh.lib.gui.element.ElementFluidTank; + +public class GuiMasher extends GuiBase { + + TileMasher tile; + + public GuiMasher(InventoryPlayer inventory, TileMasher tile) { + super(new ContainerMasher(inventory, tile)); + this.tile = tile; + texture = new ResourceLocation(PracticalitiesMod.TEXTURE_BASE + "textures/gui/masher.png"); + + } + + @Override + public void initGui() { + super.initGui(); + + Getter getter = new Getter(tile) { + public Double get() { + return tile.getProgress(); + } + }; + + addElement(new ElementProgress(this, + 84, 46, 0, 166, 11, 11, // 79, 27, 18, 17, // + 84, 57, 0, 177, 11, 0, // 79, 44, 18, 0, + getter + )); + + + + + ElementEnergyBar energy = new ElementEnergyBar(this, 7, 7, tile.energy, 16, 60); + addElement(energy); + + ElementFluidTank tank = new ElementFluidTank(this, 153, 7, tile.tank); + addElement(tank); + } + +} diff --git a/src/main/java/practicalities/machine/masher/TileMasher.java b/src/main/java/practicalities/machine/masher/TileMasher.java new file mode 100644 index 0000000..a700583 --- /dev/null +++ b/src/main/java/practicalities/machine/masher/TileMasher.java @@ -0,0 +1,293 @@ +package practicalities.machine.masher; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.inventory.IInventory; +import net.minecraft.item.ItemFood; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.network.NetworkManager; +import net.minecraft.network.Packet; +import net.minecraft.network.play.server.S35PacketUpdateTileEntity; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.Fluid; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.FluidTank; +import net.minecraftforge.fluids.FluidTankInfo; +import net.minecraftforge.fluids.IFluidHandler; +import practicalities.blocks.ModBlocks; +import practicalities.gui.InventorySingleStack; +import cofh.api.energy.EnergyStorage; +import cofh.api.energy.IEnergyReceiver; +import cofh.core.block.TileCoFHBase; +import cpw.mods.fml.common.registry.GameRegistry; + +public class TileMasher extends TileCoFHBase implements IFluidHandler, IInventory, IEnergyReceiver{ + + public int ENERGY_PER_MB = 10; + public int MB_PER_TICK = 10; + + public int process_output_max; // start beyond the process time so it doesn't process when it's first loaded + public int process_output; + + public EnergyStorage energy = new EnergyStorage(1000); + public FluidTank tank = new FluidTank(5000); + public InventorySingleStack food = new InventorySingleStack("inventory.tile.masher", this) { + + @Override + public boolean validate(ItemStack stack) { + return stack.getItem() instanceof ItemFood; + } + + public void markDirty() { + super.markDirty(); + data.markFilthy(); + }; + + }; + + public TileMasher() { + food.data = this; + } + + public static void initialize() { + GameRegistry.registerTileEntity(TileMasher.class, "p2.masher"); + } + + @Override + public boolean canUpdate() { + return true; + } + + @Override + public void updateEntity() { + if(this.worldObj.isRemote) + return; + + if(process_output == 0 && food.get() != null && food.get().stackSize >= 1) { + ItemStack processing = food.get(); + ItemFood foodProcessing = (ItemFood)processing.getItem(); + + int heal = foodProcessing.func_150905_g(processing); +// float saturation = foodProcessing.func_150906_h(processing); + + int out = (int)( (heal)*100 ); + + food.decrStackSize(0, 1); + process_output = process_output_max = out; + + } + + if(process_output > 0) { + int possibleFill = tank.fill(new FluidStack(ModBlocks.preChewedFood, Math.min(process_output, 10)), false); + if(energy.getEnergyStored() >= possibleFill*ENERGY_PER_MB) { + energy.extractEnergy(possibleFill*ENERGY_PER_MB, false); + process_output -= tank.fill(new FluidStack(ModBlocks.preChewedFood, Math.min(process_output, 10)), true); + } + } + } + + public double getProgress() { + return (process_output_max-process_output)/(double)process_output_max; + } + + @Override + public String getName() { + return null; + } + + @Override + public int getType() { + return 0; + } + + /** + * Call both markDirty() and worldObj.markBlockForUpdate + * This sends an update packet to the client + */ + public void markFilthy() { + this.markDirty(); + this.worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); + } + + @Override + public Object getGuiClient(InventoryPlayer inventory) { + return new GuiMasher(inventory, this); + } + + @Override + public Object getGuiServer(InventoryPlayer inventory) { + return new ContainerMasher(inventory, this); + } + + @Override + public void writeToNBT(NBTTagCompound tag) { + super.writeToNBT(tag); + energy.writeToNBT(tag); + tag.setInteger("tankAmount", tank.getFluidAmount()); + + tag.setInteger("process_max", process_output_max); + tag.setInteger("process", process_output); + + if(food.get() != null) { + NBTTagCompound stackTag = new NBTTagCompound(); + food.get().writeToNBT(stackTag); + tag.setTag("food", stackTag); + } else { + tag.removeTag("food"); + } + } + + @Override + public void readFromNBT(NBTTagCompound tag) { + super.readFromNBT(tag); + energy.readFromNBT(tag); + if(tank.getFluid() == null) { + tank.setFluid(new FluidStack(ModBlocks.preChewedFood, 10)); + } + tank.getFluid().amount = tag.getInteger("tankAmount"); + + process_output_max = tag.getInteger("process_max"); + process_output = tag.getInteger("process"); + + if(tag.hasKey("food")) { + food.set( ItemStack.loadItemStackFromNBT(tag.getCompoundTag("food")) ); + } else { + food.set(null); + } + } + + + + @Override + public Packet getDescriptionPacket() { + NBTTagCompound syncData = new NBTTagCompound(); + this.writeToNBT(syncData); + return new S35PacketUpdateTileEntity(this.xCoord, this.yCoord, this.zCoord, 1, syncData); + } + + @Override + public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity pkt) { + readFromNBT(pkt.func_148857_g()); + } + + ///\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\\\ + + @Override + public boolean canConnectEnergy(ForgeDirection dir) { + return true; + } + + @Override + public int receiveEnergy(ForgeDirection dir, int amt, boolean simulate) { + if(!simulate && energy.getEnergyStored() != energy.getMaxEnergyStored()) markFilthy(); + return energy.receiveEnergy(amt, simulate); + } + + @Override + public int getEnergyStored(ForgeDirection dir) { + return energy.getEnergyStored(); + } + + @Override + public int getMaxEnergyStored(ForgeDirection dir) { + return energy.getMaxEnergyStored(); + } + + ///\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\\\ + + @Override + public int getSizeInventory() { + return food.getSizeInventory(); + } + + @Override + public ItemStack getStackInSlot(int slot) { + return food.getStackInSlot(slot); + } + + @Override + public ItemStack decrStackSize(int slot, int amt) { + return food.decrStackSize(slot, amt); + } + + @Override + public ItemStack getStackInSlotOnClosing(int slot) { + return food.getStackInSlotOnClosing(slot); + } + + @Override + public void setInventorySlotContents(int slot, ItemStack stack) { + food.setInventorySlotContents(slot, stack); + } + + @Override + public String getInventoryName() { + return "inventory.masher"; + } + + @Override + public boolean hasCustomInventoryName() { + return false; + } + + @Override + public int getInventoryStackLimit() { + return 64; + } + + @Override + public boolean isUseableByPlayer(EntityPlayer p_70300_1_) { + return true; + } + + @Override + public void openInventory() {} + + @Override + public void closeInventory() {} + + @Override + public boolean isItemValidForSlot(int slot, ItemStack stack) { + return food.isItemValidForSlot(slot, stack); + } + + ///\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\\\ + + @Override + public int fill(ForgeDirection from, FluidStack resource, boolean doFill) { + return 0; +// if(doFill && tank.getFluidAmount() != tank.getCapacity()) markFilthy(); +// return tank.fill(resource, doFill); + } + + @Override + public FluidStack drain(ForgeDirection from, FluidStack resource, boolean doDrain) { + if(doDrain && tank.getFluidAmount() > 0) markFilthy(); + return tank.drain(Math.min(tank.getCapacity(), resource.amount), doDrain); + } + + @Override + public FluidStack drain(ForgeDirection from, int maxDrain, boolean doDrain) { + if(doDrain && tank.getFluidAmount() > 0) markFilthy(); + return tank.drain(Math.min(tank.getCapacity(), maxDrain), doDrain); + } + + @Override + public boolean canFill(ForgeDirection from, Fluid fluid) { + return fluid == ModBlocks.preChewedFood; + } + + @Override + public boolean canDrain(ForgeDirection from, Fluid fluid) { + return false; +// return fluid == ModBlocks.preChewedFood; + } + + @Override + public FluidTankInfo[] getTankInfo(ForgeDirection from) { + return new FluidTankInfo[] { tank.getInfo() }; + } + + ///\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\\\ +} diff --git a/src/main/java/practicalities/machine/shippingcrate/ContainerShippingCrate.java b/src/main/java/practicalities/machine/shippingcrate/ContainerShippingCrate.java index ba8b0ba..86055ea 100755 --- a/src/main/java/practicalities/machine/shippingcrate/ContainerShippingCrate.java +++ b/src/main/java/practicalities/machine/shippingcrate/ContainerShippingCrate.java @@ -13,7 +13,7 @@ public class ContainerShippingCrate extends ContainerBase { private TileShippingCrate shippingCrate; - private SlotRegion mainInv, hotbar, crate, card; + private SlotRegion crate, card; public ContainerShippingCrate(InventoryPlayer player, TileShippingCrate shippingCrate) { this.shippingCrate = shippingCrate; @@ -32,9 +32,6 @@ public ContainerShippingCrate(InventoryPlayer player, TileShippingCrate shipping // filter slot Slot cardSlot = this.addSlotToContainer(new SlotAcceptAssignable(shippingCrate, shippingCrate.getFilterSlotIndex(), 152, 5, ItemFilterCard.class)); - mainInv = new SlotRegion("mainInventory", 0, 26); - hotbar = new SlotRegion("hotbar", 27, 35); - SlotRegion[] cols = new SlotRegion[9]; for (int i = 0; i < indexColumns.length; i++) { int[] column = indexColumns[i]; @@ -48,6 +45,8 @@ public ContainerShippingCrate(InventoryPlayer player, TileShippingCrate shipping mainInv.addShiftTargets(card, crate, hotbar); crate.addShiftTargets(mainInv, hotbar); card.addShiftTargets(hotbar, mainInv); + + setShiftClickRegions(card, crate, mainInv, hotbar); } @@ -66,15 +65,5 @@ protected int getSizeInventory() { public boolean canInteractWith(EntityPlayer player) { return true; } - - @Override - public ItemStack transferStackInSlot(EntityPlayer player, int slotIndex) { - - if (!supportsShiftClick(player, slotIndex)) { - return null; - } - - return SlotRegion.shiftClick(this, slotIndex, player, card, mainInv, hotbar, crate); - } } diff --git a/src/main/resources/assets/practicalities/textures/blocks/preChewedFood/flow.png b/src/main/resources/assets/practicalities/textures/blocks/preChewedFood/flow.png new file mode 100644 index 0000000000000000000000000000000000000000..beb36f6ec85385f43b90305fff3786410e729f29 GIT binary patch literal 8878 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 b{NVoqRb*?yf&6f500000NkvXXu0mjf$Pucm literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/practicalities/textures/blocks/preChewedFood/still.png b/src/main/resources/assets/practicalities/textures/blocks/preChewedFood/still.png new file mode 100644 index 0000000000000000000000000000000000000000..1e6b132d001e0fc4cea9ba4672a81924e73e7549 GIT binary patch literal 11398 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/practicalities/textures/blocks/preChewedFood/still.png.mcmeta b/src/main/resources/assets/practicalities/textures/blocks/preChewedFood/still.png.mcmeta new file mode 100755 index 0000000..4b721e0 --- /dev/null +++ b/src/main/resources/assets/practicalities/textures/blocks/preChewedFood/still.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation": { + "frametime": 2 + } +} diff --git a/src/main/resources/assets/practicalities/textures/gui/element/energy.png b/src/main/resources/assets/practicalities/textures/gui/element/energy.png new file mode 100644 index 0000000000000000000000000000000000000000..d27aceb7df7fd84f3346cb2b79fffccaa7842f6d GIT binary patch literal 1480 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 literal 0 HcmV?d00001 From 9d24e8127f3c7ca22634b9c2a5791c21c401de38 Mon Sep 17 00:00:00 2001 From: Pierce Corcoran Date: Sat, 5 Dec 2015 23:56:20 -0600 Subject: [PATCH 2/4] Add feeding support to Player Interface --- src/main/java/practicalities/ConfigMan.java | 7 +- .../machine/masher/TileMasher.java | 4 +- .../playerinterface/TilePlayerInterface.java | 97 ++++++++++++++++++- .../practicalities/network/ProxyClient.java | 11 +++ 4 files changed, 114 insertions(+), 5 deletions(-) diff --git a/src/main/java/practicalities/ConfigMan.java b/src/main/java/practicalities/ConfigMan.java index 51aabbf..4b23913 100755 --- a/src/main/java/practicalities/ConfigMan.java +++ b/src/main/java/practicalities/ConfigMan.java @@ -1,5 +1,6 @@ package practicalities; +import net.minecraft.launchwrapper.Launch; import net.minecraftforge.common.config.Configuration; public class ConfigMan @@ -9,8 +10,10 @@ public class ConfigMan * Sure, they will take up an ID for no reason * but I feel that is an ok trade off for not having * to worry about it when making recipes - */ - + */ + + public static boolean isDev = (Boolean)Launch.blackboard.get("fml.deobfuscatedEnvironment"); + private static Configuration config; //blocks diff --git a/src/main/java/practicalities/machine/masher/TileMasher.java b/src/main/java/practicalities/machine/masher/TileMasher.java index a700583..09cde10 100644 --- a/src/main/java/practicalities/machine/masher/TileMasher.java +++ b/src/main/java/practicalities/machine/masher/TileMasher.java @@ -69,9 +69,9 @@ public void updateEntity() { ItemFood foodProcessing = (ItemFood)processing.getItem(); int heal = foodProcessing.func_150905_g(processing); -// float saturation = foodProcessing.func_150906_h(processing); + float saturation = foodProcessing.func_150906_h(processing); - int out = (int)( (heal)*100 ); + int out = (int)( (heal+saturation)*100); food.decrStackSize(0, 1); process_output = process_output_max = out; diff --git a/src/main/java/practicalities/machine/playerinterface/TilePlayerInterface.java b/src/main/java/practicalities/machine/playerinterface/TilePlayerInterface.java index a92828b..864c9ff 100755 --- a/src/main/java/practicalities/machine/playerinterface/TilePlayerInterface.java +++ b/src/main/java/practicalities/machine/playerinterface/TilePlayerInterface.java @@ -4,6 +4,7 @@ import java.util.List; import java.util.UUID; +import practicalities.blocks.ModBlocks; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.IInventory; import net.minecraft.item.ItemStack; @@ -12,15 +13,24 @@ import net.minecraft.network.Packet; import net.minecraft.network.play.server.S35PacketUpdateTileEntity; import net.minecraft.server.MinecraftServer; +import net.minecraft.util.FoodStats; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.Fluid; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.FluidTank; +import net.minecraftforge.fluids.FluidTankInfo; +import net.minecraftforge.fluids.IFluidHandler; import cofh.core.block.TileCoFHBase; import cpw.mods.fml.common.registry.GameRegistry; -public class TilePlayerInterface extends TileCoFHBase implements IInventory { +public class TilePlayerInterface extends TileCoFHBase implements IInventory, IFluidHandler { private WeakReference player; private UUID uuid; private String lastName; + public FluidTank tank = new FluidTank(1000); + private int timeout = 0; public TilePlayerInterface() { @@ -73,6 +83,23 @@ public void updateEntity() { } else { updatePlayer(false); } + + if(hasPlayer()) { + FoodStats f = player.get().getFoodStats(); + if(f.getFoodLevel() < 20 && tank.getFluidAmount() > 100) { + tank.drain(100, true); + int food = 1; + float sat = 0; + + if(f.getSaturationLevel() < 20 && tank.getFluidAmount() > 0) { + FluidStack drained = tank.drain((int)( 20-f.getSaturationLevel() )*100, true); + sat = (float)( drained.amount/100.0 ); + } + + f.addStats(food, sat); + } + + } } @Override public boolean canUpdate() { @@ -101,12 +128,14 @@ public boolean canPlayerDismantle(EntityPlayer player) { @Override public void writeToNBT(NBTTagCompound nbtTag) { super.writeToNBT(nbtTag); + tank.writeToNBT(nbtTag); writeSyncableDataToNBT(nbtTag); } @Override public void readFromNBT(NBTTagCompound nbtTag) { super.readFromNBT(nbtTag); + tank.readFromNBT(nbtTag); readSyncableDataFromNBT(nbtTag); } @@ -233,4 +262,70 @@ public String getInventoryName() { public boolean hasCustomInventoryName() { return false; } + + // *************************** + +// @Override +// public int fill(ForgeDirection from, FluidStack resource, boolean doFill) { +// if(!hasPlayer()) return 0; +// if(player.get().getFoodStats().needFood()) { +// +// FoodStats fs = player.get().getFoodStats(); +// +// int amtNeeded = 0; +// +// int hamNeeded = 100*( 20 - fs.getFoodLevel() ); +// int satNeeded = (int)( 100*( 20.0 - fs.getSaturationLevel() ) ); +// +// amtNeeded = hamNeeded+satNeeded; +// +// amtNeeded = Math.min(amtNeeded, resource.amount); +// +// if(doFill) { +// int amtHam = Math.min(hamNeeded, amtNeeded)/100; +// float amtSat = Math.min(satNeeded, (amtNeeded-(amtHam*100)))/100; +// +// fs.addStats(amtHam, amtSat); +// } +// return amtNeeded; +//// amtNeeded = hamPointsNeeded*100 + saturationNeeded*100; +// +// } +// return 0; +// } + + @Override + public int fill(ForgeDirection from, FluidStack resource, boolean doFill) { + if(doFill && tank.getFluidAmount() != tank.getCapacity()) markDirty(); + return tank.fill(resource, doFill); + } + + @Override + public FluidStack drain(ForgeDirection from, FluidStack resource, boolean doDrain) { + return null; +// if(doDrain && tank.getFluidAmount() > 0) markFilthy(); +// return tank.drain(Math.min(tank.getCapacity(), resource.amount), doDrain); + } + + @Override + public FluidStack drain(ForgeDirection from, int maxDrain, boolean doDrain) { + return null; +// if(doDrain && tank.getFluidAmount() > 0) markFilthy(); +// return tank.drain(Math.min(tank.getCapacity(), maxDrain), doDrain); + } + + @Override + public boolean canFill(ForgeDirection from, Fluid fluid) { + return true; //fluid != null && fluid.getName() == ModBlocks.preChewedFood.getName(); + } + + @Override + public boolean canDrain(ForgeDirection from, Fluid fluid) { + return false; + } + + @Override + public FluidTankInfo[] getTankInfo(ForgeDirection from) { + return new FluidTankInfo[] { tank.getInfo() }; + } } diff --git a/src/main/java/practicalities/network/ProxyClient.java b/src/main/java/practicalities/network/ProxyClient.java index e34b3f8..dd63702 100755 --- a/src/main/java/practicalities/network/ProxyClient.java +++ b/src/main/java/practicalities/network/ProxyClient.java @@ -1,9 +1,12 @@ package practicalities.network; +import net.minecraft.client.Minecraft; import net.minecraft.client.settings.KeyBinding; +import net.minecraftforge.client.event.RenderGameOverlayEvent; import org.lwjgl.input.Keyboard; +import practicalities.ConfigMan; import cpw.mods.fml.client.registry.ClientRegistry; import cpw.mods.fml.common.eventhandler.SubscribeEvent; import cpw.mods.fml.common.gameevent.InputEvent; @@ -38,4 +41,12 @@ public void onKeyInput(InputEvent.KeyInputEvent event) { Net.channel.sendToServer(new ToggleMagnetPacket()); } } + + @SubscribeEvent + public void drawDebug(RenderGameOverlayEvent.Text event) { + if(!ConfigMan.isDev) return; + if(!Minecraft.getMinecraft().gameSettings.showDebugInfo) return; + + event.left.add("Saturation:" + Minecraft.getMinecraft().thePlayer.getFoodStats().getSaturationLevel()); + } } From 3b73c073b465ad959985ab00c24bec60b90349b4 Mon Sep 17 00:00:00 2001 From: Pierce Corcoran Date: Sun, 6 Dec 2015 12:21:31 -0600 Subject: [PATCH 3/4] Finish up Pre-Chewed Food --- .../java/practicalities/BucketHandler.java | 55 ++++++++++++++++++ .../practicalities/PracticalitiesMod.java | 1 + .../java/practicalities/blocks/ModBlocks.java | 4 ++ .../prechewedfood/BlockPreChewedFood.java | 23 ++++---- .../practicalities/gui/ContainerBase.java | 22 ------- .../practicalities/items/ItemBucketPCF.java | 18 ++++++ .../java/practicalities/items/ModItems.java | 31 +++++++++- .../machine/masher/TileMasher.java | 8 +-- .../playerinterface/TilePlayerInterface.java | 15 +++-- .../java/practicalities/network/Proxy.java | 2 + .../assets/practicalities/lang/en_US.lang | 8 ++- .../textures/items/bucket_preChewedFood.png | Bin 0 -> 397 bytes 12 files changed, 139 insertions(+), 48 deletions(-) create mode 100644 src/main/java/practicalities/BucketHandler.java create mode 100644 src/main/java/practicalities/items/ItemBucketPCF.java create mode 100644 src/main/resources/assets/practicalities/textures/items/bucket_preChewedFood.png diff --git a/src/main/java/practicalities/BucketHandler.java b/src/main/java/practicalities/BucketHandler.java new file mode 100644 index 0000000..850fa8d --- /dev/null +++ b/src/main/java/practicalities/BucketHandler.java @@ -0,0 +1,55 @@ +package practicalities; + +import java.util.HashMap; +import java.util.Map; + +import net.minecraft.block.Block; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.world.World; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.event.entity.player.FillBucketEvent; +import practicalities.blocks.ModBlocks; +import practicalities.items.ModItems; +import cpw.mods.fml.common.eventhandler.Event.Result; +import cpw.mods.fml.common.eventhandler.SubscribeEvent; + +public class BucketHandler { + + public static BucketHandler INSTANCE = new BucketHandler(); + public Map buckets = new HashMap(); + + public static void init() { + BucketHandler.INSTANCE.buckets.put(ModBlocks.blockPreChewedFood, ModItems.bucketPreChewedFood); + MinecraftForge.EVENT_BUS.register(BucketHandler.INSTANCE); + } + + private BucketHandler() { + } + + @SubscribeEvent + public void onBucketFill(FillBucketEvent event) { + + ItemStack result = fillCustomBucket(event.world, event.target); + + if (result == null) + return; + + event.result = result; + event.setResult(Result.ALLOW); + } + + private ItemStack fillCustomBucket(World world, MovingObjectPosition pos) { + + Block block = world.getBlock(pos.blockX, pos.blockY, pos.blockZ); + + Item bucket = buckets.get(block); + if (bucket != null && world.getBlockMetadata(pos.blockX, pos.blockY, pos.blockZ) == 0) { + world.setBlockToAir(pos.blockX, pos.blockY, pos.blockZ); + return new ItemStack(bucket); + } else + return null; + + } +} diff --git a/src/main/java/practicalities/PracticalitiesMod.java b/src/main/java/practicalities/PracticalitiesMod.java index ca27552..3156035 100755 --- a/src/main/java/practicalities/PracticalitiesMod.java +++ b/src/main/java/practicalities/PracticalitiesMod.java @@ -47,6 +47,7 @@ public void preInit(FMLPreInitializationEvent event) { @EventHandler public void init(FMLInitializationEvent event) { NetworkRegistry.INSTANCE.registerGuiHandler(instance, guiHandler); + BucketHandler.init(); } @EventHandler diff --git a/src/main/java/practicalities/blocks/ModBlocks.java b/src/main/java/practicalities/blocks/ModBlocks.java index c4b871a..6e793d2 100755 --- a/src/main/java/practicalities/blocks/ModBlocks.java +++ b/src/main/java/practicalities/blocks/ModBlocks.java @@ -51,4 +51,8 @@ public static void init() { if(ConfigMan.enableMagnet) polarityNegator = new BlockPolarityNegator(); } + + public static void postInit() { + + } } diff --git a/src/main/java/practicalities/fluid/prechewedfood/BlockPreChewedFood.java b/src/main/java/practicalities/fluid/prechewedfood/BlockPreChewedFood.java index 8a5c99a..93bd96b 100644 --- a/src/main/java/practicalities/fluid/prechewedfood/BlockPreChewedFood.java +++ b/src/main/java/practicalities/fluid/prechewedfood/BlockPreChewedFood.java @@ -25,6 +25,7 @@ public BlockPreChewedFood(Fluid fluid) { super(fluid, Material.water); this.fluid = fluid; setCreativeTab(CreativeTabs.tabMisc); + setBlockName("preChewedFood"); GameRegistry.registerBlock(this, fluid.getUnlocalizedName()); } @@ -42,16 +43,16 @@ public void registerBlockIcons(IIconRegister register) { fluid.setFlowingIcon(flowingIcon); } - @Override - public boolean canDisplace(IBlockAccess world, int x, int y, int z) { - if (world.getBlock(x, y, z).getMaterial().isLiquid()) return false; - return super.canDisplace(world, x, y, z); - } - - @Override - public boolean displaceIfPossible(World world, int x, int y, int z) { - if (world.getBlock(x, y, z).getMaterial().isLiquid()) return false; - return super.displaceIfPossible(world, x, y, z); - } +// @Override +// public boolean canDisplace(IBlockAccess world, int x, int y, int z) { +//// if (world.getBlock(x, y, z).getMaterial().isLiquid()) return false; +// return super.canDisplace(world, x, y, z); +// } +// +// @Override +// public boolean displaceIfPossible(World world, int x, int y, int z) { +//// if (world.getBlock(x, y, z).getMaterial().isLiquid()) return false; +// return super.displaceIfPossible(world, x, y, z); +// } } diff --git a/src/main/java/practicalities/gui/ContainerBase.java b/src/main/java/practicalities/gui/ContainerBase.java index ae7e312..f44c07f 100755 --- a/src/main/java/practicalities/gui/ContainerBase.java +++ b/src/main/java/practicalities/gui/ContainerBase.java @@ -89,28 +89,6 @@ public ItemStack transferStackInSlot(EntityPlayer player, int slotIndex) { return null; } -// ItemStack stack = null; -// Slot slot = (Slot) inventorySlots.get(slotIndex); -// -// if (slot != null && slot.getHasStack()) { -// ItemStack stackInSlot = slot.getStack(); -// stack = stackInSlot.copy(); -// -// if (!performMerge(player, slotIndex, stackInSlot)) { -// return null; -// } -// -// if (stackInSlot.stackSize <= 0) { -// slot.putStack((ItemStack) null); -// } else { -// slot.putStack(stackInSlot); -// } -// -// if (stackInSlot.stackSize == stack.stackSize) { -// return null; -// } -// slot.onPickupFromSlot(player, stackInSlot); -// } return SlotRegion.shiftClick(this, slotIndex, player, regions); } diff --git a/src/main/java/practicalities/items/ItemBucketPCF.java b/src/main/java/practicalities/items/ItemBucketPCF.java new file mode 100644 index 0000000..4317cd1 --- /dev/null +++ b/src/main/java/practicalities/items/ItemBucketPCF.java @@ -0,0 +1,18 @@ +package practicalities.items; + +import cpw.mods.fml.common.registry.GameRegistry; +import net.minecraft.block.Block; +import net.minecraft.item.ItemBucket; + +public class ItemBucketPCF extends ItemBucket { + + public ItemBucketPCF(Block block) { + super(block); + setUnlocalizedName("bucket_preChewedFood"); + setTextureName("bucket_preChewedFood"); + GameRegistry.registerItem(this, block.getUnlocalizedName()); + } + + + +} diff --git a/src/main/java/practicalities/items/ModItems.java b/src/main/java/practicalities/items/ModItems.java index b9deffb..737bc28 100755 --- a/src/main/java/practicalities/items/ModItems.java +++ b/src/main/java/practicalities/items/ModItems.java @@ -1,11 +1,21 @@ package practicalities.items; +import java.util.List; + +import cpw.mods.fml.common.registry.GameRegistry; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Items; import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; import net.minecraft.item.Item.ToolMaterial; +import net.minecraft.item.ItemBucket; +import net.minecraft.util.StatCollector; +import net.minecraftforge.common.util.EnumHelper; import practicalities.ConfigMan; +import practicalities.PracticalitiesMod; +import practicalities.blocks.ModBlocks; import practicalities.items.filtercard.ItemFilterCard; import practicalities.items.netherbane.ItemNetherbane; -import net.minecraftforge.common.util.EnumHelper; public class ModItems { public static final ToolMaterial imbuedToolMaterial = @@ -21,6 +31,8 @@ public class ModItems { // tools public static Item voidBucket; + public static Item bucketPreChewedFood; + public static Item matterTransporter; public static Item magnet; public static Item sitisStick; @@ -71,4 +83,21 @@ public static void init(){ // other filterCard = new ItemFilterCard(); } + + public static void postInit() { + if(ConfigMan.enablePreChewedFood) { + bucketPreChewedFood = new ItemBucket(ModBlocks.blockPreChewedFood) { + @SuppressWarnings({ "unchecked", "rawtypes" }) + @Override + public void addInformation(ItemStack p_77624_1_, + EntityPlayer p_77624_2_, List list, + boolean p_77624_4_) { + super.addInformation(p_77624_1_, p_77624_2_, list, p_77624_4_); + list.add(StatCollector.translateToLocal("tooltip.bucketPreChewedFood.flair")); + } + }; + bucketPreChewedFood.setUnlocalizedName("bucketPreChewedFood").setContainerItem(Items.bucket).setTextureName(PracticalitiesMod.TEXTURE_BASE + "bucket_preChewedFood"); + GameRegistry.registerItem(bucketPreChewedFood, "bucket_preChewedFood"); + } + } } diff --git a/src/main/java/practicalities/machine/masher/TileMasher.java b/src/main/java/practicalities/machine/masher/TileMasher.java index 09cde10..333df18 100644 --- a/src/main/java/practicalities/machine/masher/TileMasher.java +++ b/src/main/java/practicalities/machine/masher/TileMasher.java @@ -24,7 +24,7 @@ public class TileMasher extends TileCoFHBase implements IFluidHandler, IInventory, IEnergyReceiver{ - public int ENERGY_PER_MB = 10; + public double ENERGY_PER_MB = 0.5; public int MB_PER_TICK = 10; public int process_output_max; // start beyond the process time so it doesn't process when it's first loaded @@ -69,9 +69,9 @@ public void updateEntity() { ItemFood foodProcessing = (ItemFood)processing.getItem(); int heal = foodProcessing.func_150905_g(processing); - float saturation = foodProcessing.func_150906_h(processing); +// float saturation = foodProcessing.func_150906_h(processing); - int out = (int)( (heal+saturation)*100); + int out = heal*100; food.decrStackSize(0, 1); process_output = process_output_max = out; @@ -81,7 +81,7 @@ public void updateEntity() { if(process_output > 0) { int possibleFill = tank.fill(new FluidStack(ModBlocks.preChewedFood, Math.min(process_output, 10)), false); if(energy.getEnergyStored() >= possibleFill*ENERGY_PER_MB) { - energy.extractEnergy(possibleFill*ENERGY_PER_MB, false); + energy.extractEnergy( (int)( possibleFill *ENERGY_PER_MB ), false); process_output -= tank.fill(new FluidStack(ModBlocks.preChewedFood, Math.min(process_output, 10)), true); } } diff --git a/src/main/java/practicalities/machine/playerinterface/TilePlayerInterface.java b/src/main/java/practicalities/machine/playerinterface/TilePlayerInterface.java index 864c9ff..2bc4174 100755 --- a/src/main/java/practicalities/machine/playerinterface/TilePlayerInterface.java +++ b/src/main/java/practicalities/machine/playerinterface/TilePlayerInterface.java @@ -88,19 +88,18 @@ public void updateEntity() { FoodStats f = player.get().getFoodStats(); if(f.getFoodLevel() < 20 && tank.getFluidAmount() > 100) { tank.drain(100, true); - int food = 1; - float sat = 0; + f.addStats(1, 0.5f); - if(f.getSaturationLevel() < 20 && tank.getFluidAmount() > 0) { - FluidStack drained = tank.drain((int)( 20-f.getSaturationLevel() )*100, true); - sat = (float)( drained.amount/100.0 ); - } - - f.addStats(food, sat); +// if(f.getSaturationLevel() < 20 && tank.getFluidAmount() > 0) { +// FluidStack drained = tank.drain((int)( 20-f.getSaturationLevel() )*100, true); +// sat = (float)( drained.amount/100.0 ); +// } +// } } } + @Override public boolean canUpdate() { return true; diff --git a/src/main/java/practicalities/network/Proxy.java b/src/main/java/practicalities/network/Proxy.java index ec03317..96c7b0c 100755 --- a/src/main/java/practicalities/network/Proxy.java +++ b/src/main/java/practicalities/network/Proxy.java @@ -19,6 +19,8 @@ public class Proxy { public void preInit() { ModItems.init(); ModBlocks.init(); + ModItems.postInit(); + ModBlocks.postInit(); Net.init(); } diff --git a/src/main/resources/assets/practicalities/lang/en_US.lang b/src/main/resources/assets/practicalities/lang/en_US.lang index 9bd9286..8e63623 100755 --- a/src/main/resources/assets/practicalities/lang/en_US.lang +++ b/src/main/resources/assets/practicalities/lang/en_US.lang @@ -12,7 +12,7 @@ item.imbuedRod.name=Imbued Rod item.imbuedTool.name=Imbued Tool item.imbuedSword.name=Imbued Sword item.netherBane.name=Netherbane - +item.bucketPreChewedFood.name=Bucket o' Food item.machinePlate.name=Machine Plate tile.shippingcrate.name=Shipping Crate @@ -21,6 +21,10 @@ tile.vampiricgenerator.name=Vampiric Generator tile.polarityNegator.name=Polarity Negator tile.playerinterface.name=Player Interface tile.inventoryfilter.name=Inventory Filter +tile.preChewedFood.name=Pre-Chewed Food +tile.masher.name=Masher + +fluid.preChewedFood=Pre-Chewed Food chat.sitis.noSky=The stick might work better out in the open chat.sitis.noRain=The stick doesn't really have much to do right now @@ -33,7 +37,7 @@ tooltip.itemMagnet.flair=Suck it! tooltip.imbuedTool.flair=The OPness! tooltip.imbuedSword.flair=Watch out for the quick draw! tooltip.netherBane.flair=Sabre of the Moon - +tooltip.bucketPreChewedFood.flair=Nutritious, if not appetizing gui.tooltip.inventoryfilter.whitelist=Whitelist gui.tooltip.inventoryfilter.blacklist=Blacklist diff --git a/src/main/resources/assets/practicalities/textures/items/bucket_preChewedFood.png b/src/main/resources/assets/practicalities/textures/items/bucket_preChewedFood.png new file mode 100644 index 0000000000000000000000000000000000000000..a63c8bee1f543d3b387845643c38fde69de6453d GIT binary patch literal 397 zcmV;80doF{P)0A8fH{&aHN(85 z$;8C;#4MtyHQnp>3?x+DdwS0~H@&^Ue;=|2CP|{_IEo^J3n9o!fth%I6|A~VL*NJz zo4iFlK8JdOl#&3z&TjQk51^DH3_}2b@B4;CDFpy9#uj3pop8?4_dS}Xaa Date: Tue, 15 Dec 2015 21:56:48 -0600 Subject: [PATCH 4/4] Fix pre-chewed food bucket not registered as a fluid container properly --- src/main/java/practicalities/items/ModItems.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/main/java/practicalities/items/ModItems.java b/src/main/java/practicalities/items/ModItems.java index 737bc28..5fbfe93 100755 --- a/src/main/java/practicalities/items/ModItems.java +++ b/src/main/java/practicalities/items/ModItems.java @@ -2,20 +2,23 @@ import java.util.List; -import cpw.mods.fml.common.registry.GameRegistry; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Items; import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; import net.minecraft.item.Item.ToolMaterial; import net.minecraft.item.ItemBucket; +import net.minecraft.item.ItemStack; import net.minecraft.util.StatCollector; import net.minecraftforge.common.util.EnumHelper; +import net.minecraftforge.fluids.FluidContainerRegistry; +import net.minecraftforge.fluids.FluidContainerRegistry.FluidContainerData; +import net.minecraftforge.fluids.FluidStack; import practicalities.ConfigMan; import practicalities.PracticalitiesMod; import practicalities.blocks.ModBlocks; import practicalities.items.filtercard.ItemFilterCard; import practicalities.items.netherbane.ItemNetherbane; +import cpw.mods.fml.common.registry.GameRegistry; public class ModItems { public static final ToolMaterial imbuedToolMaterial = @@ -98,6 +101,7 @@ public void addInformation(ItemStack p_77624_1_, }; bucketPreChewedFood.setUnlocalizedName("bucketPreChewedFood").setContainerItem(Items.bucket).setTextureName(PracticalitiesMod.TEXTURE_BASE + "bucket_preChewedFood"); GameRegistry.registerItem(bucketPreChewedFood, "bucket_preChewedFood"); + FluidContainerRegistry.registerFluidContainer(new FluidContainerData(new FluidStack(ModBlocks.preChewedFood, 1000), new ItemStack(bucketPreChewedFood), new ItemStack(Items.bucket))); } } }