Minecraft bukkit 插件右键单击项目
Minecraft bukkit plugin right click item
我正在为我作为开发人员的服务器制作一个插件,并且我正在开发一个插件!
我想在你执行命令后执行 /boss give lvl <lvl> slime
命令来生成一个 Boss 蛋,它会给你一个项目,你可以右键单击它来生成 Boss!就像所有新开发人员一样,事情并不总是按照您认为的方式进行。这是我输入的代码,用于检查玩家是否右键单击空气或玩家手中带有物品 SLIME_BALL 的方块。
@EventHandler
public void onPlayerClicks(PlayerInteractEvent event) {
Player player = event.getPlayer();
Action action = event.getAction();
if (action.equals(Action.RIGHT_CLICK_AIR) || action.equals(Action.RIGHT_CLICK_BLOCK)) {
if (player.getItemInHand().getType() == Material.SLIME_BALL) {
player.sendMessage("You have right click a slime ball!");
}
}
}
鉴于您在日志中没有看到任何堆栈跟踪,我同意您的事件侦听器未注册。假设您的侦听器 class 被称为 MyEventHandler
它将在 onEnable()
方法中注册,类似于此
class MyPlugin extends JavaPlugin {
...
public void onEnable() {
Listener myEvtHnd = new MyEventHandler();
Bukkit.getPluginManager().registerEvents( myEvtHnd, this );
...
}
}
总的来说,您的处理程序看起来很合适。 PlayerInteractEvent
提供了一个方便的方法 getItem()
即 returns 玩家的当前 item-in-hand。但是,无论使用哪种方法,您都必须检查返回的ItemStack
是否不为空,如果玩家没有物品in-hand,就会发生这种情况。
@EventHandler
public void onPlayerClicks(PlayerInteractEvent event) {
Player player = event.getPlayer();
Action action = event.getAction();
ItemStack item = event.getItem();
if ( action.equals( Action.RIGHT_CLICK_AIR ) || action.equals( Action.RIGHT_CLICK_BLOCK ) ) {
if ( item != null && item.getType() == Material.SLIME_BALL ) {
player.sendMessage( "You have right click a slime ball!" );
}
}
}
也许您可以使用 action ==
而不是 action.equals()
,如:
if (action == Action.RIGHT_CLICK_AIR || action == Action.RIGHT_CLICK_BLOCK) {
if (player.getItemInHand().getType() == Material.SLIME_BALL) {
player.sendMessage("You have right click a slime ball!");
}
}
我正在为我作为开发人员的服务器制作一个插件,并且我正在开发一个插件!
我想在你执行命令后执行 /boss give lvl <lvl> slime
命令来生成一个 Boss 蛋,它会给你一个项目,你可以右键单击它来生成 Boss!就像所有新开发人员一样,事情并不总是按照您认为的方式进行。这是我输入的代码,用于检查玩家是否右键单击空气或玩家手中带有物品 SLIME_BALL 的方块。
@EventHandler
public void onPlayerClicks(PlayerInteractEvent event) {
Player player = event.getPlayer();
Action action = event.getAction();
if (action.equals(Action.RIGHT_CLICK_AIR) || action.equals(Action.RIGHT_CLICK_BLOCK)) {
if (player.getItemInHand().getType() == Material.SLIME_BALL) {
player.sendMessage("You have right click a slime ball!");
}
}
}
鉴于您在日志中没有看到任何堆栈跟踪,我同意您的事件侦听器未注册。假设您的侦听器 class 被称为 MyEventHandler
它将在 onEnable()
方法中注册,类似于此
class MyPlugin extends JavaPlugin {
...
public void onEnable() {
Listener myEvtHnd = new MyEventHandler();
Bukkit.getPluginManager().registerEvents( myEvtHnd, this );
...
}
}
总的来说,您的处理程序看起来很合适。 PlayerInteractEvent
提供了一个方便的方法 getItem()
即 returns 玩家的当前 item-in-hand。但是,无论使用哪种方法,您都必须检查返回的ItemStack
是否不为空,如果玩家没有物品in-hand,就会发生这种情况。
@EventHandler
public void onPlayerClicks(PlayerInteractEvent event) {
Player player = event.getPlayer();
Action action = event.getAction();
ItemStack item = event.getItem();
if ( action.equals( Action.RIGHT_CLICK_AIR ) || action.equals( Action.RIGHT_CLICK_BLOCK ) ) {
if ( item != null && item.getType() == Material.SLIME_BALL ) {
player.sendMessage( "You have right click a slime ball!" );
}
}
}
也许您可以使用 action ==
而不是 action.equals()
,如:
if (action == Action.RIGHT_CLICK_AIR || action == Action.RIGHT_CLICK_BLOCK) {
if (player.getItemInHand().getType() == Material.SLIME_BALL) {
player.sendMessage("You have right click a slime ball!");
}
}