当前位置:首页 > CN2资讯 > 正文内容

我的世界remote JVM 监控

2天前CN2资讯

UPD(2023-5-3):调整了部分文字的格式。

关键词:事件(event)、事件侦听器(Event Listener)、示例(给玩家发送登录欢迎)、示例(彩色文字)、示例(使玩家无法移动)。


  在本篇教程中我将引入事件(event)这一概念,并实现一些简单的功能。

  很多程序是依赖事件机制工作的,比如说某些 GUI 库,当用户按下键盘上的某个键时,就会产生一个事件,当用户松开那个键时,又会产生一个事件,在这个过程中,程序可以捕获事件,根据事件的内容进行相应的处理。在 Minecraft 中,玩家移动会产生事件,破坏方块会产生事件,退出服务器会产生事件……程序员只需要给对应的事件编写相应的处理代码,就能实现丰富的交互效果。

  事件机制有什么优点呢?试想,如果不使用事件机制,为了实现同样的效果,程序就要不停地检测许多变量的变化情况,一般来说,这是非常浪费资源的,而且也不方便处理。使用事件机制,我们不仅可以更方便地管理这些“变化”,还能根据实际情况解决 “什么时候去处理?怎样处理?先处理谁?” 这些问题。

  有了以上知识作为铺垫,现在我们来看代码。如果你正确地按照教程的上一篇配置好了环境,新建项目后应该会看到如下预置的模板代码:

package group.testplugin; // 这一行因你的项目配置变化而变化,并不一定要和我一样 import org.bukkit.plugin.java.JavaPlugin; public final class Testplugin extends JavaPlugin { @Override public void onEnable() { // Plugin startup logic } @Override public void onDisable() { // Plugin shutdown logic } }

   现在让我们来引入事件机制。(注:下面的一些代码需要你自行添加相应的 import)

  为了处理事件,我们需要一个事件侦听器类 (EventListener),那么如何让一个类成为所谓的事件侦听器类呢?很简单,只需在定义后面加上 implements Listener 即可,对于上面的代码,就是写成

public final class Testplugin extends JavaPlugin implements Listener

  但是,插件此时并不知道我们定义的事件侦听器的存在,这也很好理解,因为接口是一个“被动”的存在,而你只是通过 implements 关键字表明自己要去实现里面的方法,为了能在触发各种事件时调用我们实现的接口,我们必须注册这个事件侦听器类,很简单,一行代码就可以搞定:

getServer().getPluginManager().registerEvents(this, this);

  其实,事件侦听器类不一定是我们的 Testplugin 类(插件主类,即上面代码中继承了 JavaPlugin 的类),你可以另外定义一个类来实现事件侦听器然后与 Testplugin 类来交互(但是 Testplugin 类是必需的,因为它继承了 JavaPlugin 类,是整个插件的核心,负责插件启动和关闭时的行为)。

  参照 registerEvents 的定义:

  我们就可以把插件主类和事件侦听器类分开,然后进行注册。这里我把两个类合二为一,一方面方便讲解,一方面要实现的功能不是很多,所以放在一起更紧凑。

  一般来说,上面这行注册代码必须在一开始就要执行掉,如果你的事件侦听器类和插件主类是同一个类,那么把它放在插件主类的 onEnable() 方法里是不错的选择。如果两个类不同,你可以考虑将注册代码写在事件侦听器的构造函数内,或者在插件主类中定义一个事件侦听器类的对象,依然在插件主类的 onEnable() 方法中调用注册代码。


  下面我们来实现一些基本的功能。(以下的方法均定义在你的事件侦听器类里面)

  比如说,当玩家加入游戏的时候给他们发送欢迎消息:

@EventHandler public void onPlayerJoin(PlayerJoinEvent event) { event.getPlayer().sendMessage("Welcome, " + ChatColor.AQUA + event.getPlayer().getName() + ChatColor.WHITE + " !"); if (!player_list.containsKey(event.getPlayer().getUniqueId())) { event.getPlayer().sendMessage("Please register before playing :)"); event.getPlayer().sendMessage("Use " + ChatColor.AQUA + "\"/register <password>\"" + ChatColor.WHITE + " to register."); event.getPlayer().sendMessage("And use " + ChatColor.AQUA + "\"/login <password>" + ChatColor.WHITE + " to login.\""); } else event.getPlayer().sendMessage("Use " + ChatColor.AQUA + "\"/login <password>" + ChatColor.WHITE + " to login.\""); }

  上面的代码来自是我初学的时候写的简易登录插件。注意:每一个事件处理方法都要在最前面加上 @EventHandler 的注释。如果你想知道为什么这个方法是这样定义的,请查询插件的官方文档,对于这段代码,我查到的是PlayerJoinEvent (Paper-API 1.16.5-R0.1-SNAPSHOT API)。只要知道对应的事件名称,我们就可以编写相应的方法来处理它。

  细心的你也许会发现,我们编写的方法名 onPlayerJoin 似乎和事件名 PlayerJoinEvent 有关,其实这样写是方便理解,当然你想写 onPlayerFxxkJoin 也是可以的,不过可读性就降低了,只要你保证唯一的参数是 PlayerJoinEvent 类型的即可。

  我们具体到方法内部看,很容易可以知道给玩家发送信息的方法是 sendMessage,但是发送信息前我们需要先知道给发送,这里使用了 event.getPlayer() 来获得这个事件对应的玩家——绝大多数事件都是和玩家有关的,而你就可以通过这个方法来获得对应的玩家,并且,不仅仅可以做到对其发送信息,他的生杀大权已经掌握在你手里了!比如 event.getPlayer().setHealth(0.0)……

  可以看到输了个 set 就出来这么多方法,大家可以结合官方文档自行尝试效果。注意,上面这个方法当然要定义在你的事件侦听器类里面


  还有一个很重要的功能是彩色文字,这个从上面的代码里也可以知道,只需要在字符串之间用 ChatColor.XXX 来连接即可实现,每一种 ChatColor 的效果会被应用于其之后的文字:

  并且,在左边还会贴心地显示出你当前使用的颜色。


   再来看一个功能,比如,当玩家未注册时无法移动,这个在很多服务器里非常常见:

@EventHandler public void onPlayerMove(PlayerMoveEvent event) { if (!player_list.containsKey(event.getPlayer().getUniqueId())) event.setCancelled(true); else if (player_list.get(event.getPlayer().getUniqueId()).if_logined == Boolean.FALSE) event.setCancelled(true); }

  使用 event.setCancelled(true) 即可让玩家移动的事件被“取消”,直观上来看就是无法移动,或者移动了一点点距离就马上被拉回原位,注意这里的移动包括视角的变化。

  注意,上面这段代码直接复制粘贴是无法正确运行的,因为里面的 player_list 和 if_logined 都是我自己定义的,如果你想实现类似的效果需要自己编写额外的代码。


    你可能想看:

    扫描二维码推送至手机访问。

    版权声明:本文由皇冠云发布,如需转载请注明出处。

    本文链接:https://www.idchg.com/info/21716.html

    分享给朋友:

    “我的世界remote JVM 监控” 的相关文章

    解决Hostodo打不开的有效方法和详细步骤

    在使用Hostodo的过程中,偶尔会遇到打不开的情况。这种问题可能会让人感到挫败,但其实有几个常见原因可以帮助我们找到解决办法。首先,网络连接问题是最普遍的原因之一。无论是局域网的配置,还是Wi-Fi的信号不稳定,都会导致连接失败。我记得第一次遇到这种情况时,发现原来是我的路由器出了问题,重新启动后...

    如何高效使用测速脚本监测网络性能

    在互联网的快速发展中,网络测速变得越来越重要。作为一个互联网用户,了解自己的网络性能是否稳定,以及在不同时间与地点的表现,能帮助我们更好地选择服务和进行问题排查。网络速度直接影响了我们的在线体验,无论是看视频、玩游戏,还是进行远程办公,网络性能都扮演着至关重要的角色。 测速脚本出现在这样的背景下,它...

    如何优化网络体验:VPS中转全面指南

    我一直对如何使用技术来优化我的网络体验感到好奇。最近,我发现了VPS中转这种神奇的方法。简单来说,VPS中转就是利用一台虚拟私人服务器(VPS),将我的网络流量转发到另一个指定的网络地址。这种功能主要用于加速访问某些海外网站,帮助我突破网络限制以及保护我的上网隐私等。 在日常使用中,我会遇到一些网站...

    最新hudsonvalleyhost优惠码使用技巧与推荐2023

    hudsonvalleyhost 优惠码介绍 hudsonvalleyhost优惠码是一种可以帮助用户在使用hudsonvalleyhost服务时节省费用的代码。这种优惠码一般由字母和数字组成,用户在进行购买或订阅相关服务时输入该代码,就可以享受到折扣或特定的优惠。每个优惠码的有效期和适用范围可能不...

    虚拟主机与服务器的区别:选择最佳网络解决方案

    在现代互联网环境中,虚拟主机和服务器这两个词时常会交替出现。作为一个初学者,了解它们的基本概念是非常重要的。接下来,我将分别给大家介绍虚拟主机与服务器的定义以及它们之间的主要区别。希望通过我的描述,能够帮助大家更清晰地认识这两个概念。 首先,我想谈谈虚拟主机的定义。虚拟主机是通过虚拟化技术在一台物理...

    全球主机交流论坛:提升您的服务器配置与网站性能

    全球主机交流论坛的定义与功能 全球主机交流论坛,顾名思义,是一个汇聚了来自不同地区、不同背景的主机使用者和提供商的平台。在这个论坛中,用户可以分享他们的经验、寻求技术支持或讨论行业趋势。更重要的是,这些交流能够帮助用户优化他们的服务器配置,提升网站性能,甚至解决一些特定的技术难题。对我而言,参与这样...