mirror of
https://github.com/LeavesMC/Leaves.git
synced 2025-12-24 01:19:19 +00:00
211 lines
11 KiB
Diff
211 lines
11 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 17cc25b6fbc85c9e0023be7e9d857b2d76f6e58c..75bb3f2d2eaf8ffe542534fec40084674003ec64 100644
|
|
--- a/src/main/java/net/minecraft/world/entity/npc/AbstractVillager.java
|
|
+++ b/src/main/java/net/minecraft/world/entity/npc/AbstractVillager.java
|
|
@@ -59,6 +59,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);
|
|
@@ -150,7 +151,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);
|
|
@@ -162,7 +169,7 @@ public abstract class AbstractVillager extends AgeableMob implements InventoryCa
|
|
@Override
|
|
public void notifyTrade(MerchantOffer offer) {
|
|
// offer.increaseUses(); // Paper - handled in processTrade
|
|
- this.ambientSoundTime = -this.getAmbientSoundInterval();
|
|
+ if (!voidTrade) this.ambientSoundTime = -this.getAmbientSoundInterval(); // Leaves - force void trade
|
|
// this.rewardTradeXp(offer); // Paper - handled in processTrade
|
|
if (this.tradingPlayer instanceof ServerPlayer) {
|
|
CriteriaTriggers.TRADE.trigger((ServerPlayer) this.tradingPlayer, this, offer.getResult());
|
|
@@ -180,7 +187,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.playSound(this.getTradeUpdatedSound(!stack.isEmpty()), this.getSoundVolume(), this.getVoicePitch());
|
|
}
|
|
|
|
@@ -229,6 +236,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);
|
|
}
|
|
|
|
@@ -308,4 +321,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 0b334ab58d723f27dae68974ed6ec5d64b10ad40..a63549154fc3a2c93b7f66072bc9a89a31bea55f 100644
|
|
--- a/src/main/java/net/minecraft/world/entity/npc/Villager.java
|
|
+++ b/src/main/java/net/minecraft/world/entity/npc/Villager.java
|
|
@@ -347,6 +347,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());
|
|
@@ -649,8 +650,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 833563e237462ccfc1b730b8f5fb35340d0db854..92981bbfe854339fdb52a5940fadda009987e8e8 100644
|
|
--- a/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java
|
|
+++ b/src/main/java/net/minecraft/world/entity/npc/WanderingTrader.java
|
|
@@ -120,6 +120,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 8eab7596e1f7d1beb9ab0d70d1310d26822262e9..55ae9ccbadeb3bb358dd04aadd7b32b14f5bc96f 100644
|
|
--- a/src/main/java/net/minecraft/world/inventory/MerchantMenu.java
|
|
+++ b/src/main/java/net/minecraft/world/inventory/MerchantMenu.java
|
|
@@ -26,7 +26,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 4f7457578ab3118d10e0d5dfc23d79c9b20c2f44..a71d4fd78e1a9b6f4f691d512f372f0cf2b60b4e 100644
|
|
--- a/src/main/java/net/minecraft/world/item/trading/MerchantOffer.java
|
|
+++ b/src/main/java/net/minecraft/world/item/trading/MerchantOffer.java
|
|
@@ -20,6 +20,7 @@ public class MerchantOffer {
|
|
public float priceMultiplier;
|
|
public int xp;
|
|
public boolean ignoreDiscounts; // Paper
|
|
+ public int voidTradeUses; // Leaves - force void trade
|
|
// CraftBukkit start
|
|
private CraftMerchantRecipe bukkitHandle;
|
|
|
|
@@ -73,6 +74,7 @@ public class MerchantOffer {
|
|
this.specialPriceDiff = nbt.getInt("specialPrice");
|
|
this.demand = nbt.getInt("demand");
|
|
this.ignoreDiscounts = nbt.getBoolean("Paper.IgnoreDiscounts"); // Paper
|
|
+ this.voidTradeUses = 0; // Leaves - force void trade
|
|
}
|
|
|
|
public MerchantOffer(ItemStack buyItem, ItemStack sellItem, int maxUses, int merchantExperience, float priceMultiplier) {
|
|
@@ -107,6 +109,7 @@ public class MerchantOffer {
|
|
this.xp = merchantExperience;
|
|
this.priceMultiplier = priceMultiplier;
|
|
this.demand = demandBonus;
|
|
+ this.voidTradeUses = 0; // Leaves - force void trade
|
|
}
|
|
|
|
private MerchantOffer(MerchantOffer offer) {
|
|
@@ -122,6 +125,7 @@ public class MerchantOffer {
|
|
this.demand = offer.demand;
|
|
this.priceMultiplier = offer.priceMultiplier;
|
|
this.xp = offer.xp;
|
|
+ this.voidTradeUses = 0; // Leaves - force void trade
|
|
}
|
|
|
|
public ItemStack getBaseCostA() {
|
|
@@ -172,6 +176,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;
|
|
}
|
|
@@ -201,7 +215,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 c06092aa35d44ba98b9680dc72eeba09f6d07822..a2df4fd3c0beb001cd313b3e48f677f37455b772 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
|
|
@@ -225,6 +225,16 @@ public class TheEndGatewayBlockEntity extends TheEndPortalBlockEntity {
|
|
return;
|
|
}
|
|
|
|
+ // Leaves start - force void trade
|
|
+ if (top.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());
|
|
TheEndGatewayBlockEntity.triggerCooldown(world, pos, state, blockEntity); // CraftBukkit - call at end of method
|