七空幻音LOGO

七空幻音

Bukkit插件制作05-定时器2016-10-27 21:33:39

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条评论登录后可见

详细图片
载入中...