将下载的 minecraft mod 更新为 1.8

Update a downloaded minecraft mod to 1.8

我已经下载了一个 forge mod(ArrowMarker 1.7.10 版本),我想更新它以便它可以在 1.8 forge Minecraft 上运行。我尝试了什么: 首先,我设置了一个基本的 1.8 forge mod,它完全可以工作。 然后我尝试了多个反编译器来反编译 .jar 存档,但是当我粘贴这些文件的代码时,我总是遇到很多错误。 (例如不存在的功能)。我怎样才能将此 mod 更新为 1.8?
Arrow marker 1.7.10

奇怪的反编译示例:(它在 func_151468_f 或 mc.field 上出错)

@SubscribeEvent
      public void RenderVillageCheckerFromEvent(InputEvent.KeyInputEvent event)
      {

        if (key_enable.func_151468_f())
        {
            ArrowMarker.arrowMarker.mode += 1;
          if (ArrowMarker.arrowMarker.mode == 4) {
              ArrowMarker.arrowMarker.mode = 0;
          }
        }
        if (key_h.func_151468_f()) {
          ArrowMarker.arrowMarker.Hactive = (ArrowMarker.arrowMarker.Hactive);
        }
        if (sen == -1.0F) {
          sen = mc.field_71474_y.field_74341_c;
        }
        if (key_slow.func_151470_d()) {
          mc.field_71474_y.field_74341_c = (sen / 10.0F);
        } else {
          mc.field_71474_y.field_74341_c = sen;
        }
        if ((mc.field_71462_r != null) && (ArrowMarker.arrowMarker.mode > 2)) {
            ArrowMarker.arrowMarker.mode = 1;
        }
      }

我知道这个 post 是旧的,但是它有助于给出一个清晰简洁的答案。这可以帮助新开发人员了解正在发生的事情。

信息

您看到的是经过混淆处理的 method/field 名称(称为 searge 名称)。这是由于称为 obfuscation 的代码保护系统。它可以防止人们复制您的代码并以此为荣。通常,这不会造成太多问题,因为它只会产生难以辨认但可以正常工作的代码。

问题

但是,Minecraft Forge 的运作方式略有不同。由于它反编译并重新格式化了整个 Minecraft 客户端,因此它可以访问混淆的 methods/fields 无法找到的非常具体的名称。这会导致 Java IDE 抛出错误,主要是未实现的错误,它找不到指定的 method/field。同样重要的是要注意 'methods' 将始终以 func 开头,这意味着函数。同样,字段将以 field 开头,参数将以 p.

开头

解决方案

既然你说这个mod是1.7.10写的,它使用了1.7.10混淆,也就是说你应该下载this file。此文件包含三个 csv 文件、命名方法、字段和参数。你关心的是方法和字段。在文本编辑器中打开这些文件,或者 Excel 如果您拥有它。现在,将混淆的方法名称或字段名称复制到剪贴板。完成后,打开相应的文件(如果您复制了 "func_",打开 methods.csv,等等)。使用 'find' 选项查找混淆的名称。在它旁边,应该列出官方 MC 名称。例如,你的混淆代码,翻译成正常的 MC 代码应该是这样的:

@SubscribeEvent
public void RenderVillageCheckerFromEvent(InputEvent.KeyInputEvent event)
{
    if (key_enable.isPressed())
    {
        ArrowMarker.arrowMarker.mode += 1;
        if (ArrowMarker.arrowMarker.mode == 4) {
            ArrowMarker.arrowMarker.mode = 0;
        }
    }
    if (key_h.isPressed()) {
        ArrowMarker.arrowMarker.Hactive = (ArrowMarker.arrowMarker.Hactive);
    }
    if (sen == -1.0F) {
        sen = mc.gameSettings.mouseSensitivity;
    }
    if (key_slow.getIsKeyPressed()) {
        mc.gameSettings.mouseSensitivity = (sen / 10.0F);
    } else {
        mc.gameSettings.mouseSensitivity = sen;
    }
    if ((mc.currentScreen != null) && (ArrowMarker.arrowMarker.mode > 2)) {
        ArrowMarker.arrowMarker.mode = 1;
    }
}

现在上面只解决了 1.7.10 客户端的错误。大多数方法 names/fields 每次发布都会更改,并且大部分代码都会被破坏。我的建议是首先执行上述解决方案并在 1.7.10 forge 下载的基础上构建。一旦确认构建和工作正常,下载 forge for 1.8 并将 paste src 文件夹复制到新的 forge 目录中。将弹出多个错误,最好的机会是查看它们,并尝试找出发生了什么错误。锻造forums are perfect, since the users there have an extensive amount of knowledge in terms of obfuscation and the new methods/fields that exist. Another way to do this, is to cross reference the 1.7.10 obfuscation with the 1.8 obfuscation (whose csv files can be found here)。这意味着您使用混淆后的 method/field,并在 1.8 csv 文件中搜索它。这种方法通常效果不佳,但在某些情况下确实有效。

结论

总结一下(或 tl;dr)

  • here 下载经过混淆的名称参考列表。
  • 找到混淆名称参考,并找到官方文档名称(是混淆名称的第二个值,即 func_123456_a、methodName、0、描述)
  • 编译运行 for 1.7.10,然后copy-paste进入1.8目录,通过1.7.10 -> 1.8的交叉引用解决错误。
  • mod 应该会正确更新。尽情享受更新后的 mod!

重要通知

请勿尝试将软件重新分发为您自己的软件。这会让您陷入很多麻烦,无论是否合法。窃取代码并将其据为己有是不值得的。如果您打算发布更新版本,请确保注明 mod.

的原作者