TabooLib / taboolib

Powerful framework for creating multi-platform Minecraft plugin
https://tabooproject.org
MIT License
307 stars 101 forks source link

如何使用taboolib开发前置插件 #450

Closed Liangbai2333 closed 2 months ago

Liangbai2333 commented 2 months ago

taboolib开发的插件作为前置的话,由于relocate的原因,无法使用,跳过relocate就会重复加载taboolib.platform.BukkitPlugin,服务器报错,也无法使用,该怎么解决这个问题

Liangbai2333 commented 2 months ago

我只能想到把整个前置的源码复制到新项目去。。

TheFloodDragon commented 2 months ago

由于relocate的原因,无法使用

一般情况下:让插件直接使用relocate后的API

特殊情况:如果不得不使用非relocate的,需要修改Classloader,让非relocate类执行relocate类

TheFloodDragon commented 2 months ago

服务器报错,也无法使用,该怎么解决这个问题

有详细报错吗

Liangbai2333 commented 2 months ago

由于relocate的原因,无法使用

一般情况下:让插件直接使用relocate后的API

特殊情况:如果不得不使用非relocate的,需要修改Classloader,让非relocate类执行relocate类

插件用跳过relocate后的,但是插件自身还会relocate to $package.taboolib,而我前置还是taboolib没变,会导致NoClassDef这样的错误 如果我把插件也跳过relocate了,bukkit就会报taboolib.platform.BukkitPlugin已经重复加载,没有什么很好的解决办法吗,我整个前置几乎要和taboolib互通去

Liangbai2333 commented 2 months ago

我的使用场景就是再自己封装一些mod的api

TheFloodDragon commented 2 months ago

使用前置的插件不打包Taboolib,也就是全依赖前置插件的Taboolib,自己使用的话就可以这样

Liangbai2333 commented 2 months ago

使用前置的插件不打包Taboolib,也就是全依赖前置插件的Taboolib,自己使用的话就可以这样

那我使用前置的插件不就不好使用taboolib 了吗,我可能会用到与前置不同的模块,全依赖于前置的taboolib,好像比较奇怪?

Bkm016 commented 2 months ago

不知道你说的是哪种 api 模式?类似 protocolib 还是 adventure?

Liangbai2333 commented 2 months ago

不知道你说的是哪种 api 模式?类似 protocolib 还是 adventure?

哈,和这个有关系吗,比如说我不想每次都重复写一遍解析配置文件中的UI,我直接在前置写一个loadUIFromConf(taboolib.module.configuration.Configuration)

Bkm016 commented 2 months ago

我懂了,你要做的不是某种api,而是基于tb的扩展。对此目前没有办法。

Bkm016 commented 2 months ago

只能每个插件打包一份,或是集中使用你 api 的 config 工具(例如借助 kotlin typealias)

Liangbai2333 commented 2 months ago

我懂了,你要做的不是某种api,而是基于tb的扩展。对此目前没有办法。

只能复制整个源码过去了吗555

TheFloodDragon commented 2 months ago

理论上可以暴力:

运行时立马替换PluginClassLoader的parent为自己的ClassLoader,然后让自己的ClassLoader转发Taboolib类

Bkm016 commented 2 months ago

你这操作没人懂的。

Bkm016 commented 2 months ago

我懂了,你要做的不是某种api,而是基于tb的扩展。对此目前没有办法。

只能复制整个源码过去了吗555

把你的 api 发布到你自己的仓库里,你的插件可以打包使用

Bkm016 commented 2 months ago

对此你可以参考 tb 的外挂模块 universal-mythic

TheFloodDragon commented 2 months ago

我建议的方法是自己实现一套插件加载系统

Bkm016 commented 2 months ago

我建议的方法是自己实现一套插件加载系统

又来了,你咋不让他用kts写插件?

Bkm016 commented 2 months ago

别人来问问题,要么能做要么不能做,不要给出一些看似行得通的无效答案。

TheFloodDragon commented 2 months ago

别人来问问题,要么能做要么不能做,不要给出一些看似行得通的无效答案。

不好意思,我想的方法都很麻烦

Liangbai2333 commented 2 months ago

对此你可以参考 tb 的外挂模块 universal-mythic

好好好,感谢感谢🙏

Liangbai2333 commented 2 months ago

我建议的方法是自己实现一套插件加载系统

不是哥们,越来越抽象了,我不太懂

Bkm016 commented 2 months ago

别人来问问题,要么能做要么不能做,不要给出一些看似行得通的无效答案。

不好意思,我想的方法都很麻烦

没人拒绝你想很麻烦的办法,但是你又不提供具体的方案让他们去猜?他们要是做得到就不会来这里问问题。

Bkm016 commented 2 months ago

对此你可以参考 tb 的外挂模块 universal-mythic

好好好,感谢感谢🙏

https://reposilite.com/ 用这个 10 分钟搭建自己的仓库。如果你不想来回复制 jar 的话。

Liangbai2333 commented 2 months ago

对此你可以参考 tb 的外挂模块 universal-mythic

好好好,感谢感谢🙏

https://reposilite.com/ 用这个 10 分钟搭建自己的仓库。如果你不想来回复制 jar 的话。

学到了,非常有帮助,爱了