Project-RT / RandomTweaker

Provides many more mods support and great features for CraftTweaker.
https://www.curseforge.com/minecraft/mc-mods/randomtweaker
MIT License
21 stars 8 forks source link

Server Crash #51

Closed Water-Moon closed 3 years ago

Water-Moon commented 3 years ago

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

ikexing-cn commented 3 years ago

this is a really big error.... fixed the next version be will...

Water-Moon commented 3 years ago

除此之外,这里 好像也有点问题,那个列表里面有些类是客户端才能用的(因为引用了net.minecraft.client.Minecraft类)…… 算了我直接检查下一会发个Pull Request吧

ikexing-cn commented 3 years ago

讲真,服务器方面的处理我们确实没有仔细检查过,大部分都是理论上感觉没问题了,runserver能跑了,然后就过了。。 最近还在考虑将这一块内容隔离开来,因为crt和mixin的兼容问题打算将其分为两个模组(打包成一个),但是因为对gradle不太熟悉推进缓慢..

Water-Moon commented 3 years ago

啊这……我会遇到这些问题主要是因为MCBBS上面那个整合包 Interactions 用了这个mod,然后我想拿那个整合包和朋友联机,然后服务端一开就炸 [捂脸]……

个人意见,不一定要分为两个模组,其实可以把需要用GUI的所有项目放上一个比如ClientOnly这样的Annotation,然后在注册的时候看有没有这个Annotation就行了,反正JEI的大多数内容都是只在客户端运行的……

其他模组的仅限客户端的类我暂时还没看到您的模组里面有,不过我还在测试,如果有的话我看看能改一并改一下吧,一会给您发PR

Water-Moon commented 3 years ago

另外关于您的Issue里面共鸣祭坛那个东西的问题,我倒是有一些想法,一会我整理一下思路之后在那个Issue里面跟您讲

ikexing-cn commented 3 years ago

好耶,感谢!(跪

Water-Moon commented 3 years ago

解决了JEI的这个client类问题,最后解决的方式有点老土(但它能用……) 方式是把IJeiSlot和IJeiElement的Render方法干掉了,转而单独建了一个接口IJeiSlotRenderable,而这个接口只被实际进行渲染的类继承,这样在服务端上面的IJeiSlot就不会带有net.minecraft.client.Minecraft类了 然后渲染的地方现在是直接catch(Exception e),这个肯定还得再改……不过至少这样可以让它不至于在服务端加载了JEI的脚本之后直接炸裂

稍等我确认一下没问题就发PR

ikexing-cn commented 3 years ago

其实可以考虑在Render的最外层上父类考虑@SideOnly的注解,这样也可以解决问题吧

Water-Moon commented 3 years ago

SideOnly 只能保证一个方法不被加载,但是它的所有import还是被import一遍……所以只注解方法没什么效果 如果把整个JEISlot的类都注解为SideOnly(Client)的话,就会出现另一个问题 - 在服务端加载CrT脚本出现红字(因为CrT的这些方法也被注解成了客户端)

这也是为啥我没有用最开始的那种@ClientOnly的实现……因为这样就不能保证现有CrT脚本的兼容性了

ikexing-cn commented 3 years ago

根据jvm,在java中import只是一个语法糖,在解析中会被全域调用。 也就是说这个方法在服务端被抹除了的话,且不存在任何隐形被调用情况下,理论上是无需理会的..

Water-Moon commented 3 years ago

理论上是这样但是实际上它就是报错……我也很无语啊

(其实如果按照理论上来讲的话,您原来对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)
ikexing-cn commented 3 years ago

能否给出完整的crash report…我有种感觉和Jei好像无关联[捂脸]

Water-Moon commented 3 years ago
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
Water-Moon commented 3 years ago

反正我用之前我说的那个IJeiSlotRenderable的实现改了之后是不报错了

ikexing-cn commented 3 years ago

反正我用之前我说的那个IJeiSlotRenderable的实现改了之后是不报错了

离谱。 这段报错阶段是在onConstruct,实际上这个阶段Jei内的Render是根本不可能被执行到的,Jei的全部加载都在init阶段之后,那段时间客户端开始加载才进行渲染操作,即便这边服务器未做同步崩溃也不应该在这个registerAllClass炸。

Water-Moon commented 3 years ago

它不是JEI的Render执行到,我觉得他是因为您那种registerClass的方式……那个registerClass的确是在构建阶段执行的,然后因为是传递的.class所以会导致所有import都被调用一遍,因此在这种情况下import net.minecraft.client.Minecraft就炸了

Water-Moon commented 3 years ago

PR发了,#52,您看下

ikexing-cn commented 3 years ago

hmm,我好像明白了。 这里, 没有进行@SideOnly的处理(IJeiElement处理了)。 应该是在CraftTweakerAPI.registerClass(clazz);解析方法的时候,将现有存在的方法都处理了的原因

能否测试以下这样的解决方案是否有效,如果无效咱们就采取IJeiSlotRenderable的实现吧

Water-Moon commented 3 years ago

啊这,有可能是这个问题诶

稍等我试一下

Water-Moon commented 3 years ago

这样好像也可以诶 那我去改一下PR吧

ikexing-cn commented 3 years ago

好,麻烦了,commit你那边手动Closes #51吧

Water-Moon commented 3 years ago

啊,已经Commit上去了,没写Close #51,危……那我还是在这里手动关闭一下吧()

ikexing-cn commented 3 years ago

另外关于您的Issue里面共鸣祭坛那个东西的问题,我倒是有一些想法,一会我整理一下思路之后在那个Issue里面跟您讲

关于这个问题,考虑在魔改群找我私聊交流下想法吧,git issue容易连番轰炸其它用户(逃

Water-Moon commented 3 years ago

啊这,我都发过去了(悲) 您说的魔改群是……?

ikexing-cn commented 3 years ago

啊这,我都发过去了(悲) 您说的魔改群是……?

啊没有关系的( 不过魔改群是624487948,目前国内最大的一个魔改交流群了吧,也许是唯一一个还活跃的(

Water-Moon commented 3 years ago

啊这,那就魔改群见了 抱歉今天耽误了您这么长时间,我其实编程这方面也是个萌新,以后还请大佬多多关照了(危)