Skip to content

Instantly share code, notes, and snippets.

@justisr
Last active July 6, 2023 03:26
Show Gist options
  • Save justisr/0f706a6ce097b86ef43bf0b97eadb426 to your computer and use it in GitHub Desktop.
Save justisr/0f706a6ce097b86ef43bf0b97eadb426 to your computer and use it in GitHub Desktop.
Update an inventory name while opened without NMS
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import org.bukkit.ChatColor;
import org.bukkit.entity.Player;
import com.gmail.justisroot.autoecon.data.ServerSpecs;
public abstract class TitleUpdater {
private static Method getHandle, sendPacket;
private static Field activeContainerField, windowIdField, playerConnectionField;
private static Constructor<?> chatMessageConstructor, packetPlayOutOpenWindowConstructor;
static {
try {
getHandle = ServerSpecs.getObcClass("entity.CraftPlayer").getMethod("getHandle");
chatMessageConstructor = ServerSpecs.getNmsClass("ChatMessage").getConstructor(String.class, Object[].class);
Class<?> nmsPlayer = ServerSpecs.getNmsClass("EntityPlayer");
activeContainerField = nmsPlayer.getField("activeContainer");
windowIdField = ServerSpecs.getNmsClass("Container").getField("windowId");
playerConnectionField = nmsPlayer.getField("playerConnection");
packetPlayOutOpenWindowConstructor = ServerSpecs.getNmsClass("PacketPlayOutOpenWindow").getConstructor(Integer.TYPE, String.class, ServerSpecs.getNmsClass("IChatBaseComponent"), Integer.TYPE);
sendPacket = ServerSpecs.getNmsClass("PlayerConnection").getMethod("sendPacket", ServerSpecs.getNmsClass("Packet"));
// SeverSpecs.getNmsClass(nmsClassName) can be replaced with Class.forName("net.minecraft.server." + VERSION + "." + nmsClassName)
} catch (NoSuchMethodException | SecurityException | ClassNotFoundException | NoSuchFieldException e) {
e.printStackTrace();
}
}
public static void update(final Player p, String title) {
if (p.getOpenInventory().getTopInventory().getName().equalsIgnoreCase("container.crafting")) return;
try {
Object handle = getHandle.invoke(p);
Object message = chatMessageConstructor.newInstance(title, new Object[0]);
Object container = activeContainerField.get(handle);
Object windowId = windowIdField.get(container);
Object packet = packetPlayOutOpenWindowConstructor.newInstance(windowId, "minecraft:chest", message, p.getOpenInventory().getTopInventory().getSize());
Object playerConnection = playerConnectionField.get(handle);
sendPacket.invoke(playerConnection, packet);
} catch (IllegalArgumentException | IllegalAccessException | InstantiationException | InvocationTargetException e) {
e.printStackTrace();
}
p.updateInventory();
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment