feat: instantFall改用ModifyArg直接改scheduleTick的delay参数
getDelayAfterPlace的hook可能被子类覆盖,改用ModifyArg拦截onPlace/updateShape的scheduleTick调用更可靠。
This commit is contained in:
1 parent
21f8e92f2e
commit
c42fffad3c
1 file changed
+36
-4
+36
-4
@@ -10,6 +10,7 @@ import net.minecraft.world.level.block.state.BlockState;
|
|||||||
import org.spongepowered.asm.mixin.Mixin;
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
import org.spongepowered.asm.mixin.injection.At;
|
import org.spongepowered.asm.mixin.injection.At;
|
||||||
import org.spongepowered.asm.mixin.injection.Inject;
|
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.CallbackInfo;
|
||||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
|
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
|
||||||
|
|
||||||
@@ -19,16 +20,17 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
|
|||||||
* <p>1.12:世界装饰时短暂开启 instantFall,使重力方块在被更新时【立即】转为下落实体,
|
* <p>1.12:世界装饰时短暂开启 instantFall,使重力方块在被更新时【立即】转为下落实体,
|
||||||
* 而不等待 2gt 的计划刻延迟。26.1.2 已移除该 flag。
|
* 而不等待 2gt 的计划刻延迟。26.1.2 已移除该 flag。
|
||||||
*
|
*
|
||||||
* <p>实现:
|
* <p>实现方式(双保险):
|
||||||
* <ul>
|
* <ul>
|
||||||
* <li>{@link #legacyDelayAfterPlace}:规则开启时把放置后的延迟改为 0,使下落尽快触发。</li>
|
* <li>{@link #legacyDelayAfterPlace}:把 {@code getDelayAfterPlace()} 的返回值改为 0。</li>
|
||||||
* <li>{@link #legacyTick}:保留 tick 入口的标记逻辑。</li>
|
* <li>{@link #legacyScheduleDelay}:直接拦截 {@code onPlace}/{@code updateShape} 里
|
||||||
|
* 对 {@code scheduleTick} 的 delay 参数,强制改为 0(更直接可靠)。</li>
|
||||||
* </ul>
|
* </ul>
|
||||||
*/
|
*/
|
||||||
@Mixin(FallingBlock.class)
|
@Mixin(FallingBlock.class)
|
||||||
public abstract class FallingBlockMixin {
|
public abstract class FallingBlockMixin {
|
||||||
|
|
||||||
/** instantFall:把"放置后延迟"改为 0(最小延迟)。 */
|
/** instantFall:把"放置后延迟"改为 0。 */
|
||||||
@Inject(method = "getDelayAfterPlace", at = @At("HEAD"), cancellable = true)
|
@Inject(method = "getDelayAfterPlace", at = @At("HEAD"), cancellable = true)
|
||||||
private void legacyDelayAfterPlace(CallbackInfoReturnable<Integer> cir) {
|
private void legacyDelayAfterPlace(CallbackInfoReturnable<Integer> cir) {
|
||||||
if (SLSCarpetSettings.legacyExploitMode && SLSCarpetSettings.legacyInstantFall) {
|
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 入口标记(供其他机制判断窗口)。 */
|
/** instantFall:tick 入口标记(供其他机制判断窗口)。 */
|
||||||
@Inject(method = "tick", at = @At("HEAD"))
|
@Inject(method = "tick", at = @At("HEAD"))
|
||||||
private void legacyTick(BlockState state, ServerLevel level, BlockPos pos, RandomSource rand, CallbackInfo ci) {
|
private void legacyTick(BlockState state, ServerLevel level, BlockPos pos, RandomSource rand, CallbackInfo ci) {
|
||||||
|
|||||||
Reference in new issue
Block a user