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/src/main/java/net/minecraft/world/entity/npc/AbstractVillager.java b/src/main/java/net/minecraft/world/entity/npc/AbstractVillager.java index d323cf157f2a910916baa9ce3f7e5bc81648c47d..308638bb5dc12ac11eb7a44d05647403184f38d6 100644 --- a/src/main/java/net/minecraft/world/entity/npc/AbstractVillager.java +++ b/src/main/java/net/minecraft/world/entity/npc/AbstractVillager.java @@ -66,6 +66,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 type, Level world) { super(type, world); @@ -143,7 +144,13 @@ public abstract class AbstractVillager extends AgeableMob implements InventoryCa @Override public void processTrade(MerchantOffer recipe, @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()) { - recipe.increaseUses(); + // Leaves start - force void trade + if (voidTrade) { + recipe.increaseVoidUses(); + } else { + recipe.increaseUses(); + } + // Leaves end - force void trade } if (event == null || event.isRewardingExp()) { this.rewardTradeXp(recipe); @@ -155,7 +162,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()); @@ -173,7 +180,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())); } @@ -228,6 +235,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((Player) null); } @@ -307,4 +320,10 @@ public abstract class AbstractVillager extends AgeableMob implements InventoryCa public boolean isClientSide() { return this.level().isClientSide; } + + // Leaves start - force void trade + public void setVoidTrade() { + voidTrade = true; + } + // Leaves end - force void trade } diff --git a/src/main/java/net/minecraft/world/entity/npc/Villager.java b/src/main/java/net/minecraft/world/entity/npc/Villager.java index 6cac189cf6e0bef2f0ea8c0dbadb0f417171a05e..45be97d79377f028264e7828e929d37893ebdfb5 100644 --- a/src/main/java/net/minecraft/world/entity/npc/Villager.java +++ b/src/main/java/net/minecraft/world/entity/npc/Villager.java @@ -348,6 +348,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler } private void startTrading(Player customer) { + this.voidTrade = false; // Leaves - force void trade this.updateSpecialPrices(customer); this.setTradingPlayer(customer); this.openTradingScreen(customer, this.getDisplayName(), this.getVillagerData().getLevel()); @@ -643,8 +644,12 @@ public class Villager extends AbstractVillager implements ReputationEventHandler protected void rewardTradeXp(MerchantOffer offer) { int i = 3 + this.random.nextInt(4); - 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/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java b/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java index 0854e9b7ee2e6b23b6c1ee6a324a5a253c9d4679..43d2785ee82467f0ce6c60b29d8f6f33fe65acc4 100644 --- a/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java +++ b/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java @@ -121,6 +121,7 @@ public class WanderingTrader extends net.minecraft.world.entity.npc.AbstractVill return InteractionResult.sidedSuccess(this.level().isClientSide); } else { if (!this.level().isClientSide) { + this.voidTrade = false; // Leaves - force void trade this.setTradingPlayer(player); this.openTradingScreen(player, this.getDisplayName(), 1); } diff --git a/src/main/java/net/minecraft/world/inventory/MerchantMenu.java b/src/main/java/net/minecraft/world/inventory/MerchantMenu.java index 2992e86f5f83431e230162380b33721df785ba91..7ec2ef906433d7e0164ce0e5ec62fef602ba6b37 100644 --- a/src/main/java/net/minecraft/world/inventory/MerchantMenu.java +++ b/src/main/java/net/minecraft/world/inventory/MerchantMenu.java @@ -27,7 +27,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/src/main/java/net/minecraft/world/item/trading/MerchantOffer.java b/src/main/java/net/minecraft/world/item/trading/MerchantOffer.java index 0efc8d997b34302c3e0a5d7ec73a11a940dbeefe..d246c9932f3f98972124089306d6ed740bb9a31b 100644 --- a/src/main/java/net/minecraft/world/item/trading/MerchantOffer.java +++ b/src/main/java/net/minecraft/world/item/trading/MerchantOffer.java @@ -51,6 +51,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 CraftMerchantRecipe bukkitHandle; @@ -77,6 +78,7 @@ public class MerchantOffer { this.priceMultiplier = priceMultiplier; this.xp = merchantExperience; this.ignoreDiscounts = ignoreDiscounts; // Paper + this.voidTradeUses = 0; // Leaves - force void trade } public MerchantOffer(ItemCost buyItem, ItemStack sellItem, int maxUses, int merchantExperience, float priceMultiplier) { @@ -154,6 +156,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; } @@ -183,7 +195,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/src/main/java/net/minecraft/world/level/block/entity/TheEndGatewayBlockEntity.java b/src/main/java/net/minecraft/world/level/block/entity/TheEndGatewayBlockEntity.java index 8809755d0e3e6199e2db6c061e53375d17753b70..bd748c1b6d174b14aa4b5cba14578cc5c118b912 100644 --- a/src/main/java/net/minecraft/world/level/block/entity/TheEndGatewayBlockEntity.java +++ b/src/main/java/net/minecraft/world/level/block/entity/TheEndGatewayBlockEntity.java @@ -213,6 +213,16 @@ public class TheEndGatewayBlockEntity extends TheEndPortalBlockEntity { return; } + // Leaves start - force void trade + if (org.leavesmc.leaves.LeavesConfig.forceVoidTrade) { + if (((ServerPlayer) entity1).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 + entity1.setPortalCooldown(); ((ServerPlayer) entity1).connection.teleport(teleEvent.getTo()); // entity1.teleportPassengers(); // Paper - teleport passengers as well, preventing invisible passengers post teleport. // Leaves - vanilla