本帖最后由 南柯郡守 于 2020-7-22 20:06 编辑
作为一个刚入坑一个月的萌新开发者 这一个月磕磕绊绊遇到了N多的问题 依然有很多没接触到的 没接触过的东西要学习 好在论坛提供了一个专门的编程开发板块供我这样的小白学习 因为是个半吊子 所以在这个帖子中有什么错漏之处还望海涵 更希望各位大佬能不吝赐教 |
2020.7.22: 更新镜像站信息及吐槽篇 该部分更新完成时共计23个Bukkit标签 2020.6.13: 更新镜像站信息 该部分更新完成时共计23个Bukkit标签 2020.6.13: 更新技巧篇内容并增加了内容折叠 该部分更新完成时共计23个Bukkit标签 2020.5.30: 更新镜像站信息 该部分更新完成时共计23个Bukkit标签 2020.5.21: 更新吐槽篇 该部分更新完成时共计23个Bukkit标签 2020.5. 更新技巧篇 该部分更新完成时共计21个Bukkit标签 2020.5.4: 更新逻辑部分内容(欢迎文明观猴) 该部分更新完成时共计16个Bukkit标签 2020.5.3: 开贴并更新准备部分 |
2021.12 数据,可能有更多内容
|
2020.7.22: 更新镜像站信息及吐槽篇 该部分更新完成时共计23个Bukkit标签2020.6.13: 更新镜像站信息 该部分更新完成时共计23个Bukkit标签2020.6.13: 更新技巧篇内容并增加了内容折叠 该部分更新完成时共计23个Bukkit标签2020.5.30: 更新镜像站信息 该部分更新完成时共计23个Bukkit标签2020.5.21: 更新吐槽篇 该部分更新完成时共计23个Bukkit标签2020.5. |
关于准备部分 | |||
|
|
关于逻辑部分 |
逻辑嘛logic 大家都懂的随便一个循环也是需要逻辑的嘛 |
其实这部分我也没有什么代码能拿出来给大伙儿乐呵乐呵因为很多错误代码我并没有及时记录所以我只能将我印象相对深刻的几个代码及解决方案放上来给大伙儿参考参考我的解决方案不一定是正确(最佳)解决方案 |
这里有几段给我自己都整乐了的代码
|
|
|
NMS是啥多的就不说了各种教程贴多多少少都有涉及到这东西要生艹NMS 搞一份反混淆的ForgeSrc很重要因为Bukkit里面的NMS绝大多数方法都是混淆过的没有对照对应版本的ForgeSrc的话 理解难度成几何倍数关系这里有各个版本的、构建好的ForgeSrc 对网络不好、刚接触的开发者有极大帮助 如何找对应的反混淆过的方法呢?以下我举个栗子比如现在要让一只狼实现无性繁殖
可以直接把Entity(Bukkit通用格式的狼)转换成NMS格式然后就可以直接开艹了 不过方法名不知道咋整呢不急,先去把你导入的依赖包解压然后顺着EntityWolf的包名找到他,用随便一款反编译器打开映入眼帘的应该是这么个东西 这个东西暂时称为混淆类
这TMD bF/bG/bH是啥?方法里面 a/b/c又是啥? 这个时候刚才说到的ForgeSrc包就派上用场了通过对比类名及其所声明的变量可以在ForgeSrc中找到如下这个暂时称为反混淆类
那么然后我们就可以在这里面找狼生崽儿的方法
然后对照大致代码 去混淆类中找到这个方法
就可以让狼不需要同房就能产生后代了 | |||||||
昨天与人在论坛上讨论了关于异线程注册监听器的必要性突然有点感想所以这一篇可能会比较干 (干货) 首先对于监听器这个大家都熟悉也应该是在插件里接触最多的东西以下的讲解可能会涉及到一些简单的运用主要还是会讲一下异线程注册监听器的可行性和实用性但是由于我对底层不是很熟悉 可能会有错漏所以对一部分地方我只能用举例的方式来讲解 要了解异线程 那么我们要先分清主线程和异线程的概念对于主线程 我们可以理解为一条高速路 所有的程序代码都在这条高速路上飞驰而异线程可以理解为辅路甚至国道 他们在一定程度上是有从属关系的 ![]() ![]() 如果你看明白了这个图 那么恭喜你 你理解能力是真的好因为我感觉我自己讲的还是有点模糊的 当然这个线程的概念并不是这个样子的 以上讲解只能提供一个模糊的概念纸上得来终觉浅 绝知此事要躬行要深入了解一个东西还是要自己实际操作多试写代码这东西不要怕出错相反的 出错才会有进步自己独立解决一个问题会对自己的能力有一个巨大的提升 回到正题上在平常情况下 我们注册监听器一般都是直接在 onEnable()部分
在正常情况下,监听器是主线程的一部分这也就意味着如果出现某个监听器中的事件 主线程会等待监听器处理比如说服务器产生了一个爆炸事件 主线程现在交给监听器处理 服务器:喂,监听器,这里有个爆炸事件你处理一下,我等你(0.0001ms Later)监听器:可以爆炸 但是不要伤害玩家服务器: ok ,那就是把地炸了,动物杀了,放过玩家(Boommmmmmmmmm) 在这里我们可以看到 监听器在处理事件的时候仅耗时0.0001毫秒 对比1秒=1000毫秒 这点耗时几乎就可以忽略不计 那么为什么会出现一个讨论异线程注册的话题呢我一开始是觉得有点不可思议 监听器有必要/需要 去做异线程来注册嘛?同时也拎不清是否异线程注册的监听器最后会不会依然挂在主线程上 那么经过在贴子的讨论呢 我想通了异线程注册的监听器确实是在异线程上处理事件那么就意味着主线程不会等这个监听器处理,而是直接往下走 依旧是上面那个例子 也是我在那个帖子里举的例子 服务器发生爆炸了 服务器:喂,这里有个爆炸事件你处理一下监听器:哦好,我来处理(转身埋头计算)(异线程)服务器:(继续执行)Boommmmmmmmmm... And Player Dead ![]() 监听器:嗨,服务器,这个爆炸离这个玩家的家太近了 不要炸了服务器:??? 那么我们可以看到 在这个部分为什么这个监听器走了异线程呢因为他计算量大 耗时长(3 days)如果是在主线程 那么服务器会卡住(3 days) 可能吗?不现实吧所以这部分的监听器运用了异线程 这样就不会导致服务器崩溃了 所以监听器使用异线程注册时可以实现并且有意义的但为什么很少用到这个操作呢因为没必要 ![]() 就目的来说 平常时候咱们监听事件是要对游戏做出修改比如玩家玩家交互事件当玩家手上拿着某个物品右键的时候插件监听到这个事件 然后以玩家为主体释放一个技能或者其他处理这个时候是可以直接在主线程上操作原因有以下几点:1. 不需要大量的计算,耗时短2. 不需要频繁的进行IO操作最重要的一点. 不会造成主线程卡死(服务器崩溃) |
|
|
这就是个很常用的空气占位 但是!到了1.15.2里面 获取Type的时候 我的这个AIR 他就变成了LEGACY_AIR 咋滴?还给我整过期了? 过期的空气呗? ????? 解决方案: 在plugin.yml里添加一行api-version: 1.13 |
|
用PaperAPI才是真的踩雷,Paper的API设计很失败,PaperAPI的内容和BukkitAPI混在一起,例如ItemStack#getLores,即使是熟练编写插件的开发者也会经常被PaperAPI坑。
因此强烈不建议使用PaperAPI,最好的选择是SpigotAPI。
因此强烈不建议使用PaperAPI,最好的选择是SpigotAPI。