diff --git a/gradle.properties b/gradle.properties index c49321757..aef1c99ca 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,8 +1,8 @@ group = org.purpurmc.purpur version = 1.21.6-R0.1-SNAPSHOT -mcVersion = 1.21.6-pre1 -paperCommit = ff05a2df6313f422f22c7f640294641a59559250 +mcVersion = 1.21.6-pre2 +paperCommit = 4c4ddfcce5e83504e9de0d1418ed09f561b93f58 org.gradle.configuration-cache = true org.gradle.caching = true diff --git a/purpur-server/minecraft-patches/features/0001-Ridables.patch b/purpur-server/minecraft-patches/features/0001-Ridables.patch index 47a650dd5..acdcc6b37 100644 --- a/purpur-server/minecraft-patches/features/0001-Ridables.patch +++ b/purpur-server/minecraft-patches/features/0001-Ridables.patch @@ -18,34 +18,34 @@ index 61ab8b508d2b614d0f05ae4cc23dc214f8e95a1d..d6e8bd3b302f821b286b15db3d66c8b2 public boolean isClientAuthoritative() { return false; diff --git a/net/minecraft/server/MinecraftServer.java b/net/minecraft/server/MinecraftServer.java -index 096ee3a095468a7d0577f9adc7a9bf7cccc4727d..cf3d17009faee82e659b2ca6cabfae70abf96b8a 100644 +index 67f988ab10e060e5b6f558d30f43ddf7dc332699..c6e5eb1bac6164a1323cf39fa215096d58fe2f1f 100644 --- a/net/minecraft/server/MinecraftServer.java +++ b/net/minecraft/server/MinecraftServer.java -@@ -1635,6 +1635,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop 0; // Paper - BlockPhysicsEvent +@@ -1745,6 +1745,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop 0; // Paper - Add EntityMoveEvent serverLevel.updateLagCompensationTick(); // Paper - lag compensation + net.minecraft.world.level.block.entity.HopperBlockEntity.skipHopperEvents = serverLevel.paperConfig().hopper.disableMoveEvent || org.bukkit.event.inventory.InventoryMoveItemEvent.getHandlerList().getRegisteredListeners().length == 0; // Paper - Perf: Optimize Hoppers + serverLevel.hasRidableMoveEvent = org.purpurmc.purpur.event.entity.RidableMoveEvent.getHandlerList().getRegisteredListeners().length > 0; // Purpur - Ridables profilerFiller.push(() -> serverLevel + " " + serverLevel.dimension().location()); /* Drop global time updates if (this.tickCount % 20 == 0) { diff --git a/net/minecraft/server/level/ServerLevel.java b/net/minecraft/server/level/ServerLevel.java -index e4c88e1f99e684fadec47eeceb82420c879897cf..44a8629ec03c01597c7167c26d801c015157c242 100644 +index 83eff33884bffddfafc85eeb4a2900104a396e2e..3c7159d0981c948e71a5612ba4083accb5849ed4 100644 --- a/net/minecraft/server/level/ServerLevel.java +++ b/net/minecraft/server/level/ServerLevel.java -@@ -215,6 +215,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe - public final java.util.UUID uuid; +@@ -216,6 +216,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe public boolean hasPhysicsEvent = true; // Paper - BlockPhysicsEvent public boolean hasEntityMoveEvent; // Paper - Add EntityMoveEvent + private final alternate.current.wire.WireHandler wireHandler = new alternate.current.wire.WireHandler(this); // Paper - optimize redstone (Alternate Current) + public boolean hasRidableMoveEvent = false; // Purpur - Ridables @Override public @Nullable LevelChunk getChunkIfLoaded(int x, int z) { diff --git a/net/minecraft/server/level/ServerPlayer.java b/net/minecraft/server/level/ServerPlayer.java -index 565f54a7e37b9303cb23db09881751b364cdf5c4..38f92b36533c5f9694ca689a88f3f42a977d003a 100644 +index cb8b23e04d9315c733856a2e2956cfbf5860d516..1ac6488820c569e84c5666ce58223b321dab7a39 100644 --- a/net/minecraft/server/level/ServerPlayer.java +++ b/net/minecraft/server/level/ServerPlayer.java -@@ -761,6 +761,15 @@ public class ServerPlayer extends Player { +@@ -797,6 +797,15 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc this.trackEnteredOrExitedLavaOnVehicle(); this.updatePlayerAttributes(); this.advancements.flushDirty(this, true); @@ -62,10 +62,10 @@ index 565f54a7e37b9303cb23db09881751b364cdf5c4..38f92b36533c5f9694ca689a88f3f42a private void updatePlayerAttributes() { diff --git a/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/net/minecraft/server/network/ServerGamePacketListenerImpl.java -index 55e74b04ed0576923b8acfdf833e6c999d5a7b6c..900d59620d309258b3b883ccd8cb086f26db0c11 100644 +index 014557e343d3ede351b3a2b950bb803d7e771490..628b1a5ac93d7cd1be8175aab88d2f5e29b60257 100644 --- a/net/minecraft/server/network/ServerGamePacketListenerImpl.java +++ b/net/minecraft/server/network/ServerGamePacketListenerImpl.java -@@ -2773,6 +2773,8 @@ public class ServerGamePacketListenerImpl +@@ -2844,6 +2844,8 @@ public class ServerGamePacketListenerImpl ServerGamePacketListenerImpl.this.cserver.getPluginManager().callEvent(event); @@ -75,10 +75,10 @@ index 55e74b04ed0576923b8acfdf833e6c999d5a7b6c..900d59620d309258b3b883ccd8cb086f if ((target instanceof net.minecraft.world.entity.animal.Bucketable && target instanceof LivingEntity && origItem != null && origItem == Items.WATER_BUCKET) && (event.isCancelled() || ServerGamePacketListenerImpl.this.player.getInventory().getSelectedItem().isEmpty() || !ServerGamePacketListenerImpl.this.player.getInventory().getSelectedItem().is(origItem))) { target.resendPossiblyDesyncedEntityData(ServerGamePacketListenerImpl.this.player); // Paper - The entire mob gets deleted, so resend it diff --git a/net/minecraft/world/entity/Entity.java b/net/minecraft/world/entity/Entity.java -index b2bcdaa27b5b8dcca60da185fa331fcf2d711665..be21e55bb0e3e4ce0a93d20ba5eb80e342c3d29e 100644 +index 5351e368233d2bca5fe8568cb97c09e49293fb70..d4f9a29cfbb59d557eef790ca07575187c99854b 100644 --- a/net/minecraft/world/entity/Entity.java +++ b/net/minecraft/world/entity/Entity.java -@@ -3065,6 +3065,13 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess +@@ -3302,6 +3302,13 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess this.passengers = ImmutableList.copyOf(list); } @@ -92,7 +92,7 @@ index b2bcdaa27b5b8dcca60da185fa331fcf2d711665..be21e55bb0e3e4ce0a93d20ba5eb80e3 this.gameEvent(GameEvent.ENTITY_MOUNT, passenger); } } -@@ -3106,6 +3113,14 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess +@@ -3343,6 +3350,14 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess return false; } // CraftBukkit end @@ -107,7 +107,7 @@ index b2bcdaa27b5b8dcca60da185fa331fcf2d711665..be21e55bb0e3e4ce0a93d20ba5eb80e3 if (this.passengers.size() == 1 && this.passengers.get(0) == passenger) { this.passengers = ImmutableList.of(); } else { -@@ -5075,4 +5090,44 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess +@@ -5388,4 +5403,44 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess return ((ServerLevel) this.level()).isPositionEntityTicking(this.blockPosition()); } // Paper end - Expose entity id counter @@ -1077,7 +1077,7 @@ index 354c7a41407fc6518965d09bfe3089676b6da794..a81ada76bfd6c4b49d1552f48e2009bc } } diff --git a/net/minecraft/world/entity/animal/HappyGhast.java b/net/minecraft/world/entity/animal/HappyGhast.java -index 8e998a2b35e38dbc74edbaa007f66e98e5486647..3154ba3c1786a607a9f6511288051889632764bf 100644 +index 210b35ce4abe22d79c13c9c6dbd7114a723f66ee..e0491ba54d93f85359e11fdbc66775d11bcec7ac 100644 --- a/net/minecraft/world/entity/animal/HappyGhast.java +++ b/net/minecraft/world/entity/animal/HappyGhast.java @@ -120,6 +120,13 @@ public class HappyGhast extends Animal { diff --git a/purpur-server/minecraft-patches/features/0003-Barrels-and-enderchests-6-rows.patch b/purpur-server/minecraft-patches/features/0003-Barrels-and-enderchests-6-rows.patch index c8acefc2e..be7a4921b 100644 --- a/purpur-server/minecraft-patches/features/0003-Barrels-and-enderchests-6-rows.patch +++ b/purpur-server/minecraft-patches/features/0003-Barrels-and-enderchests-6-rows.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Barrels and enderchests 6 rows diff --git a/net/minecraft/server/players/PlayerList.java b/net/minecraft/server/players/PlayerList.java -index 7a247b713ceb3a513de1f91cdda1d30a32845d13..f9f3deed9f892ece5568a6ede9955c8e19937b60 100644 +index 5e8db3d74d4e2bd6e28042de67dde38b26768fc4..9e76257c195e46ef60a742144109a3947229cb6e 100644 --- a/net/minecraft/server/players/PlayerList.java +++ b/net/minecraft/server/players/PlayerList.java -@@ -1040,6 +1040,27 @@ public abstract class PlayerList { +@@ -1041,6 +1041,27 @@ public abstract class PlayerList { player.getBukkitEntity().recalculatePermissions(); // CraftBukkit this.server.getCommands().sendCommands(player); } // Paper - Add sendOpLevel API @@ -37,7 +37,7 @@ index 7a247b713ceb3a513de1f91cdda1d30a32845d13..f9f3deed9f892ece5568a6ede9955c8e public boolean isWhiteListed(GameProfile profile) { diff --git a/net/minecraft/world/entity/player/Player.java b/net/minecraft/world/entity/player/Player.java -index c421cc7dc6c401a19eaf193abd970f21e910f927..acb53dba83fe9481508fa4d4704203a08f575450 100644 +index 65d981d26c729d63aa9bad1bbe90cef35207e832..97b104679bb2b9e466caa10d7b022ee6d597e7e5 100644 --- a/net/minecraft/world/entity/player/Player.java +++ b/net/minecraft/world/entity/player/Player.java @@ -221,6 +221,7 @@ public abstract class Player extends LivingEntity { diff --git a/purpur-server/minecraft-patches/features/0006-Minecart-settings-and-WASD-controls.patch b/purpur-server/minecraft-patches/features/0006-Minecart-settings-and-WASD-controls.patch index 9c035117e..b98b25d8b 100644 --- a/purpur-server/minecraft-patches/features/0006-Minecart-settings-and-WASD-controls.patch +++ b/purpur-server/minecraft-patches/features/0006-Minecart-settings-and-WASD-controls.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Minecart settings and WASD controls diff --git a/net/minecraft/server/level/ServerPlayer.java b/net/minecraft/server/level/ServerPlayer.java -index 0c489a6d3357ed0d3dc9341440b87623d007da3f..ed63c0cc2750485ab4d53c242fec94c1a66e9dbe 100644 +index 1ac6488820c569e84c5666ce58223b321dab7a39..853d54a28a348492372eb38b50b155a6644129e4 100644 --- a/net/minecraft/server/level/ServerPlayer.java +++ b/net/minecraft/server/level/ServerPlayer.java -@@ -1170,6 +1170,11 @@ public class ServerPlayer extends Player { +@@ -1206,6 +1206,11 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc } else { // Purpur start - Add boat fall damage config if (damageSource.is(net.minecraft.tags.DamageTypeTags.IS_FALL)) { diff --git a/purpur-server/minecraft-patches/features/0018-API-for-any-mob-to-burn-daylight.patch b/purpur-server/minecraft-patches/features/0018-API-for-any-mob-to-burn-daylight.patch index 37cd11243..85ed6f5d2 100644 --- a/purpur-server/minecraft-patches/features/0018-API-for-any-mob-to-burn-daylight.patch +++ b/purpur-server/minecraft-patches/features/0018-API-for-any-mob-to-burn-daylight.patch @@ -6,10 +6,10 @@ Subject: [PATCH] API for any mob to burn daylight Co-authored by: Encode42 diff --git a/net/minecraft/world/entity/Entity.java b/net/minecraft/world/entity/Entity.java -index 7e9e0e9cd0a12af66d937859885da5c0f619af22..0fb1267063476bb510ff236800132b535c29a50c 100644 +index d4f9a29cfbb59d557eef790ca07575187c99854b..068ce6f155abf3bda758f2bcdb4377836c610945 100644 --- a/net/minecraft/world/entity/Entity.java +++ b/net/minecraft/world/entity/Entity.java -@@ -435,6 +435,24 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess +@@ -542,6 +542,24 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess } // Purpur end - Add canSaveToDisk to Entity diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/server/MinecraftServer.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/server/MinecraftServer.java.patch index b0dd7735b..c6efe0f37 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/server/MinecraftServer.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/server/MinecraftServer.java.patch @@ -25,8 +25,8 @@ + protected boolean upnp = false; // Purpur - UPnP Port Forwarding public static S spin(Function threadFunction) { - AtomicReference atomicReference = new AtomicReference<>(); -@@ -918,6 +_,15 @@ + ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry.init(); // Paper - rewrite data converter system +@@ -995,6 +_,15 @@ LOGGER.info("Stopping server"); Commands.COMMAND_SENDING_POOL.shutdownNow(); // Paper - Perf: Async command map building; Shutdown and don't bother finishing @@ -42,7 +42,7 @@ // CraftBukkit start if (this.server != null) { this.server.spark.disable(); // Paper - spark -@@ -1012,6 +_,8 @@ +@@ -1093,6 +_,8 @@ this.safeShutdown(waitForServer, false); } public void safeShutdown(boolean waitForServer, boolean isRestarting) { @@ -51,7 +51,7 @@ this.isRestarting = isRestarting; this.hasLoggedStop = true; // Paper - Debugging if (isDebugging()) io.papermc.paper.util.TraceUtil.dumpTraceForThread("Server stopped"); // Paper - Debugging -@@ -1031,6 +_,7 @@ +@@ -1112,6 +_,7 @@ private static final long MAX_CATCHUP_BUFFER = TICK_TIME * TPS * 60L; private long lastTick = 0; private long catchupTime = 0; @@ -59,7 +59,7 @@ public final RollingAverage tps1 = new RollingAverage(60); public final RollingAverage tps5 = new RollingAverage(60 * 5); public final RollingAverage tps15 = new RollingAverage(60 * 15); -@@ -1116,6 +_,16 @@ +@@ -1197,6 +_,16 @@ } // Paper end - Add onboarding message for initial server start @@ -76,7 +76,7 @@ while (this.running) { long l; if (!this.isPaused() && this.tickRateManager.isSprinting() && this.tickRateManager.checkShouldSprintThisTick()) { -@@ -1140,14 +_,19 @@ +@@ -1221,14 +_,19 @@ if (++MinecraftServer.currentTick % MinecraftServer.SAMPLE_INTERVAL == 0) { final long diff = currentTime - tickSection; final java.math.BigDecimal currentTps = TPS_BASE.divide(new java.math.BigDecimal(diff), 30, java.math.RoundingMode.HALF_UP); @@ -99,7 +99,7 @@ tickSection = currentTime; } // Paper end - further improve server tick loop -@@ -1172,6 +_,12 @@ +@@ -1260,6 +_,12 @@ profilerFiller.popPush("nextTickWait"); this.mayHaveDelayedTasks = true; this.delayedTasksMaxNextTickTimeNanos = Math.max(Util.getNanos() + l, this.nextTickTimeNanos); @@ -112,7 +112,7 @@ this.startMeasuringTaskExecutionTime(); this.waitUntilNextTick(); this.finishMeasuringTaskExecutionTime(); -@@ -1581,7 +_,7 @@ +@@ -1690,7 +_,7 @@ long worldTime = level.getGameTime(); final ClientboundSetTimePacket worldPacket = new ClientboundSetTimePacket(worldTime, dayTime, doDaylight); for (Player entityhuman : level.players()) { @@ -121,7 +121,7 @@ continue; } ServerPlayer entityplayer = (ServerPlayer) entityhuman; -@@ -1745,7 +_,7 @@ +@@ -1855,7 +_,7 @@ @DontObfuscate public String getServerModName() { diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/server/level/ServerLevel.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/server/level/ServerLevel.java.patch index 60beb270d..5626a7245 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/server/level/ServerLevel.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/server/level/ServerLevel.java.patch @@ -9,7 +9,7 @@ private final RandomSequences randomSequences; // CraftBukkit start -@@ -353,7 +_,24 @@ +@@ -590,7 +_,24 @@ // CraftBukkit end this.tickTime = tickTime; this.server = server; @@ -35,15 +35,15 @@ this.serverLevelData = serverLevelData; ChunkGenerator chunkGenerator = levelStem.generator(); // CraftBukkit start -@@ -435,6 +_,7 @@ - this.randomSequences = Objects.requireNonNullElseGet(randomSequences, () -> this.getDataStorage().computeIfAbsent(RandomSequences.TYPE)); - this.waypointManager = new ServerWaypointManager(); +@@ -675,6 +_,7 @@ + this.chunkDataController = new ca.spottedleaf.moonrise.patches.chunk_system.io.datacontroller.ChunkDataController((ServerLevel)(Object)this, this.chunkTaskScheduler); + // Paper end - rewrite chunk system this.getCraftServer().addWorld(this.getWorld()); // CraftBukkit + this.preciseTime = this.serverLevelData.getDayTime(); // Purpur - Configurable daylight cycle } // Paper start -@@ -481,7 +_,7 @@ +@@ -721,7 +_,7 @@ } int _int = this.getGameRules().getInt(GameRules.RULE_PLAYERS_SLEEPING_PERCENTAGE); @@ -52,7 +52,7 @@ // Paper start - create time skip event - move up calculations final long newDayTime = this.levelData.getDayTime() + 24000L; org.bukkit.event.world.TimeSkipEvent event = new org.bukkit.event.world.TimeSkipEvent( -@@ -598,6 +_,13 @@ +@@ -840,6 +_,13 @@ this.serverLevelData.getScheduledEvents().tick(this.server, l); Profiler.get().pop(); if (this.serverLevelData.getGameRules().getBoolean(GameRules.RULE_DAYLIGHT)) { @@ -66,7 +66,7 @@ this.setDayTime(this.levelData.getDayTime() + 1L); } } -@@ -605,7 +_,21 @@ +@@ -847,7 +_,21 @@ public void setDayTime(long time) { this.serverLevelData.setDayTime(time); @@ -89,7 +89,7 @@ public void tickCustomSpawners(boolean spawnEnemies, boolean spawnFriendlies) { for (CustomSpawner customSpawner : this.customSpawners) { -@@ -682,9 +_,17 @@ +@@ -951,9 +_,17 @@ && this.random.nextDouble() < currentDifficultyAt.getEffectiveDifficulty() * this.paperConfig().entities.spawning.skeletonHorseThunderSpawnChance.or(0.01) // Paper - Configurable spawn chances for skeleton horses && !this.getBlockState(blockPos.below()).is(Blocks.LIGHTNING_ROD); if (flag) { @@ -109,7 +109,7 @@ skeletonHorse.setAge(0); skeletonHorse.setPos(blockPos.getX(), blockPos.getY(), blockPos.getZ()); this.addFreshEntity(skeletonHorse, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.LIGHTNING); // CraftBukkit -@@ -719,9 +_,35 @@ +@@ -988,9 +_,35 @@ if (blockState.is(Blocks.SNOW)) { int layersValue = blockState.getValue(SnowLayerBlock.LAYERS); if (layersValue < Math.min(_int, 8)) { @@ -145,7 +145,7 @@ } } else { org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockFormEvent(this, heightmapPos, Blocks.SNOW.defaultBlockState(), 3, null); // CraftBukkit -@@ -742,7 +_,7 @@ +@@ -1011,7 +_,7 @@ pointOfInterestType -> pointOfInterestType.is(PoiTypes.LIGHTNING_ROD), blockPos -> blockPos.getY() == this.getHeight(Heightmap.Types.WORLD_SURFACE, blockPos.getX(), blockPos.getZ()) - 1, pos, @@ -154,7 +154,7 @@ PoiManager.Occupancy.ANY ); return optional.map(blockPos -> blockPos.above(1)); -@@ -791,8 +_,26 @@ +@@ -1060,8 +_,26 @@ int _int = this.getGameRules().getInt(GameRules.RULE_PLAYERS_SLEEPING_PERCENTAGE); Component component; if (this.sleepStatus.areEnoughSleeping(_int)) { @@ -181,7 +181,7 @@ component = Component.translatable("sleep.players_sleeping", this.sleepStatus.amountSleeping(), this.sleepStatus.sleepersNeeded(_int)); } -@@ -929,6 +_,7 @@ +@@ -1198,6 +_,7 @@ @VisibleForTesting public void resetWeatherCycle() { // CraftBukkit start @@ -189,7 +189,7 @@ this.serverLevelData.setRaining(false, org.bukkit.event.weather.WeatherChangeEvent.Cause.SLEEP); // Paper - Add cause to Weather/ThunderChangeEvents // If we stop due to everyone sleeping we should reset the weather duration to some other random value. // Not that everyone ever manages to get the whole server to sleep at the same time.... -@@ -936,6 +_,7 @@ +@@ -1205,6 +_,7 @@ this.serverLevelData.setRainTime(0); } // CraftBukkit end @@ -197,7 +197,7 @@ this.serverLevelData.setThundering(false, org.bukkit.event.weather.ThunderChangeEvent.Cause.SLEEP); // Paper - Add cause to Weather/ThunderChangeEvents // CraftBukkit start // If we stop due to everyone sleeping we should reset the weather duration to some other random value. -@@ -2384,7 +_,7 @@ +@@ -2727,7 +_,7 @@ // Spigot start if (entity.getBukkitEntity() instanceof org.bukkit.inventory.InventoryHolder && (!(entity instanceof ServerPlayer) || entity.getRemovalReason() != Entity.RemovalReason.KILLED)) { // SPIGOT-6876: closeInventory clears death message // Paper start - Fix merchant inventory not closing on entity removal diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/server/level/ServerPlayer.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/server/level/ServerPlayer.java.patch index b100b40ed..a03daa6d8 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/server/level/ServerPlayer.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/server/level/ServerPlayer.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/server/level/ServerPlayer.java +++ b/net/minecraft/server/level/ServerPlayer.java -@@ -425,6 +_,10 @@ +@@ -431,6 +_,10 @@ public @Nullable com.destroystokyo.paper.event.entity.PlayerNaturallySpawnCreaturesEvent playerNaturallySpawnedEvent; // Paper - PlayerNaturallySpawnCreaturesEvent public @Nullable String clientBrandName = null; // Paper - Brand support public @Nullable org.bukkit.event.player.PlayerQuitEvent.QuitReason quitReason = null; // Paper - Add API for quit reason; there are a lot of changes to do if we change all methods leading to the event @@ -9,9 +9,9 @@ + private boolean compassBar = false; // Purpur - Add compass command + private boolean ramBar = false; // Purpur - Implement rambar commands - public ServerPlayer(MinecraftServer server, ServerLevel level, GameProfile gameProfile, ClientInformation clientInformation) { - super(level, gameProfile); -@@ -528,6 +_,10 @@ + // Paper start - rewrite chunk system + private ca.spottedleaf.moonrise.patches.chunk_system.player.RegionizedPlayerChunkLoader.PlayerChunkLoaderData chunkLoader; +@@ -564,6 +_,10 @@ this.respawnConfig = input.read("respawn", ServerPlayer.RespawnConfig.CODEC).orElse(null); this.spawnExtraParticlesOnFall = input.getBooleanOr("spawn_extra_particles_on_fall", false); this.raidOmenPosition = input.read("raid_omen_position", BlockPos.CODEC).orElse(null); @@ -22,7 +22,7 @@ } @Override -@@ -545,6 +_,9 @@ +@@ -581,6 +_,9 @@ output.storeNullable("raid_omen_position", BlockPos.CODEC, this.raidOmenPosition); this.saveEnderPearls(output); this.getBukkitEntity().setExtraData(output); // CraftBukkit @@ -32,7 +32,7 @@ } private void saveParentVehicle(ValueOutput output) { -@@ -1041,6 +_,7 @@ +@@ -1077,6 +_,7 @@ // Paper - moved up to sendClientboundPlayerCombatKillPacket() sendClientboundPlayerCombatKillPacket(event.getShowDeathMessages(), deathScreenMessage); // Paper - Expand PlayerDeathEvent Team team = this.getTeam(); @@ -40,7 +40,7 @@ if (team == null || team.getDeathMessageVisibility() == Team.Visibility.ALWAYS) { this.server.getPlayerList().broadcastSystemMessage(deathMessage, false); } else if (team.getDeathMessageVisibility() == Team.Visibility.HIDE_FOR_OTHER_TEAMS) { -@@ -1147,6 +_,13 @@ +@@ -1183,6 +_,13 @@ if (this.isInvulnerableTo(level, damageSource)) { return false; } else { @@ -54,7 +54,7 @@ Entity entity = damageSource.getEntity(); if (!( // Paper - split the if statement. If below statement is false, hurtServer would not have been evaluated. Return false. !(entity instanceof Player player && !this.canHarmPlayer(player)) -@@ -1391,6 +_,7 @@ +@@ -1427,6 +_,7 @@ serverLevel.removePlayerImmediately(this, Entity.RemovalReason.CHANGED_DIMENSION); this.unsetRemoved(); // CraftBukkit end @@ -62,7 +62,7 @@ this.setServerLevel(level); this.connection.internalTeleport(PositionMoveRotation.of(teleportTransition), teleportTransition.relatives()); // CraftBukkit - use internal teleport without event this.connection.resetPosition(); -@@ -1507,7 +_,7 @@ +@@ -1543,7 +_,7 @@ new AABB(vec3.x() - 8.0, vec3.y() - 5.0, vec3.z() - 8.0, vec3.x() + 8.0, vec3.y() + 5.0, vec3.z() + 8.0), monster -> monster.isPreventingPlayerRest(this.level(), this) ); @@ -71,7 +71,7 @@ return Either.left(Player.BedSleepingProblem.NOT_SAFE); } } -@@ -1544,7 +_,19 @@ +@@ -1580,7 +_,19 @@ CriteriaTriggers.SLEPT_IN_BED.trigger(this); }); if (!this.level().canSleepThroughNights()) { @@ -92,7 +92,7 @@ } this.level().updateSleepingPlayerList(); -@@ -1636,6 +_,7 @@ +@@ -1672,6 +_,7 @@ @Override public void openTextEdit(SignBlockEntity signEntity, boolean isFrontText) { @@ -100,7 +100,7 @@ this.connection.send(new ClientboundBlockUpdatePacket(this.level(), signEntity.getBlockPos())); this.connection.send(new ClientboundOpenSignEditorPacket(signEntity.getBlockPos(), isFrontText)); } -@@ -1945,6 +_,26 @@ +@@ -1981,6 +_,26 @@ this.lastSentExp = -1; // CraftBukkit - Added to reset } @@ -127,7 +127,7 @@ @Override public void displayClientMessage(Component chatComponent, boolean actionBar) { this.sendSystemMessage(chatComponent, actionBar); -@@ -2163,6 +_,20 @@ +@@ -2199,6 +_,20 @@ ); } @@ -148,7 +148,7 @@ public void sendSystemMessage(Component mesage) { this.sendSystemMessage(mesage, false); } -@@ -2301,7 +_,67 @@ +@@ -2337,7 +_,67 @@ public void resetLastActionTime() { this.lastActionTime = Util.getMillis(); @@ -217,7 +217,7 @@ public ServerStatsCounter getStats() { return this.stats; -@@ -2929,4 +_,56 @@ +@@ -2965,4 +_,56 @@ return (org.bukkit.craftbukkit.entity.CraftPlayer) super.getBukkitEntity(); } // CraftBukkit end diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/server/level/WorldGenRegion.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/server/level/WorldGenRegion.java.patch index fb3d981ba..ab71931ac 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/server/level/WorldGenRegion.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/server/level/WorldGenRegion.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/server/level/WorldGenRegion.java +++ b/net/minecraft/server/level/WorldGenRegion.java -@@ -284,6 +_,7 @@ +@@ -314,6 +_,7 @@ return true; } else { // Paper start - Buffer OOB setBlock calls diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/server/network/ServerGamePacketListenerImpl.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/server/network/ServerGamePacketListenerImpl.java.patch index 4e3a6149c..f3c9a2115 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/server/network/ServerGamePacketListenerImpl.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/server/network/ServerGamePacketListenerImpl.java.patch @@ -34,7 +34,7 @@ this.player.resetLastActionTime(); // CraftBukkit - SPIGOT-854 this.disconnect(Component.translatable("multiplayer.disconnect.idling"), org.bukkit.event.player.PlayerKickEvent.Cause.IDLING); // Paper - kick event cause } -@@ -641,6 +_,8 @@ +@@ -651,6 +_,8 @@ this.lastYaw = to.getYaw(); this.lastPitch = to.getPitch(); @@ -43,7 +43,7 @@ Location oldTo = to.clone(); PlayerMoveEvent event = new PlayerMoveEvent(player, from, to); this.cserver.getPluginManager().callEvent(event); -@@ -697,6 +_,7 @@ +@@ -730,6 +_,7 @@ PacketUtils.ensureRunningOnSameThread(packet, this, this.player.level()); if (packet.getId() == this.awaitingTeleport) { if (this.awaitingPositionFromClient == null) { @@ -51,7 +51,7 @@ this.disconnect(Component.translatable("multiplayer.disconnect.invalid_player_movement"), org.bukkit.event.player.PlayerKickEvent.Cause.INVALID_PLAYER_MOVEMENT); // Paper - kick event cause return; } -@@ -1230,6 +_,10 @@ +@@ -1263,6 +_,10 @@ final int maxBookPageSize = pageMax.intValue(); final double multiplier = Math.clamp(io.papermc.paper.configuration.GlobalConfiguration.get().itemValidation.bookSize.totalMultiplier, 0.3D, 1D); long byteAllowed = maxBookPageSize; @@ -62,7 +62,7 @@ for (final String page : pageList) { final int byteLength = page.getBytes(java.nio.charset.StandardCharsets.UTF_8).length; byteTotal += byteLength; -@@ -1254,7 +_,8 @@ +@@ -1287,7 +_,8 @@ } if (byteTotal > byteAllowed) { @@ -72,7 +72,7 @@ this.disconnectAsync(Component.literal("Book too large!"), org.bukkit.event.player.PlayerKickEvent.Cause.ILLEGAL_ACTION); // Paper - kick event cause // Paper - add proper async disconnect return; } -@@ -1273,31 +_,45 @@ +@@ -1306,31 +_,45 @@ Optional optional = packet.title(); optional.ifPresent(list::add); list.addAll(packet.pages()); @@ -122,7 +122,7 @@ itemStack.set( DataComponents.WRITTEN_BOOK_CONTENT, new WrittenBookContent(this.filterableFromOutgoing(title), this.player.getName().getString(), 0, list, true) -@@ -1311,6 +_,16 @@ +@@ -1344,6 +_,16 @@ return this.player.isTextFilteringEnabled() ? Filterable.passThrough(filteredText.filteredOrEmpty()) : Filterable.from(filteredText); } @@ -139,7 +139,7 @@ @Override public void handleEntityTagQuery(ServerboundEntityTagQueryPacket packet) { PacketUtils.ensureRunningOnSameThread(packet, this, this.player.level()); -@@ -1350,7 +_,15 @@ +@@ -1383,7 +_,15 @@ @Override public void handleMovePlayer(ServerboundMovePlayerPacket packet) { PacketUtils.ensureRunningOnSameThread(packet, this, this.player.level()); @@ -156,7 +156,7 @@ this.disconnect(Component.translatable("multiplayer.disconnect.invalid_player_movement"), org.bukkit.event.player.PlayerKickEvent.Cause.INVALID_PLAYER_MOVEMENT); // Paper - kick event cause } else { ServerLevel serverLevel = this.player.level(); -@@ -1531,7 +_,7 @@ +@@ -1565,7 +_,7 @@ movedWrongly = true; if (event.getLogWarning()) // Paper end @@ -165,7 +165,7 @@ } // Paper } -@@ -1586,6 +_,8 @@ +@@ -1630,6 +_,8 @@ this.lastYaw = to.getYaw(); this.lastPitch = to.getPitch(); @@ -174,7 +174,7 @@ Location oldTo = to.clone(); PlayerMoveEvent event = new PlayerMoveEvent(player, from, to); this.cserver.getPluginManager().callEvent(event); -@@ -1641,6 +_,13 @@ +@@ -1685,6 +_,13 @@ this.player.tryResetCurrentImpulseContext(); } @@ -188,7 +188,7 @@ this.player.checkMovementStatistics(this.player.getX() - x, this.player.getY() - y, this.player.getZ() - z); this.lastGoodX = this.player.getX(); this.lastGoodY = this.player.getY(); -@@ -1658,6 +_,17 @@ +@@ -1702,6 +_,17 @@ } } @@ -206,7 +206,7 @@ private boolean shouldCheckPlayerMovement(boolean isElytraMovement) { if (this.isSingleplayerOwner()) { return false; -@@ -2028,6 +_,7 @@ +@@ -2099,6 +_,7 @@ boolean cancelled; if (hitResult == null || hitResult.getType() != HitResult.Type.BLOCK) { @@ -214,7 +214,7 @@ org.bukkit.event.player.PlayerInteractEvent event = CraftEventFactory.callPlayerInteractEvent(this.player, Action.RIGHT_CLICK_AIR, itemInHand, hand); cancelled = event.useItemInHand() == Event.Result.DENY; } else { -@@ -2679,6 +_,7 @@ +@@ -2750,6 +_,7 @@ AABB boundingBox = target.getBoundingBox(); if (this.player.canInteractWithEntity(boundingBox, io.papermc.paper.configuration.GlobalConfiguration.get().misc.clientInteractionLeniencyDistance.or(3.0))) { // Paper - configurable lenience value for interact range diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/server/players/PlayerList.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/server/players/PlayerList.java.patch index b2aeb51ba..9cc0386e8 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/server/players/PlayerList.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/server/players/PlayerList.java.patch @@ -9,7 +9,7 @@ // Paper start - Send empty chunk, so players aren't stuck in the world loading screen with our chunk system not sending chunks when dead if (player.isDeadOrDying()) { net.minecraft.core.Holder plains = serverLevel.registryAccess().lookupOrThrow(net.minecraft.core.registries.Registries.BIOME) -@@ -512,6 +_,7 @@ +@@ -513,6 +_,7 @@ } public @Nullable net.kyori.adventure.text.Component remove(ServerPlayer player, net.kyori.adventure.text.Component leaveMessage) { // Paper end - Fix kick event leave message not being sent @@ -17,7 +17,7 @@ ServerLevel serverLevel = player.level(); player.awardStat(Stats.LEAVE_GAME); // CraftBukkit start - Quitting must be before we do final save of data, in case plugins need to modify it -@@ -670,7 +_,7 @@ +@@ -671,7 +_,7 @@ // return this.players.size() >= this.maxPlayers && !this.canBypassPlayerLimit(gameProfile) // ? Component.translatable("multiplayer.disconnect.server_full") // : null; @@ -26,7 +26,7 @@ event.disallow(org.bukkit.event.player.PlayerLoginEvent.Result.KICK_FULL, net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer.legacySection().deserialize(org.spigotmc.SpigotConfig.serverFullMessage)); // Spigot // Paper - Adventure } } -@@ -932,6 +_,20 @@ +@@ -933,6 +_,20 @@ } } @@ -47,7 +47,7 @@ public void broadcastAll(Packet packet, ResourceKey dimension) { for (ServerPlayer serverPlayer : this.players) { if (serverPlayer.level().dimension() == dimension) { -@@ -1016,6 +_,7 @@ +@@ -1017,6 +_,7 @@ } else { b = (byte)(24 + permLevel); } diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/Entity.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/Entity.java.patch index 4c6ce5ffc..66c58055d 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/Entity.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/Entity.java.patch @@ -1,14 +1,14 @@ --- a/net/minecraft/world/entity/Entity.java +++ b/net/minecraft/world/entity/Entity.java -@@ -147,6 +_,7 @@ +@@ -148,6 +_,7 @@ import org.slf4j.Logger; - public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess, ScoreHolder, DataComponentGetter { + public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess, ScoreHolder, DataComponentGetter, ca.spottedleaf.moonrise.patches.chunk_system.entity.ChunkSystemEntity, ca.spottedleaf.moonrise.patches.entity_tracker.EntityTrackerEntity { // Paper - rewrite chunk system // Paper - optimise entity tracker + public static javax.script.ScriptEngine scriptEngine = new javax.script.ScriptEngineManager().getEngineByName("rhino"); // Purpur - Configurable entity base attributes // CraftBukkit start private static final int CURRENT_LEVEL = 2; public boolean preserveMotion = true; // Paper - Fix Entity Teleportation and cancel velocity if teleported; keep initial motion on first snapTo -@@ -323,8 +_,9 @@ +@@ -280,8 +_,9 @@ public double xOld; public double yOld; public double zOld; @@ -19,7 +19,7 @@ public int tickCount; private int remainingFireTicks; public boolean wasTouchingWater; -@@ -358,8 +_,8 @@ +@@ -315,8 +_,8 @@ public PortalProcessor portalProcess; public int portalCooldown; private boolean invulnerable; @@ -30,7 +30,7 @@ private boolean hasGlowingTag; private final Set tags = new io.papermc.paper.util.SizeLimitedSet<>(new it.unimi.dsi.fastutil.objects.ObjectOpenHashSet<>(), MAX_ENTITY_TAG_COUNT); // Paper - fully limit tag size - replace set impl private final double[] pistonDeltas = new double[]{0.0, 0.0, 0.0}; -@@ -414,6 +_,7 @@ +@@ -371,6 +_,7 @@ public long activatedTick = Integer.MIN_VALUE; public boolean isTemporarilyActive; public long activatedImmunityTick = Integer.MIN_VALUE; @@ -38,9 +38,9 @@ public void inactiveTick() { } -@@ -426,10 +_,21 @@ +@@ -533,10 +_,21 @@ } - // Paper end + // Paper end - optimise entity tracker + // Purpur start - Add canSaveToDisk to Entity + public boolean canSaveToDisk() { @@ -60,7 +60,7 @@ this.position = Vec3.ZERO; this.blockPosition = BlockPos.ZERO; this.chunkPosition = ChunkPos.ZERO; -@@ -804,6 +_,7 @@ +@@ -911,6 +_,7 @@ && this.level.paperConfig().environment.netherCeilingVoidDamageHeight.test(v -> this.getY() >= v) && (!(this instanceof Player player) || !player.getAbilities().invulnerable))) { // Paper end - Configurable nether ceiling damage @@ -68,7 +68,7 @@ this.onBelowWorld(); } } -@@ -1741,7 +_,7 @@ +@@ -1889,7 +_,7 @@ } public boolean fireImmune() { @@ -77,7 +77,7 @@ } public boolean causeFallDamage(double fallDistance, float damageMultiplier, DamageSource damageSource) { -@@ -2437,6 +_,11 @@ +@@ -2585,6 +_,11 @@ output.putBoolean("Paper.FreezeLock", true); } // Paper end @@ -89,7 +89,7 @@ } catch (Throwable var7) { CrashReport crashReport = CrashReport.forThrowable(var7, "Saving entity NBT"); CrashReportCategory crashReportCategory = crashReport.addCategory("Entity being saved"); -@@ -2557,6 +_,9 @@ +@@ -2705,6 +_,9 @@ } freezeLocked = input.getBooleanOr("Paper.FreezeLock", false); // Paper end @@ -99,7 +99,7 @@ } catch (Throwable var7) { CrashReport crashReport = CrashReport.forThrowable(var7, "Loading entity NBT"); CrashReportCategory crashReportCategory = crashReport.addCategory("Entity being loaded"); -@@ -2746,6 +_,7 @@ +@@ -2983,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() -@@ -3151,15 +_,18 @@ +@@ -3388,15 +_,18 @@ return Vec3.directionFromRotation(this.getRotationVector()); } @@ -127,7 +127,7 @@ } } } -@@ -3364,7 +_,7 @@ +@@ -3601,7 +_,7 @@ } public int getMaxAirSupply() { @@ -136,7 +136,7 @@ } public int getAirSupply() { -@@ -3909,7 +_,7 @@ +@@ -4146,7 +_,7 @@ // CraftBukkit end public boolean canUsePortal(boolean allowPassengers) { @@ -145,7 +145,7 @@ } public boolean canTeleport(Level fromLevel, Level toLevel) { -@@ -4432,6 +_,12 @@ +@@ -4671,6 +_,12 @@ return Mth.lerp(partialTick, this.yRotO, this.yRot); } @@ -155,10 +155,10 @@ + } + // Purpur end - Stop squids floating on top of water + - public boolean updateFluidHeightAndDoFluidPushing(TagKey fluidTag, double motionScale) { + // Paper start - optimise collisions + public boolean updateFluidHeightAndDoFluidPushing(final TagKey fluid, final double flowScale) { if (this.touchingUnloadedChunk()) { - return false; -@@ -4795,7 +_,7 @@ +@@ -5102,7 +_,7 @@ } public float maxUpStep() { diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/ai/behavior/AcquirePoi.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/ai/behavior/AcquirePoi.java.patch index 6e83d6019..c457ae742 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/ai/behavior/AcquirePoi.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/ai/behavior/AcquirePoi.java.patch @@ -1,11 +1,11 @@ --- a/net/minecraft/world/entity/ai/behavior/AcquirePoi.java +++ b/net/minecraft/world/entity/ai/behavior/AcquirePoi.java -@@ -85,7 +_,7 @@ - } +@@ -86,7 +_,7 @@ }; - Set, BlockPos>> set = poiManager.findAllClosestFirstWithType( -- acquirablePois, predicate1, mob.blockPosition(), 48, PoiManager.Occupancy.HAS_SPACE -+ acquirablePois, predicate1, mob.blockPosition(), level.purpurConfig.villagerAcquirePoiSearchRadius, PoiManager.Occupancy.HAS_SPACE // Purpur - Configurable villager search radius - ) - .limit(5L) - .filter(pair1 -> predicate.test(level, pair1.getSecond())) + // Paper start - optimise POI access + final java.util.List, BlockPos>> poiposes = new java.util.ArrayList<>(); +- io.papermc.paper.util.PoiAccess.findNearestPoiPositions(poiManager, acquirablePois, predicate1, mob.blockPosition(), 48, 48*48, PoiManager.Occupancy.HAS_SPACE, false, 5, poiposes); ++ io.papermc.paper.util.PoiAccess.findNearestPoiPositions(poiManager, acquirablePois, predicate1, mob.blockPosition(), level.purpurConfig.villagerAcquirePoiSearchRadius, level.purpurConfig.villagerAcquirePoiSearchRadius*level.purpurConfig.villagerAcquirePoiSearchRadius, PoiManager.Occupancy.HAS_SPACE, false, 5, poiposes); // Purpur - Configurable villager search radius + final Set, BlockPos>> set = new java.util.HashSet<>(poiposes.size()); + for (final Pair, BlockPos> poiPose : poiposes) { + if (predicate.test(level, poiPose.getSecond())) { diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/ai/sensing/NearestBedSensor.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/ai/sensing/NearestBedSensor.java.patch index 5d0923750..7e2366a32 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/ai/sensing/NearestBedSensor.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/ai/sensing/NearestBedSensor.java.patch @@ -1,14 +1,11 @@ --- a/net/minecraft/world/entity/ai/sensing/NearestBedSensor.java +++ b/net/minecraft/world/entity/ai/sensing/NearestBedSensor.java -@@ -54,9 +_,9 @@ - } - }; - Set, BlockPos>> set = poiManager.findAllWithType( -- holder -> holder.is(PoiTypes.HOME), predicate, entity.blockPosition(), 48, PoiManager.Occupancy.ANY -+ holder -> holder.is(PoiTypes.HOME), predicate, entity.blockPosition(), level.purpurConfig.villagerNearestBedSensorSearchRadius, PoiManager.Occupancy.ANY - ) -- .collect(Collectors.toSet()); -+ .collect(Collectors.toSet()); // Purpur - Configurable villager search radius - Path path = AcquirePoi.findPathToPois(entity, set); +@@ -56,7 +_,7 @@ + // Paper start - optimise POI access + java.util.List, BlockPos>> poiposes = new java.util.ArrayList<>(); + // don't ask me why it's unbounded. ask mojang. +- io.papermc.paper.util.PoiAccess.findAnyPoiPositions(poiManager, type -> type.is(PoiTypes.HOME), predicate, entity.blockPosition(), 48, PoiManager.Occupancy.ANY, false, Integer.MAX_VALUE, poiposes); ++ io.papermc.paper.util.PoiAccess.findAnyPoiPositions(poiManager, type -> type.is(PoiTypes.HOME), predicate, entity.blockPosition(), level.purpurConfig.villagerNearestBedSensorSearchRadius, PoiManager.Occupancy.ANY, false, Integer.MAX_VALUE, poiposes); // Purpur - Configurable villager search radius + Path path = AcquirePoi.findPathToPois(entity, new java.util.HashSet<>(poiposes)); + // Paper end - optimise POI access if (path != null && path.canReach()) { - BlockPos target = path.getTarget(); diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/item/ItemStack.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/item/ItemStack.java.patch index b076f46e7..c2ee158cb 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/item/ItemStack.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/item/ItemStack.java.patch @@ -43,7 +43,7 @@ public int getDamageValue() { return Mth.clamp(this.getOrDefault(DataComponents.DAMAGE, 0), 0, this.getMaxDamage()); } -@@ -1203,6 +_,12 @@ +@@ -1209,6 +_,12 @@ public boolean isEnchanted() { return !this.getOrDefault(DataComponents.ENCHANTMENTS, ItemEnchantments.EMPTY).isEmpty(); } diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/item/crafting/Ingredient.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/item/crafting/Ingredient.java.patch index 5c451611e..fcee0a726 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/item/crafting/Ingredient.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/item/crafting/Ingredient.java.patch @@ -3,13 +3,13 @@ @@ -36,6 +_,7 @@ // CraftBukkit start @javax.annotation.Nullable - private java.util.List itemStacks; + private java.util.Set itemStacks; // Paper - Improve exact choice recipe ingredients + public Predicate predicate; // Purpur - Add predicate to recipe's ExactChoice ingredient public boolean isExact() { return this.itemStacks != null; -@@ -90,6 +_,11 @@ - return false; +@@ -88,6 +_,11 @@ + return this.itemStacks.contains(stack); // Paper - Improve exact choice recipe ingredients (hashing FTW!) } // CraftBukkit end + // Purpur start - Add predicate to recipe's ExactChoice ingredient diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/level/EntityGetter.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/level/EntityGetter.java.patch index e1a0fd757..73e6f74b1 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/level/EntityGetter.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/level/EntityGetter.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/level/EntityGetter.java +++ b/net/minecraft/world/level/EntityGetter.java -@@ -144,7 +_,7 @@ +@@ -185,7 +_,7 @@ default boolean hasNearbyAlivePlayer(double x, double y, double z, double distance) { for (Player player : this.players()) { diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/level/Level.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/level/Level.java.patch index 3ff14c768..eddf86fda 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/level/Level.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/level/Level.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/level/Level.java +++ b/net/minecraft/world/level/Level.java -@@ -159,11 +_,55 @@ +@@ -160,11 +_,55 @@ } // Paper end - add paper world config @@ -56,8 +56,8 @@ public CraftWorld getWorld() { return this.world; } -@@ -207,6 +_,8 @@ - ) { +@@ -840,6 +_,8 @@ + // Paper end - getblock optimisations - cache world height/sections this.spigotConfig = new org.spigotmc.SpigotWorldConfig(((net.minecraft.world.level.storage.PrimaryLevelData) levelData).getLevelName()); // Spigot this.paperConfig = paperWorldConfigCreator.apply(this.spigotConfig); // Paper - create paper world config + this.purpurConfig = new org.purpurmc.purpur.PurpurWorldConfig(((net.minecraft.world.level.storage.PrimaryLevelData) levelData).getLevelName(), environment); // Purpur - Purpur config files @@ -65,7 +65,7 @@ this.generator = generator; this.world = new CraftWorld((ServerLevel) this, generator, biomeProvider, environment); -@@ -1417,4 +_,14 @@ +@@ -2131,4 +_,14 @@ return this.id; } } diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/level/NaturalSpawner.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/level/NaturalSpawner.java.patch index 67708c82c..6ce413c7d 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/level/NaturalSpawner.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/level/NaturalSpawner.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/level/NaturalSpawner.java +++ b/net/minecraft/world/level/NaturalSpawner.java -@@ -206,7 +_,7 @@ +@@ -261,7 +_,7 @@ mutableBlockPos.set(x, y, z); double d = x + 0.5; double d1 = z + 0.5; diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/level/ServerExplosion.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/level/ServerExplosion.java.patch index f4e8e281f..a112829db 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/level/ServerExplosion.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/level/ServerExplosion.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/level/ServerExplosion.java +++ b/net/minecraft/world/level/ServerExplosion.java -@@ -73,7 +_,7 @@ +@@ -316,7 +_,7 @@ ) { this.level = level; this.source = source; @@ -9,7 +9,7 @@ this.center = center; this.fire = fire; this.blockInteraction = blockInteraction; -@@ -356,10 +_,27 @@ +@@ -638,7 +_,7 @@ public void explode() { // CraftBukkit start @@ -18,6 +18,10 @@ return; } // CraftBukkit end +@@ -650,6 +_,23 @@ + this.directMappedBlockCache = new ca.spottedleaf.moonrise.patches.collisions.ExplosionBlockCache[BLOCK_EXPLOSION_CACHE_WIDTH * BLOCK_EXPLOSION_CACHE_WIDTH * BLOCK_EXPLOSION_CACHE_WIDTH]; + this.mutablePos = new BlockPos.MutableBlockPos(); + // Paper end - collision optimisations + // Purpur start - add PreExplodeEvents + if (this.source != null) { + Location location = new Location(this.level.getWorld(), this.center.x, this.center.y, this.center.z); diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/entity/BlockEntity.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/entity/BlockEntity.java.patch index d33824d55..8abc6fa2c 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/entity/BlockEntity.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/entity/BlockEntity.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/level/block/entity/BlockEntity.java +++ b/net/minecraft/world/level/block/entity/BlockEntity.java -@@ -104,6 +_,10 @@ +@@ -105,6 +_,10 @@ input.read("PublicBukkitValues", CompoundTag.CODEC) .ifPresent(this.persistentDataContainer::putAll); // Paper end - read persistent data container @@ -11,7 +11,7 @@ } public final void loadWithComponents(ValueInput input) { -@@ -116,6 +_,11 @@ +@@ -117,6 +_,11 @@ } protected void saveAdditional(ValueOutput output) { @@ -23,7 +23,7 @@ } public final CompoundTag saveWithFullMetadata(HolderLookup.Provider registries) { -@@ -400,4 +_,17 @@ +@@ -402,4 +_,17 @@ return this.blockEntity.getNameForReporting() + "@" + this.blockEntity.getBlockPos(); } } diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/entity/ConduitBlockEntity.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/entity/ConduitBlockEntity.java.patch index 553410e9a..a337495d8 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/entity/ConduitBlockEntity.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/entity/ConduitBlockEntity.java.patch @@ -30,8 +30,8 @@ EntityReference entityReference = updateDestroyTarget(blockEntity.destroyTarget, level, pos, canDestroy); LivingEntity livingEntity = EntityReference.get(entityReference, level, LivingEntity.class); if (damageTarget && livingEntity != null) { // CraftBukkit -- if (livingEntity.hurtServer(level, level.damageSources().magic(), 4.0F)) // CraftBukkit - move up -+ if (livingEntity.hurtServer(level, level.damageSources().magic(), level.purpurConfig.conduitDamageAmount)) // CraftBukkit - move up // Purpur - Conduit behavior configuration +- if (livingEntity.hurtServer(level, level.damageSources().magic().eventBlockDamager(level, pos), 4.0F)) // CraftBukkit - move up ++ if (livingEntity.hurtServer(level, level.damageSources().magic().eventBlockDamager(level, pos), level.purpurConfig.conduitDamageAmount)) // CraftBukkit - move up // Purpur - Conduit behavior configuration level.playSound( null, livingEntity.getX(), livingEntity.getY(), livingEntity.getZ(), SoundEvents.CONDUIT_ATTACK_TARGET, SoundSource.BLOCKS, 1.0F, 1.0F ); diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/level/chunk/storage/EntityStorage.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/level/chunk/storage/EntityStorage.java.patch index 3a1098066..accc2318d 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/level/chunk/storage/EntityStorage.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/level/chunk/storage/EntityStorage.java.patch @@ -1,8 +1,8 @@ --- a/net/minecraft/world/level/chunk/storage/EntityStorage.java +++ b/net/minecraft/world/level/chunk/storage/EntityStorage.java -@@ -97,6 +_,7 @@ - ListTag listTag = new ListTag(); - entities.getEntities().forEach(entity -> { +@@ -108,6 +_,7 @@ + } + // Paper end - Entity load/save limit per chunk TagValueOutput tagValueOutput = TagValueOutput.createWithContext(scopedCollector.forChild(entity.problemPath()), entity.registryAccess()); + if (!entity.canSaveToDisk()) return; // Purpur - Add canSaveToDisk to Entity if (entity.save(tagValueOutput)) { diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/level/chunk/storage/RegionFileStorage.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/level/chunk/storage/RegionFileStorage.java.patch index f9e571450..8f5ddb2d7 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/level/chunk/storage/RegionFileStorage.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/level/chunk/storage/RegionFileStorage.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/level/chunk/storage/RegionFileStorage.java +++ b/net/minecraft/world/level/chunk/storage/RegionFileStorage.java -@@ -49,7 +_,7 @@ +@@ -308,7 +_,7 @@ // Paper start private static void printOversizedLog(String msg, Path file, int x, int z) { diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/level/material/FlowingFluid.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/level/material/FlowingFluid.java.patch index a2b76868b..78e131bae 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/level/material/FlowingFluid.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/level/material/FlowingFluid.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/level/material/FlowingFluid.java +++ b/net/minecraft/world/level/material/FlowingFluid.java -@@ -190,7 +_,7 @@ +@@ -232,7 +_,7 @@ } } @@ -9,7 +9,7 @@ BlockState blockState1 = level.getBlockState(mutableBlockPos.setWithOffset(pos, Direction.DOWN)); FluidState fluidState1 = blockState1.getFluidState(); if (blockState1.isSolid() || this.isSourceBlockOfThisType(fluidState1)) { -@@ -267,6 +_,12 @@ +@@ -319,6 +_,12 @@ } protected abstract boolean canConvertToSource(ServerLevel level); diff --git a/purpur-server/paper-patches/features/0002-Ridables.patch b/purpur-server/paper-patches/features/0002-Ridables.patch index 3ad719453..5022ad19b 100644 --- a/purpur-server/paper-patches/features/0002-Ridables.patch +++ b/purpur-server/paper-patches/features/0002-Ridables.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Ridables diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java -index f70cf786578b1467ec1e02ecea4844dca4277614..041fc1d4182834bda5de9b2172601a2a59b5514b 100644 +index 5fcfbb42c4491ee0878c87bd1724b9bfab57c128..7aaeafd5ee030d032d6e0574fc991942fac5eaa7 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java -@@ -1325,4 +1325,26 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity { +@@ -1348,4 +1348,26 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity { return this.entity.get(io.papermc.paper.datacomponent.PaperDataComponentType.bukkitToMinecraft(type)) != null; } @@ -36,7 +36,7 @@ index f70cf786578b1467ec1e02ecea4844dca4277614..041fc1d4182834bda5de9b2172601a2a + // Purpur end - Ridables } diff --git a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java -index 574f982a29e8a8ccdbedf65432a1d78928a4b807..e04b7e7d4d3e6e5edba7dbc72b4458174025024c 100644 +index 5ceb08265f883e6634f3f4189c74aa8395addd12..5d64ce696db99f4cefe2c74357b400e00a4ccf60 100644 --- a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java +++ b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java @@ -515,6 +515,15 @@ public class CraftEventFactory { diff --git a/purpur-server/paper-patches/features/0004-Add-EntityTeleportHinderedEvent.patch b/purpur-server/paper-patches/features/0004-Add-EntityTeleportHinderedEvent.patch index 7cae4c665..01db886a8 100644 --- a/purpur-server/paper-patches/features/0004-Add-EntityTeleportHinderedEvent.patch +++ b/purpur-server/paper-patches/features/0004-Add-EntityTeleportHinderedEvent.patch @@ -17,10 +17,10 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java -index 771bd838bdda98f0cb626e58be893ee82140f81e..1e153eb974be9d1fde9d3a0ad2d8fbd2c3c44803 100644 +index 7aaeafd5ee030d032d6e0574fc991942fac5eaa7..df23fbae231eca494131bf7ec78924669cd5e03d 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java -@@ -304,6 +304,7 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity { +@@ -309,6 +309,7 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity { boolean retainPassengers = flagSet.contains(io.papermc.paper.entity.TeleportFlag.EntityState.RETAIN_PASSENGERS); // Don't allow teleporting between worlds while keeping passengers if (flagSet.contains(io.papermc.paper.entity.TeleportFlag.EntityState.RETAIN_PASSENGERS) && this.entity.isVehicle() && location.getWorld() != this.getWorld()) { @@ -29,7 +29,7 @@ index 771bd838bdda98f0cb626e58be893ee82140f81e..1e153eb974be9d1fde9d3a0ad2d8fbd2 } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -index e48849bff8e64a16f04d75ad3f0ff769ef3a813e..0d303c3c614142b4183e76f9347e613d7e6db211 100644 +index 91f56fffbced0599d77d39c6d1d8de78b960e58c..213afcae6bb02e4e340d5fa477bdddbb9434fc70 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java @@ -1439,6 +1439,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { diff --git a/purpur-server/paper-patches/features/0005-API-for-any-mob-to-burn-daylight.patch b/purpur-server/paper-patches/features/0005-API-for-any-mob-to-burn-daylight.patch index 53c52637b..f9b172eb8 100644 --- a/purpur-server/paper-patches/features/0005-API-for-any-mob-to-burn-daylight.patch +++ b/purpur-server/paper-patches/features/0005-API-for-any-mob-to-burn-daylight.patch @@ -6,10 +6,10 @@ Subject: [PATCH] API for any mob to burn daylight Co-authored by: Encode42 diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java -index 1e153eb974be9d1fde9d3a0ad2d8fbd2c3c44803..86a9adcb98281396b7447aac20b87cb8c15557dd 100644 +index df23fbae231eca494131bf7ec78924669cd5e03d..834389b78d9342e96b3473c9cb6e40ca6cd4e46f 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java -@@ -115,6 +115,13 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity { +@@ -120,6 +120,13 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity { } // Purpur end - Fire Immunity API diff --git a/purpur-server/paper-patches/files/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java.patch b/purpur-server/paper-patches/files/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java.patch index cf2bfbfcc..ad9c0dbd1 100644 --- a/purpur-server/paper-patches/files/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java.patch +++ b/purpur-server/paper-patches/files/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java.patch @@ -1,6 +1,6 @@ --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java -@@ -103,6 +_,18 @@ +@@ -108,6 +_,18 @@ this.entityType = CraftEntityType.minecraftToBukkit(entity.getType()); } diff --git a/purpur-server/paper-patches/files/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java.patch b/purpur-server/paper-patches/files/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java.patch index 91deafef7..32ef5cc86 100644 --- a/purpur-server/paper-patches/files/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java.patch +++ b/purpur-server/paper-patches/files/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java.patch @@ -1,6 +1,6 @@ --- a/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java +++ b/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java -@@ -487,7 +_,7 @@ +@@ -491,7 +_,7 @@ @Override public com.destroystokyo.paper.util.VersionFetcher getVersionFetcher() { diff --git a/purpur-server/paper-patches/files/src/main/java/org/spigotmc/WatchdogThread.java.patch b/purpur-server/paper-patches/files/src/main/java/org/spigotmc/WatchdogThread.java.patch index 1d6ab6004..7dc409927 100644 --- a/purpur-server/paper-patches/files/src/main/java/org/spigotmc/WatchdogThread.java.patch +++ b/purpur-server/paper-patches/files/src/main/java/org/spigotmc/WatchdogThread.java.patch @@ -38,9 +38,9 @@ // Paper end - Different message for short timeout logger.log(Level.SEVERE, "------------------------------"); - logger.log(Level.SEVERE, "Server thread dump (Look for plugins here before reporting to Paper!):"); // Paper -+ logger.log(Level.SEVERE, "Server thread dump (Look for plugins here before reporting to Purpur!):" ); // Paper // Purpur - Rebrand ++ logger.log(Level.SEVERE, "Server thread dump (Look for plugins here before reporting to Purpur!):"); // Paper // Purpur - Rebrand FeatureHooks.dumpAllChunkLoadInfo(MinecraftServer.getServer(), isLongTimeout); // Paper - log detailed tick information - WatchdogThread.dumpThread(ManagementFactory.getThreadMXBean().getThreadInfo(MinecraftServer.getServer().serverThread.getId(), Integer.MAX_VALUE), logger); + WatchdogThread.dumpThread(ManagementFactory.getThreadMXBean().getThreadInfo(MinecraftServer.getServer().serverThread.threadId(), Integer.MAX_VALUE), logger); logger.log(Level.SEVERE, "------------------------------"); @@ -120,7 +_,7 @@ WatchdogThread.dumpThread(thread, logger);