Minecraft(我的世界)中文论坛
标题: Day's 水桶插件开发教程 第五章 事件/监听器
作者: whatafcukday 时间: 2015-5-8 21:34
标题: Day's 水桶插件开发教程 第五章 事件/监听器
Day’s 水桶插件开发教程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总会有收获的 =0= 事件什么的也在API里
全服公告也有方法 还是在javadoc里
别的教程你们也可以去翻一番 多多少少有些不一样 从多方面看问题才是最明智的。
有金币的拿金币来没金币的拿人气来 最好两样都拿来 不然。。我会越变越懒得!
作者: 上白丶慧泽音 时间: 2015-5-9 19:25
我想问下禁止物品拾取是不是这样做.
- @EventHandler
- public void Ban(PlayerPickupItemEvent evt){
- Player p = evt.getPlayer();
- p.setCancelled(true);
- p.sendMessage("该物品被禁止");
- }
复制代码
作者: 桃渊林 时间: 2015-5-9 19:25
Package的P需要小写
作者: whatafcukday 时间: 2015-5-9 20:48
恩是可以这样做{:10_505:}
作者: whatafcukday 时间: 2015-5-9 20:48
{:10_492:} 留给他们自己矫正
作者: 上白丶慧泽音 时间: 2015-5-9 21:05
本帖最后由 上白丶慧泽音 于 2015-5-10 10:29 编辑
- public void onEnable() {
- if(!getDataFolder().exists()) {
- getDataFolder().mkdir();
- }
- getLogger().info("测试插件.")
- }
- public boolean onCommand(CommandSender sender,Command cmd,String label,String[] args){
- if(label.equalsIgnoreCase("bin")){
- if(args.length == 0){
- sender.sendMessage("§e/bin set [玩家] [消息] 设置指定玩家进入消息")
- sender.sendMessage("§e/bin remove [玩家] 取消玩家进入消息")
- }
- if(args[0].equalsIgnoreCase("set")){
- if(args.length != 3){
- sender.sendMessage("§e/bin set [玩家] [消息] 设置指定玩家进入消息")
- return true;
- }
- if(args.length == 3){
- Player player = args[1];
- String message = args[2];
- setmessage(player,message);
- }
- }
- if(args[0].equalsIgnoreCase("remove")){
- if(args.length != 2){
- sender.sendMessage("§e/bin remove [玩家] 取消玩家进入消息");
- return true;
- }
- if(args.length < 2){
- sender.sendMessage("参数过长");
- return true;
- }
- if(args.length>){
- sender.sendMessage("参数过短");
- return true;
- }
- Player player = args[1];
- if(removemessage(player)){
- sender.sendMessage("§c删除成功");
- }
- sender.sendMessage("§c删除失败");
- }
- }
- }
- @EventHandler
- public void PJE (PlayerJoinEvent evt){
- Player p = evt.getPlayer();
- if(p == getmessage(p)){
- bukkit.broadcastMessage(getmessage());
- }
- }
- public FileConfiguration load (File file){
- if(!file.exists()){
- try{
- file.createNewFile();
- }
- catch(IOException e){
- e.printStackTrace();
- }
- }
- return YamlConfiguration.loadConfiguration(file);
- }
- public void setmessage(Player p,String msg){
- File file=new File(getDataFolder(),"config.yml");
- FileConfiguration config = load(file)
- Player p = getServer.getPlayer(args[1]);
- config.set("bin."+p+".", msg)
- try{
- getConfig().save(file);
- }
- catch
- (IOException e){e.printStackTrace();
- }
- public void getmessage(Player p){
- File file=new File(getDataFolder(),"config.yml");
- FileConfiguration config = load(file);
- if(config.contains("config.yml")){
- String mess = config.getString("bin."+p+".");
- return mess;
- }
- }
- public boolean removemessage(Player p){
- File file = new File(getDataFolder(),"config.yml");
- FileConfiguration config = load(file);
- if(config.contains("config.yml")){
- config.set("bin."+p,null);
- try{
- getConfig().save(file);
- }
- catch
- (IOException e){e.printStackTrace();
- return true;
- }
- return false;
- }
复制代码
|
这个花几十分钟弄出来的
就是 写配置文件不会 写指令到很熟悉
好像写的好复杂{:10_522:}
请看看有什么错误.
顺便缩写下
作者: whatafcukday 时间: 2015-5-9 22:35
本帖最后由 whatafcukday 于 2015-5-9 22:39 编辑
getmessage有什么意义? 表示你应该判断配置文件中 玩家p有没有保存过登陆信息 若有则返回该字符串若无返回null 然后再在事件中判断要是有就输出,没有就无视
写程序要严谨, 方法的返回值一定要清晰,半吊子一般哪里错了改哪里是写不出好程序的哦!
作者: 上白丶慧泽音 时间: 2015-5-10 10:05
本帖最后由 上白丶慧泽音 于 2015-5-10 10:31 编辑
这样么,注册事件那也忘记添加了.
getServer().getPluginManager().registerEvents(this, this);
还有命令那行没错啊本来就是 /bin set 不是/bin 的话就不执行.
@EventHandler
public void PJE (PlayerJoinEvent evt){
Player p = evt.getPlayer();
String b = getmessage(p);
if(p != null){
bukkit.broadcastMessage(getmessage(b));
}
}
public void getmessage(Player p){
File file=new File(getDataFolder(),"config.yml");
FileConfiguration config = load(file);
if(config.contains("config.yml")){
String mess = config.getString("bin."+p+".");
return mess;
}
return null;
}
|
作者: 上白丶慧泽音 时间: 2015-5-10 10:23
我想问下读配置和写配置到底怎么弄的.
如你第四章是不是这样读的
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
你都已经把代码写出来了..自己尝试一下不就可以了嘛
config.yml是你要在IDE上创建的
作者: whatafcukday 时间: 2015-5-10 10:41
getString(路径)
Message:
Default: 普通人
Builder: 建筑者
Default的路径= "Message.Default"
作者: whatafcukday 时间: 2015-5-10 10:43
错了,你那是判断触发的玩家等不等于null 但是既然触发了怎么可能等于null呢 应该是getmessage得到的那个等不等于null
作者: 上白丶慧泽音 时间: 2015-5-10 13:48
我这是判断玩家是不是为null.
如果不是那就发送消息
如果是什么都不做.
getmessage 那有返回null.
作者: whatafcukday 时间: 2015-5-10 15:25
if(config.contains("config.yml")) 这是什么鬼。。。
作者: 上白丶慧泽音 时间: 2015-5-10 15:54
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
if(config.contains("config.yml")) 是判断在config中路径"config.yml"存不存在 毛的关系都没有。。
作者: UAC_MagicK 时间: 2015-5-10 20:22
新手听不懂 上视屏吧{:10_522:}
作者: 上白丶慧泽音 时间: 2015-5-10 20:23
这个是读配置.如果存在加载
if(config.contains("config.yml")){
String mess = config.getString("bin."+p+".");
return mess;
作者: whatafcukday 时间: 2015-5-10 20:24
{:10_492:} 多看几遍 看不懂继续看肯定有一天能看懂的 要边写程序边看
作者: whatafcukday 时间: 2015-5-10 20:26
{:10_494:}你可以直接在jar包中创建一个config 这样当saveDefaultConfig时config.yml不存在就会把jar包中的config拉过来
作者: 上白丶慧泽音 时间: 2015-5-10 20:33
哦那样啊.....这个是插件自动生成的= =
作者: 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 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
setCancelled(true)这个报错