Luohuayu / CatServer

高性能和高兼容性的1.12.2/1.16.5/1.18.2版本Forge+Bukkit+Spigot服务端 (A high performance and high compatibility 1.12.2/1.16.5/1.18.2 version Forge+Bukkit+Spigot server)
https://catmc.org
GNU Lesser General Public License v3.0
1.94k stars 204 forks source link

Bukkit 兼容 Forge 传递携带 Level 子类实例作为入参的桶放置事件 #861

Closed i493052739 closed 4 months ago

i493052739 commented 4 months ago

修复机械动力自己实现的 Level 子类没法在 CatServer cast 成 ServerLevel 的 bug

它的作者写了个 level 的子类,在 bucket 互动时给这个level子类传到 bukkit eventbus 当参数去发事件了 导致这个自定义的 level 子类无法 cast 为 ServerLevel 从而服务端崩溃

java.lang.ClassCastException: class com.simibubi.create.content.kinetics.deployer.DeployerHandler$ItemUseWorld 
cannot be cast to class net.minecraft.server.level.ServerLevel (com.simibubi.create.content.kinetics.deployer.DeployerHandler$ItemUseWorld is in module create@0.5.1.f of loader 'TRANSFORMER' @162c1dfb; net.minecraft.server.level.ServerLevel is in module minecraft@1.18.2 of loader 'TRANSFORMER' @162c1dfb)
    at net.minecraft.world.item.BucketItem.emptyContents(BucketItem.java:173) ~[server-1.18.2-20220404.173914-srg.jar%23133!/:?] {re:mixin,xf:fml:forge:bucketitem,re:classloading,xf:fml:forge:bucketitem,pl:mixin:APP:architectury-common.mixins.json:inject.MixinBucketItem,pl:mixin:A}
    at net.minecraft.world.item.BucketItem.emptyContents(BucketItem.java:143) ~[server-1.18.2-20220404.173914-srg.jar%23133!/:?] {re:mixin,xf:fml:forge:bucketitem,re:classloading,xf:fml:forge:bucketitem,pl:mixin:APP:architectury-common.mixins.json:inject.MixinBucketItem,pl:mixin:A}
    at net.minecraft.world.item.BucketItem.m_7203_(BucketItem.java:108) ~[server-1.18.2-20220404.173914-srg.jar%23133!/:?] {re:mixin,xf:fml:forge:bucketitem,re:classloading,xf:fml:forge:bucketitem,pl:mixin:APP:architectury-common.mixins.json:inject.MixinBucketItem,pl:mixin:A}
    at com.simibubi.create.content.kinetics.deployer.DeployerHandler.activateInner(DeployerHandler.java:338) ~[create-1.18.2-0.5.1.f-all.jar%2378!/:0.5.1.f] {re:classloading}
    at com.simibubi.create.content.kinetics.deployer.DeployerHandler.activate(DeployerHandler.java:135) ~[create-1.18.2-0.5.1.f-all.jar%2378!/:0.5.1.f] {re:classloading}
    at com.simibubi.create.content.kinetics.deployer.DeployerMovementBehaviour.activate(DeployerMovementBehaviour.java:106) ~[create-1.18.2-0.5.1.f-all.jar%2378!/:0.5.1.f] {re:classloading}
    at com.simibubi.create.content.kinetics.deployer.DeployerMovementBehaviour.visitNewPosition(DeployerMovementBehaviour.java:75) ~[create-1.18.2-0.5.1.f-all.jar%2378!/:0.5.1.f] {re:classloading}
    at com.simibubi.create.content.contraptions.AbstractContraptionEntity.tickActors(AbstractContraptionEntity.java:460) ~[create-1.18.2-0.5.1.f-all.jar%2378!/:0.5.1.f] {re:mixin,pl:runtimedistcleaner:A,re:classloading,pl:runtimedistcleaner:A}
    at com.simibubi.create.content.contraptions.OrientedContraptionEntity.tickContraption(OrientedContraptionEntity.java:280) ~[create-1.18.2-0.5.1.f-all.jar%2378!/:0.5.1.f] {re:classloading,pl:runtimedistcleaner:A,re:mixin,pl:runtimedistcleaner:A}
    at com.simibubi.create.content.contraptions.AbstractContraptionEntity.m_8119_(AbstractContraptionEntity.java:373) ~[create-1.18.2-0.5.1.f-all.jar%2378!/:0.5.1.f] {re:mixin,pl:runtimedistcleaner:A,re:classloading,pl:runtimedistcleaner:A}
    at net.minecraft.world.entity.Entity.m_6083_(Entity.java:1947) ~[server-1.18.2-20220404.173914-srg.jar%23133!/:?] {re:mixin,pl:accesstransformer:B,re:classloading,pl:accesstransformer:B,pl:mixin:APP:create.mixins.json:EntityMixin,pl:mixin:APP:mixins.artifacts.json:item.aquadashers.EntityMixin,pl:mixin:APP:mixins.artifacts.json:item.umbrella.EntityMixin,pl:mixin:APP:railways-common.mixins.json:conductor_possession.MixinEntity,pl:mixin:APP:quark.mixins.json:EntityMixin,pl:mixin:APP:mixins.irons_spellbooks.json:EntityMixin,pl:mixin:APP:expandability.mixins.json:fluidcollision.EntityMixin,pl:mixin:APP:expandability.mixins.json:swimming.EntityMixin,pl:mixin:APP:domesticationinnovation.mixins.json:EntityMixin,pl:mixin:APP:create.mixins.json:ContraptionDriverInteractMixin,pl:mixin:A}
    at net.minecraft.server.level.ServerLevel.m_8662_(ServerLevel.java:836) ~[server-1.18.2-20220404.173914-srg.jar%23133!/:?] {re:mixin,pl:accesstransformer:B,re:classloading,pl:accesstransformer:B,pl:mixin:APP:observable.common.json:ServerLevelMixin,pl:mixin:APP:create.mixins.json:accessor.ServerLevelAccessor,pl:mixin:A}
    at net.minecraft.server.level.ServerLevel.m_8647_(ServerLevel.java:820) ~[server-1.18.2-20220404.173914-srg.jar%23133!/:?] {re:mixin,pl:accesstransformer:B,re:classloading,pl:accesstransformer:B,pl:mixin:APP:observable.common.json:ServerLevelMixin,pl:mixin:APP:create.mixins.json:accessor.ServerLevelAccessor,pl:mixin:A}
    at net.minecraft.world.level.Level.m_46653_(Level.java:1372) ~[server-1.18.2-20220404.173914-srg.jar%23133!/:?] {re:mixin,pl:accesstransformer:B,xf:fml:beefix:Level,re:classloading,pl:accesstransformer:B,xf:fml:beefix:Level,pl:mixin:APP:observable.common.json:LevelMixin,pl:mixin:A}
    at net.minecraft.server.level.ServerLevel.lambda$tick$6(ServerLevel.java:439) ~[server-1.18.2-20220404.173914-srg.jar%23133!/:?] {re:mixin,pl:accesstransformer:B,re:classloading,pl:accesstransformer:B,pl:mixin:APP:observable.common.json:ServerLevelMixin,pl:mixin:APP:create.mixins.json:accessor.ServerLevelAccessor,pl:mixin:A}
    at net.minecraft.world.level.entity.EntityTickList.m_156910_(EntityTickList.java:54) ~[server-1.18.2-20220404.173914-srg.jar%23133!/:?] {re:classloading}
    at net.minecraft.server.level.ServerLevel.m_8793_(ServerLevel.java:419) ~[server-1.18.2-20220404.173914-srg.jar%23133!/:?] {re:mixin,pl:accesstransformer:B,re:classloading,pl:accesstransformer:B,pl:mixin:APP:observable.common.json:ServerLevelMixin,pl:mixin:APP:create.mixins.json:accessor.ServerLevelAccessor,pl:mixin:A}
    at net.minecraft.server.MinecraftServer.m_5703_(MinecraftServer.java:1229) ~[server-1.18.2-20220404.173914-srg.jar%23133!/:?] {re:mixin,pl:accesstransformer:B,re:computing_frames,pl:accesstransformer:B,re:classloading,pl:accesstransformer:B,pl:mixin:APP:balm.mixins.json:MinecraftServerMixin,pl:mixin:A}
    at net.minecraft.server.dedicated.DedicatedServer.m_5703_(DedicatedServer.java:397) ~[server-1.18.2-20220404.173914-srg.jar%23133!/:?] {re:computing_frames,pl:accesstransformer:B,re:classloading,pl:accesstransformer:B}
    at net.minecraft.server.MinecraftServer.m_5705_(MinecraftServer.java:1144) ~[server-1.18.2-20220404.173914-srg.jar%23133!/:?] {re:mixin,pl:accesstransformer:B,re:computing_frames,pl:accesstransformer:B,re:classloading,pl:accesstransformer:B,pl:mixin:APP:balm.mixins.json:MinecraftServerMixin,pl:mixin:A}
    at net.minecraft.server.MinecraftServer.m_130011_(MinecraftServer.java:984) ~[server-1.18.2-20220404.173914-srg.jar%23133!/:?] {re:mixin,pl:accesstransformer:B,re:computing_frames,pl:accesstransformer:B,re:classloading,pl:accesstransformer:B,pl:mixin:APP:balm.mixins.json:MinecraftServerMixin,pl:mixin:A}
    at net.minecraft.server.MinecraftServer.m_177918_(MinecraftServer.java:344) ~[server-1.18.2-20220404.173914-srg.jar%23133!/:?] {re:mixin,pl:accesstransformer:B,re:computing_frames,pl:accesstransformer:B,re:classloading,pl:accesstransformer:B,pl:mixin:APP:balm.mixins.json:MinecraftServerMixin,pl:mixin:A}
    at java.lang.Thread.run(Thread.java:833) [?:?] {re:mixin}

排查发现对应的几个需要强转的事件是为了一个 canBuild 里的 getSharedSpawnPos 逻辑,这个逻辑可以单独抽出来 从而避免桶事件相关模组的强转问题

测试结果:机械臂模拟level的水桶正常放出 image

i493052739 commented 4 months ago

模组崩服问题解决了,但通过实现 spigot 的 BucketEmptyEventListener 进一步测试发现, 它后续的 entity 在 cat 对 level 的使用逻辑,也需要修一下 可以看到 entity 的 m8119 方法也会默认使用 ServerLevel 的 getMinecraftWorld 方法 而这个方法在机械动力自定义的 Level 子实现类的实例中并未实现 导致 BucketEmptyEventListener 在处理时失败(不影响正常玩家放水桶,只是在机械臂放水桶时失败)

18.02 22:22:37 [Server] INFO Caused by: java.lang.AbstractMethodError: 
Method com/simibubi/create/content/kinetics/deployer/DeployerHandler$ItemUseWorld.getMinecraftWorld()Lnet/minecraft/server/level/ServerLevel; is abstract
18.02 22:22:37 [Server] INFO at java.lang.Thread.run(Thread.java:833) [?:?]
18.02 22:22:37 [Server] INFO at net.minecraft.server.MinecraftServer.m_177918_(MinecraftServer.java:344) ~[server-1.18.2-20220404.173914-srg.jar%23133!/:?]
18.02 22:22:37 [Server] INFO at net.minecraft.server.MinecraftServer.m_130011_(MinecraftServer.java:984) ~[server-1.18.2-20220404.173914-srg.jar%23133!/:?]
18.02 22:22:37 [Server] INFO at net.minecraft.server.MinecraftServer.m_5705_(MinecraftServer.java:1144) ~[server-1.18.2-20220404.173914-srg.jar%23133!/:?]
18.02 22:22:37 [Server] INFO at net.minecraft.server.dedicated.DedicatedServer.m_5703_(DedicatedServer.java:397) ~[server-1.18.2-20220404.173914-srg.jar%23133!/:?]
18.02 22:22:37 [Server] INFO at net.minecraft.server.MinecraftServer.m_5703_(MinecraftServer.java:1229) ~[server-1.18.2-20220404.173914-srg.jar%23133!/:?]
18.02 22:22:37 [Server] INFO at net.minecraft.server.level.ServerLevel.m_8793_(ServerLevel.java:419) ~[server-1.18.2-20220404.173914-srg.jar%23133!/:?]
18.02 22:22:37 [Server] INFO at net.minecraft.world.level.entity.EntityTickList.m_156910_(EntityTickList.java:54) ~[server-1.18.2-20220404.173914-srg.jar%23133!/:?]
18.02 22:22:37 [Server] INFO at net.minecraft.server.level.ServerLevel.lambda$tick$6(ServerLevel.java:439) ~[server-1.18.2-20220404.173914-srg.jar%23133!/:?]
18.02 22:22:37 [Server] INFO at net.minecraft.world.level.Level.m_46653_(Level.java:1372) ~[server-1.18.2-20220404.173914-srg.jar%23133!/:?]
18.02 22:22:37 [Server] INFO at net.minecraft.server.level.ServerLevel.m_8647_(ServerLevel.java:820) ~[server-1.18.2-20220404.173914-srg.jar%23133!/:?]
18.02 22:22:37 [Server] INFO at net.minecraft.server.level.ServerLevel.m_8662_(ServerLevel.java:836) ~[server-1.18.2-20220404.173914-srg.jar%23133!/:?]
18.02 22:22:37 [Server] INFO at net.minecraft.world.entity.Entity.m_6083_(Entity.java:1947) ~[server-1.18.2-20220404.173914-srg.jar%23133!/:?]
18.02 22:22:37 [Server] INFO at com.simibubi.create.content.contraptions.AbstractContraptionEntity.m_8119_(AbstractContraptionEntity.java:373) ~[create-1.18.2-0.5.1.f-all.jar%2378!/:0.5.1.f]
18.02 22:22:37 [Server] INFO at com.simibubi.create.content.contraptions.OrientedContraptionEntity.tickContraption(OrientedContraptionEntity.java:280) ~[create-1.18.2-0.5.1.f-all.jar%2378!/:0.5.1.f]
18.02 22:22:37 [Server] INFO at com.simibubi.create.content.contraptions.AbstractContraptionEntity.tickActors(AbstractContraptionEntity.java:460) ~[create-1.18.2-0.5.1.f-all.jar%2378!/:0.5.1.f]
18.02 22:22:37 [Server] INFO at com.simibubi.create.content.kinetics.deployer.DeployerMovementBehaviour.visitNewPosition(DeployerMovementBehaviour.java:75) ~[create-1.18.2-0.5.1.f-all.jar%2378!/:0.5.1.f]
18.02 22:22:37 [Server] INFO at com.simibubi.create.content.kinetics.deployer.DeployerMovementBehaviour.activate(DeployerMovementBehaviour.java:106) ~[create-1.18.2-0.5.1.f-all.jar%2378!/:0.5.1.f]
18.02 22:22:37 [Server] INFO at com.simibubi.create.content.kinetics.deployer.DeployerHandler.activate(DeployerHandler.java:135) ~[create-1.18.2-0.5.1.f-all.jar%2378!/:0.5.1.f]
18.02 22:22:37 [Server] INFO at com.simibubi.create.content.kinetics.deployer.DeployerHandler.activateInner(DeployerHandler.java:338) ~[create-1.18.2-0.5.1.f-all.jar%2378!/:0.5.1.f]
...

后续再看下,至少目前不崩服了。。。

Luohuayu commented 4 months ago

CraftEventFactory的方法类型最好不要改, 新建一个方法调用过去比较好

Luohuayu commented 4 months ago

看看新的报错, 只能从调用的地方处理

i493052739 commented 4 months ago

看看新的报错, 只能从调用的地方处理

如期抛出,后续有空会再测测看看会不会影响机械臂其他使用场景。

[20:13:11] [Server thread/ERROR] [Minecraft]: Could not pass event PlayerBucketEmptyEvent to Residence
org.bukkit.event.EventException: null
    at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:319) ~[forge-1.18.2-40.2.14-universal.jar%23138!/:?]
    at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:70) ~[forge-1.18.2-40.2.14-universal.jar%23138!/:?]
    at org.bukkit.plugin.SimplePluginManager.fireEvent(SimplePluginManager.java:594) ~[forge-1.18.2-40.2.14-universal.jar%23138!/:?]
    at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:578) ~[forge-1.18.2-40.2.14-universal.jar%23138!/:?]
    at org.bukkit.craftbukkit.v1_18_R2.event.CraftEventFactory.getPlayerBucketEvent_Modded(CraftEventFactory.java:470) ~[forge-1.18.2-40.2.14-universal.jar%23138!/:?]
    at org.bukkit.craftbukkit.v1_18_R2.event.CraftEventFactory.callPlayerBucketEmptyEvent(CraftEventFactory.java:431) ~[forge-1.18.2-40.2.14-universal.jar%23138!/:?]
    at net.minecraft.world.item.BucketItem.emptyContents(BucketItem.java:173) ~[server-1.18.2-20220404.173914-srg.jar%23133!/:?]
    at net.minecraft.world.item.BucketItem.emptyContents(BucketItem.java:143) ~[server-1.18.2-20220404.173914-srg.jar%23133!/:?]
    at net.minecraft.world.item.BucketItem.m_7203_(BucketItem.java:108) ~[server-1.18.2-20220404.173914-srg.jar%23133!/:?]
    at com.simibubi.create.content.kinetics.deployer.DeployerHandler.activateInner(DeployerHandler.java:338) ~[create-1.18.2-0.5.1.f-all.jar%2378!/:0.5.1.f]
    at com.simibubi.create.content.kinetics.deployer.DeployerHandler.activate(DeployerHandler.java:135) ~[create-1.18.2-0.5.1.f-all.jar%2378!/:0.5.1.f]
    at com.simibubi.create.content.kinetics.deployer.DeployerMovementBehaviour.activate(DeployerMovementBehaviour.java:106) ~[create-1.18.2-0.5.1.f-all.jar%2378!/:0.5.1.f]
    at com.simibubi.create.content.kinetics.deployer.DeployerMovementBehaviour.visitNewPosition(DeployerMovementBehaviour.java:75) ~[create-1.18.2-0.5.1.f-all.jar%2378!/:0.5.1.f]
    at com.simibubi.create.content.contraptions.AbstractContraptionEntity.tickActors(AbstractContraptionEntity.java:460) ~[create-1.18.2-0.5.1.f-all.jar%2378!/:0.5.1.f]
    at com.simibubi.create.content.contraptions.OrientedContraptionEntity.tickContraption(OrientedContraptionEntity.java:280) ~[create-1.18.2-0.5.1.f-all.jar%2378!/:0.5.1.f]
    at com.simibubi.create.content.contraptions.AbstractContraptionEntity.m_8119_(AbstractContraptionEntity.java:373) ~[create-1.18.2-0.5.1.f-all.jar%2378!/:0.5.1.f]
    at net.minecraft.world.entity.Entity.m_6083_(Entity.java:1947) ~[server-1.18.2-20220404.173914-srg.jar%23133!/:?]
    at net.minecraft.server.level.ServerLevel.m_8662_(ServerLevel.java:836) ~[server-1.18.2-20220404.173914-srg.jar%23133!/:?]
    at net.minecraft.server.level.ServerLevel.m_8647_(ServerLevel.java:820) ~[server-1.18.2-20220404.173914-srg.jar%23133!/:?]
    at net.minecraft.world.level.Level.m_46653_(Level.java:1372) ~[server-1.18.2-20220404.173914-srg.jar%23133!/:?]
    at net.minecraft.server.level.ServerLevel.lambda$tick$6(ServerLevel.java:439) ~[server-1.18.2-20220404.173914-srg.jar%23133!/:?]
    at net.minecraft.world.level.entity.EntityTickList.m_156910_(EntityTickList.java:54) ~[server-1.18.2-20220404.173914-srg.jar%23133!/:?]
    at net.minecraft.server.level.ServerLevel.m_8793_(ServerLevel.java:419) ~[server-1.18.2-20220404.173914-srg.jar%23133!/:?]
    at net.minecraft.server.MinecraftServer.m_5703_(MinecraftServer.java:1229) ~[server-1.18.2-20220404.173914-srg.jar%23133!/:?]
    at net.minecraft.server.dedicated.DedicatedServer.m_5703_(DedicatedServer.java:397) ~[server-1.18.2-20220404.173914-srg.jar%23133!/:?]
    at net.minecraft.server.MinecraftServer.m_5705_(MinecraftServer.java:1144) ~[server-1.18.2-20220404.173914-srg.jar%23133!/:?]
    at net.minecraft.server.MinecraftServer.m_130011_(MinecraftServer.java:984) ~[server-1.18.2-20220404.173914-srg.jar%23133!/:?]
    at net.minecraft.server.MinecraftServer.m_177918_(MinecraftServer.java:344) ~[server-1.18.2-20220404.173914-srg.jar%23133!/:?]
    at java.lang.Thread.run(Thread.java:833) [?:?]
Caused by: java.lang.UnsupportedOperationException: Unsupported Operation! Please report to https://github.com/Luohuayu/CatServer/issues (World class: com.simibubi.create.content.kinetics.deployer.DeployerHandler$ItemUseWorld)
    at net.minecraft.world.level.LevelAccessor.getMinecraftWorld(LevelAccessor.java:107) ~[server-1.18.2-20220404.173914-srg.jar%23133!/:?]
    at org.bukkit.craftbukkit.v1_18_R2.block.CraftBlock.getWorld(CraftBlock.java:95) ~[forge-1.18.2-40.2.14-universal.jar%23138!/:?]
    at org.bukkit.craftbukkit.v1_18_R2.block.CraftBlock.getLocation(CraftBlock.java:104) ~[forge-1.18.2-40.2.14-universal.jar%23138!/:?]
    at com.bekvon.bukkit.residence.listeners.ResidencePlayerListener.onPlayerBucketEmpty(ResidencePlayerListener.java:1832) ~[?:?]
    at jdk.internal.reflect.GeneratedMethodAccessor298.invoke(Unknown Source) ~[?:?]
    at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:?]
    at java.lang.reflect.Method.invoke(Method.java:568) ~[?:?]
    at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:315) ~[forge-1.18.2-40.2.14-universal.jar%23138!/:?]
    ... 28 more