使用经济 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(java.lang.Class) 而不是 ServiceManager#provideUnchecked(java.lang.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 的方法需要传入以下变量:
货币:参与交易的货币
事件原因:是什么导致了帐户的变动
上下文:交易发生的上下文
这些参数都是为了更高级的使用而设计的,然而我们仍然必须填写它们。下面是一串可接受的值:
事件原因:
Cause.of(EventContext.builder().add(EventContextKeys.PLUGIN, plugin).build(), plugin)
上下文:
new HashSet<Context>()