Skip to content

自定义脚本事件

PySpigot包括一个自定义事件,称为CustomEvent,可以在脚本内部创建和调用自定义事件,以便在发生某事时使用。该事件旨在供脚本在特定事件发生时向其他脚本和插件发出信号。

该事件包括一个data变量,在创建事件时设置,允许脚本向监听事件的侦听器传递任何类型的数据。还包括一个name变量,当多个脚本同时使用CustomEvent时,允许更大的监听特异性。

PySpigot还会自动将创建和调用事件的脚本附加到事件本身,以便监听器可以确定是哪个脚本调用了事件。

以下描述了如何使用这个自定义事件。

使用自定义事件

导入自定义事件

CustomEvent类可以通过dev.magicmq.pyspigot.event.custom.CustomEvent访问:

1
from dev.magicmq.pyspigot.event.custom import CustomEvent

创建自定义事件

CustomEvent是一个对象,创建实例时有三个与之关联的参数可以设置:

  • name: 事件的名称。通常应该是一个具体的名称,事件监听器可以用它来区分不同脚本产生的CustomEvent事件。
  • data: 附加到事件的数据。下面的代码示例创建了一些虚拟数据,但通常会是与事件相关的一些有用数据,事件监听器可以利用这些数据。
    • data参数可以使用任何Python类型;不需要进行类型转换。
  • async(可选): 如果你的事件是在异步上下文中创建和调用的(例如在异步任务中),应该将其设置为True。否则,可以省略或设置为False
1
2
3
4
5
6
from dev.magicmq.pyspigot.event.custom import CustomEvent

dictionary = {'test': '1', 'test2': '2'}

# 使用字典创建自定义事件
event = CustomEvent('script1_event', dictionary)

如果在异步上下文中,则应按如下方式创建事件:

1
2
3
4
5
6
from dev.magicmq.pyspigot.event.custom import CustomEvent

dictionary = {'test': '1', 'test2': '2'}

# 使用字典创建自定义事件
event = CustomEvent('script1_event', dictionary, True)

调用自定义事件

通过Bukkit的插件管理器调用事件,可以通过Bukkit类(org.bukkit.Bukkit)访问:

1
2
3
4
5
from org.bukkit import Bukkit

...

Bukkit.getPluginManager().callEvent(event)

代码示例

将所有内容整合在一起,这里是一个功能性示例:

1
2
3
4
5
6
7
8
from dev.magicmq.pyspigot.event.custom import CustomEvent # (1)!
from org.bukkit import Bukkit # (2)!

dictionary = {'test': '1', 'test2': '2'} # (3)!

event = CustomEvent('script1_event', dictionary) # (4)!

Bukkit.getServer().getPluginManager().callEvent(event) # (5)!
  1. 在这里,我们导入了CustomEvent类。

  2. 在这里,我们导入了Bukkit类。

  3. 在这里,我们创建了一个虚拟的字典对象,它将作为事件的数据。

  4. 在这里,我们创建了CustomEvent的新实例,并传入一个特定的名称(在这种情况下是"script1_event"),以及之前创建的字典数据。

  5. 在这里,通过将之前创建的CustomEvent对象传递给callEvent(),我们使用Bukkit的插件管理器调用了该事件。

监听自定义事件

监听自定义事件的方式与监听任何其他Bukkit/Spigot事件的方式相同。 CustomEvent类本身有多个可用的函数:

  • event.getScript(): 获取创建并调用此事件的脚本。
  • event.getName(): 获取事件的名称。
  • event.getData(): 获取附加到事件的数据。这将作为PyObject返回,可以直接从脚本中使用,而无需进行任何类型强制转换。
  • event.getDataAsType(String clazz): 获取附加到事件的数据作为所提供类名的实例。如果无法将PyObject数据转换为适当的Java类型,则此方法很有用。
  • event.getDataAsType(Class<T> clazz): 获取附加到事件的数据作为所提供类的实例。如果无法将PyObject数据转换为适当的Java类型,则此方法很有用。

CustomEvent也是可取消的,这意味着监听器可以在需要时取消事件。

摘要

  • CustomEvent类允许脚本向其他脚本或插件发出事件信号,并支持传递自定义data和指定事件name
  • 创建CustomEvent时接受多个参数:name(事件标识符)、data(任何Python类型)和async(可选,用于异步环境)。
  • 通过Bukkit.getPluginManager().callEvent(event)来调用事件。
  • 其他脚本和插件可以像对待其他Bukkit/Spigot事件一样监听CustomEvent。关键的事件函数包括getScript()(返回调用脚本)、getName()(返回事件名称)和getData()(返回附加到事件的数据)。