diff --git a/src/main/java/com/hbm/crafting/WeaponRecipes.java b/src/main/java/com/hbm/crafting/WeaponRecipes.java index c5d2f8fef..38cf7aeb8 100644 --- a/src/main/java/com/hbm/crafting/WeaponRecipes.java +++ b/src/main/java/com/hbm/crafting/WeaponRecipes.java @@ -350,6 +350,7 @@ public class WeaponRecipes { CraftingManager.addRecipeAuto(new ItemStack(ModItems.nuclear_waste_pearl), new Object[] { "WWW", "WFW", "WWW", 'W', ModItems.nuclear_waste_tiny, 'F', ModBlocks.block_fallout }); //CraftingManager.addRecipeAuto(new ItemStack(ModItems.grenade_nuke), new Object[] { "CGC", "CGC", "PAP", 'C', ModBlocks.det_charge, 'G', ModItems.grenade_mk2, 'P', ALLOY.plate(), 'A', Blocks.anvil }); CraftingManager.addRecipeAuto(new ItemStack(ModItems.stick_dynamite, 4), new Object[] { " S ", "PDP", "PDP", 'S', ModItems.safety_fuse, 'P', Items.paper, 'D', ModItems.ball_dynamite }); + CraftingManager.addRecipeAuto(new ItemStack(ModItems.stick_tnt, 4), new Object[] { "PDP", "PDP", 'P', Items.paper, 'D', ModItems.ball_tnt }); //IF Grenades diff --git a/src/main/java/com/hbm/explosion/vanillant/BlockAllocatorStandard.java b/src/main/java/com/hbm/explosion/vanillant/BlockAllocatorStandard.java index 21e430136..062626bbe 100644 --- a/src/main/java/com/hbm/explosion/vanillant/BlockAllocatorStandard.java +++ b/src/main/java/com/hbm/explosion/vanillant/BlockAllocatorStandard.java @@ -54,11 +54,11 @@ public class BlockAllocatorStandard implements IBlockAllocator { Block block = world.getBlock(blockX, blockY, blockZ); if(block.getMaterial() != Material.air) { - float blockResistance = block.getExplosionResistance(explosion.exploder, world, blockX, blockY, blockZ, x, y, z); + 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); powerRemaining -= (blockResistance + 0.3F) * stepSize; } - if(powerRemaining > 0.0F) { + if(powerRemaining > 0.0F && (explosion.exploder == null || explosion.exploder.func_145774_a(explosion.compat, world, blockX, blockY, blockZ, block, powerRemaining))) { affectedBlocks.add(new ChunkPosition(blockX, blockY, blockZ)); } diff --git a/src/main/java/com/hbm/explosion/vanillant/BlockProcessorStandard.java b/src/main/java/com/hbm/explosion/vanillant/BlockProcessorStandard.java index 45debcd59..f13382728 100644 --- a/src/main/java/com/hbm/explosion/vanillant/BlockProcessorStandard.java +++ b/src/main/java/com/hbm/explosion/vanillant/BlockProcessorStandard.java @@ -5,7 +5,6 @@ import java.util.Iterator; 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; diff --git a/src/main/java/com/hbm/explosion/vanillant/EntityProcessorStandard.java b/src/main/java/com/hbm/explosion/vanillant/EntityProcessorStandard.java new file mode 100644 index 000000000..0dbaac088 --- /dev/null +++ b/src/main/java/com/hbm/explosion/vanillant/EntityProcessorStandard.java @@ -0,0 +1,73 @@ +package com.hbm.explosion.vanillant; + +import java.util.HashMap; +import java.util.List; + +import net.minecraft.enchantment.EnchantmentProtection; +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.DamageSource; +import net.minecraft.util.Vec3; +import net.minecraft.world.World; +import net.minecraftforge.event.ForgeEventFactory; + +public class EntityProcessorStandard implements IEntityProcessor { + + @Override + public HashMap process(ExplosionVNT explosion, World world, double x, double y, double z, float size) { + + HashMap affectedPlayers = new HashMap(); + + size *= 2.0F; + + double minX = x - (double) size - 1.0D; + double maxX = x + (double) size + 1.0D; + double minY = y - (double) size - 1.0D; + double maxY = y + (double) size + 1.0D; + double minZ = z - (double) size - 1.0D; + double maxZ = z + (double) size + 1.0D; + + List list = world.getEntitiesWithinAABBExcludingEntity(explosion.exploder, AxisAlignedBB.getBoundingBox(minX, minY, minZ, maxX, maxY, maxZ)); + + ForgeEventFactory.onExplosionDetonate(world, explosion.compat, list, size); + Vec3 vec3 = Vec3.createVectorHelper(x, y, z); + + for(int index = 0; index < list.size(); ++index) { + + Entity entity = (Entity) list.get(index); + double distanceScaled = entity.getDistance(x, y, z) / size; + + if(distanceScaled <= 1.0D) { + + double deltaX = entity.posX - x; + double deltaY = entity.posY + entity.getEyeHeight() - y; + double deltaZ = entity.posZ - z; + double distance = Math.sqrt(deltaX * deltaX + deltaY * deltaY + deltaZ * deltaZ); + + if(distance != 0.0D) { + + deltaX /= distance; + deltaY /= distance; + deltaZ /= distance; + + double density = world.getBlockDensity(vec3, entity.boundingBox); + double knockback = (1.0D - distanceScaled) * density; + + entity.attackEntityFrom(DamageSource.setExplosionSource(explosion.compat), (float) ((int) ((knockback * knockback + knockback) / 2.0D * 8.0D * size + 1.0D))); + double enchKnockback = EnchantmentProtection.func_92092_a(entity, knockback); + + entity.motionX += deltaX * enchKnockback; + entity.motionY += deltaY * enchKnockback; + entity.motionZ += deltaZ * enchKnockback; + + if(entity instanceof EntityPlayer) { + affectedPlayers.put((EntityPlayer) entity, Vec3.createVectorHelper(deltaX * knockback, deltaY * knockback, deltaZ * knockback)); + } + } + } + } + + return affectedPlayers; + } +} diff --git a/src/main/java/com/hbm/explosion/vanillant/ExplosionVNT.java b/src/main/java/com/hbm/explosion/vanillant/ExplosionVNT.java index 324b3bc03..15456c2f2 100644 --- a/src/main/java/com/hbm/explosion/vanillant/ExplosionVNT.java +++ b/src/main/java/com/hbm/explosion/vanillant/ExplosionVNT.java @@ -4,8 +4,10 @@ import java.util.HashMap; import java.util.HashSet; import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; import net.minecraft.util.Vec3; import net.minecraft.world.ChunkPosition; +import net.minecraft.world.Explosion; import net.minecraft.world.World; /** @@ -17,9 +19,9 @@ public class ExplosionVNT { //explosions only need one of these, in the unlikely event that we do need to combine different types we can just write a wrapper that acts as a chainloader private IBlockAllocator blockAllocator; - private IEntityAllocator entityAllocator; - private IBlockProcessor blockProcessor; private IEntityProcessor entityProcessor; + private IBlockProcessor blockProcessor; + private IPlayerProcessor playerProcessor; //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; @@ -30,6 +32,8 @@ public class ExplosionVNT { protected float size; public Entity exploder; + public Explosion compat; + public ExplosionVNT(World world, double x, double y, double z, float size) { this(world, x, y, z, size, null); } @@ -41,21 +45,23 @@ public class ExplosionVNT { this.posZ = z; this.size = size; this.exploder = exploder; + + this.compat = new Explosion(world, exploder, x, y, z, size); } public void explode() { boolean processBlocks = blockAllocator != null && blockProcessor != null; - boolean processEntities = entityAllocator != null && entityProcessor != null; + boolean processEntities = entityProcessor != null && playerProcessor != null; HashSet affectedBlocks = null; - HashMap affectedEntities = null; + HashMap affectedEntities = null; if(processBlocks) affectedBlocks = blockAllocator.allocate(this, world, posX, posY, posZ, size); - if(processEntities) affectedEntities = entityAllocator.allocate(this, world, posX, posY, posZ, size); + if(processEntities) affectedEntities = entityProcessor.process(this, world, posX, posY, posZ, size); if(processBlocks) blockProcessor.process(this, world, posX, posY, posZ, affectedBlocks); - if(processEntities) entityProcessor.process(this, world, posX, posY, posZ, affectedEntities); + if(processEntities) playerProcessor.process(this, world, posX, posY, posZ, affectedEntities); if(sfx != null) { for(IExplosionSFX fx : sfx) { @@ -68,16 +74,16 @@ public class ExplosionVNT { this.blockAllocator = blockAllocator; return this; } - public ExplosionVNT setEntityAllocator(IEntityAllocator entityAllocator) { - this.entityAllocator = entityAllocator; + public ExplosionVNT setEntityProcessor(IEntityProcessor entityProcessor) { + this.entityProcessor = entityProcessor; return this; } public ExplosionVNT setBlockProcessor(IBlockProcessor blockProcessor) { this.blockProcessor = blockProcessor; return this; } - public ExplosionVNT setEntityprocessor(IEntityProcessor entityProcessor) { - this.entityProcessor = entityProcessor; + public ExplosionVNT setPlayerProcessor(IPlayerProcessor playerProcessor) { + this.playerProcessor = playerProcessor; return this; } public ExplosionVNT setSFX(IExplosionSFX... sfx) { diff --git a/src/main/java/com/hbm/explosion/vanillant/IEntityAllocator.java b/src/main/java/com/hbm/explosion/vanillant/IEntityAllocator.java deleted file mode 100644 index 997afa96f..000000000 --- a/src/main/java/com/hbm/explosion/vanillant/IEntityAllocator.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.hbm.explosion.vanillant; - -import java.util.HashMap; - -import net.minecraft.entity.Entity; -import net.minecraft.util.Vec3; -import net.minecraft.world.World; - -public interface IEntityAllocator { - - public HashMap allocate(ExplosionVNT explosion, World world, double x, double y, double z, float size); -} diff --git a/src/main/java/com/hbm/explosion/vanillant/IEntityProcessor.java b/src/main/java/com/hbm/explosion/vanillant/IEntityProcessor.java index c9416aed3..21f9431fc 100644 --- a/src/main/java/com/hbm/explosion/vanillant/IEntityProcessor.java +++ b/src/main/java/com/hbm/explosion/vanillant/IEntityProcessor.java @@ -1,14 +1,12 @@ package com.hbm.explosion.vanillant; import java.util.HashMap; -import java.util.HashSet; -import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; import net.minecraft.util.Vec3; -import net.minecraft.world.ChunkPosition; import net.minecraft.world.World; public interface IEntityProcessor { - public void process(ExplosionVNT explosion, World world, double x, double y, double z, HashMap affectedBlocks); + public HashMap process(ExplosionVNT explosion, World world, double x, double y, double z, float size); } diff --git a/src/main/java/com/hbm/explosion/vanillant/IExplosionSFX.java b/src/main/java/com/hbm/explosion/vanillant/IExplosionSFX.java index 2b4846e2e..c87b93e27 100644 --- a/src/main/java/com/hbm/explosion/vanillant/IExplosionSFX.java +++ b/src/main/java/com/hbm/explosion/vanillant/IExplosionSFX.java @@ -1,8 +1,5 @@ package com.hbm.explosion.vanillant; -import java.util.HashSet; - -import net.minecraft.world.ChunkPosition; import net.minecraft.world.World; public interface IExplosionSFX { diff --git a/src/main/java/com/hbm/explosion/vanillant/IPlayerProcessor.java b/src/main/java/com/hbm/explosion/vanillant/IPlayerProcessor.java new file mode 100644 index 000000000..9d76fb508 --- /dev/null +++ b/src/main/java/com/hbm/explosion/vanillant/IPlayerProcessor.java @@ -0,0 +1,12 @@ +package com.hbm.explosion.vanillant; + +import java.util.HashMap; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.util.Vec3; +import net.minecraft.world.World; + +public interface IPlayerProcessor { + + public void process(ExplosionVNT explosion, World world, double x, double y, double z, HashMap affectedPlayers); +} diff --git a/src/main/java/com/hbm/explosion/vanillant/PlayerProcessorStandard.java b/src/main/java/com/hbm/explosion/vanillant/PlayerProcessorStandard.java new file mode 100644 index 000000000..4a1703d67 --- /dev/null +++ b/src/main/java/com/hbm/explosion/vanillant/PlayerProcessorStandard.java @@ -0,0 +1,25 @@ +package com.hbm.explosion.vanillant; + +import java.util.HashMap; +import java.util.Map.Entry; + +import com.hbm.packet.ExplosionKnockbackPacket; +import com.hbm.packet.PacketDispatcher; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.util.Vec3; +import net.minecraft.world.World; + +public class PlayerProcessorStandard implements IPlayerProcessor { + + @Override + public void process(ExplosionVNT explosion, World world, double x, double y, double z, HashMap affectedPlayers) { + + for(Entry entry : affectedPlayers.entrySet()) { + if(entry.getKey() instanceof EntityPlayerMP) { + PacketDispatcher.wrapper.sendTo(new ExplosionKnockbackPacket(entry.getValue()), (EntityPlayerMP)entry.getKey()); + } + } + } +} diff --git a/src/main/java/com/hbm/items/ModItems.java b/src/main/java/com/hbm/items/ModItems.java index 8c67af6a0..8c481e882 100644 --- a/src/main/java/com/hbm/items/ModItems.java +++ b/src/main/java/com/hbm/items/ModItems.java @@ -1686,6 +1686,7 @@ public class ModItems { public static Item crucible; public static Item stick_dynamite; + public static Item stick_tnt; public static Item grenade_generic; public static Item grenade_strong; @@ -4343,6 +4344,7 @@ public class ModItems { crucible = new ItemCrucible(5000, 1F, matCrucible).setUnlocalizedName("crucible").setCreativeTab(MainRegistry.weaponTab).setTextureName(RefStrings.MODID + ":crucible"); stick_dynamite = new ItemGrenade(3).setUnlocalizedName("stick_dynamite").setCreativeTab(MainRegistry.weaponTab).setTextureName(RefStrings.MODID + ":stick_dynamite"); + stick_tnt = new Item().setUnlocalizedName("stick_tnt").setCreativeTab(MainRegistry.weaponTab).setTextureName(RefStrings.MODID + ":stick_tnt"); grenade_generic = new ItemGrenade(4).setUnlocalizedName("grenade_generic").setCreativeTab(MainRegistry.weaponTab).setTextureName(RefStrings.MODID + ":grenade_generic"); grenade_strong = new ItemGrenade(5).setUnlocalizedName("grenade_strong").setCreativeTab(MainRegistry.weaponTab).setTextureName(RefStrings.MODID + ":grenade_strong"); @@ -7282,6 +7284,7 @@ public class ModItems { //Grenades GameRegistry.registerItem(stick_dynamite, stick_dynamite.getUnlocalizedName()); //heave-ho! + GameRegistry.registerItem(stick_tnt, stick_tnt.getUnlocalizedName()); GameRegistry.registerItem(grenade_generic, grenade_generic.getUnlocalizedName()); GameRegistry.registerItem(grenade_strong, grenade_strong.getUnlocalizedName()); GameRegistry.registerItem(grenade_frag, grenade_frag.getUnlocalizedName()); diff --git a/src/main/java/com/hbm/main/CraftingManager.java b/src/main/java/com/hbm/main/CraftingManager.java index 7898ba3bd..40b1f9c43 100644 --- a/src/main/java/com/hbm/main/CraftingManager.java +++ b/src/main/java/com/hbm/main/CraftingManager.java @@ -469,6 +469,7 @@ public class CraftingManager { addShapelessAuto(new ItemStack(ModBlocks.charge_dynamite, 1), new Object[] { ModItems.stick_dynamite, ModItems.stick_dynamite, ModItems.stick_dynamite, ModItems.ducttape }); addRecipeAuto(new ItemStack(ModBlocks.charge_miner, 1), new Object[] { " F ", "FCF", " F ", 'F', Items.flint, 'C', ModBlocks.charge_dynamite }); addRecipeAuto(new ItemStack(ModBlocks.dynamite, 1), new Object[] { "DDD", "DSD", "DDD", 'D', ModItems.stick_dynamite, 'S', Items.string }); + addRecipeAuto(new ItemStack(ModBlocks.tnt, 1), new Object[] { "DDD", "DSD", "DDD", 'D', ModItems.stick_tnt, 'S', Items.string }); addRecipeAuto(ItemBattery.getEmptyBattery(ModItems.battery_generic), new Object[] { " A ", "PRP", "PRP", 'A', ModItems.wire_aluminium, 'P', AL.plate(), 'R', REDSTONE.dust() }); addRecipeAuto(ItemBattery.getEmptyBattery(ModItems.battery_advanced), new Object[] { " A ", "PSP", "PLP", 'A', ModItems.wire_red_copper, 'P', CU.plate(), 'S', "sulfur", 'L', PB.dust() }); diff --git a/src/main/java/com/hbm/packet/ExplosionKnockbackPacket.java b/src/main/java/com/hbm/packet/ExplosionKnockbackPacket.java new file mode 100644 index 000000000..3d832aafb --- /dev/null +++ b/src/main/java/com/hbm/packet/ExplosionKnockbackPacket.java @@ -0,0 +1,55 @@ +package com.hbm.packet; + +import cpw.mods.fml.common.network.simpleimpl.IMessage; +import cpw.mods.fml.common.network.simpleimpl.IMessageHandler; +import cpw.mods.fml.common.network.simpleimpl.MessageContext; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; +import net.minecraft.client.Minecraft; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.util.Vec3; + +public class ExplosionKnockbackPacket implements IMessage { + + float motionX; + float motionY; + float motionZ; + + public ExplosionKnockbackPacket() { } + + public ExplosionKnockbackPacket(Vec3 vec) { + this.motionX = (float) vec.xCoord; + this.motionY = (float) vec.xCoord; + this.motionZ = (float) vec.xCoord; + } + + @Override + public void fromBytes(ByteBuf buf) { + this.motionX = buf.readFloat(); + this.motionY = buf.readFloat(); + this.motionZ = buf.readFloat(); + } + + @Override + public void toBytes(ByteBuf buf) { + buf.writeFloat(this.motionX); + buf.writeFloat(this.motionY); + buf.writeFloat(this.motionZ); + } + + public static class Handler implements IMessageHandler { + + @Override + @SideOnly(Side.CLIENT) + public IMessage onMessage(ExplosionKnockbackPacket m, MessageContext ctx) { + + EntityPlayer thePlayer = Minecraft.getMinecraft().thePlayer; + thePlayer.motionX += m.motionX; + thePlayer.motionY += m.motionY; + thePlayer.motionZ += m.motionZ; + + return null; + } + } +} diff --git a/src/main/java/com/hbm/packet/PacketDispatcher.java b/src/main/java/com/hbm/packet/PacketDispatcher.java index 8be73219b..21b2acac7 100644 --- a/src/main/java/com/hbm/packet/PacketDispatcher.java +++ b/src/main/java/com/hbm/packet/PacketDispatcher.java @@ -97,6 +97,8 @@ public class PacketDispatcher { wrapper.registerMessage(AnvilCraftPacket.Handler.class, AnvilCraftPacket.class, i++, Side.SERVER); //Sends a funi text to display like a music disc announcement wrapper.registerMessage(TEDoorAnimationPacket.Handler.class, TEDoorAnimationPacket.class, i++, Side.CLIENT); + //Sends a funi text to display like a music disc announcement + wrapper.registerMessage(ExplosionKnockbackPacket.Handler.class, ExplosionKnockbackPacket.class, i++, Side.CLIENT); } } diff --git a/src/main/resources/assets/hbm/lang/de_DE.lang b/src/main/resources/assets/hbm/lang/de_DE.lang index e4938dd03..9f8f6ac4b 100644 --- a/src/main/resources/assets/hbm/lang/de_DE.lang +++ b/src/main/resources/assets/hbm/lang/de_DE.lang @@ -2597,6 +2597,7 @@ item.steel_plate.name=Stahlbrustpanzer item.steel_shovel.name=Stahlschaufel item.steel_sword.name=Stahlschwert item.stick_dynamite.name=Stange Dynamit +item.stick_tnt.name=Stange TNT item.stopsign.name=Stopschild-Streitaxt item.sulfur.name=Schwefel item.survey_scanner.name=Tiefenscanner diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index c73f86dc2..94cfdd47b 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -2927,6 +2927,7 @@ item.steel_plate.name=Steel Chestplate item.steel_shovel.name=Steel Shovel item.steel_sword.name=Steel Sword item.stick_dynamite.name=Stick of Dynamite +item.stick_tnt.name=Stick of TNT item.stopsign.name=Stop Sign Battle Axe item.sulfur.name=Sulfur item.survey_scanner.name=Survey Scanner diff --git a/src/main/resources/assets/hbm/textures/items/stick_tnt.png b/src/main/resources/assets/hbm/textures/items/stick_tnt.png new file mode 100644 index 000000000..3f0808390 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/items/stick_tnt.png differ