diff --git a/src/main/java/com/github/zly2006/carpetslsaddition/mixin/legacy/FallingBlockMixin.java b/src/main/java/com/github/zly2006/carpetslsaddition/mixin/legacy/FallingBlockMixin.java
index 40e138d..1bd88be 100644
--- a/src/main/java/com/github/zly2006/carpetslsaddition/mixin/legacy/FallingBlockMixin.java
+++ b/src/main/java/com/github/zly2006/carpetslsaddition/mixin/legacy/FallingBlockMixin.java
@@ -10,6 +10,7 @@ import net.minecraft.world.level.block.state.BlockState;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
+import org.spongepowered.asm.mixin.injection.ModifyArg;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
@@ -19,16 +20,17 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
*
1.12:世界装饰时短暂开启 instantFall,使重力方块在被更新时【立即】转为下落实体,
* 而不等待 2gt 的计划刻延迟。26.1.2 已移除该 flag。
*
- *
实现:
+ *
实现方式(双保险):
*
- * - {@link #legacyDelayAfterPlace}:规则开启时把放置后的延迟改为 0,使下落尽快触发。
- * - {@link #legacyTick}:保留 tick 入口的标记逻辑。
+ * - {@link #legacyDelayAfterPlace}:把 {@code getDelayAfterPlace()} 的返回值改为 0。
+ * - {@link #legacyScheduleDelay}:直接拦截 {@code onPlace}/{@code updateShape} 里
+ * 对 {@code scheduleTick} 的 delay 参数,强制改为 0(更直接可靠)。
*
*/
@Mixin(FallingBlock.class)
public abstract class FallingBlockMixin {
- /** instantFall:把"放置后延迟"改为 0(最小延迟)。 */
+ /** instantFall:把"放置后延迟"改为 0。 */
@Inject(method = "getDelayAfterPlace", at = @At("HEAD"), cancellable = true)
private void legacyDelayAfterPlace(CallbackInfoReturnable cir) {
if (SLSCarpetSettings.legacyExploitMode && SLSCarpetSettings.legacyInstantFall) {
@@ -36,6 +38,36 @@ public abstract class FallingBlockMixin {
}
}
+ /**
+ * instantFall:拦截 onPlace / updateShape 里 scheduleTick 的 delay 参数,强制为 0。
+ * 第 3 个参数(index=2)是延迟 tick 数。
+ */
+ @ModifyArg(
+ method = "onPlace",
+ at = @At(value = "INVOKE",
+ target = "Lnet/minecraft/world/level/Level;scheduleTick(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/Block;I)V"),
+ index = 2
+ )
+ private int legacyScheduleDelayLevel(int delay) {
+ if (SLSCarpetSettings.legacyExploitMode && SLSCarpetSettings.legacyInstantFall) {
+ return 0;
+ }
+ return delay;
+ }
+
+ @ModifyArg(
+ method = "updateShape",
+ at = @At(value = "INVOKE",
+ target = "Lnet/minecraft/world/level/ScheduledTickAccess;scheduleTick(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/Block;I)V"),
+ index = 2
+ )
+ private int legacyScheduleDelayAccess(int delay) {
+ if (SLSCarpetSettings.legacyExploitMode && SLSCarpetSettings.legacyInstantFall) {
+ return 0;
+ }
+ return delay;
+ }
+
/** instantFall:tick 入口标记(供其他机制判断窗口)。 */
@Inject(method = "tick", at = @At("HEAD"))
private void legacyTick(BlockState state, ServerLevel level, BlockPos pos, RandomSource rand, CallbackInfo ci) {