Updated Upstream (Paper)

Upstream has released updates that appear to apply and compile correctly

Paper Changes:
PaperMC/Paper@ffcb7b22 Update Parchment (#13177)
PaperMC/Paper@c33a9ce1 Fix incorrect variable use in Entity#startRiding
PaperMC/Paper@c710b667 Add MapPalette.getNearestColor (#13104)
PaperMC/Paper@b57d6410 Expose isReplaceable on BlockData (#13180)
PaperMC/Paper@af1823d4 Reduce impact of tick time calculations (#13188)
PaperMC/Paper@89ca94ab [ci/skip] Rebuild patches
PaperMC/Paper@e5cc2560 [ci/skip] Update CONTRIBUTING.md for Gradle and Windows Docs (#13190)
PaperMC/Paper@ab99393c Fix charged creeper explosions not dropping mob skulls (#13167)
PaperMC/Paper@81b7a578 Fixed Ender Dragon using wrong tracking range (#13046)
This commit is contained in:
granny
2025-10-16 22:07:40 -07:00
parent 49f2891215
commit c8a4f0b6f0
63 changed files with 693 additions and 693 deletions

View File

@@ -48,10 +48,10 @@
+ }
+ // Purpur end - Add canSaveToDisk to Entity
+
public Entity(EntityType<?> entityType, Level level) {
this.type = entityType;
public Entity(EntityType<?> type, Level level) {
this.type = type;
this.level = level;
this.dimensions = entityType.getDimensions();
this.dimensions = type.getDimensions();
+ // Purpur start - Add toggle for RNG manipulation
+ this.random = level == null || level.purpurConfig.entitySharedRandom ? SHARED_RANDOM : RandomSource.create();
+ this.uuid = Mth.createInsecureUUID(this.random);
@@ -99,7 +99,7 @@
} catch (Throwable var7) {
CrashReport crashReport = CrashReport.forThrowable(var7, "Loading entity NBT");
CrashReportCategory crashReportCategory = crashReport.addCategory("Entity being loaded");
@@ -3035,6 +_,7 @@
@@ -3034,6 +_,7 @@
if (this.isAlive() && this instanceof Leashable leashable2) {
if (leashable2.getLeashHolder() == player) {
if (!this.level().isClientSide()) {
@@ -107,7 +107,7 @@
// Paper start - EntityUnleashEvent
if (!org.bukkit.craftbukkit.event.CraftEventFactory.handlePlayerUnleashEntityEvent(
leashable2, player, hand, !player.hasInfiniteMaterials(), true
@@ -3459,15 +_,18 @@
@@ -3458,15 +_,18 @@
return Vec3.directionFromRotation(this.getRotationVector());
}
@@ -127,7 +127,7 @@
}
}
}
@@ -3672,7 +_,7 @@
@@ -3671,7 +_,7 @@
}
public int getMaxAirSupply() {
@@ -136,7 +136,7 @@
}
public int getAirSupply() {
@@ -4234,7 +_,7 @@
@@ -4233,7 +_,7 @@
// CraftBukkit end
public boolean canUsePortal(boolean allowPassengers) {
@@ -145,7 +145,7 @@
}
public boolean canTeleport(Level fromLevel, Level toLevel) {
@@ -4749,6 +_,12 @@
@@ -4748,6 +_,12 @@
return Mth.lerp(partialTick, this.yRotO, this.yRot);
}
@@ -158,7 +158,7 @@
// Paper start - optimise collisions
public boolean updateFluidHeightAndDoFluidPushing(final TagKey<Fluid> fluid, final double flowScale) {
if (this.touchingUnloadedChunk()) {
@@ -5166,7 +_,7 @@
@@ -5165,7 +_,7 @@
}
public float maxUpStep() {

View File

@@ -17,7 +17,7 @@
public static ResourceLocation getKey(EntityType<?> entityType) {
return BuiltInRegistries.ENTITY_TYPE.getKey(entityType);
}
@@ -1442,6 +_,16 @@
@@ -1444,6 +_,16 @@
return this.category;
}
@@ -34,7 +34,7 @@
public String getDescriptionId() {
return this.descriptionId;
}
@@ -1501,7 +_,11 @@
@@ -1503,7 +_,11 @@
entity.load(input);
},
// Paper end - Don't fire sync event during generation

View File

@@ -1,7 +1,7 @@
--- a/net/minecraft/world/entity/GlowSquid.java
+++ b/net/minecraft/world/entity/GlowSquid.java
@@ -27,6 +_,13 @@
super(entityType, level);
super(type, level);
}
+ // Purpur start - Flying squids! Oh my!

View File

@@ -137,7 +137,7 @@
final org.bukkit.inventory.EquipmentSlot handSlot = (hand != null) ? org.bukkit.craftbukkit.CraftEquipmentSlot.getHand(hand) : null;
final EntityResurrectEvent event = new EntityResurrectEvent((org.bukkit.entity.LivingEntity) this.getBukkitEntity(), handSlot);
event.setCancelled(itemStack == null);
@@ -1914,6 +_,7 @@
@@ -1920,6 +_,7 @@
boolean flag = this.lastHurtByPlayerMemoryTime > 0;
this.dropEquipment(level); // CraftBukkit - from below
if (this.shouldDropLoot(level)) {
@@ -145,7 +145,7 @@
this.dropFromLootTable(level, damageSource, flag);
// Paper start
final boolean prev = this.clearEquipmentSlots;
@@ -1922,6 +_,7 @@
@@ -1928,6 +_,7 @@
// Paper end
this.dropCustomDeathLoot(level, damageSource, flag);
this.clearEquipmentSlots = prev; // Paper
@@ -153,7 +153,7 @@
}
// CraftBukkit start - Call death event // Paper start - call advancement triggers with correct entity equipment
@@ -3140,6 +_,7 @@
@@ -3146,6 +_,7 @@
float f = (float)(d * 10.0 - 3.0);
if (f > 0.0F) {
this.playSound(this.getFallDamageSound((int)f), 1.0F, 1.0F);
@@ -161,7 +161,7 @@
this.hurt(this.damageSources().flyIntoWall(), f);
}
}
@@ -4539,6 +_,12 @@
@@ -4545,6 +_,12 @@
? slot == EquipmentSlot.MAINHAND && this.canUseSlot(EquipmentSlot.MAINHAND)
: slot == equippable.slot() && this.canUseSlot(equippable.slot()) && equippable.canBeEquippedBy(this.getType());
}

View File

@@ -6,8 +6,8 @@
public net.kyori.adventure.util.TriState despawnInPeacefulOverride = net.kyori.adventure.util.TriState.NOT_SET; // Paper - allow changing despawnInPeaceful
+ public int ticksSinceLastInteraction; // Purpur - Entity lifespan
protected Mob(EntityType<? extends Mob> entityType, Level level) {
super(entityType, level);
protected Mob(EntityType<? extends Mob> type, Level level) {
super(type, level);
@@ -295,6 +_,7 @@
target = null;
}
@@ -44,7 +44,7 @@
+ // Purpur end - Entity lifespan
@Override
protected void playHurtSound(DamageSource source) {
protected void playHurtSound(DamageSource damageSource) {
@@ -443,6 +_,7 @@
output.putString("Paper.DespawnInPeacefulOverride", this.despawnInPeacefulOverride.name());
}

View File

@@ -10,15 +10,15 @@
this.usePlayerItem(player, hand, itemInHand);
this.setInLove(serverPlayer, breedCopy); // Paper - Fix EntityBreedEvent copying
@@ -223,10 +_,20 @@
public void spawnChildFromBreeding(ServerLevel level, Animal mate) {
AgeableMob breedOffspring = this.getBreedOffspring(level, mate);
public void spawnChildFromBreeding(ServerLevel level, Animal partner) {
AgeableMob breedOffspring = this.getBreedOffspring(level, partner);
if (breedOffspring != null) {
- breedOffspring.setBaby(true);
- breedOffspring.snapTo(this.getX(), this.getY(), this.getZ(), 0.0F, 0.0F);
+ //breedOffspring.setBaby(true); // Purpur - Add adjustable breeding cooldown to config - moved down
+ //breedOffspring.snapTo(this.getX(), this.getY(), this.getZ(), 0.0F, 0.0F); // Purpur - Add adjustable breeding cooldown to config - moved down
// CraftBukkit start - Call EntityBreedEvent
ServerPlayer breeder = Optional.ofNullable(this.getLoveCause()).or(() -> Optional.ofNullable(mate.getLoveCause())).orElse(null);
ServerPlayer breeder = Optional.ofNullable(this.getLoveCause()).or(() -> Optional.ofNullable(partner.getLoveCause())).orElse(null);
+ // Purpur start - Add adjustable breeding cooldown to config
+ if (breeder != null && level.purpurConfig.animalBreedingCooldownSeconds > 0) {
+ if (level.hasBreedingCooldown(breeder.getUUID(), this.getClass())) {
@@ -30,5 +30,5 @@
+ breedOffspring.snapTo(this.getX(), this.getY(), this.getZ(), 0.0F, 0.0F);
+ // Purpur end - Add adjustable breeding cooldown to config
int experience = this.getRandom().nextInt(7) + 1;
org.bukkit.event.entity.EntityBreedEvent entityBreedEvent = org.bukkit.craftbukkit.event.CraftEventFactory.callEntityBreedEvent(breedOffspring, this, mate, breeder, this.breedItem, experience);
org.bukkit.event.entity.EntityBreedEvent entityBreedEvent = org.bukkit.craftbukkit.event.CraftEventFactory.callEntityBreedEvent(breedOffspring, this, partner, breeder, this.breedItem, experience);
if (entityBreedEvent.isCancelled()) {

View File

@@ -9,7 +9,7 @@
this.setPathfindingMalus(PathType.WATER_BORDER, 16.0F);
this.setPathfindingMalus(PathType.COCOA, -1.0F);
this.setPathfindingMalus(PathType.FENCE, -1.0F);
@@ -368,7 +_,7 @@
@@ -366,7 +_,7 @@
}
public static boolean isNightOrRaining(Level level) {
@@ -18,7 +18,7 @@
}
public void setStayOutOfHiveCountdown(int stayOutOfHiveCountdown) {
@@ -391,7 +_,7 @@
@@ -389,7 +_,7 @@
@Override
protected void customServerAiStep(ServerLevel level) {
boolean hasStung = this.hasStung();
@@ -27,7 +27,7 @@
this.underWaterTicks++;
} else {
this.underWaterTicks = 0;
@@ -401,6 +_,7 @@
@@ -399,6 +_,7 @@
this.hurtServer(level, this.damageSources().drown(), 1.0F);
}
@@ -35,7 +35,7 @@
if (hasStung) {
this.timeSinceSting++;
if (this.timeSinceSting % 5 == 0 && this.random.nextInt(Mth.clamp(1200 - this.timeSinceSting, 1, 1200)) == 0) {
@@ -1140,6 +_,7 @@
@@ -1138,6 +_,7 @@
Bee.this.savedFlowerPos = optional.get();
Bee.this.navigation
.moveTo(Bee.this.savedFlowerPos.getX() + 0.5, Bee.this.savedFlowerPos.getY() + 0.5, Bee.this.savedFlowerPos.getZ() + 0.5, 1.2F);
@@ -43,7 +43,7 @@
return true;
} else {
Bee.this.remainingCooldownBeforeLocatingNewFlower = Mth.nextInt(Bee.this.random, 20, 60);
@@ -1186,6 +_,7 @@
@@ -1184,6 +_,7 @@
this.pollinating = false;
Bee.this.navigation.stop();
Bee.this.remainingCooldownBeforeLocatingNewFlower = 200;
@@ -51,7 +51,7 @@
}
@Override
@@ -1232,6 +_,7 @@
@@ -1230,6 +_,7 @@
this.setWantedPos();
}

View File

@@ -6,8 +6,8 @@
public BlockPos treasurePos;
+ private boolean isNaturallyAggressiveToPlayers; // Purpur - Dolphins naturally aggressive to players chance
public Dolphin(EntityType<? extends Dolphin> entityType, Level level) {
super(entityType, level);
public Dolphin(EntityType<? extends Dolphin> type, Level level) {
super(type, level);
@@ -90,6 +_,7 @@
this.setAirSupply(this.getMaxAirSupply());
this.setXRot(0.0F);

View File

@@ -6,8 +6,8 @@
private UUID persistentAngerTarget;
+ @Nullable private UUID summoner; // Purpur - Summoner API
public IronGolem(EntityType<? extends IronGolem> entityType, Level level) {
super(entityType, level);
public IronGolem(EntityType<? extends IronGolem> type, Level level) {
super(type, level);
}
+ // Purpur start - Summoner API

View File

@@ -1,7 +1,7 @@
--- a/net/minecraft/world/entity/animal/MushroomCow.java
+++ b/net/minecraft/world/entity/animal/MushroomCow.java
@@ -201,6 +_,13 @@
level.playSound(null, this, SoundEvents.MOOSHROOM_SHEAR, soundSource, 1.0F, 1.0F);
level.playSound(null, this, SoundEvents.MOOSHROOM_SHEAR, source, 1.0F, 1.0F);
this.convertTo(EntityType.COW, ConversionParams.single(this, false, false), cow -> {
level.sendParticles(ParticleTypes.EXPLOSION, this.getX(), this.getY(0.5), this.getZ(), 1, 0.0, 0.0, 0.0, 0.0);
+ // Purpur start - Fix cow rotation when shearing mooshroom

View File

@@ -44,7 +44,7 @@
@Nullable
@Override
public AgeableMob getBreedOffspring(ServerLevel level, AgeableMob otherParent) {
public AgeableMob getBreedOffspring(ServerLevel level, AgeableMob partner) {
- return null;
+ return level.purpurConfig.parrotBreedable ? EntityType.PARROT.create(level, EntitySpawnReason.BREEDING) : null; // Purpur - Breedable parrots
}

View File

@@ -1,7 +1,7 @@
--- a/net/minecraft/world/entity/animal/PolarBear.java
+++ b/net/minecraft/world/entity/animal/PolarBear.java
@@ -65,6 +_,29 @@
super(entityType, level);
super(type, level);
}
+ // Purpur start - Breedable Polar Bears
@@ -29,7 +29,7 @@
+
@Nullable
@Override
public AgeableMob getBreedOffspring(ServerLevel level, AgeableMob otherParent) {
public AgeableMob getBreedOffspring(ServerLevel level, AgeableMob partner) {
@@ -73,7 +_,7 @@
@Override

View File

@@ -6,8 +6,8 @@
private static final boolean DEFAULT_PUMPKIN = true;
+ @Nullable private java.util.UUID summoner; // Purpur - Summoner API
public SnowGolem(EntityType<? extends SnowGolem> entityType, Level level) {
super(entityType, level);
public SnowGolem(EntityType<? extends SnowGolem> type, Level level) {
super(type, level);
}
+ // Purpur start - Summoner API

View File

@@ -2,9 +2,9 @@
+++ b/net/minecraft/world/entity/animal/Squid.java
@@ -46,10 +_,29 @@
public Squid(EntityType<? extends Squid> entityType, Level level) {
super(entityType, level);
- //this.random.setSeed(this.getId()); // Paper - Share random for entities to make them more random
public Squid(EntityType<? extends Squid> type, Level level) {
super(type, level);
- // this.random.setSeed(this.getId()); // Paper - Share random for entities to make them more random
+ if (!level.purpurConfig.entitySharedRandom) this.random.setSeed(this.getId()); // Paper - Share random for entities to make them more random // Purpur - Add toggle for RNG manipulation
this.tentacleSpeed = 1.0F / (this.random.nextFloat() + 1.0F) * 0.2F;
}

View File

@@ -6,8 +6,8 @@
public static final EquipmentSlot EQUIPMENT_SLOT_ANTENNA = EquipmentSlot.SADDLE;
+ @Nullable private UUID summoner; // Purpur - Summoner API
public CopperGolem(EntityType<? extends AbstractGolem> entityType, Level level) {
super(entityType, level);
public CopperGolem(EntityType<? extends AbstractGolem> type, Level level) {
super(type, level);
@@ -97,6 +_,17 @@
this.getBrain().setMemory(MemoryModuleType.TRANSPORT_ITEMS_COOLDOWN_TICKS, this.getRandom().nextInt(60, 100));
}

View File

@@ -3,9 +3,9 @@
@@ -43,7 +_,7 @@
private static final int TICK_TO_START_ON_REACHED_INTERACTION = 1;
private static final int TICK_TO_PLAY_ON_REACHED_SOUND = 9;
private static final Predicate<BlockState> TRANSPORT_ITEM_SOURCE_BLOCK = blockState -> blockState.is(BlockTags.COPPER_CHESTS);
- private static final Predicate<BlockState> TRANSPORT_ITEM_DESTINATION_BLOCK = blockState -> blockState.is(Blocks.CHEST)
+ private static final Predicate<BlockState> TRANSPORT_ITEM_DESTINATION_BLOCK = blockState -> blockState.is(Blocks.CHEST) // Purpur - copper golem can place items in barrels option - diff on change
|| blockState.is(Blocks.TRAPPED_CHEST);
private static final Predicate<BlockState> TRANSPORT_ITEM_SOURCE_BLOCK = state -> state.is(BlockTags.COPPER_CHESTS);
- private static final Predicate<BlockState> TRANSPORT_ITEM_DESTINATION_BLOCK = state -> state.is(Blocks.CHEST) || state.is(Blocks.TRAPPED_CHEST);
+ private static final Predicate<BlockState> TRANSPORT_ITEM_DESTINATION_BLOCK = state -> state.is(Blocks.CHEST) || state.is(Blocks.TRAPPED_CHEST); // Purpur - copper golem can place items in barrels option - diff on change
private static final ImmutableList<SensorType<? extends Sensor<? super CopperGolem>>> SENSOR_TYPES = ImmutableList.of(
SensorType.NEAREST_LIVING_ENTITIES, SensorType.HURT_BY
);

View File

@@ -3,12 +3,12 @@
@@ -78,6 +_,7 @@
private Llama caravanHead;
@Nullable
public Llama caravanTail; // Paper
public Llama caravanTail; // Paper - public
+ public boolean shouldJoinCaravan = true; // Purpur - Llama API
public Llama(EntityType<? extends Llama> entityType, Level level) {
super(entityType, level);
@@ -112,6 +_,7 @@
public Llama(EntityType<? extends Llama> type, Level level) {
super(type, level);
@@ -107,6 +_,7 @@
super.addAdditionalSaveData(output);
output.store("Variant", Llama.Variant.LEGACY_CODEC, this.getVariant());
output.putInt("Strength", this.getStrength());
@@ -16,7 +16,7 @@
}
@Override
@@ -119,6 +_,7 @@
@@ -114,6 +_,7 @@
this.setStrength(input.getIntOr("Strength", 0));
super.readAdditionalSaveData(input);
this.setVariant(input.read("Variant", Llama.Variant.LEGACY_CODEC).orElse(Llama.Variant.DEFAULT));
@@ -24,7 +24,7 @@
}
@Override
@@ -400,6 +_,7 @@
@@ -395,6 +_,7 @@
public void leaveCaravan() {
if (this.caravanHead != null) {
@@ -32,7 +32,7 @@
this.caravanHead.caravanTail = null;
}
@@ -407,6 +_,7 @@
@@ -402,6 +_,7 @@
}
public void joinCaravan(Llama caravanHead) {

View File

@@ -6,8 +6,8 @@
private static final TargetingConditions TARGETING_CONDITIONS = TargetingConditions.forCombat().range(20.0).selector(LIVING_ENTITY_SELECTOR);
+ @Nullable private java.util.UUID summoner; // Purpur - Summoner API
public WitherBoss(EntityType<? extends WitherBoss> entityType, Level level) {
super(entityType, level);
public WitherBoss(EntityType<? extends WitherBoss> type, Level level) {
super(type, level);
@@ -87,6 +_,17 @@
this.xpReward = 50;
}

View File

@@ -6,8 +6,8 @@
// Paper end - Allow ArmorStands not to tick
+ public boolean canMovementTick = true; // Purpur - Movement options for armor stands
public ArmorStand(EntityType<? extends ArmorStand> entityType, Level level) {
super(entityType, level);
public ArmorStand(EntityType<? extends ArmorStand> type, Level level) {
super(type, level);
if (level != null) this.canTick = level.paperConfig().entities.armorStands.tick; // Paper - Allow ArmorStands not to tick
+ if (level != null) this.canMovementTick = level.purpurConfig.armorstandMovement; // Purpur - Movement options for armor stands
+ this.setShowArms(level != null && level.purpurConfig.armorstandPlaceWithArms); // Purpur - Config to show Armor Stand arms on spawn

View File

@@ -11,8 +11,8 @@
+ public boolean immuneToLightning = false;
+ // Purpur end - Item entity immunities
public ItemEntity(EntityType<? extends ItemEntity> entityType, Level level) {
super(entityType, level);
public ItemEntity(EntityType<? extends ItemEntity> type, Level level) {
super(type, level);
@@ -333,7 +_,16 @@
@Override

View File

@@ -2,12 +2,12 @@
+++ b/net/minecraft/world/entity/monster/Creeper.java
@@ -56,6 +_,7 @@
public int explosionRadius = 3;
private boolean droppedSkulls;
public boolean droppedSkulls;
public @Nullable Entity entityIgniter; // CraftBukkit
+ private boolean exploding = false; // Purpur - Config to make Creepers explode on death
public Creeper(EntityType<? extends Creeper> entityType, Level level) {
super(entityType, level);
public Creeper(EntityType<? extends Creeper> type, Level level) {
super(type, level);
@@ -159,6 +_,27 @@
return false; // CraftBukkit
}

View File

@@ -6,8 +6,8 @@
public int life = 0;
+ private boolean isPlayerSpawned; // Purpur - Add back player spawned endermite API
public Endermite(EntityType<? extends Endermite> entityType, Level level) {
super(entityType, level);
public Endermite(EntityType<? extends Endermite> type, Level level) {
super(type, level);
this.xpReward = 3;
}

View File

@@ -19,10 +19,10 @@
}
+
+ // Purpur start - Toggle for Zombified Piglin death always counting as player kill when angry
+ if (livingEntity instanceof Player player && this.level().purpurConfig.zombifiedPiglinCountAsPlayerKillWhenAngry) {
+ if (target instanceof Player player && this.level().purpurConfig.zombifiedPiglinCountAsPlayerKillWhenAngry) {
+ this.setLastHurtByPlayer(player, this.tickCount);
+ }
+ // Purpur end - Toggle for Zombified Piglin death always counting as player kill when angry
return super.setTarget(livingEntity, reason); // CraftBukkit
return super.setTarget(target, reason); // CraftBukkit
}

View File

@@ -7,8 +7,8 @@
+ private boolean isLobotomized = false; public boolean isLobotomized() { return this.isLobotomized; } // Purpur - Lobotomize stuck villagers
+ private int notLobotomizedCount = 0; // Purpur - Lobotomize stuck villagers
public Villager(EntityType<? extends Villager> entityType, Level level) {
this(entityType, level, VillagerType.PLAINS);
public Villager(EntityType<? extends Villager> type, Level level) {
this(type, level, VillagerType.PLAINS);
@@ -196,6 +_,57 @@
this.setVillagerData(this.getVillagerData().withType(villagerType).withProfession(level.registryAccess(), VillagerProfession.NONE));
}
@@ -121,11 +121,11 @@
@@ -922,6 +_,7 @@
}
public void spawnGolemIfNeeded(ServerLevel serverLevel, long gameTime, int minVillagerAmount) {
+ if (serverLevel.purpurConfig.villagerSpawnIronGolemRadius > 0 && serverLevel.getEntitiesOfClass(net.minecraft.world.entity.animal.IronGolem.class, getBoundingBox().inflate(serverLevel.purpurConfig.villagerSpawnIronGolemRadius)).size() > serverLevel.purpurConfig.villagerSpawnIronGolemLimit) return; // Purpur - Implement configurable search radius for villagers to spawn iron golems
public void spawnGolemIfNeeded(ServerLevel level, long gameTime, int minVillagerAmount) {
+ if (level.purpurConfig.villagerSpawnIronGolemRadius > 0 && level.getEntitiesOfClass(net.minecraft.world.entity.animal.IronGolem.class, getBoundingBox().inflate(level.purpurConfig.villagerSpawnIronGolemRadius)).size() > level.purpurConfig.villagerSpawnIronGolemLimit) return; // Purpur - Implement configurable search radius for villagers to spawn iron golems
if (this.wantsToSpawnGolem(gameTime)) {
AABB aabb = this.getBoundingBox().inflate(10.0, 10.0, 10.0);
List<Villager> entitiesOfClass = serverLevel.getEntitiesOfClass(Villager.class, aabb);
List<Villager> entitiesOfClass = level.getEntitiesOfClass(Villager.class, aabb);
@@ -989,6 +_,12 @@
@Override

View File

@@ -1,7 +1,7 @@
--- a/net/minecraft/world/entity/npc/WanderingTrader.java
+++ b/net/minecraft/world/entity/npc/WanderingTrader.java
@@ -60,6 +_,13 @@
super(entityType, level);
super(type, level);
}
+ // Purpur start - Allow leashing villagers

View File

@@ -6,9 +6,9 @@
public ItemStack firedFromWeapon = null;
+ public net.minecraft.world.item.enchantment.ItemEnchantments actualEnchantments = net.minecraft.world.item.enchantment.ItemEnchantments.EMPTY; // Purpur - Add an option to fix MC-3304 projectile looting
protected AbstractArrow(EntityType<? extends AbstractArrow> entityType, Level level) {
super(entityType, level);
@@ -350,7 +_,7 @@
protected AbstractArrow(EntityType<? extends AbstractArrow> type, Level level) {
super(type, level);
@@ -344,7 +_,7 @@
this.setInGround(false);
Vec3 deltaMovement = this.getDeltaMovement();
this.setDeltaMovement(deltaMovement.multiply(this.random.nextFloat() * 0.2F, this.random.nextFloat() * 0.2F, this.random.nextFloat() * 0.2F));
@@ -17,7 +17,7 @@
}
public boolean isInGround() {
@@ -574,6 +_,12 @@
@@ -568,6 +_,12 @@
public ItemStack getWeaponItem() {
return this.firedFromWeapon;
}

View File

@@ -1,6 +1,6 @@
--- a/net/minecraft/world/entity/projectile/ThrownTrident.java
+++ b/net/minecraft/world/entity/projectile/ThrownTrident.java
@@ -66,7 +_,7 @@
@@ -69,7 +_,7 @@
Entity owner = this.getOwner();
int i = this.entityData.get(ID_LOYALTY);