Minecraft(我的世界)中文论坛

标题: Day's 水桶插件开发教程 第五章 事件/监听器

作者: whatafcukday    时间: 2015-5-8 21:34
标题: Day's 水桶插件开发教程 第五章 事件/监听器
Days 水桶插件开发教程5.事件/监听器
这次简洁版 (懒+没人看不想更)
监听器 顾名思义 就是监控服务器的信息
具体监控什么信息呢?
就要用到事件了 事件分许多种
比如方块放置 液体流动 玩家加入 玩家移动等
1先创建一个监听器  可以新建一个类 也可以在主类中创建
他要求实现listen接口并且导入import org.bukkit.event.Listener;
像这样
Package  xx.xx.xx;
import org.bukkit.event.Listener;
public class PluginListener implements Listener {
}
2创建一个方法 参数为代表某个事件的类 并为他标记EventHandler
比如
@EventHandler
Public void name (BlockBreakEvent evt) {
}
创建一个监听器需要记住两点  让该类实现listener接口&添加EventHandler标记
然后创建好了监听器 还需要注册他 一般在主类启用方法中注册
getServer().getPluginManager().registerEvents(new ListenerClassName(), this);
其中ListenerClassName为监听器的类名 当选择创建在主类中时两个参数都为this
你可以在任何地方注册事件 让他启用
怎么注销?
HandlerList.unregisterAll(); 直接注销此插件中所有事件
一般在卸载方法中执行 或者 使用
BlockBreakEvent.getHandlerList().unregister(Listener/Plugin);
注销该监听器/主类中的BlockBreakEvent事件。
该处的Listener指监听器 Plugin 指主类
注销后 将不会继续监听。
可以代码补全来快速找到自己需要的关于事件的方法 假设我们事件参数为evt
输入evt.         (末尾有个点)
然后就会弹出一个框框 你可以在里面找需要的方法
比如玩家加入事件 PlayerJoinEvent evt
evt.getPlayer 就得到加入的那个玩家了
自定义事件不讲 暂时用不到。
作业:
从javadoc中寻找取消事件的方法 并写一个玩家进服全服公告的插件
javadoc:   https://hub.spigotmc.org/javadocs/bukkit/
没事就多翻翻 javadoc总会有收获的 =0=  事件什么的也在API
全服公告也有方法 还是在javadoc
别的教程你们也可以去翻一番 多多少少有些不一样 从多方面看问题才是最明智的。
有金币的拿金币来没金币的拿人气来 最好两样都拿来 不然。。我会越变越懒得!

作者: 上白丶慧泽音    时间: 2015-5-9 19:25
我想问下禁止物品拾取是不是这样做.
  1. @EventHandler
  2. public void Ban(PlayerPickupItemEvent evt){
  3. Player p = evt.getPlayer();
  4. p.setCancelled(true);
  5. p.sendMessage("该物品被禁止");
  6. }
复制代码

作者: 桃渊林    时间: 2015-5-9 19:25
Package的P需要小写
作者: whatafcukday    时间: 2015-5-9 20:48
上白丶慧泽音 发表于 2015-5-9 19:25
我想问下禁止物品拾取是不是这样做.

恩是可以这样做{:10_505:}
作者: whatafcukday    时间: 2015-5-9 20:48
hcrgm1 发表于 2015-5-9 19:25
Package的P需要小写

{:10_492:} 留给他们自己矫正
作者: 上白丶慧泽音    时间: 2015-5-9 21:05
本帖最后由 上白丶慧泽音 于 2015-5-10 10:29 编辑



这个花几十分钟弄出来的
就是 写配置文件不会 写指令到很熟悉
好像写的好复杂{:10_522:}
请看看有什么错误.
顺便缩写下

作者: whatafcukday    时间: 2015-5-9 22:35
本帖最后由 whatafcukday 于 2015-5-9 22:39 编辑
上白丶慧泽音 发表于 2015-5-9 21:05
这个花几十分钟弄出来的
就是 写配置文件不会 写指令到很熟悉
好像写的好复杂

getmessage有什么意义? 表示你应该判断配置文件中 玩家p有没有保存过登陆信息 若有则返回该字符串若无返回null 然后再在事件中判断要是有就输出,没有就无视
写程序要严谨, 方法的返回值一定要清晰,半吊子一般哪里错了改哪里是写不出好程序的哦!



作者: 上白丶慧泽音    时间: 2015-5-10 10:05
本帖最后由 上白丶慧泽音 于 2015-5-10 10:31 编辑
whatafcukday 发表于 2015-5-9 22:35
getmessage有什么意义? 表示你应该判断配置文件中 玩家p有没有保存过登陆信息 若有则返回该字符串若无返 ...


这样么,注册事件那也忘记添加了.
getServer().getPluginManager().registerEvents(this, this);
还有命令那行没错啊本来就是 /bin set 不是/bin 的话就不执行.


作者: 上白丶慧泽音    时间: 2015-5-10 10:23
whatafcukday 发表于 2015-5-9 22:35
getmessage有什么意义? 表示你应该判断配置文件中 玩家p有没有保存过登陆信息 若有则返回该字符串若无返 ...

我想问下读配置和写配置到底怎么弄的.
如你第四章是不是这样读的
Message:
  Default: 普通人
  Builder: 建筑者
读Default这样?
getConfig().getString(“Message”).getString("Default");
还是getConfig.getString("Message.Default");
那在Message添加owner是不是这样
getConfig().setString("Message","Owner.管理组")
还是.getConfig().setString("Message","Owner:管理组")

创建一个config.yml如何创建啊我怎么看了各种实例都不一样.
而且Bukkit Api 找不到那一栏在哪里.
作者: t9044    时间: 2015-5-10 10:36
上白丶慧泽音 发表于 2015-5-10 10:23
我想问下读配置和写配置到底怎么弄的.
如你第四章是不是这样读的
Message:

你都已经把代码写出来了..自己尝试一下不就可以了嘛
config.yml是你要在IDE上创建的
作者: whatafcukday    时间: 2015-5-10 10:41
上白丶慧泽音 发表于 2015-5-10 10:23
我想问下读配置和写配置到底怎么弄的.
如你第四章是不是这样读的
Message:

getString(路径)
Message:
   Default: 普通人
  Builder: 建筑者
Default的路径= "Message.Default"
作者: whatafcukday    时间: 2015-5-10 10:43
上白丶慧泽音 发表于 2015-5-10 10:05
这样么,注册事件那也忘记添加了.
getServer().getPluginManager().registerEvents(this, this);还有命令 ...

错了,你那是判断触发的玩家等不等于null 但是既然触发了怎么可能等于null呢 应该是getmessage得到的那个等不等于null
作者: 上白丶慧泽音    时间: 2015-5-10 13:48
whatafcukday 发表于 2015-5-10 10:43
错了,你那是判断触发的玩家等不等于null 但是既然触发了怎么可能等于null呢 应该是getmessage得到的那个 ...

我这是判断玩家是不是为null.
如果不是那就发送消息
如果是什么都不做.
getmessage 那有返回null.
作者: whatafcukday    时间: 2015-5-10 15:25
上白丶慧泽音 发表于 2015-5-10 13:48
我这是判断玩家是不是为null.
如果不是那就发送消息
如果是什么都不做.

if(config.contains("config.yml"))  这是什么鬼。。。
作者: 上白丶慧泽音    时间: 2015-5-10 15:54
whatafcukday 发表于 2015-5-10 15:25
if(config.contains("config.yml"))  这是什么鬼。。。

File file=new File(getDataFolder(),"config.yml");
FileConfiguration config = load(file)
我看这里来模仿读写配置的.http://www.mcbbs.net/thread-282740-1-1.html

作者: whatafcukday    时间: 2015-5-10 20:18
上白丶慧泽音 发表于 2015-5-10 15:54
File file=new File(getDataFolder(),"config.yml");
FileConfiguration config = load(file)
我看这里来 ...

if(config.contains("config.yml"))  是判断在config中路径"config.yml"存不存在 毛的关系都没有。。
作者: UAC_MagicK    时间: 2015-5-10 20:22
新手听不懂   上视屏吧{:10_522:}
作者: 上白丶慧泽音    时间: 2015-5-10 20:23
whatafcukday 发表于 2015-5-10 20:18
if(config.contains("config.yml"))  是判断在config中路径"config.yml"存不存在 毛的关系都没有。。 ...

这个是读配置.如果存在加载
  if(config.contains("config.yml")){
  String mess = config.getString("bin."+p+".");
  return mess;
作者: whatafcukday    时间: 2015-5-10 20:24
-----王者----- 发表于 2015-5-10 20:22
新手听不懂   上视屏吧

{:10_492:} 多看几遍 看不懂继续看肯定有一天能看懂的 要边写程序边看
作者: whatafcukday    时间: 2015-5-10 20:26
上白丶慧泽音 发表于 2015-5-10 20:23
这个是读配置.如果存在加载
  if(config.contains("config.yml")){
  String mess = config.getString("b ...

{:10_494:}你可以直接在jar包中创建一个config 这样当saveDefaultConfig时config.yml不存在就会把jar包中的config拉过来
作者: 上白丶慧泽音    时间: 2015-5-10 20:33
whatafcukday 发表于 2015-5-10 20:26
你可以直接在jar包中创建一个config 这样当saveDefaultConfig时config.yml不存在就会把jar包中 ...

哦那样啊.....这个是插件自动生成的= =
作者: 1377023219    时间: 2016-1-9 11:36
不错啊,谢谢楼主了
作者: a59118196    时间: 2016-8-7 15:47
不错,支持原创教程


作者: SmartZombie    时间: 2016-10-3 10:46
一个监听器类中可以写两个监听方法吗
作者: 1713438554    时间: 2017-2-6 13:40
在PlayerJoinEvent里面加入:
Player a = event.getPlayer()
bukkit.broadcastmessage("Test");//好像是这样
作者: kqn3    时间: 2017-6-25 12:47
楼主,我找不到玩家进服的事件。。。。。
作者: kqn3    时间: 2017-6-25 12:55
kqn3 发表于 2017-6-25 12:47
楼主,我找不到玩家进服的事件。。。。。

没事,找到;了
作者: kqn3    时间: 2017-6-25 13:05
@EventHandler
        public void EnterCall(PlayerJoinEvent evt) {

                getServer().getPluginManager().registerEvents(new pluginname(), this);
                        Player p=evt.getPlayer();
                       
                evt.setJoinMessage("玩家:"+p.getName()+"进入服务器"+"(没想到吧,我又回来啦)");

        }//不知道evt.setJoinMessage是不是“加入游戏时向全服发送消息”的意思
作者: kqn3    时间: 2017-6-25 13:05
@EventHandler
        public void EnterCall(PlayerJoinEvent evt) {

                getServer().getPluginManager().registerEvents(new pluginname(), this);
                        Player p=evt.getPlayer();
                       
                evt.setJoinMessage("玩家:"+p.getName()+"进入服务器"+"(没想到吧,我又回来啦)");

        }//不知道evt.setJoinMessage是不是“加入游戏时向全服发送消息”的意思
作者: SakuraYuyuko233    时间: 2017-11-3 22:20
whatafcukday 发表于 2015-5-9 20:48
恩是可以这样做{:10_505:}

setCancelled(true)这个报错