9
0
mirror of https://github.com/Xiao-MoMi/craft-engine.git synced 2025-12-27 02:49:15 +00:00

fix number argument

This commit is contained in:
XiaoMoMi
2025-03-23 23:32:29 +08:00
parent 1b2936d53e
commit 0c4a0a4e3d
8 changed files with 50 additions and 12 deletions

View File

@@ -100,7 +100,7 @@ resource-pack:
path: "pack.mcmeta"
resolution:
type: merge_pack_mcmeta
description: "<gray>CraftEngine ResourcePack"
description: "<gray>CraftEngine ResourcePack</gray>"
- term:
type: exact
path: "pack.png"

View File

@@ -11,6 +11,7 @@ public class BukkitBlockBehaviors extends BlockBehaviors {
public static final Key STRIPPABLE_BLOCK = Key.from("craftengine:strippable_block");
public static final Key SAPLING_BLOCK = Key.from("craftengine:sapling_block");
public static final Key ON_LIQUID_BLOCK = Key.from("craftengine:on_liquid_block");
public static final Key CONCRETE_POWDER_BLOCK = Key.from("craftengine:concrete_powder_block");
public static void init() {
register(EMPTY, (block, args) -> EmptyBlockBehavior.INSTANCE);

View File

@@ -0,0 +1,8 @@
package net.momirealms.craftengine.bukkit.block.behavior;
public class ConcretePowderBlockBehavior extends FallingBlockBehavior {
public ConcretePowderBlockBehavior(float hurtAmount, int maxHurt) {
super(hurtAmount, maxHurt);
}
}

View File

@@ -77,7 +77,7 @@ public class FallingBlockBehavior extends BlockBehavior {
}
@Override
public void onBrokenAfterFall(Object thisBlock, Object[] args, Callable<Object> superMethod) throws Exception {
public void onBrokenAfterFall(Object thisBlock, Object[] args) throws Exception {
// Use EntityRemoveEvent for 1.20.3+
if (VersionHelper.isVersionNewerThan1_20_3()) return;
Object level = args[0];

View File

@@ -228,6 +228,15 @@ public class BukkitInjector {
.and(ElementMatchers.takesArgument(2, Reflections.clazz$FallingBlockEntity))
)
.intercept(MethodDelegation.to(OnBrokenAfterFallInterceptor.INSTANCE))
// onLand
.method(ElementMatchers.takesArguments(5)
.and(ElementMatchers.takesArgument(0, Reflections.clazz$Level))
.and(ElementMatchers.takesArgument(1, Reflections.clazz$BlockPos))
.and(ElementMatchers.takesArgument(2, Reflections.clazz$BlockState))
.and(ElementMatchers.takesArgument(3, Reflections.clazz$BlockState))
.and(ElementMatchers.takesArgument(4, Reflections.clazz$FallingBlockEntity))
)
.intercept(MethodDelegation.to(OnLandInterceptor.INSTANCE))
// canSurvive
.method(ElementMatchers.takesArguments(3)
.and(ElementMatchers.takesArgument(0, Reflections.clazz$BlockState))
@@ -754,14 +763,28 @@ public class BukkitInjector {
}
}
public static class OnLandInterceptor {
public static final OnLandInterceptor INSTANCE = new OnLandInterceptor();
@RuntimeType
public void intercept(@This Object thisObj, @AllArguments Object[] args) {
ObjectHolder<BlockBehavior> holder = ((BehaviorHolder) thisObj).getBehaviorHolder();
try {
holder.value().onLand(thisObj, args);
} catch (Exception e) {
CraftEngine.instance().logger().severe("Failed to run onLand", e);
}
}
}
public static class OnBrokenAfterFallInterceptor {
public static final OnBrokenAfterFallInterceptor INSTANCE = new OnBrokenAfterFallInterceptor();
@RuntimeType
public void intercept(@This Object thisObj, @AllArguments Object[] args, @SuperCall Callable<Object> superMethod) {
public void intercept(@This Object thisObj, @AllArguments Object[] args) {
ObjectHolder<BlockBehavior> holder = ((BehaviorHolder) thisObj).getBehaviorHolder();
try {
holder.value().onBrokenAfterFall(thisObj, args, superMethod);
holder.value().onBrokenAfterFall(thisObj, args);
} catch (Exception e) {
CraftEngine.instance().logger().severe("Failed to run onBrokenAfterFall", e);
}

View File

@@ -217,6 +217,8 @@ public class TemplateManagerImpl implements TemplateManager {
} else if (rawArgument == null) {
// 使用 null 覆写其父参数内容
result.put(placeholder, NullTemplateArgument.INSTANCE);
} else if (rawArgument instanceof Number number) {
result.put(placeholder, new ObjectTemplateArgument(number));
} else {
// 将参数字符串化后,应用参数再放入
Object applied = applyArgument(rawArgument.toString(), parentArguments);

View File

@@ -107,10 +107,7 @@ public class CraftEngineBlock extends Block implements BehaviorHolder, ShapeHold
@Override
public void onBrokenAfterFall(@NotNull Level level, @NotNull BlockPos pos, @NotNull FallingBlockEntity fallingBlock) {
try {
behaviorHolder.value().onBrokenAfterFall(this, new Object[]{level, pos, fallingBlock}, () -> {
Fallable.super.onBrokenAfterFall(level, pos, fallingBlock);
return null;
});
behaviorHolder.value().onBrokenAfterFall(this, new Object[]{level, pos, fallingBlock});
} catch (Exception e) {
e.printStackTrace();
Fallable.super.onBrokenAfterFall(level, pos, fallingBlock);
@@ -209,4 +206,13 @@ public class CraftEngineBlock extends Block implements BehaviorHolder, ShapeHold
e.printStackTrace();
}
}
@Override
public void onLand(@NotNull Level level, @NotNull BlockPos pos, @NotNull BlockState state, @NotNull BlockState replaceableState, @NotNull FallingBlockEntity fallingBlock) {
try {
behaviorHolder.value().onLand(this, new Object[]{level, pos, state, replaceableState, fallingBlock});
} catch (Exception e) {
e.printStackTrace();
}
}
}

View File

@@ -28,12 +28,10 @@ public abstract class BlockBehavior {
return (boolean) superMethod.call();
}
public void onBrokenAfterFall(Object thisBlock, Object[] args, Callable<Object> superMethod) throws Exception {
superMethod.call();
public void onBrokenAfterFall(Object thisBlock, Object[] args) throws Exception {
}
public void onLand(Object thisBlock, Object[] args, Callable<Object> superMethod) throws Exception {
superMethod.call();
public void onLand(Object thisBlock, Object[] args) throws Exception {
}
public boolean isValidBoneMealTarget(Object thisBlock, Object[] args) throws Exception {