From d566db0fc5e26e63ecaf63df6c21ffa123012490 Mon Sep 17 00:00:00 2001 From: Sen Date: Mon, 16 Jun 2025 10:31:48 +0200 Subject: [PATCH] improve bullet physics --- common/src/main/java/common/block/Block.java | 4 ++++ .../main/java/common/block/artificial/BlockGlass.java | 7 +++++++ .../src/main/java/common/block/artificial/BlockPane.java | 6 ++++++ .../main/java/common/block/artificial/BlockSkull.java | 6 ++++++ .../main/java/common/block/natural/BlockGlowstone.java | 8 ++++++++ .../main/java/common/entity/projectile/EntityBullet.java | 9 ++++++--- common/src/main/java/common/init/ItemRegistry.java | 2 +- 7 files changed, 38 insertions(+), 4 deletions(-) diff --git a/common/src/main/java/common/block/Block.java b/common/src/main/java/common/block/Block.java index 6fef32c..e7d2cc6 100755 --- a/common/src/main/java/common/block/Block.java +++ b/common/src/main/java/common/block/Block.java @@ -1008,4 +1008,8 @@ public class Block { public void onDestroyedByFire(World world, BlockPos pos, State state) { } + + public boolean onShot(World world, BlockPos pos, State state, Entity projectile) { + return this.material.blocksMovement(); + } } diff --git a/common/src/main/java/common/block/artificial/BlockGlass.java b/common/src/main/java/common/block/artificial/BlockGlass.java index feb69da..e331570 100755 --- a/common/src/main/java/common/block/artificial/BlockGlass.java +++ b/common/src/main/java/common/block/artificial/BlockGlass.java @@ -2,6 +2,7 @@ package common.block.artificial; import common.block.Block; import common.block.Material; +import common.entity.Entity; import common.item.CheatTab; import common.model.BlockLayer; import common.rng.Random; @@ -9,6 +10,7 @@ import common.util.BlockPos; import common.util.Facing; import common.world.IWorldAccess; import common.world.State; +import common.world.World; public class BlockGlass extends Block { public BlockGlass() { @@ -41,4 +43,9 @@ public class BlockGlass extends Block { Block block = state.getBlock(); return world.getState(pos.offset(side.getOpposite())) != state || (block != this && super.shouldSideBeRendered(world, pos, side)); } + + public boolean onShot(World world, BlockPos pos, State state, Entity projectile) { + world.destroyBlock(pos, true); + return false; + } } diff --git a/common/src/main/java/common/block/artificial/BlockPane.java b/common/src/main/java/common/block/artificial/BlockPane.java index edcbab6..2125ba3 100755 --- a/common/src/main/java/common/block/artificial/BlockPane.java +++ b/common/src/main/java/common/block/artificial/BlockPane.java @@ -209,6 +209,12 @@ public class BlockPane extends Block public boolean isMagnetic() { return this.material == Material.SOLID; } + + public boolean onShot(World world, BlockPos pos, State state, Entity projectile) { + if(this.material != Material.SOLID) + world.destroyBlock(pos, true); + return this.material == Material.SOLID; + } protected String getPaneBase(State state) { return "glass"; diff --git a/common/src/main/java/common/block/artificial/BlockSkull.java b/common/src/main/java/common/block/artificial/BlockSkull.java index 69d0ca2..f5f0c26 100755 --- a/common/src/main/java/common/block/artificial/BlockSkull.java +++ b/common/src/main/java/common/block/artificial/BlockSkull.java @@ -2,6 +2,7 @@ package common.block.artificial; import common.block.BlockDirectional; import common.block.Material; +import common.entity.Entity; import common.entity.types.EntityLiving; import common.init.Items; import common.item.Item; @@ -66,4 +67,9 @@ public class BlockSkull extends BlockDirectional { public boolean isXrayVisible() { return true; } + + public boolean onShot(World world, BlockPos pos, State state, Entity projectile) { + world.destroyBlock(pos, true); + return true; + } } diff --git a/common/src/main/java/common/block/natural/BlockGlowstone.java b/common/src/main/java/common/block/natural/BlockGlowstone.java index 9e39e91..77a18c2 100755 --- a/common/src/main/java/common/block/natural/BlockGlowstone.java +++ b/common/src/main/java/common/block/natural/BlockGlowstone.java @@ -2,12 +2,15 @@ package common.block.natural; import common.block.Block; import common.block.Material; +import common.entity.Entity; import common.init.Items; import common.item.CheatTab; import common.item.Item; import common.rng.Random; +import common.util.BlockPos; import common.util.ExtMath; import common.world.State; +import common.world.World; public class BlockGlowstone extends Block { @@ -40,6 +43,11 @@ public class BlockGlowstone extends Block { return Items.glowstone_dust; } + + public boolean onShot(World world, BlockPos pos, State state, Entity projectile) { + world.destroyBlock(pos, true); + return false; + } // /** // * Get the MapColor for this Block and the given BlockState diff --git a/common/src/main/java/common/entity/projectile/EntityBullet.java b/common/src/main/java/common/entity/projectile/EntityBullet.java index a96fbfc..bce48ca 100755 --- a/common/src/main/java/common/entity/projectile/EntityBullet.java +++ b/common/src/main/java/common/entity/projectile/EntityBullet.java @@ -16,6 +16,7 @@ import common.util.ExtMath; import common.util.HitPosition; import common.util.Vec3; import common.vars.Vars; +import common.world.State; import common.world.World; public class EntityBullet extends Entity implements IProjectile, IObjectData @@ -286,9 +287,11 @@ public class EntityBullet extends Entity implements IProjectile, IObjectData } else { - this.playSound(SoundEvent.METALHIT, 0.5F); - - this.setDead(); + State state = movingobjectposition.block != null ? this.worldObj.getState(movingobjectposition.block) : null; + if(state == null || state.getBlock().onShot(this.worldObj, movingobjectposition.block, state, this)) { + this.playSound(SoundEvent.METALHIT, 0.5F); + this.setDead(); + } } } diff --git a/common/src/main/java/common/init/ItemRegistry.java b/common/src/main/java/common/init/ItemRegistry.java index df94f8a..83b991e 100755 --- a/common/src/main/java/common/init/ItemRegistry.java +++ b/common/src/main/java/common/init/ItemRegistry.java @@ -519,7 +519,7 @@ public abstract class ItemRegistry { registerItem("poisonous_potato", (new ItemFood(2, false)).setPotionEffect(Potion.POISON, 5, 0, 0.6F).setDisplay("Giftige Kartoffel").setMaxStackSize(128)); registerItem("golden_carrot", (new ItemFood(6, false)).setDisplay("Goldene Karotte") .setPotionEffect(PotionHelper.goldenCarrotEffect).setTab(CheatTab.MISC)); - registerItem((new ItemSmallBlock(Blocks.skull)).setDisplay("Schädel")); + registerItem((new ItemSmallBlock(Blocks.skull)).setDisplay("Schädel").setTab(CheatTab.DECORATION)); registerItem("carrot_on_a_stick", (new ItemCarrotOnAStick()).setDisplay("Karottenrute")); registerItem("charge_crystal", (new ItemEffect()).setDisplay("Energiekristall").setTab(CheatTab.MISC).setColor(TextColor.DMAGENTA)); registerItem("pumpkin_pie", (new ItemFood(8, false)).setDisplay("Kürbiskuchen").setTab(CheatTab.MISC));