From b508f2f534efc4a58af9403c6f1e805f7afe049b Mon Sep 17 00:00:00 2001 From: Boblet Date: Tue, 6 May 2025 16:42:11 +0200 Subject: [PATCH] trench warfare special --- changelog | 10 ++ src/main/java/com/hbm/blocks/ModBlocks.java | 8 + .../com/hbm/blocks/generic/BlockBarrier.java | 159 ++++++++++++++++++ .../com/hbm/blocks/generic/BlockSandbags.java | 84 +++++++++ .../hbm/blocks/generic/DungeonSpawner.java | 32 ++-- .../weapon/sedna/factory/XFactory22lr.java | 2 +- src/main/java/com/hbm/main/ClientProxy.java | 3 + .../java/com/hbm/main/CraftingManager.java | 2 + .../java/com/hbm/main/StructureManager.java | 2 + .../com/hbm/render/block/ISBRHUniversal.java | 13 ++ .../render/block/RenderISBRHUniversal.java | 29 ++++ .../com/hbm/render/util/RenderBlocksNT.java | 31 ++++ .../com/hbm/world/gen/NTMWorldGenerator.java | 9 +- .../hbm/world/generator/CellularDungeon.java | 1 + .../generator/CellularDungeonFactory.java | 1 + .../world/generator/CellularDungeonRoom.java | 1 + .../hbm/world/generator/JungleDungeon.java | 1 + .../hbm/world/generator/TimedGenerator.java | 1 + src/main/resources/assets/hbm/lang/de_DE.lang | 2 + src/main/resources/assets/hbm/lang/en_US.lang | 2 + .../assets/hbm/structures/spire-air.nbt | Bin 16529 -> 0 bytes .../resources/assets/hbm/structures/spire.nbt | Bin 2227 -> 16529 bytes .../assets/hbm/textures/blocks/sandbags.png | Bin 0 -> 423 bytes .../hbm/textures/blocks/wood_barrier.png | Bin 0 -> 513 bytes 24 files changed, 378 insertions(+), 15 deletions(-) create mode 100644 src/main/java/com/hbm/blocks/generic/BlockBarrier.java create mode 100644 src/main/java/com/hbm/blocks/generic/BlockSandbags.java create mode 100644 src/main/java/com/hbm/render/block/ISBRHUniversal.java create mode 100644 src/main/java/com/hbm/render/block/RenderISBRHUniversal.java delete mode 100644 src/main/resources/assets/hbm/structures/spire-air.nbt create mode 100644 src/main/resources/assets/hbm/textures/blocks/sandbags.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/wood_barrier.png diff --git a/changelog b/changelog index 6e95879c4..6c02bce7b 100644 --- a/changelog +++ b/changelog @@ -1,7 +1,17 @@ +## Added +* Sandbags + * Connect to other sandbags or solid blocks + * Pretts +* Wooden barrier + * Pretty + * Automatically walls off connected solid blocks in addition to the direction it was placed in + ## Changed * Increased bayonet damage from 5 to 7.5 hearts * Two numeric redstone over radio signals sent over the same channel will now be added together instead of one signal replacing the other * This means that reading the fill state of multiple batteries over the same channel should result the combined fill state of all batteries +* Halved base spread of the .22 SMG +* Certain secret guns now have a proper way of being obtained ## Fixed * Fixed RoR controller having the wrong recipe \ No newline at end of file diff --git a/src/main/java/com/hbm/blocks/ModBlocks.java b/src/main/java/com/hbm/blocks/ModBlocks.java index 57199830c..ae42a0c1e 100644 --- a/src/main/java/com/hbm/blocks/ModBlocks.java +++ b/src/main/java/com/hbm/blocks/ModBlocks.java @@ -279,6 +279,9 @@ public class ModBlocks { public static Block asphalt; public static Block asphalt_light; + public static Block sandbags; + public static Block wood_barrier; + public static Block reinforced_brick; public static Block reinforced_ducrete; public static Block reinforced_glass; @@ -1476,6 +1479,9 @@ public class ModBlocks { gravel_diamond = new BlockFalling(Material.sand).setBlockName("gravel_diamond").setCreativeTab(MainRegistry.blockTab).setStepSound(Block.soundTypeGravel).setHardness(0.6F).setBlockTextureName(RefStrings.MODID + ":gravel_diamond"); asphalt = new BlockSpeedy(Material.rock, 1.5).setBlockName("asphalt").setCreativeTab(MainRegistry.blockTab).setHardness(15.0F).setResistance(120.0F).setBlockTextureName(RefStrings.MODID + ":asphalt"); asphalt_light = new BlockSpeedy(Material.rock, 1.5).setBlockName("asphalt_light").setCreativeTab(MainRegistry.blockTab).setLightLevel(1F).setHardness(15.0F).setResistance(120.0F).setBlockTextureName(RefStrings.MODID + ":asphalt_light"); + + sandbags = new BlockSandbags(Material.ground).setBlockName("sandbags").setCreativeTab(MainRegistry.blockTab).setHardness(5.0F).setResistance(30.0F).setBlockTextureName(RefStrings.MODID + ":sandbags"); + wood_barrier = new BlockBarrier(Material.wood).setStepSound(Block.soundTypeWood).setBlockName("wood_barrier").setCreativeTab(MainRegistry.blockTab).setHardness(5.0F).setResistance(30.0F).setBlockTextureName(RefStrings.MODID + ":wood_barrier"); reinforced_brick = new BlockGeneric(Material.rock).setBlockName("reinforced_brick").setCreativeTab(MainRegistry.blockTab).setHardness(15.0F).setResistance(300.0F).setBlockTextureName(RefStrings.MODID + ":reinforced_brick"); reinforced_glass = new BlockNTMGlassCT(0, RefStrings.MODID + ":reinforced_glass", Material.rock).setBlockName("reinforced_glass").setCreativeTab(MainRegistry.blockTab).setLightOpacity(0).setHardness(2.0F).setResistance(25.0F); @@ -2654,6 +2660,8 @@ public class ModBlocks { GameRegistry.registerBlock(floodlight_beam, floodlight_beam.getUnlocalizedName()); //Reinforced Blocks + register(sandbags); + register(wood_barrier); GameRegistry.registerBlock(asphalt, ItemBlockBlastInfo.class, asphalt.getUnlocalizedName()); GameRegistry.registerBlock(asphalt_light, ItemBlockBlastInfo.class, asphalt_light.getUnlocalizedName()); GameRegistry.registerBlock(reinforced_brick, ItemBlockBlastInfo.class, reinforced_brick.getUnlocalizedName()); diff --git a/src/main/java/com/hbm/blocks/generic/BlockBarrier.java b/src/main/java/com/hbm/blocks/generic/BlockBarrier.java new file mode 100644 index 000000000..b7020d3d5 --- /dev/null +++ b/src/main/java/com/hbm/blocks/generic/BlockBarrier.java @@ -0,0 +1,159 @@ +package com.hbm.blocks.generic; + +import java.util.ArrayList; +import java.util.List; + +import org.lwjgl.opengl.GL11; + +import com.hbm.lib.Library; +import com.hbm.render.block.ISBRHUniversal; +import com.hbm.render.util.RenderBlocksNT; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.RenderBlocks; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.item.ItemStack; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.MathHelper; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; + +public class BlockBarrier extends Block implements ISBRHUniversal { + + public BlockBarrier(Material mat) { + super(mat); + } + + @Override public int getRenderType() { return renderID; } + @Override public boolean isOpaqueCube() { return false; } + @Override public boolean renderAsNormalBlock() { return false; } + + @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); + } + + @Override + public void setBlockBoundsBasedOnState(IBlockAccess world, int x, int y, int z) { + + int meta = world.getBlockMetadata(x, y, z); + setBlockBounds(0, 0, 0, 1, 1, 1); + + /*Block nx = world.getBlock(x - 1, y, z); + Block px = world.getBlock(x + 1, y, z); + Block nz = world.getBlock(x, y, z - 1); + Block pz = world.getBlock(x, y, z + 1); + + int count = 0; + if(nx.isOpaqueCube() || nx.isNormalCube() || meta == Library.POS_X.ordinal()) count++; + if(nz.isOpaqueCube() || nz.isNormalCube() || meta == Library.POS_Z.ordinal()) count++; + if(px.isOpaqueCube() || px.isNormalCube() || meta == Library.NEG_X.ordinal()) count++; + if(pz.isOpaqueCube() || pz.isNormalCube() || meta == Library.NEG_Z.ordinal()) count++; + + if(count > 1) return;*/ + + if(meta == Library.POS_X.ordinal()) setBlockBounds(0, 0, 0, 0.125F, 1, 1); + if(meta == Library.POS_Z.ordinal()) setBlockBounds(0, 0, 0, 1, 1, 0.125F); + if(meta == Library.NEG_X.ordinal()) setBlockBounds(0.875F, 0, 0, 1, 1, 1); + if(meta == Library.NEG_Z.ordinal()) setBlockBounds(0, 0, 0.875F, 1, 1, 1); + } + + @Override + public void addCollisionBoxesToList(World world, int x, int y, int z, AxisAlignedBB aabb, List list, Entity collider) { + + int meta = world.getBlockMetadata(x, y, z); + List bbs = new ArrayList(); + + Block nx = world.getBlock(x - 1, y, z); + Block px = world.getBlock(x + 1, y, z); + Block nz = world.getBlock(x, y, z - 1); + Block pz = world.getBlock(x, y, z + 1); + + if(nx.isOpaqueCube() || nx.isNormalCube() || meta == Library.POS_X.ordinal()) bbs.add(AxisAlignedBB.getBoundingBox(x, y, z, x + 0.125, y + 1, z + 1)); + if(nz.isOpaqueCube() || nz.isNormalCube() || meta == Library.POS_Z.ordinal()) bbs.add(AxisAlignedBB.getBoundingBox(x, y, z, x + 1, y + 1, z + 0.125)); + if(px.isOpaqueCube() || px.isNormalCube() || meta == Library.NEG_X.ordinal()) bbs.add(AxisAlignedBB.getBoundingBox(x + 0.875, y, z, x + 1, y + 1, z + 1)); + if(pz.isOpaqueCube() || pz.isNormalCube() || meta == Library.NEG_Z.ordinal()) bbs.add(AxisAlignedBB.getBoundingBox(x, y, z + 0.875, x + 1, y + 1, z + 1)); + + for(AxisAlignedBB bb : bbs) { + if(aabb.intersectsWith(bb)) { + list.add(bb); + } + } + } + + @Override + @SideOnly(Side.CLIENT) + public boolean shouldSideBeRendered(IBlockAccess world, int x, int y, int z, int side) { + return true; + } + + @Override + public void renderInventoryBlock(Block block, int meta, int modelId, Object renderBlocks) { + + GL11.glPushMatrix(); + RenderBlocks renderer = (RenderBlocks) renderBlocks; + GL11.glRotatef(90.0F, 0.0F, 1.0F, 0.0F); + GL11.glTranslatef(-0.5F, -0.5F, -0.5F); + + renderer.setRenderBounds(0.4375, 0D, 0.4375D, 0.5625D, 1D, 0.5625D); RenderBlocksNT.renderStandardInventoryBlock(block, meta, renderer); + renderer.setRenderBounds(0.5D, 0.0625D, 0D, 0.5625D, 0.4725, 1D); RenderBlocksNT.renderStandardInventoryBlock(block, meta, renderer); + renderer.setRenderBounds(0.5D, 0.5625D, 0D, 0.5625D, 0.9375, 1D); RenderBlocksNT.renderStandardInventoryBlock(block, meta, renderer); + GL11.glPopMatrix(); + } + + @Override + public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, Object renderBlocks) { + + RenderBlocksNT renderer = RenderBlocksNT.INSTANCE.setWorld(world); + + Tessellator tessellator = Tessellator.instance; + tessellator.setBrightness(block.getMixedBrightnessForBlock(world, x, y, z)); + tessellator.setColorOpaque_F(1, 1, 1); + + int meta = world.getBlockMetadata(x, y, z); + + Block nx = world.getBlock(x - 1, y, z); + Block px = world.getBlock(x + 1, y, z); + Block nz = world.getBlock(x, y, z - 1); + Block pz = world.getBlock(x, y, z + 1); + + boolean negX = nx.isOpaqueCube() || nx.isNormalCube() || meta == Library.POS_X.ordinal(); + boolean negZ = nz.isOpaqueCube() || nz.isNormalCube() || meta == Library.POS_Z.ordinal(); + boolean posX = px.isOpaqueCube() || px.isNormalCube() || meta == Library.NEG_X.ordinal(); + boolean posZ = pz.isOpaqueCube() || pz.isNormalCube() || meta == Library.NEG_Z.ordinal(); + + if(negX) { + renderer.setRenderBounds(0D, 0D, 0.4375D, 0.125D, 1D, 0.5625D); renderer.renderStandardBlock(block, x, y, z); + renderer.setRenderBounds(0D, 0.0625D, negZ ? 0.125D : 0D, 0.0625D, 0.4375D, posZ ? 0.875D : 1D); renderer.renderStandardBlock(block, x, y, z); + renderer.setRenderBounds(0D, 0.5625D, negZ ? 0.125D : 0D, 0.0625D, 0.9375D, posZ ? 0.875D : 1D); renderer.renderStandardBlock(block, x, y, z); + } + if(negZ) { + renderer.setRenderBounds(0.4375D, 0D, 0D, 0.5625D, 1D, 0.125D); renderer.renderStandardBlock(block, x, y, z); + renderer.setRenderBounds(negX ? 0.125D : 0D, 0.0625D, 0D, posX ? 0.875D : 1D, 0.4375D, 0.0625D); renderer.renderStandardBlock(block, x, y, z); + renderer.setRenderBounds(negX ? 0.125D : 0D, 0.5625D, 0D, posX ? 0.875D : 1D, 0.9375D, 0.0625D); renderer.renderStandardBlock(block, x, y, z); + } + if(posX) { + renderer.setRenderBounds(0.875D, 0D, 0.4375D, 1D, 1D, 0.5625D); renderer.renderStandardBlock(block, x, y, z); + renderer.setRenderBounds(0.9375D, 0.0625D, negZ ? 0.125D : 0D, 1D, 0.4375D, posZ ? 0.875D : 1D); renderer.renderStandardBlock(block, x, y, z); + renderer.setRenderBounds(0.9375D, 0.5625D, negZ ? 0.125D : 0D, 1D, 0.9375D, posZ ? 0.875D : 1D); renderer.renderStandardBlock(block, x, y, z); + } + if(posZ) { + renderer.setRenderBounds(0.4375D, 0D, 0.875D, 0.5625D, 1D, 1D); renderer.renderStandardBlock(block, x, y, z); + renderer.setRenderBounds(negX ? 0.125D : 0D, 0.0625D, 0.9375D, posX ? 0.875D : 1D, 0.4375D, 1D); renderer.renderStandardBlock(block, x, y, z); + renderer.setRenderBounds(negX ? 0.125D : 0D, 0.5625D, 0.9375D, posX ? 0.875D : 1D, 0.9375D, 1D); renderer.renderStandardBlock(block, x, y, z); + } + + return true; + } +} diff --git a/src/main/java/com/hbm/blocks/generic/BlockSandbags.java b/src/main/java/com/hbm/blocks/generic/BlockSandbags.java new file mode 100644 index 000000000..9a1c70437 --- /dev/null +++ b/src/main/java/com/hbm/blocks/generic/BlockSandbags.java @@ -0,0 +1,84 @@ +package com.hbm.blocks.generic; + +import org.lwjgl.opengl.GL11; + +import com.hbm.render.block.ISBRHUniversal; +import com.hbm.render.util.RenderBlocksNT; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.RenderBlocks; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; + +public class BlockSandbags extends Block implements ISBRHUniversal { + + public BlockSandbags(Material mat) { + super(mat); + } + + @Override public int getRenderType() { return renderID; } + @Override public boolean isOpaqueCube() { return false; } + @Override public boolean renderAsNormalBlock() { return false; } + + @Override + public AxisAlignedBB getCollisionBoundingBoxFromPool(World world, int x, int y, int z) { + setBlockBoundsBasedOnState(world, x, y, z); + return AxisAlignedBB.getBoundingBox(x + this.minX, y + this.minY, z + this.minZ, x + this.maxX, y + this.maxY, z + this.maxZ); + } + + @Override + @SideOnly(Side.CLIENT) + public AxisAlignedBB getSelectedBoundingBoxFromPool(World world, int x, int y, int z) { + setBlockBoundsBasedOnState(world, x, y, z); + return AxisAlignedBB.getBoundingBox(x + this.minX, y + this.minY, z + this.minZ, x + this.maxX, y + this.maxY, z + this.maxZ); + } + + @Override + public void setBlockBoundsBasedOnState(IBlockAccess world, int x, int y, int z) { + + float min = 0.25F; + float max = 0.75F; + + Block nx = world.getBlock(x - 1, y, z); + Block px = world.getBlock(x + 1, y, z); + Block nz = world.getBlock(x, y, z - 1); + Block pz = world.getBlock(x, y, z + 1); + + float minX = (nx.isOpaqueCube() || nx.isNormalCube() || nx == this) ? 0F : min; + float minZ = (nz.isOpaqueCube() || nz.isNormalCube() || nz == this) ? 0F : min; + float maxX = (px.isOpaqueCube() || px.isNormalCube() || px == this) ? 1F : max; + float maxZ = (pz.isOpaqueCube() || pz.isNormalCube() || pz == this) ? 1F : max; + + this.setBlockBounds(minX, 0, minZ, maxX, 1, maxZ); + } + + @Override + public void renderInventoryBlock(Block block, int meta, int modelId, Object renderBlocks) { + + GL11.glPushMatrix(); + RenderBlocks renderer = (RenderBlocks) renderBlocks; + GL11.glRotatef(90.0F, 0.0F, 1.0F, 0.0F); + GL11.glTranslatef(-0.5F, -0.5F, -0.5F); + renderer.setRenderBounds(0.125D, 0D, 0.125D, 0.875D, 1D, 0.875D); + RenderBlocksNT.renderStandardInventoryBlock(block, meta, renderer); + GL11.glPopMatrix(); + } + + @Override + public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, Object renderBlocks) { + + RenderBlocksNT renderer = RenderBlocksNT.INSTANCE.setWorld(world); + renderer.setRenderBoundsFromBlock(block); + Tessellator tessellator = Tessellator.instance; + tessellator.setBrightness(block.getMixedBrightnessForBlock(world, x, y, z)); + tessellator.setColorOpaque_F(1, 1, 1); + renderer.renderStandardBlock(block, x, y, z); + + return true; + } +} diff --git a/src/main/java/com/hbm/blocks/generic/DungeonSpawner.java b/src/main/java/com/hbm/blocks/generic/DungeonSpawner.java index 0cfe54d27..65f4ef5e5 100644 --- a/src/main/java/com/hbm/blocks/generic/DungeonSpawner.java +++ b/src/main/java/com/hbm/blocks/generic/DungeonSpawner.java @@ -3,7 +3,6 @@ package com.hbm.blocks.generic; import java.util.function.Consumer; import java.util.function.Function; -import com.hbm.blocks.ModBlocks; import com.hbm.blocks.generic.BlockSkeletonHolder.TileEntitySkeletonHolder; import com.hbm.entity.mob.EntityUndeadSoldier; import com.hbm.items.ItemEnums.EnumSecretType; @@ -13,10 +12,12 @@ import com.hbm.util.Vec3NT; import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; +import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.AxisAlignedBB; import net.minecraft.world.World; public class DungeonSpawner extends BlockContainer { @@ -34,7 +35,7 @@ public class DungeonSpawner extends BlockContainer { public int phase = 0; public int timer = 0; - public EnumSpawnerType type = EnumSpawnerType.NONE; + public EnumSpawnerType type = EnumSpawnerType.ABERRATOR; @Override public void updateEntity() { @@ -67,7 +68,7 @@ public class DungeonSpawner extends BlockContainer { public static enum EnumSpawnerType { - NONE(CON_TEST, PHASE_TEST); + ABERRATOR(CON_ABERRATOR, PHASE_ABERRATOR); public Function phaseCondition; public Consumer phase; @@ -78,23 +79,23 @@ public class DungeonSpawner extends BlockContainer { } } - public static Function CON_TEST = (tile) -> { + public static Function CON_ABERRATOR = (tile) -> { World world = tile.getWorldObj(); int x = tile.xCoord; int y = tile.yCoord; int z = tile.zCoord; if(tile.phase == 0) { if(world.getTotalWorldTime() % 20 != 0) return false; - //return !world.getEntitiesWithinAABB(EntityPlayer.class, AxisAlignedBB.getBoundingBox(x, y, z, x + 1, y + 1, z + 1).expand(20, 10, 20)).isEmpty(); + return !world.getEntitiesWithinAABB(EntityPlayer.class, AxisAlignedBB.getBoundingBox(x, y, z, x + 1, y - 2, z + 1).expand(20, 10, 20)).isEmpty(); } if(tile.phase < 3) { if(world.getTotalWorldTime() % 20 != 0 || tile.timer < 60) return false; - //return world.getEntitiesWithinAABB(EntityUndeadSoldier.class, AxisAlignedBB.getBoundingBox(x, y, z, x + 1, y + 1, z + 1).expand(50, 20, 50)).isEmpty(); + return world.getEntitiesWithinAABB(EntityUndeadSoldier.class, AxisAlignedBB.getBoundingBox(x, y, z, x - 2, y + 1, z + 1).expand(50, 20, 50)).isEmpty(); } return false; }; - public static Consumer PHASE_TEST = (tile) -> { + public static Consumer PHASE_ABERRATOR = (tile) -> { World world = tile.getWorldObj(); int x = tile.xCoord; int y = tile.yCoord; @@ -104,21 +105,26 @@ public class DungeonSpawner extends BlockContainer { Vec3NT vec = new Vec3NT(10, 0, 0); for(int i = 0; i < 10; i++) { EntityUndeadSoldier mob = new EntityUndeadSoldier(world); - mob.setPositionAndRotation(x + 0.5 + vec.xCoord, y, z + 0.5 + vec.zCoord, i * 36F, 0); + for(int j = 0; j < 7; j++) { + mob.setPositionAndRotation(x + 0.5 + vec.xCoord, y - 5, z + 0.5 + vec.zCoord, i * 36F, 0); + if(mob.getCanSpawnHere()) { + mob.onSpawnWithEgg(null); + world.spawnEntityInWorld(mob); + break; + } + } + vec.rotateAroundYDeg(36D); - mob.onSpawnWithEgg(null); - world.spawnEntityInWorld(mob); } } } if(tile.phase > 2) { - world.setBlock(x, y + 1, z, ModBlocks.skeleton_holder, 2 + world.rand.nextInt(4), 3); - TileEntity te = world.getTileEntity(x, y + 1, z); + TileEntity te = world.getTileEntity(x, y + 18, z); if(te instanceof TileEntitySkeletonHolder) { TileEntitySkeletonHolder skeleton = (TileEntitySkeletonHolder) te; skeleton.item = new ItemStack(ModItems.item_secret, 1, EnumSecretType.ABERRATOR.ordinal()); skeleton.markDirty(); - world.markBlockForUpdate(x, y, z); + world.markBlockForUpdate(x, y + 18, z); } world.setBlock(x, y, z, Blocks.obsidian); } diff --git a/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory22lr.java b/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory22lr.java index 7ebd39553..19c398e60 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory22lr.java +++ b/src/main/java/com/hbm/items/weapon/sedna/factory/XFactory22lr.java @@ -48,7 +48,7 @@ public class XFactory22lr { ModItems.gun_am180 = new ItemGunBaseNT(WeaponQuality.A_SIDE, new GunConfig() .dura(177 * 25).draw(15).inspect(38).crosshair(Crosshair.L_CIRCLE).smoke(LAMBDA_SMOKE) .rec(new Receiver(0) - .dmg(2F).delay(1).dry(10).auto(true).spread(0.02F).reload(66).jam(30).sound("hbm:weapon.fire.greaseGun", 1.0F, 1.0F) + .dmg(2F).delay(1).dry(10).auto(true).spread(0.01F).reload(66).jam(30).sound("hbm:weapon.fire.greaseGun", 1.0F, 1.0F) .mag(new MagazineFullReload(0, 177).addConfigs(p22_sp, p22_fmj, p22_jhp, p22_ap)) .offset(1, -0.0625 * 1.5, -0.1875D) .setupStandardFire().recoil(LAMBDA_RECOIL_AM180)) diff --git a/src/main/java/com/hbm/main/ClientProxy.java b/src/main/java/com/hbm/main/ClientProxy.java index eebed2654..972f3371e 100644 --- a/src/main/java/com/hbm/main/ClientProxy.java +++ b/src/main/java/com/hbm/main/ClientProxy.java @@ -767,6 +767,9 @@ public class ClientProxy extends ServerProxy { @Override public void registerBlockRenderer() { + RenderingRegistry.registerBlockHandler(new RenderISBRHUniversal()); + + /// STOP DOING THIS /// RenderingRegistry.registerBlockHandler(new RenderScaffoldBlock()); RenderingRegistry.registerBlockHandler(new RenderTapeBlock()); RenderingRegistry.registerBlockHandler(new RenderSteelBeam()); diff --git a/src/main/java/com/hbm/main/CraftingManager.java b/src/main/java/com/hbm/main/CraftingManager.java index 8aee31fa4..85f7942f0 100644 --- a/src/main/java/com/hbm/main/CraftingManager.java +++ b/src/main/java/com/hbm/main/CraftingManager.java @@ -441,6 +441,8 @@ public class CraftingManager { addRecipeAuto(new ItemStack(ModBlocks.barbed_wire_wither, 8), new Object[] { "BBB", "BIB", "BBB", 'B', ModBlocks.barbed_wire, 'I', new ItemStack(Items.skull, 1, 1) }); addRecipeAuto(new ItemStack(ModBlocks.barbed_wire_ultradeath, 4), new Object[] { "BCB", "CIC", "BCB", 'B', ModBlocks.barbed_wire, 'C', ModItems.powder_yellowcake, 'I', ModItems.nuclear_waste }); + addShapelessAuto(new ItemStack(ModBlocks.sandbags, 4), new Object[] { ModItems.plate_polymer, KEY_SAND, KEY_SAND, KEY_SAND }); + addRecipeAuto(new ItemStack(Item.getItemFromBlock(ModBlocks.tape_recorder), 4), new Object[] { "TST", "SSS", 'T', W.ingot(), 'S', STEEL.ingot() }); addRecipeAuto(new ItemStack(Item.getItemFromBlock(ModBlocks.steel_poles), 16), new Object[] { "S S", "SSS", "S S", 'S', STEEL.ingot() }); addRecipeAuto(new ItemStack(Item.getItemFromBlock(ModBlocks.pole_top), 1), new Object[] { "T T", "TRT", "BBB", 'T', W.ingot(), 'B', BE.ingot(), 'R', MINGRADE.ingot() }); diff --git a/src/main/java/com/hbm/main/StructureManager.java b/src/main/java/com/hbm/main/StructureManager.java index 8f180b926..5c3f93090 100644 --- a/src/main/java/com/hbm/main/StructureManager.java +++ b/src/main/java/com/hbm/main/StructureManager.java @@ -62,6 +62,8 @@ public class StructureManager { public static final NBTStructure lighthouse = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/lighthouse.nbt")); public static final NBTStructure dish = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/dish.nbt")); + public static final NBTStructure spire = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/spire.nbt")); + // public static final NBTStructure test_rot = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/test-rot.nbt")); // public static final NBTStructure test_jigsaw = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/test-jigsaw.nbt")); // public static final NBTStructure test_jigsaw_core = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/test-jigsaw-core.nbt")); diff --git a/src/main/java/com/hbm/render/block/ISBRHUniversal.java b/src/main/java/com/hbm/render/block/ISBRHUniversal.java new file mode 100644 index 000000000..a401083b3 --- /dev/null +++ b/src/main/java/com/hbm/render/block/ISBRHUniversal.java @@ -0,0 +1,13 @@ +package com.hbm.render.block; + +import cpw.mods.fml.client.registry.RenderingRegistry; +import net.minecraft.block.Block; +import net.minecraft.world.IBlockAccess; + +public interface ISBRHUniversal { + + public static int renderID = RenderingRegistry.getNextAvailableRenderId(); + + public void renderInventoryBlock(Block block, int metadata, int modelId, Object renderBlocks); + public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, Object renderBlocks); +} diff --git a/src/main/java/com/hbm/render/block/RenderISBRHUniversal.java b/src/main/java/com/hbm/render/block/RenderISBRHUniversal.java new file mode 100644 index 000000000..a80aef9bb --- /dev/null +++ b/src/main/java/com/hbm/render/block/RenderISBRHUniversal.java @@ -0,0 +1,29 @@ +package com.hbm.render.block; + +import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler; +import net.minecraft.block.Block; +import net.minecraft.client.renderer.RenderBlocks; +import net.minecraft.world.IBlockAccess; + +public class RenderISBRHUniversal implements ISimpleBlockRenderingHandler { + + @Override + public void renderInventoryBlock(Block block, int metadata, int modelId, RenderBlocks renderer) { + ((ISBRHUniversal) block).renderInventoryBlock(block, metadata, modelId, renderer); + } + + @Override + public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, RenderBlocks renderer) { + return ((ISBRHUniversal) block).renderWorldBlock(world, x, y, z, block, modelId, renderer); + } + + @Override + public boolean shouldRender3DInInventory(int modelId) { + return true; + } + + @Override + public int getRenderId() { + return ISBRHUniversal.renderID; + } +} diff --git a/src/main/java/com/hbm/render/util/RenderBlocksNT.java b/src/main/java/com/hbm/render/util/RenderBlocksNT.java index db0990f07..342453e3b 100644 --- a/src/main/java/com/hbm/render/util/RenderBlocksNT.java +++ b/src/main/java/com/hbm/render/util/RenderBlocksNT.java @@ -25,6 +25,37 @@ public class RenderBlocksNT extends RenderBlocks { return this; } + public static void renderStandardInventoryBlock(Block block, int meta, RenderBlocks renderer) { + + Tessellator tessellator = Tessellator.instance; + tessellator.setColorOpaque_F(1, 1, 1); + + tessellator.startDrawingQuads(); + tessellator.setNormal(0.0F, -1.0F, 0.0F); + renderer.renderFaceYNeg(block, 0.0D, 0.0D, 0.0D, renderer.getBlockIconFromSideAndMetadata(block, 0, meta)); + tessellator.draw(); + tessellator.startDrawingQuads(); + tessellator.setNormal(0.0F, 1.0F, 0.0F); + renderer.renderFaceYPos(block, 0.0D, 0.0D, 0.0D, renderer.getBlockIconFromSideAndMetadata(block, 1, meta)); + tessellator.draw(); + tessellator.startDrawingQuads(); + tessellator.setNormal(0.0F, 0.0F, -1.0F); + renderer.renderFaceZNeg(block, 0.0D, 0.0D, 0.0D, renderer.getBlockIconFromSideAndMetadata(block, 2, meta)); + tessellator.draw(); + tessellator.startDrawingQuads(); + tessellator.setNormal(0.0F, 0.0F, 1.0F); + renderer.renderFaceZPos(block, 0.0D, 0.0D, 0.0D, renderer.getBlockIconFromSideAndMetadata(block, 3, meta)); + tessellator.draw(); + tessellator.startDrawingQuads(); + tessellator.setNormal(-1.0F, 0.0F, 0.0F); + renderer.renderFaceXNeg(block, 0.0D, 0.0D, 0.0D, renderer.getBlockIconFromSideAndMetadata(block, 4, meta)); + tessellator.draw(); + tessellator.startDrawingQuads(); + tessellator.setNormal(1.0F, 0.0F, 0.0F); + renderer.renderFaceXPos(block, 0.0D, 0.0D, 0.0D, renderer.getBlockIconFromSideAndMetadata(block, 5, meta)); + tessellator.draw(); + } + @Override public void renderFaceZNeg(Block block, double x, double y, double z, IIcon icon) { Tessellator tessellator = Tessellator.instance; diff --git a/src/main/java/com/hbm/world/gen/NTMWorldGenerator.java b/src/main/java/com/hbm/world/gen/NTMWorldGenerator.java index e68df2f27..bb1c7b3d3 100644 --- a/src/main/java/com/hbm/world/gen/NTMWorldGenerator.java +++ b/src/main/java/com/hbm/world/gen/NTMWorldGenerator.java @@ -40,6 +40,13 @@ public class NTMWorldGenerator implements IWorldGenerator { final List beachBiomes = Arrays.asList(new BiomeGenBase[] { BiomeGenBase.beach, BiomeGenBase.stoneBeach, BiomeGenBase.coldBeach }); final List lighthouseBiomes = Arrays.asList(new BiomeGenBase[] { BiomeGenBase.ocean, BiomeGenBase.deepOcean, BiomeGenBase.beach, BiomeGenBase.stoneBeach, BiomeGenBase.coldBeach }); + /// SPIRE /// + NBTStructure.registerStructure(0, new SpawnCondition() {{ + canSpawn = biome -> biome.heightVariation <= 0.05F && !invalidBiomes.contains(biome); + structure = new JigsawPiece("spire", StructureManager.spire, -1); + spawnWeight = 2; + }}); + NBTStructure.registerStructure(0, new SpawnCondition() {{ canSpawn = biome -> !invalidBiomes.contains(biome); start = d -> new MapGenNTMFeatures.Start(d.getW(), d.getX(), d.getY(), d.getZ()); @@ -177,7 +184,7 @@ public class NTMWorldGenerator implements IWorldGenerator { add(new JigsawPiece("meteor_dragon_tesla", StructureManager.meteor_dragon_tesla) {{ blockTable = crates; }}, 1); add(new JigsawPiece("meteor_dragon_trap", StructureManager.meteor_dragon_trap) {{ blockTable = crates; }}, 1); add(new JigsawPiece("meteor_dragon_crate_crab", StructureManager.meteor_dragon_crate_crab) {{ blockTable = crates; }}, 1); - fallback = "headback"; + fallback = "headback"; }}); put("fallback", new JigsawPool() {{ add(new JigsawPiece("meteor_fallback", StructureManager.meteor_fallback) {{ blockTable = bricks; }}, 1); diff --git a/src/main/java/com/hbm/world/generator/CellularDungeon.java b/src/main/java/com/hbm/world/generator/CellularDungeon.java index 169b5fb3a..632ba1fe6 100644 --- a/src/main/java/com/hbm/world/generator/CellularDungeon.java +++ b/src/main/java/com/hbm/world/generator/CellularDungeon.java @@ -9,6 +9,7 @@ import com.hbm.inventory.RecipesCommon.MetaBlock; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; +@Deprecated public class CellularDungeon { //a buffer "map" of the rooms being generated before being spawned in diff --git a/src/main/java/com/hbm/world/generator/CellularDungeonFactory.java b/src/main/java/com/hbm/world/generator/CellularDungeonFactory.java index f6cd5f152..cedfd8275 100644 --- a/src/main/java/com/hbm/world/generator/CellularDungeonFactory.java +++ b/src/main/java/com/hbm/world/generator/CellularDungeonFactory.java @@ -2,6 +2,7 @@ package com.hbm.world.generator; import com.hbm.world.generator.room.*; +@Deprecated public class CellularDungeonFactory { public static CellularDungeon jungle; diff --git a/src/main/java/com/hbm/world/generator/CellularDungeonRoom.java b/src/main/java/com/hbm/world/generator/CellularDungeonRoom.java index 9b3e9086c..29edded5a 100644 --- a/src/main/java/com/hbm/world/generator/CellularDungeonRoom.java +++ b/src/main/java/com/hbm/world/generator/CellularDungeonRoom.java @@ -6,6 +6,7 @@ import net.minecraft.init.Blocks; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; +@Deprecated public class CellularDungeonRoom { protected CellularDungeon parent; diff --git a/src/main/java/com/hbm/world/generator/JungleDungeon.java b/src/main/java/com/hbm/world/generator/JungleDungeon.java index 50fc0dfa9..62b86b551 100644 --- a/src/main/java/com/hbm/world/generator/JungleDungeon.java +++ b/src/main/java/com/hbm/world/generator/JungleDungeon.java @@ -11,6 +11,7 @@ import com.hbm.world.generator.TimedGenerator.ITimedJob; import net.minecraft.world.World; +@Deprecated @NotableComments public class JungleDungeon extends CellularDungeon { diff --git a/src/main/java/com/hbm/world/generator/TimedGenerator.java b/src/main/java/com/hbm/world/generator/TimedGenerator.java index 086b3df0e..9501bbc8d 100644 --- a/src/main/java/com/hbm/world/generator/TimedGenerator.java +++ b/src/main/java/com/hbm/world/generator/TimedGenerator.java @@ -7,6 +7,7 @@ import com.hbm.interfaces.Spaghetti; import net.minecraft.world.World; +@Deprecated @Spaghetti("this class should be destroyed") public class TimedGenerator { diff --git a/src/main/resources/assets/hbm/lang/de_DE.lang b/src/main/resources/assets/hbm/lang/de_DE.lang index 2efea3a36..5643c75cb 100644 --- a/src/main/resources/assets/hbm/lang/de_DE.lang +++ b/src/main/resources/assets/hbm/lang/de_DE.lang @@ -4743,6 +4743,7 @@ tile.sand_lead.name=Bleisand tile.sand_polonium.name=Poloniumsand tile.sand_quartz.name=Quarzsand tile.sand_uranium.name=Uransand +tile.sandbags.name=Sandsäcke tile.sat_dock.name=Frachtlandeplattform tile.sat_foeq.name=PEAF - Mk.I FOEQ Dunasonde mit experimenter nuklearer Schubdüse (Dekoblock) tile.sat_laser.name=Orbitaler Todesstrahl (Dekoblock) @@ -4875,6 +4876,7 @@ tile.watz_end.name=Watz-Stabilitätselement tile.watz_end_bolted.name=Watz-Stabilitätselement (Genietet) tile.watz_hatch.name=Watzreaktorzugriffsluke tile.watz_pump.name=Watz-Druckpumpe +tile.wood_barrier.name=Holzbarriere tile.yellow_barrel.name=Radioaktives Fass tile.zirnox_destroyed.name=Zerstörter ZINOX diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index 1d7fd2960..725b7c61a 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -5898,6 +5898,7 @@ tile.sand_lead.name=Lead Sand tile.sand_polonium.name=Polonium Sand tile.sand_quartz.name=Quartz Sand tile.sand_uranium.name=Uranium Sand +tile.sandbags.name=Sandbags tile.sat_dock.name=Cargo Landing Pad tile.sat_foeq.name=PEAF - Mk.I FOEQ Duna Probe with experimental Nuclear Propulsion (Deco Block) tile.sat_laser.name=Orbital Death Ray (Deco Block) @@ -6037,6 +6038,7 @@ tile.watz_end.name=Watz Reactor Stability Element tile.watz_end_bolted.name=Watz Reactor Stability Element (Riveted) tile.watz_hatch.name=Watz Reactor Access Hatch tile.watz_pump.name=Watz Pressure Pump +tile.wood_barrier.name=Wooden Barrier tile.yellow_barrel.name=Radioactive Barrel tile.zirnox_destroyed.name=Destroyed ZIRNOX diff --git a/src/main/resources/assets/hbm/structures/spire-air.nbt b/src/main/resources/assets/hbm/structures/spire-air.nbt deleted file mode 100644 index 0e6994429abd992edc63a8521ae1b1a7be521b63..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16529 zcmeHO3s76vneK)bH|r2K=}sL>HQH`w*G(U=Gm(THj5V$kyKS~n({^C64I&!{6U4&= z8_ZKn*_xSpRK{^r&&UokrH<_g5HSU8gn)!vw&P$RAS9j&R*e7|WDG(=ue<-bdfbNu zzR7sKyE8CnhI`IE_dnYvYfj*D z96M?q$83k2-7}{}&eyOd`CJBOH3~TfY&m`+V<(%dt4L#WV=K})+}4Vz?7p!`S>>+9 zZRyqFJ&WfGH*+n0CHY6Ky_qHXH7l8Y2O?!zePd6_O8ds1mZ^5-3DTp&dyMA_S=`== zski#tcjv`7<}ywnMPz1%u}8Z!{Kkho_H=2Or=5)-MP}X$V>`PvYd^Mzv6-iWFgEjK z3u7}+kzs7+sVa=kJPE_t%u{a|n|X=}V>3^daQ;L@W;rc zRYE&VG9WriZ!bzUn&BG;nKR|m91y)(Z%<1#GRfqp8b{$95WPijXOdy-?Vx(lJ1D(_ zNd`p2ER>}ho$w8VOl7&06V5M#S$HGW$Rv}SYP=5LY~Yu{EIc&xhOx=eCd@i(`#DcO za;4*8P*j(nCD(pjm7m2^s9tYsV>9{J#vWN zZ`OZB=%HfP@Aoi3vGqzL|9@3br8p&B?6{QHELJ4Jw$<`+@6i|2mv`mGrO$`=xX%?n z$E~WEdb^JRg!~fNS{d%@0W;Tyv6&|(UJ3I(zEkoj_xS6TYf}{5oVRco;1I6IV2(rJ z0YZ(@1t!E}y;JL&!Z|auHDxaTOvu0O{6MB{sQ24_LNC~Vys|#c+TJ45E{>Ob z!`Z%kL?6RNl)uOLh3Q>CaXw?{cu$&@`X*bi59ha>lD;a%qZQEV)2-#i3*TeVPAAif z`|*8j>Y1kj*Svgu&D~yMHNC*Q?2lbM#0|ksR6Q|R?(Z&j&-{|qf6mGq>|)a5!`&mt z_JKzwiTCa!8eMu|)>mg!bL*8JvkJ009diOX*Hro|#uT6A4{VVJ`}T)cv~}})dS!S{+B=n)JoB4H8?Wyv*ZPXa2!({LZF0Rke&0h8A*nop-xQvYnbaxxki5j2&V4o$J4sT;?K4)3icmrQ5l z?@YY0{hHh2E3GLxtJg(edj-x1o*Evbpk+W9`5{{0jh0 zyE8b*u$6sUrZoe@F-uv)h=>r>gR(e>w<#y9qe194Nql>nmA6P;2`Q&{(>;)~%L_y1 z|8jq-j9vag=L9_n;a?FxF|d#qPrW2g5WZIrgQS>%+S3G%eqfEo--T!+R0p~={X$M) zwG!6iD}vRU*X*w*Rx?eR7D@KXBij*8a7l)-zIPXHZo6@r>Tly8Qg!6-WxwSG zQ}XD3tV3Rqb=nJBtAnm_Kcr{VUxFyfJfiM|ME zzgfE2Fjud8652n%2aM0p41O2&KXtZo$>I;mKufV5UrV^yL(yQ@ z(~3)LfhaD|q5|uqG)qHv-etVrKChO>XV#L4%$$Pac$d^2C+;6Ky0ZU>7IIqiaYYhn zIzfB|&sw)<_RQw#Wm;2XXbiGB=KHCjgV07N!~Gd+vr?wjb-;e>{17=la5y3w7$OKz zP;Wrli@!zK;6)QajA-`(zbzNog25-zq+?6mr12IYs+g@G32$jB zhsRgNZLHzXWes~;{_=t17Ns=B?IyU6dZ9-6GR`rkP?jWa__&kn9ExE0_(mD~FKXFZMbzUpnWE*m7 ze63Qy!#k33&?wsZFY`(Z+i5Po)*(MUuxBt8GD(mk) zKi074Ke^S4XZ}fQ%J}+E0!2&TyDHQ6)$HNJyOR;{?%-~CH{1u+Nkvuf!pr!dQOb;0 zYx^m+j614}&9B@n++iC!@hn|Z9E)C}=-=AL>V?_U?Up(XVkCQSqM@Uwg;6uxLqC2AP$D58*uFm= znl)`nrWIWj1*9Q; zlC)kI_1D({5uj*3xJ!Qh`(75QDW9UZduz$U@cM1|WRivDbJ6sYOJJO+*0hyeNUH`O z8R#RpYqV;3x0&^o`~^pky1;FzIQ-6VLM;>3AMkpHZ!Md4)cl(r=$KJ!6Ff& zp!wUEYj8P_s21FH0Phh|;Q&uX{(Fe?BvSm;M_A{qrSV(YCfoTz;&g^MuI+sTAftPz zZf9jZI@n22L0p#_#1ANn$q4?5YZS$$oy!lqSmwWZMv0N&vVf_e&JI#; znJl;UK1Upt;tqo71h@&GS3S?h{RAR>13l3t-|o`58K>?p4L#k|oX2nav4)R5rza=B zmxAjMg>istF!DY?MRxbR3tmFN9pq4@ zh^n5Vo^`i{P!e?|`+FB+fzYD9cn8r;sjbBWLCcABk7lXJ8%Z;xrI$C8O`U4Wff*t) z$hN$)$*=GjCOUWktVVZ@yps)XA2`osfqQEMRS+h4hk@3~FV_T#g&5B4a{lw|q7;7v zK189(J6??%e>An2_Kg@c8Rg8yv9IwPqPbt@+J`SDyzHocA9s}k2gAr!GQ9l@f3(J- z`ofPWQ5yt0f~CNo=)dTNdhdygz%5>;HGBg=7}P>J7P?M37V>kEkf7pU&k$|{pI>qu z*DzWOWzoZZaJ)sr6=ruqz{v?I(;K~ph&F^lT(&<9`O#(6TzsDt(cKN_Yu>(yV(7QS zipNt3vl{zChp%g+R}dWpqr&+_Y8Vo2sy``(3xBI6xa7w;F*(gD=51>Xv3%&gq+(03 z@xeZvpQY?H5ySSYjb<&tYbfRy`kahzQ|O33xJ%%4Q06_@)=_IgyM3tk*DFB`PTnie zL{~ydfC1OjwT7hRCP$n?oFF-Lv}e{**O26XU(2hi2%I$ILNF}j@r5Fyy)6Iz1 zJayHr{*u0p5d$De*wSO{(lAd0T^hzIv_VqMR_$OB*vSNCkeg32RUe*&V8tXHU$5ln zbdOn2DcDoXz(I39^!piEeRZ&6o6z<>3x~T3uuV#VkPHSoL9t-?*scGG>*B89uOx}<5q!Aa3~JktTQ134YasJaCXkxn}|m+ z;Tjm>8&J3Ypd5s@7+l3vyBJ?6VI;0Yl0iQbS&bS{NpQ%8JZE*k8}{XFJ%rVuqQ}li zcSL3~Pwh`-GEV`IaPRDWk3`jdnM*SPlcM6FZBymChDa- z`s9TX;0o)N#E(h^6C=&>rFOfg3bS4iv}1OMXiLt6E6xECW-wMQb(XXjxs(#mU7-bY zEp$6Y7G<`_?lB4z6z>{xZT%90?&g*r=qoU z09zIsX6{yT%F3`-iDw4$*hOWI`-i5mFu`?+M^|zITT-sPhAkMD1r|x6G0r`o<8e*q zV3Rty)TlFc%O!UOe~j_WRBrR+dgd<(lI>BLsnaBMC_Ufx40O6H?E=r7;I9&w&2?y@ zTj2hOPAo@&jXOnUo^hqbF~gCRNq)K{DKi#(9FZ36LCmPA!)(AFR2oFCYHZTr5jZ6n hXXU#s3KeE@%O&pnw|bR_?qC~?53=_U$Ax|EzX571bo>AS diff --git a/src/main/resources/assets/hbm/structures/spire.nbt b/src/main/resources/assets/hbm/structures/spire.nbt index 0a23bdd399d794f7b77e6b0e44e33832094f9563..0e6994429abd992edc63a8521ae1b1a7be521b63 100644 GIT binary patch literal 16529 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 literal 2227 zcma)-3p87K9>*()sn)Bdu1A?Zv?G*c6s1*F+jOT>A#D`fAZ1a{PNW&*k&@{wZQZcu z)T3(XPLvcIuW1uPWU7rKV!M$+y-H3}q-0c+Aj&3mXLq*e%+5WZ|GD4a1n5O*Q-3d_g|!`UnA--`I1K7XTG`iV4_#`qK2mH7 z_Sgf3=ixAQAz_oVI}Y-!%&dS-h!Y%|3W^+ahtIOfXr%$zdIdK?`p@Q~h)7IX?n2fB z?JC!3EHBWYq?+IdJsW>E5EQrvnE^59N|MWFI*->%w^8ZNU@IFwyYiU!|AVTTwblR+ zL+Trpn}~BnO(3oe2IueJ;4qx8#!&-mH&AT|3Us)!5D`yX^k-_^ez2whUW0thbY(m( zt=5iK*b1uRzPS@!F(x|la>dOrtS*vZ|0<-w51-d(mVHaY)uXUg%${y zO9UqR35|CHeaD3Q={{r>66^s#EQlP(V%n?IgD+eF0-s*8jO0GW_NiwlnZYjFxY$eL z^v)jAObN=caBj#EaBNW8=|>zSu-YiFW*k955OH)*c+l>W+O0gHjwB93Xi3P!OYNJN z|9Z3Tbkt(Vi#`cy0UN!@UW(Pm4?(9IcrsGgL-V1ECMfW!Q`eli)c$BVID1e1DLrze z_ea($pO-_uFREm1#Si@^mOZzZDLXl--ul)mv^xK%_-D+;Yt~0(UF5}UZG>^}({{XP z{`ue6ebel*_4Vv$xFCN>OhX+?wYR1YmBYoG$Q>KX1rc=i8Oh;g7`?722h63tA`=#l zEyKjAA3qM)k))XbucBVUzG~Sy$&v)(yy_uR4+rkdNJTTprra)cM%)vj+ShatNpuH< zV>nF8b@Z5lCLo6528d+zpza41;n+Z|k|ck#b{(zs1X~9$4YV6l$1CauNyR_7<1kJf zW_*m&YgJX3qV#u{?UK$t8b8RYFW=7+N@iE5@`WSwX+$NdlktrHM?WFbCP-n{%u%~nIU1HDH1S}&P z|EiZ5Kg>)r5an$M)OHbnFzMig!((}<|Z=Zxv5#_5Y!D;t*{mkpE! zJo27`QqX;RNLO1xn1RDAk~M+u-uL_}yAd4jcHae&;klReOmuA*vi0R&JFLXCAVO;D0o5(#8N#W-M0##Tb0``t7qeIPcs{c zr&Z92NG#a0DMlMvn*!sLjn=h5wl|jc`TX*tcbAmd%LR4?~hDSy=EQbfm@ z9QC2tVsWEs*i14$Jy>CWzdJQnwJ&)mQf>$ckK!=0EOfiJCNNuk&#$r@0o;F$tiGCw zO?V^6$kEMzR9-sHLd3lT)v%eKSNB+Tc{PA|5!2I}Y7@+*=@lVn)!B=LkeDK`ebGr^ ztqYb4#VcqGRPkme&}9@ zSRjR~fLx1s_sdLjT^$u(bD@i76f%<2F@_Dq(P8kx{qSN{mW4=C3jH^_l4M!@rGcD( zj41yIAr#8uLTXs;B?U3R#;L5j9@Rq>_lRk{SFEbqZ=I+|{OUne*%5&e0^%>vQ zw==#ON)P4KYy6F=?(lTQI?1kot*nE^ZUZvJQvYy8{(8&}m@xB8hEyzviQ5*8&J8IJ JMFecw@-JtvQV0M5 diff --git a/src/main/resources/assets/hbm/textures/blocks/sandbags.png b/src/main/resources/assets/hbm/textures/blocks/sandbags.png new file mode 100644 index 0000000000000000000000000000000000000000..39e9f33f02e8c043b0490cf99eb3773cd5fb6093 GIT binary patch literal 423 zcmV;Y0a*TtP)~P^{QCJen-12T_$+hIl)bU884=@hiEOuun{(X?>Fc+Z&<5+8KGOD1ND*`Z zU_KEsx+uLXr3kQ4ijV-*3_A2K#IT^Es3`YGXZ?N4s2DmX$$VnwxI=IH9IBCXq;&%pS~o5^{(Z+$9hf<0PU^MO z`XGjg`9$kL)L0z=+$TB=ccXO$pmin2XJNX&7v8rD0q(niPnswtN8BbMF5Dj-SWq3r z7*QSMJW&~>-`5AF2=0^Z)`&6CdMC$(+90PyDMC&W9rlrC&lA(@_m@M?KVDxx_2XZr zGtOt8q_WE)=QB@IsqK*SnJ1}rJLG)kNjl?v=1JOa`yuBuPttWOhn&wm`2(+__j)yi R2j~C*002ovPDHLkV1f*?wAlav literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/blocks/wood_barrier.png b/src/main/resources/assets/hbm/textures/blocks/wood_barrier.png new file mode 100644 index 0000000000000000000000000000000000000000..dafd527a0c7f484d085982537558631ac444c103 GIT binary patch literal 513 zcmV+c0{;DpP)SzLSR`I%#0W#DJ4P(m>D8M zj1dv>eeazR0%_lO09tFPDmiD&jNUt~HP&?{#z^no1CKHMO)@ib&g}b6@7*K!-W}7- zxL&USJRT2PYus)(_I)Q^E*DyBlu|G=)^+7PPsekr0BqYvt(6$#)1_LgD+^FcaaZO# zv(0l6q1O6L_|w-(F%ebOiT*DmrSx1Kc0L&uC;nI z0j|lmZIn{}k%SOPDS3+?$3f1SoHM<5cj*27-TPzPHn%k7oDmU9Db!lI-EOXQ2!YGx zf{3819LMp})}<8EaU3t=eSCcQOq}NlfT}v-*Vh*z1lDzZy6|{BT)Zh@Yt3t(!6wnn ze!t(J_e&{0B&zz-2Xl