geforkt von Mirrors/Paper
89d51d5f29
Because this exploit has been widely known for years and has not been fixed by Mojang, we decided that it was worth allowing people to toggle it on/off due to how easy it is to make it configurable. It should be noted that this decision does not promise all future exploits will be configurable.
76 Zeilen
3.9 KiB
Diff
76 Zeilen
3.9 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Lulu13022002 <41980282+Lulu13022002@users.noreply.github.com>
|
|
Date: Sun, 16 Oct 2022 16:12:49 +0200
|
|
Subject: [PATCH] More vanilla friendly methods to update trades
|
|
|
|
|
|
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 a01e089ed7689485a7ac33ab29bc27c4b68bc1df..fa2569fecefb3e3af3264928a3c7a347710deedf 100644
|
|
--- a/src/main/java/net/minecraft/world/entity/npc/Villager.java
|
|
+++ b/src/main/java/net/minecraft/world/entity/npc/Villager.java
|
|
@@ -927,6 +927,12 @@ public class Villager extends AbstractVillager implements ReputationEventHandler
|
|
|
|
@Override
|
|
protected void updateTrades() {
|
|
+ // Paper start - More vanilla friendly methods to update trades
|
|
+ updateTrades(TRADES_PER_LEVEL);
|
|
+ }
|
|
+
|
|
+ public boolean updateTrades(int amount) {
|
|
+ // Paper end - More vanilla friendly methods to update trades
|
|
VillagerData villagerdata = this.getVillagerData();
|
|
Int2ObjectMap int2objectmap;
|
|
|
|
@@ -944,9 +950,11 @@ public class Villager extends AbstractVillager implements ReputationEventHandler
|
|
if (avillagertrades_imerchantrecipeoption != null) {
|
|
MerchantOffers merchantrecipelist = this.getOffers();
|
|
|
|
- this.addOffersFromItemListings(merchantrecipelist, avillagertrades_imerchantrecipeoption, 2);
|
|
+ this.addOffersFromItemListings(merchantrecipelist, avillagertrades_imerchantrecipeoption, amount); // Paper - More vanilla friendly methods to update trades
|
|
+ return true; // Paper - More vanilla friendly methods to update trades
|
|
}
|
|
}
|
|
+ return false; // Paper - More vanilla friendly methods to update trades
|
|
}
|
|
|
|
public void gossip(ServerLevel world, Villager villager, long time) {
|
|
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftVillager.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftVillager.java
|
|
index 00fb708bce2c79817cd9fccadec72f07f0d26317..6c15d40979fd3e3d246a447c432b321fbf29ada3 100644
|
|
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftVillager.java
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftVillager.java
|
|
@@ -95,6 +95,34 @@ public class CraftVillager extends CraftAbstractVillager implements Villager {
|
|
}
|
|
|
|
// Paper start
|
|
+ @Override
|
|
+ public boolean increaseLevel(int amount) {
|
|
+ Preconditions.checkArgument(amount > 0, "Level earned must be positive");
|
|
+ int supposedFinalLevel = this.getVillagerLevel() + amount;
|
|
+ Preconditions.checkArgument(net.minecraft.world.entity.npc.VillagerData.MIN_VILLAGER_LEVEL <= supposedFinalLevel && supposedFinalLevel <= net.minecraft.world.entity.npc.VillagerData.MAX_VILLAGER_LEVEL,
|
|
+ "Final level reached after the donation (%d) must be between [%d, %d]".formatted(supposedFinalLevel, net.minecraft.world.entity.npc.VillagerData.MIN_VILLAGER_LEVEL, net.minecraft.world.entity.npc.VillagerData.MAX_VILLAGER_LEVEL));
|
|
+
|
|
+ it.unimi.dsi.fastutil.ints.Int2ObjectMap<net.minecraft.world.entity.npc.VillagerTrades.ItemListing[]> trades =
|
|
+ net.minecraft.world.entity.npc.VillagerTrades.TRADES.get(this.getHandle().getVillagerData().getProfession());
|
|
+
|
|
+ if (trades == null || trades.isEmpty()) {
|
|
+ this.getHandle().setVillagerData(this.getHandle().getVillagerData().setLevel(supposedFinalLevel));
|
|
+ return false;
|
|
+ }
|
|
+
|
|
+ while (amount > 0) {
|
|
+ this.getHandle().increaseMerchantCareer();
|
|
+ amount--;
|
|
+ }
|
|
+ return true;
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public boolean addTrades(int amount) {
|
|
+ Preconditions.checkArgument(amount > 0, "Number of trades unlocked must be positive");
|
|
+ return this.getHandle().updateTrades(amount);
|
|
+ }
|
|
+
|
|
@Override
|
|
public int getRestocksToday() {
|
|
return getHandle().numberOfRestocksToday;
|