diff --git a/src/main/java/com/hbm/blocks/BlockDummyable.java b/src/main/java/com/hbm/blocks/BlockDummyable.java index cfedf6246..75dd39c2f 100644 --- a/src/main/java/com/hbm/blocks/BlockDummyable.java +++ b/src/main/java/com/hbm/blocks/BlockDummyable.java @@ -5,12 +5,15 @@ import com.hbm.handler.ThreeInts; import com.hbm.interfaces.ICopiable; import com.hbm.main.MainRegistry; import com.hbm.tileentity.IPersistentNBT; +import com.hbm.world.gen.INBTTransformable; + import cpw.mods.fml.common.network.internal.FMLNetworkHandler; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.block.Block; import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.RenderGlobal; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.item.EntityItem; @@ -32,7 +35,7 @@ import java.util.ArrayList; import java.util.List; import java.util.Random; -public abstract class BlockDummyable extends BlockContainer implements ICustomBlockHighlight, ICopiable { +public abstract class BlockDummyable extends BlockContainer implements ICustomBlockHighlight, ICopiable, INBTTransformable { public BlockDummyable(Material mat) { super(mat); @@ -116,7 +119,7 @@ public abstract class BlockDummyable extends BlockContainer implements ICustomBl return findCoreRec(world, x, y, z); } - List positions = new ArrayList(); + List positions = new ArrayList<>(); public int[] findCoreRec(World world, int x, int y, int z) { @@ -216,11 +219,6 @@ public abstract class BlockDummyable extends BlockContainer implements ICustomBl super.onBlockPlacedBy(world, x, y, z, player, itemStack); } - /*@Override - public void onBlockAdded(World world, int x, int y, int z) { - lastBlockSet = new BlockPos(x, y, z); - }*/ - /** * A bit more advanced than the dir modifier, but it is important that the resulting direction meta is in the core range. * Using the "extra" metas is technically possible but requires a bit of tinkering, e.g. preventing a recursive loop @@ -267,9 +265,9 @@ public abstract class BlockDummyable extends BlockContainer implements ICustomBl return; // world.setBlockMetadataWithNotify(x, y, z, meta + extra, 3); - this.safeRem = true; + safeRem = true; world.setBlock(x, y, z, this, meta + extra, 3); - this.safeRem = false; + safeRem = false; } public void removeExtra(World world, int x, int y, int z) { @@ -283,9 +281,9 @@ public abstract class BlockDummyable extends BlockContainer implements ICustomBl return; // world.setBlockMetadataWithNotify(x, y, z, meta + extra, 3); - this.safeRem = true; + safeRem = true; world.setBlock(x, y, z, this, meta - extra, 3); - this.safeRem = false; + safeRem = false; } // checks if the dummy metadata is within the extra range @@ -423,8 +421,9 @@ public abstract class BlockDummyable extends BlockContainer implements ICustomBl return !bounding.isEmpty(); } - public List bounding = new ArrayList(); + public List bounding = new ArrayList<>(); + @SuppressWarnings({ "rawtypes", "unchecked" }) @Override public void addCollisionBoxesToList(World world, int x, int y, int z, AxisAlignedBB entityBounding, List list, Entity entity) { @@ -443,7 +442,7 @@ public abstract class BlockDummyable extends BlockContainer implements ICustomBl z = pos[2]; for(AxisAlignedBB aabb :this.bounding) { - AxisAlignedBB boxlet = getAABBRotationOffset(aabb, x + 0.5, y, z + 0.5, ForgeDirection.getOrientation(world.getBlockMetadata(x, y, z) - this.offset).getRotation(ForgeDirection.UP)); + AxisAlignedBB boxlet = getAABBRotationOffset(aabb, x + 0.5, y, z + 0.5, ForgeDirection.getOrientation(world.getBlockMetadata(x, y, z) - offset).getRotation(ForgeDirection.UP)); if(entityBounding.intersectsWith(boxlet)) { list.add(boxlet); @@ -504,7 +503,7 @@ public abstract class BlockDummyable extends BlockContainer implements ICustomBl int meta = world.getBlockMetadata(x, y, z); ICustomBlockHighlight.setup(); - for(AxisAlignedBB aabb : this.bounding) event.context.drawOutlinedBoundingBox(getAABBRotationOffset(aabb.expand(exp, exp, exp), 0, 0, 0, ForgeDirection.getOrientation(meta - offset).getRotation(ForgeDirection.UP)).getOffsetBoundingBox(x - dX + 0.5, y - dY, z - dZ + 0.5), -1); + for(AxisAlignedBB aabb : this.bounding) RenderGlobal.drawOutlinedBoundingBox(getAABBRotationOffset(aabb.expand(exp, exp, exp), 0, 0, 0, ForgeDirection.getOrientation(meta - offset).getRotation(ForgeDirection.UP)).getOffsetBoundingBox(x - dX + 0.5, y - dY, z - dZ + 0.5), -1); ICustomBlockHighlight.cleanup(); } @@ -534,4 +533,27 @@ public abstract class BlockDummyable extends BlockContainer implements ICustomBl return ((ICopiable) tile).infoForDisplay(world, x, y, z); return null; } -} + + @Override + public int transformMeta(int meta, int coordBaseMode) { + boolean isOffset = meta >= 12; // squishing causes issues + boolean isExtra = !isOffset && meta >= extra; + + if(isOffset) { + meta -= offset; + } else if(isExtra) { + meta -= extra; + } + + meta = INBTTransformable.transformMetaDeco(meta, coordBaseMode); + + if(isOffset) { + meta += offset; + } else if(isExtra) { + meta += extra; + } + + return meta; + } + +} \ No newline at end of file diff --git a/src/main/java/com/hbm/blocks/IBlockSideRotation.java b/src/main/java/com/hbm/blocks/IBlockSideRotation.java index d24282cce..a8769a139 100644 --- a/src/main/java/com/hbm/blocks/IBlockSideRotation.java +++ b/src/main/java/com/hbm/blocks/IBlockSideRotation.java @@ -11,4 +11,27 @@ public interface IBlockSideRotation { public static int getRenderType() { return renderID; } + + // 0 1 3 2 becomes 0 2 3 1 + // I want to smoke that swedish kush because it clearly makes you fucking stupid + public static int topToBottom(int topRotation) { + switch(topRotation) { + case 1: return 2; + case 2: return 1; + default: return topRotation; + } + } + + public static boolean isOpposite(int from, int to) { + switch(from) { + case 0: return to == 1; + case 1: return to == 0; + case 2: return to == 3; + case 3: return to == 2; + case 4: return to == 5; + case 5: return to == 4; + default: return false; + } + } + } diff --git a/src/main/java/com/hbm/blocks/ModBlocks.java b/src/main/java/com/hbm/blocks/ModBlocks.java index c428d8ae0..6cf108b50 100644 --- a/src/main/java/com/hbm/blocks/ModBlocks.java +++ b/src/main/java/com/hbm/blocks/ModBlocks.java @@ -35,6 +35,7 @@ import net.minecraft.block.Block; import net.minecraft.block.BlockFalling; import net.minecraft.block.material.*; import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.init.Blocks; import net.minecraft.item.Item; import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; @@ -603,6 +604,7 @@ public class ModBlocks { public static Block spikes; public static Block charger; + public static Block refueler; public static Block tesla; @@ -1227,6 +1229,11 @@ public class ModBlocks { public static Block pink_double_slab; public static Block pink_stairs; + // NBT Structure wand blocks + public static Block wand_air; + public static Block wand_loot; + public static Block wand_jigsaw; + public static Material materialGas = new MaterialGas(); private static void initializeBlock() { @@ -1653,7 +1660,7 @@ public class ModBlocks { plant_dead = new BlockDeadPlant().setBlockName("plant_dead").setCreativeTab(MainRegistry.blockTab).setStepSound(Block.soundTypeGrass).setHardness(0.0F); reeds = new BlockReeds().setBlockName("plant_reeds").setCreativeTab(MainRegistry.blockTab).setStepSound(Block.soundTypeGrass).setHardness(0.0F); vine_phosphor = new BlockHangingVine(thick_foliage).setBlockName("vine_phosphor").setCreativeTab(MainRegistry.blockTab).setStepSound(Block.soundTypeGrass).setHardness(0.5F); - + waste_earth = new WasteEarth(Material.ground, true).setBlockName("waste_earth").setStepSound(Block.soundTypeGrass).setCreativeTab(MainRegistry.blockTab).setHardness(0.6F).setBlockTextureName(RefStrings.MODID + ":waste_earth"); waste_mycelium = new WasteEarth(Material.ground, true).setBlockName("waste_mycelium").setStepSound(Block.soundTypeGrass).setLightLevel(1F).setCreativeTab(MainRegistry.blockTab).setHardness(0.6F).setBlockTextureName(RefStrings.MODID + ":waste_mycelium_side"); waste_trinitite = new BlockOre(Material.sand).noFortune().setBlockName("waste_trinitite").setStepSound(Block.soundTypeSand).setCreativeTab(MainRegistry.blockTab).setHardness(0.5F).setResistance(2.5F).setBlockTextureName(RefStrings.MODID + ":waste_trinitite"); @@ -1835,7 +1842,7 @@ public class ModBlocks { pa_quadrupole = new BlockPAQuadrupole().setStepSound(Block.soundTypeMetal).setBlockName("pa_quadrupole").setHardness(5.0F).setResistance(10.0F); pa_dipole = new BlockPADipole().setStepSound(Block.soundTypeMetal).setBlockName("pa_dipole").setHardness(5.0F).setResistance(10.0F); pa_detector = new BlockPADetector().setStepSound(Block.soundTypeMetal).setBlockName("pa_detector").setHardness(5.0F).setResistance(10.0F); - + machine_electric_furnace_off = new MachineElectricFurnace(false).setBlockName("machine_electric_furnace_off").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab); machine_electric_furnace_on = new MachineElectricFurnace(true).setBlockName("machine_electric_furnace_on").setHardness(5.0F).setLightLevel(1.0F).setResistance(10.0F); machine_arc_furnace_off = new MachineArcFurnace(false).setBlockName("machine_arc_furnace_off").setHardness(5.0F).setResistance(10.0F); @@ -2068,6 +2075,7 @@ public class ModBlocks { spikes = new Spikes(Material.iron).setBlockName("spikes").setHardness(2.5F).setResistance(5.0F).setCreativeTab(MainRegistry.blockTab).setBlockTextureName(RefStrings.MODID + ":spikes"); charger = new Charger(Material.iron).setBlockName("charger").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.blockTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); + refueler = new BlockRefueler(Material.iron).setBlockName("refueler").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.blockTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); tesla = new MachineTesla(Material.iron).setBlockName("tesla").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.blockTab).setBlockTextureName(RefStrings.MODID + ":tesla"); @@ -2352,6 +2360,10 @@ public class ModBlocks { pink_slab = new BlockPinkSlab(false, Material.wood).setBlockName("pink_slab").setStepSound(Block.soundTypeWood).setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":pink_planks"); pink_double_slab = new BlockPinkSlab(true, Material.wood).setBlockName("pink_double_slab").setStepSound(Block.soundTypeWood).setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":pink_planks"); pink_stairs = new BlockGenericStairs(pink_planks, 0).setBlockName("pink_stairs").setStepSound(Block.soundTypeWood).setCreativeTab(null).setBlockTextureName(RefStrings.MODID + ":pink_planks"); + + wand_air = new BlockWand(Blocks.air).setBlockName("wand_air").setBlockTextureName(RefStrings.MODID + ":wand_air"); + wand_loot = new BlockWandLoot().setBlockName("wand_loot").setBlockTextureName(RefStrings.MODID + ":wand_loot"); + wand_jigsaw = new BlockWandJigsaw().setBlockName("wand_jigsaw").setBlockTextureName(RefStrings.MODID + ":wand_jigsaw"); } private static void registerBlock() { @@ -2709,6 +2721,7 @@ public class ModBlocks { //Charger GameRegistry.registerBlock(charger, charger.getUnlocalizedName()); + GameRegistry.registerBlock(refueler, refueler.getUnlocalizedName()); //GameRegistry.registerBlock(floodlight, floodlight.getUnlocalizedName()); //Decoration Blocks @@ -3472,6 +3485,10 @@ public class ModBlocks { GameRegistry.registerBlock(pink_slab, pink_slab.getUnlocalizedName()); GameRegistry.registerBlock(pink_double_slab, pink_double_slab.getUnlocalizedName()); GameRegistry.registerBlock(pink_stairs, pink_stairs.getUnlocalizedName()); + + register(wand_air); + register(wand_loot); + register(wand_jigsaw); } private static void register(Block b) { diff --git a/src/main/java/com/hbm/blocks/generic/BlockBobble.java b/src/main/java/com/hbm/blocks/generic/BlockBobble.java index 5e5226e6f..da175541c 100644 --- a/src/main/java/com/hbm/blocks/generic/BlockBobble.java +++ b/src/main/java/com/hbm/blocks/generic/BlockBobble.java @@ -4,6 +4,9 @@ import com.hbm.inventory.gui.GUIScreenBobble; import com.hbm.items.special.ItemPlasticScrap.ScrapType; import com.hbm.main.MainRegistry; import com.hbm.tileentity.IGUIProvider; +import com.hbm.world.gen.INBTTileEntityTransformable; +import com.hbm.world.gen.INBTTransformable; + import cpw.mods.fml.common.network.internal.FMLNetworkHandler; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -31,7 +34,7 @@ import net.minecraft.world.World; import java.util.List; import java.util.Random; -public class BlockBobble extends BlockContainer implements IGUIProvider { +public class BlockBobble extends BlockContainer implements IGUIProvider, INBTTransformable { public BlockBobble() { super(Material.iron); @@ -136,12 +139,17 @@ public class BlockBobble extends BlockContainer implements IGUIProvider { return AxisAlignedBB.getBoundingBox(x + this.minX, y + this.minY, z + this.minZ, x + this.maxX, y + this.maxY, z + this.maxZ); } + @Override + public int transformMeta(int meta, int coordBaseMode) { + return (meta + coordBaseMode * 4) % 16; + } + @Override public TileEntity createNewTileEntity(World world, int meta) { return new TileEntityBobble(); } - public static class TileEntityBobble extends TileEntity { + public static class TileEntityBobble extends TileEntity implements INBTTileEntityTransformable { public BobbleType type = BobbleType.NONE; @@ -173,6 +181,11 @@ public class BlockBobble extends BlockContainer implements IGUIProvider { super.writeToNBT(nbt); nbt.setByte("type", (byte) type.ordinal()); } + + @Override + public void transformTE(World world, int coordBaseMode) { + type = BobbleType.values()[world.rand.nextInt(BobbleType.values().length - 1) + 1]; + } } public static enum BobbleType { @@ -200,7 +213,7 @@ public class BlockBobble extends BlockContainer implements IGUIProvider { CIRNO( "Cirno", "Cirno", "the only multi layered skin i had", "No brain. Head empty.", true, ScrapType.BOARD_BLANK), MICROWAVE( "Microwave", "Microwave", "OC Compatibility and massive RBMK/packet optimizations", "they call me the food heater$john optimization", true, ScrapType.BOARD_CONVERTER), PEEP( "Peep", "LePeeperSauvage", "Coilgun, Leadburster and Congo Lake models, BDCL QC", "Fluffy ears can't hide in ash, nor snow.", true, ScrapType.CARD_BOARD), - MELLOW( "MELLOWARPEGGIATION", "Mellow", "Industrial lighting, animation tools", "Make something cool now, ask for permission later.", true, ScrapType.CARD_PROCESSOR); + MELLOW( "MELLOWARPEGGIATION", "Mellow", "NBT Structures, industrial lighting, animation tools", "Make something cool now, ask for permission later.", true, ScrapType.CARD_PROCESSOR); public String name; //the title of the tooltip public String label; //the name engraved in the socket diff --git a/src/main/java/com/hbm/blocks/generic/BlockDecoCRT.java b/src/main/java/com/hbm/blocks/generic/BlockDecoCRT.java index 724912ed3..b1ede562a 100644 --- a/src/main/java/com/hbm/blocks/generic/BlockDecoCRT.java +++ b/src/main/java/com/hbm/blocks/generic/BlockDecoCRT.java @@ -2,6 +2,7 @@ package com.hbm.blocks.generic; import com.hbm.blocks.BlockMulti; import com.hbm.lib.RefStrings; +import com.hbm.world.gen.INBTTransformable; import cpw.mods.fml.client.registry.RenderingRegistry; import cpw.mods.fml.relauncher.Side; @@ -14,7 +15,7 @@ import net.minecraft.util.IIcon; import net.minecraft.util.MathHelper; import net.minecraft.world.World; -public class BlockDecoCRT extends BlockMulti { +public class BlockDecoCRT extends BlockMulti implements INBTTransformable { protected String[] variants = new String[] {"crt_clean", "crt_broken", "crt_blinking", "crt_bsod"}; @SideOnly(Side.CLIENT) protected IIcon[] icons; @@ -24,17 +25,17 @@ public class BlockDecoCRT extends BlockMulti { } public static int renderID = RenderingRegistry.getNextAvailableRenderId(); - + @Override public int getRenderType(){ return renderID; } - + @Override public boolean isOpaqueCube() { return false; } - + @Override public boolean renderAsNormalBlock() { return false; @@ -45,12 +46,12 @@ public class BlockDecoCRT extends BlockMulti { public void registerBlockIcons(IIconRegister reg) { super.registerBlockIcons(reg); this.icons = new IIcon[variants.length]; - + for(int i = 0; i < variants.length; i++) { this.icons[i] = reg.registerIcon(RefStrings.MODID + ":" + variants[i]); } } - + @Override @SideOnly(Side.CLIENT) public IIcon getIcon(int side, int meta) { @@ -61,7 +62,7 @@ public class BlockDecoCRT extends BlockMulti { public int damageDropped(int meta) { return (Math.abs(meta) % 16) / 4; } - + @Override public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase player, ItemStack stack) { int i = MathHelper.floor_double(player.rotationYaw * 4.0F / 360.0F + 0.5D) & 3; @@ -73,4 +74,10 @@ public class BlockDecoCRT extends BlockMulti { public int getSubCount() { return 4; } -} + + @Override + public int transformMeta(int meta, int coordBaseMode) { + return INBTTransformable.transformMetaDecoModel(meta, coordBaseMode); + } + +} \ No newline at end of file diff --git a/src/main/java/com/hbm/blocks/generic/BlockDecoModel.java b/src/main/java/com/hbm/blocks/generic/BlockDecoModel.java index d70fd5fe4..f10edc069 100644 --- a/src/main/java/com/hbm/blocks/generic/BlockDecoModel.java +++ b/src/main/java/com/hbm/blocks/generic/BlockDecoModel.java @@ -1,6 +1,7 @@ package com.hbm.blocks.generic; import com.hbm.blocks.BlockEnumMulti; +import com.hbm.world.gen.INBTTransformable; import cpw.mods.fml.client.registry.RenderingRegistry; import net.minecraft.block.material.Material; @@ -11,14 +12,14 @@ import net.minecraft.util.MathHelper; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; -public class BlockDecoModel extends BlockEnumMulti { - +public class BlockDecoModel extends BlockEnumMulti implements INBTTransformable { + public BlockDecoModel(Material mat, Class theEnum, boolean multiName, boolean multiTexture) { super(mat, theEnum, multiName, multiTexture); } - + public static int renderID = RenderingRegistry.getNextAvailableRenderId(); - + @Override public int getRenderType() { return renderID; @@ -33,18 +34,18 @@ public class BlockDecoModel extends BlockEnumMulti { public boolean renderAsNormalBlock() { return false; } - + //Did somebody say - pain? //Alright fuckers, looks like 2/b010 = North, 3/b011 = South, 4/b100 = West, 5/b101 = East for sides. //I'll just opt for something similar (0/b00 North, 1/b01 South, 2/b10 West, 3/b11 East) - + //Assumes meta is using the third and fourth bits. @Override public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase player, ItemStack stack) { int i = MathHelper.floor_double(player.rotationYaw * 4.0F / 360.0F + 0.5D) & 3; - + int meta; - + if((i & 1) != 1) meta = i >> 1; //For North(b00>b00) and South(b10>b01), shift bits right by one else { @@ -53,15 +54,15 @@ public class BlockDecoModel extends BlockEnumMulti { else meta = 3; //For East(b01>b11), just set to 3 } - + world.setBlockMetadataWithNotify(x, y, z, (meta << 2) | stack.getItemDamage(), 2); } - + @Override public int damageDropped(int meta) { return meta & 3; } - + //These are separate because they have to be constant private float mnX = 0.0F; //min private float mnY = 0.0F; @@ -69,7 +70,7 @@ public class BlockDecoModel extends BlockEnumMulti { private float mxX = 1.0F; //max private float mxY = 1.0F; private float mxZ = 1.0F; - + public BlockDecoModel setBlockBoundsTo(float minX, float minY, float minZ, float maxX, float maxY, float maxZ) { mnX = minX; mnY = minY; @@ -77,10 +78,10 @@ public class BlockDecoModel extends BlockEnumMulti { mxX = maxX; mxY = maxY; mxZ = maxZ; - + return this; } - + @Override public void setBlockBoundsBasedOnState(IBlockAccess world, int x, int y, int z) { switch(world.getBlockMetadata(x, y, z) >> 2) { @@ -98,10 +99,39 @@ public class BlockDecoModel extends BlockEnumMulti { break; } } - + @Override public AxisAlignedBB getCollisionBoundingBoxFromPool(World world, int x, int y, int z) { this.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 int transformMeta(int meta, int coordBaseMode) { + //N: 0b00, S: 0b01, W: 0b10, E: 0b11 + int rot = meta >> 2; + int type = meta & 3; + + switch(coordBaseMode) { + default: //South + break; + case 1: //West + if((rot & 3) < 2) //N & S can just have bits toggled + rot = rot ^ 3; + else //W & E can just have first bit set to 0 + rot = rot ^ 2; + break; + case 2: //North + rot = rot ^ 1; //N, W, E & S can just have first bit toggled + break; + case 3: //East + if((rot & 3) < 2)//N & S can just have second bit set to 1 + rot = rot ^ 2; + else //W & E can just have bits toggled + rot = rot ^ 3; + break; + } + //genuinely like. why did i do that + return (rot << 2) | type; //To accommodate for BlockDecoModel's shift in the rotation bits; otherwise, simply bit-shift right and or any non-rotation meta after + } } \ No newline at end of file diff --git a/src/main/java/com/hbm/blocks/generic/BlockDecoToaster.java b/src/main/java/com/hbm/blocks/generic/BlockDecoToaster.java index a11061fa0..c35dd1d3b 100644 --- a/src/main/java/com/hbm/blocks/generic/BlockDecoToaster.java +++ b/src/main/java/com/hbm/blocks/generic/BlockDecoToaster.java @@ -2,6 +2,7 @@ package com.hbm.blocks.generic; import com.hbm.blocks.BlockMulti; import com.hbm.lib.RefStrings; +import com.hbm.world.gen.INBTTransformable; import cpw.mods.fml.client.registry.RenderingRegistry; import cpw.mods.fml.relauncher.Side; @@ -16,7 +17,7 @@ import net.minecraft.util.MathHelper; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; -public class BlockDecoToaster extends BlockMulti { +public class BlockDecoToaster extends BlockMulti implements INBTTransformable { protected String[] variants = new String[] {"toaster_iron", "toaster_steel", "toaster_wood"}; @SideOnly(Side.CLIENT) protected IIcon[] icons; @@ -26,17 +27,17 @@ public class BlockDecoToaster extends BlockMulti { } public static int renderID = RenderingRegistry.getNextAvailableRenderId(); - + @Override public int getRenderType(){ return renderID; } - + @Override public boolean isOpaqueCube() { return false; } - + @Override public boolean renderAsNormalBlock() { return false; @@ -47,12 +48,12 @@ public class BlockDecoToaster extends BlockMulti { public void registerBlockIcons(IIconRegister reg) { super.registerBlockIcons(reg); this.icons = new IIcon[variants.length]; - + for(int i = 0; i < variants.length; i++) { this.icons[i] = reg.registerIcon(RefStrings.MODID + ":" + variants[i]); } } - + @Override @SideOnly(Side.CLIENT) public IIcon getIcon(int side, int meta) { @@ -63,7 +64,7 @@ public class BlockDecoToaster extends BlockMulti { public int damageDropped(int meta) { return (Math.abs(meta) % 12) / 4; } - + @Override public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase player, ItemStack stack) { int i = MathHelper.floor_double(player.rotationYaw * 4.0F / 360.0F + 0.5D) & 3; @@ -90,4 +91,10 @@ public class BlockDecoToaster extends BlockMulti { this.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 int transformMeta(int meta, int coordBaseMode) { + return INBTTransformable.transformMetaDecoModel(meta, coordBaseMode); + } + +} \ No newline at end of file diff --git a/src/main/java/com/hbm/blocks/generic/BlockPipe.java b/src/main/java/com/hbm/blocks/generic/BlockPipe.java index a41d6cfdf..27eaf3b27 100644 --- a/src/main/java/com/hbm/blocks/generic/BlockPipe.java +++ b/src/main/java/com/hbm/blocks/generic/BlockPipe.java @@ -4,6 +4,7 @@ import java.util.List; import com.hbm.blocks.ITooltipProvider; import com.hbm.lib.RefStrings; +import com.hbm.world.gen.INBTTransformable; import cpw.mods.fml.client.registry.RenderingRegistry; import cpw.mods.fml.relauncher.Side; @@ -16,7 +17,7 @@ import net.minecraft.item.ItemStack; import net.minecraft.util.IIcon; import net.minecraft.world.World; -public class BlockPipe extends Block implements ITooltipProvider { +public class BlockPipe extends Block implements ITooltipProvider, INBTTransformable { @SideOnly(Side.CLIENT) private IIcon sideIcon; @@ -24,7 +25,7 @@ public class BlockPipe extends Block implements ITooltipProvider { public IIcon frameIcon; @SideOnly(Side.CLIENT) public IIcon meshIcon; - + private String sideString; public int rType = 0; //because registering either new renderer classes or making new block classes is a pain in the ass @@ -33,7 +34,7 @@ public class BlockPipe extends Block implements ITooltipProvider { this.sideString = tex; this.rType = rType; } - + @Override @SideOnly(Side.CLIENT) public void registerBlockIcons(IIconRegister iconRegister) { @@ -42,7 +43,7 @@ public class BlockPipe extends Block implements ITooltipProvider { this.frameIcon = iconRegister.registerIcon(RefStrings.MODID + ":pipe_frame"); this.meshIcon = iconRegister.registerIcon(RefStrings.MODID + ":pipe_mesh"); } - + @Override @SideOnly(Side.CLIENT) public IIcon getIcon(int side, int metadata) { @@ -92,4 +93,10 @@ public class BlockPipe extends Block implements ITooltipProvider { public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean ext) { list.add("Purely decorative"); } -} + + @Override + public int transformMeta(int meta, int coordBaseMode) { + return INBTTransformable.transformMetaPillar(meta, coordBaseMode); + } + +} \ No newline at end of file diff --git a/src/main/java/com/hbm/blocks/generic/BlockWand.java b/src/main/java/com/hbm/blocks/generic/BlockWand.java new file mode 100644 index 000000000..c25c390eb --- /dev/null +++ b/src/main/java/com/hbm/blocks/generic/BlockWand.java @@ -0,0 +1,51 @@ +package com.hbm.blocks.generic; + +import cpw.mods.fml.client.registry.RenderingRegistry; +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.util.AxisAlignedBB; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; + +public class BlockWand extends Block { + + public final Block exportAs; + + public BlockWand(Block exportAs) { + super(Material.glass); + this.exportAs = exportAs; + setBlockBounds(1F/16F, 1F/16F, 1F/16F, 15F/16F, 15F/16F, 15F/16F); + } + + @Override + public boolean isOpaqueCube() { + return false; + } + + @Override + public boolean renderAsNormalBlock() { + return false; + } + + @Override + public AxisAlignedBB getCollisionBoundingBoxFromPool(World world, int x, int y, int z) { + return null; + } + + public static int renderID = RenderingRegistry.getNextAvailableRenderId(); + + @Override + public int getRenderType() { + return renderID; + } + + @SideOnly(Side.CLIENT) + public boolean shouldSideBeRendered(IBlockAccess world, int x, int y, int z, int side) { + Block block = world.getBlock(x, y, z); + + return block != this; + } + +} \ No newline at end of file diff --git a/src/main/java/com/hbm/blocks/generic/BlockWandJigsaw.java b/src/main/java/com/hbm/blocks/generic/BlockWandJigsaw.java new file mode 100644 index 000000000..a8a44a55e --- /dev/null +++ b/src/main/java/com/hbm/blocks/generic/BlockWandJigsaw.java @@ -0,0 +1,387 @@ +package com.hbm.blocks.generic; + +import java.util.ArrayList; +import java.util.List; + +import org.lwjgl.input.Keyboard; + +import com.hbm.blocks.IBlockSideRotation; +import com.hbm.blocks.ILookOverlay; +import com.hbm.blocks.ModBlocks; +import com.hbm.interfaces.IControlReceiver; +import com.hbm.lib.RefStrings; +import com.hbm.main.MainRegistry; +import com.hbm.packet.PacketDispatcher; +import com.hbm.packet.toserver.NBTControlPacket; +import com.hbm.tileentity.IGUIProvider; +import com.hbm.tileentity.TileEntityLoadedBase; +import com.hbm.util.BufferUtil; +import com.hbm.util.I18nUtil; +import com.hbm.world.gen.INBTTransformable; + +import cpw.mods.fml.common.network.internal.FMLNetworkHandler; +import cpw.mods.fml.common.registry.GameRegistry; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; +import net.minecraft.block.Block; +import net.minecraft.block.BlockContainer; +import net.minecraft.block.BlockPistonBase; +import net.minecraft.block.material.Material; +import net.minecraft.client.gui.GuiButton; +import net.minecraft.client.gui.GuiScreen; +import net.minecraft.client.gui.GuiTextField; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.inventory.Container; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.IIcon; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; +import net.minecraftforge.client.event.RenderGameOverlayEvent.Pre; + +public class BlockWandJigsaw extends BlockContainer implements IBlockSideRotation, INBTTransformable, IGUIProvider, ILookOverlay { + + private IIcon iconTop; + private IIcon iconSide; + private IIcon iconBack; + + public BlockWandJigsaw() { + super(Material.iron); + } + + @Override + public TileEntity createNewTileEntity(World world, int meta) { + return new TileEntityWandJigsaw(); + } + + @Override + public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase player, ItemStack stack) { + int l = BlockPistonBase.determineOrientation(world, x, y, z, player); + world.setBlockMetadataWithNotify(x, y, z, l, 2); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister iconRegister) { + this.blockIcon = iconRegister.registerIcon(RefStrings.MODID + ":wand_jigsaw"); + this.iconTop = iconRegister.registerIcon(RefStrings.MODID + ":wand_jigsaw_top"); + this.iconSide = iconRegister.registerIcon(RefStrings.MODID + ":wand_jigsaw_side"); + this.iconBack = iconRegister.registerIcon(RefStrings.MODID + ":wand_jigsaw_back"); + } + + @Override + public IIcon getIcon(int side, int meta) { + if(side == meta) return blockIcon; + if(IBlockSideRotation.isOpposite(side, meta)) return iconBack; + if(side <= 1) return iconTop; + if(side > 3 && meta <= 1) return iconTop; + return iconSide; + } + + @Override + public int getRotationFromSide(IBlockAccess world, int x, int y, int z, int side) { + if(side == 0) return IBlockSideRotation.topToBottom(getRotationFromSide(world, x, y, z, 1)); + + int meta = world.getBlockMetadata(x, y, z); + if(side == meta || IBlockSideRotation.isOpposite(side, meta)) return 0; + + // downwards facing has no changes, upwards flips anything not handled already + if(meta == 0) return 0; + if(meta == 1) return 3; + + // top (and bottom) is rotated fairly normally + if(side == 1) { + switch(meta) { + case 2: return 3; + case 3: return 0; + case 4: return 1; + case 5: return 2; + } + } + + // you know what I aint explaining further, it's a fucking mess here + if(meta == 2) return side == 4 ? 2 : 1; + if(meta == 3) return side == 4 ? 1 : 2; + if(meta == 4) return side == 2 ? 1 : 2; + if(meta == 5) return side == 2 ? 2 : 1; + + return 0; + } + + @Override + public int getRenderType() { + return IBlockSideRotation.getRenderType(); + } + + @Override + public int transformMeta(int meta, int coordBaseMode) { + return INBTTransformable.transformMetaDeco(meta, coordBaseMode); + } + + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { + TileEntity te = world.getTileEntity(x, y, z); + + if(!(te instanceof TileEntityWandJigsaw)) return false; + + TileEntityWandJigsaw jigsaw = (TileEntityWandJigsaw) te; + + if(!player.isSneaking()) { + Block block = getBlock(world, player.getHeldItem()); + if(block == ModBlocks.wand_air) block = Blocks.air; + + if(block != null && block != ModBlocks.wand_jigsaw && block != ModBlocks.wand_loot) { + jigsaw.replaceBlock = block; + jigsaw.replaceMeta = player.getHeldItem().getItemDamage(); + + return true; + } + + if(world.isRemote) FMLNetworkHandler.openGui(player, MainRegistry.instance, 0, world, x, y, z); + + return true; + } + + return false; + } + + private Block getBlock(World world, ItemStack stack) { + if(stack == null) return null; + if(!(stack.getItem() instanceof ItemBlock)) return null; + + return ((ItemBlock) stack.getItem()).field_150939_a; + } + + @Override + @SideOnly(Side.CLIENT) + public Object provideGUI(int ID, EntityPlayer player, World world, int x, int y, int z) { + return new GuiWandJigsaw((TileEntityWandJigsaw) world.getTileEntity(x, y, z)); + } + + @Override + public Container provideContainer(int ID, EntityPlayer player, World world, int x, int y, int z) { + return null; + } + + @Override + public void printHook(Pre event, World world, int x, int y, int z) { + TileEntity te = world.getTileEntity(x, y, z); + if(!(te instanceof TileEntityWandJigsaw)) return; + TileEntityWandJigsaw jigsaw = (TileEntityWandJigsaw) te; + + List text = new ArrayList(); + + text.add(EnumChatFormatting.GRAY + "Target pool: " + EnumChatFormatting.RESET + jigsaw.pool); + text.add(EnumChatFormatting.GRAY + "Name: " + EnumChatFormatting.RESET + jigsaw.name); + text.add(EnumChatFormatting.GRAY + "Target name: " + EnumChatFormatting.RESET + jigsaw.target); + text.add(EnumChatFormatting.GRAY + "Turns into: " + EnumChatFormatting.RESET + GameRegistry.findUniqueIdentifierFor(jigsaw.replaceBlock).toString()); + text.add(EnumChatFormatting.GRAY + " with meta: " + EnumChatFormatting.RESET + jigsaw.replaceMeta); + text.add(EnumChatFormatting.GRAY + "Selection/Placement priority: " + EnumChatFormatting.RESET + jigsaw.selectionPriority + "/" + jigsaw.placementPriority); + text.add(EnumChatFormatting.GRAY + "Joint type: " + EnumChatFormatting.RESET + (jigsaw.isRollable ? "Rollable" : "Aligned")); + + ILookOverlay.printGeneric(event, I18nUtil.resolveKey(getUnlocalizedName() + ".name"), 0xffff00, 0x404000, text); + } + + + public static class TileEntityWandJigsaw extends TileEntityLoadedBase implements IControlReceiver { + + private int selectionPriority = 0; // higher priority = this jigsaw block is selected first for generation + private int placementPriority = 0; // higher priority = children of this jigsaw block are checked for jigsaw blocks of their own and selected first + private String pool = "default"; + private String name = "default"; + private String target = "default"; + private Block replaceBlock = Blocks.air; + private int replaceMeta = 0; + private boolean isRollable = true; // sets joint type, rollable joints can be placed in any orientation for vertical jigsaw connections + + @Override + public void updateEntity() { + if(!worldObj.isRemote) { + networkPackNT(15); + } + } + + @Override + public void serialize(ByteBuf buf) { + buf.writeInt(selectionPriority); + buf.writeInt(placementPriority); + BufferUtil.writeString(buf, pool); + BufferUtil.writeString(buf, name); + BufferUtil.writeString(buf, target); + buf.writeInt(Block.getIdFromBlock(replaceBlock)); + buf.writeInt(replaceMeta); + buf.writeBoolean(isRollable); + } + + @Override + public void deserialize(ByteBuf buf) { + selectionPriority = buf.readInt(); + placementPriority = buf.readInt(); + pool = BufferUtil.readString(buf); + name = BufferUtil.readString(buf); + target = BufferUtil.readString(buf); + replaceBlock = Block.getBlockById(buf.readInt()); + replaceMeta = buf.readInt(); + isRollable = buf.readBoolean(); + } + + @Override + public void writeToNBT(NBTTagCompound nbt) { + super.writeToNBT(nbt); + nbt.setInteger("direction", this.getBlockMetadata()); + + nbt.setInteger("selection", selectionPriority); + nbt.setInteger("placement", placementPriority); + nbt.setString("pool", pool); + nbt.setString("name", name); + nbt.setString("target", target); + nbt.setString("block", GameRegistry.findUniqueIdentifierFor(replaceBlock).toString()); + nbt.setInteger("meta", replaceMeta); + nbt.setBoolean("roll", isRollable); + } + + @Override + public void readFromNBT(NBTTagCompound nbt) { + super.readFromNBT(nbt); + + selectionPriority = nbt.getInteger("selection"); + placementPriority = nbt.getInteger("placement"); + pool = nbt.getString("pool"); + name = nbt.getString("name"); + target = nbt.getString("target"); + replaceBlock = Block.getBlockFromName(nbt.getString("block")); + replaceMeta = nbt.getInteger("meta"); + isRollable = nbt.getBoolean("roll"); + } + + @Override + public boolean hasPermission(EntityPlayer player) { + return true; + } + + @Override + public void receiveControl(NBTTagCompound nbt) { + readFromNBT(nbt); + markDirty(); + } + + } + + public static class GuiWandJigsaw extends GuiScreen { + + private final TileEntityWandJigsaw jigsaw; + + private GuiTextField textPool; + private GuiTextField textName; + private GuiTextField textTarget; + + private GuiTextField textSelectionPriority; + private GuiTextField textPlacementPriority; + + private GuiButton jointToggle; + + public GuiWandJigsaw(TileEntityWandJigsaw jigsaw) { + this.jigsaw = jigsaw; + } + + @Override + public void initGui() { + Keyboard.enableRepeatEvents(true); + + textPool = new GuiTextField(fontRendererObj, this.width / 2 - 150, 50, 300, 20); + textPool.setText(jigsaw.pool); + + textName = new GuiTextField(fontRendererObj, this.width / 2 - 150, 100, 140, 20); + textName.setText(jigsaw.name); + + textTarget = new GuiTextField(fontRendererObj, this.width / 2 + 10, 100, 140, 20); + textTarget.setText(jigsaw.target); + + textSelectionPriority = new GuiTextField(fontRendererObj, this.width / 2 - 150, 150, 90, 20); + textSelectionPriority.setText("" + jigsaw.selectionPriority); + + textPlacementPriority = new GuiTextField(fontRendererObj, this.width / 2 - 40, 150, 90, 20); + textPlacementPriority.setText("" + jigsaw.placementPriority); + + jointToggle = new GuiButton(0, this.width / 2 + 60, 150, 90, 20, jigsaw.isRollable ? "Rollable" : "Aligned"); + } + + @Override + public void drawScreen(int mouseX, int mouseY, float partialTicks) { + drawDefaultBackground(); + + drawString(fontRendererObj, "Target pool:", this.width / 2 - 150, 37, 0xA0A0A0); + textPool.drawTextBox(); + + drawString(fontRendererObj, "Name:", this.width / 2 - 150, 87, 0xA0A0A0); + textName.drawTextBox(); + + drawString(fontRendererObj, "Target name:", this.width / 2 + 10, 87, 0xA0A0A0); + textTarget.drawTextBox(); + + drawString(fontRendererObj, "Selection priority:", this.width / 2 - 150, 137, 0xA0A0A0); + textSelectionPriority.drawTextBox(); + + drawString(fontRendererObj, "Placement priority:", this.width / 2 - 40, 137, 0xA0A0A0); + textPlacementPriority.drawTextBox(); + + drawString(fontRendererObj, "Joint type:", this.width / 2 + 60, 137, 0xA0A0A0); + jointToggle.drawButton(mc, mouseX, mouseY); + + super.drawScreen(mouseX, mouseY, partialTicks); + } + + @Override + public void onGuiClosed() { + Keyboard.enableRepeatEvents(false); + + NBTTagCompound data = new NBTTagCompound(); + jigsaw.writeToNBT(data); + + data.setString("pool", textPool.getText()); + data.setString("name", textName.getText()); + data.setString("target", textTarget.getText()); + + try { data.setInteger("selection", Integer.parseInt(textSelectionPriority.getText())); } catch(Exception ex) {} + try { data.setInteger("placement", Integer.parseInt(textPlacementPriority.getText())); } catch(Exception ex) {} + + data.setBoolean("roll", jointToggle.displayString == "Rollable"); + + PacketDispatcher.wrapper.sendToServer(new NBTControlPacket(data, jigsaw.xCoord, jigsaw.yCoord, jigsaw.zCoord)); + } + + @Override + protected void keyTyped(char typedChar, int keyCode) { + super.keyTyped(typedChar, keyCode); + textPool.textboxKeyTyped(typedChar, keyCode); + textName.textboxKeyTyped(typedChar, keyCode); + textTarget.textboxKeyTyped(typedChar, keyCode); + textSelectionPriority.textboxKeyTyped(typedChar, keyCode); + textPlacementPriority.textboxKeyTyped(typedChar, keyCode); + } + + @Override + protected void mouseClicked(int mouseX, int mouseY, int mouseButton) { + super.mouseClicked(mouseX, mouseY, mouseButton); + textPool.mouseClicked(mouseX, mouseY, mouseButton); + textName.mouseClicked(mouseX, mouseY, mouseButton); + textTarget.mouseClicked(mouseX, mouseY, mouseButton); + textSelectionPriority.mouseClicked(mouseX, mouseY, mouseButton); + textPlacementPriority.mouseClicked(mouseX, mouseY, mouseButton); + + if(jointToggle.mousePressed(mc, mouseX, mouseY)) { + System.out.println("displayString: " + jointToggle.displayString); + jointToggle.displayString = jointToggle.displayString == "Rollable" ? "Aligned" : "Rollable"; + } + } + + } + +} diff --git a/src/main/java/com/hbm/blocks/generic/BlockWandLoot.java b/src/main/java/com/hbm/blocks/generic/BlockWandLoot.java new file mode 100644 index 000000000..80b1f3b92 --- /dev/null +++ b/src/main/java/com/hbm/blocks/generic/BlockWandLoot.java @@ -0,0 +1,338 @@ +package com.hbm.blocks.generic; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.UUID; + +import com.hbm.blocks.IBlockSideRotation; +import com.hbm.blocks.ILookOverlay; +import com.hbm.blocks.ITooltipProvider; +import com.hbm.blocks.ModBlocks; +import com.hbm.config.StructureConfig; +import com.hbm.itempool.ItemPool; +import com.hbm.lib.RefStrings; +import com.hbm.tileentity.TileEntityLoadedBase; +import com.hbm.util.BufferUtil; +import com.hbm.util.I18nUtil; +import com.hbm.util.LootGenerator; +import com.hbm.world.gen.INBTTileEntityTransformable; +import com.mojang.authlib.GameProfile; + +import api.hbm.block.IToolable; +import cpw.mods.fml.common.registry.GameRegistry; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; +import net.minecraft.block.Block; +import net.minecraft.block.BlockContainer; +import net.minecraft.block.ITileEntityProvider; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.IInventory; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.IIcon; +import net.minecraft.util.MathHelper; +import net.minecraft.util.WeightedRandomChestContent; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; +import net.minecraft.world.WorldServer; +import net.minecraftforge.client.event.RenderGameOverlayEvent.Pre; +import net.minecraftforge.common.util.FakePlayer; +import net.minecraftforge.common.util.FakePlayerFactory; + +public class BlockWandLoot extends BlockContainer implements ILookOverlay, IToolable, ITooltipProvider, IBlockSideRotation { + + @SideOnly(Side.CLIENT) protected IIcon iconTop; + + public BlockWandLoot() { + super(Material.iron); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister iconRegister) { + this.blockIcon = iconRegister.registerIcon(RefStrings.MODID + ":wand_loot"); + this.iconTop = iconRegister.registerIcon(RefStrings.MODID + ":wand_loot_top"); + } + + @Override + public IIcon getIcon(int side, int meta) { + return (side <= 1) ? iconTop : blockIcon; + } + + @Override + public int getRotationFromSide(IBlockAccess world, int x, int y, int z, int side) { + if(side == 0) return IBlockSideRotation.topToBottom(world.getBlockMetadata(x, y, z)); + if(side == 1) return world.getBlockMetadata(x, y, z); + return 0; + } + + @Override + public int getRenderType() { + return IBlockSideRotation.getRenderType(); + } + + @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, 3, 2); + if(i == 1) world.setBlockMetadataWithNotify(x, y, z, 2, 2); + if(i == 2) world.setBlockMetadataWithNotify(x, y, z, 0, 2); + if(i == 3) world.setBlockMetadataWithNotify(x, y, z, 1, 2); + + TileEntity te = world.getTileEntity(x, y, z); + if(!(te instanceof TileEntityWandLoot)) return; + ((TileEntityWandLoot) te).placedRotation = player.rotationYaw; + } + + @Override + public void printHook(Pre event, World world, int x, int y, int z) { + TileEntity te = world.getTileEntity(x, y, z); + + if(!(te instanceof TileEntityWandLoot)) return; + + TileEntityWandLoot loot = (TileEntityWandLoot) te; + + List text = new ArrayList(); + text.add("Will replace with: " + loot.replaceBlock.getUnlocalizedName()); + text.add(" meta: " + loot.replaceMeta); + text.add("Loot pool: " + loot.poolName); + if(loot.replaceBlock != ModBlocks.deco_loot) { + text.add("Minimum items: " + loot.minItems); + text.add("Maximum items: " + loot.maxItems); + } + + ILookOverlay.printGeneric(event, I18nUtil.resolveKey(getUnlocalizedName() + ".name"), 0xffff00, 0x404000, text); + } + + @SuppressWarnings({ "unchecked", "rawtypes" }) + @Override + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean ext) { + list.add("Define loot crates/piles in .nbt structures"); + list.add(EnumChatFormatting.GOLD + "Use screwdriver to increase/decrease minimum loot"); + list.add(EnumChatFormatting.GOLD + "Use hand drill to increase/decrease maximum loot"); + list.add(EnumChatFormatting.GOLD + "Use defuser to cycle loot types"); + list.add(EnumChatFormatting.GOLD + "Use container block to set the block that spawns with loot inside"); + } + + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { + TileEntity te = world.getTileEntity(x, y, z); + + if(!(te instanceof TileEntityWandLoot)) return false; + + TileEntityWandLoot loot = (TileEntityWandLoot) te; + + if(!player.isSneaking()) { + + Block block = getLootableBlock(world, player.getHeldItem()); + + if(block != null) { + loot.replaceBlock = block; + loot.replaceMeta = player.getHeldItem().getItemDamage(); + + List poolNames = loot.getPoolNames(block == ModBlocks.deco_loot); + if(!poolNames.contains(loot.poolName)) { + loot.poolName = poolNames.get(0); + } + + return true; + } + } + + return false; + } + + private Block getLootableBlock(World world, ItemStack stack) { + if(stack == null) return null; + + if(stack.getItem() instanceof ItemBlock) { + Block block = ((ItemBlock) stack.getItem()).field_150939_a; + + if(block == ModBlocks.deco_loot) return block; + + if(block instanceof ITileEntityProvider) { + TileEntity te = ((ITileEntityProvider) block).createNewTileEntity(world, 12); + if(te instanceof IInventory) return block; + } + } + + return null; + } + + @Override + public boolean onScrew(World world, EntityPlayer player, int x, int y, int z, int side, float fX, float fY, float fZ, ToolType tool) { + TileEntity te = world.getTileEntity(x, y, z); + + if(!(te instanceof TileEntityWandLoot)) return false; + + TileEntityWandLoot loot = (TileEntityWandLoot) te; + + switch(tool) { + case SCREWDRIVER: + if(player.isSneaking()) { + loot.minItems--; + if(loot.minItems < 0) loot.minItems = 0; + } else { + loot.minItems++; + loot.maxItems = Math.max(loot.minItems, loot.maxItems); + } + + return true; + + case HAND_DRILL: + if(player.isSneaking()) { + loot.maxItems--; + if(loot.maxItems < 0) loot.maxItems = 0; + loot.minItems = Math.min(loot.minItems, loot.maxItems); + } else { + loot.maxItems++; + } + + return true; + + case DEFUSER: + List poolNames = loot.getPoolNames(loot.replaceBlock == ModBlocks.deco_loot); + int index = poolNames.indexOf(loot.poolName); + + index += player.isSneaking() ? -1 : 1; + index = MathHelper.clamp_int(index, 0, poolNames.size() - 1); + + loot.poolName = poolNames.get(index); + + return true; + + default: return false; + } + } + + @Override + public TileEntity createNewTileEntity(World world, int meta) { + return new TileEntityWandLoot(); + } + + public static class TileEntityWandLoot extends TileEntityLoadedBase implements INBTTileEntityTransformable { + + private boolean triggerReplace; + + private Block replaceBlock = ModBlocks.deco_loot; + private int replaceMeta; + + private String poolName = LootGenerator.LOOT_BOOKLET; + private int minItems; + private int maxItems = 1; + + private float placedRotation; + + private static final GameProfile FAKE_PROFILE = new GameProfile(UUID.fromString("839eb18c-50bc-400c-8291-9383f09763e7"), "[NTM]"); + private static FakePlayer fakePlayer; + + @Override + public void updateEntity() { + if(!worldObj.isRemote) { + if(triggerReplace) { + // On the first tick of this TE, replace with intended block and fill with loot + replace(); + } else { + networkPackNT(15); + } + } + } + + private void replace() { + WeightedRandomChestContent[] pool = ItemPool.getPool(poolName); + + worldObj.setBlock(xCoord, yCoord, zCoord, replaceBlock, replaceMeta, 2); + + TileEntity te = worldObj.getTileEntity(xCoord, yCoord, zCoord); + + if(te instanceof IInventory) { + int count = minItems; + if(maxItems - minItems > 0) count += worldObj.rand.nextInt(maxItems - minItems); + WeightedRandomChestContent.generateChestContents(worldObj.rand, pool, (IInventory) te, count); + } else if(te instanceof BlockLoot.TileEntityLoot) { + LootGenerator.applyLoot(worldObj, xCoord, yCoord, zCoord, poolName); + } + + // Shouldn't happen but let's guard anyway, if it fails we just don't rotate the chest block correctly + if(!(worldObj instanceof WorldServer)) return; + + if(fakePlayer == null || fakePlayer.worldObj != worldObj) { + fakePlayer = FakePlayerFactory.get((WorldServer)worldObj, FAKE_PROFILE); + } + + fakePlayer.rotationYaw = fakePlayer.rotationYawHead = placedRotation; + + ItemStack fakeStack = new ItemStack(replaceBlock, 1, replaceMeta); + + replaceBlock.onBlockPlacedBy(worldObj, xCoord, yCoord, zCoord, fakePlayer, fakeStack); + } + + private List getPoolNames(boolean loot) { + if(loot) return Arrays.asList(LootGenerator.getLootNames()); + + List names = new ArrayList<>(); + names.addAll(ItemPool.pools.keySet()); + return names; + } + + @Override + public void transformTE(World world, int coordBaseMode) { + triggerReplace = !StructureConfig.debugStructures; + placedRotation = MathHelper.wrapAngleTo180_float(placedRotation + coordBaseMode * 90); + } + + @Override + public void writeToNBT(NBTTagCompound nbt) { + super.writeToNBT(nbt); + Block writeBlock = replaceBlock == null ? ModBlocks.deco_loot : replaceBlock; + nbt.setString("block", GameRegistry.findUniqueIdentifierFor(writeBlock).toString()); + nbt.setInteger("meta", replaceMeta); + nbt.setInteger("min", minItems); + nbt.setInteger("max", maxItems); + nbt.setString("pool", poolName); + nbt.setFloat("rot", placedRotation); + } + + @Override + public void readFromNBT(NBTTagCompound nbt) { + super.readFromNBT(nbt); + replaceBlock = Block.getBlockFromName(nbt.getString("block")); + replaceMeta = nbt.getInteger("meta"); + minItems = nbt.getInteger("min"); + maxItems = nbt.getInteger("max"); + poolName = nbt.getString("pool"); + placedRotation = nbt.getFloat("rot"); + + if(replaceBlock == null) replaceBlock = ModBlocks.deco_loot; + } + + @Override + public void serialize(ByteBuf buf) { + buf.writeInt(Block.getIdFromBlock(replaceBlock)); + buf.writeInt(replaceMeta); + buf.writeInt(minItems); + buf.writeInt(maxItems); + BufferUtil.writeString(buf, poolName); + } + + @Override + public void deserialize(ByteBuf buf) { + replaceBlock = Block.getBlockById(buf.readInt()); + replaceMeta = buf.readInt(); + minItems = buf.readInt(); + maxItems = buf.readInt(); + poolName = BufferUtil.readString(buf); + } + + } + +} \ No newline at end of file diff --git a/src/main/java/com/hbm/blocks/generic/DecoBlock.java b/src/main/java/com/hbm/blocks/generic/DecoBlock.java index 9037b4f6a..bf25850eb 100644 --- a/src/main/java/com/hbm/blocks/generic/DecoBlock.java +++ b/src/main/java/com/hbm/blocks/generic/DecoBlock.java @@ -6,6 +6,7 @@ import java.util.Random; import com.hbm.blocks.ModBlocks; import com.hbm.tileentity.deco.TileEntityDecoBlock; +import com.hbm.world.gen.INBTTransformable; import api.hbm.block.IToolable; import cpw.mods.fml.client.registry.RenderingRegistry; @@ -24,8 +25,8 @@ import net.minecraft.util.MathHelper; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; -public class DecoBlock extends BlockContainer implements IToolable { - +public class DecoBlock extends BlockContainer implements IToolable, INBTTransformable { + Random rand = new Random(); public DecoBlock(Material p_i45386_1_) { @@ -36,7 +37,7 @@ public class DecoBlock extends BlockContainer implements IToolable { 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.SCREWDRIVER) return false; if(this != ModBlocks.steel_wall && this != ModBlocks.steel_corner) return false; - + int meta = world.getBlockMetadata(x, y, z); if(!player.isSneaking()) { @@ -50,7 +51,7 @@ public class DecoBlock extends BlockContainer implements IToolable { else if(meta == 2) world.setBlockMetadataWithNotify(x, y, z, 4, 3); else if(meta == 5) world.setBlockMetadataWithNotify(x, y, z, 2, 3); } - + return true; } @@ -65,7 +66,7 @@ public class DecoBlock extends BlockContainer implements IToolable { public static int renderIDBeam = RenderingRegistry.getNextAvailableRenderId(); public static int renderIDWall = RenderingRegistry.getNextAvailableRenderId(); public static int renderIDCorner = RenderingRegistry.getNextAvailableRenderId(); - + @Override public int getRenderType(){ if(this == ModBlocks.steel_wall) return renderIDWall; @@ -73,32 +74,32 @@ public class DecoBlock extends BlockContainer implements IToolable { if(this == ModBlocks.steel_beam) return renderIDBeam; return -1; } - + @Override public boolean isOpaqueCube() { return false; } - + @Override public boolean renderAsNormalBlock() { return false; } - + @Override public Item getItemDropped(int p_149650_1_, Random p_149650_2_, int p_149650_3_) { return Item.getItemFromBlock(this); } - + @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, 3, 2); if(i == 1) world.setBlockMetadataWithNotify(x, y, z, 4, 2); if(i == 2) world.setBlockMetadataWithNotify(x, y, z, 2, 2); if(i == 3) world.setBlockMetadataWithNotify(x, y, z, 5, 2); } - + @Override public void setBlockBoundsBasedOnState(IBlockAccess world, int x, int y, int z) { int te = world.getBlockMetadata(x, y, z); @@ -141,14 +142,14 @@ public class DecoBlock extends BlockContainer implements IToolable { this.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 addCollisionBoxesToList(World world, int x, int y, int z, AxisAlignedBB aabb, List list, Entity collider) { - + if(this == ModBlocks.steel_corner) { int meta = world.getBlockMetadata(x, y, z); List bbs = new ArrayList(); - + switch(meta) { case 2: bbs.add(AxisAlignedBB.getBoundingBox(x + 0.25D, y + 0D, z + 0.875D, x + 1D, y + 1D, z + 1D)); @@ -171,7 +172,7 @@ public class DecoBlock extends BlockContainer implements IToolable { bbs.add(AxisAlignedBB.getBoundingBox(x + 0.25D, y + 0D, z + 0D, x + 1D, y + 1D, z + 0.125D)); break; } - + for(AxisAlignedBB bb : bbs) { if(aabb.intersectsWith(bb)) { list.add(bb); @@ -181,4 +182,9 @@ public class DecoBlock extends BlockContainer implements IToolable { super.addCollisionBoxesToList(world, x, y, z, aabb, list, collider); } } -} + + @Override + public int transformMeta(int meta, int coordBaseMode) { + return INBTTransformable.transformMetaDeco(meta, coordBaseMode); + } +} \ No newline at end of file diff --git a/src/main/java/com/hbm/blocks/generic/DecoPoleSatelliteReceiver.java b/src/main/java/com/hbm/blocks/generic/DecoPoleSatelliteReceiver.java index 481236f78..109cabbc5 100644 --- a/src/main/java/com/hbm/blocks/generic/DecoPoleSatelliteReceiver.java +++ b/src/main/java/com/hbm/blocks/generic/DecoPoleSatelliteReceiver.java @@ -1,6 +1,7 @@ package com.hbm.blocks.generic; import com.hbm.tileentity.deco.TileEntityDecoPoleSatelliteReceiver; +import com.hbm.world.gen.INBTTransformable; import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; @@ -10,7 +11,7 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.util.MathHelper; import net.minecraft.world.World; -public class DecoPoleSatelliteReceiver extends BlockContainer { +public class DecoPoleSatelliteReceiver extends BlockContainer implements INBTTransformable { public DecoPoleSatelliteReceiver(Material p_i45386_1_) { super(p_i45386_1_); @@ -20,26 +21,26 @@ public class DecoPoleSatelliteReceiver extends BlockContainer { public TileEntity createNewTileEntity(World p_149915_1_, int p_149915_2_) { return new TileEntityDecoPoleSatelliteReceiver(); } - + @Override public int getRenderType(){ return -1; } - + @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); @@ -58,4 +59,9 @@ public class DecoPoleSatelliteReceiver extends BlockContainer { } } -} + @Override + public int transformMeta(int meta, int coordBaseMode) { + return INBTTransformable.transformMetaDeco(meta, coordBaseMode); + } + +} \ No newline at end of file diff --git a/src/main/java/com/hbm/blocks/generic/DecoTapeRecorder.java b/src/main/java/com/hbm/blocks/generic/DecoTapeRecorder.java index 6d94427e2..e7143aae6 100644 --- a/src/main/java/com/hbm/blocks/generic/DecoTapeRecorder.java +++ b/src/main/java/com/hbm/blocks/generic/DecoTapeRecorder.java @@ -1,5 +1,7 @@ package com.hbm.blocks.generic; +import com.hbm.world.gen.INBTTransformable; + import cpw.mods.fml.client.registry.RenderingRegistry; import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; @@ -9,7 +11,7 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.util.MathHelper; import net.minecraft.world.World; -public class DecoTapeRecorder extends BlockContainer { +public class DecoTapeRecorder extends BlockContainer implements INBTTransformable { public DecoTapeRecorder(Material p_i45386_1_) { super(p_i45386_1_); @@ -19,28 +21,28 @@ public class DecoTapeRecorder extends BlockContainer { public TileEntity createNewTileEntity(World p_149915_1_, int p_149915_2_) { return null; } - + public static int renderID = RenderingRegistry.getNextAvailableRenderId(); - + @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); @@ -59,4 +61,9 @@ public class DecoTapeRecorder extends BlockContainer { } } -} + @Override + public int transformMeta(int meta, int coordBaseMode) { + return INBTTransformable.transformMetaDeco(meta, coordBaseMode); + } + +} \ No newline at end of file diff --git a/src/main/java/com/hbm/blocks/machine/BlockRefueler.java b/src/main/java/com/hbm/blocks/machine/BlockRefueler.java new file mode 100644 index 000000000..543e8963d --- /dev/null +++ b/src/main/java/com/hbm/blocks/machine/BlockRefueler.java @@ -0,0 +1,101 @@ +package com.hbm.blocks.machine; + +import com.hbm.inventory.fluid.FluidType; +import com.hbm.items.machine.IItemFluidIdentifier; +import com.hbm.tileentity.machine.TileEntityRefueler; + +import net.minecraft.block.BlockContainer; +import net.minecraft.block.material.Material; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.ChatComponentText; +import net.minecraft.util.ChatComponentTranslation; +import net.minecraft.util.ChatStyle; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.MathHelper; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; + +public class BlockRefueler extends BlockContainer { + + public BlockRefueler(Material mat) { + super(mat); + } + + @Override + public TileEntity createNewTileEntity(World world, int meta) { + return new TileEntityRefueler(); + } + + @Override + public int getRenderType() { + return -1; + } + + @Override + public boolean isOpaqueCube() { + return false; + } + + @Override + public boolean renderAsNormalBlock() { + return false; + } + + @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 && !player.isSneaking()) { + if(player.getHeldItem() != null && player.getHeldItem().getItem() instanceof IItemFluidIdentifier) { + TileEntity te = world.getTileEntity(x, y, z); + + if(!(te instanceof TileEntityRefueler)) + return false; + + TileEntityRefueler refueler = (TileEntityRefueler) te; + FluidType type = ((IItemFluidIdentifier) player.getHeldItem().getItem()).getType(world, x, y, z, player.getHeldItem()); + refueler.tank.setTankType(type); + refueler.markDirty(); + player.addChatComponentMessage(new ChatComponentText("Changed type to ").setChatStyle(new ChatStyle().setColor(EnumChatFormatting.YELLOW)).appendSibling(new ChatComponentTranslation(type.getConditionalName())).appendSibling(new ChatComponentText("!"))); + + return true; + } + + return false; + } else { + return true; + } + } + + @Override + public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase player, ItemStack stack) { + 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) { + float f = 0.0625F; + + switch(world.getBlockMetadata(x, y, z)) { + case 2: this.setBlockBounds(0F, 0F, 12 * f, 1F, 1F, 1F); break; + case 3: this.setBlockBounds(0F, 0F, 0F, 1F, 1F, 4 * f); break; + case 4: this.setBlockBounds(12 * f, 0F, 0F, 1F, 1F, 1F); break; + case 5: this.setBlockBounds(0F, 0F, 0F, 4 * f, 1F, 1F); break; + default: this.setBlockBounds(0F, 0F, 0F, 1F, 1F, 1F); break; + } + } + + @Override + public AxisAlignedBB getCollisionBoundingBoxFromPool(World world, int x, int y, int z) { + this.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); + } + +} diff --git a/src/main/java/com/hbm/blocks/machine/Spotlight.java b/src/main/java/com/hbm/blocks/machine/Spotlight.java index c40a9ef9c..f5a89d404 100644 --- a/src/main/java/com/hbm/blocks/machine/Spotlight.java +++ b/src/main/java/com/hbm/blocks/machine/Spotlight.java @@ -7,6 +7,7 @@ import java.util.Random; import com.hbm.blocks.BlockEnums.LightType; import com.hbm.blocks.ISpotlight; import com.hbm.main.ResourceManager; +import com.hbm.world.gen.INBTTransformable; import cpw.mods.fml.client.registry.RenderingRegistry; import cpw.mods.fml.relauncher.Side; @@ -14,6 +15,7 @@ import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.block.Block; import net.minecraft.block.BlockSlab; import net.minecraft.block.material.Material; +import net.minecraft.init.Blocks; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.util.AxisAlignedBB; @@ -22,7 +24,7 @@ import net.minecraft.world.World; import net.minecraftforge.client.model.obj.WavefrontObject; import net.minecraftforge.common.util.ForgeDirection; -public class Spotlight extends Block implements ISpotlight { +public class Spotlight extends Block implements ISpotlight, INBTTransformable { // I'd be extending the ReinforcedLamp class if it wasn't for the inverted behaviour of these specific lights // I want these blocks to be eminently useful, so removing the need for redstone by default is desired, @@ -38,7 +40,7 @@ public class Spotlight extends Block implements ISpotlight { this.beamLength = beamLength; this.type = type; this.isOn = isOn; - + this.setHardness(1F); if(isOn) setLightLevel(1.0F); @@ -123,6 +125,8 @@ public class Spotlight extends Block implements ISpotlight { } private boolean updatePower(World world, int x, int y, int z) { + if(isBroken(world.getBlockMetadata(x, y, z))) return false; + boolean isPowered = world.isBlockIndirectlyGettingPowered(x, y, z); if(isOn && isPowered) { world.scheduleBlockUpdate(x, y, z, this, 4); @@ -148,7 +152,7 @@ public class Spotlight extends Block implements ISpotlight { @Override public void updateTick(World world, int x, int y, int z, Random p_149674_5_) { if (world.isRemote) return; - + if (isOn && world.isBlockIndirectlyGettingPowered(x, y, z)) { world.setBlock(x, y, z, getOff(), world.getBlockMetadata(x, y, z), 2); } @@ -159,6 +163,7 @@ public class Spotlight extends Block implements ISpotlight { public void onNeighborBlockChange(World world, int x, int y, int z, Block neighborBlock) { if(world.isRemote) return; if(neighborBlock instanceof SpotlightBeam) return; + if(neighborBlock == Blocks.air) return; ForgeDirection dir = getDirection(world, x, y, z); @@ -172,13 +177,13 @@ public class Spotlight extends Block implements ISpotlight { updateBeam(world, x, y, z); } - + @Override public boolean canPlaceBlockOnSide(World world, int x, int y, int z, int side) { if(!super.canPlaceBlockOnSide(world, x, y, z, side)) return false; - + ForgeDirection dir = ForgeDirection.getOrientation(side); - + return canPlace(world, x, y, z, dir); } @@ -215,6 +220,10 @@ public class Spotlight extends Block implements ISpotlight { return ForgeDirection.getOrientation(metadata >> 1); } + public boolean isBroken(int metadata) { + return (metadata & 1) == 1; + } + @Override public Item getItemDropped(int i, Random r, int j) { return Item.getItemFromBlock(getOn()); @@ -292,20 +301,20 @@ public class Spotlight extends Block implements ISpotlight { backPropagate(world, x, y, z, dir); } - + protected Block getOff() { if(this == ModBlocks.spotlight_incandescent) return ModBlocks.spotlight_incandescent_off; if(this == ModBlocks.spotlight_fluoro) return ModBlocks.spotlight_fluoro_off; if(this == ModBlocks.spotlight_halogen) return ModBlocks.spotlight_halogen_off; - + return this; } - + protected Block getOn() { if(this == ModBlocks.spotlight_incandescent_off) return ModBlocks.spotlight_incandescent; if(this == ModBlocks.spotlight_fluoro_off) return ModBlocks.spotlight_fluoro; if(this == ModBlocks.spotlight_halogen_off) return ModBlocks.spotlight_halogen; - + return this; } @@ -313,4 +322,19 @@ public class Spotlight extends Block implements ISpotlight { public int getBeamLength() { return this.beamLength; } -} + + @Override + public int transformMeta(int meta, int coordBaseMode) { + // +1 to set as broken, won't turn on until broken and replaced + return (INBTTransformable.transformMetaDeco(meta >> 1, coordBaseMode) << 1) + 1; + } + + @Override + public Block transformBlock(Block block) { + if(block == ModBlocks.spotlight_incandescent) return ModBlocks.spotlight_incandescent_off; + if(block == ModBlocks.spotlight_fluoro) return ModBlocks.spotlight_fluoro_off; + if(block == ModBlocks.spotlight_halogen) return ModBlocks.spotlight_halogen_off; + return block; + } + +} \ No newline at end of file diff --git a/src/main/java/com/hbm/config/StructureConfig.java b/src/main/java/com/hbm/config/StructureConfig.java index 944a7cbb0..2f6bb9bf9 100644 --- a/src/main/java/com/hbm/config/StructureConfig.java +++ b/src/main/java/com/hbm/config/StructureConfig.java @@ -7,36 +7,40 @@ import com.hbm.main.MainRegistry; import net.minecraftforge.common.config.Configuration; public class StructureConfig { - + public static int enableStructures = 2; - + public static int structureMinChunks = 8; public static int structureMaxChunks = 24; - + public static double lootAmountFactor = 1D; - + + public static boolean debugStructures = false; + public static void loadFromConfig(Configuration config) { - + final String CATEGORY_STRUCTURES = CommonConfig.CATEGORY_STRUCTURES; String unparsedStructureFlag = CommonConfig.createConfigString(config, CATEGORY_STRUCTURES, "5.00_enableStructures", "Flag for whether modern NTM structures will spawn. Valid values are true|false|flag - flag will respect the \"Generate Structures\" world flag.", "flag"); enableStructures = CommonConfig.parseStructureFlag(unparsedStructureFlag); - + structureMinChunks = CommonConfig.createConfigInt(config, CATEGORY_STRUCTURES, "5.01_structureMinChunks", "Minimum non-zero distance between structures in chunks (Settings lower than 8 may be problematic).", 8); structureMaxChunks = CommonConfig.createConfigInt(config, CATEGORY_STRUCTURES, "5.02_structureMaxChunks", "Maximum non-zero distance between structures in chunks.", 24); - + lootAmountFactor = CommonConfig.createConfigDouble(config, CATEGORY_STRUCTURES, "5.03_lootAmountFactor", "General factor for loot spawns. Applies to spawned IInventories, not loot blocks.", 1D); - + + debugStructures = CommonConfig.createConfigBool(config, CATEGORY_STRUCTURES, "5.04_debugStructures", "If enabled, special structure blocks like jigsaw blocks will not be transformed after generating", false); + structureMinChunks = CommonConfig.setDef(structureMinChunks, 8); structureMaxChunks = CommonConfig.setDef(structureMaxChunks, 24); - + if(structureMinChunks > structureMaxChunks) { MainRegistry.logger.error("Fatal error config: Minimum value has been set higher than the maximum value!"); MainRegistry.logger.error(String.format(Locale.US, "Errored values will default back to %1$d and %2$d respectively, PLEASE REVIEW CONFIGURATION DESCRIPTION BEFORE MEDDLING WITH VALUES!", 8, 24)); structureMinChunks = 8; structureMaxChunks = 24; } - + } } diff --git a/src/main/java/com/hbm/config/WorldConfig.java b/src/main/java/com/hbm/config/WorldConfig.java index fbf08bc63..7bb0faf58 100644 --- a/src/main/java/com/hbm/config/WorldConfig.java +++ b/src/main/java/com/hbm/config/WorldConfig.java @@ -7,7 +7,7 @@ public class WorldConfig { public static boolean overworldOre = true; public static boolean netherOre = true; public static boolean endOre = true; - + public static int uraniumSpawn = 6; public static int thoriumSpawn = 7; public static int titaniumSpawn = 8; @@ -77,7 +77,6 @@ public class WorldConfig { public static int radioStructure = 500; public static int antennaStructure = 250; public static int atomStructure = 500; - public static int vertibirdStructure = 500; public static int dungeonStructure = 64; public static int relayStructure = 500; public static int satelliteStructure = 500; @@ -88,7 +87,6 @@ public class WorldConfig { public static int geyserWater = 3000; public static int geyserChlorine = 3000; public static int geyserVapor = 500; - public static int meteorStructure = 15000; public static int capsuleStructure = 100; public static int arcticStructure = 500; public static int jungleStructure = 2000; @@ -115,15 +113,15 @@ public class WorldConfig { public static float craterBiomeInnerRad = 25F; public static float craterBiomeOuterRad = 0.5F; public static float craterBiomeWaterMult = 5F; - + public static void loadFromConfig(Configuration config) { final String CATEGORY_OREGEN = CommonConfig.CATEGORY_ORES; - + overworldOre = CommonConfig.createConfigBool(config, CATEGORY_OREGEN, "2.D00_overworldOres", "General switch for whether overworld ores should be generated. Does not include special structures like oil.", true); netherOre = CommonConfig.createConfigBool(config, CATEGORY_OREGEN, "2.D01_netherOres", "General switch for whether nether ores should be generated.", true); endOre = CommonConfig.createConfigBool(config, CATEGORY_OREGEN, "2.D02_endOres", "General switch for whether end ores should be generated. Does not include special structures like trixite crystals.", true); - + uraniumSpawn = CommonConfig.createConfigInt(config, CATEGORY_OREGEN, "2.00_uraniumSpawnrate", "Amount of uranium ore veins per chunk", 7); titaniumSpawn = CommonConfig.createConfigInt(config, CATEGORY_OREGEN, "2.01_titaniumSpawnrate", "Amount of titanium ore veins per chunk", 8); sulfurSpawn = CommonConfig.createConfigInt(config, CATEGORY_OREGEN, "2.02_sulfurSpawnrate", "Amount of sulfur ore veins per chunk", 5); @@ -195,7 +193,6 @@ public class WorldConfig { radioStructure = CommonConfig.createConfigInt(config, CATEGORY_DUNGEON, "4.00_radioSpawn", "Spawn radio station on every nTH chunk", 500); antennaStructure = CommonConfig.createConfigInt(config, CATEGORY_DUNGEON, "4.01_antennaSpawn", "Spawn antenna on every nTH chunk", 250); atomStructure = CommonConfig.createConfigInt(config, CATEGORY_DUNGEON, "4.02_atomSpawn", "Spawn power plant on every nTH chunk", 500); - vertibirdStructure = CommonConfig.createConfigInt(config, CATEGORY_DUNGEON, "4.03_vertibirdSpawn", "Spawn vertibird on every nTH chunk", 500); dungeonStructure = CommonConfig.createConfigInt(config, CATEGORY_DUNGEON, "4.04_dungeonSpawn", "Spawn library dungeon on every nTH chunk", 64); relayStructure = CommonConfig.createConfigInt(config, CATEGORY_DUNGEON, "4.05_relaySpawn", "Spawn relay on every nTH chunk", 500); satelliteStructure = CommonConfig.createConfigInt(config, CATEGORY_DUNGEON, "4.06_satelliteSpawn", "Spawn satellite dish on every nTH chunk", 500); @@ -210,7 +207,6 @@ public class WorldConfig { geyserWater = CommonConfig.createConfigInt(config, CATEGORY_DUNGEON, "4.17_geyserWaterSpawn", "Spawn water geyser on every nTH chunk", 3000); geyserChlorine = CommonConfig.createConfigInt(config, CATEGORY_DUNGEON, "4.18_geyserChlorineSpawn", "Spawn poison geyser on every nTH chunk", 3000); geyserVapor = CommonConfig.createConfigInt(config, CATEGORY_DUNGEON, "4.19_geyserVaporSpawn", "Spawn vapor geyser on every nTH chunk", 500); - meteorStructure = CommonConfig.createConfigInt(config, CATEGORY_DUNGEON, "4.20_meteorSpawn", "Spawn meteor dungeon on every nTH chunk", 15000); capsuleStructure = CommonConfig.createConfigInt(config, CATEGORY_DUNGEON, "4.21_capsuleSpawn", "Spawn landing capsule on every nTH chunk", 100); arcticStructure = CommonConfig.createConfigInt(config, CATEGORY_DUNGEON, "4.22_arcticVaultSpawn", "Spawn arctic code vault on every nTH chunk", 500); jungleStructure = CommonConfig.createConfigInt(config, CATEGORY_DUNGEON, "4.23_jungleDungeonSpawn", "Spawn jungle dungeon on every nTH chunk", 2000); @@ -238,7 +234,6 @@ public class WorldConfig { radioStructure = CommonConfig.setDefZero(radioStructure, 1000); antennaStructure = CommonConfig.setDefZero(antennaStructure, 1000); atomStructure = CommonConfig.setDefZero(atomStructure, 1000); - vertibirdStructure = CommonConfig.setDefZero(vertibirdStructure, 1000); dungeonStructure = CommonConfig.setDefZero(dungeonStructure, 1000); relayStructure = CommonConfig.setDefZero(relayStructure, 1000); satelliteStructure = CommonConfig.setDefZero(satelliteStructure, 1000); @@ -253,11 +248,10 @@ public class WorldConfig { minefreq = CommonConfig.setDefZero(minefreq, 1000); radfreq = CommonConfig.setDefZero(radfreq, 1000); vaultfreq = CommonConfig.setDefZero(vaultfreq, 1000); - meteorStructure = CommonConfig.setDefZero(meteorStructure, 15000); jungleStructure = CommonConfig.setDefZero(jungleStructure, 1000); capsuleStructure = CommonConfig.setDefZero(capsuleStructure, 100); arcticStructure = CommonConfig.setDefZero(arcticStructure, 500); - + meteorStrikeChance = CommonConfig.setDef(meteorStrikeChance, 1000); meteorShowerChance = CommonConfig.setDef(meteorShowerChance, 1000); } diff --git a/src/main/java/com/hbm/crafting/handlers/MKUCraftingHandler.java b/src/main/java/com/hbm/crafting/handlers/MKUCraftingHandler.java index 5086e6388..8405b0f77 100644 --- a/src/main/java/com/hbm/crafting/handlers/MKUCraftingHandler.java +++ b/src/main/java/com/hbm/crafting/handlers/MKUCraftingHandler.java @@ -6,50 +6,52 @@ import java.util.List; import java.util.Random; import com.hbm.items.ModItems; +import com.hbm.items.special.ItemBookLore; import net.minecraft.inventory.InventoryCrafting; +import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.item.crafting.IRecipe; import net.minecraft.world.World; public class MKUCraftingHandler implements IRecipe { - + public static ItemStack[] MKURecipe; private static long lastSeed; @Override public boolean matches(InventoryCrafting inventory, World world) { - + if(world == null) return false; - + if(MKURecipe == null || world.getSeed() != lastSeed) generateRecipe(world); - + for(int i = 0; i < 9; i++) { ItemStack stack = inventory.getStackInRowAndColumn(i % 3, i / 3); ItemStack recipe = MKURecipe[i]; - + if(stack == null && recipe == null) continue; - + if(stack != null && recipe != null && stack.getItem() == recipe.getItem() && stack.getItemDamage() == recipe.getItemDamage()) continue; - + return false; } - + return true; } - + public static void generateRecipe(World world) { Random rand = new Random(world.getSeed()); - + if(lastSeed == world.getSeed() && MKURecipe != null) return; - + lastSeed = world.getSeed(); - + List list = Arrays.asList(new ItemStack[] { new ItemStack(ModItems.powder_iodine), new ItemStack(ModItems.powder_fire), @@ -61,12 +63,54 @@ public class MKUCraftingHandler implements IRecipe { null, null }); - + Collections.shuffle(list, rand); - + MKURecipe = list.toArray(new ItemStack[9]); } + public static Item getMKUItem(World world) { + switch(world.rand.nextInt(6)) { + case 0: return ModItems.powder_iodine; + case 1: return ModItems.powder_fire; + case 2: return ModItems.dust; + case 3: return ModItems.ingot_mercury; + case 4: return ModItems.morning_glory; + case 5: return ModItems.syringe_metal_empty; + default: return ModItems.flame_pony; + } + } + + public static ItemStack generateBook(World world, Item mkuItem) { + MKUCraftingHandler.generateRecipe(world); + ItemStack[] recipe = MKUCraftingHandler.MKURecipe; + + if(recipe == null) return new ItemStack(ModItems.flame_pony); + + String key = null; + int pages = 1; + if(mkuItem == ModItems.powder_iodine) { key = "book_iodine"; pages = 3; } + if(mkuItem == ModItems.powder_fire) { key = "book_phosphorous"; pages = 2; } + if(mkuItem == ModItems.dust) { key = "book_dust"; pages = 3; } + if(mkuItem == ModItems.ingot_mercury) { key = "book_mercury"; pages = 2; } + if(mkuItem == ModItems.morning_glory) { key = "book_flower"; pages = 2; } + if(mkuItem == ModItems.syringe_metal_empty) { key = "book_syringe"; pages = 2; } + + if(key == null) return new ItemStack(ModItems.flame_pony); + + int s = 1; + for(int i = 0; i < 9; i++) { + if(recipe[i] != null && recipe[i].getItem() == mkuItem) { + s = i + 1; break; + } + } + + ItemStack book = ItemBookLore.createBook(key, pages, 0x271E44, 0xFBFFF4); + ItemBookLore.addArgs(book, pages - 1, String.valueOf(s)); + + return book; + } + @Override public int getRecipeSize() { return 6; @@ -81,4 +125,4 @@ public class MKUCraftingHandler implements IRecipe { public ItemStack getRecipeOutput() { return new ItemStack(ModItems.syringe_mkunicorn); } -} +} \ No newline at end of file diff --git a/src/main/java/com/hbm/inventory/gui/GUIAutocrafter.java b/src/main/java/com/hbm/inventory/gui/GUIAutocrafter.java index 49ed13445..cc26020ab 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIAutocrafter.java +++ b/src/main/java/com/hbm/inventory/gui/GUIAutocrafter.java @@ -7,6 +7,7 @@ import org.lwjgl.opengl.GL11; import com.hbm.interfaces.NotableComments; import com.hbm.inventory.container.ContainerAutocrafter; import com.hbm.lib.RefStrings; +import com.hbm.module.ModulePatternMatcher; import com.hbm.tileentity.machine.TileEntityMachineAutocrafter; import net.minecraft.client.Minecraft; @@ -41,16 +42,7 @@ public class GUIAutocrafter extends GuiInfoContainer { Slot slot = (Slot) this.inventorySlots.inventorySlots.get(i); if(this.isMouseOverSlot(slot, x, y) && diFurnace.matcher.modes[i] != null) { - - String label = EnumChatFormatting.YELLOW + ""; - - switch(diFurnace.matcher.modes[i]) { - case "exact": label += "Item and meta match"; break; - case "wildcard": label += "Item matches"; break; - default: label += "Ore dict key matches: " + diFurnace.matcher.modes[i]; break; - } - - this.func_146283_a(Arrays.asList(new String[] { EnumChatFormatting.RED + "Right click to change", label }), x, y - 30); + this.func_146283_a(Arrays.asList(new String[] { EnumChatFormatting.RED + "Right click to change", ModulePatternMatcher.getLabel(diFurnace.matcher.modes[i]) }), x, y - 30); } } diff --git a/src/main/java/com/hbm/inventory/gui/GUICounterTorch.java b/src/main/java/com/hbm/inventory/gui/GUICounterTorch.java index 6a066a684..8a27e27cf 100644 --- a/src/main/java/com/hbm/inventory/gui/GUICounterTorch.java +++ b/src/main/java/com/hbm/inventory/gui/GUICounterTorch.java @@ -7,6 +7,7 @@ import org.lwjgl.opengl.GL11; import com.hbm.inventory.container.ContainerCounterTorch; import com.hbm.lib.RefStrings; +import com.hbm.module.ModulePatternMatcher; import com.hbm.packet.PacketDispatcher; import com.hbm.packet.toserver.NBTControlPacket; import com.hbm.tileentity.network.TileEntityRadioTorchCounter; @@ -72,16 +73,7 @@ public class GUICounterTorch extends GuiInfoContainer { Slot slot = (Slot) this.inventorySlots.inventorySlots.get(i); if(this.isMouseOverSlot(slot, x, y) && counter.matcher.modes[i] != null) { - - String label = EnumChatFormatting.YELLOW + ""; - - switch(counter.matcher.modes[i]) { - case "exact": label += "Item and meta match"; break; - case "wildcard": label += "Item matches"; break; - default: label += "Ore dict key matches: " + counter.matcher.modes[i]; break; - } - - this.func_146283_a(Arrays.asList(new String[] { EnumChatFormatting.RED + "Right click to change", label }), x, y - 30); + this.func_146283_a(Arrays.asList(new String[] { EnumChatFormatting.RED + "Right click to change", ModulePatternMatcher.getLabel(counter.matcher.modes[i]) }), x, y - 30); } } } diff --git a/src/main/java/com/hbm/inventory/gui/GUICraneExtractor.java b/src/main/java/com/hbm/inventory/gui/GUICraneExtractor.java index 7e8f74ab0..18cd12019 100644 --- a/src/main/java/com/hbm/inventory/gui/GUICraneExtractor.java +++ b/src/main/java/com/hbm/inventory/gui/GUICraneExtractor.java @@ -6,6 +6,7 @@ import org.lwjgl.opengl.GL11; import com.hbm.inventory.container.ContainerCraneExtractor; import com.hbm.lib.RefStrings; +import com.hbm.module.ModulePatternMatcher; import com.hbm.packet.PacketDispatcher; import com.hbm.packet.toserver.NBTControlPacket; import com.hbm.tileentity.network.TileEntityCraneExtractor; @@ -41,16 +42,7 @@ public class GUICraneExtractor extends GuiInfoContainer { Slot slot = (Slot) this.inventorySlots.inventorySlots.get(i); if(this.isMouseOverSlot(slot, x, y) && ejector.matcher.modes[i] != null) { - - String label = EnumChatFormatting.YELLOW + ""; - - switch(ejector.matcher.modes[i]) { - case "exact": label += "Item and meta match"; break; - case "wildcard": label += "Item matches"; break; - default: label += "Ore dict key matches: " + ejector.matcher.modes[i]; break; - } - - this.func_146283_a(Arrays.asList(new String[] { EnumChatFormatting.RED + "Right click to change", label }), x, y - 30); + this.func_146283_a(Arrays.asList(new String[] { EnumChatFormatting.RED + "Right click to change", ModulePatternMatcher.getLabel(ejector.matcher.modes[i]) }), x, y - 30); } } } diff --git a/src/main/java/com/hbm/inventory/gui/GUICraneGrabber.java b/src/main/java/com/hbm/inventory/gui/GUICraneGrabber.java index 6bff412fc..641f7eba9 100644 --- a/src/main/java/com/hbm/inventory/gui/GUICraneGrabber.java +++ b/src/main/java/com/hbm/inventory/gui/GUICraneGrabber.java @@ -6,6 +6,7 @@ import org.lwjgl.opengl.GL11; import com.hbm.inventory.container.ContainerCraneGrabber; import com.hbm.lib.RefStrings; +import com.hbm.module.ModulePatternMatcher; import com.hbm.packet.PacketDispatcher; import com.hbm.packet.toserver.NBTControlPacket; import com.hbm.tileentity.network.TileEntityCraneGrabber; @@ -41,16 +42,7 @@ public class GUICraneGrabber extends GuiInfoContainer { Slot slot = (Slot) this.inventorySlots.inventorySlots.get(i); if(this.isMouseOverSlot(slot, x, y) && grabber.matcher.modes[i] != null) { - - String label = EnumChatFormatting.YELLOW + ""; - - switch(grabber.matcher.modes[i]) { - case "exact": label += "Item and meta match"; break; - case "wildcard": label += "Item matches"; break; - default: label += "Ore dict key matches: " + grabber.matcher.modes[i]; break; - } - - this.func_146283_a(Arrays.asList(new String[] { EnumChatFormatting.RED + "Right click to change", label }), x, y - 30); + this.func_146283_a(Arrays.asList(new String[] { EnumChatFormatting.RED + "Right click to change", ModulePatternMatcher.getLabel(grabber.matcher.modes[i]) }), x, y - 30); } } } diff --git a/src/main/java/com/hbm/inventory/gui/GUICraneRouter.java b/src/main/java/com/hbm/inventory/gui/GUICraneRouter.java index 77798355b..657a09736 100644 --- a/src/main/java/com/hbm/inventory/gui/GUICraneRouter.java +++ b/src/main/java/com/hbm/inventory/gui/GUICraneRouter.java @@ -83,16 +83,7 @@ public class GUICraneRouter extends GuiInfoContainer { int index = i % 5; if(this.isMouseOverSlot(slot, x, y) && matcher.modes[index] != null) { - - String label = EnumChatFormatting.YELLOW + ""; - - switch(matcher.modes[index]) { - case "exact": label += "Item and meta match"; break; - case "wildcard": label += "Item matches"; break; - default: label += "Ore dict key matches: " + matcher.modes[index]; break; - } - - this.func_146283_a(Arrays.asList(new String[] { EnumChatFormatting.RED + "Right click to change", label}), x, y - 30); + this.func_146283_a(Arrays.asList(new String[] { EnumChatFormatting.RED + "Right click to change", ModulePatternMatcher.getLabel(matcher.modes[index])}), x, y - 30); } } } diff --git a/src/main/java/com/hbm/inventory/gui/GUIDroneRequester.java b/src/main/java/com/hbm/inventory/gui/GUIDroneRequester.java index 4fec012e5..9010e1ce6 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIDroneRequester.java +++ b/src/main/java/com/hbm/inventory/gui/GUIDroneRequester.java @@ -6,6 +6,7 @@ import org.lwjgl.opengl.GL11; import com.hbm.inventory.container.ContainerDroneRequester; import com.hbm.lib.RefStrings; +import com.hbm.module.ModulePatternMatcher; import com.hbm.tileentity.network.TileEntityDroneRequester; import net.minecraft.client.Minecraft; @@ -37,16 +38,7 @@ public class GUIDroneRequester extends GuiInfoContainer { Slot slot = (Slot) this.inventorySlots.inventorySlots.get(i); if(this.isMouseOverSlot(slot, x, y) && diFurnace.matcher.modes[i] != null) { - - String label = EnumChatFormatting.YELLOW + ""; - - switch(diFurnace.matcher.modes[i]) { - case "exact": label += "Item and meta match"; break; - case "wildcard": label += "Item matches"; break; - default: label += "Ore dict key matches: " + diFurnace.matcher.modes[i]; break; - } - - this.func_146283_a(Arrays.asList(new String[] { EnumChatFormatting.RED + "Right click to change", label }), x, y - 30); + this.func_146283_a(Arrays.asList(new String[] { EnumChatFormatting.RED + "Right click to change", ModulePatternMatcher.getLabel(diFurnace.matcher.modes[i]) }), x, y - 30); } } } diff --git a/src/main/java/com/hbm/inventory/gui/GUIMachineCustom.java b/src/main/java/com/hbm/inventory/gui/GUIMachineCustom.java index 2a02cd763..d106f3717 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIMachineCustom.java +++ b/src/main/java/com/hbm/inventory/gui/GUIMachineCustom.java @@ -10,6 +10,7 @@ import com.hbm.inventory.SlotPattern; import com.hbm.inventory.container.ContainerMachineCustom; import com.hbm.lib.RefStrings; import com.hbm.main.MainRegistry; +import com.hbm.module.ModulePatternMatcher; import com.hbm.tileentity.machine.TileEntityCustomMachine; import net.minecraft.client.Minecraft; @@ -44,16 +45,7 @@ public class GUIMachineCustom extends GuiInfoContainer { int tileIndex = slot.getSlotIndex(); if(this.isMouseOverSlot(slot, x, y) && slot instanceof SlotPattern && custom.matcher.modes[tileIndex - 10] != null) { - - String label = EnumChatFormatting.YELLOW + ""; - - switch(custom.matcher.modes[tileIndex - 10]) { - case "exact": label += "Item and meta match"; break; - case "wildcard": label += "Item matches"; break; - default: label += "Ore dict key matches: " + custom.matcher.modes[tileIndex - 10]; break; - } - - this.func_146283_a(Arrays.asList(new String[] { EnumChatFormatting.RED + "Right click to change", label }), x, y - 30); + this.func_146283_a(Arrays.asList(new String[] { EnumChatFormatting.RED + "Right click to change", ModulePatternMatcher.getLabel(custom.matcher.modes[tileIndex - 10]) }), x, y - 30); } } } diff --git a/src/main/java/com/hbm/items/ModItems.java b/src/main/java/com/hbm/items/ModItems.java index a1e46e603..dad87d730 100644 --- a/src/main/java/com/hbm/items/ModItems.java +++ b/src/main/java/com/hbm/items/ModItems.java @@ -3077,7 +3077,7 @@ public class ModItems { gas_mask_filter_combo = new ItemFilter().setUnlocalizedName("gas_mask_filter_combo").setTextureName(RefStrings.MODID + ":gas_mask_filter_combo"); gas_mask_filter_rag = new ItemFilter().setUnlocalizedName("gas_mask_filter_rag").setTextureName(RefStrings.MODID + ":gas_mask_filter_rag"); gas_mask_filter_piss = new ItemFilter().setUnlocalizedName("gas_mask_filter_piss").setTextureName(RefStrings.MODID + ":gas_mask_filter_piss"); - jetpack_tank = new ItemSyringe().setUnlocalizedName("jetpack_tank").setMaxStackSize(1).setCreativeTab(MainRegistry.consumableTab).setTextureName(RefStrings.MODID + ":jetpack_tank"); + jetpack_tank = new ItemSyringe().setUnlocalizedName("jetpack_tank").setMaxStackSize(16).setCreativeTab(MainRegistry.consumableTab).setTextureName(RefStrings.MODID + ":jetpack_tank"); gun_kit_1 = new ItemRepairKit(10).setUnlocalizedName("gun_kit_1").setCreativeTab(MainRegistry.consumableTab).setTextureName(RefStrings.MODID + ":gun_kit_1"); gun_kit_2 = new ItemRepairKit(100).setUnlocalizedName("gun_kit_2").setCreativeTab(MainRegistry.consumableTab).setTextureName(RefStrings.MODID + ":gun_kit_2"); cbt_device = new ItemSyringe().setUnlocalizedName("cbt_device").setMaxStackSize(1).setCreativeTab(null).setTextureName(RefStrings.MODID + ":cbt_device"); @@ -6230,7 +6230,7 @@ public class ModItems { GameRegistry.registerItem(plastic_bag, plastic_bag.getUnlocalizedName()); GameRegistry.registerItem(casing_bag, casing_bag.getUnlocalizedName()); - + //Keys and Locks GameRegistry.registerItem(key, key.getUnlocalizedName()); GameRegistry.registerItem(key_red, key_red.getUnlocalizedName()); diff --git a/src/main/java/com/hbm/items/special/ItemSyringe.java b/src/main/java/com/hbm/items/special/ItemSyringe.java index 48b6e928b..b8aad87e1 100644 --- a/src/main/java/com/hbm/items/special/ItemSyringe.java +++ b/src/main/java/com/hbm/items/special/ItemSyringe.java @@ -48,7 +48,7 @@ public class ItemSyringe extends Item { if(!player.inventory.addItemStackToInventory(new ItemStack(ModItems.syringe_empty))) { player.dropPlayerItemWithRandomChoice(new ItemStack(ModItems.syringe_empty, 1, 0), false); } - + VersatileConfig.applyPotionSickness(player, 5); } } @@ -77,7 +77,7 @@ public class ItemSyringe extends Item { if(!player.inventory.addItemStackToInventory(new ItemStack(ModItems.syringe_empty))) { player.dropPlayerItemWithRandomChoice(new ItemStack(ModItems.syringe_empty, 1, 0), false); } - + VersatileConfig.applyPotionSickness(player, 50); } } @@ -116,7 +116,7 @@ public class ItemSyringe extends Item { if(!player.inventory.addItemStackToInventory(new ItemStack(ModItems.syringe_metal_empty))) { player.dropPlayerItemWithRandomChoice(new ItemStack(ModItems.syringe_metal_empty, 1, 0), false); } - + VersatileConfig.applyPotionSickness(player, 5); } } @@ -135,7 +135,7 @@ public class ItemSyringe extends Item { if(!player.inventory.addItemStackToInventory(new ItemStack(ModItems.syringe_metal_empty))) { player.dropPlayerItemWithRandomChoice(new ItemStack(ModItems.syringe_metal_empty, 1, 0), false); } - + VersatileConfig.applyPotionSickness(player, 5); } } @@ -155,7 +155,7 @@ public class ItemSyringe extends Item { if(!player.inventory.addItemStackToInventory(new ItemStack(ModItems.syringe_metal_empty))) { player.dropPlayerItemWithRandomChoice(new ItemStack(ModItems.syringe_metal_empty, 1, 0), false); } - + VersatileConfig.applyPotionSickness(player, 5); } } @@ -175,7 +175,7 @@ public class ItemSyringe extends Item { if(!player.inventory.addItemStackToInventory(new ItemStack(ModItems.syringe_metal_empty))) { player.dropPlayerItemWithRandomChoice(new ItemStack(ModItems.syringe_metal_empty, 1, 0), false); } - + VersatileConfig.applyPotionSickness(player, 15); } } @@ -193,7 +193,7 @@ public class ItemSyringe extends Item { player.removePotionEffect(Potion.weakness.id); player.removePotionEffect(Potion.wither.id); player.removePotionEffect(HbmPotion.radiation.id); - + VersatileConfig.applyPotionSickness(player, 15); stack.stackSize--; @@ -283,18 +283,17 @@ public class ItemSyringe extends Item { return stack; IFillableItem fillable = (IFillableItem) jetpack.getItem(); - + if(!fillable.acceptsFluid(Fluids.KEROSENE, jetpack)) return stack; - - fillable.tryFill(Fluids.KEROSENE, 1000, jetpack); - + + if(fillable.tryFill(Fluids.KEROSENE, 1000, jetpack) < 1000) { + world.playSoundAtEntity(player, "hbm:item.jetpackTank", 1.0F, 1.0F); + stack.stackSize--; + } + if(jetpack.getItem() != player.inventory.armorInventory[2].getItem()) ArmorModHandler.applyMod(player.inventory.armorInventory[2], jetpack); - - world.playSoundAtEntity(player, "hbm:item.jetpackTank", 1.0F, 1.0F); - - stack.stackSize--; } } @@ -386,11 +385,11 @@ public class ItemSyringe extends Item { if(this == ModItems.syringe_awesome && !VersatileConfig.hasPotionSickness(entity)) { if(!world.isRemote) { - + if(entity instanceof EntityCow) { - + entity.addPotionEffect(new PotionEffect(HbmPotion.bang.id, 40, 0)); - + } else { entity.addPotionEffect(new PotionEffect(Potion.regeneration.id, 50 * 20, 9)); entity.addPotionEffect(new PotionEffect(Potion.resistance.id, 50 * 20, 9)); @@ -592,7 +591,7 @@ public class ItemSyringe extends Item { if(this == ModItems.gun_kit_2) { list.add("Repairs all weapons in hotbar by 50%"); } - + if(this == ModItems.syringe_mkunicorn) { list.add(EnumChatFormatting.RED + "?"); } diff --git a/src/main/java/com/hbm/items/tool/ItemWandS.java b/src/main/java/com/hbm/items/tool/ItemWandS.java index 303a3114f..2de5998fb 100644 --- a/src/main/java/com/hbm/items/tool/ItemWandS.java +++ b/src/main/java/com/hbm/items/tool/ItemWandS.java @@ -1,7 +1,156 @@ package com.hbm.items.tool; +import java.util.Date; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.text.DateFormat; +import java.text.SimpleDateFormat; + +import com.hbm.blocks.ModBlocks; +import com.hbm.util.BobMathUtil; +import com.hbm.util.Tuple.Pair; +import com.hbm.world.gen.NBTStructure; + +import net.minecraft.block.Block; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.ChatComponentText; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.world.World; public class ItemWandS extends Item { - -} + + private static final DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd_HH.mm.ss"); + + @Override + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean bool) { + list.add("Creative-only item"); + list.add("\"Replication breeds decadence\""); + list.add("(Saves an area defined by two right-clicks,"); + list.add("adds a block to the blacklist by crouch right-clicking!)"); + + if(stack.stackTagCompound != null) { + int px = stack.stackTagCompound.getInteger("x"); + int py = stack.stackTagCompound.getInteger("y"); + int pz = stack.stackTagCompound.getInteger("z"); + + if(px != 0 || py != 0 || pz != 0) { + list.add(EnumChatFormatting.AQUA + "From: " + px + ", " + py + ", " + pz); + } else { + list.add(EnumChatFormatting.AQUA + "No start position set"); + } + + Set> blocks = getBlocks(stack); + + if(blocks.size() > 0) { + list.add("Blacklist:"); + for(Pair block : blocks) { + list.add(EnumChatFormatting.RED + "- " + block.key.getUnlocalizedName()); + } + } + } + } + + // why the fuck ye'd leave this whole thing obfuscated is beyond me + @Override + public boolean onItemUse(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int side, float fx, float fy, float fz) { + if(stack.stackTagCompound == null) { + stack.stackTagCompound = new NBTTagCompound(); + } + + if(player.isSneaking()) { + Pair target = new Pair(world.getBlock(x, y, z), world.getBlockMetadata(x, y, z)); + Set> blocks = getBlocks(stack); + + if(blocks.contains(target)) { + blocks.remove(target); + if(world.isRemote) player.addChatMessage(new ChatComponentText("Removed from blacklist " + target.key.getUnlocalizedName())); + } else { + blocks.add(target); + if(world.isRemote) player.addChatMessage(new ChatComponentText("Added to blacklist " + target.key.getUnlocalizedName())); + } + + setBlocks(stack, blocks); + + } else { + int px = stack.stackTagCompound.getInteger("x"); + int py = stack.stackTagCompound.getInteger("y"); + int pz = stack.stackTagCompound.getInteger("z"); + + if(px == 0 && py == 0 && pz == 0) { + setPosition(stack, x, y, z); + + if(world.isRemote) player.addChatMessage(new ChatComponentText("First position set!")); + } else { + setPosition(stack, 0, 0, 0); + + Set> blocks = getBlocks(stack); + blocks.add(new Pair(Blocks.air, 0)); + blocks.add(new Pair(ModBlocks.spotlight_beam, 0)); + + String filename = "structure_" + dateFormat.format(new Date()).toString() + ".nbt"; + + NBTStructure.saveArea(filename, world, x, y, z, px, py, pz, blocks); + + if(world.isRemote) player.addChatMessage(new ChatComponentText("Structure saved to: .minecraft/structures/" + filename)); + } + } + + return true; + } + + private void setPosition(ItemStack stack, int x, int y, int z) { + stack.stackTagCompound.setInteger("x", x); + stack.stackTagCompound.setInteger("y", y); + stack.stackTagCompound.setInteger("z", z); + } + + private Set> getBlocks(ItemStack stack) { + if(stack.stackTagCompound == null) { + return new HashSet<>(); + } + + int[] blockIds = stack.stackTagCompound.getIntArray("blocks"); + int[] metas = stack.stackTagCompound.getIntArray("metas"); + Set> blocks = new HashSet<>(blockIds.length); + + for(int i = 0; i < blockIds.length; i++) { + blocks.add(new Pair(Block.getBlockById(blockIds[i]), metas[i])); + } + + return blocks; + } + + @SuppressWarnings("unchecked") + private void setBlocks(ItemStack stack, Set> blocks) { + if(stack.stackTagCompound == null) { + stack.stackTagCompound = new NBTTagCompound(); + } + + stack.stackTagCompound.setIntArray("blocks", BobMathUtil.collectionToIntArray(blocks, i -> Block.getIdFromBlock(((Pair)i).getKey()))); + stack.stackTagCompound.setIntArray("metas", BobMathUtil.collectionToIntArray(blocks, i -> ((Pair)i).getValue())); + } + + @Override + public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player) { + if(stack.stackTagCompound == null) { + stack.stackTagCompound = new NBTTagCompound(); + } + + if(player.isSneaking()) { + stack.stackTagCompound.setIntArray("blocks", new int[0]); + stack.stackTagCompound.setIntArray("metas", new int[0]); + + if(world.isRemote) { + player.addChatMessage(new ChatComponentText("Cleared blacklist")); + } + } + + return stack; + } + +} \ No newline at end of file diff --git a/src/main/java/com/hbm/lib/HbmWorld.java b/src/main/java/com/hbm/lib/HbmWorld.java index 3cd40d0ba..ed4ca9208 100644 --- a/src/main/java/com/hbm/lib/HbmWorld.java +++ b/src/main/java/com/hbm/lib/HbmWorld.java @@ -1,6 +1,7 @@ package com.hbm.lib; import com.hbm.world.gen.MapGenNTMFeatures; +import com.hbm.world.gen.NBTStructure; import com.hbm.world.gen.NTMWorldGenerator; import com.hbm.world.gen.component.*; import com.hbm.world.gen.component.BunkerComponents.BunkerStart; @@ -18,9 +19,6 @@ public class HbmWorld { public static NTMWorldGenerator worldGenerator; public static void initWorldGen() { - - //MapGenStructureIO.registerStructure(StructureStartTest.class, "HFR_STRUCTURE"); - //MapGenStructureIO.func_143031_a(StructureComponentTest.class, "HFR_COMPONENT"); MapGenStructureIO.registerStructure(MapGenNTMFeatures.Start.class, "NTMFeatures"); MapGenStructureIO.registerStructure(BunkerStart.class, "NTMBunker"); registerNTMFeatures(); @@ -30,19 +28,20 @@ public class HbmWorld { worldGenerator = new NTMWorldGenerator(); registerWorldGen(worldGenerator, 1); //Ideally, move everything over from HbmWorldGen to NTMWorldGenerator MinecraftForge.EVENT_BUS.register(worldGenerator); - //registerWorldGen(new WorldGenTest(), 1); + + NBTStructure.register(); } - public static void registerWorldGen(IWorldGenerator nukerWorldGen, int weightedProbability) { + private static void registerWorldGen(IWorldGenerator nukerWorldGen, int weightedProbability) { GameRegistry.registerWorldGenerator(nukerWorldGen, weightedProbability); } /** Register structures in MapGenStructureIO */ - public static void registerNTMFeatures() { + private static void registerNTMFeatures() { CivilianFeatures.registerComponents(); OfficeFeatures.registerComponents(); RuinFeatures.registerComponents(); BunkerComponents.registerComponents(); MapGenStructureIO.func_143031_a(SiloComponent.class, "NTMSiloComponent"); } -} +} \ No newline at end of file diff --git a/src/main/java/com/hbm/lib/HbmWorldGen.java b/src/main/java/com/hbm/lib/HbmWorldGen.java index d3ed3f571..42f7e616a 100644 --- a/src/main/java/com/hbm/lib/HbmWorldGen.java +++ b/src/main/java/com/hbm/lib/HbmWorldGen.java @@ -28,7 +28,6 @@ import net.minecraft.block.Block; import net.minecraft.init.Blocks; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntityChest; -import net.minecraft.tileentity.TileEntitySkull; import net.minecraft.util.WeightedRandom; import net.minecraft.util.WeightedRandomChestContent; import net.minecraft.world.World; @@ -260,23 +259,6 @@ public class HbmWorldGen implements IWorldGenerator { } } - if(!biome.canSpawnLightningBolt() && biome.temperature >= 2F) { - if(WorldConfig.vertibirdStructure > 0 && rand.nextInt(WorldConfig.vertibirdStructure) == 0) { - for(int a = 0; a < 1; a++) { - int x = i + rand.nextInt(16); - int z = j + rand.nextInt(16); - int y = world.getHeightValue(x, z); - - if(rand.nextInt(2) == 0) { - new Vertibird().generate(world, rand, x, y, z); - } else { - new CrashedVertibird().generate(world, rand, x, y, z); - } - - } - } - } - if(WorldConfig.dungeonStructure > 0 && rand.nextInt(WorldConfig.dungeonStructure) == 0) { int x = i + rand.nextInt(16); int y = rand.nextInt(256); @@ -545,37 +527,6 @@ public class HbmWorldGen implements IWorldGenerator { } - if (WorldConfig.meteorStructure > 0 && rand.nextInt(WorldConfig.meteorStructure) == 0 && biome != BiomeGenBase.ocean && biome != BiomeGenBase.deepOcean) { - int x = i + rand.nextInt(16) + 8; - int z = j + rand.nextInt(16) + 8; - - CellularDungeonFactory.meteor.generate(world, x, 10, z, rand); - - if(GeneralConfig.enableDebugMode) - MainRegistry.logger.info("[Debug] Successfully spawned meteor dungeon at " + x + " 10 " + z); - - int y = world.getHeightValue(x, z); - - for(int f = 0; f < 3; f++) - world.setBlock(x, y + f, z, ModBlocks.meteor_pillar); - world.setBlock(x, y + 3, z, ModBlocks.meteor_brick_chiseled); - - for(int f = 0; f < 10; f++) { - - x = i + rand.nextInt(65) - 32; - z = j + rand.nextInt(65) - 32; - y = world.getHeightValue(x, z); - - if(world.getBlock(x, y - 1, z).canPlaceTorchOnTop(world, x, y - 1, z)) { - world.setBlock(x, y, z, Blocks.skull, 1, 2); - TileEntitySkull skull = (TileEntitySkull)world.getTileEntity(x, y, z); - - if(skull != null) - skull.func_145903_a(rand.nextInt(16)); - } - } - } - if((biome == BiomeGenBase.jungle || biome == BiomeGenBase.jungleEdge || biome == BiomeGenBase.jungleHills) && WorldConfig.jungleStructure > 0 && rand.nextInt(WorldConfig.jungleStructure) == 0) { int x = i + rand.nextInt(16); diff --git a/src/main/java/com/hbm/main/ClientProxy.java b/src/main/java/com/hbm/main/ClientProxy.java index 04feaf810..ed344f1e7 100644 --- a/src/main/java/com/hbm/main/ClientProxy.java +++ b/src/main/java/com/hbm/main/ClientProxy.java @@ -157,7 +157,7 @@ public class ClientProxy extends ServerProxy { registerBlockRenderer(); Jars.initJars(); - + ((IReloadableResourceManager) Minecraft.getMinecraft().getResourceManager()).registerReloadListener(new QMAWLoader()); if(GeneralConfig.enableSoundExtension) { @@ -376,6 +376,7 @@ public class ClientProxy extends ServerProxy { ClientRegistry.bindTileEntitySpecialRenderer(TileEntitySubstation.class, new RenderSubstation()); //chargers ClientRegistry.bindTileEntitySpecialRenderer(TileEntityCharger.class, new RenderCharger()); + ClientRegistry.bindTileEntitySpecialRenderer(TileEntityRefueler.class, new RenderRefueler()); //DecoContainer ClientRegistry.bindTileEntitySpecialRenderer(TileEntityFileCabinet.class, new RenderFileCabinet()); //multiblocks @@ -830,6 +831,8 @@ public class ClientProxy extends ServerProxy { RenderingRegistry.registerBlockHandler(new RenderRBMKReflector()); RenderingRegistry.registerBlockHandler(new RenderRBMKControl()); RenderingRegistry.registerBlockHandler(new RenderPribris()); + + RenderingRegistry.registerBlockHandler(new RenderBlockWand()); } @Override @@ -1725,6 +1728,22 @@ public class ClientProxy extends ServerProxy { } } + if("fluidfill".equals(type)) { + double mX = data.getDouble("mX"); + double mY = data.getDouble("mY"); + double mZ = data.getDouble("mZ"); + + EntityFX fx = new net.minecraft.client.particle.EntityCritFX(world, x, y, z, mX, mY, mZ); + fx.nextTextureIndexX(); + + if(data.hasKey("color")) { + Color color = new Color(data.getInteger("color")); + fx.setRBGColorF(color.getRed() / 255F, color.getGreen() / 255F, color.getBlue() / 255F); + } + + Minecraft.getMinecraft().effectRenderer.addEffect(fx); + } + if("deadleaf".equals(type)) { if(particleSetting == 0 || (particleSetting == 1 && rand.nextBoolean())) Minecraft.getMinecraft().effectRenderer.addEffect(new ParticleDeadLeaf(man, world, x, y, z)); diff --git a/src/main/java/com/hbm/main/CraftingManager.java b/src/main/java/com/hbm/main/CraftingManager.java index 61431fc45..4ab6a5c79 100644 --- a/src/main/java/com/hbm/main/CraftingManager.java +++ b/src/main/java/com/hbm/main/CraftingManager.java @@ -11,6 +11,7 @@ import com.hbm.config.GeneralConfig; import com.hbm.crafting.*; import com.hbm.crafting.handlers.*; import com.hbm.inventory.OreDictManager; +import com.hbm.inventory.OreDictManager.DictFrame; import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.material.MaterialShapes; import com.hbm.inventory.material.Mats; @@ -913,6 +914,7 @@ public class CraftingManager { addRecipeAuto(new ItemStack(ModBlocks.charger), new Object[] { "G", "S", "C", 'G', Items.glowstone_dust, 'S', STEEL.ingot(), 'C', ModItems.coil_copper }); addRecipeAuto(new ItemStack(ModBlocks.charger, 16), new Object[] { "G", "S", "C", 'G', Blocks.glowstone, 'S', STEEL.block(), 'C', ModItems.coil_copper_torus }); + addRecipeAuto(new ItemStack(ModBlocks.refueler), new Object[] { "SS", "HC", "SS", 'S', TI.plate(), 'H', DictFrame.fromOne(ModItems.part_generic, EnumPartType.PISTON_HYDRAULIC), 'C', DictFrame.fromOne(ModItems.circuit, EnumCircuitType.BASIC) }); addRecipeAuto(new ItemStack(ModBlocks.press_preheater), new Object[] { "CCC", "SLS", "TST", 'C', CU.plate(), 'S', Blocks.stone, 'L', Fluids.LAVA.getDict(1000), 'T', W.ingot() }); addRecipeAuto(new ItemStack(ModItems.fluid_identifier_multi), new Object[] { "D", "C", "P", 'D', "dye", 'C', DictFrame.fromOne(ModItems.circuit, EnumCircuitType.ANALOG), 'P', IRON.plate() }); diff --git a/src/main/java/com/hbm/main/ResourceManager.java b/src/main/java/com/hbm/main/ResourceManager.java index 14974adb9..939952c38 100644 --- a/src/main/java/com/hbm/main/ResourceManager.java +++ b/src/main/java/com/hbm/main/ResourceManager.java @@ -391,6 +391,7 @@ public class ResourceManager { //Charging Station public static final IModelCustom charger = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/blocks/charger.obj")); + public static final IModelCustom refueler = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/blocks/refueler.obj")); //DecoContainer (File Cabinet for now) public static final IModelCustom file_cabinet = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/file_cabinet.obj")); @@ -805,6 +806,7 @@ public class ResourceManager { //Charger public static final ResourceLocation charger_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/charger.png"); + public static final ResourceLocation refueler_tex = new ResourceLocation(RefStrings.MODID, "textures/models/machines/refueler.png"); //DecoContainer public static final ResourceLocation file_cabinet_tex = new ResourceLocation(RefStrings.MODID, "textures/models/file_cabinet.png"); diff --git a/src/main/java/com/hbm/main/StructureManager.java b/src/main/java/com/hbm/main/StructureManager.java new file mode 100644 index 000000000..eca4c4853 --- /dev/null +++ b/src/main/java/com/hbm/main/StructureManager.java @@ -0,0 +1,65 @@ +package com.hbm.main; + +import com.hbm.lib.RefStrings; +import com.hbm.world.gen.NBTStructure; + +import net.minecraft.util.ResourceLocation; + +public class StructureManager { + + // METEOR DUNGEON + public static final NBTStructure meteor_spike = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/meteor/meteor-spike.nbt")); + public static final NBTStructure meteor_core = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/meteor/meteor-core.nbt")); + public static final NBTStructure meteor_corner = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/meteor/meteor-corner.nbt")); + public static final NBTStructure meteor_t = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/meteor/meteor-t.nbt")); + public static final NBTStructure meteor_stairs = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/meteor/meteor-stairs.nbt")); + public static final NBTStructure meteor_fallback = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/meteor/meteor-fallback.nbt")); + + public static final NBTStructure meteor_3_bale = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/meteor/loot3x3/meteor-3-bale.nbt")); + public static final NBTStructure meteor_3_blank = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/meteor/loot3x3/meteor-3-blank.nbt")); + public static final NBTStructure meteor_3_block = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/meteor/loot3x3/meteor-3-block.nbt")); + public static final NBTStructure meteor_3_crab = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/meteor/loot3x3/meteor-3-crab.nbt")); + public static final NBTStructure meteor_3_crab_tesla = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/meteor/loot3x3/meteor-3-crab-tesla.nbt")); + public static final NBTStructure meteor_3_crate = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/meteor/loot3x3/meteor-3-crate.nbt")); + public static final NBTStructure meteor_3_dirt = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/meteor/loot3x3/meteor-3-dirt.nbt")); + public static final NBTStructure meteor_3_lead = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/meteor/loot3x3/meteor-3-lead.nbt")); + public static final NBTStructure meteor_3_ooze = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/meteor/loot3x3/meteor-3-ooze.nbt")); + public static final NBTStructure meteor_3_pillar = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/meteor/loot3x3/meteor-3-pillar.nbt")); + public static final NBTStructure meteor_3_star = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/meteor/loot3x3/meteor-3-star.nbt")); + public static final NBTStructure meteor_3_tesla = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/meteor/loot3x3/meteor-3-tesla.nbt")); + public static final NBTStructure meteor_3_book = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/meteor/loot3x3/meteor-3-book.nbt")); + public static final NBTStructure meteor_3_mku = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/meteor/loot3x3/meteor-3-mku.nbt")); + public static final NBTStructure meteor_3_statue = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/meteor/loot3x3/meteor-3-statue.nbt")); + public static final NBTStructure meteor_3_glow = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/meteor/loot3x3/meteor-3-glow.nbt")); + + public static final NBTStructure meteor_room_base_end = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/meteor/room10/room-base-end.nbt")); + public static final NBTStructure meteor_room_base_thru = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/meteor/room10/room-base-thru.nbt")); + + public static final NBTStructure meteor_room_balcony = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/meteor/room10/room-balcony.nbt")); + public static final NBTStructure meteor_room_basic = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/meteor/room10/room-basic.nbt")); + public static final NBTStructure meteor_room_dragon = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/meteor/room10/room-dragon.nbt")); + public static final NBTStructure meteor_room_ladder = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/meteor/room10/room-ladder.nbt")); + public static final NBTStructure meteor_room_ooze = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/meteor/room10/room-ooze.nbt")); + public static final NBTStructure meteor_room_split = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/meteor/room10/room-split.nbt")); + public static final NBTStructure meteor_room_stairs = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/meteor/room10/room-stairs.nbt")); + public static final NBTStructure meteor_room_triple = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/meteor/room10/room-triple.nbt")); + public static final NBTStructure meteor_room_fallback = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/meteor/room10/room-fallback.nbt")); + + public static final NBTStructure meteor_dragon_chest = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/meteor/room10/headloot/loot-chest.nbt")); + public static final NBTStructure meteor_dragon_tesla = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/meteor/room10/headloot/loot-tesla.nbt")); + public static final NBTStructure meteor_dragon_trap = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/meteor/room10/headloot/loot-trap.nbt")); + public static final NBTStructure meteor_dragon_crate_crab = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/meteor/room10/headloot/loot-crate-crab.nbt")); + public static final NBTStructure meteor_dragon_fallback = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/meteor/room10/headloot/loot-fallback.nbt")); + + + + + public static final NBTStructure vertibird = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/vertibird.nbt")); + public static final NBTStructure crashed_vertibird = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/crashed-vertibird.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")); + // public static final NBTStructure test_jigsaw_hall = new NBTStructure(new ResourceLocation(RefStrings.MODID, "structures/test-jigsaw-hall.nbt")); + +} \ No newline at end of file diff --git a/src/main/java/com/hbm/module/ModulePatternMatcher.java b/src/main/java/com/hbm/module/ModulePatternMatcher.java index 279a2c1e9..ecde925fa 100644 --- a/src/main/java/com/hbm/module/ModulePatternMatcher.java +++ b/src/main/java/com/hbm/module/ModulePatternMatcher.java @@ -2,18 +2,21 @@ package com.hbm.module; import java.util.List; +import com.hbm.items.special.ItemBedrockOreNew; import com.hbm.util.BufferUtil; import com.hbm.util.ItemStackUtil; import io.netty.buffer.ByteBuf; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.EnumChatFormatting; import net.minecraft.world.World; public class ModulePatternMatcher { public static final String MODE_EXACT = "exact"; public static final String MODE_WILDCARD = "wildcard"; + public static final String MODE_BEDROCK = "bedrock"; public String[] modes; public ModulePatternMatcher() { @@ -41,7 +44,9 @@ public class ModulePatternMatcher { if(iterateAndCheck(names, i ,"nugget")) return; if(iterateAndCheck(names, i ,"plate")) return; - if(stack.getHasSubtypes()) { + if(stack.getItem() instanceof ItemBedrockOreNew) { + modes[i] = MODE_BEDROCK; + } else if(stack.getHasSubtypes()) { modes[i] = MODE_EXACT; } else { modes[i] = MODE_WILDCARD; @@ -68,8 +73,10 @@ public class ModulePatternMatcher { modes[i] = null; return; } - - if(stack.getHasSubtypes()) { + + if(stack.getItem() instanceof ItemBedrockOreNew) { + modes[i] = MODE_BEDROCK; + } else if(stack.getHasSubtypes()) { modes[i] = MODE_EXACT; } else { modes[i] = MODE_WILDCARD; @@ -88,6 +95,12 @@ public class ModulePatternMatcher { if(modes[i] == null) { modes[i] = MODE_EXACT; } else if(MODE_EXACT.equals(modes[i])) { + if(pattern.getItem() instanceof ItemBedrockOreNew) { + modes[i] = MODE_BEDROCK; + } else { + modes[i] = MODE_WILDCARD; + } + } else if(MODE_BEDROCK.equals(modes[i])) { modes[i] = MODE_WILDCARD; } else if(MODE_WILDCARD.equals(modes[i])) { @@ -128,6 +141,10 @@ public class ModulePatternMatcher { switch(mode) { case MODE_EXACT: return input.isItemEqual(filter) && ItemStack.areItemStackTagsEqual(input, filter); case MODE_WILDCARD: return input.getItem() == filter.getItem() && ItemStack.areItemStackTagsEqual(input, filter); + case MODE_BEDROCK: + if(input.getItem() != filter.getItem()) return false; + if(!(input.getItem() instanceof ItemBedrockOreNew)) return false; + return ((ItemBedrockOreNew)input.getItem()).getGrade(input.getItemDamage()) == ((ItemBedrockOreNew)filter.getItem()).getGrade(filter.getItemDamage()); default: List keys = ItemStackUtil.getOreDictNames(input); return keys.contains(mode); @@ -165,4 +182,14 @@ public class ModulePatternMatcher { modes[i] = BufferUtil.readString(buf); } } + + public static String getLabel(String mode) { + switch(mode) { + case MODE_EXACT: return EnumChatFormatting.YELLOW + "Item and meta match"; + case MODE_WILDCARD: return EnumChatFormatting.YELLOW + "Item matches"; + case MODE_BEDROCK: return EnumChatFormatting.YELLOW + "Item and bedrock grade match"; + default: return EnumChatFormatting.YELLOW + "Ore dict key matches: " + mode; + } + } + } diff --git a/src/main/java/com/hbm/render/block/RenderBlockSideRotation.java b/src/main/java/com/hbm/render/block/RenderBlockSideRotation.java index 785cac0ea..036bbd914 100644 --- a/src/main/java/com/hbm/render/block/RenderBlockSideRotation.java +++ b/src/main/java/com/hbm/render/block/RenderBlockSideRotation.java @@ -14,13 +14,13 @@ public class RenderBlockSideRotation implements ISimpleBlockRenderingHandler { @Override public void renderInventoryBlock(Block block, int metadata, int modelId, RenderBlocks renderer) { - + Tessellator tessellator = Tessellator.instance; block.setBlockBoundsForItemRender(); renderer.setRenderBoundsFromBlock(block); GL11.glRotatef(90.0F, 0.0F, 1.0F, 0.0F); GL11.glTranslatef(-0.5F, -0.5F, -0.5F); - + tessellator.startDrawingQuads(); tessellator.setNormal(0.0F, -1.0F, 0.0F); renderer.renderFaceYNeg(block, 0.0D, 0.0D, 0.0D, renderer.getBlockIconFromSideAndMetadata(block, 0, metadata)); @@ -45,7 +45,7 @@ public class RenderBlockSideRotation implements ISimpleBlockRenderingHandler { tessellator.setNormal(1.0F, 0.0F, 0.0F); renderer.renderFaceXPos(block, 0.0D, 0.0D, 0.0D, renderer.getBlockIconFromSideAndMetadata(block, 5, metadata)); tessellator.draw(); - + GL11.glTranslatef(0.5F, 0.5F, 0.5F); } @@ -55,20 +55,32 @@ public class RenderBlockSideRotation implements ISimpleBlockRenderingHandler { Tessellator tessellator = Tessellator.instance; tessellator.setBrightness(block.getMixedBrightnessForBlock(world, x, y, z)); - + if(!(block instanceof IBlockSideRotation)) { renderer.renderStandardBlock(block, x, y, z); return true; } - + IBlockSideRotation rot = (IBlockSideRotation) block; - + + // I'm almost entirely convinced that MCP mistranslated these properties because north/south and west/east are fucking SWAPPED + // YEP, they fucking did, god fucking damn it. I manually figured out the correct side for each uv face property to resolve YAYY + renderer.uvRotateBottom = rot.getRotationFromSide(world, x, y, z, 0); renderer.uvRotateTop = rot.getRotationFromSide(world, x, y, z, 1); + renderer.uvRotateNorth = rot.getRotationFromSide(world, x, y, z, 5); + renderer.uvRotateSouth = rot.getRotationFromSide(world, x, y, z, 4); + renderer.uvRotateWest = rot.getRotationFromSide(world, x, y, z, 2); + renderer.uvRotateEast = rot.getRotationFromSide(world, x, y, z, 3); renderer.setRenderBounds(0.0, 0.0, 0.0, 1.0, 1.0, 1.0); renderer.renderStandardBlock(block, x, y, z); - + + renderer.uvRotateBottom = 0; renderer.uvRotateTop = 0; + renderer.uvRotateNorth = 0; + renderer.uvRotateSouth = 0; + renderer.uvRotateWest = 0; + renderer.uvRotateEast = 0; return true; } diff --git a/src/main/java/com/hbm/render/block/RenderBlockWand.java b/src/main/java/com/hbm/render/block/RenderBlockWand.java new file mode 100644 index 000000000..d6d22efe2 --- /dev/null +++ b/src/main/java/com/hbm/render/block/RenderBlockWand.java @@ -0,0 +1,37 @@ +package com.hbm.render.block; + +import com.hbm.blocks.generic.BlockWand; + +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 RenderBlockWand implements ISimpleBlockRenderingHandler { + + @Override + public void renderInventoryBlock(Block block, int metadata, int modelId, RenderBlocks renderer) { + + } + + @Override + public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, RenderBlocks renderer) { + renderer.renderFromInside = true; + renderer.renderStandardBlock(block, x, y, z); + renderer.renderFromInside = false; + renderer.renderStandardBlock(block, x, y, z); + + return true; + } + + @Override + public boolean shouldRender3DInInventory(int modelId) { + return false; + } + + @Override + public int getRenderId() { + return BlockWand.renderID; + } + +} \ No newline at end of file diff --git a/src/main/java/com/hbm/render/tileentity/RenderBobble.java b/src/main/java/com/hbm/render/tileentity/RenderBobble.java index d5039e39b..08dfa1283 100644 --- a/src/main/java/com/hbm/render/tileentity/RenderBobble.java +++ b/src/main/java/com/hbm/render/tileentity/RenderBobble.java @@ -49,9 +49,14 @@ public class RenderBobble extends TileEntitySpecialRenderer { public static final ResourceLocation bobble_microwave = new ResourceLocation(RefStrings.MODID, "textures/models/trinkets/microwave.png"); public static final ResourceLocation bobble_peep = new ResourceLocation(RefStrings.MODID, "textures/models/trinkets/peep.png"); public static final ResourceLocation bobble_mellow = new ResourceLocation(RefStrings.MODID, "textures/models/trinkets/mellowrpg8.png"); + public static final ResourceLocation bobble_mellow_glow = new ResourceLocation(RefStrings.MODID, "textures/models/trinkets/mellowrpg8_glow.png"); + + private long time; @Override public void renderTileEntityAt(TileEntity tile, double x, double y, double z, float intero) { + time = System.currentTimeMillis(); + GL11.glPushMatrix(); GL11.glTranslated(x + 0.5, y, z + 0.5); @@ -288,8 +293,8 @@ public class RenderBobble extends TileEntitySpecialRenderer { GL11.glPushMatrix(); GL11.glTranslated(0, 1.75, 0); - GL11.glRotated(Math.sin(System.currentTimeMillis() * speed) * amplitude, 1, 0, 0); - GL11.glRotated(Math.sin(System.currentTimeMillis() * speed + (Math.PI * 0.5)) * amplitude, 0, 0, 1); + GL11.glRotated(Math.sin(time * speed) * amplitude, 1, 0, 0); + GL11.glRotated(Math.sin(time * speed + (Math.PI * 0.5)) * amplitude, 0, 0, 1); GL11.glRotated(rotHead[0], 1, 0, 0); GL11.glRotated(rotHead[1], 0, 1, 0); @@ -342,7 +347,7 @@ public class RenderBobble extends TileEntitySpecialRenderer { GL11.glAlphaFunc(GL11.GL_GREATER, 0); OpenGlHelper.glBlendFunc(770, 771, 1, 0); - GL11.glColor4f(1.0F, 1.0F, 0.0F, 0.1F + (float) Math.sin(System.currentTimeMillis() * 0.001D) * 0.05F); + GL11.glColor4f(1.0F, 1.0F, 0.0F, 0.1F + (float) Math.sin(time * 0.001D) * 0.05F); bobble.renderPart("PelletShine"); GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); @@ -365,8 +370,8 @@ public class RenderBobble extends TileEntitySpecialRenderer { GL11.glPushMatrix(); GL11.glTranslated(0, 0.75, 0); - GL11.glRotated(Math.sin(System.currentTimeMillis() * speed) * amplitude, 1, 0, 0); - GL11.glRotated(Math.sin(System.currentTimeMillis() * speed + (Math.PI * 0.5)) * amplitude, 0, 0, 1); + GL11.glRotated(Math.sin(time * speed) * amplitude, 1, 0, 0); + GL11.glRotated(Math.sin(time * speed + (Math.PI * 0.5)) * amplitude, 0, 0, 1); GL11.glTranslated(0, -0.75, 0); GL11.glDisable(GL11.GL_CULL_FACE); @@ -452,11 +457,13 @@ public class RenderBobble extends TileEntitySpecialRenderer { //shotgun.renderDud(0.0625F); break; case MELLOW: + GL11.glPushAttrib(GL11.GL_LIGHTING_BIT); + OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, 240F, 240F); + bindTexture(bobble_mellow_glow); + renderGuy(type); GL11.glEnable(GL11.GL_BLEND); GL11.glAlphaFunc(GL11.GL_GREATER, 0); GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE); - GL11.glPushAttrib(GL11.GL_LIGHTING_BIT); - OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, 240F, 240F); this.bindTexture(lamp); bobble.renderPart("Fluoro"); this.bindTexture(glow); diff --git a/src/main/java/com/hbm/render/tileentity/RenderRefueler.java b/src/main/java/com/hbm/render/tileentity/RenderRefueler.java new file mode 100644 index 000000000..b8c30a352 --- /dev/null +++ b/src/main/java/com/hbm/render/tileentity/RenderRefueler.java @@ -0,0 +1,103 @@ +package com.hbm.render.tileentity; + +import java.awt.Color; +import java.nio.DoubleBuffer; + +import org.lwjgl.opengl.GL11; + +import com.hbm.blocks.ModBlocks; +import com.hbm.main.ResourceManager; +import com.hbm.render.item.ItemRenderBase; +import com.hbm.tileentity.machine.TileEntityRefueler; + +import net.minecraft.client.renderer.GLAllocation; +import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; +import net.minecraft.item.Item; +import net.minecraft.tileentity.TileEntity; +import net.minecraftforge.client.IItemRenderer; + +public class RenderRefueler extends TileEntitySpecialRenderer implements IItemRendererProvider { + + private static DoubleBuffer clip = null; + + @Override + public void renderTileEntityAt(TileEntity tile, double x, double y, double z, float interp) { + TileEntityRefueler refueler = (TileEntityRefueler) tile; + + GL11.glPushMatrix(); + { + + GL11.glTranslated(x + 0.5, y, z + 0.5); + GL11.glEnable(GL11.GL_LIGHTING); + GL11.glEnable(GL11.GL_CULL_FACE); + GL11.glRotatef(90, 0F, 1F, 0F); + switch(tile.getBlockMetadata()) { + case 4: GL11.glRotatef(90, 0F, 1F, 0F); break; + case 3: GL11.glRotatef(180, 0F, 1F, 0F); break; + case 5: GL11.glRotatef(270, 0F, 1F, 0F); break; + case 2: GL11.glRotatef(0, 0F, 1F, 0F); break; + } + + GL11.glShadeModel(GL11.GL_SMOOTH); + + bindTexture(ResourceManager.refueler_tex); + ResourceManager.refueler.renderPart("Fueler"); + + + if(clip == null) { + clip = GLAllocation.createDirectByteBuffer(8*4).asDoubleBuffer(); + clip.put(new double[] {0, 1, 0, -0.125 }); + clip.rewind(); + } + + GL11.glEnable(GL11.GL_CLIP_PLANE0); + GL11.glClipPlane(GL11.GL_CLIP_PLANE0, clip); + + GL11.glEnable(GL11.GL_BLEND); + GL11.glDisable(GL11.GL_TEXTURE_2D); + + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE); + + double fillLevel = refueler.prevFillLevel + (refueler.fillLevel - refueler.prevFillLevel) * interp; + GL11.glTranslated(0, (1 - fillLevel) * -0.625, 0); + + Color color = new Color(refueler.tank.getTankType().getColor()); + GL11.glColor4f(color.getRed() / 255F, color.getGreen() / 255F, color.getBlue() / 255F, 0.75F); + ResourceManager.refueler.renderPart("Fluid"); + GL11.glColor4f(1, 1, 1, 1); + + GL11.glEnable(GL11.GL_TEXTURE_2D); + GL11.glDisable(GL11.GL_BLEND); + + GL11.glDisable(GL11.GL_CLIP_PLANE0); + + GL11.glShadeModel(GL11.GL_FLAT); + + } + GL11.glPopMatrix(); + } + + @Override + public Item getItemForRenderer() { + return Item.getItemFromBlock(ModBlocks.refueler); + } + + @Override + public IItemRenderer getRenderer() { + return new ItemRenderBase() { + public void renderInventory() { + GL11.glTranslated(0, -3, 0); + GL11.glScaled(6, 6, 6); + } + public void renderCommon() { + GL11.glScaled(2, 2, 2); + GL11.glTranslated(0.5, 0, 0); + GL11.glShadeModel(GL11.GL_SMOOTH); + bindTexture(ResourceManager.refueler_tex); + ResourceManager.refueler.renderPart("Fueler"); + GL11.glShadeModel(GL11.GL_FLAT); + } + }; + } + +} diff --git a/src/main/java/com/hbm/tileentity/TileMappings.java b/src/main/java/com/hbm/tileentity/TileMappings.java index f2c4a50c0..d1cc8eaf6 100644 --- a/src/main/java/com/hbm/tileentity/TileMappings.java +++ b/src/main/java/com/hbm/tileentity/TileMappings.java @@ -15,6 +15,8 @@ import com.hbm.blocks.generic.BlockPedestal.TileEntityPedestal; import com.hbm.blocks.generic.BlockPlushie.TileEntityPlushie; import com.hbm.blocks.generic.BlockSnowglobe.TileEntitySnowglobe; import com.hbm.blocks.generic.BlockSupplyCrate.TileEntitySupplyCrate; +import com.hbm.blocks.generic.BlockWandJigsaw.TileEntityWandJigsaw; +import com.hbm.blocks.generic.BlockWandLoot.TileEntityWandLoot; import com.hbm.blocks.generic.PartEmitter.TileEntityPartEmitter; import com.hbm.blocks.machine.BlockICF.TileEntityBlockICF; import com.hbm.blocks.machine.BlockPWR.TileEntityBlockPWR; @@ -48,7 +50,7 @@ public class TileMappings { public static HashMap, String[]> map = new HashMap, String[]>(); public static List> configurables = new ArrayList>(); - + public static void writeMappings() { put(TileEntityDiFurnace.class, "tilentity_diFurnace"); put(TileEntityObjTester.class, "tilentity_objtester"); @@ -206,7 +208,7 @@ public class TileMappings { put(TileEntityMachineOrbus.class, "tileentity_orbus"); put(TileEntityGlpyhidSpawner.class, "tileentity_glyphid_spawner"); put(TileEntityCustomMachine.class, "tileentity_custom_machine"); - + put(TileEntityLoot.class, "tileentity_ntm_loot"); put(TileEntityPedestal.class, "tileentity_ntm_pedestal"); put(TileEntityBobble.class, "tileentity_ntm_bobblehead"); @@ -217,9 +219,10 @@ public class TileMappings { put(TileEntityDoorGeneric.class, "tileentity_ntm_door"); put(TileEntityCharger.class, "tileentity_ntm_charger"); - + put(TileEntityRefueler.class, "tileentity_ntm_refueler"); + put(TileEntityFileCabinet.class, "tileentity_file_cabinet"); - + put(TileEntityProxyInventory.class, "tileentity_proxy_inventory"); put(TileEntityProxyEnergy.class, "tileentity_proxy_power"); put(TileEntityProxyCombo.class, "tileentity_proxy_combo"); @@ -231,7 +234,10 @@ public class TileMappings { put(TileEntityPWRController.class, "tileentity_pwr_controller"); put(TileEntityData.class, "tileentity_data"); - + + put(TileEntityWandLoot.class, "tileentity_wand_loot"); + put(TileEntityWandJigsaw.class, "tileentity_wand_jigsaw"); + putNetwork(); putBombs(); putTurrets(); @@ -242,7 +248,7 @@ public class TileMappings { TileEntityMachineRadarNT.registerEntityClasses(); TileEntityMachineRadarNT.registerConverters(); } - + private static void putBombs() { put(TileEntityBombMulti.class, "tileentity_bombmulti"); put(TileEntityNukeGadget.class, "tilentity_nukegadget"); @@ -257,7 +263,7 @@ public class TileMappings { put(TileEntityCharge.class, "tileentity_explosive_charge"); put(TileEntityVolcanoCore.class, "tileentity_volcano_core"); } - + private static void putTurrets() { put(TileEntityTurretChekhov.class, "tileentity_turret_chekhov"); put(TileEntityTurretJeremy.class, "tileentity_turret_jeremy"); @@ -274,7 +280,7 @@ public class TileMappings { put(TileEntityTurretSentry.class, "tileentity_turret_sentry"); put(TileEntityTurretSentryDamaged.class, "tileentity_turret_sentry_damaged"); } - + private static void putMachines() { put(TileEntityHeaterFirebox.class, "tileentity_firebox"); put(TileEntityHeaterOven.class, "tileentity_heating_oven"); @@ -294,7 +300,7 @@ public class TileMappings { put(TileEntityMachinePumpSteam.class, "tileentity_steam_pump"); put(TileEntityMachinePumpElectric.class, "tileentity_electric_pump"); - + put(TileEntityFoundryMold.class, "tileentity_foundry_mold"); put(TileEntityFoundryBasin.class, "tileentity_foundry_basin"); put(TileEntityFoundryChannel.class, "tileentity_foundry_channel"); @@ -309,7 +315,7 @@ public class TileMappings { put(TileEntityDiFurnaceRTG.class, "tileentity_rtg_difurnace"); put(TileEntityMachineRadiolysis.class, "tileentity_radiolysis"); put(TileEntityMachineAutosaw.class, "tileentity_autosaw"); - + put(TileEntityCondenser.class, "tileentity_condenser"); put(TileEntityTowerSmall.class, "tileentity_cooling_tower_small"); put(TileEntityTowerLarge.class, "tileentity_cooling_tower_large"); @@ -331,12 +337,12 @@ public class TileMappings { put(TileEntityChungus.class, "tileentity_chungus"); put(TileEntityMachineCombustionEngine.class, "tileentity_combustion_engine"); - + put(TileEntityMachineAssembler.class, "tileentity_assembly_machine"); put(TileEntityMachineAssemfac.class, "tileentity_assemfac"); put(TileEntityMachineChemplant.class, "tileentity_chemical_plant"); put(TileEntityMachineChemfac.class, "tileentity_chemfac"); - + put(TileEntityMachineOilWell.class, "tileentity_derrick"); put(TileEntityMachinePumpjack.class, "tileentity_machine_pumpjack"); put(TileEntityMachineFrackingTower.class, "tileentity_fracking_tower"); @@ -352,21 +358,21 @@ public class TileMappings { put(TileEntityMachinePyroOven.class, "tileentity_pyrooven"); put(TileEntityChimneyBrick.class, "tileentity_chimney_brick"); put(TileEntityChimneyIndustrial.class, "tileentity_chimney_industrial"); - + put(TileEntityReactorZirnox.class, "tileentity_zirnox"); put(TileEntityZirnoxDestroyed.class, "tileentity_zirnox_destroyed"); put(TileEntityWatz.class, "tileentity_watz"); put(TileEntityWatzPump.class, "tileentity_watz_pump"); } - + private static void putPile() { put(TileEntityPileFuel.class, "tileentity_pile_fuel"); put(TileEntityPileSource.class, "tileentity_pile_source"); put(TileEntityPileBreedingFuel.class, "tileentity_pile_breedingfuel"); put(TileEntityPileNeutronDetector.class, "tileentity_pile_neutrondetector"); } - + private static void putRBMK() { put(TileEntityRBMKRod.class, "tileentity_rbmk_rod"); put(TileEntityRBMKRodReaSim.class, "tileentity_rbmk_rod_reasim"); @@ -386,12 +392,12 @@ public class TileMappings { put(TileEntityRBMKInlet.class, "tileentity_rbmk_inlet"); put(TileEntityRBMKOutlet.class, "tileentity_rbmk_outlet"); } - + private static void putNetwork() { put(TileEntityCableBaseNT.class, "tileentity_cable", "tileentity_wirecoated"); put(TileEntityCableSwitch.class, "tileentity_cable_switch"); put(TileEntityDiode.class, "tileentity_cable_diode"); - + put(TileEntityConnector.class, "tileentity_connector_redwire"); put(TileEntityPylon.class, "tileentity_pylon_redwire"); put(TileEntityPylonMedium.class, "tileentity_pylon_medium"); @@ -414,24 +420,24 @@ public class TileMappings { put(TileEntityRadioTorchCounter.class, "tileentity_rtty_counter"); put(TileEntityRadioTorchLogic.class, "tileentity_rtty_logic"); put(TileEntityRadioTelex.class, "tileentity_rtty_telex"); - + put(TileEntityDroneWaypoint.class, "tileentity_drone_waypoint"); put(TileEntityDroneCrate.class, "tileentity_drone_crate"); put(TileEntityDroneWaypointRequest.class, "tileentity_drone_waypoint_request"); put(TileEntityDroneDock.class, "tileentity_drone_dock"); put(TileEntityDroneProvider.class, "tileentity_drone_provider"); put(TileEntityDroneRequester.class, "tileentity_drone_requester"); - + put(TileEntityRailSwitch.class, "tileentity_rail_switch"); } - + private static void put(Class clazz, String... names) { map.put(clazz, names); /*if((IFluidSource.class.isAssignableFrom(clazz) || IFluidAcceptor.class.isAssignableFrom(clazz)) && !IFluidConnector.class.isAssignableFrom(clazz)) { LoggingUtil.errorWithHighlight(clazz.getCanonicalName() + " implements the old interfaces but not IFluidConnector!"); }*/ - + if(IConfigurableMachine.class.isAssignableFrom(clazz)) { configurables.add((Class) clazz); } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityRefueler.java b/src/main/java/com/hbm/tileentity/machine/TileEntityRefueler.java new file mode 100644 index 000000000..54b131657 --- /dev/null +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityRefueler.java @@ -0,0 +1,157 @@ +package com.hbm.tileentity.machine; + +import java.util.List; +import java.util.Random; + +import com.hbm.handler.ArmorModHandler; +import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; +import com.hbm.main.MainRegistry; +import com.hbm.tileentity.TileEntityLoadedBase; +import com.hbm.util.BobMathUtil; + +import api.hbm.fluid.IFillableItem; +import api.hbm.fluid.IFluidStandardReceiver; +import io.netty.buffer.ByteBuf; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemArmor; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.AxisAlignedBB; +import net.minecraftforge.common.util.ForgeDirection; + +public class TileEntityRefueler extends TileEntityLoadedBase implements IFluidStandardReceiver { + + public double fillLevel; + public double prevFillLevel; + + private boolean isOperating = false; + private int operatingTime; + + public FluidTank tank; + + public TileEntityRefueler() { + super(); + tank = new FluidTank(Fluids.KEROSENE, 100); + } + + @SuppressWarnings("unchecked") + @Override + public void updateEntity() { + ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata()).getOpposite(); + ForgeDirection rot = dir.getRotation(ForgeDirection.UP); + + if(!worldObj.isRemote) { + trySubscribe(tank.getTankType(), worldObj, xCoord + dir.offsetX, yCoord, zCoord + dir.offsetZ, dir); + + isOperating = false; + + List players = worldObj.getEntitiesWithinAABB(EntityPlayer.class, AxisAlignedBB.getBoundingBox(xCoord + 0.5, yCoord, zCoord + 0.5, xCoord + 0.5, yCoord + 0.5, zCoord + 0.5).expand(0.5, 0.0, 0.5)); + + for(EntityPlayer player : players) { + for(int i = 0; i < 5; i++) { + + ItemStack stack = player.getEquipmentInSlot(i); + if(stack == null) continue; + + if(fillFillable(stack)) { + isOperating = true; + } + + if(stack.getItem() instanceof ItemArmor && ArmorModHandler.hasMods(stack)) { + for(ItemStack mod : ArmorModHandler.pryMods(stack)) { + if(mod == null) continue; + + if(fillFillable(mod)) { + ArmorModHandler.applyMod(stack, mod); + isOperating = true; + } + } + } + } + } + + if(isOperating) { + if(operatingTime % 20 == 0) + worldObj.playSoundEffect(xCoord + 0.5, yCoord + 0.5, zCoord + 0.5, "random.fizz", 0.2F, 0.5F); + + operatingTime++; + } else { + operatingTime = 0; + } + + networkPackNT(150); + } else { + if(isOperating) { + Random rand = worldObj.rand; + + NBTTagCompound data = new NBTTagCompound(); + data.setString("type", "fluidfill"); + data.setInteger("color", tank.getTankType().getColor()); + data.setDouble("posX", xCoord + 0.5 + rand.nextDouble() * 0.0625 + dir.offsetX * 0.5 + rot.offsetX * 0.25); + data.setDouble("posZ", zCoord + 0.5 + rand.nextDouble() * 0.0625 + dir.offsetZ * 0.5 + rot.offsetZ * 0.25); + data.setDouble("posY", yCoord + 0.375); + data.setDouble("mX", -dir.offsetX + rand.nextGaussian() * 0.1); + data.setDouble("mZ", -dir.offsetZ + rand.nextGaussian() * 0.1); + data.setDouble("mY", 0D); + + MainRegistry.proxy.effectNT(data); + } + + prevFillLevel = fillLevel; + + double targetFill = (double)tank.getFill() / (double)tank.getMaxFill(); + fillLevel = BobMathUtil.interp(fillLevel, targetFill, targetFill > fillLevel || !isOperating ? 0.1F : 0.01F); + } + + + } + + private boolean fillFillable(ItemStack stack) { + if(stack.getItem() instanceof IFillableItem) { + IFillableItem fillable = (IFillableItem) stack.getItem(); + if(fillable.acceptsFluid(tank.getTankType(), stack)) { + int prevFill = tank.getFill(); + tank.setFill(fillable.tryFill(tank.getTankType(), tank.getFill(), stack)); + return tank.getFill() < prevFill; + } + } + + return false; + } + + @Override + public void serialize(ByteBuf buf) { + buf.writeBoolean(isOperating); + tank.serialize(buf); + } + + @Override + public void deserialize(ByteBuf buf) { + isOperating = buf.readBoolean(); + tank.deserialize(buf); + } + + @Override + public void readFromNBT(NBTTagCompound nbt) { + super.readFromNBT(nbt); + tank.readFromNBT(nbt, "t"); + } + + @Override + public void writeToNBT(NBTTagCompound nbt) { + super.writeToNBT(nbt); + tank.writeToNBT(nbt, "t"); + } + + @Override + public FluidTank[] getAllTanks() { + return new FluidTank[] { tank }; + } + + @Override + public FluidTank[] getReceivingTanks() { + return new FluidTank[] { tank }; + } + +} diff --git a/src/main/java/com/hbm/util/LootGenerator.java b/src/main/java/com/hbm/util/LootGenerator.java index b55cc92c8..b14306b9e 100644 --- a/src/main/java/com/hbm/util/LootGenerator.java +++ b/src/main/java/com/hbm/util/LootGenerator.java @@ -2,6 +2,7 @@ package com.hbm.util; import com.hbm.blocks.ModBlocks; import com.hbm.blocks.generic.BlockLoot.TileEntityLoot; +import com.hbm.crafting.handlers.MKUCraftingHandler; import com.hbm.inventory.OreDictManager.DictFrame; import com.hbm.itempool.ItemPool; import com.hbm.itempool.ItemPoolsPile; @@ -10,6 +11,7 @@ import com.hbm.items.special.ItemBookLore; import com.hbm.items.weapon.sedna.factory.GunFactory.EnumAmmo; import net.minecraft.init.Items; +import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.world.World; @@ -17,6 +19,45 @@ import java.util.Random; public class LootGenerator { + public static final String LOOT_BOOKLET = "LOOT_BOOKLET"; + public static final String LOOT_CAPNUKE = "LOOT_CAPNUKE"; + public static final String LOOT_MEDICINE = "LOOT_MEDICINE"; + public static final String LOOT_CAPSTASH = "LOOT_CAPSTASH"; + public static final String LOOT_MAKESHIFT_GUN = "LOOT_MAKESHIFT_GUN"; + public static final String LOOT_NUKE_STORAGE = "LOOT_NUKE_STORAGE"; + public static final String LOOT_BONES = "LOOT_BONES"; + public static final String LOOT_GLYPHID_HIVE = "LOOT_GLYPHID_HIVE"; + public static final String LOOT_METEOR = "LOOT_METEOR"; + + public static void applyLoot(World world, int x, int y, int z, String name) { + switch(name) { + case LOOT_BOOKLET: lootBooklet(world, x, y, z); + case LOOT_CAPNUKE: lootCapNuke(world, x, y, z); + case LOOT_MEDICINE: lootMedicine(world, x, y, z); + case LOOT_CAPSTASH: lootCapStash(world, x, y, z); + case LOOT_MAKESHIFT_GUN: lootMakeshiftGun(world, x, y, z); + case LOOT_NUKE_STORAGE: lootNukeStorage(world, x, y, z); + case LOOT_BONES: lootBones(world, x, y, z); + case LOOT_GLYPHID_HIVE: lootGlyphidHive(world, x, y, z); + case LOOT_METEOR: lootBookMeteor(world, x, y, z); + default: lootBones(world, x, y, z); break; + } + } + + public static String[] getLootNames() { + return new String[] { + LOOT_BOOKLET, + LOOT_CAPNUKE, + LOOT_MEDICINE, + LOOT_CAPSTASH, + LOOT_MAKESHIFT_GUN, + LOOT_NUKE_STORAGE, + LOOT_BONES, + LOOT_GLYPHID_HIVE, + LOOT_METEOR, + }; + } + public static void setBlock(World world, int x, int y, int z) { world.setBlock(x, y, z, ModBlocks.deco_loot); } @@ -142,6 +183,19 @@ public class LootGenerator { } } + public static void lootBookMeteor(World world, int x, int y, int z) { + + TileEntityLoot loot = (TileEntityLoot) world.getTileEntity(x, y, z); + + if(loot != null && loot.items.isEmpty()) { + Item mkuItem = MKUCraftingHandler.getMKUItem(world); + ItemStack mkuBook = MKUCraftingHandler.generateBook(world, mkuItem); + + addItemWithDeviation(loot, world.rand, new ItemStack(mkuItem), 0, 0, 0.25); + addItemWithDeviation(loot, world.rand, mkuBook, 0, 0, -0.25); + } + } + public static void lootBookLore(World world, int x, int y, int z, ItemStack book) { TileEntityLoot loot = (TileEntityLoot) world.getTileEntity(x, y, z); @@ -157,4 +211,4 @@ public class LootGenerator { } } -} +} \ No newline at end of file diff --git a/src/main/java/com/hbm/world/dungeon/CrashedVertibird.java b/src/main/java/com/hbm/world/dungeon/CrashedVertibird.java deleted file mode 100644 index 68b8f2cbb..000000000 --- a/src/main/java/com/hbm/world/dungeon/CrashedVertibird.java +++ /dev/null @@ -1,426 +0,0 @@ -//Schematic to java Structure by jajo_11 | inspired by "MITHION'S .SCHEMATIC TO JAVA CONVERTINGTOOL" - -package com.hbm.world.dungeon; - -import java.util.Random; - -import com.hbm.blocks.ModBlocks; -import com.hbm.config.GeneralConfig; -import com.hbm.itempool.ItemPool; -import com.hbm.itempool.ItemPoolsLegacy; -import net.minecraft.block.Block; -import net.minecraft.block.material.Material; -import net.minecraft.init.Blocks; -import net.minecraft.tileentity.TileEntityChest; -import net.minecraft.util.WeightedRandomChestContent; -import net.minecraft.world.World; -import net.minecraft.world.gen.feature.WorldGenerator; - -public class CrashedVertibird extends WorldGenerator -{ - Block Block1 = ModBlocks.deco_steel; - Block Block2 = ModBlocks.deco_tungsten; - Block Block3 = ModBlocks.reinforced_glass; - Block Block4 = ModBlocks.deco_titanium; - - protected Block[] GetValidSpawnBlocks() - { - return new Block[] - { - Blocks.sand, - Blocks.sandstone, - }; - } - - public boolean LocationIsValidSpawn(World world, int x, int y, int z) - { - - Block checkBlock = world.getBlock(x, y - 1, z); - Block blockAbove = world.getBlock(x, y , z); - Block blockBelow = world.getBlock(x, y - 2, z); - - for (Block i : GetValidSpawnBlocks()) - { - if (blockAbove != Blocks.air) - { - return false; - } - if (checkBlock == i) - { - return true; - } - else if (checkBlock == Blocks.snow_layer && blockBelow == i) - { - return true; - } - else if (checkBlock.getMaterial() == Material.plants && blockBelow == i) - { - return true; - } - } - return false; - } - - @Override - public boolean generate(World world, Random rand, int x, int y, int z) - { - int i = rand.nextInt(1); - - if(i == 0) - { - generate_r0(world, rand, x, y, z); - } - - return true; - - } - - public boolean generate_r0(World world, Random rand, int x, int y, int z) - { - int yOffset = 8 + rand.nextInt(4); - - if(!LocationIsValidSpawn(world, x + 9, y, z + 9)) - { - return false; - } - - world.setBlock(x + 4, y + 0 - yOffset, z + 1, Block1, 0, 3); - world.setBlock(x + 5, y + 0 - yOffset, z + 1, Block1, 0, 3); - world.setBlock(x + 6, y + 0 - yOffset, z + 1, Block1, 0, 3); - world.setBlock(x + 5, y + 0 - yOffset, z + 2, Block2, 0, 3); - world.setBlock(x + 4, y + 1 - yOffset, z + 0, Block1, 0, 3); - world.setBlock(x + 5, y + 1 - yOffset, z + 0, Block1, 0, 3); - world.setBlock(x + 6, y + 1 - yOffset, z + 0, Block1, 0, 3); - world.setBlock(x + 3, y + 1 - yOffset, z + 1, Block1, 0, 3); - world.setBlock(x + 7, y + 1 - yOffset, z + 1, Block1, 0, 3); - world.setBlock(x + 4, y + 1 - yOffset, z + 2, Block1, 0, 3); - world.setBlock(x + 5, y + 1 - yOffset, z + 2, Block1, 0, 3); - world.setBlock(x + 6, y + 1 - yOffset, z + 2, Block1, 0, 3); - world.setBlock(x + 3, y + 1 - yOffset, z + 3, Block2, 0, 3); - world.setBlock(x + 4, y + 1 - yOffset, z + 3, Block1, 0, 3); - world.setBlock(x + 5, y + 1 - yOffset, z + 3, Block1, 0, 3); - world.setBlock(x + 6, y + 1 - yOffset, z + 3, Block1, 0, 3); - world.setBlock(x + 7, y + 1 - yOffset, z + 3, Block2, 0, 3); - world.setBlock(x + 4, y + 2 - yOffset, z + 0, Block3, 0, 3); - world.setBlock(x + 5, y + 2 - yOffset, z + 0, Block3, 0, 3); - world.setBlock(x + 3, y + 2 - yOffset, z + 1, Block3, 0, 3); - world.setBlock(x + 7, y + 2 - yOffset, z + 1, Block3, 0, 3); - world.setBlock(x + 3, y + 2 - yOffset, z + 2, Block1, 0, 3); - world.setBlock(x + 4, y + 2 - yOffset, z + 2, Blocks.stone_stairs, 2, 3); - world.setBlock(x + 6, y + 2 - yOffset, z + 2, Blocks.stone_stairs, 2, 3); - world.setBlock(x + 7, y + 2 - yOffset, z + 2, Block1, 0, 3); - world.setBlock(x + 7, y + 2 - yOffset, z + 3, Block4, 0, 3); - world.setBlock(x + 3, y + 2 - yOffset, z + 4, Block2, 0, 3); - world.setBlock(x + 4, y + 2 - yOffset, z + 4, Block1, 0, 3); - world.setBlock(x + 5, y + 2 - yOffset, z + 4, Block1, 0, 3); - world.setBlock(x + 6, y + 2 - yOffset, z + 4, Block1, 0, 3); - world.setBlock(x + 7, y + 2 - yOffset, z + 4, Block2, 0, 3); - world.setBlock(x + 3, y + 2 - yOffset, z + 5, Block2, 0, 3); - world.setBlock(x + 4, y + 2 - yOffset, z + 5, Block1, 0, 3); - world.setBlock(x + 5, y + 2 - yOffset, z + 5, Block1, 0, 3); - world.setBlock(x + 6, y + 2 - yOffset, z + 5, Block1, 0, 3); - world.setBlock(x + 7, y + 2 - yOffset, z + 5, Block2, 0, 3); - world.setBlock(x + 4, y + 2 - yOffset, z + 7, Block2, 0, 3); - world.setBlock(x + 6, y + 2 - yOffset, z + 7, Block2, 0, 3); - world.setBlock(x + 4, y + 3 - yOffset, z + 0, Block1, 0, 3); - world.setBlock(x + 5, y + 3 - yOffset, z + 0, Block1, 0, 3); - world.setBlock(x + 6, y + 3 - yOffset, z + 0, Block1, 0, 3); - world.setBlock(x + 3, y + 3 - yOffset, z + 1, Block3, 0, 3); - world.setBlock(x + 4, y + 3 - yOffset, z + 1, Block1, 0, 3); - world.setBlock(x + 5, y + 3 - yOffset, z + 1, Block1, 0, 3); - world.setBlock(x + 6, y + 3 - yOffset, z + 1, Block1, 0, 3); - world.setBlock(x + 7, y + 3 - yOffset, z + 1, Block3, 0, 3); - world.setBlock(x + 3, y + 3 - yOffset, z + 2, Block1, 0, 3); - world.setBlock(x + 7, y + 3 - yOffset, z + 2, Block1, 0, 3); - world.setBlock(x + 3, y + 3 - yOffset, z + 3, Block1, 0, 3); - world.setBlock(x + 7, y + 3 - yOffset, z + 3, Block1, 0, 3); - world.setBlock(x + 7, y + 3 - yOffset, z + 4, Block4, 0, 3); - world.setBlock(x + 2, y + 3 - yOffset, z + 5, Block4, 0, 3); - world.setBlock(x + 7, y + 3 - yOffset, z + 5, Block4, 0, 3); - world.setBlock(x + 4, y + 3 - yOffset, z + 6, Block1, 0, 3); - world.setBlock(x + 5, y + 3 - yOffset, z + 6, Block1, 0, 3); - world.setBlock(x + 6, y + 3 - yOffset, z + 6, Block1, 0, 3); - world.setBlock(x + 4, y + 3 - yOffset, z + 7, Block1, 0, 3); - world.setBlock(x + 5, y + 3 - yOffset, z + 7, Block1, 0, 3); - world.setBlock(x + 6, y + 3 - yOffset, z + 7, Block1, 0, 3); - world.setBlock(x + 5, y + 3 - yOffset, z + 9, Block2, 0, 3); - world.setBlock(x + 4, y + 4 - yOffset, z + 1, Block1, 0, 3); - world.setBlock(x + 5, y + 4 - yOffset, z + 1, Block1, 0, 3); - world.setBlock(x + 6, y + 4 - yOffset, z + 1, Block1, 0, 3); - world.setBlock(x + 3, y + 4 - yOffset, z + 2, Block3, 0, 3); - world.setBlock(x + 3, y + 4 - yOffset, z + 3, Block1, 0, 3); - world.setBlock(x + 7, y + 4 - yOffset, z + 3, Block1, 0, 3); - world.setBlock(x + 7, y + 4 - yOffset, z + 5, Block4, 0, 3); - world.setBlock(x + 2, y + 4 - yOffset, z + 6, Block4, 0, 3); - world.setBlock(x + 3, y + 4 - yOffset, z + 6, Block1, 0, 3); - world.setBlock(x + 7, y + 4 - yOffset, z + 6, Block1, 0, 3); - world.setBlock(x + 2, y + 4 - yOffset, z + 7, Block4, 0, 3); - world.setBlock(x + 3, y + 4 - yOffset, z + 7, Block1, 0, 3); - world.setBlock(x + 6, y + 4 - yOffset, z + 7, Blocks.chest, 2, 3); - if(world.getBlock(x + 6, y + 4 - yOffset, z + 7) == Blocks.chest) - { - WeightedRandomChestContent.generateChestContents(rand, ItemPool.getPool(ItemPoolsLegacy.POOL_VERTIBIRD), (TileEntityChest)world.getTileEntity(x + 6, y + 4 - yOffset, z + 7), 8); - } - world.setBlock(x + 7, y + 4 - yOffset, z + 7, Block1, 0, 3); - world.setBlock(x + 4, y + 4 - yOffset, z + 8, Block1, 0, 3); - world.setBlock(x + 5, y + 4 - yOffset, z + 8, Block1, 0, 3); - world.setBlock(x + 6, y + 4 - yOffset, z + 8, Block1, 0, 3); - world.setBlock(x + 4, y + 4 - yOffset, z + 9, Block1, 0, 3); - world.setBlock(x + 5, y + 4 - yOffset, z + 9, Block1, 0, 3); - world.setBlock(x + 6, y + 4 - yOffset, z + 9, Block1, 0, 3); - world.setBlock(x + 6, y + 5 - yOffset, z + 1, Block2, 0, 3); - world.setBlock(x + 4, y + 5 - yOffset, z + 2, Block1, 0, 3); - world.setBlock(x + 5, y + 5 - yOffset, z + 2, Block1, 0, 3); - world.setBlock(x + 6, y + 5 - yOffset, z + 2, Block1, 0, 3); - world.setBlock(x + 4, y + 5 - yOffset, z + 3, Block1, 0, 3); - world.setBlock(x + 5, y + 5 - yOffset, z + 3, Block1, 0, 3); - world.setBlock(x + 6, y + 5 - yOffset, z + 3, Block1, 0, 3); - world.setBlock(x + 7, y + 5 - yOffset, z + 3, Block1, 0, 3); - world.setBlock(x + 3, y + 5 - yOffset, z + 4, Block1, 0, 3); - world.setBlock(x + 7, y + 5 - yOffset, z + 4, Block1, 0, 3); - world.setBlock(x + 3, y + 5 - yOffset, z + 5, Block1, 0, 3); - world.setBlock(x + 7, y + 5 - yOffset, z + 5, Block1, 0, 3); - world.setBlock(x + 2, y + 5 - yOffset, z + 6, Block4, 0, 3); - world.setBlock(x + 3, y + 5 - yOffset, z + 6, Block1, 0, 3); - world.setBlock(x + 7, y + 5 - yOffset, z + 6, Block1, 0, 3); - world.setBlock(x + 2, y + 5 - yOffset, z + 7, Block4, 0, 3); - world.setBlock(x + 3, y + 5 - yOffset, z + 7, Block1, 0, 3); - world.setBlock(x + 7, y + 5 - yOffset, z + 7, Block1, 0, 3); - world.setBlock(x + 4, y + 5 - yOffset, z + 8, Block1, 0, 3); - world.setBlock(x + 5, y + 5 - yOffset, z + 8, Block1, 0, 3); - world.setBlock(x + 6, y + 5 - yOffset, z + 8, Block1, 0, 3); - world.setBlock(x + 4, y + 5 - yOffset, z + 9, Block1, 0, 3); - world.setBlock(x + 5, y + 5 - yOffset, z + 9, Block4, 0, 3); - world.setBlock(x + 6, y + 5 - yOffset, z + 9, Block1, 0, 3); - world.setBlock(x + 5, y + 6 - yOffset, z + 3, Block1, 0, 3); - world.setBlock(x + 6, y + 6 - yOffset, z + 3, Block1, 0, 3); - world.setBlock(x + 4, y + 6 - yOffset, z + 4, Block1, 0, 3); - world.setBlock(x + 5, y + 6 - yOffset, z + 4, Block1, 0, 3); - world.setBlock(x + 6, y + 6 - yOffset, z + 4, Block1, 0, 3); - world.setBlock(x + 7, y + 6 - yOffset, z + 4, Block1, 0, 3); - world.setBlock(x + 14, y + 6 - yOffset, z + 4, Block1, 0, 3); - world.setBlock(x + 0, y + 6 - yOffset, z + 5, Block1, 0, 3); - world.setBlock(x + 1, y + 6 - yOffset, z + 5, Block1, 0, 3); - world.setBlock(x + 2, y + 6 - yOffset, z + 5, Block1, 0, 3); - world.setBlock(x + 3, y + 6 - yOffset, z + 5, Block1, 0, 3); - world.setBlock(x + 4, y + 6 - yOffset, z + 5, Block1, 0, 3); - world.setBlock(x + 5, y + 6 - yOffset, z + 5, Block1, 0, 3); - world.setBlock(x + 6, y + 6 - yOffset, z + 5, Block1, 0, 3); - world.setBlock(x + 7, y + 6 - yOffset, z + 5, Block1, 0, 3); - world.setBlock(x + 8, y + 6 - yOffset, z + 5, Block1, 0, 3); - world.setBlock(x + 9, y + 6 - yOffset, z + 5, Block1, 0, 3); - world.setBlock(x + 10, y + 6 - yOffset, z + 5, Block1, 0, 3); - world.setBlock(x + 13, y + 6 - yOffset, z + 5, Block1, 0, 3); - world.setBlock(x + 3, y + 6 - yOffset, z + 6, Block1, 0, 3); - world.setBlock(x + 4, y + 6 - yOffset, z + 6, Block1, 0, 3); - world.setBlock(x + 6, y + 6 - yOffset, z + 6, Block1, 0, 3); - world.setBlock(x + 7, y + 6 - yOffset, z + 6, Block1, 0, 3); - world.setBlock(x + 3, y + 6 - yOffset, z + 7, Block1, 0, 3); - world.setBlock(x + 4, y + 6 - yOffset, z + 7, Block1, 0, 3); - world.setBlock(x + 5, y + 6 - yOffset, z + 7, Block1, 0, 3); - world.setBlock(x + 6, y + 6 - yOffset, z + 7, Block1, 0, 3); - world.setBlock(x + 7, y + 6 - yOffset, z + 7, Block1, 0, 3); - world.setBlock(x + 4, y + 6 - yOffset, z + 8, Block1, 0, 3); - world.setBlock(x + 5, y + 6 - yOffset, z + 8, ModBlocks.machine_battery, 2, 3); - world.setBlock(x + 6, y + 6 - yOffset, z + 8, Block1, 0, 3); - world.setBlock(x + 4, y + 6 - yOffset, z + 9, Block1, 0, 3); - world.setBlock(x + 5, y + 6 - yOffset, z + 9, ModBlocks.red_wire_coated, 0, 3); - world.setBlock(x + 6, y + 6 - yOffset, z + 9, Block1, 0, 3); - world.setBlock(x + 4, y + 6 - yOffset, z + 10, Block1, 0, 3); - world.setBlock(x + 5, y + 6 - yOffset, z + 10, Block1, 0, 3); - world.setBlock(x + 6, y + 6 - yOffset, z + 10, Block1, 0, 3); - world.setBlock(x + 5, y + 6 - yOffset, z + 11, Block1, 0, 3); - world.setBlock(x + 6, y + 6 - yOffset, z + 11, Block1, 0, 3); - world.setBlock(x + 4, y + 7 - yOffset, z + 4, Block1, 0, 3); - world.setBlock(x + 5, y + 7 - yOffset, z + 4, Block1, 0, 3); - world.setBlock(x + 6, y + 7 - yOffset, z + 4, Block1, 0, 3); - world.setBlock(x + 7, y + 7 - yOffset, z + 4, Block1, 0, 3); - world.setBlock(x + 14, y + 7 - yOffset, z + 4, Block1, 0, 3); - world.setBlock(x + 1, y + 7 - yOffset, z + 5, Block1, 0, 3); - world.setBlock(x + 2, y + 7 - yOffset, z + 5, Block1, 0, 3); - world.setBlock(x + 3, y + 7 - yOffset, z + 5, Block1, 0, 3); - world.setBlock(x + 4, y + 7 - yOffset, z + 5, Block1, 0, 3); - world.setBlock(x + 5, y + 7 - yOffset, z + 5, Block1, 0, 3); - world.setBlock(x + 6, y + 7 - yOffset, z + 5, Block1, 0, 3); - world.setBlock(x + 7, y + 7 - yOffset, z + 5, Block1, 0, 3); - world.setBlock(x + 8, y + 7 - yOffset, z + 5, Block1, 0, 3); - world.setBlock(x + 9, y + 7 - yOffset, z + 5, Block1, 0, 3); - world.setBlock(x + 10, y + 7 - yOffset, z + 5, Block1, 0, 3); - world.setBlock(x + 11, y + 7 - yOffset, z + 5, Block1, 0, 3); - world.setBlock(x + 12, y + 7 - yOffset, z + 5, Block1, 0, 3); - world.setBlock(x + 13, y + 7 - yOffset, z + 5, Block1, 0, 3); - world.setBlock(x + 14, y + 7 - yOffset, z + 5, Block2, 0, 3); - world.setBlock(x + 3, y + 7 - yOffset, z + 6, Block1, 0, 3); - world.setBlock(x + 4, y + 7 - yOffset, z + 6, Block1, 0, 3); - world.setBlock(x + 5, y + 7 - yOffset, z + 6, Block1, 0, 3); - world.setBlock(x + 6, y + 7 - yOffset, z + 6, Block1, 0, 3); - world.setBlock(x + 7, y + 7 - yOffset, z + 6, Block1, 0, 3); - world.setBlock(x + 14, y + 7 - yOffset, z + 6, Block1, 0, 3); - world.setBlock(x + 3, y + 7 - yOffset, z + 7, Block1, 0, 3); - world.setBlock(x + 4, y + 7 - yOffset, z + 7, Block1, 0, 3); - world.setBlock(x + 5, y + 7 - yOffset, z + 7, Block1, 0, 3); - world.setBlock(x + 6, y + 7 - yOffset, z + 7, Block1, 0, 3); - world.setBlock(x + 7, y + 7 - yOffset, z + 7, Block1, 0, 3); - world.setBlock(x + 3, y + 7 - yOffset, z + 8, Block1, 0, 3); - world.setBlock(x + 4, y + 7 - yOffset, z + 8, Block1, 0, 3); - world.setBlock(x + 5, y + 7 - yOffset, z + 8, Block1, 0, 3); - world.setBlock(x + 6, y + 7 - yOffset, z + 8, Block1, 0, 3); - world.setBlock(x + 7, y + 7 - yOffset, z + 8, Block1, 0, 3); - world.setBlock(x + 3, y + 7 - yOffset, z + 9, Block1, 0, 3); - world.setBlock(x + 4, y + 7 - yOffset, z + 9, ModBlocks.block_electrical_scrap, 0, 3); - world.setBlock(x + 5, y + 7 - yOffset, z + 9, ModBlocks.red_wire_coated, 0, 3); - world.setBlock(x + 6, y + 7 - yOffset, z + 9, ModBlocks.block_electrical_scrap, 0, 3); - world.setBlock(x + 7, y + 7 - yOffset, z + 9, Block1, 0, 3); - world.setBlock(x + 5, y + 7 - yOffset, z + 10, Block4, 0, 3); - world.setBlock(x + 6, y + 7 - yOffset, z + 10, Block1, 0, 3); - world.setBlock(x + 5, y + 7 - yOffset, z + 11, Block4, 0, 3); - world.setBlock(x + 6, y + 7 - yOffset, z + 11, Block1, 0, 3); - world.setBlock(x + 5, y + 8 - yOffset, z + 4, Block1, 0, 3); - world.setBlock(x + 14, y + 8 - yOffset, z + 4, Block1, 0, 3); - world.setBlock(x + 4, y + 8 - yOffset, z + 5, Block1, 0, 3); - world.setBlock(x + 5, y + 8 - yOffset, z + 5, Block1, 0, 3); - world.setBlock(x + 6, y + 8 - yOffset, z + 5, Block1, 0, 3); - world.setBlock(x + 13, y + 8 - yOffset, z + 5, Block1, 0, 3); - world.setBlock(x + 14, y + 8 - yOffset, z + 5, Block2, 0, 3); - world.setBlock(x + 15, y + 8 - yOffset, z + 5, Block1, 0, 3); - world.setBlock(x + 3, y + 8 - yOffset, z + 6, Block1, 0, 3); - world.setBlock(x + 4, y + 8 - yOffset, z + 6, Block1, 0, 3); - world.setBlock(x + 5, y + 8 - yOffset, z + 6, Blocks.chest, 2, 3); - if(world.getBlock(x + 5, y + 8 - yOffset, z + 6) == Blocks.chest) - { - WeightedRandomChestContent.generateChestContents(rand, ItemPool.getPool(ItemPoolsLegacy.POOL_EXPENSIVE), (TileEntityChest)world.getTileEntity(x + 5, y + 8 - yOffset, z + 6), 8); - } - world.setBlock(x + 6, y + 8 - yOffset, z + 6, Block1, 0, 3); - world.setBlock(x + 7, y + 8 - yOffset, z + 6, Block1, 0, 3); - world.setBlock(x + 14, y + 8 - yOffset, z + 6, Block1, 0, 3); - world.setBlock(x + 3, y + 8 - yOffset, z + 7, Block1, 0, 3); - world.setBlock(x + 4, y + 8 - yOffset, z + 7, Block1, 0, 3); - world.setBlock(x + 5, y + 8 - yOffset, z + 7, Block1, 0, 3); - world.setBlock(x + 6, y + 8 - yOffset, z + 7, Block1, 0, 3); - world.setBlock(x + 7, y + 8 - yOffset, z + 7, Block1, 0, 3); - world.setBlock(x + 3, y + 8 - yOffset, z + 8, Block1, 0, 3); - world.setBlock(x + 4, y + 8 - yOffset, z + 8, Block1, 0, 3); - world.setBlock(x + 5, y + 8 - yOffset, z + 8, Block1, 0, 3); - world.setBlock(x + 6, y + 8 - yOffset, z + 8, Block1, 0, 3); - world.setBlock(x + 7, y + 8 - yOffset, z + 8, Block1, 0, 3); - world.setBlock(x + 3, y + 8 - yOffset, z + 9, Block1, 0, 3); - world.setBlock(x + 4, y + 8 - yOffset, z + 9, ModBlocks.block_electrical_scrap, 0, 3); - world.setBlock(x + 5, y + 8 - yOffset, z + 9, ModBlocks.red_wire_coated, 0, 3); - world.setBlock(x + 6, y + 8 - yOffset, z + 9, ModBlocks.block_electrical_scrap, 0, 3); - world.setBlock(x + 7, y + 8 - yOffset, z + 9, Block1, 0, 3); - world.setBlock(x + 4, y + 8 - yOffset, z + 10, ModBlocks.block_electrical_scrap, 0, 3); - world.setBlock(x + 5, y + 8 - yOffset, z + 10, ModBlocks.red_wire_coated, 0, 3); - world.setBlock(x + 6, y + 8 - yOffset, z + 10, ModBlocks.block_electrical_scrap, 0, 3); - world.setBlock(x + 7, y + 8 - yOffset, z + 10, Block1, 0, 3); - world.setBlock(x + 5, y + 8 - yOffset, z + 11, Block4, 0, 3); - world.setBlock(x + 6, y + 8 - yOffset, z + 11, Block1, 0, 3); - world.setBlock(x + 7, y + 8 - yOffset, z + 11, Block1, 0, 3); - world.setBlock(x + 6, y + 8 - yOffset, z + 12, Block1, 0, 3); - world.setBlock(x + 14, y + 9 - yOffset, z + 4, Block1, 0, 3); - world.setBlock(x + 13, y + 9 - yOffset, z + 5, Block1, 0, 3); - world.setBlock(x + 14, y + 9 - yOffset, z + 5, Block2, 0, 3); - world.setBlock(x + 15, y + 9 - yOffset, z + 5, Block1, 0, 3); - world.setBlock(x + 4, y + 9 - yOffset, z + 6, Block1, 0, 3); - world.setBlock(x + 5, y + 9 - yOffset, z + 6, Block1, 0, 3); - world.setBlock(x + 6, y + 9 - yOffset, z + 6, Block1, 0, 3); - world.setBlock(x + 14, y + 9 - yOffset, z + 6, Block1, 0, 3); - world.setBlock(x + 4, y + 9 - yOffset, z + 7, Block1, 0, 3); - world.setBlock(x + 5, y + 9 - yOffset, z + 7, Block1, 0, 3); - world.setBlock(x + 6, y + 9 - yOffset, z + 7, Block1, 0, 3); - world.setBlock(x + 3, y + 9 - yOffset, z + 8, Block1, 0, 3); - world.setBlock(x + 4, y + 9 - yOffset, z + 8, Block1, 0, 3); - world.setBlock(x + 5, y + 9 - yOffset, z + 8, Block1, 0, 3); - world.setBlock(x + 6, y + 9 - yOffset, z + 8, Block1, 0, 3); - world.setBlock(x + 7, y + 9 - yOffset, z + 8, Block1, 0, 3); - world.setBlock(x + 4, y + 9 - yOffset, z + 9, Block1, 0, 3); - world.setBlock(x + 5, y + 9 - yOffset, z + 9, Block4, 0, 3); - world.setBlock(x + 6, y + 9 - yOffset, z + 9, Block1, 0, 3); - world.setBlock(x + 4, y + 9 - yOffset, z + 10, ModBlocks.block_electrical_scrap, 0, 3); - world.setBlock(x + 5, y + 9 - yOffset, z + 10, ModBlocks.red_wire_coated, 0, 3); - world.setBlock(x + 6, y + 9 - yOffset, z + 10, ModBlocks.block_electrical_scrap, 0, 3); - world.setBlock(x + 7, y + 9 - yOffset, z + 10, Block1, 0, 3); - world.setBlock(x + 5, y + 9 - yOffset, z + 11, ModBlocks.red_wire_coated, 0, 3); - world.setBlock(x + 6, y + 9 - yOffset, z + 11, Block1, 0, 3); - world.setBlock(x + 5, y + 9 - yOffset, z + 12, Block4, 0, 3); - world.setBlock(x + 6, y + 9 - yOffset, z + 12, Block1, 0, 3); - world.setBlock(x + 7, y + 9 - yOffset, z + 12, Block1, 0, 3); - world.setBlock(x + 5, y + 9 - yOffset, z + 13, Block1, 0, 3); - world.setBlock(x + 6, y + 9 - yOffset, z + 13, Block1, 0, 3); - world.setBlock(x + 14, y + 10 - yOffset, z + 5, Block2, 0, 3); - world.setBlock(x + 4, y + 10 - yOffset, z + 8, Block1, 0, 3); - world.setBlock(x + 5, y + 10 - yOffset, z + 8, Block1, 0, 3); - world.setBlock(x + 6, y + 10 - yOffset, z + 8, Block1, 0, 3); - world.setBlock(x + 5, y + 10 - yOffset, z + 9, Block1, 0, 3); - world.setBlock(x + 4, y + 10 - yOffset, z + 10, Block1, 0, 3); - world.setBlock(x + 5, y + 10 - yOffset, z + 10, Block4, 0, 3); - world.setBlock(x + 6, y + 10 - yOffset, z + 10, Block1, 0, 3); - world.setBlock(x + 4, y + 10 - yOffset, z + 11, Block1, 0, 3); - world.setBlock(x + 5, y + 10 - yOffset, z + 11, Block1, 0, 3); - world.setBlock(x + 6, y + 10 - yOffset, z + 11, Block1, 0, 3); - world.setBlock(x + 4, y + 10 - yOffset, z + 12, Block1, 0, 3); - world.setBlock(x + 5, y + 10 - yOffset, z + 12, ModBlocks.red_wire_coated, 0, 3); - world.setBlock(x + 6, y + 10 - yOffset, z + 12, Block1, 0, 3); - world.setBlock(x + 4, y + 10 - yOffset, z + 13, Block1, 0, 3); - world.setBlock(x + 5, y + 10 - yOffset, z + 13, ModBlocks.red_wire_coated, 0, 3); - world.setBlock(x + 6, y + 10 - yOffset, z + 13, Block1, 0, 3); - world.setBlock(x + 5, y + 10 - yOffset, z + 14, Block1, 0, 3); - world.setBlock(x + 5, y + 10 - yOffset, z + 15, Block1, 0, 3); - world.setBlock(x + 5, y + 10 - yOffset, z + 17, Block1, 0, 3); - world.setBlock(x + 5, y + 10 - yOffset, z + 18, Block1, 0, 3); - world.setBlock(x + 14, y + 11 - yOffset, z + 4, Block4, 0, 3); - world.setBlock(x + 12, y + 11 - yOffset, z + 5, Block4, 0, 3); - world.setBlock(x + 13, y + 11 - yOffset, z + 5, Block4, 0, 3); - world.setBlock(x + 14, y + 11 - yOffset, z + 5, Block2, 0, 3); - world.setBlock(x + 15, y + 11 - yOffset, z + 5, Block4, 0, 3); - world.setBlock(x + 16, y + 11 - yOffset, z + 5, Block4, 0, 3); - world.setBlock(x + 17, y + 11 - yOffset, z + 5, Block4, 0, 3); - world.setBlock(x + 14, y + 11 - yOffset, z + 6, Block4, 0, 3); - world.setBlock(x + 14, y + 11 - yOffset, z + 7, Block4, 0, 3); - world.setBlock(x + 5, y + 11 - yOffset, z + 10, Block1, 0, 3); - world.setBlock(x + 5, y + 11 - yOffset, z + 11, Block1, 0, 3); - world.setBlock(x + 4, y + 11 - yOffset, z + 12, Block1, 0, 3); - world.setBlock(x + 5, y + 11 - yOffset, z + 12, Block1, 0, 3); - world.setBlock(x + 6, y + 11 - yOffset, z + 12, Block1, 0, 3); - world.setBlock(x + 5, y + 11 - yOffset, z + 13, Block1, 0, 3); - world.setBlock(x + 4, y + 11 - yOffset, z + 14, Block1, 0, 3); - world.setBlock(x + 5, y + 11 - yOffset, z + 14, ModBlocks.red_wire_coated, 0, 3); - world.setBlock(x + 6, y + 11 - yOffset, z + 14, Block1, 0, 3); - world.setBlock(x + 4, y + 11 - yOffset, z + 15, Block1, 0, 3); - world.setBlock(x + 5, y + 11 - yOffset, z + 15, ModBlocks.red_wire_coated, 0, 3); - world.setBlock(x + 6, y + 11 - yOffset, z + 15, Block1, 0, 3); - world.setBlock(x + 5, y + 11 - yOffset, z + 16, Block1, 0, 3); - world.setBlock(x + 5, y + 11 - yOffset, z + 17, Block1, 0, 3); - world.setBlock(x + 5, y + 11 - yOffset, z + 18, Block1, 0, 3); - world.setBlock(x + 5, y + 12 - yOffset, z + 14, Block1, 0, 3); - world.setBlock(x + 3, y + 12 - yOffset, z + 16, Block1, 0, 3); - world.setBlock(x + 4, y + 12 - yOffset, z + 16, Block1, 0, 3); - world.setBlock(x + 5, y + 12 - yOffset, z + 16, ModBlocks.red_wire_coated, 0, 3); - world.setBlock(x + 6, y + 12 - yOffset, z + 16, Block1, 0, 3); - world.setBlock(x + 7, y + 12 - yOffset, z + 16, Block1, 0, 3); - world.setBlock(x + 8, y + 12 - yOffset, z + 16, Block1, 0, 3); - world.setBlock(x + 9, y + 12 - yOffset, z + 16, Block1, 0, 3); - world.setBlock(x + 4, y + 12 - yOffset, z + 17, Block1, 0, 3); - world.setBlock(x + 5, y + 12 - yOffset, z + 17, ModBlocks.red_wire_coated, 0, 3); - world.setBlock(x + 6, y + 12 - yOffset, z + 17, Block1, 0, 3); - world.setBlock(x + 7, y + 12 - yOffset, z + 17, Block1, 0, 3); - world.setBlock(x + 8, y + 12 - yOffset, z + 17, Block1, 0, 3); - world.setBlock(x + 9, y + 12 - yOffset, z + 17, Block1, 0, 3); - world.setBlock(x + 10, y + 12 - yOffset, z + 17, Block1, 0, 3); - world.setBlock(x + 5, y + 13 - yOffset, z + 17, Block1, 0, 3); - - generate_r02_last(world, rand, x, y, z, yOffset); - return true; - - } - public boolean generate_r02_last(World world, Random rand, int x, int y, int z, int yOffset) - { - - world.setBlock(x + 4, y + 1 - yOffset, z + 1, Blocks.lever, 3, 3); - world.setBlock(x + 6, y + 1 - yOffset, z + 1, Blocks.lever, 3, 3); - if(GeneralConfig.enableDebugMode) - System.out.print("[Debug] Successfully spawned crashed Vertibird at " + x + " " + y +" " + z + "\n"); - return true; - - } - -} \ No newline at end of file diff --git a/src/main/java/com/hbm/world/dungeon/Vertibird.java b/src/main/java/com/hbm/world/dungeon/Vertibird.java deleted file mode 100644 index 67b34f015..000000000 --- a/src/main/java/com/hbm/world/dungeon/Vertibird.java +++ /dev/null @@ -1,514 +0,0 @@ -//Schematic to java Structure by jajo_11 | inspired by "MITHION'S .SCHEMATIC TO JAVA CONVERTINGTOOL" - -package com.hbm.world.dungeon; - -import java.util.Random; - -import com.hbm.blocks.ModBlocks; -import com.hbm.config.GeneralConfig; -import com.hbm.itempool.ItemPool; -import com.hbm.itempool.ItemPoolsLegacy; -import net.minecraft.block.Block; -import net.minecraft.block.material.Material; -import net.minecraft.init.Blocks; -import net.minecraft.tileentity.TileEntityChest; -import net.minecraft.util.WeightedRandomChestContent; -import net.minecraft.world.World; -import net.minecraft.world.gen.feature.WorldGenerator; - -public class Vertibird extends WorldGenerator -{ - Block Block2 = ModBlocks.deco_steel; - Block Block1 = ModBlocks.deco_tungsten; - Block Block4 = ModBlocks.reinforced_glass; - Block Block3 = ModBlocks.deco_titanium; - - protected Block[] GetValidSpawnBlocks() - { - return new Block[] - { - Blocks.sand, - Blocks.sandstone, - }; - } - - public boolean LocationIsValidSpawn(World world, int x, int y, int z) - { - - Block checkBlock = world.getBlock(x, y - 1, z); - Block blockAbove = world.getBlock(x, y , z); - Block blockBelow = world.getBlock(x, y - 2, z); - - for (Block i : GetValidSpawnBlocks()) - { - if (blockAbove != Blocks.air) - { - return false; - } - if (checkBlock == i) - { - return true; - } - else if (checkBlock == Blocks.snow_layer && blockBelow == i) - { - return true; - } - else if (checkBlock.getMaterial() == Material.plants && blockBelow == i) - { - return true; - } - } - return false; - } - - @Override - public boolean generate(World world, Random rand, int x, int y, int z) - { - int i = rand.nextInt(1); - - if(i == 0) - { - generate_r0(world, rand, x, y, z); - } - - return true; - - } - - public boolean generate_r0(World world, Random rand, int x, int y, int z) - { - int yOffset = 3 + rand.nextInt(4); - - if(!LocationIsValidSpawn(world, x + 13, y, z + 10)) - { - return false; - } - - world.setBlock(x + 13, y + 0 - yOffset, z + 2, Block1, 0, 3); - world.setBlock(x + 12, y + 0 - yOffset, z + 7, Block1, 0, 3); - world.setBlock(x + 14, y + 0 - yOffset, z + 7, Block1, 0, 3); - world.setBlock(x + 13, y + 0 - yOffset, z + 9, Block1, 0, 3); - world.setBlock(x + 12, y + 1 - yOffset, z + 1, Block2, 0, 3); - world.setBlock(x + 13, y + 1 - yOffset, z + 1, Block2, 0, 3); - world.setBlock(x + 14, y + 1 - yOffset, z + 1, Block2, 0, 3); - world.setBlock(x + 12, y + 1 - yOffset, z + 2, Block2, 0, 3); - world.setBlock(x + 13, y + 1 - yOffset, z + 2, Block2, 0, 3); - world.setBlock(x + 14, y + 1 - yOffset, z + 2, Block2, 0, 3); - world.setBlock(x + 11, y + 1 - yOffset, z + 3, Block1, 0, 3); - world.setBlock(x + 12, y + 1 - yOffset, z + 3, Block2, 0, 3); - world.setBlock(x + 13, y + 1 - yOffset, z + 3, Block2, 0, 3); - world.setBlock(x + 14, y + 1 - yOffset, z + 3, Block2, 0, 3); - world.setBlock(x + 15, y + 1 - yOffset, z + 3, Block1, 0, 3); - world.setBlock(x + 11, y + 1 - yOffset, z + 4, Block1, 0, 3); - world.setBlock(x + 12, y + 1 - yOffset, z + 4, Block2, 0, 3); - world.setBlock(x + 13, y + 1 - yOffset, z + 4, Block2, 0, 3); - world.setBlock(x + 14, y + 1 - yOffset, z + 4, Block2, 0, 3); - world.setBlock(x + 15, y + 1 - yOffset, z + 4, Block1, 0, 3); - world.setBlock(x + 11, y + 1 - yOffset, z + 5, Block1, 0, 3); - world.setBlock(x + 12, y + 1 - yOffset, z + 5, Block2, 0, 3); - world.setBlock(x + 13, y + 1 - yOffset, z + 5, Block2, 0, 3); - world.setBlock(x + 14, y + 1 - yOffset, z + 5, Block2, 0, 3); - world.setBlock(x + 15, y + 1 - yOffset, z + 5, Block1, 0, 3); - world.setBlock(x + 12, y + 1 - yOffset, z + 6, Block2, 0, 3); - world.setBlock(x + 13, y + 1 - yOffset, z + 6, Block2, 0, 3); - world.setBlock(x + 14, y + 1 - yOffset, z + 6, Block2, 0, 3); - world.setBlock(x + 12, y + 1 - yOffset, z + 7, Block2, 0, 3); - world.setBlock(x + 13, y + 1 - yOffset, z + 7, Block2, 0, 3); - world.setBlock(x + 14, y + 1 - yOffset, z + 7, Block2, 0, 3); - world.setBlock(x + 12, y + 1 - yOffset, z + 8, Block2, 0, 3); - world.setBlock(x + 13, y + 1 - yOffset, z + 8, Block2, 0, 3); - world.setBlock(x + 14, y + 1 - yOffset, z + 8, Block2, 0, 3); - world.setBlock(x + 12, y + 1 - yOffset, z + 9, Block2, 0, 3); - world.setBlock(x + 13, y + 1 - yOffset, z + 9, Block2, 0, 3); - world.setBlock(x + 14, y + 1 - yOffset, z + 9, Block2, 0, 3); - world.setBlock(x + 12, y + 2 - yOffset, z + 0, Block2, 0, 3); - world.setBlock(x + 13, y + 2 - yOffset, z + 0, Block2, 0, 3); - world.setBlock(x + 14, y + 2 - yOffset, z + 0, Block2, 0, 3); - world.setBlock(x + 11, y + 2 - yOffset, z + 1, Block2, 0, 3); - world.setBlock(x + 15, y + 2 - yOffset, z + 1, Block2, 0, 3); - world.setBlock(x + 11, y + 2 - yOffset, z + 2, Block2, 0, 3); - world.setBlock(x + 12, y + 2 - yOffset, z + 2, Blocks.stone_stairs, 2, 3); - world.setBlock(x + 14, y + 2 - yOffset, z + 2, Blocks.stone_stairs, 2, 3); - world.setBlock(x + 15, y + 2 - yOffset, z + 2, Block2, 0, 3); - world.setBlock(x + 15, y + 2 - yOffset, z + 3, Block3, 0, 3); - world.setBlock(x + 15, y + 2 - yOffset, z + 4, Block3, 0, 3); - world.setBlock(x + 10, y + 2 - yOffset, z + 5, Block3, 0, 3); - world.setBlock(x + 15, y + 2 - yOffset, z + 5, Block3, 0, 3); - world.setBlock(x + 10, y + 2 - yOffset, z + 6, Block3, 0, 3); - world.setBlock(x + 11, y + 2 - yOffset, z + 6, Block2, 0, 3); - world.setBlock(x + 15, y + 2 - yOffset, z + 6, Block2, 0, 3); - world.setBlock(x + 10, y + 2 - yOffset, z + 7, Block3, 0, 3); - world.setBlock(x + 11, y + 2 - yOffset, z + 7, Block2, 0, 3); - world.setBlock(x + 14, y + 2 - yOffset, z + 7, Blocks.chest, 2, 3); - if(world.getBlock(x + 14, y + 2 - yOffset, z + 7) == Blocks.chest) - { - WeightedRandomChestContent.generateChestContents(rand, ItemPool.getPool(ItemPoolsLegacy.POOL_VERTIBIRD), (TileEntityChest)world.getTileEntity(x + 14, y + 2 - yOffset, z + 7), 8); - } - world.setBlock(x + 15, y + 2 - yOffset, z + 7, Block2, 0, 3); - world.setBlock(x + 12, y + 2 - yOffset, z + 8, Block2, 0, 3); - world.setBlock(x + 13, y + 2 - yOffset, z + 8, Block2, 0, 3); - world.setBlock(x + 14, y + 2 - yOffset, z + 8, Block2, 0, 3); - world.setBlock(x + 12, y + 2 - yOffset, z + 9, Block2, 0, 3); - world.setBlock(x + 13, y + 2 - yOffset, z + 9, Block3, 0, 3); - world.setBlock(x + 14, y + 2 - yOffset, z + 9, Block2, 0, 3); - world.setBlock(x + 12, y + 2 - yOffset, z + 10, Block2, 0, 3); - world.setBlock(x + 13, y + 2 - yOffset, z + 10, Block2, 0, 3); - world.setBlock(x + 14, y + 2 - yOffset, z + 10, Block2, 0, 3); - world.setBlock(x + 12, y + 2 - yOffset, z + 11, Block2, 0, 3); - world.setBlock(x + 13, y + 2 - yOffset, z + 11, Block2, 0, 3); - world.setBlock(x + 14, y + 2 - yOffset, z + 11, Block2, 0, 3); - world.setBlock(x + 13, y + 2 - yOffset, z + 18, Block2, 0, 3); - world.setBlock(x + 12, y + 3 - yOffset, z + 0, Block4, 0, 3); - world.setBlock(x + 13, y + 3 - yOffset, z + 0, Block4, 0, 3); - world.setBlock(x + 14, y + 3 - yOffset, z + 0, Block4, 0, 3); - world.setBlock(x + 11, y + 3 - yOffset, z + 1, Block4, 0, 3); - world.setBlock(x + 15, y + 3 - yOffset, z + 1, Block4, 0, 3); - world.setBlock(x + 11, y + 3 - yOffset, z + 2, Block2, 0, 3); - world.setBlock(x + 15, y + 3 - yOffset, z + 2, Block2, 0, 3); - world.setBlock(x + 11, y + 3 - yOffset, z + 3, Block2, 0, 3); - world.setBlock(x + 15, y + 3 - yOffset, z + 3, Block2, 0, 3); - world.setBlock(x + 15, y + 3 - yOffset, z + 4, Block3, 0, 3); - world.setBlock(x + 15, y + 3 - yOffset, z + 5, Block3, 0, 3); - world.setBlock(x + 10, y + 3 - yOffset, z + 6, Block3, 0, 3); - world.setBlock(x + 11, y + 3 - yOffset, z + 6, Block2, 0, 3); - world.setBlock(x + 15, y + 3 - yOffset, z + 6, Block2, 0, 3); - world.setBlock(x + 10, y + 3 - yOffset, z + 7, Block3, 0, 3); - world.setBlock(x + 11, y + 3 - yOffset, z + 7, Block2, 0, 3); - world.setBlock(x + 15, y + 3 - yOffset, z + 7, Block2, 0, 3); - world.setBlock(x + 12, y + 3 - yOffset, z + 8, Block2, 0, 3); - world.setBlock(x + 13, y + 3 - yOffset, z + 8, ModBlocks.machine_battery, 2, 3); - world.setBlock(x + 14, y + 3 - yOffset, z + 8, Block2, 0, 3); - world.setBlock(x + 12, y + 3 - yOffset, z + 9, Block2, 0, 3); - world.setBlock(x + 13, y + 3 - yOffset, z + 9, ModBlocks.red_wire_coated, 0, 3); - world.setBlock(x + 14, y + 3 - yOffset, z + 9, Block2, 0, 3); - world.setBlock(x + 12, y + 3 - yOffset, z + 10, Block2, 0, 3); - world.setBlock(x + 13, y + 3 - yOffset, z + 10, Block3, 0, 3); - world.setBlock(x + 14, y + 3 - yOffset, z + 10, Block2, 0, 3); - world.setBlock(x + 12, y + 3 - yOffset, z + 11, Block2, 0, 3); - world.setBlock(x + 13, y + 3 - yOffset, z + 11, Block3, 0, 3); - world.setBlock(x + 14, y + 3 - yOffset, z + 11, Block2, 0, 3); - world.setBlock(x + 12, y + 3 - yOffset, z + 12, Block2, 0, 3); - world.setBlock(x + 13, y + 3 - yOffset, z + 12, Block2, 0, 3); - world.setBlock(x + 14, y + 3 - yOffset, z + 12, Block2, 0, 3); - world.setBlock(x + 13, y + 3 - yOffset, z + 17, Block2, 0, 3); - world.setBlock(x + 13, y + 3 - yOffset, z + 18, Block2, 0, 3); - world.setBlock(x + 12, y + 4 - yOffset, z + 0, Block2, 0, 3); - world.setBlock(x + 13, y + 4 - yOffset, z + 0, Block2, 0, 3); - world.setBlock(x + 14, y + 4 - yOffset, z + 0, Block2, 0, 3); - world.setBlock(x + 11, y + 4 - yOffset, z + 1, Block4, 0, 3); - world.setBlock(x + 12, y + 4 - yOffset, z + 1, Block2, 0, 3); - world.setBlock(x + 13, y + 4 - yOffset, z + 1, Block2, 0, 3); - world.setBlock(x + 14, y + 4 - yOffset, z + 1, Block2, 0, 3); - world.setBlock(x + 15, y + 4 - yOffset, z + 1, Block4, 0, 3); - world.setBlock(x + 11, y + 4 - yOffset, z + 2, Block4, 0, 3); - world.setBlock(x + 15, y + 4 - yOffset, z + 2, Block4, 0, 3); - world.setBlock(x + 11, y + 4 - yOffset, z + 3, Block2, 0, 3); - world.setBlock(x + 15, y + 4 - yOffset, z + 3, Block2, 0, 3); - world.setBlock(x + 11, y + 4 - yOffset, z + 4, Block2, 0, 3); - world.setBlock(x + 15, y + 4 - yOffset, z + 4, Block2, 0, 3); - world.setBlock(x + 4, y + 4 - yOffset, z + 5, Block1, 0, 3); - world.setBlock(x + 11, y + 4 - yOffset, z + 5, Block2, 0, 3); - world.setBlock(x + 15, y + 4 - yOffset, z + 5, Block2, 0, 3); - world.setBlock(x + 22, y + 4 - yOffset, z + 5, Block1, 0, 3); - world.setBlock(x + 11, y + 4 - yOffset, z + 6, Block2, 0, 3); - world.setBlock(x + 12, y + 4 - yOffset, z + 6, Block2, 0, 3); - world.setBlock(x + 14, y + 4 - yOffset, z + 6, Block2, 0, 3); - world.setBlock(x + 15, y + 4 - yOffset, z + 6, Block2, 0, 3); - world.setBlock(x + 11, y + 4 - yOffset, z + 7, Block2, 0, 3); - world.setBlock(x + 12, y + 4 - yOffset, z + 7, Block2, 0, 3); - world.setBlock(x + 13, y + 4 - yOffset, z + 7, Block2, 0, 3); - world.setBlock(x + 14, y + 4 - yOffset, z + 7, Block2, 0, 3); - world.setBlock(x + 15, y + 4 - yOffset, z + 7, Block2, 0, 3); - world.setBlock(x + 11, y + 4 - yOffset, z + 8, Block2, 0, 3); - world.setBlock(x + 12, y + 4 - yOffset, z + 8, Block2, 0, 3); - world.setBlock(x + 13, y + 4 - yOffset, z + 8, Block2, 0, 3); - world.setBlock(x + 14, y + 4 - yOffset, z + 8, Block2, 0, 3); - world.setBlock(x + 15, y + 4 - yOffset, z + 8, Block2, 0, 3); - world.setBlock(x + 11, y + 4 - yOffset, z + 9, Block2, 0, 3); - world.setBlock(x + 12, y + 4 - yOffset, z + 9, ModBlocks.block_electrical_scrap, 0, 3); - world.setBlock(x + 13, y + 4 - yOffset, z + 9, ModBlocks.red_wire_coated, 0, 3); - world.setBlock(x + 14, y + 4 - yOffset, z + 9, ModBlocks.block_electrical_scrap, 0, 3); - world.setBlock(x + 15, y + 4 - yOffset, z + 9, Block2, 0, 3); - world.setBlock(x + 11, y + 4 - yOffset, z + 10, Block2, 0, 3); - world.setBlock(x + 12, y + 4 - yOffset, z + 10, ModBlocks.block_electrical_scrap, 0, 3); - world.setBlock(x + 13, y + 4 - yOffset, z + 10, ModBlocks.red_wire_coated, 0, 3); - world.setBlock(x + 14, y + 4 - yOffset, z + 10, ModBlocks.block_electrical_scrap, 0, 3); - world.setBlock(x + 15, y + 4 - yOffset, z + 10, Block2, 0, 3); - world.setBlock(x + 11, y + 4 - yOffset, z + 11, Block2, 0, 3); - world.setBlock(x + 12, y + 4 - yOffset, z + 11, Block2, 0, 3); - world.setBlock(x + 13, y + 4 - yOffset, z + 11, Block3, 0, 3); - world.setBlock(x + 14, y + 4 - yOffset, z + 11, Block2, 0, 3); - world.setBlock(x + 15, y + 4 - yOffset, z + 11, Block2, 0, 3); - world.setBlock(x + 11, y + 4 - yOffset, z + 12, Block2, 0, 3); - world.setBlock(x + 12, y + 4 - yOffset, z + 12, Block2, 0, 3); - world.setBlock(x + 13, y + 4 - yOffset, z + 12, Block3, 0, 3); - world.setBlock(x + 14, y + 4 - yOffset, z + 12, Block2, 0, 3); - world.setBlock(x + 15, y + 4 - yOffset, z + 12, Block2, 0, 3); - world.setBlock(x + 12, y + 4 - yOffset, z + 13, Block2, 0, 3); - world.setBlock(x + 13, y + 4 - yOffset, z + 13, Block2, 0, 3); - world.setBlock(x + 14, y + 4 - yOffset, z + 13, Block2, 0, 3); - world.setBlock(x + 13, y + 4 - yOffset, z + 14, Block2, 0, 3); - world.setBlock(x + 13, y + 4 - yOffset, z + 15, Block2, 0, 3); - world.setBlock(x + 13, y + 4 - yOffset, z + 16, Block2, 0, 3); - world.setBlock(x + 13, y + 4 - yOffset, z + 17, Block2, 0, 3); - world.setBlock(x + 13, y + 4 - yOffset, z + 18, Block2, 0, 3); - world.setBlock(x + 12, y + 5 - yOffset, z + 1, Block2, 0, 3); - world.setBlock(x + 13, y + 5 - yOffset, z + 1, Block2, 0, 3); - world.setBlock(x + 14, y + 5 - yOffset, z + 1, Block2, 0, 3); - world.setBlock(x + 12, y + 5 - yOffset, z + 2, Block2, 0, 3); - world.setBlock(x + 13, y + 5 - yOffset, z + 2, Block2, 0, 3); - world.setBlock(x + 14, y + 5 - yOffset, z + 2, Block2, 0, 3); - world.setBlock(x + 11, y + 5 - yOffset, z + 3, Block2, 0, 3); - world.setBlock(x + 12, y + 5 - yOffset, z + 3, Block2, 0, 3); - world.setBlock(x + 13, y + 5 - yOffset, z + 3, Block2, 0, 3); - world.setBlock(x + 14, y + 5 - yOffset, z + 3, Block2, 0, 3); - world.setBlock(x + 15, y + 5 - yOffset, z + 3, Block2, 0, 3); - world.setBlock(x + 4, y + 5 - yOffset, z + 4, Block2, 0, 3); - world.setBlock(x + 11, y + 5 - yOffset, z + 4, Block2, 0, 3); - world.setBlock(x + 12, y + 5 - yOffset, z + 4, Block2, 0, 3); - world.setBlock(x + 13, y + 5 - yOffset, z + 4, Block2, 0, 3); - world.setBlock(x + 14, y + 5 - yOffset, z + 4, Block2, 0, 3); - world.setBlock(x + 15, y + 5 - yOffset, z + 4, Block2, 0, 3); - world.setBlock(x + 22, y + 5 - yOffset, z + 4, Block2, 0, 3); - world.setBlock(x + 3, y + 5 - yOffset, z + 5, Block2, 0, 3); - world.setBlock(x + 4, y + 5 - yOffset, z + 5, Block1, 0, 3); - world.setBlock(x + 5, y + 5 - yOffset, z + 5, Block2, 0, 3); - world.setBlock(x + 8, y + 5 - yOffset, z + 5, Block2, 0, 3); - world.setBlock(x + 9, y + 5 - yOffset, z + 5, Block2, 0, 3); - world.setBlock(x + 10, y + 5 - yOffset, z + 5, Block2, 0, 3); - world.setBlock(x + 11, y + 5 - yOffset, z + 5, Block2, 0, 3); - world.setBlock(x + 12, y + 5 - yOffset, z + 5, Block2, 0, 3); - world.setBlock(x + 13, y + 5 - yOffset, z + 5, Block2, 0, 3); - world.setBlock(x + 14, y + 5 - yOffset, z + 5, Block2, 0, 3); - world.setBlock(x + 15, y + 5 - yOffset, z + 5, Block2, 0, 3); - world.setBlock(x + 16, y + 5 - yOffset, z + 5, Block2, 0, 3); - world.setBlock(x + 17, y + 5 - yOffset, z + 5, Block2, 0, 3); - world.setBlock(x + 18, y + 5 - yOffset, z + 5, Block2, 0, 3); - world.setBlock(x + 21, y + 5 - yOffset, z + 5, Block2, 0, 3); - world.setBlock(x + 22, y + 5 - yOffset, z + 5, Block1, 0, 3); - world.setBlock(x + 23, y + 5 - yOffset, z + 5, Block2, 0, 3); - world.setBlock(x + 4, y + 5 - yOffset, z + 6, Block2, 0, 3); - world.setBlock(x + 11, y + 5 - yOffset, z + 6, Block2, 0, 3); - world.setBlock(x + 12, y + 5 - yOffset, z + 6, Block2, 0, 3); - world.setBlock(x + 13, y + 5 - yOffset, z + 6, Block2, 0, 3); - world.setBlock(x + 14, y + 5 - yOffset, z + 6, Block2, 0, 3); - world.setBlock(x + 15, y + 5 - yOffset, z + 6, Block2, 0, 3); - world.setBlock(x + 22, y + 5 - yOffset, z + 6, Block2, 0, 3); - world.setBlock(x + 11, y + 5 - yOffset, z + 7, Block2, 0, 3); - world.setBlock(x + 12, y + 5 - yOffset, z + 7, Block2, 0, 3); - world.setBlock(x + 13, y + 5 - yOffset, z + 7, Block2, 0, 3); - world.setBlock(x + 14, y + 5 - yOffset, z + 7, Block2, 0, 3); - world.setBlock(x + 15, y + 5 - yOffset, z + 7, Block2, 0, 3); - world.setBlock(x + 11, y + 5 - yOffset, z + 8, Block2, 0, 3); - world.setBlock(x + 12, y + 5 - yOffset, z + 8, Block2, 0, 3); - world.setBlock(x + 13, y + 5 - yOffset, z + 8, Block2, 0, 3); - world.setBlock(x + 14, y + 5 - yOffset, z + 8, Block2, 0, 3); - world.setBlock(x + 15, y + 5 - yOffset, z + 8, Block2, 0, 3); - world.setBlock(x + 11, y + 5 - yOffset, z + 9, Block2, 0, 3); - world.setBlock(x + 12, y + 5 - yOffset, z + 9, ModBlocks.block_electrical_scrap, 0, 3); - world.setBlock(x + 13, y + 5 - yOffset, z + 9, ModBlocks.red_wire_coated, 0, 3); - world.setBlock(x + 14, y + 5 - yOffset, z + 9, ModBlocks.block_electrical_scrap, 0, 3); - world.setBlock(x + 15, y + 5 - yOffset, z + 9, Block2, 0, 3); - world.setBlock(x + 11, y + 5 - yOffset, z + 10, Block2, 0, 3); - world.setBlock(x + 12, y + 5 - yOffset, z + 10, ModBlocks.block_electrical_scrap, 0, 3); - world.setBlock(x + 13, y + 5 - yOffset, z + 10, ModBlocks.red_wire_coated, 0, 3); - world.setBlock(x + 14, y + 5 - yOffset, z + 10, ModBlocks.block_electrical_scrap, 0, 3); - world.setBlock(x + 15, y + 5 - yOffset, z + 10, Block2, 0, 3); - world.setBlock(x + 12, y + 5 - yOffset, z + 11, Block2, 0, 3); - world.setBlock(x + 13, y + 5 - yOffset, z + 11, ModBlocks.red_wire_coated, 0, 3); - world.setBlock(x + 14, y + 5 - yOffset, z + 11, Block2, 0, 3); - world.setBlock(x + 12, y + 5 - yOffset, z + 12, Block2, 0, 3); - world.setBlock(x + 13, y + 5 - yOffset, z + 12, ModBlocks.red_wire_coated, 0, 3); - world.setBlock(x + 14, y + 5 - yOffset, z + 12, Block2, 0, 3); - world.setBlock(x + 12, y + 5 - yOffset, z + 13, Block2, 0, 3); - world.setBlock(x + 13, y + 5 - yOffset, z + 13, ModBlocks.red_wire_coated, 0, 3); - world.setBlock(x + 14, y + 5 - yOffset, z + 13, Block2, 0, 3); - world.setBlock(x + 12, y + 5 - yOffset, z + 14, Block2, 0, 3); - world.setBlock(x + 13, y + 5 - yOffset, z + 14, ModBlocks.red_wire_coated, 0, 3); - world.setBlock(x + 14, y + 5 - yOffset, z + 14, Block2, 0, 3); - world.setBlock(x + 12, y + 5 - yOffset, z + 15, Block2, 0, 3); - world.setBlock(x + 13, y + 5 - yOffset, z + 15, ModBlocks.red_wire_coated, 0, 3); - world.setBlock(x + 14, y + 5 - yOffset, z + 15, Block2, 0, 3); - world.setBlock(x + 9, y + 5 - yOffset, z + 16, Block2, 0, 3); - world.setBlock(x + 10, y + 5 - yOffset, z + 16, Block2, 0, 3); - world.setBlock(x + 11, y + 5 - yOffset, z + 16, Block2, 0, 3); - world.setBlock(x + 12, y + 5 - yOffset, z + 16, Block2, 0, 3); - world.setBlock(x + 13, y + 5 - yOffset, z + 16, ModBlocks.red_wire_coated, 0, 3); - world.setBlock(x + 14, y + 5 - yOffset, z + 16, Block2, 0, 3); - world.setBlock(x + 15, y + 5 - yOffset, z + 16, Block2, 0, 3); - world.setBlock(x + 16, y + 5 - yOffset, z + 16, Block2, 0, 3); - world.setBlock(x + 17, y + 5 - yOffset, z + 16, Block2, 0, 3); - world.setBlock(x + 8, y + 5 - yOffset, z + 17, Block2, 0, 3); - world.setBlock(x + 9, y + 5 - yOffset, z + 17, Block2, 0, 3); - world.setBlock(x + 10, y + 5 - yOffset, z + 17, Block2, 0, 3); - world.setBlock(x + 11, y + 5 - yOffset, z + 17, Block2, 0, 3); - world.setBlock(x + 12, y + 5 - yOffset, z + 17, Block2, 0, 3); - world.setBlock(x + 13, y + 5 - yOffset, z + 17, ModBlocks.red_wire_coated, 0, 3); - world.setBlock(x + 14, y + 5 - yOffset, z + 17, Block2, 0, 3); - world.setBlock(x + 15, y + 5 - yOffset, z + 17, Block2, 0, 3); - world.setBlock(x + 16, y + 5 - yOffset, z + 17, Block2, 0, 3); - world.setBlock(x + 17, y + 5 - yOffset, z + 17, Block2, 0, 3); - world.setBlock(x + 18, y + 5 - yOffset, z + 17, Block2, 0, 3); - world.setBlock(x + 12, y + 5 - yOffset, z + 18, Block2, 0, 3); - world.setBlock(x + 13, y + 5 - yOffset, z + 18, ModBlocks.red_wire_coated, 0, 3); - world.setBlock(x + 14, y + 5 - yOffset, z + 18, Block2, 0, 3); - world.setBlock(x + 13, y + 5 - yOffset, z + 19, Block1, 0, 3); - world.setBlock(x + 12, y + 6 - yOffset, z + 1, Block1, 0, 3); - world.setBlock(x + 14, y + 6 - yOffset, z + 1, Block1, 0, 3); - world.setBlock(x + 12, y + 6 - yOffset, z + 3, Block2, 0, 3); - world.setBlock(x + 13, y + 6 - yOffset, z + 3, Block2, 0, 3); - world.setBlock(x + 14, y + 6 - yOffset, z + 3, Block2, 0, 3); - world.setBlock(x + 4, y + 6 - yOffset, z + 4, Block2, 0, 3); - world.setBlock(x + 11, y + 6 - yOffset, z + 4, Block2, 0, 3); - world.setBlock(x + 12, y + 6 - yOffset, z + 4, Block2, 0, 3); - world.setBlock(x + 13, y + 6 - yOffset, z + 4, Block2, 0, 3); - world.setBlock(x + 14, y + 6 - yOffset, z + 4, Block2, 0, 3); - world.setBlock(x + 15, y + 6 - yOffset, z + 4, Block2, 0, 3); - world.setBlock(x + 22, y + 6 - yOffset, z + 4, Block2, 0, 3); - world.setBlock(x + 3, y + 6 - yOffset, z + 5, Block2, 0, 3); - world.setBlock(x + 4, y + 6 - yOffset, z + 5, Block1, 0, 3); - world.setBlock(x + 5, y + 6 - yOffset, z + 5, Block2, 0, 3); - world.setBlock(x + 6, y + 6 - yOffset, z + 5, Block2, 0, 3); - world.setBlock(x + 7, y + 6 - yOffset, z + 5, Block2, 0, 3); - world.setBlock(x + 8, y + 6 - yOffset, z + 5, Block2, 0, 3); - world.setBlock(x + 9, y + 6 - yOffset, z + 5, Block2, 0, 3); - world.setBlock(x + 10, y + 6 - yOffset, z + 5, Block2, 0, 3); - world.setBlock(x + 11, y + 6 - yOffset, z + 5, Block2, 0, 3); - world.setBlock(x + 12, y + 6 - yOffset, z + 5, Block2, 0, 3); - world.setBlock(x + 13, y + 6 - yOffset, z + 5, Block2, 0, 3); - world.setBlock(x + 14, y + 6 - yOffset, z + 5, Block2, 0, 3); - world.setBlock(x + 15, y + 6 - yOffset, z + 5, Block2, 0, 3); - world.setBlock(x + 16, y + 6 - yOffset, z + 5, Block2, 0, 3); - world.setBlock(x + 17, y + 6 - yOffset, z + 5, Block2, 0, 3); - world.setBlock(x + 18, y + 6 - yOffset, z + 5, Block2, 0, 3); - world.setBlock(x + 19, y + 6 - yOffset, z + 5, Block2, 0, 3); - world.setBlock(x + 20, y + 6 - yOffset, z + 5, Block2, 0, 3); - world.setBlock(x + 21, y + 6 - yOffset, z + 5, Block2, 0, 3); - world.setBlock(x + 22, y + 6 - yOffset, z + 5, Block1, 0, 3); - world.setBlock(x + 23, y + 6 - yOffset, z + 5, Block2, 0, 3); - world.setBlock(x + 4, y + 6 - yOffset, z + 6, Block2, 0, 3); - world.setBlock(x + 11, y + 6 - yOffset, z + 6, Block2, 0, 3); - world.setBlock(x + 12, y + 6 - yOffset, z + 6, Block2, 0, 3); - world.setBlock(x + 13, y + 6 - yOffset, z + 6, Blocks.chest, 2, 3); - if(world.getBlock(x + 13, y + 6 - yOffset, z + 6) == Blocks.chest) - { - WeightedRandomChestContent.generateChestContents(rand, ItemPool.getPool(ItemPoolsLegacy.POOL_VERTIBIRD), (TileEntityChest)world.getTileEntity(x + 13, y + 6 - yOffset, z + 6), 8); - } - world.setBlock(x + 14, y + 6 - yOffset, z + 6, Block2, 0, 3); - world.setBlock(x + 15, y + 6 - yOffset, z + 6, Block2, 0, 3); - world.setBlock(x + 22, y + 6 - yOffset, z + 6, Block2, 0, 3); - world.setBlock(x + 11, y + 6 - yOffset, z + 7, Block2, 0, 3); - world.setBlock(x + 12, y + 6 - yOffset, z + 7, Block2, 0, 3); - world.setBlock(x + 13, y + 6 - yOffset, z + 7, Block2, 0, 3); - world.setBlock(x + 14, y + 6 - yOffset, z + 7, Block2, 0, 3); - world.setBlock(x + 15, y + 6 - yOffset, z + 7, Block2, 0, 3); - world.setBlock(x + 11, y + 6 - yOffset, z + 8, Block2, 0, 3); - world.setBlock(x + 12, y + 6 - yOffset, z + 8, Block2, 0, 3); - world.setBlock(x + 13, y + 6 - yOffset, z + 8, Block2, 0, 3); - world.setBlock(x + 14, y + 6 - yOffset, z + 8, Block2, 0, 3); - world.setBlock(x + 15, y + 6 - yOffset, z + 8, Block2, 0, 3); - world.setBlock(x + 12, y + 6 - yOffset, z + 9, Block2, 0, 3); - world.setBlock(x + 13, y + 6 - yOffset, z + 9, Block3, 0, 3); - world.setBlock(x + 14, y + 6 - yOffset, z + 9, Block2, 0, 3); - world.setBlock(x + 12, y + 6 - yOffset, z + 10, Block2, 0, 3); - world.setBlock(x + 13, y + 6 - yOffset, z + 10, Block3, 0, 3); - world.setBlock(x + 14, y + 6 - yOffset, z + 10, Block2, 0, 3); - world.setBlock(x + 12, y + 6 - yOffset, z + 11, Block2, 0, 3); - world.setBlock(x + 13, y + 6 - yOffset, z + 11, Block2, 0, 3); - world.setBlock(x + 14, y + 6 - yOffset, z + 11, Block2, 0, 3); - world.setBlock(x + 12, y + 6 - yOffset, z + 12, Block2, 0, 3); - world.setBlock(x + 13, y + 6 - yOffset, z + 12, Block2, 0, 3); - world.setBlock(x + 14, y + 6 - yOffset, z + 12, Block2, 0, 3); - world.setBlock(x + 13, y + 6 - yOffset, z + 13, Block2, 0, 3); - world.setBlock(x + 13, y + 6 - yOffset, z + 14, Block2, 0, 3); - world.setBlock(x + 13, y + 6 - yOffset, z + 17, Block2, 0, 3); - world.setBlock(x + 13, y + 6 - yOffset, z + 18, Block2, 0, 3); - world.setBlock(x + 4, y + 7 - yOffset, z + 4, Block2, 0, 3); - world.setBlock(x + 13, y + 7 - yOffset, z + 4, Block2, 0, 3); - world.setBlock(x + 22, y + 7 - yOffset, z + 4, Block2, 0, 3); - world.setBlock(x + 3, y + 7 - yOffset, z + 5, Block2, 0, 3); - world.setBlock(x + 4, y + 7 - yOffset, z + 5, Block1, 0, 3); - world.setBlock(x + 5, y + 7 - yOffset, z + 5, Block2, 0, 3); - world.setBlock(x + 12, y + 7 - yOffset, z + 5, Block2, 0, 3); - world.setBlock(x + 13, y + 7 - yOffset, z + 5, Block2, 0, 3); - world.setBlock(x + 14, y + 7 - yOffset, z + 5, Block2, 0, 3); - world.setBlock(x + 21, y + 7 - yOffset, z + 5, Block2, 0, 3); - world.setBlock(x + 22, y + 7 - yOffset, z + 5, Block1, 0, 3); - world.setBlock(x + 23, y + 7 - yOffset, z + 5, Block2, 0, 3); - world.setBlock(x + 4, y + 7 - yOffset, z + 6, Block2, 0, 3); - world.setBlock(x + 12, y + 7 - yOffset, z + 6, Block2, 0, 3); - world.setBlock(x + 13, y + 7 - yOffset, z + 6, Block2, 0, 3); - world.setBlock(x + 14, y + 7 - yOffset, z + 6, Block2, 0, 3); - world.setBlock(x + 22, y + 7 - yOffset, z + 6, Block2, 0, 3); - world.setBlock(x + 12, y + 7 - yOffset, z + 7, Block2, 0, 3); - world.setBlock(x + 13, y + 7 - yOffset, z + 7, Block2, 0, 3); - world.setBlock(x + 14, y + 7 - yOffset, z + 7, Block2, 0, 3); - world.setBlock(x + 12, y + 7 - yOffset, z + 8, Block2, 0, 3); - world.setBlock(x + 13, y + 7 - yOffset, z + 8, Block2, 0, 3); - world.setBlock(x + 14, y + 7 - yOffset, z + 8, Block2, 0, 3); - world.setBlock(x + 13, y + 7 - yOffset, z + 9, Block2, 0, 3); - world.setBlock(x + 13, y + 7 - yOffset, z + 10, Block2, 0, 3); - world.setBlock(x + 13, y + 7 - yOffset, z + 11, Block2, 0, 3); - world.setBlock(x + 4, y + 8 - yOffset, z + 4, Block2, 0, 3); - world.setBlock(x + 22, y + 8 - yOffset, z + 4, Block2, 0, 3); - world.setBlock(x + 3, y + 8 - yOffset, z + 5, Block2, 0, 3); - world.setBlock(x + 4, y + 8 - yOffset, z + 5, Block1, 0, 3); - world.setBlock(x + 5, y + 8 - yOffset, z + 5, Block2, 0, 3); - world.setBlock(x + 21, y + 8 - yOffset, z + 5, Block2, 0, 3); - world.setBlock(x + 22, y + 8 - yOffset, z + 5, Block1, 0, 3); - world.setBlock(x + 23, y + 8 - yOffset, z + 5, Block2, 0, 3); - world.setBlock(x + 4, y + 8 - yOffset, z + 6, Block2, 0, 3); - world.setBlock(x + 22, y + 8 - yOffset, z + 6, Block2, 0, 3); - world.setBlock(x + 4, y + 9 - yOffset, z + 5, Block1, 0, 3); - world.setBlock(x + 22, y + 9 - yOffset, z + 5, Block1, 0, 3); - world.setBlock(x + 4, y + 10 - yOffset, z + 1, Block3, 0, 3); - world.setBlock(x + 22, y + 10 - yOffset, z + 1, Block3, 0, 3); - world.setBlock(x + 4, y + 10 - yOffset, z + 2, Block3, 0, 3); - world.setBlock(x + 22, y + 10 - yOffset, z + 2, Block3, 0, 3); - world.setBlock(x + 4, y + 10 - yOffset, z + 3, Block3, 0, 3); - world.setBlock(x + 22, y + 10 - yOffset, z + 3, Block3, 0, 3); - world.setBlock(x + 4, y + 10 - yOffset, z + 4, Block3, 0, 3); - world.setBlock(x + 22, y + 10 - yOffset, z + 4, Block3, 0, 3); - world.setBlock(x + 0, y + 10 - yOffset, z + 5, Block3, 0, 3); - world.setBlock(x + 1, y + 10 - yOffset, z + 5, Block3, 0, 3); - world.setBlock(x + 2, y + 10 - yOffset, z + 5, Block3, 0, 3); - world.setBlock(x + 3, y + 10 - yOffset, z + 5, Block3, 0, 3); - world.setBlock(x + 4, y + 10 - yOffset, z + 5, Block1, 0, 3); - world.setBlock(x + 5, y + 10 - yOffset, z + 5, Block3, 0, 3); - world.setBlock(x + 6, y + 10 - yOffset, z + 5, Block3, 0, 3); - world.setBlock(x + 7, y + 10 - yOffset, z + 5, Block3, 0, 3); - world.setBlock(x + 8, y + 10 - yOffset, z + 5, Block3, 0, 3); - world.setBlock(x + 18, y + 10 - yOffset, z + 5, Block3, 0, 3); - world.setBlock(x + 19, y + 10 - yOffset, z + 5, Block3, 0, 3); - world.setBlock(x + 20, y + 10 - yOffset, z + 5, Block3, 0, 3); - world.setBlock(x + 21, y + 10 - yOffset, z + 5, Block3, 0, 3); - world.setBlock(x + 22, y + 10 - yOffset, z + 5, Block1, 0, 3); - world.setBlock(x + 23, y + 10 - yOffset, z + 5, Block3, 0, 3); - world.setBlock(x + 24, y + 10 - yOffset, z + 5, Block3, 0, 3); - world.setBlock(x + 25, y + 10 - yOffset, z + 5, Block3, 0, 3); - world.setBlock(x + 26, y + 10 - yOffset, z + 5, Block3, 0, 3); - world.setBlock(x + 4, y + 10 - yOffset, z + 6, Block3, 0, 3); - world.setBlock(x + 22, y + 10 - yOffset, z + 6, Block3, 0, 3); - world.setBlock(x + 4, y + 10 - yOffset, z + 7, Block3, 0, 3); - world.setBlock(x + 22, y + 10 - yOffset, z + 7, Block3, 0, 3); - world.setBlock(x + 4, y + 10 - yOffset, z + 8, Block3, 0, 3); - world.setBlock(x + 22, y + 10 - yOffset, z + 8, Block3, 0, 3); - world.setBlock(x + 4, y + 10 - yOffset, z + 9, Block3, 0, 3); - world.setBlock(x + 22, y + 10 - yOffset, z + 9, Block3, 0, 3); - - generate_r02_last(world, rand, x, y, z, yOffset); - return true; - - } - public boolean generate_r02_last(World world, Random rand, int x, int y, int z, int yOffset) - { - - world.setBlock(x + 12, y + 2 - yOffset, z + 1, Blocks.lever, 3, 3); - world.setBlock(x + 14, y + 2 - yOffset, z + 1, Blocks.lever, 3, 3); - if(GeneralConfig.enableDebugMode) - System.out.print("[Debug] Successfully spawned Vertibird at " + x + " " + y +" " + z + "\n"); - return true; - - } - -} \ No newline at end of file diff --git a/src/main/java/com/hbm/world/gen/INBTTileEntityTransformable.java b/src/main/java/com/hbm/world/gen/INBTTileEntityTransformable.java new file mode 100644 index 000000000..33dc141c8 --- /dev/null +++ b/src/main/java/com/hbm/world/gen/INBTTileEntityTransformable.java @@ -0,0 +1,14 @@ +package com.hbm.world.gen; + +import net.minecraft.world.World; + +public interface INBTTileEntityTransformable { + + /** + * Like INBTTransformable but for TileEntities, like for randomizing bobbleheads + */ + + // Allows for the TE to modify itself when spawned in an NBT structure + public void transformTE(World world, int coordBaseMode); + +} \ No newline at end of file diff --git a/src/main/java/com/hbm/world/gen/INBTTransformable.java b/src/main/java/com/hbm/world/gen/INBTTransformable.java new file mode 100644 index 000000000..b42d6bd43 --- /dev/null +++ b/src/main/java/com/hbm/world/gen/INBTTransformable.java @@ -0,0 +1,161 @@ +package com.hbm.world.gen; + +import net.minecraft.block.Block; + +public interface INBTTransformable { + + /** + * Defines this block as something that has a rotation or some other blockstate + * which needs transformations applied when building from an .nbt structure file + */ + + // Takes the block current meta and translates it into a rotated meta + public int transformMeta(int meta, int coordBaseMode); + + // Takes the block and turns it into a different block entirely, to turn off lights, shit like that + public default Block transformBlock(Block block) { + return block; + } + + + /** + * A fair few blocks have generalized rotations so, since we have all this space, put em here + */ + + public static int transformMetaDeco(int meta, int coordBaseMode) { + switch(coordBaseMode) { + case 1: //West + switch(meta) { + case 2: return 5; + case 3: return 4; + case 4: return 2; + case 5: return 3; + } + case 2: //North + switch(meta) { + case 2: return 3; + case 3: return 2; + case 4: return 5; + case 5: return 4; + } + case 3: //East + switch(meta) { + case 2: return 4; + case 3: return 5; + case 4: return 3; + case 5: return 2; + } + } + return meta; + } + + public static int transformMetaDecoModel(int meta, int coordBaseMode) { + int rot = (meta + coordBaseMode) % 4; + int type = (meta / 4) * 4; + + return rot | type; + } + + public static int transformMetaStairs(int meta, int coordBaseMode) { + switch(coordBaseMode) { + case 1: //West + if((meta & 3) < 2) //Flip second bit for E/W + meta = meta ^ 2; + else + meta = meta ^ 3; //Flip both bits for N/S + break; + case 2: //North + meta = meta ^ 1; //Flip first bit + break; + case 3: //East + if((meta & 3) < 2) //Flip both bits for E/W + meta = meta ^ 3; + else //Flip second bit for N/S + meta = meta ^ 2; + break; + } + + return meta; + } + + public static int transformMetaPillar(int meta, int coordBaseMode) { + if(coordBaseMode == 2) return meta; + int type = meta & 3; + int rot = meta & 12; + + if(rot == 4) return type | 8; + if(rot == 8) return type | 4; + + return meta; + } + + public static int transformMetaDirectional(int meta, int coordBaseMode) { + int rot = meta & 3; + int other = meta & 12; + + switch(coordBaseMode) { + default: //S + break; + case 1: //W + rot = (rot + 1) % 4; break; + case 2: //N + rot ^= 2; break; + case 3: //E + rot = (rot + 3) % 4; break; + } + + return other | rot; + } + + public static int transformMetaTorch(int meta, int coordBaseMode) { + switch(coordBaseMode) { + case 1: //West + switch(meta) { + case 1: return 3; + case 2: return 4; + case 3: return 2; + case 4: return 1; + } + case 2: //North + switch(meta) { + case 1: return 2; + case 2: return 1; + case 3: return 4; + case 4: return 3; + } + case 3: //East + switch(meta) { + case 1: return 4; + case 2: return 3; + case 3: return 1; + case 4: return 2; + } + } + return meta; + } + + public static int transformMetaDoor(int meta, int coordBaseMode) { + if(meta == 8 || meta == 9) return meta; // ignore top parts + + return transformMetaDirectional(meta, coordBaseMode); + } + + public static int transformMetaLever(int meta, int coordBaseMode) { + if(meta <= 0 || meta >= 7) { //levers suck ass + switch(coordBaseMode) { + case 1: case 3: //west / east + meta ^= 0b111; + } + } else if(meta >= 5) { + switch(coordBaseMode) { + case 1: case 3: //west / east + meta = (meta + 1) % 2 + 5; + } + } else { + meta = transformMetaTorch(meta, coordBaseMode); + } + + return meta; + } + +} \ No newline at end of file diff --git a/src/main/java/com/hbm/world/gen/NBTStructure.java b/src/main/java/com/hbm/world/gen/NBTStructure.java new file mode 100644 index 000000000..6ec619378 --- /dev/null +++ b/src/main/java/com/hbm/world/gen/NBTStructure.java @@ -0,0 +1,1167 @@ +package com.hbm.world.gen; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.*; +import java.util.function.Function; +import java.util.function.Predicate; + +import com.hbm.blocks.ModBlocks; +import com.hbm.blocks.generic.BlockWand; +import com.hbm.config.GeneralConfig; +import com.hbm.config.StructureConfig; +import com.hbm.handler.ThreeInts; +import com.hbm.main.MainRegistry; +import com.hbm.util.Tuple.Pair; +import com.hbm.util.Tuple.Quartet; + +import cpw.mods.fml.common.registry.GameRegistry; +import net.minecraft.block.*; +import net.minecraft.client.Minecraft; +import net.minecraft.init.Blocks; +import net.minecraft.item.Item; +import net.minecraft.nbt.CompressedStreamTools; +import net.minecraft.nbt.NBTBase; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagInt; +import net.minecraft.nbt.NBTTagList; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.MathHelper; +import net.minecraft.util.ResourceLocation; +import net.minecraft.world.World; +import net.minecraft.world.biome.BiomeGenBase; +import net.minecraft.world.chunk.IChunkProvider; +import net.minecraft.world.gen.structure.MapGenStructure; +import net.minecraft.world.gen.structure.MapGenStructureIO; +import net.minecraft.world.gen.structure.StructureBoundingBox; +import net.minecraft.world.gen.structure.StructureComponent; +import net.minecraft.world.gen.structure.StructureComponent.BlockSelector; +import net.minecraft.world.gen.structure.StructureStart; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.common.util.Constants.NBT; + +public class NBTStructure { + + /** + * Now with structure support! + * + * the type of structure to generate is saved into the Component, + * meaning this can generate all sorts of different structures, + * without having to define and register each structure manually + */ + + protected static Map> weightedMap = new HashMap<>(); + + // serialization data + protected static Map jigsawMap = new HashMap<>(); + + private String name; + + private boolean isLoaded; + + private ThreeInts size; + private List> itemPalette; + private BlockState[][][] blockArray; + + private List> fromConnections; + private Map> toTopConnections; + private Map> toBottomConnections; + private Map> toHorizontalConnections; + + public NBTStructure(ResourceLocation resource) { + // Can't use regular resource loading, servers don't know how! + InputStream stream = NBTStructure.class.getResourceAsStream("/assets/" + resource.getResourceDomain() + "/" + resource.getResourcePath()); + if(stream != null) { + name = resource.getResourcePath(); + loadStructure(stream); + } else { + MainRegistry.logger.error("NBT Structure not found: " + resource.getResourcePath()); + } + } + + public static void register() { + MapGenStructureIO.registerStructure(Start.class, "NBTStructures"); + MapGenStructureIO.func_143031_a(Component.class, "NBTComponents"); + } + + // Register a new structure for a given dimension + public static void registerStructure(int dimensionId, SpawnCondition spawn) { + List weightedList = weightedMap.computeIfAbsent(dimensionId, integer -> new ArrayList()); + for(int i = 0; i < spawn.spawnWeight; i++) { + weightedList.add(spawn); + } + } + + public static void registerStructure(SpawnCondition spawn, int... dimensionIds) { + for(int dimensionId : dimensionIds) { + registerStructure(dimensionId, spawn); + } + } + + // Add a chance for nothing to spawn at a given valid spawn location + public static void registerNullWeight(int dimensionId, int weight) { + registerNullWeight(dimensionId, weight, null); + } + + public static void registerNullWeight(int dimensionId, int weight, Predicate predicate) { + SpawnCondition spawn = new SpawnCondition() {{ + spawnWeight = weight; + canSpawn = predicate; + }}; + + List weightedList = weightedMap.computeIfAbsent(dimensionId, integer -> new ArrayList()); + for(int i = 0; i < spawn.spawnWeight; i++) { + weightedList.add(spawn); + } + } + + // Saves a selected area into an NBT structure (+ some of our non-standard stuff to support 1.7.10) + public static void saveArea(String filename, World world, int x1, int y1, int z1, int x2, int y2, int z2, Set> exclude) { + NBTTagCompound structure = new NBTTagCompound(); + NBTTagList nbtBlocks = new NBTTagList(); + NBTTagList nbtPalette = new NBTTagList(); + NBTTagList nbtItemPalette = new NBTTagList(); + + // Quick access hash slinging slashers + Map, Integer> palette = new HashMap<>(); + Map itemPalette = new HashMap<>(); + + structure.setInteger("version", 1); + + int ox = Math.min(x1, x2); + int oy = Math.min(y1, y2); + int oz = Math.min(z1, z2); + + for(int x = ox; x <= Math.max(x1, x2); x++) { + for(int y = oy; y <= Math.max(y1, y2); y++) { + for(int z = oz; z <= Math.max(z1, z2); z++) { + Pair block = new Pair(world.getBlock(x, y, z), world.getBlockMetadata(x, y, z)); + + if(exclude.contains(block)) continue; + + if(block.key instanceof BlockWand) { + block.key = ((BlockWand) block.key).exportAs; + } + + int paletteId = palette.size(); + if(palette.containsKey(block)) { + paletteId = palette.get(block); + } else { + palette.put(block, paletteId); + + NBTTagCompound nbtBlock = new NBTTagCompound(); + nbtBlock.setString("Name", GameRegistry.findUniqueIdentifierFor(block.key).toString()); + + NBTTagCompound nbtProp = new NBTTagCompound(); + nbtProp.setString("meta", block.value.toString()); + + nbtBlock.setTag("Properties", nbtProp); + + nbtPalette.appendTag(nbtBlock); + } + + NBTTagCompound nbtBlock = new NBTTagCompound(); + nbtBlock.setInteger("state", paletteId); + + NBTTagList nbtPos = new NBTTagList(); + nbtPos.appendTag(new NBTTagInt(x - ox)); + nbtPos.appendTag(new NBTTagInt(y - oy)); + nbtPos.appendTag(new NBTTagInt(z - oz)); + + nbtBlock.setTag("pos", nbtPos); + + TileEntity te = world.getTileEntity(x, y, z); + if(te != null) { + NBTTagCompound nbt = new NBTTagCompound(); + te.writeToNBT(nbt); + + nbt.removeTag("x"); + nbt.removeTag("y"); + nbt.removeTag("z"); + + nbtBlock.setTag("nbt", nbt); + + String itemKey = null; + if(nbt.hasKey("items")) itemKey = "items"; + if(nbt.hasKey("Items")) itemKey = "Items"; + + if(nbt.hasKey(itemKey)) { + NBTTagList items = nbt.getTagList(itemKey, NBT.TAG_COMPOUND); + for(int i = 0; i < items.tagCount(); i++) { + NBTTagCompound item = items.getCompoundTagAt(i); + short id = item.getShort("id"); + String name = GameRegistry.findUniqueIdentifierFor(Item.getItemById(id)).toString(); + + if(!itemPalette.containsKey(id)) { + int itemPaletteId = itemPalette.size(); + itemPalette.put(id, itemPaletteId); + + NBTTagCompound nbtItem = new NBTTagCompound(); + nbtItem.setShort("ID", id); + nbtItem.setString("Name", name); + + nbtItemPalette.appendTag(nbtItem); + } + } + } + } + + nbtBlocks.appendTag(nbtBlock); + } + } + } + + structure.setTag("blocks", nbtBlocks); + structure.setTag("palette", nbtPalette); + structure.setTag("itemPalette", nbtItemPalette); + + NBTTagList nbtSize = new NBTTagList(); + nbtSize.appendTag(new NBTTagInt(Math.abs(x1 - x2) + 1)); + nbtSize.appendTag(new NBTTagInt(Math.abs(y1 - y2) + 1)); + nbtSize.appendTag(new NBTTagInt(Math.abs(z1 - z2) + 1)); + structure.setTag("size", nbtSize); + + structure.setTag("entities", new NBTTagList()); + + try { + File structureDirectory = new File(Minecraft.getMinecraft().mcDataDir, "structures"); + structureDirectory.mkdir(); + + File structureFile = new File(structureDirectory, filename); + + CompressedStreamTools.writeCompressed(structure, new FileOutputStream(structureFile)); + } catch (Exception ex) { + MainRegistry.logger.warn("Failed to save NBT structure", ex); + } + } + + private void loadStructure(InputStream inputStream) { + try { + NBTTagCompound data = CompressedStreamTools.readCompressed(inputStream); + + + // GET SIZE (for offsetting to center) + size = parsePos(data.getTagList("size", NBT.TAG_INT)); + + + // PARSE BLOCK PALETTE + NBTTagList paletteList = data.getTagList("palette", NBT.TAG_COMPOUND); + BlockDefinition[] palette = new BlockDefinition[paletteList.tagCount()]; + + for(int i = 0; i < paletteList.tagCount(); i++) { + NBTTagCompound p = paletteList.getCompoundTagAt(i); + + String blockName = p.getString("Name"); + NBTTagCompound prop = p.getCompoundTag("Properties"); + + int meta = 0; + try { + meta = Integer.parseInt(prop.getString("meta")); + } catch(NumberFormatException ex) { + MainRegistry.logger.info("Failed to parse: " + prop.getString("meta")); + meta = 0; + } + + palette[i] = new BlockDefinition(blockName, meta); + } + + + // PARSE ITEM PALETTE (custom shite) + if(data.hasKey("itemPalette")) { + NBTTagList itemPaletteList = data.getTagList("itemPalette", NBT.TAG_COMPOUND); + itemPalette = new ArrayList<>(itemPaletteList.tagCount()); + + for(int i = 0; i < itemPaletteList.tagCount(); i++) { + NBTTagCompound p = itemPaletteList.getCompoundTagAt(i); + + short id = p.getShort("ID"); + String name = p.getString("Name"); + + itemPalette.add(new Pair<>(id, name)); + } + } else { + itemPalette = null; + } + + + // LOAD IN BLOCKS + NBTTagList blockData = data.getTagList("blocks", NBT.TAG_COMPOUND); + blockArray = new BlockState[size.x][size.y][size.z]; + + List connections = new ArrayList<>(); + + for(int i = 0; i < blockData.tagCount(); i++) { + NBTTagCompound block = blockData.getCompoundTagAt(i); + int state = block.getInteger("state"); + ThreeInts pos = parsePos(block.getTagList("pos", NBT.TAG_INT)); + + BlockState blockState = new BlockState(palette[state]); + + if(block.hasKey("nbt")) { + NBTTagCompound nbt = block.getCompoundTag("nbt"); + blockState.nbt = nbt; + + // Load in connection points for jigsaws + if(blockState.definition.block == ModBlocks.wand_jigsaw) { + if(toTopConnections == null) toTopConnections = new HashMap<>(); + if(toBottomConnections == null) toBottomConnections = new HashMap<>(); + if(toHorizontalConnections == null) toHorizontalConnections = new HashMap<>(); + + int selectionPriority = nbt.getInteger("selection"); + int placementPriority = nbt.getInteger("placement"); + ForgeDirection direction = ForgeDirection.getOrientation(nbt.getInteger("direction")); + String poolName = nbt.getString("pool"); + String ourName = nbt.getString("name"); + String targetName = nbt.getString("target"); + String replaceBlock = nbt.getString("block"); + int replaceMeta = nbt.getInteger("meta"); + boolean isRollable = nbt.getBoolean("roll"); + + JigsawConnection connection = new JigsawConnection(pos, direction, poolName, targetName, isRollable, selectionPriority, placementPriority); + + connections.add(connection); + + Map> toConnections = null; + if(direction == ForgeDirection.UP) { + toConnections = toTopConnections; + } else if(direction == ForgeDirection.DOWN) { + toConnections = toBottomConnections; + } else { + toConnections = toHorizontalConnections; + } + + List namedConnections = toConnections.computeIfAbsent(ourName, name -> new ArrayList<>()); + namedConnections.add(connection); + + if(!StructureConfig.debugStructures) { + blockState = new BlockState(new BlockDefinition(replaceBlock, replaceMeta)); + } + } + } + + blockArray[pos.x][pos.y][pos.z] = blockState; + } + + + // MAP OUT CONNECTIONS + PRIORITIES + if(connections.size() > 0) { + fromConnections = new ArrayList<>(); + + connections.sort((a, b) -> a.selectionPriority - b.selectionPriority); // sort by descending priority, highest first + + // Sort out our from connections, splitting into individual lists for each priority level + List innerList = null; + int currentPriority = 0; + for(JigsawConnection connection : connections) { + if(innerList == null || currentPriority != connection.selectionPriority) { + innerList = new ArrayList<>(); + fromConnections.add(innerList); + currentPriority = connection.selectionPriority; + } + + innerList.add(connection); + } + } + + + + isLoaded = true; + + } catch(Exception e) { + MainRegistry.logger.error("Exception reading NBT Structure format", e); + } finally { + try { + inputStream.close(); + } catch(IOException e) { + // hush + } + } + } + + private HashMap getWorldItemPalette() { + if(itemPalette == null) return null; + + HashMap worldItemPalette = new HashMap<>(); + + for(Pair entry : itemPalette) { + Item item = (Item)Item.itemRegistry.getObject(entry.getValue()); + + worldItemPalette.put(entry.getKey(), (short)Item.getIdFromItem(item)); + } + + return worldItemPalette; + } + + private TileEntity buildTileEntity(World world, Block block, HashMap worldItemPalette, NBTTagCompound nbt, int coordBaseMode) { + nbt = (NBTTagCompound)nbt.copy(); + + if(worldItemPalette != null) relinkItems(worldItemPalette, nbt); + + TileEntity te = TileEntity.createAndLoadEntity(nbt); + + if(te instanceof INBTTileEntityTransformable) { + ((INBTTileEntityTransformable) te).transformTE(world, coordBaseMode); + } + + return te; + } + + public void build(World world, int x, int y, int z) { + build(world, x, y, z, 0); + } + + public void build(World world, int x, int y, int z, int coordBaseMode) { + if(!isLoaded) { + MainRegistry.logger.info("NBTStructure is invalid"); + return; + } + + HashMap worldItemPalette = getWorldItemPalette(); + + boolean swizzle = coordBaseMode == 1 || coordBaseMode == 3; + x -= (swizzle ? size.z : size.x) / 2; + z -= (swizzle ? size.x : size.z) / 2; + + int maxX = size.x; + int maxZ = size.z; + + for(int bx = 0; bx < maxX; bx++) { + for(int bz = 0; bz < maxZ; bz++) { + int rx = rotateX(bx, bz, coordBaseMode) + x; + int rz = rotateZ(bx, bz, coordBaseMode) + z; + + for(int by = 0; by < size.y; by++) { + BlockState state = blockArray[bx][by][bz]; + if(state == null) continue; + + int ry = by + y; + + Block block = transformBlock(state.definition, null, world.rand); + int meta = coordBaseMode != 0 ? transformMeta(state.definition, coordBaseMode) : state.definition.meta; + + world.setBlock(rx, ry, rz, block, meta, 2); + + if(state.nbt != null) { + TileEntity te = buildTileEntity(world, block, worldItemPalette, state.nbt, coordBaseMode); + world.setTileEntity(rx, ry, rz, te); + } + } + } + } + } + + protected boolean build(World world, JigsawPiece piece, StructureBoundingBox totalBounds, StructureBoundingBox generatingBounds, int coordBaseMode) { + if(!isLoaded) { + MainRegistry.logger.info("NBTStructure is invalid"); + return false; + } + + HashMap worldItemPalette = getWorldItemPalette(); + + int sizeX = totalBounds.maxX - totalBounds.minX; + int sizeZ = totalBounds.maxZ - totalBounds.minZ; + + // voxel grid transforms can fuck you up + // you have my respect, vaer + int absMinX = Math.max(generatingBounds.minX - totalBounds.minX, 0); + int absMaxX = Math.min(generatingBounds.maxX - totalBounds.minX, sizeX); + int absMinZ = Math.max(generatingBounds.minZ - totalBounds.minZ, 0); + int absMaxZ = Math.min(generatingBounds.maxZ - totalBounds.minZ, sizeZ); + + // A check to see that we're actually inside the generating area at all + if(absMinX > sizeX || absMaxX < 0 || absMinZ > sizeZ || absMaxZ < 0) return true; + + int rotMinX = unrotateX(absMinX, absMinZ, coordBaseMode); + int rotMaxX = unrotateX(absMaxX, absMaxZ, coordBaseMode); + int rotMinZ = unrotateZ(absMinX, absMinZ, coordBaseMode); + int rotMaxZ = unrotateZ(absMaxX, absMaxZ, coordBaseMode); + + int minX = Math.min(rotMinX, rotMaxX); + int maxX = Math.max(rotMinX, rotMaxX); + int minZ = Math.min(rotMinZ, rotMaxZ); + int maxZ = Math.max(rotMinZ, rotMaxZ); + + for(int bx = minX; bx <= maxX; bx++) { + for(int bz = minZ; bz <= maxZ; bz++) { + int rx = rotateX(bx, bz, coordBaseMode) + totalBounds.minX; + int rz = rotateZ(bx, bz, coordBaseMode) + totalBounds.minZ; + int oy = piece.conformToTerrain ? world.getTopSolidOrLiquidBlock(rx, rz) + piece.heightOffset : totalBounds.minY; + + for(int by = 0; by < size.y; by++) { + BlockState state = blockArray[bx][by][bz]; + if(state == null) continue; + + int ry = by + oy; + + Block block = transformBlock(state.definition, piece.blockTable, world.rand); + int meta = coordBaseMode != 0 ? transformMeta(state.definition, coordBaseMode) : state.definition.meta; + + world.setBlock(rx, ry, rz, block, meta, 2); + + if(state.nbt != null) { + TileEntity te = buildTileEntity(world, block, worldItemPalette, state.nbt, coordBaseMode); + world.setTileEntity(rx, ry, rz, te); + } + } + } + } + + return true; + } + + // What a fucken mess, why even implement the IntArray NBT if ye aint gonna use it Moe Yang? + private ThreeInts parsePos(NBTTagList pos) { + NBTBase xb = (NBTBase)pos.tagList.get(0); + int x = ((NBTTagInt)xb).func_150287_d(); + NBTBase yb = (NBTBase)pos.tagList.get(1); + int y = ((NBTTagInt)yb).func_150287_d(); + NBTBase zb = (NBTBase)pos.tagList.get(2); + int z = ((NBTTagInt)zb).func_150287_d(); + + return new ThreeInts(x, y, z); + } + + // NON-STANDARD, items are serialized with IDs, which will differ from world to world! + // So our fixed exporter adds an itemPalette, please don't hunt me down for fucking with the spec + private void relinkItems(HashMap palette, NBTTagCompound nbt) { + NBTTagList items = null; + if(nbt.hasKey("items")) + items = nbt.getTagList("items", NBT.TAG_COMPOUND); + if(nbt.hasKey("Items")) + items = nbt.getTagList("Items", NBT.TAG_COMPOUND); + + if(items == null) return; + + for(int i = 0; i < items.tagCount(); i++) { + NBTTagCompound item = items.getCompoundTagAt(i); + item.setShort("id", palette.get(item.getShort("id"))); + } + } + + private Block transformBlock(BlockDefinition definition, Map blockTable, Random rand) { + if(blockTable != null && blockTable.containsKey(definition.block)) { + final BlockSelector selector = blockTable.get(definition.block); + selector.selectBlocks(rand, 0, 0, 0, false); // fuck the vanilla shit idc + return selector.func_151561_a(); + } + + if(definition.block instanceof INBTTransformable) return ((INBTTransformable) definition.block).transformBlock(definition.block); + + return definition.block; + } + + private int transformMeta(BlockDefinition definition, int coordBaseMode) { + // Our shit + if(definition.block instanceof INBTTransformable) return ((INBTTransformable) definition.block).transformMeta(definition.meta, coordBaseMode); + + // Vanilla shit + if(definition.block instanceof BlockStairs) return INBTTransformable.transformMetaStairs(definition.meta, coordBaseMode); + if(definition.block instanceof BlockRotatedPillar) return INBTTransformable.transformMetaPillar(definition.meta, coordBaseMode); + if(definition.block instanceof BlockDirectional) return INBTTransformable.transformMetaDirectional(definition.meta, coordBaseMode); + if(definition.block instanceof BlockTorch) return INBTTransformable.transformMetaTorch(definition.meta, coordBaseMode); + if(definition.block instanceof BlockButton) return INBTTransformable.transformMetaTorch(definition.meta, coordBaseMode); + if(definition.block instanceof BlockDoor) return INBTTransformable.transformMetaDoor(definition.meta, coordBaseMode); + if(definition.block instanceof BlockLever) return INBTTransformable.transformMetaLever(definition.meta, coordBaseMode); + if(definition.block instanceof BlockSign) return INBTTransformable.transformMetaDeco(definition.meta, coordBaseMode); + if(definition.block instanceof BlockLadder) return INBTTransformable.transformMetaDeco(definition.meta, coordBaseMode); + + return definition.meta; + } + + private int rotateX(int x, int z, int coordBaseMode) { + switch(coordBaseMode) { + case 1: return size.z - 1 - z; + case 2: return size.x - 1 - x; + case 3: return z; + default: return x; + } + } + + private int rotateZ(int x, int z, int coordBaseMode) { + switch(coordBaseMode) { + case 1: return x; + case 2: return size.z - 1 - z; + case 3: return size.x - 1 - x; + default: return z; + } + } + + private int unrotateX(int x, int z, int coordBaseMode) { + switch(coordBaseMode) { + case 3: return size.x - 1 - z; + case 2: return size.x - 1 - x; + case 1: return z; + default: return x; + } + } + + private int unrotateZ(int x, int z, int coordBaseMode) { + switch(coordBaseMode) { + case 3: return x; + case 2: return size.z - 1 - z; + case 1: return size.z - 1 - x; + default: return z; + } + } + + private static class BlockState { + + final BlockDefinition definition; + NBTTagCompound nbt; + + BlockState(BlockDefinition definition) { + this.definition = definition; + } + + } + + private static class BlockDefinition { + + final Block block; + final int meta; + + BlockDefinition(String name, int meta) { + Block block = Block.getBlockFromName(name); + if(block == null) block = Blocks.air; + + this.block = block; + this.meta = meta; + } + + } + + public static class SpawnCondition { + + // If defined, will spawn a single jigsaw piece, for single nbt structures + public JigsawPiece structure; + + // If defined, will spawn in a non-nbt structure component + public Function, StructureStart> start; + + public Predicate canSpawn; + public int spawnWeight = 1; + + // Named jigsaw pools that are referenced within the structure + public Map pools; + public String startPool; + + // Maximum amount of components in this structure + public int sizeLimit = 8; + + // How far the structure can extend horizontally from the center, maximum of 128 + // This could be increased by changing GenStructure:range from 8, but this is already quite reasonably large + public int rangeLimit = 128; + + // Height modifiers, will clamp height that the start generates at, allowing for: + // * Submarines that must spawn under the ocean surface + // * Bunkers that sit underneath the ground + public int minHeight = 1; + public int maxHeight = 128; + + // Can this spawn in the current biome + protected boolean isValid(BiomeGenBase biome) { + if(canSpawn == null) return true; + return canSpawn.test(biome); + } + + protected JigsawPool getPool(String name) { + return pools.get(name).clone(); + } + + } + + // A set of pieces with weights + public static class JigsawPool { + + // Weighted list of pieces to pick from + private List> pieces = new ArrayList<>(); + private int totalWeight = 0; + + public String fallback; + + private boolean isClone; + + public void add(JigsawPiece piece, int weight) { + if(weight <= 0) throw new IllegalStateException("JigsawPool spawn weight must be positive!"); + pieces.add(new Pair<>(piece, weight)); + totalWeight += weight; + } + + protected JigsawPool clone() { + JigsawPool clone = new JigsawPool(); + clone.pieces = new ArrayList<>(this.pieces); + clone.fallback = this.fallback; + clone.totalWeight = this.totalWeight; + clone.isClone = true; + + return clone; + } + + // If from a clone, will remove from the pool + public JigsawPiece get(Random rand) { + if(totalWeight <= 0) return null; + int weight = rand.nextInt(totalWeight); + + for(int i = 0; i < pieces.size(); i++) { + Pair pair = pieces.get(i); + weight -= pair.getValue(); + + if(weight < 0) { + if(isClone) { + pieces.remove(i); + totalWeight -= pair.getValue(); + } + + return pair.getKey(); + } + } + + return null; + } + + } + + // Assigned to a Component to build + public static class JigsawPiece { + + public final String name; + public final NBTStructure structure; + + // Block modifiers, for randomization and terrain matching + public Map blockTable; + public boolean conformToTerrain = false; // moves every single column to the terrain (digging out trenches, natural formations) + public boolean alignToTerrain = false; // aligns this component y-level individually, without moving individual columns (village houses) + public int heightOffset = 0; // individual offset for the structure + + public JigsawPiece(String name, NBTStructure structure) { + this(name, structure, 0); + } + + public JigsawPiece(String name, NBTStructure structure, int heightOffset) { + if(name == null) throw new IllegalStateException("A severe error has occurred in NBTStructure! A jigsaw piece has been registered without a valid name!"); + if(jigsawMap.containsKey(name)) throw new IllegalStateException("A severe error has occurred in NBTStructure! A jigsaw piece has been registered with the same name as another: " + name); + + this.name = name; + this.structure = structure; + jigsawMap.put(name, this); + + this.heightOffset = heightOffset; + } + + } + + // Each jigsaw block in a structure will instance one of these + private static class JigsawConnection { + + private final ThreeInts pos; + private final ForgeDirection dir; + + // what pool should we look through to find a connection + private final String poolName; + + // when we successfully find a pool, what connections in that jigsaw piece can we target + private final String targetName; + + private final boolean isRollable; + + private final int selectionPriority; + private final int placementPriority; + + private JigsawConnection(ThreeInts pos, ForgeDirection dir, String poolName, String targetName, boolean isRollable, int selectionPriority, int placementPriority) { + this.pos = pos; + this.dir = dir; + this.poolName = poolName; + this.targetName = targetName; + this.isRollable = isRollable; + this.selectionPriority = selectionPriority; + this.placementPriority = placementPriority; + } + + } + + public static class Component extends StructureComponent { + + JigsawPiece piece; + + int minHeight = 1; + int maxHeight = 128; + + boolean heightUpdated = false; + + int priority; // placement priority not yet implemented because selection priority is far more useful whatever + + // this is fucking hacky but we need a way to update ALL component bounds once a Y-level is determined + private Start parent; + + private JigsawConnection connectedFrom; + + public Component() {} + + public Component(SpawnCondition spawn, JigsawPiece piece, Random rand, int x, int z) { + this(spawn, piece, rand, x, 0, z, rand.nextInt(4)); + } + + public Component(SpawnCondition spawn, JigsawPiece piece, Random rand, int x, int y, int z, int coordBaseMode) { + super(0); + this.coordBaseMode = coordBaseMode; + this.piece = piece; + this.minHeight = spawn.minHeight; + this.maxHeight = spawn.maxHeight; + + switch(this.coordBaseMode) { + case 1: + case 3: + this.boundingBox = new StructureBoundingBox(x, y, z, x + piece.structure.size.z - 1, y + piece.structure.size.y - 1, z + piece.structure.size.x - 1); + break; + default: + this.boundingBox = new StructureBoundingBox(x, y, z, x + piece.structure.size.x - 1, y + piece.structure.size.y - 1, z + piece.structure.size.z - 1); + break; + } + } + + public Component connectedFrom(JigsawConnection connection) { + this.connectedFrom = connection; + return this; + } + + // Save to NBT + @Override + protected void func_143012_a(NBTTagCompound nbt) { + nbt.setString("piece", piece.name); + nbt.setInteger("min", minHeight); + nbt.setInteger("max", maxHeight); + nbt.setBoolean("hasHeight", heightUpdated); + } + + // Load from NBT + @Override + protected void func_143011_b(NBTTagCompound nbt) { + piece = jigsawMap.get(nbt.getString("piece")); + minHeight = nbt.getInteger("min"); + maxHeight = nbt.getInteger("max"); + heightUpdated = nbt.getBoolean("hasHeight"); + } + + @Override + public boolean addComponentParts(World world, Random rand, StructureBoundingBox box) { + if(piece == null) return false; + + // now we're in the world, update minY/maxY + if(!piece.conformToTerrain && !heightUpdated) { + int y = MathHelper.clamp_int(getAverageHeight(world, box) + piece.heightOffset, minHeight, maxHeight); + + if(!piece.alignToTerrain && parent != null) { + parent.offsetYHeight(y); + } else { + offsetYHeight(y); + } + } + + return piece.structure.build(world, piece, boundingBox, box, coordBaseMode); + } + + public void offsetYHeight(int y) { + boundingBox.minY += y; + boundingBox.maxY += y; + + heightUpdated = true; + } + + // Overrides to fix Mojang's fucked rotations which FLIP instead of rotating in two instances + // vaer being in the mines doing this the hard way for years was absolutely not for naught + @Override + protected int getXWithOffset(int x, int z) { + return boundingBox.minX + piece.structure.rotateX(x, z, coordBaseMode); + } + + @Override + protected int getYWithOffset(int y) { + return boundingBox.minY + y; + } + + @Override + protected int getZWithOffset(int x, int z) { + return boundingBox.minZ + piece.structure.rotateZ(x, z, coordBaseMode); + } + + private ForgeDirection rotateDir(ForgeDirection dir) { + if(dir == ForgeDirection.UP || dir == ForgeDirection.DOWN) return dir; + switch(coordBaseMode) { + default: return dir; + case 1: return dir.getRotation(ForgeDirection.UP); + case 2: return dir.getOpposite(); + case 3: return dir.getRotation(ForgeDirection.DOWN); + } + } + + private int getAverageHeight(World world, StructureBoundingBox box) { + int total = 0; + int iterations = 0; + + for(int z = box.minZ; z <= box.maxZ; z++) { + for(int x = box.minX; x <= box.maxX; x++) { + total += world.getTopSolidOrLiquidBlock(x, z); + iterations++; + } + } + + if(iterations == 0) + return 64; + + return total / iterations; + } + + private int getNextCoordBase(JigsawConnection fromConnection, JigsawConnection toConnection, Random rand) { + if(fromConnection.dir == ForgeDirection.DOWN || fromConnection.dir == ForgeDirection.UP) { + if(fromConnection.isRollable) return rand.nextInt(4); + return coordBaseMode; + } + + return directionOffsetToCoordBase(fromConnection.dir.getOpposite(), toConnection.dir); + } + + private int directionOffsetToCoordBase(ForgeDirection from, ForgeDirection to) { + for(int i = 0; i < 4; i++) { + if(from == to) return (i + coordBaseMode) % 4; + from = from.getRotation(ForgeDirection.DOWN); + } + return coordBaseMode; + } + + protected boolean hasIntersectionIgnoringSelf(LinkedList components, StructureBoundingBox box) { + for(StructureComponent component : components) { + if(component == this) continue; + if(component.getBoundingBox() == null) continue; + + if(component.getBoundingBox().intersectsWith(box)) return true; + } + + return false; + } + + } + + public static class Start extends StructureStart { + + public Start() {} + + @SuppressWarnings("unchecked") + public Start(World world, Random rand, SpawnCondition spawn, int chunkX, int chunkZ) { + super(chunkX, chunkZ); + + int x = chunkX << 4; + int z = chunkZ << 4; + + JigsawPiece startPiece = spawn.structure != null ? spawn.structure : spawn.pools.get(spawn.startPool).get(rand); + + Component startComponent = new Component(spawn, startPiece, rand, x, z); + startComponent.parent = this; + + components.add(startComponent); + + List queuedComponents = new ArrayList<>(); + if(spawn.structure == null) queuedComponents.add(startComponent); + + // Iterate through and build out all the components we intend to spawn + while(!queuedComponents.isEmpty()) { + final int i = rand.nextInt(queuedComponents.size()); + Component fromComponent = queuedComponents.remove(i); + + if(fromComponent.piece.structure.fromConnections == null) continue; + + int distance = getDistanceTo(fromComponent.getBoundingBox()); + boolean fallbacksOnly = this.components.size() >= spawn.sizeLimit || distance >= spawn.rangeLimit; + + for(List unshuffledList : fromComponent.piece.structure.fromConnections) { + List connectionList = new ArrayList<>(unshuffledList); + Collections.shuffle(connectionList, rand); + + for(JigsawConnection fromConnection : connectionList) { + if(fromComponent.connectedFrom == fromConnection) continue; // if we already connected to this piece, don't process + + if(fallbacksOnly) { + String fallback = spawn.pools.get(fromConnection.poolName).fallback; + + if(fallback != null) { + Component fallbackComponent = buildNextComponent(rand, spawn, spawn.pools.get(fallback), fromComponent, fromConnection); + addComponent(fallbackComponent, fromConnection.placementPriority); + } + + continue; + } + + JigsawPool nextPool = spawn.getPool(fromConnection.poolName); + + Component nextComponent = null; + + // Iterate randomly through the pool, attempting each piece until one fits + while(nextPool.totalWeight > 0) { + nextComponent = buildNextComponent(rand, spawn, nextPool, fromComponent, fromConnection); + if(nextComponent != null && !fromComponent.hasIntersectionIgnoringSelf(components, nextComponent.getBoundingBox())) break; + nextComponent = null; + } + + if(nextComponent != null) { + addComponent(nextComponent, fromConnection.placementPriority); + queuedComponents.add(nextComponent); + } else { + // If we failed to fit anything in, grab something from the fallback pool, ignoring bounds check + if(nextPool.fallback != null) { + nextComponent = buildNextComponent(rand, spawn, spawn.pools.get(nextPool.fallback), fromComponent, fromConnection); + addComponent(nextComponent, fromConnection.placementPriority); // don't add to queued list, we don't want to try continue from fallback + } + } + } + } + } + + if(GeneralConfig.enableDebugMode) { + MainRegistry.logger.info("[Debug] Spawning NBT structure with " + components.size() + " piece(s) at: " + chunkX * 16 + ", " + chunkZ * 16); + String componentList = "[Debug] Components: "; + for(Object component : this.components) { + componentList += ((Component) component).piece.structure.name + " "; + } + MainRegistry.logger.info(componentList); + } + + updateBoundingBox(); + } + + @SuppressWarnings("unchecked") + private void addComponent(Component component, int placementPriority) { + components.add(component); + + component.parent = this; + component.priority = placementPriority; + } + + private Component buildNextComponent(Random rand, SpawnCondition spawn, JigsawPool pool, Component fromComponent, JigsawConnection fromConnection) { + JigsawPiece nextPiece = pool.get(rand); + if(nextPiece == null) return null; + + List connectionPool = getConnectionPool(nextPiece, fromConnection); + if(connectionPool == null) return null; + + JigsawConnection toConnection = connectionPool.get(rand.nextInt(connectionPool.size())); + + // The direction this component is extending towards in ABSOLUTE direction + ForgeDirection extendDir = fromComponent.rotateDir(fromConnection.dir); + + // Rotate our incoming piece to plug it in + int nextCoordBase = fromComponent.getNextCoordBase(fromConnection, toConnection, rand); + + // Set the starting point for the next structure to the location of the connector block + int nextX = fromComponent.getXWithOffset(fromConnection.pos.x, fromConnection.pos.z) + extendDir.offsetX; + int nextY = fromComponent.getYWithOffset(fromConnection.pos.y) + extendDir.offsetY; + int nextZ = fromComponent.getZWithOffset(fromConnection.pos.x, fromConnection.pos.z) + extendDir.offsetZ; + + // offset the starting point to the connecting point + nextX -= nextPiece.structure.rotateX(toConnection.pos.x, toConnection.pos.z, nextCoordBase); + nextY -= toConnection.pos.y; + nextZ -= nextPiece.structure.rotateZ(toConnection.pos.x, toConnection.pos.z, nextCoordBase); + + return new Component(spawn, nextPiece, rand, nextX, nextY, nextZ, nextCoordBase).connectedFrom(toConnection); + } + + private List getConnectionPool(JigsawPiece nextPiece, JigsawConnection fromConnection) { + if(fromConnection.dir == ForgeDirection.DOWN) { + return nextPiece.structure.toTopConnections.get(fromConnection.targetName); + } else if(fromConnection.dir == ForgeDirection.UP) { + return nextPiece.structure.toBottomConnections.get(fromConnection.targetName); + } + + return nextPiece.structure.toHorizontalConnections.get(fromConnection.targetName); + } + + private int getDistanceTo(StructureBoundingBox box) { + int x = box.getCenterX(); + int z = box.getCenterZ(); + + return Math.max(Math.abs(x - (func_143019_e() << 4)), Math.abs(z - (func_143018_f() << 4))); + } + + // post loading, update parent reference for loaded components + @Override + public void func_143017_b(NBTTagCompound nbt) { + for(Object o : components) { + ((Component) o).parent = this; + } + } + + public void offsetYHeight(int y) { + for(Object o : components) { + Component component = (Component) o; + if(component.heightUpdated || component.piece.conformToTerrain || component.piece.alignToTerrain) continue; + component.offsetYHeight(y); + } + } + + } + + public static class GenStructure extends MapGenStructure { + + private SpawnCondition nextSpawn; + + public void generateStructures(World world, Random rand, IChunkProvider chunkProvider, int chunkX, int chunkZ) { + Block[] ablock = new Block[65536]; + + func_151539_a(chunkProvider, world, chunkX, chunkZ, ablock); + generateStructuresInChunk(world, rand, chunkX, chunkZ); + } + + @Override + public String func_143025_a() { + return "NBTStructures"; + } + + @Override + protected boolean canSpawnStructureAtCoords(int chunkX, int chunkZ) { + if(!weightedMap.containsKey(worldObj.provider.dimensionId)) return false; + + int x = chunkX; + int z = chunkZ; + + if(x < 0) x -= StructureConfig.structureMaxChunks - 1; + if(z < 0) z -= StructureConfig.structureMaxChunks - 1; + + x /= StructureConfig.structureMaxChunks; + z /= StructureConfig.structureMaxChunks; + rand.setSeed((long)x * 341873128712L + (long)z * 132897987541L + this.worldObj.getWorldInfo().getSeed() + (long)996996996 - worldObj.provider.dimensionId); + x *= StructureConfig.structureMaxChunks; + z *= StructureConfig.structureMaxChunks; + x += rand.nextInt(StructureConfig.structureMaxChunks - StructureConfig.structureMinChunks); + z += rand.nextInt(StructureConfig.structureMaxChunks - StructureConfig.structureMinChunks); + + if(chunkX == x && chunkZ == z) { + BiomeGenBase biome = this.worldObj.getWorldChunkManager().getBiomeGenAt(chunkX * 16 + 8, chunkZ * 16 + 8); + + nextSpawn = findSpawn(biome); + + return nextSpawn != null && (nextSpawn.pools != null || nextSpawn.start != null || nextSpawn.structure != null); + } + + return false; + } + + @Override + protected StructureStart getStructureStart(int chunkX, int chunkZ) { + if(nextSpawn.start != null) return nextSpawn.start.apply(new Quartet(this.worldObj, this.rand, chunkX, chunkZ)); + return new Start(this.worldObj, this.rand, nextSpawn, chunkX, chunkZ); + } + + private SpawnCondition findSpawn(BiomeGenBase biome) { + List spawnList = weightedMap.get(worldObj.provider.dimensionId); + + for(int i = 0; i < 64; i++) { + SpawnCondition spawn = spawnList.get(rand.nextInt(spawnList.size())); + if(spawn.isValid(biome)) return spawn; + } + + return null; + } + + } + +} diff --git a/src/main/java/com/hbm/world/gen/NTMWorldGenerator.java b/src/main/java/com/hbm/world/gen/NTMWorldGenerator.java index 6fb9e7fd1..e56c3e0eb 100644 --- a/src/main/java/com/hbm/world/gen/NTMWorldGenerator.java +++ b/src/main/java/com/hbm/world/gen/NTMWorldGenerator.java @@ -1,8 +1,22 @@ package com.hbm.world.gen; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; import java.util.Random; +import com.hbm.blocks.ModBlocks; import com.hbm.config.StructureConfig; +import com.hbm.main.StructureManager; +import com.hbm.world.gen.NBTStructure.JigsawPiece; +import com.hbm.world.gen.NBTStructure.JigsawPool; +import com.hbm.world.gen.NBTStructure.SpawnCondition; +import com.hbm.world.gen.component.BunkerComponents.BunkerStart; +import com.hbm.world.gen.component.Component.CrabSpawners; +import com.hbm.world.gen.component.Component.GreenOoze; +import com.hbm.world.gen.component.Component.MeteorBricks; +import com.hbm.world.gen.component.Component.SupplyCrates; import cpw.mods.fml.common.IWorldGenerator; import cpw.mods.fml.common.eventhandler.SubscribeEvent; @@ -10,125 +24,181 @@ import net.minecraft.block.Block; import net.minecraft.world.World; import net.minecraft.world.biome.BiomeGenBase; import net.minecraft.world.chunk.IChunkProvider; -import static net.minecraftforge.common.BiomeDictionary.*; +import net.minecraft.world.gen.structure.StructureComponent.BlockSelector; import net.minecraftforge.event.terraingen.InitMapGenEvent.EventType; import net.minecraftforge.event.terraingen.PopulateChunkEvent; -import static net.minecraftforge.event.terraingen.TerrainGen.*; +import net.minecraftforge.event.terraingen.TerrainGen; import net.minecraftforge.event.world.WorldEvent; public class NTMWorldGenerator implements IWorldGenerator { - private MapGenNTMFeatures scatteredFeatureGen = new MapGenNTMFeatures(); - + + boolean regTest = false; + + public NTMWorldGenerator() { + final List invalidBiomes = Arrays.asList(new BiomeGenBase[] {BiomeGenBase.ocean, BiomeGenBase.river, BiomeGenBase.frozenOcean, BiomeGenBase.frozenRiver, BiomeGenBase.deepOcean}); + + NBTStructure.registerStructure(0, new SpawnCondition() {{ + canSpawn = biome -> !invalidBiomes.contains(biome); + start = d -> new MapGenNTMFeatures.Start(d.getW(), d.getX(), d.getY(), d.getZ()); + spawnWeight = 14; + }}); + + NBTStructure.registerStructure(0, new SpawnCondition() {{ + canSpawn = biome -> !invalidBiomes.contains(biome); + start = d -> new BunkerStart(d.getW(), d.getX(), d.getY(), d.getZ()); + spawnWeight = 1; + }}); + + NBTStructure.registerStructure(0, new SpawnCondition() {{ + canSpawn = biome -> !biome.canSpawnLightningBolt() && biome.temperature >= 2F; + structure = new JigsawPiece("vertibird", StructureManager.vertibird); + spawnWeight = 3; + }}); + + NBTStructure.registerStructure(0, new SpawnCondition() {{ + canSpawn = biome -> !biome.canSpawnLightningBolt() && biome.temperature >= 2F; + structure = new JigsawPiece("crashed_vertibird", StructureManager.crashed_vertibird); + spawnWeight = 3; + }}); + + Map bricks = new HashMap() {{ + put(ModBlocks.meteor_brick, new MeteorBricks()); + }}; + Map crates = new HashMap() {{ + put(ModBlocks.meteor_brick, new MeteorBricks()); + put(ModBlocks.crate, new SupplyCrates()); + put(ModBlocks.meteor_spawner, new CrabSpawners()); + }}; + Map ooze = new HashMap() {{ + put(ModBlocks.meteor_brick, new MeteorBricks()); + put(ModBlocks.concrete_colored, new GreenOoze()); + }}; + + NBTStructure.registerStructure(0, new SpawnCondition() {{ + minHeight = 32; + maxHeight = 32; + sizeLimit = 128; + canSpawn = biome -> biome.rootHeight >= 0; + startPool = "start"; + pools = new HashMap() {{ + put("start", new JigsawPool() {{ + add(new JigsawPiece("meteor_core", StructureManager.meteor_core) {{ blockTable = bricks; }}, 1); + }}); + put("spike", new JigsawPool() {{ + add(new JigsawPiece("meteor_spike", StructureManager.meteor_spike) {{ heightOffset = -3; conformToTerrain = true; }}, 1); + }}); + put("default", new JigsawPool() {{ + add(new JigsawPiece("meteor_corner", StructureManager.meteor_corner) {{ blockTable = bricks; }}, 2); + add(new JigsawPiece("meteor_t", StructureManager.meteor_t) {{ blockTable = bricks; }}, 3); + add(new JigsawPiece("meteor_stairs", StructureManager.meteor_stairs) {{ blockTable = bricks; }}, 1); + add(new JigsawPiece("meteor_room_base_thru", StructureManager.meteor_room_base_thru) {{ blockTable = bricks; }}, 3); + add(new JigsawPiece("meteor_room_base_end", StructureManager.meteor_room_base_end) {{ blockTable = bricks; }}, 4); + fallback = "fallback"; + }}); + put("10room", new JigsawPool() {{ + add(new JigsawPiece("meteor_room_basic", StructureManager.meteor_room_basic) {{ blockTable = bricks; }}, 1); + add(new JigsawPiece("meteor_room_balcony", StructureManager.meteor_room_balcony) {{ blockTable = bricks; }}, 1); + add(new JigsawPiece("meteor_room_dragon", StructureManager.meteor_room_dragon) {{ blockTable = bricks; }}, 1); + add(new JigsawPiece("meteor_room_ladder", StructureManager.meteor_room_ladder) {{ blockTable = bricks; }}, 1); + add(new JigsawPiece("meteor_room_ooze", StructureManager.meteor_room_ooze) {{ blockTable = ooze; }}, 1); + add(new JigsawPiece("meteor_room_split", StructureManager.meteor_room_split) {{ blockTable = bricks; }}, 1); + add(new JigsawPiece("meteor_room_stairs", StructureManager.meteor_room_stairs) {{ blockTable = bricks; }}, 1); + add(new JigsawPiece("meteor_room_triple", StructureManager.meteor_room_triple) {{ blockTable = bricks; }}, 1); + fallback = "roomback"; + }}); + put("3x3loot", new JigsawPool() {{ + add(new JigsawPiece("meteor_3_bale", StructureManager.meteor_3_bale), 1); + add(new JigsawPiece("meteor_3_blank", StructureManager.meteor_3_blank), 1); + add(new JigsawPiece("meteor_3_block", StructureManager.meteor_3_block), 1); + add(new JigsawPiece("meteor_3_crab", StructureManager.meteor_3_crab), 1); + add(new JigsawPiece("meteor_3_crab_tesla", StructureManager.meteor_3_crab_tesla), 1); + add(new JigsawPiece("meteor_3_crate", StructureManager.meteor_3_crate), 1); + add(new JigsawPiece("meteor_3_dirt", StructureManager.meteor_3_dirt), 1); + add(new JigsawPiece("meteor_3_lead", StructureManager.meteor_3_lead), 1); + add(new JigsawPiece("meteor_3_ooze", StructureManager.meteor_3_ooze), 1); + add(new JigsawPiece("meteor_3_pillar", StructureManager.meteor_3_pillar), 1); + add(new JigsawPiece("meteor_3_star", StructureManager.meteor_3_star), 1); + add(new JigsawPiece("meteor_3_tesla", StructureManager.meteor_3_tesla), 1); + add(new JigsawPiece("meteor_3_book", StructureManager.meteor_3_book), 1); + add(new JigsawPiece("meteor_3_mku", StructureManager.meteor_3_mku), 1); + add(new JigsawPiece("meteor_3_statue", StructureManager.meteor_3_statue), 1); + add(new JigsawPiece("meteor_3_glow", StructureManager.meteor_3_glow), 1); + fallback = "3x3loot"; // generate loot even if we're at the size limit + }}); + put("headloot", new JigsawPool() {{ + add(new JigsawPiece("meteor_dragon_chest", StructureManager.meteor_dragon_chest) {{ blockTable = crates; }}, 1); + 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"; + }}); + put("fallback", new JigsawPool() {{ + add(new JigsawPiece("meteor_fallback", StructureManager.meteor_fallback) {{ blockTable = bricks; }}, 1); + }}); + put("roomback", new JigsawPool() {{ + add(new JigsawPiece("meteor_room_fallback", StructureManager.meteor_room_fallback) {{ blockTable = bricks; }}, 1); + }}); + put("headback", new JigsawPool() {{ + add(new JigsawPiece("meteor_loot_fallback", StructureManager.meteor_dragon_fallback) {{ blockTable = crates; }}, 1); + }}); + }}; + }}); + } + + private NBTStructure.GenStructure nbtGen = new NBTStructure.GenStructure(); + private final Random rand = new Random(); //A central random, used to cleanly generate our stuff without affecting vanilla or modded seeds. - + /** Inits all MapGen upon the loading of a new world. Hopefully clears out structureMaps and structureData when a different world is loaded. */ @SubscribeEvent public void onLoad(WorldEvent.Load event) { - scatteredFeatureGen = (MapGenNTMFeatures) getModdedMapGen(new MapGenNTMFeatures(), EventType.CUSTOM); - + nbtGen = (NBTStructure.GenStructure) TerrainGen.getModdedMapGen(new NBTStructure.GenStructure(), EventType.CUSTOM); + hasPopulationEvent = false; } - + /** Called upon the initial population of a chunk. Called in the pre-population event first; called again if pre-population didn't occur (flatland) */ private void setRandomSeed(World world, int chunkX, int chunkZ) { - rand.setSeed(world.getSeed()); + rand.setSeed(world.getSeed() + world.provider.dimensionId); final long i = rand.nextLong() / 2L * 2L + 1L; final long j = rand.nextLong() / 2L * 2L + 1L; rand.setSeed((long)chunkX * i + (long)chunkZ * j ^ world.getSeed()); } - + /* * Pre-population Events / Structure Generation * Used to generate structures without unnecessary intrusion by biome decoration, like trees. */ - + private boolean hasPopulationEvent = false; // Does the given chunkGenerator have a population event? If not (flatlands), default to using generate. - + @SubscribeEvent public void generateStructures(PopulateChunkEvent.Pre event) { - setRandomSeed(event.world, event.chunkX, event.chunkZ); //Set random for population down the line. hasPopulationEvent = true; - + if(StructureConfig.enableStructures == 0) return; if(StructureConfig.enableStructures == 2 && !event.world.getWorldInfo().isMapFeaturesEnabled()) return; - - switch (event.world.provider.dimensionId) { - case -1: - break; - case 0: - generateOverworldStructures(event.world, event.chunkProvider, event.chunkX, event.chunkZ); - break; - case 1: - break; - } + + setRandomSeed(event.world, event.chunkX, event.chunkZ); //Set random for population down the line. + + nbtGen.generateStructures(event.world, rand, event.chunkProvider, event.chunkX, event.chunkZ); } - - protected void generateOverworldStructures(World world, IChunkProvider chunkProvider, int chunkX, int chunkZ) { - Block[] ablock = new Block[65536]; //ablock isn't actually used for anything in MapGenStructure - - this.scatteredFeatureGen.func_151539_a(chunkProvider, world, chunkX, chunkZ, ablock); - this.scatteredFeatureGen.generateStructuresInChunk(world, rand, chunkX, chunkZ); - } - + /* * Post-Vanilla / Modded Generation * Used to generate features that don't care about intrusions (ores, craters, caves, etc.) */ - + @Override - public void generate(Random rand, int chunkX, int chunkZ, World world, IChunkProvider chunkGenerator, IChunkProvider chunkProvider) { - - switch (world.provider.dimensionId) { - case -1: - generateNether(world, rand, chunkGenerator, chunkX, chunkZ); break; - case 0: - generateSurface(world, rand, chunkGenerator, chunkProvider, chunkX, chunkZ); break; - case 1: - generateEnd(world, rand, chunkGenerator, chunkX, chunkZ); break; - } - } - - private void generateNether(World world, Random rand, IChunkProvider chunkGenerator, int chunkX, int chunkZ) { } - - /* Overworld Generation */ - - private void generateSurface(World world, Random rand, IChunkProvider chunkGenerator, IChunkProvider chunkProvider, int chunkX, int chunkZ) { - if(!hasPopulationEvent) { //If we've failed to generate any structures (flatlands) - setRandomSeed(world, chunkX, chunkZ); //Reset the random seed to compensate - - boolean enableStructures = world.getWorldInfo().isMapFeaturesEnabled(); - if(StructureConfig.enableStructures == 1) enableStructures = true; - if(StructureConfig.enableStructures == 0) enableStructures = false; + public void generate(Random unusedRandom, int chunkX, int chunkZ, World world, IChunkProvider chunkGenerator, IChunkProvider chunkProvider) { + if(hasPopulationEvent) return; //If we've failed to generate any structures (flatlands) - if(enableStructures) generateOverworldStructures(world, chunkGenerator, chunkX, chunkZ); //Do it through the post-population generation directly - } - - /* biome dictionary my beloved <3 - * no check for tom here because the event handler already checks for decoration events, + this way they won't become permanently extinct. - */ - - /* Biome check, followed by chance, followed by event (for compat, both intra- and inter- (in the case of Tom). */ - - + if(StructureConfig.enableStructures == 0) return; + if(StructureConfig.enableStructures == 2 && !world.getWorldInfo().isMapFeaturesEnabled()) return; + + setRandomSeed(world, chunkX, chunkZ); //Reset the random seed to compensate + + nbtGen.generateStructures(world, rand, chunkProvider, chunkX, chunkZ); } - private void generateEnd(World world, Random rand, IChunkProvider chunkGenerator, int chunkX, int chunkZ) { } - - /** Utility method for biome checking multiple types exclusively. Not sure why it wasn't already present. */ - public static boolean isBiomeOfTypes(BiomeGenBase biome, Type... types) { //If new biomes are implemented, move this to any biome-related utility class. - for(Type type : types) { - if(!isBiomeOfType(biome, type)) return false; - } - - return true; - } - - /** utility method, same as above but inclusive. useful for catch-alls, like the dirty glass structures have */ - public static boolean doesBiomeHaveTypes(BiomeGenBase biome, Type... types) { - for(Type type : types) { - if(isBiomeOfType(biome, type)) return true; - } - - return false; - } } \ No newline at end of file diff --git a/src/main/java/com/hbm/world/gen/component/Component.java b/src/main/java/com/hbm/world/gen/component/Component.java index 0a652a6eb..80d85bcfd 100644 --- a/src/main/java/com/hbm/world/gen/component/Component.java +++ b/src/main/java/com/hbm/world/gen/component/Component.java @@ -12,6 +12,7 @@ import com.hbm.tileentity.machine.TileEntityLockableBase; import net.minecraft.block.Block; import net.minecraft.block.material.Material; +import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; import net.minecraft.inventory.IInventory; import net.minecraft.item.ItemStack; @@ -27,19 +28,19 @@ abstract public class Component extends StructureComponent { /** Average height (Presumably stands for height position) */ protected int hpos = -1; - + protected Component() { super(0); } - + protected Component(int componentType) { super(componentType); } - + protected Component(Random rand, int minX, int minY, int minZ, int maxX, int maxY, int maxZ ) { super(0); this.coordBaseMode = rand.nextInt(4); - + switch(this.coordBaseMode) { case 0: this.boundingBox = new StructureBoundingBox(minX, minY, minZ, minX + maxX, minY + maxY, minZ + maxZ); @@ -55,25 +56,25 @@ abstract public class Component extends StructureComponent { break; default: this.boundingBox = new StructureBoundingBox(minX, minY, minZ, minX + maxX, minY + maxY, minZ + maxZ); - + } } - + /** Set to NBT */ protected void func_143012_a(NBTTagCompound nbt) { nbt.setInteger("HPos", this.hpos); } - + /** Get from NBT */ protected void func_143011_b(NBTTagCompound nbt) { this.hpos = nbt.getInteger("HPos"); } - + protected boolean setAverageHeight(World world, StructureBoundingBox box, int y) { - + int total = 0; int iterations = 0; - + for(int z = this.boundingBox.minZ; z <= this.boundingBox.maxZ; z++) { for(int x = this.boundingBox.minX; x <= this.boundingBox.maxX; x++) { if(box.isVecInside(x, y, z)) { @@ -82,20 +83,20 @@ abstract public class Component extends StructureComponent { } } } - + if(iterations == 0) return false; - + this.hpos = total / iterations; //finds mean of every block in bounding box this.boundingBox.offset(0, this.hpos - this.boundingBox.minY, 0); return true; } - + protected static int getAverageHeight(World world, StructureBoundingBox area, StructureBoundingBox box, int y) { - + int total = 0; int iterations = 0; - + for(int z = area.minZ; z <= area.maxZ; z++) { for(int x = area.minX; x <= area.maxX; x++) { if(box.isVecInside(x, y, z)) { @@ -104,19 +105,19 @@ abstract public class Component extends StructureComponent { } } } - + if(iterations == 0) return -1; - + return total / iterations; } - + public int getCoordMode() { return this.coordBaseMode; } - + /** Metadata for Decoration Methods **/ - + /** * Gets metadata for rotatable pillars. * @param metadata (First two digits are equal to block metadata, other two are equal to orientation @@ -125,10 +126,10 @@ abstract public class Component extends StructureComponent { protected int getPillarMeta(int metadata) { if(this.coordBaseMode % 2 != 0 && this.coordBaseMode != -1) metadata = metadata ^ 12; - + return metadata; } - + /** * Gets metadata for rotatable DecoBlock * honestly i don't remember how i did this and i'm scared to optimize it because i fail to see any reasonable patterns like the pillar @@ -168,14 +169,14 @@ abstract public class Component extends StructureComponent { } return 0; } - + /** * Get orientation-offset metadata for BlockDecoModel; also suitable for trapdoors * @param metadata (0 for facing North, 1 for facing South, 2 for facing West, 3 for facing East) */ protected int getDecoModelMeta(int metadata) { //N: 0b00, S: 0b01, W: 0b10, E: 0b11 - + switch(this.coordBaseMode) { default: //South break; @@ -198,12 +199,12 @@ abstract public class Component extends StructureComponent { //genuinely like. why did i do that return metadata << 2; //To accommodate for BlockDecoModel's shift in the rotation bits; otherwise, simply bit-shift right and or any non-rotation meta after } - + //works for crts, toasters, and anything that follows mc's cardinal dirs. S: 0, W: 1, N: 2, E: 3 protected int getCRTMeta(int meta) { return (meta + this.coordBaseMode) % 4; } - + /** * Gets orientation-adjusted meta for stairs. * 0 = West, 1 = East, 2 = North, 3 = South @@ -228,11 +229,11 @@ abstract public class Component extends StructureComponent { metadata = metadata ^ 2; break; } - + return metadata; } - - /* + + /* * Assuming door is on opposite side of block from direction: East: 0, South: 1, West: 2, North: 3
* Doors cleverly take advantage of the use of two blocks to get around the 16 value limit on metadata, with the top and bottom blocks essentially relying on eachother for everything.
*
  • The 4th bit (0b1000 or 8) indicates whether it is the top block: on for yes, off for no. @@ -245,9 +246,9 @@ abstract public class Component extends StructureComponent { int posX = this.getXWithOffset(featureX, featureZ); int posY = this.getYWithOffset(featureY); int posZ = this.getZWithOffset(featureX, featureZ); - + if(!box.isVecInside(posX, posY, posZ)) return; - + switch(this.coordBaseMode) { default: //South break; @@ -258,11 +259,11 @@ abstract public class Component extends StructureComponent { case 3: //East dirMeta = (dirMeta + 3) % 4; break; //fuck you modulo } - + //hee hoo int metaTop = opensRight ? 0b1001 : 0b1000; int metaBottom = dirMeta | (isOpen ? 0b100 : 0); - + if(world.doesBlockHaveSolidTopSurface(world, posX, posY - 1, posZ)) { world.setBlock(posX, posY, posZ, door, metaBottom, 2); world.setBlock(posX, posY + 1, posZ, door, metaTop, 2); @@ -273,9 +274,9 @@ abstract public class Component extends StructureComponent { int posX = this.getXWithOffset(featureX, featureZ); int posY = this.getYWithOffset(featureY); int posZ = this.getZWithOffset(featureX, featureZ); - + if(!box.isVecInside(posX, posY, posZ)) return; - + if(dirMeta <= 0 || dirMeta >= 7) { //levers suck ass switch(this.coordBaseMode) { case 1: case 3: //west / east @@ -289,10 +290,10 @@ abstract public class Component extends StructureComponent { } else { dirMeta = getButtonMeta(dirMeta); } - + world.setBlock(posX, posY, posZ, Blocks.lever, on ? dirMeta | 8 : dirMeta, 2); } - + /** pain. works for side-facing levers as well */ protected int getButtonMeta(int dirMeta) { switch(this.coordBaseMode) { //are you ready for the pain? @@ -310,12 +311,12 @@ abstract public class Component extends StructureComponent { return dirMeta; } } - + /**N:0 W:1 S:2 E:3 */ protected void placeBed(World world, StructureBoundingBox box, int meta, int featureX, int featureY, int featureZ) { int xOffset = 0; int zOffset = 0; - + switch(meta & 3) { default: zOffset = 1; break; @@ -326,7 +327,7 @@ abstract public class Component extends StructureComponent { case 3: xOffset = 1; break; } - + switch(this.coordBaseMode) { default: //S break; @@ -337,11 +338,11 @@ abstract public class Component extends StructureComponent { case 3: //E meta = (meta - 1) % 4; break; } - + placeBlockAtCurrentPosition(world, Blocks.bed, meta, featureX, featureY, featureZ, box); placeBlockAtCurrentPosition(world, Blocks.bed, meta + 8, featureX + xOffset, featureY, featureZ + zOffset, box); } - + /**Tripwire Hook: S:0 W:1 N:2 E:3 */ protected int getTripwireMeta(int metadata) { switch(this.coordBaseMode) { @@ -355,10 +356,10 @@ abstract public class Component extends StructureComponent { return (metadata - 1) % 4; } } - - + + /** Loot Methods **/ - + /** * it feels disgusting to make a method with this many parameters but fuck it, it's easier * @return TE implementing IInventory with randomized contents @@ -366,29 +367,29 @@ abstract public class Component extends StructureComponent { protected boolean generateInvContents(World world, StructureBoundingBox box, Random rand, Block block, int featureX, int featureY, int featureZ, WeightedRandomChestContent[] content, int amount) { return generateInvContents(world, box, rand, block, 0, featureX, featureY, featureZ, content, amount); } - + //TODO: explore min / max item generations: e.g., between 3 and 5 separate items are generated protected boolean generateInvContents(World world, StructureBoundingBox box, Random rand, Block block, int meta, int featureX, int featureY, int featureZ, WeightedRandomChestContent[] content, int amount) { int posX = this.getXWithOffset(featureX, featureZ); int posY = this.getYWithOffset(featureY); int posZ = this.getZWithOffset(featureX, featureZ); - + if(!box.isVecInside(posX, posY, posZ) || world.getBlock(posX, posY, posZ) == block) //replacement for hasPlacedLoot checks return true; - + this.placeBlockAtCurrentPosition(world, block, meta, featureX, featureY, featureZ, box); IInventory inventory = (IInventory)world.getTileEntity(posX, posY, posZ); - + if(inventory != null) { amount = (int)Math.floor(amount * StructureConfig.lootAmountFactor); WeightedRandomChestContent.generateChestContents(rand, content, inventory, amount < 1 ? 1 : amount); return true; } - + return false; } - - + + /** * Block TE MUST extend TileEntityLockableBase, otherwise this will not work and crash! * @return TE implementing IInventory and extending TileEntityLockableBase with randomized contents + lock @@ -397,48 +398,48 @@ abstract public class Component extends StructureComponent { WeightedRandomChestContent[] content, int amount, double mod) { return generateLockableContents(world, box, rand, block, 0, featureX, featureY, featureZ, content, amount, mod); } - + protected boolean generateLockableContents(World world, StructureBoundingBox box, Random rand, Block block, int meta, int featureX, int featureY, int featureZ, WeightedRandomChestContent[] content, int amount, double mod) { int posX = this.getXWithOffset(featureX, featureZ); int posY = this.getYWithOffset(featureY); int posZ = this.getZWithOffset(featureX, featureZ); - + if(!box.isVecInside(posX, posY, posZ) || world.getBlock(posX, posY, posZ) == block) //replacement for hasPlacedLoot checks return false; - + this.placeBlockAtCurrentPosition(world, block, meta, featureX, featureY, featureZ, box); TileEntity tile = world.getTileEntity(posX, posY, posZ); TileEntityLockableBase lock = (TileEntityLockableBase) tile; IInventory inventory = (IInventory) tile; - + if(inventory != null && lock != null) { amount = (int)Math.floor(amount * StructureConfig.lootAmountFactor); WeightedRandomChestContent.generateChestContents(rand, content, inventory, amount < 1 ? 1 : amount); - + lock.setPins(rand.nextInt(999) + 1); lock.setMod(mod); lock.lock(); return true; } - + return false; } - + protected void generateLoreBook(World world, StructureBoundingBox box, int featureX, int featureY, int featureZ, int slot, ItemStack stack) { //kept for compat int posX = this.getXWithOffset(featureX, featureZ); int posY = this.getYWithOffset(featureY); int posZ = this.getZWithOffset(featureX, featureZ); - + if(!box.isVecInside(posX, posY, posZ)) return; - + IInventory inventory = (IInventory) world.getTileEntity(posX, posY, posZ); - + if(inventory != null) { inventory.setInventorySlotContents(slot, stack); } } - + /** * Places random bobblehead with a randomized orientation at specified location */ @@ -446,71 +447,71 @@ abstract public class Component extends StructureComponent { int posX = this.getXWithOffset(featureX, featureZ); int posY = this.getYWithOffset(featureY); int posZ = this.getZWithOffset(featureX, featureZ); - + placeBlockAtCurrentPosition(world, ModBlocks.bobblehead, rand.nextInt(16), featureX, featureY, featureZ, box); TileEntityBobble bobble = (TileEntityBobble) world.getTileEntity(posX, posY, posZ); - + if(bobble != null) { bobble.type = BobbleType.values()[rand.nextInt(BobbleType.values().length - 1) + 1]; bobble.markDirty(); } } - + /** Block Placement Utility Methods **/ - + /** * Places blocks underneath location until reaching a solid block; good for foundations */ protected void placeFoundationUnderneath(World world, Block placeBlock, int meta, int minX, int minZ, int maxX, int maxZ, int featureY, StructureBoundingBox box) { - + for(int featureX = minX; featureX <= maxX; featureX++) { for(int featureZ = minZ; featureZ <= maxZ; featureZ++) { int posX = this.getXWithOffset(featureX, featureZ); int posY = this.getYWithOffset(featureY); int posZ = this.getZWithOffset(featureX, featureZ); - + if(box.isVecInside(posX, posY, posZ)) { Block block = world.getBlock(posX, posY, posZ); int brake = 0; - - while ((world.isAirBlock(posX, posY, posZ) || - !block.getMaterial().isSolid() || - (block.isFoliage(world, posX, posY, posZ) || block.getMaterial() == Material.leaves)) && + + while ((world.isAirBlock(posX, posY, posZ) || + !block.getMaterial().isSolid() || + (block.isFoliage(world, posX, posY, posZ) || block.getMaterial() == Material.leaves)) && posY > 1 && brake <= 15) { world.setBlock(posX, posY, posZ, placeBlock, meta, 2); block = world.getBlock(posX, --posY, posZ); - + brake++; } } } } } - + /** * Places specified blocks on top of pre-existing blocks in a given area, up to a certain height. Does NOT place blocks on top of liquids. * Useful for stuff like fences and walls most likely. */ protected void placeBlocksOnTop(World world, StructureBoundingBox box, Block block, int minX, int minZ, int maxX, int maxZ, int height) { - + for(int x = minX; x <= maxX; x++) { for(int z = minZ; z <= maxZ; z++) { int posX = this.getXWithOffset(x, z); int posZ = this.getZWithOffset(x, z); int topHeight = world.getTopSolidOrLiquidBlock(posX, posZ); - + if(!world.getBlock(posX, topHeight, posZ).getMaterial().isLiquid()) { - + for(int i = 0; i < height; i++) { int posY = topHeight + i; - + world.setBlock(posX, posY, posZ, block, 0, 2); } } } } } - + /** getXWithOffset & getZWithOffset Methods that are actually fixed **/ //Turns out, this entire time every single minecraft structure is mirrored instead of rotated when facing East and North //Also turns out, it's a scarily easy fix that they somehow didn't see *entirely* @@ -529,7 +530,7 @@ abstract public class Component extends StructureComponent { return x; } } - + @Override public int getZWithOffset(int x, int z) { switch(this.coordBaseMode) { @@ -545,46 +546,46 @@ abstract public class Component extends StructureComponent { return z; } } - + /** Methods that are actually optimized, including ones that cut out replaceBlock and onlyReplace functionality when it's redundant. */ protected void fillWithAir(World world, StructureBoundingBox box, int minX, int minY, int minZ, int maxX, int maxY, int maxZ) { - + if(getYWithOffset(minY) < box.minY || getYWithOffset(maxY) > box.maxY) return; - + for(int x = minX; x <= maxX; x++) { //TODO these could technically be optimized a bit more. probably won't do anything but worth - + for(int z = minZ; z <= maxZ; z++) { int posX = getXWithOffset(x, z); int posZ = getZWithOffset(x, z); - + if(posX >= box.minX && posX <= box.maxX && posZ >= box.minZ && posZ <= box.maxZ) { for(int y = minY; y <= maxY; y++) { int posY = getYWithOffset(y); - + world.setBlock(posX, posY, posZ, Blocks.air, 0, 2); } } } } } - + @Override protected void fillWithBlocks(World world, StructureBoundingBox box, int minX, int minY, int minZ, int maxX, int maxY, int maxZ, Block block, Block replaceBlock, boolean onlyReplace) { - + if(getYWithOffset(minY) < box.minY || getYWithOffset(maxY) > box.maxY) return; - + for(int x = minX; x <= maxX; x++) { - + for(int z = minZ; z <= maxZ; z++) { int posX = getXWithOffset(x, z); int posZ = getZWithOffset(x, z); - + if(posX >= box.minX && posX <= box.maxX && posZ >= box.minZ && posZ <= box.maxZ) { for(int y = minY; y <= maxY; y++) { int posY = getYWithOffset(y); - + if(!onlyReplace || world.getBlock(posX, posY, posZ).getMaterial() != Material.air) { if(x != minX && x != maxX && y != minY && y != maxY && z != minZ && z != maxZ) world.setBlock(posX, posY, posZ, replaceBlock, 0, 2); @@ -596,49 +597,49 @@ abstract public class Component extends StructureComponent { } } } - + protected void fillWithBlocks(World world, StructureBoundingBox box, int minX, int minY, int minZ, int maxX, int maxY, int maxZ, Block block) { - + if(getYWithOffset(minY) < box.minY || getYWithOffset(maxY) > box.maxY) return; - + for(int x = minX; x <= maxX; x++) { - + for(int z = minZ; z <= maxZ; z++) { int posX = getXWithOffset(x, z); int posZ = getZWithOffset(x, z); - + if(posX >= box.minX && posX <= box.maxX && posZ >= box.minZ && posZ <= box.maxZ) { for(int y = minY; y <= maxY; y++) { int posY = getYWithOffset(y); - + world.setBlock(posX, posY, posZ, block, 0, 2); } } } } } - + @Override protected void fillWithMetadataBlocks(World world, StructureBoundingBox box, int minX, int minY, int minZ, int maxX, int maxY, int maxZ, Block block, int meta, Block replaceBlock, int replaceMeta, boolean onlyReplace) { - + if(getYWithOffset(minY) < box.minY || getYWithOffset(maxY) > box.maxY) return; - + for(int x = minX; x <= maxX; x++) { - + for(int z = minZ; z <= maxZ; z++) { int posX = getXWithOffset(x, z); int posZ = getZWithOffset(x, z); - + if(posX >= box.minX && posX <= box.maxX && posZ >= box.minZ && posZ <= box.maxZ) { for(int y = minY; y <= maxY; y++) { int posY = getYWithOffset(y); - + if(!onlyReplace || world.getBlock(posX, posY, posZ).getMaterial() != Material.air) { if(x != minX && x != maxX && y != minY && y != maxY && z != minZ && z != maxZ) world.setBlock(posX, posY, posZ, replaceBlock, replaceMeta, 2); - else + else world.setBlock(posX, posY, posZ, block, meta, 2); } } @@ -646,45 +647,45 @@ abstract public class Component extends StructureComponent { } } } - + protected void fillWithMetadataBlocks(World world, StructureBoundingBox box, int minX, int minY, int minZ, int maxX, int maxY, int maxZ, Block block, int meta) { - + if(getYWithOffset(minY) < box.minY || getYWithOffset(maxY) > box.maxY) return; - + for(int x = minX; x <= maxX; x++) { - + for(int z = minZ; z <= maxZ; z++) { int posX = getXWithOffset(x, z); int posZ = getZWithOffset(x, z); - + if(posX >= box.minX && posX <= box.maxX && posZ >= box.minZ && posZ <= box.maxZ) { for(int y = minY; y <= maxY; y++) { int posY = getYWithOffset(y); - + world.setBlock(posX, posY, posZ, block, meta, 2); } } } } } - + @Override protected void fillWithRandomizedBlocks(World world, StructureBoundingBox box, int minX, int minY, int minZ, int maxX, int maxY, int maxZ, boolean onlyReplace, Random rand, BlockSelector selector) { - + if(getYWithOffset(minY) < box.minY || getYWithOffset(maxY) > box.maxY) return; - + for(int x = minX; x <= maxX; x++) { - + for(int z = minZ; z <= maxZ; z++) { int posX = getXWithOffset(x, z); int posZ = getZWithOffset(x, z); - + if(posX >= box.minX && posX <= box.maxX && posZ >= box.minZ && posZ <= box.maxZ) { for(int y = minY; y <= maxY; y++) { int posY = getYWithOffset(y); - + if(!onlyReplace || world.getBlock(posX, posY, posZ).getMaterial() != Material.air) { selector.selectBlocks(rand, posX, posY, posZ, x == minX || x == maxX || y == minY || y == maxY || z == minZ || z == maxZ); world.setBlock(posX, posY, posZ, selector.func_151561_a(), selector.getSelectedBlockMetaData(), 2); @@ -696,16 +697,16 @@ abstract public class Component extends StructureComponent { } //TODO replace the shitty block selector with something else. probably a lambda that returns a metablock for convenience protected void fillWithRandomizedBlocks(World world, StructureBoundingBox box, int minX, int minY, int minZ, int maxX, int maxY, int maxZ, Random rand, BlockSelector selector) { //so i don't have to replace shit - + if(getYWithOffset(minY) < box.minY || getYWithOffset(maxY) > box.maxY) return; - + for(int x = minX; x <= maxX; x++) { - + for(int z = minZ; z <= maxZ; z++) { int posX = getXWithOffset(x, z); int posZ = getZWithOffset(x, z); - + if(posX >= box.minX && posX <= box.maxX && posZ >= box.minZ && posZ <= box.maxZ) { for(int y = minY; y <= maxY; y++) { int posY = getYWithOffset(y); @@ -717,19 +718,19 @@ abstract public class Component extends StructureComponent { } } } - + //stairs and shit protected void fillWithRandomizedBlocksMeta(World world, StructureBoundingBox box, int minX, int minY, int minZ, int maxX, int maxY, int maxZ, Random rand, BlockSelector selector, int meta) { - + if(getYWithOffset(minY) < box.minY || getYWithOffset(maxY) > box.maxY) return; - + for(int x = minX; x <= maxX; x++) { - + for(int z = minZ; z <= maxZ; z++) { int posX = getXWithOffset(x, z); int posZ = getZWithOffset(x, z); - + if(posX >= box.minX && posX <= box.maxX && posZ >= box.minZ && posZ <= box.maxZ) { for(int y = minY; y <= maxY; y++) { int posY = getYWithOffset(y); @@ -741,23 +742,23 @@ abstract public class Component extends StructureComponent { } } } - + @Override protected void randomlyFillWithBlocks(World world, StructureBoundingBox box, Random rand, float randLimit, int minX, int minY, int minZ, int maxX, int maxY, int maxZ, Block block, Block replaceBlock, boolean onlyReplace) { - + if(getYWithOffset(minY) < box.minY || getYWithOffset(maxY) > box.maxY) return; - + for(int x = minX; x <= maxX; x++) { - + for(int z = minZ; z <= maxZ; z++) { int posX = getXWithOffset(x, z); int posZ = getZWithOffset(x, z); - + if(posX >= box.minX && posX <= box.maxX && posZ >= box.minZ && posZ <= box.maxZ) { for(int y = minY; y <= maxY; y++) { int posY = getYWithOffset(y); - + if(rand.nextFloat() <= randLimit && (!onlyReplace || world.getBlock(posX, posY, posZ).getMaterial() != Material.air)) { if(x != minX && x != maxX && y != minY && y != maxY && z != minZ && z != maxZ) world.setBlock(posX, posY, posZ, replaceBlock, 0, 2); @@ -769,22 +770,22 @@ abstract public class Component extends StructureComponent { } } } - + protected void randomlyFillWithBlocks(World world, StructureBoundingBox box, Random rand, float randLimit, int minX, int minY, int minZ, int maxX, int maxY, int maxZ, Block block) { - + if(getYWithOffset(minY) < box.minY || getYWithOffset(maxY) > box.maxY) return; - + for(int x = minX; x <= maxX; x++) { - + for(int z = minZ; z <= maxZ; z++) { int posX = getXWithOffset(x, z); int posZ = getZWithOffset(x, z); - + if(posX >= box.minX && posX <= box.maxX && posZ >= box.minZ && posZ <= box.maxZ) { for(int y = minY; y <= maxY; y++) { int posY = getYWithOffset(y); - + if(rand.nextFloat() <= randLimit) world.setBlock(posX, posY, posZ, block, 0, 2); } @@ -792,22 +793,22 @@ abstract public class Component extends StructureComponent { } } } - + protected void randomlyFillWithBlocks(World world, StructureBoundingBox box, Random rand, float randLimit, int minX, int minY, int minZ, int maxX, int maxY, int maxZ, Block block, int meta) { - + if(getYWithOffset(minY) < box.minY || getYWithOffset(maxY) > box.maxY) return; - + for(int x = minX; x <= maxX; x++) { - + for(int z = minZ; z <= maxZ; z++) { int posX = getXWithOffset(x, z); int posZ = getZWithOffset(x, z); - + if(posX >= box.minX && posX <= box.maxX && posZ >= box.minZ && posZ <= box.maxZ) { for(int y = minY; y <= maxY; y++) { int posY = getYWithOffset(y); - + if(rand.nextFloat() <= randLimit) world.setBlock(posX, posY, posZ, block, meta, 2); } @@ -815,7 +816,7 @@ abstract public class Component extends StructureComponent { } } } - + protected ForgeDirection getDirection(ForgeDirection dir) { switch(coordBaseMode) { default: //South @@ -828,7 +829,7 @@ abstract public class Component extends StructureComponent { return dir.getRotation(ForgeDirection.DOWN); } } - + /** Sets the core block for a BlockDummyable multiblock. WARNING: Does not take {@link com.hbm.blocks.BlockDummyable#getDirModified(ForgeDirection)} or {@link com.hbm.blocks.BlockDummyable#getMetaForCore(World, int, int, int, EntityPlayer, int)} * into account yet! This will be changed as it comes up!
    * For BlockDummyables, 'dir' always faces the player, being the opposite of the player's direction. This is already taken into account. */ @@ -836,47 +837,47 @@ abstract public class Component extends StructureComponent { int posX = getXWithOffset(x, z); int posZ = getZWithOffset(x, z); int posY = getYWithOffset(y); - + if(!box.isVecInside(posX, posY, posZ)) return; - + if(dir == null) dir = ForgeDirection.NORTH; - + dir = getDirection(dir.getOpposite()); world.setBlock(posX, posY, posZ, block, dir.ordinal() + BlockDummyable.offset, 2); } - + //always set the core block first /** StructureComponent-friendly method for {@link com.hbm.handler.MultiblockHandlerXR#fillSpace(World, int, int, int, int[], Block, ForgeDirection)}. Prevents runoff outside of the provided bounding box.
    * For BlockDummyables, 'dir' always faces the player, being the opposite of the player's direction. This is already taken into account. */ protected void fillSpace(World world, StructureBoundingBox box, int x, int y, int z, int[] dim, Block block, ForgeDirection dir) { - + if(getYWithOffset(y - dim[1]) < box.minY || getYWithOffset(y + dim[0]) > box.maxY) //the BlockDummyable will be fucked regardless if it goes beyond either limit return; - + if(dir == null) dir = ForgeDirection.NORTH; - + dir = getDirection(dir.getOpposite()); - + int count = 0; - + int[] rot = MultiblockHandlerXR.rotate(dim, dir); - + int posX = getXWithOffset(x, z); int posZ = getZWithOffset(x, z); //MY SILLY ASS OPERATING WITH ALREADY FUCKING MODIFIED VARIABLES CLOWNKOEN int posY = getYWithOffset(y); - + BlockDummyable.safeRem = true; - + for(int a = posX - rot[4]; a <= posX + rot[5]; a++) { for(int c = posZ - rot[2]; c <= posZ + rot[3]; c++) { - + if(a >= box.minX && a <= box.maxX && c >= box.minZ && c <= box.maxZ) { for(int b = posY - rot[1]; b <= posY + rot[0]; b++) { - + int meta = 0; - + if(b < posY) { meta = ForgeDirection.DOWN.ordinal(); } else if(b > posY) { @@ -892,14 +893,14 @@ abstract public class Component extends StructureComponent { } else { continue; } - + world.setBlock(a, b, c, block, meta, 2); - + count++; - + if(count > 2000) { System.out.println("component's fillspace: ded " + a + " " + b + " " + c + " " + x + " " + y + " " + z); - + BlockDummyable.safeRem = false; return; } @@ -907,19 +908,19 @@ abstract public class Component extends StructureComponent { } } } - + BlockDummyable.safeRem = false; } - + /** StructureComponent-friendly method for {@link com.hbm.blocks.BlockDummyable#makeExtra(World, int, int, int)}. Prevents runoff outside of the provided bounding box. */ public void makeExtra(World world, StructureBoundingBox box, Block block, int x, int y, int z) { int posX = getXWithOffset(x, z); int posZ = getZWithOffset(x, z); int posY = getYWithOffset(y); - + if(!box.isVecInside(posX, posY, posZ)) return; - + if(world.getBlock(posX, posY, posZ) != block) return; @@ -927,23 +928,23 @@ abstract public class Component extends StructureComponent { if(meta > 5) return; - + BlockDummyable.safeRem = true; world.setBlock(posX, posY, posZ, block, meta + BlockDummyable.extra, 3); BlockDummyable.safeRem = false; } - + /** Block Selectors **/ - + static class Sandstone extends StructureComponent.BlockSelector { - + Sandstone() { } - + /** Selects blocks */ @Override public void selectBlocks(Random rand, int posX, int posY, int posZ, boolean notInterior) { float chance = rand.nextFloat(); - + if(chance > 0.6F) { this.field_151562_a = Blocks.sandstone; } else if (chance < 0.5F ) { @@ -953,16 +954,16 @@ abstract public class Component extends StructureComponent { } } } - + static class ConcreteBricks extends StructureComponent.BlockSelector { - + ConcreteBricks() { } - + /** Selects blocks */ @Override public void selectBlocks(Random rand, int posX, int posY, int posZ, boolean notInterior) { float chance = rand.nextFloat(); - + if(chance < 0.4F) { this.field_151562_a = ModBlocks.brick_concrete; } else if (chance < 0.7F) { @@ -974,18 +975,18 @@ abstract public class Component extends StructureComponent { } } } - + static class ConcreteBricksStairs extends StructureComponent.BlockSelector { - + ConcreteBricksStairs() { this.selectedBlockMetaData = 0; } - + /** Selects blocks */ @Override public void selectBlocks(Random rand, int posX, int posY, int posZ, boolean notInterior) { float chance = rand.nextFloat(); - + if(chance < 0.4F) { this.field_151562_a = ModBlocks.brick_concrete_stairs; } else if (chance < 0.7F) { @@ -997,19 +998,19 @@ abstract public class Component extends StructureComponent { } } } - + static class ConcreteBricksSlabs extends StructureComponent.BlockSelector { - + ConcreteBricksSlabs() { this.field_151562_a = ModBlocks.concrete_brick_slab; this.selectedBlockMetaData = 0; } - + /** Selects blocks */ @Override public void selectBlocks(Random rand, int posX, int posY, int posZ, boolean notInterior) { float chance = rand.nextFloat(); - + if (chance >= 0.4F && chance < 0.7F) { this.selectedBlockMetaData |= 1; } else if (chance < 0.9F) { @@ -1019,17 +1020,17 @@ abstract public class Component extends StructureComponent { } } } - + //ag static class LabTiles extends StructureComponent.BlockSelector { - + LabTiles() { } - + /** Selects blocks */ @Override public void selectBlocks(Random rand, int posX, int posY, int posZ, boolean notInterior) { float chance = rand.nextFloat(); - + if(chance < 0.5F) { this.field_151562_a = ModBlocks.tile_lab; } else if (chance < 0.9F) { @@ -1039,18 +1040,84 @@ abstract public class Component extends StructureComponent { } } } - + static class SuperConcrete extends StructureComponent.BlockSelector { - + SuperConcrete() { this.field_151562_a = ModBlocks.concrete_super; } - + /** Selects blocks */ @Override public void selectBlocks(Random rand, int posX, int posY, int posZ, boolean notInterior) { this.selectedBlockMetaData = rand.nextInt(6) + 10; } } - + + public static class MeteorBricks extends BlockSelector { + + @Override + public void selectBlocks(Random rand, int posX, int posY, int posZ, boolean notInterior) { + float chance = rand.nextFloat(); + + if(chance < 0.4F) { + this.field_151562_a = ModBlocks.meteor_brick; + } else if (chance < 0.7F) { + this.field_151562_a = ModBlocks.meteor_brick_mossy; + } else { + this.field_151562_a = ModBlocks.meteor_brick_cracked; + } + } + + } + + public static class SupplyCrates extends BlockSelector { + + @Override + public void selectBlocks(Random rand, int posX, int posY, int posZ, boolean notInterior) { + float chance = rand.nextFloat(); + + if(chance < 0.6F) { + this.field_151562_a = Blocks.air; + } else if(chance < 0.8F) { + this.field_151562_a = ModBlocks.crate_ammo; + } else if(chance < 0.9F) { + this.field_151562_a = ModBlocks.crate_can; + } else { + this.field_151562_a = ModBlocks.crate; + } + } + + } + + public static class CrabSpawners extends BlockSelector { + + @Override + public void selectBlocks(Random rand, int posX, int posY, int posZ, boolean notInterior) { + float chance = rand.nextFloat(); + + if(chance < 0.8F) { + this.field_151562_a = ModBlocks.meteor_brick; + } else { + this.field_151562_a = ModBlocks.meteor_spawner; + } + } + + } + + public static class GreenOoze extends BlockSelector { + + @Override + public void selectBlocks(Random rand, int posX, int posY, int posZ, boolean notInterior) { + float chance = rand.nextFloat(); + + if(chance < 0.8F) { + this.field_151562_a = ModBlocks.toxic_block; + } else { + this.field_151562_a = ModBlocks.meteor_polished; + } + } + + } + } diff --git a/src/main/java/com/hbm/world/generator/CellularDungeonFactory.java b/src/main/java/com/hbm/world/generator/CellularDungeonFactory.java index e58e88ae3..f6cd5f152 100644 --- a/src/main/java/com/hbm/world/generator/CellularDungeonFactory.java +++ b/src/main/java/com/hbm/world/generator/CellularDungeonFactory.java @@ -2,24 +2,12 @@ package com.hbm.world.generator; import com.hbm.world.generator.room.*; -import net.minecraftforge.common.util.ForgeDirection; - public class CellularDungeonFactory { - public static CellularDungeon meteor; public static CellularDungeon jungle; - + public static void init() { - - meteor = new TestDungeon(11, 7, 11, 11, 150, 3); - meteor.rooms.add(new TestDungeonRoom1(meteor)); - meteor.rooms.add(new TestDungeonRoom2(meteor)); - meteor.rooms.add(new TestDungeonRoom3(meteor)); - meteor.rooms.add(new TestDungeonRoom4(meteor, new TestDungeonRoom5(meteor), ForgeDirection.NORTH)); - meteor.rooms.add(new TestDungeonRoom6(meteor)); - meteor.rooms.add(new TestDungeonRoom7(meteor)); - meteor.rooms.add(new TestDungeonRoom8(meteor)); - + jungle = new JungleDungeon(5, 5, 25, 25, 700, 6); for(int i = 0; i < 10; i++) jungle.rooms.add(new JungleDungeonRoom(jungle)); jungle.rooms.add(new JungleDungeonRoomArrow(jungle)); diff --git a/src/main/java/com/hbm/world/generator/TestDungeon.java b/src/main/java/com/hbm/world/generator/TestDungeon.java deleted file mode 100644 index 14ae78cf7..000000000 --- a/src/main/java/com/hbm/world/generator/TestDungeon.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.hbm.world.generator; - -import com.hbm.blocks.ModBlocks; -import com.hbm.inventory.RecipesCommon.MetaBlock; - -public class TestDungeon extends CellularDungeon { - - public TestDungeon(int width, int height, int dimX, int dimZ, int tries, int branches) { - super(width, height, dimX, dimZ, tries, branches); - - this.floor.add(new MetaBlock(ModBlocks.meteor_polished)); - this.wall.add(new MetaBlock(ModBlocks.meteor_brick)); - this.wall.add(new MetaBlock(ModBlocks.meteor_brick)); - this.wall.add(new MetaBlock(ModBlocks.meteor_brick_mossy)); - this.wall.add(new MetaBlock(ModBlocks.meteor_brick_cracked)); - this.ceiling.add(new MetaBlock(ModBlocks.block_meteor_broken)); - } - -} diff --git a/src/main/java/com/hbm/world/generator/room/TestDungeonRoom1.java b/src/main/java/com/hbm/world/generator/room/TestDungeonRoom1.java deleted file mode 100644 index 77f2f257b..000000000 --- a/src/main/java/com/hbm/world/generator/room/TestDungeonRoom1.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.hbm.world.generator.room; - -import com.hbm.blocks.ModBlocks; -import com.hbm.world.generator.CellularDungeon; -import com.hbm.world.generator.CellularDungeonRoom; -import com.hbm.world.generator.DungeonToolbox; - -import net.minecraft.init.Blocks; -import net.minecraft.world.World; - -public class TestDungeonRoom1 extends CellularDungeonRoom { - - public TestDungeonRoom1(CellularDungeon parent) { - super(parent); - } - - public void generateMain(World world, int x, int y, int z) { - - super.generateMain(world, x, y, z); - DungeonToolbox.generateBox(world, x + parent.width / 2 - 3, y + 1, z + parent.width / 2 - 3, 1, parent.height - 2, 1, ModBlocks.meteor_pillar); - DungeonToolbox.generateBox(world, x + parent.width / 2 + 3, y + 1, z + parent.width / 2 - 3, 1, parent.height - 2, 1, ModBlocks.meteor_pillar); - DungeonToolbox.generateBox(world, x + parent.width / 2 + 3, y + 1, z + parent.width / 2 + 3, 1, parent.height - 2, 1, ModBlocks.meteor_pillar); - DungeonToolbox.generateBox(world, x + parent.width / 2 - 3, y + 1, z + parent.width / 2 + 3, 1, parent.height - 2, 1, ModBlocks.meteor_pillar); - world.setBlock(x + parent.width / 2 - 3, y + 3, z + parent.width / 2 - 3, ModBlocks.meteor_brick_chiseled, 0, 2); - world.setBlock(x + parent.width / 2 + 3, y + 3, z + parent.width / 2 - 3, ModBlocks.meteor_brick_chiseled, 0, 2); - world.setBlock(x + parent.width / 2 + 3, y + 3, z + parent.width / 2 + 3, ModBlocks.meteor_brick_chiseled, 0, 2); - world.setBlock(x + parent.width / 2 - 3, y + 3, z + parent.width / 2 + 3, ModBlocks.meteor_brick_chiseled, 0, 2); - world.setBlock(x + parent.width / 2, y + 1, z + parent.width / 2, ModBlocks.meteor_pillar, 0, 2); - world.setBlock(x + parent.width / 2, y + 2, z + parent.width / 2, Blocks.glowstone, 0, 3); - - /*world.setBlock(x + parent.width / 2, y, z + parent.width / 2, Blocks.mob_spawner, 0, 2); - TileEntityMobSpawner tileentitymobspawner2 = (TileEntityMobSpawner)world.getTileEntity(x + parent.width / 2, y, z + parent.width / 2); - - if (tileentitymobspawner2 != null) - { - tileentitymobspawner2.func_145881_a().setEntityName("entity_cyber_crab"); - }*/ - } -} diff --git a/src/main/java/com/hbm/world/generator/room/TestDungeonRoom2.java b/src/main/java/com/hbm/world/generator/room/TestDungeonRoom2.java deleted file mode 100644 index 60c15b6e3..000000000 --- a/src/main/java/com/hbm/world/generator/room/TestDungeonRoom2.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.hbm.world.generator.room; - -import com.hbm.blocks.ModBlocks; -import com.hbm.world.generator.CellularDungeon; -import com.hbm.world.generator.CellularDungeonRoom; - -import net.minecraft.world.World; - -public class TestDungeonRoom2 extends CellularDungeonRoom { - - public TestDungeonRoom2(CellularDungeon parent) { - super(parent); - } - - public void generateMain(World world, int x, int y, int z) { - - super.generateMain(world, x, y, z); - - int j = world.rand.nextInt(2) + 2; - int k = world.rand.nextInt(3) + 2; - - for(int i = 0; i < j; i++) { - int dx = world.rand.nextInt(parent.width - 6) + 3; - int dz = world.rand.nextInt(parent.width - 6) + 3; - world.setBlock(x + dx, y + 1, z + dz, ModBlocks.crate_ammo, 0, 2); - } - - for(int i = 0; i < k; i++) { - int dx = world.rand.nextInt(parent.width - 6) + 3; - int dz = world.rand.nextInt(parent.width - 6) + 3; - world.setBlock(x + dx, y + 1, z + dz, ModBlocks.crate_can, 0, 2); - } - } -} diff --git a/src/main/java/com/hbm/world/generator/room/TestDungeonRoom3.java b/src/main/java/com/hbm/world/generator/room/TestDungeonRoom3.java deleted file mode 100644 index dbb6f7366..000000000 --- a/src/main/java/com/hbm/world/generator/room/TestDungeonRoom3.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.hbm.world.generator.room; - -import com.hbm.blocks.ModBlocks; -import com.hbm.world.generator.CellularDungeon; -import com.hbm.world.generator.CellularDungeonRoom; -import com.hbm.world.generator.DungeonToolbox; - -import net.minecraft.init.Blocks; -import net.minecraft.tileentity.TileEntityMobSpawner; -import net.minecraft.world.World; - -public class TestDungeonRoom3 extends CellularDungeonRoom { - - public TestDungeonRoom3(CellularDungeon parent) { - super(parent); - } - - public void generateMain(World world, int x, int y, int z) { - - super.generateMain(world, x, y, z); - DungeonToolbox.generateBox(world, x + parent.width / 2 - 2, y + 1, z + parent.width / 2 - 2, 5, 4, 5, ModBlocks.deco_lead); - DungeonToolbox.generateBox(world, x + parent.width / 2 - 1, y + 1, z + parent.width / 2 - 1, 3, 3, 3, ModBlocks.toxic_block); - DungeonToolbox.generateBox(world, x + parent.width / 2 - 1, y + 4, z + parent.width / 2 - 1, 3, 1, 3, Blocks.air); - - world.setBlock(x + parent.width / 2, y + 1, z + parent.width / 2, Blocks.mob_spawner, 0, 2); - TileEntityMobSpawner tileentitymobspawner2 = (TileEntityMobSpawner)world.getTileEntity(x + parent.width / 2, y + 1, z + parent.width / 2); - - if (tileentitymobspawner2 != null) - { - tileentitymobspawner2.func_145881_a().setEntityName("entity_cyber_crab"); - } - } -} diff --git a/src/main/java/com/hbm/world/generator/room/TestDungeonRoom4.java b/src/main/java/com/hbm/world/generator/room/TestDungeonRoom4.java deleted file mode 100644 index 815f26330..000000000 --- a/src/main/java/com/hbm/world/generator/room/TestDungeonRoom4.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.hbm.world.generator.room; - -import java.util.ArrayList; - -import com.hbm.blocks.ModBlocks; -import com.hbm.inventory.RecipesCommon.MetaBlock; -import com.hbm.world.generator.CellularDungeon; -import com.hbm.world.generator.CellularDungeonRoom; -import com.hbm.world.generator.DungeonToolbox; - -import net.minecraft.init.Blocks; -import net.minecraft.world.World; -import net.minecraftforge.common.util.ForgeDirection; - -public class TestDungeonRoom4 extends CellularDungeonRoom { - - public TestDungeonRoom4(CellularDungeon parent, CellularDungeonRoom daisyChain, ForgeDirection dir) { - super(parent); - this.daisyChain = daisyChain; - this.daisyDirection = dir; - } - - public void generateMain(World world, int x, int y, int z) { - - super.generateMain(world, x, y, z); - DungeonToolbox.generateBox(world, x, y + parent.height - 2, z, parent.width, 1, parent.width, new ArrayList() {{ add(new MetaBlock(Blocks.air)); add(new MetaBlock(Blocks.web)); }}); - - DungeonToolbox.generateBox(world, x + 1, y, z + 1, parent.width - 2, 1, parent.width - 2, new ArrayList() {{ - add(new MetaBlock(ModBlocks.meteor_polished)); - add(new MetaBlock(ModBlocks.meteor_polished)); - add(new MetaBlock(ModBlocks.meteor_polished)); - add(new MetaBlock(ModBlocks.meteor_polished)); - add(new MetaBlock(ModBlocks.meteor_polished)); - add(new MetaBlock(ModBlocks.meteor_spawner)); - }}); - } - - public void generateWall(World world, int x, int y, int z, ForgeDirection wall, boolean door) { - - if(wall != ForgeDirection.NORTH) - super.generateWall(world, x, y, z, wall, door); - } -} \ No newline at end of file diff --git a/src/main/java/com/hbm/world/generator/room/TestDungeonRoom5.java b/src/main/java/com/hbm/world/generator/room/TestDungeonRoom5.java deleted file mode 100644 index e02be0c7d..000000000 --- a/src/main/java/com/hbm/world/generator/room/TestDungeonRoom5.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.hbm.world.generator.room; - -import java.util.ArrayList; - -import com.hbm.blocks.ModBlocks; -import com.hbm.inventory.RecipesCommon.MetaBlock; -import com.hbm.world.generator.CellularDungeon; -import com.hbm.world.generator.CellularDungeonRoom; -import com.hbm.world.generator.DungeonToolbox; - -import net.minecraft.init.Blocks; -import net.minecraft.world.World; -import net.minecraftforge.common.util.ForgeDirection; - -public class TestDungeonRoom5 extends CellularDungeonRoom { - - public TestDungeonRoom5(CellularDungeon parent) { - super(parent); - } - - public void generateMain(World world, int x, int y, int z) { - - super.generateMain(world, x, y, z); - DungeonToolbox.generateBox(world, x, y + parent.height - 2, z, parent.width, 1, parent.width, new ArrayList() {{ add(new MetaBlock(Blocks.air)); add(new MetaBlock(Blocks.web)); }}); - - DungeonToolbox.generateBox(world, x + 1, y, z + 1, parent.width - 2, 1, parent.width - 2, new ArrayList() {{ - add(new MetaBlock(ModBlocks.meteor_polished)); - add(new MetaBlock(ModBlocks.meteor_polished)); - add(new MetaBlock(ModBlocks.meteor_polished)); - add(new MetaBlock(ModBlocks.meteor_polished)); - add(new MetaBlock(ModBlocks.meteor_polished)); - add(new MetaBlock(ModBlocks.meteor_spawner)); }}); - } - - public void generateWall(World world, int x, int y, int z, ForgeDirection wall, boolean door) { - - if(wall != ForgeDirection.SOUTH) - super.generateWall(world, x, y, z, wall, door); - } -} \ No newline at end of file diff --git a/src/main/java/com/hbm/world/generator/room/TestDungeonRoom6.java b/src/main/java/com/hbm/world/generator/room/TestDungeonRoom6.java deleted file mode 100644 index e04f552cc..000000000 --- a/src/main/java/com/hbm/world/generator/room/TestDungeonRoom6.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.hbm.world.generator.room; - -import com.hbm.blocks.ModBlocks; -import com.hbm.world.generator.CellularDungeon; -import com.hbm.world.generator.CellularDungeonRoom; -import com.hbm.world.generator.DungeonToolbox; - -import net.minecraft.world.World; -import net.minecraftforge.common.util.ForgeDirection; - -public class TestDungeonRoom6 extends CellularDungeonRoom { - - public TestDungeonRoom6(CellularDungeon parent) { - super(parent); - } - - public void generateMain(World world, int x, int y, int z) { - - super.generateMain(world, x, y, z); - DungeonToolbox.generateBox(world, x + 1, y, z + 1, parent.width - 2, 1, parent.width - 2, ModBlocks.toxic_block); - DungeonToolbox.generateBox(world, x + parent.width / 2 - 1, y, z + parent.width / 2 - 1, 3, 1, 3, ModBlocks.meteor_brick_chiseled); - world.setBlock(x + parent.width / 2, y, z + parent.width / 2, ModBlocks.meteor_polished); - - world.setBlock(x + 1, y, z + parent.width / 2, ModBlocks.meteor_polished); - world.setBlock(x + parent.width / 2, y, z + 1, ModBlocks.meteor_polished); - - world.setBlock(x + parent.width - 2, y, z + parent.width / 2, ModBlocks.meteor_polished); - world.setBlock(x + parent.width / 2, y, z + parent.width - 2, ModBlocks.meteor_polished); - } - - public void generateWall(World world, int x, int y, int z, ForgeDirection wall, boolean door) { - - super.generateWall(world, x, y, z, wall, door); - - if(!door) - return; - - if(wall == ForgeDirection.NORTH) { - DungeonToolbox.generateBox(world, x + parent.width / 2, y, z + 1, 1, 1, parent.width / 2 - 2, ModBlocks.meteor_polished); - } - - if(wall == ForgeDirection.SOUTH) { - DungeonToolbox.generateBox(world, x + parent.width / 2, y, z + parent.width / 2 + 2, 1, 1, parent.width / 2 - 2, ModBlocks.meteor_polished); - } - - if(wall == ForgeDirection.WEST) { - DungeonToolbox.generateBox(world, x + 1, y, z + parent.width / 2, parent.width / 2 - 2, 1, 1, ModBlocks.meteor_polished); - } - - if(wall == ForgeDirection.EAST) { - DungeonToolbox.generateBox(world, x + parent.width / 2 + 2, y, z + parent.width / 2, parent.width / 2 - 2, 1, 1, ModBlocks.meteor_polished); - } - } -} diff --git a/src/main/java/com/hbm/world/generator/room/TestDungeonRoom7.java b/src/main/java/com/hbm/world/generator/room/TestDungeonRoom7.java deleted file mode 100644 index 57909caa2..000000000 --- a/src/main/java/com/hbm/world/generator/room/TestDungeonRoom7.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.hbm.world.generator.room; - -import com.hbm.blocks.ModBlocks; -import com.hbm.world.generator.CellularDungeon; -import com.hbm.world.generator.CellularDungeonRoom; -import com.hbm.world.generator.DungeonToolbox; - -import net.minecraft.world.World; - -public class TestDungeonRoom7 extends CellularDungeonRoom { - - public TestDungeonRoom7(CellularDungeon parent) { - super(parent); - } - - public void generateMain(World world, int x, int y, int z) { - - super.generateMain(world, x, y, z); - - DungeonToolbox.generateBox(world, x, y, z, parent.width, 1, parent.width, ModBlocks.meteor_polished); - DungeonToolbox.generateBox(world, x + 2, y, z + 2, parent.width - 4, 1, parent.width - 4, ModBlocks.deco_red_copper); - DungeonToolbox.generateBox(world, x + 3, y, z + 3, parent.width - 6, 1, parent.width - 6, ModBlocks.meteor_polished); - DungeonToolbox.generateBox(world, x + 4, y, z + 4, parent.width - 8, 1, parent.width - 8, ModBlocks.deco_red_copper); - - world.setBlock(x + parent.width / 2, y, z + parent.width / 2, ModBlocks.meteor_battery); - world.setBlock(x + parent.width / 2, y + 1, z + parent.width / 2, ModBlocks.tesla); - } -} diff --git a/src/main/java/com/hbm/world/generator/room/TestDungeonRoom8.java b/src/main/java/com/hbm/world/generator/room/TestDungeonRoom8.java deleted file mode 100644 index e69db5214..000000000 --- a/src/main/java/com/hbm/world/generator/room/TestDungeonRoom8.java +++ /dev/null @@ -1,225 +0,0 @@ -package com.hbm.world.generator.room; - -import com.hbm.blocks.ModBlocks; -import com.hbm.crafting.handlers.MKUCraftingHandler; -import com.hbm.items.ModItems; -import com.hbm.items.special.ItemBookLore; -import com.hbm.tileentity.machine.storage.TileEntitySafe; -import com.hbm.world.generator.CellularDungeon; -import com.hbm.world.generator.CellularDungeonRoom; -import com.hbm.world.generator.DungeonToolbox; - -import net.minecraft.init.Items; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.world.World; - -public class TestDungeonRoom8 extends CellularDungeonRoom { - - public TestDungeonRoom8(CellularDungeon parent) { - super(parent); - } - - public void generateMain(World world, int x, int y, int z) { - - super.generateMain(world, x, y, z); - DungeonToolbox.generateBox(world, x + parent.width / 2 - 3, y + 1, z + parent.width / 2 - 3, 1, parent.height - 2, 1, ModBlocks.meteor_pillar); - DungeonToolbox.generateBox(world, x + parent.width / 2 + 3, y + 1, z + parent.width / 2 - 3, 1, parent.height - 2, 1, ModBlocks.meteor_pillar); - DungeonToolbox.generateBox(world, x + parent.width / 2 + 3, y + 1, z + parent.width / 2 + 3, 1, parent.height - 2, 1, ModBlocks.meteor_pillar); - DungeonToolbox.generateBox(world, x + parent.width / 2 - 3, y + 1, z + parent.width / 2 + 3, 1, parent.height - 2, 1, ModBlocks.meteor_pillar); - world.setBlock(x + parent.width / 2 - 3, y + 3, z + parent.width / 2 - 3, ModBlocks.meteor_brick_chiseled, 0, 2); - world.setBlock(x + parent.width / 2 + 3, y + 3, z + parent.width / 2 - 3, ModBlocks.meteor_brick_chiseled, 0, 2); - world.setBlock(x + parent.width / 2 + 3, y + 3, z + parent.width / 2 + 3, ModBlocks.meteor_brick_chiseled, 0, 2); - world.setBlock(x + parent.width / 2 - 3, y + 3, z + parent.width / 2 + 3, ModBlocks.meteor_brick_chiseled, 0, 2); - - DungeonToolbox.generateBox(world, x + 4, y + 1, z + 4, parent.width - 8, 1, parent.width - 8, ModBlocks.meteor_polished); - - int i = world.rand.nextInt(8); - - switch(i) { - case 0: world.setBlock(x + parent.width / 2, y + 2, z + parent.width / 2, ModBlocks.meteor_brick_chiseled, 0, 3); break; - case 1: world.setBlock(x + parent.width / 2, y + 2, z + parent.width / 2, ModBlocks.ntm_dirt, 0, 3); break; - case 2: world.setBlock(x + parent.width / 2, y + 2, z + parent.width / 2, ModBlocks.block_starmetal, 0, 3); break; - case 3: world.setBlock(x + parent.width / 2, y + 2, z + parent.width / 2, ModBlocks.statue_elb_f, 0, 3); break; - case 4: world.setBlock(x + parent.width / 2, y + 2, z + parent.width / 2, ModBlocks.crate_red, 0, 3); break; - case 5: world.setBlock(x + parent.width / 2, y + 2, z + parent.width / 2, ModBlocks.balefire, 0, 3); break; - case 6: world.setBlock(x + parent.width / 2, y + 2, z + parent.width / 2, ModBlocks.block_meteor, 0, 3); break; - case 7: - world.setBlock(x + parent.width / 2, y + 2, z + parent.width / 2, ModBlocks.safe, 0, 3); - if(world.getTileEntity(x + parent.width / 2, y + 2, z + parent.width / 2) instanceof TileEntitySafe) { - - int r = world.rand.nextInt(10); - - if(r == 0) { - ((TileEntitySafe)world.getTileEntity(x + parent.width / 2, y + 2, z + parent.width / 2)).setInventorySlotContents(7, new ItemStack(ModItems.book_of_)); - } else if(r < 4) { - TileEntitySafe safe = (TileEntitySafe) world.getTileEntity(x + parent.width / 2, y + 2, z + parent.width / 2); - safe.setInventorySlotContents(5, generateBook(world)); - safe.setInventorySlotContents(7, new ItemStack(ModItems.stamp_book, 1, world.rand.nextInt(8))); - safe.setInventorySlotContents(9, new ItemStack(ModItems.stamp_book, 1, world.rand.nextInt(8))); - } else { - TileEntitySafe safe = (TileEntitySafe) world.getTileEntity(x + parent.width / 2, y + 2, z + parent.width / 2); - safe.setInventorySlotContents(5, new ItemStack(Items.book)); - safe.setInventorySlotContents(7, new ItemStack(ModItems.stamp_book, 1, world.rand.nextInt(8))); - safe.setInventorySlotContents(9, new ItemStack(ModItems.stamp_book, 1, world.rand.nextInt(8))); - } - } - break; - } - } - - public static ItemStack generateBook(World world) { - MKUCraftingHandler.generateRecipe(world); - ItemStack[] recipe = MKUCraftingHandler.MKURecipe; - - if(recipe == null) return new ItemStack(ModItems.flame_pony); - - String key; - int pages; - Item item; - switch(world.rand.nextInt(6)) { - case 0: - key = "book_iodine"; pages = 3; - item = ModItems.powder_iodine; break; - case 1: - key = "book_phosphorous"; pages = 2; - item = ModItems.powder_fire; break; - case 2: - key = "book_dust"; pages = 3; - item = ModItems.dust; break; - case 3: - key = "book_mercury"; pages = 2; - item = ModItems.ingot_mercury; break; - case 4: - key = "book_flower"; pages = 2; - item = ModItems.morning_glory; break; - case 5: - key = "book_syringe"; pages = 2; - item = ModItems.syringe_metal_empty; break; - default: - return new ItemStack(ModItems.flame_pony); - } - - int s = 1; - for(int i = 0; i < 9; i++) { - if(recipe[i] != null && recipe[i].getItem() == item) { - s = i + 1; break; - } - } - - ItemStack book = ItemBookLore.createBook(key, pages, 0x271E44, 0xFBFFF4); - ItemBookLore.addArgs(book, pages - 1, String.valueOf(s)); - - return book; - } - - /*public static ItemStack genetateMKU(World world) { - - ItemStack book = new ItemStack(Items.written_book); - book.stackTagCompound = new NBTTagCompound(); - book.stackTagCompound.setString("author", "Dave"); - book.stackTagCompound.setString("title", "Note"); - NBTTagList nbt = new NBTTagList(); - - String[] pages = generatePages(world); - - for(String s : pages) { - nbt.appendTag(new NBTTagString(s)); - } - - book.stackTagCompound.setTag("pages", nbt); - - return book; - } - - private static String[] bookIodine = new String[] { - "alright you will not believe this, but old man weathervane finally managed to show up again since he left two weeks ago", - "and what's more surprising is the fact that he actually decided to spill the beans on what they were doing in the canyon:", - "apparently the morons form R&D discovered a compound that is mostly inorganic, pretty much like a toxin in nature, but get", - "this: the dying cells will reproduce said toxin and excete it through the skin, creating an aerosol that is highly contageous.", - "it's just like a virus, but not a virus. the composition is weird, you can mix it in any household bottle but you do have to", - "get the order right. the doc told me that the first ingredient which is just powdered iodine crystals goes into slot #" - }; - private static String[] bookPhosphorous = new String[] { - "heyo, it's me again. i assume you got my last memo, the doc wasn't too happy about it. i'll have to do this quick, the", - "dunderheads from R&D are currently moaning again, probably over money. again. anyway, doc weathervane found that the second", - "ingredient is red phosphorous, whihc has to be mixed into slot #" - }; - private static String[] bookDust = new String[] { - "the doc was furious when he found out that the R&D dorks kept the one remaining sample, ranting about gross negligence this", - "and a doomsday scenario that. i told him to chill for a minute, getting all worked up isn't good for his blood pressure, not", - "that he has much blood left to begin with. one of the R&D morons slipped some more info into last week's circular, they call their", - "little concoction \"MKU\" whatever that means, and that it contains actual household lint. can you believe that? one of the most", - "dangerous inventions of theirs and it contains dust. strangely they also mentioned that it goes into slot #" - }; - private static String[] bookMercury = new String[] { - "well that settles that. not counting the vomitting blood part, the toxicological report mostly resembles that of mercury", - "poisoning. why? because our little mix also contains mercury! i just wonder where all that stuff comes from when being", - "replicated by the body? whatever, the mercury goes into slot #" - }; - private static String[] bookFlower = new String[] { - "remember when i mentioned in my first memo that the compound is mostly anorganic? well guess what, the old man shared the fourth", - "ingredient: ipomoea nil, a genus of flower. morning glory! it might be due to its low sulfur content, whatever might be the case,", - "it does not work with other flowers. the morning glory goes into slot #" - }; - private static String[] bookSyringe = new String[] { - "a little addendum to my fifth message, obviously you have to store this MKU stuff in a container. the R&D nuts used regular", - "metal syringes that they got from medical. surplus ware i presume, they got thousands of needles just lying around. the metal", - "syringe goes into slot #" - }; - - public static String[] generatePages(World world) { - - String[] orig; - Item ingred; - int r = world.rand.nextInt(6); - - if(r == 0) { - orig = bookIodine; - ingred = ModItems.powder_iodine; - } else if(r == 1) { - orig = bookPhosphorous; - ingred = ModItems.powder_fire; - } else if(r == 2) { - orig = bookDust; - ingred = ModItems.dust; - } else if(r == 3) { - orig = bookMercury; - ingred = ModItems.ingot_mercury; - } else if(r == 4) { - orig = bookFlower; - ingred = ModItems.morning_glory; - } else { - orig = bookSyringe; - ingred = ModItems.syringe_metal_empty; - } - - String[] copy = new String[orig.length]; - - for(int i = 0; i < orig.length; i++) { - copy[i] = orig[i] + ""; //Strings are reference types and i'm really not counting on my luck here - } - - copy[copy.length - 1] += getSlot(world, ingred); - - return copy; - } - - public static int getSlot(World world, Item item) { - - MKUCraftingHandler.generateRecipe(world); - ItemStack[] recipe = MKUCraftingHandler.MKURecipe; - - if(recipe == null) //take no chances - return -2; - - for(int i = 0; i < 9; i++) { - - if(recipe[i] != null && recipe[i].getItem() == item) { - return i + 1; - } - } - - return -1; - }*/ -} diff --git a/src/main/resources/META-INF/HBM_at.cfg b/src/main/resources/META-INF/HBM_at.cfg index 65926b7ac..9a2ecc5a5 100644 --- a/src/main/resources/META-INF/HBM_at.cfg +++ b/src/main/resources/META-INF/HBM_at.cfg @@ -35,6 +35,9 @@ public net.minecraft.world.gen.ChunkProviderFlat field_82702_h # ha # ChunkProviderServer public net.minecraft.world.gen.ChunkProviderServer field_73248_b # chunksToUnload +# NBTTagList +public net.minecraft.nbt.NBTTagList * # Mojang makes a format use LISTS of INTs, what the fuck + # ItemRenderer public net.minecraft.client.renderer.ItemRenderer field_78453_b # itemToRender diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index 845db5b7c..b4caaa162 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -5336,6 +5336,7 @@ tile.deco_computer.ibm_300pl.name=IBM Personal Computer 300PL tile.deco_crt.name=Old CRT Screen tile.deco_emitter.name=Deco Light Emitter tile.deco_lead.name=Lead Deco Block +tile.deco_loot.name=Loot Pile tile.deco_rbmk.name=RBMK Deco Block tile.deco_rbmk_smooth.name=Smooth RBMK Deco Block tile.deco_red_copper.name=Red Copper Deco Block @@ -6015,6 +6016,7 @@ tile.red_pylon_medium_steel_transformer.name=Medium Steel Electricity Pylon with tile.red_pylon_medium_wood.name=Medium Wooden Electricity Pylon tile.red_pylon_medium_wood_transformer.name=Medium Wooden Electricity Pylon with Transformer tile.red_wire_coated.name=Coated Red Copper Cable +tile.refueler.name=Refueling Station tile.reinforced_brick.name=Reinforced Stone tile.reinforced_brick_stairs.name=Reinforced Stone Stairs tile.reinforced_ducrete.name=Reinforced Ducrete @@ -6157,6 +6159,9 @@ tile.vitrified_barrel.name=Vitrified Nuclear Waste Drum tile.volcanic_lava_block.name=Volcanic Lava tile.volcano_core.name=Volcano Core tile.volcano_rad_core.name=Rad Volcano Core +tile.wand_air.name=Structure Wand Block (Air) +tile.wand_loot.name=Structure Wand Block (Lootable) +tile.wand_jigsaw.name=Structure Wand Block (Jigsaw) tile.waste_earth.name=Dead Grass tile.waste_leaves.name=Dead Leaves tile.waste_log.name=Charred Log diff --git a/src/main/resources/assets/hbm/models/blocks/refueler.obj b/src/main/resources/assets/hbm/models/blocks/refueler.obj new file mode 100644 index 000000000..25218d14e --- /dev/null +++ b/src/main/resources/assets/hbm/models/blocks/refueler.obj @@ -0,0 +1,1100 @@ +# Blender 4.0.1 +# www.blender.org +o Fluid +v -0.437500 0.120000 -0.095000 +v -0.437500 0.821132 -0.095000 +v -0.318750 0.120000 -0.063181 +v -0.318750 0.821132 -0.063181 +v -0.231819 0.120000 0.023750 +v -0.231819 0.821132 0.023750 +v -0.200000 0.120000 0.142500 +v -0.200000 0.821132 0.142500 +v -0.231819 0.120000 0.261250 +v -0.231819 0.821132 0.261250 +v -0.318750 0.120000 0.348181 +v -0.318750 0.821132 0.348181 +v -0.437500 0.120000 0.380000 +v -0.437500 0.821132 0.380000 +vn 0.2588 -0.0000 -0.9659 +vn 0.7071 -0.0000 -0.7071 +vn 0.9659 -0.0000 -0.2588 +vn 0.9659 -0.0000 0.2588 +vn 0.7071 -0.0000 0.7071 +vn 0.2588 -0.0000 0.9659 +vn -0.0000 -1.0000 -0.0000 +vn -0.0000 1.0000 -0.0000 +vt 0.553982 0.742726 +vt 0.546523 0.663764 +vt 0.553982 0.663764 +vt 0.546523 0.742726 +vt 0.539064 0.663764 +vt 0.539064 0.742726 +vt 0.531606 0.663764 +vt 0.531606 0.742726 +vt 0.524147 0.663764 +vt 0.524147 0.742726 +vt 0.516688 0.663764 +vt 0.516688 0.742726 +vt 0.509229 0.663764 +vt 0.509229 0.742726 +s 0 +f 2/1/1 3/2/1 1/3/1 +f 4/4/2 5/5/2 3/2/2 +f 6/6/3 7/7/3 5/5/3 +f 8/8/4 9/9/4 7/7/4 +f 10/10/5 11/11/5 9/9/5 +f 12/12/6 13/13/6 11/11/6 +f 3/2/7 7/7/7 11/11/7 +f 2/1/8 12/12/8 8/8/8 +f 2/1/1 4/4/1 3/2/1 +f 4/4/2 6/6/2 5/5/2 +f 6/6/3 8/8/3 7/7/3 +f 8/8/4 10/10/4 9/9/4 +f 10/10/5 12/12/5 11/11/5 +f 12/12/6 14/14/6 13/13/6 +f 13/13/7 1/3/7 3/2/7 +f 3/2/7 5/5/7 7/7/7 +f 7/7/7 9/9/7 11/11/7 +f 11/11/7 13/13/7 3/2/7 +f 6/6/8 4/4/8 2/1/8 +f 2/1/8 14/14/8 12/12/8 +f 12/12/8 10/10/8 8/8/8 +f 8/8/8 6/6/8 2/1/8 +o Fueler +v -0.437500 0.295000 -0.129375 +v -0.437500 0.495000 -0.129375 +v -0.437500 0.295000 -0.410625 +v -0.437500 0.495000 -0.410625 +v -0.312500 0.295000 -0.129375 +v -0.312500 0.495000 -0.129375 +v -0.312500 0.295000 -0.410625 +v -0.312500 0.495000 -0.410625 +v -0.413151 0.393750 -0.250217 +v -0.312500 0.393750 -0.250217 +v -0.413151 0.358241 -0.235509 +v -0.312500 0.358241 -0.235509 +v -0.413151 0.343533 -0.200000 +v -0.312500 0.343533 -0.200000 +v -0.413151 0.358241 -0.164491 +v -0.312500 0.358241 -0.164491 +v -0.413151 0.393750 -0.149783 +v -0.312500 0.393750 -0.149783 +v -0.413151 0.429259 -0.164491 +v -0.312500 0.429259 -0.164491 +v -0.413151 0.443967 -0.200000 +v -0.312500 0.443967 -0.200000 +v -0.413151 0.429259 -0.235509 +v -0.312500 0.429259 -0.235509 +v -0.413151 0.393750 -0.390217 +v -0.312500 0.393750 -0.390217 +v -0.413151 0.358241 -0.375509 +v -0.312500 0.358241 -0.375509 +v -0.413151 0.343533 -0.340000 +v -0.312500 0.343533 -0.340000 +v -0.413151 0.358241 -0.304491 +v -0.312500 0.358241 -0.304491 +v -0.413151 0.393750 -0.289783 +v -0.312500 0.393750 -0.289783 +v -0.413151 0.429259 -0.304491 +v -0.312500 0.429259 -0.304491 +v -0.413151 0.443967 -0.340000 +v -0.312500 0.443967 -0.340000 +v -0.413151 0.429259 -0.375509 +v -0.312500 0.429259 -0.375509 +v -0.500000 0.000000 0.500000 +v -0.500000 1.000000 0.500000 +v -0.500000 -0.000000 -0.500000 +v -0.500000 1.000000 -0.500000 +v -0.375000 0.062500 0.437500 +v -0.375000 0.937500 0.437500 +v -0.375000 0.062500 -0.437500 +v -0.375000 0.937500 -0.437500 +v -0.437500 0.937500 -0.437500 +v -0.437500 0.062500 -0.437500 +v -0.437500 0.062500 0.437500 +v -0.437500 0.937500 0.437500 +v -0.437500 0.100000 -0.100000 +v -0.437500 0.900000 -0.100000 +v -0.312500 0.100000 -0.066506 +v -0.312500 0.900000 -0.066506 +v -0.220994 0.100000 0.025000 +v -0.220994 0.900000 0.025000 +v -0.187500 0.100000 0.150000 +v -0.187500 0.900000 0.150000 +v -0.220994 0.100000 0.275000 +v -0.220994 0.900000 0.275000 +v -0.312500 0.100000 0.366506 +v -0.312500 0.900000 0.366506 +v -0.437500 0.100000 0.400000 +v -0.437500 0.900000 0.400000 +v -0.437500 0.100000 -0.100000 +v -0.437500 0.900000 -0.100000 +v -0.312500 0.100000 -0.066506 +v -0.312500 0.900000 -0.066506 +v -0.220994 0.100000 0.025000 +v -0.220994 0.900000 0.025000 +v -0.187500 0.100000 0.150000 +v -0.187500 0.900000 0.150000 +v -0.220994 0.100000 0.275000 +v -0.220994 0.900000 0.275000 +v -0.312500 0.100000 0.366506 +v -0.312500 0.900000 0.366506 +v -0.437500 0.100000 0.400000 +v -0.437500 0.900000 0.400000 +v -0.437500 0.695646 -0.233146 +v -0.437500 0.709375 -0.200000 +v -0.437500 0.695646 -0.166854 +v -0.437500 0.662500 -0.153125 +v -0.437500 0.629354 -0.166854 +v -0.437500 0.615625 -0.200000 +v -0.437500 0.629354 -0.233146 +v -0.437500 0.662500 -0.246875 +v -0.433174 0.695362 -0.233146 +v -0.431382 0.708974 -0.200000 +v -0.433174 0.695362 -0.166854 +v -0.437500 0.662500 -0.153125 +v -0.441826 0.629638 -0.166854 +v -0.443618 0.616026 -0.200000 +v -0.441826 0.629638 -0.233146 +v -0.437500 0.662500 -0.246875 +v -0.389677 0.682832 -0.233146 +v -0.382812 0.694722 -0.200000 +v -0.389677 0.682832 -0.166854 +v -0.406250 0.654127 -0.153125 +v -0.422823 0.625422 -0.166854 +v -0.429688 0.613532 -0.200000 +v -0.422823 0.625422 -0.233146 +v -0.406250 0.654127 -0.246875 +v -0.354668 0.647823 -0.233146 +v -0.342778 0.654688 -0.200000 +v -0.354668 0.647823 -0.166854 +v -0.383373 0.631250 -0.153125 +v -0.412078 0.614677 -0.166854 +v -0.423968 0.607813 -0.200000 +v -0.412078 0.614677 -0.233146 +v -0.383373 0.631250 -0.246875 +v -0.342138 0.604326 -0.233146 +v -0.328526 0.606118 -0.200000 +v -0.342138 0.604326 -0.166854 +v -0.375000 0.600000 -0.153125 +v -0.407862 0.595674 -0.166854 +v -0.421474 0.593882 -0.200000 +v -0.407862 0.595674 -0.233146 +v -0.375000 0.600000 -0.246875 +v -0.341854 0.475000 -0.233146 +v -0.328125 0.475000 -0.200000 +v -0.341854 0.475000 -0.166854 +v -0.375000 0.475000 -0.153125 +v -0.408146 0.475000 -0.166854 +v -0.421875 0.475000 -0.200000 +v -0.408146 0.475000 -0.233146 +v -0.375000 0.475000 -0.246875 +v -0.437500 0.695646 -0.306854 +v -0.437500 0.709375 -0.340000 +v -0.437500 0.695646 -0.373146 +v -0.437500 0.662500 -0.386875 +v -0.437500 0.629354 -0.373146 +v -0.437500 0.615625 -0.340000 +v -0.437500 0.629354 -0.306854 +v -0.437500 0.662500 -0.293125 +v -0.433174 0.695362 -0.306854 +v -0.431382 0.708974 -0.340000 +v -0.433174 0.695362 -0.373146 +v -0.437500 0.662500 -0.386875 +v -0.441826 0.629638 -0.373146 +v -0.443618 0.616026 -0.340000 +v -0.441826 0.629638 -0.306854 +v -0.437500 0.662500 -0.293125 +v -0.389677 0.682832 -0.306854 +v -0.382812 0.694722 -0.340000 +v -0.389677 0.682832 -0.373146 +v -0.406250 0.654127 -0.386875 +v -0.422823 0.625422 -0.373146 +v -0.429688 0.613532 -0.340000 +v -0.422823 0.625422 -0.306854 +v -0.406250 0.654127 -0.293125 +v -0.354668 0.647823 -0.306854 +v -0.342778 0.654688 -0.340000 +v -0.354668 0.647823 -0.373146 +v -0.383373 0.631250 -0.386875 +v -0.412078 0.614677 -0.373146 +v -0.423968 0.607813 -0.340000 +v -0.412078 0.614677 -0.306854 +v -0.383373 0.631250 -0.293125 +v -0.342138 0.604326 -0.306854 +v -0.328526 0.606118 -0.340000 +v -0.342138 0.604326 -0.373146 +v -0.375000 0.600000 -0.386875 +v -0.407862 0.595674 -0.373146 +v -0.421474 0.593882 -0.340000 +v -0.407862 0.595674 -0.306854 +v -0.375000 0.600000 -0.293125 +v -0.341854 0.475000 -0.306854 +v -0.328125 0.475000 -0.340000 +v -0.341854 0.475000 -0.373146 +v -0.375000 0.475000 -0.386875 +v -0.408146 0.475000 -0.373146 +v -0.421875 0.475000 -0.340000 +v -0.408146 0.475000 -0.306854 +v -0.375000 0.475000 -0.293125 +v -0.437500 0.092354 -0.233146 +v -0.437500 0.078625 -0.200000 +v -0.437500 0.092354 -0.166854 +v -0.437500 0.125500 -0.153125 +v -0.437500 0.158646 -0.166854 +v -0.437500 0.172375 -0.200000 +v -0.437500 0.158646 -0.233146 +v -0.437500 0.125500 -0.246875 +v -0.433174 0.092638 -0.233146 +v -0.431382 0.079026 -0.200000 +v -0.433174 0.092638 -0.166854 +v -0.437500 0.125500 -0.153125 +v -0.441826 0.158362 -0.166854 +v -0.443618 0.171974 -0.200000 +v -0.441826 0.158362 -0.233146 +v -0.437500 0.125500 -0.246875 +v -0.389677 0.105168 -0.233146 +v -0.382812 0.093278 -0.200000 +v -0.389677 0.105168 -0.166854 +v -0.406250 0.133873 -0.153125 +v -0.422823 0.162578 -0.166854 +v -0.429688 0.174468 -0.200000 +v -0.422823 0.162578 -0.233146 +v -0.406250 0.133873 -0.246875 +v -0.354668 0.140177 -0.233146 +v -0.342778 0.133313 -0.200000 +v -0.354668 0.140177 -0.166854 +v -0.383373 0.156750 -0.153125 +v -0.412078 0.173323 -0.166854 +v -0.423968 0.180188 -0.200000 +v -0.412078 0.173323 -0.233146 +v -0.383373 0.156750 -0.246875 +v -0.342138 0.183674 -0.233146 +v -0.328526 0.181882 -0.200000 +v -0.342138 0.183674 -0.166854 +v -0.375000 0.188000 -0.153125 +v -0.407862 0.192326 -0.166854 +v -0.421474 0.194118 -0.200000 +v -0.407862 0.192326 -0.233146 +v -0.375000 0.188000 -0.246875 +v -0.341854 0.313000 -0.233146 +v -0.328125 0.313000 -0.200000 +v -0.341854 0.313000 -0.166854 +v -0.375000 0.313000 -0.153125 +v -0.408146 0.313000 -0.166854 +v -0.421875 0.313000 -0.200000 +v -0.408146 0.313000 -0.233146 +v -0.375000 0.313000 -0.246875 +v -0.437500 0.092354 -0.306854 +v -0.437500 0.078625 -0.340000 +v -0.437500 0.092354 -0.373146 +v -0.437500 0.125500 -0.386875 +v -0.437500 0.158646 -0.373146 +v -0.437500 0.172375 -0.340000 +v -0.437500 0.158646 -0.306854 +v -0.437500 0.125500 -0.293125 +v -0.433174 0.092638 -0.306854 +v -0.431382 0.079026 -0.340000 +v -0.433174 0.092638 -0.373146 +v -0.437500 0.125500 -0.386875 +v -0.441826 0.158362 -0.373146 +v -0.443618 0.171974 -0.340000 +v -0.441826 0.158362 -0.306854 +v -0.437500 0.125500 -0.293125 +v -0.389677 0.105168 -0.306854 +v -0.382812 0.093278 -0.340000 +v -0.389677 0.105168 -0.373146 +v -0.406250 0.133873 -0.386875 +v -0.422823 0.162578 -0.373146 +v -0.429688 0.174468 -0.340000 +v -0.422823 0.162578 -0.306854 +v -0.406250 0.133873 -0.293125 +v -0.354668 0.140177 -0.306854 +v -0.342778 0.133313 -0.340000 +v -0.354668 0.140177 -0.373146 +v -0.383373 0.156750 -0.386875 +v -0.412078 0.173323 -0.373146 +v -0.423968 0.180188 -0.340000 +v -0.412078 0.173323 -0.306854 +v -0.383373 0.156750 -0.293125 +v -0.342138 0.183674 -0.306854 +v -0.328526 0.181882 -0.340000 +v -0.342138 0.183674 -0.373146 +v -0.375000 0.188000 -0.386875 +v -0.407862 0.192326 -0.373146 +v -0.421474 0.194118 -0.340000 +v -0.407862 0.192326 -0.306854 +v -0.375000 0.188000 -0.293125 +v -0.341854 0.313000 -0.306854 +v -0.328125 0.313000 -0.340000 +v -0.341854 0.313000 -0.373146 +v -0.375000 0.313000 -0.386875 +v -0.408146 0.313000 -0.373146 +v -0.421875 0.313000 -0.340000 +v -0.408146 0.313000 -0.306854 +v -0.375000 0.313000 -0.293125 +v -0.427500 0.925000 -0.145000 +v -0.427500 0.675000 -0.145000 +v -0.427500 0.925000 -0.395000 +v -0.427500 0.675000 -0.395000 +v -0.500000 0.312500 0.187500 +v -0.500000 0.687500 0.187500 +v -0.500000 0.312500 -0.187500 +v -0.500000 0.687500 -0.187500 +v -0.437500 0.312500 0.187500 +v -0.437500 0.687500 0.187500 +v -0.437500 0.312500 -0.187500 +v -0.437500 0.687500 -0.187500 +v -0.447500 0.750000 -0.250000 +v -0.447500 0.250000 -0.250000 +v -0.447500 0.750000 0.250000 +v -0.447500 0.250000 0.250000 +v -0.500000 0.250000 0.250000 +v -0.500000 0.750000 0.250000 +v -0.500000 0.250000 -0.250000 +v -0.500000 0.750000 -0.250000 +v -0.437500 0.250000 0.250000 +v -0.437500 0.750000 0.250000 +v -0.437500 0.250000 -0.250000 +v -0.437500 0.750000 -0.250000 +vn -0.0000 -0.0000 -1.0000 +vn -0.0000 -0.0000 1.0000 +vn -0.0000 -1.0000 -0.0000 +vn -0.0000 1.0000 -0.0000 +vn -0.0000 0.3827 0.9239 +vn -0.0000 0.9239 0.3827 +vn -0.0000 0.9239 -0.3827 +vn -0.0000 0.3827 -0.9239 +vn -0.0000 -0.3827 -0.9239 +vn -0.0000 -0.9239 -0.3827 +vn -0.0000 -0.9239 0.3827 +vn -0.0000 -0.3827 0.9239 +vn 1.0000 -0.0000 -0.0000 +vn -1.0000 -0.0000 -0.0000 +vn 0.4472 -0.0000 -0.8944 +vn 0.4472 -0.0000 0.8944 +vn 0.4472 -0.8944 -0.0000 +vn 0.4472 0.8944 -0.0000 +vn 0.2588 -0.0000 -0.9659 +vn 0.7071 -0.0000 -0.7071 +vn 0.9659 -0.0000 -0.2588 +vn 0.9659 -0.0000 0.2588 +vn 0.7071 -0.0000 0.7071 +vn 0.2588 -0.0000 0.9659 +vn -0.0001 1.0000 -0.0000 +vn -0.0000 1.0000 -0.0001 +vn 0.0604 0.9222 -0.3820 +vn 0.0605 0.9222 0.3820 +vn 0.0251 0.3825 0.9236 +vn 0.0251 0.3826 -0.9236 +vn 0.0251 0.3826 0.9236 +vn 0.0998 0.3724 -0.9227 +vn 0.2562 0.8892 -0.3790 +vn 0.2562 0.8892 0.3790 +vn 0.0998 0.3724 0.9227 +vn -0.0832 -0.3748 0.9234 +vn -0.1628 -0.9096 0.3823 +vn -0.1628 -0.9096 -0.3823 +vn -0.0832 -0.3748 -0.9234 +vn 0.2787 0.2787 -0.9191 +vn 0.6565 0.6565 -0.3715 +vn 0.6565 0.6565 0.3715 +vn 0.2787 0.2787 0.9191 +vn -0.2787 -0.2787 0.9191 +vn -0.6565 -0.6565 0.3715 +vn -0.6565 -0.6565 -0.3715 +vn -0.2787 -0.2787 -0.9191 +vn 0.3772 0.1086 -0.9198 +vn 0.8901 0.2612 -0.3734 +vn 0.8901 0.2612 0.3734 +vn 0.3772 0.1086 0.9197 +vn -0.3807 -0.1020 0.9191 +vn -0.9080 -0.2014 0.3674 +vn -0.9080 -0.2014 -0.3674 +vn -0.3807 -0.1020 -0.9191 +vn 0.3854 0.0008 -0.9228 +vn 0.9250 0.0028 -0.3800 +vn 0.9250 0.0028 0.3800 +vn 0.3854 0.0008 0.9228 +vn -0.3855 -0.0000 0.9227 +vn -0.9251 0.0022 0.3798 +vn -0.9251 0.0022 -0.3798 +vn -0.3855 -0.0000 -0.9227 +vn 0.0604 0.9222 0.3820 +vn 0.0605 0.9222 -0.3820 +vn 0.0001 1.0000 -0.0000 +vn -0.0001 1.0000 0.0001 +vn 0.1086 0.3772 0.9197 +vn 0.2612 0.8901 0.3734 +vn -0.2014 -0.9080 0.3674 +vn -0.1020 -0.3807 0.9191 +vn -0.6565 -0.6566 -0.3714 +vn 0.8892 0.2562 -0.3790 +vn 0.3724 0.0998 -0.9227 +vn -0.3748 -0.0832 -0.9234 +vn -0.9096 -0.1628 -0.3823 +vn 0.9239 0.0020 -0.3827 +vn 0.3827 -0.0000 -0.9239 +vn -0.3827 0.0009 -0.9239 +vn -0.9239 0.0031 -0.3827 +vn 0.0251 -0.3826 -0.9236 +vn 0.0604 -0.9222 -0.3820 +vn 0.0605 -0.9222 0.3820 +vn -0.0000 -1.0000 0.0001 +vn 0.0251 -0.3825 -0.9236 +vn 0.1086 -0.3772 -0.9197 +vn 0.2612 -0.8901 -0.3734 +vn 0.2562 -0.8892 0.3790 +vn 0.0998 -0.3724 0.9227 +vn -0.0832 0.3748 0.9234 +vn -0.1628 0.9096 0.3823 +vn -0.2014 0.9080 -0.3674 +vn -0.1020 0.3807 -0.9191 +vn 0.2787 -0.2787 -0.9191 +vn 0.6565 -0.6565 -0.3715 +vn 0.6565 -0.6565 0.3715 +vn 0.2787 -0.2787 0.9191 +vn -0.2787 0.2787 0.9191 +vn -0.6565 0.6565 0.3715 +vn -0.6565 0.6565 -0.3715 +vn -0.2787 0.2787 -0.9191 +vn 0.3772 -0.1086 -0.9198 +vn 0.8901 -0.2612 -0.3734 +vn 0.8892 -0.2562 0.3790 +vn 0.3724 -0.0998 0.9227 +vn -0.3748 0.0832 0.9234 +vn -0.9096 0.1628 0.3823 +vn -0.9080 0.2014 -0.3674 +vn -0.3807 0.1020 -0.9191 +vn 0.3854 -0.0008 -0.9228 +vn 0.9250 -0.0028 -0.3800 +vn 0.9239 -0.0020 0.3827 +vn 0.3827 -0.0000 0.9239 +vn -0.3827 -0.0009 0.9239 +vn -0.9239 -0.0031 0.3827 +vn -0.9251 -0.0022 -0.3798 +vn 0.0604 -0.9222 0.3820 +vn -0.0000 1.0000 0.0001 +vn 0.0003 1.0000 -0.0000 +vn 0.0605 -0.9222 -0.3820 +vn 0.2562 -0.8892 -0.3790 +vn 0.0998 -0.3724 -0.9227 +vn -0.0832 0.3748 -0.9234 +vn -0.1628 0.9096 -0.3823 +vn 0.3772 -0.1086 0.9197 +vn 0.8901 -0.2612 0.3734 +vn -0.9080 0.2014 0.3674 +vn -0.3807 0.1020 0.9191 +vn 0.3854 -0.0008 0.9228 +vn 0.9250 -0.0028 0.3800 +vn -0.9251 -0.0022 0.3798 +vn 0.0602 0.9222 -0.3820 +vn -0.9945 0.1050 0.0001 +vn -0.9945 0.1050 -0.0000 +vn 0.0001 1.0000 -0.0001 +vn 0.1086 0.3772 -0.9197 +vn 0.2612 0.8901 -0.3734 +vn -0.2014 -0.9080 -0.3674 +vn -0.1020 -0.3807 -0.9191 +vn -0.6565 -0.6566 0.3714 +vn 0.8892 0.2562 0.3790 +vn 0.3724 0.0998 0.9227 +vn -0.3748 -0.0832 0.9234 +vn -0.9096 -0.1628 0.3823 +vn 0.9239 0.0020 0.3827 +vn -0.3827 0.0009 0.9239 +vn -0.9239 0.0031 0.3827 +vn 0.0602 0.9222 0.3820 +vn 0.0251 0.3825 -0.9236 +vn 0.0003 1.0000 -0.0001 +vn 0.1086 0.3772 -0.9198 +vn 0.3772 0.1086 -0.9197 +vn 0.0602 -0.9222 -0.3820 +vn 0.0251 -0.3825 0.9236 +vn -0.9923 -0.1240 -0.0000 +vn -0.9923 -0.1240 0.0001 +vn 0.0251 -0.3826 0.9236 +vn 0.2612 -0.8901 0.3734 +vn 0.1086 -0.3772 0.9197 +vn -0.1020 0.3807 0.9191 +vn -0.2014 0.9080 0.3674 +vn 0.3724 -0.0998 -0.9227 +vn 0.8892 -0.2562 -0.3790 +vn -0.9096 0.1628 -0.3823 +vn -0.3748 0.0832 -0.9234 +vn 0.9239 -0.0020 -0.3827 +vn -0.9239 -0.0031 -0.3827 +vn -0.3827 -0.0009 -0.9239 +vn 0.0602 -0.9222 0.3820 +vn 0.1087 -0.3772 0.9197 +vn 0.1086 -0.3772 -0.9198 +vt 0.750000 0.531250 +vt 0.562500 0.593750 +vt 0.562500 0.531250 +vt 0.750000 0.593750 +vt 0.562500 0.656250 +vt 0.656250 0.531250 +vt 0.656250 0.656250 +vt 0.512204 0.569751 +vt 0.557287 0.558480 +vt 0.512204 0.558480 +vt 0.512204 0.581021 +vt 0.557287 0.569751 +vt 0.557287 0.581021 +vt 0.512204 0.592292 +vt 0.512204 0.603563 +vt 0.557287 0.592292 +vt 0.512204 0.614833 +vt 0.557287 0.603563 +vt 0.557287 0.614833 +vt 0.512204 0.626104 +vt 0.518170 0.606754 +vt 0.518170 0.575012 +vt 0.549912 0.575012 +vt 0.674236 0.594454 +vt 0.632365 0.572293 +vt 0.683416 0.572293 +vt 0.632365 0.616616 +vt 0.683416 0.616616 +vt 0.610203 0.625796 +vt 0.750000 0.656250 +vt 0.578862 0.594454 +vt 0.588042 0.616616 +vt 0.736919 0.594454 +vt 0.727739 0.572293 +vt 0.610203 0.563113 +vt 0.500000 1.000000 +vt 0.000000 0.500000 +vt 0.500000 0.500000 +vt 0.500000 -0.000000 +vt 0.031250 0.062500 +vt 0.000000 0.000000 +vt 0.468750 0.031250 +vt 0.468750 0.062500 +vt 0.437500 0.500000 +vt -0.000000 0.062500 +vt 0.437500 0.062500 +vt 0.937500 1.000000 +vt 0.875000 0.562500 +vt 0.937500 0.562500 +vt 0.875000 1.000000 +vt 0.812500 0.562500 +vt 0.812500 1.000000 +vt 0.750000 0.562500 +vt 0.579890 0.704562 +vt 0.659043 0.659099 +vt 0.738196 0.704562 +vt 0.749970 0.750025 +vt 0.704507 0.670872 +vt 0.613580 0.670872 +vt 0.568117 0.750025 +vt 0.812500 0.500000 +vt 0.750000 0.500000 +vt 0.875000 0.500000 +vt 1.000000 0.500000 +vt 0.937500 0.500000 +vt 1.000000 0.562500 +vt 0.343750 0.656250 +vt 0.156250 0.687500 +vt 0.156250 0.656250 +vt 0.343750 0.812500 +vt 0.156250 0.843750 +vt 0.156250 0.812500 +vt 0.187500 0.656250 +vt 0.312500 0.843750 +vt 0.312500 0.656250 +vt 0.500000 0.750000 +vt 0.750000 1.000000 +vt 0.500000 0.781250 +vt 0.750000 0.750000 +vt 0.750000 0.968750 +vt 0.500000 0.968750 +vt 0.531250 0.750000 +vt 0.718750 1.000000 +vt 0.718750 0.750000 +vt 0.557287 0.626104 +vt 0.556486 0.590883 +vt 0.549912 0.606754 +vt 0.534041 0.613328 +vt 0.511596 0.590883 +vt 0.534041 0.568438 +vt 0.641545 0.594454 +vt 0.705577 0.625796 +vt 0.588042 0.572293 +vt 0.727739 0.616616 +vt 0.705577 0.563113 +vt 0.000000 1.000000 +vt 0.031250 0.031250 +vt 1.000000 0.000000 +vt 0.343750 0.687500 +vt 0.343750 0.843750 +vt 0.187500 0.843750 +vt 0.750000 0.781250 +vt 0.531250 1.000000 +s 0 +f 18/15/9 21/16/9 17/17/9 +f 20/18/10 15/19/10 19/16/10 +f 21/20/11 15/19/11 17/17/11 +f 18/15/12 20/21/12 22/20/12 +f 25/22/13 24/23/13 23/24/13 +f 27/25/14 26/26/14 25/22/14 +f 29/25/15 28/27/15 27/25/15 +f 31/28/16 30/27/16 29/25/16 +f 33/29/17 32/30/17 31/28/17 +f 35/31/18 34/32/18 33/29/18 +f 37/31/19 36/33/19 35/31/19 +f 23/34/20 38/33/20 37/31/20 +f 33/35/21 29/36/21 25/37/21 +f 41/22/13 40/23/13 39/24/13 +f 43/25/14 42/26/14 41/22/14 +f 45/25/15 44/27/15 43/25/15 +f 47/28/16 46/27/16 45/25/16 +f 49/29/17 48/30/17 47/28/17 +f 51/31/18 50/32/18 49/29/18 +f 53/31/19 52/33/19 51/31/19 +f 39/34/20 54/33/20 53/31/20 +f 49/35/21 45/36/21 41/37/21 +f 24/38/21 50/39/21 38/40/21 +f 46/41/21 24/38/21 26/42/21 +f 44/43/21 26/42/21 19/44/21 +f 40/45/21 42/46/21 21/19/21 +f 32/47/21 34/48/21 20/15/21 +f 20/15/21 38/40/21 52/49/21 +f 56/50/22 57/51/22 55/52/22 +f 58/53/23 61/54/23 57/55/23 +f 60/54/11 63/56/11 62/57/11 +f 60/54/24 55/53/24 59/57/24 +f 61/57/25 55/55/25 57/53/25 +f 58/55/26 60/57/26 62/54/26 +f 63/58/21 65/59/21 64/60/21 +f 62/54/10 64/56/10 61/57/10 +f 59/54/9 66/56/9 60/57/9 +f 61/54/12 65/56/12 59/57/12 +f 68/61/27 69/62/27 67/63/27 +f 70/64/28 71/65/28 69/62/28 +f 72/66/29 73/67/29 71/65/29 +f 74/61/30 75/62/30 73/63/30 +f 76/64/31 77/65/31 75/62/31 +f 78/66/32 79/67/32 77/65/32 +f 69/68/11 73/69/11 77/70/11 +f 68/71/12 78/68/12 74/69/12 +f 93/71/12 89/72/12 85/73/12 +f 86/72/11 90/73/11 94/74/11 +f 95/67/33 110/75/9 102/76/34 +f 104/65/35 95/76/35 96/67/35 +f 105/65/36 96/76/36 97/67/36 +f 98/67/37 105/75/37 97/76/37 +f 107/65/38 98/76/38 99/67/38 +f 108/65/35 99/76/35 100/67/35 +f 102/67/39 109/75/39 101/76/39 +f 103/65/40 118/77/40 110/75/40 +f 104/65/41 111/77/41 103/75/41 +f 113/62/42 104/75/42 105/65/42 +f 114/62/43 105/75/43 106/65/43 +f 115/62/44 106/75/44 107/65/44 +f 116/62/45 107/75/45 108/65/45 +f 109/65/46 116/77/46 108/75/46 +f 110/65/47 117/77/47 109/75/47 +f 111/63/48 126/78/48 118/79/48 +f 120/80/49 111/79/49 112/63/49 +f 121/80/50 112/79/50 113/63/50 +f 122/80/51 113/79/51 114/63/51 +f 123/80/52 114/79/52 115/63/52 +f 116/63/53 123/78/53 115/79/53 +f 125/80/54 116/79/54 117/63/54 +f 126/80/55 117/79/55 118/63/55 +f 127/63/56 126/77/56 119/62/56 +f 128/63/57 119/77/57 120/62/57 +f 121/62/58 128/79/58 120/77/58 +f 122/62/59 129/79/59 121/77/59 +f 123/62/60 130/79/60 122/77/60 +f 124/62/61 131/79/61 123/77/61 +f 133/63/62 124/77/62 125/62/62 +f 134/63/63 125/77/63 126/62/63 +f 135/62/64 134/76/64 127/67/64 +f 136/62/65 127/76/65 128/67/65 +f 129/67/66 136/77/66 128/76/66 +f 130/67/67 137/77/67 129/76/67 +f 131/67/68 138/77/68 130/76/68 +f 132/67/69 139/77/69 131/76/69 +f 141/62/70 132/76/70 133/67/70 +f 142/62/71 133/76/71 134/67/71 +f 100/76/72 109/65/72 108/75/72 +f 143/67/39 158/75/39 151/65/39 +f 143/76/72 152/65/72 144/67/72 +f 144/76/73 153/65/73 145/67/73 +f 146/67/34 153/75/12 154/65/9 +f 147/67/39 154/75/39 155/65/39 +f 147/76/72 156/65/72 148/67/72 +f 150/67/74 157/75/75 158/65/10 +f 151/65/76 166/77/76 159/62/76 +f 152/65/77 159/77/77 160/62/77 +f 152/75/41 161/62/41 153/65/41 +f 153/75/40 162/62/40 154/65/40 +f 154/75/47 163/62/47 155/65/47 +f 155/75/46 164/62/46 156/65/46 +f 157/65/78 164/77/78 165/62/78 +f 158/65/79 165/77/79 166/62/79 +f 159/63/51 174/78/51 167/80/51 +f 159/79/50 168/80/50 160/63/50 +f 160/79/49 169/80/49 161/63/49 +f 161/79/48 170/80/48 162/63/48 +f 162/79/55 171/80/55 163/63/55 +f 164/63/80 171/78/80 172/80/80 +f 164/79/53 173/80/53 165/63/53 +f 165/79/52 174/80/52 166/63/52 +f 174/77/59 175/63/59 167/62/59 +f 167/77/58 176/63/58 168/62/58 +f 169/62/81 176/79/81 177/63/81 +f 170/62/82 177/79/82 178/63/82 +f 171/62/83 178/79/83 179/63/83 +f 172/62/84 179/79/84 180/63/84 +f 172/77/61 181/63/61 173/62/61 +f 173/77/60 182/63/60 174/62/60 +f 182/76/67 183/62/67 175/67/67 +f 175/76/66 184/62/66 176/67/66 +f 177/67/85 184/77/85 185/62/85 +f 178/67/86 185/77/86 186/62/86 +f 179/67/87 186/77/87 187/62/87 +f 180/67/88 187/77/88 188/62/88 +f 180/76/69 189/62/69 181/67/69 +f 181/76/68 190/62/68 182/67/68 +f 157/65/35 148/76/35 156/75/35 +f 191/67/89 206/75/89 199/65/89 +f 191/76/90 200/65/90 192/67/90 +f 192/76/91 201/65/91 193/67/91 +f 194/67/11 201/75/92 202/65/10 +f 194/76/93 203/65/93 195/67/93 +f 196/67/90 203/75/90 204/65/90 +f 198/67/34 205/75/12 206/65/9 +f 199/65/94 214/77/94 207/62/94 +f 200/65/95 207/77/95 208/62/95 +f 200/75/96 209/62/96 201/65/96 +f 201/75/97 210/62/97 202/65/97 +f 202/75/98 211/62/98 203/65/98 +f 203/75/99 212/62/99 204/65/99 +f 205/65/100 212/77/100 213/62/100 +f 206/65/101 213/77/101 214/62/101 +f 214/79/102 215/80/102 207/63/102 +f 207/79/103 216/80/103 208/63/103 +f 208/79/104 217/80/104 209/63/104 +f 210/63/105 217/78/105 218/80/105 +f 211/63/106 218/78/106 219/80/106 +f 211/79/107 220/80/107 212/63/107 +f 213/63/108 220/78/108 221/80/108 +f 213/79/109 222/80/109 214/63/109 +f 222/77/110 223/63/110 215/62/110 +f 215/77/111 224/63/111 216/62/111 +f 217/62/112 224/79/112 225/63/112 +f 218/62/113 225/79/113 226/63/113 +f 219/62/114 226/79/114 227/63/114 +f 220/62/115 227/79/115 228/63/115 +f 220/77/116 229/63/116 221/62/116 +f 221/77/117 230/63/117 222/62/117 +f 230/76/118 231/62/118 223/67/118 +f 223/76/119 232/62/119 224/67/119 +f 225/67/120 232/77/120 233/62/120 +f 226/67/121 233/77/121 234/62/121 +f 227/67/122 234/77/122 235/62/122 +f 228/67/123 235/77/123 236/62/123 +f 228/76/124 237/62/124 229/67/124 +f 229/76/71 238/62/71 230/67/71 +f 205/65/125 196/76/125 204/75/125 +f 239/67/126 254/75/10 246/76/127 +f 248/65/91 239/76/91 240/67/91 +f 249/65/128 240/76/128 241/67/128 +f 242/67/93 249/75/93 241/76/93 +f 243/67/127 250/75/9 242/76/34 +f 252/65/125 243/76/125 244/67/125 +f 246/67/89 253/75/89 245/76/89 +f 247/65/97 262/77/97 254/75/97 +f 248/65/96 255/77/96 247/75/96 +f 257/62/129 248/75/129 249/65/129 +f 258/62/130 249/75/130 250/65/130 +f 259/62/131 250/75/131 251/65/131 +f 260/62/132 251/75/132 252/65/132 +f 253/65/99 260/77/99 252/75/99 +f 254/65/98 261/77/98 253/75/98 +f 263/80/105 262/79/105 255/63/105 +f 256/63/104 263/78/104 255/79/104 +f 265/80/103 256/79/103 257/63/103 +f 266/80/102 257/79/102 258/63/102 +f 259/63/109 266/78/109 258/79/109 +f 268/80/108 259/79/108 260/63/108 +f 261/63/107 268/78/107 260/79/107 +f 270/80/106 261/79/106 262/63/106 +f 271/63/133 270/77/133 263/62/133 +f 272/63/134 263/77/134 264/62/134 +f 265/62/111 272/79/111 264/77/111 +f 266/62/110 273/79/110 265/77/110 +f 267/62/117 274/79/117 266/77/117 +f 268/62/116 275/79/116 267/77/116 +f 277/63/135 268/77/135 269/62/135 +f 278/63/136 269/77/136 270/62/136 +f 279/62/137 278/76/137 271/67/137 +f 280/62/138 271/76/138 272/67/138 +f 273/67/119 280/77/119 272/76/119 +f 274/67/118 281/77/118 273/76/118 +f 275/67/71 282/77/71 274/76/71 +f 276/67/124 283/77/124 275/76/124 +f 285/62/139 276/76/139 277/67/139 +f 286/62/68 277/76/68 278/67/68 +f 244/76/90 253/65/90 252/75/90 +f 288/53/21 289/78/21 287/52/21 +f 294/81/9 297/82/9 293/83/9 +f 296/84/10 291/85/10 295/86/10 +f 297/87/11 291/85/11 293/83/11 +f 294/81/12 296/88/12 298/89/12 +f 299/90/22 302/91/22 301/50/22 +f 309/92/10 306/93/10 305/90/10 +f 303/50/9 308/94/9 307/95/9 +f 303/50/12 309/96/12 305/90/12 +f 308/97/11 306/93/11 310/98/11 +f 18/15/9 22/18/9 21/16/9 +f 20/18/10 16/44/10 15/19/10 +f 21/20/11 19/21/11 15/19/11 +f 18/15/12 16/44/12 20/21/12 +f 25/22/13 26/26/13 24/23/13 +f 27/25/14 28/27/14 26/26/14 +f 29/25/15 30/27/15 28/27/15 +f 31/28/16 32/30/16 30/27/16 +f 33/29/17 34/32/17 32/30/17 +f 35/31/18 36/33/18 34/32/18 +f 37/31/19 38/33/19 36/33/19 +f 23/34/20 24/99/20 38/33/20 +f 25/37/21 23/100/21 37/101/21 +f 37/101/21 35/102/21 33/35/21 +f 33/35/21 31/103/21 29/36/21 +f 29/36/21 27/104/21 25/37/21 +f 25/37/21 37/101/21 33/35/21 +f 41/22/13 42/26/13 40/23/13 +f 43/25/14 44/27/14 42/26/14 +f 45/25/15 46/27/15 44/27/15 +f 47/28/16 48/30/16 46/27/16 +f 49/29/17 50/32/17 48/30/17 +f 51/31/18 52/33/18 50/32/18 +f 53/31/19 54/33/19 52/33/19 +f 39/34/20 40/99/20 54/33/20 +f 41/37/21 39/100/21 53/101/21 +f 53/101/21 51/102/21 49/35/21 +f 49/35/21 47/103/21 45/36/21 +f 45/36/21 43/104/21 41/37/21 +f 41/37/21 53/101/21 49/35/21 +f 24/38/21 48/105/21 50/39/21 +f 46/41/21 48/105/21 24/38/21 +f 19/44/21 21/19/21 44/43/21 +f 44/43/21 46/41/21 26/42/21 +f 26/42/21 28/106/21 19/44/21 +f 22/17/21 52/49/21 54/107/21 +f 22/17/21 54/107/21 40/45/21 +f 42/46/21 44/43/21 21/19/21 +f 21/19/21 22/17/21 40/45/21 +f 19/44/21 28/106/21 30/108/21 +f 19/44/21 30/108/21 32/47/21 +f 34/48/21 36/109/21 20/15/21 +f 20/15/21 19/44/21 32/47/21 +f 52/49/21 22/17/21 20/15/21 +f 20/15/21 36/109/21 38/40/21 +f 38/40/21 50/39/21 52/49/21 +f 56/50/22 58/110/22 57/51/22 +f 58/53/23 62/57/23 61/54/23 +f 60/54/11 66/111/11 63/56/11 +f 60/54/24 56/55/24 55/53/24 +f 61/57/25 59/54/25 55/55/25 +f 58/55/26 56/53/26 60/57/26 +f 63/58/21 66/51/21 65/59/21 +f 62/54/10 63/111/10 64/56/10 +f 59/54/9 65/111/9 66/56/9 +f 61/54/12 64/111/12 65/56/12 +f 68/61/27 70/64/27 69/62/27 +f 70/64/28 72/66/28 71/65/28 +f 72/66/29 74/91/29 73/67/29 +f 74/61/30 76/64/30 75/62/30 +f 76/64/31 78/66/31 77/65/31 +f 78/66/32 80/91/32 79/67/32 +f 79/71/11 67/74/11 69/68/11 +f 69/68/11 71/73/11 73/69/11 +f 73/69/11 75/72/11 77/70/11 +f 77/70/11 79/71/11 69/68/11 +f 72/72/12 70/70/12 68/71/12 +f 68/71/12 80/74/12 78/68/12 +f 78/68/12 76/73/12 74/69/12 +f 74/69/12 72/72/12 68/71/12 +f 83/68/12 81/74/12 93/71/12 +f 93/71/12 91/70/12 89/72/12 +f 89/72/12 87/69/12 85/73/12 +f 85/73/12 83/68/12 93/71/12 +f 82/71/11 84/70/11 86/72/11 +f 86/72/11 88/69/11 90/73/11 +f 90/73/11 92/68/11 94/74/11 +f 94/74/11 82/71/11 86/72/11 +f 95/67/38 103/65/38 110/75/38 +f 104/65/140 103/75/140 95/76/140 +f 105/65/72 104/75/72 96/76/72 +f 98/67/10 106/65/12 105/75/126 +f 107/65/141 106/75/10 98/76/142 +f 108/65/140 107/75/140 99/76/140 +f 102/67/9 110/65/143 109/75/33 +f 103/65/144 111/62/144 118/77/144 +f 104/65/145 112/62/145 111/77/145 +f 113/62/77 112/77/77 104/75/77 +f 114/62/76 113/77/76 105/75/76 +f 115/62/79 114/77/79 106/75/79 +f 116/62/78 115/77/78 107/75/78 +f 109/65/146 117/62/146 116/77/146 +f 110/65/147 118/62/147 117/77/147 +f 111/63/48 119/80/48 126/78/48 +f 120/80/49 119/78/49 111/79/49 +f 121/80/50 120/78/50 112/79/50 +f 122/80/51 121/78/51 113/79/51 +f 123/80/52 122/78/52 114/79/52 +f 116/63/148 124/80/148 123/78/148 +f 125/80/80 124/78/80 116/79/80 +f 126/80/55 125/78/55 117/79/55 +f 127/63/82 134/79/82 126/77/82 +f 128/63/81 127/79/81 119/77/81 +f 121/62/149 129/63/149 128/79/149 +f 122/62/150 130/63/150 129/79/150 +f 123/62/151 131/63/151 130/79/151 +f 124/62/152 132/63/152 131/79/152 +f 133/63/84 132/79/84 124/77/84 +f 134/63/83 133/79/83 125/77/83 +f 135/62/86 142/77/86 134/76/86 +f 136/62/85 135/77/85 127/76/85 +f 129/67/153 137/62/153 136/77/153 +f 130/67/121 138/62/121 137/77/121 +f 131/67/154 139/62/154 138/77/154 +f 132/67/155 140/62/155 139/77/155 +f 141/62/88 140/77/88 132/76/88 +f 142/62/87 141/77/87 133/76/87 +f 100/76/156 101/67/156 109/65/156 +f 143/67/75 150/76/10 158/75/12 +f 143/76/36 151/75/36 152/65/36 +f 144/76/35 152/75/35 153/65/35 +f 146/67/157 145/76/157 153/75/157 +f 147/67/12 146/76/9 154/75/158 +f 147/76/156 155/75/156 156/65/156 +f 150/67/38 149/76/38 157/75/38 +f 151/65/43 158/75/43 166/77/43 +f 152/65/42 151/75/42 159/77/42 +f 152/75/145 160/77/145 161/62/145 +f 153/75/159 161/77/159 162/62/159 +f 154/75/147 162/77/147 163/62/147 +f 155/75/146 163/77/146 164/62/146 +f 157/65/45 156/75/45 164/77/45 +f 158/65/44 157/75/44 165/77/44 +f 159/63/51 166/79/51 174/78/51 +f 159/79/50 167/78/50 168/80/50 +f 160/79/49 168/78/49 169/80/49 +f 161/79/48 169/78/48 170/80/48 +f 162/79/55 170/78/55 171/80/55 +f 164/63/54 163/79/54 171/78/54 +f 164/79/148 172/78/148 173/80/148 +f 165/79/52 173/78/52 174/80/52 +f 174/77/150 182/79/150 175/63/150 +f 167/77/149 175/79/149 176/63/149 +f 169/62/57 168/77/57 176/79/57 +f 170/62/160 169/77/160 177/79/160 +f 171/62/63 170/77/63 178/79/63 +f 172/62/62 171/77/62 179/79/62 +f 172/77/152 180/79/152 181/63/152 +f 173/77/151 181/79/151 182/63/151 +f 182/76/121 190/77/121 183/62/121 +f 175/76/153 183/77/153 184/62/153 +f 177/67/65 176/76/65 184/77/65 +f 178/67/64 177/76/64 185/77/64 +f 179/67/71 178/76/71 186/77/71 +f 180/67/70 179/76/70 187/77/70 +f 180/76/155 188/77/155 189/62/155 +f 181/76/154 189/77/154 190/62/154 +f 157/65/73 149/67/73 148/76/73 +f 191/67/12 198/76/9 206/75/158 +f 191/76/161 199/75/161 200/65/161 +f 192/76/125 200/75/125 201/65/125 +f 194/67/162 193/76/162 201/75/162 +f 194/76/10 202/75/163 203/65/164 +f 196/67/128 195/76/128 203/75/128 +f 198/67/165 197/76/165 205/75/165 +f 199/65/130 206/75/130 214/77/130 +f 200/65/129 199/75/129 207/77/129 +f 200/75/166 208/77/166 209/62/166 +f 201/75/167 209/77/167 210/62/167 +f 202/75/168 210/77/168 211/62/168 +f 203/75/169 211/77/169 212/62/169 +f 205/65/132 204/75/132 212/77/132 +f 206/65/131 205/75/131 213/77/131 +f 214/79/102 222/78/102 215/80/102 +f 207/79/103 215/78/103 216/80/103 +f 208/79/104 216/78/104 217/80/104 +f 210/63/105 209/79/105 217/78/105 +f 211/63/106 210/79/106 218/78/106 +f 211/79/107 219/78/107 220/80/107 +f 213/63/108 212/79/108 220/78/108 +f 213/79/109 221/78/109 222/80/109 +f 222/77/170 230/79/170 223/63/170 +f 215/77/171 223/79/171 224/63/171 +f 217/62/134 216/77/134 224/79/134 +f 218/62/133 217/77/133 225/79/133 +f 219/62/136 218/77/136 226/79/136 +f 220/62/135 219/77/135 227/79/135 +f 220/77/172 228/79/172 229/63/172 +f 221/77/173 229/79/173 230/63/173 +f 230/76/86 238/77/86 231/62/86 +f 223/76/174 231/77/174 232/62/174 +f 225/67/138 224/76/138 232/77/138 +f 226/67/137 225/76/137 233/77/137 +f 227/67/68 226/76/68 234/77/68 +f 228/67/139 227/76/139 235/77/139 +f 228/76/175 236/77/175 237/62/175 +f 229/76/176 237/77/176 238/62/176 +f 205/65/91 197/67/91 196/76/91 +f 239/67/165 247/65/165 254/75/165 +f 248/65/177 247/75/177 239/76/177 +f 249/65/90 248/75/90 240/76/90 +f 242/67/9 250/65/34 249/75/74 +f 243/67/162 251/65/162 250/75/162 +f 252/65/177 251/75/177 243/76/177 +f 246/67/10 254/65/12 253/75/126 +f 247/65/178 255/62/178 262/77/178 +f 248/65/166 256/62/166 255/77/166 +f 257/62/95 256/77/95 248/75/95 +f 258/62/179 257/77/179 249/75/179 +f 259/62/101 258/77/101 250/75/101 +f 260/62/100 259/77/100 251/75/100 +f 253/65/169 261/62/169 260/77/169 +f 254/65/168 262/62/168 261/77/168 +f 263/80/105 270/78/105 262/79/105 +f 256/63/104 264/80/104 263/78/104 +f 265/80/103 264/78/103 256/79/103 +f 266/80/102 265/78/102 257/79/102 +f 259/63/109 267/80/109 266/78/109 +f 268/80/108 267/78/108 259/79/108 +f 261/63/107 269/80/107 268/78/107 +f 270/80/106 269/78/106 261/79/106 +f 271/63/113 278/79/113 270/77/113 +f 272/63/112 271/79/112 263/77/112 +f 265/62/171 273/63/171 272/79/171 +f 266/62/170 274/63/170 273/79/170 +f 267/62/173 275/63/173 274/79/173 +f 268/62/172 276/63/172 275/79/172 +f 277/63/115 276/79/115 268/77/115 +f 278/63/114 277/79/114 269/77/114 +f 279/62/121 286/77/121 278/76/121 +f 280/62/120 279/77/120 271/76/120 +f 273/67/174 281/62/174 280/77/174 +f 274/67/86 282/62/86 281/77/86 +f 275/67/176 283/62/176 282/77/176 +f 276/67/175 284/62/175 283/77/175 +f 285/62/123 284/77/123 276/76/123 +f 286/62/122 285/77/122 277/76/122 +f 244/76/128 245/67/128 253/65/128 +f 288/53/21 290/112/21 289/78/21 +f 294/81/9 298/113/9 297/82/9 +f 296/84/10 292/114/10 291/85/10 +f 297/87/11 295/115/11 291/85/11 +f 294/81/12 292/114/12 296/88/12 +f 299/90/22 300/93/22 302/91/22 +f 309/92/10 310/116/10 306/93/10 +f 303/50/9 304/91/9 308/94/9 +f 303/50/12 307/117/12 309/96/12 +f 308/97/11 304/91/11 306/93/11 diff --git a/src/main/resources/assets/hbm/structures/crashed-vertibird.nbt b/src/main/resources/assets/hbm/structures/crashed-vertibird.nbt new file mode 100644 index 000000000..93e22b9fb Binary files /dev/null and b/src/main/resources/assets/hbm/structures/crashed-vertibird.nbt differ diff --git a/src/main/resources/assets/hbm/structures/meteor/loot3x3/meteor-3-bale.nbt b/src/main/resources/assets/hbm/structures/meteor/loot3x3/meteor-3-bale.nbt new file mode 100644 index 000000000..b8f9aee0d Binary files /dev/null and b/src/main/resources/assets/hbm/structures/meteor/loot3x3/meteor-3-bale.nbt differ diff --git a/src/main/resources/assets/hbm/structures/meteor/loot3x3/meteor-3-blank.nbt b/src/main/resources/assets/hbm/structures/meteor/loot3x3/meteor-3-blank.nbt new file mode 100644 index 000000000..67e460c1e Binary files /dev/null and b/src/main/resources/assets/hbm/structures/meteor/loot3x3/meteor-3-blank.nbt differ diff --git a/src/main/resources/assets/hbm/structures/meteor/loot3x3/meteor-3-block.nbt b/src/main/resources/assets/hbm/structures/meteor/loot3x3/meteor-3-block.nbt new file mode 100644 index 000000000..53fd15326 Binary files /dev/null and b/src/main/resources/assets/hbm/structures/meteor/loot3x3/meteor-3-block.nbt differ diff --git a/src/main/resources/assets/hbm/structures/meteor/loot3x3/meteor-3-book.nbt b/src/main/resources/assets/hbm/structures/meteor/loot3x3/meteor-3-book.nbt new file mode 100644 index 000000000..73dd17a40 Binary files /dev/null and b/src/main/resources/assets/hbm/structures/meteor/loot3x3/meteor-3-book.nbt differ diff --git a/src/main/resources/assets/hbm/structures/meteor/loot3x3/meteor-3-crab-tesla.nbt b/src/main/resources/assets/hbm/structures/meteor/loot3x3/meteor-3-crab-tesla.nbt new file mode 100644 index 000000000..f707d794e Binary files /dev/null and b/src/main/resources/assets/hbm/structures/meteor/loot3x3/meteor-3-crab-tesla.nbt differ diff --git a/src/main/resources/assets/hbm/structures/meteor/loot3x3/meteor-3-crab.nbt b/src/main/resources/assets/hbm/structures/meteor/loot3x3/meteor-3-crab.nbt new file mode 100644 index 000000000..7891ce8b0 Binary files /dev/null and b/src/main/resources/assets/hbm/structures/meteor/loot3x3/meteor-3-crab.nbt differ diff --git a/src/main/resources/assets/hbm/structures/meteor/loot3x3/meteor-3-crate.nbt b/src/main/resources/assets/hbm/structures/meteor/loot3x3/meteor-3-crate.nbt new file mode 100644 index 000000000..22c5c2e30 Binary files /dev/null and b/src/main/resources/assets/hbm/structures/meteor/loot3x3/meteor-3-crate.nbt differ diff --git a/src/main/resources/assets/hbm/structures/meteor/loot3x3/meteor-3-dirt.nbt b/src/main/resources/assets/hbm/structures/meteor/loot3x3/meteor-3-dirt.nbt new file mode 100644 index 000000000..3afc135c2 Binary files /dev/null and b/src/main/resources/assets/hbm/structures/meteor/loot3x3/meteor-3-dirt.nbt differ diff --git a/src/main/resources/assets/hbm/structures/meteor/loot3x3/meteor-3-glow.nbt b/src/main/resources/assets/hbm/structures/meteor/loot3x3/meteor-3-glow.nbt new file mode 100644 index 000000000..b496b06d9 Binary files /dev/null and b/src/main/resources/assets/hbm/structures/meteor/loot3x3/meteor-3-glow.nbt differ diff --git a/src/main/resources/assets/hbm/structures/meteor/loot3x3/meteor-3-lead.nbt b/src/main/resources/assets/hbm/structures/meteor/loot3x3/meteor-3-lead.nbt new file mode 100644 index 000000000..8ea4a132b Binary files /dev/null and b/src/main/resources/assets/hbm/structures/meteor/loot3x3/meteor-3-lead.nbt differ diff --git a/src/main/resources/assets/hbm/structures/meteor/loot3x3/meteor-3-mku.nbt b/src/main/resources/assets/hbm/structures/meteor/loot3x3/meteor-3-mku.nbt new file mode 100644 index 000000000..bbd46c68e Binary files /dev/null and b/src/main/resources/assets/hbm/structures/meteor/loot3x3/meteor-3-mku.nbt differ diff --git a/src/main/resources/assets/hbm/structures/meteor/loot3x3/meteor-3-ooze.nbt b/src/main/resources/assets/hbm/structures/meteor/loot3x3/meteor-3-ooze.nbt new file mode 100644 index 000000000..27df02e1a Binary files /dev/null and b/src/main/resources/assets/hbm/structures/meteor/loot3x3/meteor-3-ooze.nbt differ diff --git a/src/main/resources/assets/hbm/structures/meteor/loot3x3/meteor-3-pillar.nbt b/src/main/resources/assets/hbm/structures/meteor/loot3x3/meteor-3-pillar.nbt new file mode 100644 index 000000000..6b13b58f8 Binary files /dev/null and b/src/main/resources/assets/hbm/structures/meteor/loot3x3/meteor-3-pillar.nbt differ diff --git a/src/main/resources/assets/hbm/structures/meteor/loot3x3/meteor-3-star.nbt b/src/main/resources/assets/hbm/structures/meteor/loot3x3/meteor-3-star.nbt new file mode 100644 index 000000000..336639b2c Binary files /dev/null and b/src/main/resources/assets/hbm/structures/meteor/loot3x3/meteor-3-star.nbt differ diff --git a/src/main/resources/assets/hbm/structures/meteor/loot3x3/meteor-3-statue.nbt b/src/main/resources/assets/hbm/structures/meteor/loot3x3/meteor-3-statue.nbt new file mode 100644 index 000000000..26b8e7fe3 Binary files /dev/null and b/src/main/resources/assets/hbm/structures/meteor/loot3x3/meteor-3-statue.nbt differ diff --git a/src/main/resources/assets/hbm/structures/meteor/loot3x3/meteor-3-tesla.nbt b/src/main/resources/assets/hbm/structures/meteor/loot3x3/meteor-3-tesla.nbt new file mode 100644 index 000000000..b5e1c69a2 Binary files /dev/null and b/src/main/resources/assets/hbm/structures/meteor/loot3x3/meteor-3-tesla.nbt differ diff --git a/src/main/resources/assets/hbm/structures/meteor/meteor-core.nbt b/src/main/resources/assets/hbm/structures/meteor/meteor-core.nbt new file mode 100644 index 000000000..9b5444901 Binary files /dev/null and b/src/main/resources/assets/hbm/structures/meteor/meteor-core.nbt differ diff --git a/src/main/resources/assets/hbm/structures/meteor/meteor-corner.nbt b/src/main/resources/assets/hbm/structures/meteor/meteor-corner.nbt new file mode 100644 index 000000000..673b92235 Binary files /dev/null and b/src/main/resources/assets/hbm/structures/meteor/meteor-corner.nbt differ diff --git a/src/main/resources/assets/hbm/structures/meteor/meteor-fallback.nbt b/src/main/resources/assets/hbm/structures/meteor/meteor-fallback.nbt new file mode 100644 index 000000000..fa3e955c7 Binary files /dev/null and b/src/main/resources/assets/hbm/structures/meteor/meteor-fallback.nbt differ diff --git a/src/main/resources/assets/hbm/structures/meteor/meteor-spike.nbt b/src/main/resources/assets/hbm/structures/meteor/meteor-spike.nbt new file mode 100644 index 000000000..a28c2c309 Binary files /dev/null and b/src/main/resources/assets/hbm/structures/meteor/meteor-spike.nbt differ diff --git a/src/main/resources/assets/hbm/structures/meteor/meteor-stairs.nbt b/src/main/resources/assets/hbm/structures/meteor/meteor-stairs.nbt new file mode 100644 index 000000000..fb4e8b865 Binary files /dev/null and b/src/main/resources/assets/hbm/structures/meteor/meteor-stairs.nbt differ diff --git a/src/main/resources/assets/hbm/structures/meteor/meteor-t.nbt b/src/main/resources/assets/hbm/structures/meteor/meteor-t.nbt new file mode 100644 index 000000000..418d2c747 Binary files /dev/null and b/src/main/resources/assets/hbm/structures/meteor/meteor-t.nbt differ diff --git a/src/main/resources/assets/hbm/structures/meteor/room10/headloot/loot-chest.nbt b/src/main/resources/assets/hbm/structures/meteor/room10/headloot/loot-chest.nbt new file mode 100644 index 000000000..b24269fca Binary files /dev/null and b/src/main/resources/assets/hbm/structures/meteor/room10/headloot/loot-chest.nbt differ diff --git a/src/main/resources/assets/hbm/structures/meteor/room10/headloot/loot-crate-crab.nbt b/src/main/resources/assets/hbm/structures/meteor/room10/headloot/loot-crate-crab.nbt new file mode 100644 index 000000000..cb5de6453 Binary files /dev/null and b/src/main/resources/assets/hbm/structures/meteor/room10/headloot/loot-crate-crab.nbt differ diff --git a/src/main/resources/assets/hbm/structures/meteor/room10/headloot/loot-fallback.nbt b/src/main/resources/assets/hbm/structures/meteor/room10/headloot/loot-fallback.nbt new file mode 100644 index 000000000..2ce40e053 Binary files /dev/null and b/src/main/resources/assets/hbm/structures/meteor/room10/headloot/loot-fallback.nbt differ diff --git a/src/main/resources/assets/hbm/structures/meteor/room10/headloot/loot-tesla.nbt b/src/main/resources/assets/hbm/structures/meteor/room10/headloot/loot-tesla.nbt new file mode 100644 index 000000000..5a4e4f802 Binary files /dev/null and b/src/main/resources/assets/hbm/structures/meteor/room10/headloot/loot-tesla.nbt differ diff --git a/src/main/resources/assets/hbm/structures/meteor/room10/headloot/loot-trap.nbt b/src/main/resources/assets/hbm/structures/meteor/room10/headloot/loot-trap.nbt new file mode 100644 index 000000000..c8486d48e Binary files /dev/null and b/src/main/resources/assets/hbm/structures/meteor/room10/headloot/loot-trap.nbt differ diff --git a/src/main/resources/assets/hbm/structures/meteor/room10/room-balcony.nbt b/src/main/resources/assets/hbm/structures/meteor/room10/room-balcony.nbt new file mode 100644 index 000000000..58664191f Binary files /dev/null and b/src/main/resources/assets/hbm/structures/meteor/room10/room-balcony.nbt differ diff --git a/src/main/resources/assets/hbm/structures/meteor/room10/room-base-end.nbt b/src/main/resources/assets/hbm/structures/meteor/room10/room-base-end.nbt new file mode 100644 index 000000000..c77647792 Binary files /dev/null and b/src/main/resources/assets/hbm/structures/meteor/room10/room-base-end.nbt differ diff --git a/src/main/resources/assets/hbm/structures/meteor/room10/room-base-thru.nbt b/src/main/resources/assets/hbm/structures/meteor/room10/room-base-thru.nbt new file mode 100644 index 000000000..efa40eaab Binary files /dev/null and b/src/main/resources/assets/hbm/structures/meteor/room10/room-base-thru.nbt differ diff --git a/src/main/resources/assets/hbm/structures/meteor/room10/room-basic.nbt b/src/main/resources/assets/hbm/structures/meteor/room10/room-basic.nbt new file mode 100644 index 000000000..0eb650e06 Binary files /dev/null and b/src/main/resources/assets/hbm/structures/meteor/room10/room-basic.nbt differ diff --git a/src/main/resources/assets/hbm/structures/meteor/room10/room-dragon.nbt b/src/main/resources/assets/hbm/structures/meteor/room10/room-dragon.nbt new file mode 100644 index 000000000..52e91cfe9 Binary files /dev/null and b/src/main/resources/assets/hbm/structures/meteor/room10/room-dragon.nbt differ diff --git a/src/main/resources/assets/hbm/structures/meteor/room10/room-fallback.nbt b/src/main/resources/assets/hbm/structures/meteor/room10/room-fallback.nbt new file mode 100644 index 000000000..6b0447906 Binary files /dev/null and b/src/main/resources/assets/hbm/structures/meteor/room10/room-fallback.nbt differ diff --git a/src/main/resources/assets/hbm/structures/meteor/room10/room-ladder.nbt b/src/main/resources/assets/hbm/structures/meteor/room10/room-ladder.nbt new file mode 100644 index 000000000..50bfc2523 Binary files /dev/null and b/src/main/resources/assets/hbm/structures/meteor/room10/room-ladder.nbt differ diff --git a/src/main/resources/assets/hbm/structures/meteor/room10/room-ooze.nbt b/src/main/resources/assets/hbm/structures/meteor/room10/room-ooze.nbt new file mode 100644 index 000000000..346cac917 Binary files /dev/null and b/src/main/resources/assets/hbm/structures/meteor/room10/room-ooze.nbt differ diff --git a/src/main/resources/assets/hbm/structures/meteor/room10/room-split.nbt b/src/main/resources/assets/hbm/structures/meteor/room10/room-split.nbt new file mode 100644 index 000000000..9ce05bb0f Binary files /dev/null and b/src/main/resources/assets/hbm/structures/meteor/room10/room-split.nbt differ diff --git a/src/main/resources/assets/hbm/structures/meteor/room10/room-stairs.nbt b/src/main/resources/assets/hbm/structures/meteor/room10/room-stairs.nbt new file mode 100644 index 000000000..7cef44a64 Binary files /dev/null and b/src/main/resources/assets/hbm/structures/meteor/room10/room-stairs.nbt differ diff --git a/src/main/resources/assets/hbm/structures/meteor/room10/room-triple.nbt b/src/main/resources/assets/hbm/structures/meteor/room10/room-triple.nbt new file mode 100644 index 000000000..b1aa16ff4 Binary files /dev/null and b/src/main/resources/assets/hbm/structures/meteor/room10/room-triple.nbt differ diff --git a/src/main/resources/assets/hbm/structures/test-jigsaw-core.nbt b/src/main/resources/assets/hbm/structures/test-jigsaw-core.nbt new file mode 100644 index 000000000..a73962172 Binary files /dev/null and b/src/main/resources/assets/hbm/structures/test-jigsaw-core.nbt differ diff --git a/src/main/resources/assets/hbm/structures/test-jigsaw-hall.nbt b/src/main/resources/assets/hbm/structures/test-jigsaw-hall.nbt new file mode 100644 index 000000000..1676ffa91 Binary files /dev/null and b/src/main/resources/assets/hbm/structures/test-jigsaw-hall.nbt differ diff --git a/src/main/resources/assets/hbm/structures/test-jigsaw.nbt b/src/main/resources/assets/hbm/structures/test-jigsaw.nbt new file mode 100644 index 000000000..aa2bdf7ea Binary files /dev/null and b/src/main/resources/assets/hbm/structures/test-jigsaw.nbt differ diff --git a/src/main/resources/assets/hbm/structures/test-rot.nbt b/src/main/resources/assets/hbm/structures/test-rot.nbt new file mode 100644 index 000000000..7150435df Binary files /dev/null and b/src/main/resources/assets/hbm/structures/test-rot.nbt differ diff --git a/src/main/resources/assets/hbm/structures/vertibird.nbt b/src/main/resources/assets/hbm/structures/vertibird.nbt new file mode 100644 index 000000000..da4bc38d9 Binary files /dev/null and b/src/main/resources/assets/hbm/structures/vertibird.nbt differ diff --git a/src/main/resources/assets/hbm/textures/blocks/wand_air.png b/src/main/resources/assets/hbm/textures/blocks/wand_air.png new file mode 100644 index 000000000..4e5efa1a4 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/blocks/wand_air.png differ diff --git a/src/main/resources/assets/hbm/textures/blocks/wand_jigsaw.png b/src/main/resources/assets/hbm/textures/blocks/wand_jigsaw.png new file mode 100644 index 000000000..2e56150d8 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/blocks/wand_jigsaw.png differ diff --git a/src/main/resources/assets/hbm/textures/blocks/wand_jigsaw_back.png b/src/main/resources/assets/hbm/textures/blocks/wand_jigsaw_back.png new file mode 100644 index 000000000..6f202718b Binary files /dev/null and b/src/main/resources/assets/hbm/textures/blocks/wand_jigsaw_back.png differ diff --git a/src/main/resources/assets/hbm/textures/blocks/wand_jigsaw_side.png b/src/main/resources/assets/hbm/textures/blocks/wand_jigsaw_side.png new file mode 100644 index 000000000..dc9a78ecb Binary files /dev/null and b/src/main/resources/assets/hbm/textures/blocks/wand_jigsaw_side.png differ diff --git a/src/main/resources/assets/hbm/textures/blocks/wand_jigsaw_top.png b/src/main/resources/assets/hbm/textures/blocks/wand_jigsaw_top.png new file mode 100644 index 000000000..2c47fc86b Binary files /dev/null and b/src/main/resources/assets/hbm/textures/blocks/wand_jigsaw_top.png differ diff --git a/src/main/resources/assets/hbm/textures/blocks/wand_loot.png b/src/main/resources/assets/hbm/textures/blocks/wand_loot.png new file mode 100644 index 000000000..1dc8a297f Binary files /dev/null and b/src/main/resources/assets/hbm/textures/blocks/wand_loot.png differ diff --git a/src/main/resources/assets/hbm/textures/blocks/wand_loot_top.png b/src/main/resources/assets/hbm/textures/blocks/wand_loot_top.png new file mode 100644 index 000000000..5378ae691 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/blocks/wand_loot_top.png differ diff --git a/src/main/resources/assets/hbm/textures/models/machines/refueler.png b/src/main/resources/assets/hbm/textures/models/machines/refueler.png new file mode 100644 index 000000000..856793f73 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/models/machines/refueler.png differ diff --git a/src/main/resources/assets/hbm/textures/models/trinkets/mellowrpg8_glow.png b/src/main/resources/assets/hbm/textures/models/trinkets/mellowrpg8_glow.png new file mode 100644 index 000000000..84a06adcf Binary files /dev/null and b/src/main/resources/assets/hbm/textures/models/trinkets/mellowrpg8_glow.png differ