Skip to content
This repository has been archived by the owner on Dec 15, 2024. It is now read-only.

Add query/status option for packet dumping #38

Merged
merged 2 commits into from
Jan 1, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,10 +1,13 @@
package io.wispforest.gadget.mixin.client;

import io.wispforest.gadget.Gadget;
import io.wispforest.gadget.client.dump.ClientPacketDumper;
import io.wispforest.gadget.client.dump.DumpPrimer;
import io.wispforest.gadget.client.gui.ContextMenuScreens;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.gui.screen.multiplayer.MultiplayerScreen;
import net.minecraft.client.gui.screen.multiplayer.MultiplayerServerListWidget;
import net.minecraft.client.network.ServerInfo;
import net.minecraft.text.Text;
import org.lwjgl.glfw.GLFW;
import org.spongepowered.asm.mixin.Final;
Expand All @@ -14,10 +17,18 @@
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;

import java.net.UnknownHostException;

@Mixin(MultiplayerServerListWidget.ServerEntry.class)
public class MultiplayerServerEntryMixin {
public abstract class MultiplayerServerEntryMixin {
@Shadow @Final private MultiplayerScreen screen;

@Shadow @Final private ServerInfo server;

@Shadow @Final private MinecraftClient client;

@Shadow public abstract void saveFile();

@Inject(method = "mouseClicked", at = @At("HEAD"), cancellable = true)
private void onRightClick(double mouseX, double mouseY, int button, CallbackInfoReturnable<Boolean> cir) {
if (button != GLFW.GLFW_MOUSE_BUTTON_RIGHT) return;
Expand All @@ -29,8 +40,21 @@ private void onRightClick(double mouseX, double mouseY, int button, CallbackInfo

this.screen.select((MultiplayerServerListWidget.ServerEntry)(Object) this);
this.screen.connect();
})
.button(Text.translatable("text.gadget.query_with_dump"), dropdown2 -> {
ClientPacketDumper.start(false);

try {
this.screen.getServerListPinger().add(this.server, () -> this.client.execute(this::saveFile));
} catch (UnknownHostException var2x) {
this.server.ping = -1L;
this.server.label = MultiplayerServerListWidgetAccessor.getCANNOT_RESOLVE_TEXT();
} catch (Exception var3x) {
this.server.ping = -1L;
this.server.label = MultiplayerServerListWidgetAccessor.getCANNOT_CONNECT_TEXT();
}
});

cir.setReturnValue(true);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package io.wispforest.gadget.mixin.client;

import io.wispforest.gadget.client.dump.ClientPacketDumper;
import net.minecraft.client.network.MultiplayerServerListPinger;
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.callback.CallbackInfo;

@Mixin(MultiplayerServerListPinger.class)
public class MultiplayerServerListPingerMixin {

@Inject(method = "cancel", at = @At(value = "HEAD"))
private void stopDumpingOnCancel(CallbackInfo ci) {
if (ClientPacketDumper.isDumping()) {
ClientPacketDumper.stop();
}
}

@Mixin(targets = "net/minecraft/client/network/MultiplayerServerListPinger$1")
public static class ClientQueryPacketListenerImplMixin {

@Inject(method = "onPingResult", at = @At("HEAD"))
private void stopDumpingOnPingResult(CallbackInfo ci) {
if (ClientPacketDumper.isDumping()) {
ClientPacketDumper.stop();
}
}

@Inject(method = "onDisconnected", at = @At("HEAD"))
private void stopDumpingOnDisconnected(CallbackInfo ci) {
if (ClientPacketDumper.isDumping()) {
ClientPacketDumper.stop();
}
}

}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package io.wispforest.gadget.mixin.client;

import net.minecraft.client.gui.screen.multiplayer.MultiplayerServerListWidget;
import net.minecraft.text.Text;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Accessor;

@Mixin(MultiplayerServerListWidget.class)
public interface MultiplayerServerListWidgetAccessor {

@Accessor
static Text getCANNOT_RESOLVE_TEXT() {
throw new AssertionError();
}

@Accessor
static Text getCANNOT_CONNECT_TEXT() {
throw new AssertionError();
}

}
1 change: 1 addition & 0 deletions src/main/resources/assets/gadget/lang/en_us.json
Original file line number Diff line number Diff line change
Expand Up @@ -314,6 +314,7 @@
],
"text.gadget.hide_field": "Hide field",
"text.gadget.join_with_dump": "Join and start dumping packets",
"text.gadget.query_with_dump": "Query and start dumping packets",
"text.gadget.save_as_java": "Save as .java",
"text.gadget.save_as_class": "Save as .class",
"text.gadget.export_field_dump": "Export field dump",
Expand Down
3 changes: 3 additions & 0 deletions src/main/resources/gadget.mixins.json
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,9 @@
"client.MatrixStackMixin",
"client.MinecraftClientMixin",
"client.MultiplayerServerEntryMixin",
"client.MultiplayerServerListPingerMixin",
"client.MultiplayerServerListPingerMixin$ClientQueryPacketListenerImplMixin",
"client.MultiplayerServerListWidgetAccessor",
"client.NarratorMixin",
"client.ProfileKeysImplMixin",
"client.WorldListWidgetWorldEntryMixin",
Expand Down
Loading