9
0
mirror of https://github.com/LeavesMC/Leaves.git synced 2025-12-30 20:39:15 +00:00
Files
LeavesMC/patches/server/0095-Force-Void-Trade.patch
violetc de4f3fe832 1.21.3 (#382)
---------

Co-authored-by: Lumine1909 <133463833+Lumine1909@users.noreply.github.com>
2024-12-02 12:52:54 +08:00

201 lines
10 KiB
Diff

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 6c0cece094d36ddb2ae8d67d3c847a2c8faa3da8..cb5524ed59a07693d1d7ff03ca4f27e07774e3e5 100644
--- a/src/main/java/net/minecraft/world/entity/npc/AbstractVillager.java
+++ b/src/main/java/net/minecraft/world/entity/npc/AbstractVillager.java
@@ -64,6 +64,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<? extends AbstractVillager> type, Level world) {
super(type, world);
@@ -154,7 +155,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);
@@ -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());
@@ -184,7 +191,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()));
}
@@ -241,6 +248,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);
}
@@ -320,4 +333,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 8d3959e86ef1357e49aac6ef3c8285c770f2856a..d931e38924c2fbad84efdb2e9ac84061b1764870 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());
@@ -639,8 +640,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 1e77cce428d9e53142aaa2cf780b7f862d536eca..2bac91f7f6943c7e1b5f63ea7dfeb3c3e390bcb7 100644
--- a/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java
+++ b/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java
@@ -123,9 +123,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/src/main/java/net/minecraft/world/inventory/MerchantMenu.java b/src/main/java/net/minecraft/world/inventory/MerchantMenu.java
index 6a529b5e289c416c0ebdc0260086ec039777aa40..f41e9303c6e118a426e779d4bbca450011ed7246 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/EndGatewayBlock.java b/src/main/java/net/minecraft/world/level/block/EndGatewayBlock.java
index a7a21f071161fb7e73a046717d2462f871ab653c..50d726874af316a264fa0c2589f5b04559dffb50 100644
--- a/src/main/java/net/minecraft/world/level/block/EndGatewayBlock.java
+++ b/src/main/java/net/minecraft/world/level/block/EndGatewayBlock.java
@@ -120,6 +120,16 @@ public class EndGatewayBlock extends BaseEntityBlock implements Portal {
if (tileentity instanceof TheEndGatewayBlockEntity tileentityendgateway) {
Vec3 vec3d = tileentityendgateway.getPortalPosition(world, pos);
+ // Leaves start - force void trade
+ if (org.leavesmc.leaves.LeavesConfig.modify.forceVoidTrade && vec3d != 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
+
return vec3d == null ? null : (entity instanceof ThrownEnderpearl ? new TeleportTransition(world, vec3d, Vec3.ZERO, 0.0F, 0.0F, Set.of(), TeleportTransition.PLACE_PORTAL_TICKET, PlayerTeleportEvent.TeleportCause.END_GATEWAY) : new TeleportTransition(world, vec3d, Vec3.ZERO, 0.0F, 0.0F, Relative.union(Relative.DELTA, Relative.ROTATION), TeleportTransition.PLACE_PORTAL_TICKET, PlayerTeleportEvent.TeleportCause.END_GATEWAY)); // CraftBukkit
} else {
return null;