From ab45f586c9e99e01a85822d14f35c9f5cbe15c3f Mon Sep 17 00:00:00 2001 From: Serenibyss <10861407+serenibyss@users.noreply.github.com> Date: Tue, 19 Dec 2023 14:07:15 -0600 Subject: [PATCH 1/8] basics + entity/renderer --- .../handler/PowderbarrelRenderer.java | 78 ++++++++++++++ .../java/gregtech/common/CommonProxy.java | 2 + .../java/gregtech/common/MetaEntities.java | 5 + .../gregtech/common/blocks/MetaBlocks.java | 4 + .../common/blocks/wood/BlockPowderbarrel.java | 74 +++++++++++++ .../common/entities/PowderbarrelEntity.java | 102 ++++++++++++++++++ 6 files changed, 265 insertions(+) create mode 100644 src/main/java/gregtech/client/renderer/handler/PowderbarrelRenderer.java create mode 100644 src/main/java/gregtech/common/blocks/wood/BlockPowderbarrel.java create mode 100644 src/main/java/gregtech/common/entities/PowderbarrelEntity.java diff --git a/src/main/java/gregtech/client/renderer/handler/PowderbarrelRenderer.java b/src/main/java/gregtech/client/renderer/handler/PowderbarrelRenderer.java new file mode 100644 index 00000000000..78a7d989516 --- /dev/null +++ b/src/main/java/gregtech/client/renderer/handler/PowderbarrelRenderer.java @@ -0,0 +1,78 @@ +package gregtech.client.renderer.handler; + +import gregtech.common.entities.PowderbarrelEntity; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.BlockRendererDispatcher; +import net.minecraft.client.renderer.GlStateManager; +import net.minecraft.client.renderer.entity.Render; +import net.minecraft.client.renderer.entity.RenderManager; +import net.minecraft.client.renderer.texture.TextureMap; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.math.MathHelper; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +import org.jetbrains.annotations.NotNull; + +@SideOnly(Side.CLIENT) +public class PowderbarrelRenderer extends Render { + + public PowderbarrelRenderer(RenderManager renderManagerIn) { + super(renderManagerIn); + this.shadowSize = 0.5F; + } + + @Override + public void doRender(PowderbarrelEntity entity, double x, double y, double z, float entityYaw, float partialTicks) { + BlockRendererDispatcher brd = Minecraft.getMinecraft().getBlockRendererDispatcher(); + GlStateManager.pushMatrix(); + GlStateManager.translate((float) x, (float) y + 0.5F, (float) z); + float f2; + if ((float) entity.getFuse() - partialTicks + 1.0F < 10.0F) { + f2 = 1.0F - ((float) entity.getFuse() - partialTicks + 1.0F) / 10.0F; + f2 = MathHelper.clamp(f2, 0.0F, 1.0F); + f2 *= f2; + f2 *= f2; + float f1 = 1.0F + f2 * 0.3F; + GlStateManager.scale(f1, f1, f1); + } + + f2 = (1.0F - ((float) entity.getFuse() - partialTicks + 1.0F) / 100.0F) * 0.8F; + this.bindEntityTexture(entity); + GlStateManager.rotate(-90.0F, 0.0F, 1.0F, 0.0F); + GlStateManager.translate(-0.5F, -0.5F, 0.5F); + brd.renderBlockBrightness(MetaBlocks.POWDERBARREL.getDefaultState(), entity.getBrightness()); + GlStateManager.translate(0.0F, 0.0F, 1.0F); + if (this.renderOutlines) { + GlStateManager.enableColorMaterial(); + GlStateManager.enableOutlineMode(this.getTeamColor(entity)); + brd.renderBlockBrightness(MetaBlocks.POWDERBARREL.getDefaultState(), 1.0F); + GlStateManager.disableOutlineMode(); + GlStateManager.disableColorMaterial(); + } else if (entity.getFuse() / 5 % 2 == 0) { + GlStateManager.disableTexture2D(); + GlStateManager.disableLighting(); + GlStateManager.enableBlend(); + GlStateManager.blendFunc(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.DST_ALPHA); + GlStateManager.color(1.0F, 1.0F, 1.0F, f2); + GlStateManager.doPolygonOffset(-3.0F, -3.0F); + GlStateManager.enablePolygonOffset(); + brd.renderBlockBrightness(MetaBlocks.POWDERBARREL.getDefaultState(), 1.0F); + GlStateManager.doPolygonOffset(0.0F, 0.0F); + GlStateManager.disablePolygonOffset(); + GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F); + GlStateManager.disableBlend(); + GlStateManager.enableLighting(); + GlStateManager.enableTexture2D(); + } + + GlStateManager.popMatrix(); + super.doRender(entity, x, y, z, entityYaw, partialTicks); + } + + @Override + protected ResourceLocation getEntityTexture(@NotNull PowderbarrelEntity entity) { + return TextureMap.LOCATION_BLOCKS_TEXTURE; + } +} diff --git a/src/main/java/gregtech/common/CommonProxy.java b/src/main/java/gregtech/common/CommonProxy.java index f8a956e201b..3be758da45c 100644 --- a/src/main/java/gregtech/common/CommonProxy.java +++ b/src/main/java/gregtech/common/CommonProxy.java @@ -153,6 +153,7 @@ public static void registerBlocks(RegistryEvent.Register event) { registry.register(RUBBER_WOOD_DOOR); registry.register(TREATED_WOOD_DOOR); registry.register(BRITTLE_CHARCOAL); + registry.register(POWDERBARREL); registry.register(METAL_SHEET); registry.register(LARGE_METAL_SHEET); registry.register(STUDS); @@ -273,6 +274,7 @@ public static void registerItems(RegistryEvent.Register event) { registry.register(createItemBlock(RUBBER_LOG, ItemBlock::new)); registry.register(createItemBlock(RUBBER_LEAVES, ItemBlock::new)); registry.register(createItemBlock(RUBBER_SAPLING, ItemBlock::new)); + registry.register(createItemBlock(POWDERBARREL, ItemBlock::new)); for (BlockCompressed block : COMPRESSED_BLOCKS) { registry.register(createItemBlock(block, b -> new MaterialItemBlock(b, OrePrefix.block))); diff --git a/src/main/java/gregtech/common/MetaEntities.java b/src/main/java/gregtech/common/MetaEntities.java index 00efb35f87d..d71f12e37ff 100644 --- a/src/main/java/gregtech/common/MetaEntities.java +++ b/src/main/java/gregtech/common/MetaEntities.java @@ -5,9 +5,11 @@ import gregtech.client.renderer.handler.DynamiteRenderer; import gregtech.client.renderer.handler.GTBoatRenderer; import gregtech.client.renderer.handler.PortalRenderer; +import gregtech.client.renderer.handler.PowderbarrelRenderer; import gregtech.common.entities.DynamiteEntity; import gregtech.common.entities.GTBoatEntity; import gregtech.common.entities.PortalEntity; +import gregtech.common.entities.PowderbarrelEntity; import net.minecraft.client.Minecraft; import net.minecraftforge.fml.client.registry.RenderingRegistry; @@ -24,6 +26,8 @@ public static void init() { GregTechAPI.instance, 64, 5, true); EntityRegistry.registerModEntity(GTUtility.gregtechId("gtboat"), GTBoatEntity.class, "GTBoat", 3, GregTechAPI.instance, 64, 2, true); + EntityRegistry.registerModEntity(GTUtility.gregtechId("powderbarrel"), PowderbarrelEntity.class, "Powderbarrel", + 4, GregTechAPI.instance, 64, 3, true); } @SideOnly(Side.CLIENT) @@ -32,5 +36,6 @@ public static void initRenderers() { manager -> new DynamiteRenderer(manager, Minecraft.getMinecraft().getRenderItem())); RenderingRegistry.registerEntityRenderingHandler(PortalEntity.class, PortalRenderer::new); RenderingRegistry.registerEntityRenderingHandler(GTBoatEntity.class, GTBoatRenderer::new); + RenderingRegistry.registerEntityRenderingHandler(PowderbarrelEntity.class, PowderbarrelRenderer::new); } } diff --git a/src/main/java/gregtech/common/blocks/MetaBlocks.java b/src/main/java/gregtech/common/blocks/MetaBlocks.java index ada71a669ac..d0088e58bdc 100644 --- a/src/main/java/gregtech/common/blocks/MetaBlocks.java +++ b/src/main/java/gregtech/common/blocks/MetaBlocks.java @@ -30,6 +30,7 @@ import gregtech.common.blocks.wood.BlockGregFenceGate; import gregtech.common.blocks.wood.BlockGregPlanks; import gregtech.common.blocks.wood.BlockGregWoodSlab; +import gregtech.common.blocks.wood.BlockPowderbarrel; import gregtech.common.blocks.wood.BlockRubberDoor; import gregtech.common.blocks.wood.BlockRubberLeaves; import gregtech.common.blocks.wood.BlockRubberLog; @@ -164,6 +165,7 @@ private MetaBlocks() {} public static BlockFenceGate TREATED_WOOD_FENCE_GATE; public static BlockWoodenDoor RUBBER_WOOD_DOOR; public static BlockWoodenDoor TREATED_WOOD_DOOR; + public static BlockPowderbarrel POWDERBARREL; public static BlockBrittleCharcoal BRITTLE_CHARCOAL; @@ -312,6 +314,7 @@ public static void init() { RUBBER_WOOD_DOOR.setRegistryName("rubber_wood_door").setTranslationKey("rubber_wood_door"); TREATED_WOOD_DOOR = new BlockWoodenDoor(() -> MetaItems.TREATED_WOOD_DOOR.getStackForm()); TREATED_WOOD_DOOR.setRegistryName("treated_wood_door").setTranslationKey("treated_wood_door"); + POWDERBARREL.setRegistryName("powderbarrel").setTranslationKey("powderbarrel"); BRITTLE_CHARCOAL = new BlockBrittleCharcoal(); BRITTLE_CHARCOAL.setRegistryName("brittle_charcoal"); @@ -481,6 +484,7 @@ public static void registerItemModels() { new ModelResourceLocation(Objects.requireNonNull(TREATED_WOOD_FENCE_GATE.getRegistryName()), "inventory")); registerItemModel(BRITTLE_CHARCOAL); + registerItemModel(POWDERBARREL); registerItemModel(METAL_SHEET); registerItemModel(LARGE_METAL_SHEET); diff --git a/src/main/java/gregtech/common/blocks/wood/BlockPowderbarrel.java b/src/main/java/gregtech/common/blocks/wood/BlockPowderbarrel.java new file mode 100644 index 00000000000..42b92e92364 --- /dev/null +++ b/src/main/java/gregtech/common/blocks/wood/BlockPowderbarrel.java @@ -0,0 +1,74 @@ +package gregtech.common.blocks.wood; + +import gregtech.api.items.toolitem.ToolClasses; + +import net.minecraft.block.Block; +import net.minecraft.block.SoundType; +import net.minecraft.block.material.Material; +import net.minecraft.block.state.IBlockState; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLiving.SpawnPlacementType; +import net.minecraft.entity.item.EntityTNTPrimed; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.SoundEvents; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; + +import org.jetbrains.annotations.NotNull; + +@SuppressWarnings("deprecation") +public class BlockPowderbarrel extends Block { + + public BlockPowderbarrel() { + super(Material.WOOD); + setHarvestLevel(ToolClasses.AXE, 1); + setHardness(0.5f); + setSoundType(SoundType.WOOD); + } + + @Override + public float getExplosionResistance(@NotNull Entity exploder) { + return 1.0f; + } + + @Override + public boolean canBeReplacedByLeaves(@NotNull IBlockState state, @NotNull IBlockAccess world, + @NotNull BlockPos pos) { + return false; + } + + @Override + public boolean isNormalCube(@NotNull IBlockState state) { + return true; + } + + @Override + public boolean canCreatureSpawn(@NotNull IBlockState state, @NotNull IBlockAccess world, @NotNull BlockPos pos, + @NotNull SpawnPlacementType type) { + return false; + } + + // todo + @Override + public boolean removedByPlayer(@NotNull IBlockState state, @NotNull World world, @NotNull BlockPos pos, + @NotNull EntityPlayer player, boolean willHarvest) { + if (!world.isRemote) { + EntityTNTPrimed primed = new EntityTNTPrimed(world, pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, + player); + world.spawnEntity(primed); + world.playSound(null, pos, SoundEvents.ENTITY_TNT_PRIMED, primed.getSoundCategory(), 1.0f, 1.0f); + world.setBlockToAir(pos); + return false; + } + return super.removedByPlayer(state, world, pos, player, willHarvest); + } + + // todo + @Override + public void onBlockAdded(@NotNull World world, @NotNull BlockPos pos, @NotNull IBlockState state) { + //if (worldIn.getRedstonePowerFromNeighbors().getIndirectPower(pos) > 0) { + // removedByPlayer(state, worldIn, pos, null, false); + //} + } +} diff --git a/src/main/java/gregtech/common/entities/PowderbarrelEntity.java b/src/main/java/gregtech/common/entities/PowderbarrelEntity.java new file mode 100644 index 00000000000..541277f1b3d --- /dev/null +++ b/src/main/java/gregtech/common/entities/PowderbarrelEntity.java @@ -0,0 +1,102 @@ +package gregtech.common.entities; + +import gregtech.api.util.BlockUtility; +import gregtech.api.util.GregFakePlayer; + +import net.minecraft.block.Block; +import net.minecraft.block.state.IBlockState; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.MoverType; +import net.minecraft.entity.item.EntityItem; +import net.minecraft.entity.item.EntityTNTPrimed; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumParticleTypes; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; +import net.minecraft.world.WorldServer; + +import java.util.Collections; +import java.util.List; + +public class PowderbarrelEntity extends EntityTNTPrimed { + + protected float fakeExplosionStrength = 3.5F; + protected float range = 2; + + public PowderbarrelEntity(World worldIn, double x, double y, double z, EntityLivingBase igniter) { + super(worldIn, x, y, z, igniter); + } + + public PowderbarrelEntity(World worldIn) { + super(worldIn); + } + + @Override + public void onUpdate() { + this.prevPosX = this.posX; + this.prevPosY = this.posY; + this.prevPosZ = this.posZ; + if (!this.hasNoGravity()) { + this.motionY -= 0.03999999910593033D; + } + + this.move(MoverType.SELF, this.motionX, this.motionY, this.motionZ); + this.motionX *= 0.9800000190734863D; + this.motionY *= 0.9800000190734863D; + this.motionZ *= 0.9800000190734863D; + if (this.onGround) { + this.motionX *= 0.699999988079071D; + this.motionZ *= 0.699999988079071D; + this.motionY *= -0.5D; + } + + setFuse(this.getFuse() - 1); + if (this.getFuse() <= 0) { + this.setDead(); + if (!this.world.isRemote && !this.inWater) { + this.explode(); + } + } else { + this.handleWaterMovement(); + this.world.spawnParticle(EnumParticleTypes.SMOKE_NORMAL, this.posX, this.posY + 0.5D, this.posZ, 0.0D, 0.0D, + 0.0D); + } + } + + protected void explode() { + this.world.createExplosion(this, this.posX, this.posY + (double) (this.height / 16.0F), this.posZ, + fakeExplosionStrength, false); + EntityPlayer player = GregFakePlayer.get((WorldServer) world); + + for (BlockPos pos : BlockPos.getAllInBox(this.getPosition().add(-range, -range, -range), + this.getPosition().add(range, range, range))) { + IBlockState state = world.getBlockState(pos); + float hardness = state.getBlockHardness(world, pos); + float resistance = state.getBlock().getExplosionResistance(player); + + // todo need to do more checks here, most importantly for fluid blocks + if (hardness >= 0.0f && resistance <= 100 && world.isBlockModifiable(player, pos)) { + List drops = attemptBreakBlockAndObtainDrops(pos, state, player); + + for (ItemStack stack : drops) { + EntityItem entity = new EntityItem(world, pos.getX(), pos.getY(), pos.getZ(), stack); + entity.setDefaultPickupDelay(); + world.spawnEntity(entity); + } + } + } + } + + private List attemptBreakBlockAndObtainDrops(BlockPos pos, IBlockState state, EntityPlayer player) { + if (state.getBlock().removedByPlayer(state, world, pos, player, true)) { + world.playEvent(null, 2001, pos, Block.getStateId(state)); + state.getBlock().onPlayerDestroy(world, pos, state); + + BlockUtility.startCaptureDrops(); + state.getBlock().harvestBlock(world, player, pos, state, world.getTileEntity(pos), ItemStack.EMPTY); + return BlockUtility.stopCaptureDrops(); + } + return Collections.emptyList(); + } +} From fadb9e55e48b2c10ca8984bd56cf8302a93c155d Mon Sep 17 00:00:00 2001 From: Serenibyss <10861407+serenibyss@users.noreply.github.com> Date: Tue, 19 Dec 2023 18:50:50 -0600 Subject: [PATCH 2/8] stuff on my laptop to get it on my desktop --- .../renderer/handler/PowderbarrelRenderer.java | 1 + .../blocks/material/GTBlockMaterials.java | 18 ++++++++++++++++++ .../common/blocks/wood/BlockPowderbarrel.java | 5 ++++- .../common/entities/PowderbarrelEntity.java | 8 ++++---- 4 files changed, 27 insertions(+), 5 deletions(-) create mode 100644 src/main/java/gregtech/common/blocks/material/GTBlockMaterials.java diff --git a/src/main/java/gregtech/client/renderer/handler/PowderbarrelRenderer.java b/src/main/java/gregtech/client/renderer/handler/PowderbarrelRenderer.java index 78a7d989516..df9d532ca09 100644 --- a/src/main/java/gregtech/client/renderer/handler/PowderbarrelRenderer.java +++ b/src/main/java/gregtech/client/renderer/handler/PowderbarrelRenderer.java @@ -1,5 +1,6 @@ package gregtech.client.renderer.handler; +import gregtech.common.blocks.MetaBlocks; import gregtech.common.entities.PowderbarrelEntity; import net.minecraft.client.Minecraft; diff --git a/src/main/java/gregtech/common/blocks/material/GTBlockMaterials.java b/src/main/java/gregtech/common/blocks/material/GTBlockMaterials.java new file mode 100644 index 00000000000..213ba58fdd9 --- /dev/null +++ b/src/main/java/gregtech/common/blocks/material/GTBlockMaterials.java @@ -0,0 +1,18 @@ +package gregtech.common.blocks.material; + +import net.minecraft.block.material.MapColor; +import net.minecraft.block.material.Material; + +public class GTBlockMaterials { + + public static final Material POWDERBARREL = new PowderbarrelMaterial(); + + private static class PowderbarrelMaterial extends Material { + + public PowderbarrelMaterial() { + super(MapColor.STONE); + setAdventureModeExempt(); + setImmovableMobility(); + } + } +} diff --git a/src/main/java/gregtech/common/blocks/wood/BlockPowderbarrel.java b/src/main/java/gregtech/common/blocks/wood/BlockPowderbarrel.java index 42b92e92364..3490f802f3f 100644 --- a/src/main/java/gregtech/common/blocks/wood/BlockPowderbarrel.java +++ b/src/main/java/gregtech/common/blocks/wood/BlockPowderbarrel.java @@ -2,8 +2,11 @@ import gregtech.api.items.toolitem.ToolClasses; +import gregtech.common.blocks.material.GTBlockMaterials; + import net.minecraft.block.Block; import net.minecraft.block.SoundType; +import net.minecraft.block.material.MapColor; import net.minecraft.block.material.Material; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.Entity; @@ -21,7 +24,7 @@ public class BlockPowderbarrel extends Block { public BlockPowderbarrel() { - super(Material.WOOD); + super(GTBlockMaterials.POWDERBARREL); setHarvestLevel(ToolClasses.AXE, 1); setHardness(0.5f); setSoundType(SoundType.WOOD); diff --git a/src/main/java/gregtech/common/entities/PowderbarrelEntity.java b/src/main/java/gregtech/common/entities/PowderbarrelEntity.java index 541277f1b3d..8e30b3dc59a 100644 --- a/src/main/java/gregtech/common/entities/PowderbarrelEntity.java +++ b/src/main/java/gregtech/common/entities/PowderbarrelEntity.java @@ -24,12 +24,12 @@ public class PowderbarrelEntity extends EntityTNTPrimed { protected float fakeExplosionStrength = 3.5F; protected float range = 2; - public PowderbarrelEntity(World worldIn, double x, double y, double z, EntityLivingBase igniter) { - super(worldIn, x, y, z, igniter); + public PowderbarrelEntity(World world, double x, double y, double z, EntityLivingBase igniter) { + super(world, x, y, z, igniter); } - public PowderbarrelEntity(World worldIn) { - super(worldIn); + public PowderbarrelEntity(World world) { + super(world); } @Override From 7a2b4f37c2e20c558c45e75374aae067c93d822e Mon Sep 17 00:00:00 2001 From: serenibyss <10861407+serenibyss@users.noreply.github.com> Date: Tue, 19 Dec 2023 19:48:28 -0600 Subject: [PATCH 3/8] mostly finish --- .../gregtech/common/blocks/MetaBlocks.java | 1 + .../common/blocks/wood/BlockPowderbarrel.java | 101 ++++++++++++++---- .../common/entities/PowderbarrelEntity.java | 19 +++- .../items/behaviors/LighterBehaviour.java | 10 +- .../loaders/recipe/CraftingRecipeLoader.java | 5 + .../gregtech/blockstates/powderbarrel.json | 14 +++ .../resources/assets/gregtech/lang/en_us.lang | 6 ++ .../textures/blocks/wood/powderbarrel.png | Bin 0 -> 243 bytes 8 files changed, 130 insertions(+), 26 deletions(-) create mode 100644 src/main/resources/assets/gregtech/blockstates/powderbarrel.json create mode 100644 src/main/resources/assets/gregtech/textures/blocks/wood/powderbarrel.png diff --git a/src/main/java/gregtech/common/blocks/MetaBlocks.java b/src/main/java/gregtech/common/blocks/MetaBlocks.java index d0088e58bdc..07aa0aca187 100644 --- a/src/main/java/gregtech/common/blocks/MetaBlocks.java +++ b/src/main/java/gregtech/common/blocks/MetaBlocks.java @@ -314,6 +314,7 @@ public static void init() { RUBBER_WOOD_DOOR.setRegistryName("rubber_wood_door").setTranslationKey("rubber_wood_door"); TREATED_WOOD_DOOR = new BlockWoodenDoor(() -> MetaItems.TREATED_WOOD_DOOR.getStackForm()); TREATED_WOOD_DOOR.setRegistryName("treated_wood_door").setTranslationKey("treated_wood_door"); + POWDERBARREL = new BlockPowderbarrel(); POWDERBARREL.setRegistryName("powderbarrel").setTranslationKey("powderbarrel"); BRITTLE_CHARCOAL = new BlockBrittleCharcoal(); diff --git a/src/main/java/gregtech/common/blocks/wood/BlockPowderbarrel.java b/src/main/java/gregtech/common/blocks/wood/BlockPowderbarrel.java index 3490f802f3f..56b22a85d90 100644 --- a/src/main/java/gregtech/common/blocks/wood/BlockPowderbarrel.java +++ b/src/main/java/gregtech/common/blocks/wood/BlockPowderbarrel.java @@ -1,24 +1,36 @@ package gregtech.common.blocks.wood; +import gregtech.api.GregTechAPI; import gregtech.api.items.toolitem.ToolClasses; - import gregtech.common.blocks.material.GTBlockMaterials; +import gregtech.common.entities.PowderbarrelEntity; import net.minecraft.block.Block; import net.minecraft.block.SoundType; -import net.minecraft.block.material.MapColor; -import net.minecraft.block.material.Material; import net.minecraft.block.state.IBlockState; +import net.minecraft.client.resources.I18n; +import net.minecraft.client.util.ITooltipFlag; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLiving.SpawnPlacementType; -import net.minecraft.entity.item.EntityTNTPrimed; +import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.projectile.EntityArrow; +import net.minecraft.init.Blocks; +import net.minecraft.init.Items; import net.minecraft.init.SoundEvents; +import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumFacing; +import net.minecraft.util.EnumHand; +import net.minecraft.util.SoundCategory; import net.minecraft.util.math.BlockPos; +import net.minecraft.world.Explosion; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.List; @SuppressWarnings("deprecation") public class BlockPowderbarrel extends Block { @@ -28,6 +40,7 @@ public BlockPowderbarrel() { setHarvestLevel(ToolClasses.AXE, 1); setHardness(0.5f); setSoundType(SoundType.WOOD); + setCreativeTab(GregTechAPI.TAB_GREGTECH_TOOLS); } @Override @@ -52,26 +65,76 @@ public boolean canCreatureSpawn(@NotNull IBlockState state, @NotNull IBlockAcces return false; } - // todo @Override - public boolean removedByPlayer(@NotNull IBlockState state, @NotNull World world, @NotNull BlockPos pos, - @NotNull EntityPlayer player, boolean willHarvest) { + public boolean canDropFromExplosion(@NotNull Explosion explosion) { + return false; + } + + public void explode(World world, BlockPos pos, EntityLivingBase exploder) { if (!world.isRemote) { - EntityTNTPrimed primed = new EntityTNTPrimed(world, pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, - player); - world.spawnEntity(primed); - world.playSound(null, pos, SoundEvents.ENTITY_TNT_PRIMED, primed.getSoundCategory(), 1.0f, 1.0f); - world.setBlockToAir(pos); - return false; + PowderbarrelEntity entity = new PowderbarrelEntity(world, pos.getX() + 0.5f, pos.getY(), pos.getZ() + 0.5f, + exploder); + world.spawnEntity(entity); + world.playSound(null, entity.posX, entity.posY, entity.posZ, SoundEvents.ENTITY_TNT_PRIMED, + SoundCategory.BLOCKS, 1.0f, 1.0f); + } + } + + @Override + public void onExplosionDestroy(@NotNull World world, @NotNull BlockPos pos, @NotNull Explosion explosion) { + if (!world.isRemote) { + PowderbarrelEntity entity = new PowderbarrelEntity(world, pos.getX() + 0.5f, pos.getY(), pos.getZ() + 0.5f, + explosion.getExplosivePlacedBy()); + entity.setFire(world.rand.nextInt(entity.getFuse() / 4) + entity.getFuse() / 8); + world.spawnEntity(entity); + } + } + + @Override + public boolean onBlockActivated(@NotNull World world, @NotNull BlockPos pos, @NotNull IBlockState state, + @NotNull EntityPlayer player, @NotNull EnumHand hand, @NotNull EnumFacing facing, + float hitX, float hitY, float hitZ) { + ItemStack stack = player.getHeldItem(hand); + if (!stack.isEmpty() && (stack.getItem() == Items.FLINT_AND_STEEL || stack.getItem() == Items.FIRE_CHARGE)) { + this.explode(world, pos, player); + world.setBlockState(pos, Blocks.AIR.getDefaultState(), 11); + if (stack.getItem() == Items.FLINT_AND_STEEL) { + stack.damageItem(1, player); + } else if (!player.capabilities.isCreativeMode) { + stack.shrink(1); + } + return true; + } + return super.onBlockActivated(world, pos, state, player, hand, facing, hitX, hitY, hitZ); + } + + @Override + public void dropBlockAsItemWithChance(@NotNull World world, @NotNull BlockPos pos, @NotNull IBlockState state, + float chance, int fortune) { + EntityPlayer player = this.harvesters.get(); + if (!player.isSneaking()) { + this.explode(world, pos, player); + } else { + super.dropBlockAsItemWithChance(world, pos, state, chance, fortune); + } + } + + @Override + public void onEntityCollision(@NotNull World world, @NotNull BlockPos pos, @NotNull IBlockState state, + @NotNull Entity entity) { + if (!world.isRemote && entity instanceof EntityArrow arrow) { + if (arrow.isBurning()) { + this.explode(world, pos, arrow.shootingEntity instanceof EntityLivingBase living ? living : null); + world.setBlockToAir(pos); + } } - return super.removedByPlayer(state, world, pos, player, willHarvest); } - // todo @Override - public void onBlockAdded(@NotNull World world, @NotNull BlockPos pos, @NotNull IBlockState state) { - //if (worldIn.getRedstonePowerFromNeighbors().getIndirectPower(pos) > 0) { - // removedByPlayer(state, worldIn, pos, null, false); - //} + public void addInformation(@NotNull ItemStack stack, @Nullable World world, @NotNull List tooltip, + @NotNull ITooltipFlag flag) { + tooltip.add(I18n.format("tile.powderbarrel.drops_tooltip")); + tooltip.add(I18n.format("tile.powderbarrel.breaking_tooltip")); + tooltip.add(I18n.format("tile.powderbarrel.lighting_tooltip")); } } diff --git a/src/main/java/gregtech/common/entities/PowderbarrelEntity.java b/src/main/java/gregtech/common/entities/PowderbarrelEntity.java index 8e30b3dc59a..2da81ac62fd 100644 --- a/src/main/java/gregtech/common/entities/PowderbarrelEntity.java +++ b/src/main/java/gregtech/common/entities/PowderbarrelEntity.java @@ -4,6 +4,7 @@ import gregtech.api.util.GregFakePlayer; import net.minecraft.block.Block; +import net.minecraft.block.material.Material; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.MoverType; @@ -24,10 +25,11 @@ public class PowderbarrelEntity extends EntityTNTPrimed { protected float fakeExplosionStrength = 3.5F; protected float range = 2; - public PowderbarrelEntity(World world, double x, double y, double z, EntityLivingBase igniter) { - super(world, x, y, z, igniter); + public PowderbarrelEntity(World world, double x, double y, double z, EntityLivingBase exploder) { + super(world, x, y, z, exploder); } + @SuppressWarnings("unused") public PowderbarrelEntity(World world) { super(world); } @@ -54,7 +56,7 @@ public void onUpdate() { setFuse(this.getFuse() - 1); if (this.getFuse() <= 0) { this.setDead(); - if (!this.world.isRemote && !this.inWater) { + if (!this.world.isRemote) { this.explode(); } } else { @@ -67,16 +69,23 @@ public void onUpdate() { protected void explode() { this.world.createExplosion(this, this.posX, this.posY + (double) (this.height / 16.0F), this.posZ, fakeExplosionStrength, false); + + // Create the fake explosion but don't destroy any blocks in water, per MC behavior + if (this.inWater) return; + EntityPlayer player = GregFakePlayer.get((WorldServer) world); for (BlockPos pos : BlockPos.getAllInBox(this.getPosition().add(-range, -range, -range), this.getPosition().add(range, range, range))) { IBlockState state = world.getBlockState(pos); + + if (state.getMaterial() == Material.AIR) return; + if (state.getMaterial() == Material.WATER || state.getMaterial() == Material.LAVA) return; + float hardness = state.getBlockHardness(world, pos); float resistance = state.getBlock().getExplosionResistance(player); - // todo need to do more checks here, most importantly for fluid blocks - if (hardness >= 0.0f && resistance <= 100 && world.isBlockModifiable(player, pos)) { + if (hardness >= 0.0f && resistance < 100 && world.isBlockModifiable(player, pos)) { List drops = attemptBreakBlockAndObtainDrops(pos, state, player); for (ItemStack stack : drops) { diff --git a/src/main/java/gregtech/common/items/behaviors/LighterBehaviour.java b/src/main/java/gregtech/common/items/behaviors/LighterBehaviour.java index 6dd8d6742c7..d2021e9f3d4 100644 --- a/src/main/java/gregtech/common/items/behaviors/LighterBehaviour.java +++ b/src/main/java/gregtech/common/items/behaviors/LighterBehaviour.java @@ -7,6 +7,7 @@ import gregtech.api.unification.material.Materials; import gregtech.api.util.GTUtility; import gregtech.api.util.GradientUtil; +import gregtech.common.blocks.wood.BlockPowderbarrel; import net.minecraft.advancements.CriteriaTriggers; import net.minecraft.block.Block; @@ -120,8 +121,13 @@ public EnumActionResult onItemUseFirst(@NotNull EntityPlayer player, @NotNull Wo SoundCategory.PLAYERS, 1.0F, GTValues.RNG.nextFloat() * 0.4F + 0.8F); IBlockState blockState = world.getBlockState(pos); Block block = blockState.getBlock(); - if (block instanceof BlockTNT) { - ((BlockTNT) block).explode(world, pos, blockState.withProperty(BlockTNT.EXPLODE, true), player); + if (block instanceof BlockTNT tnt) { + tnt.explode(world, pos, blockState.withProperty(BlockTNT.EXPLODE, true), player); + world.setBlockState(pos, Blocks.AIR.getDefaultState(), 11); + return EnumActionResult.SUCCESS; + } + if (block instanceof BlockPowderbarrel powderbarrel) { + powderbarrel.explode(world, pos, player); world.setBlockState(pos, Blocks.AIR.getDefaultState(), 11); return EnumActionResult.SUCCESS; } diff --git a/src/main/java/gregtech/loaders/recipe/CraftingRecipeLoader.java b/src/main/java/gregtech/loaders/recipe/CraftingRecipeLoader.java index 0b0d513a7f7..8b18ba7a811 100644 --- a/src/main/java/gregtech/loaders/recipe/CraftingRecipeLoader.java +++ b/src/main/java/gregtech/loaders/recipe/CraftingRecipeLoader.java @@ -336,6 +336,11 @@ private static void loadCraftingRecipes() { new UnificationEntry(OrePrefix.wireGtQuadruple, Osmium), 'P', new UnificationEntry(OrePrefix.plateDouble, Iridium), 'O', MetaItems.ENERGY_LAPOTRONIC_ORB.getStackForm()); + + ModHandler.addShapedRecipe("powderbarrel", new ItemStack(MetaBlocks.POWDERBARREL), "PSP", "GGG", "PGP", + 'P', new UnificationEntry(OrePrefix.plate, Wood), + 'S', new ItemStack(Items.STRING), + 'G', new UnificationEntry(OrePrefix.dust, Gunpowder)); } private static void registerFacadeRecipe(Material material, int facadeAmount) { diff --git a/src/main/resources/assets/gregtech/blockstates/powderbarrel.json b/src/main/resources/assets/gregtech/blockstates/powderbarrel.json new file mode 100644 index 00000000000..7880a60d273 --- /dev/null +++ b/src/main/resources/assets/gregtech/blockstates/powderbarrel.json @@ -0,0 +1,14 @@ +{ + "forge_marker": 1, + "defaults": { + "model": "minecraft:cube_all", + "textures": { + "all": "gregtech:blocks/wood/powderbarrel" + } + }, + "variants": { + "normal": [ + {} + ] + } +} diff --git a/src/main/resources/assets/gregtech/lang/en_us.lang b/src/main/resources/assets/gregtech/lang/en_us.lang index 12a9bba8f0d..4decd67e358 100644 --- a/src/main/resources/assets/gregtech/lang/en_us.lang +++ b/src/main/resources/assets/gregtech/lang/en_us.lang @@ -2348,6 +2348,12 @@ tile.treated_wood_fence.name=Treated Wood Fence tile.rubber_wood_fence_gate.name=Rubber Wood Fence Gate tile.treated_wood_fence_gate.name=Treated Wood Fence Gate +tile.powderbarrel.name=Powderbarrel +tile.powderbarrel.drops_tooltip=Larger than TNT, drops all destroyed Blocks as Items +tile.powderbarrel.breaking_tooltip=Primes explosion when mined, sneak mine to pick back up +tile.powderbarrel.lighting_tooltip=Cannot be lit with Redstone +entity.Powderbarrel.name=Powderbarrel + tile.brittle_charcoal.name=Brittle Charcoal tile.brittle_charcoal.tooltip.1=Produced by the Charcoal Pile Igniter. tile.brittle_charcoal.tooltip.2=Mine this to get Charcoal. diff --git a/src/main/resources/assets/gregtech/textures/blocks/wood/powderbarrel.png b/src/main/resources/assets/gregtech/textures/blocks/wood/powderbarrel.png new file mode 100644 index 0000000000000000000000000000000000000000..b5624295e93db2bb52a3ccddb55b6ee450b0e7da GIT binary patch literal 243 zcmV Date: Tue, 19 Dec 2023 20:05:48 -0600 Subject: [PATCH 4/8] implo recipe --- .../recipe/handlers/MaterialRecipeHandler.java | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/main/java/gregtech/loaders/recipe/handlers/MaterialRecipeHandler.java b/src/main/java/gregtech/loaders/recipe/handlers/MaterialRecipeHandler.java index 74239ff12ae..f106068b00e 100644 --- a/src/main/java/gregtech/loaders/recipe/handlers/MaterialRecipeHandler.java +++ b/src/main/java/gregtech/loaders/recipe/handlers/MaterialRecipeHandler.java @@ -13,6 +13,7 @@ import gregtech.api.unification.stack.UnificationEntry; import gregtech.api.util.GTUtility; import gregtech.common.ConfigHolder; +import gregtech.common.blocks.MetaBlocks; import gregtech.common.items.MetaItems; import gregtech.loaders.recipe.CraftingComponent; @@ -90,7 +91,15 @@ public static void processDust(OrePrefix dustPrefix, Material mat, DustProperty .inputs(GTUtility.copy(4, dustStack)) .outputs(GTUtility.copy(3, gemStack)) .chancedOutput(dust, Materials.DarkAsh, 2500, 0) - .explosivesAmount(2) + .explosivesType(new ItemStack(MetaBlocks.POWDERBARREL)) + .explosivesAmount(8) + .buildAndRegister(); + + RecipeMaps.IMPLOSION_RECIPES.recipeBuilder() + .inputs(GTUtility.copy(4, dustStack)) + .outputs(GTUtility.copy(3, gemStack)) + .chancedOutput(dust, Materials.DarkAsh, 2500, 0) + .explosivesAmount(4) .buildAndRegister(); RecipeMaps.IMPLOSION_RECIPES.recipeBuilder() @@ -98,6 +107,7 @@ public static void processDust(OrePrefix dustPrefix, Material mat, DustProperty .outputs(GTUtility.copy(3, gemStack)) .chancedOutput(dust, Materials.DarkAsh, 2500, 0) .explosivesType(MetaItems.DYNAMITE.getStackForm()) + .explosivesAmount(2) .buildAndRegister(); } From a24eec616ea176d23e82d81665938d4153f69c24 Mon Sep 17 00:00:00 2001 From: serenibyss <10861407+serenibyss@users.noreply.github.com> Date: Tue, 19 Dec 2023 21:59:43 -0600 Subject: [PATCH 5/8] ITNT + refactor to general GT explosive system --- ...Renderer.java => GTExplosiveRenderer.java} | 22 +-- .../java/gregtech/common/CommonProxy.java | 2 + .../java/gregtech/common/EventHandlers.java | 12 ++ .../java/gregtech/common/MetaEntities.java | 8 +- .../gregtech/common/blocks/MetaBlocks.java | 7 +- .../BlockGTExplosive.java} | 89 ++++++++---- .../common/blocks/explosive/BlockITNT.java | 40 ++++++ .../blocks/explosive/BlockPowderbarrel.java | 42 ++++++ .../common/entities/EntityGTExplosive.java | 136 ++++++++++++++++++ .../gregtech/common/entities/ITNTEntity.java | 41 ++++++ .../common/entities/PowderbarrelEntity.java | 97 ++----------- .../items/behaviors/LighterBehaviour.java | 4 +- .../handlers/MaterialRecipeHandler.java | 6 +- .../assets/gregtech/blockstates/itnt.json | 16 +++ .../gregtech/blockstates/powderbarrel.json | 2 +- .../resources/assets/gregtech/lang/en_us.lang | 11 +- .../gregtech/textures/blocks/misc/itnt.png | Bin 0 -> 212 bytes .../blocks/{wood => misc}/powderbarrel.png | Bin src/main/resources/gregtech_at.cfg | 3 + 19 files changed, 402 insertions(+), 136 deletions(-) rename src/main/java/gregtech/client/renderer/handler/{PowderbarrelRenderer.java => GTExplosiveRenderer.java} (78%) rename src/main/java/gregtech/common/blocks/{wood/BlockPowderbarrel.java => explosive/BlockGTExplosive.java} (60%) create mode 100644 src/main/java/gregtech/common/blocks/explosive/BlockITNT.java create mode 100644 src/main/java/gregtech/common/blocks/explosive/BlockPowderbarrel.java create mode 100644 src/main/java/gregtech/common/entities/EntityGTExplosive.java create mode 100644 src/main/java/gregtech/common/entities/ITNTEntity.java create mode 100644 src/main/resources/assets/gregtech/blockstates/itnt.json create mode 100644 src/main/resources/assets/gregtech/textures/blocks/misc/itnt.png rename src/main/resources/assets/gregtech/textures/blocks/{wood => misc}/powderbarrel.png (100%) diff --git a/src/main/java/gregtech/client/renderer/handler/PowderbarrelRenderer.java b/src/main/java/gregtech/client/renderer/handler/GTExplosiveRenderer.java similarity index 78% rename from src/main/java/gregtech/client/renderer/handler/PowderbarrelRenderer.java rename to src/main/java/gregtech/client/renderer/handler/GTExplosiveRenderer.java index df9d532ca09..4b0efe1ae63 100644 --- a/src/main/java/gregtech/client/renderer/handler/PowderbarrelRenderer.java +++ b/src/main/java/gregtech/client/renderer/handler/GTExplosiveRenderer.java @@ -1,8 +1,8 @@ package gregtech.client.renderer.handler; -import gregtech.common.blocks.MetaBlocks; -import gregtech.common.entities.PowderbarrelEntity; +import gregtech.common.entities.EntityGTExplosive; +import net.minecraft.block.state.IBlockState; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.BlockRendererDispatcher; import net.minecraft.client.renderer.GlStateManager; @@ -17,15 +17,15 @@ import org.jetbrains.annotations.NotNull; @SideOnly(Side.CLIENT) -public class PowderbarrelRenderer extends Render { +public class GTExplosiveRenderer extends Render { - public PowderbarrelRenderer(RenderManager renderManagerIn) { - super(renderManagerIn); + public GTExplosiveRenderer(RenderManager renderManager) { + super(renderManager); this.shadowSize = 0.5F; } @Override - public void doRender(PowderbarrelEntity entity, double x, double y, double z, float entityYaw, float partialTicks) { + public void doRender(@NotNull T entity, double x, double y, double z, float entityYaw, float partialTicks) { BlockRendererDispatcher brd = Minecraft.getMinecraft().getBlockRendererDispatcher(); GlStateManager.pushMatrix(); GlStateManager.translate((float) x, (float) y + 0.5F, (float) z); @@ -43,12 +43,14 @@ public void doRender(PowderbarrelEntity entity, double x, double y, double z, fl this.bindEntityTexture(entity); GlStateManager.rotate(-90.0F, 0.0F, 1.0F, 0.0F); GlStateManager.translate(-0.5F, -0.5F, 0.5F); - brd.renderBlockBrightness(MetaBlocks.POWDERBARREL.getDefaultState(), entity.getBrightness()); + + IBlockState state = entity.getExplosiveState(); + brd.renderBlockBrightness(state, entity.getBrightness()); GlStateManager.translate(0.0F, 0.0F, 1.0F); if (this.renderOutlines) { GlStateManager.enableColorMaterial(); GlStateManager.enableOutlineMode(this.getTeamColor(entity)); - brd.renderBlockBrightness(MetaBlocks.POWDERBARREL.getDefaultState(), 1.0F); + brd.renderBlockBrightness(state, 1.0F); GlStateManager.disableOutlineMode(); GlStateManager.disableColorMaterial(); } else if (entity.getFuse() / 5 % 2 == 0) { @@ -59,7 +61,7 @@ public void doRender(PowderbarrelEntity entity, double x, double y, double z, fl GlStateManager.color(1.0F, 1.0F, 1.0F, f2); GlStateManager.doPolygonOffset(-3.0F, -3.0F); GlStateManager.enablePolygonOffset(); - brd.renderBlockBrightness(MetaBlocks.POWDERBARREL.getDefaultState(), 1.0F); + brd.renderBlockBrightness(state, 1.0F); GlStateManager.doPolygonOffset(0.0F, 0.0F); GlStateManager.disablePolygonOffset(); GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F); @@ -73,7 +75,7 @@ public void doRender(PowderbarrelEntity entity, double x, double y, double z, fl } @Override - protected ResourceLocation getEntityTexture(@NotNull PowderbarrelEntity entity) { + protected ResourceLocation getEntityTexture(@NotNull T entity) { return TextureMap.LOCATION_BLOCKS_TEXTURE; } } diff --git a/src/main/java/gregtech/common/CommonProxy.java b/src/main/java/gregtech/common/CommonProxy.java index 3be758da45c..b9927847cd4 100644 --- a/src/main/java/gregtech/common/CommonProxy.java +++ b/src/main/java/gregtech/common/CommonProxy.java @@ -154,6 +154,7 @@ public static void registerBlocks(RegistryEvent.Register event) { registry.register(TREATED_WOOD_DOOR); registry.register(BRITTLE_CHARCOAL); registry.register(POWDERBARREL); + registry.register(ITNT); registry.register(METAL_SHEET); registry.register(LARGE_METAL_SHEET); registry.register(STUDS); @@ -275,6 +276,7 @@ public static void registerItems(RegistryEvent.Register event) { registry.register(createItemBlock(RUBBER_LEAVES, ItemBlock::new)); registry.register(createItemBlock(RUBBER_SAPLING, ItemBlock::new)); registry.register(createItemBlock(POWDERBARREL, ItemBlock::new)); + registry.register(createItemBlock(ITNT, ItemBlock::new)); for (BlockCompressed block : COMPRESSED_BLOCKS) { registry.register(createItemBlock(block, b -> new MaterialItemBlock(b, OrePrefix.block))); diff --git a/src/main/java/gregtech/common/EventHandlers.java b/src/main/java/gregtech/common/EventHandlers.java index da32dd83ca5..588909961e5 100644 --- a/src/main/java/gregtech/common/EventHandlers.java +++ b/src/main/java/gregtech/common/EventHandlers.java @@ -14,6 +14,7 @@ import gregtech.api.util.GTUtility; import gregtech.api.util.VirtualTankRegistry; import gregtech.api.worldgen.bedrockFluids.BedrockFluidVeinSaveData; +import gregtech.common.entities.EntityGTExplosive; import gregtech.common.items.MetaItems; import gregtech.common.items.armor.IStepAssist; import gregtech.common.items.armor.PowerlessJetpack; @@ -26,6 +27,7 @@ import net.minecraft.entity.SharedMonsterAttributes; import net.minecraft.entity.ai.attributes.AttributeModifier; import net.minecraft.entity.ai.attributes.IAttributeInstance; +import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.monster.EntityEnderman; import net.minecraft.entity.monster.EntityZombie; import net.minecraft.entity.player.EntityPlayer; @@ -48,6 +50,7 @@ import net.minecraftforge.event.entity.player.AdvancementEvent; import net.minecraftforge.event.entity.player.PlayerInteractEvent; import net.minecraftforge.event.furnace.FurnaceFuelBurnTimeEvent; +import net.minecraftforge.event.world.ExplosionEvent; import net.minecraftforge.event.world.WorldEvent; import net.minecraftforge.fluids.FluidUtil; import net.minecraftforge.fml.common.Mod; @@ -373,4 +376,13 @@ public static void onFurnaceFuelBurnTime(FurnaceFuelBurnTimeEvent event) { event.setBurnTime(6400); } } + + @SubscribeEvent + public static void onExplosionDetonate(ExplosionEvent.Detonate event) { + if (event.getExplosion().exploder instanceof EntityGTExplosive explosive) { + if (explosive.dropsAllBlocks()) { + event.getAffectedEntities().removeIf(entity -> entity instanceof EntityItem); + } + } + } } diff --git a/src/main/java/gregtech/common/MetaEntities.java b/src/main/java/gregtech/common/MetaEntities.java index d71f12e37ff..965ce3bfb18 100644 --- a/src/main/java/gregtech/common/MetaEntities.java +++ b/src/main/java/gregtech/common/MetaEntities.java @@ -4,10 +4,11 @@ import gregtech.api.util.GTUtility; import gregtech.client.renderer.handler.DynamiteRenderer; import gregtech.client.renderer.handler.GTBoatRenderer; +import gregtech.client.renderer.handler.GTExplosiveRenderer; import gregtech.client.renderer.handler.PortalRenderer; -import gregtech.client.renderer.handler.PowderbarrelRenderer; import gregtech.common.entities.DynamiteEntity; import gregtech.common.entities.GTBoatEntity; +import gregtech.common.entities.ITNTEntity; import gregtech.common.entities.PortalEntity; import gregtech.common.entities.PowderbarrelEntity; @@ -28,6 +29,8 @@ public static void init() { GregTechAPI.instance, 64, 2, true); EntityRegistry.registerModEntity(GTUtility.gregtechId("powderbarrel"), PowderbarrelEntity.class, "Powderbarrel", 4, GregTechAPI.instance, 64, 3, true); + EntityRegistry.registerModEntity(GTUtility.gregtechId("itnt"), ITNTEntity.class, "ITNT", 5, + GregTechAPI.instance, 64, 3, true); } @SideOnly(Side.CLIENT) @@ -36,6 +39,7 @@ public static void initRenderers() { manager -> new DynamiteRenderer(manager, Minecraft.getMinecraft().getRenderItem())); RenderingRegistry.registerEntityRenderingHandler(PortalEntity.class, PortalRenderer::new); RenderingRegistry.registerEntityRenderingHandler(GTBoatEntity.class, GTBoatRenderer::new); - RenderingRegistry.registerEntityRenderingHandler(PowderbarrelEntity.class, PowderbarrelRenderer::new); + RenderingRegistry.registerEntityRenderingHandler(PowderbarrelEntity.class, GTExplosiveRenderer::new); + RenderingRegistry.registerEntityRenderingHandler(ITNTEntity.class, GTExplosiveRenderer::new); } } diff --git a/src/main/java/gregtech/common/blocks/MetaBlocks.java b/src/main/java/gregtech/common/blocks/MetaBlocks.java index 07aa0aca187..1cacda968e6 100644 --- a/src/main/java/gregtech/common/blocks/MetaBlocks.java +++ b/src/main/java/gregtech/common/blocks/MetaBlocks.java @@ -24,13 +24,14 @@ import gregtech.client.renderer.pipe.LaserPipeRenderer; import gregtech.client.renderer.pipe.OpticalPipeRenderer; import gregtech.common.ConfigHolder; +import gregtech.common.blocks.explosive.BlockITNT; +import gregtech.common.blocks.explosive.BlockPowderbarrel; import gregtech.common.blocks.foam.BlockFoam; import gregtech.common.blocks.foam.BlockPetrifiedFoam; import gregtech.common.blocks.wood.BlockGregFence; import gregtech.common.blocks.wood.BlockGregFenceGate; import gregtech.common.blocks.wood.BlockGregPlanks; import gregtech.common.blocks.wood.BlockGregWoodSlab; -import gregtech.common.blocks.wood.BlockPowderbarrel; import gregtech.common.blocks.wood.BlockRubberDoor; import gregtech.common.blocks.wood.BlockRubberLeaves; import gregtech.common.blocks.wood.BlockRubberLog; @@ -166,6 +167,7 @@ private MetaBlocks() {} public static BlockWoodenDoor RUBBER_WOOD_DOOR; public static BlockWoodenDoor TREATED_WOOD_DOOR; public static BlockPowderbarrel POWDERBARREL; + public static BlockITNT ITNT; public static BlockBrittleCharcoal BRITTLE_CHARCOAL; @@ -316,6 +318,8 @@ public static void init() { TREATED_WOOD_DOOR.setRegistryName("treated_wood_door").setTranslationKey("treated_wood_door"); POWDERBARREL = new BlockPowderbarrel(); POWDERBARREL.setRegistryName("powderbarrel").setTranslationKey("powderbarrel"); + ITNT = new BlockITNT(); + ITNT.setRegistryName("itnt").setTranslationKey("itnt"); BRITTLE_CHARCOAL = new BlockBrittleCharcoal(); BRITTLE_CHARCOAL.setRegistryName("brittle_charcoal"); @@ -486,6 +490,7 @@ public static void registerItemModels() { "inventory")); registerItemModel(BRITTLE_CHARCOAL); registerItemModel(POWDERBARREL); + registerItemModel(ITNT); registerItemModel(METAL_SHEET); registerItemModel(LARGE_METAL_SHEET); diff --git a/src/main/java/gregtech/common/blocks/wood/BlockPowderbarrel.java b/src/main/java/gregtech/common/blocks/explosive/BlockGTExplosive.java similarity index 60% rename from src/main/java/gregtech/common/blocks/wood/BlockPowderbarrel.java rename to src/main/java/gregtech/common/blocks/explosive/BlockGTExplosive.java index 56b22a85d90..e11a36f9cfe 100644 --- a/src/main/java/gregtech/common/blocks/wood/BlockPowderbarrel.java +++ b/src/main/java/gregtech/common/blocks/explosive/BlockGTExplosive.java @@ -1,17 +1,15 @@ -package gregtech.common.blocks.wood; +package gregtech.common.blocks.explosive; import gregtech.api.GregTechAPI; -import gregtech.api.items.toolitem.ToolClasses; -import gregtech.common.blocks.material.GTBlockMaterials; -import gregtech.common.entities.PowderbarrelEntity; +import gregtech.common.entities.EntityGTExplosive; import net.minecraft.block.Block; -import net.minecraft.block.SoundType; +import net.minecraft.block.material.Material; import net.minecraft.block.state.IBlockState; import net.minecraft.client.resources.I18n; import net.minecraft.client.util.ITooltipFlag; import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLiving.SpawnPlacementType; +import net.minecraft.entity.EntityLiving; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.projectile.EntityArrow; @@ -33,16 +31,27 @@ import java.util.List; @SuppressWarnings("deprecation") -public class BlockPowderbarrel extends Block { - - public BlockPowderbarrel() { - super(GTBlockMaterials.POWDERBARREL); - setHarvestLevel(ToolClasses.AXE, 1); - setHardness(0.5f); - setSoundType(SoundType.WOOD); +public abstract class BlockGTExplosive extends Block { + + private final boolean canRedstoneActivate; + private final boolean explodeOnMine; + private final int fuseLength; + + /** + * @param canRedstoneActivate whether redstone signal can prime this explosive + * @param explodeOnMine whether mining this block should prime it (sneak mine to drop normally) + * @param fuseLength explosion countdown after priming. Vanilla TNT is 80. + */ + public BlockGTExplosive(Material materialIn, boolean canRedstoneActivate, boolean explodeOnMine, int fuseLength) { + super(materialIn); + this.canRedstoneActivate = canRedstoneActivate; + this.explodeOnMine = explodeOnMine; + this.fuseLength = fuseLength; setCreativeTab(GregTechAPI.TAB_GREGTECH_TOOLS); } + protected abstract EntityGTExplosive createEntity(World world, BlockPos pos, EntityLivingBase exploder); + @Override public float getExplosionResistance(@NotNull Entity exploder) { return 1.0f; @@ -61,7 +70,7 @@ public boolean isNormalCube(@NotNull IBlockState state) { @Override public boolean canCreatureSpawn(@NotNull IBlockState state, @NotNull IBlockAccess world, @NotNull BlockPos pos, - @NotNull SpawnPlacementType type) { + @NotNull EntityLiving.SpawnPlacementType type) { return false; } @@ -72,8 +81,8 @@ public boolean canDropFromExplosion(@NotNull Explosion explosion) { public void explode(World world, BlockPos pos, EntityLivingBase exploder) { if (!world.isRemote) { - PowderbarrelEntity entity = new PowderbarrelEntity(world, pos.getX() + 0.5f, pos.getY(), pos.getZ() + 0.5f, - exploder); + EntityGTExplosive entity = createEntity(world, pos, exploder); + entity.setFuse(fuseLength); world.spawnEntity(entity); world.playSound(null, entity.posX, entity.posY, entity.posZ, SoundEvents.ENTITY_TNT_PRIMED, SoundCategory.BLOCKS, 1.0f, 1.0f); @@ -83,9 +92,8 @@ public void explode(World world, BlockPos pos, EntityLivingBase exploder) { @Override public void onExplosionDestroy(@NotNull World world, @NotNull BlockPos pos, @NotNull Explosion explosion) { if (!world.isRemote) { - PowderbarrelEntity entity = new PowderbarrelEntity(world, pos.getX() + 0.5f, pos.getY(), pos.getZ() + 0.5f, - explosion.getExplosivePlacedBy()); - entity.setFire(world.rand.nextInt(entity.getFuse() / 4) + entity.getFuse() / 8); + EntityGTExplosive entity = createEntity(world, pos, explosion.getExplosivePlacedBy()); + entity.setFuse(world.rand.nextInt(fuseLength / 4) + fuseLength / 8); world.spawnEntity(entity); } } @@ -111,12 +119,14 @@ public boolean onBlockActivated(@NotNull World world, @NotNull BlockPos pos, @No @Override public void dropBlockAsItemWithChance(@NotNull World world, @NotNull BlockPos pos, @NotNull IBlockState state, float chance, int fortune) { - EntityPlayer player = this.harvesters.get(); - if (!player.isSneaking()) { - this.explode(world, pos, player); - } else { - super.dropBlockAsItemWithChance(world, pos, state, chance, fortune); + if (explodeOnMine) { + EntityPlayer player = this.harvesters.get(); + if (!player.isSneaking()) { + this.explode(world, pos, player); + return; + } } + super.dropBlockAsItemWithChance(world, pos, state, chance, fortune); } @Override @@ -130,11 +140,36 @@ public void onEntityCollision(@NotNull World world, @NotNull BlockPos pos, @NotN } } + @Override + public void onBlockAdded(@NotNull World world, @NotNull BlockPos pos, @NotNull IBlockState state) { + super.onBlockAdded(world, pos, state); + if (canRedstoneActivate) { + if (world.isBlockPowered(pos)) { + explode(world, pos, null); + world.setBlockToAir(pos); + } + } + } + + @Override + public void neighborChanged(@NotNull IBlockState state, @NotNull World world, @NotNull BlockPos pos, + @NotNull Block block, @NotNull BlockPos fromPos) { + if (canRedstoneActivate) { + if (world.isBlockPowered(pos)) { + explode(world, pos, null); + world.setBlockToAir(pos); + } + } + } + @Override public void addInformation(@NotNull ItemStack stack, @Nullable World world, @NotNull List tooltip, @NotNull ITooltipFlag flag) { - tooltip.add(I18n.format("tile.powderbarrel.drops_tooltip")); - tooltip.add(I18n.format("tile.powderbarrel.breaking_tooltip")); - tooltip.add(I18n.format("tile.powderbarrel.lighting_tooltip")); + if (explodeOnMine) { + tooltip.add(I18n.format("tile.gt_explosive.breaking_tooltip")); + } + if (!canRedstoneActivate) { + tooltip.add(I18n.format("tile.gt_explosive.lighting_tooltip")); + } } } diff --git a/src/main/java/gregtech/common/blocks/explosive/BlockITNT.java b/src/main/java/gregtech/common/blocks/explosive/BlockITNT.java new file mode 100644 index 00000000000..91a9614d4c4 --- /dev/null +++ b/src/main/java/gregtech/common/blocks/explosive/BlockITNT.java @@ -0,0 +1,40 @@ +package gregtech.common.blocks.explosive; + +import gregtech.common.entities.EntityGTExplosive; +import gregtech.common.entities.ITNTEntity; + +import net.minecraft.block.SoundType; +import net.minecraft.block.material.Material; +import net.minecraft.client.resources.I18n; +import net.minecraft.client.util.ITooltipFlag; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.item.ItemStack; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.List; + +public class BlockITNT extends BlockGTExplosive { + + public BlockITNT() { + super(Material.TNT, true, true, 40); + setHardness(0); + setSoundType(SoundType.PLANT); + } + + @Override + protected EntityGTExplosive createEntity(World world, BlockPos pos, EntityLivingBase exploder) { + float x = pos.getX() + 0.5F, y = pos.getY(), z = pos.getZ() + 0.5F; + return new ITNTEntity(world, x, y, z, exploder); + } + + @Override + public void addInformation(@NotNull ItemStack stack, @Nullable World world, @NotNull List tooltip, + @NotNull ITooltipFlag flag) { + tooltip.add(I18n.format("tile.itnt.drops_tooltip")); + super.addInformation(stack, world, tooltip, flag); + } +} diff --git a/src/main/java/gregtech/common/blocks/explosive/BlockPowderbarrel.java b/src/main/java/gregtech/common/blocks/explosive/BlockPowderbarrel.java new file mode 100644 index 00000000000..a2549ad7ee5 --- /dev/null +++ b/src/main/java/gregtech/common/blocks/explosive/BlockPowderbarrel.java @@ -0,0 +1,42 @@ +package gregtech.common.blocks.explosive; + +import gregtech.api.items.toolitem.ToolClasses; +import gregtech.common.blocks.material.GTBlockMaterials; +import gregtech.common.entities.EntityGTExplosive; +import gregtech.common.entities.PowderbarrelEntity; + +import net.minecraft.block.SoundType; +import net.minecraft.client.resources.I18n; +import net.minecraft.client.util.ITooltipFlag; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.item.ItemStack; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.List; + +public class BlockPowderbarrel extends BlockGTExplosive { + + public BlockPowderbarrel() { + super(GTBlockMaterials.POWDERBARREL, false, true, 100); + setHarvestLevel(ToolClasses.AXE, 1); + setHardness(0.5F); + setSoundType(SoundType.WOOD); + } + + @Override + protected EntityGTExplosive createEntity(World world, BlockPos pos, EntityLivingBase exploder) { + float x = pos.getX() + 0.5F, y = pos.getY(), z = pos.getZ() + 0.5F; + return new PowderbarrelEntity(world, x, y, z, exploder); + } + + @Override + public void addInformation(@NotNull ItemStack stack, @Nullable World world, @NotNull List tooltip, + @NotNull ITooltipFlag flag) { + tooltip.add(I18n.format("tile.powderbarrel.drops_tooltip")); + super.addInformation(stack, world, tooltip, flag); + } +} diff --git a/src/main/java/gregtech/common/entities/EntityGTExplosive.java b/src/main/java/gregtech/common/entities/EntityGTExplosive.java new file mode 100644 index 00000000000..70233d7f17b --- /dev/null +++ b/src/main/java/gregtech/common/entities/EntityGTExplosive.java @@ -0,0 +1,136 @@ +package gregtech.common.entities; + +import gregtech.api.util.BlockUtility; +import gregtech.api.util.GregFakePlayer; + +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.block.state.IBlockState; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.MoverType; +import net.minecraft.entity.item.EntityItem; +import net.minecraft.entity.item.EntityTNTPrimed; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumParticleTypes; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; +import net.minecraft.world.WorldServer; + +import org.jetbrains.annotations.NotNull; + +import java.util.Collections; +import java.util.List; + +public abstract class EntityGTExplosive extends EntityTNTPrimed { + + public EntityGTExplosive(World world, double x, double y, double z, EntityLivingBase exploder) { + super(world, x, y, z, exploder); + } + + @SuppressWarnings("unused") + public EntityGTExplosive(World world) { + super(world); + } + + /** + * @return The strength of the explosive. + */ + protected abstract float getStrength(); + + /** + * @return Whether to drop all blocks, or use default logic + */ + public abstract boolean dropsAllBlocks(); + + /** + * @return The range of the explosive, if {@link #dropsAllBlocks} is true. + */ + protected int getRange() { + return 2; + } + + /** + * @return The block state of the block this explosion entity is created by. + */ + public abstract @NotNull IBlockState getExplosiveState(); + + @Override + public void onUpdate() { + this.prevPosX = this.posX; + this.prevPosY = this.posY; + this.prevPosZ = this.posZ; + if (!this.hasNoGravity()) { + this.motionY -= 0.03999999910593033D; + } + + this.move(MoverType.SELF, this.motionX, this.motionY, this.motionZ); + this.motionX *= 0.9800000190734863D; + this.motionY *= 0.9800000190734863D; + this.motionZ *= 0.9800000190734863D; + if (this.onGround) { + this.motionX *= 0.699999988079071D; + this.motionZ *= 0.699999988079071D; + this.motionY *= -0.5D; + } + + setFuse(this.getFuse() - 1); + if (this.getFuse() <= 0) { + this.setDead(); + if (!this.world.isRemote) { + this.explodeTNT(); + } + } else { + this.handleWaterMovement(); + this.world.spawnParticle(EnumParticleTypes.SMOKE_NORMAL, this.posX, this.posY + 0.5D, this.posZ, 0.0D, 0.0D, + 0.0D); + } + } + + protected void explodeTNT() { + this.world.createExplosion(this, this.posX, this.posY + (double) (this.height / 16.0F), this.posZ, + getStrength(), !dropsAllBlocks()); + + // If we don't drop all blocks, then skip the drop capture logic + if (!dropsAllBlocks()) return; + + // Create the fake explosion but don't destroy any blocks in water, per MC behavior + if (this.inWater) return; + + EntityPlayer player = GregFakePlayer.get((WorldServer) world); + + int range = getRange(); + for (BlockPos pos : BlockPos.getAllInBox(this.getPosition().add(-range, -range, -range), + this.getPosition().add(range, range, range))) { + IBlockState state = world.getBlockState(pos); + + if (state.getMaterial() == Material.AIR) continue; + if (state.getMaterial() == Material.WATER || state.getMaterial() == Material.LAVA) continue; + + float hardness = state.getBlockHardness(world, pos); + float resistance = state.getBlock().getExplosionResistance(player); + + if (hardness >= 0.0f && resistance < 100 && world.isBlockModifiable(player, pos)) { + List drops = attemptBreakBlockAndObtainDrops(pos, state, player); + + for (ItemStack stack : drops) { + EntityItem entity = new EntityItem(world, pos.getX(), pos.getY(), pos.getZ(), stack); + entity.setDefaultPickupDelay(); + world.spawnEntity(entity); + } + } + } + } + + private List attemptBreakBlockAndObtainDrops(BlockPos pos, IBlockState state, EntityPlayer player) { + if (state.getBlock().removedByPlayer(state, world, pos, player, true)) { + world.playEvent(null, 2001, pos, Block.getStateId(state)); + state.getBlock().onPlayerDestroy(world, pos, state); + + BlockUtility.startCaptureDrops(); + state.getBlock().harvestBlock(world, player, pos, state, world.getTileEntity(pos), ItemStack.EMPTY); + return BlockUtility.stopCaptureDrops(); + } + return Collections.emptyList(); + } +} diff --git a/src/main/java/gregtech/common/entities/ITNTEntity.java b/src/main/java/gregtech/common/entities/ITNTEntity.java new file mode 100644 index 00000000000..3fa60cf4860 --- /dev/null +++ b/src/main/java/gregtech/common/entities/ITNTEntity.java @@ -0,0 +1,41 @@ +package gregtech.common.entities; + +import gregtech.common.blocks.MetaBlocks; + +import net.minecraft.block.state.IBlockState; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.world.World; + +import org.jetbrains.annotations.NotNull; + +public class ITNTEntity extends EntityGTExplosive { + + public ITNTEntity(World world, double x, double y, double z, EntityLivingBase exploder) { + super(world, x, y, z, exploder); + } + + @SuppressWarnings("unused") + public ITNTEntity(World world) { + super(world); + } + + @Override + protected float getStrength() { + return 5.0F; + } + + @Override + public boolean dropsAllBlocks() { + return true; + } + + @Override + protected int getRange() { + return 3; + } + + @Override + public @NotNull IBlockState getExplosiveState() { + return MetaBlocks.ITNT.getDefaultState(); + } +} diff --git a/src/main/java/gregtech/common/entities/PowderbarrelEntity.java b/src/main/java/gregtech/common/entities/PowderbarrelEntity.java index 2da81ac62fd..39f1ed4df56 100644 --- a/src/main/java/gregtech/common/entities/PowderbarrelEntity.java +++ b/src/main/java/gregtech/common/entities/PowderbarrelEntity.java @@ -1,29 +1,14 @@ package gregtech.common.entities; -import gregtech.api.util.BlockUtility; -import gregtech.api.util.GregFakePlayer; +import gregtech.common.blocks.MetaBlocks; -import net.minecraft.block.Block; -import net.minecraft.block.material.Material; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.MoverType; -import net.minecraft.entity.item.EntityItem; -import net.minecraft.entity.item.EntityTNTPrimed; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; -import net.minecraft.util.EnumParticleTypes; -import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; -import net.minecraft.world.WorldServer; -import java.util.Collections; -import java.util.List; +import org.jetbrains.annotations.NotNull; -public class PowderbarrelEntity extends EntityTNTPrimed { - - protected float fakeExplosionStrength = 3.5F; - protected float range = 2; +public class PowderbarrelEntity extends EntityGTExplosive { public PowderbarrelEntity(World world, double x, double y, double z, EntityLivingBase exploder) { super(world, x, y, z, exploder); @@ -35,77 +20,17 @@ public PowderbarrelEntity(World world) { } @Override - public void onUpdate() { - this.prevPosX = this.posX; - this.prevPosY = this.posY; - this.prevPosZ = this.posZ; - if (!this.hasNoGravity()) { - this.motionY -= 0.03999999910593033D; - } - - this.move(MoverType.SELF, this.motionX, this.motionY, this.motionZ); - this.motionX *= 0.9800000190734863D; - this.motionY *= 0.9800000190734863D; - this.motionZ *= 0.9800000190734863D; - if (this.onGround) { - this.motionX *= 0.699999988079071D; - this.motionZ *= 0.699999988079071D; - this.motionY *= -0.5D; - } - - setFuse(this.getFuse() - 1); - if (this.getFuse() <= 0) { - this.setDead(); - if (!this.world.isRemote) { - this.explode(); - } - } else { - this.handleWaterMovement(); - this.world.spawnParticle(EnumParticleTypes.SMOKE_NORMAL, this.posX, this.posY + 0.5D, this.posZ, 0.0D, 0.0D, - 0.0D); - } + protected float getStrength() { + return 3.5F; } - protected void explode() { - this.world.createExplosion(this, this.posX, this.posY + (double) (this.height / 16.0F), this.posZ, - fakeExplosionStrength, false); - - // Create the fake explosion but don't destroy any blocks in water, per MC behavior - if (this.inWater) return; - - EntityPlayer player = GregFakePlayer.get((WorldServer) world); - - for (BlockPos pos : BlockPos.getAllInBox(this.getPosition().add(-range, -range, -range), - this.getPosition().add(range, range, range))) { - IBlockState state = world.getBlockState(pos); - - if (state.getMaterial() == Material.AIR) return; - if (state.getMaterial() == Material.WATER || state.getMaterial() == Material.LAVA) return; - - float hardness = state.getBlockHardness(world, pos); - float resistance = state.getBlock().getExplosionResistance(player); - - if (hardness >= 0.0f && resistance < 100 && world.isBlockModifiable(player, pos)) { - List drops = attemptBreakBlockAndObtainDrops(pos, state, player); - - for (ItemStack stack : drops) { - EntityItem entity = new EntityItem(world, pos.getX(), pos.getY(), pos.getZ(), stack); - entity.setDefaultPickupDelay(); - world.spawnEntity(entity); - } - } - } + @Override + public boolean dropsAllBlocks() { + return true; } - private List attemptBreakBlockAndObtainDrops(BlockPos pos, IBlockState state, EntityPlayer player) { - if (state.getBlock().removedByPlayer(state, world, pos, player, true)) { - world.playEvent(null, 2001, pos, Block.getStateId(state)); - state.getBlock().onPlayerDestroy(world, pos, state); - - BlockUtility.startCaptureDrops(); - state.getBlock().harvestBlock(world, player, pos, state, world.getTileEntity(pos), ItemStack.EMPTY); - return BlockUtility.stopCaptureDrops(); - } - return Collections.emptyList(); + @Override + public @NotNull IBlockState getExplosiveState() { + return MetaBlocks.POWDERBARREL.getDefaultState(); } } diff --git a/src/main/java/gregtech/common/items/behaviors/LighterBehaviour.java b/src/main/java/gregtech/common/items/behaviors/LighterBehaviour.java index d2021e9f3d4..bdff9524d0d 100644 --- a/src/main/java/gregtech/common/items/behaviors/LighterBehaviour.java +++ b/src/main/java/gregtech/common/items/behaviors/LighterBehaviour.java @@ -7,7 +7,7 @@ import gregtech.api.unification.material.Materials; import gregtech.api.util.GTUtility; import gregtech.api.util.GradientUtil; -import gregtech.common.blocks.wood.BlockPowderbarrel; +import gregtech.common.blocks.explosive.BlockGTExplosive; import net.minecraft.advancements.CriteriaTriggers; import net.minecraft.block.Block; @@ -126,7 +126,7 @@ public EnumActionResult onItemUseFirst(@NotNull EntityPlayer player, @NotNull Wo world.setBlockState(pos, Blocks.AIR.getDefaultState(), 11); return EnumActionResult.SUCCESS; } - if (block instanceof BlockPowderbarrel powderbarrel) { + if (block instanceof BlockGTExplosive powderbarrel) { powderbarrel.explode(world, pos, player); world.setBlockState(pos, Blocks.AIR.getDefaultState(), 11); return EnumActionResult.SUCCESS; diff --git a/src/main/java/gregtech/loaders/recipe/handlers/MaterialRecipeHandler.java b/src/main/java/gregtech/loaders/recipe/handlers/MaterialRecipeHandler.java index f106068b00e..ca913733494 100644 --- a/src/main/java/gregtech/loaders/recipe/handlers/MaterialRecipeHandler.java +++ b/src/main/java/gregtech/loaders/recipe/handlers/MaterialRecipeHandler.java @@ -91,8 +91,7 @@ public static void processDust(OrePrefix dustPrefix, Material mat, DustProperty .inputs(GTUtility.copy(4, dustStack)) .outputs(GTUtility.copy(3, gemStack)) .chancedOutput(dust, Materials.DarkAsh, 2500, 0) - .explosivesType(new ItemStack(MetaBlocks.POWDERBARREL)) - .explosivesAmount(8) + .explosivesType(new ItemStack(MetaBlocks.POWDERBARREL, 8)) .buildAndRegister(); RecipeMaps.IMPLOSION_RECIPES.recipeBuilder() @@ -106,8 +105,7 @@ public static void processDust(OrePrefix dustPrefix, Material mat, DustProperty .inputs(GTUtility.copy(4, dustStack)) .outputs(GTUtility.copy(3, gemStack)) .chancedOutput(dust, Materials.DarkAsh, 2500, 0) - .explosivesType(MetaItems.DYNAMITE.getStackForm()) - .explosivesAmount(2) + .explosivesType(MetaItems.DYNAMITE.getStackForm(2)) .buildAndRegister(); } diff --git a/src/main/resources/assets/gregtech/blockstates/itnt.json b/src/main/resources/assets/gregtech/blockstates/itnt.json new file mode 100644 index 00000000000..79c7d216ccb --- /dev/null +++ b/src/main/resources/assets/gregtech/blockstates/itnt.json @@ -0,0 +1,16 @@ +{ + "forge_marker": 1, + "defaults": { + "model": "minecraft:cube_bottom_top", + "textures": { + "bottom": "minecraft:blocks/tnt_bottom", + "top": "minecraft:blocks/tnt_top", + "side": "gregtech:blocks/misc/itnt" + } + }, + "variants": { + "normal": [ + {} + ] + } +} diff --git a/src/main/resources/assets/gregtech/blockstates/powderbarrel.json b/src/main/resources/assets/gregtech/blockstates/powderbarrel.json index 7880a60d273..60d676619f5 100644 --- a/src/main/resources/assets/gregtech/blockstates/powderbarrel.json +++ b/src/main/resources/assets/gregtech/blockstates/powderbarrel.json @@ -3,7 +3,7 @@ "defaults": { "model": "minecraft:cube_all", "textures": { - "all": "gregtech:blocks/wood/powderbarrel" + "all": "gregtech:blocks/misc/powderbarrel" } }, "variants": { diff --git a/src/main/resources/assets/gregtech/lang/en_us.lang b/src/main/resources/assets/gregtech/lang/en_us.lang index 4decd67e358..38436e8da3d 100644 --- a/src/main/resources/assets/gregtech/lang/en_us.lang +++ b/src/main/resources/assets/gregtech/lang/en_us.lang @@ -2348,12 +2348,17 @@ tile.treated_wood_fence.name=Treated Wood Fence tile.rubber_wood_fence_gate.name=Rubber Wood Fence Gate tile.treated_wood_fence_gate.name=Treated Wood Fence Gate +tile.gt_explosive.breaking_tooltip=Primes explosion when mined, sneak mine to pick back up +tile.gt_explosive.lighting_tooltip=Cannot be lit with Redstone + tile.powderbarrel.name=Powderbarrel -tile.powderbarrel.drops_tooltip=Larger than TNT, drops all destroyed Blocks as Items -tile.powderbarrel.breaking_tooltip=Primes explosion when mined, sneak mine to pick back up -tile.powderbarrel.lighting_tooltip=Cannot be lit with Redstone +tile.powderbarrel.drops_tooltip=Slightly larger than TNT, drops all destroyed Blocks as Items entity.Powderbarrel.name=Powderbarrel +tile.itnt.name=Industrial TNT +tile.itnt.drops_tooltip=Much larger than TNT, drops all destroyed Blocks as Items +entity.ITNT.name=Industrial TNT + tile.brittle_charcoal.name=Brittle Charcoal tile.brittle_charcoal.tooltip.1=Produced by the Charcoal Pile Igniter. tile.brittle_charcoal.tooltip.2=Mine this to get Charcoal. diff --git a/src/main/resources/assets/gregtech/textures/blocks/misc/itnt.png b/src/main/resources/assets/gregtech/textures/blocks/misc/itnt.png new file mode 100644 index 0000000000000000000000000000000000000000..a167e1676b7580be61b14f3826bfb49e4cad4476 GIT binary patch literal 212 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`vproLLn>}1?|7^9_5YH&KmNZJ zTl9bWY>xlxQ_nL9S!5{xt8eW*@xOCd(|^yW{M^iW_y6%9etvH5@BTCH;>;T_{^Ut$ zYGl-5Sd=KC#&@|vr)?2iq@tPGu0)9(C$9IWD)H zQ&Ty~^1nL`EJf1Q$bayygUG~{_2k1-& MPgg&ebxsLQ0H8ovI{*Lx literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/gregtech/textures/blocks/wood/powderbarrel.png b/src/main/resources/assets/gregtech/textures/blocks/misc/powderbarrel.png similarity index 100% rename from src/main/resources/assets/gregtech/textures/blocks/wood/powderbarrel.png rename to src/main/resources/assets/gregtech/textures/blocks/misc/powderbarrel.png diff --git a/src/main/resources/gregtech_at.cfg b/src/main/resources/gregtech_at.cfg index 343dd1b65f5..76892c9fc05 100644 --- a/src/main/resources/gregtech_at.cfg +++ b/src/main/resources/gregtech_at.cfg @@ -81,3 +81,6 @@ protected net.minecraft.entity.item.EntityBoat field_184473_aH # lastYd # EntityItem public net.minecraft.entity.item.EntityItem field_145804_b # pickupDelay + +# Explosion +public net.minecraft.world.Explosion field_77283_e # exploder From 8887a5bbd01fcfa2e16a0d9f6474fcc420082ba8 Mon Sep 17 00:00:00 2001 From: serenibyss <10861407+serenibyss@users.noreply.github.com> Date: Tue, 19 Dec 2023 22:08:50 -0600 Subject: [PATCH 6/8] recipes --- .../gregtech/loaders/recipe/chemistry/ReactorRecipes.java | 8 ++++++++ .../loaders/recipe/handlers/MaterialRecipeHandler.java | 7 +++++++ 2 files changed, 15 insertions(+) diff --git a/src/main/java/gregtech/loaders/recipe/chemistry/ReactorRecipes.java b/src/main/java/gregtech/loaders/recipe/chemistry/ReactorRecipes.java index 7871a518e8c..ebe5ed15505 100644 --- a/src/main/java/gregtech/loaders/recipe/chemistry/ReactorRecipes.java +++ b/src/main/java/gregtech/loaders/recipe/chemistry/ReactorRecipes.java @@ -3,6 +3,7 @@ import gregtech.api.unification.OreDictUnifier; import gregtech.api.unification.material.MarkerMaterials; import gregtech.api.unification.material.Materials; +import gregtech.common.blocks.MetaBlocks; import gregtech.common.items.MetaItems; import net.minecraft.init.Blocks; @@ -570,6 +571,13 @@ public static void init() { .outputs(new ItemStack(Blocks.TNT)) .duration(200).EUt(24).buildAndRegister(); + CHEMICAL_RECIPES.recipeBuilder() + .inputs(MetaItems.GELLED_TOLUENE.getStackForm(4)) + .fluidInputs(NitrationMixture.getFluid(200)) + .outputs(new ItemStack(MetaBlocks.ITNT)) + .fluidOutputs(DilutedSulfuricAcid.getFluid(150)) + .duration(80).EUt(VA[HV]).buildAndRegister(); + CHEMICAL_RECIPES.recipeBuilder() .input(dust, SodiumHydroxide, 6) .fluidInputs(Dichlorobenzene.getFluid(1000)) diff --git a/src/main/java/gregtech/loaders/recipe/handlers/MaterialRecipeHandler.java b/src/main/java/gregtech/loaders/recipe/handlers/MaterialRecipeHandler.java index ca913733494..cbdf94add16 100644 --- a/src/main/java/gregtech/loaders/recipe/handlers/MaterialRecipeHandler.java +++ b/src/main/java/gregtech/loaders/recipe/handlers/MaterialRecipeHandler.java @@ -107,6 +107,13 @@ public static void processDust(OrePrefix dustPrefix, Material mat, DustProperty .chancedOutput(dust, Materials.DarkAsh, 2500, 0) .explosivesType(MetaItems.DYNAMITE.getStackForm(2)) .buildAndRegister(); + + RecipeMaps.IMPLOSION_RECIPES.recipeBuilder() + .inputs(GTUtility.copy(4, dustStack)) + .outputs(GTUtility.copy(3, gemStack)) + .chancedOutput(dust, Materials.DarkAsh, 2500, 0) + .explosivesType(new ItemStack(MetaBlocks.ITNT)) + .buildAndRegister(); } if (oreProperty != null) { From df44aebe8ceffc31a2bf51ded473901a28789736 Mon Sep 17 00:00:00 2001 From: serenibyss <10861407+serenibyss@users.noreply.github.com> Date: Sat, 20 Jan 2024 13:14:51 -0600 Subject: [PATCH 7/8] fix for creative tab change --- .../gregtech/common/blocks/explosive/BlockGTExplosive.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/gregtech/common/blocks/explosive/BlockGTExplosive.java b/src/main/java/gregtech/common/blocks/explosive/BlockGTExplosive.java index e11a36f9cfe..e18a97abbbf 100644 --- a/src/main/java/gregtech/common/blocks/explosive/BlockGTExplosive.java +++ b/src/main/java/gregtech/common/blocks/explosive/BlockGTExplosive.java @@ -1,6 +1,6 @@ package gregtech.common.blocks.explosive; -import gregtech.api.GregTechAPI; +import gregtech.common.creativetab.GTCreativeTabs; import gregtech.common.entities.EntityGTExplosive; import net.minecraft.block.Block; @@ -47,7 +47,7 @@ public BlockGTExplosive(Material materialIn, boolean canRedstoneActivate, boolea this.canRedstoneActivate = canRedstoneActivate; this.explodeOnMine = explodeOnMine; this.fuseLength = fuseLength; - setCreativeTab(GregTechAPI.TAB_GREGTECH_TOOLS); + setCreativeTab(GTCreativeTabs.TAB_GREGTECH_TOOLS); } protected abstract EntityGTExplosive createEntity(World world, BlockPos pos, EntityLivingBase exploder); From f12403f744dd4ac4c6f3f74ce2feedf64709a65b Mon Sep 17 00:00:00 2001 From: serenibyss <10861407+serenibyss@users.noreply.github.com> Date: Mon, 29 Jan 2024 23:57:37 -0600 Subject: [PATCH 8/8] Use ITNT for explosive bee --- .../gregtech/integration/forestry/bees/GTBeeDefinition.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/gregtech/integration/forestry/bees/GTBeeDefinition.java b/src/main/java/gregtech/integration/forestry/bees/GTBeeDefinition.java index 97fed7a25c3..269e992be1b 100644 --- a/src/main/java/gregtech/integration/forestry/bees/GTBeeDefinition.java +++ b/src/main/java/gregtech/integration/forestry/bees/GTBeeDefinition.java @@ -5,6 +5,7 @@ import gregtech.api.unification.material.Materials; import gregtech.api.unification.ore.OrePrefix; import gregtech.api.unification.stack.UnificationEntry; +import gregtech.common.blocks.MetaBlocks; import gregtech.common.items.MetaItems; import gregtech.integration.IntegrationUtil; import gregtech.integration.forestry.ForestryModule; @@ -821,8 +822,7 @@ public enum GTBeeDefinition implements IBeeDefinition { }), EXPLOSIVE(GTBranchDefinition.GT_INDUSTRIAL, "Explosionis", false, 0x7E270F, 0x747474, beeSpecies -> { - beeSpecies.addProduct(new ItemStack(Blocks.TNT), 0.2f); - // todo if we add a ITNT substitute, put it here instead of TNT + beeSpecies.addProduct(new ItemStack(MetaBlocks.ITNT), 0.2f); beeSpecies.setHumidity(EnumHumidity.ARID); beeSpecies.setTemperature(EnumTemperature.HELLISH); beeSpecies.setHasEffect();