From db109d8bcf990ac44bc96c3c1fe52faaae2f0004 Mon Sep 17 00:00:00 2001 From: abel1502 Date: Sat, 28 Jun 2025 23:14:45 +0300 Subject: [PATCH 01/15] Crane extractors take items to inventory when not facing a conveyor Allows using them as an ad-hoc hopper with a small buffer. Previously their buffer was effectively rudimentary -- it was used for output, but nothing ever inputted into it. --- .../network/TileEntityCraneExtractor.java | 74 +++++++++++-------- 1 file changed, 42 insertions(+), 32 deletions(-) diff --git a/src/main/java/com/hbm/tileentity/network/TileEntityCraneExtractor.java b/src/main/java/com/hbm/tileentity/network/TileEntityCraneExtractor.java index 105ceb3fd..e284f0734 100644 --- a/src/main/java/com/hbm/tileentity/network/TileEntityCraneExtractor.java +++ b/src/main/java/com/hbm/tileentity/network/TileEntityCraneExtractor.java @@ -10,6 +10,8 @@ import com.hbm.items.ModItems; import com.hbm.module.ModulePatternMatcher; import com.hbm.tileentity.IControlReceiverFilter; import com.hbm.tileentity.IGUIProvider; +import com.hbm.util.InventoryUtil; + import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import io.netty.buffer.ByteBuf; @@ -94,54 +96,62 @@ public class TileEntityCraneExtractor extends TileEntityCraneBase implements IGU } boolean hasSent = false; + + IConveyorBelt belt = null; if(b instanceof IConveyorBelt) { + belt = (IConveyorBelt) b; + } - IConveyorBelt belt = (IConveyorBelt) b; + /* try to send items from a connected inv, if present */ + if(te instanceof IInventory) { - /* try to send items from a connected inv, if present */ - if(te instanceof IInventory) { + IInventory inv = (IInventory) te; + int size = access == null ? inv.getSizeInventory() : access.length; + + for(int i = 0; i < size; i++) { + int index = access == null ? i : access[i]; + ItemStack stack = inv.getStackInSlot(index); - IInventory inv = (IInventory) te; - int size = access == null ? inv.getSizeInventory() : access.length; - - for(int i = 0; i < size; i++) { - int index = access == null ? i : access[i]; - ItemStack stack = inv.getStackInSlot(index); + if(stack != null && (sided == null || sided.canExtractItem(index, stack, inputSide.getOpposite().ordinal()))){ - if(stack != null && (sided == null || sided.canExtractItem(index, stack, inputSide.getOpposite().ordinal()))){ + boolean match = this.matchesFilter(stack); + + if((isWhitelist && match) || (!isWhitelist && !match)) { + stack = stack.copy(); + int toSend = Math.min(amount, stack.stackSize); - boolean match = this.matchesFilter(stack); - - if((isWhitelist && match) || (!isWhitelist && !match)) { - stack = stack.copy(); - int toSend = Math.min(amount, stack.stackSize); + if (belt != null) { inv.decrStackSize(index, toSend); stack.stackSize = toSend; - sendItem(stack, belt, outputSide); - hasSent = true; - break; + } else { + stack.stackSize = toSend; + ItemStack remaining = InventoryUtil.tryAddItemToInventory(this.slots, stack); + inv.decrStackSize(index, toSend - (remaining == null ? 0 : remaining.stackSize)); } + hasSent = true; + break; } } } + } + + /* if no item has been sent, send buffered items while ignoring the filter */ + if(!hasSent && belt != null) { - /* if no item has been sent, send buffered items while ignoring the filter */ - if(!hasSent) { + for(int i = 9; i < 18; i++) { + ItemStack stack = slots[i]; - for(int i = 9; i < 18; i++) { - ItemStack stack = slots[i]; - - if(stack != null){ - stack = stack.copy(); - int toSend = Math.min(amount, stack.stackSize); - decrStackSize(i, toSend); - stack.stackSize = toSend; - - sendItem(stack, belt, outputSide); - break; - } + if(stack != null){ + stack = stack.copy(); + int toSend = Math.min(amount, stack.stackSize); + + decrStackSize(i, toSend); + stack.stackSize = toSend; + sendItem(stack, belt, outputSide); + + break; } } } From 997e96f7579b714bf8a2b1d724d96c80797b1706 Mon Sep 17 00:00:00 2001 From: abel1502 Date: Sat, 28 Jun 2025 23:23:16 +0300 Subject: [PATCH 02/15] Exclude special slots --- .../com/hbm/tileentity/network/TileEntityCraneExtractor.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/hbm/tileentity/network/TileEntityCraneExtractor.java b/src/main/java/com/hbm/tileentity/network/TileEntityCraneExtractor.java index e284f0734..804c42321 100644 --- a/src/main/java/com/hbm/tileentity/network/TileEntityCraneExtractor.java +++ b/src/main/java/com/hbm/tileentity/network/TileEntityCraneExtractor.java @@ -127,7 +127,7 @@ public class TileEntityCraneExtractor extends TileEntityCraneBase implements IGU sendItem(stack, belt, outputSide); } else { stack.stackSize = toSend; - ItemStack remaining = InventoryUtil.tryAddItemToInventory(this.slots, stack); + ItemStack remaining = InventoryUtil.tryAddItemToInventory(this.slots, 9, 17, stack); inv.decrStackSize(index, toSend - (remaining == null ? 0 : remaining.stackSize)); } hasSent = true; From f6f1c1c380e35c6acefeaf52677631210fb5ae59 Mon Sep 17 00:00:00 2001 From: abel1502 Date: Sat, 28 Jun 2025 23:50:45 +0300 Subject: [PATCH 03/15] Turn presses into pseudomultiblocks Affects burner and electrical press. They seem to have been implemented largely based on copy-pasted furnace code, and seemingly predate BlockDummyable. That meant the top two blocks of a press were intangible. Now they're in line with the rest of the machines, including the conveyor press. --- .../com/hbm/blocks/machine/MachineEPress.java | 91 +++++-------------- .../com/hbm/blocks/machine/MachinePress.java | 81 +++-------------- 2 files changed, 38 insertions(+), 134 deletions(-) diff --git a/src/main/java/com/hbm/blocks/machine/MachineEPress.java b/src/main/java/com/hbm/blocks/machine/MachineEPress.java index 465ea6c69..42cb7713f 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineEPress.java +++ b/src/main/java/com/hbm/blocks/machine/MachineEPress.java @@ -2,6 +2,7 @@ package com.hbm.blocks.machine; import java.util.Random; +import com.hbm.blocks.BlockDummyable; import com.hbm.main.MainRegistry; import com.hbm.tileentity.machine.TileEntityMachineEPress; import com.hbm.world.gen.INBTTransformable; @@ -20,10 +21,7 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.util.MathHelper; import net.minecraft.world.World; -public class MachineEPress extends BlockContainer implements INBTTransformable { - - private final Random field_149933_a = new Random(); - private static boolean keepInventory; +public class MachineEPress extends BlockDummyable implements INBTTransformable { public MachineEPress(Material p_i45386_1_) { super(p_i45386_1_); @@ -35,75 +33,27 @@ public class MachineEPress extends BlockContainer implements INBTTransformable { } @Override - public int getRenderType() { - return -1; + public int[] getDimensions() { + return new int[] {2, 0, 0, 0, 0, 0}; } @Override - public boolean isOpaqueCube() { - return false; - } - - @Override - 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_); - - 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; - - while(itemstack.stackSize > 0) { - int j1 = this.field_149933_a.nextInt(21) + 10; - - 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())); - - 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); - } - } - } - - 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_); + public int getOffset() { + return 0; } @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); + super.onBlockPlacedBy(world, x, y, z, player, itemStack); if(itemStack.hasDisplayName()) { - ((TileEntityMachineEPress) world.getTileEntity(x, y, z)).setCustomName(itemStack.getDisplayName()); + int[] pos = this.findCore(world, x, y, z); + if(pos != null) { + TileEntityMachineEPress entity = (TileEntityMachineEPress) world.getTileEntity(pos[0], pos[1], pos[2]); + if(entity != null) { + entity.setCustomName(itemStack.getDisplayName()); + } + } } } @@ -112,10 +62,15 @@ public class MachineEPress extends BlockContainer implements INBTTransformable { if(world.isRemote) { return true; } else if(!player.isSneaking()) { - TileEntityMachineEPress entity = (TileEntityMachineEPress) world.getTileEntity(x, y, z); - if(entity != null) { - FMLNetworkHandler.openGui(player, MainRegistry.instance, 0, world, x, y, z); - } + int[] pos = this.findCore(world, x, y, z); + if(pos == null) + return false; + + TileEntityMachineEPress entity = (TileEntityMachineEPress) world.getTileEntity(pos[0], pos[1], pos[2]); + if(entity == null) + return false; + + FMLNetworkHandler.openGui(player, MainRegistry.instance, 0, world, x, y, z); return true; } else { return false; diff --git a/src/main/java/com/hbm/blocks/machine/MachinePress.java b/src/main/java/com/hbm/blocks/machine/MachinePress.java index a28d22172..ddf7782b7 100644 --- a/src/main/java/com/hbm/blocks/machine/MachinePress.java +++ b/src/main/java/com/hbm/blocks/machine/MachinePress.java @@ -2,23 +2,16 @@ package com.hbm.blocks.machine; import java.util.Random; +import com.hbm.blocks.BlockDummyable; import com.hbm.main.MainRegistry; import com.hbm.tileentity.machine.TileEntityMachinePress; import cpw.mods.fml.common.network.internal.FMLNetworkHandler; -import net.minecraft.block.Block; -import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; -import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; -public class MachinePress extends BlockContainer { - - private final Random field_149933_a = new Random(); - private static boolean keepInventory; +public class MachinePress extends BlockDummyable { public MachinePress(Material p_i45386_1_) { super(p_i45386_1_); @@ -30,62 +23,13 @@ public class MachinePress extends BlockContainer { } @Override - public int getRenderType() { - return -1; + public int[] getDimensions() { + return new int[] {2, 0, 0, 0, 0, 0}; } @Override - public boolean isOpaqueCube() { - return false; - } - - @Override - 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) { - TileEntityMachinePress tileentityfurnace = (TileEntityMachinePress) 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(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; - - 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())); - - 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); - } - } - } - - 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_); + public int getOffset() { + return 0; } @Override @@ -93,10 +37,15 @@ public class MachinePress extends BlockContainer { if(world.isRemote) { return true; } else if(!player.isSneaking()) { - TileEntityMachinePress entity = (TileEntityMachinePress) world.getTileEntity(x, y, z); - if(entity != null) { - FMLNetworkHandler.openGui(player, MainRegistry.instance, 0, world, x, y, z); - } + int[] pos = this.findCore(world, x, y, z); + if(pos == null) + return false; + + TileEntityMachinePress entity = (TileEntityMachinePress) world.getTileEntity(pos[0], pos[1], pos[2]); + if(entity == null) + return false; + + FMLNetworkHandler.openGui(player, MainRegistry.instance, 0, world, x, y, z); return true; } else { return false; From 1f073d570cece2b650a6fb43676a3d2db805b597 Mon Sep 17 00:00:00 2001 From: abel1502 Date: Sat, 28 Jun 2025 23:52:39 +0300 Subject: [PATCH 04/15] Fix createNewTileEntity and clean up a bit --- .../com/hbm/blocks/machine/MachineEPress.java | 15 +++++---------- .../java/com/hbm/blocks/machine/MachinePress.java | 9 +++++---- 2 files changed, 10 insertions(+), 14 deletions(-) diff --git a/src/main/java/com/hbm/blocks/machine/MachineEPress.java b/src/main/java/com/hbm/blocks/machine/MachineEPress.java index 42cb7713f..3f33886f3 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineEPress.java +++ b/src/main/java/com/hbm/blocks/machine/MachineEPress.java @@ -8,28 +8,23 @@ import com.hbm.tileentity.machine.TileEntityMachineEPress; import com.hbm.world.gen.INBTTransformable; import cpw.mods.fml.common.network.internal.FMLNetworkHandler; -import net.minecraft.block.Block; -import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.inventory.ISidedInventory; import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.MathHelper; import net.minecraft.world.World; public class MachineEPress extends BlockDummyable implements INBTTransformable { - public MachineEPress(Material p_i45386_1_) { - super(p_i45386_1_); + public MachineEPress(Material mat) { + super(mat); } @Override - public TileEntity createNewTileEntity(World p_149915_1_, int p_149915_2_) { - return new TileEntityMachineEPress(); + public TileEntity createNewTileEntity(World world, int meta) { + if(meta >= 12) return new TileEntityMachineEPress(); + return null; } @Override diff --git a/src/main/java/com/hbm/blocks/machine/MachinePress.java b/src/main/java/com/hbm/blocks/machine/MachinePress.java index ddf7782b7..6633c9e76 100644 --- a/src/main/java/com/hbm/blocks/machine/MachinePress.java +++ b/src/main/java/com/hbm/blocks/machine/MachinePress.java @@ -13,13 +13,14 @@ import net.minecraft.world.World; public class MachinePress extends BlockDummyable { - public MachinePress(Material p_i45386_1_) { - super(p_i45386_1_); + public MachinePress(Material mat) { + super(mat); } @Override - public TileEntity createNewTileEntity(World p_149915_1_, int p_149915_2_) { - return new TileEntityMachinePress(); + public TileEntity createNewTileEntity(World world, int meta) { + if(meta >= 12) return new TileEntityMachinePress(); + return null; } @Override From 1bb88b176a7231932f2b2875e4a9ddf2f6f70de4 Mon Sep 17 00:00:00 2001 From: abel1502 Date: Sun, 29 Jun 2025 00:10:25 +0300 Subject: [PATCH 05/15] More fixes Turns out, pseudomultiblocks are pretty complicated --- src/main/java/com/hbm/blocks/machine/MachineEPress.java | 4 +++- src/main/java/com/hbm/blocks/machine/MachinePress.java | 4 +++- src/main/java/com/hbm/render/tileentity/RenderEPress.java | 7 ++++--- 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/hbm/blocks/machine/MachineEPress.java b/src/main/java/com/hbm/blocks/machine/MachineEPress.java index 3f33886f3..d52898b60 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineEPress.java +++ b/src/main/java/com/hbm/blocks/machine/MachineEPress.java @@ -4,6 +4,7 @@ import java.util.Random; import com.hbm.blocks.BlockDummyable; import com.hbm.main.MainRegistry; +import com.hbm.tileentity.TileEntityProxyCombo; import com.hbm.tileentity.machine.TileEntityMachineEPress; import com.hbm.world.gen.INBTTransformable; @@ -24,6 +25,7 @@ public class MachineEPress extends BlockDummyable implements INBTTransformable { @Override public TileEntity createNewTileEntity(World world, int meta) { if(meta >= 12) return new TileEntityMachineEPress(); + if(meta >= 6) return new TileEntityProxyCombo(true, false, false); return null; } @@ -65,7 +67,7 @@ public class MachineEPress extends BlockDummyable implements INBTTransformable { if(entity == null) return false; - FMLNetworkHandler.openGui(player, MainRegistry.instance, 0, world, x, y, z); + FMLNetworkHandler.openGui(player, MainRegistry.instance, 0, world, pos[0], pos[1], pos[2]); return true; } else { return false; diff --git a/src/main/java/com/hbm/blocks/machine/MachinePress.java b/src/main/java/com/hbm/blocks/machine/MachinePress.java index 6633c9e76..22ecffa26 100644 --- a/src/main/java/com/hbm/blocks/machine/MachinePress.java +++ b/src/main/java/com/hbm/blocks/machine/MachinePress.java @@ -4,6 +4,7 @@ import java.util.Random; import com.hbm.blocks.BlockDummyable; import com.hbm.main.MainRegistry; +import com.hbm.tileentity.TileEntityProxyCombo; import com.hbm.tileentity.machine.TileEntityMachinePress; import cpw.mods.fml.common.network.internal.FMLNetworkHandler; import net.minecraft.block.material.Material; @@ -20,6 +21,7 @@ public class MachinePress extends BlockDummyable { @Override public TileEntity createNewTileEntity(World world, int meta) { if(meta >= 12) return new TileEntityMachinePress(); + if(meta >= 6) return new TileEntityProxyCombo(true, false, false); return null; } @@ -46,7 +48,7 @@ public class MachinePress extends BlockDummyable { if(entity == null) return false; - FMLNetworkHandler.openGui(player, MainRegistry.instance, 0, world, x, y, z); + FMLNetworkHandler.openGui(player, MainRegistry.instance, 0, world, pos[0], pos[1], pos[2]); return true; } else { return false; diff --git a/src/main/java/com/hbm/render/tileentity/RenderEPress.java b/src/main/java/com/hbm/render/tileentity/RenderEPress.java index 987ab9a0a..cf8915ef8 100644 --- a/src/main/java/com/hbm/render/tileentity/RenderEPress.java +++ b/src/main/java/com/hbm/render/tileentity/RenderEPress.java @@ -2,6 +2,7 @@ package com.hbm.render.tileentity; import org.lwjgl.opengl.GL11; +import com.hbm.blocks.BlockDummyable; import com.hbm.main.ResourceManager; import com.hbm.render.util.RenderDecoItem; import com.hbm.tileentity.machine.TileEntityMachineEPress; @@ -28,7 +29,7 @@ public class RenderEPress extends TileEntitySpecialRenderer { GL11.glEnable(GL11.GL_LIGHTING); GL11.glRotatef(180, 0F, 1F, 0F); - switch(tileentity.getBlockMetadata()) { + switch(tileentity.getBlockMetadata() - BlockDummyable.offset) { 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; @@ -50,7 +51,7 @@ public class RenderEPress extends TileEntitySpecialRenderer { GL11.glEnable(GL11.GL_LIGHTING); GL11.glRotatef(180, 0F, 1F, 0F); - switch(tileentity.getBlockMetadata()) { + switch(tileentity.getBlockMetadata() - BlockDummyable.offset) { 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; @@ -78,7 +79,7 @@ public class RenderEPress extends TileEntitySpecialRenderer { GL11.glEnable(GL11.GL_LIGHTING); GL11.glRotatef(180, 0F, 1F, 0F); - switch(tileentity.getBlockMetadata()) { + switch(tileentity.getBlockMetadata() - BlockDummyable.offset) { case 2: GL11.glRotatef(270, 0F, 1F, 0F); break; case 4: From 41d62c49db9e1fa3704c0c10eb59123ef7f2281f Mon Sep 17 00:00:00 2001 From: abel1502 Date: Sun, 29 Jun 2025 00:24:32 +0300 Subject: [PATCH 06/15] Remove broken & redundant transformMeta --- .../java/com/hbm/blocks/machine/MachineEPress.java | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/src/main/java/com/hbm/blocks/machine/MachineEPress.java b/src/main/java/com/hbm/blocks/machine/MachineEPress.java index d52898b60..12a7f91ff 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineEPress.java +++ b/src/main/java/com/hbm/blocks/machine/MachineEPress.java @@ -1,12 +1,9 @@ package com.hbm.blocks.machine; -import java.util.Random; - import com.hbm.blocks.BlockDummyable; import com.hbm.main.MainRegistry; import com.hbm.tileentity.TileEntityProxyCombo; import com.hbm.tileentity.machine.TileEntityMachineEPress; -import com.hbm.world.gen.INBTTransformable; import cpw.mods.fml.common.network.internal.FMLNetworkHandler; import net.minecraft.block.material.Material; @@ -16,7 +13,7 @@ import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; -public class MachineEPress extends BlockDummyable implements INBTTransformable { +public class MachineEPress extends BlockDummyable { public MachineEPress(Material mat) { super(mat); @@ -73,9 +70,4 @@ public class MachineEPress extends BlockDummyable implements INBTTransformable { return false; } } - - @Override - public int transformMeta(int meta, int coordBaseMode) { - return INBTTransformable.transformMetaDeco(meta, coordBaseMode); - } } \ No newline at end of file From 4a869ae2ea3a5926508b5f8936aa93e9cff2479d Mon Sep 17 00:00:00 2001 From: abel1502 Date: Sun, 29 Jun 2025 01:02:43 +0300 Subject: [PATCH 07/15] Add automatic migration API to BlockDummyable --- .../java/com/hbm/blocks/BlockDummyable.java | 38 ++++++++++++------- 1 file changed, 24 insertions(+), 14 deletions(-) diff --git a/src/main/java/com/hbm/blocks/BlockDummyable.java b/src/main/java/com/hbm/blocks/BlockDummyable.java index 9508350b5..0d7fa08b4 100644 --- a/src/main/java/com/hbm/blocks/BlockDummyable.java +++ b/src/main/java/com/hbm/blocks/BlockDummyable.java @@ -77,27 +77,20 @@ public abstract class BlockDummyable extends BlockContainer implements ICustomBl super.onNeighborBlockChange(world, x, y, z, block); - if(world.isRemote || safeRem) + if(safeRem) return; - int metadata = world.getBlockMetadata(x, y, z); - - // if it's an extra, remove the extra-ness - if(metadata >= extra) - metadata -= extra; - - ForgeDirection dir = ForgeDirection.getOrientation(metadata).getOpposite(); - Block b = world.getBlock(x + dir.offsetX, y + dir.offsetY, z + dir.offsetZ); - - if(b != this) { - world.setBlockToAir(x, y, z); - } + destroyIfOrphan(world, x, y, z); } public void updateTick(World world, int x, int y, int z, Random rand) { super.updateTick(world, x, y, z, rand); + destroyIfOrphan(world, x, y, z); + } + + private void destroyIfOrphan(World world, int x, int y, int z) { if(world.isRemote) return; @@ -111,9 +104,26 @@ public abstract class BlockDummyable extends BlockContainer implements ICustomBl Block b = world.getBlock(x + dir.offsetX, y + dir.offsetY, z + dir.offsetZ); if(b != this) { - world.setBlockToAir(x, y, z); + if (isLegacyMonoblock(world, x, y, z)) { + fixLegacyMonoblock(world, x, y, z); + } else { + world.setBlockToAir(x, y, z); + } } + } + // Override this when turning a single block into a pseudo-multiblock. + // If this returns true, instead of being deleted as an orphan, the block + // will be promoted to a core of a dummyable, however without any dummies. + // This is only called if the block is presumed an orphan, so you don't + // need to check that here. + protected boolean isLegacyMonoblock(World world, int x, int y, int z) { + return false; + } + + protected void fixLegacyMonoblock(World world, int x, int y, int z) { + // Promote to a lone core block with the same effective rotation as before the change + world.setBlockMetadataWithNotify(x, y, z, offset + world.getBlockMetadata(x, y, z), 3); } public int[] findCore(World world, int x, int y, int z) { From 0eb87524ab832567d48a3a48b901f6df1305d0d0 Mon Sep 17 00:00:00 2001 From: abel1502 Date: Sun, 29 Jun 2025 01:03:16 +0300 Subject: [PATCH 08/15] Make new press implementation savegame-compatible --- src/main/java/com/hbm/blocks/machine/MachineEPress.java | 6 ++++++ src/main/java/com/hbm/blocks/machine/MachinePress.java | 6 ++++++ 2 files changed, 12 insertions(+) diff --git a/src/main/java/com/hbm/blocks/machine/MachineEPress.java b/src/main/java/com/hbm/blocks/machine/MachineEPress.java index 12a7f91ff..add331ba3 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineEPress.java +++ b/src/main/java/com/hbm/blocks/machine/MachineEPress.java @@ -36,6 +36,12 @@ public class MachineEPress extends BlockDummyable { return 0; } + @Override + protected boolean isLegacyMonoblock(World world, int x, int y, int z) { + TileEntity te = world.getTileEntity(x, y, z); + return te != null && te instanceof TileEntityMachineEPress; + } + @Override public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase player, ItemStack itemStack) { super.onBlockPlacedBy(world, x, y, z, player, itemStack); diff --git a/src/main/java/com/hbm/blocks/machine/MachinePress.java b/src/main/java/com/hbm/blocks/machine/MachinePress.java index 22ecffa26..6f4cf5808 100644 --- a/src/main/java/com/hbm/blocks/machine/MachinePress.java +++ b/src/main/java/com/hbm/blocks/machine/MachinePress.java @@ -34,6 +34,12 @@ public class MachinePress extends BlockDummyable { public int getOffset() { return 0; } + + @Override + protected boolean isLegacyMonoblock(World world, int x, int y, int z) { + TileEntity te = world.getTileEntity(x, y, z); + return te != null && te instanceof TileEntityMachinePress; + } @Override public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { From 3b36807242fa24ef3b9673a9b9e3ff86d92f114f Mon Sep 17 00:00:00 2001 From: abel1502 Date: Sun, 29 Jun 2025 01:44:31 +0300 Subject: [PATCH 09/15] Trigger the press fix automatically --- .../tileentity/machine/TileEntityMachineEPress.java | 12 ++++++++++++ .../tileentity/machine/TileEntityMachinePress.java | 12 ++++++++++++ 2 files changed, 24 insertions(+) diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineEPress.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineEPress.java index b2afe4309..90896b626 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineEPress.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineEPress.java @@ -3,6 +3,7 @@ package com.hbm.tileentity.machine; import java.util.HashMap; import java.util.List; +import com.hbm.blocks.BlockDummyable; import com.hbm.blocks.ModBlocks; import com.hbm.inventory.UpgradeManagerNT; import com.hbm.inventory.container.ContainerMachineEPress; @@ -64,6 +65,17 @@ public class TileEntityMachineEPress extends TileEntityMachineBase implements IE if(!worldObj.isRemote) { + // Triggers the legacy monoblock fix + if (worldObj.getBlockMetadata(xCoord, yCoord, zCoord) < BlockDummyable.offset) { + // Does nothing + // worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); + + BlockDummyable block = (BlockDummyable)worldObj.getBlock(xCoord, yCoord, zCoord); + if (block != null) { + block.onNeighborBlockChange(worldObj, xCoord, yCoord, zCoord, null); + } + } + this.updateConnections(); power = Library.chargeTEFromItems(slots, 0, power, maxPower); diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachinePress.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachinePress.java index c927edc0a..0684ef87e 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachinePress.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachinePress.java @@ -1,5 +1,6 @@ package com.hbm.tileentity.machine; +import com.hbm.blocks.BlockDummyable; import com.hbm.blocks.ModBlocks; import com.hbm.inventory.container.ContainerMachinePress; import com.hbm.inventory.gui.GUIMachinePress; @@ -53,6 +54,17 @@ public class TileEntityMachinePress extends TileEntityMachineBase implements IGU if(!worldObj.isRemote) { + // Triggers the legacy monoblock fix + if (worldObj.getBlockMetadata(xCoord, yCoord, zCoord) < BlockDummyable.offset) { + // Does nothing + // worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); + + BlockDummyable block = (BlockDummyable)worldObj.getBlock(xCoord, yCoord, zCoord); + if (block != null) { + block.onNeighborBlockChange(worldObj, xCoord, yCoord, zCoord, null); + } + } + boolean preheated = false; for(ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) { From d1f50a8eb4419057c17dbc9faabdf87b225be10a Mon Sep 17 00:00:00 2001 From: abel1502 Date: Sun, 29 Jun 2025 15:45:30 +0300 Subject: [PATCH 10/15] Fix press auto-migration --- .../tileentity/machine/TileEntityMachineEPress.java | 11 ++--------- .../tileentity/machine/TileEntityMachinePress.java | 11 ++--------- 2 files changed, 4 insertions(+), 18 deletions(-) diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineEPress.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineEPress.java index 90896b626..4dc4df595 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineEPress.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineEPress.java @@ -3,7 +3,6 @@ package com.hbm.tileentity.machine; import java.util.HashMap; import java.util.List; -import com.hbm.blocks.BlockDummyable; import com.hbm.blocks.ModBlocks; import com.hbm.inventory.UpgradeManagerNT; import com.hbm.inventory.container.ContainerMachineEPress; @@ -66,14 +65,8 @@ public class TileEntityMachineEPress extends TileEntityMachineBase implements IE if(!worldObj.isRemote) { // Triggers the legacy monoblock fix - if (worldObj.getBlockMetadata(xCoord, yCoord, zCoord) < BlockDummyable.offset) { - // Does nothing - // worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); - - BlockDummyable block = (BlockDummyable)worldObj.getBlock(xCoord, yCoord, zCoord); - if (block != null) { - block.onNeighborBlockChange(worldObj, xCoord, yCoord, zCoord, null); - } + if (worldObj.getBlockMetadata(xCoord, yCoord, zCoord) < 12) { + worldObj.scheduleBlockUpdate(xCoord, yCoord, zCoord, worldObj.getBlock(xCoord, yCoord, zCoord), 1); } this.updateConnections(); diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachinePress.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachinePress.java index 0684ef87e..a0d1e5b8a 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachinePress.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachinePress.java @@ -1,6 +1,5 @@ package com.hbm.tileentity.machine; -import com.hbm.blocks.BlockDummyable; import com.hbm.blocks.ModBlocks; import com.hbm.inventory.container.ContainerMachinePress; import com.hbm.inventory.gui.GUIMachinePress; @@ -55,14 +54,8 @@ public class TileEntityMachinePress extends TileEntityMachineBase implements IGU if(!worldObj.isRemote) { // Triggers the legacy monoblock fix - if (worldObj.getBlockMetadata(xCoord, yCoord, zCoord) < BlockDummyable.offset) { - // Does nothing - // worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); - - BlockDummyable block = (BlockDummyable)worldObj.getBlock(xCoord, yCoord, zCoord); - if (block != null) { - block.onNeighborBlockChange(worldObj, xCoord, yCoord, zCoord, null); - } + if (worldObj.getBlockMetadata(xCoord, yCoord, zCoord) < 12) { + worldObj.scheduleBlockUpdate(xCoord, yCoord, zCoord, worldObj.getBlock(xCoord, yCoord, zCoord), 1); } boolean preheated = false; From d1497abd1e16ada4812c6c077db2aa6f9973cbcf Mon Sep 17 00:00:00 2001 From: abel1502 Date: Sun, 29 Jun 2025 23:40:51 +0300 Subject: [PATCH 11/15] Simplify press click handling Turns out there is already a function for doing just that --- .../com/hbm/blocks/machine/MachineEPress.java | 17 +---------------- .../com/hbm/blocks/machine/MachinePress.java | 17 +---------------- 2 files changed, 2 insertions(+), 32 deletions(-) diff --git a/src/main/java/com/hbm/blocks/machine/MachineEPress.java b/src/main/java/com/hbm/blocks/machine/MachineEPress.java index add331ba3..c44a8e575 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineEPress.java +++ b/src/main/java/com/hbm/blocks/machine/MachineEPress.java @@ -59,21 +59,6 @@ public class MachineEPress extends BlockDummyable { @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) { - return true; - } else if(!player.isSneaking()) { - int[] pos = this.findCore(world, x, y, z); - if(pos == null) - return false; - - TileEntityMachineEPress entity = (TileEntityMachineEPress) world.getTileEntity(pos[0], pos[1], pos[2]); - if(entity == null) - return false; - - FMLNetworkHandler.openGui(player, MainRegistry.instance, 0, world, pos[0], pos[1], pos[2]); - return true; - } else { - return false; - } + return this.standardOpenBehavior(world, x, y, z, player, 0); } } \ No newline at end of file diff --git a/src/main/java/com/hbm/blocks/machine/MachinePress.java b/src/main/java/com/hbm/blocks/machine/MachinePress.java index 6f4cf5808..1e6c51ca3 100644 --- a/src/main/java/com/hbm/blocks/machine/MachinePress.java +++ b/src/main/java/com/hbm/blocks/machine/MachinePress.java @@ -43,21 +43,6 @@ public class MachinePress extends BlockDummyable { @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) { - return true; - } else if(!player.isSneaking()) { - int[] pos = this.findCore(world, x, y, z); - if(pos == null) - return false; - - TileEntityMachinePress entity = (TileEntityMachinePress) world.getTileEntity(pos[0], pos[1], pos[2]); - if(entity == null) - return false; - - FMLNetworkHandler.openGui(player, MainRegistry.instance, 0, world, pos[0], pos[1], pos[2]); - return true; - } else { - return false; - } + return this.standardOpenBehavior(world, x, y, z, player, 0); } } From 18a310ba3a0e210d38125ac52a7a74926ef1527b Mon Sep 17 00:00:00 2001 From: abel1502 Date: Mon, 30 Jun 2025 00:24:55 +0300 Subject: [PATCH 12/15] Prevent pseudomultiblocks disappearing on chunk boundaries If this was indeed a problem, it must've been one before my PR... I suspect maybe some of my intermediate implementations allowed this to have an effect. Regardless, this is definitely a useful fix --- src/main/java/com/hbm/blocks/BlockDummyable.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/hbm/blocks/BlockDummyable.java b/src/main/java/com/hbm/blocks/BlockDummyable.java index 0d7fa08b4..19c33db65 100644 --- a/src/main/java/com/hbm/blocks/BlockDummyable.java +++ b/src/main/java/com/hbm/blocks/BlockDummyable.java @@ -103,7 +103,12 @@ public abstract class BlockDummyable extends BlockContainer implements ICustomBl ForgeDirection dir = ForgeDirection.getOrientation(metadata).getOpposite(); Block b = world.getBlock(x + dir.offsetX, y + dir.offsetY, z + dir.offsetZ); - if(b != this) { + // An extra precaution against multiblocks on chunk borders being erroneously deleted. + // Technically, this might be used to persist ghost dummy blocks by manipulating + // loaded chunks and block destruction, but this gives no benefit to the player, + // cannot be done accidentally, and is definitely preferable to multiblocks + // just vanishing when their chunks are unloaded in an unlucky way. + if(b != this && world.checkChunksExist(x - 1, y - 1, z - 1, x + 1, y + 1, z + 1)) { if (isLegacyMonoblock(world, x, y, z)) { fixLegacyMonoblock(world, x, y, z); } else { From f792fdebe38ff319ae808147cb4136714cb22ac3 Mon Sep 17 00:00:00 2001 From: abel1502 Date: Mon, 30 Jun 2025 09:11:51 +0300 Subject: [PATCH 13/15] Make presses un-multiblockable with a hand drill As per @MellowArpeggiation 's request. Meant for schenanigans with visually squishing things --- .../com/hbm/blocks/machine/MachineEPress.java | 20 +++++++++++++--- .../com/hbm/blocks/machine/MachinePress.java | 24 +++++++++++++++---- 2 files changed, 36 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/hbm/blocks/machine/MachineEPress.java b/src/main/java/com/hbm/blocks/machine/MachineEPress.java index c44a8e575..d269c253c 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineEPress.java +++ b/src/main/java/com/hbm/blocks/machine/MachineEPress.java @@ -1,11 +1,10 @@ package com.hbm.blocks.machine; import com.hbm.blocks.BlockDummyable; -import com.hbm.main.MainRegistry; import com.hbm.tileentity.TileEntityProxyCombo; import com.hbm.tileentity.machine.TileEntityMachineEPress; -import cpw.mods.fml.common.network.internal.FMLNetworkHandler; +import api.hbm.block.IToolable; import net.minecraft.block.material.Material; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; @@ -13,7 +12,7 @@ import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; -public class MachineEPress extends BlockDummyable { +public class MachineEPress extends BlockDummyable implements IToolable { public MachineEPress(Material mat) { super(mat); @@ -61,4 +60,19 @@ public class MachineEPress extends BlockDummyable { public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { return this.standardOpenBehavior(world, x, y, z, player, 0); } + + // Un-multiblickable with a hand drill for schenanigans + @Override + public boolean onScrew(World world, EntityPlayer player, int x, int y, int z, int side, float fX, float fY, float fZ, ToolType tool) { + + if (tool != ToolType.HAND_DRILL) + return false; + + int meta = world.getBlockMetadata(x, y, z); + if (meta >= 12) + return false; + + world.setBlockToAir(x, y, z); + return true; + } } \ No newline at end of file diff --git a/src/main/java/com/hbm/blocks/machine/MachinePress.java b/src/main/java/com/hbm/blocks/machine/MachinePress.java index 1e6c51ca3..44415589f 100644 --- a/src/main/java/com/hbm/blocks/machine/MachinePress.java +++ b/src/main/java/com/hbm/blocks/machine/MachinePress.java @@ -1,18 +1,16 @@ package com.hbm.blocks.machine; -import java.util.Random; - import com.hbm.blocks.BlockDummyable; -import com.hbm.main.MainRegistry; import com.hbm.tileentity.TileEntityProxyCombo; import com.hbm.tileentity.machine.TileEntityMachinePress; -import cpw.mods.fml.common.network.internal.FMLNetworkHandler; + +import api.hbm.block.IToolable; import net.minecraft.block.material.Material; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; -public class MachinePress extends BlockDummyable { +public class MachinePress extends BlockDummyable implements IToolable { public MachinePress(Material mat) { super(mat); @@ -45,4 +43,20 @@ public class MachinePress extends BlockDummyable { public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { return this.standardOpenBehavior(world, x, y, z, player, 0); } + + // Un-multiblickable with a hand drill for schenanigans + @Override + public boolean onScrew(World world, EntityPlayer player, int x, int y, int z, int side, float fX, float fY, float fZ, ToolType tool) { + + if (tool != ToolType.HAND_DRILL) + return false; + + int meta = world.getBlockMetadata(x, y, z); + if (meta >= 12) + return false; + + world.setBlockToAir(x, y, z); + return true; + } + } From 2e5882df606b88eea588fd7719132b0dd2051216 Mon Sep 17 00:00:00 2001 From: abel1502 Date: Mon, 30 Jun 2025 09:14:49 +0300 Subject: [PATCH 14/15] Don't break the whole thing --- src/main/java/com/hbm/blocks/machine/MachineEPress.java | 2 ++ src/main/java/com/hbm/blocks/machine/MachinePress.java | 2 ++ 2 files changed, 4 insertions(+) diff --git a/src/main/java/com/hbm/blocks/machine/MachineEPress.java b/src/main/java/com/hbm/blocks/machine/MachineEPress.java index d269c253c..82eb6d89f 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineEPress.java +++ b/src/main/java/com/hbm/blocks/machine/MachineEPress.java @@ -72,7 +72,9 @@ public class MachineEPress extends BlockDummyable implements IToolable { if (meta >= 12) return false; + safeRem = true; world.setBlockToAir(x, y, z); + safeRem = false; return true; } } \ No newline at end of file diff --git a/src/main/java/com/hbm/blocks/machine/MachinePress.java b/src/main/java/com/hbm/blocks/machine/MachinePress.java index 44415589f..b02f3dab8 100644 --- a/src/main/java/com/hbm/blocks/machine/MachinePress.java +++ b/src/main/java/com/hbm/blocks/machine/MachinePress.java @@ -55,7 +55,9 @@ public class MachinePress extends BlockDummyable implements IToolable { if (meta >= 12) return false; + safeRem = true; world.setBlockToAir(x, y, z); + safeRem = false; return true; } From c08a90553a8ce91ff6ba0534057ce949d84a67e9 Mon Sep 17 00:00:00 2001 From: Boblet Date: Mon, 30 Jun 2025 16:30:59 +0200 Subject: [PATCH 15/15] FLESH --- changelog | 6 + gradle.properties | 2 +- .../com/hbm/crafting/ConsumableRecipes.java | 10 +- .../java/com/hbm/crafting/ToolRecipes.java | 5 +- .../entity/logic/EntityNukeExplosionMK5.java | 13 +- .../com/hbm/explosion/ExplosionFleija.java | 37 ++-- .../java/com/hbm/handler/HTTPHandler.java | 17 +- .../gui/LoadingScreenRendererNT.java | 189 ++++++++++++++++++ .../inventory/recipes/PedestalRecipes.java | 4 +- src/main/java/com/hbm/items/ItemEnums.java | 2 +- src/main/java/com/hbm/items/ModItems.java | 3 + .../com/hbm/items/tool/ItemRangefinder.java | 47 +++++ src/main/java/com/hbm/lib/RefStrings.java | 2 +- .../java/com/hbm/main/CraftingManager.java | 3 +- .../com/hbm/main/ModEventHandlerClient.java | 10 +- src/main/java/com/hbm/main/ServerProxy.java | 3 +- src/main/java/com/hbm/util/Vec3NT.java | 14 ++ src/main/resources/META-INF/HBM_at.cfg | 2 + src/main/resources/assets/hbm/lang/de_DE.lang | 1 + src/main/resources/assets/hbm/lang/en_US.lang | 1 + .../hbm/textures/items/ingot_metal.scrap.png | Bin 0 -> 627 bytes .../hbm/textures/items/ingot_metal_sheet.png | Bin 6720 -> 7567 bytes .../assets/hbm/textures/items/rangefinder.png | Bin 0 -> 280 bytes 23 files changed, 320 insertions(+), 51 deletions(-) create mode 100644 src/main/java/com/hbm/inventory/gui/LoadingScreenRendererNT.java create mode 100644 src/main/java/com/hbm/items/tool/ItemRangefinder.java create mode 100644 src/main/resources/assets/hbm/textures/items/ingot_metal.scrap.png create mode 100644 src/main/resources/assets/hbm/textures/items/rangefinder.png diff --git a/changelog b/changelog index 1e3e818a7..bb000ef7e 100644 --- a/changelog +++ b/changelog @@ -14,6 +14,9 @@ * This means that a chemical factory can make hydrogen peroxide, sulfuric acid and nitric acid, and the only fluid input needed is water * Paintable exhaust pipe * Full block exhaust pipe that behaves like paintable cables and ducts +* Rangefinder + * A simple tool for checking the distance to a block + * Is now used as the base ingredient for long range target designatory, artillery remotes and airstrike designators ## Changed * Updated chinese and ukrainian localizations @@ -44,6 +47,8 @@ * Open doors can now be interacted through * Area abilities on tools now drop all mined blocks in the center * Tools with AoE now come with the new "flat AoE" ability, which is the same but the area is only 1 block tall +* Atomic airstrike now requires a control unit +* Parallelized explosions have been temporarily disabled, regardless of config option, explosions will use the previous system ## Fixed * Chemical plant ports. For real this time. @@ -62,3 +67,4 @@ * Replaced paintabble cables in the lighthouse with regular ones, fixing an issue where the paint would ID shift * Fixed light blocks being considered solid for NPC pathfinding * Fixed issue regarding locked slots when using crates +* Fixed MK3 explosions crashing when spawned with invalid size or when not being deserialized correctly diff --git a/gradle.properties b/gradle.properties index 17c61bd4b..da72d22ff 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,6 +1,6 @@ mod_version=1.0.27 # Empty build number makes a release type -mod_build_number=5357 +mod_build_number=5377 credits=HbMinecraft,\ \ rodolphito (explosion algorithms),\ diff --git a/src/main/java/com/hbm/crafting/ConsumableRecipes.java b/src/main/java/com/hbm/crafting/ConsumableRecipes.java index a64f9759c..8d867f56e 100644 --- a/src/main/java/com/hbm/crafting/ConsumableRecipes.java +++ b/src/main/java/com/hbm/crafting/ConsumableRecipes.java @@ -27,11 +27,11 @@ public class ConsumableRecipes { public static void register() { //Airstikes - CraftingManager.addRecipeAuto(new ItemStack(ModItems.bomb_caller, 1, 0), new Object[] { "TTT", "TRT", "TTT", 'T', Blocks.tnt, 'R', ModItems.detonator_laser }); - CraftingManager.addRecipeAuto(new ItemStack(ModItems.bomb_caller, 1, 1), new Object[] { "TTT", "TRT", "TTT", 'T', ModItems.grenade_gascan, 'R', ModItems.detonator_laser }); - CraftingManager.addRecipeAuto(new ItemStack(ModItems.bomb_caller, 1, 2), new Object[] { "TTT", "TRT", "TTT", 'T', ModItems.pellet_gas, 'R', ModItems.detonator_laser }); - CraftingManager.addRecipeAuto(new ItemStack(ModItems.bomb_caller, 1, 3), new Object[] { "TRT", 'T', ModItems.grenade_cloud, 'R', ModItems.detonator_laser }); - CraftingManager.addRecipeAuto(new ItemStack(ModItems.bomb_caller, 1, 4), new Object[] { "TR", 'T', DictFrame.fromOne(ModItems.ammo_standard, EnumAmmo.NUKE_HIGH), 'R', ModItems.detonator_laser }); + CraftingManager.addRecipeAuto(new ItemStack(ModItems.bomb_caller, 1, 0), new Object[] { "TTT", "TRT", "TTT", 'T', Blocks.tnt, 'R', ModItems.rangefinder }); + CraftingManager.addRecipeAuto(new ItemStack(ModItems.bomb_caller, 1, 1), new Object[] { "TTT", "TRT", "TTT", 'T', ModItems.grenade_gascan, 'R', ModItems.rangefinder }); + CraftingManager.addRecipeAuto(new ItemStack(ModItems.bomb_caller, 1, 2), new Object[] { "TTT", "TRT", "TTT", 'T', ModItems.pellet_gas, 'R', ModItems.rangefinder }); + CraftingManager.addRecipeAuto(new ItemStack(ModItems.bomb_caller, 1, 3), new Object[] { "TRT", 'T', ModItems.grenade_cloud, 'R', ModItems.rangefinder }); + CraftingManager.addRecipeAuto(new ItemStack(ModItems.bomb_caller, 1, 4), new Object[] { "TRC", 'T', DictFrame.fromOne(ModItems.ammo_standard, EnumAmmo.NUKE_HIGH), 'R', ModItems.rangefinder, 'C', DictFrame.fromOne(ModItems.circuit, EnumCircuitType.CONTROLLER) }); //Food CraftingManager.addRecipeAuto(new ItemStack(ModItems.bomb_waffle, 1), new Object[] { "WEW", "MPM", "WEW", 'W', Items.wheat, 'E', Items.egg, 'M', Items.milk_bucket, 'P', ModItems.man_core }); diff --git a/src/main/java/com/hbm/crafting/ToolRecipes.java b/src/main/java/com/hbm/crafting/ToolRecipes.java index 26a04b5fe..39c00cde5 100644 --- a/src/main/java/com/hbm/crafting/ToolRecipes.java +++ b/src/main/java/com/hbm/crafting/ToolRecipes.java @@ -112,10 +112,11 @@ public class ToolRecipes { CraftingManager.addRecipeAuto(new ItemStack(ModItems.ullapool_caber, 1), new Object[] { "ITI", " S ", " S ", 'I', IRON.plate(), 'T', Blocks.tnt, 'S', KEY_STICK }); //Utility + CraftingManager.addRecipeAuto(new ItemStack(ModItems.rangefinder, 1), new Object[] { "GRC", " S", 'G', KEY_ANYPANE, 'R', REDSTONE.dust(), 'C', DictFrame.fromOne(ModItems.circuit, EnumCircuitType.BASIC), 'S' ,STEEL.plate() }); CraftingManager.addRecipeAuto(new ItemStack(ModItems.designator, 1), new Object[] { " A", "#B#", "#B#", '#', IRON.plate(), 'A', STEEL.plate(), 'B', DictFrame.fromOne(ModItems.circuit, EnumCircuitType.BASIC) }); - CraftingManager.addRecipeAuto(new ItemStack(ModItems.designator_range, 1), new Object[] { "RRD", "PIC", " P", 'P', STEEL.plate(), 'R', Items.redstone, 'C', DictFrame.fromOne(ModItems.circuit, EnumCircuitType.ADVANCED), 'D', ModItems.designator, 'I', STEEL.ingot() }); + CraftingManager.addShapelessAuto(new ItemStack(ModItems.designator_range, 1), new Object[] { ModItems.rangefinder, ModItems.designator, ANY_PLASTIC.ingot() }); CraftingManager.addRecipeAuto(new ItemStack(ModItems.designator_manual, 1), new Object[] { " A", "#C#", "#B#", '#', ANY_PLASTIC.ingot(), 'A', PB.plate(), 'B', DictFrame.fromOne(ModItems.circuit, EnumCircuitType.ADVANCED), 'C', ModItems.designator }); - CraftingManager.addRecipeAuto(new ItemStack(ModItems.designator_arty_range, 1), new Object[] { "M", "C", "P", 'M', ModItems.magnetron, 'C', DictFrame.fromOne(ModItems.circuit, EnumCircuitType.ADVANCED), 'P', ANY_PLASTIC.ingot() }); + CraftingManager.addShapelessAuto(new ItemStack(ModItems.designator_arty_range, 1), new Object[] { ModItems.rangefinder, DictFrame.fromOne(ModItems.circuit, EnumCircuitType.ADVANCED), ANY_PLASTIC.ingot() }); CraftingManager.addRecipeAuto(new ItemStack(ModItems.linker, 1), new Object[] { "I I", "ICI", "GGG", 'I', IRON.plate(), 'G', GOLD.plate(), 'C', DictFrame.fromOne(ModItems.circuit, EnumCircuitType.ADVANCED) }); CraftingManager.addRecipeAuto(new ItemStack(ModItems.oil_detector, 1), new Object[] { "W I", "WCI", "PPP", 'W', GOLD.wireFine(), 'I', CU.ingot(), 'C', DictFrame.fromOne(ModItems.circuit, EnumCircuitType.ANALOG), 'P', STEEL.plate528() }); CraftingManager.addRecipeAuto(new ItemStack(ModItems.turret_chip, 1), new Object[] { "WWW", "CPC", "WWW", 'W', GOLD.wireFine(), 'P', ANY_PLASTIC.ingot(), 'C', DictFrame.fromOne(ModItems.circuit, EnumCircuitType.ADVANCED), }); diff --git a/src/main/java/com/hbm/entity/logic/EntityNukeExplosionMK5.java b/src/main/java/com/hbm/entity/logic/EntityNukeExplosionMK5.java index dac30b1db..06480aa21 100644 --- a/src/main/java/com/hbm/entity/logic/EntityNukeExplosionMK5.java +++ b/src/main/java/com/hbm/entity/logic/EntityNukeExplosionMK5.java @@ -10,7 +10,6 @@ import com.hbm.config.GeneralConfig; import com.hbm.entity.effect.EntityFalloutRain; import com.hbm.explosion.ExplosionNukeGeneric; import com.hbm.explosion.ExplosionNukeRayBatched; -import com.hbm.explosion.ExplosionNukeRayParallelized; import com.hbm.main.MainRegistry; import com.hbm.util.ContaminationUtil; import com.hbm.util.ContaminationUtil.ContaminationType; @@ -70,13 +69,11 @@ public class EntityNukeExplosionMK5 extends EntityExplosionChunkloading { if(explosion == null) { explosionStart = System.currentTimeMillis(); - if (BombConfig.explosionAlgorithm == 1 || BombConfig.explosionAlgorithm == 2) { - explosion = new ExplosionNukeRayParallelized(worldObj, posX, posY, posZ, - strength, speed, length); - } else { - explosion = new ExplosionNukeRayBatched(worldObj, (int) posX, (int) posY, (int) posZ, - strength, speed, length); - } + //if(BombConfig.explosionAlgorithm == 1 || BombConfig.explosionAlgorithm == 2) { + // explosion = new ExplosionNukeRayParallelized(worldObj, posX, posY, posZ, strength, speed, length); + //} else { + explosion = new ExplosionNukeRayBatched(worldObj, (int) posX, (int) posY, (int) posZ, strength, speed, length); + //} } if(!explosion.isComplete()) { diff --git a/src/main/java/com/hbm/explosion/ExplosionFleija.java b/src/main/java/com/hbm/explosion/ExplosionFleija.java index 5a478fe14..8c06d708a 100644 --- a/src/main/java/com/hbm/explosion/ExplosionFleija.java +++ b/src/main/java/com/hbm/explosion/ExplosionFleija.java @@ -6,8 +6,8 @@ import net.minecraft.init.Blocks; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.World; -public class ExplosionFleija -{ +public class ExplosionFleija { + public int posX; public int posY; public int posZ; @@ -23,7 +23,7 @@ public class ExplosionFleija private int element; public float explosionCoefficient = 1.0F; public float explosionCoefficient2 = 1.0F; - + public void saveToNbt(NBTTagCompound nbt, String name) { nbt.setInteger(name + "posX", posX); nbt.setInteger(name + "posY", posY); @@ -40,7 +40,7 @@ public class ExplosionFleija nbt.setFloat(name + "explosionCoefficient", explosionCoefficient); nbt.setFloat(name + "explosionCoefficient2", explosionCoefficient2); } - + public void readFromNbt(NBTTagCompound nbt, String name) { posX = nbt.getInteger(name + "posX"); posY = nbt.getInteger(name + "posY"); @@ -57,29 +57,28 @@ public class ExplosionFleija explosionCoefficient = nbt.getFloat(name + "explosionCoefficient"); explosionCoefficient2 = nbt.getFloat(name + "explosionCoefficient2"); } - - public ExplosionFleija(int x, int y, int z, World world, int rad, float coefficient, float coefficient2) - { + + public ExplosionFleija(int x, int y, int z, World world, int rad, float coefficient, float coefficient2) { this.posX = x; this.posY = y; this.posZ = z; - + this.worldObj = world; - + this.radius = rad; this.radius2 = this.radius * this.radius; this.explosionCoefficient = coefficient; this.explosionCoefficient2 = coefficient2; - + this.nlimit = this.radius2 * 4; } - - public boolean update() - { + + public boolean update() { breakColumn(this.lastposX, this.lastposZ); this.shell = (int) Math.floor((Math.sqrt(n) + 1) / 2); int shell2 = this.shell * 2; + if(shell2 == 0) return true; // end explosion if the shell size is 0 to prevent division by zero crash this.leg = (int) Math.floor((this.n - (shell2 - 1) * (shell2 - 1)) / shell2); this.element = (this.n - (shell2 - 1) * (shell2 - 1)) - shell2 * this.leg - this.shell + 1; this.lastposX = this.leg == 0 ? this.shell : this.leg == 1 ? -this.element : this.leg == 2 ? -this.shell : this.element; @@ -88,15 +87,13 @@ public class ExplosionFleija return this.n > this.nlimit; } - private void breakColumn(int x, int z) - { + private void breakColumn(int x, int z) { int dist = this.radius2 - (x * x + z * z); - if (dist > 0) - { + if(dist > 0) { dist = (int) Math.sqrt(dist); - for (int y = (int)(dist / this.explosionCoefficient2); y > -dist / this.explosionCoefficient; y--) - { - if(this.posY + y > 0 && !(this.worldObj.getBlock(this.posX+x, this.posY+y, this.posZ+z) instanceof DecoBlockAlt))this.worldObj.setBlock(this.posX+x, this.posY+y, this.posZ+z, Blocks.air); + for(int y = (int) (dist / this.explosionCoefficient2); y > -dist / this.explosionCoefficient; y--) { + if(this.posY + y > 0 && !(this.worldObj.getBlock(this.posX + x, this.posY + y, this.posZ + z) instanceof DecoBlockAlt)) + this.worldObj.setBlock(this.posX + x, this.posY + y, this.posZ + z, Blocks.air); } } } diff --git a/src/main/java/com/hbm/handler/HTTPHandler.java b/src/main/java/com/hbm/handler/HTTPHandler.java index 4efc054f4..3af10a74b 100644 --- a/src/main/java/com/hbm/handler/HTTPHandler.java +++ b/src/main/java/com/hbm/handler/HTTPHandler.java @@ -13,6 +13,7 @@ import com.hbm.main.MainRegistry; public class HTTPHandler { public static List capsule = new ArrayList(); + public static List tipOfTheDay = new ArrayList(); public static boolean newVersion = false; public static String versionNumber = ""; @@ -25,6 +26,7 @@ public class HTTPHandler { try { loadVersion(); loadSoyuz(); + loadTips(); } catch(IOException e) { MainRegistry.logger.warn("Version checker failed!"); } @@ -69,12 +71,17 @@ public class HTTPHandler { BufferedReader in = new BufferedReader(new InputStreamReader(github.openStream())); String line; - - while((line = in.readLine()) != null) { - capsule.add(line); - } - + while((line = in.readLine()) != null) capsule.add(line); in.close(); } + private static void loadTips() throws IOException { + + URL github = new URL("https://gist.githubusercontent.com/HbmMods/a03c66ba160184e12f43de826b30c096/raw/tip_of_the_day"); + BufferedReader in = new BufferedReader(new InputStreamReader(github.openStream())); + + String line; + while((line = in.readLine()) != null) tipOfTheDay.add(line); + in.close(); + } } diff --git a/src/main/java/com/hbm/inventory/gui/LoadingScreenRendererNT.java b/src/main/java/com/hbm/inventory/gui/LoadingScreenRendererNT.java new file mode 100644 index 000000000..d9dc5e676 --- /dev/null +++ b/src/main/java/com/hbm/inventory/gui/LoadingScreenRendererNT.java @@ -0,0 +1,189 @@ +package com.hbm.inventory.gui; + +import java.util.Random; + +import org.lwjgl.opengl.GL11; + +import com.hbm.handler.HTTPHandler; + +import cpw.mods.fml.client.FMLClientHandler; +import net.minecraft.client.LoadingScreenRenderer; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.Gui; +import net.minecraft.client.gui.ScaledResolution; +import net.minecraft.client.renderer.OpenGlHelper; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.client.shader.Framebuffer; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.MinecraftError; + +public class LoadingScreenRendererNT extends LoadingScreenRenderer { + + private String message = ""; + private Minecraft mc; + private String currentlyDisplayedText = ""; + private long time = Minecraft.getSystemTime(); + private boolean doesProgress; + private ScaledResolution resolution; + private Framebuffer frameBuffer; + public String tipOfTheDay = "Tip of the day: " + chooseTip(); + + public LoadingScreenRendererNT(Minecraft mc) { + super(mc); + this.mc = mc; + this.resolution = new ScaledResolution(mc, mc.displayWidth, mc.displayHeight); + this.frameBuffer = new Framebuffer(mc.displayWidth, mc.displayHeight, false); + this.frameBuffer.setFramebufferFilter(9728); + } + + private String chooseTip() { + if(HTTPHandler.tipOfTheDay.isEmpty()) return "null"; + return HTTPHandler.tipOfTheDay.get(new Random().nextInt(HTTPHandler.tipOfTheDay.size())); + } + + @Override + public void resetProgressAndMessage(String message) { + this.doesProgress = false; + this.func_73722_d(message); + } + + @Override + public void displayProgressMessage(String message) { + this.doesProgress = true; + this.func_73722_d(message); + } + + @Override + public void func_73722_d(String message) { + this.currentlyDisplayedText = message; + + if(!this.mc.running) { + if(!this.doesProgress) { + throw new MinecraftError(); + } + } else { + GL11.glClear(GL11.GL_DEPTH_BUFFER_BIT); + GL11.glMatrixMode(GL11.GL_PROJECTION); + GL11.glLoadIdentity(); + + if(OpenGlHelper.isFramebufferEnabled()) { + int scale = this.resolution.getScaleFactor(); + GL11.glOrtho(0.0D, (this.resolution.getScaledWidth() * scale), (this.resolution.getScaledHeight() * scale), 0.0D, 100.0D, 300.0D); + } else { + ScaledResolution scaledresolution = new ScaledResolution(this.mc, this.mc.displayWidth, this.mc.displayHeight); + GL11.glOrtho(0.0D, scaledresolution.getScaledWidth_double(), scaledresolution.getScaledHeight_double(), 0.0D, 100.0D, 300.0D); + } + + GL11.glMatrixMode(GL11.GL_MODELVIEW); + GL11.glLoadIdentity(); + GL11.glTranslatef(0.0F, 0.0F, -200.0F); + } + } + + @Override + public void resetProgresAndWorkingMessage(String message) { + if(!this.mc.running) { + if(!this.doesProgress) { + throw new MinecraftError(); + } + } else { + this.time = 0L; + this.message = message; + this.setLoadingProgress(-1); + this.time = 0L; + } + } + + @Override + public void setLoadingProgress(int p_73718_1_) { + if(!this.mc.running) { + if(!this.doesProgress) { + throw new MinecraftError(); + } + } else { + long time = Minecraft.getSystemTime(); + + if(time - this.time >= 100L) { + this.time = time; + ScaledResolution scaledresolution = new ScaledResolution(this.mc, this.mc.displayWidth, this.mc.displayHeight); + int scaleFactor = scaledresolution.getScaleFactor(); + int width = scaledresolution.getScaledWidth(); + int height = scaledresolution.getScaledHeight(); + + if(OpenGlHelper.isFramebufferEnabled()) { + this.frameBuffer.framebufferClear(); + } else { + GL11.glClear(GL11.GL_DEPTH_BUFFER_BIT); + } + + this.frameBuffer.bindFramebuffer(false); + GL11.glMatrixMode(GL11.GL_PROJECTION); + GL11.glLoadIdentity(); + GL11.glOrtho(0.0D, scaledresolution.getScaledWidth_double(), scaledresolution.getScaledHeight_double(), 0.0D, 100.0D, 300.0D); + GL11.glMatrixMode(GL11.GL_MODELVIEW); + GL11.glLoadIdentity(); + GL11.glTranslatef(0.0F, 0.0F, -200.0F); + + if(!OpenGlHelper.isFramebufferEnabled()) { + GL11.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT); + } + + if(!FMLClientHandler.instance().handleLoadingScreen(scaledresolution)) { + Tessellator tessellator = Tessellator.instance; + this.mc.getTextureManager().bindTexture(Gui.optionsBackground); + float f = 32.0F; + tessellator.startDrawingQuads(); + tessellator.setColorOpaque_I(4210752); + tessellator.addVertexWithUV(0.0D, height, 0.0D, 0.0D, height / f); + tessellator.addVertexWithUV(width, height, 0.0D, width / f, height / f); + tessellator.addVertexWithUV(width, 0.0D, 0.0D, width / f, 0.0D); + tessellator.addVertexWithUV(0.0D, 0.0D, 0.0D, 0.0D, 0.0D); + tessellator.draw(); + + if(p_73718_1_ >= 0) { + byte b0 = 100; + byte b1 = 2; + int j1 = width / 2 - b0 / 2; + int k1 = height / 2 + 16; + GL11.glDisable(GL11.GL_TEXTURE_2D); + tessellator.startDrawingQuads(); + tessellator.setColorOpaque_I(8421504); + tessellator.addVertex(j1, k1, 0.0D); + tessellator.addVertex(j1, k1 + b1, 0.0D); + tessellator.addVertex(j1 + b0, k1 + b1, 0.0D); + tessellator.addVertex(j1 + b0, k1, 0.0D); + tessellator.setColorOpaque_I(8454016); + tessellator.addVertex(j1, k1, 0.0D); + tessellator.addVertex(j1, (k1 + b1), 0.0D); + tessellator.addVertex(j1 + p_73718_1_, k1 + b1, 0.0D); + tessellator.addVertex(j1 + p_73718_1_, k1, 0.0D); + tessellator.draw(); + GL11.glEnable(GL11.GL_TEXTURE_2D); + } + + GL11.glEnable(GL11.GL_BLEND); + OpenGlHelper.glBlendFunc(770, 771, 1, 0); + this.mc.fontRenderer.drawStringWithShadow(this.currentlyDisplayedText, (width - this.mc.fontRenderer.getStringWidth(this.currentlyDisplayedText)) / 2, height / 2 - 4 - 16, 16777215); + this.mc.fontRenderer.drawStringWithShadow(this.message, (width - this.mc.fontRenderer.getStringWidth(this.message)) / 2, height / 2 - 4 + 8, 16777215); + + String[] frags = this.tipOfTheDay.split("$"); + for(int i = 0; i < frags.length; i++) { + String frag = frags[i]; + this.mc.fontRenderer.drawStringWithShadow(EnumChatFormatting.YELLOW + frag, (width - this.mc.fontRenderer.getStringWidth(frag)) / 2, height / 2 - 4 - 60 + i * 10, 16777215); + } + } + this.frameBuffer.unbindFramebuffer(); + + if(OpenGlHelper.isFramebufferEnabled()) { + this.frameBuffer.framebufferRender(width * scaleFactor, height * scaleFactor); + } + + this.mc.func_147120_f(); + + try { Thread.yield(); } catch(Exception exception) { } + } + } + } + + @Override public void func_146586_a() { } +} diff --git a/src/main/java/com/hbm/inventory/recipes/PedestalRecipes.java b/src/main/java/com/hbm/inventory/recipes/PedestalRecipes.java index 8554afafc..76d22d7c8 100644 --- a/src/main/java/com/hbm/inventory/recipes/PedestalRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/PedestalRecipes.java @@ -62,9 +62,9 @@ public class PedestalRecipes extends SerializableRecipe { .extra(PedestalExtraCondition.SUN)); register(new PedestalRecipe(new ItemStack(ModItems.gun_autoshotgun_sexy), - new ComparableStack(ModItems.bolt_spike, 16), new OreDictStack(STAR.ingot(), 4), new ComparableStack(ModItems.bolt_spike, 16), + new ComparableStack(ModItems.bolt_spike, 16), new ComparableStack(ModItems.wild_p), new ComparableStack(ModItems.bolt_spike, 16), new ComparableStack(ModItems.card_qos), new ComparableStack(ModItems.gun_autoshotgun), new ComparableStack(ModItems.card_aos), - new ComparableStack(ModItems.bolt_spike, 16), new OreDictStack(STAR.ingot(), 4), new ComparableStack(ModItems.bolt_spike, 16))); + new ComparableStack(ModItems.bolt_spike, 16), new OreDictStack(STAR.ingot(), 16), new ComparableStack(ModItems.bolt_spike, 16))); register(new PedestalRecipe(new ItemStack(ModItems.gun_minigun_lacunae), null, new ComparableStack(ModItems.powder_magic, 4), null, diff --git a/src/main/java/com/hbm/items/ItemEnums.java b/src/main/java/com/hbm/items/ItemEnums.java index 18878469c..d92c7840b 100644 --- a/src/main/java/com/hbm/items/ItemEnums.java +++ b/src/main/java/com/hbm/items/ItemEnums.java @@ -87,6 +87,6 @@ public class ItemEnums { } public static enum EnumIngotMetal { - INGOT, COUNTER, KEY, BEACON, CASING, CLOCKWORK, BAR, DETECTOR + SCRAP, INGOT, COUNTER, KEY, BEACON, CASING, CLOCKWORK, BAR, DETECTOR } } diff --git a/src/main/java/com/hbm/items/ModItems.java b/src/main/java/com/hbm/items/ModItems.java index d7b7fb410..7387de265 100644 --- a/src/main/java/com/hbm/items/ModItems.java +++ b/src/main/java/com/hbm/items/ModItems.java @@ -1169,6 +1169,7 @@ public class ModItems { public static Item pellet_buckshot; public static Item pellet_charged; + public static Item rangefinder; public static Item designator; public static Item designator_range; public static Item designator_manual; @@ -3553,6 +3554,7 @@ public class ModItems { pellet_buckshot = new Item().setUnlocalizedName("pellet_buckshot").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":pellets_lead"); pellet_charged = new Item().setUnlocalizedName("pellet_charged").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":pellets_charged"); + rangefinder = new ItemRangefinder().setUnlocalizedName("rangefinder").setMaxStackSize(1).setCreativeTab(MainRegistry.missileTab).setTextureName(RefStrings.MODID + ":rangefinder"); designator = new ItemDesingator().setUnlocalizedName("designator").setMaxStackSize(1).setCreativeTab(MainRegistry.missileTab).setTextureName(RefStrings.MODID + ":designator"); designator_range = new ItemDesingatorRange().setUnlocalizedName("designator_range").setFull3D().setMaxStackSize(1).setCreativeTab(MainRegistry.missileTab).setTextureName(RefStrings.MODID + ":designator_range_alt"); designator_manual = new ItemDesingatorManual().setUnlocalizedName("designator_manual").setMaxStackSize(1).setCreativeTab(MainRegistry.missileTab).setTextureName(RefStrings.MODID + ":designator_manual"); @@ -6136,6 +6138,7 @@ public class ModItems { GameRegistry.registerItem(spawn_duck, spawn_duck.getUnlocalizedName()); //Computer Tools + GameRegistry.registerItem(rangefinder, rangefinder.getUnlocalizedName()); GameRegistry.registerItem(designator, designator.getUnlocalizedName()); GameRegistry.registerItem(designator_range, designator_range.getUnlocalizedName()); GameRegistry.registerItem(designator_manual, designator_manual.getUnlocalizedName()); diff --git a/src/main/java/com/hbm/items/tool/ItemRangefinder.java b/src/main/java/com/hbm/items/tool/ItemRangefinder.java new file mode 100644 index 000000000..9c1d5179f --- /dev/null +++ b/src/main/java/com/hbm/items/tool/ItemRangefinder.java @@ -0,0 +1,47 @@ +package com.hbm.items.tool; + +import com.hbm.main.MainRegistry; +import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toclient.PlayerInformPacket; +import com.hbm.util.ChatBuilder; +import com.hbm.util.Vec3NT; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.world.World; + +public class ItemRangefinder extends Item { + + public static final int META_POLARIZED = 1; + + @Override + public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player) { + if(world.isRemote) return stack; + + Vec3NT start = new Vec3NT(player.posX, player.posY + player.eyeHeight, player.posZ); + Vec3NT startOriginal = new Vec3NT(start); // why the fuck + Vec3NT end = new Vec3NT(start).add(new Vec3NT(player.getLookVec()).multiply(300)); + + MovingObjectPosition mop = world.func_147447_a(start, end, false, true, false); + + if(mop != null && mop.typeOfHit == mop.typeOfHit.BLOCK) { + double dist = startOriginal.distanceTo(mop.hitVec); + String msg = ((int)(dist * 10D)) / 10D + "m"; + if(stack.getItemDamage() == META_POLARIZED) msg = EnumChatFormatting.LIGHT_PURPLE + msg + EnumChatFormatting.RESET; + PacketDispatcher.wrapper.sendTo(new PlayerInformPacket(ChatBuilder.start(msg).flush(), MainRegistry.proxy.ID_DETONATOR, 5000), (EntityPlayerMP) player); + } + + return stack; + } + + @Override + public String getItemStackDisplayName(ItemStack stack) { + String name = super.getItemStackDisplayName(stack); + if(stack.getItemDamage() == META_POLARIZED) name = EnumChatFormatting.LIGHT_PURPLE + name + EnumChatFormatting.RESET; + return name; + } +} diff --git a/src/main/java/com/hbm/lib/RefStrings.java b/src/main/java/com/hbm/lib/RefStrings.java index 27fe4f45d..f56883283 100644 --- a/src/main/java/com/hbm/lib/RefStrings.java +++ b/src/main/java/com/hbm/lib/RefStrings.java @@ -3,7 +3,7 @@ package com.hbm.lib; public class RefStrings { public static final String MODID = "hbm"; public static final String NAME = "Hbm's Nuclear Tech Mod"; - public static final String VERSION = "1.0.27 BETA (5357)"; + public static final String VERSION = "1.0.27 BETA (5377)"; //HBM's Beta Naming Convention: //V T (X) //V -> next release version diff --git a/src/main/java/com/hbm/main/CraftingManager.java b/src/main/java/com/hbm/main/CraftingManager.java index 86a280f16..846699693 100644 --- a/src/main/java/com/hbm/main/CraftingManager.java +++ b/src/main/java/com/hbm/main/CraftingManager.java @@ -313,8 +313,7 @@ public class CraftingManager { addRecipeAuto(new ItemStack(ModItems.detonator, 1), new Object[] { "C", "S", 'S', STEEL.plate(), 'C', DictFrame.fromOne(ModItems.circuit, EnumCircuitType.BASIC), }); addShapelessAuto(new ItemStack(ModItems.detonator_multi, 1), new Object[] { ModItems.detonator, DictFrame.fromOne(ModItems.circuit, EnumCircuitType.ADVANCED) }); - addRecipeAuto(new ItemStack(ModItems.detonator_laser, 1), new Object[] { "RRD", "PIC", " P", 'P', STEEL.plate(), 'R', REDSTONE.dust(), 'C', DictFrame.fromOne(ModItems.circuit, EnumCircuitType.ADVANCED), 'D', DIAMOND.gem(), 'I', STEEL.ingot() }); - addRecipeAuto(new ItemStack(ModItems.detonator_laser, 1), new Object[] { "RRD", "PIC", " P", 'P', STEEL.plate(), 'R', REDSTONE.dust(), 'C', DictFrame.fromOne(ModItems.circuit, EnumCircuitType.ADVANCED), 'D', EMERALD.gem(), 'I', STEEL.ingot() }); + addShapelessAuto(new ItemStack(ModItems.detonator_laser, 1), new Object[] { ModItems.rangefinder, DictFrame.fromOne(ModItems.circuit, EnumCircuitType.ADVANCED), RUBBER.ingot(), GOLD.wireDense() }); addShapelessAuto(new ItemStack(ModItems.detonator_deadman, 1), new Object[] { ModItems.detonator, ModItems.defuser, ModItems.ducttape }); addRecipeAuto(new ItemStack(ModItems.detonator_de, 1), new Object[] { "T", "D", "T", 'T', Blocks.tnt, 'D', ModItems.detonator_deadman }); diff --git a/src/main/java/com/hbm/main/ModEventHandlerClient.java b/src/main/java/com/hbm/main/ModEventHandlerClient.java index e9e40dfe0..aea94c19b 100644 --- a/src/main/java/com/hbm/main/ModEventHandlerClient.java +++ b/src/main/java/com/hbm/main/ModEventHandlerClient.java @@ -22,6 +22,7 @@ import com.hbm.inventory.RecipesCommon.ComparableStack; import com.hbm.inventory.gui.GUIArmorTable; import com.hbm.inventory.gui.GUIScreenPreview; import com.hbm.inventory.gui.GUIScreenWikiRender; +import com.hbm.inventory.gui.LoadingScreenRendererNT; import com.hbm.items.ItemCustomLore; import com.hbm.items.ModItems; import com.hbm.items.armor.*; @@ -1032,10 +1033,15 @@ public class ModEventHandlerClient { @SideOnly(Side.CLIENT) @SubscribeEvent(priority = EventPriority.LOWEST) public void onClientTickLast(ClientTickEvent event) { + + Minecraft mc = Minecraft.getMinecraft(); + if(!(mc.loadingScreen instanceof LoadingScreenRendererNT)) { + mc.loadingScreen = new LoadingScreenRendererNT(mc); + } if(event.phase == Phase.START && GeneralConfig.enableSkyboxes) { - World world = Minecraft.getMinecraft().theWorld; + World world = mc.theWorld; if(world == null) return; IRenderHandler sky = world.provider.getSkyRenderer(); @@ -1059,7 +1065,7 @@ public class ModEventHandlerClient { } } - EntityPlayer player = Minecraft.getMinecraft().thePlayer; + EntityPlayer player = mc.thePlayer; long millis = Clock.get_ms(); if(lastStarCheck + 200 < millis) { diff --git a/src/main/java/com/hbm/main/ServerProxy.java b/src/main/java/com/hbm/main/ServerProxy.java index 7ec6eaa23..271a21759 100644 --- a/src/main/java/com/hbm/main/ServerProxy.java +++ b/src/main/java/com/hbm/main/ServerProxy.java @@ -32,8 +32,7 @@ public class ServerProxy { public static final int ID_FLUID_ID = 9; public static final int ID_FAN_MODE = 10; public static final int ID_TOOLABILITY = 11; - public static final int ID_GUN_MODE = 12; - public static final int ID_GAS_HAZARD = 13; + public static final int ID_GAS_HAZARD = 12; public ITranslate getI18n() { return I18N; } diff --git a/src/main/java/com/hbm/util/Vec3NT.java b/src/main/java/com/hbm/util/Vec3NT.java index 0cb8121a7..1e6cb1294 100644 --- a/src/main/java/com/hbm/util/Vec3NT.java +++ b/src/main/java/com/hbm/util/Vec3NT.java @@ -29,6 +29,13 @@ public class Vec3NT extends Vec3 { return this; } + public Vec3NT add(Vec3 vec) { + this.xCoord += vec.xCoord; + this.yCoord += vec.yCoord; + this.zCoord += vec.zCoord; + return this; + } + public Vec3NT multiply(double m) { this.xCoord *= m; this.yCoord *= m; @@ -43,6 +50,13 @@ public class Vec3NT extends Vec3 { return this; } + public double distanceTo(double x, double y, double z) { + double dX = x - this.xCoord; + double dY = y - this.yCoord; + double dZ = z - this.zCoord; + return Math.sqrt(dX * dX + dY * dY + dZ * dZ); + } + @Override public Vec3NT setComponents(double x, double y, double z) { this.xCoord = x; diff --git a/src/main/resources/META-INF/HBM_at.cfg b/src/main/resources/META-INF/HBM_at.cfg index 81514dff3..859de4618 100644 --- a/src/main/resources/META-INF/HBM_at.cfg +++ b/src/main/resources/META-INF/HBM_at.cfg @@ -55,3 +55,5 @@ public net.minecraft.client.gui.GuiIngame field_92016_l # hi # Block public net.minecraft.block.Block func_149642_a(Lnet/minecraft/world/World;IIILnet/minecraft/item/ItemStack;)V # dropBlockAsItem +# Minecraft +public net.minecraft.client.Minecraft field_71425_J # running diff --git a/src/main/resources/assets/hbm/lang/de_DE.lang b/src/main/resources/assets/hbm/lang/de_DE.lang index 33050befc..c76f24002 100644 --- a/src/main/resources/assets/hbm/lang/de_DE.lang +++ b/src/main/resources/assets/hbm/lang/de_DE.lang @@ -3039,6 +3039,7 @@ item.radx.name=Rad-X item.rag.name=Stoff item.rag_damp.name=Nasser Stoff item.rag_piss.name=Pisslappen +item.rangefinder.name=Entfernungsmessgerät item.rbmk_fuel_balefire.name=Balefire-RBMK-Kernbrennstoff item.rbmk_fuel_balefire_gold.name=Flammgold-RBMK-Kernbrennstoff item.rbmk_fuel_drx.name=§cDigamma-RBMK-Kernbrennstoff diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index 72c0ee93b..d432682b1 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -3992,6 +3992,7 @@ item.radx.desc=Increases radiation resistance by 0.2 (37%%) for 3 minutes item.rag.name=Cloth item.rag_damp.name=Damp Cloth item.rag_piss.name=Piss-Soaked Rag +item.rangefinder.name=Rangefinder item.rbmk_fuel_balefire.name=Balefire RBMK Fuel Rod item.rbmk_fuel_balefire_gold.name=Flashgold RBMK Fuel Rod item.rbmk_fuel_drx.name=§cDigamma RBMK Fuel Rod§r diff --git a/src/main/resources/assets/hbm/textures/items/ingot_metal.scrap.png b/src/main/resources/assets/hbm/textures/items/ingot_metal.scrap.png new file mode 100644 index 0000000000000000000000000000000000000000..a0074ffc817769a67e18fe737956febd3af9d3f9 GIT binary patch literal 627 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 literal 6720 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 UQxkN@{1O7FC}}>gQM3sA5Bd7_$p8QV diff --git a/src/main/resources/assets/hbm/textures/items/rangefinder.png b/src/main/resources/assets/hbm/textures/items/rangefinder.png new file mode 100644 index 0000000000000000000000000000000000000000..d7539ee67523e75a20db5bffafd9f8fb9002f548 GIT binary patch literal 280 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf=Y>Cgq|0r<(8=*Zh8+IasxnH