diff --git a/bukkit/loader/src/main/resources/resources/default/configuration/blocks.yml b/bukkit/loader/src/main/resources/resources/default/configuration/blocks.yml index ff87524ab..da5e39a12 100644 --- a/bukkit/loader/src/main/resources/resources/default/configuration/blocks.yml +++ b/bukkit/loader/src/main/resources/resources/default/configuration/blocks.yml @@ -314,4 +314,15 @@ recipes#misc: A: "minecraft:gunpowder" result: id: default:gunpowder_block + count: 1 + default:copper_coil: + type: shaped + pattern: + - "AAA" + - "A A" + - "AAA" + ingredients: + A: "minecraft:copper_ingot" + result: + id: default:copper_coil count: 1 \ No newline at end of file diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/BukkitBlockShape.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/BukkitBlockShape.java index a349d33a9..fb9bcfb8a 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/BukkitBlockShape.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/BukkitBlockShape.java @@ -1,6 +1,6 @@ package net.momirealms.craftengine.bukkit.block; -import net.momirealms.craftengine.bukkit.util.Reflections; +import net.momirealms.craftengine.bukkit.nms.FastNMS; import net.momirealms.craftengine.shared.block.BlockShape; public class BukkitBlockShape implements BlockShape { @@ -11,7 +11,12 @@ public class BukkitBlockShape implements BlockShape { } @Override - public Object getShape(Object thisObj, Object[] args) throws Exception { - return Reflections.method$BlockBehaviour$getShape.invoke(Reflections.field$StateHolder$owner.get(this.rawBlockState), this.rawBlockState, args[1], args[2], args[3]); + public Object getShape(Object thisObj, Object[] args) { + return FastNMS.INSTANCE.method$BlockState$getShape(this.rawBlockState, args[1], args[2], args[3]); + } + + @Override + public Object getCollisionShape(Object thisObj, Object[] args) { + return FastNMS.INSTANCE.method$BlockState$getCollisionShape(this.rawBlockState, args[1], args[2], args[3]); } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/NearLiquidBlockBehavior.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/NearLiquidBlockBehavior.java index e9e740470..dc5554c0f 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/NearLiquidBlockBehavior.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/NearLiquidBlockBehavior.java @@ -93,7 +93,7 @@ public class NearLiquidBlockBehavior extends AbstractCanSurviveBlockBehavior { if (Reflections.method$FluidState$getType.invoke(fluidStateAbove) != Reflections.instance$Fluids$EMPTY) { return false; } - if (this.onWater && (WATER.contains(Reflections.method$FluidState$getType.invoke(fluidState)) || Reflections.field$StateHolder$owner.get(belowState) == Reflections.instance$Blocks$ICE)) { + if (this.onWater && (WATER.contains(Reflections.method$FluidState$getType.invoke(fluidState)) || FastNMS.INSTANCE.method$BlockState$getBlock(belowState) == Reflections.instance$Blocks$ICE)) { return true; } if (this.onLava && LAVA.contains(Reflections.method$FluidState$getType.invoke(fluidState))) { diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/OnLiquidBlockBehavior.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/OnLiquidBlockBehavior.java index 541b1d40e..5fb023c2b 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/OnLiquidBlockBehavior.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/OnLiquidBlockBehavior.java @@ -71,7 +71,7 @@ public class OnLiquidBlockBehavior extends AbstractCanSurviveBlockBehavior { if (Reflections.method$FluidState$getType.invoke(fluidStateAbove) != Reflections.instance$Fluids$EMPTY) { return false; } - if (this.onWater && (Reflections.method$FluidState$getType.invoke(fluidState) == Reflections.instance$Fluids$WATER || Reflections.field$StateHolder$owner.get(belowState) == Reflections.instance$Blocks$ICE)) { + if (this.onWater && (Reflections.method$FluidState$getType.invoke(fluidState) == Reflections.instance$Fluids$WATER || FastNMS.INSTANCE.method$BlockState$getBlock(belowState) == Reflections.instance$Blocks$ICE)) { return true; } if (this.onLava && Reflections.method$FluidState$getType.invoke(fluidState) == Reflections.instance$Fluids$LAVA) { diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/injector/BukkitInjector.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/injector/BukkitInjector.java index a90781574..4213341cb 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/injector/BukkitInjector.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/injector/BukkitInjector.java @@ -248,6 +248,9 @@ public class BukkitInjector { // getShape .method(ElementMatchers.is(Reflections.method$BlockBehaviour$getShape)) .intercept(MethodDelegation.to(GetShapeInterceptor.INSTANCE)) + // getCollisionShape + .method(ElementMatchers.is(Reflections.method$BlockBehaviour$getCollisionShape)) + .intercept(MethodDelegation.to(GetCollisionShapeInterceptor.INSTANCE)) // mirror .method(ElementMatchers.is(Reflections.method$BlockBehaviour$mirror)) .intercept(MethodDelegation.to(MirrorInterceptor.INSTANCE)) @@ -923,6 +926,21 @@ public class BukkitInjector { } } + public static class GetCollisionShapeInterceptor { + public static final GetCollisionShapeInterceptor INSTANCE = new GetCollisionShapeInterceptor(); + + @RuntimeType + public Object intercept(@This Object thisObj, @AllArguments Object[] args, @SuperCall Callable superMethod) throws Exception { + ObjectHolder holder = ((ShapeHolder) thisObj).getShapeHolder(); + try { + return holder.value().getCollisionShape(thisObj, args); + } catch (Exception e) { + CraftEngine.instance().logger().severe("Failed to run getCollisionShape", e); + return superMethod.call(); + } + } + } + public static class MirrorInterceptor { public static final MirrorInterceptor INSTANCE = new MirrorInterceptor(); diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketConsumers.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketConsumers.java index 66f26b85a..230f8d88f 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketConsumers.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketConsumers.java @@ -1209,7 +1209,7 @@ public class PacketConsumers { // not a custom block if (BlockStateUtils.isVanillaBlock(stateId)) { if (Config.enableSoundSystem()) { - Object blockOwner = Reflections.field$StateHolder$owner.get(blockState); + Object blockOwner = FastNMS.INSTANCE.method$BlockState$getBlock(blockState); if (BukkitBlockManager.instance().isBlockSoundRemoved(blockOwner)) { player.startMiningBlock(pos, blockState, null); return; diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/user/BukkitServerPlayer.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/user/BukkitServerPlayer.java index ad1375138..c84f97b9f 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/user/BukkitServerPlayer.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/user/BukkitServerPlayer.java @@ -531,7 +531,7 @@ public class BukkitServerPlayer extends Player { // send hit sound if the sound is removed if (currentTick - this.lastHitBlockTime > 3) { - Object blockOwner = Reflections.field$StateHolder$owner.get(this.destroyedState); + Object blockOwner = FastNMS.INSTANCE.method$BlockState$getBlock(this.destroyedState); Object soundType = Reflections.field$BlockBehaviour$soundType.get(blockOwner); Object soundEvent = Reflections.field$SoundType$hitSound.get(soundType); Object soundId = FastNMS.INSTANCE.field$SoundEvent$location(soundEvent); diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/BlockStateUtils.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/BlockStateUtils.java index 6e167553e..253fadb01 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/BlockStateUtils.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/BlockStateUtils.java @@ -140,11 +140,7 @@ public class BlockStateUtils { } public static Object getBlockOwner(Object blockState) { - try { - return Reflections.field$StateHolder$owner.get(blockState); - } catch (ReflectiveOperationException e) { - throw new RuntimeException(e); - } + return FastNMS.INSTANCE.method$BlockState$getBlock(blockState); } public static int physicsEventToId(BlockPhysicsEvent event) throws ReflectiveOperationException { diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/Reflections.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/Reflections.java index 9e67f24c6..72fcbeb70 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/Reflections.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/Reflections.java @@ -2523,11 +2523,11 @@ public class Reflections { ) ); - public static final Field field$StateHolder$owner = requireNonNull( - ReflectionUtils.getDeclaredField( - clazz$StateHolder, Object.class, 0 - ) - ); +// public static final Field field$StateHolder$owner = requireNonNull( +// ReflectionUtils.getDeclaredField( +// clazz$StateHolder, Object.class, 0 +// ) +// ); public static final Class clazz$CollisionContext = requireNonNull( BukkitReflectionUtils.findReobfOrMojmapClass( @@ -2542,6 +2542,12 @@ public class Reflections { ) ); + public static final Method method$BlockBehaviour$getCollisionShape = requireNonNull( + ReflectionUtils.getDeclaredMethod( + clazz$BlockBehaviour, clazz$VoxelShape, new String[]{"getCollisionShape", "c"}, clazz$BlockState, clazz$BlockGetter, clazz$BlockPos, clazz$CollisionContext + ) + ); + public static final Method method$BlockBehaviour$tick = requireNonNull( ReflectionUtils.getDeclaredMethod( clazz$BlockBehaviour, void.class, new String[]{"tick", "a"}, clazz$BlockState, clazz$ServerLevel, clazz$BlockPos, clazz$RandomSource @@ -6803,4 +6809,10 @@ public class Reflections { Optional.ofNullable(ReflectionUtils.getDeclaredMethod(clazz$BlockBehaviour, void.class, clazz$BlockState, clazz$Level, clazz$BlockPos, clazz$Block, clazz$BlockPos, boolean.class)) .orElse(ReflectionUtils.getMethod(clazz$BlockBehaviour, void.class, clazz$BlockState, clazz$Level, clazz$BlockPos, clazz$Block, clazz$BlockPos, boolean.class)) ); + +// public static final Method method$BlockBehaviour$getEntityInsideCollisionShape = requireNonNull( +// ReflectionUtils.getDeclaredMethod( +// clazz$BlockBehaviour, clazz$VoxelShape, clazz$BlockState, clazz$BlockGetter, clazz$BlockPos, clazz$Entity +// ) +// ); } diff --git a/gradle.properties b/gradle.properties index b9f802a04..6179e467c 100644 --- a/gradle.properties +++ b/gradle.properties @@ -50,7 +50,7 @@ byte_buddy_version=1.17.5 ahocorasick_version=0.6.3 snake_yaml_version=2.4 anti_grief_version=0.17 -nms_helper_version=0.65.27 +nms_helper_version=0.65.30 evalex_version=3.5.0 reactive_streams_version=1.0.4 amazon_awssdk_version=2.31.23 diff --git a/server-mod/v1_20_1/src/main/java/net/momirealms/craftengine/mod/block/StoneBlockShape.java b/server-mod/v1_20_1/src/main/java/net/momirealms/craftengine/mod/block/StoneBlockShape.java index 6ebc977a6..348530720 100644 --- a/server-mod/v1_20_1/src/main/java/net/momirealms/craftengine/mod/block/StoneBlockShape.java +++ b/server-mod/v1_20_1/src/main/java/net/momirealms/craftengine/mod/block/StoneBlockShape.java @@ -17,4 +17,9 @@ public class StoneBlockShape implements BlockShape { public Object getShape(Object thisObj, Object[] args) { return rawBlockState.getShape((BlockGetter) args[1], (BlockPos) args[2], (CollisionContext) args[3]); } + + @Override + public Object getCollisionShape(Object thisObj, Object[] args) { + return rawBlockState.getCollisionShape((BlockGetter) args[1], (BlockPos) args[2], (CollisionContext) args[3]); + } } diff --git a/server-mod/v1_20_5/src/main/java/net/momirealms/craftengine/mod/block/StoneBlockShape.java b/server-mod/v1_20_5/src/main/java/net/momirealms/craftengine/mod/block/StoneBlockShape.java index 6ebc977a6..348530720 100644 --- a/server-mod/v1_20_5/src/main/java/net/momirealms/craftengine/mod/block/StoneBlockShape.java +++ b/server-mod/v1_20_5/src/main/java/net/momirealms/craftengine/mod/block/StoneBlockShape.java @@ -17,4 +17,9 @@ public class StoneBlockShape implements BlockShape { public Object getShape(Object thisObj, Object[] args) { return rawBlockState.getShape((BlockGetter) args[1], (BlockPos) args[2], (CollisionContext) args[3]); } + + @Override + public Object getCollisionShape(Object thisObj, Object[] args) { + return rawBlockState.getCollisionShape((BlockGetter) args[1], (BlockPos) args[2], (CollisionContext) args[3]); + } } diff --git a/server-mod/v1_21_5/src/main/java/net/momirealms/craftengine/mod/block/StoneBlockShape.java b/server-mod/v1_21_5/src/main/java/net/momirealms/craftengine/mod/block/StoneBlockShape.java index 6ebc977a6..348530720 100644 --- a/server-mod/v1_21_5/src/main/java/net/momirealms/craftengine/mod/block/StoneBlockShape.java +++ b/server-mod/v1_21_5/src/main/java/net/momirealms/craftengine/mod/block/StoneBlockShape.java @@ -17,4 +17,9 @@ public class StoneBlockShape implements BlockShape { public Object getShape(Object thisObj, Object[] args) { return rawBlockState.getShape((BlockGetter) args[1], (BlockPos) args[2], (CollisionContext) args[3]); } + + @Override + public Object getCollisionShape(Object thisObj, Object[] args) { + return rawBlockState.getCollisionShape((BlockGetter) args[1], (BlockPos) args[2], (CollisionContext) args[3]); + } } diff --git a/shared/src/main/java/net/momirealms/craftengine/shared/block/BlockShape.java b/shared/src/main/java/net/momirealms/craftengine/shared/block/BlockShape.java index 636e09ace..b33a42a03 100644 --- a/shared/src/main/java/net/momirealms/craftengine/shared/block/BlockShape.java +++ b/shared/src/main/java/net/momirealms/craftengine/shared/block/BlockShape.java @@ -3,4 +3,6 @@ package net.momirealms.craftengine.shared.block; public interface BlockShape { Object getShape(Object thisObj, Object[] args) throws Exception; + + Object getCollisionShape(Object thisObj, Object[] args); }