- 新类 com.spineview.NewFifteen:按钮 → 编辑器自带名称面板(xl + ASM 子类拿名字) → 按名字匹配附件 → 当前选中骨骼下建 15 根骨骼,每根 1 插槽 1 附件(该名字的副本) 骨骼 x/y 0~500 随机、rotation/scale/shear=0/1/0;插槽 alpha 0.5~1、blend normal/additive 随机; 附件 x/y/rotation=0、scaleX/scaleY=1(并替换掉 ADD_SLOT 带过来的模板附件) 弹窗按 pref 尺寸(>=360x170)撑开、同一次渲染回调里居中 - ObjectPanel.build 里挂一行按钮(复用 ObjectPanel.wire 的点击轮询) - build.sh 的 javac 加 -cp ../tools/asm/asm.jar(NewFifteen 现场生成 xl 子类需要 ASM) 依据:tools/deobf/anchors.tsv + 混淆名对照表.md(全部字节码/实测确认)
49 lines
1.9 KiB
Bash
Executable File
49 lines
1.9 KiB
Bash
Executable File
#!/bin/zsh
|
||
# 编译 ViewPanel:注入器(C,无 UI 依赖)+ 面板(纯 Java / Scene2D 反射)
|
||
set -e
|
||
|
||
HERE="$(cd "$(dirname "$0")" && pwd)"
|
||
cd "$HERE"
|
||
|
||
# 找一个 JDK(编辑器运行时是 OpenJDK;本机现成的是 /tmp 下的 Temurin 17)
|
||
if [[ -z "$JAVA_HOME" ]]; then
|
||
for candidate in /tmp/jdk-17.0.20.1+1/Contents/Home /tmp/jdk*/Contents/Home; do
|
||
[[ -x "$candidate/bin/javac" ]] && JAVA_HOME="$candidate" && break
|
||
done
|
||
fi
|
||
if [[ -z "$JAVA_HOME" || ! -x "$JAVA_HOME/bin/javac" ]]; then
|
||
echo "找不到 JDK:请设置 JAVA_HOME" >&2
|
||
exit 1
|
||
fi
|
||
|
||
mkdir -p build/classes
|
||
|
||
echo "== 编译 Java 侧(javac $("$JAVA_HOME/bin/javac" -version 2>&1))"
|
||
find src -name '*.class' -delete 2>/dev/null || true
|
||
# 面板里有一处用了 ASM(NewFifteen 现场生成编辑器对话框子类),编译期也要能看到 asm.jar
|
||
"$JAVA_HOME/bin/javac" --release 8 -encoding UTF-8 -cp "../tools/asm/asm.jar" \
|
||
-d build/classes $(find src -name '*.java')
|
||
|
||
# 保名类清单:这套运行时把 libGDX 基类混淆了,但 ui/* 和 editor/* 保名。
|
||
# 旧版本的明文载荷里能直接列出这些类名,用它们做静态字段扫描的候选。
|
||
UPDATES="$HOME/Library/Application Support/Spine/updates"
|
||
if [[ -f "$UPDATES/3.8.99" ]]; then
|
||
unzip -l "$UPDATES/3.8.99" 2>/dev/null \
|
||
| awk '{print $4}' | grep -E '\.class$' | grep -E '^(com|org)/' \
|
||
| sed 's#/#.#g; s#\.class$##' | sort -u > build/kept-classes.txt
|
||
echo "保名类清单: $(wc -l < build/kept-classes.txt) 个"
|
||
fi
|
||
|
||
echo "== 编译注入器"
|
||
# 编译成通用二进制:3.8.99 的编辑器是 x86_64 的 Spine_x86(Rosetta),
|
||
# 只带 arm64 的 dylib 被继承到那个进程会直接 dyld 报错。
|
||
clang -dynamiclib -O2 -Wall -Wextra -Wno-unused-parameter \
|
||
-arch arm64 -arch x86_64 \
|
||
-I"$JAVA_HOME/include" -I"$JAVA_HOME/include/darwin" \
|
||
-o build/inject.dylib \
|
||
native/inject.c
|
||
|
||
echo "== 产物"
|
||
ls -la build/inject.dylib
|
||
find build/classes -name '*.class' | sed 's/^/ /'
|