java - 使用 Pixelmon mod 1.12.2-6.3.1 在 Eclipse 中运行 Minecraft Forge 服务器/客户端
问题描述
我可以按照他们指示的方式运行带有 Pixelmon mod 的服务器,即。使用伪造发射器。我想为 Pixelmon 编写一个侧面 mod,并尝试在 Eclipse 中运行伪造服务器。服务器和客户端使用我自己的 mod 运行良好,或者除了使用 forge 进行 modding 打包的那些 mod 之外没有其他 mod,但是当我将 pixelmon jar 放入 mods 文件夹时它会崩溃(参见下面的跟踪)。
到目前为止我检查过的内容:
- forge 版本 2705 对 Pixelmon 6.3.1 是正确的
- 使用 Java 8
- jar 文件上没有 .zip 扩展名
- 没有解压jar文件
- 没有OOM问题
- Minecraft 1.12.2 对 Pixelmon 6.3.1 是正确的
关于我可能做错了什么的任何想法,可以尝试下一步吗?
(来自崩溃日志)
错误的详细演练、其代码路径和所有已知细节如下:
-- System Details --
Details:
Minecraft Version: 1.12.2
Operating System: Mac OS X (x86_64) version 10.13.4
Java Version: 1.8.0_101, Oracle Corporation
Java VM Version: Java HotSpot(TM) 64-Bit Server VM (mixed mode), Oracle Corporation
Memory: 774347184 bytes (738 MB) / 900726784 bytes (859 MB) up to 3817865216 bytes (3641 MB)
JVM Flags: 0 total;
IntCache: cache: 0, tcache: 0, allocated: 0, tallocated: 0
FML: MCP 9.42 Powered by Forge 14.23.4.2705 6 mods loaded, 6 mods active
States: 'U' = Unloaded 'L' = Loaded 'C' = Constructed 'H' = Pre-initialized 'I' = Initialized 'J' = Post-initialized 'A' = Available 'D' = Disabled 'E' = Errored
| State | ID | Version | Source | Signature |
|:----- |:---------- |:------------ |:----------------------------------- |:--------- |
| UC | minecraft | 1.12.2 | minecraft.jar | None |
| UC | mcp | 9.42 | minecraft.jar | None |
| UC | FML | 8.0.99.99 | forgeSrc-1.12.2-14.23.4.2705.jar | None |
| UC | forge | 14.23.4.2705 | forgeSrc-1.12.2-14.23.4.2705.jar | None |
| UC | examplemod | 1.0 | main | None |
| U | pixelmon | 6.3.1 | Pixelmon-1.12.2-6.3.1-universal.jar | None |
Loaded coremods (and transformers):
Profiler Position: N/A (disabled)
Is Modded: Definitely; Server brand changed to 'fml,forge'
Type: Dedicated Server (map_server.txt)
在这里追踪:
[10:39:42] [Server thread/ERROR] [net.minecraft.server.MinecraftServer]: Encountered an unexpected exception
java.lang.NoClassDefFoundError: com/pixelmonmod/pixelmon/config/PixelmonConfig
at com.pixelmonmod.pixelmon.storage.PixelmonStorage.<clinit>(PixelmonStorage.java:26) ~[PixelmonStorage.class:?]
at com.pixelmonmod.pixelmon.Pixelmon.<clinit>(Pixelmon.java:121) ~[Pixelmon.class:?]
at java.lang.Class.forName0(Native Method) ~[?:1.8.0_101]
at java.lang.Class.forName(Class.java:348) ~[?:1.8.0_101]
at net.minecraftforge.fml.common.FMLModContainer.constructMod(FMLModContainer.java:530) ~[forgeSrc-1.12.2-14.23.4.2705.jar:?]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_101]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_101]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_101]
at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_101]
at com.google.common.eventbus.Subscriber.invokeSubscriberMethod(Subscriber.java:91) ~[guava-21.0.jar:?]
at com.google.common.eventbus.Subscriber$SynchronizedSubscriber.invokeSubscriberMethod(Subscriber.java:150) ~[guava-21.0.jar:?]
at com.google.common.eventbus.Subscriber$1.run(Subscriber.java:76) ~[guava-21.0.jar:?]
at com.google.common.util.concurrent.MoreExecutors$DirectExecutor.execute(MoreExecutors.java:399) ~[guava-21.0.jar:?]
at com.google.common.eventbus.Subscriber.dispatchEvent(Subscriber.java:71) ~[guava-21.0.jar:?]
at com.google.common.eventbus.Dispatcher$PerThreadQueuedDispatcher.dispatch(Dispatcher.java:116) ~[guava-21.0.jar:?]
at com.google.common.eventbus.EventBus.post(EventBus.java:217) ~[guava-21.0.jar:?]
at net.minecraftforge.fml.common.LoadController.sendEventToModContainer(LoadController.java:218) ~[forgeSrc-1.12.2-14.23.4.2705.jar:?]
at net.minecraftforge.fml.common.LoadController.propogateStateMessage(LoadController.java:196) ~[forgeSrc-1.12.2-14.23.4.2705.jar:?]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_101]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_101]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_101]
at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_101]
at com.google.common.eventbus.Subscriber.invokeSubscriberMethod(Subscriber.java:91) ~[guava-21.0.jar:?]
at com.google.common.eventbus.Subscriber$SynchronizedSubscriber.invokeSubscriberMethod(Subscriber.java:150) ~[guava-21.0.jar:?]
at com.google.common.eventbus.Subscriber$1.run(Subscriber.java:76) ~[guava-21.0.jar:?]
at com.google.common.util.concurrent.MoreExecutors$DirectExecutor.execute(MoreExecutors.java:399) ~[guava-21.0.jar:?]
at com.google.common.eventbus.Subscriber.dispatchEvent(Subscriber.java:71) ~[guava-21.0.jar:?]
at com.google.common.eventbus.Dispatcher$PerThreadQueuedDispatcher.dispatch(Dispatcher.java:116) ~[guava-21.0.jar:?]
at com.google.common.eventbus.EventBus.post(EventBus.java:217) ~[guava-21.0.jar:?]
at net.minecraftforge.fml.common.LoadController.distributeStateMessage(LoadController.java:135) ~[LoadController.class:?]
at net.minecraftforge.fml.common.Loader.loadMods(Loader.java:593) ~[Loader.class:?]
at net.minecraftforge.fml.server.FMLServerHandler.beginServerLoading(FMLServerHandler.java:97) ~[FMLServerHandler.class:?]
at net.minecraftforge.fml.common.FMLCommonHandler.onServerStart(FMLCommonHandler.java:332) ~[FMLCommonHandler.class:?]
at net.minecraft.server.dedicated.DedicatedServer.init(DedicatedServer.java:128) ~[DedicatedServer.class:?]
at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:552) [MinecraftServer.class:?]
at java.lang.Thread.run(Thread.java:745) [?:1.8.0_101]
Caused by: java.lang.ClassNotFoundException: com.pixelmonmod.pixelmon.config.PixelmonConfig
at net.minecraft.launchwrapper.LaunchClassLoader.findClass(LaunchClassLoader.java:191) ~[launchwrapper-1.12.jar:?]
at java.lang.ClassLoader.loadClass(ClassLoader.java:424) ~[?:1.8.0_101]
at java.lang.ClassLoader.loadClass(ClassLoader.java:357) ~[?:1.8.0_101]
... 36 more
Caused by: java.lang.RuntimeException: java.lang.ClassNotFoundException: info.pixelmon.repack.ninja.leaping.configurate.objectmapping.ObjectMappingException
at org.objectweb.asm.ClassWriter.getCommonSuperClass(ClassWriter.java:1728) ~[asm-debug-all-5.2.jar:5.2]
at org.objectweb.asm.ClassWriter.getMergedType(ClassWriter.java:1698) ~[asm-debug-all-5.2.jar:5.2]
at org.objectweb.asm.Frame.merge(Frame.java:1530) ~[asm-debug-all-5.2.jar:5.2]
at org.objectweb.asm.Frame.merge(Frame.java:1441) ~[asm-debug-all-5.2.jar:5.2]
at org.objectweb.asm.MethodWriter.visitMaxs(MethodWriter.java:1516) ~[asm-debug-all-5.2.jar:5.2]
at org.objectweb.asm.commons.LocalVariablesSorter.visitMaxs(LocalVariablesSorter.java:165) ~[asm-debug-all-5.2.jar:5.2]
at org.objectweb.asm.ClassReader.readCode(ClassReader.java:1634) ~[asm-debug-all-5.2.jar:5.2]
at org.objectweb.asm.ClassReader.readMethod(ClassReader.java:1032) ~[asm-debug-all-5.2.jar:5.2]
at org.objectweb.asm.ClassReader.accept(ClassReader.java:708) ~[asm-debug-all-5.2.jar:5.2]
at org.objectweb.asm.ClassReader.accept(ClassReader.java:521) ~[asm-debug-all-5.2.jar:5.2]
at net.minecraftforge.fml.common.asm.transformers.DeobfuscationTransformer.transform(DeobfuscationTransformer.java:51) ~[forgeSrc-1.12.2-14.23.4.2705.jar:?]
at net.minecraft.launchwrapper.LaunchClassLoader.runTransformers(LaunchClassLoader.java:279) ~[launchwrapper-1.12.jar:?]
at net.minecraft.launchwrapper.LaunchClassLoader.findClass(LaunchClassLoader.java:176) ~[launchwrapper-1.12.jar:?]
at java.lang.ClassLoader.loadClass(ClassLoader.java:424) ~[?:1.8.0_101]
at java.lang.ClassLoader.loadClass(ClassLoader.java:357) ~[?:1.8.0_101]
... 36 more
解决方案
这是因为 mod jar 被混淆了
关于混淆名称的旁白
Minecraft 有 3 个级别的命名:
- Notch Names - 这些是 Minecraft 在分发时使用的方法和字段的名称。通常像
a.aa
和b.cf2
。这是完全混淆的状态- SRG 名称 - 这些是 Forge 在运行游戏时执行的运行时反混淆过程赋予方法和字段的名称。编译后的模组使用这些名称,因为它们在次要版本中是一致的
- MCP 名称 - 这些是您在 Eclipse 中看到的人类可读的名称。当有人通过IRC上的MCP Bot确定字段或方法的作用时,这些名称是手动提供的。使用 MDK 安装 Forge 开发环境会在您运行时获取“当前”映射
gradlew setup
为了在开发环境中运行一个模组,您需要首先对其进行去混淆处理,将 SRG 名称更改为 MCP 名称,以便它可以在开发环境中运行。
有几种方法可以做到这一点:
- 从 mod 的作者那里获取一个“源”jar(取决于作者的突发奇想;可能是也可能不是公共或开源的,有 API 等)
- 使用Code Chicken Core在 Eclipse 中执行运行时 deobf(可能有效,也可能无效;注意:您需要源 jar)
- 使用像BON2这样的工具(从未使用过,应该可以)
- 使用 Gradle 对 mod 进行反混淆(应该始终有效)
此处选项 4 的问题在于,虽然我知道我可能无法(并且已经有一段时间无法)找到必要的说明。我现在能找到的东西,由知道如何做 4 的人发布,建议做 3。
推荐阅读
- scala - 如何将 Scala/spark 与 drools 连接起来,性能如何?
- google-app-engine - 如何解决谷歌云 ssl 问题
- android - 隐藏菜单项时如何从导航抽屉中删除隐藏的项目空间?
- oracle-apex - Oracle Apex 中的计算有问题?
- d3.js - 为 D3 圆弧内半径设置边框
- ssh - 使用 Remmina 打开 SSH 隧道以进行 VNC 连接时卡住
- coldfusion - 在包含 HTML 标签的表达式中使用 ColdFusion 中的 Evaluate 函数
- json - 你如何让 json 中的列表指向相同的值?
- html - 如何处理 aria-label 中的空格?
- c# - 如何在 C# 中从 SQL Server 数据库填充数据网格视图