From 26b379e2490ece0ed83a02eba04cd81f25b85609 Mon Sep 17 00:00:00 2001 From: Bob Date: Sun, 24 Oct 2021 15:52:53 +0200 Subject: [PATCH] zirnox texture, some loot stuff, world gen tests --- src/main/java/com/hbm/blocks/ModBlocks.java | 14 +- .../java/com/hbm/blocks/gas/BlockVacuum.java | 39 ++++- .../com/hbm/blocks/generic/BlockLoot.java | 162 ++++++++++++++++++ .../hbm/blocks/generic/BlockTransission.java | 32 ++++ .../java/com/hbm/items/tool/ItemWandD.java | 12 +- src/main/java/com/hbm/lib/HbmWorld.java | 22 ++- src/main/java/com/hbm/main/ClientProxy.java | 2 + .../com/hbm/render/tileentity/RenderLoot.java | 69 ++++++++ .../java/com/hbm/tileentity/TileMappings.java | 3 + .../java/com/hbm/world/test/MapGenTest.java | 23 +++ .../world/test/StructureComponentTest.java | 37 ++++ .../hbm/world/test/StructureStartTest.java | 15 ++ .../java/com/hbm/world/test/WorldGenTest.java | 20 +++ .../hbm/textures/blocks/brick_forgotten.png | Bin 0 -> 214 bytes .../hbm/textures/blocks/transission_hatch.png | Bin 0 -> 235 bytes .../hbm/textures/models/machines/zirnox.png | Bin 0 -> 12322 bytes .../textures/models/machines/zirnox_base.png | Bin 0 -> 2547 bytes 17 files changed, 434 insertions(+), 16 deletions(-) create mode 100644 src/main/java/com/hbm/blocks/generic/BlockLoot.java create mode 100644 src/main/java/com/hbm/blocks/generic/BlockTransission.java create mode 100644 src/main/java/com/hbm/render/tileentity/RenderLoot.java create mode 100644 src/main/java/com/hbm/world/test/MapGenTest.java create mode 100644 src/main/java/com/hbm/world/test/StructureComponentTest.java create mode 100644 src/main/java/com/hbm/world/test/StructureStartTest.java create mode 100644 src/main/java/com/hbm/world/test/WorldGenTest.java create mode 100644 src/main/resources/assets/hbm/textures/blocks/brick_forgotten.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/transission_hatch.png create mode 100644 src/main/resources/assets/hbm/textures/models/machines/zirnox.png create mode 100644 src/main/resources/assets/hbm/textures/models/machines/zirnox_base.png diff --git a/src/main/java/com/hbm/blocks/ModBlocks.java b/src/main/java/com/hbm/blocks/ModBlocks.java index 401d5f7bf..7f14e7a57 100644 --- a/src/main/java/com/hbm/blocks/ModBlocks.java +++ b/src/main/java/com/hbm/blocks/ModBlocks.java @@ -271,6 +271,8 @@ public class ModBlocks { public static Block deco_rbmk; public static Block deco_rbmk_smooth; + public static Block deco_loot; + public static Block hazmat; public static Block gravel_obsidian; @@ -356,6 +358,8 @@ public class ModBlocks { public static Block brick_dungeon_tile; public static Block brick_dungeon_circle; + public static Block brick_forgotten; + public static Block tape_recorder; public static Block steel_poles; public static Block pole_top; @@ -1084,6 +1088,7 @@ public class ModBlocks { public static Block absorber_green; public static Block absorber_pink; public static Block decon; + public static Block transission_hatch; public static Block mud_block; public static Fluid mud_fluid; @@ -1430,6 +1435,7 @@ public class ModBlocks { deco_rbmk = new BlockGeneric(Material.iron).setBlockName("deco_rbmk").setCreativeTab(MainRegistry.blockTab).setHardness(5.0F).setResistance(10.0F).setBlockTextureName(RefStrings.MODID + ":rbmk/rbmk_side"); deco_rbmk_smooth = new BlockGeneric(Material.iron).setBlockName("deco_rbmk_smooth").setCreativeTab(MainRegistry.blockTab).setHardness(5.0F).setResistance(10.0F).setBlockTextureName(RefStrings.MODID + ":rbmk/rbmk_top"); + deco_loot = new BlockLoot().setBlockName("deco_loot").setCreativeTab(null).setHardness(0.0F).setResistance(0.0F).setBlockTextureName(RefStrings.MODID + ":deco_loot"); hazmat = new BlockGeneric(Material.cloth).setBlockName("hazmat").setStepSound(Block.soundTypeCloth).setCreativeTab(MainRegistry.blockTab).setHardness(15.0F).setResistance(100.0F).setBlockTextureName(RefStrings.MODID + ":hazmat"); gravel_obsidian = new BlockFalling(Material.iron).setBlockName("gravel_obsidian").setCreativeTab(MainRegistry.blockTab).setStepSound(Block.soundTypeGravel).setHardness(5.0F).setResistance(600.0F).setBlockTextureName(RefStrings.MODID + ":gravel_obsidian"); @@ -1515,6 +1521,8 @@ public class ModBlocks { brick_dungeon_flat = new BlockGeneric(Material.rock).setBlockName("brick_dungeon_flat").setCreativeTab(MainRegistry.blockTab).setHardness(15.0F).setResistance(900.0F).setBlockTextureName(RefStrings.MODID + ":brick_dungeon_flat"); brick_dungeon_tile = new BlockGeneric(Material.rock).setBlockName("brick_dungeon_tile").setCreativeTab(MainRegistry.blockTab).setHardness(15.0F).setResistance(900.0F).setBlockTextureName(RefStrings.MODID + ":brick_dungeon_tile"); brick_dungeon_circle = new BlockGeneric(Material.rock).setBlockName("brick_dungeon_circle").setCreativeTab(MainRegistry.blockTab).setHardness(15.0F).setResistance(900.0F).setBlockTextureName(RefStrings.MODID + ":brick_dungeon_circle"); + + brick_forgotten = new BlockGeneric(Material.rock).setBlockName("brick_forgotten").setCreativeTab(MainRegistry.blockTab).setBlockUnbreakable().setResistance(1000000).setBlockTextureName(RefStrings.MODID + ":brick_forgotten"); tape_recorder = new DecoTapeRecorder(Material.iron).setBlockName("tape_recorder").setCreativeTab(MainRegistry.blockTab).setHardness(5.0F).setResistance(15.0F).setBlockTextureName(RefStrings.MODID + ":deco_tape_recorder"); steel_poles = new DecoSteelPoles(Material.iron).setBlockName("steel_poles").setCreativeTab(MainRegistry.blockTab).setHardness(5.0F).setResistance(15.0F).setBlockTextureName(RefStrings.MODID + ":steel_beam"); @@ -2063,13 +2071,14 @@ public class ModBlocks { gas_coal = new BlockGasCoal().setBlockName("gas_coal").setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":gas_coal"); gas_flammable = new BlockGasFlammable().setBlockName("gas_flammable").setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":gas_flammable"); gas_explosive = new BlockGasExplosive().setBlockName("gas_explosive").setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":gas_explosive"); - vacuum = new BlockVacuum().setBlockName("vacuum").setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":vacuum"); + vacuum = new BlockVacuum().setBlockName("vacuum").setResistance(1000000F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":vacuum"); absorber = new BlockAbsorber(Material.iron, 2.5F).setBlockName("absorber").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":absorber"); absorber_red = new BlockAbsorber(Material.iron, 10F).setBlockName("absorber_red").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":absorber_red"); absorber_green = new BlockAbsorber(Material.iron, 100F).setBlockName("absorber_green").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":absorber_green"); absorber_pink = new BlockAbsorber(Material.iron, 10000F).setBlockName("absorber_pink").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":absorber_pink"); decon = new BlockDecon(Material.iron).setBlockName("decon").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":decon_side"); + transission_hatch = new BlockTransission(Material.iron).setBlockName("transission_hatch").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":transission_hatch"); volcano_core = new BlockVolcano().setBlockName("volcano_core").setBlockUnbreakable().setResistance(10000.0F).setCreativeTab(MainRegistry.nukeTab).setBlockTextureName(RefStrings.MODID + ":volcano_core"); @@ -2407,6 +2416,7 @@ public class ModBlocks { GameRegistry.registerBlock(deco_lead, deco_lead.getUnlocalizedName()); GameRegistry.registerBlock(deco_beryllium, deco_beryllium.getUnlocalizedName()); GameRegistry.registerBlock(deco_asbestos, deco_asbestos.getUnlocalizedName()); + GameRegistry.registerBlock(deco_loot, deco_loot.getUnlocalizedName()); GameRegistry.registerBlock(hazmat, hazmat.getUnlocalizedName()); GameRegistry.registerBlock(deco_rbmk, deco_rbmk.getUnlocalizedName()); GameRegistry.registerBlock(deco_rbmk_smooth, deco_rbmk_smooth.getUnlocalizedName()); @@ -2508,6 +2518,7 @@ public class ModBlocks { GameRegistry.registerBlock(brick_dungeon_flat, brick_dungeon_flat.getUnlocalizedName()); GameRegistry.registerBlock(brick_dungeon_tile, brick_dungeon_tile.getUnlocalizedName()); GameRegistry.registerBlock(brick_dungeon_circle, brick_dungeon_circle.getUnlocalizedName()); + GameRegistry.registerBlock(brick_forgotten, brick_forgotten.getUnlocalizedName()); GameRegistry.registerBlock(tape_recorder, tape_recorder.getUnlocalizedName()); GameRegistry.registerBlock(steel_poles, steel_poles.getUnlocalizedName()); GameRegistry.registerBlock(pole_top, pole_top.getUnlocalizedName()); @@ -2922,6 +2933,7 @@ public class ModBlocks { GameRegistry.registerBlock(absorber_green, absorber_green.getUnlocalizedName()); GameRegistry.registerBlock(absorber_pink, absorber_pink.getUnlocalizedName()); GameRegistry.registerBlock(decon, decon.getUnlocalizedName()); + GameRegistry.registerBlock(transission_hatch, transission_hatch.getUnlocalizedName()); //Solar Tower Blocks GameRegistry.registerBlock(machine_solar_boiler, machine_solar_boiler.getUnlocalizedName()); diff --git a/src/main/java/com/hbm/blocks/gas/BlockVacuum.java b/src/main/java/com/hbm/blocks/gas/BlockVacuum.java index 07e8dc468..34a00b969 100644 --- a/src/main/java/com/hbm/blocks/gas/BlockVacuum.java +++ b/src/main/java/com/hbm/blocks/gas/BlockVacuum.java @@ -63,7 +63,7 @@ public class BlockVacuum extends Block { @Override public boolean isReplaceable(IBlockAccess world, int x, int y, int z) { - return true; + return false; } @Override @@ -86,14 +86,45 @@ public class BlockVacuum extends Block { if(b == this) continue; - if(b.getMaterial() == Material.air || - b.getBlockBoundsMinX() > 0 || b.getBlockBoundsMinY() > 0 || b.getBlockBoundsMinZ() > 0 || - b.getBlockBoundsMaxX() < 1 || b.getBlockBoundsMaxY() < 1 || b.getBlockBoundsMaxZ() < 1) { + if(isAirBlock(b)) { + + if(b.isReplaceable(world, x + dir.offsetX, y + dir.offsetY, z + dir.offsetZ)) { + if(getAirCount(world, x + dir.offsetX, y + dir.offsetY, z + dir.offsetZ) == 0) { + world.setBlock(x + dir.offsetX, y + dir.offsetY, z + dir.offsetZ, ModBlocks.vacuum); + return; + } + } + world.setBlockToAir(x, y, z); return; } } } + + private boolean isAirBlock(Block b) { + + if(b == this) + return false; + + return b.getMaterial() == Material.air || + b.getBlockBoundsMinX() > 0 || b.getBlockBoundsMinY() > 0 || b.getBlockBoundsMinZ() > 0 || + b.getBlockBoundsMaxX() < 1 || b.getBlockBoundsMaxY() < 1 || b.getBlockBoundsMaxZ() < 1; + } + + private int getAirCount(World world, int x, int y, int z) { + + int air = 0; + + for(ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) { + + Block b = world.getBlock(x + dir.offsetX, y + dir.offsetY, z + dir.offsetZ); + + if(isAirBlock(b)) + air++; + } + + return air; + } @Override public void onEntityCollidedWithBlock(World world, int x, int y, int z, Entity entity) { diff --git a/src/main/java/com/hbm/blocks/generic/BlockLoot.java b/src/main/java/com/hbm/blocks/generic/BlockLoot.java new file mode 100644 index 000000000..8bb0f0c50 --- /dev/null +++ b/src/main/java/com/hbm/blocks/generic/BlockLoot.java @@ -0,0 +1,162 @@ +package com.hbm.blocks.generic; + +import java.util.ArrayList; +import java.util.List; + +import com.hbm.blocks.ModBlocks; +import com.hbm.items.ModItems; +import com.hbm.main.MainRegistry; +import com.hbm.tileentity.bomb.TileEntityBombMulti; +import com.hbm.util.Tuple.Quartet; + +import cpw.mods.fml.common.network.internal.FMLNetworkHandler; +import net.minecraft.block.BlockContainer; +import net.minecraft.block.material.Material; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.network.NetworkManager; +import net.minecraft.network.Packet; +import net.minecraft.network.play.server.S35PacketUpdateTileEntity; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; + +public class BlockLoot extends BlockContainer { + + public BlockLoot() { + super(Material.iron); + } + + @Override + public int getRenderType() { + return -1; + } + + @Override + public boolean isOpaqueCube() { + return false; + } + + @Override + public boolean renderAsNormalBlock() { + return false; + } + + @Override + public void onBlockAdded(World world, int x, int y, int z) { + super.onBlockAdded(world, x, y, z); + + TileEntityLoot loot = (TileEntityLoot) world.getTileEntity(x, y, z); + + if(loot != null && loot.items.isEmpty()) { + + for(int i = 0; i < 64; i++) { + loot.addItem(new ItemStack(ModItems.cigarette), -0.375 + world.rand.nextDouble() * 0.75, world.rand.nextDouble() * 0.0625, -0.375 + world.rand.nextDouble() * 0.75); + } + } + } + + @Override + public void setBlockBoundsBasedOnState(IBlockAccess world, int x, int y, int z) { + this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 0.0625F, 1.0F); + } + + @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 boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { + + if(world.isRemote) { + return true; + + } else if(!player.isSneaking()) { + + TileEntityLoot entity = (TileEntityLoot) world.getTileEntity(x, y, z); + if(entity != null) { + + for(Quartet quartet : entity.items) { + player.inventory.addItemStackToInventory(quartet.getW()); + } + + world.setBlockToAir(x, y, z); + player.inventoryContainer.detectAndSendChanges(); + } + return true; + + } else { + return false; + } + } + + @Override + public TileEntity createNewTileEntity(World world, int meta) { + return new TileEntityLoot(); + } + + public static class TileEntityLoot extends TileEntity { + + public List> items = new ArrayList(); + + @Override + public boolean canUpdate() { + return false; + } + + public TileEntityLoot addItem(ItemStack stack, double x, double y, double z) { + items.add(new Quartet(stack, x, y, z)); + return this; + } + + @Override + public Packet getDescriptionPacket() { + NBTTagCompound nbt = new NBTTagCompound(); + this.writeToNBT(nbt); + return new S35PacketUpdateTileEntity(this.xCoord, this.yCoord, this.zCoord, 0, nbt); + } + + @Override + public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity pkt) { + this.readFromNBT(pkt.func_148857_g()); + } + + @Override + public void readFromNBT(NBTTagCompound nbt) { + super.readFromNBT(nbt); + + int count = nbt.getInteger("count"); + + System.out.println("count"); + + for(int i = 0; i < count; i++) { + ItemStack stack = ItemStack.loadItemStackFromNBT(nbt.getCompoundTag("item" + i)); + double x = nbt.getDouble("x" + i); + double y = nbt.getDouble("y" + i); + double z = nbt.getDouble("z" + i); + items.add(new Quartet(stack, x, y, z)); + } + } + + @Override + public void writeToNBT(NBTTagCompound nbt) { + super.writeToNBT(nbt); + + nbt.setInteger("count", items.size()); + + for(int i = 0; i < items.size(); i++) { + Quartet item = items.get(i); + NBTTagCompound stack = new NBTTagCompound(); + item.getW().writeToNBT(stack); + nbt.setTag("item" + i, stack); + nbt.setDouble("x" + i, item.getX()); + nbt.setDouble("y" + i, item.getY()); + nbt.setDouble("z" + i, item.getZ()); + } + } + } +} diff --git a/src/main/java/com/hbm/blocks/generic/BlockTransission.java b/src/main/java/com/hbm/blocks/generic/BlockTransission.java new file mode 100644 index 000000000..b17cf2308 --- /dev/null +++ b/src/main/java/com/hbm/blocks/generic/BlockTransission.java @@ -0,0 +1,32 @@ +package com.hbm.blocks.generic; + +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.world.World; + +public class BlockTransission extends Block { + + public BlockTransission(Material mat) { + super(mat); + } + + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { + if(world.isRemote) { + return true; + + } else if(!player.isSneaking()) { + + if(side == 0) { + player.setPositionAndUpdate(x + 0.5, y + 1, z + 0.5); + } + if(side == 1) { + player.setPositionAndUpdate(x + 0.5, y - 2, z + 0.5); + } + return true; + } else { + return false; + } + } +} diff --git a/src/main/java/com/hbm/items/tool/ItemWandD.java b/src/main/java/com/hbm/items/tool/ItemWandD.java index e928a516a..b44cd66db 100644 --- a/src/main/java/com/hbm/items/tool/ItemWandD.java +++ b/src/main/java/com/hbm/items/tool/ItemWandD.java @@ -2,6 +2,7 @@ package com.hbm.items.tool; import java.util.List; +import com.hbm.blocks.ModBlocks; import com.hbm.entity.mob.EntityBlockSpider; import com.hbm.lib.Library; import com.hbm.world.generator.CellularDungeonFactory; @@ -31,11 +32,14 @@ public class ItemWandD extends Item { //CellularDungeonFactory.meteor.generate(world, x, y, z, world.rand); - for(int i = x - 10; i <= x + 10; i++) { - for(int j = y - 10; j <= y + 10; j++) { - for(int k = z - 10; k <= z + 10; k++) { + int r = 5; + + for(int i = x - r; i <= x + r; i++) { + for(int j = y - r; j <= y + r; j++) { + for(int k = z - r; k <= z + r; k++) { - world.getBlock(i, j, k).updateTick(world, i, j, k, world.rand); + world.setBlock(i, j, k, ModBlocks.vacuum); + //world.getBlock(i, j, k).updateTick(world, i, j, k, world.rand); } } } diff --git a/src/main/java/com/hbm/lib/HbmWorld.java b/src/main/java/com/hbm/lib/HbmWorld.java index 79f0f7473..c749b4b0b 100644 --- a/src/main/java/com/hbm/lib/HbmWorld.java +++ b/src/main/java/com/hbm/lib/HbmWorld.java @@ -1,21 +1,29 @@ package com.hbm.lib; +import com.hbm.world.test.StructureComponentTest; +import com.hbm.world.test.StructureStartTest; +import com.hbm.world.test.WorldGenTest; + +import cpw.mods.fml.common.IWorldGenerator; import cpw.mods.fml.common.registry.GameRegistry; +import net.minecraft.world.gen.structure.MapGenStructureIO; public class HbmWorld { - public static void mainRegistry() - { + + public static void mainRegistry() { initWorldGen(); } - public static void initWorldGen() - { + public static void initWorldGen() { + + MapGenStructureIO.registerStructure(StructureStartTest.class, "HFR_STRUCTURE"); + MapGenStructureIO.func_143031_a(StructureComponentTest.class, "HFR_COMPONENT"); + registerWorldGen(new HbmWorldGen(), 1); + //registerWorldGen(new WorldGenTest(), 1); } - public static void registerWorldGen(HbmWorldGen nukerWorldGen, int weightedProbability) - { + public static void registerWorldGen(IWorldGenerator nukerWorldGen, int weightedProbability) { GameRegistry.registerWorldGenerator(nukerWorldGen, weightedProbability); } - } diff --git a/src/main/java/com/hbm/main/ClientProxy.java b/src/main/java/com/hbm/main/ClientProxy.java index 3b88bf45c..e2816ab53 100644 --- a/src/main/java/com/hbm/main/ClientProxy.java +++ b/src/main/java/com/hbm/main/ClientProxy.java @@ -35,6 +35,7 @@ import java.util.Map.Entry; import java.util.Random; import com.hbm.blocks.ModBlocks; +import com.hbm.blocks.generic.BlockLoot.TileEntityLoot; import com.hbm.entity.effect.*; import com.hbm.entity.grenade.*; import com.hbm.entity.item.EntityFireworks; @@ -111,6 +112,7 @@ public class ClientProxy extends ServerProxy { ClientRegistry.bindTileEntitySpecialRenderer(TileEntityDecoBlockAltW.class, new RenderDecoBlockAlt()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityDecoBlockAltF.class, new RenderDecoBlockAlt()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityDemonLamp.class, new RenderDemonLamp()); + ClientRegistry.bindTileEntitySpecialRenderer(TileEntityLoot.class, new RenderLoot()); //bombs ClientRegistry.bindTileEntitySpecialRenderer(TileEntityNukeGadget.class, new RenderNukeGadget()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityNukeBoy.class, new RenderNukeBoy()); diff --git a/src/main/java/com/hbm/render/tileentity/RenderLoot.java b/src/main/java/com/hbm/render/tileentity/RenderLoot.java new file mode 100644 index 000000000..83f1cc555 --- /dev/null +++ b/src/main/java/com/hbm/render/tileentity/RenderLoot.java @@ -0,0 +1,69 @@ +package com.hbm.render.tileentity; + +import org.lwjgl.opengl.GL11; + +import com.hbm.blocks.generic.BlockLoot.TileEntityLoot; +import com.hbm.items.ModItems; +import com.hbm.main.ResourceManager; +import com.hbm.render.util.RenderItemStack; +import com.hbm.util.Tuple.Quartet; + +import net.minecraft.client.renderer.ItemRenderer; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.client.renderer.texture.TextureMap; +import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.IIcon; + +public class RenderLoot extends TileEntitySpecialRenderer { + + @Override + public void renderTileEntityAt(TileEntity te, double x, double y, double z, float interp) { + GL11.glPushMatrix(); + GL11.glTranslated(x, y, z); + + TileEntityLoot loot = (TileEntityLoot) te; + + for(Quartet item : loot.items) { + + ItemStack stack = item.getW(); + + GL11.glPushMatrix(); + GL11.glTranslated(item.getX(), item.getY(), item.getZ()); + + if(stack.getItem() == ModItems.ammo_nuke || stack.getItem() == ModItems.ammo_nuke_low || stack.getItem() == ModItems.ammo_nuke_high || stack.getItem() == ModItems.ammo_nuke_safe) { + renderNuke(); + } else { + renderStandardItem(item.getW()); + } + + GL11.glPopMatrix(); + } + + GL11.glPopMatrix(); + } + + private void renderNuke() { + GL11.glScaled(0.5, 0.5, 0.5); + GL11.glTranslated(1, 0.5, 1); + GL11.glShadeModel(GL11.GL_SMOOTH); + bindTexture(ResourceManager.mini_nuke_tex); + ResourceManager.projectiles.renderPart("MiniNuke"); + GL11.glShadeModel(GL11.GL_FLAT); + } + + private void renderStandardItem(ItemStack stack) { + GL11.glTranslated(0.25, 0, 0.25); + GL11.glScaled(0.5, 0.5, 0.5); + GL11.glRotated(90, 1, 0, 0); + + bindTexture(TextureMap.locationItemsTexture); + IIcon icon = stack.getIconIndex(); + float f14 = icon.getMinU(); + float f15 = icon.getMaxU(); + float f4 = icon.getMinV(); + float f5 = icon.getMaxV(); + ItemRenderer.renderItemIn2D(Tessellator.instance, f15, f4, f14, f5, icon.getIconWidth(), icon.getIconHeight(), 0.0625F); + } +} diff --git a/src/main/java/com/hbm/tileentity/TileMappings.java b/src/main/java/com/hbm/tileentity/TileMappings.java index 3389c1969..efd0f5c5d 100644 --- a/src/main/java/com/hbm/tileentity/TileMappings.java +++ b/src/main/java/com/hbm/tileentity/TileMappings.java @@ -2,6 +2,7 @@ package com.hbm.tileentity; import java.util.HashMap; +import com.hbm.blocks.generic.BlockLoot.TileEntityLoot; import com.hbm.tileentity.bomb.*; import com.hbm.tileentity.conductor.*; import com.hbm.tileentity.deco.*; @@ -191,6 +192,8 @@ public class TileMappings { map.put(TileEntityMachineOrbus.class, "tileentity_orbus"); map.put(TileEntityMachineFractionTower.class, "tileentity_fraction_tower"); map.put(TileEntitySpacer.class, "tileentity_fraction_spacer"); + + map.put(TileEntityLoot.class, "tileentity_ntm_loot"); putBombs(); putTurrets(); diff --git a/src/main/java/com/hbm/world/test/MapGenTest.java b/src/main/java/com/hbm/world/test/MapGenTest.java new file mode 100644 index 000000000..97bb01543 --- /dev/null +++ b/src/main/java/com/hbm/world/test/MapGenTest.java @@ -0,0 +1,23 @@ +package com.hbm.world.test; + +import net.minecraft.world.gen.structure.MapGenStructure; +import net.minecraft.world.gen.structure.StructureStart; + +public class MapGenTest extends MapGenStructure { + + @Override + public String func_143025_a() { + return "HFR_TEST"; + } + + @Override + protected boolean canSpawnStructureAtCoords(int x, int z) { + return true; + } + + @Override + protected StructureStart getStructureStart(int x, int z) { + return new StructureStartTest(worldObj, rand, x, z); + } + +} diff --git a/src/main/java/com/hbm/world/test/StructureComponentTest.java b/src/main/java/com/hbm/world/test/StructureComponentTest.java new file mode 100644 index 000000000..e8a232da1 --- /dev/null +++ b/src/main/java/com/hbm/world/test/StructureComponentTest.java @@ -0,0 +1,37 @@ +package com.hbm.world.test; + +import java.util.Random; + +import net.minecraft.init.Blocks; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.world.World; +import net.minecraft.world.gen.structure.StructureBoundingBox; +import net.minecraft.world.gen.structure.StructureComponent; + +public class StructureComponentTest extends StructureComponent { + + public StructureComponentTest(int x, int z) { + this.boundingBox = new StructureBoundingBox(x, 64, z, x + 4, 64 + 9, z + 4); + } + + + //write + @Override + protected void func_143012_a(NBTTagCompound nbt) { + + } + + //read + @Override + protected void func_143011_b(NBTTagCompound nbt) { + + } + + @Override + public boolean addComponentParts(World world, Random rand, StructureBoundingBox boundingbox) { + System.out.println("aaaaaaa"); + this.fillWithBlocks(world, boundingbox, 0, 0, 0, 4, 9, 4, Blocks.sandstone, Blocks.air, false); + return true; + } + +} diff --git a/src/main/java/com/hbm/world/test/StructureStartTest.java b/src/main/java/com/hbm/world/test/StructureStartTest.java new file mode 100644 index 000000000..a507adf26 --- /dev/null +++ b/src/main/java/com/hbm/world/test/StructureStartTest.java @@ -0,0 +1,15 @@ +package com.hbm.world.test; + +import java.util.Random; + +import net.minecraft.world.World; +import net.minecraft.world.gen.structure.StructureStart; + +public class StructureStartTest extends StructureStart { + + public StructureStartTest(World world, Random rand, int x, int z) { + System.out.println("StructureStartTest"); + this.components.add(new StructureComponentTest(x, z)); + this.updateBoundingBox(); + } +} \ No newline at end of file diff --git a/src/main/java/com/hbm/world/test/WorldGenTest.java b/src/main/java/com/hbm/world/test/WorldGenTest.java new file mode 100644 index 000000000..ddacb1a33 --- /dev/null +++ b/src/main/java/com/hbm/world/test/WorldGenTest.java @@ -0,0 +1,20 @@ +package com.hbm.world.test; + +import java.util.Random; + +import cpw.mods.fml.common.IWorldGenerator; +import net.minecraft.block.Block; +import net.minecraft.world.World; +import net.minecraft.world.chunk.IChunkProvider; + +public class WorldGenTest implements IWorldGenerator { + + static MapGenTest gen = new MapGenTest(); + + @Override + public void generate(Random random, int chunkX, int chunkZ, World world, IChunkProvider chunkGenerator, IChunkProvider chunkProvider) { + gen.func_151539_a(chunkGenerator, world, chunkX, chunkZ, new Block[0]); + gen.generateStructuresInChunk(world, random, chunkX, chunkZ); + } +} + diff --git a/src/main/resources/assets/hbm/textures/blocks/brick_forgotten.png b/src/main/resources/assets/hbm/textures/blocks/brick_forgotten.png new file mode 100644 index 0000000000000000000000000000000000000000..c302768fceb45ecf1c149fc320606925c845426d GIT binary patch literal 214 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#VfgW4y5Y_?t)367JH=QJ1T4|FV7$+4_nc?5ZvoI@44$rj JF6*2UngG|4P9*>U literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/blocks/transission_hatch.png b/src/main/resources/assets/hbm/textures/blocks/transission_hatch.png new file mode 100644 index 0000000000000000000000000000000000000000..16b0c870ad60e8ffa14bfb35c1e004f4130e04a2 GIT binary patch literal 235 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 CzNan# literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/models/machines/zirnox_base.png b/src/main/resources/assets/hbm/textures/models/machines/zirnox_base.png new file mode 100644 index 0000000000000000000000000000000000000000..9971faa9589c53b4a9ab885e820418261e809938 GIT binary patch literal 2547 zcmc&$X;@Nu7boj2vRuX{8y$(Pw;0SaTX0L6)XK~y7fekh$1MX(#ne%e$Z^cEwBAV_ z!?bh|cX2@z#N8M*LvtMvDNW4{G#3I~=8`@2_Mzu_zrFX%z32Y#IsfxNzu)hi8-Ky( ztb)9{JO~6*IA>vQ58S6gpbaYE&A`*@NrP74wh3o?&Jhe;QDE=eAkfzQbLOWU!_#MY zb=SBY$d=irMx|F1F9a&y+dE$ux2cB+J6~T_B%qsPn^fh#aR!@T*1T8nMCoR`9o`lt#xMffY~eevyT8fLqb_7gR^M6T&|I6l z^5=CpPJOs4lGaXDIkxzpVMVCe1&P?dQ`K}mt}-$9 zM_?0O#q&CCwo@gr=OLDG^62=rB$(FD6p!>{%+8)>=x=5tSXx;_VnuZ)0@{y8Li|OT z@=(gPu*ucz6|cvQrhDYJ5y9G<_EME^*PHIS=o52>bEQc?cimiH3q~QX{CO8KUh%|8 z>(iHCxc&c){~__<6AK%Zx$kgVedwh8T1x&hjknq^L&L#NSf|~7^&(@KvN*Twg^`wN zbMV7YKOmG5y7`c((jmL?WkO~0jYtN)Y-n(>f*Z}`IcgQjZzFySCp(f?C>kyFj^Q6k z{{>d%`#dW+t%Rziqyz^r`|c)C-OptTa*nWzb|n~l<~Uda8Dti}6Obk(z$gaKAgjQHu%L zdbElPnw4+MM-nI7TvuzVS{=yk&i)2>fhv6@m!6G5XOqmdM;>0Uz9n_y6N}%Ti zMP8v<*qEZVVF(4 znmM=EkkB4&t_#MV;U@bcNX%Rnel32gM!qIeRNTfCa!S{bbQo0)BHdO4xp{bWFl;9M zrfU&So!DU!i|@GlXdbNn2p4n|N+jd-^z zUQ<@Zbd_#{i?`;#aW)Kl8$^0`g}sluFxlfb?pic&4po&a-HnLRLDzco)=C$1HBust zgA+Ar4}sIaZSw6|tgB!hI2=-x0oJ9l^F~)!-n@FCzmd{BqAGsi91COv86WT2>*S38 zgqd4NTm5ND5Uwl!kz0s5u<8~fSEll5dA+?f>tiK zZmDu+y>CwA%l*U-t61`RIZ~SZ`P5B_V>?q0Z^im*X}i-65icaOvz^^fth%qS)kMri z&=yyh|620ZFKxAgft%q$%7SBqFC5ucpDF&S-F|F~pVjeve@1Rz2l+&*Bpx_qE_Fv( z;ZX%Vf5=PZp210Lto}+2dC~qCQ)6ReucT|sKDF~wbixQ*U=7F}#WO*MvgWT6(B$8d zBbaXMq?52z7*Oh;a=PmU?L0oAJY36K)NY&{S{kn9?rtLSs*aj-VY34J&Zg6JFUj_c zg$$71y_KRYzsGZmrG;?jBr>Dhj~B|XXpHy`y$=YM)u>qLzc$;k7bWt)Ph(4#4It6K zm|&}9;?T$XQWBd4FT<_M^AcHZVG|J=m6oy&9B;mj2C>c?6 zR$3@?1H-KMm|c_jfCZmA)x2C5nqh~)R0=0WPOlI36I9`-(PvWjCg0FPC8JFCrN#U7-7stadRmoNSK#*W&dimEvfkn_e3|}eTK5Y(FvPU5M_7IAjB4RB<~pk|`URVAOUh=`XKF`Lhk%i4=NU7R4Ndl$3HW!y z>BR$w&UX3na@O4pq*RhRKfyn1XyLezDOB} z@PjV(*7QY;vB`H>*E-aD}<44p?| zcGU@PWJV~?RT|?t0prVxQ(~^Qtmhfoc!y3W?jVTyHK`*5AtAhjIuI8a7Y1YuL~};t zVyaB$%les>C+ZFV#>)ai5#_o|o_ah=%i~O_HM$^t$<9+#89zW&=!)ZoOiX!j?LCRl z90B`h{^JC+h|>q|Yt8>4bE>9<3M4`++R)c3$d(;`x?VEf;M1& literal 0 HcmV?d00001