diff --git a/src/main/java/land/chipmunk/chipmunkmod/mixin/ClientPlayNetworkHandlerMixin.java b/src/main/java/land/chipmunk/chipmunkmod/mixin/ClientPlayNetworkHandlerMixin.java index a29165a..7891dbf 100644 --- a/src/main/java/land/chipmunk/chipmunkmod/mixin/ClientPlayNetworkHandlerMixin.java +++ b/src/main/java/land/chipmunk/chipmunkmod/mixin/ClientPlayNetworkHandlerMixin.java @@ -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 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) { @@ -138,18 +140,18 @@ public abstract class ClientPlayNetworkHandlerMixin { @Inject(method = "onPlayerPositionLook", at = @At("TAIL")) private void setPosition (final PlayerPositionLookS2CPacket packet, final CallbackInfo ci) { final Vec3d position = packet.change().position(); - + final BlockPos origin = CommandCore.INSTANCE.origin; if (origin == null) { CommandCore.INSTANCE.move(position); return; } - + final MinecraftClient client = MinecraftClient.getInstance(); final ClientPlayerEntity player = client.player; - + if (player == null) return; - + final int distanceSquared = player.getChunkPos().getSquaredDistance(new ChunkPos(origin)); final int distance = (int) Math.sqrt(distanceSquared); @@ -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 original) { + return true; + } } diff --git a/src/main/java/land/chipmunk/chipmunkmod/mixin/DebugChartAccessor.java b/src/main/java/land/chipmunk/chipmunkmod/mixin/DebugChartAccessor.java new file mode 100644 index 0000000..4144de8 --- /dev/null +++ b/src/main/java/land/chipmunk/chipmunkmod/mixin/DebugChartAccessor.java @@ -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 (); +} diff --git a/src/main/java/land/chipmunk/chipmunkmod/mixin/DebugHudAccessor.java b/src/main/java/land/chipmunk/chipmunkmod/mixin/DebugHudAccessor.java new file mode 100644 index 0000000..f780576 --- /dev/null +++ b/src/main/java/land/chipmunk/chipmunkmod/mixin/DebugHudAccessor.java @@ -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 (); +} diff --git a/src/main/java/land/chipmunk/chipmunkmod/modules/CommandCore.java b/src/main/java/land/chipmunk/chipmunkmod/modules/CommandCore.java index 28eb5c6..ff14dc3 100644 --- a/src/main/java/land/chipmunk/chipmunkmod/modules/CommandCore.java +++ b/src/main/java/land/chipmunk/chipmunkmod/modules/CommandCore.java @@ -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; diff --git a/src/main/resources/chipmunkmod.mixins.json b/src/main/resources/chipmunkmod.mixins.json index e87c418..47e5989 100644 --- a/src/main/resources/chipmunkmod.mixins.json +++ b/src/main/resources/chipmunkmod.mixins.json @@ -11,6 +11,8 @@ "ClientPlayerEntityMixin", "ClientPlayNetworkHandlerMixin", "ClientWorldAccessor", + "DebugChartAccessor", + "DebugHudAccessor", "MinecraftClientAccessor", "StringHelperMixin", "ElderGuardianAppearanceParticleMixin",