From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: violetc <58360096+s-yh-china@users.noreply.github.com> Date: Thu, 14 Sep 2023 20:23:03 +0800 Subject: [PATCH] Force Void Trade diff --git a/net/minecraft/world/entity/npc/AbstractVillager.java b/net/minecraft/world/entity/npc/AbstractVillager.java index 18a087a52070b9bdee4d02ff3fc6a3c063e444d4..dba596ac7a26401a6f4d8726bcea0caf067af10e 100644 --- a/net/minecraft/world/entity/npc/AbstractVillager.java +++ b/net/minecraft/world/entity/npc/AbstractVillager.java @@ -60,6 +60,7 @@ public abstract class AbstractVillager extends AgeableMob implements InventoryCa @Nullable protected MerchantOffers offers; private final SimpleContainer inventory = new SimpleContainer(8, (org.bukkit.craftbukkit.entity.CraftAbstractVillager) this.getBukkitEntity()); // CraftBukkit - add argument + protected boolean voidTrade = false; // Leaves - force void trade public AbstractVillager(EntityType entityType, Level level) { super(entityType, level); @@ -154,7 +155,13 @@ public abstract class AbstractVillager extends AgeableMob implements InventoryCa @Override public void processTrade(MerchantOffer offer, @Nullable io.papermc.paper.event.player.PlayerPurchaseEvent event) { // The MerchantRecipe passed in here is the one set by the PlayerPurchaseEvent if (event == null || event.willIncreaseTradeUses()) { - offer.increaseUses(); + // Leaves start - force void trade + if (voidTrade) { + offer.increaseVoidUses(); + } else { + offer.increaseUses(); + } + // Leaves end - force void trade } if (event == null || event.isRewardingExp()) { this.rewardTradeXp(offer); @@ -166,7 +173,7 @@ public abstract class AbstractVillager extends AgeableMob implements InventoryCa @Override public void notifyTrade(MerchantOffer offer) { // offer.increaseUses(); // Paper - Add PlayerTradeEvent and PlayerPurchaseEvent - this.ambientSoundTime = -this.getAmbientSoundInterval(); + if (!voidTrade) this.ambientSoundTime = -this.getAmbientSoundInterval(); // Leaves - force void trade // this.rewardTradeXp(offer); // Paper - Add PlayerTradeEvent and PlayerPurchaseEvent if (this.tradingPlayer instanceof ServerPlayer) { CriteriaTriggers.TRADE.trigger((ServerPlayer)this.tradingPlayer, this, offer.getResult()); @@ -183,7 +190,7 @@ public abstract class AbstractVillager extends AgeableMob implements InventoryCa @Override public void notifyTradeUpdated(ItemStack stack) { if (!this.level().isClientSide && this.ambientSoundTime > -this.getAmbientSoundInterval() + 20) { - this.ambientSoundTime = -this.getAmbientSoundInterval(); + if (!voidTrade) this.ambientSoundTime = -this.getAmbientSoundInterval(); // Leaves - force void trade this.makeSound(this.getTradeUpdatedSound(!stack.isEmpty())); } } @@ -235,6 +242,12 @@ public abstract class AbstractVillager extends AgeableMob implements InventoryCa } protected void stopTrading() { + // Leaves start - force void trade + this.voidTrade = false; + if (this.offers != null) { + this.offers.forEach(MerchantOffer::resetVoidUses); + } + // Leaves end - force void trade this.setTradingPlayer(null); } @@ -313,4 +326,10 @@ public abstract class AbstractVillager extends AgeableMob implements InventoryCa public boolean stillValid(Player player) { return this.getTradingPlayer() == player && this.isAlive() && player.canInteractWithEntity(this, 4.0); } + + // Leaves start - force void trade + public void setVoidTrade() { + this.voidTrade = true; + } + // Leaves end - force void trade } diff --git a/net/minecraft/world/entity/npc/Villager.java b/net/minecraft/world/entity/npc/Villager.java index 6b565fcf91e1d94b649dac90bf3c923930d252f8..31c2fb7780b822bf63543c4526739b9d3faad7d8 100644 --- a/net/minecraft/world/entity/npc/Villager.java +++ b/net/minecraft/world/entity/npc/Villager.java @@ -380,6 +380,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler } private void startTrading(Player player) { + this.voidTrade = false; // Leaves - force void trade this.updateSpecialPrices(player); this.setTradingPlayer(player); this.openTradingScreen(player, this.getDisplayName(), this.getVillagerData().getLevel()); @@ -632,8 +633,12 @@ public class Villager extends AbstractVillager implements ReputationEventHandler @Override protected void rewardTradeXp(MerchantOffer offer) { int i = 3 + this.random.nextInt(4); - this.villagerXp = this.villagerXp + offer.getXp(); - this.lastTradedPlayer = this.getTradingPlayer(); + // Leaves start - force void trade + if (!voidTrade) { + this.villagerXp += offer.getXp(); + this.lastTradedPlayer = this.getTradingPlayer(); + } + // Leaves end - force void trade if (this.shouldIncreaseLevel()) { this.updateMerchantTimer = 40; this.increaseProfessionLevelOnUpdate = true; diff --git a/net/minecraft/world/entity/npc/WanderingTrader.java b/net/minecraft/world/entity/npc/WanderingTrader.java index 6655d06e2011e20e7346dfe57527795269094d8a..8ebf885ceb13a8b5e5b3db74fc7ee859d10f3845 100644 --- a/net/minecraft/world/entity/npc/WanderingTrader.java +++ b/net/minecraft/world/entity/npc/WanderingTrader.java @@ -133,9 +133,10 @@ public class WanderingTrader extends net.minecraft.world.entity.npc.AbstractVill return InteractionResult.CONSUME; } - this.setTradingPlayer(player); - this.openTradingScreen(player, this.getDisplayName(), 1); - } + this.voidTrade = false; // Leaves - force void trade + this.setTradingPlayer(player); + this.openTradingScreen(player, this.getDisplayName(), 1); + } return InteractionResult.SUCCESS; } else { diff --git a/net/minecraft/world/inventory/MerchantMenu.java b/net/minecraft/world/inventory/MerchantMenu.java index 3019790d5eccef23c710e77615243551fcc676b0..9a87c729dd7289dc3cccfcf50087db7dc354f895 100644 --- a/net/minecraft/world/inventory/MerchantMenu.java +++ b/net/minecraft/world/inventory/MerchantMenu.java @@ -25,7 +25,7 @@ public class MerchantMenu extends AbstractContainerMenu { private static final int SELLSLOT2_X = 162; private static final int BUYSLOT_X = 220; private static final int ROW_Y = 37; - private final Merchant trader; + public final Merchant trader; // Leaves - private -> public private final MerchantContainer tradeContainer; private int merchantLevel; private boolean showProgressBar; diff --git a/net/minecraft/world/item/trading/MerchantOffer.java b/net/minecraft/world/item/trading/MerchantOffer.java index 6c06350751db7543d5bde7723121d9d9dbb79071..262cfdd05f013b2bbc2066ad4f0625ae291213b9 100644 --- a/net/minecraft/world/item/trading/MerchantOffer.java +++ b/net/minecraft/world/item/trading/MerchantOffer.java @@ -39,6 +39,7 @@ public class MerchantOffer { public float priceMultiplier; public int xp; public boolean ignoreDiscounts; // Paper - Add ignore discounts API + public int voidTradeUses; // Leaves - force void trade // CraftBukkit start private org.bukkit.craftbukkit.inventory.@org.jspecify.annotations.Nullable CraftMerchantRecipe bukkitHandle; @@ -78,6 +79,7 @@ public class MerchantOffer { this.priceMultiplier = priceMultiplier; this.xp = xp; this.ignoreDiscounts = ignoreDiscounts; // Paper + this.voidTradeUses = 0; // Leaves - force void trade } public MerchantOffer(ItemCost baseCostA, ItemStack result, int maxUses, int xp, float priceMultiplier) { @@ -166,6 +168,16 @@ public class MerchantOffer { this.uses++; } + // Leaves start - force void trade + public void increaseVoidUses() { + ++this.voidTradeUses; + } + + public void resetVoidUses() { + this.voidTradeUses = 0; + } + // Leaves end - force void trade + public int getDemand() { return this.demand; } @@ -195,7 +207,7 @@ public class MerchantOffer { } public boolean isOutOfStock() { - return this.uses >= this.maxUses; + return this.uses + this.voidTradeUses >= this.maxUses; // Leaves - force void trade } public void setToOutOfStock() { diff --git a/net/minecraft/world/level/block/EndGatewayBlock.java b/net/minecraft/world/level/block/EndGatewayBlock.java index 84a1bd5e40e635962d795506861447851e443eee..5c6bc04c241f13a8c09527a39f89fa52feb0eb76 100644 --- a/net/minecraft/world/level/block/EndGatewayBlock.java +++ b/net/minecraft/world/level/block/EndGatewayBlock.java @@ -108,6 +108,17 @@ public class EndGatewayBlock extends BaseEntityBlock implements Portal { public TeleportTransition getPortalDestination(ServerLevel level, Entity entity, BlockPos pos) { if (level.getBlockEntity(pos) instanceof TheEndGatewayBlockEntity theEndGatewayBlockEntity) { Vec3 portalPosition = theEndGatewayBlockEntity.getPortalPosition(level, pos); + + // Leaves start - force void trade + if (org.leavesmc.leaves.LeavesConfig.modify.forceVoidTrade && portalPosition != null && entity instanceof net.minecraft.server.level.ServerPlayer player) { + if (player.containerMenu instanceof net.minecraft.world.inventory.MerchantMenu merchantMenu) { + if (merchantMenu.trader instanceof net.minecraft.world.entity.npc.AbstractVillager villager) { + villager.setVoidTrade(); + } + } + } + // Leaves end - force void trade + if (portalPosition == null) { return null; } else {