851892190

请问这些p_181159_2之类的是什么东西


AzureZeng
看起来代码好像被混淆了

有保护代码意识的软件开发者为了防止一般小白反编译都会混淆代码(包括 Mojang)
使代码中的变量名称等等全部变成无意义的名称

langyo
被混淆后代码的函数编号

因为 MCP 在生成反编译工程的过程中其实是无法获知函数的真实名称的,所以只能将各个函数按次序编号,也就是你看到的那样

当你猜出蒙出算出这个函数是干什么用的时,你可以自己想个名称,重构此函数名为你自己想到的名字就行了(Forge 其实就是这么建立起来的)

3TUSK
langyo 发表于 2019-3-17 00:08
被混淆后代码的函数编号

因为 MCP 在生成反编译工程的过程中其实是无法获知函数的真实名称的,所以只能将 ...

更准确地说,这个叫 Searge 名。
对于不同版本的 Minecraft,如果能确定两个版本中某一字段或方法是同一个,那么它们就会有一样的 Searge 名。相应的,这些 p_ 打头的方法参数的 Searge 名也会是一样的,虽然方法参数叫什么并不影响二进制兼容。

对于这个案例:func_181159_b 的 MCP 名从 1.8.8 左右起(即这个方法首次被 MCP 记录下来之后)一直都叫 atan2,位于 MathHelper 类下。那这两个参数是什么应该很明显了吧……

重构此函数名为你自己想到的名字就行了

更准确地说是把这个名称提交给 MCP(虽然并没有多少人知道这具体怎么操作,包括笔者也不知道)。

(Forge 其实就是这么建立起来的)

只有 MCP 只能帮你读懂 Minecraft 的底层,Forge 是另一套东西……

参考来源:https://harbinger.covertdragon.team/chapter-01/mcp.html

langyo
u.s.knowledge 发表于 2019-3-17 02:45
更准确地说,这个叫 Searge 名。
对于不同版本的 Minecraft,如果能确定两个版本中某一字段或方法是同一个 ...

感谢补充……太久没碰这方面的东西,浑然不知,只知道大概……

Forge 对 MCP 有依赖……倒也不是什么另一套东西……

(你拿的这是土球写的东西啊……)

3TUSK
langyo 发表于 2019-3-17 03:17
感谢补充……太久没碰这方面的东西,浑然不知,只知道大概……

Forge 对 MCP 有依赖……倒也不是什么另 ...

赶紧去看了一下 zzzz 的 FMLTutor 写了什么。
没办法,一套正常的 Minecraft 反混淆映射表基本都是这样工作的,基本不可能讲出新花样。
举个例子,Bukkit 的 NMS:和 MCP 一样,没有专门的类的 Searge 名,但 Bukkit NMS 用的那一套映射表压根儿就不包括字段和方法的名称,全部保留了混淆。
假如说让你现在像高考出卷老师一样,关在某个保密地点与互联网隔绝一个月,造出一套全新的 Minecraft 反混淆映射表,你大概也会使用一套机器自动分配的“中间名称”来对抗版本迁移时的巨大冲击。

Forge 对 MCP 有依赖

理论上没有,因为 MCP 只是一套映射表——换言之 Forge 用什么映射表都无所谓,只要逻辑对得上号即可。但实际上这里面的细节问题有点多……

第一页 上一页 下一页 最后一页