使用经济 API

经济 API 可以让所有的经济插件互相兼容,这意味着你可以不用担心不同插件之间的各种问题。接下来我们要教你如何使用经济 API 。

获取 EconomyService

为了使用经济 API ,你必须首先通过 ServiceManager 获取到一个 EconomyService

警告

请注意你需要在使用经济 API 时注意不同的游戏状态,这些状态包括服务端启动、停止和运行。参见 服务 以获取更多的信息。

示例:如何获取 EconomyService

import org.spongepowered.api.service.economy.EconomyService;
import org.spongepowered.api.Sponge;

Optional<EconomyService> serviceOpt = Sponge.getServiceManager().provide(EconomyService.class);
if (!serviceOpt.isPresent()) {
    // handle there not being an economy implementation
}
EconomyService economyService = serviceOpt.get();

警告

EconomyService 应当使用临时变量而不是字段的方式访问,因为相应的实现对象引用可能随时都会变化。如果你不得不要以字段的形式存储,那么你无论如何都应该监听 ChangeServiceProviderEvent 以保证相应的实现对象引用能够得到更新。

注解

和其他的服务不太一样,你需要首先尝试着使用 ServiceManager#provide(Class) 而不是 ServiceManager#provideUnchecked(Class) 获取相应的实现,因为 Sponge 并没有为 EconomyService 提供一个默认的实现,因此相应的实现也不一定存在。

使用 EconomyService

在加载 EconomyService 并将其存储起来后,我们就可以享用经济 API 的全部特性了。

示例:如何获取玩家余额

import org.spongepowered.api.entity.living.player.Player;
import org.spongepowered.api.service.economy.EconomyService;
import org.spongepowered.api.service.economy.account.UniqueAccount;
import java.math.BigDecimal;
import java.util.Optional;

Optional<UniqueAccount> uOpt = economyService.getOrCreateAccount(player.getUniqueId());
if (uOpt.isPresent()) {
    UniqueAccount acc = uOpt.get();
    BigDecimal balance = acc.getBalance(economyService.getDefaultCurrency());
}

一些 Account 的方法需要传入以下变量:

  • 货币:参与交易的货币

  • 事件原因:是什么导致了帐户的变动

  • 上下文:交易发生的上下文

这些参数都是为了更高级的使用而设计的,然而我们仍然必须填写它们。下面是一串可接受的值: