我的世界Bukkit服务器插件开发教程(十二)物品与监听事件
创始人
2024-04-29 21:29:57
0

十二、注册、监听事件与附魔


1.事件


1.1.注册事件

先新建一个类,这里我取名为EventListener,同时也提供接口Listener

import org.bukkit.event.Listener;public class EventListener implements Listener {}

回到我们的主类,我们需要告知 Bukkit 这是一个监听类,所以我们需要注册这个类:

Bukkit.getPluginManager().registerEvents(new EventListener(), this);

1.2.监听事件

注册完成后,我们就需要一些监听事件的方法了。对于这些方法,我们需要为他们打上注解:EventHandler,告知 Bukkit 这是个监听方法。

import org.bukkit.event.EventHandler;@EventHandler
public void xxx(xxx e) {//TODO
}

我们需要监听什么,并不取决于方法名,而是参数的类型,比如下面的方法:

@EventHandler
public void onPLayerDeath(PlayerLoginEvent event) {//TODO
}

参数event的类型是PlayerLoginEvent,说明这个方法是用来监听玩家登录的,而不是如方法名所述监听玩家死亡。

event有什么用呢?我们可以用它来获取一些相关的东西,比如上面的代码,我们可以通过event来获取登录的玩家:

@EventHandler
public void onPLayerDeath(PlayerLoginEvent event) {Player player = event.getPlayer();player.sendMessage("Welcome!");
}

如上,这样我们就可以为玩家发送欢迎的消息。当然,我们还可以取消这些事件,比如我们可以监听玩家上床,这样当玩家睡觉时,我们可以取消这一事件让他醒来。

@EventHandler
public void onPlayerGetOnBed(PlayerBedEnter event) {//取消玩家上床event.setCancelled(true);
}

至于更多的监听事件,可以自行去翻阅 bukkit 文档。


2.物品


1.1.附魔

我们可以为物品进行附魔。

boolean addEnchant(@NotNull Enchantment var1, int var2, boolean var3);

addEnchant方法可以为物品进行附魔,来看看它的三个参数。第一个参数表明了需要附魔什么,Enchantment是一个枚举类。第二个参数表示附魔的等级。第三个参数表示是否忽略附魔的等级限制,不同的附魔会有不同的等级限制,如“锋利”等级限制为 VVV,而“耐久”等级限制为 IIIIIIIII。

ItemStack hello = new ItemStack(Material.DIAMOND_SWORD);
ItemMeta im = hello.getItemMeta();
im.addEnchant(Enchantment.DAMAGE_ALL, 32767, true);
hello.setItemMeta(im);

千万不要忘了到最后一步要设置itemMeta


1.2.Lore

我们可以为物品添加一些Lore(?你可以把Lore当成物品的介绍,Bukkit 文档并没有翻译Lore)。

void setLore(@Nullable List var1);

只有一个参数。里面存放的是物品LoreString,一个String代表一行。

List a = new ArrayList<>();
a.add("Hello World!");
a.add("dlroW olleH!");im.setLore(a);

千万不要忘了到最后一步要设置itemMeta


1.3.属性

我们可以设置一个物品的属性。

boolean addAttributeModifier(@NotNull Attribute var1, @NotNull AttributeModifier var2);

addAttributeModifier方法可以为物品添加或修改属性,第一个参数是个枚举类,列举了物品的属性,第二个参数是属性的修饰符(Bukkit 文档是这么定义的),来看看它的其中一个构造方法:

public AttributeModifier(@NotNull UUID uuid, @NotNull String name, double amount, @NotNull Operation operation, @Nullable EquipmentSlot slot);

一共五个参数,我们一个一个来看:

  • uuid:这个修饰符的标识。
  • name:这个修饰符的名称(内部名)。
  • amount:修饰的值。
  • operation:运算模式。
  • slot:修饰符生效的槽位,比如放在主手生效、副手生效,等等。

(Bukkit 文档的汉化一言难尽。)

说得更加通俗一些,有些物品(如靴子、剑、稿)会有它自己的属性(如疾跑、攻击伤害)等。这些属性都有它自己的一个值(即amount),现在添加(或修改)属性,可以选择(或修改)它的运算模式(即operation)或属性生效的槽位(即slot)。

运算模式(operation)只有三种(xxx 为参数amount值):

  • ADD_NUMBER:直接在原本的修饰值基础上增加一个 xxx。
  • ADD_SCALAR:原修饰值将乘上 xxx,就相当于打折。
  • MULTIPLY_SCALAR_1: xxx 加上 111 后再乘上原修饰值,如当 xxx 取 0.20.20.2 时相当于 1.21.21.2 倍。
ItemStack hello = new ItemStack(Material.DIAMOND_SWORD);
ItemMeta im = hello.getItemMeta();
im.addAttributeModifier(Attribute.GENERIC_ATTACK_KNOCKBACK, new AttributeModifier(UUID.randomUUID(), "击退力度", 4.0, AttributeModifier.Operation.ADD_SCALAR));
hello.setItemMeta(im);

如上代码,我们给钻石剑增加一个「攻击击退力度」,是原本的 444 倍。

这样,结合以上所有代码,我们可以监听玩家的登录事件,并在登录时给予玩家一个拥有附魔和击退力度的钻石剑。


上一篇:我的世界Bukkit服务器插件开发教程(十一)粒子、药水效果与音效

下一篇:我的世界Bukkit服务器插件开发教程(十三)资源包与玩家资料

相关内容

热门资讯

【学习笔记】[AGC040F]... 我是丝薄因为我不会GF 考虑纯组合意义的推导。因为我真的不会数学啊 设(x,d)(x,d)(x,d)...
java线程中断 interr... 1.  线程的状态: new -> 创建完线程,但是还没有启动runna...
16 | 如何做好面试后的复盘... 前言 前言:将经验转换为能力,就需要从经历的事情上总结复盘。 文章目...
Python基础学习七 类 Python从设计之初就已经是一门面向对象的语言,正因为如此,在Py...
day 19 暴力枚举 注意:用long long 存答案P2241 统计方形(数据加强版&#x...
嵌入式理论复习题库(期末考试版... 一、填空题15*1=15 1. 要下载并调试 STM32 程序,可采用   ...
OSG三维渲染引擎编程学习之二... 目录 第三章:OSG场景组织 3.6 Transform变换节点 第三章:OSG场景组织 ...
cmake 04 使用 pyt... 本文目标 使用 python 写一个管理 cmake 工程的 cli 程序 参考 Python CL...
Java多线程(二)—— Re... ReentrantLock源码解析 ReentrantLock 是可重入的互斥锁,虽然...
linux shell脚本学习 linux shell脚本学习笔记 文章目录linux shell脚本学习笔记一、脚本入门1.我的第...