热更(不重启)整理新建附件:用编辑器自身 API 重置图片附件变换 + 删除占位(skin)附件
- 确认 GO 的字段/入口:x=D(float)、y=B(float)、rotation=S、scaleX=L、scaleY=I、width=C、height=Z; GO.D(FFFFF)V 就是编辑器自己的 setTransform(x,y,rotation,scaleX,scaleY)。 依据:载荷 JSON 写入器 sb_0.java:669-675 + javap -c GO(两条独立证据), width/height 与 mega_dg4.png 真实像素 157x154 对上。 - 确认删除入口:Gn.L()V => skeleton.removeAttachment(this,true,true);GP.L=附件表、GP.Z=插槽表; 占位附件是载荷类 Hi(hi_2.java 的 I() 返回 "placeholder")。 - 实机(JDK8 attach,进程 56177 全程没重启):20 个新建插槽的图片附件 x/y/rotation 归 0、scale 归 1; 20 个 Hi 占位附件删除;骨架附件表 43 -> 23;逐个核对删除占位没连带删掉图片附件。 - 顺带把 tools/live(attach 热更工具源码)入库,jar/build 加进 .gitignore。
This commit is contained in:
1 parent
0886ba647c
commit
7f519edc67
22 files changed
+3780
No files matched your search
@@ -344,3 +344,42 @@ macOS 文件系统大小写不敏感,解到目录里会互相覆盖 —— 所
|
||||
|
||||
> 教训也写进技能了:**新确认的映射必须当场写进 `tools/deobf/anchors.tsv` 并同步 `names.tsv` / `src-named`**,
|
||||
> 不许只留在对话里(见 `.codex/skills/scope-discipline/SKILL.md` 末节)。
|
||||
|
||||
---
|
||||
|
||||
## 八、图片附件(`GO`)与占位附件(`Hi`)(2026-10-16 实机确认)
|
||||
|
||||
这一节是"给已经建好的附件收尾"时确认的:重置图片附件的变换、删掉多余的 skin/占位附件。
|
||||
|
||||
### 图片附件的 7 个 float 字段
|
||||
|
||||
| `GO` 字段 | 真名 | 依据 |
|
||||
| --- | --- | --- |
|
||||
| `D`(float 的那个) | **x** | ①编辑器自己的 JSON 写入器 `sb_0.java:669-675` 写 `"x"` 时读的就是它 ②`javap -c GO` 的 `D(FFFFF)V` 第一个 `putfield` 是它 |
|
||||
| `B`(float 的那个) | **y** | 同上(JSON 写 `"y"`、`D(FFFFF)V` 第 2 个 `putfield`) |
|
||||
| `S` | **rotation** | JSON 写 `"rotation"`;`D(FFFFF)V` 第 3 个参数 |
|
||||
| `L` | **scaleX** | JSON 写 `"scaleX"`;`D(FFFFF)V` 第 4 个参数 |
|
||||
| `I` | **scaleY** | JSON 写 `"scaleY"`;`D(FFFFF)V` 第 5 个参数 |
|
||||
| `C` / `Z` | **width / height** | JSON 写 `"width"/"height"`;实测 `C=157.0 Z=154.0` 与 `mega_dg4.png` 真实像素 157x154 一致 |
|
||||
|
||||
> 注意:`GO` 上有多个同名字段 `D`(float / iU / pL / long / float[]),
|
||||
> 按名字 `getDeclaredField("D")` 会取错;必须挑**类型是 float 的那个**。
|
||||
|
||||
`GO.D(FFFFF)V` = 编辑器自己的 **setTransform(x, y, rotation, scaleX, scaleY)**,重置一个图片附件的变换就用它。
|
||||
图片附件**没有 shear(斜切)字段**:region 只有 x/y/rotation/scaleX/scaleY。
|
||||
|
||||
### 附件删除 / 占位附件
|
||||
|
||||
| 载荷签名 | 真名 | 依据 |
|
||||
| --- | --- | --- |
|
||||
| `Gn.L()V` | **delete(删掉这个附件)** | `javap -c Gn`:`this.GU.skeleton.removeAttachment(this, true, true)` |
|
||||
| `GP.L(LGn;ZZ)V` | **removeAttachment** | 字节码里 `getfield L:LfI; fI.B(Object,true)` 从附件表移除,并清掉 `GU`(插槽表 `Z:LfI`)上指向它的引用 |
|
||||
| `GP.L:LfI` / `GP.Z:LfI` | **attachments / slots** | 骨架的附件表(本次从 43 项减到 23 项)/ 插槽表 |
|
||||
| `Gn.I()Ljava/lang/String;` | **type** | 占位附件 `Hi`(可读源码 `hi_2.java`)直接 `return "placeholder"` |
|
||||
| `Hi`(载荷类) | **占位附件(skin placeholder)** | 它挂在骨架附件表里,但**既不是插槽的当前附件也不是静止附件**;`GP.removeAttachment` 会按 `Gn.D:LHi` 把引用它的附件级联删掉 |
|
||||
|
||||
**本次实机结果**(不重启,JDK8 attach 热更,进程仍是同一个):
|
||||
|
||||
- 20 个新建插槽的图片附件:`x/y/rotation` 从 `-99.49988 / -302.0 / 40.00014`、`scaleX/scaleY` 从 `1.997 / 1.532` → 全部重置为 `0/0/0` 与 `1/1`(宽度高度 157x154 保持不变)。
|
||||
- 20 个 `Hi` 占位附件全部删除;骨架附件表 `43 → 23`(正好 23 个插槽各 1 个图片附件)。
|
||||
- 删除占位附件**不会**连带删掉图片附件:日志里逐个核对了"删除后该插槽当前附件=GO"。
|
||||
Reference in new issue
Block a user