65 lines
2.5 KiB
Java
65 lines
2.5 KiB
Java
package games.dmg.spigotquestboard;
|
|
|
|
import java.io.IOException;
|
|
import java.util.List;
|
|
import java.util.Objects;
|
|
import org.bukkit.entity.Player;
|
|
|
|
final class QuestClaimController implements QuestClaimGateway {
|
|
private final QuestService quests;
|
|
private final QuestClaimInventory inventory;
|
|
|
|
QuestClaimController(QuestService quests, QuestClaimInventory inventory) {
|
|
this.quests = Objects.requireNonNull(quests, "quests");
|
|
this.inventory = Objects.requireNonNull(inventory, "inventory");
|
|
}
|
|
|
|
@Override
|
|
public List<QuestClaim> pendingClaims(Player player) {
|
|
Objects.requireNonNull(player, "player");
|
|
return quests.claimsFor(player.getUniqueId());
|
|
}
|
|
|
|
@Override
|
|
public synchronized ClaimCollectionResult collect(Player player) throws IOException {
|
|
Objects.requireNonNull(player, "player");
|
|
List<QuestClaim> claims = quests.claimsFor(player.getUniqueId());
|
|
if (claims.isEmpty()) {
|
|
player.sendMessage("You have no pending quest claims.");
|
|
return new ClaimCollectionResult(0, 0);
|
|
}
|
|
|
|
int collected = 0;
|
|
int overflow = 0;
|
|
for (QuestClaim claim : claims) {
|
|
QuestClaimInventory.PreparedClaim prepared = inventory.prepare(claim.items());
|
|
QuestClaimInventory.Delivery delivery = prepared.deliver(player);
|
|
try {
|
|
quests.acknowledgeClaim(player.getUniqueId(), claim.id());
|
|
} catch (IOException | RuntimeException exception) {
|
|
delivery.rollback();
|
|
throw exception;
|
|
}
|
|
collected++;
|
|
overflow += delivery.overflowAmount();
|
|
player.sendMessage(description(claim));
|
|
}
|
|
player.sendMessage("Collected " + collected + " quest claim(s).");
|
|
if (overflow > 0) {
|
|
player.sendMessage(
|
|
overflow + " item(s) did not fit and were dropped at your feet, protected for you."
|
|
);
|
|
}
|
|
return new ClaimCollectionResult(collected, overflow);
|
|
}
|
|
|
|
private static String description(QuestClaim claim) {
|
|
if (claim.type() == QuestClaimType.DELIVERED_BLOCKS) {
|
|
return "Collected delivered items from completed quest " + claim.questId() + ".";
|
|
}
|
|
String reason = claim.source() == QuestClaimSource.EXPIRATION
|
|
? "expired" : "cancelled";
|
|
return "Collected returned reward from " + reason + " quest " + claim.questId() + ".";
|
|
}
|
|
}
|