From 10d7c2f524d160526c66cc6cd9eb5bc325d0bf7a Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 15 May 2026 23:53:48 +0000 Subject: [PATCH 1/2] Initial plan From e1fc2d5b16180e9e0f7be15fd9ee344f2a4eabad Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 16 May 2026 00:05:41 +0000 Subject: [PATCH 2/2] Changes before error encountered Agent-Logs-Url: https://github.com/BentoBoxWorld/Level/sessions/e64dd47d-1dfc-4c51-967f-0646c6d8af1b Co-authored-by: tastybento <4407265+tastybento@users.noreply.github.com> --- .../calculators/IslandLevelCalculator.java | 19 ++++++-- .../level/commands/IslandDonateCommand.java | 46 +++++++++++++++++-- src/main/resources/locales/en-US.yml | 1 + 3 files changed, 58 insertions(+), 8 deletions(-) diff --git a/src/main/java/world/bentobox/level/calculators/IslandLevelCalculator.java b/src/main/java/world/bentobox/level/calculators/IslandLevelCalculator.java index dc1ddcc..b6e5ea0 100644 --- a/src/main/java/world/bentobox/level/calculators/IslandLevelCalculator.java +++ b/src/main/java/world/bentobox/level/calculators/IslandLevelCalculator.java @@ -731,9 +731,22 @@ public void tidyUp() { .addAndGet((long) (results.underWaterBlockCount.get() * addon.getSettings().getUnderWaterMultiplier())); // Add donated block points (permanent contributions that persist across recalculations) - long donatedPoints = addon.getManager().getDonatedPoints(island); - results.rawBlockCount.addAndGet(donatedPoints); - results.donatedPoints.set(donatedPoints); + // Apply blockconfig limits so that donated blocks beyond the limit do not raise the level + long cappedDonatedPoints = 0L; + Map donatedBlocksMap = addon.getManager().getDonatedBlocks(island); + for (Map.Entry entry : donatedBlocksMap.entrySet()) { + String blockId = entry.getKey(); + int count = entry.getValue(); + // Resolve to a Material (vanilla) or leave as String (custom block) + Material mat = Material.matchMaterial(blockId); + Object blockObj = mat != null ? mat : blockId; + int value = getValue(blockObj); + Integer limit = addon.getBlockConfig().getLimit(blockObj); + int cappedCount = (limit != null) ? Math.min(count, limit) : count; + cappedDonatedPoints += (long) cappedCount * value; + } + results.rawBlockCount.addAndGet(cappedDonatedPoints); + results.donatedPoints.set(cappedDonatedPoints); // Set the death penalty if (this.addon.getSettings().isSumTeamDeaths()) { diff --git a/src/main/java/world/bentobox/level/commands/IslandDonateCommand.java b/src/main/java/world/bentobox/level/commands/IslandDonateCommand.java index 80af368..2a432d6 100644 --- a/src/main/java/world/bentobox/level/commands/IslandDonateCommand.java +++ b/src/main/java/world/bentobox/level/commands/IslandDonateCommand.java @@ -151,6 +151,23 @@ private void performHandDonation(User user, Island island, Material material, St return; } int amount = Math.min(requested, currentHand.getAmount()); + + // Apply blockconfig donation limit + String donationId = customId != null ? customId : material.name(); + Object blockObj = customId != null ? (Object) customId : material; + Object displayKey = customId != null ? customId : material; + Integer limit = addon.getBlockConfig().getLimit(blockObj); + if (limit != null) { + int currentDonated = addon.getManager().getDonatedBlocks(island).getOrDefault(donationId, 0); + int remaining = Math.max(0, limit - currentDonated); + if (remaining == 0) { + user.sendMessage("island.donate.limit-reached", + MATERIAL_PLACEHOLDER, Utils.prettifyObject(displayKey, user)); + return; + } + amount = Math.min(amount, remaining); + } + long points = (long) amount * blockValue; if (amount >= currentHand.getAmount()) { @@ -159,11 +176,9 @@ private void performHandDonation(User user, Island island, Material material, St currentHand.setAmount(currentHand.getAmount() - amount); } - String donationId = customId != null ? customId : material.name(); addon.getManager().donateBlocks(island, user.getUniqueId(), donationId, amount, points); addon.getManager().recalculateAfterDonation(island); - Object displayKey = customId != null ? customId : material; user.sendMessage("island.donate.hand.success", TextVariables.NUMBER, String.valueOf(amount), MATERIAL_PLACEHOLDER, Utils.prettifyObject(displayKey, user), @@ -223,14 +238,35 @@ private void performInvDonation(User user, Island island) { if (value == null) { continue; } - int amount = item.getAmount(); - long points = (long) value * amount; String customId = addon.getCustomBlockId(item); String donationId = customId != null ? customId : item.getType().name(); + Object blockObj = customId != null ? (Object) customId : item.getType(); + + // Apply blockconfig donation limit: only take up to the remaining capacity + int amount = item.getAmount(); + Integer limit = addon.getBlockConfig().getLimit(blockObj); + if (limit != null) { + // getDonatedBlocks returns the live cached map, already updated by earlier donateBlocks calls + int alreadyDonated = addon.getManager().getDonatedBlocks(island).getOrDefault(donationId, 0); + int remaining = Math.max(0, limit - alreadyDonated); + if (remaining == 0) { + // Limit already reached for this material — leave item in inventory + continue; + } + amount = Math.min(amount, remaining); + } + + // Remove accepted amount from inventory slot + if (amount >= item.getAmount()) { + contents[i] = null; + } else { + item.setAmount(item.getAmount() - amount); + } + + long points = (long) value * amount; donated.merge(donationId, amount, Integer::sum); totalPoints += points; addon.getManager().donateBlocks(island, user.getUniqueId(), donationId, amount, points); - contents[i] = null; } pInv.setStorageContents(contents); diff --git a/src/main/resources/locales/en-US.yml b/src/main/resources/locales/en-US.yml index e18ba4a..9103c64 100755 --- a/src/main/resources/locales/en-US.yml +++ b/src/main/resources/locales/en-US.yml @@ -67,6 +67,7 @@ island: gui-title: "Donate Blocks" gui-info: "Donate blocks to your island|Currently donated: [points] points|Warning: donated items are|destroyed and cannot be returned!" preview: "Points to add: [points]|These items will be destroyed!" + limit-reached: "The donation limit for [material] has been reached." hand: keyword: "hand" success: "Donated [number] x [material] for [points] permanent points!"