Closed Water-Moon closed 3 years ago
this is a really big error.... fixed the next version be will...
除此之外,这里 好像也有点问题,那个列表里面有些类是客户端才能用的(因为引用了net.minecraft.client.Minecraft类)…… 算了我直接检查下一会发个Pull Request吧
讲真,服务器方面的处理我们确实没有仔细检查过,大部分都是理论上感觉没问题了,runserver能跑了,然后就过了。。 最近还在考虑将这一块内容隔离开来,因为crt和mixin的兼容问题打算将其分为两个模组(打包成一个),但是因为对gradle不太熟悉推进缓慢..
啊这……我会遇到这些问题主要是因为MCBBS上面那个整合包 Interactions 用了这个mod,然后我想拿那个整合包和朋友联机,然后服务端一开就炸 [捂脸]……
个人意见,不一定要分为两个模组,其实可以把需要用GUI的所有项目放上一个比如ClientOnly这样的Annotation,然后在注册的时候看有没有这个Annotation就行了,反正JEI的大多数内容都是只在客户端运行的……
其他模组的仅限客户端的类我暂时还没看到您的模组里面有,不过我还在测试,如果有的话我看看能改一并改一下吧,一会给您发PR
另外关于您的Issue里面共鸣祭坛那个东西的问题,我倒是有一些想法,一会我整理一下思路之后在那个Issue里面跟您讲
好耶,感谢!(跪
解决了JEI的这个client类问题,最后解决的方式有点老土(但它能用……)
方式是把IJeiSlot和IJeiElement的Render方法干掉了,转而单独建了一个接口IJeiSlotRenderable
,而这个接口只被实际进行渲染的类继承,这样在服务端上面的IJeiSlot就不会带有net.minecraft.client.Minecraft
类了
然后渲染的地方现在是直接catch(Exception e)
,这个肯定还得再改……不过至少这样可以让它不至于在服务端加载了JEI的脚本之后直接炸裂
稍等我确认一下没问题就发PR
其实可以考虑在Render的最外层上父类考虑@SideOnly
的注解,这样也可以解决问题吧
SideOnly 只能保证一个方法不被加载,但是它的所有import还是被import一遍……所以只注解方法没什么效果 如果把整个JEISlot的类都注解为SideOnly(Client)的话,就会出现另一个问题 - 在服务端加载CrT脚本出现红字(因为CrT的这些方法也被注解成了客户端)
这也是为啥我没有用最开始的那种@ClientOnly的实现……因为这样就不能保证现有CrT脚本的兼容性了
根据jvm,在java中import只是一个语法糖,在解析中会被全域调用。 也就是说这个方法在服务端被抹除了的话,且不存在任何隐形被调用情况下,理论上是无需理会的..
理论上是这样但是实际上它就是报错……我也很无语啊
(其实如果按照理论上来讲的话,您原来对render已经有SideOnly的注解,就不应该报错……但他还是报错了)
net.minecraftforge.fml.common.LoaderExceptionModCrash: Caught exception from RandomTweaker (randomtweaker)
Caused by: java.lang.NoClassDefFoundError: net/minecraft/client/Minecraft
at java.lang.Class.getDeclaredMethods0(Native Method)
能否给出完整的crash report…我有种感觉和Jei好像无关联[捂脸]
net.minecraftforge.fml.common.LoaderExceptionModCrash: Caught exception from RandomTweaker (randomtweaker)
Caused by: java.lang.NoClassDefFoundError: net/minecraft/client/Minecraft
at java.lang.Class.getDeclaredMethods0(Native Method)
at java.lang.Class.privateGetDeclaredMethods(Class.java:2701)
at java.lang.Class.getDeclaredMethods(Class.java:1975)
at crafttweaker.CraftTweakerAPI.registerClass(CraftTweakerAPI.java:282)
at ink.ikx.rt.impl.mods.crafttweaker.CraftTweakerExtension.registerAllClass(CraftTweakerExtension.java:149)
at ink.ikx.rt.Main.onConstruct(Main.java:62)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at net.minecraftforge.fml.common.FMLModContainer.handleModStateEvent(FMLModContainer.java:637)
at sun.reflect.GeneratedMethodAccessor10.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.google.common.eventbus.Subscriber.invokeSubscriberMethod(Subscriber.java:91)
at com.google.common.eventbus.Subscriber$SynchronizedSubscriber.invokeSubscriberMethod(Subscriber.java:150)
at com.google.common.eventbus.Subscriber$1.run(Subscriber.java:76)
at com.google.common.util.concurrent.MoreExecutors$DirectExecutor.execute(MoreExecutors.java:399)
at com.google.common.eventbus.Subscriber.dispatchEvent(Subscriber.java:71)
at com.google.common.eventbus.Dispatcher$PerThreadQueuedDispatcher.dispatch(Dispatcher.java:116)
at com.google.common.eventbus.EventBus.post(EventBus.java:217)
at net.minecraftforge.fml.common.LoadController.sendEventToModContainer(LoadController.java:219)
at net.minecraftforge.fml.common.LoadController.propogateStateMessage(LoadController.java:197)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.google.common.eventbus.Subscriber.invokeSubscriberMethod(Subscriber.java:91)
at com.google.common.eventbus.Subscriber$SynchronizedSubscriber.invokeSubscriberMethod(Subscriber.java:150)
at com.google.common.eventbus.Subscriber$1.run(Subscriber.java:76)
at com.google.common.util.concurrent.MoreExecutors$DirectExecutor.execute(MoreExecutors.java:399)
at com.google.common.eventbus.Subscriber.dispatchEvent(Subscriber.java:71)
at com.google.common.eventbus.Dispatcher$PerThreadQueuedDispatcher.dispatch(Dispatcher.java:116)
at com.google.common.eventbus.EventBus.post(EventBus.java:217)
at net.minecraftforge.fml.common.LoadController.distributeStateMessage(LoadController.java:136)
at net.minecraftforge.fml.common.Loader.loadMods(ModMixinLoader.java:595)
at net.minecraftforge.fml.server.FMLServerHandler.beginServerLoading(FMLServerHandler.java:98)
at net.minecraftforge.fml.common.FMLCommonHandler.onServerStart(FMLCommonHandler.java:333)
at net.minecraft.server.dedicated.DedicatedServer.func_71197_b(DedicatedServer.java:125)
at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:486)
at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.ClassNotFoundException: net.minecraft.client.Minecraft
at net.minecraft.launchwrapper.LaunchClassLoader.findClass(LaunchClassLoader.java:101)
at java.lang.ClassLoader.loadClass(ClassLoader.java:418)
at java.lang.ClassLoader.loadClass(ClassLoader.java:351)
... 41 more
反正我用之前我说的那个IJeiSlotRenderable的实现改了之后是不报错了
反正我用之前我说的那个IJeiSlotRenderable的实现改了之后是不报错了
离谱。
这段报错阶段是在onConstruct
,实际上这个阶段Jei内的Render是根本不可能被执行到的,Jei的全部加载都在init阶段之后,那段时间客户端开始加载才进行渲染操作,即便这边服务器未做同步崩溃也不应该在这个registerAllClass
炸。
它不是JEI的Render执行到,我觉得他是因为您那种registerClass的方式……那个registerClass的确是在构建阶段执行的,然后因为是传递的.class所以会导致所有import都被调用一遍,因此在这种情况下import net.minecraft.client.Minecraft
就炸了
PR发了,#52,您看下
hmm,我好像明白了。 这里, 没有进行@SideOnly的处理(IJeiElement处理了)。 应该是在CraftTweakerAPI.registerClass(clazz);解析方法的时候,将现有存在的方法都处理了的原因
能否测试以下这样的解决方案是否有效,如果无效咱们就采取IJeiSlotRenderable
的实现吧
啊这,有可能是这个问题诶
稍等我试一下
这样好像也可以诶 那我去改一下PR吧
好,麻烦了,commit你那边手动Closes #51吧
啊,已经Commit上去了,没写Close #51,危……那我还是在这里手动关闭一下吧()
另外关于您的Issue里面共鸣祭坛那个东西的问题,我倒是有一些想法,一会我整理一下思路之后在那个Issue里面跟您讲
关于这个问题,考虑在魔改群找我私聊交流下想法吧,git issue容易连番轰炸其它用户(逃
啊这,我都发过去了(悲) 您说的魔改群是……?
啊这,我都发过去了(悲) 您说的魔改群是……?
啊没有关系的(
不过魔改群是624487948
,目前国内最大的一个魔改交流群了吧,也许是唯一一个还活跃的(
啊这,那就魔改群见了 抱歉今天耽误了您这么长时间,我其实编程这方面也是个萌新,以后还请大佬多多关照了(危)
A typo in this line ("Server" -> "Sever") means the mod will crash every time it is constructed server side.
Crash:
net.minecraftforge.fml.common.LoaderException: java.lang.ClassNotFoundException: ink.ikx.rt.impl.internal.proxy.SeverProxy