From 1aa5f2e85c06a9ee0444a35d4a014056e36b9e33 Mon Sep 17 00:00:00 2001 From: Alexander Date: Wed, 23 Mar 2016 22:51:54 -0400 Subject: [PATCH] Working Particles --- build.gradle | 2 +- .../cpw/mods/ironchest/BlockIronChest.java | 25 ++++ .../java/cpw/mods/ironchest/IronChest.java | 3 + .../client/IronChestEventHandler.java | 25 ++++ .../client/IronChestTextureHandler.java | 139 ++++++++++++++++++ 5 files changed, 193 insertions(+), 1 deletion(-) create mode 100644 src/main/java/cpw/mods/ironchest/client/IronChestEventHandler.java create mode 100644 src/main/java/cpw/mods/ironchest/client/IronChestTextureHandler.java diff --git a/build.gradle b/build.gradle index 8bf898b..aaca566 100755 --- a/build.gradle +++ b/build.gradle @@ -35,7 +35,7 @@ archivesBaseName = "ironchest" // Setup the forge minecraft plugin data. Specify the preferred forge/minecraft version here minecraft { - version = "1.9-12.16.0.1781-1.9" + version = "1.9-12.16.0.1802-1.9" mappings = "snapshot_20160319" runDir = "run" } diff --git a/src/main/java/cpw/mods/ironchest/BlockIronChest.java b/src/main/java/cpw/mods/ironchest/BlockIronChest.java index f8b2c31..b428cd9 100755 --- a/src/main/java/cpw/mods/ironchest/BlockIronChest.java +++ b/src/main/java/cpw/mods/ironchest/BlockIronChest.java @@ -16,6 +16,7 @@ import java.util.Random; import com.google.common.collect.Lists; +import cpw.mods.ironchest.client.IronChestTextureHandler; import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; import net.minecraft.block.properties.IProperty; @@ -33,11 +34,13 @@ import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.EnumBlockRenderType; import net.minecraft.util.EnumFacing; import net.minecraft.util.EnumHand; import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.MathHelper; +import net.minecraft.util.math.RayTraceResult; import net.minecraft.world.Explosion; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; @@ -78,6 +81,12 @@ public class BlockIronChest extends BlockContainer return false; } + @Override + public EnumBlockRenderType getRenderType(IBlockState state) + { + return EnumBlockRenderType.ENTITYBLOCK_ANIMATED; + } + @Override public boolean onBlockActivated(World world, BlockPos pos, IBlockState blockState, EntityPlayer player, EnumHand hand, ItemStack heldItem, EnumFacing direction, float hitX, float hitY, float hitZ) @@ -258,6 +267,22 @@ public class BlockIronChest extends BlockContainer return super.getExplosionResistance(world, pos, exploder, explosion); } + @Override + @SideOnly(Side.CLIENT) + public boolean addHitEffects(IBlockState state, World worldObj, RayTraceResult target, net.minecraft.client.particle.EffectRenderer effectRenderer) + { + IronChestTextureHandler.addHitEffects(worldObj, target.getBlockPos(), target.sideHit); + return true; + } + + @Override + @SideOnly(Side.CLIENT) + public boolean addDestroyEffects(World world, BlockPos pos, net.minecraft.client.particle.EffectRenderer effectRenderer) + { + IronChestTextureHandler.addDestroyEffects(world, pos, world.getBlockState(pos)); + return true; + } + @Override public boolean hasComparatorInputOverride(IBlockState state) { diff --git a/src/main/java/cpw/mods/ironchest/IronChest.java b/src/main/java/cpw/mods/ironchest/IronChest.java index 1353698..5b6b877 100755 --- a/src/main/java/cpw/mods/ironchest/IronChest.java +++ b/src/main/java/cpw/mods/ironchest/IronChest.java @@ -10,6 +10,7 @@ ******************************************************************************/ package cpw.mods.ironchest; +import cpw.mods.ironchest.client.IronChestEventHandler; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.Mod.EventHandler; @@ -55,5 +56,7 @@ public class IronChest NetworkRegistry.INSTANCE.registerGuiHandler(instance, proxy); proxy.registerRenderInformation(); MinecraftForge.EVENT_BUS.register(new OcelotsSitOnChestsHandler()); + + MinecraftForge.EVENT_BUS.register(IronChestEventHandler.INSTANCE); } } diff --git a/src/main/java/cpw/mods/ironchest/client/IronChestEventHandler.java b/src/main/java/cpw/mods/ironchest/client/IronChestEventHandler.java new file mode 100644 index 0000000..f8a478b --- /dev/null +++ b/src/main/java/cpw/mods/ironchest/client/IronChestEventHandler.java @@ -0,0 +1,25 @@ +package cpw.mods.ironchest.client; + +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.client.event.TextureStitchEvent; +import net.minecraftforge.fml.client.FMLClientHandler; +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; + +public class IronChestEventHandler +{ + public static IronChestEventHandler INSTANCE = new IronChestEventHandler(); + + @SubscribeEvent + public void onPreTextureStiching(TextureStitchEvent.Pre event) + { + if (event.map == FMLClientHandler.instance().getClient().getTextureMapBlocks()) + { + event.map.registerSprite(new ResourceLocation("ironchest:blocks/copperbreak")); + event.map.registerSprite(new ResourceLocation("ironchest:blocks/crystalbreak")); + event.map.registerSprite(new ResourceLocation("ironchest:blocks/diamondbreak")); + event.map.registerSprite(new ResourceLocation("ironchest:blocks/goldbreak")); + event.map.registerSprite(new ResourceLocation("ironchest:blocks/ironbreak")); + event.map.registerSprite(new ResourceLocation("ironchest:blocks/silverbreak")); + } + } +} diff --git a/src/main/java/cpw/mods/ironchest/client/IronChestTextureHandler.java b/src/main/java/cpw/mods/ironchest/client/IronChestTextureHandler.java new file mode 100644 index 0000000..bb11053 --- /dev/null +++ b/src/main/java/cpw/mods/ironchest/client/IronChestTextureHandler.java @@ -0,0 +1,139 @@ +package cpw.mods.ironchest.client; + +import java.util.Map; +import java.util.Random; + +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableMap.Builder; + +import cpw.mods.ironchest.IronChestType; +import net.minecraft.block.Block; +import net.minecraft.block.state.IBlockState; +import net.minecraft.client.Minecraft; +import net.minecraft.client.particle.EntityDiggingFX; +import net.minecraft.client.renderer.block.model.ModelManager; +import net.minecraft.util.EnumBlockRenderType; +import net.minecraft.util.EnumFacing; +import net.minecraft.util.EnumParticleTypes; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.math.AxisAlignedBB; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; + +public class IronChestTextureHandler +{ + private static Map locations; + + static + { + Builder builder = ImmutableMap. builder(); + for (IronChestType typ : IronChestType.values()) + { + if (typ != IronChestType.DIRTCHEST9000 && typ != IronChestType.OBSIDIAN) + builder.put(typ, new ResourceLocation("ironchest", "blocks/" + typ.getModelTexture().replace("chest", "break").replace(".png", ""))); + else if (typ == IronChestType.DIRTCHEST9000) + builder.put(typ, new ResourceLocation("minecraft", "blocks/dirt")); + else if (typ == IronChestType.OBSIDIAN) + builder.put(typ, new ResourceLocation("minecraft", "blocks/obsidian")); + } + locations = builder.build(); + } + + public static void addHitEffects(World world, BlockPos pos, EnumFacing side) + { + IBlockState state = world.getBlockState(pos); + Block block = state.getBlock(); + state = block.getActualState(state, world, pos); + Random rand = new Random(); + IronChestType type = IronChestType.values()[IronChestType.validateMeta(block.getMetaFromState(state))]; + ModelManager modelmanager = Minecraft.getMinecraft().getBlockRendererDispatcher().getBlockModelShapes().getModelManager(); + + if (block.getRenderType(state) != EnumBlockRenderType.INVISIBLE) + { + int i = pos.getX(); + int j = pos.getY(); + int k = pos.getZ(); + float f = 0.1F; + AxisAlignedBB bb = block.getBoundingBox(state, world, pos); + + double d0 = i + rand.nextDouble() * (bb.maxX - bb.minX - f * 2.0F) + f + bb.minX; + double d1 = j + rand.nextDouble() * (bb.maxY - bb.minY - f * 2.0F) + f + bb.minY; + double d2 = k + rand.nextDouble() * (bb.maxZ - bb.minZ - f * 2.0F) + f + bb.minZ; + + if (side == EnumFacing.DOWN) + { + d1 = j + bb.minY - f; + } + + if (side == EnumFacing.UP) + { + d1 = j + bb.maxY + f; + } + + if (side == EnumFacing.NORTH) + { + d2 = k + bb.minZ - f; + } + + if (side == EnumFacing.SOUTH) + { + d2 = k + bb.maxZ + f; + } + + if (side == EnumFacing.WEST) + { + d0 = i + bb.minX - f; + } + + if (side == EnumFacing.EAST) + { + d0 = i + bb.maxX + f; + } + + EntityDiggingFX fx = ((EntityDiggingFX) Minecraft.getMinecraft().effectRenderer.spawnEffectParticle(EnumParticleTypes.BLOCK_CRACK.getParticleID(), + d0, d1, d2, 0.0D, 0.0D, 0.0D, Block.getIdFromBlock(state.getBlock()))); + + fx.setBlockPos(pos); + fx.multiplyVelocity(0.2F); + fx.multipleParticleScaleBy(0.6F); + + if (type != IronChestType.DIRTCHEST9000 && type != IronChestType.OBSIDIAN) + fx.setParticleTexture(modelmanager.getTextureMap().getAtlasSprite("ironchest:" + locations.get(type).getResourcePath())); + else if (type == IronChestType.DIRTCHEST9000) + fx.setParticleTexture(modelmanager.getTextureMap().getAtlasSprite("minecraft:" + locations.get(type).getResourcePath())); + else if (type == IronChestType.OBSIDIAN) + fx.setParticleTexture(modelmanager.getTextureMap().getAtlasSprite("minecraft:" + locations.get(type).getResourcePath())); + } + } + + public static void addDestroyEffects(World world, BlockPos pos, IBlockState state) + { + state = state.getBlock().getActualState(state, world, pos); + int i = 4; + IronChestType type = IronChestType.values()[IronChestType.validateMeta(state.getBlock().getMetaFromState(state))]; + ModelManager modelmanager = Minecraft.getMinecraft().getBlockRendererDispatcher().getBlockModelShapes().getModelManager(); + + for (int j = 0; j < i; ++j) + { + for (int k = 0; k < i; ++k) + { + for (int l = 0; l < i; ++l) + { + double d0 = pos.getX() + (j + 0.5D) / i; + double d1 = pos.getY() + (k + 0.5D) / i; + double d2 = pos.getZ() + (l + 0.5D) / i; + EntityDiggingFX fx = ((EntityDiggingFX) Minecraft.getMinecraft().effectRenderer.spawnEffectParticle( + EnumParticleTypes.BLOCK_CRACK.getParticleID(), d0, d1, d2, d0 - pos.getX() - 0.5D, d1 - pos.getY() - 0.5D, d2 - pos.getZ() - 0.5D, + Block.getIdFromBlock(state.getBlock()))); + fx.setBlockPos(pos); + if (type != IronChestType.DIRTCHEST9000 && type != IronChestType.OBSIDIAN) + fx.setParticleTexture(modelmanager.getTextureMap().getAtlasSprite("ironchest:" + locations.get(type).getResourcePath())); + else if (type == IronChestType.DIRTCHEST9000) + fx.setParticleTexture(modelmanager.getTextureMap().getAtlasSprite("minecraft:" + locations.get(type).getResourcePath())); + else if (type == IronChestType.OBSIDIAN) + fx.setParticleTexture(modelmanager.getTextureMap().getAtlasSprite("minecraft:" + locations.get(type).getResourcePath())); + } + } + } + } +}