Note
Thanks for 忆然( yi_ran ), adapted from 忆然's code.
The following are all Client Scripts
// priority: 100
const $Color = Java.loadClass("java.awt.Color");
/**
* @param {number} num
* @param {number} min
* @param {number} max
* @returns {number}
*/
function checkNumberRange(num, min, max) {
return Math.min(Math.max(num, min || 0), max || 1);
}
/**
* @param {number} R
* @param {number} G
* @param {number} B
* @param {number} A
* @returns {number}
*/
function rgbaColor(R, G, B, A) {
return new $Color(
checkNumberRange(R / 255),
checkNumberRange(G / 255),
checkNumberRange(B / 255),
checkNumberRange(A / 100)
).getRGB();
}
const $GLFW = Java.loadClass("org.lwjgl.glfw.GLFW");
const $RenderGuiEvent$Post = Java.loadClass("net.neoforged.neoforge.client.event.RenderGuiEvent$Post");
NativeEvents.onEvent($RenderGuiEvent$Post, (event) => {
const { guiGraphics } = event;
const thisPoseStack = guiGraphics.pose();
thisPoseStack.pushPose();
// thisPoseStack.translate(50, Client.window.height / 4 - 40, 100);
thisPoseStack.translate(50, 20, 100);
/**
* @param {string} key GLFW key
* @param {number} x
* @param {number} xOffset
* @param {number} y
* @param {number} yOffset
* @param {string} displayKey
*/
function KeyRender(key, x, xOffset, y, yOffset, displayKey) {
displayKey = displayKey ?? key;
let minX = x,
maxX = x + xOffset,
minY = y,
maxY = y + yOffset;
guiGraphics.fill(minX, minY, maxX, maxY, rgbaColor(82, 39, 126, 30));
thisPoseStack.translate(0, 0, 1);
guiGraphics["drawString(net.minecraft.client.gui.Font,java.lang.String,float,float,int,boolean)"](
Client.font,
displayKey, //字体与渲染字符
x + xOffset / 2 - Client.font.width(displayKey) / 2,
y + yOffset / 2 - Client.font.lineHeight / 2, //渲染位置
-1, //RGBA
true //是否绘制文字阴影
);
thisPoseStack.translate(0, 0, -1);
let keyCode = $GLFW[`GLFW_${key}`];
let color = rgbaColor(11, 4, 18, 50);
if (key.startsWith("MOUSE")) {
if (key == "MOUSE_BUTTON_LEFT" && Client.mouseHandler.leftPressed)
return guiGraphics.fill(minX, minY, maxX, maxY, color);
if (key == "MOUSE_BUTTON_RIGHT" && Client.mouseHandler.rightPressed)
return guiGraphics.fill(minX, minY, maxX, maxY, color);
if (key == "MOUSE_BUTTON_MIDDLE" && Client.mouseHandler.middlePressed)
return guiGraphics.fill(minX, minY, maxX, maxY, color);
} else if (Client.isKeyDown(keyCode)) guiGraphics.fill(minX, minY, maxX, maxY, color);
}
KeyRender("KEY_W", 0, 20, 0, 20, "W");
KeyRender("KEY_A", -25, 20, 25, 20, "A");
KeyRender("KEY_S", 0, 20, 25, 20, "S");
KeyRender("KEY_D", 25, 20, 25, 20, "D");
KeyRender("MOUSE_BUTTON_LEFT", -25, 22.5, 50, 20, "L");
KeyRender("MOUSE_BUTTON_MIDDLE", -2.5, 25, 50, 20, "M");
KeyRender("MOUSE_BUTTON_RIGHT", 22.5, 22.5, 50, 20, "R");
KeyRender("KEY_LEFT_SHIFT", -25, 30, 75, 20, "SHIFT");
KeyRender("KEY_LEFT_CONTROL", 15, 30, 75, 20, "CTRL");
KeyRender("KEY_SPACE", -25, 70, 100, 20, "SPACE");
thisPoseStack.popPose();
});