Files
purpur-quest-board/src/main/java/games/dmg/spigotquestboard/QuestClaimController.java
T
dmg 3bd2dc7d14
Release / release (push) Successful in 2m46s
CI / build (push) Successful in 1m19s
feat(quests): support requests for all inventory items
2026-09-09 21:50:16 -04:00

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() + ".";
}
}