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.98k stars 211 forks source link

[1.12.2] 建议重写/覆盖Bukkit中的CraftBlock类的isLiquid方法和isEmpty方法 #603

Closed FulingBing closed 2 years ago

FulingBing commented 2 years ago

运行环境

Minecraft版本(1.12.2/1.16.5/1.18.2): 1.12.2 构建版本(从/version指令获取): CatServer-8d58cdb8 相关模组/插件: Bukkit

描述这个BUG 在插件开发中,这两个方法一般用于判断一个方块是否是液体/空气。 [https://hub.spigotmc.org/javadocs/bukkit/org/bukkit/block/Block.html#isEmpty()](https://hub.spigotmc.org/javadocs/bukkit/org/bukkit/block/Block.html#isEmpty()) 但是翻阅Bukkit的代码可以看出,它仅仅只会判断方块是否为水/岩浆/空气。

public boolean isEmpty() {
    return getType() == Material.AIR;
}
public boolean isLiquid() {
    return (getType() == Material.WATER) || (getType() == Material.STATIONARY_WATER) || (getType() == Material.LAVA) || (getType() == Material.STATIONARY_LAVA);
}

这在原版mc里没有任何问题,但在模组环境下可能会导致各种异常。

导致的问题 除非插件作者在开发时刻意留意此问题, 否则开发出来的插件完全不兼容模组中的液体/空气, CatServer作为模组+插件的服务器,应该考虑插件会在非原版mc的环境下加载/运行的情况。

Kotori0629 commented 2 years ago

https://github.com/Luohuayu/CatServer/blob/1.12.2/src/main/java/org/bukkit/craftbukkit/block/CraftBlock.java#L465-L471

CraftBukkit是独立的MinecraftServer实现, 他并不会考虑任何有关于ForgeMod的事宜 依代码查看, 两个方法存在, 且实现了它该实现的功能, 并且两个方法功能正常 你应该从你的插件方面完成与模组液体交互判断,而不是从服务端,并不是任何人都会使用CatServer安装含有模组液体的模组