Рекомендации по использованию Economy API

Economy API пытается быть достаточно абстрактным, чтобы дать экономическим плагинам гибкость в их работе. Чтобы дать плагинам экономики как можно больше контроля, плагины, потребляющие Economy 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.defaultCurrency()).compareTo(requiredAmount) < 0) {
    // You don't have enough money!
} else {
    // The account has enough, let's withdraw some cash!
    account.withdraw(service.defaultCurrency(), requiredAmount, Cause.of(eventContext, plugin));
}

Вместо этого лучше всего просто снять нужную сумму и проверить ResultType возвращенного TransactionResult. В этом случае плагин, который не разрешает отрицательные балансы, просто вернет: javadoc 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.result() == ResultType.SUCCESS) {
    // Success!
} else if (result.result() == ResultType.FAILED || result.result() == ResultType.ACCOUNT_NO_FUNDS) {
    // Something went wrong!
} else {
    // Handle other conditions
}