From bfb1334b49657bba2ab3bb294d342f0f805fbaaa Mon Sep 17 00:00:00 2001 From: Bob Date: Sun, 7 May 2023 01:36:59 +0200 Subject: [PATCH] random shit, go! --- src/main/java/com/hbm/blocks/BlockEnums.java | 5 + src/main/java/com/hbm/blocks/ModBlocks.java | 11 +- .../hbm/blocks/generic/BlockBiomeStone.java | 53 ++++++++ .../com/hbm/blocks/generic/BlockSlag.java | 32 +++++ .../java/com/hbm/entity/EntityMappings.java | 32 +++++ .../com/hbm/entity/mob/EntityCreeperGold.java | 36 +++++ .../hbm/entity/mob/EntityCreeperVolatile.java | 36 +++++ .../hbm/explosion/vanillant/ExplosionVNT.java | 8 +- .../vanillant/interfaces/IBlockMutator.java | 5 +- .../standard/BlockAllocatorBulkie.java | 89 +++++++++++++ .../standard/BlockMutatorBulkie.java | 32 +++++ .../standard/BlockProcessorStandard.java | 3 +- .../java/com/hbm/items/tool/ItemWandD.java | 17 +++ src/main/java/com/hbm/main/ClientProxy.java | 2 + src/main/java/com/hbm/main/MainRegistry.java | 1 + .../java/com/hbm/world/feature/BiomeCave.java | 126 ++++++++++++++++++ .../hbm/textures/blocks/block_slag_broken.png | Bin 0 -> 792 bytes .../textures/blocks/stone_biome.woodland.png | Bin 0 -> 704 bytes .../blocks/stone_biome_layer.woodland.png | Bin 0 -> 765 bytes .../blocks/stone_biome_top.woodland.png | Bin 0 -> 790 bytes .../hbm/textures/blocks/stone_deep_base.png | Bin 0 -> 497 bytes .../hbm/textures/entity/creeper_gold.png | Bin 0 -> 3063 bytes .../hbm/textures/entity/creeper_volatile.png | Bin 0 -> 3107 bytes 23 files changed, 478 insertions(+), 10 deletions(-) create mode 100644 src/main/java/com/hbm/blocks/generic/BlockBiomeStone.java create mode 100644 src/main/java/com/hbm/blocks/generic/BlockSlag.java create mode 100644 src/main/java/com/hbm/entity/mob/EntityCreeperGold.java create mode 100644 src/main/java/com/hbm/entity/mob/EntityCreeperVolatile.java create mode 100644 src/main/java/com/hbm/explosion/vanillant/standard/BlockAllocatorBulkie.java create mode 100644 src/main/java/com/hbm/explosion/vanillant/standard/BlockMutatorBulkie.java create mode 100644 src/main/java/com/hbm/world/feature/BiomeCave.java create mode 100644 src/main/resources/assets/hbm/textures/blocks/block_slag_broken.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/stone_biome.woodland.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/stone_biome_layer.woodland.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/stone_biome_top.woodland.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/stone_deep_base.png create mode 100644 src/main/resources/assets/hbm/textures/entity/creeper_gold.png create mode 100644 src/main/resources/assets/hbm/textures/entity/creeper_volatile.png diff --git a/src/main/java/com/hbm/blocks/BlockEnums.java b/src/main/java/com/hbm/blocks/BlockEnums.java index 99d7edadf..5a8e89122 100644 --- a/src/main/java/com/hbm/blocks/BlockEnums.java +++ b/src/main/java/com/hbm/blocks/BlockEnums.java @@ -10,6 +10,11 @@ public class BlockEnums { LIMESTONE } + public static enum EnumBiomeType { + DESERT, + WOODLAND + } + public static enum EnumStalagmiteType { SULFUR, ASBESTOS diff --git a/src/main/java/com/hbm/blocks/ModBlocks.java b/src/main/java/com/hbm/blocks/ModBlocks.java index fe53bd84c..0a0df5800 100644 --- a/src/main/java/com/hbm/blocks/ModBlocks.java +++ b/src/main/java/com/hbm/blocks/ModBlocks.java @@ -138,6 +138,7 @@ public class ModBlocks { public static Block stone_resource; public static Block stalagmite; public static Block stalactite; + public static Block stone_biome; public static Block stone_deep_cobble; public static Block depth_brick; @@ -1318,6 +1319,7 @@ public class ModBlocks { stone_resource = new BlockResourceStone().setBlockName("stone_resource").setCreativeTab(MainRegistry.blockTab).setHardness(5.0F).setResistance(10.0F); stalagmite = new BlockStalagmite().setBlockName("stalagmite").setCreativeTab(MainRegistry.blockTab).setHardness(0.5F).setResistance(2.0F); stalactite = new BlockStalagmite().setBlockName("stalactite").setCreativeTab(MainRegistry.blockTab).setHardness(0.5F).setResistance(2.0F); + stone_biome = new BlockBiomeStone().setBlockName("stone_biome").setCreativeTab(MainRegistry.blockTab).setHardness(5.0F).setResistance(10.0F); stone_deep_cobble = new BlockDeepCobble().setBlockName("stone_deep_cobble").setCreativeTab(MainRegistry.blockTab).setHardness(5.0F).setResistance(30.0F); basalt = new BlockGeneric(Material.rock).setBlockName("basalt").setCreativeTab(MainRegistry.blockTab).setHardness(5.0F).setResistance(10.0F).setBlockTextureName(RefStrings.MODID + ":basalt"); @@ -1443,7 +1445,7 @@ public class ModBlocks { block_semtex = new BlockPlasticExplosive(Material.tnt).setBlockName("block_semtex").setCreativeTab(MainRegistry.blockTab).setStepSound(Block.soundTypeMetal).setHardness(2.0F).setResistance(2.0F).setBlockTextureName(RefStrings.MODID + ":block_semtex"); block_c4 = new BlockPlasticExplosive(Material.tnt).setBlockName("block_c4").setCreativeTab(MainRegistry.blockTab).setStepSound(Block.soundTypeMetal).setHardness(2.0F).setResistance(2.0F).setBlockTextureName(RefStrings.MODID + ":block_c4"); block_smore = new BlockPillar(Material.rock, RefStrings.MODID + ":block_smore_top").setBlockName("block_smore").setCreativeTab(MainRegistry.blockTab).setHardness(15.0F).setResistance(900.0F).setBlockTextureName(RefStrings.MODID + ":block_smore_side"); - block_slag = new BlockBeaconable(Material.iron).setBlockName("block_slag").setCreativeTab(MainRegistry.blockTab).setStepSound(Block.soundTypeMetal).setHardness(5.0F).setResistance(10.0F).setBlockTextureName(RefStrings.MODID + ":block_slag"); + block_slag = new BlockSlag(Material.rock).setBlockName("block_slag").setCreativeTab(MainRegistry.blockTab).setStepSound(Block.soundTypeStone).setHardness(5.0F).setResistance(10.0F).setBlockTextureName(RefStrings.MODID + ":block_slag"); block_australium = new BlockBeaconable(Material.iron).setBlockName("block_australium").setCreativeTab(MainRegistry.blockTab).setHardness(5.0F).setResistance(10.0F).setBlockTextureName(RefStrings.MODID + ":block_australium"); block_weidanium = new BlockBeaconable(Material.iron).setBlockName("block_weidanium").setCreativeTab(MainRegistry.blockTab).setHardness(5.0F).setResistance(10.0F).setBlockTextureName(RefStrings.MODID + ":block_weidanium"); @@ -2461,9 +2463,10 @@ public class ModBlocks { GameRegistry.registerBlock(crystal_trixite, crystal_trixite.getUnlocalizedName()); //Resource-bearing Stones - GameRegistry.registerBlock(stone_resource, ItemBlockBase.class, stone_resource.getUnlocalizedName()); - GameRegistry.registerBlock(stalagmite, ItemBlockBase.class, stalagmite.getUnlocalizedName()); - GameRegistry.registerBlock(stalactite, ItemBlockBase.class, stalactite.getUnlocalizedName()); + register(stone_resource); + register(stalagmite); + register(stalactite); + register(stone_biome); //Stone Variants GameRegistry.registerBlock(stone_porous, stone_porous.getUnlocalizedName()); diff --git a/src/main/java/com/hbm/blocks/generic/BlockBiomeStone.java b/src/main/java/com/hbm/blocks/generic/BlockBiomeStone.java new file mode 100644 index 000000000..a53cce92d --- /dev/null +++ b/src/main/java/com/hbm/blocks/generic/BlockBiomeStone.java @@ -0,0 +1,53 @@ +package com.hbm.blocks.generic; + +import com.hbm.blocks.BlockEnumMulti; +import com.hbm.blocks.BlockEnums.EnumBiomeType; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.util.IIcon; +import net.minecraft.world.IBlockAccess; + +public class BlockBiomeStone extends BlockEnumMulti { + + public BlockBiomeStone() { + super(Material.rock, EnumBiomeType.class, true, true); + } + + protected IIcon[] iconsTop; + protected IIcon[] iconsLayer; + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister reg) { + + Enum[] enums = theEnum.getEnumConstants(); + this.icons = new IIcon[enums.length]; + this.iconsTop = new IIcon[enums.length]; + this.iconsLayer = new IIcon[enums.length]; + + for(int i = 0; i < icons.length; i++) { + Enum num = enums[i]; + this.icons[i] = reg.registerIcon(this.getTextureName() + "." + num.name().toLowerCase()); + this.iconsTop[i] = reg.registerIcon(this.getTextureName() + "_top." + num.name().toLowerCase()); + this.iconsLayer[i] = reg.registerIcon(this.getTextureName() + "_layer." + num.name().toLowerCase()); + } + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIcon(IBlockAccess world, int x, int y, int z, int side) { + + int meta = world.getBlockMetadata(x, y, z); + if(side == 0) return this.iconsTop[meta % this.icons.length]; + if(side == 1) return this.iconsTop[meta % this.icons.length]; + + if(world.getBlock(x, y + 1, z) == this && world.getBlockMetadata(x, y + 1, z) == meta) { + return this.getIcon(side, meta); + } else { + return this.iconsLayer[meta % this.icons.length]; + } + } +} diff --git a/src/main/java/com/hbm/blocks/generic/BlockSlag.java b/src/main/java/com/hbm/blocks/generic/BlockSlag.java new file mode 100644 index 000000000..b18db55b1 --- /dev/null +++ b/src/main/java/com/hbm/blocks/generic/BlockSlag.java @@ -0,0 +1,32 @@ +package com.hbm.blocks.generic; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.util.IIcon; + +public class BlockSlag extends BlockBeaconable { + + @SideOnly(Side.CLIENT) + private IIcon iconAlt; + + public BlockSlag(Material mat) { + super(mat); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister iconRegister) { + super.registerBlockIcons(iconRegister); + this.iconAlt = iconRegister.registerIcon(this.getTextureName() + "_broken"); + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIcon(int side, int metadata) { + if(metadata == 1) return this.iconAlt; + + return this.blockIcon; + } +} diff --git a/src/main/java/com/hbm/entity/EntityMappings.java b/src/main/java/com/hbm/entity/EntityMappings.java index 844c470e9..23a8e70fd 100644 --- a/src/main/java/com/hbm/entity/EntityMappings.java +++ b/src/main/java/com/hbm/entity/EntityMappings.java @@ -20,6 +20,10 @@ import com.hbm.util.Tuple.Quartet; import cpw.mods.fml.common.registry.EntityRegistry; import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLiving; +import net.minecraft.entity.EnumCreatureType; +import net.minecraft.world.biome.BiomeGenBase; +import net.minecraft.world.biome.BiomeGenBase.SpawnListEntry; public class EntityMappings { @@ -211,6 +215,8 @@ public class EntityMappings { addMob(EntityCreeperNuclear.class, "entity_mob_nuclear_creeper", 0x204131, 0x75CE00); addMob(EntityCreeperTainted.class, "entity_mob_tainted_creeper", 0x813b9b, 0xd71fdd); addMob(EntityCreeperPhosgene.class, "entity_mob_phosgene_creeper", 0xE3D398, 0xB8A06B); + addMob(EntityCreeperVolatile.class, "entity_mob_volatile_creeper", 0xC28153, 0x4D382C); + addMob(EntityCreeperGold.class, "entity_mob_gold_creeper", 0xECC136, 0x9E8B3E); addMob(EntityHunterChopper.class, "entity_mob_hunter_chopper", 0x000020, 0x2D2D72); addMob(EntityCyberCrab.class, "entity_cyber_crab", 0xAAAAAA, 0x444444); addMob(EntityTeslaCrab.class, "entity_tesla_crab", 0xAAAAAA, 0x440000); @@ -224,6 +230,10 @@ public class EntityMappings { addMob(EntitySiegeSkeleton.class, "entity_meme_skeleton", 0x303030, 0x000080); addMob(EntitySiegeUFO.class, "entity_meme_ufo", 0x303030, 0x800000); addMob(EntitySiegeCraft.class, "entity_meme_craft", 0x303030, 0x808000); + + addSpawn(EntityCreeperPhosgene.class, 5, 1, 1, EnumCreatureType.monster, BiomeGenBase.getBiomeGenArray()); + addSpawn(EntityCreeperVolatile.class, 10, 1, 1, EnumCreatureType.monster, BiomeGenBase.getBiomeGenArray()); + addSpawn(EntityCreeperGold.class, 1, 1, 1, EnumCreatureType.monster, BiomeGenBase.getBiomeGenArray()); int id = 0; for(Quartet, String, Integer, Boolean> entry : entityMappings) { @@ -246,4 +256,26 @@ public class EntityMappings { private static void addMob(Class clazz, String name, int color1, int color2) { mobMappings.add(new Quartet(clazz, name, color1, color2)); } + + public static void addSpawn(Class entityClass, int weightedProb, int min, int max, EnumCreatureType typeOfCreature, BiomeGenBase... biomes) { + + for(BiomeGenBase biome : biomes) { + + if(biome == null) continue; + + List spawns = biome.getSpawnableList(typeOfCreature); + + for(SpawnListEntry entry : spawns) { + // Adjusting an existing spawn entry + if(entry.entityClass == entityClass) { + entry.itemWeight = weightedProb; + entry.minGroupCount = min; + entry.maxGroupCount = max; + break; + } + } + + spawns.add(new SpawnListEntry(entityClass, weightedProb, min, max)); + } + } } diff --git a/src/main/java/com/hbm/entity/mob/EntityCreeperGold.java b/src/main/java/com/hbm/entity/mob/EntityCreeperGold.java new file mode 100644 index 000000000..d9ab7d3b6 --- /dev/null +++ b/src/main/java/com/hbm/entity/mob/EntityCreeperGold.java @@ -0,0 +1,36 @@ +package com.hbm.entity.mob; + +import com.hbm.explosion.vanillant.ExplosionVNT; +import com.hbm.explosion.vanillant.standard.*; + +import net.minecraft.entity.monster.EntityCreeper; +import net.minecraft.init.Blocks; +import net.minecraft.world.World; + +public class EntityCreeperGold extends EntityCreeper { + + public EntityCreeperGold(World world) { + super(world); + } + + @Override + public void func_146077_cc() { + + if(!this.worldObj.isRemote) { + this.setDead(); + + ExplosionVNT vnt = new ExplosionVNT(worldObj, posX, posY, posZ, 7); + vnt.setBlockAllocator(new BlockAllocatorBulkie(60)); + vnt.setBlockProcessor(new BlockProcessorStandard().withBlockEffect(new BlockMutatorBulkie(Blocks.gold_ore))); + vnt.setEntityProcessor(new EntityProcessorStandard().withRangeMod(0.5F)); + vnt.setPlayerProcessor(new PlayerProcessorStandard()); + vnt.setSFX(new ExplosionEffectStandard()); + vnt.explode(); + } + } + + @Override + public boolean getCanSpawnHere() { + return super.getCanSpawnHere() && this.posY <= 40; + } +} diff --git a/src/main/java/com/hbm/entity/mob/EntityCreeperVolatile.java b/src/main/java/com/hbm/entity/mob/EntityCreeperVolatile.java new file mode 100644 index 000000000..d957c7aca --- /dev/null +++ b/src/main/java/com/hbm/entity/mob/EntityCreeperVolatile.java @@ -0,0 +1,36 @@ +package com.hbm.entity.mob; + +import com.hbm.blocks.ModBlocks; +import com.hbm.explosion.vanillant.ExplosionVNT; +import com.hbm.explosion.vanillant.standard.*; + +import net.minecraft.entity.monster.EntityCreeper; +import net.minecraft.world.World; + +public class EntityCreeperVolatile extends EntityCreeper { + + public EntityCreeperVolatile(World world) { + super(world); + } + + @Override + public void func_146077_cc() { + + if(!this.worldObj.isRemote) { + this.setDead(); + + ExplosionVNT vnt = new ExplosionVNT(worldObj, posX, posY, posZ, 7); + vnt.setBlockAllocator(new BlockAllocatorBulkie(60)); + vnt.setBlockProcessor(new BlockProcessorStandard().withBlockEffect(new BlockMutatorBulkie(ModBlocks.block_slag, 1))); + vnt.setEntityProcessor(new EntityProcessorStandard().withRangeMod(0.5F)); + vnt.setPlayerProcessor(new PlayerProcessorStandard()); + vnt.setSFX(new ExplosionEffectStandard()); + vnt.explode(); + } + } + + @Override + public boolean getCanSpawnHere() { + return super.getCanSpawnHere() && this.posY <= 40; + } +} diff --git a/src/main/java/com/hbm/explosion/vanillant/ExplosionVNT.java b/src/main/java/com/hbm/explosion/vanillant/ExplosionVNT.java index 891c10213..e1c217617 100644 --- a/src/main/java/com/hbm/explosion/vanillant/ExplosionVNT.java +++ b/src/main/java/com/hbm/explosion/vanillant/ExplosionVNT.java @@ -39,10 +39,10 @@ public class ExplosionVNT { //since we want to reduce each effect to the bare minimum (sound, particles, etc. being separate) we definitely need multiple most of the time private IExplosionSFX[] sfx; - protected World world; - protected double posX; - protected double posY; - protected double posZ; + public World world; + public double posX; + public double posY; + public double posZ; public float size; public Entity exploder; diff --git a/src/main/java/com/hbm/explosion/vanillant/interfaces/IBlockMutator.java b/src/main/java/com/hbm/explosion/vanillant/interfaces/IBlockMutator.java index d1e29ecbc..904f01c69 100644 --- a/src/main/java/com/hbm/explosion/vanillant/interfaces/IBlockMutator.java +++ b/src/main/java/com/hbm/explosion/vanillant/interfaces/IBlockMutator.java @@ -2,7 +2,10 @@ package com.hbm.explosion.vanillant.interfaces; import com.hbm.explosion.vanillant.ExplosionVNT; +import net.minecraft.block.Block; + public interface IBlockMutator { - public int mutateAtPosition(ExplosionVNT explosion, int x, int y, int z); + public void mutatePre(ExplosionVNT explosion, Block block, int meta, int x, int y, int z); + public void mutatePost(ExplosionVNT explosion, int x, int y, int z); } diff --git a/src/main/java/com/hbm/explosion/vanillant/standard/BlockAllocatorBulkie.java b/src/main/java/com/hbm/explosion/vanillant/standard/BlockAllocatorBulkie.java new file mode 100644 index 000000000..863916f19 --- /dev/null +++ b/src/main/java/com/hbm/explosion/vanillant/standard/BlockAllocatorBulkie.java @@ -0,0 +1,89 @@ +package com.hbm.explosion.vanillant.standard; + +import java.util.HashSet; + +import com.hbm.explosion.vanillant.ExplosionVNT; +import com.hbm.explosion.vanillant.interfaces.IBlockAllocator; + +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.util.MathHelper; +import net.minecraft.world.ChunkPosition; +import net.minecraft.world.World; + +public class BlockAllocatorBulkie implements IBlockAllocator { + + protected double maximum; + protected int resolution; + + public BlockAllocatorBulkie(double maximum) { + this(maximum, 16); + } + + public BlockAllocatorBulkie(double maximum, int resolution) { + this.resolution = resolution; + this.maximum = maximum; + } + + @Override + public HashSet allocate(ExplosionVNT explosion, World world, double x, double y, double z, float size) { + + HashSet affectedBlocks = new HashSet(); + + for(int i = 0; i < this.resolution; ++i) { + for(int j = 0; j < this.resolution; ++j) { + for(int k = 0; k < this.resolution; ++k) { + + if(i == 0 || i == this.resolution - 1 || j == 0 || j == this.resolution - 1 || k == 0 || k == this.resolution - 1) { + + double d0 = (double) ((float) i / ((float) this.resolution - 1.0F) * 2.0F - 1.0F); + double d1 = (double) ((float) j / ((float) this.resolution - 1.0F) * 2.0F - 1.0F); + double d2 = (double) ((float) k / ((float) this.resolution - 1.0F) * 2.0F - 1.0F); + double d3 = Math.sqrt(d0 * d0 + d1 * d1 + d2 * d2); + + d0 /= d3; + d1 /= d3; + d2 /= d3; + + double currentX = x; + double currentY = y; + double currentZ = z; + + double dist = 0; + + for(float stepSize = 0.3F; dist <= explosion.size;) { + + double deltaX = currentX - x; + double deltaY = currentY - y; + double deltaZ = currentZ - z; + dist = Math.sqrt(deltaX * deltaX + deltaY * deltaY + deltaZ * deltaZ); + + int blockX = MathHelper.floor_double(currentX); + int blockY = MathHelper.floor_double(currentY); + int blockZ = MathHelper.floor_double(currentZ); + + Block block = world.getBlock(blockX, blockY, blockZ); + + if(block.getMaterial() != Material.air) { + float blockResistance = explosion.exploder != null ? explosion.exploder.func_145772_a(explosion.compat, world, blockX, blockY, blockZ, block) : block.getExplosionResistance(explosion.exploder, world, blockX, blockY, blockZ, x, y, z); + if(this.maximum < blockResistance) { + break; + } + } + + if(explosion.exploder == null || explosion.exploder.func_145774_a(explosion.compat, world, blockX, blockY, blockZ, block, explosion.size)) { + affectedBlocks.add(new ChunkPosition(blockX, blockY, blockZ)); + } + + currentX += d0 * (double) stepSize; + currentY += d1 * (double) stepSize; + currentZ += d2 * (double) stepSize; + } + } + } + } + } + + return affectedBlocks; + } +} diff --git a/src/main/java/com/hbm/explosion/vanillant/standard/BlockMutatorBulkie.java b/src/main/java/com/hbm/explosion/vanillant/standard/BlockMutatorBulkie.java new file mode 100644 index 000000000..5b89ee88e --- /dev/null +++ b/src/main/java/com/hbm/explosion/vanillant/standard/BlockMutatorBulkie.java @@ -0,0 +1,32 @@ +package com.hbm.explosion.vanillant.standard; + +import com.hbm.explosion.vanillant.ExplosionVNT; +import com.hbm.explosion.vanillant.interfaces.IBlockMutator; +import com.hbm.inventory.RecipesCommon.MetaBlock; + +import net.minecraft.block.Block; +import net.minecraft.util.Vec3; + +public class BlockMutatorBulkie implements IBlockMutator { + + protected MetaBlock metaBlock; + + public BlockMutatorBulkie(Block block) { + this(block, 0); + } + + public BlockMutatorBulkie(Block block, int meta) { + this.metaBlock = new MetaBlock(block, meta); + } + + @Override + public void mutatePre(ExplosionVNT explosion, Block block, int meta, int x, int y, int z) { + if(!block.isBlockNormalCube()) return; + Vec3 vec = Vec3.createVectorHelper(x + 0.5 - explosion.posX, y + 0.5 - explosion.posY, z + 0.5 - explosion.posZ); + if(vec.lengthVector() >= explosion.size - 0.5) { + explosion.world.setBlock(x, y, z, metaBlock.block, metaBlock.meta, 3); + } + } + + @Override public void mutatePost(ExplosionVNT explosion, int x, int y, int z) { } +} diff --git a/src/main/java/com/hbm/explosion/vanillant/standard/BlockProcessorStandard.java b/src/main/java/com/hbm/explosion/vanillant/standard/BlockProcessorStandard.java index ac1fcd7be..a6da1e153 100644 --- a/src/main/java/com/hbm/explosion/vanillant/standard/BlockProcessorStandard.java +++ b/src/main/java/com/hbm/explosion/vanillant/standard/BlockProcessorStandard.java @@ -63,6 +63,7 @@ public class BlockProcessorStandard implements IBlockProcessor { } block.onBlockExploded(world, blockX, blockY, blockZ, explosion.compat); + if(this.convert != null) this.convert.mutatePre(explosion, block, world.getBlockMetadata(blockX, blockY, blockZ), blockX, blockY, blockZ); } } @@ -78,7 +79,7 @@ public class BlockProcessorStandard implements IBlockProcessor { Block block = world.getBlock(blockX, blockY, blockZ); if(block.getMaterial() == Material.air) { - this.convert.mutateAtPosition(explosion, blockX, blockY, blockZ); + this.convert.mutatePost(explosion, blockX, blockY, blockZ); } } } diff --git a/src/main/java/com/hbm/items/tool/ItemWandD.java b/src/main/java/com/hbm/items/tool/ItemWandD.java index 2d22a2182..7ea8ad8b7 100644 --- a/src/main/java/com/hbm/items/tool/ItemWandD.java +++ b/src/main/java/com/hbm/items/tool/ItemWandD.java @@ -2,8 +2,16 @@ package com.hbm.items.tool; import java.util.List; +import com.hbm.blocks.ModBlocks; import com.hbm.blocks.rail.IRailNTM; import com.hbm.blocks.rail.IRailNTM.RailContext; +import com.hbm.explosion.vanillant.ExplosionVNT; +import com.hbm.explosion.vanillant.standard.BlockAllocatorBulkie; +import com.hbm.explosion.vanillant.standard.BlockMutatorBulkie; +import com.hbm.explosion.vanillant.standard.BlockProcessorStandard; +import com.hbm.explosion.vanillant.standard.EntityProcessorStandard; +import com.hbm.explosion.vanillant.standard.ExplosionEffectStandard; +import com.hbm.explosion.vanillant.standard.PlayerProcessorStandard; import com.hbm.lib.Library; import com.hbm.packet.PacketDispatcher; import com.hbm.packet.PlayerInformPacket; @@ -14,6 +22,7 @@ import com.hbm.world.feature.OilSpot; import net.minecraft.block.Block; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.init.Blocks; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.util.ChatComponentText; @@ -34,6 +43,14 @@ public class ItemWandD extends Item { if(pos != null) { + ExplosionVNT vnt = new ExplosionVNT(world, pos.hitVec.xCoord, pos.hitVec.yCoord, pos.hitVec.zCoord, 7); + vnt.setBlockAllocator(new BlockAllocatorBulkie(60)); + vnt.setBlockProcessor(new BlockProcessorStandard().withBlockEffect(new BlockMutatorBulkie(ModBlocks.block_slag)).setNoDrop()); + vnt.setEntityProcessor(new EntityProcessorStandard()); + vnt.setPlayerProcessor(new PlayerProcessorStandard()); + vnt.setSFX(new ExplosionEffectStandard()); + vnt.explode(); + /*TimeAnalyzer.startCount("setBlock"); world.setBlock(pos.blockX, pos.blockY, pos.blockZ, Blocks.dirt); TimeAnalyzer.startEndCount("getBlock"); diff --git a/src/main/java/com/hbm/main/ClientProxy.java b/src/main/java/com/hbm/main/ClientProxy.java index 04a912a51..e69446d89 100644 --- a/src/main/java/com/hbm/main/ClientProxy.java +++ b/src/main/java/com/hbm/main/ClientProxy.java @@ -691,6 +691,8 @@ public class ClientProxy extends ServerProxy { RenderingRegistry.registerEntityRenderingHandler(EntityCreeperNuclear.class, new RenderCreeperUniversal(RefStrings.MODID + ":" + "textures/entity/creeper.png", RefStrings.MODID + ":" + "textures/entity/creeper_armor.png").setSwellMod(5F)); RenderingRegistry.registerEntityRenderingHandler(EntityCreeperTainted.class, new RenderCreeperUniversal(RefStrings.MODID + ":" + "textures/entity/creeper_tainted.png", RefStrings.MODID + ":" + "textures/entity/creeper_armor_taint.png")); RenderingRegistry.registerEntityRenderingHandler(EntityCreeperPhosgene.class, new RenderCreeperUniversal(RefStrings.MODID + ":" + "textures/entity/creeper_phosgene.png", "textures/entity/creeper/creeper_armor.png")); + RenderingRegistry.registerEntityRenderingHandler(EntityCreeperVolatile.class, new RenderCreeperUniversal(RefStrings.MODID + ":" + "textures/entity/creeper_volatile.png", "textures/entity/creeper/creeper_armor.png")); + RenderingRegistry.registerEntityRenderingHandler(EntityCreeperGold.class, new RenderCreeperUniversal(RefStrings.MODID + ":" + "textures/entity/creeper_gold.png", "textures/entity/creeper/creeper_armor.png")); RenderingRegistry.registerEntityRenderingHandler(EntityHunterChopper.class, new RenderHunterChopper()); RenderingRegistry.registerEntityRenderingHandler(EntityCyberCrab.class, new RenderCyberCrab()); RenderingRegistry.registerEntityRenderingHandler(EntityTeslaCrab.class, new RenderTeslaCrab()); diff --git a/src/main/java/com/hbm/main/MainRegistry.java b/src/main/java/com/hbm/main/MainRegistry.java index 6e1e381e5..da251825c 100644 --- a/src/main/java/com/hbm/main/MainRegistry.java +++ b/src/main/java/com/hbm/main/MainRegistry.java @@ -848,6 +848,7 @@ public class MainRegistry { new OreCave(ModBlocks.stone_resource, 0).setThreshold(1.5D).setRangeMult(20).setYLevel(30).setMaxRange(20).withFluid(ModBlocks.sulfuric_acid_block); //sulfur new OreCave(ModBlocks.stone_resource, 1).setThreshold(1.75D).setRangeMult(20).setYLevel(25).setMaxRange(20); //asbestos new OreLayer3D(ModBlocks.stone_resource, EnumStoneType.HEMATITE.ordinal()); + new BiomeCave().setThreshold(1.5D).setRangeMult(20).setYLevel(40).setMaxRange(20); //new OreLayer(Blocks.coal_ore, 0.2F).setThreshold(4).setRangeMult(3).setYLevel(70); Compat.handleRailcraftNonsense(); diff --git a/src/main/java/com/hbm/world/feature/BiomeCave.java b/src/main/java/com/hbm/world/feature/BiomeCave.java new file mode 100644 index 000000000..9d297778e --- /dev/null +++ b/src/main/java/com/hbm/world/feature/BiomeCave.java @@ -0,0 +1,126 @@ +package com.hbm.world.feature; + +import java.util.Random; + +import com.hbm.blocks.BlockEnums.EnumBiomeType; +import com.hbm.blocks.ModBlocks; +import com.hbm.blocks.generic.BlockStalagmite; + +import cpw.mods.fml.common.eventhandler.SubscribeEvent; +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.world.World; +import net.minecraft.world.biome.BiomeGenBase; +import net.minecraft.world.biome.BiomeGenBase.TempCategory; +import net.minecraft.world.gen.NoiseGeneratorPerlin; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.event.terraingen.DecorateBiomeEvent; + +public class BiomeCave { + + private NoiseGeneratorPerlin noise; + /** The number that is being deducted flat from the result of the perlin noise before all other processing. Increase this to make strata rarer. */ + private double threshold = 2D; + /** The mulitplier for the remaining bit after the threshold has been deducted. Increase to make strata wavier. */ + private int rangeMult = 3; + /** The maximum range after multiplying - anything above this will be subtracted from (maxRange * 2) to yield the proper range. Increase this to make strata thicker. */ + private int maxRange = 4; + /** The y-level around which the stratum is centered. */ + private int yLevel = 30; + + public BiomeCave() { + MinecraftForge.EVENT_BUS.register(this); + } + + public BiomeCave setThreshold(double threshold) { + this.threshold = threshold; + return this; + } + + public BiomeCave setRangeMult(int rangeMult) { + this.rangeMult = rangeMult; + return this; + } + + public BiomeCave setMaxRange(int maxRange) { + this.maxRange = maxRange; + return this; + } + + public BiomeCave setYLevel(int yLevel) { + this.yLevel = yLevel; + return this; + } + + @SubscribeEvent + public void onDecorate(DecorateBiomeEvent.Pre event) { + + World world = event.world; + + if(world.provider == null || world.provider.dimensionId != 0) return; + + if(this.noise == null) { + this.noise = new NoiseGeneratorPerlin(new Random(event.world.getSeed() - 1916169 + yLevel), 2); + } + + int cX = event.chunkX; + int cZ = event.chunkZ; + + double scale = 0.01D; + + for(int x = cX + 8; x < cX + 24; x++) { + for(int z = cZ + 8; z < cZ + 24; z++) { + + BiomeGenBase biome = world.getBiomeGenForCoords(x, z); + EnumBiomeType type = getTypeFromBiome(biome); + + double n = noise.func_151601_a(x * scale, z * scale); + + if(type != null && n > threshold) { + int range = (int)((n - threshold) * rangeMult); + + if(range > maxRange) + range = (maxRange * 2) - range; + + if(range < 0) + continue; + + for(int y = yLevel - range; y <= yLevel + range; y++) { + handleBiome(world, x, y, z, type); + } + } + } + } + } + + private static void handleBiome(World world, int x, int y, int z, EnumBiomeType type) { + Block target = world.getBlock(x, y, z); + + if(target.isNormalCube()) { + + boolean shouldGen = false; + + for(ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) { + if(world.getBlock(x + dir.offsetX, y + dir.offsetY, z + dir.offsetZ).isAir(world, x + dir.offsetX, y + dir.offsetY, z + dir.offsetZ)) { + shouldGen = true; break; + } + if(world.getBlock(x + dir.offsetX * 2, y + dir.offsetY * 2, z + dir.offsetZ * 2).isAir(world, x + dir.offsetX * 2, y + dir.offsetY * 2, z + dir.offsetZ * 2)) { + shouldGen = true; break; + } + } + + if(shouldGen) { + world.setBlock(x, y, z, ModBlocks.stone_biome, type.ordinal(), 2); + } + } + } + + private static EnumBiomeType getTypeFromBiome(BiomeGenBase biome) { + + if(biome.temperature >= 1 && biome.rainfall < 0.25) return EnumBiomeType.DESERT; + if(biome.temperature >= 0.5 && biome.rainfall > 0.25 && biome.getTempCategory() != TempCategory.OCEAN) return EnumBiomeType.WOODLAND; + + return null; + } +} diff --git a/src/main/resources/assets/hbm/textures/blocks/block_slag_broken.png b/src/main/resources/assets/hbm/textures/blocks/block_slag_broken.png new file mode 100644 index 0000000000000000000000000000000000000000..97f12ce5d660cd318211a09cec315dc28b516882 GIT binary patch literal 792 zcmV+z1LypSP)HFCasS z@B4hR{29S{fKnl$4ADECHviz!0-@~>n05X{jqxL8wArJ{c9K}rL zviR*bzdU@1s8p-ic6zAlc^=(v7l04u7x{2uiTY_B(=c$xGi04h0MzO=ri;_)j^i>n zcZ==qEp~q2q;d9w3D-e}k_SJnP&=s+$_v_UmrCV`pwoG!BkkL-zl?jK#5?fF=L+*81 z2l#aP3!*6E$CV#gU;CBjiw2XEQvj5AcZas+#bCLw6kFv#X*ACeeyfFl-s1lK?*|q~ zM#$&hWPV|hm>7FB&E?lGF+Mg2g;dg{TrRV*zB+WF#Tr)%SFkJ_%d*k+1Y_yZLHoTPreX5;NtKrd W^E)@0cQ{Z00000rET)H5iUZ7Gmo8fmbr&1wGKZP(eZTL0zMe{@(yrBN zD5d!K7-InNeIJ0}_$_;l8h-X3#uyyO0YFr%Rg5uctpSiyb_pq^a9x+alM;TmlnN&% z!gXE3%qOC_2Eeun0VsRR1VMn-nji?e#1k_BQLoo=oD$O)Z=sYz7AlC{B@V(ZqJb@B z;RO9HgFP5C?%!pz{sJMP2{`Q;EUh)hm^1^iyVSWOA3uAK@zaOw{SGPSR`7@B80o)B z^Uz|beV>N!QPHIHbW`Zi8&!-~)E|}O|q8>lTweECd zY|1s7hZb_`glJ!2^g`NRy8 z8LyaIp|?~jJ#DpG^qzVoOQp5Owr#xJ48OuEZ8M72noK5>{t3g7qobov2FbCeTgG)=Xu}_O=0>)SB2FU!0000^B1Or-YY$>q;(QdbK-3FKEZlaVz)}JC;>-6GJB&R+h>&NKNMVzUW zh2S@~+s_daBEZd-v9#70V^B(+cv>HwNkB09I}5|R>>kA|RyGNyuTm}lOmtu|o!w?= zs))60<`O_KSSsPqla(pze^8ltt%&{T1#b8Gn?$)3Q<{hliOh$JBNH%4sP z%6Ne)-8NxMFt=b=#J v;km9$Fded2>++@Zj@_dHp}&FWd62<3E)G!O^&$-#00000NkvXXu0mjfhCN^% literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/blocks/stone_biome_top.woodland.png b/src/main/resources/assets/hbm/textures/blocks/stone_biome_top.woodland.png new file mode 100644 index 0000000000000000000000000000000000000000..e758050f49ccbac64d8fe90f3763441591f27c60 GIT binary patch literal 790 zcmV+x1L^#UP)<@U4fE_YAUjff^fAc2rT;!pSjwum2K%jac9 z5-~FoNC}BDnMY4gzg&KlA7vJ^fxA4rt8=gO+wZ@QVp3s@K_4KCLxcy33h1?qOa^-G zvN~71dG!vN4CrkK(nBeQ05~2`=xs+F3VLg(b&K9Ntj-mq5v$@-2>U*w_`kMWIPb&%>-}2YhTh{9}c{)XUi6sgIfpno)sOL~s6}<-E_b~>t z*hPv7mC4HNfw73%bH#uKtipdHHIMd zxV|rtXU|f;oqq|y!_AJn-3`7M;`o+cgNRbpBp{G3%XN;JjJ$ktg;I**SRqcEhKHLS z0Q1EhfHcYJYM-Vbux<0CD;d}o4|G}}6H7g4(q({5mjR1;j%^*T?>{`*=t_(+1k&YL z)?{(WY13d#%dNb_cS0WT4Sg(-qY>PF*t0rUG^Y-55WZ!7wqUu=dHu&Fy%nTMj!Z0} z`#D4B@YUB(b;NdapcMr#UtCcZhH#n^MG>wyA|@jMW~@2s9Z?ifRu#!ivANx0TLt*#vxu@VNZ~WhBEt9! z(qvCEQ~dMsf{E`FBr!>TiLpg6W84>V$fb!b(gv z(*NZwAxlW%B3%l*LLyTjTM5joqWHag-@ErF#+b3|I)-6jTHbpA(lm|#LXYh5@D2YKEX(M+jzd{eR~6oS5@XD`D+=nW zqCTDC@W+17YPCWs^{W;DN~s4xK%L$m?tR{DDz*@UMX>OwHJ|4*-g~5!q-jc)WwV>Z zX48}Z=luQteu$PN0Nidjmdhn?VYOhH5F(;a19sFp zYUG^5IrqrHvsFi}BY?H`#rHrEz>=nEMu0Mewv~3H(rD>vt;f&B@t;JePGQv33V9Ms4LrTeZyN!ZQ!*(@>MacK1 nX=2(!1y@3ax4Nnx-(ANKBRv|-mOaA+00000NkvXXu0mjfuY%@u literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/entity/creeper_gold.png b/src/main/resources/assets/hbm/textures/entity/creeper_gold.png new file mode 100644 index 0000000000000000000000000000000000000000..8f20dd3f4c31202389b239c55d630cb7f11bda5d GIT binary patch literal 3063 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 FV1kr@l literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/entity/creeper_volatile.png b/src/main/resources/assets/hbm/textures/entity/creeper_volatile.png new file mode 100644 index 0000000000000000000000000000000000000000..b2640153995539e417a041436366671f0295c429 GIT binary patch literal 3107 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