Skip to content

Instantly share code, notes, and snippets.

@EvanHsieh0415
Last active February 3, 2025 09:11
Show Gist options
  • Save EvanHsieh0415/361904612c56d98dae59102b22560358 to your computer and use it in GitHub Desktop.
Save EvanHsieh0415/361904612c56d98dae59102b22560358 to your computer and use it in GitHub Desktop.

Note

Thanks for 忆然( yi_ran ), adapted from 忆然's code.
The following are all Client Scripts

helper.js

// 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();
}

keystrokes.js

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();
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment