LogoArcartX Doc

事件

监听并取消 Rondo 的存取、转账与兑换操作

Rondo 在资金操作前触发 Bukkit 事件。三个事件都可以取消。

事件回调不会持有 Rondo 的内部玩家顺序锁,监听器可以安全调用其他 RondoAPI。事件结束后 Rondo 才进入最终原子事务,因此事件字段表示本次操作的提交提案oldBalance / newBalance 是触发前观察值,并发写入可能使最终提交失败。取消事件可保证本次 Rondo 操作不提交;未取消不等于提交必然成功,调用方仍应检查 API 返回值。

EconomyTransactionEvent

存入、扣除或直接设置余额前触发: EconomyTransactionEvent.source 可用于区分操作来源。

class EconomyTransactionEvent(
    val playerUuid: UUID,
    val currency: Currency,
    val action: Action,
    val amount: BigDecimal,
    val oldBalance: BigDecimal,
    val newBalance: BigDecimal,
    val source: String
) : Event(!Bukkit.isPrimaryThread()), Cancellable
 
enum class Action {
    DEPOSIT,
    WITHDRAW,
    SET
}

取消大额存入示例:

import org.bukkit.event.EventHandler
import org.bukkit.event.Listener
import priv.seventeen.artist.rondo.api.EconomyTransactionEvent
import java.math.BigDecimal
 
class EconomyGuard : Listener {
    @EventHandler
    fun onTransaction(event: EconomyTransactionEvent) {
        if (
            event.action == EconomyTransactionEvent.Action.DEPOSIT &&
            event.amount > BigDecimal("10000")
        ) {
            event.isCancelled = true
        }
    }
}

EconomyTransferEvent

玩家间转账提交前触发:

class EconomyTransferEvent(
    val from: UUID,
    val to: UUID,
    val currency: Currency,
    val amount: BigDecimal,
    val taxAmount: BigDecimal
) : Event(!Bukkit.isPrimaryThread()), Cancellable

EconomyExchangeEvent

兑换事务提交前触发:

class EconomyExchangeEvent(
    val playerUuid: UUID,
    val fromCurrency: Currency,
    val toCurrency: Currency,
    val fromAmount: BigDecimal,
    val toAmount: BigDecimal
) : Event(!Bukkit.isPrimaryThread()), Cancellable

线程语义

事件在调用 RondoAPI 的同一线程上触发:

  • 主线程发起操作时,事件是同步 Bukkit 事件。
  • 异步任务发起操作时,事件构造为异步 Bukkit 事件。

异步事件中访问世界、实体或背包前,需要切回服务端主线程。

On this page