From 6f2b9656fc89bb599097e233874afc23a220f085 Mon Sep 17 00:00:00 2001 From: Bob Date: Sat, 4 Mar 2023 18:41:44 +0100 Subject: [PATCH] the press unshittening: part 2 --- .../com/hbm/blocks/machine/MachineEPress.java | 122 +++--- .../container/ContainerMachineEPress.java | 101 ++--- .../container/ContainerMachinePress.java | 23 +- .../hbm/inventory/gui/GUIMachineEPress.java | 10 +- .../hbm/render/tileentity/RenderEPress.java | 64 ++- .../hbm/render/tileentity/RenderPress.java | 4 +- .../machine/TileEntityMachineEPress.java | 392 ++++++++---------- .../assets/hbm/textures/gui/gui_epress.png | Bin 1577 -> 1874 bytes .../assets/hbm/textures/gui/gui_press.png | Bin 4797 -> 4875 bytes 9 files changed, 311 insertions(+), 405 deletions(-) diff --git a/src/main/java/com/hbm/blocks/machine/MachineEPress.java b/src/main/java/com/hbm/blocks/machine/MachineEPress.java index d7d06624c..3e3ea35ab 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineEPress.java +++ b/src/main/java/com/hbm/blocks/machine/MachineEPress.java @@ -20,8 +20,8 @@ import net.minecraft.util.MathHelper; import net.minecraft.world.World; public class MachineEPress extends BlockContainer { - - private final Random field_149933_a = new Random(); + + private final Random field_149933_a = new Random(); private static boolean keepInventory; public MachineEPress(Material p_i45386_1_) { @@ -47,96 +47,72 @@ public class MachineEPress extends BlockContainer { public boolean renderAsNormalBlock() { return false; } - + @Override - public void breakBlock(World p_149749_1_, int p_149749_2_, int p_149749_3_, int p_149749_4_, Block p_149749_5_, int p_149749_6_) - { - if (!keepInventory) - { - ISidedInventory tileentityfurnace = (ISidedInventory)p_149749_1_.getTileEntity(p_149749_2_, p_149749_3_, p_149749_4_); + public void breakBlock(World p_149749_1_, int p_149749_2_, int p_149749_3_, int p_149749_4_, Block p_149749_5_, int p_149749_6_) { + if(!keepInventory) { + ISidedInventory tileentityfurnace = (ISidedInventory) p_149749_1_.getTileEntity(p_149749_2_, p_149749_3_, p_149749_4_); - if (tileentityfurnace != null) - { - for (int i1 = 0; i1 < tileentityfurnace.getSizeInventory(); ++i1) - { - ItemStack itemstack = tileentityfurnace.getStackInSlot(i1); + if(tileentityfurnace != null) { + for(int i1 = 0; i1 < tileentityfurnace.getSizeInventory(); ++i1) { + ItemStack itemstack = tileentityfurnace.getStackInSlot(i1); - if (itemstack != null) - { - float f = this.field_149933_a.nextFloat() * 0.8F + 0.1F; - float f1 = this.field_149933_a.nextFloat() * 0.8F + 0.1F; - float f2 = this.field_149933_a.nextFloat() * 0.8F + 0.1F; + if(itemstack != null) { + float f = this.field_149933_a.nextFloat() * 0.8F + 0.1F; + float f1 = this.field_149933_a.nextFloat() * 0.8F + 0.1F; + float f2 = this.field_149933_a.nextFloat() * 0.8F + 0.1F; - while (itemstack.stackSize > 0) - { - int j1 = this.field_149933_a.nextInt(21) + 10; + while(itemstack.stackSize > 0) { + int j1 = this.field_149933_a.nextInt(21) + 10; - if (j1 > itemstack.stackSize) - { - j1 = itemstack.stackSize; - } + if(j1 > itemstack.stackSize) { + j1 = itemstack.stackSize; + } - itemstack.stackSize -= j1; - EntityItem entityitem = new EntityItem(p_149749_1_, p_149749_2_ + f, p_149749_3_ + f1, p_149749_4_ + f2, new ItemStack(itemstack.getItem(), j1, itemstack.getItemDamage())); + itemstack.stackSize -= j1; + EntityItem entityitem = new EntityItem(p_149749_1_, p_149749_2_ + f, p_149749_3_ + f1, p_149749_4_ + f2, new ItemStack(itemstack.getItem(), j1, itemstack.getItemDamage())); - if (itemstack.hasTagCompound()) - { - entityitem.getEntityItem().setTagCompound((NBTTagCompound)itemstack.getTagCompound().copy()); - } + if(itemstack.hasTagCompound()) { + entityitem.getEntityItem().setTagCompound((NBTTagCompound) itemstack.getTagCompound().copy()); + } - float f3 = 0.05F; - entityitem.motionX = (float)this.field_149933_a.nextGaussian() * f3; - entityitem.motionY = (float)this.field_149933_a.nextGaussian() * f3 + 0.2F; - entityitem.motionZ = (float)this.field_149933_a.nextGaussian() * f3; - p_149749_1_.spawnEntityInWorld(entityitem); - } - } - } + float f3 = 0.05F; + entityitem.motionX = (float) this.field_149933_a.nextGaussian() * f3; + entityitem.motionY = (float) this.field_149933_a.nextGaussian() * f3 + 0.2F; + entityitem.motionZ = (float) this.field_149933_a.nextGaussian() * f3; + p_149749_1_.spawnEntityInWorld(entityitem); + } + } + } - p_149749_1_.func_147453_f(p_149749_2_, p_149749_3_, p_149749_4_, p_149749_5_); - } - } + p_149749_1_.func_147453_f(p_149749_2_, p_149749_3_, p_149749_4_, p_149749_5_); + } + } + + super.breakBlock(p_149749_1_, p_149749_2_, p_149749_3_, p_149749_4_, p_149749_5_, p_149749_6_); + } - super.breakBlock(p_149749_1_, p_149749_2_, p_149749_3_, p_149749_4_, p_149749_5_, p_149749_6_); - } - @Override public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase player, ItemStack itemStack) { int i = MathHelper.floor_double(player.rotationYaw * 4.0F / 360.0F + 0.5D) & 3; - - if(i == 0) - { - world.setBlockMetadataWithNotify(x, y, z, 2, 2); - } - if(i == 1) - { - world.setBlockMetadataWithNotify(x, y, z, 5, 2); - } - if(i == 2) - { - world.setBlockMetadataWithNotify(x, y, z, 3, 2); - } - if(i == 3) - { - world.setBlockMetadataWithNotify(x, y, z, 4, 2); - } - - if(itemStack.hasDisplayName()) - { - ((TileEntityMachineEPress)world.getTileEntity(x, y, z)).setCustomName(itemStack.getDisplayName()); + + if(i == 0) world.setBlockMetadataWithNotify(x, y, z, 2, 2); + if(i == 1) world.setBlockMetadataWithNotify(x, y, z, 5, 2); + if(i == 2) world.setBlockMetadataWithNotify(x, y, z, 3, 2); + if(i == 3) world.setBlockMetadataWithNotify(x, y, z, 4, 2); + + if(itemStack.hasDisplayName()) { + ((TileEntityMachineEPress) world.getTileEntity(x, y, z)).setCustomName(itemStack.getDisplayName()); } } - + @Override public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { - if(world.isRemote) - { + if(world.isRemote) { return true; - } else if(!player.isSneaking()) - { + } else if(!player.isSneaking()) { TileEntityMachineEPress entity = (TileEntityMachineEPress) world.getTileEntity(x, y, z); - if(entity != null) - { + if(entity != null) { FMLNetworkHandler.openGui(player, MainRegistry.instance, 0, world, x, y, z); } return true; diff --git a/src/main/java/com/hbm/inventory/container/ContainerMachineEPress.java b/src/main/java/com/hbm/inventory/container/ContainerMachineEPress.java index deb185f7c..c646499cf 100644 --- a/src/main/java/com/hbm/inventory/container/ContainerMachineEPress.java +++ b/src/main/java/com/hbm/inventory/container/ContainerMachineEPress.java @@ -1,11 +1,17 @@ package com.hbm.inventory.container; import com.hbm.inventory.SlotMachineOutput; +import com.hbm.inventory.SlotUpgrade; +import com.hbm.items.ModItems; +import com.hbm.items.machine.IItemFluidIdentifier; +import com.hbm.items.machine.ItemMachineUpgrade; +import com.hbm.items.machine.ItemStamp; import com.hbm.tileentity.machine.TileEntityMachineEPress; + +import api.hbm.energy.IBatteryItem; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.inventory.Container; -import net.minecraft.inventory.ICrafting; import net.minecraft.inventory.Slot; import net.minecraft.item.ItemStack; @@ -13,8 +19,6 @@ public class ContainerMachineEPress extends Container { private TileEntityMachineEPress nukeBoy; - private int progress; - public ContainerMachineEPress(InventoryPlayer invPlayer, TileEntityMachineEPress tedf) { nukeBoy = tedf; @@ -27,83 +31,66 @@ private TileEntityMachineEPress nukeBoy; this.addSlotToContainer(new Slot(tedf, 2, 80, 53)); //Output this.addSlotToContainer(new SlotMachineOutput(tedf, 3, 140, 35)); + //Upgrade + this.addSlotToContainer(new SlotUpgrade(tedf, 4, 44, 21)); - for(int i = 0; i < 3; i++) - { - for(int j = 0; j < 9; j++) - { + for(int i = 0; i < 3; i++) { + for(int j = 0; j < 9; j++) { this.addSlotToContainer(new Slot(invPlayer, j + i * 9 + 9, 8 + j * 18, 84 + i * 18)); } } - - for(int i = 0; i < 9; i++) - { + + for(int i = 0; i < 9; i++) { this.addSlotToContainer(new Slot(invPlayer, i, 8 + i * 18, 142)); } } - + @Override - public ItemStack transferStackInSlot(EntityPlayer p_82846_1_, int par2) - { + public ItemStack transferStackInSlot(EntityPlayer p_82846_1_, int par2) { ItemStack var3 = null; Slot var4 = (Slot) this.inventorySlots.get(par2); - - if (var4 != null && var4.getHasStack()) - { + + if(var4 != null && var4.getHasStack()) { ItemStack var5 = var4.getStack(); var3 = var5.copy(); - - if (par2 <= 3) { - if (!this.mergeItemStack(var5, 4, this.inventorySlots.size(), true)) - { + + if(par2 <= 4) { + if(!this.mergeItemStack(var5, 5, this.inventorySlots.size(), true)) { return null; } - } - else if (!this.mergeItemStack(var5, 2, 3, false)) - if (!this.mergeItemStack(var5, 0, 1, false)) - if (!this.mergeItemStack(var5, 1, 2, false)) + } else { + + if(var3.getItem() instanceof IBatteryItem || var3.getItem() == ModItems.battery_creative) { + if(!this.mergeItemStack(var5, 0, 1, false)) { return null; - - if (var5.stackSize == 0) - { - var4.putStack((ItemStack) null); + } + } else if(var3.getItem() instanceof ItemMachineUpgrade) { + if(!this.mergeItemStack(var5, 4, 5, false)) { + return null; + } + } else if(var3.getItem() instanceof ItemStamp) { + if(!this.mergeItemStack(var5, 1, 2, false)) { + return null; + } + } else { + if(!this.mergeItemStack(var5, 2, 3, false)) { + return null; + } + } } - else - { + + if(var5.stackSize == 0) { + var4.putStack((ItemStack) null); + } else { var4.onSlotChanged(); } } - + return var3; - } + } @Override public boolean canInteractWith(EntityPlayer player) { return nukeBoy.isUseableByPlayer(player); } - - @Override - public void detectAndSendChanges() { - super.detectAndSendChanges(); - - for(int i = 0; i < this.crafters.size(); i++) - { - ICrafting par1 = (ICrafting)this.crafters.get(i); - - if(this.progress != this.nukeBoy.progress) - { - par1.sendProgressBarUpdate(this, 0, this.nukeBoy.progress); - } - } - - this.progress = this.nukeBoy.progress; - } - - @Override - public void updateProgressBar(int i, int j) { - if(i == 0) - { - nukeBoy.progress = j; - } - } } diff --git a/src/main/java/com/hbm/inventory/container/ContainerMachinePress.java b/src/main/java/com/hbm/inventory/container/ContainerMachinePress.java index b6a0a208c..d915dd2bf 100644 --- a/src/main/java/com/hbm/inventory/container/ContainerMachinePress.java +++ b/src/main/java/com/hbm/inventory/container/ContainerMachinePress.java @@ -1,13 +1,18 @@ package com.hbm.inventory.container; import com.hbm.inventory.SlotMachineOutput; +import com.hbm.items.ModItems; +import com.hbm.items.machine.ItemMachineUpgrade; +import com.hbm.items.machine.ItemStamp; import com.hbm.tileentity.machine.TileEntityMachinePress; +import api.hbm.energy.IBatteryItem; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.inventory.Container; import net.minecraft.inventory.Slot; import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntityFurnace; public class ContainerMachinePress extends Container { @@ -49,10 +54,22 @@ public class ContainerMachinePress extends Container { if(!this.mergeItemStack(var5, 4, this.inventorySlots.size(), true)) { return null; } - } else if(!this.mergeItemStack(var5, 2, 3, false)) - if(!this.mergeItemStack(var5, 0, 1, false)) - if(!this.mergeItemStack(var5, 1, 2, false)) + } else { + + if(TileEntityFurnace.isItemFuel(var3)) { + if(!this.mergeItemStack(var5, 0, 1, false)) { return null; + } + } else if(var3.getItem() instanceof ItemStamp) { + if(!this.mergeItemStack(var5, 1, 2, false)) { + return null; + } + } else { + if(!this.mergeItemStack(var5, 2, 3, false)) { + return null; + } + } + } if(var5.stackSize == 0) { var4.putStack((ItemStack) null); diff --git a/src/main/java/com/hbm/inventory/gui/GUIMachineEPress.java b/src/main/java/com/hbm/inventory/gui/GUIMachineEPress.java index e3d131c1e..383d5bb3d 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIMachineEPress.java +++ b/src/main/java/com/hbm/inventory/gui/GUIMachineEPress.java @@ -27,7 +27,7 @@ public class GUIMachineEPress extends GuiInfoContainer { public void drawScreen(int mouseX, int mouseY, float f) { super.drawScreen(mouseX, mouseY, f); - this.drawElectricityInfo(this, mouseX, mouseY, guiLeft + 26, guiTop + 69 - 52, 16, 52, press.power, press.maxPower); + this.drawElectricityInfo(this, mouseX, mouseY, guiLeft + 17, guiTop + 69 - 52, 16, 52, press.power, press.maxPower); } @Override @@ -44,10 +44,10 @@ public class GUIMachineEPress extends GuiInfoContainer { Minecraft.getMinecraft().getTextureManager().bindTexture(texture); drawTexturedModalRect(guiLeft, guiTop, 0, 0, xSize, ySize); - int i = (int)press.getPowerScaled(52); - drawTexturedModalRect(guiLeft + 26, guiTop + 69 - i, 176, 52 - i, 16, i); + int i = (int) (press.power * 52 / press.maxPower); + drawTexturedModalRect(guiLeft + 17, guiTop + 69 - i, 176, 52 - i, 16, i); - int k = press.getProgressScaled(16); - this.drawTexturedModalRect(guiLeft + 79, guiTop + 35, 192, 0, 18, k); + int k = (int) (press.renderPress * 16 / press.maxPress); + this.drawTexturedModalRect(guiLeft + 79, guiTop + 35, 192, 0, 18, k); } } diff --git a/src/main/java/com/hbm/render/tileentity/RenderEPress.java b/src/main/java/com/hbm/render/tileentity/RenderEPress.java index fbda982f0..987ab9a0a 100644 --- a/src/main/java/com/hbm/render/tileentity/RenderEPress.java +++ b/src/main/java/com/hbm/render/tileentity/RenderEPress.java @@ -10,9 +10,9 @@ import net.minecraft.client.renderer.entity.RenderItem; import net.minecraft.client.renderer.entity.RenderManager; import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; import net.minecraft.entity.item.EntityItem; -import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.MathHelper; public class RenderEPress extends TileEntitySpecialRenderer { @@ -29,14 +29,10 @@ public class RenderEPress extends TileEntitySpecialRenderer { GL11.glRotatef(180, 0F, 1F, 0F); switch(tileentity.getBlockMetadata()) { - case 2: - GL11.glRotatef(270, 0F, 1F, 0F); break; - case 4: - GL11.glRotatef(0, 0F, 1F, 0F); break; - case 3: - GL11.glRotatef(90, 0F, 1F, 0F); break; - case 5: - GL11.glRotatef(180, 0F, 1F, 0F); break; + case 2: GL11.glRotatef(270, 0F, 1F, 0F); break; + case 4: GL11.glRotatef(0, 0F, 1F, 0F); break; + case 3: GL11.glRotatef(90, 0F, 1F, 0F); break; + case 5: GL11.glRotatef(180, 0F, 1F, 0F); break; } this.bindTexture(ResourceManager.epress_body_tex); @@ -45,29 +41,25 @@ public class RenderEPress extends TileEntitySpecialRenderer { GL11.glPopMatrix(); - renderTileEntityAt2(tileentity, x, y, z, f); + renderTileEntityAt2(tileentity, x, y, z, f); } - + public void renderTileEntityAt2(TileEntity tileentity, double x, double y, double z, float f) { GL11.glPushMatrix(); - GL11.glTranslated(x + 0.5D, y + 1 + 1 - 0.125, z + 0.5D); + GL11.glTranslated(x + 0.5D, y + 1, z + 0.5D); GL11.glEnable(GL11.GL_LIGHTING); GL11.glRotatef(180, 0F, 1F, 0F); switch(tileentity.getBlockMetadata()) { - case 2: - GL11.glRotatef(270, 0F, 1F, 0F); break; - case 4: - GL11.glRotatef(0, 0F, 1F, 0F); break; - case 3: - GL11.glRotatef(90, 0F, 1F, 0F); break; - case 5: - GL11.glRotatef(180, 0F, 1F, 0F); break; + case 2: GL11.glRotatef(270, 0F, 1F, 0F); break; + case 4: GL11.glRotatef(0, 0F, 1F, 0F); break; + case 3: GL11.glRotatef(90, 0F, 1F, 0F); break; + case 5: GL11.glRotatef(180, 0F, 1F, 0F); break; } TileEntityMachineEPress press = (TileEntityMachineEPress)tileentity; - float f1 = press.progress * (1 - 0.125F) / press.maxProgress; - GL11.glTranslated(0, -f1, 0); + double p = (press.lastPress + (press.renderPress - press.lastPress) * f) /(double) press.maxPress; + GL11.glTranslated(0, MathHelper.clamp_double((1D - p), 0D, 1D) * 0.875D, 0); this.bindTexture(ResourceManager.epress_head_tex); @@ -75,9 +67,9 @@ public class RenderEPress extends TileEntitySpecialRenderer { GL11.glPopMatrix(); - renderTileEntityAt3(tileentity, x, y, z, f); - } - + renderTileEntityAt3(tileentity, x, y, z, f); + } + public void renderTileEntityAt3(TileEntity tileentity, double x, double y, double z, float f) { itemRenderer = new RenderDecoItem(this); itemRenderer.setRenderManager(renderManager); @@ -103,16 +95,18 @@ public class RenderEPress extends TileEntitySpecialRenderer { GL11.glTranslatef(-1, -1.15F, 0); TileEntityMachineEPress press = (TileEntityMachineEPress)tileentity; - ItemStack stack = new ItemStack(Item.getItemById(press.item), 1, press.meta); - - EntityItem item = new EntityItem(null, 0.0D, 0.0D, 0.0D, stack); - item.getEntityItem().stackSize = 1; - item.hoverStart = 0.0F; - - RenderItem.renderInFrame = true; - this.itemRenderer.doRender(item, 0.0D, 0.0D, 0.0D, 0.0F, 0.0F); - RenderItem.renderInFrame = false; + if(press.syncStack != null) { + ItemStack stack = press.syncStack.copy(); + + EntityItem item = new EntityItem(null, 0.0D, 0.0D, 0.0D, stack); + item.getEntityItem().stackSize = 1; + item.hoverStart = 0.0F; + + RenderItem.renderInFrame = true; + this.itemRenderer.doRender(item, 0.0D, 0.0D, 0.0D, 0.0F, 0.0F); + RenderItem.renderInFrame = false; + } GL11.glPopMatrix(); - } + } } diff --git a/src/main/java/com/hbm/render/tileentity/RenderPress.java b/src/main/java/com/hbm/render/tileentity/RenderPress.java index 5833f98da..68b71a5af 100644 --- a/src/main/java/com/hbm/render/tileentity/RenderPress.java +++ b/src/main/java/com/hbm/render/tileentity/RenderPress.java @@ -54,8 +54,8 @@ public class RenderPress extends TileEntitySpecialRenderer { GL11.glPopMatrix(); renderTileEntityAt3(tileEntity, x, y, z, f); - } - + } + public void renderTileEntityAt3(TileEntity tileEntity, double x, double y, double z, float f) { itemRenderer = new RenderDecoItem(this); itemRenderer.setRenderManager(renderManager); diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineEPress.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineEPress.java index 61ea1d563..c99db935b 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineEPress.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineEPress.java @@ -1,113 +1,172 @@ package com.hbm.tileentity.machine; +import com.hbm.inventory.UpgradeManager; import com.hbm.inventory.container.ContainerMachineEPress; import com.hbm.inventory.gui.GUIMachineEPress; import com.hbm.inventory.recipes.PressRecipes; +import com.hbm.items.machine.ItemMachineUpgrade.UpgradeType; import com.hbm.items.machine.ItemStamp; import com.hbm.lib.Library; -import com.hbm.packet.AuxElectricityPacket; -import com.hbm.packet.PacketDispatcher; import com.hbm.tileentity.IGUIProvider; -import com.hbm.tileentity.TileEntityLoadedBase; +import com.hbm.tileentity.TileEntityMachineBase; import api.hbm.energy.IEnergyUser; -import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.client.gui.GuiScreen; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; -import net.minecraft.inventory.ISidedInventory; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.nbt.NBTTagList; -import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityMachineEPress extends TileEntityLoadedBase implements ISidedInventory, IEnergyUser, IGUIProvider { +public class TileEntityMachineEPress extends TileEntityMachineBase implements IEnergyUser, IGUIProvider { - private ItemStack slots[]; - - public int progress = 0; public long power = 0; - public final static int maxProgress = 200; public final static long maxPower = 50000; - public int item; - public int meta; + + public int press; + public double renderPress; + public double lastPress; + private int syncPress; + private int turnProgress; + public final static int maxPress = 200; boolean isRetracting = false; + private int delay; - private String customName; + public ItemStack syncStack; public TileEntityMachineEPress() { - slots = new ItemStack[4]; + super(5); } @Override - public int getSizeInventory() { - return slots.length; + public String getName() { + return "container.epress"; } - + @Override - public ItemStack getStackInSlot(int i) { - return slots[i]; - } - - @Override - public ItemStack getStackInSlotOnClosing(int i) { - if(slots[i] != null) - { - ItemStack itemStack = slots[i]; - slots[i] = null; - return itemStack; + public void updateEntity() { + + if(!worldObj.isRemote) { + + this.updateConnections(); + power = Library.chargeTEFromItems(slots, 0, power, maxPower); + + boolean canProcess = this.canProcess(); + + if((canProcess || this.isRetracting || this.delay > 0) && power >= 100) { + + power -= 100; + + if(delay <= 0) { + + UpgradeManager.eval(slots, 4, 4); + int speed = 1 + Math.min(3, UpgradeManager.getLevel(UpgradeType.SPEED)); + + int stampSpeed = this.isRetracting ? 20 : 45; + stampSpeed *= (1D + (double) speed / 4D); + + if(this.isRetracting) { + this.press -= stampSpeed; + + if(this.press <= 0) { + this.isRetracting = false; + this.delay = 5 - speed + 1; + } + } else if(canProcess) { + this.press += stampSpeed; + + if(this.press >= this.maxPress) { + this.worldObj.playSoundEffect(this.xCoord, this.yCoord, this.zCoord, "hbm:block.pressOperate", 1.5F, 1.0F); + ItemStack output = PressRecipes.getOutput(slots[2], slots[1]); + if(slots[3] == null) { + slots[3] = output.copy(); + } else { + slots[3].stackSize += output.stackSize; + } + this.decrStackSize(2, 1); + + if(slots[1].getMaxDamage() != 0) { + slots[1].setItemDamage(slots[1].getItemDamage() + 1); + if(slots[1].getItemDamage() >= slots[1].getMaxDamage()) { + slots[1] = null; + } + } + + this.isRetracting = true; + this.delay = 5 - speed + 1; + + this.markDirty(); + } + } else if(this.press > 0){ + this.isRetracting = true; + } + } else { + delay--; + } + } + + NBTTagCompound data = new NBTTagCompound(); + data.setLong("power", power); + data.setInteger("press", press); + if(slots[2] != null) { + NBTTagCompound stack = new NBTTagCompound(); + slots[2].writeToNBT(stack); + data.setTag("stack", stack); + } + + this.networkPack(data, 50); + } else { - return null; - } - } - - @Override - public void setInventorySlotContents(int i, ItemStack itemStack) { - slots[i] = itemStack; - if(itemStack != null && itemStack.stackSize > getInventoryStackLimit()) - { - itemStack.stackSize = getInventoryStackLimit(); - } - } - - @Override - public String getInventoryName() { - return this.hasCustomInventoryName() ? this.customName : "container.epress"; - } - - @Override - public boolean hasCustomInventoryName() { - return this.customName != null && this.customName.length() > 0; - } - - public void setCustomName(String name) { - this.customName = name; - } - - @Override - public int getInventoryStackLimit() { - return 64; - } - - @Override - public boolean isUseableByPlayer(EntityPlayer player) { - if(worldObj.getTileEntity(xCoord, yCoord, zCoord) != this) - { - return false; - }else{ - return player.getDistanceSq(xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D) <=64; + + // approach-based interpolation, GO! + this.lastPress = this.renderPress; + + if(this.turnProgress > 0) { + this.renderPress = this.renderPress + ((this.syncPress - this.renderPress) / (double) this.turnProgress); + --this.turnProgress; + } else { + this.renderPress = this.syncPress; + } } } @Override - public void openInventory() {} - @Override - public void closeInventory() {} + public void networkUnpack(NBTTagCompound nbt) { + this.power = nbt.getLong("power"); + this.syncPress = nbt.getInteger("press"); + + if(nbt.hasKey("stack")) { + NBTTagCompound stack = nbt.getCompoundTag("stack"); + this.syncStack = ItemStack.loadItemStackFromNBT(stack); + } else { + this.syncStack = null; + } + + this.turnProgress = 2; + } + + public boolean canProcess() { + if(power < 100) return false; + if(slots[1] == null || slots[2] == null) return false; + + ItemStack output = PressRecipes.getOutput(slots[2], slots[1]); + + if(output == null) return false; + + if(slots[3] == null) return true; + if(slots[3].stackSize + output.stackSize <= slots[3].getMaxStackSize() && slots[3].getItem() == output.getItem() && slots[3].getItemDamage() == output.getItemDamage()) return true; + return false; + } + + private void updateConnections() { + + for(ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) + this.trySubscribe(worldObj, xCoord + dir.offsetX, yCoord + dir.offsetY, zCoord + dir.offsetZ, dir); + } @Override public boolean isItemValidForSlot(int i, ItemStack stack) { @@ -119,76 +178,9 @@ public class TileEntityMachineEPress extends TileEntityLoadedBase implements ISi } @Override - public ItemStack decrStackSize(int i, int j) { - if(slots[i] != null) - { - if(slots[i].stackSize <= j) - { - ItemStack itemStack = slots[i]; - slots[i] = null; - return itemStack; - } - ItemStack itemStack1 = slots[i].splitStack(j); - if (slots[i].stackSize == 0) - { - slots[i] = null; - } - - return itemStack1; - } else { - return null; - } + public int[] getAccessibleSlotsFromSide(int side) { + return new int[] { 1, 2, 3 }; } - - @Override - public void readFromNBT(NBTTagCompound nbt) { - super.readFromNBT(nbt); - NBTTagList list = nbt.getTagList("items", 10); - - progress = nbt.getInteger("progress"); - power = nbt.getInteger("power"); - isRetracting = nbt.getBoolean("ret"); - - slots = new ItemStack[getSizeInventory()]; - - for(int i = 0; i < list.tagCount(); i++) - { - NBTTagCompound nbt1 = list.getCompoundTagAt(i); - byte b0 = nbt1.getByte("slot"); - if(b0 >= 0 && b0 < slots.length) - { - slots[b0] = ItemStack.loadItemStackFromNBT(nbt1); - } - } - } - - @Override - public void writeToNBT(NBTTagCompound nbt) { - super.writeToNBT(nbt); - NBTTagList list = new NBTTagList(); - - nbt.setInteger("progress", progress); - nbt.setLong("power", power); - nbt.setBoolean("ret", isRetracting); - - for(int i = 0; i < slots.length; i++) - { - if(slots[i] != null) - { - NBTTagCompound nbt1 = new NBTTagCompound(); - nbt1.setByte("slot", (byte)i); - slots[i].writeToNBT(nbt1); - list.appendTag(nbt1); - } - } - nbt.setTag("items", list); - } - - @Override - public int[] getAccessibleSlotsFromSide(int side) - { - return new int[]{ 1, 2, 3 }; - } @Override public boolean canInsertItem(int i, ItemStack itemStack, int j) { @@ -201,99 +193,21 @@ public class TileEntityMachineEPress extends TileEntityLoadedBase implements ISi } @Override - public void updateEntity() { - if(!worldObj.isRemote) { - - this.updateConnections(); - - power = Library.chargeTEFromItems(slots, 0, power, maxPower); - - if(!worldObj.isBlockIndirectlyGettingPowered(xCoord, yCoord, zCoord)) { - if(power >= 100) { - - int speed = 25; - - if(slots[1] != null && slots[2] != null) { - ItemStack stack = PressRecipes.getOutput(slots[2], slots[1]); - if(stack != null && - (slots[3] == null || - (slots[3].getItem() == stack.getItem() && - slots[3].stackSize + stack.stackSize <= slots[3].getMaxStackSize()))) { - - power -= 100; - - if(progress >= maxProgress) { - - isRetracting = true; - - if(slots[3] == null) - slots[3] = stack.copy(); - else - slots[3].stackSize += stack.stackSize; - - slots[2].stackSize--; - if(slots[2].stackSize <= 0) - slots[2] = null; - - if(slots[1].getMaxDamage() != 0) { - slots[1].setItemDamage(slots[1].getItemDamage() + 1); - if(slots[1].getItemDamage() >= slots[1].getMaxDamage()) - slots[1] = null; - } - - this.worldObj.playSoundEffect(this.xCoord, this.yCoord, this.zCoord, "hbm:block.pressOperate", 1.5F, 1.0F); - } - - if(!isRetracting) - progress += speed; - - } else { - isRetracting = true; - } - } else { - isRetracting = true; - } - - if(isRetracting) - progress -= speed; - } else { - isRetracting = true; - } - - if(progress <= 0) { - isRetracting = false; - progress = 0; - } - } - - PacketDispatcher.wrapper.sendToAllAround(new AuxElectricityPacket(xCoord, yCoord, zCoord, power), new TargetPoint(worldObj.provider.dimensionId, xCoord, yCoord, zCoord, 50)); - } - } - - private void updateConnections() { + public void readFromNBT(NBTTagCompound nbt) { + super.readFromNBT(nbt); - for(ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) - this.trySubscribe(worldObj, xCoord + dir.offsetX, yCoord + dir.offsetY, zCoord + dir.offsetZ, dir); - } - - public long getPowerScaled(int i) { - return (power * i) / maxPower; - } - - public int getProgressScaled(int i) { - return (progress * i) / maxProgress; + press = nbt.getInteger("press"); + power = nbt.getInteger("power"); + isRetracting = nbt.getBoolean("ret"); } @Override - public AxisAlignedBB getRenderBoundingBox() { - return TileEntity.INFINITE_EXTENT_AABB; - } - - @Override - @SideOnly(Side.CLIENT) - public double getMaxRenderDistanceSquared() - { - return 65536.0D; + public void writeToNBT(NBTTagCompound nbt) { + super.writeToNBT(nbt); + + nbt.setInteger("press", press); + nbt.setLong("power", power); + nbt.setBoolean("ret", isRetracting); } @Override @@ -311,6 +225,24 @@ public class TileEntityMachineEPress extends TileEntityLoadedBase implements ISi public long getMaxPower() { return maxPower; } + + AxisAlignedBB aabb; + + @Override + public AxisAlignedBB getRenderBoundingBox() { + + if(aabb != null) + return aabb; + + aabb = AxisAlignedBB.getBoundingBox(xCoord, yCoord, zCoord, xCoord + 1, yCoord + 3, zCoord + 1); + return aabb; + } + + @Override + @SideOnly(Side.CLIENT) + public double getMaxRenderDistanceSquared() { + return 65536.0D; + } @Override public Container provideContainer(int ID, EntityPlayer player, World world, int x, int y, int z) { diff --git a/src/main/resources/assets/hbm/textures/gui/gui_epress.png b/src/main/resources/assets/hbm/textures/gui/gui_epress.png index f9e2f6be2821b1569b790a1d9b6f2b24bb570220..d920d4447e9405f2973b92c058aabd3516868207 100644 GIT binary patch literal 1874 zcmcJQdsNbQ6u`efLjC^)dYHIg`%*wqgK;u zb6Q5&%Me%Q%s>m#}o_oLden0nq?>XNb z%BD~otTPq>V6%Z79034iHX(pUnN{p=5yPyIdxADl(Pl|Uf1VA16=p;5TI&8&nqFnH zlI(y|H>jq&-m{xdI84EMsz0z69pXmxWOvs4R${K&V(epZDFa6xvxbcze(4)05*kkn zz1BSy<@8TMDM=YK+vlQw)oN1V*2BLEiCm73BT)*t@{ViC_IM6FE;r8f=`X(aQOD@H zd3+X2o92<9W{)D}cQYlp-XoLB>pzy?pMA(5EVXHB=E!neg(L-|vRfg6Vd5#V3=Iwn zM@++RaY5Q}zYaZtlUEaiaKM4iOGzmD_!dBsY?%V$8xbUTD6qH19db_8hao}A>Ntec zgrE6XGmZBw=bQOJ0UNfC%NpRFwVCSy#m~#^XYuwV9yzmvcvwYy#09s?to2ho4YTph(;!9L~( z6M1_|oJ}|q1NbcSBiUTG9ER(r)CE=JMC2;j zz8$cP6`E1C`2@x-A1sfcX%`6%*S#|Q##&{*_R-5B%K4hU71d9eE>{AdSS*kD6fE?A z?O<4W%n};^F!fGa?;9qA!7wB@PE2^$<96-)9)yTTWLa5RU7A$+-KV%+yNBo62Hfg8 zGx=`NAu1k>WxeGE;CZG98u%`NJM3DgY24qVJAO~7@JRzqizhT12$o{UdP@4p?z0D^ zcqusr0`Kn)0~Q%a#Rxhx3aS|#$c?pphAODRvTr-2jFx8Z3s4<1(+)lb$Ujsc29gbDpKWU3Av zLEO#+5qH+M!1oX&lyDWvg-Qv=?eG1fQNT8go}?5D0(@llqimAX22#+>&O z55WinaC2|-4D`0$t}ER835en{JJr{LaN=8(^>+pzlx1Mr{Mu|Spp}=VL3Z}*iL*ON zK2C+V?23)*mNT0Knr5K>F$NhJY$y>-5>-rG7@!x%G=a;qPVf8c*77qd(Y)-(L}|x` zHBJTZfVW-1l8O14OKE(Hfo|7ly#FI{^@^_dA_k3F5|cDyr8Ad?kbYEqJTC zokUMx$;FPL)BtwbO*bg6gDF{XVWE?%2skCl;`)vAi=!tCApQXId1+4w8acobpKYu z4E{=}tD6Jjxu&Yrs|^7@xQc!)jKgI*#8GhM)q9eLr34CG|3gu;%RPnG!=e;@UeGN$ zM`+tS3jK}lpGv<3e;Im_+_0C5Y;PG=hU1d_T@l+8r!*q8_oB2vy8Q1tFK6>2*+Wo? z=hJhkNawsiTNm^qsrcyU_^uv<;byavr5Kvn>ju5r{$CkinLE|;t{L_-e=*{dMKr!5 z9`o{TDEZ9k)|GuB!5!Ys8P|J9V#y^%kax1OZ!%Er=nE9PRD9$0g_f!owUzk;`(K34 apS4P8y!bHrfT{G^1sg&(1z!%LfB8EGS|Div literal 1577 zcmcIke^AnA7=OP&gbo8NDlLC;+Of{mM&~R*sc`C5YN=@@O4iIYkR(Z?Q*3pXX0+>^ zrWmZImR7E^%o1fY^)@wa;`xISRJ+s=wQwpbxG&jlwX6NN=b!g;&-1>Y=ks}~sd&{DzmLZ z=9deXM-V>@()+y`U|4F%Y}LqT(_04)pa6%041~GX2p7qwN+5`#x*d?^7jWG8#;yBN z;@w|ajYRnt@Vi=Fs*3U`I4l%W72VkK9!=%vzql!$kIwREbDK!2N8NQQEW0+k%xr?g z^~*iSO!A^TO?|KqKA!A9 z`otSLe|a*Y7+5s5uNN(W1%)pNerFagZ+V;YxCr@pj^zTa%;l1R=4M*=$DRqW66qTV zc;OQVTf%+|*}TD8VzDoT!`cW`m(OHwM z5!7qAT!(36Z_kd)%0dumO-DRH@ZjVY;*yk@yQF`D*1wMN-$alR@Jt1OY=? zCms|*ve@rduY0~;whs?N7HzWi`vGFnS66$JchtpWX9;GT;&Bv4sF(V z!aFkxv2EOinJ0zDAXpL$XU0%OuJWE+BXEvxLDy`*@gvoscr&43f4*HpSn6Y2g=lVb z805vw?>|E9UsfidyP0PC_G(U+A)HCErQWPlf)3@)g^!=@0_5wpb_y4t-1W4Gl`;Q)? z6rmyc+w?=#*H}17(o#Zk`^y8@TthORoajy@5(qdPj^Jyilp41&v?=p!g+TN(3M^R# zWL^+BW%Yg|OX-}ijgPV=7Pnm*OHEb1em(SJz0qe3@03YrraJ1CoR+YP7q?LVN%1ju z>TVo6(Mflsq)6{|>53EXCh5GOtn+b(zq1q0cO@~anqm}$qwK}>f9v@e89bBsT+BaS zF3w@}Up!7-jmQh|ch+yMcOYgp@58+v;Cq)pX8FSw^N*YP)g=7ZZ*v%p|Cs&pO0lQ{ zk#xXXKODIr-p2yp=zArOVz*C^^F!{xS6W!1u!uby5Wz0GvU-f?4!zq((d`m52`Z1DUnw%!&BFik{}V?B{m52x-zUcI*lB4H M+X2!eQt`UDdQ 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 NjCkxcKKCdo