本帖最后由 +倒霉の忍者+ 于 2013-2-24 16:23 编辑
(注:本帖不回答插件制作相关问题,有问题请到你问我答区发帖)
* 未经许可不得转载本帖内容!
前言:
在1.1以前,监听器内的事件方法是以继承方式创建的,名称都是固定的(因为要覆盖),严格而繁琐;
1.1以后,CB作出较大改动,你仅需实现Listener接口,事件方法也变为依靠一个标记(EventHandler)来进行创建,自由且简便。
目前,你可以随意的创建一个监听器,方法也是任意的,只不过不要忘记标记“EventHandler”。
一、创建监听器
0.首先让我们来理解什么是监听器:
当一个玩家在游戏中做出各种行为时,你可能会需要对其控制,比如一名游客,你是不能让他去放置&破坏方块的。
这时你就需要用到监听器,对其进行判断,如果是游客就撤销该行为,如果不是则允许该行为。
1.新建一个类,名字任意(记住第壹章中只能使用英文的说明),但要求它实现“Listener”接口,它看起来应该象这样:复制代码2.创建一个方法,名字任意,变量为一个代表某一事件的类,我们以BlockBreakEvent事件为例,它看起来应该象这样:复制代码3.添加EventHandler标记,你只要在方法上一行,输入“@EventHandler”即可,更改完后的方法代码应该象这样:复制代码EventHandler 相关设置:
最后你的监听器看起来应该是这个样子复制代码除了上面新建一个类作为事件监听器,你还可以在任何类中创建一个事件方法,只要记住2点:
(其实也就是把该类改造成一个监听器)
二、注册监听器
你已经创建了一个监听器,然而现在它只能作为一个摆设而已,你需要在服务器中注册它来使它起作用,调用这个方法:复制代码其中Listener处换为你实现该接口的类的对象(需要你自己去实例化),
Plugin则换成代表该插件的对象(在主类里的动态方法中用this关键字获得)。
之后你可以在任何地方来注册该监听器,只要你填入正确的对象(实际操作时是对象的引用)。
一般来说,是在插件加载时进行注册,下面是一个例子:复制代码三、注销监听器
注销监听器有2种方式,一种是从单独事件中注销,另一种是从所有事件中注销。
无论是哪种方式,都可以指定某一监听器或插件来注销。
以BlockBreakEvent为例,单独事件注销方法如下:复制代码从上到下分别是注销监听器中的该事件和插件中的该事件,
这样你就注销了对应对象中所有有关BlockBreakEvent的事件方法。
所有事件注销方法:复制代码从上至下分别是注销所有事件,注销监听器中的所有事件,和注销插件中的所有事件。
这样你就把对应对象的所有事件全部注销了。
四、自制事件
自制事件很简单,你只需要记住以下2点即可。
1.在每个事件中都加入Handler相关内容;
在每个自制事件中都要加入1个属性、1个动态方法和1个静态方法:复制代码原因你可以在上一小节中找到。
我们假设这个事件是这样的:复制代码2.触发该事件的方法
首先你要实例化一个事件对象来确定它的属性的内容;复制代码其中block代表某一方块的句柄。
之后触发该事件:复制代码之后监听器该事件的监听器就会按优先级先后调用事件方法。
(Bukkit代表插件系统,可以获得对应服务器,这和你直接在插件中获得的服务器是相同的,性能差别也很小)
监听自制事件和监听服务器自带事件是一样的。
以下内容需要积分高于 20 才可浏览
(注:本帖不回答插件制作相关问题,有问题请到你问我答区发帖)
* 未经许可不得转载本帖内容!
CraftBukkit插件制作 —— 第 叁 章:监听器
前言:
在1.1以前,监听器内的事件方法是以继承方式创建的,名称都是固定的(因为要覆盖),严格而繁琐;
1.1以后,CB作出较大改动,你仅需实现Listener接口,事件方法也变为依靠一个标记(EventHandler)来进行创建,自由且简便。
目前,你可以随意的创建一个监听器,方法也是任意的,只不过不要忘记标记“EventHandler”。
一、创建监听器
0.首先让我们来理解什么是监听器:
当一个玩家在游戏中做出各种行为时,你可能会需要对其控制,比如一名游客,你是不能让他去放置&破坏方块的。
这时你就需要用到监听器,对其进行判断,如果是游客就撤销该行为,如果不是则允许该行为。
1.新建一个类,名字任意(记住第壹章中只能使用英文的说明),但要求它实现“Listener”接口,它看起来应该象这样:
- package xxx.xxxxxxx.xxxxxx.xxxx;
- import org.bukkit.event.Listener;
- public class MyListener implements Listener {
- }
- public void aMethodName(BlockBreakEvent event) {
- //代码
- }
- @EventHanlder
- public void aMethodName(BlockBreakEvent event) {
- //代码
- }
最后你的监听器看起来应该是这个样子
- package xxx.xxxxxxx.xxxxxx.xxxx;
- import org.bukkit.event.Listener;
- public class MyListener implements Listener {
- @EventHanlder
- public void aMethodName(BlockBreakEvent event) {
- //代码
- }
- }
(其实也就是把该类改造成一个监听器)
- 让该类实现 Listener 接口
- 给该事件方法添加 EventHandler 标记
二、注册监听器
你已经创建了一个监听器,然而现在它只能作为一个摆设而已,你需要在服务器中注册它来使它起作用,调用这个方法:
- getServer().getPluginManager().registerEvents(Listener, Plugin);
Plugin则换成代表该插件的对象(在主类里的动态方法中用this关键字获得)。
之后你可以在任何地方来注册该监听器,只要你填入正确的对象(实际操作时是对象的引用)。
一般来说,是在插件加载时进行注册,下面是一个例子:
- package xxx.xxxxxxx.xxxxxx.xxxx;
- import java.util.logging.Logger;
- import org.bukkit.plugin.java.JavaPlugin;
- import xxx.xxxxx.xxxxx.xxxx.MyListener;
- public class MyPlugin extends JavaPlugin {
- public void onEnable(){
- getServer().getPluginManager().registerEvents(new MyListener(), this);
- getLogger().info("你的插件已被加载!");
- }
- public void onDisable(){
- getLogger().info("你的插件已被卸载。");
- }
- }
注销监听器有2种方式,一种是从单独事件中注销,另一种是从所有事件中注销。
无论是哪种方式,都可以指定某一监听器或插件来注销。
以BlockBreakEvent为例,单独事件注销方法如下:
- BlockBreakEvent.getHandlerList().unregister(Listener);
- BlockBreakEvent.getHandlerList().unregister(Plugin);
这样你就注销了对应对象中所有有关BlockBreakEvent的事件方法。
所有事件注销方法:
- HandlerList.unregisterAll();
- HandlerList.unregisterAll(Listener);
- HandlerList.unregisterAll(Plugin);
这样你就把对应对象的所有事件全部注销了。
四、自制事件
自制事件很简单,你只需要记住以下2点即可。
1.在每个事件中都加入Handler相关内容;
在每个自制事件中都要加入1个属性、1个动态方法和1个静态方法:
- private static final HandlerList handlers = new HandlerList();
-
- public HandlerList getHandlers() {
- return handlers;
- }
-
- public static HandlerList getHandlerList() {
- return handlers;
- }
我们假设这个事件是这样的:
- import org.bukkit.event.Event;
- import org.bukkit.event.HandlerList;
-
- public class CustomBlockEvent extends Event {
- private static final HandlerList handlers = new HandlerList();
- private Block block;
-
- public CustomBlockEvent(Block block) {
- this.block = block;
- }
-
- public String getBlock() {
- return block;
- }
-
- public HandlerList getHandlers() {
- return handlers;
- }
-
- public static HandlerList getHandlerList() {
- return handlers;
- }
- }
首先你要实例化一个事件对象来确定它的属性的内容;
- CustomBlockEvent event = new CustomBlockEvent(block);
之后触发该事件:
- Bukkit.getServer().getPluginManager().callEvent(event);
(Bukkit代表插件系统,可以获得对应服务器,这和你直接在插件中获得的服务器是相同的,性能差别也很小)
监听自制事件和监听服务器自带事件是一样的。
本帖最后由 +倒霉の忍者+ 于 2012-9-4 21:07 编辑
沙发自占
留着备用的
卤蛋你丫的才灌水呢↓
沙发自占
留着备用的
卤蛋你丫的才灌水呢↓
虽不明,但觉厉

没办法呢...谁叫我们知识有限...看也看不懂咩...也有细心看...可是就是
看不懂呢...也许是厌学心理吧..每次看到这些..就觉得头疼。

可是这个怎么就TA丫的看不懂TAT

还是佩服楼主的耐力啊..
总觉得或许我说的话是错的。
天赋可能某些人要强一些。
可是怎么觉得自己没去努力呢...
虽说 世上无难事 只怕有心人
但是我或许就是个无心人...
某些时候咬咬牙也能学到……
总觉得或许我说的话是错的。
天赋可能某些人要强一些。
可是怎么觉得自己没去努力呢...



希望楼主早日更新,~辛苦了~
....不会5555楼主怎么获得服务器在线人数
表示光是翻译bukkit的 类 都要把我的脑子弄爆了!
主要是想翻译到MCBBS上...但是实在是太多了= =所以还是算了吧
谢谢楼主分享!
本帖最后由 a3948982938 于 2016-2-1 23:44 编辑
ありがとうございます
ありがとうございます
Lz 你的New Mylistener()复制代码找了好久都不知道哪里出问题,结果是New要小写丫
- package xxx.xxxxxxx.xxxxxx.xxxx;
- import java.util.logging.Logger;
- import org.bukkit.plugin.java.JavaPlugin;
- import xxx.xxxxx.xxxxx.xxxx.MyListener;
- public class MyPlugin extends JavaPlugin {
- public void onEnable(){
- getServer().getPluginManager().registerEvents(New MyListener(), this);
- getLogger().info("你的插件已被加载!");
- }
- public void onDisable(){
- getLogger().info("你的插件已被卸载。");
- }
- }
0.0学习{:10_512:}
{:10_566:}大触简直无情,表示才java初学
牛逼,赞一个先~
你打错了@EventHanlder
你少加了import org.bukkit.event.EventHandler;
你少加了import org.bukkit.event.EventHandler;
感谢分享
- package xxx.xxxxxxx.xxxxxx.xxxx;
- import org.bukkit.event.EventHandler;
- import org.bukkit.event.EventPriority;
- import org.bukkit.event.Listener;
- import org.bukkit.event.block.BlockBreakEvent;
- public class MyListener implements Listener {
- @EventHandler(priority = EventPriority.LOW)
- public void aMethodName(BlockBreakEvent event) {
- //代码
- }
- }
Thx!我等苦于做插件的苦逼也算是有了那么一条出路。。。。。
该写写什么叫en什么什么t什么的,看不懂,很多没说到,比如每个词都是干什么用的
0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0
袁嵩 发表于 2012-9-4 21:23
还是佩服楼主的耐力啊..
总觉得或许我说的话是错的。
天赋可能某些人要强一些。
你这种人啊,不出视频不会感兴趣的 = =


大触简直无情,表示才java初学
积分不够看不到`````{:10_527:}
后排支持,谢谢层主
高于20分......
- - 弄那么搞积分干啥。
楼主
@EventHanlder是错的
应该是@EventHandler
害得我半天都弄不明白
@EventHanlder是错的
应该是@EventHandler
害得我半天都弄不明白
你详解每个单词的意思,不然听不懂
aMethodName是一个函数(方法)
BlockBreakEvent是一个类
event 是一个变量
BlockBreakEvent是一个类
event 是一个变量
kjkj2173135 发表于 2016-2-21 21:36
aMethodName是一个函数(方法)
BlockBreakEvent是一个类
event 是一个变量
Java里根本不存在函数,Java面向对象。
根本就没有解释每个词语的必要,会Java基础就应该能分辨出来。监听器就是一个打@EventHandler的方法。
比如你去买苹果拿回家吃,我还需要给你解释外面套着的是一个塑料袋,里面装的是苹果本体,苹果上面的枝子是与树对接的装置,苹果外面是苹果皮?这种问题只要你知道怎么吃苹果就能知道。
最后你的监听器看起来应该是这个样子
package xxx.xxxxxxx.xxxxxx.xxxx;
import org.bukkit.event.Listener;
public class MyListener implements Listener {
@EventHanlder
public void aMethodName(BlockBreakEvent event) {
//代码
}
}
package xxx.xxxxxxx.xxxxxx.xxxx;
import org.bukkit.event.Listener;
public class MyListener implements Listener {
@EventHanlder
public void aMethodName(BlockBreakEvent event) {
//代码
}
}
看看支持一下。
看完后表示。。看不懂
自定义事件是只能手动触发吗?
那我想要监听玩家死亡应该怎么做
那我想要监听玩家死亡应该怎么做
看不了教程,需要20积分以上才能看

6666666666666
感谢dalao的教程,仰慕
膜拜大神
给我看一眼嘛 QAQ