mirror of
https://github.com/LeavesMC/Leaves.git
synced 2025-12-19 14:59:32 +00:00
* init 1.21.4, and boom! * build change, but weight not work * just work * Build changes, and delete timings * Fix API patches (#406) * Fix API patches * merge --------- Co-authored-by: violetc <58360096+s-yh-china@users.noreply.github.com> * 0006/0129 * 0009/0129 * 0011/0129 * 0018/0129 * 0030/0129 * 0035/0129 * 0043/0129 * 0048/0129 * 0049/0129 * 0057/0129 * 0065/0129 * 0086/0129 (#408) * 0072/0129 * 0080/0129 * Readd patch infos * 0086/0129 * Delete applied patches * 0087/0129 * 0091/0129 * 0097/0129 * 0101/0129 * 102/129 * 0107/0129 * 0112/0129 * 0118/0129 * 0129/0129, 100% patched * fix some * server work * Protocol... (#409) * Jade v7 * Fix changed part for Jade * Formatting imports, add Lms Paster protocol * REI payloads 5/8 * Add REI support, remove unnecessary content in Jade * Rename * Make jade better * Make action work * fix action jar * Fix some protocol * Fix bot action, and entity tickCount * Fix Warden GameEventListener register on load * Fix extra Raider drop * Fix grindstone overstacking * Update Paper, and some doc * Merge * [ci skip] Update Action --------- Co-authored-by: Lumine1909 <133463833+Lumine1909@users.noreply.github.com>
202 lines
10 KiB
Diff
202 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/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<? extends AbstractVillager> 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 {
|