注意事项

经济 API 试图是足够抽象的接口,以给予经济插件操作的灵活性。为了使经济插件能够尽可能大地控制经济系统,使用经济 API 的插件在使用时应遵循一些准则:

支出

在支出前插件 不应 检查帐户中是否有足够的余额。虽然这听起来很反直觉,但是这有利于经济插件提供对负数余额的全面支持。

通过检查自己帐户是否有足够的钱,你成功地防止经济插件(可能)允许负数余额。然而,一个经济插件可能想要允许管理员或具有一定权限的玩家使用负数余额。通过自己执行检查,你把这个权利从经济插件手中剥夺了。

这段代码演示了 反面教材

import java.math.BigDecimal;

import org.spongepowered.api.event.cause.Cause;
import org.spongepowered.api.event.cause.EventContext;
import org.spongepowered.api.event.cause.EventContextKeys;
import org.spongepowered.api.service.economy.EconomyService;
import org.spongepowered.api.service.economy.account.Account;

PluginContainer plugin = ...;
EconomyService service = ...;
Account account = ...;
BigDecimal requiredAmount = BigDecimal.valueOf(20);
EventContext eventContext = EventContext.builder().add(EventContextKeys.PLUGIN, plugin).build();

// BAD: Don't perform this check
if (account.getBalance(service.getDefaultCurrency()).compareTo(requiredAmount) < 0) {
    // You don't have enough money!
} else {
    // The account has enough, let's withdraw some cash!
    account.withdraw(service.getDefaultCurrency(), requiredAmount, Cause.of(eventContext, plugin));
}

相反,你需要做的事件只是简单地支出你想要支出的,然后通过检查返回的 TransactionResultResultType 解决问题。一个不支持负数余额的经济插件会简简单单地返回一个 ResultType#ACCOUNT_NO_FUNDS 或者 ResultType#FAILED

这个才是 正确示例

import org.spongepowered.api.event.cause.Cause;
import org.spongepowered.api.event.cause.EventContext;
import org.spongepowered.api.event.cause.EventContextKeys;
import org.spongepowered.api.service.economy.transaction.ResultType;
import org.spongepowered.api.service.economy.transaction.TransactionResult;

PluginContainer plugin = ...;
EconomyService service = ...;
Account account = ...;
BigDecimal requiredAmount = BigDecimal.valueOf(20);
EventContext eventContext = EventContext.builder().add(EventContextKeys.PLUGIN, plugin).build();

TransactionResult result = account.withdraw(service.getDefaultCurrency(), requiredAmount,
                Cause.of(eventContext, plugin));
if (result.getResult() == ResultType.SUCCESS) {
    // Success!
} else if (result.getResult() == ResultType.FAILED || result.getResult() == ResultType.ACCOUNT_NO_FUNDS) {
    // Something went wrong!
} else {
    // Handle other conditions
}