Skip to content

Commit 04745eb

Browse files
committed
Refresh villager recipes after trade event completes
1 parent ebf6b50 commit 04745eb

1 file changed

Lines changed: 7 additions & 2 deletions

File tree

‎src/main/java/com/xzh/economy/VillagerTradeManager.java‎

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -471,7 +471,10 @@ public void onTrade(PlayerTradeEvent event) {
471471
long expiresAt = now + OFFER_COOLDOWN_MILLIS;
472472
used.put(offer.id(), expiresAt);
473473
save();
474-
merchant.setRecipes(recipes(profession, playerId));
474+
// Do not replace merchant recipes inside PlayerTradeEvent: Paper may still be
475+
// processing the selected recipe, and mutating the merchant here can block the trade.
476+
// Refresh only after the event finishes; if another listener cancels it, roll back
477+
// the cooldown so a failed trade never consumes the offer.
475478
Bukkit.getScheduler().runTask(plugin, () -> {
476479
if (event.isCancelled()) {
477480
Map<String, Long> current = playerUsedOffers.get(playerId);
@@ -480,7 +483,9 @@ public void onTrade(PlayerTradeEvent event) {
480483
if (current.isEmpty()) playerUsedOffers.remove(playerId);
481484
}
482485
save();
483-
if (event.getPlayer().isOnline()) merchant.setRecipes(recipes(profession, playerId));
486+
}
487+
if (event.getPlayer().isOnline()) {
488+
merchant.setRecipes(recipes(profession, playerId));
484489
}
485490
});
486491
}

0 commit comments

Comments
 (0)