Skip to content

Commit fb37b18

Browse files
committed
Add Upload item hotkey
fix #11
1 parent 07b9e05 commit fb37b18

File tree

3 files changed

+78
-70
lines changed

3 files changed

+78
-70
lines changed

src/client/java/com/coflnet/CoflModClient.java

Lines changed: 60 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,16 @@
11
package com.coflnet;
22

3-
import CoflCore.CoflCore;
4-
import CoflCore.classes.*;
5-
import CoflCore.CoflSkyCommand;
6-
import CoflCore.commands.Command;
7-
import CoflCore.commands.CommandType;
8-
import CoflCore.commands.models.FlipData;
9-
import CoflCore.configuration.Config;
10-
import CoflCore.configuration.Configuration;
11-
import CoflCore.configuration.LocalConfig;
12-
import CoflCore.events.OnSettingsReceive;
13-
import CoflCore.handlers.DescriptionHandler;
14-
import CoflCore.handlers.EventRegistry;
15-
import CoflCore.network.QueryServerCommands;
16-
import CoflCore.network.WSClient;
17-
import com.mojang.brigadier.Message;
18-
import it.unimi.dsi.fastutil.objects.ObjectArrayList;
3+
import java.io.ByteArrayOutputStream;
4+
import java.io.IOException;
5+
import java.lang.reflect.Field;
6+
import java.nio.file.Path;
7+
import java.util.ArrayList;
8+
import java.util.Arrays;
9+
import java.util.Base64;
10+
import java.util.Collections;
11+
import java.util.List;
12+
13+
import org.lwjgl.glfw.GLFW;
1914

2015
import com.coflnet.gui.RenderUtils;
2116
import com.coflnet.gui.cofl.CoflBinGUI;
@@ -24,10 +19,18 @@
2419
import com.google.gson.GsonBuilder;
2520
import com.google.gson.JsonElement;
2621
import com.google.gson.JsonObject;
27-
import com.mojang.authlib.minecraft.client.ObjectMapper;
22+
import com.mojang.brigadier.Message;
2823
import com.mojang.brigadier.arguments.StringArgumentType;
29-
import com.mojang.serialization.DataResult;
30-
import com.mojang.serialization.JsonOps;
24+
25+
import CoflCore.CoflCore;
26+
import CoflCore.CoflSkyCommand;
27+
import CoflCore.commands.Command;
28+
import CoflCore.commands.CommandType;
29+
import CoflCore.commands.RawCommand;
30+
import CoflCore.commands.models.FlipData;
31+
import CoflCore.handlers.DescriptionHandler;
32+
import CoflCore.handlers.EventRegistry;
33+
import it.unimi.dsi.fastutil.objects.ObjectArrayList;
3134
import net.fabricmc.api.ClientModInitializer;
3235
import net.fabricmc.fabric.api.client.command.v2.ClientCommandManager;
3336
import net.fabricmc.fabric.api.client.command.v2.ClientCommandRegistrationCallback;
@@ -36,77 +39,45 @@
3639
import net.fabricmc.fabric.api.client.item.v1.ItemTooltipCallback;
3740
import net.fabricmc.fabric.api.client.keybinding.v1.KeyBindingHelper;
3841
import net.fabricmc.fabric.api.client.message.v1.ClientReceiveMessageEvents;
39-
import net.fabricmc.fabric.api.client.message.v1.ClientSendMessageEvents;
4042
import net.fabricmc.fabric.api.client.networking.v1.ClientPlayConnectionEvents;
4143
import net.fabricmc.fabric.api.client.rendering.v1.HudRenderCallback;
4244
import net.fabricmc.fabric.api.client.screen.v1.ScreenEvents;
43-
import net.fabricmc.fabric.api.client.screen.v1.ScreenKeyboardEvents;
44-
import net.fabricmc.fabric.api.message.v1.ServerMessageEvents;
45-
import net.fabricmc.fabric.api.networking.v1.S2CPlayChannelEvents;
4645
import net.fabricmc.loader.api.FabricLoader;
47-
import net.minecraft.advancement.criterion.InventoryChangedCriterion;
4846
import net.minecraft.client.MinecraftClient;
49-
import net.minecraft.client.gui.hud.ChatHud;
50-
import net.minecraft.client.gui.hud.InGameHud;
5147
import net.minecraft.client.gui.screen.ChatScreen;
52-
import net.minecraft.client.gui.screen.Screen;
5348
import net.minecraft.client.gui.screen.ingame.GenericContainerScreen;
5449
import net.minecraft.client.gui.screen.ingame.HandledScreen;
55-
import net.minecraft.client.gui.screen.ingame.HandledScreens;
56-
import net.minecraft.client.gui.screen.ingame.InventoryScreen;
57-
import net.minecraft.client.gui.tooltip.HoveredTooltipPositioner;
58-
import net.minecraft.client.gui.tooltip.Tooltip;
5950
import net.minecraft.client.network.ClientPlayNetworkHandler;
6051
import net.minecraft.client.network.ClientPlayerEntity;
6152
import net.minecraft.client.network.PlayerListEntry;
6253
import net.minecraft.client.option.KeyBinding;
63-
import net.minecraft.client.util.ChatMessages;
6454
import net.minecraft.client.util.InputUtil;
65-
import net.minecraft.component.Component;
6655
import net.minecraft.component.ComponentType;
6756
import net.minecraft.entity.player.PlayerEntity;
68-
import net.minecraft.entity.player.PlayerInventory;
6957
import net.minecraft.inventory.Inventories;
7058
import net.minecraft.inventory.Inventory;
71-
import net.minecraft.inventory.InventoryChangedListener;
72-
import net.minecraft.item.Item;
7359
import net.minecraft.item.ItemStack;
7460
import net.minecraft.item.Items;
75-
import net.minecraft.item.tooltip.TooltipData;
7661
import net.minecraft.nbt.NbtCompound;
7762
import net.minecraft.nbt.NbtIo;
78-
import net.minecraft.network.packet.c2s.play.ChatMessageC2SPacket;
79-
import net.minecraft.network.packet.s2c.play.ChatMessageS2CPacket;
80-
import net.minecraft.network.packet.s2c.play.GameJoinS2CPacket;
81-
import net.minecraft.network.packet.s2c.play.ScoreboardScoreUpdateS2CPacket;
82-
import net.minecraft.registry.Registries;
8363
import net.minecraft.registry.entry.RegistryEntry;
84-
import net.minecraft.scoreboard.*;
85-
import net.minecraft.screen.ScreenHandler;
86-
import net.minecraft.screen.ScreenHandlerListener;
64+
import net.minecraft.scoreboard.ScoreHolder;
65+
import net.minecraft.scoreboard.Scoreboard;
66+
import net.minecraft.scoreboard.ScoreboardDisplaySlot;
67+
import net.minecraft.scoreboard.ScoreboardObjective;
68+
import net.minecraft.scoreboard.Team;
8769
import net.minecraft.sound.SoundEvent;
8870
import net.minecraft.sound.SoundEvents;
89-
import net.minecraft.text.HoverEvent;
9071
import net.minecraft.text.Text;
9172
import net.minecraft.util.Formatting;
92-
import net.minecraft.util.Identifier;
9373
import net.minecraft.util.collection.DefaultedList;
94-
import org.lwjgl.glfw.GLFW;
95-
import org.spongepowered.asm.mixin.transformer.ClassInfo;
96-
97-
import java.io.ByteArrayOutputStream;
98-
import java.io.IOException;
99-
import java.lang.reflect.Field;
100-
import java.nio.file.Path;
101-
import java.util.*;
102-
import java.util.regex.Matcher;
103-
import java.util.regex.Pattern;
10474

10575
public class CoflModClient implements ClientModInitializer {
10676
public static Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create();
10777
private static boolean keyPressed = false;
10878
private static int counter = 0;
10979
public static KeyBinding bestflipsKeyBinding;
80+
public static KeyBinding uploadItemKeyBinding;
11081
public static ArrayList<String> knownIds = new ArrayList<>();
11182

11283
private String username = "";
@@ -143,7 +114,12 @@ public void onInitializeClient() {
143114
"keybinding.coflmod.bestflips",
144115
InputUtil.Type.KEYSYM,
145116
GLFW.GLFW_KEY_B,
146-
""));
117+
"SkyCofl"));
118+
uploadItemKeyBinding = KeyBindingHelper.registerKeyBinding(new KeyBinding(
119+
"keybinding.coflmod.uploaditem",
120+
InputUtil.Type.KEYSYM,
121+
GLFW.GLFW_KEY_I,
122+
"SkyCofl"));
147123

148124
ClientTickEvents.END_CLIENT_TICK.register(client -> {
149125
if (bestflipsKeyBinding.isPressed()) {
@@ -155,6 +131,9 @@ public void onInitializeClient() {
155131
} else {
156132
counter = 0;
157133
}
134+
if(uploadItemKeyBinding.wasPressed())
135+
handleGetHoveredItem(client);
136+
158137
});
159138

160139
ClientPlayConnectionEvents.JOIN.register((handler, sender, server) -> {
@@ -351,6 +330,29 @@ public void onInitializeClient() {
351330
});
352331
}
353332

333+
private void handleGetHoveredItem(MinecraftClient client) {
334+
uploadItem(client.player.getInventory().getStack(client.player.getInventory().getSelectedSlot()));
335+
}
336+
337+
public static void uploadItem(ItemStack hoveredStack) {
338+
MinecraftClient client = MinecraftClient.getInstance();
339+
if (client.player == null || hoveredStack == null) return;
340+
341+
RawCommand data = new RawCommand("hotkey", gson.toJson("upload_item" + getContextToAppend(hoveredStack)));
342+
CoflCore.Wrapper.SendMessage(data);
343+
}
344+
345+
private static String getContextToAppend(ItemStack hoveredStack) {
346+
String toAppend = "";
347+
MinecraftClient client = MinecraftClient.getInstance();
348+
if (client.player == null)
349+
return "";
350+
351+
DefaultedList<ItemStack> mockList = DefaultedList.of();
352+
mockList.add(hoveredStack);
353+
return "|" + inventoryToNBT(mockList);
354+
}
355+
354356
private static void uploadTabList() {
355357
Command<String[]> data = new Command<>(CommandType.uploadTab, CoflModClient.getTabList().toArray(new String[0]));
356358
CoflCore.Wrapper.SendMessage(data);

src/client/java/com/coflnet/mixin/ItemHighlightMixin.java

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,14 @@
1010

1111
import net.minecraft.screen.slot.Slot;
1212
import net.minecraft.text.Text;
13+
import org.jetbrains.annotations.Nullable;
1314
import org.spongepowered.asm.mixin.Mixin;
1415
import org.spongepowered.asm.mixin.Shadow;
16+
import org.spongepowered.asm.mixin.gen.Accessor;
1517
import org.spongepowered.asm.mixin.injection.At;
1618
import org.spongepowered.asm.mixin.injection.Inject;
1719
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
20+
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
1821

1922

2023
@Mixin(HandledScreen.class) // Target HandledScreen, which is the base for most container UIs
@@ -26,18 +29,17 @@ public abstract class ItemHighlightMixin {
2629
@Shadow protected int backgroundWidth;
2730
@Shadow protected int backgroundHeight;
2831

29-
// Assuming descriptionHandler is a client-side component, you'd access it differently
30-
// or pass relevant data. If it's a global instance, you can reference it directly.
31-
// private YourDescriptionHandler descriptionHandler; // Example if it needs to be instantiated per screen
32-
// Or, if it's a static utility:
33-
// import static com.yourmodid.YourModClient.descriptionHandler; // Example if static
34-
35-
/**
36-
* Injects custom rendering logic after the default screen background is drawn.
37-
* This method is often called `method_23880` or similar in older MC versions,
38-
* but `renderBackground` is common in newer versions.
39-
* The exact @At value might need adjustment based on the Minecraft version and specific need.
40-
*/
32+
@Shadow @Nullable protected Slot focusedSlot;
33+
34+
35+
@Inject(method = "keyPressed", at = @At("HEAD"), cancellable = true)
36+
private void onKeyPressed(int keyCode, int scanCode, int modifiers, CallbackInfoReturnable<Boolean> cir) {
37+
if (CoflModClient.uploadItemKeyBinding.matchesKey(keyCode, scanCode)) {
38+
if (focusedSlot != null && focusedSlot.hasStack()) {
39+
CoflModClient.uploadItem(focusedSlot.getStack());
40+
}
41+
}
42+
}
4143

4244
@Inject(method = "drawSlot", at = @At("RETURN")) // drawBackground is a good place
4345
private void yourmodid_onDrawBackground(DrawContext context, Slot slot, CallbackInfo ci) {
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"keybinding.coflmod.bestflips": "Open Best/Next Flip",
3+
"keybinding.coflmod.uploaditem": "Upload Selected Item"
4+
}

0 commit comments

Comments
 (0)