Bukkit这坑慢慢填,不慌....
最近又回Minecraft的坑了,开始搞插件...
Bukkit定时器是平时开发也会用到的,比如延迟,冷却,准备时间等等,都会使用。
先声明java里面的sleep是会让服务器整体停止xxx秒,官方教程是这样说的,我并没有去试过这东西。
bukkit提供了一个专有的线程,可以用来实现延迟等效果。
Java里面1000L是1秒,而Bukkit里面的是20L一秒,Bukkit服务器是使用单线程的.
然后想要实现一个定时器,可以直接new一个BukkitRunnable抽象类然后创建继承的Runnable接口方法就行了。
这里不会多说,具体请反编译核心文件的org.bukkit.scheduler查看,文档直接官方看就行了
一般有2种方法实现,1是直接new匿名类,2是创建一个类继承BukkitRunnable实现定时器。
new BukkitRunnable(){ int s = 10;//设置定10秒后执行某段代码 @Override public void run(){ s--;//迭代递减,我看官方的教程是没这个的,我没试过,你也可以删除试试 if(s==0){ //这个写10秒后执行的代码(假如定义的定时器每次是1秒) cancel();//cancel用来取消定时器 }else{ //这里可以写每次触发定时器执行的代码 } } }.runTaskTimer(this, 0L, 20L);//参数是,主类、延迟、多少秒运行一次,比如5秒那就是5*20L
上面是用匿名类的方法创建定时器,一般来说,我喜欢创建一类继承来实现
package com.acgxt.mc; import org.bukkit.scheduler.BukkitRunnable; public class TimeOut extends BukkitRunnable{ public Test plugin; public int s = 10; public TimeOut(Test plugin){ //因为定时器需要一个主类,所以这里Test是主类,参数传一个主类进来 this.plugin = plugin;//赋值给成员变量 } @Override public void run() { s--; if(s==0){ //执行10秒后的代码(假如定义的定时器每次是1秒) //取消定时器 cancel(); }else{ //每一次触发定时器执行的代码 } } //创建一个开始的函数 public void start(long delay,long time){ //调用runTaskTimer函数,参数分别是 主类,开始延迟多少秒,多少秒运行一次 this.runTaskTimer(this.plugin, 20L * delay, 20L * time); } } //运行这个定时器(假设我们在主类中运行): new TimeOut(this).start(1L,10L);//实例一个定时器,构造函数中传入主类,因为当前在主类所以this, //然后调用start方法,第一个参数是延迟,传入1那么就是1秒后开始运行定时器 //参数2是多少秒运行一次,那么设定10就是10秒运行一次定时器, //当运行10次,也就是10*10秒定时器将会停止(加上1秒延迟)
Bukkit坑慢慢填,不着急,反正我也不是学java的....
另外前几天看到了mcbbs一个团队翻译的中文DOC,可以看看
DOC地址:httpss://docs.windit.net/Chinese_BukkitAPI/
mcbbs发布地址:https://www.mcbbs.net/forum.php?mod=viewthread&tid=632861&extra=page%3D2
3条评论登录后可见