1.21.5
Co-authored-by: Bjarne Koll <git@lynxplay.dev> Co-authored-by: Jake Potrebic <jake.m.potrebic@gmail.com> Co-authored-by: Lulu13022002 <41980282+Lulu13022002@users.noreply.github.com> Co-authored-by: MiniDigger | Martin <admin@minidigger.dev> Co-authored-by: Nassim Jahnke <nassim@njahnke.dev> Co-authored-by: Noah van der Aa <ndvdaa@gmail.com> Co-authored-by: Owen1212055 <23108066+Owen1212055@users.noreply.github.com> Co-authored-by: Shane Freeder <theboyetronic@gmail.com> Co-authored-by: Spottedleaf <Spottedleaf@users.noreply.github.com> Co-authored-by: Tamion <70228790+notTamion@users.noreply.github.com> Co-authored-by: Warrior <50800980+Warriorrrr@users.noreply.github.com>
This commit is contained in:
@@ -1,27 +1,6 @@
|
||||
--- a/net/minecraft/world/entity/npc/AbstractVillager.java
|
||||
+++ b/net/minecraft/world/entity/npc/AbstractVillager.java
|
||||
@@ -37,7 +_,20 @@
|
||||
import net.minecraft.world.phys.Vec3;
|
||||
import org.slf4j.Logger;
|
||||
|
||||
+// CraftBukkit start
|
||||
+import org.bukkit.Bukkit;
|
||||
+import org.bukkit.craftbukkit.inventory.CraftMerchant;
|
||||
+import org.bukkit.craftbukkit.inventory.CraftMerchantRecipe;
|
||||
+import org.bukkit.event.entity.VillagerAcquireTradeEvent;
|
||||
+// CraftBukkit end
|
||||
+
|
||||
public abstract class AbstractVillager extends AgeableMob implements InventoryCarrier, Npc, Merchant {
|
||||
+ // CraftBukkit start
|
||||
+ @Override
|
||||
+ public CraftMerchant getCraftMerchant() {
|
||||
+ return (org.bukkit.craftbukkit.entity.CraftAbstractVillager) this.getBukkitEntity();
|
||||
+ }
|
||||
+ // CraftBukkit end
|
||||
private static final EntityDataAccessor<Integer> DATA_UNHAPPY_COUNTER = SynchedEntityData.defineId(AbstractVillager.class, EntityDataSerializers.INT);
|
||||
private static final Logger LOGGER = LogUtils.getLogger();
|
||||
public static final int VILLAGER_SLOT_OFFSET = 300;
|
||||
@@ -46,7 +_,7 @@
|
||||
@@ -42,7 +_,7 @@
|
||||
private Player tradingPlayer;
|
||||
@Nullable
|
||||
protected MerchantOffers offers;
|
||||
@@ -30,10 +9,17 @@
|
||||
|
||||
public AbstractVillager(EntityType<? extends AbstractVillager> entityType, Level level) {
|
||||
super(entityType, level);
|
||||
@@ -99,6 +_,13 @@
|
||||
@@ -95,6 +_,20 @@
|
||||
return this.tradingPlayer != null;
|
||||
}
|
||||
|
||||
+ // CraftBukkit start
|
||||
+ @Override
|
||||
+ public org.bukkit.craftbukkit.inventory.CraftMerchant getCraftMerchant() {
|
||||
+ return (org.bukkit.craftbukkit.entity.CraftAbstractVillager) this.getBukkitEntity();
|
||||
+ }
|
||||
+ // CraftBukkit end
|
||||
+
|
||||
+ // Paper start - Villager#resetOffers
|
||||
+ public void resetOffers() {
|
||||
+ this.offers = new MerchantOffers();
|
||||
@@ -44,7 +30,7 @@
|
||||
@Override
|
||||
public MerchantOffers getOffers() {
|
||||
if (this.level().isClientSide) {
|
||||
@@ -121,11 +_,24 @@
|
||||
@@ -117,11 +_,24 @@
|
||||
public void overrideXp(int xp) {
|
||||
}
|
||||
|
||||
@@ -71,20 +57,20 @@
|
||||
if (this.tradingPlayer instanceof ServerPlayer) {
|
||||
CriteriaTriggers.TRADE.trigger((ServerPlayer)this.tradingPlayer, this, offer.getResult());
|
||||
}
|
||||
@@ -236,7 +_,20 @@
|
||||
@@ -226,7 +_,20 @@
|
||||
while (i < maxNumbers && !list.isEmpty()) {
|
||||
MerchantOffer offer = list.remove(this.random.nextInt(list.size())).getOffer(this, this.random);
|
||||
if (offer != null) {
|
||||
- givenMerchantOffers.add(offer);
|
||||
+ // CraftBukkit start
|
||||
+ VillagerAcquireTradeEvent event = new VillagerAcquireTradeEvent((org.bukkit.entity.AbstractVillager) this.getBukkitEntity(), offer.asBukkit());
|
||||
+ org.bukkit.event.entity.VillagerAcquireTradeEvent event = new org.bukkit.event.entity.VillagerAcquireTradeEvent((org.bukkit.entity.AbstractVillager) this.getBukkitEntity(), offer.asBukkit());
|
||||
+ // Suppress during worldgen
|
||||
+ if (this.valid) {
|
||||
+ Bukkit.getPluginManager().callEvent(event);
|
||||
+ event.callEvent();
|
||||
+ }
|
||||
+ if (!event.isCancelled()) {
|
||||
+ // Paper start - Fix crash from invalid ingredient list
|
||||
+ final CraftMerchantRecipe craftMerchantRecipe = CraftMerchantRecipe.fromBukkit(event.getRecipe());
|
||||
+ final org.bukkit.craftbukkit.inventory.CraftMerchantRecipe craftMerchantRecipe = org.bukkit.craftbukkit.inventory.CraftMerchantRecipe.fromBukkit(event.getRecipe());
|
||||
+ if (craftMerchantRecipe.getIngredients().isEmpty()) return;
|
||||
+ givenMerchantOffers.add(craftMerchantRecipe.toMinecraft());
|
||||
+ // Paper end - Fix crash from invalid ingredient list
|
||||
|
||||
@@ -1,12 +1,16 @@
|
||||
--- a/net/minecraft/world/entity/npc/CatSpawner.java
|
||||
+++ b/net/minecraft/world/entity/npc/CatSpawner.java
|
||||
@@ -82,8 +_,8 @@
|
||||
if (cat == null) {
|
||||
return 0;
|
||||
} else {
|
||||
+ cat.moveTo(pos, 0.0F, 0.0F); // Paper - move up - Fix MC-147659
|
||||
cat.finalizeSpawn(serverLevel, serverLevel.getCurrentDifficultyAt(pos), EntitySpawnReason.NATURAL, null);
|
||||
- cat.moveTo(pos, 0.0F, 0.0F);
|
||||
serverLevel.addFreshEntityWithPassengers(cat);
|
||||
return 1;
|
||||
@@ -68,12 +_,12 @@
|
||||
private void spawnCat(BlockPos pos, ServerLevel level, boolean persistent) {
|
||||
Cat cat = EntityType.CAT.create(level, EntitySpawnReason.NATURAL);
|
||||
if (cat != null) {
|
||||
+ cat.snapTo(pos, 0.0F, 0.0F); // Paper - move up - Fix MC-147659
|
||||
cat.finalizeSpawn(level, level.getCurrentDifficultyAt(pos), EntitySpawnReason.NATURAL, null);
|
||||
if (persistent) {
|
||||
cat.setPersistenceRequired();
|
||||
}
|
||||
|
||||
- cat.snapTo(pos, 0.0F, 0.0F);
|
||||
level.addFreshEntityWithPassengers(cat);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,16 +1,5 @@
|
||||
--- a/net/minecraft/world/entity/npc/InventoryCarrier.java
|
||||
+++ b/net/minecraft/world/entity/npc/InventoryCarrier.java
|
||||
@@ -8,6 +_,10 @@
|
||||
import net.minecraft.world.entity.item.ItemEntity;
|
||||
import net.minecraft.world.item.ItemStack;
|
||||
|
||||
+// CraftBukkit start
|
||||
+import org.bukkit.event.entity.EntityRemoveEvent;
|
||||
+// CraftBukkit end
|
||||
+
|
||||
public interface InventoryCarrier {
|
||||
String TAG_INVENTORY = "Inventory";
|
||||
|
||||
@@ -22,12 +_,19 @@
|
||||
return;
|
||||
}
|
||||
@@ -28,7 +17,7 @@
|
||||
mob.take(itemEntity, count - itemStack.getCount());
|
||||
if (itemStack.isEmpty()) {
|
||||
- itemEntity.discard();
|
||||
+ itemEntity.discard(EntityRemoveEvent.Cause.PICKUP); // CraftBukkit - add Bukkit remove cause
|
||||
+ itemEntity.discard(org.bukkit.event.entity.EntityRemoveEvent.Cause.PICKUP); // CraftBukkit - add Bukkit remove cause
|
||||
} else {
|
||||
item.setCount(itemStack.getCount());
|
||||
}
|
||||
|
||||
@@ -1,21 +1,6 @@
|
||||
--- a/net/minecraft/world/entity/npc/Villager.java
|
||||
+++ b/net/minecraft/world/entity/npc/Villager.java
|
||||
@@ -90,6 +_,14 @@
|
||||
import net.minecraft.world.phys.AABB;
|
||||
import org.slf4j.Logger;
|
||||
|
||||
+// CraftBukkit start
|
||||
+import org.bukkit.Bukkit;
|
||||
+import org.bukkit.craftbukkit.event.CraftEventFactory;
|
||||
+import org.bukkit.event.entity.EntityRemoveEvent;
|
||||
+import org.bukkit.event.entity.EntityTransformEvent;
|
||||
+import org.bukkit.event.entity.VillagerReplenishTradeEvent;
|
||||
+// CraftBukkit end
|
||||
+
|
||||
public class Villager extends AbstractVillager implements ReputationEventHandler, VillagerDataHolder {
|
||||
private static final Logger LOGGER = LogUtils.getLogger();
|
||||
private static final EntityDataAccessor<VillagerData> DATA_VILLAGER_DATA = SynchedEntityData.defineId(Villager.class, EntityDataSerializers.VILLAGER_DATA);
|
||||
@@ -275,7 +_,7 @@
|
||||
@@ -286,7 +_,7 @@
|
||||
this.increaseProfessionLevelOnUpdate = false;
|
||||
}
|
||||
|
||||
@@ -24,37 +9,35 @@
|
||||
}
|
||||
}
|
||||
|
||||
@@ -384,7 +_,13 @@
|
||||
@@ -395,7 +_,12 @@
|
||||
this.updateDemand();
|
||||
|
||||
for (MerchantOffer merchantOffer : this.getOffers()) {
|
||||
- merchantOffer.resetUses();
|
||||
+ // CraftBukkit start
|
||||
+ VillagerReplenishTradeEvent event = new VillagerReplenishTradeEvent((org.bukkit.entity.Villager) this.getBukkitEntity(), merchantOffer.asBukkit());
|
||||
+ Bukkit.getPluginManager().callEvent(event);
|
||||
+ if (!event.isCancelled()) {
|
||||
+ org.bukkit.event.entity.VillagerReplenishTradeEvent event = new org.bukkit.event.entity.VillagerReplenishTradeEvent((org.bukkit.entity.Villager) this.getBukkitEntity(), merchantOffer.asBukkit());
|
||||
+ if (event.callEvent()) {
|
||||
+ merchantOffer.resetUses();
|
||||
+ }
|
||||
+ // CraftBukkit end
|
||||
}
|
||||
|
||||
this.resendOffersToTradingPlayer();
|
||||
@@ -445,7 +_,13 @@
|
||||
@@ -456,7 +_,12 @@
|
||||
int i = 2 - this.numberOfRestocksToday;
|
||||
if (i > 0) {
|
||||
for (MerchantOffer merchantOffer : this.getOffers()) {
|
||||
- merchantOffer.resetUses();
|
||||
+ // CraftBukkit start
|
||||
+ VillagerReplenishTradeEvent event = new VillagerReplenishTradeEvent((org.bukkit.entity.Villager) this.getBukkitEntity(), merchantOffer.asBukkit());
|
||||
+ Bukkit.getPluginManager().callEvent(event);
|
||||
+ if (!event.isCancelled()) {
|
||||
+ org.bukkit.event.entity.VillagerReplenishTradeEvent event = new org.bukkit.event.entity.VillagerReplenishTradeEvent((org.bukkit.entity.Villager) this.getBukkitEntity(), merchantOffer.asBukkit());
|
||||
+ if (event.callEvent()) {
|
||||
+ merchantOffer.resetUses();
|
||||
+ }
|
||||
+ // CraftBukkit end
|
||||
}
|
||||
}
|
||||
|
||||
@@ -466,6 +_,7 @@
|
||||
@@ -477,6 +_,7 @@
|
||||
int playerReputation = this.getPlayerReputation(player);
|
||||
if (playerReputation != 0) {
|
||||
for (MerchantOffer merchantOffer : this.getOffers()) {
|
||||
@@ -62,7 +45,7 @@
|
||||
merchantOffer.addToSpecialPriceDiff(-Mth.floor(playerReputation * merchantOffer.getPriceMultiplier()));
|
||||
}
|
||||
}
|
||||
@@ -475,6 +_,7 @@
|
||||
@@ -486,6 +_,7 @@
|
||||
int amplifier = effect.getAmplifier();
|
||||
|
||||
for (MerchantOffer merchantOffer1 : this.getOffers()) {
|
||||
@@ -88,55 +71,56 @@
|
||||
Entity entity = cause.getEntity();
|
||||
if (entity != null) {
|
||||
this.tellWitnessesThatIWasMurdered(entity);
|
||||
@@ -782,12 +_,19 @@
|
||||
@@ -780,12 +_,19 @@
|
||||
@Override
|
||||
public void thunderHit(ServerLevel level, LightningBolt lightning) {
|
||||
if (level.getDifficulty() != Difficulty.PEACEFUL) {
|
||||
- LOGGER.info("Villager {} was struck by lightning {}.", this, lightning);
|
||||
+ // Paper - Add EntityZapEvent; move log down, event can cancel
|
||||
Witch witch = this.convertTo(EntityType.WITCH, ConversionParams.single(this, false, false), mob -> {
|
||||
Witch witch = this.convertTo(EntityType.WITCH, ConversionParams.single(this, false, false), witch1 -> {
|
||||
+ // Paper start - Add EntityZapEvent
|
||||
+ if (org.bukkit.craftbukkit.event.CraftEventFactory.callEntityZapEvent(this, lightning, mob).isCancelled()) {
|
||||
+ if (org.bukkit.craftbukkit.event.CraftEventFactory.callEntityZapEvent(this, lightning, witch1).isCancelled()) {
|
||||
+ return false;
|
||||
+ }
|
||||
+ if (org.spigotmc.SpigotConfig.logVillagerDeaths) Villager.LOGGER.info("Villager {} was struck by lightning {}.", this, lightning); // Move down
|
||||
+ if (org.spigotmc.SpigotConfig.logVillagerDeaths) LOGGER.info("Villager {} was struck by lightning {}.", this, lightning); // Move down
|
||||
+ // Paper end - Add EntityZapEvent
|
||||
mob.finalizeSpawn(level, level.getCurrentDifficultyAt(mob.blockPosition()), EntitySpawnReason.CONVERSION, null);
|
||||
mob.setPersistenceRequired();
|
||||
witch1.finalizeSpawn(level, level.getCurrentDifficultyAt(witch1.blockPosition()), EntitySpawnReason.CONVERSION, null);
|
||||
witch1.setPersistenceRequired();
|
||||
this.releaseAllPois();
|
||||
- });
|
||||
+ return true; // Paper start - Add EntityZapEvent
|
||||
+ }, EntityTransformEvent.TransformReason.LIGHTNING, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.LIGHTNING); // CraftBukkit
|
||||
+ }, org.bukkit.event.entity.EntityTransformEvent.TransformReason.LIGHTNING, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.LIGHTNING); // CraftBukkit
|
||||
if (witch == null) {
|
||||
super.thunderHit(level, lightning);
|
||||
}
|
||||
@@ -827,6 +_,12 @@
|
||||
@@ -825,6 +_,12 @@
|
||||
|
||||
@Override
|
||||
protected void updateTrades() {
|
||||
+ // Paper start - More vanilla friendly methods to update trades
|
||||
+ updateTrades(TRADES_PER_LEVEL);
|
||||
+ this.updateTrades(TRADES_PER_LEVEL);
|
||||
+ }
|
||||
+
|
||||
+ public boolean updateTrades(int amount) {
|
||||
+ // Paper end - More vanilla friendly methods to update trades
|
||||
VillagerData villagerData = this.getVillagerData();
|
||||
Int2ObjectMap<VillagerTrades.ItemListing[]> map1;
|
||||
if (this.level().enabledFeatures().contains(FeatureFlags.TRADE_REBALANCE)) {
|
||||
@@ -840,9 +_,11 @@
|
||||
VillagerTrades.ItemListing[] itemListings = map1.get(villagerData.getLevel());
|
||||
if (itemListings != null) {
|
||||
MerchantOffers offers = this.getOffers();
|
||||
- this.addOffersFromItemListings(offers, itemListings, 2);
|
||||
+ this.addOffersFromItemListings(offers, itemListings, amount); // Paper - More vanilla friendly methods to update trades
|
||||
+ return true; // Paper - More vanilla friendly methods to update trades
|
||||
ResourceKey<VillagerProfession> resourceKey = villagerData.profession().unwrapKey().orElse(null);
|
||||
if (resourceKey != null) {
|
||||
@@ -840,10 +_,12 @@
|
||||
VillagerTrades.ItemListing[] itemListings = map1.get(villagerData.level());
|
||||
if (itemListings != null) {
|
||||
MerchantOffers offers = this.getOffers();
|
||||
- this.addOffersFromItemListings(offers, itemListings, 2);
|
||||
+ this.addOffersFromItemListings(offers, itemListings, 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 serverLevel, Villager target, long gameTime) {
|
||||
@@ -871,7 +_,7 @@
|
||||
@@ -872,7 +_,7 @@
|
||||
List<Villager> entitiesOfClass = serverLevel.getEntitiesOfClass(Villager.class, aabb);
|
||||
List<Villager> list = entitiesOfClass.stream().filter(villager -> villager.wantsToSpawnGolem(gameTime)).limit(5L).toList();
|
||||
if (list.size() >= minVillagerAmount) {
|
||||
@@ -145,7 +129,7 @@
|
||||
EntityType.IRON_GOLEM,
|
||||
EntitySpawnReason.MOB_SUMMONED,
|
||||
serverLevel,
|
||||
@@ -880,9 +_,11 @@
|
||||
@@ -881,9 +_,11 @@
|
||||
8,
|
||||
6,
|
||||
SpawnUtil.Strategy.LEGACY_IRON_GOLEM,
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
--- a/net/minecraft/world/entity/npc/VillagerTrades.java
|
||||
+++ b/net/minecraft/world/entity/npc/VillagerTrades.java
|
||||
@@ -1844,7 +_,8 @@
|
||||
return null;
|
||||
} else {
|
||||
ServerLevel serverLevel = (ServerLevel)trader.level();
|
||||
@@ -1747,7 +_,8 @@
|
||||
@Override
|
||||
public MerchantOffer getOffer(Entity trader, RandomSource random) {
|
||||
if (trader.level() instanceof ServerLevel serverLevel) {
|
||||
- BlockPos blockPos = serverLevel.findNearestMapStructure(this.destination, trader.blockPosition(), 100, true);
|
||||
+ if (!serverLevel.paperConfig().environment.treasureMaps.enabled) return null; // Paper - Configurable cartographer treasure maps
|
||||
+ BlockPos blockPos = serverLevel.findNearestMapStructure(this.destination, trader.blockPosition(), 100, !serverLevel.paperConfig().environment.treasureMaps.findAlreadyDiscoveredVillager); // Paper - Configurable cartographer treasure maps
|
||||
|
||||
@@ -1,23 +1,15 @@
|
||||
--- a/net/minecraft/world/entity/npc/WanderingTrader.java
|
||||
+++ b/net/minecraft/world/entity/npc/WanderingTrader.java
|
||||
@@ -47,11 +_,23 @@
|
||||
@@ -45,11 +_,15 @@
|
||||
import net.minecraft.world.phys.Vec3;
|
||||
import org.apache.commons.lang3.tuple.Pair;
|
||||
|
||||
-public class WanderingTrader extends AbstractVillager implements Consumable.OverrideConsumeSound {
|
||||
+// CraftBukkit start
|
||||
+import org.bukkit.Bukkit;
|
||||
+import org.bukkit.craftbukkit.inventory.CraftMerchantRecipe;
|
||||
+import org.bukkit.entity.AbstractVillager;
|
||||
+import org.bukkit.event.entity.EntityRemoveEvent;
|
||||
+import org.bukkit.event.entity.VillagerAcquireTradeEvent;
|
||||
+// CraftBukkit end
|
||||
+
|
||||
+public class WanderingTrader extends net.minecraft.world.entity.npc.AbstractVillager implements Consumable.OverrideConsumeSound {
|
||||
private static final int NUMBER_OF_TRADE_OFFERS = 5;
|
||||
+public class WanderingTrader extends net.minecraft.world.entity.npc.AbstractVillager implements Consumable.OverrideConsumeSound { // CraftBukkit
|
||||
private static final int DEFAULT_DESPAWN_DELAY = 0;
|
||||
@Nullable
|
||||
private BlockPos wanderTarget;
|
||||
private int despawnDelay;
|
||||
private int despawnDelay = 0;
|
||||
+ // Paper start - Add more WanderingTrader API
|
||||
+ public boolean canDrinkPotion = true;
|
||||
+ public boolean canDrinkMilk = true;
|
||||
@@ -25,43 +17,25 @@
|
||||
|
||||
public WanderingTrader(EntityType<? extends WanderingTrader> entityType, Level level) {
|
||||
super(entityType, level);
|
||||
@@ -67,7 +_,7 @@
|
||||
@@ -65,7 +_,7 @@
|
||||
this,
|
||||
PotionContents.createItemStack(Items.POTION, Potions.INVISIBILITY),
|
||||
SoundEvents.WANDERING_TRADER_DISAPPEARED,
|
||||
- wanderingTrader -> this.level().isNight() && !wanderingTrader.isInvisible()
|
||||
+ wanderingTrader -> this.canDrinkPotion && this.level().isNight() && !wanderingTrader.isInvisible() // Paper - Add more WanderingTrader API
|
||||
- wanderingTrader -> this.level().isDarkOutside() && !wanderingTrader.isInvisible()
|
||||
+ wanderingTrader -> this.canDrinkPotion && this.level().isDarkOutside() && !wanderingTrader.isInvisible() // Paper - Add more WanderingTrader API
|
||||
)
|
||||
);
|
||||
this.goalSelector
|
||||
@@ -77,7 +_,7 @@
|
||||
@@ -75,7 +_,7 @@
|
||||
this,
|
||||
new ItemStack(Items.MILK_BUCKET),
|
||||
SoundEvents.WANDERING_TRADER_REAPPEARED,
|
||||
- wanderingTrader -> this.level().isDay() && wanderingTrader.isInvisible()
|
||||
+ wanderingTrader -> this.canDrinkMilk && this.level().isDay() && wanderingTrader.isInvisible() // Paper - Add more WanderingTrader API
|
||||
- wanderingTrader -> this.level().isBrightOutside() && wanderingTrader.isInvisible()
|
||||
+ wanderingTrader -> this.canDrinkMilk && this.level().isBrightOutside() && wanderingTrader.isInvisible() // Paper - Add more WanderingTrader API
|
||||
)
|
||||
);
|
||||
this.goalSelector.addGoal(1, new TradeWithPlayerGoal(this));
|
||||
@@ -145,7 +_,16 @@
|
||||
VillagerTrades.ItemListing itemListing = itemListings1[randomInt];
|
||||
MerchantOffer offer = itemListing.getOffer(this, this.random);
|
||||
if (offer != null) {
|
||||
- offers.add(offer);
|
||||
+ // CraftBukkit start
|
||||
+ VillagerAcquireTradeEvent event = new VillagerAcquireTradeEvent((AbstractVillager) this.getBukkitEntity(), offer.asBukkit());
|
||||
+ // Suppress during worldgen
|
||||
+ if (this.valid) {
|
||||
+ Bukkit.getPluginManager().callEvent(event);
|
||||
+ }
|
||||
+ if (!event.isCancelled()) {
|
||||
+ offers.add(CraftMerchantRecipe.fromBukkit(event.getRecipe()).toMinecraft());
|
||||
+ }
|
||||
+ // CraftBukkit end
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -189,7 +_,7 @@
|
||||
@@ -163,7 +_,7 @@
|
||||
protected void rewardTradeXp(MerchantOffer offer) {
|
||||
if (offer.shouldRewardExp()) {
|
||||
int i = 3 + this.random.nextInt(4);
|
||||
@@ -70,12 +44,12 @@
|
||||
}
|
||||
}
|
||||
|
||||
@@ -241,7 +_,7 @@
|
||||
@@ -215,7 +_,7 @@
|
||||
|
||||
private void maybeDespawn() {
|
||||
if (this.despawnDelay > 0 && !this.isTrading() && --this.despawnDelay == 0) {
|
||||
- this.discard();
|
||||
+ this.discard(EntityRemoveEvent.Cause.DESPAWN); // CraftBukkit - add Bukkit remove cause
|
||||
+ this.discard(org.bukkit.event.entity.EntityRemoveEvent.Cause.DESPAWN); // CraftBukkit - add Bukkit remove cause
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
--- a/net/minecraft/world/entity/npc/WanderingTraderSpawner.java
|
||||
+++ b/net/minecraft/world/entity/npc/WanderingTraderSpawner.java
|
||||
@@ -38,41 +_,51 @@
|
||||
@@ -38,38 +_,47 @@
|
||||
|
||||
public WanderingTraderSpawner(ServerLevelData serverLevelData) {
|
||||
this.serverLevelData = serverLevelData;
|
||||
@@ -27,49 +27,46 @@
|
||||
}
|
||||
|
||||
@Override
|
||||
public int tick(ServerLevel level, boolean spawnHostiles, boolean spawnPassives) {
|
||||
public void tick(ServerLevel level, boolean spawnEnemies, boolean spawnFriendlies) {
|
||||
+ // Paper start - Add Wandering Trader spawn rate config options
|
||||
+ if (this.tickDelay == Integer.MIN_VALUE) {
|
||||
+ this.tickDelay = level.paperConfig().entities.spawning.wanderingTrader.spawnMinuteLength;
|
||||
+ this.spawnDelay = level.paperConfig().entities.spawning.wanderingTrader.spawnDayLength;
|
||||
+ this.spawnChance = level.paperConfig().entities.spawning.wanderingTrader.spawnChanceMin;
|
||||
+ }
|
||||
if (!level.getGameRules().getBoolean(GameRules.RULE_DO_TRADER_SPAWNING)) {
|
||||
return 0;
|
||||
- } else if (--this.tickDelay > 0) {
|
||||
+ } else if (--this.tickDelay - 1 > 0) {
|
||||
+ this.tickDelay = this.tickDelay - 1;
|
||||
return 0;
|
||||
} else {
|
||||
- this.tickDelay = 1200;
|
||||
- this.spawnDelay -= 1200;
|
||||
- this.serverLevelData.setWanderingTraderSpawnDelay(this.spawnDelay);
|
||||
+ this.tickDelay = level.paperConfig().entities.spawning.wanderingTrader.spawnMinuteLength;
|
||||
+ this.spawnDelay = this.spawnDelay - level.paperConfig().entities.spawning.wanderingTrader.spawnMinuteLength;
|
||||
+ //this.serverLevelData.setWanderingTraderSpawnDelay(this.spawnDelay); // Paper - We don't need to save this value to disk if it gets set back to a hardcoded value anyways
|
||||
if (this.spawnDelay > 0) {
|
||||
return 0;
|
||||
} else {
|
||||
- this.spawnDelay = 24000;
|
||||
+ this.spawnDelay = level.paperConfig().entities.spawning.wanderingTrader.spawnDayLength;
|
||||
if (!level.getGameRules().getBoolean(GameRules.RULE_DOMOBSPAWNING)) {
|
||||
return 0;
|
||||
} else {
|
||||
int i = this.spawnChance;
|
||||
- this.spawnChance = Mth.clamp(this.spawnChance + 25, 25, 75);
|
||||
- this.serverLevelData.setWanderingTraderSpawnChance(this.spawnChance);
|
||||
+ this.spawnChance = Mth.clamp(this.spawnChance + level.paperConfig().entities.spawning.wanderingTrader.spawnChanceFailureIncrement, level.paperConfig().entities.spawning.wanderingTrader.spawnChanceMin, level.paperConfig().entities.spawning.wanderingTrader.spawnChanceMax);
|
||||
+ //this.serverLevelData.setWanderingTraderSpawnChance(this.spawnChance); // Paper - We don't need to save this value to disk if it gets set back to a hardcoded value anyways
|
||||
if (this.random.nextInt(100) > i) {
|
||||
return 0;
|
||||
} else if (this.spawn(level)) {
|
||||
- this.spawnChance = 25;
|
||||
+ this.spawnChance = level.paperConfig().entities.spawning.wanderingTrader.spawnChanceMin;
|
||||
+ // Paper end - Add Wandering Trader spawn rate config options
|
||||
return 1;
|
||||
} else {
|
||||
return 0;
|
||||
@@ -100,14 +_,14 @@
|
||||
if (level.getGameRules().getBoolean(GameRules.RULE_DO_TRADER_SPAWNING)) {
|
||||
- if (--this.tickDelay <= 0) {
|
||||
- this.tickDelay = 1200;
|
||||
- this.spawnDelay -= 1200;
|
||||
- this.serverLevelData.setWanderingTraderSpawnDelay(this.spawnDelay);
|
||||
+ if (this.tickDelay - 1 <= 0) { // Paper - Prevent tickDelay going below 0
|
||||
+ this.tickDelay = level.paperConfig().entities.spawning.wanderingTrader.spawnMinuteLength;
|
||||
+ this.spawnDelay = this.spawnDelay - level.paperConfig().entities.spawning.wanderingTrader.spawnMinuteLength;
|
||||
+ //this.serverLevelData.setWanderingTraderSpawnDelay(this.spawnDelay); // Paper - We don't need to save this value to disk if it gets set back to a hardcoded value anyways
|
||||
if (this.spawnDelay <= 0) {
|
||||
- this.spawnDelay = 24000;
|
||||
+ this.spawnDelay = level.paperConfig().entities.spawning.wanderingTrader.spawnDayLength;
|
||||
if (level.getGameRules().getBoolean(GameRules.RULE_DOMOBSPAWNING)) {
|
||||
int i = this.spawnChance;
|
||||
- this.spawnChance = Mth.clamp(this.spawnChance + 25, 25, 75);
|
||||
- this.serverLevelData.setWanderingTraderSpawnChance(this.spawnChance);
|
||||
+ this.spawnChance = Mth.clamp(this.spawnChance + level.paperConfig().entities.spawning.wanderingTrader.spawnChanceFailureIncrement, level.paperConfig().entities.spawning.wanderingTrader.spawnChanceMin, level.paperConfig().entities.spawning.wanderingTrader.spawnChanceMax);
|
||||
+ //this.serverLevelData.setWanderingTraderSpawnChance(this.spawnChance); // Paper - We don't need to save this value to disk if it gets set back to a hardcoded value anyways
|
||||
if (this.random.nextInt(100) <= i) {
|
||||
if (this.spawn(level)) {
|
||||
- this.spawnChance = 25;
|
||||
+ this.spawnChance = level.paperConfig().entities.spawning.wanderingTrader.spawnChanceMin;
|
||||
+ // Paper end - Add Wandering Trader spawn rate config options
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
- }
|
||||
+ } else { this.tickDelay--; } // Paper - Prevent tickDelay going below 0
|
||||
}
|
||||
}
|
||||
|
||||
@@ -91,14 +_,14 @@
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -86,7 +83,7 @@
|
||||
wanderingTrader.setWanderTarget(blockPos1);
|
||||
wanderingTrader.restrictTo(blockPos1, 16);
|
||||
return true;
|
||||
@@ -121,7 +_,7 @@
|
||||
@@ -112,7 +_,7 @@
|
||||
private void tryToSpawnLlamaFor(ServerLevel serverLevel, WanderingTrader trader, int maxDistance) {
|
||||
BlockPos blockPos = this.findSpawnPositionNear(serverLevel, trader.blockPosition(), maxDistance);
|
||||
if (blockPos != null) {
|
||||
|
||||
Reference in New Issue
Block a user