fix: use player latency instead of fixed 50ms

This commit is contained in:
Chayapak Supasakul 2025-10-20 09:20:30 +07:00
parent 27757485d1
commit 8ab48747c3
Signed by: ChomeNS
SSH key fingerprint: SHA256:0YoxhdyXsgbc0nfeB2N6FYE60mxMU7DS4uCUMaw2mvA
5 changed files with 69 additions and 9 deletions

View file

@ -10,6 +10,7 @@ import land.chipmunk.chipmunkmod.listeners.ListenerManager;
import land.chipmunk.chipmunkmod.modules.*;
import land.chipmunk.chipmunkmod.modules.custom_chat.CustomChat;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.gui.hud.DebugHud;
import net.minecraft.client.gui.hud.InGameHud;
import net.minecraft.client.network.ClientPlayNetworkHandler;
import net.minecraft.client.network.ClientPlayerEntity;
@ -43,7 +44,8 @@ public abstract class ClientPlayNetworkHandlerMixin {
@Shadow
private CommandDispatcher<CommandSource> commandDispatcher;
@Shadow public abstract ClientWorld getWorld ();
@Shadow
public abstract ClientWorld getWorld ();
@Inject(method = "onGameJoin", at = @At("TAIL"))
private void onGameJoin (final GameJoinS2CPacket packet, final CallbackInfo ci) {
@ -163,4 +165,15 @@ public abstract class ClientPlayNetworkHandlerMixin {
private void onWorldTimeUpdate (final WorldTimeUpdateS2CPacket packet, final CallbackInfo ci) {
for (final Listener listener : ListenerManager.listeners) listener.timeUpdate();
}
@WrapOperation(
method = "tick",
at = @At(
value = "INVOKE",
target = "Lnet/minecraft/client/gui/hud/DebugHud;shouldShowPacketSizeAndPingCharts()Z"
)
)
private boolean shouldShowPacketSizeAndPingCharts (final DebugHud instance, final Operation<Boolean> original) {
return true;
}
}

View file

@ -0,0 +1,12 @@
package land.chipmunk.chipmunkmod.mixin;
import net.minecraft.client.gui.hud.debug.chart.DebugChart;
import net.minecraft.util.profiler.log.MultiValueDebugSampleLog;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Accessor;
@Mixin(DebugChart.class)
public interface DebugChartAccessor {
@Accessor(value = "log")
MultiValueDebugSampleLog getLog ();
}

View file

@ -0,0 +1,12 @@
package land.chipmunk.chipmunkmod.mixin;
import net.minecraft.client.gui.hud.DebugHud;
import net.minecraft.client.gui.hud.debug.chart.PingChart;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Accessor;
@Mixin(DebugHud.class)
public interface DebugHudAccessor {
@Accessor(value = "pingChart")
PingChart getPingChart ();
}

View file

@ -5,6 +5,8 @@ import land.chipmunk.chipmunkmod.ChipmunkMod;
import land.chipmunk.chipmunkmod.listeners.Listener;
import land.chipmunk.chipmunkmod.listeners.ListenerManager;
import land.chipmunk.chipmunkmod.mixin.ClientWorldAccessor;
import land.chipmunk.chipmunkmod.mixin.DebugChartAccessor;
import land.chipmunk.chipmunkmod.mixin.DebugHudAccessor;
import net.minecraft.block.Block;
import net.minecraft.block.BlockState;
import net.minecraft.block.CommandBlock;
@ -12,6 +14,7 @@ import net.minecraft.block.FallingBlock;
import net.minecraft.block.entity.BlockEntityType;
import net.minecraft.block.entity.CommandBlockBlockEntity;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.gui.hud.debug.chart.PingChart;
import net.minecraft.client.network.ClientPlayNetworkHandler;
import net.minecraft.client.network.ClientPlayerEntity;
import net.minecraft.client.network.ClientPlayerInteractionManager;
@ -34,10 +37,14 @@ import net.minecraft.util.Pair;
import net.minecraft.util.Util;
import net.minecraft.util.hit.BlockHitResult;
import net.minecraft.util.math.*;
import net.minecraft.util.profiler.log.MultiValueDebugSampleLog;
import net.minecraft.world.chunk.Chunk;
import net.minecraft.world.dimension.DimensionType;
import java.util.*;
import java.util.Collections;
import java.util.Map;
import java.util.Timer;
import java.util.TimerTask;
import java.util.concurrent.CompletableFuture;
public class CommandCore implements Listener {
@ -403,7 +410,7 @@ public class CommandCore implements Listener {
}
};
timer.schedule(queryTask, 50);
timer.schedule(queryTask, 50 + getNextTickWaitTime());
incrementCurrentBlock();
@ -519,7 +526,7 @@ public class CommandCore implements Listener {
);
}
}
}, 50 * 2);
}, 50 + getNextTickWaitTime());
} else {
final StringBuilder oldBlockString = new StringBuilder(Registries.BLOCK.getId(oldBlockState.getBlock()).toString());
if (!oldBlockState.getProperties().isEmpty()) {
@ -558,7 +565,8 @@ public class CommandCore implements Listener {
// we don't want to place a block inside ourselves
if (boundingBox.intersects(new Vec3d(blockPos), new Vec3d(blockPos))) continue;
final BlockState blockState = player.getEntityWorld().getBlockState(blockPos);
if (blockState.getBlock() instanceof FallingBlock) continue;
if (blockState.getBlock() instanceof FallingBlock || blockState.getBlock() instanceof CommandBlock)
continue;
final boolean replaceable = blockState.isIn(BlockTags.REPLACEABLE);
if (
!replaceable
@ -577,6 +585,19 @@ public class CommandCore implements Listener {
return null;
}
private int getNextTickWaitTime () {
final PingChart pingChart = ((DebugHudAccessor) client.getDebugHud()).getPingChart();
final MultiValueDebugSampleLog log = ((DebugChartAccessor) pingChart).getLog();
long sum = 0L;
for (int i = 0; i < log.getLength(); ++i) {
sum += log.get(0);
}
return Math.min(Math.round((float) sum / log.getLength()), 5 * 1000);
}
public void cleanup () {
if (timer == null) return;

View file

@ -11,6 +11,8 @@
"ClientPlayerEntityMixin",
"ClientPlayNetworkHandlerMixin",
"ClientWorldAccessor",
"DebugChartAccessor",
"DebugHudAccessor",
"MinecraftClientAccessor",
"StringHelperMixin",
"ElderGuardianAppearanceParticleMixin",