From 14786641099f3d9c5e23e264089e21fa7ca6427b Mon Sep 17 00:00:00 2001 From: Bob Date: Thu, 31 Mar 2022 22:54:10 +0200 Subject: [PATCH] fixed mappings and broken textures --- src/main/java/com/hbm/blocks/ModBlocks.java | 4 + .../blocks/generic/BlockMotherOfAllOres.java | 229 +++++++++++++++++- .../java/com/hbm/items/tool/ItemWandD.java | 13 +- src/main/java/com/hbm/lib/HbmWorldGen.java | 7 + src/main/java/com/hbm/lib/Library.java | 1 + src/main/java/com/hbm/main/MainRegistry.java | 3 + src/main/java/com/hbm/main/NEIConfig.java | 35 +++ .../render/block/RenderBlockMultipass.java | 61 +++++ .../java/com/hbm/render/model/ModelM65.java | 36 ++- .../render/util/RenderAccessoryUtility.java | 4 + .../java/com/hbm/tileentity/TileMappings.java | 3 + src/main/java/com/hbm/util/ColorUtil.java | 6 +- src/main/resources/assets/hbm/lang/de_DE.lang | 2 + src/main/resources/assets/hbm/lang/en_US.lang | 2 + .../assets/hbm/textures/blocks/ore_cobalt.png | Bin 326 -> 593 bytes .../assets/hbm/textures/blocks/ore_copper.png | Bin 229 -> 527 bytes .../hbm/textures/models/capes/CapePheo.png | Bin 0 -> 16324 bytes 17 files changed, 378 insertions(+), 28 deletions(-) create mode 100644 src/main/resources/assets/hbm/textures/models/capes/CapePheo.png diff --git a/src/main/java/com/hbm/blocks/ModBlocks.java b/src/main/java/com/hbm/blocks/ModBlocks.java index 4e768e7ed..ec06e13b4 100644 --- a/src/main/java/com/hbm/blocks/ModBlocks.java +++ b/src/main/java/com/hbm/blocks/ModBlocks.java @@ -2,6 +2,7 @@ package com.hbm.blocks; import com.hbm.blocks.generic.*; import com.hbm.blocks.generic.BlockHazard.ExtDisplayEffect; +import com.hbm.blocks.generic.BlockMotherOfAllOres.ItemRandomOreBlock; import com.hbm.blocks.bomb.*; import com.hbm.blocks.fluid.*; import com.hbm.blocks.gas.*; @@ -2399,6 +2400,9 @@ public class ModBlocks { //End Ores GameRegistry.registerBlock(ore_tikite, ore_tikite.getUnlocalizedName()); + //It's a meme you dip + GameRegistry.registerBlock(ore_random, ItemRandomOreBlock.class, ore_random.getUnlocalizedName()); + //Crystals GameRegistry.registerBlock(crystal_power, crystal_power.getUnlocalizedName()); GameRegistry.registerBlock(crystal_energy, crystal_energy.getUnlocalizedName()); diff --git a/src/main/java/com/hbm/blocks/generic/BlockMotherOfAllOres.java b/src/main/java/com/hbm/blocks/generic/BlockMotherOfAllOres.java index 6a093fe80..830aef77b 100644 --- a/src/main/java/com/hbm/blocks/generic/BlockMotherOfAllOres.java +++ b/src/main/java/com/hbm/blocks/generic/BlockMotherOfAllOres.java @@ -1,28 +1,59 @@ package com.hbm.blocks.generic; +import java.awt.Color; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Random; + +import com.google.common.collect.HashBiMap; import com.hbm.blocks.IBlockMultiPass; +import com.hbm.blocks.ModBlocks; import com.hbm.inventory.RecipesCommon.ComparableStack; +import com.hbm.items.ModItems; import com.hbm.lib.RefStrings; import com.hbm.render.block.RenderBlockMultipass; +import com.hbm.util.ColorUtil; +import com.hbm.util.I18nUtil; 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.texture.IIconRegister; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.EntityLivingBase; import net.minecraft.init.Blocks; +import net.minecraft.item.Item; +import net.minecraft.item.ItemBlock; 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.IIcon; import net.minecraft.util.MovingObjectPosition; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; +import net.minecraftforge.oredict.OreDictionary; public class BlockMotherOfAllOres extends BlockContainer implements IBlockMultiPass { + + public static int override = -1; + + public static void shuffleOverride(Random rand) { + override = rand.nextInt(uniqueItems.size()); + } + + public static void resetOverride() { + override = -1; + } public BlockMotherOfAllOres() { super(Material.rock); - this.blockIcon = Blocks.stone.getIcon(0, 0); + this.setBlockTextureName("stone"); } @Override @@ -30,16 +61,54 @@ public class BlockMotherOfAllOres extends BlockContainer implements IBlockMultiP return new TileEntityRandomOre(); } + @Override + @SideOnly(Side.CLIENT) + public void getSubBlocks(Item item, CreativeTabs tab, List list) { + + for(int i = 0; i < uniqueItems.size(); i++) + list.add(new ItemStack(item, 1, i)); + } + @Override public ItemStack getPickBlock(MovingObjectPosition target, World world, int x, int y, int z) { TileEntity te = world.getTileEntity(x, y, z); if(te instanceof TileEntityRandomOre) { - return ((TileEntityRandomOre) te).getStack().copy(); + TileEntityRandomOre ore = (TileEntityRandomOre) te; + return new ItemStack(this, 1, ore.getStackId()); } - return super.getPickBlock(target, world, x, y, z); + return new ItemStack(ModItems.nothing); + } + + @Override + public ArrayList getDrops(World world, int x, int y, int z, int metadata, int fortune) { + ArrayList ret = new ArrayList(); + + if(fortune == 0xFECE00) { + TileEntity te = world.getTileEntity(x, y, z); + + if(te instanceof TileEntityRandomOre) { + TileEntityRandomOre ore = (TileEntityRandomOre) te; + ComparableStack item = ore.getCompStack(); + ret.add(item.toStack()); + } + } + + return ret; + } + + + @Override + public void breakBlock(World world, int x, int y, int z, Block block, int meta) { + this.dropBlockAsItemWithChance(world, x, y, z, meta, 1, 0xFECE00); + } + + @Override + public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase entity, ItemStack stack) { + ((TileEntityRandomOre)world.getTileEntity(x, y, z)).setItem(stack.getItemDamage()); + world.markBlockForUpdate(x, y, z); } @Override @@ -57,6 +126,8 @@ public class BlockMotherOfAllOres extends BlockContainer implements IBlockMultiP @Override @SideOnly(Side.CLIENT) public void registerBlockIcons(IIconRegister reg) { + + this.blockIcon = reg.registerIcon("stone"); for(int i = 0; i < overlays.length; i++) { overlays[i] = reg.registerIcon(RefStrings.MODID + ":ore_random_" + (i + 1)); } @@ -67,22 +138,27 @@ public class BlockMotherOfAllOres extends BlockContainer implements IBlockMultiP public IIcon getIcon(IBlockAccess world, int x, int y, int z, int side) { if(RenderBlockMultipass.currentPass == 0) - return this.blockIcon; + return Blocks.stone.getIcon(0, 0); TileEntity te = world.getTileEntity(x, y, z); if(te instanceof TileEntityRandomOre) { TileEntityRandomOre ore = (TileEntityRandomOre) te; - ItemStack item = ore.getStack(); - - if(item != null) { - ComparableStack stack = new ComparableStack(item); - int index = stack.hashCode() % overlays.length; - return overlays[index]; - } + int index = ore.getStackId() % overlays.length; + return overlays[index]; } + + return Blocks.stone.getIcon(0, 0); + } + + @SideOnly(Side.CLIENT) + public IIcon getIcon(int side, int meta) { + + if(RenderBlockMultipass.currentPass == 0) + return Blocks.stone.getIcon(0, 0); - return this.getIcon(side, world.getBlockMetadata(x, y, z)); + int index = meta % overlays.length; + return overlays[index]; } @Override @@ -91,19 +167,146 @@ public class BlockMotherOfAllOres extends BlockContainer implements IBlockMultiP if(RenderBlockMultipass.currentPass == 0) return 0xffffff; + + TileEntity te = world.getTileEntity(x, y, z); + + if(te instanceof TileEntityRandomOre) { + TileEntityRandomOre ore = (TileEntityRandomOre) te; + ItemStack stack = ore.getStack(); + int color = ColorUtil.getAverageColorFromStack(stack); + color = ColorUtil.amplifyColor(color); + + Color col = new Color(color); + int r = col.getRed(); + int g = col.getGreen(); + int b = col.getBlue(); + + float[] hsb = new Color(color).RGBtoHSB(r, g, b, new float[3]); + + if(hsb[1] > 0F && hsb[1] < 0.75F) + hsb[1] = 0.75F; + + color = Color.HSBtoRGB(hsb[0], hsb[1], hsb[2]); + + return color; + } return super.colorMultiplier(world, x, y, z); } public static class TileEntityRandomOre extends TileEntity { + private ComparableStack stack; + + public TileEntityRandomOre() { + if(override != -1) { + setItem(override); + } + } + + public void setItem(int id) { + ComparableStack comp = itemMap.get(id); + this.stack = comp != null ? ((ComparableStack) comp.copy()) : null; + + if(this.worldObj != null) + this.worldObj.markTileEntityChunkModified(this.xCoord, this.yCoord, this.zCoord, this); + } + + public int getStackId() { + return itemMap.inverse().get(getCompStack()); + } + public ItemStack getStack() { - return new ItemStack(Blocks.dirt); + return getCompStack().toStack(); + } + + public ComparableStack getCompStack() { + + if(stack == null) { + int rand = worldObj.rand.nextInt(uniqueItems.size()); + stack = (ComparableStack) itemMap.get(rand).copy(); + this.worldObj.markTileEntityChunkModified(this.xCoord, this.yCoord, this.zCoord, this); + } + + return stack != null ? stack : new ComparableStack(ModItems.nothing); } @Override public boolean canUpdate() { return false; } + + @Override + public void readFromNBT(NBTTagCompound nbt) { + super.readFromNBT(nbt); + int key = nbt.getInteger("item"); + this.setItem(key); + } + + @Override + public void writeToNBT(NBTTagCompound nbt) { + super.writeToNBT(nbt); + int key = itemMap.inverse().get(getCompStack()); + nbt.setInteger("item", key); + } + + @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()); + } + } + + public static class ItemRandomOreBlock extends ItemBlock { + + public ItemRandomOreBlock(Block block) { + super(block); + this.setHasSubtypes(true); + this.setMaxDamage(0); + } + + @Override + public String getItemStackDisplayName(ItemStack stack) { + ComparableStack comp = itemMap.get(stack.getItemDamage()); + ItemStack name = comp != null ? comp.toStack() : new ItemStack(ModItems.nothing); + if(name.getItemDamage() == OreDictionary.WILDCARD_VALUE) { + name.setItemDamage(0); + } + return I18nUtil.resolveKey(this.getUnlocalizedName() + ".name", name.getItem().getItemStackDisplayName(name)); + } + } + + public static HashSet uniqueItems = new HashSet(); + public static HashBiMap itemMap = HashBiMap.create(); + + public static void init() { + + for(Object b : Block.blockRegistry.getKeys()) { + Block block = Block.getBlockFromName((String) b); + if(block != null) + uniqueItems.add(new ComparableStack(block)); + } + + for(Object i : Item.itemRegistry.getKeys()) { + Item item = (Item) Item.itemRegistry.getObject((String) i); + uniqueItems.add(new ComparableStack(item)); + } + + for(String i : OreDictionary.getOreNames()) { + for(ItemStack stack : OreDictionary.getOres(i)) { + uniqueItems.add(new ComparableStack(stack)); + } + } + + int i = 0; + for(ComparableStack stack : uniqueItems) { + itemMap.put(i++, stack); + } } } diff --git a/src/main/java/com/hbm/items/tool/ItemWandD.java b/src/main/java/com/hbm/items/tool/ItemWandD.java index dd61128ba..3faa74be1 100644 --- a/src/main/java/com/hbm/items/tool/ItemWandD.java +++ b/src/main/java/com/hbm/items/tool/ItemWandD.java @@ -9,9 +9,11 @@ import com.hbm.lib.Library; import net.minecraft.entity.EntityLiving; import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.monster.EntityZombie; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; +import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.MovingObjectPosition; import net.minecraft.world.World; @@ -27,10 +29,17 @@ public class ItemWandD extends Item { if(pos != null) { - EntitySiegeTunneler tunneler = new EntitySiegeTunneler(world); + List zombies = world.getEntitiesWithinAABB(EntityZombie.class, AxisAlignedBB.getBoundingBox(pos.blockX - 2, pos.blockY - 2, pos.blockZ - 2, pos.blockX + 2, pos.blockY + 2, pos.blockZ + 2)); + + for(EntityZombie zombie : zombies) { + zombie.setChild(true); + zombie.setCurrentItemOrArmor(4, new ItemStack(ModItems.gas_mask_m65)); + } + + /*EntitySiegeTunneler tunneler = new EntitySiegeTunneler(world); tunneler.setPosition(pos.blockX, pos.blockY + 1, pos.blockZ); tunneler.onSpawnWithEgg(null); - world.spawnEntityInWorld(tunneler); + world.spawnEntityInWorld(tunneler);*/ //CellularDungeonFactory.meteor.generate(world, x, y, z, world.rand); diff --git a/src/main/java/com/hbm/lib/HbmWorldGen.java b/src/main/java/com/hbm/lib/HbmWorldGen.java index a5442ede4..db42ab6e0 100644 --- a/src/main/java/com/hbm/lib/HbmWorldGen.java +++ b/src/main/java/com/hbm/lib/HbmWorldGen.java @@ -3,6 +3,7 @@ package com.hbm.lib; import java.util.Random; import com.hbm.blocks.ModBlocks; +import com.hbm.blocks.generic.BlockMotherOfAllOres; import com.hbm.config.GeneralConfig; import com.hbm.config.WorldConfig; import com.hbm.items.ModItems; @@ -116,6 +117,12 @@ public class HbmWorldGen implements IWorldGenerator { DungeonToolbox.generateOre(world, rand, i, j, WorldConfig.titaniumClusterSpawn, 6, 15, 30, ModBlocks.cluster_titanium); DungeonToolbox.generateOre(world, rand, i, j, WorldConfig.aluminiumClusterSpawn, 6, 15, 35, ModBlocks.cluster_aluminium); DungeonToolbox.generateOre(world, rand, i, j, WorldConfig.copperClusterSpawn, 6, 15, 20, ModBlocks.cluster_copper); + + for(int k = 0; k < 16; k++) { + BlockMotherOfAllOres.shuffleOverride(rand); + DungeonToolbox.generateOre(world, rand, i, j, 1, 10, 4, 30, ModBlocks.ore_random); + } + BlockMotherOfAllOres.resetOverride(); if(GeneralConfig.enable528ColtanSpawn) { DungeonToolbox.generateOre(world, rand, i, j, GeneralConfig.coltanRate, 4, 15, 40, ModBlocks.ore_coltan); diff --git a/src/main/java/com/hbm/lib/Library.java b/src/main/java/com/hbm/lib/Library.java index 483b0368b..72ad14fd5 100644 --- a/src/main/java/com/hbm/lib/Library.java +++ b/src/main/java/com/hbm/lib/Library.java @@ -74,6 +74,7 @@ public class Library { public static String SolsticeUnlimitd = "f5574fd2-ec28-4927-9d11-3c0c731771f4"; public static String FrizzleFrazzle = "fc4cc2ee-12e8-4097-b26a-1c6cb1b96531"; public static String the_NCR = "28ae585f-4431-4491-9ce8-3def6126e3c6"; + public static String Barnaby99_x = "711aaf78-a862-4b7e-921a-216349716e9a"; public static Set contributors = Sets.newHashSet(new String[] { "06ab7c03-55ce-43f8-9d3c-2850e3c652de", //mustang_rudolf diff --git a/src/main/java/com/hbm/main/MainRegistry.java b/src/main/java/com/hbm/main/MainRegistry.java index 0297c2d0a..90313f632 100644 --- a/src/main/java/com/hbm/main/MainRegistry.java +++ b/src/main/java/com/hbm/main/MainRegistry.java @@ -38,6 +38,7 @@ import org.apache.logging.log4j.Logger; import com.google.common.collect.ImmutableList; import com.hbm.blocks.ModBlocks; +import com.hbm.blocks.generic.BlockMotherOfAllOres; import com.hbm.config.*; import com.hbm.creativetabs.*; import com.hbm.entity.effect.*; @@ -972,6 +973,8 @@ public class MainRegistry { proxy.registerMissileItems(); + BlockMotherOfAllOres.init(); + //expand for the largest entity we have (currently Quackos who is 17.5m in diameter, that's one fat duck) World.MAX_ENTITY_RADIUS = Math.max(World.MAX_ENTITY_RADIUS, 8.75); diff --git a/src/main/java/com/hbm/main/NEIConfig.java b/src/main/java/com/hbm/main/NEIConfig.java index 1d57eeb24..0b79f4212 100644 --- a/src/main/java/com/hbm/main/NEIConfig.java +++ b/src/main/java/com/hbm/main/NEIConfig.java @@ -1,6 +1,9 @@ package com.hbm.main; +import java.util.List; + import com.hbm.blocks.ModBlocks; +import com.hbm.blocks.generic.BlockMotherOfAllOres.TileEntityRandomOre; import com.hbm.config.VersatileConfig; import com.hbm.handler.nei.*; import com.hbm.items.ModItems; @@ -9,7 +12,14 @@ import com.hbm.lib.RefStrings; import codechicken.nei.api.API; import codechicken.nei.api.IConfigureNEI; +import codechicken.nei.api.IHighlightHandler; +import codechicken.nei.api.ItemInfo.Layout; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Items; import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.world.World; public class NEIConfig implements IConfigureNEI { @@ -139,6 +149,31 @@ public class NEIConfig implements IConfigureNEI { API.hideItem(new ItemStack(ModBlocks.pink_slab)); API.hideItem(new ItemStack(ModBlocks.pink_double_slab)); API.hideItem(new ItemStack(ModBlocks.pink_stairs)); + + API.registerHighlightIdentifier(ModBlocks.ore_random, new IHighlightHandler() { + + @Override + public ItemStack identifyHighlight(World world, EntityPlayer player, MovingObjectPosition mop) { + int x = mop.blockX; + int y = mop.blockY; + int z = mop.blockZ; + + TileEntity te = world.getTileEntity(x, y, z); + + if(te instanceof TileEntityRandomOre) { + TileEntityRandomOre ore = (TileEntityRandomOre) te; + return new ItemStack(ModBlocks.ore_random, 1, ore.getStackId()); + } + + return null; + } + + @Override + public List handleTextData(ItemStack itemStack, World world, EntityPlayer player, MovingObjectPosition mop, List currenttip, Layout layout) { + return currenttip; + } + + }); } @Override diff --git a/src/main/java/com/hbm/render/block/RenderBlockMultipass.java b/src/main/java/com/hbm/render/block/RenderBlockMultipass.java index 9a3e26d03..d408dd0eb 100644 --- a/src/main/java/com/hbm/render/block/RenderBlockMultipass.java +++ b/src/main/java/com/hbm/render/block/RenderBlockMultipass.java @@ -1,13 +1,21 @@ package com.hbm.render.block; +import java.awt.Color; + import org.lwjgl.opengl.GL11; import com.hbm.blocks.IBlockMultiPass; +import com.hbm.blocks.ModBlocks; +import com.hbm.blocks.generic.BlockMotherOfAllOres; +import com.hbm.inventory.RecipesCommon.ComparableStack; +import com.hbm.items.ModItems; +import com.hbm.util.ColorUtil; import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler; import net.minecraft.block.Block; import net.minecraft.client.renderer.RenderBlocks; import net.minecraft.client.renderer.Tessellator; +import net.minecraft.item.ItemStack; import net.minecraft.world.IBlockAccess; public class RenderBlockMultipass implements ISimpleBlockRenderingHandler { @@ -59,6 +67,59 @@ public class RenderBlockMultipass implements ISimpleBlockRenderingHandler { renderer.renderFaceXPos(block, 0.0D, 0.0D, 0.0D, renderer.getBlockIconFromSideAndMetadata(block, 5, metadata)); tessellator.draw(); + if(block == ModBlocks.ore_random) { + + this.currentPass = 1; + renderer.setOverrideBlockTexture(block.getIcon(0, metadata)); + this.currentPass = 0; + ComparableStack stack = BlockMotherOfAllOres.itemMap.get(metadata); + int color = ColorUtil.getAverageColorFromStack(stack != null ? stack.toStack() : new ItemStack(ModItems.nothing)); + color = ColorUtil.amplifyColor(color); + + Color col = new Color(color); + int r = col.getRed(); + int g = col.getGreen(); + int b = col.getBlue(); + + float[] hsb = new Color(color).RGBtoHSB(r, g, b, new float[3]); + + if(hsb[1] > 0F && hsb[1] < 0.75F) + hsb[1] = 0.75F; + + color = Color.HSBtoRGB(hsb[0], hsb[1], hsb[2]); + col = new Color(color); + + GL11.glColor3f(col.getRed() / 255F, col.getGreen() / 255F, col.getBlue() / 255F); + + tessellator.startDrawingQuads(); + tessellator.setNormal(0.0F, -1.0F, 0.0F); + renderer.renderFaceYNeg(block, 0.0D, 0.0D, 0.0D, renderer.getBlockIconFromSideAndMetadata(block, 0, metadata)); + tessellator.draw(); + tessellator.startDrawingQuads(); + tessellator.setNormal(0.0F, 1.0F, 0.0F); + renderer.renderFaceYPos(block, 0.0D, 0.0D, 0.0D, renderer.getBlockIconFromSideAndMetadata(block, 1, metadata)); + tessellator.draw(); + tessellator.startDrawingQuads(); + tessellator.setNormal(0.0F, 0.0F, -1.0F); + renderer.renderFaceZNeg(block, 0.0D, 0.0D, 0.0D, renderer.getBlockIconFromSideAndMetadata(block, 2, metadata)); + tessellator.draw(); + tessellator.startDrawingQuads(); + tessellator.setNormal(0.0F, 0.0F, 1.0F); + renderer.renderFaceZPos(block, 0.0D, 0.0D, 0.0D, renderer.getBlockIconFromSideAndMetadata(block, 3, metadata)); + tessellator.draw(); + tessellator.startDrawingQuads(); + tessellator.setNormal(-1.0F, 0.0F, 0.0F); + renderer.renderFaceXNeg(block, 0.0D, 0.0D, 0.0D, renderer.getBlockIconFromSideAndMetadata(block, 4, metadata)); + tessellator.draw(); + tessellator.startDrawingQuads(); + tessellator.setNormal(1.0F, 0.0F, 0.0F); + renderer.renderFaceXPos(block, 0.0D, 0.0D, 0.0D, renderer.getBlockIconFromSideAndMetadata(block, 5, metadata)); + tessellator.draw(); + + renderer.clearOverrideBlockTexture(); + GL11.glColor3f(1F, 1F, 1F); + } + GL11.glTranslatef(0.5F, 0.5F, 0.5F); } diff --git a/src/main/java/com/hbm/render/model/ModelM65.java b/src/main/java/com/hbm/render/model/ModelM65.java index c1eaaab90..d61b13d43 100644 --- a/src/main/java/com/hbm/render/model/ModelM65.java +++ b/src/main/java/com/hbm/render/model/ModelM65.java @@ -126,17 +126,33 @@ public class ModelM65 extends ModelBiped { @Override public void render(Entity entity, float par2, float par3, float par4, float par5, float par6, float par7) { setRotationAngles(par2, par3, par4, par5, par6, par7, entity); - GL11.glPushMatrix(); - double d = 1D / 16D * 18D; - //GL11.glTranslated(0, 1/16D, 0); - GL11.glScaled(d, d, d); - GL11.glScaled(1.01D, 1.01D, 1.01D); - this.mask.render(par7); - if(!(entity instanceof EntityLivingBase) || ArmorUtil.getGasMaskFilterRecursively(((EntityLivingBase)entity).getEquipmentInSlot(4), (EntityLivingBase)entity) != null) - this.filter.render(par7); - - GL11.glPopMatrix(); + if(this.isChild) { + float f6 = 2.0F; + GL11.glPushMatrix(); + GL11.glScalef(1.5F / f6, 1.5F / f6, 1.5F / f6); + GL11.glTranslatef(0.0F, 16.0F * par7, 0.0F); + double d = 1D / 16D * 18D; + GL11.glScaled(d, d, d); + GL11.glScaled(1.01D, 1.01D, 1.01D); + this.mask.render(par7); + + if(!(entity instanceof EntityLivingBase) || ArmorUtil.getGasMaskFilterRecursively(((EntityLivingBase)entity).getEquipmentInSlot(4), (EntityLivingBase)entity) != null) + this.filter.render(par7); + + GL11.glPopMatrix(); + } else { + GL11.glPushMatrix(); + double d = 1D / 16D * 18D; + GL11.glScaled(d, d, d); + GL11.glScaled(1.01D, 1.01D, 1.01D); + this.mask.render(par7); + + if(!(entity instanceof EntityLivingBase) || ArmorUtil.getGasMaskFilterRecursively(((EntityLivingBase)entity).getEquipmentInSlot(4), (EntityLivingBase)entity) != null) + this.filter.render(par7); + + GL11.glPopMatrix(); + } } private void setRotation(ModelRenderer model, float x, float y, float z) { diff --git a/src/main/java/com/hbm/render/util/RenderAccessoryUtility.java b/src/main/java/com/hbm/render/util/RenderAccessoryUtility.java index 7103eebad..b0d165e51 100644 --- a/src/main/java/com/hbm/render/util/RenderAccessoryUtility.java +++ b/src/main/java/com/hbm/render/util/RenderAccessoryUtility.java @@ -41,6 +41,7 @@ public class RenderAccessoryUtility { private static ResourceLocation rightnugget = new ResourceLocation(RefStrings.MODID + ":textures/models/capes/CapeRightNugget.png"); private static ResourceLocation tankish = new ResourceLocation(RefStrings.MODID + ":textures/models/capes/CapeTankish.png"); private static ResourceLocation frizzlefrazzle = new ResourceLocation(RefStrings.MODID + ":textures/models/capes/CapeFrizzleFrazzle.png"); + private static ResourceLocation pheo = new ResourceLocation(RefStrings.MODID + ":textures/models/capes/CapePheo.png"); public static ResourceLocation getCloakFromPlayer(EntityPlayer player) { @@ -111,6 +112,9 @@ public class RenderAccessoryUtility { if(uuid.equals(Library.FrizzleFrazzle)) { return frizzlefrazzle; } + if(uuid.equals(Library.Barnaby99_x)) { + return pheo; + } if(Library.contributors.contains(uuid)) { return wiki; } diff --git a/src/main/java/com/hbm/tileentity/TileMappings.java b/src/main/java/com/hbm/tileentity/TileMappings.java index 3b044c1ea..ca2701011 100644 --- a/src/main/java/com/hbm/tileentity/TileMappings.java +++ b/src/main/java/com/hbm/tileentity/TileMappings.java @@ -5,6 +5,7 @@ import java.util.HashMap; import com.hbm.blocks.generic.BlockBobble.TileEntityBobble; import com.hbm.blocks.generic.BlockEmitter.TileEntityEmitter; import com.hbm.blocks.generic.BlockLoot.TileEntityLoot; +import com.hbm.blocks.generic.BlockMotherOfAllOres.TileEntityRandomOre; import com.hbm.blocks.network.CableDiode.TileEntityDiode; import com.hbm.tileentity.bomb.*; import com.hbm.tileentity.conductor.*; @@ -199,6 +200,8 @@ public class TileMappings { put(TileEntityProxyEnergy.class, "tileentity_proxy_power"); put(TileEntityProxyCombo.class, "tileentity_proxy_combo"); put(TileEntityProxyConductor.class, "tileentity_proxy_conductor"); + + put(TileEntityRandomOre.class, "tileentity_mother_of_all_ores"); putNetwork(); putBombs(); diff --git a/src/main/java/com/hbm/util/ColorUtil.java b/src/main/java/com/hbm/util/ColorUtil.java index 60779593e..1cfcfe039 100644 --- a/src/main/java/com/hbm/util/ColorUtil.java +++ b/src/main/java/com/hbm/util/ColorUtil.java @@ -63,7 +63,7 @@ public class ColorUtil { int avgG = g / pixels; int avgB = b / pixels; - return (r << 16) | (g << 8) | b; + return (avgR << 16) | (avgG << 8) | avgB; } catch(Exception ex) { return 0xFFFFFF; @@ -122,7 +122,7 @@ public class ColorUtil { if(b / r > 1.5) return true; if(b / g > 1.5) return true;*/ - float[] hsb = Color.RGBtoHSB(color.getRed(), color.getGreen(), color.getBlue(), new float[0]); + float[] hsb = Color.RGBtoHSB(color.getRed(), color.getGreen(), color.getBlue(), new float[3]); // saturation brightness return hsb[1] > 0.25 && hsb[2] > 0.25; @@ -139,7 +139,7 @@ public class ColorUtil { int r = color.getRed(); int g = color.getGreen(); int b = color.getBlue(); - int max = Math.max(r, Math.max(g, b)); + int max = Math.max(Math.max(1, r), Math.max(g, b)); r = r * limit / max; g = g * limit / max; diff --git a/src/main/resources/assets/hbm/lang/de_DE.lang b/src/main/resources/assets/hbm/lang/de_DE.lang index 2e0bdc918..c02f5c7e4 100644 --- a/src/main/resources/assets/hbm/lang/de_DE.lang +++ b/src/main/resources/assets/hbm/lang/de_DE.lang @@ -947,6 +947,7 @@ item.can_empty.name=Leere Dose item.can_key.name=Dosenschlüssel item.can_luna.name=Black Mesa Luna - Dark Cola item.can_mrsugar.name='Dr. Sugar' Softdrink +item.can_mug.name=MUG Root Beer item.can_overcharge.name=Overcharge Delirium XT item.can_redbomb.name='Red Bomb' Energy-Drink item.can_smart.name='Smart' Energy-Drink @@ -3446,6 +3447,7 @@ tile.ore_niter.name=Salpetererz tile.ore_oil.name=Ölvorkommen tile.ore_oil_empty.name=Leeres Ölvorkommen tile.ore_oil_sand.name=Teersand +tile.ore_random.name=%s-Erz tile.ore_rare.name=Seltenerden-Erz tile.ore_reiium.name=Reiit tile.ore_schrabidium.name=Schrabidiumerz diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index 78a4494a2..6891f4595 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -1157,6 +1157,7 @@ item.can_empty.name=Empty Can item.can_key.name=Winding Key item.can_luna.name=Black Mesa Luna - Dark Cola item.can_mrsugar.name='Dr. Sugar' Soft Drink +item.can_mug.name=MUG Root Beer item.can_overcharge.name=Overcharge Delirium XT item.can_redbomb.name='Red Bomb' Energy Drink item.can_smart.name='Smart' Energy Drink @@ -3819,6 +3820,7 @@ tile.ore_niter.name=Niter Ore tile.ore_oil.name=Oil Deposit tile.ore_oil_empty.name=Empty Oil Deposit tile.ore_oil_sand.name=Tar Sand +tile.ore_random.name=%s Ore tile.ore_rare.name=Rare Earth Ore tile.ore_reiium.name=Reiite tile.ore_schrabidium.name=Schrabidium Ore diff --git a/src/main/resources/assets/hbm/textures/blocks/ore_cobalt.png b/src/main/resources/assets/hbm/textures/blocks/ore_cobalt.png index 2553fad8480e107443760fcf1333db0a14afeca2..40dfc4cf09dbb0e0c44da24697e6f712bfee3426 100644 GIT binary patch delta 553 zcmV+^0@nS;0?`DJGk*dINkl_l#?+3l!cQ!T(tgTt5 zr>D8UzvtoMf!*EE+3LL&q)GissWJVz6l2V20wKhhHh--(T5I>fTFc?#Pj@eba7*>} z_V$K31HjD87v|>XXti3DN~ufe>s`H$xv!LROjA>z84Uh%dU^`L%?&gf(oM0j@Rc-8 zv9<*~+c<8`9e_*VC?AP)=<)Fv7Z(@QYRhg4AK>^nCI|x7*ZXfS@`c2*v@{BuwRRL` rYb~3bvm!v>F@<6HpYF-uIS2j+U9tW#5B2}H00000NkvXXu0mjf!etX# delta 284 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 literal 0 HcmV?d00001