当前提交
0da7d49fd6
465 file changed
+164690
No files matched your search
@@ -0,0 +1,58 @@
|
||||
name: 功能异常 (Bug)
|
||||
description: 提交一个功能不按预期工作的问题
|
||||
title: "[Bug] "
|
||||
labels: ["bug"]
|
||||
body:
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: |
|
||||
感谢你抽出时间反馈 Bug。请尽量详细地填写以下内容,以便我们快速定位与修复。
|
||||
|
||||
- type: textarea
|
||||
id: behavior
|
||||
attributes:
|
||||
label: Bug 表现
|
||||
description: 实际发生了什么?与预期有何不同?
|
||||
placeholder: 例如:点击 ClickGUI 中的 KillAura 按钮后,模块未被启用,且控制台无任何输出。
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
id: description
|
||||
attributes:
|
||||
label: 说明
|
||||
description: 关于该问题的补充说明、上下文、你认为可能的原因等。
|
||||
placeholder: 例如:仅在切换世界后第一次启用模块时出现,重启游戏后正常。
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
id: screenshots
|
||||
attributes:
|
||||
label: 截图
|
||||
description: 请粘贴或拖入相关截图 / 录屏。若涉及 UI 错位,务必附图。
|
||||
placeholder: 直接将图片拖到此处即可上传。
|
||||
validations:
|
||||
required: false
|
||||
|
||||
- type: textarea
|
||||
id: reproduce
|
||||
attributes:
|
||||
label: 复现步骤
|
||||
description: 请提供清晰、可被他人按步骤复现的操作流程。
|
||||
placeholder: |
|
||||
1. 启动客户端并进入任意服务器
|
||||
2. 打开 ClickGUI (默认 RShift)
|
||||
3. 点击 Combat -> KillAura
|
||||
4. 观察到 ...
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
id: expected-fix
|
||||
attributes:
|
||||
label: 应当被如何修复
|
||||
description: 你认为这个问题应该怎样被修复?如果有相关代码位置 / 思路也请一并写出。
|
||||
placeholder: 例如:`ModuleManager#toggle` 中似乎未触发 `onEnable` 回调,应在切换状态后调用对应的生命周期方法。
|
||||
validations:
|
||||
required: true
|
||||
@@ -0,0 +1 @@
|
||||
blank_issues_enabled: false
|
||||
@@ -0,0 +1,38 @@
|
||||
name: 崩溃 (Crash)
|
||||
description: 提交一个导致客户端 / 游戏崩溃的问题
|
||||
title: "[Crash] "
|
||||
labels: ["crash"]
|
||||
body:
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: |
|
||||
感谢你反馈崩溃问题。**请务必附上完整的崩溃日志**,缺失日志的崩溃 issue 几乎无法被定位。
|
||||
|
||||
- type: textarea
|
||||
id: log
|
||||
attributes:
|
||||
label: 日志
|
||||
description: |
|
||||
请粘贴完整的崩溃日志 (crash-report) 或 `logs/latest.log` 中的相关片段。
|
||||
若日志过长,推荐使用 GitHub Gist / [mclo.gs](https://mclo.gs) 上传后贴出链接。
|
||||
placeholder: |
|
||||
```
|
||||
---- Minecraft Crash Report ----
|
||||
// ...
|
||||
```
|
||||
render: text
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
id: reproduce
|
||||
attributes:
|
||||
label: 复现步骤
|
||||
description: 触发崩溃所需的操作步骤。越具体越好,包括是否是必现、概率多大。
|
||||
placeholder: |
|
||||
1. 进入单人世界
|
||||
2. 启用 Scaffold 模块
|
||||
3. 持续向前移动约 5 秒
|
||||
4. 客户端崩溃 (100% 复现)
|
||||
validations:
|
||||
required: true
|
||||
@@ -0,0 +1,18 @@
|
||||
name: 建议 (Suggest)
|
||||
description: 提出一个新功能、改进或想法
|
||||
title: "[Suggest] "
|
||||
labels: ["enhancement"]
|
||||
body:
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: |
|
||||
感谢你的建议!请尽量清晰地描述你希望看到的改动以及它的价值。
|
||||
|
||||
- type: textarea
|
||||
id: suggestion
|
||||
attributes:
|
||||
label: 建议内容
|
||||
description: 你希望增加 / 修改什么功能?它解决了什么问题?
|
||||
placeholder: 例如:希望 ClickGUI 支持配置面板宽度,目前在 1080p 下默认宽度过窄。
|
||||
validations:
|
||||
required: true
|
||||
@@ -0,0 +1,213 @@
|
||||
name: Build Loader
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [master]
|
||||
# Only build when something that actually affects the output changed.
|
||||
# README / docs / issue templates / .gitignore / .claude/ get to skip.
|
||||
# Use workflow_dispatch (below) to force a run for anything else.
|
||||
paths:
|
||||
- 'src/**'
|
||||
- 'native/**'
|
||||
- 'build.gradle'
|
||||
- 'settings.gradle'
|
||||
- 'gradle.properties'
|
||||
- 'gradle/wrapper/**'
|
||||
- 'gradlew'
|
||||
- 'gradlew.bat'
|
||||
- '.github/workflows/build-loader.yml'
|
||||
workflow_dispatch: {}
|
||||
|
||||
# contents: write so the [Release] commit-marker path can create a
|
||||
# GitHub Release and upload the built artifacts.
|
||||
permissions:
|
||||
contents: write
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: windows-2022
|
||||
timeout-minutes: 60
|
||||
|
||||
# Honour a [SKIP CI] marker (case-insensitive — GitHub's contains() is
|
||||
# case-insensitive for string operands) anywhere in the head commit
|
||||
# message. workflow_dispatch always runs since head_commit is null
|
||||
# there and the !contains() short-circuits to true.
|
||||
if: ${{ github.event_name != 'push' || !contains(github.event.head_commit.message, '[SKIP CI]') }}
|
||||
|
||||
env:
|
||||
# Opt every JavaScript action into the Node.js 24 runtime ahead of the
|
||||
# 2026-06-02 forced switchover. The v4 / v1 pins below all still ship
|
||||
# a Node 20 binary in their action.yml, and GitHub deprecated Node 20
|
||||
# on 2025-09-19; setting this flag makes the runner execute them under
|
||||
# Node 24 regardless, which silences the deprecation warning and
|
||||
# de-risks the upcoming default flip.
|
||||
FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: "true"
|
||||
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 1
|
||||
|
||||
- name: Resolve git revision
|
||||
id: rev
|
||||
shell: pwsh
|
||||
run: |
|
||||
$sha = git rev-parse --short=7 HEAD
|
||||
"sha=$sha" | Out-File -FilePath $env:GITHUB_OUTPUT -Append
|
||||
Write-Host "Build revision: $sha"
|
||||
|
||||
- name: Setup JDK 17
|
||||
uses: actions/setup-java@v4
|
||||
with:
|
||||
distribution: temurin
|
||||
java-version: 17
|
||||
|
||||
- name: Setup MSVC (x64)
|
||||
uses: ilammy/msvc-dev-cmd@v1
|
||||
with:
|
||||
arch: x64
|
||||
|
||||
- name: Install UPX
|
||||
shell: pwsh
|
||||
run: choco install upx -y --no-progress
|
||||
|
||||
- name: Cache Gradle
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: |
|
||||
~/.gradle/caches
|
||||
~/.gradle/wrapper
|
||||
key: gradle-${{ runner.os }}-${{ hashFiles('**/*.gradle', '**/gradle-wrapper.properties') }}
|
||||
restore-keys: |
|
||||
gradle-${{ runner.os }}-
|
||||
|
||||
- name: Build (clean dll upxCompress)
|
||||
shell: pwsh
|
||||
env:
|
||||
OPENZEN_BUILD_REVISION: ${{ steps.rev.outputs.sha }}
|
||||
run: |
|
||||
Write-Host "JAVA_HOME = $env:JAVA_HOME"
|
||||
Write-Host "OPENZEN_BUILD_REV = $env:OPENZEN_BUILD_REVISION"
|
||||
.\gradlew.bat --no-daemon clean dll upxCompress
|
||||
|
||||
# Rename the two distributable artifacts so their final filenames carry
|
||||
# the build sha. We rename rather than re-publish at build time so the
|
||||
# local `./gradlew dll` workflow keeps producing stable filenames.
|
||||
- name: Stage release artifacts
|
||||
shell: pwsh
|
||||
run: |
|
||||
$sha = "${{ steps.rev.outputs.sha }}"
|
||||
$exeSrc = "build\dist\OpenZenLoader.exe"
|
||||
$jarSrc = "build\libs\hey-1.0.jar"
|
||||
# The class-name obfuscator emits a fresh, random old->new mapping on every
|
||||
# build; rename-mapping.txt is the ONLY way to de-obfuscate a stack trace, so
|
||||
# ship it with the artifacts/release.
|
||||
$mapSrc = "build\rename-mapping.txt"
|
||||
if (-not (Test-Path $exeSrc)) { throw "missing $exeSrc" }
|
||||
if (-not (Test-Path $jarSrc)) { throw "missing $jarSrc" }
|
||||
if (-not (Test-Path $mapSrc)) { throw "missing $mapSrc" }
|
||||
|
||||
$release = "build\release"
|
||||
New-Item -ItemType Directory -Force -Path $release | Out-Null
|
||||
$exeDst = Join-Path $release "OpenZenLoader-$sha.exe"
|
||||
$jarDst = Join-Path $release "OpenZen-$sha.jar"
|
||||
$mapDst = Join-Path $release "OpenZen-$sha-mapping.txt"
|
||||
Copy-Item -Force $exeSrc $exeDst
|
||||
Copy-Item -Force $jarSrc $jarDst
|
||||
Copy-Item -Force $mapSrc $mapDst
|
||||
|
||||
$exeSz = (Get-Item $exeDst).Length
|
||||
$jarSz = (Get-Item $jarDst).Length
|
||||
Write-Host ("OpenZenLoader-{0}.exe : {1:N0} bytes ({2:N2} MB)" -f $sha, $exeSz, ($exeSz/1MB))
|
||||
Write-Host ("OpenZen-{0}.jar : {1:N0} bytes ({2:N2} MB)" -f $sha, $jarSz, ($jarSz/1MB))
|
||||
Write-Host ("OpenZen-{0}-mapping.txt : {1:N0} bytes" -f $sha, (Get-Item $mapDst).Length)
|
||||
|
||||
# NOTE: actions/upload-artifact always wraps its content in a zip; that
|
||||
# is a platform limitation we cannot disable. By giving each artifact a
|
||||
# single file whose name already encodes the sha, the download is
|
||||
# OpenZenLoader-<sha>.exe.zip / OpenZen-<sha>.jar.zip, each containing
|
||||
# just the named file (no nested directory). For raw exe/jar downloads
|
||||
# without the zip wrapper, attach to a GitHub Release instead.
|
||||
- name: Upload OpenZenLoader exe
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: OpenZenLoader-${{ steps.rev.outputs.sha }}.exe
|
||||
path: build/release/OpenZenLoader-${{ steps.rev.outputs.sha }}.exe
|
||||
if-no-files-found: error
|
||||
retention-days: 30
|
||||
|
||||
- name: Upload OpenZen jar
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: OpenZen-${{ steps.rev.outputs.sha }}.jar
|
||||
path: build/release/OpenZen-${{ steps.rev.outputs.sha }}.jar
|
||||
if-no-files-found: error
|
||||
retention-days: 30
|
||||
|
||||
- name: Upload de-obfuscation mapping
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: OpenZen-${{ steps.rev.outputs.sha }}-mapping.txt
|
||||
path: build/release/OpenZen-${{ steps.rev.outputs.sha }}-mapping.txt
|
||||
if-no-files-found: error
|
||||
retention-days: 30
|
||||
|
||||
# ===== Optional GitHub Release publish =====
|
||||
# If the HEAD commit message contains the literal marker "[Release]",
|
||||
# cut a GitHub Release tagged build-<sha> and attach the exe + jar.
|
||||
# Without the marker, this step is skipped — every push still produces
|
||||
# the Actions artifacts above, only tagged releases are gated.
|
||||
- name: Detect [Release] marker
|
||||
id: relmark
|
||||
shell: pwsh
|
||||
run: |
|
||||
$msg = (git log -1 --pretty=%B HEAD | Out-String)
|
||||
# Case-insensitive match so [release], [Release], [RELEASE] all
|
||||
# qualify; .Contains in .NET is case-sensitive by default.
|
||||
$isRelease = $msg.IndexOf("[Release]", [System.StringComparison]::OrdinalIgnoreCase) -ge 0
|
||||
"is_release=$($isRelease.ToString().ToLower())" |
|
||||
Out-File -FilePath $env:GITHUB_OUTPUT -Encoding utf8 -Append
|
||||
Write-Host "HEAD commit message:"
|
||||
Write-Host $msg
|
||||
Write-Host "[Release] marker present: $isRelease"
|
||||
|
||||
- name: Publish GitHub Release
|
||||
if: steps.relmark.outputs.is_release == 'true'
|
||||
shell: pwsh
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
SHA: ${{ steps.rev.outputs.sha }}
|
||||
run: |
|
||||
$tag = "build-$env:SHA"
|
||||
$title = "Build $env:SHA"
|
||||
# Write notes via a file so quoting / [brackets] / newlines in the
|
||||
# commit message can't corrupt the gh command line.
|
||||
$notes = "release-notes.md"
|
||||
# Prepend a PRE-BUILT warning to the release body: these artifacts all share
|
||||
# one fixed obfuscation mapping, so an anti-cheat class-name blacklist can
|
||||
# target them. Tell users to self-compile for unique, per-build random names.
|
||||
# Build the banner as a string array (one line each) to avoid PowerShell
|
||||
# here-string column-0 terminator issues inside a YAML block scalar.
|
||||
$warn = @(
|
||||
'> ⚠️ **这是预构建版本(PRE-BUILT)**'
|
||||
'>'
|
||||
'> 本 Release 里的 `OpenZenLoader.exe` / `OpenZen-*.jar` 是 GitHub Actions 编译的成品,**所有人下载到的是同一套混淆类名**。这套固定的名字随时可能被反作弊(如布吉岛)收录进**类名黑名单**而失效。'
|
||||
'>'
|
||||
'> 想要一套**独一无二、别人都不知道**的类名,请**自己编译**(每次构建都会生成全新随机类名):'
|
||||
'> - **Fork 本仓库**,在你自己的 GitHub Actions 里跑 `Build Loader` 工作流,下载你自己的 artifact;**或**'
|
||||
'> - **clone 到本地**自己 `gradlew jar` / `gradlew dll`。'
|
||||
'>'
|
||||
'> 详见仓库 README 的「编译时类名混淆」。`OpenZen-*-mapping.txt` 是本次构建的反混淆映射(每次构建都不同)。'
|
||||
''
|
||||
'---'
|
||||
''
|
||||
)
|
||||
$warn | Out-File -FilePath $notes -Encoding utf8
|
||||
git log -1 --pretty=%B HEAD | Out-File -FilePath $notes -Encoding utf8 -Append
|
||||
gh release create $tag `
|
||||
--title $title `
|
||||
--notes-file $notes `
|
||||
"build/release/OpenZenLoader-$env:SHA.exe" `
|
||||
"build/release/OpenZen-$env:SHA.jar" `
|
||||
"build/release/OpenZen-$env:SHA-mapping.txt"
|
||||
Reference in new issue
屏蔽一个用户