当前位置: 首页 > 知识库问答 >
问题:

Bukkit:我怎么称呼一个活动?

百里飞捷
2023-03-14

我刚刚开始编写Bukkit,我一直在尝试编写一个插件,为某个播放器启用pvp,并且可以禁用它,但只能为他们自己。它一直工作正常,直到我发现我需要一个事件来完成这项工作,但我还没有了解我需要的事件。在网上看了一些视频/东西后,我找不到任何可以帮助我的东西。如果你能告诉我我将如何做到这一点,那就太好了。此外,如果你能解释更多关于事件的信息,也将不胜感激:)

package me.impatheimpaler.test;

import java.util.ArrayList;
import java.util.List;
import org.bukkit.ChatColor;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.event.Listener;
import org.bukkit.plugin.java.JavaPlugin;

public class togglepvp extends JavaPlugin implements Listener{

    public void onEnable() {

    }

    public void onDisable() {

    }

    List<String> toggled = new ArrayList<String>();

    public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, String[] args) {
        if (cmd.getName().equalsIgnoreCase("togglepvp")) {
            if (!(sender instanceof Player)) {
                 sender.sendMessage("Only a Player can run this command.");
                 return false;
            }
            Player player = (Player) sender;
            if (toggled.contains(player.getName())) {
                 player.sendMessage(ChatColor.RED + "Outgoing PvP - ON");
                 toggled.add(player.getName());
                 return true;
            }
            player.sendMessage(ChatColor.GREEN + "Outgoing PvP - OFF");
            toggled.remove(player.getName());
            return true;
        }
    }
}

共有2个答案

苏昂雄
2023-03-14

另外,如果您能解释更多有关事件的信息,那也将不胜感激:)

嗯,正如它的名字所暗示的那样,事件是指在代码运行时,打断代码的标准行为。一般来说,这意味着用户做了一些事情。

每次,Bukkit注意到用户正在做事件系统涵盖的事情,它都会触发一个事件:

下面不是bukkit和minecraft的正确形式,但我认为,它应该给你一个关于它的图像。

Bukkit创建一个新的事件(这个东西,在你的事件函数中给出,上面的帖子叫做变量“事件”),然后它从它的列表中获取这个事件的每个注册侦听器。(例如:如果用户破坏了一个块,bukkit将获得它自己的区块破坏侦听器和由不同插件注册的每个区块破坏侦听器。)然后当事件被触发时,EventHandler将调用这些侦听器中的每一个方法。

例如,它将首先处理自己的BlockBreakMethod,然后是WorldGuard(如果安装了的话),然后是你的插件,最后是Authme(如果安装了的话)。你不能确切地告诉听众以什么样的顺序得到关于事件的通知,所以你不能确定,你是否“有最后的发言权”或者你是第一个处理事件的人。

这个顺序几乎是随机选择的(当然不是,但您应该想象一下),但您可以通过设置事件优先级对流程施加一点影响。这一点很重要,例如,如果你编写了一个迷你游戏,并想决定玩家是否可以打破一个方块。其他具有相同选择的插件可能会像您一样决定另一种方式,因此如果您具有更高的优先级,您的侦听器将在下午执行,因此您的决定对事件的结果有更深的影响(无论是否取消)。

我希望,我能帮助你更好地理解Bukkit事件和一般事件。不要在意它们是如何生成的,这是高度开发java代码,所以初学者不应该在意它……首先:享受编码的乐趣:)

公良泰宁
2023-03-14

要调用事件,您可以使用:

Bukkit.getServer().getPluginManager().callEvent(myEvent)

但是,根据你的问题,我认为你的意思是你想监听一个事件,这样你就可以在事件发生时执行某些动作。为此,首先在实现侦听器中制作要侦听的类

public class MyHandlerClass implements Listener{
  //code
}

接下来,您必须在 Main 类中注册事件,该类是扩展 JavaPlugin 的类。为此,找到您的onEnable()方法,并调用this.getServer().getPluginManager().registerEvents(Listener,this),其中Listener是您的侦听器类:

@Override
public void onEnable(){
  this.getServer().getPluginManager().registerEvents(new MyHandlerClass(), this);
  //other code
}

接下来,要实际处理事件,请在您的处理程序类(实现侦听器的函数)中创建一个函数,其中包含一个扩展 Event 的参数,并且上面有@EventHandler注释,用于检测一个实体损坏另一个实体,您可以使用事件 EntityDamageByEntityEvent

@EventHandler
public void entityDamageByEntity(EntityDamageByEntityEvent event){
  //your code here
  //use event.getEntity() to get the entity damaged, and event.getDamager() to get the damager
}

每当一个实体被另一个实体损坏时,将自动调用entityDamageByEntity(),您所要做的就是处理事件。

如果你想取消事件,你可以使用 event.setCancel(true)

 类似资料:
  • 我只是很好奇,在C/C++中你把叫做什么? 例如,。它叫“hashtag if”吗?

  • 我有“下载正在进行文件”对话框活动。当用户按下“隐藏”按钮时,活动将创建通知和隐藏进度对话框。并且当用户单击到通知时,活动显示进度对话框再次出现在活动中。我如何在按下按钮“后退”时切换活动到后退任务?

  • 我对代码有问题,因为它不能正常工作。这部分代码在第一个播放器上运行时有效 当第二个玩家接触水时,什么也没有发生。没有错误。下面是完整的代码: 我很确定第二个玩家的“结束”是真的,所以它不会这样做。

  • 我是RXJava的新手。在一个场景中,我希望调用第一个登录webservice(),如果成功,则希望调用另一个webservice()以获取用户信息。

  • 失败:生成失败,出现异常。 > 其中:Script“C:\flutter\packages\flutter_tools\gradle\flutter.gradle”行:900 错误:任务“:app:CompileFlutterBuildDebug”执行失败。 进程“command”C:\flutter\bin\flutter.bat“已完成,退出值为非零%1 生成在%12s中失败异常:Gradle

  • 问题内容: 有时,当我重写方法时,在第一次调用时会出现异常,如下所示: 为什么我们被迫打电话?父类有义务是有意义的,但是更重要的是,我们如何知道需要调用一个方法,而不是等待它崩溃? 问题答案: 为什么我们被迫调用super.method()? 组成Android SDK的类非常复杂。例如,活动和片段都必须执行许多操作才能正常运行(即管理生命周期,优化内存使用,在屏幕上绘制布局等)。要求客户端调用基