我的世界Bukkit服务器插件开发教程(十二)物品与监听事件

这篇博客介绍了如何在Minecraft Bukkit服务器中开发插件,涉及事件监听和物品定制。首先讲解了如何注册和实现监听事件,例如监听玩家登录并发送欢迎消息,以及阻止玩家上床。接着,详细阐述了如何为物品添加附魔、lore和属性,包括附魔的等级限制、lore的添加以及通过属性修饰符改变物品属性。最后,展示了如何结合这些功能,在玩家登录时给予他们带有特定属性的钻石剑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

十二、物品与监听事件


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是一个枚举类。第二个参数表示附魔的等级。第三个参数表示是否忽略附魔的等级限制,不同的附魔会有不同的等级限制,如“锋利”等级限制为 V V V,而“耐久”等级限制为 I I I III III

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<String> var1);

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

List<String> 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)只有三种( x x x 为参数amount值):

  • ADD_NUMBER:直接在原本的修饰值基础上增加一个 x x x
  • ADD_SCALAR:原修饰值将乘上 x x x,就相当于打折。
  • MULTIPLY_SCALAR_1 x x x 加上 1 1 1 后再乘上原修饰值,如当 x x x 0.2 0.2 0.2 时相当于 1.2 1.2 1.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);

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

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


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

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

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值