From 8bffdef31755beff515f96cf66de228880e76cc4 Mon Sep 17 00:00:00 2001 From: Dreeam <61569423+Dreeam-qwq@users.noreply.github.com> Date: Mon, 29 Sep 2025 14:23:25 -0400 Subject: [PATCH] More patches Shallou - Habitat Genre: Progressive House (maybe) --- gradle.properties | 2 +- .../0056-Faster-chunk-serialization.patch | 0 ...yer-in-world-if-kicked-before-being-.patch | 0 .../mcserver}/0106-Leaves-Protocol-Core.patch | 0 .../mcserver}/0107-Leaves-Jade-Protocol.patch | 0 .../0108-Leaves-Xaero-Map-Protocol.patch | 0 .../0109-Leaves-Syncmatica-Protocol.patch | 0 .../0110-Leaves-Replay-Mod-API.patch | 0 ...Configurable-player-knockback-zombie.patch | 0 ...-during-inactive-ticks-for-non-aware.patch | 0 ...-zombie-reinforcements-loading-chunk.patch | 0 ...aper-PR-Fix-some-beacon-event-issues.patch | 0 ...164-Dont-send-useless-entity-packets.patch | 0 .../0165-Multithreaded-Tracker.patch | 0 .../0166-Nitori-Async-playerdata-saving.patch | 0 ...ze-nearby-alive-players-for-spawning.patch | 0 .../0168-Cache-blockstate-cache-array.patch | 0 ...duce-memory-footprint-of-CompoundTag.patch | 0 .../0170-Optimize-Entity-distanceToSqr.patch | 0 ...se-snapshots-for-TileEntity-getOwner.patch | 0 .../0172-Cache-tile-entity-position.patch | 0 .../0173-TT20-Lag-compensation.patch | 0 .../0174-C2ME-Reduce-Allocations.patch | 0 ...ecessary-calculations-if-player-is-n.patch | 0 .../mcserver}/0176-Lithium-fast-util.patch | 0 ...0177-Lithium-cached-iterate-outwards.patch | 0 ...hread-safe-ban-list-date-format-pars.patch | 0 .../0179-C2ME-Optimize-world-gen-math.patch | 0 .../mcserver}/0180-Cache-chunk-key.patch | 0 ...81-Cache-part-of-canHoldFluid-result.patch | 0 .../0182-Configurable-tripwire-dupe.patch | 0 ...117075-Block-Entities-Unload-Lag-Spi.patch | 0 ...-Rearrange-the-attackable-conditions.patch | 0 ...p-dirty-stats-copy-when-requesting-p.patch | 0 ...et-dirty-flag-when-loading-maps-from.patch | 0 ...checking-nearby-players-for-spawning.patch | 0 ...que-clear-on-LevelTicks-cleanupAfter.patch | 0 .../0189-Remove-stream-in-villagers.patch | 0 .../0190-Optimize-baby-villager-sensor.patch | 0 .../mcserver}/0191-Only-player-pushable.patch | 0 ...0192-Remove-iterators-from-Inventory.patch | 0 .../mcserver}/0193-optimize-mob-despawn.patch | 0 ...4-Slightly-optimise-getNearestPlayer.patch | 0 ...-writeLongArray-during-chunk-loading.patch | 0 ...96-Improve-sorting-in-SortedArraySet.patch | 0 .../0197-Make-removeIf-slightly-faster.patch | 0 .../0198-Optimize-LinearPalette.patch | 0 ...ite-ClientboundLightUpdatePacketData.patch | 0 .../mcserver}/0200-Async-chunk-sending.patch | 0 .../0201-Spawner-Configurations.patch | 0 ...-SparklyPaper-Parallel-world-ticking.patch | 0 ...3-SparklyPaper-Track-each-world-MSPT.patch | 0 ...celled-Projectile-Events-still-consu.patch | 0 ...AndInteract-and-NearestVisibleLiving.patch | 0 .../0206-rewrite-InsideBrownianWalk.patch | 0 .../0207-Use-BFS-on-getSlopeDistance.patch | 0 ...er-PR-Throttle-failed-spawn-attempts.patch | 0 ...-BlockEntity-ticking-isRemoved-check.patch | 0 ...10-Raytrace-AntiXray-SDK-integration.patch | 0 .../0211-Optimize-ContextMap.create.patch | 0 ...-Micro-optimizations-for-random-tick.patch | 0 ...on-updateConnectedPlayersWithinRange.patch | 0 ...214-Remove-streams-on-PlayerDetector.patch | 0 ...Use-direct-iteration-on-Sensing.tick.patch | 0 ...16-Optimise-non-flush-packet-sending.patch | 0 ...hunk-retrieving-in-entity-fluid-push.patch | 0 ...8-Null-handling-on-MultifaceSpreader.patch | 0 .../mcserver}/0219-More-virtual-threads.patch | 0 ...timize-ThreadedTicketLevelPropagator.patch | 0 ...bEffectUtil-getDigSpeedAmplification.patch | 0 .../0222-Optimise-chunkUnloads.patch | 0 ...223-Optimize-BlockEntityType-isValid.patch | 0 ...ket-on-player-join-to-avoid-chunk-lo.patch | 0 ...check-inside-blocks-and-traverse-blo.patch | 0 ...tyList-implementation-to-BasicEntity.patch | 0 .../mcserver}/0227-Protocol-Core.patch | 0 .../0228-Async-switch-connection-state.patch | 0 ...ptimize-BlockEntities-tickersInLevel.patch | 0 ...he-cactus-can-even-survive-being-pla.patch | 0 .../0231-Flush-location-while-knockback.patch | 0 .../0232-Only-tick-items-at-hand.patch | 0 ...0233-Optimise-player-movement-checks.patch | 0 .../0234-Remove-streams-in-MobSensor.patch | 0 ...235-Remove-streams-in-TemptingSensor.patch | 0 ...e-death-item-drop-knockback-settings.patch | 0 ...7-Optimize-getScaledTrackingDistance.patch | 0 ...Optimize-SynchedEntityData-packDirty.patch | 0 .../0239-Optimize-isEyeInFluid.patch | 0 .../0240-Cache-block-state-tags.patch | 0 .../0241-optimize-getEntityStatus.patch | 0 ...ion-optimized-PoweredRailBlock-logic.patch | 0 ...43-optimise-ChunkGenerator-getMobsAt.patch | 0 .../mcserver}/0244-cache-getBiome.patch | 0 .../0245-optimize-mob-spawning.patch | 0 .../0246-optimize-structure-map.patch | 0 .../0247-throttle-mob-spawning.patch | 0 .../0248-Add-BlockExplosionHitEvent.patch | 0 ...Blast-Protection-explosion-knockback.patch | 0 .../0250-Use-UUID-for-cure-reputation.patch | 0 ...ring-parsing-unknown-command-message.patch | 0 .../mcserver}/0252-optimize-random-tick.patch | 0 ...invalid-flatten-text-component-parse.patch | 0 ...4-Fast-BiomeManager-seed-obfuscation.patch | 0 ...lectorOptions-map-with-optimized-col.patch | 0 .../0256-optimize-no-action-time.patch | 0 .../mcserver}/0257-optimize-waypoint.patch | 0 .../mcserver}/0258-Paw-optimization.patch | 0 ...fig-fixClimbingBypassingCrammingRule.patch | 0 ...260-Skip-inactive-entity-for-execute.patch | 0 .../mcserver}/0261-Optimise-getEntities.patch | 0 .../mcserver}/0262-fix-MC-298464.patch | 0 ...estHomeAsWalkTarget-s-poi-finding-to.patch | 0 ...264-optimize-checkInsideBlocks-calls.patch | 0 .../mcserver}/0265-Optimise-TextColor.patch | 0 ...eate-fire-if-explosion-was-cancelled.patch | 0 ...ip-BlockPhysicsEvent-if-no-listeners.patch | 0 .../0268-Lithium-equipment-tracking.patch | 0 ...0269-fix-purpur-attribute-base-patch.patch | 0 .../mcserver}/0270-Bump-netty-to-4.2.x.patch | 0 ...Paper-PR-Optimise-temptation-lookups.patch | 0 .../0272-fix-temptation-lookups.patch | 0 ...73-Lithium-combined-heightmap-update.patch | 0 ...reCreatureSpawnEvent-if-no-listeners.patch | 0 .../0275-optimize-goal-selector.patch | 0 .../0276-thread-unsafe-chunk-map.patch | 0 ...imize-SimpleBitStorage-object-layout.patch | 0 .../mcserver}/0278-optimize-get-chunk.patch | 0 ...0279-remove-shouldTickBlocksAt-check.patch | 0 .../0280-optimize-PalettedContainer-get.patch | 0 ...timize-LevelChunk-getBlockStateFinal.patch | 0 .../0282-optimize-FluidState-is-TagKey.patch | 0 .../0283-counting-chunk-section-fluid.patch | 0 ...e-SpreadingSnowyDirtBlock-randomTick.patch | 0 .../mcserver}/0285-optimize-onClimbable.patch | 0 ...ze-applyMovementEmissionAndPlaySound.patch | 0 .../0287-optimize-isStateClimbable.patch | 0 .../mcserver}/0288-optimize-getOnPos.patch | 0 .../0289-cache-eye-block-position.patch | 0 ...e-updateFluidHeightAndDoFluidPushing.patch | 0 .../0291-optimize-checkInsideBlocks.patch | 0 ...0292-replace-entity-fluid-height-map.patch | 0 .../0293-optimize-collision-shape.patch | 0 .../mcserver}/0294-cache-collision-list.patch | 0 .../mcserver}/0295-fast-bit-radix-sort.patch | 0 .../mcserver}/0296-optimize-tickEffects.patch | 0 ...Pluto-Expose-Direction-Plane-s-faces.patch | 0 .../0298-Pluto-reduce-allocation.patch | 0 ...-Only-update-frozen-ticks-if-changed.patch | 0 ...-entity-mountedOrDismounted-changes-.patch | 0 ...t-place-player-if-the-server-is-full.patch | 0 .../0005-Remove-vanilla-profiler.patch | 18 +- .../0015-Cache-on-climbable-check.patch | 4 +- .../features/0022-Reduce-in-wall-checks.patch | 6 +- .../0045-Reduce-array-allocations.patch | 6 +- ...ck-frozen-ticks-before-landing-block.patch | 6 +- ...chunks-to-activate-climbing-entities.patch | 6 +- ...mStack-lookups-for-reduced-visibilit.patch | 4 +- ...090-Purpur-Server-Minecraft-Changes.patch} | 1558 +++++++++-------- ...1-Fix-Pufferfish-and-Purpur-patches.patch} | 139 +- ...Purpur-Configurable-server-mod-name.patch} | 4 +- ...> 0093-Configurable-server-GUI-name.patch} | 0 ... 0094-Remove-vanilla-username-check.patch} | 26 +- ...ck-for-broken-BungeeCord-configurat.patch} | 0 ...emove-UseItemOnPacket-Too-Far-check.patch} | 4 +- ...ve-change-non-editable-sign-warning.patch} | 6 +- ...n-for-spigot-item-merging-mechanism.patch} | 4 +- ...pet-Fixes-Optimized-getBiome-method.patch} | 0 ...t-Fixes-Use-optimized-RecipeManager.patch} | 0 ...karin-Save-Json-list-asynchronously.patch} | 4 +- ...atch => 0102-Slice-Smooth-Teleports.patch} | 16 +- ...chment-Make-FixLight-use-action-bar.patch} | 0 ...tch => 0104-Petal-Async-Pathfinding.patch} | 134 +- ...duce-work-done-by-game-event-system.patch} | 30 +- ...rk.patch => 0106-Reduce-canSee-work.patch} | 4 +- ...tch.patch => 0107-Fix-sprint-glitch.patch} | 4 +- ...ble-movement-speed-of-more-entities.patch} | 18 +- ...-of-futures-for-chunk-structure-gen.patch} | 6 +- ...e-items-finding-hopper-nearby-check.patch} | 4 +- ...e-missing-Pufferfish-configurations.patch} | 52 +- ...issing-purpur-configuration-options.patch} | 62 +- ...-distanceToSqr-call-in-ServerEntity.patch} | 8 +- ...-MapItem-update-if-the-map-does-not.patch} | 2 +- ...SparklyPaper-Optimize-canSee-checks.patch} | 4 +- ...w-throttling-hopper-checks-if-the-t.patch} | 4 +- ...g-and-snowball-can-knockback-player.patch} | 4 +- ...getProfiler-to-inactive-in-PathNavi.patch} | 0 ...eating-stats-json-bases-on-player-n.patch} | 6 +- ...h => 0120-Improve-Purpur-AFK-system.patch} | 46 +- ...21-Virtual-thread-for-chat-executor.patch} | 4 +- ...rtual-thread-for-user-authenticator.patch} | 4 +- ...onfigurable-chat-message-signatures.patch} | 28 +- ...ed.patch => 0124-Matter-Secure-Seed.patch} | 75 +- ... => 0125-Matter-Secure-Seed-command.patch} | 0 ...tch => 0126-Faster-random-generator.patch} | 86 +- ...> 0127-Don-t-save-primed-tnt-entity.patch} | 2 +- ...128-Don-t-save-falling-block-entity.patch} | 4 +- ...129-Configurable-connection-message.patch} | 44 +- ...onfigurable-unknown-command-message.patch} | 6 +- ...-in-BlockBehaviour-cache-blockstate.patch} | 4 +- ...am-in-entity-visible-effects-filter.patch} | 4 +- ...-double-iteration-in-enough-deep-sl.patch} | 0 ...ove-stream-in-trial-spawner-ticking.patch} | 0 ...atch => 0135-Remove-stream-in-Brain.patch} | 2 +- ...0136-Remove-stream-in-BehaviorUtils.patch} | 0 ... 0137-Remove-stream-in-YieldJobSite.patch} | 25 +- ... 0138-Remove-stream-in-PlayerSensor.patch} | 0 ...> 0139-Remove-stream-in-GolemSensor.patch} | 0 ... 0140-Remove-stream-in-GateBehavior.patch} | 0 ... 0141-Remove-stream-in-matchingSlot.patch} | 0 ...tive-effects-map-with-optimized-col.patch} | 6 +- ...erion-map-with-optimized-collection.patch} | 2 +- ...ace-brain-with-optimized-collection.patch} | 2 +- ...=> 0145-Reduce-worldgen-allocations.patch} | 4 +- ...e-for-kickPermission-instead-of-usi.patch} | 22 +- ...MC-65198.patch => 0147-Fix-MC-65198.patch} | 0 ...-200418.patch => 0148-Fix-MC-200418.patch} | 4 +- ...-119417.patch => 0149-Fix-MC-119417.patch} | 4 +- ...-223153.patch => 0150-Fix-MC-223153.patch} | 4 +- scripts/upstreamCommit.sh | 2 +- 219 files changed, 1255 insertions(+), 1284 deletions(-) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0056-Faster-chunk-serialization.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0076-Do-not-place-player-in-world-if-kicked-before-being-.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0106-Leaves-Protocol-Core.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0107-Leaves-Jade-Protocol.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0108-Leaves-Xaero-Map-Protocol.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0109-Leaves-Syncmatica-Protocol.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0110-Leaves-Replay-Mod-API.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0160-Configurable-player-knockback-zombie.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0161-Paper-PR-Skip-AI-during-inactive-ticks-for-non-aware.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0162-Paper-PR-Prevent-zombie-reinforcements-loading-chunk.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0163-Paper-PR-Fix-some-beacon-event-issues.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0164-Dont-send-useless-entity-packets.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0165-Multithreaded-Tracker.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0166-Nitori-Async-playerdata-saving.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0167-Optimize-nearby-alive-players-for-spawning.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0168-Cache-blockstate-cache-array.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0169-Further-reduce-memory-footprint-of-CompoundTag.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0170-Optimize-Entity-distanceToSqr.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0171-EMC-Don-t-use-snapshots-for-TileEntity-getOwner.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0172-Cache-tile-entity-position.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0173-TT20-Lag-compensation.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0174-C2ME-Reduce-Allocations.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0175-Lithium-Skip-unnecessary-calculations-if-player-is-n.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0176-Lithium-fast-util.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0177-Lithium-cached-iterate-outwards.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0178-Use-faster-and-thread-safe-ban-list-date-format-pars.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0179-C2ME-Optimize-world-gen-math.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0180-Cache-chunk-key.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0181-Cache-part-of-canHoldFluid-result.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0182-Configurable-tripwire-dupe.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0183-Paper-PR-Fix-MC-117075-Block-Entities-Unload-Lag-Spi.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0184-Sepals-Rearrange-the-attackable-conditions.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0185-SparklyPaper-Skip-dirty-stats-copy-when-requesting-p.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0186-SparklyPaper-Reset-dirty-flag-when-loading-maps-from.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0187-Optimize-checking-nearby-players-for-spawning.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0188-Avoid-useless-deque-clear-on-LevelTicks-cleanupAfter.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0189-Remove-stream-in-villagers.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0190-Optimize-baby-villager-sensor.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0191-Only-player-pushable.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0192-Remove-iterators-from-Inventory.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0193-optimize-mob-despawn.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0194-Slightly-optimise-getNearestPlayer.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0195-Bulk-writes-to-writeLongArray-during-chunk-loading.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0196-Improve-sorting-in-SortedArraySet.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0197-Make-removeIf-slightly-faster.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0198-Optimize-LinearPalette.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0199-Rewrite-ClientboundLightUpdatePacketData.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0200-Async-chunk-sending.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0201-Spawner-Configurations.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0202-SparklyPaper-Parallel-world-ticking.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0203-SparklyPaper-Track-each-world-MSPT.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0204-Paper-PR-Fix-cancelled-Projectile-Events-still-consu.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0205-Optimize-SetLookAndInteract-and-NearestVisibleLiving.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0206-rewrite-InsideBrownianWalk.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0207-Use-BFS-on-getSlopeDistance.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0208-Paper-PR-Throttle-failed-spawn-attempts.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0209-Improve-BlockEntity-ticking-isRemoved-check.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0210-Raytrace-AntiXray-SDK-integration.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0211-Optimize-ContextMap.create.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0212-Micro-optimizations-for-random-tick.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0213-Remove-streams-on-updateConnectedPlayersWithinRange.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0214-Remove-streams-on-PlayerDetector.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0215-Use-direct-iteration-on-Sensing.tick.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0216-Optimise-non-flush-packet-sending.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0217-Prevent-double-chunk-retrieving-in-entity-fluid-push.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0218-Null-handling-on-MultifaceSpreader.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0219-More-virtual-threads.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0220-Optimize-ThreadedTicketLevelPropagator.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0221-Optimise-MobEffectUtil-getDigSpeedAmplification.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0222-Optimise-chunkUnloads.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0223-Optimize-BlockEntityType-isValid.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0224-Paper-PR-Add-ticket-on-player-join-to-avoid-chunk-lo.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0225-Sakura-Optimise-check-inside-blocks-and-traverse-blo.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0226-Sakura-copy-EntityList-implementation-to-BasicEntity.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0227-Protocol-Core.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0228-Async-switch-connection-state.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0229-Optimize-BlockEntities-tickersInLevel.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0230-Pluto-Check-if-the-cactus-can-even-survive-being-pla.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0231-Flush-location-while-knockback.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0232-Only-tick-items-at-hand.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0233-Optimise-player-movement-checks.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0234-Remove-streams-in-MobSensor.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0235-Remove-streams-in-TemptingSensor.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0236-Add-configurable-death-item-drop-knockback-settings.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0237-Optimize-getScaledTrackingDistance.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0238-Optimize-SynchedEntityData-packDirty.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0239-Optimize-isEyeInFluid.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0240-Cache-block-state-tags.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0241-optimize-getEntityStatus.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0242-Rail-Optimization-optimized-PoweredRailBlock-logic.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0243-optimise-ChunkGenerator-getMobsAt.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0244-cache-getBiome.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0245-optimize-mob-spawning.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0246-optimize-structure-map.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0247-throttle-mob-spawning.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0248-Add-BlockExplosionHitEvent.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0249-Old-Blast-Protection-explosion-knockback.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0250-Use-UUID-for-cure-reputation.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0251-Fix-crash-during-parsing-unknown-command-message.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0252-optimize-random-tick.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0253-do-not-log-invalid-flatten-text-component-parse.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0254-Fast-BiomeManager-seed-obfuscation.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0255-Replace-EntitySelectorOptions-map-with-optimized-col.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0256-optimize-no-action-time.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0257-optimize-waypoint.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0258-Paw-optimization.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0259-Fix-Paper-config-fixClimbingBypassingCrammingRule.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0260-Skip-inactive-entity-for-execute.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0261-Optimise-getEntities.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0262-fix-MC-298464.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0263-Re-route-SetClosestHomeAsWalkTarget-s-poi-finding-to.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0264-optimize-checkInsideBlocks-calls.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0265-Optimise-TextColor.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0266-Do-not-create-fire-if-explosion-was-cancelled.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0267-Skip-BlockPhysicsEvent-if-no-listeners.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0268-Lithium-equipment-tracking.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0269-fix-purpur-attribute-base-patch.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0270-Bump-netty-to-4.2.x.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0271-Paper-PR-Optimise-temptation-lookups.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0272-fix-temptation-lookups.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0273-Lithium-combined-heightmap-update.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0274-Skip-PreCreatureSpawnEvent-if-no-listeners.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0275-optimize-goal-selector.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0276-thread-unsafe-chunk-map.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0277-optimize-SimpleBitStorage-object-layout.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0278-optimize-get-chunk.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0279-remove-shouldTickBlocksAt-check.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0280-optimize-PalettedContainer-get.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0281-optimize-LevelChunk-getBlockStateFinal.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0282-optimize-FluidState-is-TagKey.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0283-counting-chunk-section-fluid.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0284-optimize-SpreadingSnowyDirtBlock-randomTick.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0285-optimize-onClimbable.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0286-optimize-applyMovementEmissionAndPlaySound.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0287-optimize-isStateClimbable.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0288-optimize-getOnPos.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0289-cache-eye-block-position.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0290-optimize-updateFluidHeightAndDoFluidPushing.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0291-optimize-checkInsideBlocks.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0292-replace-entity-fluid-height-map.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0293-optimize-collision-shape.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0294-cache-collision-list.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0295-fast-bit-radix-sort.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0296-optimize-tickEffects.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0297-Pluto-Expose-Direction-Plane-s-faces.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0298-Pluto-reduce-allocation.patch (100%) rename {leaf-server/minecraft-patches/features => leaf-archived-patches/unapplied/mcserver}/0299-Only-update-frozen-ticks-if-changed.patch (100%) rename {leaf-server => leaf-archived-patches/work/server}/minecraft-patches/features/0149-Remove-stream-in-entity-mountedOrDismounted-changes-.patch (100%) rename {leaf-server => leaf-archived-patches/work/server}/minecraft-patches/features/0155-Do-not-place-player-if-the-server-is-full.patch (100%) rename leaf-server/minecraft-patches/features/{0092-Purpur-Server-Minecraft-Changes.patch => 0090-Purpur-Server-Minecraft-Changes.patch} (95%) rename leaf-server/minecraft-patches/features/{0093-Fix-Pufferfish-and-Purpur-patches.patch => 0091-Fix-Pufferfish-and-Purpur-patches.patch} (62%) rename leaf-server/minecraft-patches/features/{0094-Purpur-Configurable-server-mod-name.patch => 0092-Purpur-Configurable-server-mod-name.patch} (84%) rename leaf-server/minecraft-patches/features/{0095-Configurable-server-GUI-name.patch => 0093-Configurable-server-GUI-name.patch} (100%) rename leaf-server/minecraft-patches/features/{0096-Remove-vanilla-username-check.patch => 0094-Remove-vanilla-username-check.patch} (65%) rename leaf-server/minecraft-patches/features/{0097-Remove-Spigot-check-for-broken-BungeeCord-configurat.patch => 0095-Remove-Spigot-check-for-broken-BungeeCord-configurat.patch} (100%) rename leaf-server/minecraft-patches/features/{0098-Remove-UseItemOnPacket-Too-Far-check.patch => 0096-Remove-UseItemOnPacket-Too-Far-check.patch} (91%) rename leaf-server/minecraft-patches/features/{0099-Remove-change-non-editable-sign-warning.patch => 0097-Remove-change-non-editable-sign-warning.patch} (82%) rename leaf-server/minecraft-patches/features/{0100-KeYi-Add-an-option-for-spigot-item-merging-mechanism.patch => 0098-KeYi-Add-an-option-for-spigot-item-merging-mechanism.patch} (87%) rename leaf-server/minecraft-patches/features/{0101-Carpet-Fixes-Optimized-getBiome-method.patch => 0099-Carpet-Fixes-Optimized-getBiome-method.patch} (100%) rename leaf-server/minecraft-patches/features/{0102-Carpet-Fixes-Use-optimized-RecipeManager.patch => 0100-Carpet-Fixes-Use-optimized-RecipeManager.patch} (100%) rename leaf-server/minecraft-patches/features/{0103-Akarin-Save-Json-list-asynchronously.patch => 0101-Akarin-Save-Json-list-asynchronously.patch} (89%) rename leaf-server/minecraft-patches/features/{0104-Slice-Smooth-Teleports.patch => 0102-Slice-Smooth-Teleports.patch} (82%) rename leaf-server/minecraft-patches/features/{0105-Parchment-Make-FixLight-use-action-bar.patch => 0103-Parchment-Make-FixLight-use-action-bar.patch} (100%) rename leaf-server/minecraft-patches/features/{0111-Petal-Async-Pathfinding.patch => 0104-Petal-Async-Pathfinding.patch} (92%) rename leaf-server/minecraft-patches/features/{0112-Petal-reduce-work-done-by-game-event-system.patch => 0105-Petal-reduce-work-done-by-game-event-system.patch} (88%) rename leaf-server/minecraft-patches/features/{0113-Reduce-canSee-work.patch => 0106-Reduce-canSee-work.patch} (91%) rename leaf-server/minecraft-patches/features/{0114-Fix-sprint-glitch.patch => 0107-Fix-sprint-glitch.patch} (83%) rename leaf-server/minecraft-patches/features/{0115-Configurable-movement-speed-of-more-entities.patch => 0108-Configurable-movement-speed-of-more-entities.patch} (94%) rename leaf-server/minecraft-patches/features/{0116-Faster-sequencing-of-futures-for-chunk-structure-gen.patch => 0109-Faster-sequencing-of-futures-for-chunk-structure-gen.patch} (95%) rename leaf-server/minecraft-patches/features/{0117-Reduce-active-items-finding-hopper-nearby-check.patch => 0110-Reduce-active-items-finding-hopper-nearby-check.patch} (90%) rename leaf-server/minecraft-patches/features/{0118-Plazma-Add-some-missing-Pufferfish-configurations.patch => 0111-Plazma-Add-some-missing-Pufferfish-configurations.patch} (64%) rename leaf-server/minecraft-patches/features/{0119-Plazma-Add-missing-purpur-configuration-options.patch => 0112-Plazma-Add-missing-purpur-configuration-options.patch} (87%) rename leaf-server/minecraft-patches/features/{0120-SparklyPaper-Skip-distanceToSqr-call-in-ServerEntity.patch => 0113-SparklyPaper-Skip-distanceToSqr-call-in-ServerEntity.patch} (82%) rename leaf-server/minecraft-patches/features/{0121-SparklyPaper-Skip-MapItem-update-if-the-map-does-not.patch => 0114-SparklyPaper-Skip-MapItem-update-if-the-map-does-not.patch} (95%) rename leaf-server/minecraft-patches/features/{0122-SparklyPaper-Optimize-canSee-checks.patch => 0115-SparklyPaper-Optimize-canSee-checks.patch} (93%) rename leaf-server/minecraft-patches/features/{0123-SparklyPaper-Allow-throttling-hopper-checks-if-the-t.patch => 0116-SparklyPaper-Allow-throttling-hopper-checks-if-the-t.patch} (89%) rename leaf-server/minecraft-patches/features/{0124-Polpot-Make-egg-and-snowball-can-knockback-player.patch => 0117-Polpot-Make-egg-and-snowball-can-knockback-player.patch} (93%) rename leaf-server/minecraft-patches/features/{0125-Redirect-vanilla-getProfiler-to-inactive-in-PathNavi.patch => 0118-Redirect-vanilla-getProfiler-to-inactive-in-PathNavi.patch} (100%) rename leaf-server/minecraft-patches/features/{0126-Remove-useless-creating-stats-json-bases-on-player-n.patch => 0119-Remove-useless-creating-stats-json-bases-on-player-n.patch} (85%) rename leaf-server/minecraft-patches/features/{0127-Improve-Purpur-AFK-system.patch => 0120-Improve-Purpur-AFK-system.patch} (85%) rename leaf-server/minecraft-patches/features/{0128-Virtual-thread-for-chat-executor.patch => 0121-Virtual-thread-for-chat-executor.patch} (90%) rename leaf-server/minecraft-patches/features/{0129-Virtual-thread-for-user-authenticator.patch => 0122-Virtual-thread-for-user-authenticator.patch} (91%) rename leaf-server/minecraft-patches/features/{0130-Mirai-Configurable-chat-message-signatures.patch => 0123-Mirai-Configurable-chat-message-signatures.patch} (90%) rename leaf-server/minecraft-patches/features/{0131-Matter-Secure-Seed.patch => 0124-Matter-Secure-Seed.patch} (88%) rename leaf-server/minecraft-patches/features/{0132-Matter-Secure-Seed-command.patch => 0125-Matter-Secure-Seed-command.patch} (100%) rename leaf-server/minecraft-patches/features/{0133-Faster-random-generator.patch => 0126-Faster-random-generator.patch} (86%) rename leaf-server/minecraft-patches/features/{0134-Don-t-save-primed-tnt-entity.patch => 0127-Don-t-save-primed-tnt-entity.patch} (90%) rename leaf-server/minecraft-patches/features/{0135-Don-t-save-falling-block-entity.patch => 0128-Don-t-save-falling-block-entity.patch} (85%) rename leaf-server/minecraft-patches/features/{0136-Configurable-connection-message.patch => 0129-Configurable-connection-message.patch} (65%) rename leaf-server/minecraft-patches/features/{0137-Configurable-unknown-command-message.patch => 0130-Configurable-unknown-command-message.patch} (97%) rename leaf-server/minecraft-patches/features/{0138-Remove-stream-in-BlockBehaviour-cache-blockstate.patch => 0131-Remove-stream-in-BlockBehaviour-cache-blockstate.patch} (90%) rename leaf-server/minecraft-patches/features/{0139-Remove-stream-in-entity-visible-effects-filter.patch => 0132-Remove-stream-in-entity-visible-effects-filter.patch} (89%) rename leaf-server/minecraft-patches/features/{0140-Remove-stream-and-double-iteration-in-enough-deep-sl.patch => 0133-Remove-stream-and-double-iteration-in-enough-deep-sl.patch} (100%) rename leaf-server/minecraft-patches/features/{0141-Remove-stream-in-trial-spawner-ticking.patch => 0134-Remove-stream-in-trial-spawner-ticking.patch} (100%) rename leaf-server/minecraft-patches/features/{0142-Remove-stream-in-Brain.patch => 0135-Remove-stream-in-Brain.patch} (97%) rename leaf-server/minecraft-patches/features/{0143-Remove-stream-in-BehaviorUtils.patch => 0136-Remove-stream-in-BehaviorUtils.patch} (100%) rename leaf-server/minecraft-patches/features/{0144-Remove-stream-in-YieldJobSite.patch => 0137-Remove-stream-in-YieldJobSite.patch} (76%) rename leaf-server/minecraft-patches/features/{0145-Remove-stream-in-PlayerSensor.patch => 0138-Remove-stream-in-PlayerSensor.patch} (100%) rename leaf-server/minecraft-patches/features/{0146-Remove-stream-in-GolemSensor.patch => 0139-Remove-stream-in-GolemSensor.patch} (100%) rename leaf-server/minecraft-patches/features/{0147-Remove-stream-in-GateBehavior.patch => 0140-Remove-stream-in-GateBehavior.patch} (100%) rename leaf-server/minecraft-patches/features/{0148-Remove-stream-in-matchingSlot.patch => 0141-Remove-stream-in-matchingSlot.patch} (100%) rename leaf-server/minecraft-patches/features/{0150-Replace-Entity-active-effects-map-with-optimized-col.patch => 0142-Replace-Entity-active-effects-map-with-optimized-col.patch} (92%) rename leaf-server/minecraft-patches/features/{0151-Replace-criterion-map-with-optimized-collection.patch => 0143-Replace-criterion-map-with-optimized-collection.patch} (93%) rename leaf-server/minecraft-patches/features/{0152-Replace-brain-with-optimized-collection.patch => 0144-Replace-brain-with-optimized-collection.patch} (99%) rename leaf-server/minecraft-patches/features/{0153-Reduce-worldgen-allocations.patch => 0145-Reduce-worldgen-allocations.patch} (96%) rename leaf-server/minecraft-patches/features/{0154-Use-caffeine-cache-for-kickPermission-instead-of-usi.patch => 0146-Use-caffeine-cache-for-kickPermission-instead-of-usi.patch} (69%) rename leaf-server/minecraft-patches/features/{0156-Fix-MC-65198.patch => 0147-Fix-MC-65198.patch} (100%) rename leaf-server/minecraft-patches/features/{0157-Fix-MC-200418.patch => 0148-Fix-MC-200418.patch} (88%) rename leaf-server/minecraft-patches/features/{0158-Fix-MC-119417.patch => 0149-Fix-MC-119417.patch} (85%) rename leaf-server/minecraft-patches/features/{0159-Fix-MC-223153.patch => 0150-Fix-MC-223153.patch} (84%) diff --git a/gradle.properties b/gradle.properties index 850f305b..6d40bdb7 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,7 +2,7 @@ group=cn.dreeam.leaf mcVersion=1.21.9-rc1 version=1.21.9-rc1-R0.1-SNAPSHOT -paperCommit=922c85fe9d76be4b1a2e1afde588a396d4a21ea9 +paperCommit=f57fd54176bb5b4f201ec6b6197e46e9e366287b org.gradle.configuration-cache=true org.gradle.caching=true diff --git a/leaf-server/minecraft-patches/features/0056-Faster-chunk-serialization.patch b/leaf-archived-patches/unapplied/mcserver/0056-Faster-chunk-serialization.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0056-Faster-chunk-serialization.patch rename to leaf-archived-patches/unapplied/mcserver/0056-Faster-chunk-serialization.patch diff --git a/leaf-server/minecraft-patches/features/0076-Do-not-place-player-in-world-if-kicked-before-being-.patch b/leaf-archived-patches/unapplied/mcserver/0076-Do-not-place-player-in-world-if-kicked-before-being-.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0076-Do-not-place-player-in-world-if-kicked-before-being-.patch rename to leaf-archived-patches/unapplied/mcserver/0076-Do-not-place-player-in-world-if-kicked-before-being-.patch diff --git a/leaf-server/minecraft-patches/features/0106-Leaves-Protocol-Core.patch b/leaf-archived-patches/unapplied/mcserver/0106-Leaves-Protocol-Core.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0106-Leaves-Protocol-Core.patch rename to leaf-archived-patches/unapplied/mcserver/0106-Leaves-Protocol-Core.patch diff --git a/leaf-server/minecraft-patches/features/0107-Leaves-Jade-Protocol.patch b/leaf-archived-patches/unapplied/mcserver/0107-Leaves-Jade-Protocol.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0107-Leaves-Jade-Protocol.patch rename to leaf-archived-patches/unapplied/mcserver/0107-Leaves-Jade-Protocol.patch diff --git a/leaf-server/minecraft-patches/features/0108-Leaves-Xaero-Map-Protocol.patch b/leaf-archived-patches/unapplied/mcserver/0108-Leaves-Xaero-Map-Protocol.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0108-Leaves-Xaero-Map-Protocol.patch rename to leaf-archived-patches/unapplied/mcserver/0108-Leaves-Xaero-Map-Protocol.patch diff --git a/leaf-server/minecraft-patches/features/0109-Leaves-Syncmatica-Protocol.patch b/leaf-archived-patches/unapplied/mcserver/0109-Leaves-Syncmatica-Protocol.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0109-Leaves-Syncmatica-Protocol.patch rename to leaf-archived-patches/unapplied/mcserver/0109-Leaves-Syncmatica-Protocol.patch diff --git a/leaf-server/minecraft-patches/features/0110-Leaves-Replay-Mod-API.patch b/leaf-archived-patches/unapplied/mcserver/0110-Leaves-Replay-Mod-API.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0110-Leaves-Replay-Mod-API.patch rename to leaf-archived-patches/unapplied/mcserver/0110-Leaves-Replay-Mod-API.patch diff --git a/leaf-server/minecraft-patches/features/0160-Configurable-player-knockback-zombie.patch b/leaf-archived-patches/unapplied/mcserver/0160-Configurable-player-knockback-zombie.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0160-Configurable-player-knockback-zombie.patch rename to leaf-archived-patches/unapplied/mcserver/0160-Configurable-player-knockback-zombie.patch diff --git a/leaf-server/minecraft-patches/features/0161-Paper-PR-Skip-AI-during-inactive-ticks-for-non-aware.patch b/leaf-archived-patches/unapplied/mcserver/0161-Paper-PR-Skip-AI-during-inactive-ticks-for-non-aware.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0161-Paper-PR-Skip-AI-during-inactive-ticks-for-non-aware.patch rename to leaf-archived-patches/unapplied/mcserver/0161-Paper-PR-Skip-AI-during-inactive-ticks-for-non-aware.patch diff --git a/leaf-server/minecraft-patches/features/0162-Paper-PR-Prevent-zombie-reinforcements-loading-chunk.patch b/leaf-archived-patches/unapplied/mcserver/0162-Paper-PR-Prevent-zombie-reinforcements-loading-chunk.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0162-Paper-PR-Prevent-zombie-reinforcements-loading-chunk.patch rename to leaf-archived-patches/unapplied/mcserver/0162-Paper-PR-Prevent-zombie-reinforcements-loading-chunk.patch diff --git a/leaf-server/minecraft-patches/features/0163-Paper-PR-Fix-some-beacon-event-issues.patch b/leaf-archived-patches/unapplied/mcserver/0163-Paper-PR-Fix-some-beacon-event-issues.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0163-Paper-PR-Fix-some-beacon-event-issues.patch rename to leaf-archived-patches/unapplied/mcserver/0163-Paper-PR-Fix-some-beacon-event-issues.patch diff --git a/leaf-server/minecraft-patches/features/0164-Dont-send-useless-entity-packets.patch b/leaf-archived-patches/unapplied/mcserver/0164-Dont-send-useless-entity-packets.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0164-Dont-send-useless-entity-packets.patch rename to leaf-archived-patches/unapplied/mcserver/0164-Dont-send-useless-entity-packets.patch diff --git a/leaf-server/minecraft-patches/features/0165-Multithreaded-Tracker.patch b/leaf-archived-patches/unapplied/mcserver/0165-Multithreaded-Tracker.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0165-Multithreaded-Tracker.patch rename to leaf-archived-patches/unapplied/mcserver/0165-Multithreaded-Tracker.patch diff --git a/leaf-server/minecraft-patches/features/0166-Nitori-Async-playerdata-saving.patch b/leaf-archived-patches/unapplied/mcserver/0166-Nitori-Async-playerdata-saving.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0166-Nitori-Async-playerdata-saving.patch rename to leaf-archived-patches/unapplied/mcserver/0166-Nitori-Async-playerdata-saving.patch diff --git a/leaf-server/minecraft-patches/features/0167-Optimize-nearby-alive-players-for-spawning.patch b/leaf-archived-patches/unapplied/mcserver/0167-Optimize-nearby-alive-players-for-spawning.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0167-Optimize-nearby-alive-players-for-spawning.patch rename to leaf-archived-patches/unapplied/mcserver/0167-Optimize-nearby-alive-players-for-spawning.patch diff --git a/leaf-server/minecraft-patches/features/0168-Cache-blockstate-cache-array.patch b/leaf-archived-patches/unapplied/mcserver/0168-Cache-blockstate-cache-array.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0168-Cache-blockstate-cache-array.patch rename to leaf-archived-patches/unapplied/mcserver/0168-Cache-blockstate-cache-array.patch diff --git a/leaf-server/minecraft-patches/features/0169-Further-reduce-memory-footprint-of-CompoundTag.patch b/leaf-archived-patches/unapplied/mcserver/0169-Further-reduce-memory-footprint-of-CompoundTag.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0169-Further-reduce-memory-footprint-of-CompoundTag.patch rename to leaf-archived-patches/unapplied/mcserver/0169-Further-reduce-memory-footprint-of-CompoundTag.patch diff --git a/leaf-server/minecraft-patches/features/0170-Optimize-Entity-distanceToSqr.patch b/leaf-archived-patches/unapplied/mcserver/0170-Optimize-Entity-distanceToSqr.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0170-Optimize-Entity-distanceToSqr.patch rename to leaf-archived-patches/unapplied/mcserver/0170-Optimize-Entity-distanceToSqr.patch diff --git a/leaf-server/minecraft-patches/features/0171-EMC-Don-t-use-snapshots-for-TileEntity-getOwner.patch b/leaf-archived-patches/unapplied/mcserver/0171-EMC-Don-t-use-snapshots-for-TileEntity-getOwner.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0171-EMC-Don-t-use-snapshots-for-TileEntity-getOwner.patch rename to leaf-archived-patches/unapplied/mcserver/0171-EMC-Don-t-use-snapshots-for-TileEntity-getOwner.patch diff --git a/leaf-server/minecraft-patches/features/0172-Cache-tile-entity-position.patch b/leaf-archived-patches/unapplied/mcserver/0172-Cache-tile-entity-position.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0172-Cache-tile-entity-position.patch rename to leaf-archived-patches/unapplied/mcserver/0172-Cache-tile-entity-position.patch diff --git a/leaf-server/minecraft-patches/features/0173-TT20-Lag-compensation.patch b/leaf-archived-patches/unapplied/mcserver/0173-TT20-Lag-compensation.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0173-TT20-Lag-compensation.patch rename to leaf-archived-patches/unapplied/mcserver/0173-TT20-Lag-compensation.patch diff --git a/leaf-server/minecraft-patches/features/0174-C2ME-Reduce-Allocations.patch b/leaf-archived-patches/unapplied/mcserver/0174-C2ME-Reduce-Allocations.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0174-C2ME-Reduce-Allocations.patch rename to leaf-archived-patches/unapplied/mcserver/0174-C2ME-Reduce-Allocations.patch diff --git a/leaf-server/minecraft-patches/features/0175-Lithium-Skip-unnecessary-calculations-if-player-is-n.patch b/leaf-archived-patches/unapplied/mcserver/0175-Lithium-Skip-unnecessary-calculations-if-player-is-n.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0175-Lithium-Skip-unnecessary-calculations-if-player-is-n.patch rename to leaf-archived-patches/unapplied/mcserver/0175-Lithium-Skip-unnecessary-calculations-if-player-is-n.patch diff --git a/leaf-server/minecraft-patches/features/0176-Lithium-fast-util.patch b/leaf-archived-patches/unapplied/mcserver/0176-Lithium-fast-util.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0176-Lithium-fast-util.patch rename to leaf-archived-patches/unapplied/mcserver/0176-Lithium-fast-util.patch diff --git a/leaf-server/minecraft-patches/features/0177-Lithium-cached-iterate-outwards.patch b/leaf-archived-patches/unapplied/mcserver/0177-Lithium-cached-iterate-outwards.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0177-Lithium-cached-iterate-outwards.patch rename to leaf-archived-patches/unapplied/mcserver/0177-Lithium-cached-iterate-outwards.patch diff --git a/leaf-server/minecraft-patches/features/0178-Use-faster-and-thread-safe-ban-list-date-format-pars.patch b/leaf-archived-patches/unapplied/mcserver/0178-Use-faster-and-thread-safe-ban-list-date-format-pars.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0178-Use-faster-and-thread-safe-ban-list-date-format-pars.patch rename to leaf-archived-patches/unapplied/mcserver/0178-Use-faster-and-thread-safe-ban-list-date-format-pars.patch diff --git a/leaf-server/minecraft-patches/features/0179-C2ME-Optimize-world-gen-math.patch b/leaf-archived-patches/unapplied/mcserver/0179-C2ME-Optimize-world-gen-math.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0179-C2ME-Optimize-world-gen-math.patch rename to leaf-archived-patches/unapplied/mcserver/0179-C2ME-Optimize-world-gen-math.patch diff --git a/leaf-server/minecraft-patches/features/0180-Cache-chunk-key.patch b/leaf-archived-patches/unapplied/mcserver/0180-Cache-chunk-key.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0180-Cache-chunk-key.patch rename to leaf-archived-patches/unapplied/mcserver/0180-Cache-chunk-key.patch diff --git a/leaf-server/minecraft-patches/features/0181-Cache-part-of-canHoldFluid-result.patch b/leaf-archived-patches/unapplied/mcserver/0181-Cache-part-of-canHoldFluid-result.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0181-Cache-part-of-canHoldFluid-result.patch rename to leaf-archived-patches/unapplied/mcserver/0181-Cache-part-of-canHoldFluid-result.patch diff --git a/leaf-server/minecraft-patches/features/0182-Configurable-tripwire-dupe.patch b/leaf-archived-patches/unapplied/mcserver/0182-Configurable-tripwire-dupe.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0182-Configurable-tripwire-dupe.patch rename to leaf-archived-patches/unapplied/mcserver/0182-Configurable-tripwire-dupe.patch diff --git a/leaf-server/minecraft-patches/features/0183-Paper-PR-Fix-MC-117075-Block-Entities-Unload-Lag-Spi.patch b/leaf-archived-patches/unapplied/mcserver/0183-Paper-PR-Fix-MC-117075-Block-Entities-Unload-Lag-Spi.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0183-Paper-PR-Fix-MC-117075-Block-Entities-Unload-Lag-Spi.patch rename to leaf-archived-patches/unapplied/mcserver/0183-Paper-PR-Fix-MC-117075-Block-Entities-Unload-Lag-Spi.patch diff --git a/leaf-server/minecraft-patches/features/0184-Sepals-Rearrange-the-attackable-conditions.patch b/leaf-archived-patches/unapplied/mcserver/0184-Sepals-Rearrange-the-attackable-conditions.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0184-Sepals-Rearrange-the-attackable-conditions.patch rename to leaf-archived-patches/unapplied/mcserver/0184-Sepals-Rearrange-the-attackable-conditions.patch diff --git a/leaf-server/minecraft-patches/features/0185-SparklyPaper-Skip-dirty-stats-copy-when-requesting-p.patch b/leaf-archived-patches/unapplied/mcserver/0185-SparklyPaper-Skip-dirty-stats-copy-when-requesting-p.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0185-SparklyPaper-Skip-dirty-stats-copy-when-requesting-p.patch rename to leaf-archived-patches/unapplied/mcserver/0185-SparklyPaper-Skip-dirty-stats-copy-when-requesting-p.patch diff --git a/leaf-server/minecraft-patches/features/0186-SparklyPaper-Reset-dirty-flag-when-loading-maps-from.patch b/leaf-archived-patches/unapplied/mcserver/0186-SparklyPaper-Reset-dirty-flag-when-loading-maps-from.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0186-SparklyPaper-Reset-dirty-flag-when-loading-maps-from.patch rename to leaf-archived-patches/unapplied/mcserver/0186-SparklyPaper-Reset-dirty-flag-when-loading-maps-from.patch diff --git a/leaf-server/minecraft-patches/features/0187-Optimize-checking-nearby-players-for-spawning.patch b/leaf-archived-patches/unapplied/mcserver/0187-Optimize-checking-nearby-players-for-spawning.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0187-Optimize-checking-nearby-players-for-spawning.patch rename to leaf-archived-patches/unapplied/mcserver/0187-Optimize-checking-nearby-players-for-spawning.patch diff --git a/leaf-server/minecraft-patches/features/0188-Avoid-useless-deque-clear-on-LevelTicks-cleanupAfter.patch b/leaf-archived-patches/unapplied/mcserver/0188-Avoid-useless-deque-clear-on-LevelTicks-cleanupAfter.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0188-Avoid-useless-deque-clear-on-LevelTicks-cleanupAfter.patch rename to leaf-archived-patches/unapplied/mcserver/0188-Avoid-useless-deque-clear-on-LevelTicks-cleanupAfter.patch diff --git a/leaf-server/minecraft-patches/features/0189-Remove-stream-in-villagers.patch b/leaf-archived-patches/unapplied/mcserver/0189-Remove-stream-in-villagers.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0189-Remove-stream-in-villagers.patch rename to leaf-archived-patches/unapplied/mcserver/0189-Remove-stream-in-villagers.patch diff --git a/leaf-server/minecraft-patches/features/0190-Optimize-baby-villager-sensor.patch b/leaf-archived-patches/unapplied/mcserver/0190-Optimize-baby-villager-sensor.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0190-Optimize-baby-villager-sensor.patch rename to leaf-archived-patches/unapplied/mcserver/0190-Optimize-baby-villager-sensor.patch diff --git a/leaf-server/minecraft-patches/features/0191-Only-player-pushable.patch b/leaf-archived-patches/unapplied/mcserver/0191-Only-player-pushable.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0191-Only-player-pushable.patch rename to leaf-archived-patches/unapplied/mcserver/0191-Only-player-pushable.patch diff --git a/leaf-server/minecraft-patches/features/0192-Remove-iterators-from-Inventory.patch b/leaf-archived-patches/unapplied/mcserver/0192-Remove-iterators-from-Inventory.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0192-Remove-iterators-from-Inventory.patch rename to leaf-archived-patches/unapplied/mcserver/0192-Remove-iterators-from-Inventory.patch diff --git a/leaf-server/minecraft-patches/features/0193-optimize-mob-despawn.patch b/leaf-archived-patches/unapplied/mcserver/0193-optimize-mob-despawn.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0193-optimize-mob-despawn.patch rename to leaf-archived-patches/unapplied/mcserver/0193-optimize-mob-despawn.patch diff --git a/leaf-server/minecraft-patches/features/0194-Slightly-optimise-getNearestPlayer.patch b/leaf-archived-patches/unapplied/mcserver/0194-Slightly-optimise-getNearestPlayer.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0194-Slightly-optimise-getNearestPlayer.patch rename to leaf-archived-patches/unapplied/mcserver/0194-Slightly-optimise-getNearestPlayer.patch diff --git a/leaf-server/minecraft-patches/features/0195-Bulk-writes-to-writeLongArray-during-chunk-loading.patch b/leaf-archived-patches/unapplied/mcserver/0195-Bulk-writes-to-writeLongArray-during-chunk-loading.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0195-Bulk-writes-to-writeLongArray-during-chunk-loading.patch rename to leaf-archived-patches/unapplied/mcserver/0195-Bulk-writes-to-writeLongArray-during-chunk-loading.patch diff --git a/leaf-server/minecraft-patches/features/0196-Improve-sorting-in-SortedArraySet.patch b/leaf-archived-patches/unapplied/mcserver/0196-Improve-sorting-in-SortedArraySet.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0196-Improve-sorting-in-SortedArraySet.patch rename to leaf-archived-patches/unapplied/mcserver/0196-Improve-sorting-in-SortedArraySet.patch diff --git a/leaf-server/minecraft-patches/features/0197-Make-removeIf-slightly-faster.patch b/leaf-archived-patches/unapplied/mcserver/0197-Make-removeIf-slightly-faster.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0197-Make-removeIf-slightly-faster.patch rename to leaf-archived-patches/unapplied/mcserver/0197-Make-removeIf-slightly-faster.patch diff --git a/leaf-server/minecraft-patches/features/0198-Optimize-LinearPalette.patch b/leaf-archived-patches/unapplied/mcserver/0198-Optimize-LinearPalette.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0198-Optimize-LinearPalette.patch rename to leaf-archived-patches/unapplied/mcserver/0198-Optimize-LinearPalette.patch diff --git a/leaf-server/minecraft-patches/features/0199-Rewrite-ClientboundLightUpdatePacketData.patch b/leaf-archived-patches/unapplied/mcserver/0199-Rewrite-ClientboundLightUpdatePacketData.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0199-Rewrite-ClientboundLightUpdatePacketData.patch rename to leaf-archived-patches/unapplied/mcserver/0199-Rewrite-ClientboundLightUpdatePacketData.patch diff --git a/leaf-server/minecraft-patches/features/0200-Async-chunk-sending.patch b/leaf-archived-patches/unapplied/mcserver/0200-Async-chunk-sending.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0200-Async-chunk-sending.patch rename to leaf-archived-patches/unapplied/mcserver/0200-Async-chunk-sending.patch diff --git a/leaf-server/minecraft-patches/features/0201-Spawner-Configurations.patch b/leaf-archived-patches/unapplied/mcserver/0201-Spawner-Configurations.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0201-Spawner-Configurations.patch rename to leaf-archived-patches/unapplied/mcserver/0201-Spawner-Configurations.patch diff --git a/leaf-server/minecraft-patches/features/0202-SparklyPaper-Parallel-world-ticking.patch b/leaf-archived-patches/unapplied/mcserver/0202-SparklyPaper-Parallel-world-ticking.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0202-SparklyPaper-Parallel-world-ticking.patch rename to leaf-archived-patches/unapplied/mcserver/0202-SparklyPaper-Parallel-world-ticking.patch diff --git a/leaf-server/minecraft-patches/features/0203-SparklyPaper-Track-each-world-MSPT.patch b/leaf-archived-patches/unapplied/mcserver/0203-SparklyPaper-Track-each-world-MSPT.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0203-SparklyPaper-Track-each-world-MSPT.patch rename to leaf-archived-patches/unapplied/mcserver/0203-SparklyPaper-Track-each-world-MSPT.patch diff --git a/leaf-server/minecraft-patches/features/0204-Paper-PR-Fix-cancelled-Projectile-Events-still-consu.patch b/leaf-archived-patches/unapplied/mcserver/0204-Paper-PR-Fix-cancelled-Projectile-Events-still-consu.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0204-Paper-PR-Fix-cancelled-Projectile-Events-still-consu.patch rename to leaf-archived-patches/unapplied/mcserver/0204-Paper-PR-Fix-cancelled-Projectile-Events-still-consu.patch diff --git a/leaf-server/minecraft-patches/features/0205-Optimize-SetLookAndInteract-and-NearestVisibleLiving.patch b/leaf-archived-patches/unapplied/mcserver/0205-Optimize-SetLookAndInteract-and-NearestVisibleLiving.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0205-Optimize-SetLookAndInteract-and-NearestVisibleLiving.patch rename to leaf-archived-patches/unapplied/mcserver/0205-Optimize-SetLookAndInteract-and-NearestVisibleLiving.patch diff --git a/leaf-server/minecraft-patches/features/0206-rewrite-InsideBrownianWalk.patch b/leaf-archived-patches/unapplied/mcserver/0206-rewrite-InsideBrownianWalk.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0206-rewrite-InsideBrownianWalk.patch rename to leaf-archived-patches/unapplied/mcserver/0206-rewrite-InsideBrownianWalk.patch diff --git a/leaf-server/minecraft-patches/features/0207-Use-BFS-on-getSlopeDistance.patch b/leaf-archived-patches/unapplied/mcserver/0207-Use-BFS-on-getSlopeDistance.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0207-Use-BFS-on-getSlopeDistance.patch rename to leaf-archived-patches/unapplied/mcserver/0207-Use-BFS-on-getSlopeDistance.patch diff --git a/leaf-server/minecraft-patches/features/0208-Paper-PR-Throttle-failed-spawn-attempts.patch b/leaf-archived-patches/unapplied/mcserver/0208-Paper-PR-Throttle-failed-spawn-attempts.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0208-Paper-PR-Throttle-failed-spawn-attempts.patch rename to leaf-archived-patches/unapplied/mcserver/0208-Paper-PR-Throttle-failed-spawn-attempts.patch diff --git a/leaf-server/minecraft-patches/features/0209-Improve-BlockEntity-ticking-isRemoved-check.patch b/leaf-archived-patches/unapplied/mcserver/0209-Improve-BlockEntity-ticking-isRemoved-check.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0209-Improve-BlockEntity-ticking-isRemoved-check.patch rename to leaf-archived-patches/unapplied/mcserver/0209-Improve-BlockEntity-ticking-isRemoved-check.patch diff --git a/leaf-server/minecraft-patches/features/0210-Raytrace-AntiXray-SDK-integration.patch b/leaf-archived-patches/unapplied/mcserver/0210-Raytrace-AntiXray-SDK-integration.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0210-Raytrace-AntiXray-SDK-integration.patch rename to leaf-archived-patches/unapplied/mcserver/0210-Raytrace-AntiXray-SDK-integration.patch diff --git a/leaf-server/minecraft-patches/features/0211-Optimize-ContextMap.create.patch b/leaf-archived-patches/unapplied/mcserver/0211-Optimize-ContextMap.create.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0211-Optimize-ContextMap.create.patch rename to leaf-archived-patches/unapplied/mcserver/0211-Optimize-ContextMap.create.patch diff --git a/leaf-server/minecraft-patches/features/0212-Micro-optimizations-for-random-tick.patch b/leaf-archived-patches/unapplied/mcserver/0212-Micro-optimizations-for-random-tick.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0212-Micro-optimizations-for-random-tick.patch rename to leaf-archived-patches/unapplied/mcserver/0212-Micro-optimizations-for-random-tick.patch diff --git a/leaf-server/minecraft-patches/features/0213-Remove-streams-on-updateConnectedPlayersWithinRange.patch b/leaf-archived-patches/unapplied/mcserver/0213-Remove-streams-on-updateConnectedPlayersWithinRange.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0213-Remove-streams-on-updateConnectedPlayersWithinRange.patch rename to leaf-archived-patches/unapplied/mcserver/0213-Remove-streams-on-updateConnectedPlayersWithinRange.patch diff --git a/leaf-server/minecraft-patches/features/0214-Remove-streams-on-PlayerDetector.patch b/leaf-archived-patches/unapplied/mcserver/0214-Remove-streams-on-PlayerDetector.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0214-Remove-streams-on-PlayerDetector.patch rename to leaf-archived-patches/unapplied/mcserver/0214-Remove-streams-on-PlayerDetector.patch diff --git a/leaf-server/minecraft-patches/features/0215-Use-direct-iteration-on-Sensing.tick.patch b/leaf-archived-patches/unapplied/mcserver/0215-Use-direct-iteration-on-Sensing.tick.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0215-Use-direct-iteration-on-Sensing.tick.patch rename to leaf-archived-patches/unapplied/mcserver/0215-Use-direct-iteration-on-Sensing.tick.patch diff --git a/leaf-server/minecraft-patches/features/0216-Optimise-non-flush-packet-sending.patch b/leaf-archived-patches/unapplied/mcserver/0216-Optimise-non-flush-packet-sending.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0216-Optimise-non-flush-packet-sending.patch rename to leaf-archived-patches/unapplied/mcserver/0216-Optimise-non-flush-packet-sending.patch diff --git a/leaf-server/minecraft-patches/features/0217-Prevent-double-chunk-retrieving-in-entity-fluid-push.patch b/leaf-archived-patches/unapplied/mcserver/0217-Prevent-double-chunk-retrieving-in-entity-fluid-push.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0217-Prevent-double-chunk-retrieving-in-entity-fluid-push.patch rename to leaf-archived-patches/unapplied/mcserver/0217-Prevent-double-chunk-retrieving-in-entity-fluid-push.patch diff --git a/leaf-server/minecraft-patches/features/0218-Null-handling-on-MultifaceSpreader.patch b/leaf-archived-patches/unapplied/mcserver/0218-Null-handling-on-MultifaceSpreader.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0218-Null-handling-on-MultifaceSpreader.patch rename to leaf-archived-patches/unapplied/mcserver/0218-Null-handling-on-MultifaceSpreader.patch diff --git a/leaf-server/minecraft-patches/features/0219-More-virtual-threads.patch b/leaf-archived-patches/unapplied/mcserver/0219-More-virtual-threads.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0219-More-virtual-threads.patch rename to leaf-archived-patches/unapplied/mcserver/0219-More-virtual-threads.patch diff --git a/leaf-server/minecraft-patches/features/0220-Optimize-ThreadedTicketLevelPropagator.patch b/leaf-archived-patches/unapplied/mcserver/0220-Optimize-ThreadedTicketLevelPropagator.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0220-Optimize-ThreadedTicketLevelPropagator.patch rename to leaf-archived-patches/unapplied/mcserver/0220-Optimize-ThreadedTicketLevelPropagator.patch diff --git a/leaf-server/minecraft-patches/features/0221-Optimise-MobEffectUtil-getDigSpeedAmplification.patch b/leaf-archived-patches/unapplied/mcserver/0221-Optimise-MobEffectUtil-getDigSpeedAmplification.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0221-Optimise-MobEffectUtil-getDigSpeedAmplification.patch rename to leaf-archived-patches/unapplied/mcserver/0221-Optimise-MobEffectUtil-getDigSpeedAmplification.patch diff --git a/leaf-server/minecraft-patches/features/0222-Optimise-chunkUnloads.patch b/leaf-archived-patches/unapplied/mcserver/0222-Optimise-chunkUnloads.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0222-Optimise-chunkUnloads.patch rename to leaf-archived-patches/unapplied/mcserver/0222-Optimise-chunkUnloads.patch diff --git a/leaf-server/minecraft-patches/features/0223-Optimize-BlockEntityType-isValid.patch b/leaf-archived-patches/unapplied/mcserver/0223-Optimize-BlockEntityType-isValid.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0223-Optimize-BlockEntityType-isValid.patch rename to leaf-archived-patches/unapplied/mcserver/0223-Optimize-BlockEntityType-isValid.patch diff --git a/leaf-server/minecraft-patches/features/0224-Paper-PR-Add-ticket-on-player-join-to-avoid-chunk-lo.patch b/leaf-archived-patches/unapplied/mcserver/0224-Paper-PR-Add-ticket-on-player-join-to-avoid-chunk-lo.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0224-Paper-PR-Add-ticket-on-player-join-to-avoid-chunk-lo.patch rename to leaf-archived-patches/unapplied/mcserver/0224-Paper-PR-Add-ticket-on-player-join-to-avoid-chunk-lo.patch diff --git a/leaf-server/minecraft-patches/features/0225-Sakura-Optimise-check-inside-blocks-and-traverse-blo.patch b/leaf-archived-patches/unapplied/mcserver/0225-Sakura-Optimise-check-inside-blocks-and-traverse-blo.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0225-Sakura-Optimise-check-inside-blocks-and-traverse-blo.patch rename to leaf-archived-patches/unapplied/mcserver/0225-Sakura-Optimise-check-inside-blocks-and-traverse-blo.patch diff --git a/leaf-server/minecraft-patches/features/0226-Sakura-copy-EntityList-implementation-to-BasicEntity.patch b/leaf-archived-patches/unapplied/mcserver/0226-Sakura-copy-EntityList-implementation-to-BasicEntity.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0226-Sakura-copy-EntityList-implementation-to-BasicEntity.patch rename to leaf-archived-patches/unapplied/mcserver/0226-Sakura-copy-EntityList-implementation-to-BasicEntity.patch diff --git a/leaf-server/minecraft-patches/features/0227-Protocol-Core.patch b/leaf-archived-patches/unapplied/mcserver/0227-Protocol-Core.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0227-Protocol-Core.patch rename to leaf-archived-patches/unapplied/mcserver/0227-Protocol-Core.patch diff --git a/leaf-server/minecraft-patches/features/0228-Async-switch-connection-state.patch b/leaf-archived-patches/unapplied/mcserver/0228-Async-switch-connection-state.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0228-Async-switch-connection-state.patch rename to leaf-archived-patches/unapplied/mcserver/0228-Async-switch-connection-state.patch diff --git a/leaf-server/minecraft-patches/features/0229-Optimize-BlockEntities-tickersInLevel.patch b/leaf-archived-patches/unapplied/mcserver/0229-Optimize-BlockEntities-tickersInLevel.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0229-Optimize-BlockEntities-tickersInLevel.patch rename to leaf-archived-patches/unapplied/mcserver/0229-Optimize-BlockEntities-tickersInLevel.patch diff --git a/leaf-server/minecraft-patches/features/0230-Pluto-Check-if-the-cactus-can-even-survive-being-pla.patch b/leaf-archived-patches/unapplied/mcserver/0230-Pluto-Check-if-the-cactus-can-even-survive-being-pla.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0230-Pluto-Check-if-the-cactus-can-even-survive-being-pla.patch rename to leaf-archived-patches/unapplied/mcserver/0230-Pluto-Check-if-the-cactus-can-even-survive-being-pla.patch diff --git a/leaf-server/minecraft-patches/features/0231-Flush-location-while-knockback.patch b/leaf-archived-patches/unapplied/mcserver/0231-Flush-location-while-knockback.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0231-Flush-location-while-knockback.patch rename to leaf-archived-patches/unapplied/mcserver/0231-Flush-location-while-knockback.patch diff --git a/leaf-server/minecraft-patches/features/0232-Only-tick-items-at-hand.patch b/leaf-archived-patches/unapplied/mcserver/0232-Only-tick-items-at-hand.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0232-Only-tick-items-at-hand.patch rename to leaf-archived-patches/unapplied/mcserver/0232-Only-tick-items-at-hand.patch diff --git a/leaf-server/minecraft-patches/features/0233-Optimise-player-movement-checks.patch b/leaf-archived-patches/unapplied/mcserver/0233-Optimise-player-movement-checks.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0233-Optimise-player-movement-checks.patch rename to leaf-archived-patches/unapplied/mcserver/0233-Optimise-player-movement-checks.patch diff --git a/leaf-server/minecraft-patches/features/0234-Remove-streams-in-MobSensor.patch b/leaf-archived-patches/unapplied/mcserver/0234-Remove-streams-in-MobSensor.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0234-Remove-streams-in-MobSensor.patch rename to leaf-archived-patches/unapplied/mcserver/0234-Remove-streams-in-MobSensor.patch diff --git a/leaf-server/minecraft-patches/features/0235-Remove-streams-in-TemptingSensor.patch b/leaf-archived-patches/unapplied/mcserver/0235-Remove-streams-in-TemptingSensor.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0235-Remove-streams-in-TemptingSensor.patch rename to leaf-archived-patches/unapplied/mcserver/0235-Remove-streams-in-TemptingSensor.patch diff --git a/leaf-server/minecraft-patches/features/0236-Add-configurable-death-item-drop-knockback-settings.patch b/leaf-archived-patches/unapplied/mcserver/0236-Add-configurable-death-item-drop-knockback-settings.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0236-Add-configurable-death-item-drop-knockback-settings.patch rename to leaf-archived-patches/unapplied/mcserver/0236-Add-configurable-death-item-drop-knockback-settings.patch diff --git a/leaf-server/minecraft-patches/features/0237-Optimize-getScaledTrackingDistance.patch b/leaf-archived-patches/unapplied/mcserver/0237-Optimize-getScaledTrackingDistance.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0237-Optimize-getScaledTrackingDistance.patch rename to leaf-archived-patches/unapplied/mcserver/0237-Optimize-getScaledTrackingDistance.patch diff --git a/leaf-server/minecraft-patches/features/0238-Optimize-SynchedEntityData-packDirty.patch b/leaf-archived-patches/unapplied/mcserver/0238-Optimize-SynchedEntityData-packDirty.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0238-Optimize-SynchedEntityData-packDirty.patch rename to leaf-archived-patches/unapplied/mcserver/0238-Optimize-SynchedEntityData-packDirty.patch diff --git a/leaf-server/minecraft-patches/features/0239-Optimize-isEyeInFluid.patch b/leaf-archived-patches/unapplied/mcserver/0239-Optimize-isEyeInFluid.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0239-Optimize-isEyeInFluid.patch rename to leaf-archived-patches/unapplied/mcserver/0239-Optimize-isEyeInFluid.patch diff --git a/leaf-server/minecraft-patches/features/0240-Cache-block-state-tags.patch b/leaf-archived-patches/unapplied/mcserver/0240-Cache-block-state-tags.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0240-Cache-block-state-tags.patch rename to leaf-archived-patches/unapplied/mcserver/0240-Cache-block-state-tags.patch diff --git a/leaf-server/minecraft-patches/features/0241-optimize-getEntityStatus.patch b/leaf-archived-patches/unapplied/mcserver/0241-optimize-getEntityStatus.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0241-optimize-getEntityStatus.patch rename to leaf-archived-patches/unapplied/mcserver/0241-optimize-getEntityStatus.patch diff --git a/leaf-server/minecraft-patches/features/0242-Rail-Optimization-optimized-PoweredRailBlock-logic.patch b/leaf-archived-patches/unapplied/mcserver/0242-Rail-Optimization-optimized-PoweredRailBlock-logic.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0242-Rail-Optimization-optimized-PoweredRailBlock-logic.patch rename to leaf-archived-patches/unapplied/mcserver/0242-Rail-Optimization-optimized-PoweredRailBlock-logic.patch diff --git a/leaf-server/minecraft-patches/features/0243-optimise-ChunkGenerator-getMobsAt.patch b/leaf-archived-patches/unapplied/mcserver/0243-optimise-ChunkGenerator-getMobsAt.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0243-optimise-ChunkGenerator-getMobsAt.patch rename to leaf-archived-patches/unapplied/mcserver/0243-optimise-ChunkGenerator-getMobsAt.patch diff --git a/leaf-server/minecraft-patches/features/0244-cache-getBiome.patch b/leaf-archived-patches/unapplied/mcserver/0244-cache-getBiome.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0244-cache-getBiome.patch rename to leaf-archived-patches/unapplied/mcserver/0244-cache-getBiome.patch diff --git a/leaf-server/minecraft-patches/features/0245-optimize-mob-spawning.patch b/leaf-archived-patches/unapplied/mcserver/0245-optimize-mob-spawning.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0245-optimize-mob-spawning.patch rename to leaf-archived-patches/unapplied/mcserver/0245-optimize-mob-spawning.patch diff --git a/leaf-server/minecraft-patches/features/0246-optimize-structure-map.patch b/leaf-archived-patches/unapplied/mcserver/0246-optimize-structure-map.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0246-optimize-structure-map.patch rename to leaf-archived-patches/unapplied/mcserver/0246-optimize-structure-map.patch diff --git a/leaf-server/minecraft-patches/features/0247-throttle-mob-spawning.patch b/leaf-archived-patches/unapplied/mcserver/0247-throttle-mob-spawning.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0247-throttle-mob-spawning.patch rename to leaf-archived-patches/unapplied/mcserver/0247-throttle-mob-spawning.patch diff --git a/leaf-server/minecraft-patches/features/0248-Add-BlockExplosionHitEvent.patch b/leaf-archived-patches/unapplied/mcserver/0248-Add-BlockExplosionHitEvent.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0248-Add-BlockExplosionHitEvent.patch rename to leaf-archived-patches/unapplied/mcserver/0248-Add-BlockExplosionHitEvent.patch diff --git a/leaf-server/minecraft-patches/features/0249-Old-Blast-Protection-explosion-knockback.patch b/leaf-archived-patches/unapplied/mcserver/0249-Old-Blast-Protection-explosion-knockback.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0249-Old-Blast-Protection-explosion-knockback.patch rename to leaf-archived-patches/unapplied/mcserver/0249-Old-Blast-Protection-explosion-knockback.patch diff --git a/leaf-server/minecraft-patches/features/0250-Use-UUID-for-cure-reputation.patch b/leaf-archived-patches/unapplied/mcserver/0250-Use-UUID-for-cure-reputation.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0250-Use-UUID-for-cure-reputation.patch rename to leaf-archived-patches/unapplied/mcserver/0250-Use-UUID-for-cure-reputation.patch diff --git a/leaf-server/minecraft-patches/features/0251-Fix-crash-during-parsing-unknown-command-message.patch b/leaf-archived-patches/unapplied/mcserver/0251-Fix-crash-during-parsing-unknown-command-message.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0251-Fix-crash-during-parsing-unknown-command-message.patch rename to leaf-archived-patches/unapplied/mcserver/0251-Fix-crash-during-parsing-unknown-command-message.patch diff --git a/leaf-server/minecraft-patches/features/0252-optimize-random-tick.patch b/leaf-archived-patches/unapplied/mcserver/0252-optimize-random-tick.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0252-optimize-random-tick.patch rename to leaf-archived-patches/unapplied/mcserver/0252-optimize-random-tick.patch diff --git a/leaf-server/minecraft-patches/features/0253-do-not-log-invalid-flatten-text-component-parse.patch b/leaf-archived-patches/unapplied/mcserver/0253-do-not-log-invalid-flatten-text-component-parse.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0253-do-not-log-invalid-flatten-text-component-parse.patch rename to leaf-archived-patches/unapplied/mcserver/0253-do-not-log-invalid-flatten-text-component-parse.patch diff --git a/leaf-server/minecraft-patches/features/0254-Fast-BiomeManager-seed-obfuscation.patch b/leaf-archived-patches/unapplied/mcserver/0254-Fast-BiomeManager-seed-obfuscation.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0254-Fast-BiomeManager-seed-obfuscation.patch rename to leaf-archived-patches/unapplied/mcserver/0254-Fast-BiomeManager-seed-obfuscation.patch diff --git a/leaf-server/minecraft-patches/features/0255-Replace-EntitySelectorOptions-map-with-optimized-col.patch b/leaf-archived-patches/unapplied/mcserver/0255-Replace-EntitySelectorOptions-map-with-optimized-col.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0255-Replace-EntitySelectorOptions-map-with-optimized-col.patch rename to leaf-archived-patches/unapplied/mcserver/0255-Replace-EntitySelectorOptions-map-with-optimized-col.patch diff --git a/leaf-server/minecraft-patches/features/0256-optimize-no-action-time.patch b/leaf-archived-patches/unapplied/mcserver/0256-optimize-no-action-time.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0256-optimize-no-action-time.patch rename to leaf-archived-patches/unapplied/mcserver/0256-optimize-no-action-time.patch diff --git a/leaf-server/minecraft-patches/features/0257-optimize-waypoint.patch b/leaf-archived-patches/unapplied/mcserver/0257-optimize-waypoint.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0257-optimize-waypoint.patch rename to leaf-archived-patches/unapplied/mcserver/0257-optimize-waypoint.patch diff --git a/leaf-server/minecraft-patches/features/0258-Paw-optimization.patch b/leaf-archived-patches/unapplied/mcserver/0258-Paw-optimization.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0258-Paw-optimization.patch rename to leaf-archived-patches/unapplied/mcserver/0258-Paw-optimization.patch diff --git a/leaf-server/minecraft-patches/features/0259-Fix-Paper-config-fixClimbingBypassingCrammingRule.patch b/leaf-archived-patches/unapplied/mcserver/0259-Fix-Paper-config-fixClimbingBypassingCrammingRule.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0259-Fix-Paper-config-fixClimbingBypassingCrammingRule.patch rename to leaf-archived-patches/unapplied/mcserver/0259-Fix-Paper-config-fixClimbingBypassingCrammingRule.patch diff --git a/leaf-server/minecraft-patches/features/0260-Skip-inactive-entity-for-execute.patch b/leaf-archived-patches/unapplied/mcserver/0260-Skip-inactive-entity-for-execute.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0260-Skip-inactive-entity-for-execute.patch rename to leaf-archived-patches/unapplied/mcserver/0260-Skip-inactive-entity-for-execute.patch diff --git a/leaf-server/minecraft-patches/features/0261-Optimise-getEntities.patch b/leaf-archived-patches/unapplied/mcserver/0261-Optimise-getEntities.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0261-Optimise-getEntities.patch rename to leaf-archived-patches/unapplied/mcserver/0261-Optimise-getEntities.patch diff --git a/leaf-server/minecraft-patches/features/0262-fix-MC-298464.patch b/leaf-archived-patches/unapplied/mcserver/0262-fix-MC-298464.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0262-fix-MC-298464.patch rename to leaf-archived-patches/unapplied/mcserver/0262-fix-MC-298464.patch diff --git a/leaf-server/minecraft-patches/features/0263-Re-route-SetClosestHomeAsWalkTarget-s-poi-finding-to.patch b/leaf-archived-patches/unapplied/mcserver/0263-Re-route-SetClosestHomeAsWalkTarget-s-poi-finding-to.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0263-Re-route-SetClosestHomeAsWalkTarget-s-poi-finding-to.patch rename to leaf-archived-patches/unapplied/mcserver/0263-Re-route-SetClosestHomeAsWalkTarget-s-poi-finding-to.patch diff --git a/leaf-server/minecraft-patches/features/0264-optimize-checkInsideBlocks-calls.patch b/leaf-archived-patches/unapplied/mcserver/0264-optimize-checkInsideBlocks-calls.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0264-optimize-checkInsideBlocks-calls.patch rename to leaf-archived-patches/unapplied/mcserver/0264-optimize-checkInsideBlocks-calls.patch diff --git a/leaf-server/minecraft-patches/features/0265-Optimise-TextColor.patch b/leaf-archived-patches/unapplied/mcserver/0265-Optimise-TextColor.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0265-Optimise-TextColor.patch rename to leaf-archived-patches/unapplied/mcserver/0265-Optimise-TextColor.patch diff --git a/leaf-server/minecraft-patches/features/0266-Do-not-create-fire-if-explosion-was-cancelled.patch b/leaf-archived-patches/unapplied/mcserver/0266-Do-not-create-fire-if-explosion-was-cancelled.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0266-Do-not-create-fire-if-explosion-was-cancelled.patch rename to leaf-archived-patches/unapplied/mcserver/0266-Do-not-create-fire-if-explosion-was-cancelled.patch diff --git a/leaf-server/minecraft-patches/features/0267-Skip-BlockPhysicsEvent-if-no-listeners.patch b/leaf-archived-patches/unapplied/mcserver/0267-Skip-BlockPhysicsEvent-if-no-listeners.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0267-Skip-BlockPhysicsEvent-if-no-listeners.patch rename to leaf-archived-patches/unapplied/mcserver/0267-Skip-BlockPhysicsEvent-if-no-listeners.patch diff --git a/leaf-server/minecraft-patches/features/0268-Lithium-equipment-tracking.patch b/leaf-archived-patches/unapplied/mcserver/0268-Lithium-equipment-tracking.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0268-Lithium-equipment-tracking.patch rename to leaf-archived-patches/unapplied/mcserver/0268-Lithium-equipment-tracking.patch diff --git a/leaf-server/minecraft-patches/features/0269-fix-purpur-attribute-base-patch.patch b/leaf-archived-patches/unapplied/mcserver/0269-fix-purpur-attribute-base-patch.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0269-fix-purpur-attribute-base-patch.patch rename to leaf-archived-patches/unapplied/mcserver/0269-fix-purpur-attribute-base-patch.patch diff --git a/leaf-server/minecraft-patches/features/0270-Bump-netty-to-4.2.x.patch b/leaf-archived-patches/unapplied/mcserver/0270-Bump-netty-to-4.2.x.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0270-Bump-netty-to-4.2.x.patch rename to leaf-archived-patches/unapplied/mcserver/0270-Bump-netty-to-4.2.x.patch diff --git a/leaf-server/minecraft-patches/features/0271-Paper-PR-Optimise-temptation-lookups.patch b/leaf-archived-patches/unapplied/mcserver/0271-Paper-PR-Optimise-temptation-lookups.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0271-Paper-PR-Optimise-temptation-lookups.patch rename to leaf-archived-patches/unapplied/mcserver/0271-Paper-PR-Optimise-temptation-lookups.patch diff --git a/leaf-server/minecraft-patches/features/0272-fix-temptation-lookups.patch b/leaf-archived-patches/unapplied/mcserver/0272-fix-temptation-lookups.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0272-fix-temptation-lookups.patch rename to leaf-archived-patches/unapplied/mcserver/0272-fix-temptation-lookups.patch diff --git a/leaf-server/minecraft-patches/features/0273-Lithium-combined-heightmap-update.patch b/leaf-archived-patches/unapplied/mcserver/0273-Lithium-combined-heightmap-update.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0273-Lithium-combined-heightmap-update.patch rename to leaf-archived-patches/unapplied/mcserver/0273-Lithium-combined-heightmap-update.patch diff --git a/leaf-server/minecraft-patches/features/0274-Skip-PreCreatureSpawnEvent-if-no-listeners.patch b/leaf-archived-patches/unapplied/mcserver/0274-Skip-PreCreatureSpawnEvent-if-no-listeners.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0274-Skip-PreCreatureSpawnEvent-if-no-listeners.patch rename to leaf-archived-patches/unapplied/mcserver/0274-Skip-PreCreatureSpawnEvent-if-no-listeners.patch diff --git a/leaf-server/minecraft-patches/features/0275-optimize-goal-selector.patch b/leaf-archived-patches/unapplied/mcserver/0275-optimize-goal-selector.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0275-optimize-goal-selector.patch rename to leaf-archived-patches/unapplied/mcserver/0275-optimize-goal-selector.patch diff --git a/leaf-server/minecraft-patches/features/0276-thread-unsafe-chunk-map.patch b/leaf-archived-patches/unapplied/mcserver/0276-thread-unsafe-chunk-map.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0276-thread-unsafe-chunk-map.patch rename to leaf-archived-patches/unapplied/mcserver/0276-thread-unsafe-chunk-map.patch diff --git a/leaf-server/minecraft-patches/features/0277-optimize-SimpleBitStorage-object-layout.patch b/leaf-archived-patches/unapplied/mcserver/0277-optimize-SimpleBitStorage-object-layout.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0277-optimize-SimpleBitStorage-object-layout.patch rename to leaf-archived-patches/unapplied/mcserver/0277-optimize-SimpleBitStorage-object-layout.patch diff --git a/leaf-server/minecraft-patches/features/0278-optimize-get-chunk.patch b/leaf-archived-patches/unapplied/mcserver/0278-optimize-get-chunk.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0278-optimize-get-chunk.patch rename to leaf-archived-patches/unapplied/mcserver/0278-optimize-get-chunk.patch diff --git a/leaf-server/minecraft-patches/features/0279-remove-shouldTickBlocksAt-check.patch b/leaf-archived-patches/unapplied/mcserver/0279-remove-shouldTickBlocksAt-check.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0279-remove-shouldTickBlocksAt-check.patch rename to leaf-archived-patches/unapplied/mcserver/0279-remove-shouldTickBlocksAt-check.patch diff --git a/leaf-server/minecraft-patches/features/0280-optimize-PalettedContainer-get.patch b/leaf-archived-patches/unapplied/mcserver/0280-optimize-PalettedContainer-get.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0280-optimize-PalettedContainer-get.patch rename to leaf-archived-patches/unapplied/mcserver/0280-optimize-PalettedContainer-get.patch diff --git a/leaf-server/minecraft-patches/features/0281-optimize-LevelChunk-getBlockStateFinal.patch b/leaf-archived-patches/unapplied/mcserver/0281-optimize-LevelChunk-getBlockStateFinal.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0281-optimize-LevelChunk-getBlockStateFinal.patch rename to leaf-archived-patches/unapplied/mcserver/0281-optimize-LevelChunk-getBlockStateFinal.patch diff --git a/leaf-server/minecraft-patches/features/0282-optimize-FluidState-is-TagKey.patch b/leaf-archived-patches/unapplied/mcserver/0282-optimize-FluidState-is-TagKey.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0282-optimize-FluidState-is-TagKey.patch rename to leaf-archived-patches/unapplied/mcserver/0282-optimize-FluidState-is-TagKey.patch diff --git a/leaf-server/minecraft-patches/features/0283-counting-chunk-section-fluid.patch b/leaf-archived-patches/unapplied/mcserver/0283-counting-chunk-section-fluid.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0283-counting-chunk-section-fluid.patch rename to leaf-archived-patches/unapplied/mcserver/0283-counting-chunk-section-fluid.patch diff --git a/leaf-server/minecraft-patches/features/0284-optimize-SpreadingSnowyDirtBlock-randomTick.patch b/leaf-archived-patches/unapplied/mcserver/0284-optimize-SpreadingSnowyDirtBlock-randomTick.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0284-optimize-SpreadingSnowyDirtBlock-randomTick.patch rename to leaf-archived-patches/unapplied/mcserver/0284-optimize-SpreadingSnowyDirtBlock-randomTick.patch diff --git a/leaf-server/minecraft-patches/features/0285-optimize-onClimbable.patch b/leaf-archived-patches/unapplied/mcserver/0285-optimize-onClimbable.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0285-optimize-onClimbable.patch rename to leaf-archived-patches/unapplied/mcserver/0285-optimize-onClimbable.patch diff --git a/leaf-server/minecraft-patches/features/0286-optimize-applyMovementEmissionAndPlaySound.patch b/leaf-archived-patches/unapplied/mcserver/0286-optimize-applyMovementEmissionAndPlaySound.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0286-optimize-applyMovementEmissionAndPlaySound.patch rename to leaf-archived-patches/unapplied/mcserver/0286-optimize-applyMovementEmissionAndPlaySound.patch diff --git a/leaf-server/minecraft-patches/features/0287-optimize-isStateClimbable.patch b/leaf-archived-patches/unapplied/mcserver/0287-optimize-isStateClimbable.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0287-optimize-isStateClimbable.patch rename to leaf-archived-patches/unapplied/mcserver/0287-optimize-isStateClimbable.patch diff --git a/leaf-server/minecraft-patches/features/0288-optimize-getOnPos.patch b/leaf-archived-patches/unapplied/mcserver/0288-optimize-getOnPos.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0288-optimize-getOnPos.patch rename to leaf-archived-patches/unapplied/mcserver/0288-optimize-getOnPos.patch diff --git a/leaf-server/minecraft-patches/features/0289-cache-eye-block-position.patch b/leaf-archived-patches/unapplied/mcserver/0289-cache-eye-block-position.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0289-cache-eye-block-position.patch rename to leaf-archived-patches/unapplied/mcserver/0289-cache-eye-block-position.patch diff --git a/leaf-server/minecraft-patches/features/0290-optimize-updateFluidHeightAndDoFluidPushing.patch b/leaf-archived-patches/unapplied/mcserver/0290-optimize-updateFluidHeightAndDoFluidPushing.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0290-optimize-updateFluidHeightAndDoFluidPushing.patch rename to leaf-archived-patches/unapplied/mcserver/0290-optimize-updateFluidHeightAndDoFluidPushing.patch diff --git a/leaf-server/minecraft-patches/features/0291-optimize-checkInsideBlocks.patch b/leaf-archived-patches/unapplied/mcserver/0291-optimize-checkInsideBlocks.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0291-optimize-checkInsideBlocks.patch rename to leaf-archived-patches/unapplied/mcserver/0291-optimize-checkInsideBlocks.patch diff --git a/leaf-server/minecraft-patches/features/0292-replace-entity-fluid-height-map.patch b/leaf-archived-patches/unapplied/mcserver/0292-replace-entity-fluid-height-map.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0292-replace-entity-fluid-height-map.patch rename to leaf-archived-patches/unapplied/mcserver/0292-replace-entity-fluid-height-map.patch diff --git a/leaf-server/minecraft-patches/features/0293-optimize-collision-shape.patch b/leaf-archived-patches/unapplied/mcserver/0293-optimize-collision-shape.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0293-optimize-collision-shape.patch rename to leaf-archived-patches/unapplied/mcserver/0293-optimize-collision-shape.patch diff --git a/leaf-server/minecraft-patches/features/0294-cache-collision-list.patch b/leaf-archived-patches/unapplied/mcserver/0294-cache-collision-list.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0294-cache-collision-list.patch rename to leaf-archived-patches/unapplied/mcserver/0294-cache-collision-list.patch diff --git a/leaf-server/minecraft-patches/features/0295-fast-bit-radix-sort.patch b/leaf-archived-patches/unapplied/mcserver/0295-fast-bit-radix-sort.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0295-fast-bit-radix-sort.patch rename to leaf-archived-patches/unapplied/mcserver/0295-fast-bit-radix-sort.patch diff --git a/leaf-server/minecraft-patches/features/0296-optimize-tickEffects.patch b/leaf-archived-patches/unapplied/mcserver/0296-optimize-tickEffects.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0296-optimize-tickEffects.patch rename to leaf-archived-patches/unapplied/mcserver/0296-optimize-tickEffects.patch diff --git a/leaf-server/minecraft-patches/features/0297-Pluto-Expose-Direction-Plane-s-faces.patch b/leaf-archived-patches/unapplied/mcserver/0297-Pluto-Expose-Direction-Plane-s-faces.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0297-Pluto-Expose-Direction-Plane-s-faces.patch rename to leaf-archived-patches/unapplied/mcserver/0297-Pluto-Expose-Direction-Plane-s-faces.patch diff --git a/leaf-server/minecraft-patches/features/0298-Pluto-reduce-allocation.patch b/leaf-archived-patches/unapplied/mcserver/0298-Pluto-reduce-allocation.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0298-Pluto-reduce-allocation.patch rename to leaf-archived-patches/unapplied/mcserver/0298-Pluto-reduce-allocation.patch diff --git a/leaf-server/minecraft-patches/features/0299-Only-update-frozen-ticks-if-changed.patch b/leaf-archived-patches/unapplied/mcserver/0299-Only-update-frozen-ticks-if-changed.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0299-Only-update-frozen-ticks-if-changed.patch rename to leaf-archived-patches/unapplied/mcserver/0299-Only-update-frozen-ticks-if-changed.patch diff --git a/leaf-server/minecraft-patches/features/0149-Remove-stream-in-entity-mountedOrDismounted-changes-.patch b/leaf-archived-patches/work/server/minecraft-patches/features/0149-Remove-stream-in-entity-mountedOrDismounted-changes-.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0149-Remove-stream-in-entity-mountedOrDismounted-changes-.patch rename to leaf-archived-patches/work/server/minecraft-patches/features/0149-Remove-stream-in-entity-mountedOrDismounted-changes-.patch diff --git a/leaf-server/minecraft-patches/features/0155-Do-not-place-player-if-the-server-is-full.patch b/leaf-archived-patches/work/server/minecraft-patches/features/0155-Do-not-place-player-if-the-server-is-full.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0155-Do-not-place-player-if-the-server-is-full.patch rename to leaf-archived-patches/work/server/minecraft-patches/features/0155-Do-not-place-player-if-the-server-is-full.patch diff --git a/leaf-server/minecraft-patches/features/0005-Remove-vanilla-profiler.patch b/leaf-server/minecraft-patches/features/0005-Remove-vanilla-profiler.patch index 5abbe591..a0bb82a7 100644 --- a/leaf-server/minecraft-patches/features/0005-Remove-vanilla-profiler.patch +++ b/leaf-server/minecraft-patches/features/0005-Remove-vanilla-profiler.patch @@ -1383,7 +1383,7 @@ index 98773bf5a1ad39f405bf0f3bb92ea406813dde67..f871c40148fdb6b0798ea2e3291fc92b } } diff --git a/net/minecraft/world/entity/LivingEntity.java b/net/minecraft/world/entity/LivingEntity.java -index 1a5ce901d6bcf6fdc476ea8bf64b1c5aac55a555..ca46c3a7ba5ffb6cd552cc1313db615c28bd7509 100644 +index fcc6eb1bdadbea20a373f43d0b6fc5ead0b6be40..c0644e6e6168619932885d2cff32f2bd6ac09734 100644 --- a/net/minecraft/world/entity/LivingEntity.java +++ b/net/minecraft/world/entity/LivingEntity.java @@ -70,8 +70,6 @@ import net.minecraft.tags.FluidTags; @@ -1395,7 +1395,7 @@ index 1a5ce901d6bcf6fdc476ea8bf64b1c5aac55a555..ca46c3a7ba5ffb6cd552cc1313db615c import net.minecraft.world.Difficulty; import net.minecraft.world.InteractionHand; import net.minecraft.world.damagesource.CombatRules; -@@ -436,8 +434,6 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin +@@ -435,8 +433,6 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin } super.baseTick(); @@ -1404,7 +1404,7 @@ index 1a5ce901d6bcf6fdc476ea8bf64b1c5aac55a555..ca46c3a7ba5ffb6cd552cc1313db615c if (this.isAlive() && this.level() instanceof ServerLevel serverLevel1) { boolean flag = this instanceof Player; if (this.isInWall()) { -@@ -518,7 +514,6 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin +@@ -517,7 +513,6 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin this.yBodyRotO = this.yBodyRot; this.yRotO = this.getYRot(); this.xRotO = this.getXRot(); @@ -1412,7 +1412,7 @@ index 1a5ce901d6bcf6fdc476ea8bf64b1c5aac55a555..ca46c3a7ba5ffb6cd552cc1313db615c } protected boolean shouldTakeDrowningDamage() { -@@ -3317,11 +3312,7 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin +@@ -3316,11 +3311,7 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin f1 = this.getYRot(); } @@ -1424,7 +1424,7 @@ index 1a5ce901d6bcf6fdc476ea8bf64b1c5aac55a555..ca46c3a7ba5ffb6cd552cc1313db615c // Paper start - stop large pitch and yaw changes from crashing the server this.yRotO += Math.round((this.getYRot() - this.yRotO) / 360.0F) * 360.0F; -@@ -3333,7 +3324,6 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin +@@ -3332,7 +3323,6 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin this.yHeadRotO += Math.round((this.yHeadRot - this.yHeadRotO) / 360.0F) * 360.0F; // Paper end - stop large pitch and yaw changes from crashing the server @@ -1432,7 +1432,7 @@ index 1a5ce901d6bcf6fdc476ea8bf64b1c5aac55a555..ca46c3a7ba5ffb6cd552cc1313db615c if (this.isFallFlying()) { this.fallFlyTicks++; } else { -@@ -3509,21 +3499,15 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin +@@ -3508,21 +3498,15 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin } this.setDeltaMovement(d, d1, d2); @@ -1454,7 +1454,7 @@ index 1a5ce901d6bcf6fdc476ea8bf64b1c5aac55a555..ca46c3a7ba5ffb6cd552cc1313db615c if (this.jumping && this.isAffectedByFluids()) { double fluidHeight; if (this.isInLava()) { -@@ -3552,8 +3536,6 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin +@@ -3551,8 +3535,6 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin this.noJumpDelay = 0; } @@ -1463,7 +1463,7 @@ index 1a5ce901d6bcf6fdc476ea8bf64b1c5aac55a555..ca46c3a7ba5ffb6cd552cc1313db615c if (this.isFallFlying()) { this.updateFallFlying(); } -@@ -3578,9 +3560,7 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin +@@ -3577,9 +3559,7 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin this.calculateEntityAnimation(this instanceof FlyingAnimal); } @@ -1473,7 +1473,7 @@ index 1a5ce901d6bcf6fdc476ea8bf64b1c5aac55a555..ca46c3a7ba5ffb6cd552cc1313db615c if ((!this.isInPowderSnow || !this.canFreeze()) && !this.freezeLocked) { // Paper - Freeze Tick Lock API this.setTicksFrozen(Math.max(0, this.getTicksFrozen() - 2)); } -@@ -3590,18 +3570,14 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin +@@ -3589,18 +3569,14 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin if (this.tickCount % 40 == 0 && this.isFullyFrozen() && this.canFreeze()) { this.hurtServer(serverLevel, this.damageSources().freeze(), 1.0F); } diff --git a/leaf-server/minecraft-patches/features/0015-Cache-on-climbable-check.patch b/leaf-server/minecraft-patches/features/0015-Cache-on-climbable-check.patch index 08fbf5fd..19d6203b 100644 --- a/leaf-server/minecraft-patches/features/0015-Cache-on-climbable-check.patch +++ b/leaf-server/minecraft-patches/features/0015-Cache-on-climbable-check.patch @@ -44,10 +44,10 @@ index ae2bb9a73106febfe5f0d090abd4252bbb5fd27e..eee9c41e40402e52b73f34a734b4cbde } if (entity instanceof final Mob mob && mob.getTarget() != null) { diff --git a/net/minecraft/world/entity/LivingEntity.java b/net/minecraft/world/entity/LivingEntity.java -index ca46c3a7ba5ffb6cd552cc1313db615c28bd7509..b51c565c9785bc22306380744f8f855ebe9e2b11 100644 +index c0644e6e6168619932885d2cff32f2bd6ac09734..f3cb0edeb911efed44db9a07bdf42e17cc10d72a 100644 --- a/net/minecraft/world/entity/LivingEntity.java +++ b/net/minecraft/world/entity/LivingEntity.java -@@ -2147,6 +2147,21 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin +@@ -2146,6 +2146,21 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin return this.lastClimbablePos; } diff --git a/leaf-server/minecraft-patches/features/0022-Reduce-in-wall-checks.patch b/leaf-server/minecraft-patches/features/0022-Reduce-in-wall-checks.patch index 76208512..3f9f866b 100644 --- a/leaf-server/minecraft-patches/features/0022-Reduce-in-wall-checks.patch +++ b/leaf-server/minecraft-patches/features/0022-Reduce-in-wall-checks.patch @@ -28,10 +28,10 @@ but is so much cheaper than the suffocation check that it's worth keeping it. diff --git a/net/minecraft/world/entity/LivingEntity.java b/net/minecraft/world/entity/LivingEntity.java -index b51c565c9785bc22306380744f8f855ebe9e2b11..6bd80817991a0f21d650c89e24193e4c4f98769e 100644 +index f3cb0edeb911efed44db9a07bdf42e17cc10d72a..513c00274b45706d3fc90b5d045159e83cc644e6 100644 --- a/net/minecraft/world/entity/LivingEntity.java +++ b/net/minecraft/world/entity/LivingEntity.java -@@ -436,7 +436,10 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin +@@ -435,7 +435,10 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin super.baseTick(); if (this.isAlive() && this.level() instanceof ServerLevel serverLevel1) { boolean flag = this instanceof Player; @@ -43,7 +43,7 @@ index b51c565c9785bc22306380744f8f855ebe9e2b11..6bd80817991a0f21d650c89e24193e4c this.hurtServer(serverLevel1, this.damageSources().inWall(), 1.0F); } else if (flag && !serverLevel1.getWorldBorder().isWithinBounds(this.getBoundingBox())) { double d = serverLevel1.getWorldBorder().getDistanceToBorder(this) + serverLevel1.getWorldBorder().getSafeZone(); -@@ -1406,6 +1409,12 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin +@@ -1405,6 +1408,12 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin return this.getHealth() <= 0.0F; } diff --git a/leaf-server/minecraft-patches/features/0045-Reduce-array-allocations.patch b/leaf-server/minecraft-patches/features/0045-Reduce-array-allocations.patch index 8aa7ba26..4b495e83 100644 --- a/leaf-server/minecraft-patches/features/0045-Reduce-array-allocations.patch +++ b/leaf-server/minecraft-patches/features/0045-Reduce-array-allocations.patch @@ -289,10 +289,10 @@ index b383836c200ca9f7bd84639367aa81b57868fb25..3af4a6dcc81afaf2860325fe5852c9a9 private static Map createForAllSlots(List equipmentSlots, float dropChance) { diff --git a/net/minecraft/world/entity/LivingEntity.java b/net/minecraft/world/entity/LivingEntity.java -index 6bd80817991a0f21d650c89e24193e4c4f98769e..c4bda5d975cce38a725b8590261d97fcfac3d95d 100644 +index 513c00274b45706d3fc90b5d045159e83cc644e6..85f9e78eec69295a4680d4210b20a915b678b7c6 100644 --- a/net/minecraft/world/entity/LivingEntity.java +++ b/net/minecraft/world/entity/LivingEntity.java -@@ -3390,7 +3390,7 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin +@@ -3389,7 +3389,7 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin Map equipmentChanges = null; // Paper end - EntityEquipmentChangedEvent @@ -301,7 +301,7 @@ index 6bd80817991a0f21d650c89e24193e4c4f98769e..c4bda5d975cce38a725b8590261d97fc ItemStack itemStack = this.lastEquipmentItems.get(equipmentSlot); ItemStack itemBySlot = this.getItemBySlot(equipmentSlot); if (this.equipmentHasChanged(itemStack, itemBySlot)) { -@@ -3662,7 +3662,7 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin +@@ -3661,7 +3661,7 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin public boolean canGlide() { if (!this.onGround() && !this.isPassenger() && !this.hasEffect(MobEffects.LEVITATION)) { diff --git a/leaf-server/minecraft-patches/features/0055-Check-frozen-ticks-before-landing-block.patch b/leaf-server/minecraft-patches/features/0055-Check-frozen-ticks-before-landing-block.patch index 54e85e43..1f6f055d 100644 --- a/leaf-server/minecraft-patches/features/0055-Check-frozen-ticks-before-landing-block.patch +++ b/leaf-server/minecraft-patches/features/0055-Check-frozen-ticks-before-landing-block.patch @@ -13,10 +13,10 @@ As part of: Lithium (https://github.com/CaffeineMC/lithium) Licensed under: LGPL-3.0 (https://www.gnu.org/licenses/lgpl-3.0.html) diff --git a/net/minecraft/world/entity/LivingEntity.java b/net/minecraft/world/entity/LivingEntity.java -index c4bda5d975cce38a725b8590261d97fcfac3d95d..39b3b17dd9cafa59393d40bf0090edeadacde428 100644 +index 85f9e78eec69295a4680d4210b20a915b678b7c6..64ac6201d0f4ce90f68509bf372cacba6999a743 100644 --- a/net/minecraft/world/entity/LivingEntity.java +++ b/net/minecraft/world/entity/LivingEntity.java -@@ -542,10 +542,9 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin +@@ -541,10 +541,9 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin } protected void tryAddFrost() { @@ -28,7 +28,7 @@ index c4bda5d975cce38a725b8590261d97fcfac3d95d..39b3b17dd9cafa59393d40bf0090edea if (attribute == null) { return; } -@@ -553,7 +552,6 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin +@@ -552,7 +551,6 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin float f = -0.05F * this.getPercentFrozen(); attribute.addTransientModifier(new AttributeModifier(SPEED_MODIFIER_POWDER_SNOW_ID, f, AttributeModifier.Operation.ADD_VALUE)); } diff --git a/leaf-server/minecraft-patches/features/0071-Don-t-load-chunks-to-activate-climbing-entities.patch b/leaf-server/minecraft-patches/features/0071-Don-t-load-chunks-to-activate-climbing-entities.patch index c7749ec0..e1a94813 100644 --- a/leaf-server/minecraft-patches/features/0071-Don-t-load-chunks-to-activate-climbing-entities.patch +++ b/leaf-server/minecraft-patches/features/0071-Don-t-load-chunks-to-activate-climbing-entities.patch @@ -28,10 +28,10 @@ index faacc8b73cb0a06c797abe461fbfacfebe95648f..a58dd6d8e69736163b7099d66b0ebcb1 return this.chunkPosition; } diff --git a/net/minecraft/world/entity/LivingEntity.java b/net/minecraft/world/entity/LivingEntity.java -index 39b3b17dd9cafa59393d40bf0090edeadacde428..3c972e39a66c1aa9253eaae818eab6feac94c66d 100644 +index 64ac6201d0f4ce90f68509bf372cacba6999a743..4d7bc1a2ef17582a89868b81e09ee9303b8b8927 100644 --- a/net/minecraft/world/entity/LivingEntity.java +++ b/net/minecraft/world/entity/LivingEntity.java -@@ -2161,8 +2161,17 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin +@@ -2160,8 +2160,17 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin public boolean onClimbableCached() { if (!this.blockPosition().equals(this.lastClimbingPosition)) { @@ -51,7 +51,7 @@ index 39b3b17dd9cafa59393d40bf0090edeadacde428..3c972e39a66c1aa9253eaae818eab6fe } return this.cachedOnClimbable; -@@ -2170,11 +2179,25 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin +@@ -2169,11 +2178,25 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin // Gale end - Airplane - cache on climbable check public boolean onClimbable() { diff --git a/leaf-server/minecraft-patches/features/0085-Reduce-skull-ItemStack-lookups-for-reduced-visibilit.patch b/leaf-server/minecraft-patches/features/0085-Reduce-skull-ItemStack-lookups-for-reduced-visibilit.patch index 58f87a5e..a77956e3 100644 --- a/leaf-server/minecraft-patches/features/0085-Reduce-skull-ItemStack-lookups-for-reduced-visibilit.patch +++ b/leaf-server/minecraft-patches/features/0085-Reduce-skull-ItemStack-lookups-for-reduced-visibilit.patch @@ -18,10 +18,10 @@ this patch is focused around the sensors used for ai delete the line of sight cache less often and use a faster nearby comparison diff --git a/net/minecraft/world/entity/LivingEntity.java b/net/minecraft/world/entity/LivingEntity.java -index 3c972e39a66c1aa9253eaae818eab6feac94c66d..dea4e1b292471eb672d2b7cc9369193a51e0a91c 100644 +index 4d7bc1a2ef17582a89868b81e09ee9303b8b8927..7993002df8610a99780e1e8f764270d460cd5c1f 100644 --- a/net/minecraft/world/entity/LivingEntity.java +++ b/net/minecraft/world/entity/LivingEntity.java -@@ -1040,15 +1040,16 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin +@@ -1039,15 +1039,16 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin } if (lookingEntity != null) { diff --git a/leaf-server/minecraft-patches/features/0092-Purpur-Server-Minecraft-Changes.patch b/leaf-server/minecraft-patches/features/0090-Purpur-Server-Minecraft-Changes.patch similarity index 95% rename from leaf-server/minecraft-patches/features/0092-Purpur-Server-Minecraft-Changes.patch rename to leaf-server/minecraft-patches/features/0090-Purpur-Server-Minecraft-Changes.patch index 38187830..a4aecae7 100644 --- a/leaf-server/minecraft-patches/features/0092-Purpur-Server-Minecraft-Changes.patch +++ b/leaf-server/minecraft-patches/features/0090-Purpur-Server-Minecraft-Changes.patch @@ -6,7 +6,7 @@ Subject: [PATCH] Purpur Server Minecraft Changes Original license: MIT Original project: https://github.com/PurpurMC/Purpur -Commit: 0c9140aff1fac81adb2edae1dc75cc8b069b8c3b +Commit: 48dad559a7c03f3a894a5cb30df365a21fe0f460 Patches listed below are removed in this patch, They exists in Gale or Leaf: * "net/minecraft/CrashReport.java.patch" @@ -63,7 +63,7 @@ index c9de5fbb56b7b455b4c8bc59539695fd58a32566..ea01daf583ddd110f153304a6a65ac2d if (entity instanceof FireworkRocketEntity || (entity instanceof ItemEntity && (entity.tickCount + entity.getId()) % 4 == 0)) { // Needed for item gravity, see ItemEntity tick return true; diff --git a/net/minecraft/commands/CommandSourceStack.java b/net/minecraft/commands/CommandSourceStack.java -index 3acfb2a78845dd8081dc3c01d653034232c76e60..51caf352e77df49fc04bf84f1fab29b6f4f4fc14 100644 +index 6ead209287ab021b8245fa5c3b7f18ca7d9c66b3..d8b9b187ed66e40e038ada921383e61021332a8a 100644 --- a/net/minecraft/commands/CommandSourceStack.java +++ b/net/minecraft/commands/CommandSourceStack.java @@ -447,6 +447,19 @@ public class CommandSourceStack implements ExecutionCommandSource= resultLimit) { return players; -@@ -270,4 +271,10 @@ public class EntitySelector { +@@ -271,4 +272,10 @@ public class EntitySelector { public static Component joinNames(List names) { return ComponentUtils.formatList(names, Entity::getDisplayName); } @@ -206,10 +198,10 @@ index 514f8fbdeb776087608665c35de95294aadf5cf0..b305ba9bab617bf4e52d0e6ddf160bac + // Purpur end - Hide hidden players from entity selector } diff --git a/net/minecraft/core/BlockPos.java b/net/minecraft/core/BlockPos.java -index a81694a22e94cca6f7110f7d5b205d1303f4e071..6518d3fff6daf331b24a7bf5b39fa1920b73711d 100644 +index 46538c243c5a9b95bb859a1fcc9a37f05ef11daf..c6d894905472c70667387a32ed585d8fc411f4ba 100644 --- a/net/minecraft/core/BlockPos.java +++ b/net/minecraft/core/BlockPos.java -@@ -63,6 +63,12 @@ public class BlockPos extends Vec3i { +@@ -64,6 +64,12 @@ public class BlockPos extends Vec3i { public static final int MAX_HORIZONTAL_COORDINATE = 33554431; // Paper end - Optimize Bit Operations by inlining @@ -223,10 +215,10 @@ index a81694a22e94cca6f7110f7d5b205d1303f4e071..6518d3fff6daf331b24a7bf5b39fa192 super(x, y, z); } diff --git a/net/minecraft/core/dispenser/DispenseItemBehavior.java b/net/minecraft/core/dispenser/DispenseItemBehavior.java -index ca02c4c71a0a5a1a0ae8bbb40f0b1b7eac64e6fd..582e012222123e5001c34153f2ee1ab1d08935fd 100644 +index 703a75c7c6cd05a95afb630973250898dbc7223d..91a1ae527589ecab1322e97efd9e863a84fcb4fe 100644 --- a/net/minecraft/core/dispenser/DispenseItemBehavior.java +++ b/net/minecraft/core/dispenser/DispenseItemBehavior.java -@@ -735,5 +735,22 @@ public interface DispenseItemBehavior { +@@ -744,5 +744,22 @@ public interface DispenseItemBehavior { DispenserBlock.registerBehavior(Items.TNT_MINECART, new MinecartDispenseItemBehavior(EntityType.TNT_MINECART)); DispenserBlock.registerBehavior(Items.HOPPER_MINECART, new MinecartDispenseItemBehavior(EntityType.HOPPER_MINECART)); DispenserBlock.registerBehavior(Items.COMMAND_BLOCK_MINECART, new MinecartDispenseItemBehavior(EntityType.COMMAND_BLOCK_MINECART)); @@ -263,10 +255,10 @@ index e2d169b45f1dba6559ca337b07a110f79d3db504..727d04a442053f6d0c4df3e744554e28 // CraftBukkit start net.minecraft.world.level.Level world = blockSource.level(); diff --git a/net/minecraft/gametest/framework/GameTestHelper.java b/net/minecraft/gametest/framework/GameTestHelper.java -index 9fb53bc1330bf5370769200599b022a985f88db2..d6e8bd3b302f821b286b15db3d66c8b2a9493ef5 100644 +index 105cdffc5eebe7eafba1298a9e8e663682edde34..c92ffd8b2fe4945ccd552eb54154b7be0e1b492e 100644 --- a/net/minecraft/gametest/framework/GameTestHelper.java +++ b/net/minecraft/gametest/framework/GameTestHelper.java -@@ -292,6 +292,10 @@ public class GameTestHelper { +@@ -312,6 +312,10 @@ public class GameTestHelper { return gameType; } @@ -278,10 +270,10 @@ index 9fb53bc1330bf5370769200599b022a985f88db2..d6e8bd3b302f821b286b15db3d66c8b2 public boolean isClientAuthoritative() { return false; diff --git a/net/minecraft/gametest/framework/TestCommand.java b/net/minecraft/gametest/framework/TestCommand.java -index 17f33a309ead525975a3090514a6367260f0af09..f4360d9472ba344f2e7afd6d798d313d5423fcb5 100644 +index dda1353bb13d26c28725496e221b6281eb3b201b..4ba32390b1a7aeb674214d6393e26aba5358c00a 100644 --- a/net/minecraft/gametest/framework/TestCommand.java +++ b/net/minecraft/gametest/framework/TestCommand.java -@@ -449,7 +449,7 @@ public class TestCommand { +@@ -452,7 +452,7 @@ public class TestCommand { ) ) ); @@ -291,7 +283,7 @@ index 17f33a309ead525975a3090514a6367260f0af09..f4360d9472ba344f2e7afd6d798d313d Commands.literal("export") .then( diff --git a/net/minecraft/network/Connection.java b/net/minecraft/network/Connection.java -index 41005f6b9f53a9c1125ad5e08538d9f5aacb3571..411e1284a208ca1a097cf6eaa92e1e0d2203d83d 100644 +index c5b3f7544a968f835b13819cc61cfacf06af53a2..3f85f9e9551b2eed6e66ab8036dbb1f40fb8bbac 100644 --- a/net/minecraft/network/Connection.java +++ b/net/minecraft/network/Connection.java @@ -580,11 +580,20 @@ public class Connection extends SimpleChannelInboundHandler> { @@ -316,10 +308,10 @@ index 41005f6b9f53a9c1125ad5e08538d9f5aacb3571..411e1284a208ca1a097cf6eaa92e1e0d } // Paper end - Buffer joins to world diff --git a/net/minecraft/server/Main.java b/net/minecraft/server/Main.java -index b16f3f515a76ddbbd74d73464396cf094cb30599..4134679c838307de7ae410cfc727fada0eeebf6b 100644 +index 307187a16a3a5219b432237845f9cf6c4a6f897d..dd527913e627ad2f80962335007effe41e6ddbe7 100644 --- a/net/minecraft/server/Main.java +++ b/net/minecraft/server/Main.java -@@ -109,6 +109,13 @@ public class Main { +@@ -107,6 +107,13 @@ public class Main { JvmProfiler.INSTANCE.start(Environment.SERVER); } @@ -334,10 +326,10 @@ index b16f3f515a76ddbbd74d73464396cf094cb30599..4134679c838307de7ae410cfc727fada io.papermc.paper.plugin.PluginInitializerManager.load(optionSet); // Paper Bootstrap.bootStrap(); diff --git a/net/minecraft/server/MinecraftServer.java b/net/minecraft/server/MinecraftServer.java -index 3e78cec93eebc5aaca28d4de53c8200f9bb43edd..808f3adbae68cbd9863bfd8fa1d9592cae6b9ddf 100644 +index 5a8a850fced72df9791822af910aa3d21b229278..d1bac0988a41950cce8ffc5025bb1400a13f9b05 100644 --- a/net/minecraft/server/MinecraftServer.java +++ b/net/minecraft/server/MinecraftServer.java -@@ -266,6 +266,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop processQueue = new java.util.concurrent.ConcurrentLinkedQueue(); public int autosavePeriod; // Paper - don't store the vanilla dispatcher -@@ -287,6 +288,8 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop pluginsBlockingSleep = new java.util.HashSet<>(); // Paper - API to allow/disallow tick sleeping public static final long SERVER_INIT = System.nanoTime(); // Paper - Lag compensation public gg.pufferfish.pufferfish.util.AsyncExecutor mobSpawnExecutor = new gg.pufferfish.pufferfish.util.AsyncExecutor("MobSpawning"); // Pufferfish - optimize mob spawning @@ -354,7 +346,7 @@ index 3e78cec93eebc5aaca28d4de53c8200f9bb43edd..808f3adbae68cbd9863bfd8fa1d9592c public static S spin(Function threadFunction) { ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry.init(); // Paper - rewrite data converter system -@@ -978,6 +981,15 @@ 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 @@ -469,7 +461,7 @@ index 6f4fcee9fdba2248227708fcced1ce0f40aff6af..13f1dbd0d09428e9e0a42f99d0553283 i++; } else if (targets.size() == 1) { diff --git a/net/minecraft/server/commands/GameModeCommand.java b/net/minecraft/server/commands/GameModeCommand.java -index 9da9ab3b835a8dcc7e1da286be1de88a3f0240fa..4b8c9aaf1d143bc38f52f646e4e73b56013eda8c 100644 +index 6230c030ca25c39fca911dc586f2d5b1076f18c5..953a337624f93dbc9d2deaec2cba5c2fcd626505 100644 --- a/net/minecraft/server/commands/GameModeCommand.java +++ b/net/minecraft/server/commands/GameModeCommand.java @@ -53,6 +53,18 @@ public class GameModeCommand { @@ -504,10 +496,10 @@ index 4f56cdcf658234b1ca92d38c3df3d31e9be34a15..945d7c0b31fe9ac029e518af92eebd6e ItemEntity itemEntity = serverPlayer.drop(itemStack, false, false, false, null); // Paper - do not fire PlayerDropItemEvent for /give command if (itemEntity != null) { diff --git a/net/minecraft/server/dedicated/DedicatedServer.java b/net/minecraft/server/dedicated/DedicatedServer.java -index ca1406178cfb1a5a10947872585e2dcf3059b460..87fc8861948b50361ec04c5a23406d3abdec6eac 100644 +index 53b4317b07b2ad088871186426cc7b71069f9aa2..d95d21d7075cb3da4fcd4307443aad5a6b838768 100644 --- a/net/minecraft/server/dedicated/DedicatedServer.java +++ b/net/minecraft/server/dedicated/DedicatedServer.java -@@ -105,6 +105,7 @@ public class DedicatedServer extends MinecraftServer implements ServerInterface +@@ -198,6 +198,7 @@ public class DedicatedServer extends MinecraftServer implements ServerInterface public void run() { if (!org.bukkit.craftbukkit.Main.useConsole) return; // CraftBukkit // Paper start - Use TerminalConsoleAppender @@ -515,7 +507,7 @@ index ca1406178cfb1a5a10947872585e2dcf3059b460..87fc8861948b50361ec04c5a23406d3a new com.destroystokyo.paper.console.PaperConsole(DedicatedServer.this).start(); /* BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in, StandardCharsets.UTF_8)); -@@ -188,6 +189,15 @@ public class DedicatedServer extends MinecraftServer implements ServerInterface +@@ -281,6 +282,15 @@ public class DedicatedServer extends MinecraftServer implements ServerInterface org.dreeam.leaf.command.LeafCommands.registerCommands(this); // Leaf - Leaf commands this.server.spark.registerCommandBeforePlugins(this.server); // Paper - spark com.destroystokyo.paper.Metrics.PaperMetrics.startMetrics(); // Paper - start metrics @@ -531,8 +523,8 @@ index ca1406178cfb1a5a10947872585e2dcf3059b460..87fc8861948b50361ec04c5a23406d3a com.destroystokyo.paper.VersionHistoryManager.INSTANCE.getClass(); // Paper - load version history now // Gale start - Pufferfish - SIMD support -@@ -242,6 +252,30 @@ public class DedicatedServer extends MinecraftServer implements ServerInterface - if (true) throw new IllegalStateException("Failed to bind to port", var10); // Paper - Propagate failed to bind to port error +@@ -330,6 +340,30 @@ public class DedicatedServer extends MinecraftServer implements ServerInterface + if (true) throw new IllegalStateException("Failed to bind to port", var11); // Paper - Propagate failed to bind to port error return false; } + // Purpur start - UPnP Port Forwarding @@ -562,27 +554,27 @@ index ca1406178cfb1a5a10947872585e2dcf3059b460..87fc8861948b50361ec04c5a23406d3a // CraftBukkit start this.server.loadPlugins(); -@@ -321,6 +355,8 @@ public class DedicatedServer extends MinecraftServer implements ServerInterface +@@ -406,6 +440,8 @@ public class DedicatedServer extends MinecraftServer implements ServerInterface } if (org.dreeam.leaf.config.modules.async.AsyncMobSpawning.enabled) mobSpawnExecutor.start(); // Pufferfish + org.purpurmc.purpur.task.BossBarTask.startAll(); // Purpur - Implement TPSBar + if (org.purpurmc.purpur.PurpurConfig.beeCountPayload) org.purpurmc.purpur.task.BeehiveTask.instance().register(); // Purpur - Give bee counts in beehives to Purpur clients + this.notificationManager().serverStarted(); return true; - } diff --git a/net/minecraft/server/dedicated/DedicatedServerProperties.java b/net/minecraft/server/dedicated/DedicatedServerProperties.java -index 4a01088da91fc6d620cb804a9ab6d6eb1630b473..b286dc17cda16fca3af9374d2a4a8bd137c24450 100644 +index e352a29c4a45fd3f397d1cf4586c5f149b4ba0d0..a9cd61f0a7bde931e59f1496191f1f8d465aec5e 100644 --- a/net/minecraft/server/dedicated/DedicatedServerProperties.java +++ b/net/minecraft/server/dedicated/DedicatedServerProperties.java -@@ -51,6 +51,7 @@ public class DedicatedServerProperties extends Settings.MutableValue allowFlight = this.getMutable("allow-flight", false); + public final Settings.MutableValue motd = this.getMutable("motd", "A Minecraft Server"); + public final boolean codeOfConduct = this.get("enable-code-of-conduct", false); diff --git a/net/minecraft/server/gui/MinecraftServerGui.java b/net/minecraft/server/gui/MinecraftServerGui.java index f262a7c5ae4e7d56f16f5c0f4f145a2e428abbe4..614c7d9f673c926562acc8fa3b3788623900db41 100644 --- a/net/minecraft/server/gui/MinecraftServerGui.java @@ -722,19 +714,19 @@ index f262a7c5ae4e7d56f16f5c0f4f145a2e428abbe4..614c7d9f673c926562acc8fa3b378862 private JComponent buildOnboardingPanel() { String onboardingLink = "https://docs.papermc.io/paper/next-steps"; diff --git a/net/minecraft/server/level/ServerLevel.java b/net/minecraft/server/level/ServerLevel.java -index 3f70fca36f67fa421314ff92d372a97112a19025..95c128f028c3cce7d0b37821a6e75208323fb4e9 100644 +index 6c4ce132ea9ef5dfa30a7355aa7f3f99eb074558..b1ac9bf962882294cd4545a4b2a351601652ac93 100644 --- a/net/minecraft/server/level/ServerLevel.java +++ b/net/minecraft/server/level/ServerLevel.java -@@ -204,6 +204,8 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe +@@ -210,6 +210,8 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe private final StructureManager structureManager; private final StructureCheck structureCheck; private final boolean tickTime; + private double preciseTime; // Purpur - Configurable daylight cycle + private boolean forceTime; // Purpur - Configurable daylight cycle private final RandomSequences randomSequences; + final LevelDebugSynchronizers debugSynchronizers = new LevelDebugSynchronizers(this); - // CraftBukkit start -@@ -212,6 +214,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe +@@ -220,6 +222,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) @@ -742,13 +734,14 @@ index 3f70fca36f67fa421314ff92d372a97112a19025..95c128f028c3cce7d0b37821a6e75208 @Override public @Nullable LevelChunk getChunkIfLoaded(int x, int z) { -@@ -588,7 +591,24 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe +@@ -607,8 +610,25 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe // CraftBukkit end this.tickTime = tickTime; this.server = server; - this.customSpawners = customSpawners; ++ this.customSpawners = new ArrayList<>(); // Purpur - Allow toggling special MobSpawners per world + this.serverLevelData = levelData; + // Purpur start - Allow toggling special MobSpawners per world -+ this.customSpawners = new ArrayList<>(); + if (purpurConfig.phantomSpawning) { + this.customSpawners.add(new net.minecraft.world.level.levelgen.PhantomSpawner()); + } @@ -765,10 +758,10 @@ index 3f70fca36f67fa421314ff92d372a97112a19025..95c128f028c3cce7d0b37821a6e75208 + this.customSpawners.add(new net.minecraft.world.entity.npc.WanderingTraderSpawner(serverLevelData)); + } + // Purpur end - Allow toggling special MobSpawners per world - this.serverLevelData = serverLevelData; ChunkGenerator chunkGenerator = levelStem.generator(); // CraftBukkit start -@@ -673,6 +693,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe + this.serverLevelData.setWorld(this); +@@ -690,6 +710,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe 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 @@ -776,7 +769,7 @@ index 3f70fca36f67fa421314ff92d372a97112a19025..95c128f028c3cce7d0b37821a6e75208 } // Paper start -@@ -715,7 +736,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe +@@ -732,7 +753,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe } int _int = this.getGameRules().getInt(GameRules.RULE_PLAYERS_SLEEPING_PERCENTAGE); @@ -785,7 +778,7 @@ index 3f70fca36f67fa421314ff92d372a97112a19025..95c128f028c3cce7d0b37821a6e75208 // 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( -@@ -826,6 +847,13 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe +@@ -856,6 +877,13 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe this.serverLevelData.setGameTime(l); this.serverLevelData.getScheduledEvents().tick(this.server, l); if (this.serverLevelData.getGameRules().getBoolean(GameRules.RULE_DAYLIGHT)) { @@ -795,11 +788,11 @@ index 3f70fca36f67fa421314ff92d372a97112a19025..95c128f028c3cce7d0b37821a6e75208 + this.preciseTime += 12000 / (double) incrementTicks; + this.setDayTime(this.preciseTime); + } else -+ // Purpur end - Configurable daylight cycle ++ // Purpur end - Configurable daylight cycle this.setDayTime(this.levelData.getDayTime() + 1L); } } -@@ -833,7 +861,21 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe +@@ -863,6 +891,20 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe public void setDayTime(long time) { this.serverLevelData.setDayTime(time); @@ -816,14 +809,13 @@ index 3f70fca36f67fa421314ff92d372a97112a19025..95c128f028c3cce7d0b37821a6e75208 + // Purpur start - Configurable daylight cycle + public boolean isForceTime() { + return this.forceTime; - } + // Purpur end - Configurable daylight cycle + } - public void tickCustomSpawners(boolean spawnEnemies, boolean spawnFriendlies) { - for (CustomSpawner customSpawner : this.customSpawners) { -@@ -930,9 +972,17 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe + public void tickCustomSpawners(boolean spawnEnemies) { +@@ -960,9 +1002,17 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe && 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); + && !this.getBlockState(blockPos.below()).is(BlockTags.LIGHTNING_RODS); if (flag) { - SkeletonHorse skeletonHorse = EntityType.SKELETON_HORSE.create(this, EntitySpawnReason.EVENT); + // Purpur start - Special mobs naturally spawn @@ -841,7 +833,7 @@ index 3f70fca36f67fa421314ff92d372a97112a19025..95c128f028c3cce7d0b37821a6e75208 skeletonHorse.setAge(0); skeletonHorse.setPos(blockPos.getX(), blockPos.getY(), blockPos.getZ()); this.addFreshEntity(skeletonHorse, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.LIGHTNING); // CraftBukkit -@@ -965,9 +1015,35 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe +@@ -995,9 +1045,35 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe if (blockState.is(Blocks.SNOW)) { int layersValue = blockState.getValue(SnowLayerBlock.LAYERS); if (layersValue < Math.min(_int, 8)) { @@ -877,8 +869,8 @@ index 3f70fca36f67fa421314ff92d372a97112a19025..95c128f028c3cce7d0b37821a6e75208 } } else { org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockFormEvent(this, heightmapPos, Blocks.SNOW.defaultBlockState(), 3, null); // CraftBukkit -@@ -988,7 +1064,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe - pointOfInterestType -> pointOfInterestType.is(PoiTypes.LIGHTNING_ROD), +@@ -1018,7 +1094,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe + holder -> holder.is(PoiTypes.LIGHTNING_ROD), blockPos -> blockPos.getY() == this.getHeight(Heightmap.Types.WORLD_SURFACE, blockPos.getX(), blockPos.getZ()) - 1, pos, - 128, @@ -886,7 +878,7 @@ index 3f70fca36f67fa421314ff92d372a97112a19025..95c128f028c3cce7d0b37821a6e75208 PoiManager.Occupancy.ANY ); return optional.map(blockPos -> blockPos.above(1)); -@@ -1037,8 +1113,26 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe +@@ -1067,8 +1143,26 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe int _int = this.getGameRules().getInt(GameRules.RULE_PLAYERS_SLEEPING_PERCENTAGE); Component component; if (this.sleepStatus.areEnoughSleeping(_int)) { @@ -913,7 +905,7 @@ index 3f70fca36f67fa421314ff92d372a97112a19025..95c128f028c3cce7d0b37821a6e75208 component = Component.translatable("sleep.players_sleeping", this.sleepStatus.amountSleeping(), this.sleepStatus.sleepersNeeded(_int)); } -@@ -1175,6 +1269,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe +@@ -1205,6 +1299,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe @VisibleForTesting public void resetWeatherCycle() { // CraftBukkit start @@ -921,7 +913,7 @@ index 3f70fca36f67fa421314ff92d372a97112a19025..95c128f028c3cce7d0b37821a6e75208 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.... -@@ -1182,6 +1277,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe +@@ -1212,6 +1307,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe this.serverLevelData.setRainTime(0); } // CraftBukkit end @@ -929,7 +921,7 @@ index 3f70fca36f67fa421314ff92d372a97112a19025..95c128f028c3cce7d0b37821a6e75208 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. -@@ -2705,7 +2801,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe +@@ -2773,7 +2869,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe // 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 @@ -939,10 +931,10 @@ index 3f70fca36f67fa421314ff92d372a97112a19025..95c128f028c3cce7d0b37821a6e75208 } // Paper end - Fix merchant inventory not closing on entity removal diff --git a/net/minecraft/server/level/ServerPlayer.java b/net/minecraft/server/level/ServerPlayer.java -index f68b92a85b2223d22cb96ee0f8d588af5696b947..fb585637383db4592f97f0c9040ffa86afb43c6a 100644 +index 1f0532cfd4abb3fd578299919743b9dfc3231110..d64e9d540ca62ca72bca8651bccfbc2f9b002c4d 100644 --- a/net/minecraft/server/level/ServerPlayer.java +++ b/net/minecraft/server/level/ServerPlayer.java -@@ -428,6 +428,9 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc +@@ -442,6 +442,9 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc public boolean isRealPlayer; // Paper public @Nullable com.destroystokyo.paper.event.entity.PlayerNaturallySpawnCreaturesEvent playerNaturallySpawnedEvent; // Paper - PlayerNaturallySpawnCreaturesEvent 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 @@ -952,20 +944,19 @@ index f68b92a85b2223d22cb96ee0f8d588af5696b947..fb585637383db4592f97f0c9040ffa86 // Paper start - rewrite chunk system private ca.spottedleaf.moonrise.patches.chunk_system.player.RegionizedPlayerChunkLoader.PlayerChunkLoaderData chunkLoader; -@@ -561,6 +564,10 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc +@@ -515,6 +518,9 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc 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); -+ + this.tpsBar = input.getBooleanOr("Purpur.TPSBar", false); // Purpur - Implement TPSBar + this.compassBar = input.getBooleanOr("Purpur.CompassBar", false); // Purpur - Add compass command + this.ramBar = input.getBooleanOr("Purpur.RamBar", false); // Purpur - Implement rambar command + // Paper start - Expand PlayerGameModeChangeEvent + this.loadGameTypes(input); } - - @Override -@@ -578,6 +585,9 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc - output.storeNullable("raid_omen_position", BlockPos.CODEC, this.raidOmenPosition); - this.saveEnderPearls(output); +@@ -556,6 +562,9 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc + output.store("ShoulderEntityRight", CompoundTag.CODEC, this.getShoulderEntityRight()); + } this.getBukkitEntity().setExtraData(output); // CraftBukkit + output.putBoolean("Purpur.TPSBar", this.tpsBar); // Purpur - Implement TPSBar + output.putBoolean("Purpur.CompassBar", this.compassBar); // Purpur - Add compass command @@ -973,7 +964,7 @@ index f68b92a85b2223d22cb96ee0f8d588af5696b947..fb585637383db4592f97f0c9040ffa86 } private void saveParentVehicle(ValueOutput output) { -@@ -787,6 +797,15 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc +@@ -765,6 +774,15 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc this.trackEnteredOrExitedLavaOnVehicle(); this.updatePlayerAttributes(); this.advancements.flushDirty(this, true); @@ -989,7 +980,7 @@ index f68b92a85b2223d22cb96ee0f8d588af5696b947..fb585637383db4592f97f0c9040ffa86 } private void updatePlayerAttributes() { -@@ -1078,6 +1097,7 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc +@@ -1189,6 +1207,7 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc // Paper - moved up to sendClientboundPlayerCombatKillPacket() sendClientboundPlayerCombatKillPacket(event.getShowDeathMessages(), deathScreenMessage); // Paper - Expand PlayerDeathEvent Team team = this.getTeam(); @@ -997,7 +988,7 @@ index f68b92a85b2223d22cb96ee0f8d588af5696b947..fb585637383db4592f97f0c9040ffa86 if (team == null || team.getDeathMessageVisibility() == Team.Visibility.ALWAYS) { this.server.getPlayerList().broadcastSystemMessage(deathMessage, false); } else if (team.getDeathMessageVisibility() == Team.Visibility.HIDE_FOR_OTHER_TEAMS) { -@@ -1184,6 +1204,18 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc +@@ -1296,6 +1315,18 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc if (this.isInvulnerableTo(level, damageSource)) { return false; } else { @@ -1016,7 +1007,7 @@ index f68b92a85b2223d22cb96ee0f8d588af5696b947..fb585637383db4592f97f0c9040ffa86 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)) -@@ -1433,6 +1465,7 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc +@@ -1549,6 +1580,7 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc serverLevel.removePlayerImmediately(this, Entity.RemovalReason.CHANGED_DIMENSION); this.unsetRemoved(); // CraftBukkit end @@ -1024,7 +1015,7 @@ index f68b92a85b2223d22cb96ee0f8d588af5696b947..fb585637383db4592f97f0c9040ffa86 this.setServerLevel(level); this.connection.internalTeleport(PositionMoveRotation.of(teleportTransition), teleportTransition.relatives()); // CraftBukkit - use internal teleport without event this.connection.resetPosition(); -@@ -1548,7 +1581,7 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc +@@ -1667,7 +1699,7 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc 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) ); @@ -1033,7 +1024,7 @@ index f68b92a85b2223d22cb96ee0f8d588af5696b947..fb585637383db4592f97f0c9040ffa86 return Either.left(Player.BedSleepingProblem.NOT_SAFE); } } -@@ -1585,7 +1618,19 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc +@@ -1704,7 +1736,19 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc CriteriaTriggers.SLEPT_IN_BED.trigger(this); }); if (!this.level().canSleepThroughNights()) { @@ -1054,7 +1045,7 @@ index f68b92a85b2223d22cb96ee0f8d588af5696b947..fb585637383db4592f97f0c9040ffa86 } this.level().updateSleepingPlayerList(); -@@ -1677,6 +1722,7 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc +@@ -1796,6 +1840,7 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc @Override public void openTextEdit(SignBlockEntity signEntity, boolean isFrontText) { @@ -1062,7 +1053,7 @@ index f68b92a85b2223d22cb96ee0f8d588af5696b947..fb585637383db4592f97f0c9040ffa86 this.connection.send(new ClientboundBlockUpdatePacket(this.level(), signEntity.getBlockPos())); this.connection.send(new ClientboundOpenSignEditorPacket(signEntity.getBlockPos(), isFrontText)); } -@@ -1986,6 +2032,26 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc +@@ -2105,6 +2150,26 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc this.lastSentExp = -1; // CraftBukkit - Added to reset } @@ -1089,7 +1080,7 @@ index f68b92a85b2223d22cb96ee0f8d588af5696b947..fb585637383db4592f97f0c9040ffa86 @Override public void displayClientMessage(Component chatComponent, boolean actionBar) { this.sendSystemMessage(chatComponent, actionBar); -@@ -2210,6 +2276,20 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc +@@ -2332,6 +2397,20 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc ); } @@ -1110,13 +1101,13 @@ index f68b92a85b2223d22cb96ee0f8d588af5696b947..fb585637383db4592f97f0c9040ffa86 public void sendSystemMessage(Component mesage) { this.sendSystemMessage(mesage, false); } -@@ -2348,8 +2428,68 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc +@@ -2470,8 +2549,68 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc public void resetLastActionTime() { this.lastActionTime = Util.getMillis(); + this.setAfk(false); // Purpur - AFK API - } - ++ } ++ + // Purpur start - AFK API + private boolean isAfk = false; + @@ -1141,7 +1132,7 @@ index f68b92a85b2223d22cb96ee0f8d588af5696b947..fb585637383db4592f97f0c9040ffa86 + + msg = event.getBroadcastMsg(); + if (msg != null && !msg.isEmpty()) { -+ String playerName = this.getGameProfile().getName(); ++ String playerName = this.getGameProfile().name(); + if (org.purpurmc.purpur.PurpurConfig.afkBroadcastUseDisplayName) { + net.kyori.adventure.text.Component playerDisplayNameComponent = net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer.legacySection().deserialize(this.getBukkitEntity().getDisplayName()); + playerName = net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer.plainText().serialize(playerDisplayNameComponent); @@ -1168,8 +1159,8 @@ index f68b92a85b2223d22cb96ee0f8d588af5696b947..fb585637383db4592f97f0c9040ffa86 + @Override + public boolean isAfk() { + return this.isAfk; -+ } -+ + } + + @Override + public boolean canBeCollidedWith(Entity entity) { + return !this.isAfk() && super.canBeCollidedWith(entity); @@ -1179,7 +1170,7 @@ index f68b92a85b2223d22cb96ee0f8d588af5696b947..fb585637383db4592f97f0c9040ffa86 public ServerStatsCounter getStats() { return this.stats; } -@@ -2976,4 +3116,56 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc +@@ -3112,4 +3251,56 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc return (org.bukkit.craftbukkit.entity.CraftPlayer) super.getBukkitEntity(); } // CraftBukkit end @@ -1237,10 +1228,10 @@ index f68b92a85b2223d22cb96ee0f8d588af5696b947..fb585637383db4592f97f0c9040ffa86 + // Purpur end - Add rambar command } diff --git a/net/minecraft/server/level/ServerPlayerGameMode.java b/net/minecraft/server/level/ServerPlayerGameMode.java -index cfbf34964288526e93d0a5b212c1b60296c10430..d638821595138ef972163925136eb57207b31719 100644 +index 6133f70e72c56d09c5f9d4a988ae8913102f99df..599d6a4f31e05369caf3ef9f5e54e83396743ec0 100644 --- a/net/minecraft/server/level/ServerPlayerGameMode.java +++ b/net/minecraft/server/level/ServerPlayerGameMode.java -@@ -348,6 +348,7 @@ public class ServerPlayerGameMode { +@@ -368,6 +368,7 @@ public class ServerPlayerGameMode { } return false; } @@ -1248,7 +1239,7 @@ index cfbf34964288526e93d0a5b212c1b60296c10430..d638821595138ef972163925136eb572 } // CraftBukkit end -@@ -461,6 +462,7 @@ public class ServerPlayerGameMode { +@@ -485,6 +486,7 @@ public class ServerPlayerGameMode { public InteractionHand interactHand; public ItemStack interactItemStack; public InteractionResult useItemOn(ServerPlayer player, Level level, ItemStack stack, InteractionHand hand, BlockHitResult hitResult) { @@ -1256,7 +1247,7 @@ index cfbf34964288526e93d0a5b212c1b60296c10430..d638821595138ef972163925136eb572 BlockPos blockPos = hitResult.getBlockPos(); BlockState blockState = level.getBlockState(blockPos); boolean cancelledBlock = false; -@@ -503,7 +505,7 @@ public class ServerPlayerGameMode { +@@ -527,7 +529,7 @@ public class ServerPlayerGameMode { boolean flag = !player.getMainHandItem().isEmpty() || !player.getOffhandItem().isEmpty(); boolean flag1 = player.isSecondaryUseActive() && flag; ItemStack itemStack = stack.copy(); @@ -1265,7 +1256,7 @@ index cfbf34964288526e93d0a5b212c1b60296c10430..d638821595138ef972163925136eb572 InteractionResult interactionResult = blockState.useItemOn(player.getItemInHand(hand), level, player, hand, hitResult); if (interactionResult.consumesAction()) { CriteriaTriggers.ITEM_USED_ON_BLOCK.trigger(player, blockPos, itemStack); -@@ -549,4 +551,18 @@ public class ServerPlayerGameMode { +@@ -573,4 +575,18 @@ public class ServerPlayerGameMode { public void setLevel(ServerLevel serverLevel) { this.level = serverLevel; } @@ -1285,10 +1276,10 @@ index cfbf34964288526e93d0a5b212c1b60296c10430..d638821595138ef972163925136eb572 + // Purpur end - Shift right click to use exp for mending } diff --git a/net/minecraft/server/network/ServerCommonPacketListenerImpl.java b/net/minecraft/server/network/ServerCommonPacketListenerImpl.java -index 37de0c46b065851ea0f0d01e415980e47cc3cfb5..c5ed0843fdcb066d7fa0aa3075796333862ad923 100644 +index ff878c13bc1b55f2d7c3ab025a50746ab782da6c..a174f188487ff769dd6712f926a8c450468a9267 100644 --- a/net/minecraft/server/network/ServerCommonPacketListenerImpl.java +++ b/net/minecraft/server/network/ServerCommonPacketListenerImpl.java -@@ -56,6 +56,10 @@ public abstract class ServerCommonPacketListenerImpl implements ServerCommonPack +@@ -57,6 +57,10 @@ public abstract class ServerCommonPacketListenerImpl implements ServerCommonPack private static final long KEEPALIVE_LIMIT = KEEPALIVE_LIMIT_IN_SECONDS * 1000; // Gale end - Purpur - send multiple keep-alive packets protected static final net.minecraft.resources.ResourceLocation MINECRAFT_BRAND = net.minecraft.resources.ResourceLocation.withDefaultNamespace("brand"); // Paper - Brand support @@ -1299,7 +1290,7 @@ index 37de0c46b065851ea0f0d01e415980e47cc3cfb5..c5ed0843fdcb066d7fa0aa3075796333 // Paper start - retain certain values public @Nullable String playerBrand; public final java.util.Set pluginMessagerChannels; -@@ -194,6 +198,12 @@ public abstract class ServerCommonPacketListenerImpl implements ServerCommonPack +@@ -195,6 +199,12 @@ public abstract class ServerCommonPacketListenerImpl implements ServerCommonPack return; } @@ -1313,10 +1304,10 @@ index 37de0c46b065851ea0f0d01e415980e47cc3cfb5..c5ed0843fdcb066d7fa0aa3075796333 this.playerBrand = new net.minecraft.network.FriendlyByteBuf(io.netty.buffer.Unpooled.wrappedBuffer(data)).readUtf(256); } diff --git a/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/net/minecraft/server/network/ServerGamePacketListenerImpl.java -index a2e43621a9ad2eb7eef0b4a5d7c9bf0f627b9bc9..2c7f35ec3276f420875cf52596ada42b25fe64c8 100644 +index 4415125bef926f39e8904400242b8afcd65162d0..647fce95fb9f9b290831310d39ca2eb2579c8d7a 100644 --- a/net/minecraft/server/network/ServerGamePacketListenerImpl.java +++ b/net/minecraft/server/network/ServerGamePacketListenerImpl.java -@@ -338,6 +338,20 @@ public class ServerGamePacketListenerImpl +@@ -340,6 +340,20 @@ public class ServerGamePacketListenerImpl } // Paper end - configuration phase API @@ -1337,20 +1328,20 @@ index a2e43621a9ad2eb7eef0b4a5d7c9bf0f627b9bc9..2c7f35ec3276f420875cf52596ada42b @Override public void tick() { if (this.ackBlockChangesUpTo > -1) { -@@ -396,6 +410,12 @@ public class ServerGamePacketListenerImpl - if (this.player.getLastActionTime() > 0L - && this.server.getPlayerIdleTimeout() > 0 - && Util.getMillis() - this.player.getLastActionTime() > this.server.getPlayerIdleTimeout() * 1000L * 60L && !this.player.wonGame) { // Paper - Prevent AFK kick while watching end credits -+ // Purpur start - AFK API -+ this.player.setAfk(true); -+ if (!this.player.level().purpurConfig.idleTimeoutKick || (!Boolean.parseBoolean(System.getenv("PURPUR_FORCE_IDLE_KICK")) && kickPermissionCache.getUnchecked(this.player.getBukkitEntity()))) { -+ return; -+ } -+ // Purpur end - AFK API - this.player.resetLastActionTime(); // CraftBukkit - SPIGOT-854 - this.disconnect(Component.translatable("multiplayer.disconnect.idling"), org.bukkit.event.player.PlayerKickEvent.Cause.IDLING); // Paper - kick event cause +@@ -357,6 +371,12 @@ public class ServerGamePacketListenerImpl + && this.server.playerIdleTimeout() > 0 + && Util.getMillis() - this.player.getLastActionTime() > TimeUnit.MINUTES.toMillis(this.server.playerIdleTimeout()) + && !this.player.wonGame) { ++ // Purpur start - AFK API ++ this.player.setAfk(true); ++ if (!this.player.level().purpurConfig.idleTimeoutKick || (!Boolean.parseBoolean(System.getenv("PURPUR_FORCE_IDLE_KICK")) && kickPermissionCache.getUnchecked(this.player.getBukkitEntity()))) { ++ return; ++ } ++ // Purpur end - AFK API + this.disconnect(Component.translatable("multiplayer.disconnect.idling"), org.bukkit.event.player.PlayerKickEvent.Cause.IDLING); // Paper - kick event cause + } } -@@ -665,6 +685,8 @@ public class ServerGamePacketListenerImpl +@@ -671,6 +691,8 @@ public class ServerGamePacketListenerImpl this.lastYaw = to.getYaw(); this.lastPitch = to.getPitch(); @@ -1359,7 +1350,7 @@ index a2e43621a9ad2eb7eef0b4a5d7c9bf0f627b9bc9..2c7f35ec3276f420875cf52596ada42b Location oldTo = to.clone(); PlayerMoveEvent event = new PlayerMoveEvent(player, from, to); this.cserver.getPluginManager().callEvent(event); -@@ -744,6 +766,7 @@ public class ServerGamePacketListenerImpl +@@ -750,6 +772,7 @@ public class ServerGamePacketListenerImpl PacketUtils.ensureRunningOnSameThread(packet, this, this.player.level()); if (packet.getId() == this.awaitingTeleport) { if (this.awaitingPositionFromClient == null) { @@ -1367,7 +1358,7 @@ index a2e43621a9ad2eb7eef0b4a5d7c9bf0f627b9bc9..2c7f35ec3276f420875cf52596ada42b this.disconnect(Component.translatable("multiplayer.disconnect.invalid_player_movement"), org.bukkit.event.player.PlayerKickEvent.Cause.INVALID_PLAYER_MOVEMENT); // Paper - kick event cause return; } -@@ -1282,6 +1305,10 @@ public class ServerGamePacketListenerImpl +@@ -1288,6 +1311,10 @@ public class ServerGamePacketListenerImpl 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; @@ -1378,7 +1369,7 @@ index a2e43621a9ad2eb7eef0b4a5d7c9bf0f627b9bc9..2c7f35ec3276f420875cf52596ada42b for (final String page : pageList) { final int byteLength = page.getBytes(java.nio.charset.StandardCharsets.UTF_8).length; byteTotal += byteLength; -@@ -1306,7 +1333,8 @@ public class ServerGamePacketListenerImpl +@@ -1312,7 +1339,8 @@ public class ServerGamePacketListenerImpl } if (byteTotal > byteAllowed) { @@ -1388,7 +1379,7 @@ index a2e43621a9ad2eb7eef0b4a5d7c9bf0f627b9bc9..2c7f35ec3276f420875cf52596ada42b 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; } -@@ -1325,31 +1353,45 @@ public class ServerGamePacketListenerImpl +@@ -1331,31 +1359,45 @@ public class ServerGamePacketListenerImpl Optional optional = packet.title(); optional.ifPresent(list::add); list.addAll(packet.pages()); @@ -1436,9 +1427,9 @@ index a2e43621a9ad2eb7eef0b4a5d7c9bf0f627b9bc9..2c7f35ec3276f420875cf52596ada42b - List> list = pages.stream().map(filteredText -> this.filterableFromOutgoing(filteredText).map(Component::literal)).toList(); + List> list = pages.stream().map((filteredText) -> this.filterableFromOutgoing(filteredText).map(s -> hexColor(s, hasPerm))).toList(); // Purpur - Allow color codes in books itemStack.set( - DataComponents.WRITTEN_BOOK_CONTENT, - new WrittenBookContent(this.filterableFromOutgoing(title), this.player.getName().getString(), 0, list, true) -@@ -1363,6 +1405,16 @@ public class ServerGamePacketListenerImpl + DataComponents.WRITTEN_BOOK_CONTENT, new WrittenBookContent(this.filterableFromOutgoing(title), this.player.getPlainTextName(), 0, list, true) + ); +@@ -1368,6 +1410,16 @@ public class ServerGamePacketListenerImpl return this.player.isTextFilteringEnabled() ? Filterable.passThrough(filteredText.filteredOrEmpty()) : Filterable.from(filteredText); } @@ -1455,7 +1446,7 @@ index a2e43621a9ad2eb7eef0b4a5d7c9bf0f627b9bc9..2c7f35ec3276f420875cf52596ada42b @Override public void handleEntityTagQuery(ServerboundEntityTagQueryPacket packet) { PacketUtils.ensureRunningOnSameThread(packet, this, this.player.level()); -@@ -1402,7 +1454,15 @@ public class ServerGamePacketListenerImpl +@@ -1407,7 +1459,15 @@ public class ServerGamePacketListenerImpl @Override public void handleMovePlayer(ServerboundMovePlayerPacket packet) { PacketUtils.ensureRunningOnSameThread(packet, this, this.player.level()); @@ -1472,16 +1463,16 @@ index a2e43621a9ad2eb7eef0b4a5d7c9bf0f627b9bc9..2c7f35ec3276f420875cf52596ada42b 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(); -@@ -1584,7 +1644,7 @@ public class ServerGamePacketListenerImpl +@@ -1589,7 +1649,7 @@ public class ServerGamePacketListenerImpl movedWrongly = true; if (event.getLogWarning()) // Paper end -- LOGGER.warn("{} moved wrongly!", this.player.getName().getString()); -+ LOGGER.warn("{} moved wrongly!, ({})", this.player.getName().getString(), verticalDelta); // Purpur - AFK API +- LOGGER.warn("{} moved wrongly!", this.player.getPlainTextName()); ++ LOGGER.warn("{} moved wrongly!, ({})", this.player.getPlainTextName(), verticalDelta); // Purpur - AFK API } // Paper } -@@ -1649,6 +1709,8 @@ public class ServerGamePacketListenerImpl +@@ -1654,6 +1714,8 @@ public class ServerGamePacketListenerImpl this.lastYaw = to.getYaw(); this.lastPitch = to.getPitch(); @@ -1490,7 +1481,7 @@ index a2e43621a9ad2eb7eef0b4a5d7c9bf0f627b9bc9..2c7f35ec3276f420875cf52596ada42b Location oldTo = to.clone(); PlayerMoveEvent event = new PlayerMoveEvent(player, from, to); this.cserver.getPluginManager().callEvent(event); -@@ -1704,6 +1766,13 @@ public class ServerGamePacketListenerImpl +@@ -1709,6 +1771,13 @@ public class ServerGamePacketListenerImpl this.player.tryResetCurrentImpulseContext(); } @@ -1504,7 +1495,7 @@ index a2e43621a9ad2eb7eef0b4a5d7c9bf0f627b9bc9..2c7f35ec3276f420875cf52596ada42b 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(); -@@ -1721,6 +1790,17 @@ public class ServerGamePacketListenerImpl +@@ -1726,6 +1795,17 @@ public class ServerGamePacketListenerImpl } } @@ -1522,7 +1513,7 @@ index a2e43621a9ad2eb7eef0b4a5d7c9bf0f627b9bc9..2c7f35ec3276f420875cf52596ada42b private boolean shouldCheckPlayerMovement(boolean isElytraMovement) { if (this.isSingleplayerOwner()) { return false; -@@ -2118,6 +2198,7 @@ public class ServerGamePacketListenerImpl +@@ -2125,6 +2205,7 @@ public class ServerGamePacketListenerImpl boolean cancelled; if (hitResult == null || hitResult.getType() != HitResult.Type.BLOCK) { @@ -1530,7 +1521,7 @@ index a2e43621a9ad2eb7eef0b4a5d7c9bf0f627b9bc9..2c7f35ec3276f420875cf52596ada42b org.bukkit.event.player.PlayerInteractEvent event = CraftEventFactory.callPlayerInteractEvent(this.player, Action.RIGHT_CLICK_AIR, itemInHand, hand); cancelled = event.useItemInHand() == Event.Result.DENY; } else { -@@ -2765,6 +2846,7 @@ public class ServerGamePacketListenerImpl +@@ -2772,6 +2853,7 @@ public class ServerGamePacketListenerImpl 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 @@ -1538,7 +1529,7 @@ index a2e43621a9ad2eb7eef0b4a5d7c9bf0f627b9bc9..2c7f35ec3276f420875cf52596ada42b packet.dispatch( new ServerboundInteractPacket.Handler() { private void performInteraction(InteractionHand hand, ServerGamePacketListenerImpl.EntityInteraction entityInteraction, PlayerInteractEntityEvent event) { // CraftBukkit -@@ -2778,6 +2860,8 @@ public class ServerGamePacketListenerImpl +@@ -2785,6 +2867,8 @@ public class ServerGamePacketListenerImpl ServerGamePacketListenerImpl.this.cserver.getPluginManager().callEvent(event); final boolean resendData = event.isCancelled() || !ServerGamePacketListenerImpl.this.player.getItemInHand(hand).is(itemType); @@ -1547,7 +1538,7 @@ index a2e43621a9ad2eb7eef0b4a5d7c9bf0f627b9bc9..2c7f35ec3276f420875cf52596ada42b // Entity in bucket - SPIGOT-4048 and SPIGOT-6859 if (itemType == Items.WATER_BUCKET && target instanceof net.minecraft.world.entity.animal.Bucketable && target instanceof LivingEntity && resendData) { target.resendPossiblyDesyncedEntityData(ServerGamePacketListenerImpl.this.player); // Paper - The entire mob gets deleted, so resend it -@@ -3497,7 +3581,7 @@ public class ServerGamePacketListenerImpl +@@ -3507,7 +3591,7 @@ public class ServerGamePacketListenerImpl @Override public void handleChangeGameMode(ServerboundChangeGameModePacket packet) { PacketUtils.ensureRunningOnSameThread(packet, this, this.player.level()); @@ -1555,12 +1546,12 @@ index a2e43621a9ad2eb7eef0b4a5d7c9bf0f627b9bc9..2c7f35ec3276f420875cf52596ada42b + if (!this.player.hasPermissions(2) && !player.getBukkitEntity().hasPermission("purpur.debug.f3n")) { // Purpur - Add permission for F3+N debug LOGGER.warn( "Player {} tried to change game mode to {} without required permissions", - this.player.getGameProfile().getName(), + this.player.getGameProfile().name(), diff --git a/net/minecraft/server/network/ServerLoginPacketListenerImpl.java b/net/minecraft/server/network/ServerLoginPacketListenerImpl.java -index f9fad100d3e5e4b44a5b0f88e288e6fac7a250f7..6d320ed179393e47398c44f2ba2b2285016f349e 100644 +index cc7f467a394413c3cc1a5975d77ff8880ad0fafa..37c2d05fc597d30476a99751e9a465c38a247db2 100644 --- a/net/minecraft/server/network/ServerLoginPacketListenerImpl.java +++ b/net/minecraft/server/network/ServerLoginPacketListenerImpl.java -@@ -285,7 +285,7 @@ public class ServerLoginPacketListenerImpl implements ServerLoginPacketListener, +@@ -288,7 +288,7 @@ public class ServerLoginPacketListenerImpl implements ServerLoginPacketListener, ServerLoginPacketListenerImpl.LOGGER.warn("Failed to verify username but will let them in anyway!"); ServerLoginPacketListenerImpl.this.startClientVerification(ServerLoginPacketListenerImpl.this.createOfflineProfile(string1)); // Spigot } else { @@ -1570,18 +1561,18 @@ index f9fad100d3e5e4b44a5b0f88e288e6fac7a250f7..6d320ed179393e47398c44f2ba2b2285 } } catch (AuthenticationUnavailableException var4) { diff --git a/net/minecraft/server/players/PlayerList.java b/net/minecraft/server/players/PlayerList.java -index adc430c3f36bda2d77b76ae7735ce4fe12e33974..6396083993d248683b887774d2db3f3f03825033 100644 +index b478e22321be0edd31290945fafa02caa46c1778..017da769b43c4c54b082ee71d437fb1a46a45c6f 100644 --- a/net/minecraft/server/players/PlayerList.java +++ b/net/minecraft/server/players/PlayerList.java -@@ -412,6 +412,7 @@ public abstract class PlayerList { - scoreboard.addPlayerToTeam(player.getScoreboardName(), collideRuleTeam); - } - // Paper end - Configurable player collision -+ org.purpurmc.purpur.task.BossBarTask.addToAll(player); // Purpur - Implement TPSBar - if (org.galemc.gale.configuration.GaleGlobalConfiguration.get().logToConsole.playerLoginLocations) { // Gale - JettPack - make logging login location configurable - PlayerList.LOGGER.info("{}[{}] logged in with entity id {} at ([{}]{}, {}, {})", player.getName().getString(), loggableAddress, player.getId(), serverLevel.serverLevelData.getLevelName(), player.getX(), player.getY(), player.getZ()); - // Gale start - JettPack - make logging login location configurable -@@ -525,6 +526,7 @@ public abstract class PlayerList { +@@ -308,6 +308,7 @@ public abstract class PlayerList { + scoreboard.addPlayerToTeam(player.getScoreboardName(), collideRuleTeam); + } + // Paper end - Configurable player collision ++ org.purpurmc.purpur.task.BossBarTask.addToAll(player); // Purpur - Implement TPSBar + if (org.galemc.gale.configuration.GaleGlobalConfiguration.get().logToConsole.playerLoginLocations) { // Gale - JettPack - make logging login location configurable + // CraftBukkit start - moved down + LOGGER.info( +@@ -434,6 +435,7 @@ public abstract class PlayerList { } 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 @@ -1589,7 +1580,7 @@ index adc430c3f36bda2d77b76ae7735ce4fe12e33974..6396083993d248683b887774d2db3f3f 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 -@@ -953,6 +955,20 @@ public abstract class PlayerList { +@@ -863,6 +865,20 @@ public abstract class PlayerList { } } @@ -1610,7 +1601,7 @@ index adc430c3f36bda2d77b76ae7735ce4fe12e33974..6396083993d248683b887774d2db3f3f public void broadcastAll(Packet packet, ResourceKey dimension) { for (ServerPlayer serverPlayer : this.players) { if (serverPlayer.level().dimension() == dimension) { -@@ -1037,6 +1053,7 @@ public abstract class PlayerList { +@@ -959,6 +975,7 @@ public abstract class PlayerList { } else { b = (byte)(24 + permLevel); } @@ -1618,7 +1609,7 @@ index adc430c3f36bda2d77b76ae7735ce4fe12e33974..6396083993d248683b887774d2db3f3f player.connection.send(new ClientboundEntityEventPacket(player, b)); } -@@ -1045,11 +1062,32 @@ public abstract class PlayerList { +@@ -967,11 +984,32 @@ public abstract class PlayerList { player.getBukkitEntity().recalculatePermissions(); // CraftBukkit this.server.getCommands().sendCommands(player); } // Paper - Add sendOpLevel API @@ -1646,11 +1637,11 @@ index adc430c3f36bda2d77b76ae7735ce4fe12e33974..6396083993d248683b887774d2db3f3f } // Paper start - whitelist verify event / login event - public LoginResult canBypassFullServerLogin(final GameProfile profile, final LoginResult currentResult) { -- final boolean shouldKick = this.players.size() >= this.maxPlayers && !this.canBypassPlayerLimit(profile); -+ final boolean shouldKick = this.players.size() >= this.maxPlayers && !(/*player.hasPermission("purpur.joinfullserver") || */this.canBypassPlayerLimit(profile)); // Purpur - Allow player join full server by permission TODO: this hasn't worked for a while, so comment it out until we can reliably check perms of the player joining + public LoginResult canBypassFullServerLogin(final NameAndId nameAndId, final LoginResult currentResult) { +- final boolean shouldKick = this.players.size() >= this.getMaxPlayers() && !this.canBypassPlayerLimit(nameAndId); ++ final boolean shouldKick = this.players.size() >= this.getMaxPlayers() && !(/*player.hasPermission("purpur.joinfullserver") || */this.canBypassPlayerLimit(nameAndId)); // Purpur - Allow player join full server by permission TODO: this hasn't worked for a while, so comment it out until we can reliably check perms of the player joining final io.papermc.paper.event.player.PlayerServerFullCheckEvent fullCheckEvent = new io.papermc.paper.event.player.PlayerServerFullCheckEvent( - com.destroystokyo.paper.profile.CraftPlayerProfile.asBukkitMirror(profile), + new com.destroystokyo.paper.profile.CraftPlayerProfile(nameAndId), io.papermc.paper.adventure.PaperAdventure.asAdventure(currentResult.message), diff --git a/net/minecraft/server/players/SleepStatus.java b/net/minecraft/server/players/SleepStatus.java index 2a7ae521654ad5c9f392baa5562e64bb71b13097..3a3e6992563236141db687084aeec9684437a7db 100644 @@ -1675,7 +1666,7 @@ index 2a7ae521654ad5c9f392baa5562e64bb71b13097..3a3e6992563236141db687084aeec968 } // CraftBukkit start diff --git a/net/minecraft/util/StringUtil.java b/net/minecraft/util/StringUtil.java -index 77947e6915facee44588943fcd3e5b513de37e77..c3a99fe7b49858bc0ca9a7f800b0db40465f6901 100644 +index a025b7f6823803f2a3c397314f11ab9c458a363e..e476eb587179463d515aafc2faef057721de11f4 100644 --- a/net/minecraft/util/StringUtil.java +++ b/net/minecraft/util/StringUtil.java @@ -87,6 +87,7 @@ public class StringUtil { @@ -1923,18 +1914,18 @@ index 1fc9e1ad541c46124183a401b2a7d99aea69cecf..881271f0bc77a8a8a7d31daad9a8188b } diff --git a/net/minecraft/world/entity/Entity.java b/net/minecraft/world/entity/Entity.java -index 2c08ea1657984e145c9dc0be4de4c74f5ca58683..30fc1634e6d3f40636d2aff7397d22e96526d36f 100644 +index c365d0079ecc3f9040b2b95f86f24b35c83f1649..e5227d2d5e79e9881ed80c38269463ad6a626319 100644 --- a/net/minecraft/world/entity/Entity.java +++ b/net/minecraft/world/entity/Entity.java -@@ -146,6 +146,7 @@ import org.jetbrains.annotations.Contract; +@@ -148,6 +148,7 @@ import org.jetbrains.annotations.Contract; import org.slf4j.Logger; - 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 abstract class Entity implements SyncedDataHolder, DebugValueSource, Nameable, ItemOwner, 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 -@@ -279,8 +280,9 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess +@@ -281,8 +282,9 @@ public abstract class Entity implements SyncedDataHolder, DebugValueSource, Name public double xOld; public double yOld; public double zOld; @@ -1945,7 +1936,7 @@ index 2c08ea1657984e145c9dc0be4de4c74f5ca58683..30fc1634e6d3f40636d2aff7397d22e9 public int tickCount; private int remainingFireTicks; public boolean wasTouchingWater; -@@ -314,8 +316,8 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess +@@ -316,8 +318,8 @@ public abstract class Entity implements SyncedDataHolder, DebugValueSource, Name public PortalProcessor portalProcess; public int portalCooldown; private boolean invulnerable; @@ -1956,7 +1947,7 @@ index 2c08ea1657984e145c9dc0be4de4c74f5ca58683..30fc1634e6d3f40636d2aff7397d22e9 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}; -@@ -372,6 +374,7 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess +@@ -374,6 +376,7 @@ public abstract class Entity implements SyncedDataHolder, DebugValueSource, Name public long activatedTick = Integer.MIN_VALUE; public boolean isTemporarilyActive; public long activatedImmunityTick = Integer.MIN_VALUE; @@ -1964,7 +1955,7 @@ index 2c08ea1657984e145c9dc0be4de4c74f5ca58683..30fc1634e6d3f40636d2aff7397d22e9 public void inactiveTick() { } -@@ -534,10 +537,39 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess +@@ -536,10 +539,39 @@ public abstract class Entity implements SyncedDataHolder, DebugValueSource, Name } // Paper end - optimise entity tracker @@ -1976,7 +1967,7 @@ index 2c08ea1657984e145c9dc0be4de4c74f5ca58683..30fc1634e6d3f40636d2aff7397d22e9 + + // Purpur start - copied from Mob - API for any mob to burn daylight + public boolean isSunBurnTick() { -+ if (this.level().isBrightOutside() && !this.level().isClientSide) { ++ if (this.level().isBrightOutside() && !this.level().isClientSide()) { + float lightLevelDependentMagicValue = this.getLightLevelDependentMagicValue(); + BlockPos blockPos = BlockPos.containing(this.getX(), this.getEyeY(), this.getZ()); + boolean flag = this.isInWaterOrRain() || this.isInPowderSnow || this.wasInPowderSnow; @@ -2004,15 +1995,15 @@ index 2c08ea1657984e145c9dc0be4de4c74f5ca58683..30fc1634e6d3f40636d2aff7397d22e9 this.position = Vec3.ZERO; this.blockPosition = BlockPos.ZERO; this.chunkPosition = ChunkPos.ZERO; -@@ -914,6 +946,7 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess +@@ -920,6 +952,7 @@ public abstract class Entity implements SyncedDataHolder, DebugValueSource, Name && this.level.paperConfig().environment.netherCeilingVoidDamageHeight.test(v -> this.getY() >= v) && (!(this instanceof Player player) || !player.getAbilities().invulnerable))) { // Paper end - Configurable nether ceiling damage -+ if (this.level.purpurConfig.teleportOnNetherCeilingDamage && this.level.getWorld().getEnvironment() == org.bukkit.World.Environment.NETHER && this instanceof ServerPlayer player) player.teleport(org.bukkit.craftbukkit.util.CraftLocation.toBukkit(this.level.getSharedSpawnPos(), this.level)); else // Purpur - Add option to teleport to spawn on nether ceiling damage ++ if (this.level.purpurConfig.teleportOnNetherCeilingDamage && this.level.getWorld().getEnvironment() == org.bukkit.World.Environment.NETHER && this instanceof ServerPlayer player) player.teleport(org.bukkit.craftbukkit.util.CraftLocation.toBukkit(this.level.levelData.getRespawnData().pos(), this.level)); else // Purpur - Add option to teleport to spawn on nether ceiling damage this.onBelowWorld(); } } -@@ -1900,7 +1933,7 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess +@@ -1948,7 +1981,7 @@ public abstract class Entity implements SyncedDataHolder, DebugValueSource, Name } public boolean fireImmune() { @@ -2021,7 +2012,7 @@ index 2c08ea1657984e145c9dc0be4de4c74f5ca58683..30fc1634e6d3f40636d2aff7397d22e9 } public boolean causeFallDamage(double fallDistance, float damageMultiplier, DamageSource damageSource) { -@@ -2606,6 +2639,11 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess +@@ -2658,6 +2691,11 @@ public abstract class Entity implements SyncedDataHolder, DebugValueSource, Name output.putBoolean("Paper.FreezeLock", true); } // Paper end @@ -2033,7 +2024,7 @@ index 2c08ea1657984e145c9dc0be4de4c74f5ca58683..30fc1634e6d3f40636d2aff7397d22e9 } catch (Throwable var7) { CrashReport crashReport = CrashReport.forThrowable(var7, "Saving entity NBT"); CrashReportCategory crashReportCategory = crashReport.addCategory("Entity being saved"); -@@ -2726,6 +2764,9 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess +@@ -2778,6 +2816,9 @@ public abstract class Entity implements SyncedDataHolder, DebugValueSource, Name } freezeLocked = input.getBooleanOr("Paper.FreezeLock", false); // Paper end @@ -2043,7 +2034,7 @@ index 2c08ea1657984e145c9dc0be4de4c74f5ca58683..30fc1634e6d3f40636d2aff7397d22e9 } catch (Throwable var7) { CrashReport crashReport = CrashReport.forThrowable(var7, "Loading entity NBT"); CrashReportCategory crashReportCategory = crashReport.addCategory("Entity being loaded"); -@@ -3004,6 +3045,7 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess +@@ -3051,6 +3092,7 @@ public abstract class Entity implements SyncedDataHolder, DebugValueSource, Name if (this.isAlive() && this instanceof Leashable leashable2) { if (leashable2.getLeashHolder() == player) { if (!this.level().isClientSide()) { @@ -2051,21 +2042,21 @@ index 2c08ea1657984e145c9dc0be4de4c74f5ca58683..30fc1634e6d3f40636d2aff7397d22e9 // Paper start - EntityUnleashEvent if (!org.bukkit.craftbukkit.event.CraftEventFactory.handlePlayerUnleashEntityEvent( leashable2, player, hand, !player.hasInfiniteMaterials(), true -@@ -3299,6 +3341,13 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess +@@ -3354,6 +3396,13 @@ public abstract class Entity implements SyncedDataHolder, DebugValueSource, Name + this.passengers = ImmutableList.copyOf(list); } - ++ + // Purpur start - Ridables + if (isRidable() && this.passengers.get(0) == passenger && passenger instanceof Player player) { + onMount(player); + this.rider = player; + } + // Purpur end - Ridables -+ - this.gameEvent(GameEvent.ENTITY_MOUNT, passenger); } } -@@ -3340,6 +3389,14 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess + +@@ -3394,6 +3443,14 @@ public abstract class Entity implements SyncedDataHolder, DebugValueSource, Name return false; } // CraftBukkit end @@ -2080,7 +2071,7 @@ index 2c08ea1657984e145c9dc0be4de4c74f5ca58683..30fc1634e6d3f40636d2aff7397d22e9 if (this.passengers.size() == 1 && this.passengers.get(0) == passenger) { this.passengers = ImmutableList.of(); } else { -@@ -3409,15 +3466,18 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess +@@ -3475,15 +3532,18 @@ public abstract class Entity implements SyncedDataHolder, DebugValueSource, Name return Vec3.directionFromRotation(this.getRotationVector()); } @@ -2100,7 +2091,7 @@ index 2c08ea1657984e145c9dc0be4de4c74f5ca58683..30fc1634e6d3f40636d2aff7397d22e9 } } } -@@ -3619,7 +3679,7 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess +@@ -3685,7 +3745,7 @@ public abstract class Entity implements SyncedDataHolder, DebugValueSource, Name } public int getMaxAirSupply() { @@ -2109,7 +2100,7 @@ index 2c08ea1657984e145c9dc0be4de4c74f5ca58683..30fc1634e6d3f40636d2aff7397d22e9 } public int getAirSupply() { -@@ -4166,7 +4226,7 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess +@@ -4240,7 +4300,7 @@ public abstract class Entity implements SyncedDataHolder, DebugValueSource, Name // CraftBukkit end public boolean canUsePortal(boolean allowPassengers) { @@ -2118,7 +2109,7 @@ index 2c08ea1657984e145c9dc0be4de4c74f5ca58683..30fc1634e6d3f40636d2aff7397d22e9 } public boolean canTeleport(Level fromLevel, Level toLevel) { -@@ -4696,6 +4756,12 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess +@@ -4760,6 +4820,12 @@ public abstract class Entity implements SyncedDataHolder, DebugValueSource, Name return Mth.lerp(partialTick, this.yRotO, this.yRot); } @@ -2131,7 +2122,7 @@ index 2c08ea1657984e145c9dc0be4de4c74f5ca58683..30fc1634e6d3f40636d2aff7397d22e9 // Paper start - optimise collisions public boolean updateFluidHeightAndDoFluidPushing(final TagKey fluid, final double flowScale) { if (this.touchingUnloadedChunk()) { -@@ -5132,7 +5198,7 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess +@@ -5197,7 +5263,7 @@ public abstract class Entity implements SyncedDataHolder, DebugValueSource, Name } public float maxUpStep() { @@ -2140,7 +2131,7 @@ index 2c08ea1657984e145c9dc0be4de4c74f5ca58683..30fc1634e6d3f40636d2aff7397d22e9 } public void onExplosionHit(@Nullable Entity entity) { -@@ -5390,4 +5456,44 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess +@@ -5467,4 +5533,44 @@ public abstract class Entity implements SyncedDataHolder, DebugValueSource, Name return ((ServerLevel) this.level()).isPositionEntityTicking(this.blockPosition()); } // Paper end - Expose entity id counter @@ -2186,7 +2177,7 @@ index 2c08ea1657984e145c9dc0be4de4c74f5ca58683..30fc1634e6d3f40636d2aff7397d22e9 + // Purpur end - Ridables } diff --git a/net/minecraft/world/entity/EntitySelector.java b/net/minecraft/world/entity/EntitySelector.java -index 15daba9062d54a5bdf335c3645a3227ccb5a8e06..1842cbe25cc0f9be937caf0a78e915bd3d6ea1e5 100644 +index 67d95236e135c2b44845cfd5cbfb7e553b8e31f2..b94b3a5aabd44b0158d535c7a4dc006e6f6f4689 100644 --- a/net/minecraft/world/entity/EntitySelector.java +++ b/net/minecraft/world/entity/EntitySelector.java @@ -28,6 +28,8 @@ public final class EntitySelector { @@ -2199,10 +2190,10 @@ index 15daba9062d54a5bdf335c3645a3227ccb5a8e06..1842cbe25cc0f9be937caf0a78e915bd public static final Predicate PLAYER_AFFECTS_SPAWNING = (entity) -> { return !entity.isSpectator() && entity.isAlive() && entity instanceof Player player && player.affectsSpawning; diff --git a/net/minecraft/world/entity/EntityType.java b/net/minecraft/world/entity/EntityType.java -index 388689c44cf63ade939e271d490051c9b3fe8034..e65b1818c49e1b7d04d5bcc912804c821f00bdbc 100644 +index e0f963af1818bb41a87222ef987fec594b2b3798..5a55cd08eb9b24f23f5daef50d6c9ece20ac8277 100644 --- a/net/minecraft/world/entity/EntityType.java +++ b/net/minecraft/world/entity/EntityType.java -@@ -1106,6 +1106,16 @@ public class EntityType implements FeatureElement, EntityTypeT +@@ -1214,6 +1214,16 @@ public class EntityType implements FeatureElement, EntityTypeT return register(vanillaEntityId(key), builder); } @@ -2219,7 +2210,7 @@ index 388689c44cf63ade939e271d490051c9b3fe8034..e65b1818c49e1b7d04d5bcc912804c82 public static ResourceLocation getKey(EntityType entityType) { return BuiltInRegistries.ENTITY_TYPE.getKey(entityType); } -@@ -1336,6 +1346,16 @@ public class EntityType implements FeatureElement, EntityTypeT +@@ -1443,6 +1453,16 @@ public class EntityType implements FeatureElement, EntityTypeT return this.category; } @@ -2236,7 +2227,7 @@ index 388689c44cf63ade939e271d490051c9b3fe8034..e65b1818c49e1b7d04d5bcc912804c82 public String getDescriptionId() { return this.descriptionId; } -@@ -1395,7 +1415,11 @@ public class EntityType implements FeatureElement, EntityTypeT +@@ -1502,7 +1522,11 @@ public class EntityType implements FeatureElement, EntityTypeT entity.load(input); }, // Paper end - Don't fire sync event during generation @@ -2250,7 +2241,7 @@ index 388689c44cf63ade939e271d490051c9b3fe8034..e65b1818c49e1b7d04d5bcc912804c82 } diff --git a/net/minecraft/world/entity/ExperienceOrb.java b/net/minecraft/world/entity/ExperienceOrb.java -index f8d94181e97630d9d551553e3a504d7e3ae36f96..66ae0b340c7e9ebccfeaee786577e27916ace38c 100644 +index c452ee3f26bf3f9e055d5055473b1ef76a8a5884..850da365c388801f2083fd1471cc32ce86297de0 100644 --- a/net/minecraft/world/entity/ExperienceOrb.java +++ b/net/minecraft/world/entity/ExperienceOrb.java @@ -358,7 +358,7 @@ public class ExperienceOrb extends Entity { @@ -2324,10 +2315,10 @@ index aab9adb8313c4b18279c7fd7500ef04bda09c6c1..86a694b94045b47f6e98c480645f7573 protected ParticleOptions getInkParticle() { return ParticleTypes.GLOW_SQUID_INK; diff --git a/net/minecraft/world/entity/LivingEntity.java b/net/minecraft/world/entity/LivingEntity.java -index 66e248f348731318590ebd3bd070b7fddf5f0379..fa5010a42970741b930fddedf11527216c8f9173 100644 +index 7993002df8610a99780e1e8f764270d460cd5c1f..fc4e9a5ac773a9615fa8290a22cd5f456c68e6af 100644 --- a/net/minecraft/world/entity/LivingEntity.java +++ b/net/minecraft/world/entity/LivingEntity.java -@@ -236,9 +236,9 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin +@@ -237,9 +237,9 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin protected int noActionTime; public float lastHurt; public boolean jumping; @@ -2341,9 +2332,9 @@ index 66e248f348731318590ebd3bd070b7fddf5f0379..fa5010a42970741b930fddedf1152721 protected double lerpYHeadRot; protected int lerpHeadSteps; @@ -284,11 +284,13 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin + public org.bukkit.craftbukkit.entity.CraftLivingEntity getBukkitLivingEntity() { return (org.bukkit.craftbukkit.entity.CraftLivingEntity) super.getBukkitEntity(); } // Paper public boolean silentDeath = false; // Paper - mark entity as dying silently for cancellable death event public net.kyori.adventure.util.TriState frictionState = net.kyori.adventure.util.TriState.NOT_SET; // Paper - Friction API - public int shieldBlockingDelay = this.level().paperConfig().misc.shieldBlockingDelay; // Paper - Make shield blocking delay configurable + protected boolean shouldBurnInDay = false; public boolean shouldBurnInDay() { return this.shouldBurnInDay; } public void setShouldBurnInDay(boolean shouldBurnInDay) { this.shouldBurnInDay = shouldBurnInDay; } // Purpur - API for any mob to burn daylight // CraftBukkit end @@ -2355,7 +2346,7 @@ index 66e248f348731318590ebd3bd070b7fddf5f0379..fa5010a42970741b930fddedf1152721 this.craftAttributes = new org.bukkit.craftbukkit.attribute.CraftAttributeMap(this.attributes); // CraftBukkit // CraftBukkit - this.setHealth(this.getMaxHealth()) inlined and simplified to skip the instanceof check for Player, as getBukkitEntity() is not initialized in constructor this.entityData.set(LivingEntity.DATA_HEALTH_ID, this.getMaxHealth()); -@@ -307,6 +309,8 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin +@@ -313,6 +315,8 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin return new EntityEquipment(); } @@ -2364,7 +2355,7 @@ index 66e248f348731318590ebd3bd070b7fddf5f0379..fa5010a42970741b930fddedf1152721 public Brain getBrain() { return this.brain; } -@@ -362,6 +366,7 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin +@@ -368,6 +372,7 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin .add(Attributes.CAMERA_DISTANCE) .add(Attributes.WAYPOINT_TRANSMIT_RANGE); } @@ -2372,25 +2363,21 @@ index 66e248f348731318590ebd3bd070b7fddf5f0379..fa5010a42970741b930fddedf1152721 @Override protected void checkFallDamage(double y, boolean onGround, BlockState state, BlockPos pos) { -@@ -443,6 +448,12 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin +@@ -445,6 +450,12 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin if (d < 0.0) { double damagePerBlock = serverLevel1.getWorldBorder().getDamagePerBlock(); if (damagePerBlock > 0.0) { + // Purpur start - Add option to teleport to spawn if outside world border + if (this.level().purpurConfig.teleportIfOutsideBorder && this instanceof ServerPlayer serverPlayer) { -+ serverPlayer.teleport(org.bukkit.craftbukkit.util.CraftLocation.toBukkit(this.level().getSharedSpawnPos(), this.level())); ++ serverPlayer.teleport(org.bukkit.craftbukkit.util.CraftLocation.toBukkit(this.level().levelData.getRespawnData().pos(), this.level())); + return; + } + // Purpur end - Add option to teleport to spawn if outside world border this.hurtServer(serverLevel1, this.damageSources().outOfBorder(), Math.max(1, Mth.floor(-d * damagePerBlock))); } } -@@ -455,10 +466,10 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin - && (!flag || !((Player)this).getAbilities().invulnerable); - if (flag1) { - this.setAirSupply(this.decreaseAirSupply(this.getAirSupply())); -- if (this.getAirSupply() == -20) { -+ if (this.getAirSupply() == -this.level().purpurConfig.drowningDamageInterval) { // Purpur - Drowning Settings +@@ -460,7 +471,7 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin + if (this.shouldTakeDrowningDamage()) { this.setAirSupply(0); serverLevel1.broadcastEntityEvent(this, (byte)67); - this.hurtServer(serverLevel1, this.damageSources().drown(), 2.0F); @@ -2398,7 +2385,16 @@ index 66e248f348731318590ebd3bd070b7fddf5f0379..fa5010a42970741b930fddedf1152721 } } else if (this.getAirSupply() < this.getMaxAirSupply()) { this.setAirSupply(this.increaseAirSupply(this.getAirSupply())); -@@ -775,6 +786,7 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin +@@ -519,7 +530,7 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin + } + + protected boolean shouldTakeDrowningDamage() { +- return this.getAirSupply() <= -20; ++ return this.getAirSupply() <= -this.level().purpurConfig.drowningDamageInterval; // Purpur - Drowning Settings + } + + @Override +@@ -781,6 +792,7 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin this.getSleepingPos().ifPresent(blockPos -> output.store("sleeping_pos", BlockPos.CODEC, blockPos)); DataResult> dataResult = this.brain.serializeStart(NbtOps.INSTANCE).map(tag -> new Dynamic<>(NbtOps.INSTANCE, tag)); dataResult.resultOrPartial(LOGGER::error).ifPresent(dynamic -> output.store("Brain", Codec.PASSTHROUGH, (Dynamic)dynamic)); @@ -2406,7 +2402,7 @@ index 66e248f348731318590ebd3bd070b7fddf5f0379..fa5010a42970741b930fddedf1152721 if (this.lastHurtByPlayer != null) { this.lastHurtByPlayer.store(output, "last_hurt_by_player"); output.putInt("last_hurt_by_player_memory_time", this.lastHurtByPlayerMemoryTime); -@@ -901,6 +913,7 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin +@@ -907,6 +919,7 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin } // Paper - The sleeping pos will always also set the actual pos, so a desync suggests something is wrong }, this::clearSleepingPos); input.read("Brain", Codec.PASSTHROUGH).ifPresent(dynamic -> this.brain = this.makeBrain((Dynamic)dynamic)); @@ -2414,7 +2410,7 @@ index 66e248f348731318590ebd3bd070b7fddf5f0379..fa5010a42970741b930fddedf1152721 this.lastHurtByPlayer = EntityReference.read(input, "last_hurt_by_player"); this.lastHurtByPlayerMemoryTime = input.getIntOr("last_hurt_by_player_memory_time", 0); this.lastHurtByMob = EntityReference.read(input, "last_hurt_by_mob"); -@@ -1035,16 +1048,31 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin +@@ -1041,16 +1054,31 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin if (lookingEntity != null) { // Gale start - Petal - reduce skull ItemStack lookups for reduced visibility EntityType type = lookingEntity.getType(); @@ -2453,7 +2449,7 @@ index 66e248f348731318590ebd3bd070b7fddf5f0379..fa5010a42970741b930fddedf1152721 return d; } -@@ -1090,6 +1118,7 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin +@@ -1096,6 +1124,7 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin Iterator iterator = this.activeEffects.values().iterator(); while (iterator.hasNext()) { MobEffectInstance effect = iterator.next(); @@ -2461,7 +2457,7 @@ index 66e248f348731318590ebd3bd070b7fddf5f0379..fa5010a42970741b930fddedf1152721 EntityPotionEffectEvent event = CraftEventFactory.callEntityPotionEffectChangeEvent(this, effect, null, cause, EntityPotionEffectEvent.Action.CLEARED); if (event.isCancelled()) { continue; -@@ -1420,6 +1449,24 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin +@@ -1426,6 +1455,24 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin this.stopSleeping(); } @@ -2486,7 +2482,7 @@ index 66e248f348731318590ebd3bd070b7fddf5f0379..fa5010a42970741b930fddedf1152721 this.noActionTime = 0; if (amount < 0.0F) { amount = 0.0F; -@@ -1681,10 +1728,10 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin +@@ -1688,10 +1735,10 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin protected Player resolvePlayerResponsibleForDamage(DamageSource damageSource) { Entity entity = damageSource.getEntity(); if (entity instanceof Player player) { @@ -2499,7 +2495,7 @@ index 66e248f348731318590ebd3bd070b7fddf5f0379..fa5010a42970741b930fddedf1152721 } else { this.lastHurtByPlayer = null; this.lastHurtByPlayerMemoryTime = 0; -@@ -1735,6 +1782,18 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin +@@ -1742,6 +1789,18 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin } } @@ -2518,7 +2514,7 @@ index 66e248f348731318590ebd3bd070b7fddf5f0379..fa5010a42970741b930fddedf1152721 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); -@@ -1880,7 +1939,7 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin +@@ -1887,7 +1946,7 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin if (this.level() instanceof ServerLevel serverLevel) { boolean var6 = false; if (this.dead && entitySource instanceof WitherBoss) { // Paper @@ -2527,15 +2523,15 @@ index 66e248f348731318590ebd3bd070b7fddf5f0379..fa5010a42970741b930fddedf1152721 BlockPos blockPos = this.blockPosition(); BlockState blockState = Blocks.WITHER_ROSE.defaultBlockState(); if (this.level().getBlockState(blockPos).isAir() && blockState.canSurvive(this.level(), blockPos)) { -@@ -1910,6 +1969,7 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin +@@ -1917,6 +1976,7 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin boolean flag = this.lastHurtByPlayerMemoryTime > 0; this.dropEquipment(level); // CraftBukkit - from below - if (this.shouldDropLoot() && level.getGameRules().getBoolean(GameRules.RULE_DOMOBLOOT)) { + if (this.shouldDropLoot(level)) { + if (!(damageSource.is(net.minecraft.world.damagesource.DamageTypes.CRAMMING) && level().purpurConfig.disableDropsOnCrammingDeath)) { // Purpur - Disable loot drops on death by cramming this.dropFromLootTable(level, damageSource, flag); // Paper start final boolean prev = this.clearEquipmentSlots; -@@ -1918,6 +1978,7 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin +@@ -1925,6 +1985,7 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin // Paper end this.dropCustomDeathLoot(level, damageSource, flag); this.clearEquipmentSlots = prev; // Paper @@ -2543,7 +2539,7 @@ index 66e248f348731318590ebd3bd070b7fddf5f0379..fa5010a42970741b930fddedf1152721 } // CraftBukkit start - Call death event // Paper start - call advancement triggers with correct entity equipment -@@ -3010,6 +3071,21 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin +@@ -3041,6 +3102,20 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin this.move(MoverType.SELF, this.getDeltaMovement()); this.setDeltaMovement(this.getDeltaMovement().scale(0.5)); } else { @@ -2561,11 +2557,10 @@ index 66e248f348731318590ebd3bd070b7fddf5f0379..fa5010a42970741b930fddedf1152721 + return; + } + // Purpur end - Ridables -+ this.moveRelative(amount, relative); this.move(MoverType.SELF, this.getDeltaMovement()); this.setDeltaMovement(this.getDeltaMovement().scale(0.91F)); -@@ -3150,6 +3226,7 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin +@@ -3181,6 +3256,7 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin float f = (float)(d * 10.0 - 3.0); if (f > 0.0F) { this.playSound(this.getFallDamageSound((int)f), 1.0F, 1.0F); @@ -2573,7 +2568,7 @@ index 66e248f348731318590ebd3bd070b7fddf5f0379..fa5010a42970741b930fddedf1152721 this.hurt(this.damageSources().flyIntoWall(), f); } } -@@ -3593,8 +3670,10 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin +@@ -3624,8 +3700,10 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin this.pushEntities(); // Paper start - Add EntityMoveEvent @@ -2586,7 +2581,7 @@ index 66e248f348731318590ebd3bd070b7fddf5f0379..fa5010a42970741b930fddedf1152721 Location from = new Location(this.level().getWorld(), this.xo, this.yo, this.zo, this.yRotO, this.xRotO); Location to = new Location(this.level().getWorld(), this.getX(), this.getY(), this.getZ(), this.getYRot(), this.getXRot()); io.papermc.paper.event.entity.EntityMoveEvent event = new io.papermc.paper.event.entity.EntityMoveEvent(this.getBukkitLivingEntity(), from, to.clone()); -@@ -3604,11 +3683,52 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin +@@ -3635,11 +3713,52 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin this.absSnapTo(event.getTo().getX(), event.getTo().getY(), event.getTo().getZ(), event.getTo().getYaw(), event.getTo().getPitch()); } } @@ -2639,7 +2634,7 @@ index 66e248f348731318590ebd3bd070b7fddf5f0379..fa5010a42970741b930fddedf1152721 } protected void applyInput() { -@@ -3642,7 +3762,18 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin +@@ -3673,7 +3792,18 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin .filter(equipmentSlot1 -> canGlideUsing(this.getItemBySlot(equipmentSlot1), equipmentSlot1)) .toList(); EquipmentSlot equipmentSlot = Util.getRandom(list, this.random); @@ -2659,7 +2654,7 @@ index 66e248f348731318590ebd3bd070b7fddf5f0379..fa5010a42970741b930fddedf1152721 } this.gameEvent(GameEvent.ELYTRA_GLIDE); -@@ -4540,6 +4671,12 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin +@@ -4562,6 +4692,12 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin : slot == equippable.slot() && this.canUseSlot(equippable.slot()) && equippable.canBeEquippedBy(this.getType()); } @@ -2673,10 +2668,10 @@ index 66e248f348731318590ebd3bd070b7fddf5f0379..fa5010a42970741b930fddedf1152721 return slot != EquipmentSlot.HEAD && slot != EquipmentSlot.MAINHAND && slot != EquipmentSlot.OFFHAND ? SlotAccess.forEquipmentSlot(entity, slot, itemStack -> itemStack.isEmpty() || entity.getEquipmentSlotForItem(itemStack) == slot) diff --git a/net/minecraft/world/entity/Mob.java b/net/minecraft/world/entity/Mob.java -index 37c6567701fe10011a364b8def9ebf3391376592..706bdb81f831ee79afb8c32feba1a13bdac59c66 100644 +index fc6c5cf5991d9d359fd9e4ebb0f71a18c52e6273..0577527e2a38832d6ad2ee2ef03a8a2669574c2e 100644 --- a/net/minecraft/world/entity/Mob.java +++ b/net/minecraft/world/entity/Mob.java -@@ -138,13 +138,14 @@ public abstract class Mob extends LivingEntity implements EquipmentUser, Leashab +@@ -148,13 +148,14 @@ public abstract class Mob extends LivingEntity implements EquipmentUser, Leashab private int homeRadius = -1; public boolean aware = true; // CraftBukkit public net.kyori.adventure.util.TriState despawnInPeacefulOverride = net.kyori.adventure.util.TriState.NOT_SET; // Paper - allow changing despawnInPeaceful @@ -2693,7 +2688,7 @@ index 37c6567701fe10011a364b8def9ebf3391376592..706bdb81f831ee79afb8c32feba1a13b this.jumpControl = new JumpControl(this); this.bodyRotationControl = this.createBodyControl(); this.navigation = this.createNavigation(level); -@@ -283,6 +284,7 @@ public abstract class Mob extends LivingEntity implements EquipmentUser, Leashab +@@ -293,6 +294,7 @@ public abstract class Mob extends LivingEntity implements EquipmentUser, Leashab target = null; } } @@ -2701,7 +2696,7 @@ index 37c6567701fe10011a364b8def9ebf3391376592..706bdb81f831ee79afb8c32feba1a13b this.target = target; return true; // CraftBukkit end -@@ -322,8 +324,28 @@ public abstract class Mob extends LivingEntity implements EquipmentUser, Leashab +@@ -332,8 +334,28 @@ public abstract class Mob extends LivingEntity implements EquipmentUser, Leashab this.resetAmbientSoundTime(); this.playAmbientSound(); } @@ -2730,7 +2725,7 @@ index 37c6567701fe10011a364b8def9ebf3391376592..706bdb81f831ee79afb8c32feba1a13b @Override protected void playHurtSound(DamageSource source) { this.resetAmbientSoundTime(); -@@ -427,6 +449,7 @@ public abstract class Mob extends LivingEntity implements EquipmentUser, Leashab +@@ -437,6 +459,7 @@ public abstract class Mob extends LivingEntity implements EquipmentUser, Leashab output.putString("Paper.DespawnInPeacefulOverride", this.despawnInPeacefulOverride.name()); } // Paper end - allow changing despawnInPeaceful @@ -2738,15 +2733,15 @@ index 37c6567701fe10011a364b8def9ebf3391376592..706bdb81f831ee79afb8c32feba1a13b } @Override -@@ -455,6 +478,7 @@ public abstract class Mob extends LivingEntity implements EquipmentUser, Leashab +@@ -464,6 +487,7 @@ public abstract class Mob extends LivingEntity implements EquipmentUser, Leashab + this.lootTableSeed = input.getLongOr("DeathLootTableSeed", 0L); this.setNoAi(input.getBooleanOr("NoAI", false)); this.aware = input.getBooleanOr("Bukkit.Aware", true); // CraftBukkit - this.despawnInPeacefulOverride = input.read("Paper.DespawnInPeacefulOverride", io.papermc.paper.util.PaperCodecs.TRI_STATE_CODEC).orElse(net.kyori.adventure.util.TriState.NOT_SET); // Paper - allow changing despawnInPeaceful + this.ticksSinceLastInteraction = input.getIntOr("Purpur.ticksSinceLastInteraction", 0); // Purpur- Entity lifespan + // Paper start - allow changing despawnInPeaceful + this.despawnInPeacefulOverride = readDespawnInPeacefulOverride(input); } - - @Override -@@ -507,7 +531,7 @@ public abstract class Mob extends LivingEntity implements EquipmentUser, Leashab +@@ -522,7 +546,7 @@ public abstract class Mob extends LivingEntity implements EquipmentUser, Leashab && this.canPickUpLoot() && this.isAlive() && !this.dead @@ -2755,7 +2750,7 @@ index 37c6567701fe10011a364b8def9ebf3391376592..706bdb81f831ee79afb8c32feba1a13b Vec3i pickupReach = this.getPickupReach(); for (ItemEntity itemEntity : this.level() -@@ -1170,7 +1194,7 @@ public abstract class Mob extends LivingEntity implements EquipmentUser, Leashab +@@ -1179,7 +1203,7 @@ public abstract class Mob extends LivingEntity implements EquipmentUser, Leashab ); } @@ -2764,7 +2759,7 @@ index 37c6567701fe10011a364b8def9ebf3391376592..706bdb81f831ee79afb8c32feba1a13b return spawnGroupData; } -@@ -1258,7 +1282,7 @@ public abstract class Mob extends LivingEntity implements EquipmentUser, Leashab +@@ -1267,7 +1291,7 @@ public abstract class Mob extends LivingEntity implements EquipmentUser, Leashab } protected InteractionResult mobInteract(Player player, InteractionHand hand) { @@ -2772,8 +2767,8 @@ index 37c6567701fe10011a364b8def9ebf3391376592..706bdb81f831ee79afb8c32feba1a13b + return tryRide(player, hand); // Purpur - Ridables } - public boolean isWithinHome() { -@@ -1507,6 +1531,7 @@ public abstract class Mob extends LivingEntity implements EquipmentUser, Leashab + protected void usePlayerItem(Player player, InteractionHand hand, ItemStack stack) { +@@ -1526,6 +1550,7 @@ public abstract class Mob extends LivingEntity implements EquipmentUser, Leashab this.playAttackSound(); } @@ -2781,11 +2776,11 @@ index 37c6567701fe10011a364b8def9ebf3391376592..706bdb81f831ee79afb8c32feba1a13b return flag; } -@@ -1518,26 +1543,8 @@ public abstract class Mob extends LivingEntity implements EquipmentUser, Leashab +@@ -1537,26 +1562,8 @@ public abstract class Mob extends LivingEntity implements EquipmentUser, Leashab private net.minecraft.world.phys.Vec3 cached_position; // Gale end - JettPack - optimize sun burn tick - cache eye blockpos public boolean isSunBurnTick() { -- if (this.level().isBrightOutside() && !this.level().isClientSide) { +- if (this.level().isBrightOutside() && !this.level().isClientSide()) { - // Gale start - JettPack - optimize sun burn tick - optimizations and cache eye blockpos - if (this.cached_position != this.position) { - this.cached_eye_blockpos = BlockPos.containing(this.getX(), this.getEyeY(), this.getZ()); @@ -2810,8 +2805,8 @@ index 37c6567701fe10011a364b8def9ebf3391376592..706bdb81f831ee79afb8c32feba1a13b } @Override -@@ -1585,4 +1592,58 @@ public abstract class Mob extends LivingEntity implements EquipmentUser, Leashab - this.getNavigation().updatePathfinderMaxVisitedNodes(); +@@ -1628,4 +1635,58 @@ public abstract class Mob extends LivingEntity implements EquipmentUser, Leashab + registration.register(DebugSubscriptions.BRAINS, () -> DebugBrainDump.takeBrainDump(level, this)); } } + @@ -2907,13 +2902,13 @@ index 58d8424262db14b2dca0b2c5a40748b6c0c18e83..0ac398b8b10aae5e67a797b2991c6687 @Nullable diff --git a/net/minecraft/world/entity/ai/attributes/DefaultAttributes.java b/net/minecraft/world/entity/ai/attributes/DefaultAttributes.java -index 26ffe98c94b2aaf61bf1693e86e8e7962e892a09..e6ef56d94e29a6629c9b672ed4ac4ef29ad6a286 100644 +index f14358b09785fe78459964c0e25ef8f4c12c8e60..99458462d99f0b503ccb55444f4930515c7c641c 100644 --- a/net/minecraft/world/entity/ai/attributes/DefaultAttributes.java +++ b/net/minecraft/world/entity/ai/attributes/DefaultAttributes.java -@@ -128,12 +128,12 @@ public class DefaultAttributes { - .put(EntityType.IRON_GOLEM, IronGolem.createAttributes().build()) +@@ -131,12 +131,12 @@ public class DefaultAttributes { .put(EntityType.LLAMA, Llama.createAttributes().build()) .put(EntityType.MAGMA_CUBE, MagmaCube.createAttributes().build()) + .put(EntityType.MANNEQUIN, LivingEntity.createLivingAttributes().build()) - .put(EntityType.MOOSHROOM, Cow.createAttributes().build()) + .put(EntityType.MOOSHROOM, net.minecraft.world.entity.animal.AbstractCow.createAttributes().build()) // Purpur - Cows naturally aggressive to players chance .put(EntityType.MULE, AbstractChestedHorse.createBaseChestedHorseAttributes().build()) @@ -2925,7 +2920,7 @@ index 26ffe98c94b2aaf61bf1693e86e8e7962e892a09..e6ef56d94e29a6629c9b672ed4ac4ef2 .put(EntityType.PIG, Pig.createAttributes().build()) .put(EntityType.PIGLIN, Piglin.createAttributes().build()) .put(EntityType.PIGLIN_BRUTE, PiglinBrute.createAttributes().build()) -@@ -164,7 +164,7 @@ public class DefaultAttributes { +@@ -167,7 +167,7 @@ public class DefaultAttributes { .put(EntityType.VILLAGER, Villager.createAttributes().build()) .put(EntityType.VINDICATOR, Vindicator.createAttributes().build()) .put(EntityType.WARDEN, Warden.createAttributes().build()) @@ -2947,10 +2942,10 @@ index a87accd5fe14102e7a2938f991a8ed0b9accd1bb..c7515f7f24e39d6931dcf18574cb47d7 } } diff --git a/net/minecraft/world/entity/ai/behavior/AcquirePoi.java b/net/minecraft/world/entity/ai/behavior/AcquirePoi.java -index 57befff1f0675e889304a6258258384d8de02c87..b0ca555cc3b565a8be8d01fe10b139ed27a2a2c3 100644 +index ffc960a4e66ed03a358b363a4ce1dcee0b29ac36..21046cde1bd1ede8e7851eb4ea414e33628aa4a9 100644 --- a/net/minecraft/world/entity/ai/behavior/AcquirePoi.java +++ b/net/minecraft/world/entity/ai/behavior/AcquirePoi.java -@@ -86,7 +86,7 @@ public class AcquirePoi { +@@ -85,7 +85,7 @@ public class AcquirePoi { }; // Paper start - optimise POI access final java.util.List, BlockPos>> poiposes = new java.util.ArrayList<>(); @@ -3106,10 +3101,10 @@ index c65f80aadeb27685653f6a4731888c612d4a59d6..bb07aa944ce60ec7db96e2b57bd6c2c8 } else { workAtPoi = new WorkAtPoi(); diff --git a/net/minecraft/world/entity/ai/behavior/VillagerMakeLove.java b/net/minecraft/world/entity/ai/behavior/VillagerMakeLove.java -index 2591e4bbd234e51ff2c6b00db888d3b158f5a07d..e3d48c7c6615185f8a14bc96476a665bdadc275b 100644 +index f673a7e78729edf13f094d547a0b995ea9ae7146..0fa52865c293e74c9e5f3d1fd93a0e24435a9055 100644 --- a/net/minecraft/world/entity/ai/behavior/VillagerMakeLove.java +++ b/net/minecraft/world/entity/ai/behavior/VillagerMakeLove.java -@@ -118,8 +118,10 @@ public class VillagerMakeLove extends Behavior { +@@ -117,8 +117,10 @@ public class VillagerMakeLove extends Behavior { if (org.bukkit.craftbukkit.event.CraftEventFactory.callEntityBreedEvent(breedOffspring, parent, partner, null, null, 0).isCancelled()) { return Optional.empty(); } @@ -3183,7 +3178,7 @@ index e026e07ca86700c864a3dceda6817fb7b6cb11e9..cf380a13d6d54d1a9e8d10b31124942d && !this.isOpen(); } diff --git a/net/minecraft/world/entity/ai/goal/EatBlockGoal.java b/net/minecraft/world/entity/ai/goal/EatBlockGoal.java -index 0bff58498b146f937c3b128ca3454e5ff2551270..4cbfb5f635736df0822966b34cd73226840722b1 100644 +index 9a9c5ced9309abb14b27b20f7f1d9e93b505b796..18dfe585d8be8d0a2031a4d2f9bf73d8ed9179e1 100644 --- a/net/minecraft/world/entity/ai/goal/EatBlockGoal.java +++ b/net/minecraft/world/entity/ai/goal/EatBlockGoal.java @@ -62,7 +62,7 @@ public class EatBlockGoal extends Goal { @@ -3225,7 +3220,7 @@ index 6eaf0bd944349cd0c6084462ac385fa2caafe933..be59d0c27a83b329ec3f97c029cfb9c1 double d = this.llama.distanceToSqr(this.llama.getCaravanHead()); if (d > 676.0) { diff --git a/net/minecraft/world/entity/ai/goal/RemoveBlockGoal.java b/net/minecraft/world/entity/ai/goal/RemoveBlockGoal.java -index 3d40911970caf6f1de2a1ebee1df4c077703226a..179597558e93c6e9172207f716f9294de3926c49 100644 +index 962c0b327a46cf0c58904466d3bcb608f474c329..72cc1d2cc76dd564b7fd5c797e8e784b9a343d8a 100644 --- a/net/minecraft/world/entity/ai/goal/RemoveBlockGoal.java +++ b/net/minecraft/world/entity/ai/goal/RemoveBlockGoal.java @@ -35,7 +35,7 @@ public class RemoveBlockGoal extends MoveToBlockGoal { @@ -3338,7 +3333,7 @@ index 17a08a3af468093668a41f154c2beb69c6617efa..398a97a72dca785204f6b7b8fc4abe5c if (entity == null) { if (this.isCombat && (!target.canBeSeenAsEnemy() || level.getDifficulty() == Difficulty.PEACEFUL)) { diff --git a/net/minecraft/world/entity/ambient/Bat.java b/net/minecraft/world/entity/ambient/Bat.java -index a6487b63a277f7ca9681924850718f1dced746b1..59a849f5471a94bfbf364fe169d1a27a402629bd 100644 +index fa9830d4bc09c251dc81d72c6573189e1c44b192..c7cda22b67d92ba0db771ee27577ab239800241a 100644 --- a/net/minecraft/world/entity/ambient/Bat.java +++ b/net/minecraft/world/entity/ambient/Bat.java @@ -44,11 +44,87 @@ public class Bat extends AmbientCreature { @@ -3346,7 +3341,7 @@ index a6487b63a277f7ca9681924850718f1dced746b1..59a849f5471a94bfbf364fe169d1a27a public Bat(EntityType entityType, Level level) { super(entityType, level); + this.moveControl = new org.purpurmc.purpur.controller.FlyingWithSpacebarMoveControllerWASD(this, 0.075F); // Purpur - Ridables - if (!level.isClientSide) { + if (!level.isClientSide()) { this.setResting(true); } } @@ -3636,10 +3631,10 @@ index b18765bb91b4015bef326663dbc8966945929996..0002e39e2670ad92849ccc0aada163b1 double d = this.wantedX - this.fish.getX(); double d1 = this.wantedY - this.fish.getY(); diff --git a/net/minecraft/world/entity/animal/Animal.java b/net/minecraft/world/entity/animal/Animal.java -index cdf44c2586db396f1afdcbae4174b8b4fb00f48e..4d99a1bf2dc141630a76942ccbf1f60824cf7495 100644 +index dac5dc909631817817fbcd0c1829aeccf1bddd22..8405cbe7754b916e3d3a39318685fb91af5edce2 100644 --- a/net/minecraft/world/entity/animal/Animal.java +++ b/net/minecraft/world/entity/animal/Animal.java -@@ -43,6 +43,7 @@ public abstract class Animal extends AgeableMob { +@@ -41,6 +41,7 @@ public abstract class Animal extends AgeableMob { @Nullable public EntityReference loveCause; public @Nullable ItemStack breedItem; // CraftBukkit - Add breedItem variable @@ -3647,7 +3642,7 @@ index cdf44c2586db396f1afdcbae4174b8b4fb00f48e..4d99a1bf2dc141630a76942ccbf1f608 protected Animal(EntityType entityType, Level level) { super(entityType, level); -@@ -143,7 +144,7 @@ public abstract class Animal extends AgeableMob { +@@ -141,7 +142,7 @@ public abstract class Animal extends AgeableMob { ItemStack itemInHand = player.getItemInHand(hand); if (this.isFood(itemInHand)) { int age = this.getAge(); @@ -3656,7 +3651,7 @@ index cdf44c2586db396f1afdcbae4174b8b4fb00f48e..4d99a1bf2dc141630a76942ccbf1f608 final ItemStack breedCopy = itemInHand.copy(); // Paper - Fix EntityBreedEvent copying this.usePlayerItem(player, hand, itemInHand); this.setInLove(serverPlayer, breedCopy); // Paper - Fix EntityBreedEvent copying -@@ -235,10 +236,20 @@ public abstract class Animal extends AgeableMob { +@@ -223,10 +224,20 @@ public abstract class Animal extends AgeableMob { public void spawnChildFromBreeding(ServerLevel level, Animal mate) { AgeableMob breedOffspring = this.getBreedOffspring(level, mate); if (breedOffspring != null) { @@ -3679,7 +3674,7 @@ index cdf44c2586db396f1afdcbae4174b8b4fb00f48e..4d99a1bf2dc141630a76942ccbf1f608 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); if (entityBreedEvent.isCancelled()) { -@@ -269,8 +280,10 @@ public abstract class Animal extends AgeableMob { +@@ -257,8 +268,10 @@ public abstract class Animal extends AgeableMob { player.awardStat(Stats.ANIMALS_BRED); CriteriaTriggers.BRED_ANIMALS.trigger(player, this, animal, baby); } // Paper - Call EntityBreedEvent @@ -3693,10 +3688,10 @@ index cdf44c2586db396f1afdcbae4174b8b4fb00f48e..4d99a1bf2dc141630a76942ccbf1f608 animal.resetLove(); level.broadcastEntityEvent(this, (byte)18); diff --git a/net/minecraft/world/entity/animal/Bee.java b/net/minecraft/world/entity/animal/Bee.java -index 13f24836649790a34b988e2d63accb043e6ff080..7573f1be88ca23096e02efe2fa933429fa4421ba 100644 +index d2d0dcc742b6e28c7c3a5771fa94a4e1ce9e634e..a520052f0feae97c5ed8eb4af4fb48cdf56d6550 100644 --- a/net/minecraft/world/entity/animal/Bee.java +++ b/net/minecraft/world/entity/animal/Bee.java -@@ -150,6 +150,7 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { +@@ -152,6 +152,7 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { public Bee(EntityType entityType, Level level) { super(entityType, level); @@ -3704,7 +3699,7 @@ index 13f24836649790a34b988e2d63accb043e6ff080..7573f1be88ca23096e02efe2fa933429 // Paper start - Fix MC-167279 class BeeFlyingMoveControl extends FlyingMoveControl { public BeeFlyingMoveControl(final Mob entity, final int maxPitchChange, final boolean noGravity) { -@@ -158,22 +159,69 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { +@@ -160,22 +161,69 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { @Override public void tick() { @@ -3775,7 +3770,7 @@ index 13f24836649790a34b988e2d63accb043e6ff080..7573f1be88ca23096e02efe2fa933429 @Override protected void defineSynchedData(SynchedEntityData.Builder builder) { super.defineSynchedData(builder); -@@ -188,6 +236,7 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { +@@ -190,6 +238,7 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { @Override protected void registerGoals() { @@ -3783,7 +3778,7 @@ index 13f24836649790a34b988e2d63accb043e6ff080..7573f1be88ca23096e02efe2fa933429 this.goalSelector.addGoal(0, new Bee.BeeAttackGoal(this, 1.4F, true)); this.goalSelector.addGoal(1, new Bee.BeeEnterHiveGoal()); this.goalSelector.addGoal(2, new BreedGoal(this, 1.0)); -@@ -205,6 +254,7 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { +@@ -207,6 +256,7 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { this.goalSelector.addGoal(7, new Bee.BeeGrowCropGoal()); this.goalSelector.addGoal(8, new Bee.BeeWanderGoal()); this.goalSelector.addGoal(9, new FloatGoal(this)); @@ -3791,16 +3786,16 @@ index 13f24836649790a34b988e2d63accb043e6ff080..7573f1be88ca23096e02efe2fa933429 this.targetSelector.addGoal(1, new Bee.BeeHurtByOtherGoal(this).setAlertOthers(new Class[0])); this.targetSelector.addGoal(2, new Bee.BeeBecomeAngryTargetGoal(this)); this.targetSelector.addGoal(3, new ResetUniversalAngerTargetGoal<>(this, true)); -@@ -366,7 +416,7 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { +@@ -368,7 +418,7 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { } public static boolean isNightOrRaining(Level level) { -- return level.dimensionType().hasSkyLight() && (level.isDarkOutside() || level.isRaining()); +- return level.dimensionType().hasSkyLight() && level.dimension() != Level.END && (level.isDarkOutside() || level.isRaining()); + return level.dimensionType().hasSkyLight() && (level.isDarkOutside() && !level.purpurConfig.beeCanWorkAtNight || level.isRaining() && !level.purpurConfig.beeCanWorkInRain); // Purpur - Bee can work when raining or at night } public void setStayOutOfHiveCountdown(int stayOutOfHiveCountdown) { -@@ -389,7 +439,7 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { +@@ -391,7 +441,7 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { @Override protected void customServerAiStep(ServerLevel level) { boolean hasStung = this.hasStung(); @@ -3809,7 +3804,7 @@ index 13f24836649790a34b988e2d63accb043e6ff080..7573f1be88ca23096e02efe2fa933429 this.underWaterTicks++; } else { this.underWaterTicks = 0; -@@ -399,6 +449,7 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { +@@ -401,6 +451,7 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { this.hurtServer(level, this.damageSources().drown(), 1.0F); } @@ -3817,7 +3812,7 @@ index 13f24836649790a34b988e2d63accb043e6ff080..7573f1be88ca23096e02efe2fa933429 if (hasStung) { this.timeSinceSting++; if (this.timeSinceSting % 5 == 0 && this.random.nextInt(Mth.clamp(1200 - this.timeSinceSting, 1, 1200)) == 0) { -@@ -422,6 +473,35 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { +@@ -424,6 +475,35 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { return beehiveBlockEntity != null && beehiveBlockEntity.isFireNearby(); } @@ -3853,7 +3848,7 @@ index 13f24836649790a34b988e2d63accb043e6ff080..7573f1be88ca23096e02efe2fa933429 @Override public int getRemainingPersistentAngerTime() { return this.entityData.get(DATA_REMAINING_ANGER_TIME); -@@ -1080,15 +1160,15 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { +@@ -1087,15 +1167,15 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { } } @@ -3872,7 +3867,7 @@ index 13f24836649790a34b988e2d63accb043e6ff080..7573f1be88ca23096e02efe2fa933429 } } -@@ -1133,6 +1213,7 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { +@@ -1140,6 +1220,7 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { 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); @@ -3880,7 +3875,7 @@ index 13f24836649790a34b988e2d63accb043e6ff080..7573f1be88ca23096e02efe2fa933429 return true; } else { Bee.this.remainingCooldownBeforeLocatingNewFlower = Mth.nextInt(Bee.this.random, 20, 60); -@@ -1179,6 +1260,7 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { +@@ -1186,6 +1267,7 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { this.pollinating = false; Bee.this.navigation.stop(); Bee.this.remainingCooldownBeforeLocatingNewFlower = 200; @@ -3888,7 +3883,7 @@ index 13f24836649790a34b988e2d63accb043e6ff080..7573f1be88ca23096e02efe2fa933429 } @Override -@@ -1225,6 +1307,7 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { +@@ -1232,6 +1314,7 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { this.setWantedPos(); } @@ -4236,7 +4231,7 @@ index 176425cbacea381990386d440059b768a583af98..b2fa170b14bc3037e5c143d320d0a1ef return super.finalizeSpawn(level, difficulty, spawnReason, spawnGroupData); } diff --git a/net/minecraft/world/entity/animal/Dolphin.java b/net/minecraft/world/entity/animal/Dolphin.java -index 4bb273b11dbfbc6557c6771f79aa63f5f69d03cf..23696a5e2871ea07f34d4b4f6a20e2896ac3f5bd 100644 +index 3082de7b60612738a0b98831669d539fa0335ee7..39c31dcce4df2b5fddf69bf20e2d81b25ed8e469 100644 --- a/net/minecraft/world/entity/animal/Dolphin.java +++ b/net/minecraft/world/entity/animal/Dolphin.java @@ -74,14 +74,105 @@ public class Dolphin extends AgeableWaterCreature { @@ -4407,7 +4402,7 @@ index 4bb273b11dbfbc6557c6771f79aa63f5f69d03cf..23696a5e2871ea07f34d4b4f6a20e289 } diff --git a/net/minecraft/world/entity/animal/Fox.java b/net/minecraft/world/entity/animal/Fox.java -index 517c546cfc8eca2191df57289e6a22ac64fc867c..8964bb5098c0dc36741af3656af6bc0b5b463abe 100644 +index 97068f7b97d4be722b627d9c8e91bd7c52ef2ca8..0602c7fc5b5f4c895dcb9fc55fd2f079617c1483 100644 --- a/net/minecraft/world/entity/animal/Fox.java +++ b/net/minecraft/world/entity/animal/Fox.java @@ -142,6 +142,73 @@ public class Fox extends Animal { @@ -4611,10 +4606,10 @@ index 517c546cfc8eca2191df57289e6a22ac64fc867c..8964bb5098c0dc36741af3656af6bc0b } } diff --git a/net/minecraft/world/entity/animal/HappyGhast.java b/net/minecraft/world/entity/animal/HappyGhast.java -index f07dcf7d45b1b717faeae0c4129fb00a22fb7d57..9763a5e24e0fed9b49b6ac59911f6c9f8e893db5 100644 +index 7375a1b2440962a4b42646f5b217e8ef4c0493e3..7fae9853c117cda03c516afc1508493af460fa8a 100644 --- a/net/minecraft/world/entity/animal/HappyGhast.java +++ b/net/minecraft/world/entity/animal/HappyGhast.java -@@ -124,6 +124,47 @@ public class HappyGhast extends Animal { +@@ -123,6 +123,47 @@ public class HappyGhast extends Animal { this.removeAllGoals(goal -> true); } @@ -4662,7 +4657,7 @@ index f07dcf7d45b1b717faeae0c4129fb00a22fb7d57..9763a5e24e0fed9b49b6ac59911f6c9f @Override protected void ageBoundaryReached() { if (this.isBaby()) { -@@ -147,7 +188,7 @@ public class HappyGhast extends Animal { +@@ -146,7 +187,7 @@ public class HappyGhast extends Animal { @Override protected float sanitizeScale(float scale) { @@ -4672,7 +4667,7 @@ index f07dcf7d45b1b717faeae0c4129fb00a22fb7d57..9763a5e24e0fed9b49b6ac59911f6c9f @Override diff --git a/net/minecraft/world/entity/animal/IronGolem.java b/net/minecraft/world/entity/animal/IronGolem.java -index db309a1261778cc65da9b4bf5a962a372b83bba6..8885ab56eb72c0106ef57359ca11f70c012fc348 100644 +index a217245b1b91bc8bcfe287fd5e3e80ac15350114..a0c3ef5ca2fccc0719b5d70e1610aa0fbf921b0c 100644 --- a/net/minecraft/world/entity/animal/IronGolem.java +++ b/net/minecraft/world/entity/animal/IronGolem.java @@ -58,13 +58,67 @@ public class IronGolem extends AbstractGolem implements NeutralMob { @@ -4788,10 +4783,10 @@ index db309a1261778cc65da9b4bf5a962a372b83bba6..8885ab56eb72c0106ef57359ca11f70c } } diff --git a/net/minecraft/world/entity/animal/MushroomCow.java b/net/minecraft/world/entity/animal/MushroomCow.java -index 1f82848c97c5b52d6c4225b07a895f00d20c7d6c..cdb11eabdd246fb6c6aed11c9f1f264648b55c26 100644 +index c4cf69f7b1db89bf58ab20a8c2b19b9fd0c947b4..c0ed842b4c2e2c94bce2ddfac416a3d8118e6a44 100644 --- a/net/minecraft/world/entity/animal/MushroomCow.java +++ b/net/minecraft/world/entity/animal/MushroomCow.java -@@ -62,6 +62,51 @@ public class MushroomCow extends AbstractCow implements Shearable { +@@ -63,6 +63,51 @@ public class MushroomCow extends AbstractCow implements Shearable { super(entityType, level); } @@ -4843,7 +4838,7 @@ index 1f82848c97c5b52d6c4225b07a895f00d20c7d6c..cdb11eabdd246fb6c6aed11c9f1f2646 @Override public float getWalkTargetValue(BlockPos pos, LevelReader level) { return level.getBlockState(pos.below()).is(Blocks.MYCELIUM) ? 10.0F : level.getPathfindingCostFromLightLevels(pos); -@@ -122,7 +167,7 @@ public class MushroomCow extends AbstractCow implements Shearable { +@@ -123,7 +168,7 @@ public class MushroomCow extends AbstractCow implements Shearable { java.util.List drops = this.generateDefaultDrops(serverLevel, itemInHand); org.bukkit.event.player.PlayerShearEntityEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.handlePlayerShearEntityEvent(player, this, itemInHand, hand, drops); if (event != null) { @@ -4853,7 +4848,7 @@ index 1f82848c97c5b52d6c4225b07a895f00d20c7d6c..cdb11eabdd246fb6c6aed11c9f1f2646 // Paper end - custom shear drops } diff --git a/net/minecraft/world/entity/animal/Ocelot.java b/net/minecraft/world/entity/animal/Ocelot.java -index e8b184f2e1a98e565a50ce6ae6cab248d5a6e89b..4c20569ec5c504c582575851ab1d74248289b1c0 100644 +index ca99c2b201c9146f439b87c061ca5ae15cd91e85..13f0e2910e232f115ecb2496de2192617fd334e5 100644 --- a/net/minecraft/world/entity/animal/Ocelot.java +++ b/net/minecraft/world/entity/animal/Ocelot.java @@ -64,6 +64,52 @@ public class Ocelot extends Animal { @@ -4934,7 +4929,7 @@ index e8b184f2e1a98e565a50ce6ae6cab248d5a6e89b..4c20569ec5c504c582575851ab1d7424 } diff --git a/net/minecraft/world/entity/animal/Panda.java b/net/minecraft/world/entity/animal/Panda.java -index 44c12820b9b39acc5220db8b8d29a31c0e57526e..02bfa88568e635770675ea9173f2cf3ca21457fa 100644 +index 3da6752ba714988a6558332e4eb205db9cf31f5b..580ded94fbb6ba861259fd92c174d0aab879b3ab 100644 --- a/net/minecraft/world/entity/animal/Panda.java +++ b/net/minecraft/world/entity/animal/Panda.java @@ -107,6 +107,62 @@ public class Panda extends Animal { @@ -5069,7 +5064,7 @@ index 44c12820b9b39acc5220db8b8d29a31c0e57526e..02bfa88568e635770675ea9173f2cf3c } } diff --git a/net/minecraft/world/entity/animal/Parrot.java b/net/minecraft/world/entity/animal/Parrot.java -index 22d1e36dadd6a8cbf615335074426aaab6ea7d01..dddf3a2e372bd0d483c1da01d36fe59b17b3d4e2 100644 +index 89a56b2060c571d8e33ec097fc783c0c0444f0ca..fa00f9fab8a5f4226e2e4b061239537303ff73e0 100644 --- a/net/minecraft/world/entity/animal/Parrot.java +++ b/net/minecraft/world/entity/animal/Parrot.java @@ -131,12 +131,97 @@ public class Parrot extends ShoulderRidingEntity implements FlyingAnimal { @@ -5187,7 +5182,7 @@ index 22d1e36dadd6a8cbf615335074426aaab6ea7d01..dddf3a2e372bd0d483c1da01d36fe59b @@ -264,7 +352,7 @@ public class Parrot extends ShoulderRidingEntity implements FlyingAnimal { } - if (!this.level().isClientSide) { + if (!this.level().isClientSide()) { - if (this.random.nextInt(10) == 0 && !org.bukkit.craftbukkit.event.CraftEventFactory.callEntityTameEvent(this, player).isCancelled()) { // CraftBukkit + if (((this.level().purpurConfig.alwaysTameInCreative && player.hasInfiniteMaterials()) || this.random.nextInt(10) == 0) && !org.bukkit.craftbukkit.event.CraftEventFactory.callEntityTameEvent(this, player).isCancelled()) { // CraftBukkit // Purpur - Config to always tame in Creative this.tame(player); @@ -5227,7 +5222,7 @@ index 22d1e36dadd6a8cbf615335074426aaab6ea7d01..dddf3a2e372bd0d483c1da01d36fe59b @Nullable diff --git a/net/minecraft/world/entity/animal/Pig.java b/net/minecraft/world/entity/animal/Pig.java -index 155a51233895955d01c2ee73416e2daefc4dfd0f..adbbe938c14d14a628d9963acec57c32661957cd 100644 +index 073c78e1f8ebd42de6394cf35af1a20643fee79b..9a68ee7b31cf050af007c1a58cf4fd01771cd8ff 100644 --- a/net/minecraft/world/entity/animal/Pig.java +++ b/net/minecraft/world/entity/animal/Pig.java @@ -66,9 +66,56 @@ public class Pig extends Animal implements ItemSteerable { @@ -5305,10 +5300,10 @@ index 155a51233895955d01c2ee73416e2daefc4dfd0f..adbbe938c14d14a628d9963acec57c32 + // Purpur end - Pigs give saddle back + if (!isFood && this.isSaddled() && !this.isVehicle() && !player.isSecondaryUseActive()) { - if (!this.level().isClientSide) { + if (!this.level().isClientSide()) { player.startRiding(this); diff --git a/net/minecraft/world/entity/animal/PolarBear.java b/net/minecraft/world/entity/animal/PolarBear.java -index d727e8e93e466b9bb91cbb43b9c1bbbccc56d486..e0b51b482607ec5a9f5b4d13d918d79b2f52f9c0 100644 +index 564ffbde79711b090cb8ef13fa4954f40914e001..de0d6239686fda715d2c5f3e34ce77edcf803800 100644 --- a/net/minecraft/world/entity/animal/PolarBear.java +++ b/net/minecraft/world/entity/animal/PolarBear.java @@ -60,11 +60,92 @@ public class PolarBear extends Animal implements NeutralMob { @@ -5434,7 +5429,7 @@ index d727e8e93e466b9bb91cbb43b9c1bbbccc56d486..e0b51b482607ec5a9f5b4d13d918d79b this.targetSelector.addGoal(2, new PolarBear.PolarBearAttackPlayersGoal()); this.targetSelector.addGoal(3, new NearestAttackableTargetGoal<>(this, Player.class, 10, true, false, this::isAngryAt)); @@ -204,6 +293,12 @@ public class PolarBear extends Animal implements NeutralMob { - if (!this.level().isClientSide) { + if (!this.level().isClientSide()) { this.updatePersistentAnger((ServerLevel)this.level(), true); } + @@ -5455,7 +5450,7 @@ index d727e8e93e466b9bb91cbb43b9c1bbbccc56d486..e0b51b482607ec5a9f5b4d13d918d79b public float getStandingAnimationScale(float partialTick) { diff --git a/net/minecraft/world/entity/animal/Pufferfish.java b/net/minecraft/world/entity/animal/Pufferfish.java -index e67f9b26444e3af42feeb0223c1b7c1e536646ba..685176ce37538cbbc614401db568acdb0ad264bb 100644 +index de7d1fd5a55c7b2b9cd9fc87959931232a1037d6..1ed4e7b13c7a578fbfdbf75740f79fadad3f6d2f 100644 --- a/net/minecraft/world/entity/animal/Pufferfish.java +++ b/net/minecraft/world/entity/animal/Pufferfish.java @@ -47,6 +47,39 @@ public class Pufferfish extends AbstractFish { @@ -5499,7 +5494,7 @@ index e67f9b26444e3af42feeb0223c1b7c1e536646ba..685176ce37538cbbc614401db568acdb protected void defineSynchedData(SynchedEntityData.Builder builder) { super.defineSynchedData(builder); diff --git a/net/minecraft/world/entity/animal/Rabbit.java b/net/minecraft/world/entity/animal/Rabbit.java -index ac99590dad689f2cfffb9b9e2465f6a252d41e9c..1af1b33702296f9aa74c33436ea2904c5e5ae43d 100644 +index 9733959f4face7c9e67da775a5424f624976adaa..44dc38b94c311a791fadb073200fe04510f5123e 100644 --- a/net/minecraft/world/entity/animal/Rabbit.java +++ b/net/minecraft/world/entity/animal/Rabbit.java @@ -91,6 +91,7 @@ public class Rabbit extends Animal { @@ -5727,7 +5722,7 @@ index 8a3e1d420263ac53b87ffed026380dcdc4a48285..d2679beaa3be6de36227c5b66609e0df public int getMaxSchoolSize() { return 5; diff --git a/net/minecraft/world/entity/animal/SnowGolem.java b/net/minecraft/world/entity/animal/SnowGolem.java -index 1b3a020e35fb2f9a28be718415c51fde5b52d399..8984a4fc0aae9fd72bc3f7222003c7593810ab77 100644 +index 5093dfb020a4c9e8f8b1dd17dee13250bf6557b8..efba95b3d833f2393ae846af1b27d10ef75550af 100644 --- a/net/minecraft/world/entity/animal/SnowGolem.java +++ b/net/minecraft/world/entity/animal/SnowGolem.java @@ -46,17 +46,63 @@ public class SnowGolem extends AbstractGolem implements Shearable, RangedAttackM @@ -5858,7 +5853,7 @@ index 1b3a020e35fb2f9a28be718415c51fde5b52d399..8984a4fc0aae9fd72bc3f7222003c759 } diff --git a/net/minecraft/world/entity/animal/Squid.java b/net/minecraft/world/entity/animal/Squid.java -index 58e1bc90cbc32669fa6c66d214119f0c459ff38c..8371f3892e50150db018f0b265986ffab37f21e7 100644 +index 1ec68ca8c25939cdbc43f9db579cdf0a5e90def8..19f176976218db6207b7cdd8aacd370b83cfd536 100644 --- a/net/minecraft/world/entity/animal/Squid.java +++ b/net/minecraft/world/entity/animal/Squid.java @@ -46,13 +46,77 @@ public class Squid extends AgeableWaterCreature { @@ -6036,7 +6031,7 @@ index 806fb2561d1eb0fba56dc40ba5c1f306c3105880..8d1fa86c6f4881c05f11fa80018b8de7 return "entity.minecraft.tropical_fish.predefined." + variantId; } diff --git a/net/minecraft/world/entity/animal/Turtle.java b/net/minecraft/world/entity/animal/Turtle.java -index 8738424b92726f45de2c166a063d46e1071e8b29..9bdc1f10e3b40672449ad166f130ecabdacc75d3 100644 +index 9262bd842b4f012a68a2a99531695e51cdfaf611..bb2f87ee973ad4163a7d130d607e6efa4cefdd92 100644 --- a/net/minecraft/world/entity/animal/Turtle.java +++ b/net/minecraft/world/entity/animal/Turtle.java @@ -86,6 +86,52 @@ public class Turtle extends Animal { @@ -6148,10 +6143,10 @@ index 8738424b92726f45de2c166a063d46e1071e8b29..9bdc1f10e3b40672449ad166f130ecab this.turtle.setDeltaMovement(this.turtle.getDeltaMovement().add(0.0, this.turtle.getSpeed() * d1 * 0.1, 0.0)); } diff --git a/net/minecraft/world/entity/animal/allay/Allay.java b/net/minecraft/world/entity/animal/allay/Allay.java -index 69500fa0b207fc3d5b1bc2bd665fa39f6725d23d..7127d8e5fff81be017f0aa04606cb8404ad7b2fd 100644 +index 7c4ae0d67038b58d5bc3458faff89a035ec47a41..e274bc617c19af52a79cfcb4cdb7fe70dd8bccdd 100644 --- a/net/minecraft/world/entity/animal/allay/Allay.java +++ b/net/minecraft/world/entity/animal/allay/Allay.java -@@ -112,10 +112,23 @@ public class Allay extends PathfinderMob implements InventoryCarrier, VibrationS +@@ -111,10 +111,23 @@ public class Allay extends PathfinderMob implements InventoryCarrier, VibrationS private float spinningAnimationTicks; private float spinningAnimationTicks0; public boolean forceDancing = false; // CraftBukkit @@ -6176,7 +6171,7 @@ index 69500fa0b207fc3d5b1bc2bd665fa39f6725d23d..7127d8e5fff81be017f0aa04606cb840 this.setCanPickUpLoot(this.canPickUpLoot()); this.vibrationUser = new Allay.VibrationUser(); this.vibrationData = new VibrationSystem.Data(); -@@ -131,6 +144,36 @@ public class Allay extends PathfinderMob implements InventoryCarrier, VibrationS +@@ -130,6 +143,36 @@ public class Allay extends PathfinderMob implements InventoryCarrier, VibrationS } // CraftBukkit end @@ -6213,16 +6208,17 @@ index 69500fa0b207fc3d5b1bc2bd665fa39f6725d23d..7127d8e5fff81be017f0aa04606cb840 @Override protected Brain.Provider brainProvider() { return Brain.provider(MEMORY_TYPES, SENSOR_TYPES); -@@ -225,6 +268,7 @@ public class Allay extends PathfinderMob implements InventoryCarrier, VibrationS +@@ -224,7 +267,7 @@ public class Allay extends PathfinderMob implements InventoryCarrier, VibrationS private int behaviorTick = 0; // Pufferfish @Override protected void customServerAiStep(ServerLevel level) { -+ //if ((getRider() == null || !this.isControllable()) && this.behaviorTick++ % this.activatedPriority == 0) // Pufferfish // Purpur - only use brain if no rider - if (this.behaviorTick++ % this.activatedPriority == 0) // Pufferfish +- if (this.behaviorTick++ % this.activatedPriority == 0) // Pufferfish ++ if ((getRider() == null || !this.isControllable()) && this.behaviorTick++ % this.activatedPriority == 0) // Pufferfish // Purpur - only use brain if no rider this.getBrain().tick(level, this); AllayAi.updateActivity(this); + super.customServerAiStep(level); diff --git a/net/minecraft/world/entity/animal/armadillo/Armadillo.java b/net/minecraft/world/entity/animal/armadillo/Armadillo.java -index ee2c6c86631ba50a4e8503131c678596bc2c0363..6fbeaff7178a21338920d6738767033260b7a726 100644 +index 6118a4f0fa03aaefa35ccff71c1d0bba9c45c158..0d724ad5a8df9f96a21e2e2216aef4a3b87cd2ad 100644 --- a/net/minecraft/world/entity/animal/armadillo/Armadillo.java +++ b/net/minecraft/world/entity/animal/armadillo/Armadillo.java @@ -80,6 +80,38 @@ public class Armadillo extends Animal { @@ -6265,10 +6261,10 @@ index ee2c6c86631ba50a4e8503131c678596bc2c0363..6fbeaff7178a21338920d67387670332 protected void defineSynchedData(SynchedEntityData.Builder builder) { super.defineSynchedData(builder); diff --git a/net/minecraft/world/entity/animal/axolotl/Axolotl.java b/net/minecraft/world/entity/animal/axolotl/Axolotl.java -index 3475ecbd95fac6c6b6e792a23cb15cdb3395985f..02db38fa315ecb9d5bdba74848012710106b662e 100644 +index d62e8f371a164f64085eb41349889334889e86e8..09199eb6842c0ac0a0443d3cfa87645bd0a43ba5 100644 --- a/net/minecraft/world/entity/animal/axolotl/Axolotl.java +++ b/net/minecraft/world/entity/animal/axolotl/Axolotl.java -@@ -120,6 +120,52 @@ public class Axolotl extends Animal implements Bucketable { +@@ -119,6 +119,52 @@ public class Axolotl extends Animal implements Bucketable { this.lookControl = new Axolotl.AxolotlLookControl(this, 20); } @@ -6321,15 +6317,16 @@ index 3475ecbd95fac6c6b6e792a23cb15cdb3395985f..02db38fa315ecb9d5bdba74848012710 @Override public float getWalkTargetValue(BlockPos pos, LevelReader level) { return 0.0F; -@@ -328,6 +374,7 @@ public class Axolotl extends Animal implements Bucketable { +@@ -327,7 +373,7 @@ public class Axolotl extends Animal implements Bucketable { private int behaviorTick = 0; // Pufferfish @Override protected void customServerAiStep(ServerLevel level) { -+ //if ((getRider() == null || !this.isControllable()) && this.behaviorTick++ % this.activatedPriority == 0) // Pufferfish // Purpur - only use brain if no rider - if (this.behaviorTick++ % this.activatedPriority == 0) // Pufferfish +- if (this.behaviorTick++ % this.activatedPriority == 0) // Pufferfish ++ if ((getRider() == null || !this.isControllable()) && this.behaviorTick++ % this.activatedPriority == 0) // Pufferfish // Purpur - only use brain if no rider this.getBrain().tick(level, this); AxolotlAi.updateActivity(this); -@@ -575,23 +622,31 @@ public class Axolotl extends Animal implements Bucketable { + if (!this.isNoAi()) { +@@ -568,23 +614,31 @@ public class Axolotl extends Animal implements Bucketable { } @Override @@ -6364,10 +6361,10 @@ index 3475ecbd95fac6c6b6e792a23cb15cdb3395985f..02db38fa315ecb9d5bdba74848012710 super.tick(); } diff --git a/net/minecraft/world/entity/animal/camel/Camel.java b/net/minecraft/world/entity/animal/camel/Camel.java -index adc336c6cec601b8855c1013adf1eebf018597f0..949b6c563658e6e46ac5842d6f088ecae6d4cd0c 100644 +index 0cf88d97503349364a17f85926ed14b5e681f2f7..5a436ae8893cd91944e8269f11c29bc82217c755 100644 --- a/net/minecraft/world/entity/animal/camel/Camel.java +++ b/net/minecraft/world/entity/animal/camel/Camel.java -@@ -89,6 +89,20 @@ public class Camel extends AbstractHorse { +@@ -88,6 +88,20 @@ public class Camel extends AbstractHorse { groundPathNavigation.setCanWalkOverFences(true); } @@ -6388,7 +6385,7 @@ index adc336c6cec601b8855c1013adf1eebf018597f0..949b6c563658e6e46ac5842d6f088eca @Override protected void addAdditionalSaveData(ValueOutput output) { super.addAdditionalSaveData(output); -@@ -322,6 +336,23 @@ public class Camel extends AbstractHorse { +@@ -321,6 +335,23 @@ public class Camel extends AbstractHorse { return this.dashCooldown; } @@ -6412,11 +6409,23 @@ index adc336c6cec601b8855c1013adf1eebf018597f0..949b6c563658e6e46ac5842d6f088eca @Override public SoundEvent getAmbientSound() { return SoundEvents.CAMEL_AMBIENT; +diff --git a/net/minecraft/world/entity/animal/coppergolem/CopperGolem.java b/net/minecraft/world/entity/animal/coppergolem/CopperGolem.java +index facc49cb9a6aa7dddfbbf9733391fc9cf656f0ce..292c9a82028503566c8d3b50b87d09f79619aa7d 100644 +--- a/net/minecraft/world/entity/animal/coppergolem/CopperGolem.java ++++ b/net/minecraft/world/entity/animal/coppergolem/CopperGolem.java +@@ -185,6 +185,7 @@ public class CopperGolem extends AbstractGolem implements ContainerUser, Shearab + protected void customServerAiStep(ServerLevel level) { + ProfilerFiller profilerFiller = Profiler.get(); + profilerFiller.push("copperGolemBrain"); ++ if (getRider() == null || !this.isControllable()) // Purpur - only use brain if no rider + this.getBrain().tick(level, this); + profilerFiller.pop(); + profilerFiller.push("copperGolemActivityUpdate"); diff --git a/net/minecraft/world/entity/animal/frog/Frog.java b/net/minecraft/world/entity/animal/frog/Frog.java -index f5c9ef8909f3852fc7a203265ae057232fa403ad..c4db078db0b7bb2bd8f6757a8bd13d60a7a4fa14 100644 +index 0c92ff63a2b30fdd3d0247762b61bbc5687ba380..e5aeea7851deef6e7b36f479fa1985648c4d4cd9 100644 --- a/net/minecraft/world/entity/animal/frog/Frog.java +++ b/net/minecraft/world/entity/animal/frog/Frog.java -@@ -104,6 +104,8 @@ public class Frog extends Animal { +@@ -103,6 +103,8 @@ public class Frog extends Animal { public final AnimationState croakAnimationState = new AnimationState(); public final AnimationState tongueAnimationState = new AnimationState(); public final AnimationState swimIdleAnimationState = new AnimationState(); @@ -6425,7 +6434,7 @@ index f5c9ef8909f3852fc7a203265ae057232fa403ad..c4db078db0b7bb2bd8f6757a8bd13d60 public Frog(EntityType entityType, Level level) { super(entityType, level); -@@ -111,7 +113,62 @@ public class Frog extends Animal { +@@ -110,7 +112,62 @@ public class Frog extends Animal { this.setPathfindingMalus(PathType.WATER, 4.0F); this.setPathfindingMalus(PathType.TRAPDOOR, -1.0F); this.moveControl = new SmoothSwimmingMoveControl(this, 85, 10, 0.02F, 0.1F, true); @@ -6488,15 +6497,16 @@ index f5c9ef8909f3852fc7a203265ae057232fa403ad..c4db078db0b7bb2bd8f6757a8bd13d60 @Override protected Brain.Provider brainProvider() { -@@ -203,6 +260,7 @@ public class Frog extends Animal { +@@ -202,7 +259,7 @@ public class Frog extends Animal { private int behaviorTick = 0; // Pufferfish @Override protected void customServerAiStep(ServerLevel level) { -+ //if ((getRider() == null || !this.isControllable()) && this.behaviorTick++ % this.activatedPriority == 0) // Pufferfish // Purpur - only use brain if no rider - if (this.behaviorTick++ % this.activatedPriority == 0) // Pufferfish +- if (this.behaviorTick++ % this.activatedPriority == 0) // Pufferfish ++ if ((getRider() == null || !this.isControllable()) && this.behaviorTick++ % this.activatedPriority == 0) // Pufferfish // Purpur - only use brain if no rider this.getBrain().tick(level, this); FrogAi.updateActivity(this); -@@ -385,7 +443,7 @@ public class Frog extends Animal { + super.customServerAiStep(level); +@@ -378,7 +435,7 @@ public class Frog extends Animal { return level.getBlockState(pos.below()).is(BlockTags.FROGS_SPAWNABLE_ON) && isBrightEnoughToSpawn(level, pos); } @@ -6506,10 +6516,10 @@ index f5c9ef8909f3852fc7a203265ae057232fa403ad..c4db078db0b7bb2bd8f6757a8bd13d60 super(mob); } diff --git a/net/minecraft/world/entity/animal/frog/Tadpole.java b/net/minecraft/world/entity/animal/frog/Tadpole.java -index 5392cb211a3dc841ab38710a4ef688bde7fbe067..a3858465569c40fcfc7c8c4c4735335ac83cb078 100644 +index be8ee6551a0d5fede0601b08e339558d69dd1882..9e1402a37a44a90b2172ba70c2f370e400aedd43 100644 --- a/net/minecraft/world/entity/animal/frog/Tadpole.java +++ b/net/minecraft/world/entity/animal/frog/Tadpole.java -@@ -64,13 +64,50 @@ public class Tadpole extends AbstractFish { +@@ -63,13 +63,50 @@ public class Tadpole extends AbstractFish { MemoryModuleType.IS_PANICKING ); public boolean ageLocked; // Paper @@ -6561,19 +6571,20 @@ index 5392cb211a3dc841ab38710a4ef688bde7fbe067..a3858465569c40fcfc7c8c4c4735335a @Override protected PathNavigation createNavigation(Level level) { return new WaterBoundPathNavigation(this, level); -@@ -99,6 +136,7 @@ public class Tadpole extends AbstractFish { +@@ -98,7 +135,7 @@ public class Tadpole extends AbstractFish { private int behaviorTick = 0; // Pufferfish @Override protected void customServerAiStep(ServerLevel level) { -+ //if ((getRider() == null || !this.isControllable()) && this.behaviorTick++ % this.activatedPriority == 0) // Pufferfish // Purpur - only use brain if no rider - if (this.behaviorTick++ % this.activatedPriority == 0) // Pufferfish +- if (this.behaviorTick++ % this.activatedPriority == 0) // Pufferfish ++ if ((getRider() == null || !this.isControllable()) && this.behaviorTick++ % this.activatedPriority == 0) // Pufferfish // Purpur - only use brain if no rider this.getBrain().tick(level, this); TadpoleAi.updateActivity(this); + super.customServerAiStep(level); diff --git a/net/minecraft/world/entity/animal/goat/Goat.java b/net/minecraft/world/entity/animal/goat/Goat.java -index 2a72d7f422c340dabef11a6dc680358207bee637..11b020704a673c69bd2d4ab6313ea32e8e97cc23 100644 +index 23ca6091918a096d87c174cdd245383785053025..4b62d88c658f8d4841ff27a5ca8fce4e78b2e38e 100644 --- a/net/minecraft/world/entity/animal/goat/Goat.java +++ b/net/minecraft/world/entity/animal/goat/Goat.java -@@ -113,6 +113,44 @@ public class Goat extends Animal { +@@ -112,6 +112,44 @@ public class Goat extends Animal { .orElseGet(() -> new ItemStack(Items.GOAT_HORN)); } @@ -6618,15 +6629,16 @@ index 2a72d7f422c340dabef11a6dc680358207bee637..11b020704a673c69bd2d4ab6313ea32e @Override protected Brain.Provider brainProvider() { return Brain.provider(MEMORY_TYPES, SENSOR_TYPES); -@@ -189,6 +227,7 @@ public class Goat extends Animal { +@@ -188,7 +226,7 @@ public class Goat extends Animal { private int behaviorTick = 0; // Pufferfish @Override protected void customServerAiStep(ServerLevel level) { -+ //if ((getRider() == null || !this.isControllable()) && this.behaviorTick++ % this.activatedPriority == 0) // Pufferfish // Purpur - only use brain if no rider - if (this.behaviorTick++ % this.activatedPriority == 0) // Pufferfish +- if (this.behaviorTick++ % this.activatedPriority == 0) // Pufferfish ++ if ((getRider() == null || !this.isControllable()) && this.behaviorTick++ % this.activatedPriority == 0) // Pufferfish // Purpur - only use brain if no rider this.getBrain().tick(level, this); GoatAi.updateActivity(this); -@@ -391,6 +430,7 @@ public class Goat extends Animal { + super.customServerAiStep(level); +@@ -384,6 +422,7 @@ public class Goat extends Animal { // Paper start - Goat ram API public void ram(net.minecraft.world.entity.LivingEntity entity) { @@ -6635,7 +6647,7 @@ index 2a72d7f422c340dabef11a6dc680358207bee637..11b020704a673c69bd2d4ab6313ea32e brain.setMemory(MemoryModuleType.RAM_TARGET, entity.position()); brain.eraseMemory(MemoryModuleType.RAM_COOLDOWN_TICKS); diff --git a/net/minecraft/world/entity/animal/horse/AbstractHorse.java b/net/minecraft/world/entity/animal/horse/AbstractHorse.java -index e7e4558d0f018a0c975d12d77287cda4df5a500a..6f1006281128d6da0dda43cc61ee672e872186af 100644 +index fde1f235332127f727da8491e03b54680e42ea4a..387f6bb134a766ce7b72cf2d4a56509f51687308 100644 --- a/net/minecraft/world/entity/animal/horse/AbstractHorse.java +++ b/net/minecraft/world/entity/animal/horse/AbstractHorse.java @@ -127,11 +127,61 @@ public abstract class AbstractHorse extends Animal implements HasCustomInventory @@ -6708,7 +6720,7 @@ index e7e4558d0f018a0c975d12d77287cda4df5a500a..6f1006281128d6da0dda43cc61ee672e this.addBehaviourGoals(); } -@@ -1040,7 +1091,7 @@ public abstract class AbstractHorse extends Animal implements HasCustomInventory +@@ -1046,7 +1097,7 @@ public abstract class AbstractHorse extends Animal implements HasCustomInventory spawnGroupData = new AgeableMob.AgeableMobGroupData(0.2F); } @@ -6830,7 +6842,7 @@ index 2a1d720557c0bd4895a32723e34512c0a557e4f2..f1080a40f759b30b921b88b4f6edd35f protected void randomizeAttributes(RandomSource random) { this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(generateMaxHealth(random::nextInt)); diff --git a/net/minecraft/world/entity/animal/horse/Llama.java b/net/minecraft/world/entity/animal/horse/Llama.java -index 1e2b629641e5fa1040307461dbbf03ad2d75ba00..455a84ffa16152137409777e1fddbab5a21bd57d 100644 +index 870868dcc60e2e4e3b9992db4fc8c5e96e4bb558..e4f261e14bf57d6c50cf7c012707f1265fcf9f61 100644 --- a/net/minecraft/world/entity/animal/horse/Llama.java +++ b/net/minecraft/world/entity/animal/horse/Llama.java @@ -78,12 +78,102 @@ public class Llama extends AbstractChestedHorse implements RangedAttackMob { @@ -7103,7 +7115,7 @@ index 580134c5a075c7efdc7c2f86a179df2fa336eba9..f6ab6ecc10486694d77905239a82bda4 @Override diff --git a/net/minecraft/world/entity/animal/horse/TraderLlama.java b/net/minecraft/world/entity/animal/horse/TraderLlama.java -index 2cd1b988f44caf271a7d2dfccf118be53b77caba..a8540e491161d82a6b72262e4414f8bb16705d47 100644 +index 37cb92e6fe2318495fc69928b01e7d63dfb313a8..61775beaba90ed3b43f5de62c96fe7bf81fc92e4 100644 --- a/net/minecraft/world/entity/animal/horse/TraderLlama.java +++ b/net/minecraft/world/entity/animal/horse/TraderLlama.java @@ -31,6 +31,66 @@ public class TraderLlama extends Llama { @@ -7243,7 +7255,7 @@ index ee327bdec37df5197c35aef60cf456bb81f8d048..e59172ea2fafbab673dc3e9bdc25055f @Override diff --git a/net/minecraft/world/entity/animal/sheep/Sheep.java b/net/minecraft/world/entity/animal/sheep/Sheep.java -index 4e4887cd2c6d6d22966395d68ed59da090f609a3..500c87f5f7b2eda637103125d6e541f7c9fb385f 100644 +index aa97a98cc7e87c5e23684e97bef3fdb2abc6a509..5924a195de35d5fed84ef7175f7c69610eeafd38 100644 --- a/net/minecraft/world/entity/animal/sheep/Sheep.java +++ b/net/minecraft/world/entity/animal/sheep/Sheep.java @@ -62,10 +62,57 @@ public class Sheep extends Animal implements Shearable { @@ -7305,10 +7317,10 @@ index 4e4887cd2c6d6d22966395d68ed59da090f609a3..500c87f5f7b2eda637103125d6e541f7 this.goalSelector.addGoal(2, new BreedGoal(this, 1.0)); this.goalSelector.addGoal(3, new TemptGoal(this, 1.1, stack -> stack.is(ItemTags.SHEEP_FOOD), false)); diff --git a/net/minecraft/world/entity/animal/sniffer/Sniffer.java b/net/minecraft/world/entity/animal/sniffer/Sniffer.java -index 05d269b51715a71fa653900e7187b07d001afdb7..a762fc8a4616c4e48e11accdca2129fd47f300e6 100644 +index 9ad30992fdef7773256046dd5471082ee30fcb44..b77b763a3eb58b3135ad9c9cbb8a39f67393397d 100644 --- a/net/minecraft/world/entity/animal/sniffer/Sniffer.java +++ b/net/minecraft/world/entity/animal/sniffer/Sniffer.java -@@ -87,6 +87,38 @@ public class Sniffer extends Animal { +@@ -86,6 +86,38 @@ public class Sniffer extends Animal { this.setPathfindingMalus(PathType.DAMAGE_CAUTIOUS, -1.0F); } @@ -7347,8 +7359,16 @@ index 05d269b51715a71fa653900e7187b07d001afdb7..a762fc8a4616c4e48e11accdca2129fd @Override protected void defineSynchedData(SynchedEntityData.Builder builder) { super.defineSynchedData(builder); +@@ -462,6 +494,7 @@ public class Sniffer extends Animal { + + @Override + protected void customServerAiStep(ServerLevel level) { ++ if (getRider() == null || !this.isControllable()) // Purpur - only use brain if no rider + this.getBrain().tick(level, this); + SnifferAi.updateActivity(this); + super.customServerAiStep(level); diff --git a/net/minecraft/world/entity/animal/wolf/Wolf.java b/net/minecraft/world/entity/animal/wolf/Wolf.java -index dca01e7e6af74bc6e26d4968ccdf0c34f8707b94..7e7cb9db1c84bdb173b444bec90663a93fb3b549 100644 +index cb92bc6710a451297e95f51a6e56c2ff5102c57f..b3f3959e5da61460a5c29b6a75af32e3459f3528 100644 --- a/net/minecraft/world/entity/animal/wolf/Wolf.java +++ b/net/minecraft/world/entity/animal/wolf/Wolf.java @@ -99,6 +99,37 @@ public class Wolf extends TamableAnimal implements NeutralMob { @@ -7707,7 +7727,7 @@ index a0e0fad40838fa7d835f31e5ce4ae3ab40e0bfa4..220a828717e1933a44c5282b56713ba0 this.remove(Entity.RemovalReason.KILLED, org.bukkit.event.entity.EntityRemoveEvent.Cause.DEATH); // Paper - add Bukkit remove cause // CraftBukkit end diff --git a/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java b/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java -index 84d215a498d9bf6f1232bf4af5a4a98d3ba9b131..de09a91b89661118e460842453e33f383ea08a94 100644 +index 0c900fd908792971180922a386768ec561e10e6e..52a84b1d354201fc6496dd937be091c1750eba33 100644 --- a/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java +++ b/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java @@ -92,6 +92,7 @@ public class EnderDragon extends Mob implements Enemy { @@ -7824,7 +7844,7 @@ index 84d215a498d9bf6f1232bf4af5a4a98d3ba9b131..de09a91b89661118e460842453e33f38 + // Purpur end - Ridables + this.processFlappingMovement(); - if (this.level().isClientSide) { + if (this.level().isClientSide()) { this.setHealth(this.getHealth()); @@ -199,6 +287,8 @@ public class EnderDragon extends Mob implements Enemy { @@ -7913,7 +7933,7 @@ index 84d215a498d9bf6f1232bf4af5a4a98d3ba9b131..de09a91b89661118e460842453e33f38 } diff --git a/net/minecraft/world/entity/boss/wither/WitherBoss.java b/net/minecraft/world/entity/boss/wither/WitherBoss.java -index 030721328b05526c3f56d9875859ee8860a1d36b..e3c34d5f00ce64b3c08b10cfcb3dd14ebe8c1977 100644 +index f72a5373c7dd94541e93043787ce0c7e91bcee12..5b4d8bafaa7c03a40d02d84449a20cd0f7682afd 100644 --- a/net/minecraft/world/entity/boss/wither/WitherBoss.java +++ b/net/minecraft/world/entity/boss/wither/WitherBoss.java @@ -71,6 +71,7 @@ public class WitherBoss extends Monster implements RangedAttackMob { @@ -8195,7 +8215,7 @@ index 030721328b05526c3f56d9875859ee8860a1d36b..e3c34d5f00ce64b3c08b10cfcb3dd14e } diff --git a/net/minecraft/world/entity/decoration/ArmorStand.java b/net/minecraft/world/entity/decoration/ArmorStand.java -index 9952e84dd94b8773c5ba8fcc4526e7714ebc2136..95d835ce4c733cbea457427a0d065c05a59704d9 100644 +index 041126086d1f4be6ed3a54337ed1c909044fba0c..57b5ee16e74bde20d1402bb4191e8534f2d45a93 100644 --- a/net/minecraft/world/entity/decoration/ArmorStand.java +++ b/net/minecraft/world/entity/decoration/ArmorStand.java @@ -91,10 +91,13 @@ public class ArmorStand extends LivingEntity { @@ -8248,10 +8268,10 @@ index 9952e84dd94b8773c5ba8fcc4526e7714ebc2136..95d835ce4c733cbea457427a0d065c05 + // Purpur end - Movement options for armor stands } diff --git a/net/minecraft/world/entity/decoration/ItemFrame.java b/net/minecraft/world/entity/decoration/ItemFrame.java -index 90fd3ca5ecd29befa9237222e9f86a8a79a011e4..7e96617f0d5e8777873b4c2cccd012d656612f96 100644 +index 56582d74b9420f688cc6a1abf31a644cb365b797..7346e1f49cc89fbc96bb5f903c2a043e71d0d1c9 100644 --- a/net/minecraft/world/entity/decoration/ItemFrame.java +++ b/net/minecraft/world/entity/decoration/ItemFrame.java -@@ -237,7 +237,11 @@ public class ItemFrame extends HangingEntity { +@@ -239,7 +239,11 @@ public class ItemFrame extends HangingEntity { this.removeFramedMap(item); } else { if (dropItem) { @@ -8282,7 +8302,7 @@ index cc34cadac8896a5f546d0879e795fea08d0c3f98..26a08b16de2318d5080be59a29c5f11e } } diff --git a/net/minecraft/world/entity/item/ItemEntity.java b/net/minecraft/world/entity/item/ItemEntity.java -index fcb1f6806908eb66592dc52f2b57286498cf7032..7dc97fccfd329253e0f6532d1cc2c06264674e15 100644 +index 8b176f5783d810b41a37db09b328992157986099..e6a77ef040f2b10eb14bc038b34f4c23c0da6fb4 100644 --- a/net/minecraft/world/entity/item/ItemEntity.java +++ b/net/minecraft/world/entity/item/ItemEntity.java @@ -56,6 +56,12 @@ public class ItemEntity extends Entity implements TraceableEntity { @@ -8298,7 +8318,7 @@ index fcb1f6806908eb66592dc52f2b57286498cf7032..7dc97fccfd329253e0f6532d1cc2c062 public ItemEntity(EntityType entityType, Level level) { super(entityType, level); -@@ -370,7 +376,16 @@ public class ItemEntity extends Entity implements TraceableEntity { +@@ -361,7 +367,16 @@ public class ItemEntity extends Entity implements TraceableEntity { @Override public final boolean hurtServer(ServerLevel level, DamageSource damageSource, float amount) { @@ -8316,7 +8336,7 @@ index fcb1f6806908eb66592dc52f2b57286498cf7032..7dc97fccfd329253e0f6532d1cc2c062 return false; } else if (!level.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING) && damageSource.getEntity() instanceof Mob) { return false; -@@ -549,6 +564,12 @@ public class ItemEntity extends Entity implements TraceableEntity { +@@ -540,6 +555,12 @@ public class ItemEntity extends Entity implements TraceableEntity { public void setItem(ItemStack stack) { this.getEntityData().set(DATA_ITEM, stack); this.despawnRate = this.level().paperConfig().entities.spawning.altItemDespawnRate.enabled ? this.level().paperConfig().entities.spawning.altItemDespawnRate.items.getOrDefault(stack.getItem(), this.level().spigotConfig.itemDespawnRate) : this.level().spigotConfig.itemDespawnRate; // Paper - Alternative item-despawn-rate @@ -8330,7 +8350,7 @@ index fcb1f6806908eb66592dc52f2b57286498cf7032..7dc97fccfd329253e0f6532d1cc2c062 @Override diff --git a/net/minecraft/world/entity/item/PrimedTnt.java b/net/minecraft/world/entity/item/PrimedTnt.java -index 17d54d38dcec39eefeb989cd576cc640a36e82f5..ef070f8a9ab3a4676e2141f7c0bc20a000d0cc3a 100644 +index e199ae22af6675fa602cf39d9e6bf1ffd73f64f7..730caed2ea1877d855bb0b8be8f3ca786ea4c3c3 100644 --- a/net/minecraft/world/entity/item/PrimedTnt.java +++ b/net/minecraft/world/entity/item/PrimedTnt.java @@ -238,4 +238,32 @@ public class PrimedTnt extends Entity implements TraceableEntity { @@ -8353,7 +8373,7 @@ index 17d54d38dcec39eefeb989cd576cc640a36e82f5..ef070f8a9ab3a4676e2141f7c0bc20a0 + new net.minecraft.world.item.ItemStack(net.minecraft.world.item.Items.TNT)); + tntItem.setPickUpDelay(10); + -+ inHand.hurtAndBreak(1, player, LivingEntity.getSlotForHand(hand)); ++ inHand.hurtAndBreak(1, player, hand.asEquipmentSlot()); + serverWorld.addFreshEntity(tntItem, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.CUSTOM); + + this.playSound(net.minecraft.sounds.SoundEvents.SHEEP_SHEAR); @@ -8367,7 +8387,7 @@ index 17d54d38dcec39eefeb989cd576cc640a36e82f5..ef070f8a9ab3a4676e2141f7c0bc20a0 + // Purpur end - Shears can defuse TNT } diff --git a/net/minecraft/world/entity/monster/AbstractSkeleton.java b/net/minecraft/world/entity/monster/AbstractSkeleton.java -index 894a3d988d0530d42d3a282b61cdb445a0f820ad..482de769f1b1fc0eac176cbc41a96f639dcc2d2d 100644 +index 92e448e17c767227505ead303a907e6ada645420..b228c29e550d77f62ac53df9f32efe1a31c9f933 100644 --- a/net/minecraft/world/entity/monster/AbstractSkeleton.java +++ b/net/minecraft/world/entity/monster/AbstractSkeleton.java @@ -64,21 +64,24 @@ public abstract class AbstractSkeleton extends Monster implements RangedAttackMo @@ -8442,7 +8462,7 @@ index 894a3d988d0530d42d3a282b61cdb445a0f820ad..482de769f1b1fc0eac176cbc41a96f63 if (this.level() instanceof ServerLevel serverLevel) { Projectile.Delayed delayedEntity = Projectile.spawnProjectileUsingShootDelayed( // Paper - delayed - arrow, serverLevel, projectile, d, d1 + squareRoot * 0.2F, d2, 1.6F, 14 - serverLevel.getDifficulty().getId() * 4 -+ arrow, serverLevel, projectile, d, d1 + squareRoot * 0.2F, d2, 1.6F, serverLevel.purpurConfig.skeletonBowAccuracyMap.getOrDefault(serverLevel.getDifficulty().getId(), (float) (14 - serverLevel.getDifficulty().getId() * 4)) // Purpur - skeleton bow accuracy option ++ arrow, serverLevel, projectile, d, d1 + squareRoot * 0.2F, d2, 1.6F, serverLevel.purpurConfig.skeletonBowAccuracyMap.getOrDefault(serverLevel.getDifficulty().getId(), (float) (14 - serverLevel.getDifficulty().getId() * 4)) // Purpur - skeleton bow accuracy option ); // Paper start - call EntityShootBowEvent @@ -8464,7 +8484,7 @@ index 894a3d988d0530d42d3a282b61cdb445a0f820ad..482de769f1b1fc0eac176cbc41a96f63 // Paper end - shouldBurnInDay API diff --git a/net/minecraft/world/entity/monster/Blaze.java b/net/minecraft/world/entity/monster/Blaze.java -index 4ab7072b4290db7fbe72f81b89d3c428b05f737c..fa21b7dba208d5ba6ecf1d2b68965bb50642b53a 100644 +index 463ec6bec0b4b606cfc5276aa7803176e476d450..26bef7ee1c68c75c77b7c72d8c08ce3b3c2efb98 100644 --- a/net/minecraft/world/entity/monster/Blaze.java +++ b/net/minecraft/world/entity/monster/Blaze.java @@ -33,26 +33,78 @@ public class Blaze extends Monster { @@ -8569,7 +8589,7 @@ index 4ab7072b4290db7fbe72f81b89d3c428b05f737c..fa21b7dba208d5ba6ecf1d2b68965bb5 if (this.nextHeightOffsetChangeTick <= 0) { this.nextHeightOffsetChangeTick = 100; diff --git a/net/minecraft/world/entity/monster/Bogged.java b/net/minecraft/world/entity/monster/Bogged.java -index afb4cee70d0feecab93d943baf7ddfd83ad7f3b5..cace310ad4ad320a8a5745c6af3ec4b57e75b6a5 100644 +index 7b6c9d2e223d501e8a754e935d95e5aa7b530fd2..579a5fd6e4545cc51eafbeac2369e114d404c2f1 100644 --- a/net/minecraft/world/entity/monster/Bogged.java +++ b/net/minecraft/world/entity/monster/Bogged.java @@ -43,6 +43,31 @@ public class Bogged extends AbstractSkeleton implements Shearable { @@ -8655,12 +8675,12 @@ index 2e32567fca7a2a4cd87bc078a6eeb30e3ffabfce..7eca4b751d900c6d6ee34993c3e23681 public boolean doHurtTarget(ServerLevel level, Entity source) { if (super.doHurtTarget(level, source)) { diff --git a/net/minecraft/world/entity/monster/Creeper.java b/net/minecraft/world/entity/monster/Creeper.java -index eabc778ba06c14f3020391b9850ae1a283ecf106..2839c755e5ca58896bc14f95ce4889d48ec415b3 100644 +index fccb328fbad2dafe1655acbcbca3e05d85864f23..b68025d5c5e2727026bb792663d026f1be5a2ea2 100644 --- a/net/minecraft/world/entity/monster/Creeper.java +++ b/net/minecraft/world/entity/monster/Creeper.java -@@ -55,21 +55,107 @@ public class Creeper extends Monster { +@@ -56,21 +56,107 @@ public class Creeper extends Monster { public int explosionRadius = 3; - private int droppedSkulls; + private boolean droppedSkulls; public @Nullable Entity entityIgniter; // CraftBukkit + private boolean exploding = false; // Purpur - Config to make Creepers explode on death + // Purpur start - Ridables @@ -8766,7 +8786,7 @@ index eabc778ba06c14f3020391b9850ae1a283ecf106..2839c755e5ca58896bc14f95ce4889d4 this.targetSelector.addGoal(1, new NearestAttackableTargetGoal<>(this, Player.class, true)); this.targetSelector.addGoal(2, new HurtByTargetGoal(this)); } -@@ -158,6 +244,41 @@ public class Creeper extends Monster { +@@ -159,6 +245,41 @@ public class Creeper extends Monster { return false; // CraftBukkit } @@ -8808,7 +8828,7 @@ index eabc778ba06c14f3020391b9850ae1a283ecf106..2839c755e5ca58896bc14f95ce4889d4 @Override public SoundEvent getHurtSound(DamageSource damageSource) { return SoundEvents.CREEPER_HURT; -@@ -240,14 +361,16 @@ public class Creeper extends Monster { +@@ -243,14 +364,16 @@ public class Creeper extends Monster { } public void explodeCreeper() { @@ -8827,7 +8847,7 @@ index eabc778ba06c14f3020391b9850ae1a283ecf106..2839c755e5ca58896bc14f95ce4889d4 this.spawnLingeringCloud(); this.triggerOnDeathMobEffects(serverLevel, Entity.RemovalReason.KILLED); this.discard(org.bukkit.event.entity.EntityRemoveEvent.Cause.EXPLODE); // CraftBukkit - add Bukkit remove cause -@@ -258,6 +381,7 @@ public class Creeper extends Monster { +@@ -261,6 +384,7 @@ public class Creeper extends Monster { } // CraftBukkit end } @@ -8835,7 +8855,7 @@ index eabc778ba06c14f3020391b9850ae1a283ecf106..2839c755e5ca58896bc14f95ce4889d4 } private void spawnLingeringCloud() { -@@ -286,6 +410,7 @@ public class Creeper extends Monster { +@@ -289,6 +413,7 @@ public class Creeper extends Monster { com.destroystokyo.paper.event.entity.CreeperIgniteEvent event = new com.destroystokyo.paper.event.entity.CreeperIgniteEvent((org.bukkit.entity.Creeper) getBukkitEntity(), ignited); if (event.callEvent()) { this.entityData.set(DATA_IS_IGNITED, event.isIgnited()); @@ -8844,7 +8864,7 @@ index eabc778ba06c14f3020391b9850ae1a283ecf106..2839c755e5ca58896bc14f95ce4889d4 } } diff --git a/net/minecraft/world/entity/monster/Drowned.java b/net/minecraft/world/entity/monster/Drowned.java -index f42f9c232fa588835654de0fdea36b9cdfa34571..2e6d0f035a01277aa28bbe912d5df8dc4cf04547 100644 +index 87ca92b6018fdb1374945fc30e649fae7971dd1a..592b4f139a184f0522e350f5b83777b235eb243c 100644 --- a/net/minecraft/world/entity/monster/Drowned.java +++ b/net/minecraft/world/entity/monster/Drowned.java @@ -71,11 +71,72 @@ public class Drowned extends Zombie implements RangedAttackMob { @@ -8945,7 +8965,7 @@ index f42f9c232fa588835654de0fdea36b9cdfa34571..2e6d0f035a01277aa28bbe912d5df8dc this.targetSelector.addGoal(3, new NearestAttackableTargetGoal<>(this, IronGolem.class, true)); this.targetSelector.addGoal(3, new NearestAttackableTargetGoal<>(this, Axolotl.class, true, false)); this.targetSelector.addGoal(5, new NearestAttackableTargetGoal<>(this, Turtle.class, 10, true, false, Turtle.BABY_ON_LAND_SELECTOR)); -@@ -392,7 +466,7 @@ public class Drowned extends Zombie implements RangedAttackMob { +@@ -387,7 +461,7 @@ public class Drowned extends Zombie implements RangedAttackMob { } } @@ -8954,7 +8974,7 @@ index f42f9c232fa588835654de0fdea36b9cdfa34571..2e6d0f035a01277aa28bbe912d5df8dc private final Drowned drowned; public DrownedMoveControl(Drowned mob) { -@@ -401,7 +475,7 @@ public class Drowned extends Zombie implements RangedAttackMob { +@@ -396,7 +470,7 @@ public class Drowned extends Zombie implements RangedAttackMob { } @Override @@ -8963,7 +8983,7 @@ index f42f9c232fa588835654de0fdea36b9cdfa34571..2e6d0f035a01277aa28bbe912d5df8dc LivingEntity target = this.drowned.getTarget(); if (this.drowned.wantsToSwim() && this.drowned.isInWater()) { if (target != null && target.getY() > this.drowned.getY() || this.drowned.searchingForLand) { -@@ -421,7 +495,7 @@ public class Drowned extends Zombie implements RangedAttackMob { +@@ -416,7 +490,7 @@ public class Drowned extends Zombie implements RangedAttackMob { float f = (float)(Mth.atan2(d2, d) * 180.0F / (float)Math.PI) - 90.0F; this.drowned.setYRot(this.rotlerp(this.drowned.getYRot(), f, 90.0F)); this.drowned.yBodyRot = this.drowned.getYRot(); @@ -8972,7 +8992,7 @@ index f42f9c232fa588835654de0fdea36b9cdfa34571..2e6d0f035a01277aa28bbe912d5df8dc float f2 = Mth.lerp(0.125F, this.drowned.getSpeed(), f1); this.drowned.setSpeed(f2); this.drowned.setDeltaMovement(this.drowned.getDeltaMovement().add(f2 * d * 0.005, f2 * d1 * 0.1, f2 * d2 * 0.005)); -@@ -430,7 +504,7 @@ public class Drowned extends Zombie implements RangedAttackMob { +@@ -425,7 +499,7 @@ public class Drowned extends Zombie implements RangedAttackMob { this.drowned.setDeltaMovement(this.drowned.getDeltaMovement().add(0.0, -0.008, 0.0)); } @@ -9027,10 +9047,10 @@ index 7eef05b988d52391ab061382fd8898705c705e03..ab1c050ff326a072e817a05958b8f4ec return Guardian.createAttributes().add(Attributes.MOVEMENT_SPEED, 0.3F).add(Attributes.ATTACK_DAMAGE, 8.0).add(Attributes.MAX_HEALTH, 80.0); } diff --git a/net/minecraft/world/entity/monster/EnderMan.java b/net/minecraft/world/entity/monster/EnderMan.java -index 9b0235c50426accde002cbb0a09a992f13b05cd7..58887b2cc931892f96793edd7a7d1db22cb8686c 100644 +index 9d23d413cc76f90c856387659169b4e9a44f690f..492f6076adc82cb6e7031b93718cb1dabfcfb794 100644 --- a/net/minecraft/world/entity/monster/EnderMan.java +++ b/net/minecraft/world/entity/monster/EnderMan.java -@@ -86,12 +86,45 @@ public class EnderMan extends Monster implements NeutralMob { +@@ -87,12 +87,45 @@ public class EnderMan extends Monster implements NeutralMob { public EnderMan(EntityType entityType, Level level) { super(entityType, level); @@ -9077,7 +9097,7 @@ index 9b0235c50426accde002cbb0a09a992f13b05cd7..58887b2cc931892f96793edd7a7d1db2 this.goalSelector.addGoal(1, new EnderMan.EndermanFreezeWhenLookedAt(this)); this.goalSelector.addGoal(2, new MeleeAttackGoal(this, 1.0, false)); this.goalSelector.addGoal(7, new WaterAvoidingRandomStrollGoal(this, 1.0, 0.0F)); -@@ -99,9 +132,10 @@ public class EnderMan extends Monster implements NeutralMob { +@@ -100,9 +133,10 @@ public class EnderMan extends Monster implements NeutralMob { this.goalSelector.addGoal(8, new RandomLookAroundGoal(this)); this.goalSelector.addGoal(10, new EnderMan.EndermanLeaveBlockGoal(this)); this.goalSelector.addGoal(11, new EnderMan.EndermanTakeBlockGoal(this)); @@ -9089,7 +9109,7 @@ index 9b0235c50426accde002cbb0a09a992f13b05cd7..58887b2cc931892f96793edd7a7d1db2 this.targetSelector.addGoal(4, new ResetUniversalAngerTargetGoal<>(this, false)); } -@@ -216,7 +250,7 @@ public class EnderMan extends Monster implements NeutralMob { +@@ -222,7 +256,7 @@ public class EnderMan extends Monster implements NeutralMob { boolean isBeingStaredBy(Player player) { // Paper start - EndermanAttackPlayerEvent @@ -9098,7 +9118,7 @@ index 9b0235c50426accde002cbb0a09a992f13b05cd7..58887b2cc931892f96793edd7a7d1db2 final com.destroystokyo.paper.event.entity.EndermanAttackPlayerEvent event = new com.destroystokyo.paper.event.entity.EndermanAttackPlayerEvent((org.bukkit.entity.Enderman) getBukkitEntity(), (org.bukkit.entity.Player) player.getBukkitEntity()); event.setCancelled(!shouldAttack); return event.callEvent(); -@@ -254,12 +288,12 @@ public class EnderMan extends Monster implements NeutralMob { +@@ -260,12 +294,12 @@ public class EnderMan extends Monster implements NeutralMob { @Override public boolean isSensitiveToWater() { @@ -9113,7 +9133,7 @@ index 9b0235c50426accde002cbb0a09a992f13b05cd7..58887b2cc931892f96793edd7a7d1db2 float lightLevelDependentMagicValue = this.getLightLevelDependentMagicValue(); if (lightLevelDependentMagicValue > 0.5F && level.canSeeSky(this.blockPosition()) -@@ -380,6 +414,8 @@ public class EnderMan extends Monster implements NeutralMob { +@@ -386,6 +420,8 @@ public class EnderMan extends Monster implements NeutralMob { public boolean hurtServer(ServerLevel level, DamageSource damageSource, float amount) { if (this.isInvulnerableTo(level, damageSource)) { return false; @@ -9122,7 +9142,7 @@ index 9b0235c50426accde002cbb0a09a992f13b05cd7..58887b2cc931892f96793edd7a7d1db2 } else { AbstractThrownPotion abstractThrownPotion1 = damageSource.getDirectEntity() instanceof AbstractThrownPotion abstractThrownPotion ? abstractThrownPotion -@@ -396,6 +432,7 @@ public class EnderMan extends Monster implements NeutralMob { +@@ -402,6 +438,7 @@ public class EnderMan extends Monster implements NeutralMob { } else { boolean flag = abstractThrownPotion1 != null && this.hurtWithCleanWater(level, damageSource, abstractThrownPotion1, amount); @@ -9130,7 +9150,7 @@ index 9b0235c50426accde002cbb0a09a992f13b05cd7..58887b2cc931892f96793edd7a7d1db2 if (this.tryEscape(com.destroystokyo.paper.event.entity.EndermanEscapeEvent.Reason.INDIRECT)) { // Paper - EndermanEscapeEvent for (int i = 0; i < 64; i++) { if (this.teleport()) { -@@ -439,7 +476,7 @@ public class EnderMan extends Monster implements NeutralMob { +@@ -445,7 +482,7 @@ public class EnderMan extends Monster implements NeutralMob { @Override public boolean requiresCustomPersistence() { @@ -9139,7 +9159,7 @@ index 9b0235c50426accde002cbb0a09a992f13b05cd7..58887b2cc931892f96793edd7a7d1db2 } static class EndermanFreezeWhenLookedAt extends Goal { -@@ -483,8 +520,9 @@ public class EnderMan extends Monster implements NeutralMob { +@@ -489,8 +526,9 @@ public class EnderMan extends Monster implements NeutralMob { @Override public boolean canUse() { @@ -9150,7 +9170,7 @@ index 9b0235c50426accde002cbb0a09a992f13b05cd7..58887b2cc931892f96793edd7a7d1db2 && this.enderman.getRandom().nextInt(reducedTickDelay(2000)) == 0; } -@@ -632,8 +670,9 @@ public class EnderMan extends Monster implements NeutralMob { +@@ -638,8 +676,9 @@ public class EnderMan extends Monster implements NeutralMob { @Override public boolean canUse() { @@ -9162,7 +9182,7 @@ index 9b0235c50426accde002cbb0a09a992f13b05cd7..58887b2cc931892f96793edd7a7d1db2 } diff --git a/net/minecraft/world/entity/monster/Endermite.java b/net/minecraft/world/entity/monster/Endermite.java -index f448aac89c6125246c730a71e7ee21c8168d7003..4ea0e5f24664a1c8f2c8bdae559784434374adf6 100644 +index 18a1e02129c5b7166584f239e660a0930cf1e480..3b3855a74c62c6d513e07221ae45b1cbfb1a3c2f 100644 --- a/net/minecraft/world/entity/monster/Endermite.java +++ b/net/minecraft/world/entity/monster/Endermite.java @@ -30,20 +30,72 @@ public class Endermite extends Monster { @@ -9326,7 +9346,7 @@ index 7efa39ab1fb34da41a04cd6816f2571c6eba98f5..5c1992a7fd5d7c5fe23ebfad35a82826 } else { List nearbyEntities = serverLevel.getNearbyEntities( diff --git a/net/minecraft/world/entity/monster/Ghast.java b/net/minecraft/world/entity/monster/Ghast.java -index bbdff8b4043f27045684a2aa5687e2b7ca7afbb5..6f312f0b8ab60c839129ea671f2d9c128fa58e58 100644 +index 9d5abdd8f25a84f1e5f27ab7a49a34ddce93f764..ce7cd858e724f17d14e31516127a4c88874f3de8 100644 --- a/net/minecraft/world/entity/monster/Ghast.java +++ b/net/minecraft/world/entity/monster/Ghast.java @@ -52,11 +52,57 @@ public class Ghast extends Mob implements Enemy { @@ -9387,7 +9407,7 @@ index bbdff8b4043f27045684a2aa5687e2b7ca7afbb5..6f312f0b8ab60c839129ea671f2d9c12 this.targetSelector .addGoal(1, new NearestAttackableTargetGoal<>(this, Player.class, 10, true, false, (entity, level) -> Math.abs(entity.getY() - this.getY()) <= 4.0)); } -@@ -106,6 +152,15 @@ public class Ghast extends Mob implements Enemy { +@@ -101,6 +147,15 @@ public class Ghast extends Mob implements Enemy { @Override public void travel(Vec3 travelVector) { this.travelFlying(travelVector, 0.02F); @@ -9403,7 +9423,7 @@ index bbdff8b4043f27045684a2aa5687e2b7ca7afbb5..6f312f0b8ab60c839129ea671f2d9c12 } @Override -@@ -236,7 +291,7 @@ public class Ghast extends Mob implements Enemy { +@@ -231,7 +286,7 @@ public class Ghast extends Mob implements Enemy { } } @@ -9412,7 +9432,7 @@ index bbdff8b4043f27045684a2aa5687e2b7ca7afbb5..6f312f0b8ab60c839129ea671f2d9c12 private final Mob ghast; private int floatDuration; private final boolean careful; -@@ -250,7 +305,7 @@ public class Ghast extends Mob implements Enemy { +@@ -245,7 +300,7 @@ public class Ghast extends Mob implements Enemy { } @Override @@ -9535,7 +9555,7 @@ index ab0b44fd3e20fcab4e2fea985e7471575b619069..f4ec41a74b13be98f3ac78521fdd3578 } } diff --git a/net/minecraft/world/entity/monster/Guardian.java b/net/minecraft/world/entity/monster/Guardian.java -index a36f0181e1aa24538d6c868a8675da89427bdeae..3ba8da3bd04774fb3131fdbd2aa0bd6c9f31c817 100644 +index 911b98264f29d08cc57143258ec53e6af8aa271c..fdb866927740f41c411914ab67ce77316937e3e2 100644 --- a/net/minecraft/world/entity/monster/Guardian.java +++ b/net/minecraft/world/entity/monster/Guardian.java @@ -66,14 +66,57 @@ public class Guardian extends Monster { @@ -9651,10 +9671,10 @@ index a36f0181e1aa24538d6c868a8675da89427bdeae..3ba8da3bd04774fb3131fdbd2aa0bd6c this.guardian.setSpeed(f2); double d3 = Math.sin((this.guardian.tickCount + this.guardian.getId()) * 0.5) * 0.05; diff --git a/net/minecraft/world/entity/monster/Husk.java b/net/minecraft/world/entity/monster/Husk.java -index 8d6def85583a111841b28f20f58ddb8b8cbd7bc1..a4ce65911a5d778f60bcedb3acd9fe59a5094c96 100644 +index 4de3e70d78e861f15d2aedb54280158988823caa..f2c55aa23ec647af6907b349b937c98fffd95523 100644 --- a/net/minecraft/world/entity/monster/Husk.java +++ b/net/minecraft/world/entity/monster/Husk.java -@@ -19,8 +19,69 @@ import net.minecraft.world.level.ServerLevelAccessor; +@@ -18,8 +18,69 @@ import net.minecraft.world.level.ServerLevelAccessor; public class Husk extends Zombie { public Husk(EntityType entityType, Level level) { super(entityType, level); @@ -9724,7 +9744,7 @@ index 8d6def85583a111841b28f20f58ddb8b8cbd7bc1..a4ce65911a5d778f60bcedb3acd9fe59 public static boolean checkHuskSpawnRules( EntityType entityType, ServerLevelAccessor level, EntitySpawnReason spawnReason, BlockPos pos, RandomSource random ) { -@@ -29,7 +90,7 @@ public class Husk extends Zombie { +@@ -28,7 +89,7 @@ public class Husk extends Zombie { @Override public boolean isSunSensitive() { @@ -9734,7 +9754,7 @@ index 8d6def85583a111841b28f20f58ddb8b8cbd7bc1..a4ce65911a5d778f60bcedb3acd9fe59 @Override diff --git a/net/minecraft/world/entity/monster/Illusioner.java b/net/minecraft/world/entity/monster/Illusioner.java -index 7441b019f669653e3e738f27c866270c30acffd4..2ea8c8480dcc15eb5b4bc9686554ec912ef1f3f4 100644 +index c56665b7d0173542dcddeb1a3aa9eb8e7847e2a1..2b7ea7db4153c084d5f1edd9e3555c59ea3bed12 100644 --- a/net/minecraft/world/entity/monster/Illusioner.java +++ b/net/minecraft/world/entity/monster/Illusioner.java @@ -57,10 +57,52 @@ public class Illusioner extends SpellcasterIllager implements RangedAttackMob { @@ -9876,10 +9896,10 @@ index 889c31cc9257fbbd5df8325ccee9ce39b026ec4b..7ef0f84d4c449a8991683ca66d7b16ca @Override diff --git a/net/minecraft/world/entity/monster/Monster.java b/net/minecraft/world/entity/monster/Monster.java -index 5ef9566b16a4d0300ee45a993c46e734db156416..04d5910d736dee2a88a2602f4a98495459277157 100644 +index 8cbef9c47f7022e9b90b0bf2718382355d74a686..e1c0a694048e2cb4686b6cfe8ab2fd2fcb06a735 100644 --- a/net/minecraft/world/entity/monster/Monster.java +++ b/net/minecraft/world/entity/monster/Monster.java -@@ -88,6 +88,14 @@ public abstract class Monster extends PathfinderMob implements Enemy { +@@ -84,6 +84,14 @@ public abstract class Monster extends PathfinderMob implements Enemy { } public static boolean isDarkEnoughToSpawn(ServerLevelAccessor level, BlockPos pos, RandomSource random) { @@ -9895,10 +9915,10 @@ index 5ef9566b16a4d0300ee45a993c46e734db156416..04d5910d736dee2a88a2602f4a984954 return false; } else { diff --git a/net/minecraft/world/entity/monster/Phantom.java b/net/minecraft/world/entity/monster/Phantom.java -index 666d50b738622d26cc15ccc3c11414490296abf6..a376615bc30a168c95a9a800b06801f90da75181 100644 +index 16783b21906e0595d46c876f87c29d02920ca784..db1ce88d5289aa8432bafce099e3c73230681f76 100644 --- a/net/minecraft/world/entity/monster/Phantom.java +++ b/net/minecraft/world/entity/monster/Phantom.java -@@ -49,19 +49,110 @@ public class Phantom extends Mob implements Enemy { +@@ -49,19 +49,111 @@ public class Phantom extends Mob implements Enemy { @Nullable public BlockPos anchorPoint; Phantom.AttackPhase attackPhase = Phantom.AttackPhase.CIRCLE; @@ -9991,6 +10011,7 @@ index 666d50b738622d26cc15ccc3c11414490296abf6..a376615bc30a168c95a9a800b06801f9 + } + // Purpur end - Toggle for water sensitive mob damage + ++ //private boolean shouldBurnInDay = true; // Purpur - moved to LivingEntity; keep methods for ABI compatibility - API for any mob to burn daylight + // Purpur start - API for any mob to burn daylight + public boolean shouldBurnInDay() { + boolean burnFromDaylight = this.shouldBurnInDay && this.level().purpurConfig.phantomBurnInDaylight; @@ -10010,7 +10031,7 @@ index 666d50b738622d26cc15ccc3c11414490296abf6..a376615bc30a168c95a9a800b06801f9 @Override public boolean isFlapping() { return (this.getUniqueFlapTickOffset() + this.tickCount) % TICKS_PER_FLAP == 0; -@@ -74,9 +165,17 @@ public class Phantom extends Mob implements Enemy { +@@ -74,9 +166,17 @@ public class Phantom extends Mob implements Enemy { @Override protected void registerGoals() { @@ -10031,7 +10052,7 @@ index 666d50b738622d26cc15ccc3c11414490296abf6..a376615bc30a168c95a9a800b06801f9 this.targetSelector.addGoal(1, new Phantom.PhantomAttackPlayerTargetGoal()); } -@@ -92,7 +191,11 @@ public class Phantom extends Mob implements Enemy { +@@ -92,7 +192,11 @@ public class Phantom extends Mob implements Enemy { private void updatePhantomSizeInfo() { this.refreshDimensions(); @@ -10044,8 +10065,8 @@ index 666d50b738622d26cc15ccc3c11414490296abf6..a376615bc30a168c95a9a800b06801f9 } public int getPhantomSize() { -@@ -117,6 +220,23 @@ public class Phantom extends Mob implements Enemy { - return true; +@@ -112,6 +216,23 @@ public class Phantom extends Mob implements Enemy { + return this.getId() * 3; } + // Purpur start - Configurable entity base attributes @@ -10068,7 +10089,7 @@ index 666d50b738622d26cc15ccc3c11414490296abf6..a376615bc30a168c95a9a800b06801f9 @Override public void tick() { super.tick(); -@@ -148,10 +268,7 @@ public class Phantom extends Mob implements Enemy { +@@ -143,10 +264,7 @@ public class Phantom extends Mob implements Enemy { @Override public void aiStep() { @@ -10080,7 +10101,7 @@ index 666d50b738622d26cc15ccc3c11414490296abf6..a376615bc30a168c95a9a800b06801f9 super.aiStep(); } -@@ -167,6 +284,15 @@ public class Phantom extends Mob implements Enemy { +@@ -162,6 +280,15 @@ public class Phantom extends Mob implements Enemy { @Override public void travel(Vec3 travelVector) { this.travelFlying(travelVector, 0.2F); @@ -10096,7 +10117,7 @@ index 666d50b738622d26cc15ccc3c11414490296abf6..a376615bc30a168c95a9a800b06801f9 } @Override -@@ -174,7 +300,11 @@ public class Phantom extends Mob implements Enemy { +@@ -169,7 +296,11 @@ public class Phantom extends Mob implements Enemy { ServerLevelAccessor level, DifficultyInstance difficulty, EntitySpawnReason spawnReason, @Nullable SpawnGroupData spawnGroupData ) { this.anchorPoint = this.blockPosition().above(5); @@ -10109,7 +10130,7 @@ index 666d50b738622d26cc15ccc3c11414490296abf6..a376615bc30a168c95a9a800b06801f9 return super.finalizeSpawn(level, difficulty, spawnReason, spawnGroupData); } -@@ -185,7 +315,7 @@ public class Phantom extends Mob implements Enemy { +@@ -180,7 +311,7 @@ public class Phantom extends Mob implements Enemy { this.setPhantomSize(input.getIntOr("size", 0)); // Paper start this.spawningEntity = input.read("Paper.SpawningEntity", net.minecraft.core.UUIDUtil.CODEC).orElse(null); @@ -10118,7 +10139,7 @@ index 666d50b738622d26cc15ccc3c11414490296abf6..a376615bc30a168c95a9a800b06801f9 // Paper end } -@@ -196,7 +326,7 @@ public class Phantom extends Mob implements Enemy { +@@ -191,7 +322,7 @@ public class Phantom extends Mob implements Enemy { output.putInt("size", this.getPhantomSize()); // Paper start output.storeNullable("Paper.SpawningEntity", net.minecraft.core.UUIDUtil.CODEC, this.spawningEntity); @@ -10127,7 +10148,7 @@ index 666d50b738622d26cc15ccc3c11414490296abf6..a376615bc30a168c95a9a800b06801f9 // Paper end } -@@ -266,6 +396,7 @@ public class Phantom extends Mob implements Enemy { +@@ -261,6 +392,7 @@ public class Phantom extends Mob implements Enemy { List nearbyPlayers = serverLevel.getNearbyPlayers( this.attackTargeting, Phantom.this, Phantom.this.getBoundingBox().inflate(16.0, 64.0, 16.0) ); @@ -10135,7 +10156,7 @@ index 666d50b738622d26cc15ccc3c11414490296abf6..a376615bc30a168c95a9a800b06801f9 if (!nearbyPlayers.isEmpty()) { nearbyPlayers.sort(Comparator.comparing(Entity::getY).reversed()); -@@ -416,25 +547,160 @@ public class Phantom extends Mob implements Enemy { +@@ -411,25 +543,160 @@ public class Phantom extends Mob implements Enemy { } } @@ -10299,7 +10320,7 @@ index 666d50b738622d26cc15ccc3c11414490296abf6..a376615bc30a168c95a9a800b06801f9 if (Phantom.this.horizontalCollision) { Phantom.this.setYRot(Phantom.this.getYRot() + 180.0F); this.speed = 0.1F; -@@ -501,6 +767,12 @@ public class Phantom extends Mob implements Enemy { +@@ -496,6 +763,12 @@ public class Phantom extends Mob implements Enemy { return false; } else if (!target.isAlive()) { return false; @@ -10469,7 +10490,7 @@ index 9d84bf2cffee25404eebbefdc9cc3f37ebc386b0..2b85cedf235e673d6030c2a649abf60b if (!org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(this, blockPos, blockState.getFluidState().createLegacyBlock())) { // Paper - fix wrong block state continue; diff --git a/net/minecraft/world/entity/monster/Shulker.java b/net/minecraft/world/entity/monster/Shulker.java -index f667fc5ff1ea4149cb25608e0d12f9f73f86095e..a46ca09f661a4f8f3ede6550d613e0c704a9389b 100644 +index 4404be70802b55d0e3aea8d2a44df0048da28f90..ae95ee80a8846c7daefb240f1e22aebd772a6ee9 100644 --- a/net/minecraft/world/entity/monster/Shulker.java +++ b/net/minecraft/world/entity/monster/Shulker.java @@ -94,12 +94,68 @@ public class Shulker extends AbstractGolem implements Enemy { @@ -10541,7 +10562,7 @@ index f667fc5ff1ea4149cb25608e0d12f9f73f86095e..a46ca09f661a4f8f3ede6550d613e0c7 this.targetSelector.addGoal(1, new HurtByTargetGoal(this, this.getClass()).setAlertOthers()); this.targetSelector.addGoal(2, new Shulker.ShulkerNearestAttackGoal(this)); this.targetSelector.addGoal(3, new Shulker.ShulkerDefenseAttackGoal(this)); -@@ -461,11 +517,21 @@ public class Shulker extends AbstractGolem implements Enemy { +@@ -457,11 +513,21 @@ public class Shulker extends AbstractGolem implements Enemy { private void hitByShulkerBullet() { Vec3 vec3 = this.position(); AABB boundingBox = this.getBoundingBox(); @@ -10567,7 +10588,7 @@ index f667fc5ff1ea4149cb25608e0d12f9f73f86095e..a46ca09f661a4f8f3ede6550d613e0c7 if (shulker != null) { shulker.setVariant(this.getVariant()); shulker.snapTo(vec3); -@@ -565,7 +631,7 @@ public class Shulker extends AbstractGolem implements Enemy { +@@ -561,7 +627,7 @@ public class Shulker extends AbstractGolem implements Enemy { @Override protected float sanitizeScale(float scale) { @@ -10576,7 +10597,7 @@ index f667fc5ff1ea4149cb25608e0d12f9f73f86095e..a46ca09f661a4f8f3ede6550d613e0c7 } private void setVariant(Optional variant) { -@@ -573,7 +639,7 @@ public class Shulker extends AbstractGolem implements Enemy { +@@ -569,7 +635,7 @@ public class Shulker extends AbstractGolem implements Enemy { } public Optional getVariant() { @@ -10585,7 +10606,7 @@ index f667fc5ff1ea4149cb25608e0d12f9f73f86095e..a46ca09f661a4f8f3ede6550d613e0c7 } @Nullable -@@ -693,7 +759,7 @@ public class Shulker extends AbstractGolem implements Enemy { +@@ -689,7 +755,7 @@ public class Shulker extends AbstractGolem implements Enemy { } } @@ -10675,10 +10696,10 @@ index 4e34833ea5c71b817c9f42a58320fe100981ec93..bcae390578519fef362a126fbcf2b5cf continue; } diff --git a/net/minecraft/world/entity/monster/Skeleton.java b/net/minecraft/world/entity/monster/Skeleton.java -index 743bc2986b962d4aaef00d2e457117f375ca65c7..c6ab31fa5204220f4c89dd48dd0966036a4975cf 100644 +index 4eb35a7a2dfcb4803c00e1e9179fea8186b15d41..44260780b36e5a20314ba4622c2a877f60df78c5 100644 --- a/net/minecraft/world/entity/monster/Skeleton.java +++ b/net/minecraft/world/entity/monster/Skeleton.java -@@ -27,6 +27,44 @@ public class Skeleton extends AbstractSkeleton { +@@ -25,6 +25,44 @@ public class Skeleton extends AbstractSkeleton { super(entityType, level); } @@ -10723,9 +10744,9 @@ index 743bc2986b962d4aaef00d2e457117f375ca65c7..c6ab31fa5204220f4c89dd48dd096603 @Override protected void defineSynchedData(SynchedEntityData.Builder builder) { super.defineSynchedData(builder); -@@ -140,4 +178,64 @@ public class Skeleton extends AbstractSkeleton { - this.spawnAtLocation(level, Items.SKELETON_SKULL); - } +@@ -129,4 +167,64 @@ public class Skeleton extends AbstractSkeleton { + SoundEvent getStepSound() { + return SoundEvents.SKELETON_STEP; } + + // Purpur start - Skeletons eat wither roses @@ -10779,7 +10800,7 @@ index 743bc2986b962d4aaef00d2e457117f375ca65c7..c6ab31fa5204220f4c89dd48dd096603 + } + + for (int i = 0; i < 15; ++i) { -+ ((ServerLevel) level()).sendParticlesSource(((ServerLevel) level()).players(), null, net.minecraft.core.particles.ParticleTypes.HAPPY_VILLAGER, ++ ((net.minecraft.server.level.ServerLevel) level()).sendParticlesSource(((net.minecraft.server.level.ServerLevel) level()).players(), null, net.minecraft.core.particles.ParticleTypes.HAPPY_VILLAGER, + false, true, + getX() + random.nextFloat(), getY() + (random.nextFloat() * 2), getZ() + random.nextFloat(), 1, + random.nextGaussian() * 0.05D, random.nextGaussian() * 0.05D, random.nextGaussian() * 0.05D, 0); @@ -10789,7 +10810,7 @@ index 743bc2986b962d4aaef00d2e457117f375ca65c7..c6ab31fa5204220f4c89dd48dd096603 + // Purpur end - Skeletons eat wither roses } diff --git a/net/minecraft/world/entity/monster/Slime.java b/net/minecraft/world/entity/monster/Slime.java -index 7b9105cc38380d60892647e52608787dbde28f0d..b299fc08fe900b4d48ce3e6986bcea000253053e 100644 +index 678b065a8119d23c3c6b3b3657ae6e728bd7a046..970105d598964194e167ad243f6e2fc2a19fba08 100644 --- a/net/minecraft/world/entity/monster/Slime.java +++ b/net/minecraft/world/entity/monster/Slime.java @@ -59,6 +59,7 @@ public class Slime extends Mob implements Enemy { @@ -10908,7 +10929,7 @@ index 7b9105cc38380d60892647e52608787dbde28f0d..b299fc08fe900b4d48ce3e6986bcea00 if (resetHealth) { this.setHealth(this.getMaxHealth()); } -@@ -360,6 +444,7 @@ public class Slime extends Mob implements Enemy { +@@ -355,6 +439,7 @@ public class Slime extends Mob implements Enemy { Vec3 deltaMovement = this.getDeltaMovement(); this.setDeltaMovement(deltaMovement.x, this.getJumpPower(), deltaMovement.z); this.hasImpulse = true; @@ -10916,7 +10937,7 @@ index 7b9105cc38380d60892647e52608787dbde28f0d..b299fc08fe900b4d48ce3e6986bcea00 } @Nullable -@@ -524,7 +609,7 @@ public class Slime extends Mob implements Enemy { +@@ -519,7 +604,7 @@ public class Slime extends Mob implements Enemy { } } @@ -10925,7 +10946,7 @@ index 7b9105cc38380d60892647e52608787dbde28f0d..b299fc08fe900b4d48ce3e6986bcea00 private float yRot; private int jumpDelay; private final Slime slime; -@@ -542,21 +627,33 @@ public class Slime extends Mob implements Enemy { +@@ -537,21 +622,33 @@ public class Slime extends Mob implements Enemy { } public void setWantedMovement(double speed) { @@ -10962,7 +10983,7 @@ index 7b9105cc38380d60892647e52608787dbde28f0d..b299fc08fe900b4d48ce3e6986bcea00 if (this.jumpDelay-- <= 0) { this.jumpDelay = this.slime.getJumpDelay(); if (this.isAggressive) { -@@ -573,7 +670,7 @@ public class Slime extends Mob implements Enemy { +@@ -568,7 +665,7 @@ public class Slime extends Mob implements Enemy { this.mob.setSpeed(0.0F); } } else { @@ -10972,7 +10993,7 @@ index 7b9105cc38380d60892647e52608787dbde28f0d..b299fc08fe900b4d48ce3e6986bcea00 } } diff --git a/net/minecraft/world/entity/monster/Spider.java b/net/minecraft/world/entity/monster/Spider.java -index 60c4ac37bb491af13f9f9bf730b85bbe544cf81d..7c50ed0b7bd0d7138b80613ea08519ae457f49a3 100644 +index 13f49a2e43adbbbb4ec9cd5b479814fefcca1cce..9af8dc2e82491ef27f9b99feddb96df2cabbcf07 100644 --- a/net/minecraft/world/entity/monster/Spider.java +++ b/net/minecraft/world/entity/monster/Spider.java @@ -50,15 +50,56 @@ public class Spider extends Monster { @@ -11082,7 +11103,7 @@ index f3de370ee4bafc2cca033293d0d8e5c9c2a6737b..e69a5c552d2f57bc373cb2b89690a7dd EntityType entityType, ServerLevelAccessor level, EntitySpawnReason spawnReason, BlockPos pos, RandomSource random ) { diff --git a/net/minecraft/world/entity/monster/Strider.java b/net/minecraft/world/entity/monster/Strider.java -index afa584e2aba6bebfb2dd343215b043c983281853..fe31c4a45afd61be8b74efe9d0858ccd0aced075 100644 +index 7180e9aaa7975598159b83017f0c0b942c416bb0..592095f4c78866c53745786a615f1681dcaf6bf6 100644 --- a/net/minecraft/world/entity/monster/Strider.java +++ b/net/minecraft/world/entity/monster/Strider.java @@ -86,12 +86,51 @@ public class Strider extends Animal implements ItemSteerable { @@ -11146,7 +11167,7 @@ index afa584e2aba6bebfb2dd343215b043c983281853..fe31c4a45afd61be8b74efe9d0858ccd this.goalSelector.addGoal(2, new BreedGoal(this, 1.0)); this.temptGoal = new TemptGoal(this, 1.4, itemStack -> itemStack.is(ItemTags.STRIDER_TEMPT_ITEMS), false); this.goalSelector.addGoal(3, this.temptGoal); -@@ -356,7 +396,7 @@ public class Strider extends Animal implements ItemSteerable { +@@ -357,7 +397,7 @@ public class Strider extends Animal implements ItemSteerable { @Override public boolean isSensitiveToWater() { @@ -11155,7 +11176,7 @@ index afa584e2aba6bebfb2dd343215b043c983281853..fe31c4a45afd61be8b74efe9d0858ccd } @Override -@@ -392,6 +432,19 @@ public class Strider extends Animal implements ItemSteerable { +@@ -393,6 +433,18 @@ public class Strider extends Animal implements ItemSteerable { @Override public InteractionResult mobInteract(Player player, InteractionHand hand) { boolean isFood = this.isFood(player.getItemInHand(hand)); @@ -11171,11 +11192,10 @@ index afa584e2aba6bebfb2dd343215b043c983281853..fe31c4a45afd61be8b74efe9d0858ccd + return InteractionResult.SUCCESS; + } + // Purpur end -+ if (!isFood && this.isSaddled() && !this.isVehicle() && !player.isSecondaryUseActive()) { - if (!this.level().isClientSide) { + if (!this.level().isClientSide()) { player.startRiding(this); -@@ -404,7 +457,7 @@ public class Strider extends Animal implements ItemSteerable { +@@ -405,7 +457,7 @@ public class Strider extends Animal implements ItemSteerable { ItemStack itemInHand = player.getItemInHand(hand); return (InteractionResult)(this.isEquippableInSlot(itemInHand, EquipmentSlot.SADDLE) ? itemInHand.interactLivingEntity(player, this, hand) @@ -11185,7 +11205,7 @@ index afa584e2aba6bebfb2dd343215b043c983281853..fe31c4a45afd61be8b74efe9d0858ccd if (isFood && !this.isSilent()) { this.level() diff --git a/net/minecraft/world/entity/monster/Vex.java b/net/minecraft/world/entity/monster/Vex.java -index a621e08fe4f88fcfa8da83bc44b23fc2ffaa5918..ab320cf5a8c68fd239e81172a2f3909a67931105 100644 +index 71ccccf12289972cb35686c1bda11510da7663dd..9ecbecb2a5feed3e4cbb09c07e2c5b66f0a1c7c6 100644 --- a/net/minecraft/world/entity/monster/Vex.java +++ b/net/minecraft/world/entity/monster/Vex.java @@ -60,6 +60,72 @@ public class Vex extends Monster implements TraceableEntity { @@ -11390,7 +11410,7 @@ index 835b522a77fc4e1ec84bd5134e12233a02b66a66..7f70b2387842f65da4632f1a27669a02 } diff --git a/net/minecraft/world/entity/monster/Witch.java b/net/minecraft/world/entity/monster/Witch.java -index cc156f6d98f193bc98eae75bd5aaf8abe69ace4c..4b253ae8149f5d9505c5140a00a96d8c8850b1c4 100644 +index 1e573104a1f6d296d15315da3465a046bce157e1..1abfaf4bbb26dafc506ddf2d5449ba009364bd76 100644 --- a/net/minecraft/world/entity/monster/Witch.java +++ b/net/minecraft/world/entity/monster/Witch.java @@ -56,6 +56,45 @@ public class Witch extends Raider implements RangedAttackMob { @@ -11453,7 +11473,7 @@ index cc156f6d98f193bc98eae75bd5aaf8abe69ace4c..4b253ae8149f5d9505c5140a00a96d8c this.targetSelector.addGoal(2, this.healRaidersGoal); this.targetSelector.addGoal(3, this.attackPlayersGoal); diff --git a/net/minecraft/world/entity/monster/WitherSkeleton.java b/net/minecraft/world/entity/monster/WitherSkeleton.java -index 3ff71ba1bd29faa4d8380dad9397ab34ef930234..b3f5b2e3e2cfc378de948c0e186727d5687c0e98 100644 +index 32b730338eb510d374a6ec5e279b0112f7bee286..80705c379e6bc41c6b6e4e75e6168aef17c8acf1 100644 --- a/net/minecraft/world/entity/monster/WitherSkeleton.java +++ b/net/minecraft/world/entity/monster/WitherSkeleton.java @@ -34,6 +34,45 @@ public class WitherSkeleton extends AbstractSkeleton { @@ -11503,10 +11523,10 @@ index 3ff71ba1bd29faa4d8380dad9397ab34ef930234..b3f5b2e3e2cfc378de948c0e186727d5 protected void registerGoals() { this.targetSelector.addGoal(3, new NearestAttackableTargetGoal<>(this, AbstractPiglin.class, true)); diff --git a/net/minecraft/world/entity/monster/Zoglin.java b/net/minecraft/world/entity/monster/Zoglin.java -index 662b95d27f6630ec27fd88ca279e395438faa96b..2a905e8cdf22f9d7f38cc41c1474e80f704d0cb1 100644 +index 2bd41d469394ae7eecf2581dc41cca6fbea11015..2eb7f602f452917b5d88fd8237898dff920cf0a9 100644 --- a/net/minecraft/world/entity/monster/Zoglin.java +++ b/net/minecraft/world/entity/monster/Zoglin.java -@@ -85,6 +85,45 @@ public class Zoglin extends Monster implements HoglinBase { +@@ -84,6 +84,45 @@ public class Zoglin extends Monster implements HoglinBase { this.xpReward = 5; } @@ -11552,7 +11572,7 @@ index 662b95d27f6630ec27fd88ca279e395438faa96b..2a905e8cdf22f9d7f38cc41c1474e80f @Override protected Brain.Provider brainProvider() { return Brain.provider(MEMORY_TYPES, SENSOR_TYPES); -@@ -248,6 +287,7 @@ public class Zoglin extends Monster implements HoglinBase { +@@ -247,6 +286,7 @@ public class Zoglin extends Monster implements HoglinBase { @Override protected void customServerAiStep(ServerLevel level) { @@ -11561,10 +11581,10 @@ index 662b95d27f6630ec27fd88ca279e395438faa96b..2a905e8cdf22f9d7f38cc41c1474e80f this.updateActivity(); } diff --git a/net/minecraft/world/entity/monster/Zombie.java b/net/minecraft/world/entity/monster/Zombie.java -index a23607874a72723914cbfeea0ad1c51236c044d8..ab4dc7b3a7593d255dbd7d1df667fce3504af3ed 100644 +index c0f7b625ca135772f3f979d64b1003699b4109f8..63b29933e262115062a082dcaed0d16146a181bd 100644 --- a/net/minecraft/world/entity/monster/Zombie.java +++ b/net/minecraft/world/entity/monster/Zombie.java -@@ -92,22 +92,78 @@ public class Zombie extends Monster { +@@ -91,22 +91,78 @@ public class Zombie extends Monster { private boolean canBreakDoors = false; private int inWaterTime = 0; public int conversionTime; @@ -11644,7 +11664,7 @@ index a23607874a72723914cbfeea0ad1c51236c044d8..ab4dc7b3a7593d255dbd7d1df667fce3 this.addBehaviourGoals(); } -@@ -117,7 +173,19 @@ public class Zombie extends Monster { +@@ -116,7 +172,19 @@ public class Zombie extends Monster { this.goalSelector.addGoal(7, new WaterAvoidingRandomStrollGoal(this, 1.0)); this.targetSelector.addGoal(1, new HurtByTargetGoal(this).setAlertOthers(ZombifiedPiglin.class)); this.targetSelector.addGoal(2, new NearestAttackableTargetGoal<>(this, Player.class, true)); @@ -11665,7 +11685,7 @@ index a23607874a72723914cbfeea0ad1c51236c044d8..ab4dc7b3a7593d255dbd7d1df667fce3 this.targetSelector.addGoal(3, new NearestAttackableTargetGoal<>(this, IronGolem.class, true)); this.targetSelector.addGoal(5, new NearestAttackableTargetGoal<>(this, Turtle.class, 10, true, false, Turtle.BABY_ON_LAND_SELECTOR)); } -@@ -233,29 +301,7 @@ public class Zombie extends Monster { +@@ -232,29 +300,7 @@ public class Zombie extends Monster { @Override public void aiStep() { @@ -11696,7 +11716,7 @@ index a23607874a72723914cbfeea0ad1c51236c044d8..ab4dc7b3a7593d255dbd7d1df667fce3 super.aiStep(); } -@@ -314,6 +360,7 @@ public class Zombie extends Monster { +@@ -313,6 +359,7 @@ public class Zombie extends Monster { // CraftBukkit end } @@ -11704,7 +11724,7 @@ index a23607874a72723914cbfeea0ad1c51236c044d8..ab4dc7b3a7593d255dbd7d1df667fce3 public boolean isSunSensitive() { return this.shouldBurnInDay; // Paper - Add more Zombie API } -@@ -451,7 +498,7 @@ public class Zombie extends Monster { +@@ -450,7 +497,7 @@ public class Zombie extends Monster { output.putBoolean("CanBreakDoors", this.canBreakDoors()); output.putInt("InWaterTime", this.isInWater() ? this.inWaterTime : -1); output.putInt("DrownedConversionTime", this.isUnderWaterConverting() ? this.conversionTime : -1); @@ -11713,7 +11733,7 @@ index a23607874a72723914cbfeea0ad1c51236c044d8..ab4dc7b3a7593d255dbd7d1df667fce3 } @Override -@@ -466,7 +513,7 @@ public class Zombie extends Monster { +@@ -465,7 +512,7 @@ public class Zombie extends Monster { } else { this.getEntityData().set(DATA_DROWNED_CONVERSION_ID, false); } @@ -11722,7 +11742,7 @@ index a23607874a72723914cbfeea0ad1c51236c044d8..ab4dc7b3a7593d255dbd7d1df667fce3 } @Override -@@ -518,19 +565,18 @@ public class Zombie extends Monster { +@@ -517,19 +564,18 @@ public class Zombie extends Monster { } if (spawnGroupData instanceof Zombie.ZombieGroupData zombieGroupData) { @@ -11741,22 +11761,22 @@ index a23607874a72723914cbfeea0ad1c51236c044d8..ab4dc7b3a7593d255dbd7d1df667fce3 if (!entitiesOfClass.isEmpty()) { Chicken chicken = entitiesOfClass.get(0); chicken.setChickenJockey(true); - this.startRiding(chicken); + this.startRiding(chicken, false, false); - } - } else if (random.nextFloat() < 0.05) { + } else { // Purpur - Configurable jockey options Chicken chicken1 = EntityType.CHICKEN.create(this.level(), EntitySpawnReason.JOCKEY); if (chicken1 != null) { chicken1.snapTo(this.getX(), this.getY(), this.getZ(), this.getYRot(), 0.0F); -@@ -539,6 +585,7 @@ public class Zombie extends Monster { - this.startRiding(chicken1); +@@ -538,6 +584,7 @@ public class Zombie extends Monster { + this.startRiding(chicken1, false, false); level.addFreshEntity(chicken1, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.MOUNT); // CraftBukkit } + } // Purpur - Configurable jockey options } } } -@@ -551,10 +598,7 @@ public class Zombie extends Monster { +@@ -550,10 +597,7 @@ public class Zombie extends Monster { } if (this.getItemBySlot(EquipmentSlot.HEAD).isEmpty()) { @@ -11768,7 +11788,7 @@ index a23607874a72723914cbfeea0ad1c51236c044d8..ab4dc7b3a7593d255dbd7d1df667fce3 this.setItemSlot(EquipmentSlot.HEAD, new ItemStack(random.nextFloat() < 0.1F ? Blocks.JACK_O_LANTERN : Blocks.CARVED_PUMPKIN)); this.setDropChance(EquipmentSlot.HEAD, 0.0F); } -@@ -604,7 +648,7 @@ public class Zombie extends Monster { +@@ -603,7 +647,7 @@ public class Zombie extends Monster { } protected void randomizeReinforcementsChance() { @@ -11776,12 +11796,12 @@ index a23607874a72723914cbfeea0ad1c51236c044d8..ab4dc7b3a7593d255dbd7d1df667fce3 + this.getAttribute(Attributes.SPAWN_REINFORCEMENTS_CHANCE).setBaseValue(this.random.nextDouble() * this.level().purpurConfig.zombieSpawnReinforcements); // Purpur - Configurable entity base attributes } - @Override + class ZombieAttackTurtleEggGoal extends RemoveBlockGoal { diff --git a/net/minecraft/world/entity/monster/ZombieVillager.java b/net/minecraft/world/entity/monster/ZombieVillager.java -index bc80d5b302f24974ce89db502b41d659457dd98c..e218e5d5f146ec996a6f5ce7e76b1d6506ac1cb9 100644 +index b1a017dd4e6bca642f33534d93c681516a1439b8..f21f2c45edb5dc51154649b4406601c3c9840dfd 100644 --- a/net/minecraft/world/entity/monster/ZombieVillager.java +++ b/net/minecraft/world/entity/monster/ZombieVillager.java -@@ -76,6 +76,66 @@ public class ZombieVillager extends Zombie implements VillagerDataHolder { +@@ -73,6 +73,66 @@ public class ZombieVillager extends Zombie implements VillagerDataHolder { super(entityType, level); } @@ -11848,21 +11868,21 @@ index bc80d5b302f24974ce89db502b41d659457dd98c..e218e5d5f146ec996a6f5ce7e76b1d65 @Override protected void defineSynchedData(SynchedEntityData.Builder builder) { super.defineSynchedData(builder); -@@ -129,10 +189,10 @@ public class ZombieVillager extends Zombie implements VillagerDataHolder { +@@ -138,10 +198,10 @@ public class ZombieVillager extends Zombie implements VillagerDataHolder { public InteractionResult mobInteract(Player player, InteractionHand hand) { ItemStack itemInHand = player.getItemInHand(hand); if (itemInHand.is(Items.GOLDEN_APPLE)) { - if (this.hasEffect(MobEffects.WEAKNESS)) { + if (this.hasEffect(MobEffects.WEAKNESS) && level().purpurConfig.zombieVillagerCureEnabled) { // Purpur - Add option to disable zombie villagers cure itemInHand.consume(1, player); - if (!this.level().isClientSide) { + if (!this.level().isClientSide()) { - this.startConverting(player.getUUID(), this.random.nextInt(2401) + 3600); + this.startConverting(player.getUUID(), this.random.nextInt(level().purpurConfig.zombieVillagerCuringTimeMax - level().purpurConfig.zombieVillagerCuringTimeMin + 1) + level().purpurConfig.zombieVillagerCuringTimeMin); // Purpur - Customizable Zombie Villager curing times } return InteractionResult.SUCCESS_SERVER; diff --git a/net/minecraft/world/entity/monster/ZombifiedPiglin.java b/net/minecraft/world/entity/monster/ZombifiedPiglin.java -index 822712eaff2f6c579d982734ab14a00c02182770..f58c48d9de85fda3d13079f3e56b31af75b3c725 100644 +index af8dc4330483efa252ad5db53730f608d2624adf..1955ea6cff628234342989249de6efd1180b0999 100644 --- a/net/minecraft/world/entity/monster/ZombifiedPiglin.java +++ b/net/minecraft/world/entity/monster/ZombifiedPiglin.java @@ -64,6 +64,62 @@ public class ZombifiedPiglin extends Zombie implements NeutralMob { @@ -11954,7 +11974,7 @@ index 822712eaff2f6c579d982734ab14a00c02182770..f58c48d9de85fda3d13079f3e56b31af return super.setTarget(livingEntity, reason); // CraftBukkit } -@@ -237,7 +305,7 @@ public class ZombifiedPiglin extends Zombie implements NeutralMob { +@@ -232,7 +300,7 @@ public class ZombifiedPiglin extends Zombie implements NeutralMob { @Override protected void randomizeReinforcementsChance() { @@ -11963,11 +11983,23 @@ index 822712eaff2f6c579d982734ab14a00c02182770..f58c48d9de85fda3d13079f3e56b31af } @Nullable +diff --git a/net/minecraft/world/entity/monster/breeze/Breeze.java b/net/minecraft/world/entity/monster/breeze/Breeze.java +index cb24eea0d50b4c40216c9f263c7cbcbe466944f7..44d638d5d96a58bcfd35cc8e2e0c08389717e48f 100644 +--- a/net/minecraft/world/entity/monster/breeze/Breeze.java ++++ b/net/minecraft/world/entity/monster/breeze/Breeze.java +@@ -232,6 +232,7 @@ public class Breeze extends Monster { + + @Override + protected void customServerAiStep(ServerLevel level) { ++ if (getRider() == null || !this.isControllable()) // Purpur - only use brain if no rider + this.getBrain().tick(level, this); + BreezeAi.updateActivity(this); + super.customServerAiStep(level); diff --git a/net/minecraft/world/entity/monster/creaking/Creaking.java b/net/minecraft/world/entity/monster/creaking/Creaking.java -index f66bd6cc4aab828e847b990b193be54cd0d0dc01..775c11f658b81379784f7e5bdfdc8105b3410480 100644 +index c5f4572c85a4bcbb484dcee72733dd566998cfd9..ffa881eb837aff53d50d0ffe8af44bbe2d0aeb6a 100644 --- a/net/minecraft/world/entity/monster/creaking/Creaking.java +++ b/net/minecraft/world/entity/monster/creaking/Creaking.java -@@ -101,6 +101,37 @@ public class Creaking extends Monster { +@@ -100,6 +100,37 @@ public class Creaking extends Monster { return this.getHomePos() != null; } @@ -12005,7 +12037,7 @@ index f66bd6cc4aab828e847b990b193be54cd0d0dc01..775c11f658b81379784f7e5bdfdc8105 @Override protected BodyRotationControl createBodyControl() { return new Creaking.CreakingBodyRotationControl(this); -@@ -567,28 +598,28 @@ public class Creaking extends Monster { +@@ -560,28 +591,28 @@ public class Creaking extends Monster { } } @@ -12041,10 +12073,10 @@ index f66bd6cc4aab828e847b990b193be54cd0d0dc01..775c11f658b81379784f7e5bdfdc8105 } } diff --git a/net/minecraft/world/entity/monster/hoglin/Hoglin.java b/net/minecraft/world/entity/monster/hoglin/Hoglin.java -index 084f82a7baaa309aa80cc33b4c01e54cf6da4b42..3c126b1610718a407c16775a935b295ecbaab533 100644 +index 4840ea0b663b246530ec4c1b708c11f9fd26e8e5..a94faf6df1c31773a4a7200d711b619643cdc4bf 100644 --- a/net/minecraft/world/entity/monster/hoglin/Hoglin.java +++ b/net/minecraft/world/entity/monster/hoglin/Hoglin.java -@@ -94,6 +94,52 @@ public class Hoglin extends Animal implements Enemy, HoglinBase { +@@ -93,6 +93,52 @@ public class Hoglin extends Animal implements Enemy, HoglinBase { this.xpReward = 5; } @@ -12097,19 +12129,20 @@ index 084f82a7baaa309aa80cc33b4c01e54cf6da4b42..3c126b1610718a407c16775a935b295e @VisibleForTesting public void setTimeInOverworld(int timeInOverworld) { this.timeInOverworld = timeInOverworld; -@@ -161,6 +207,7 @@ public class Hoglin extends Animal implements Enemy, HoglinBase { +@@ -160,7 +206,7 @@ public class Hoglin extends Animal implements Enemy, HoglinBase { private int behaviorTick; // Pufferfish @Override protected void customServerAiStep(ServerLevel level) { -+ //if ((getRider() == null || !this.isControllable()) && this.behaviorTick++ % this.activatedPriority == 0) // Pufferfish // Purpur - only use brain if no rider - if (this.behaviorTick++ % this.activatedPriority == 0) // Pufferfish +- if (this.behaviorTick++ % this.activatedPriority == 0) // Pufferfish ++ if ((getRider() == null || !this.isControllable()) && this.behaviorTick++ % this.activatedPriority == 0) // Pufferfish // Purpur - only use brain if no rider this.getBrain().tick(level, this); HoglinAi.updateActivity(this); + if (this.isConverting()) { diff --git a/net/minecraft/world/entity/monster/piglin/Piglin.java b/net/minecraft/world/entity/monster/piglin/Piglin.java -index 3e6cbf0166486995f7adcbd7b99a8b8c919956cd..fb58af763cf75c80703360a5c668168775b1458c 100644 +index 2b1a68f96a4a63963f0c366395bc16904ebdedcc..3876ab359b9484b84d99867fc14ea7cf94ff2c43 100644 --- a/net/minecraft/world/entity/monster/piglin/Piglin.java +++ b/net/minecraft/world/entity/monster/piglin/Piglin.java -@@ -135,6 +135,45 @@ public class Piglin extends AbstractPiglin implements CrossbowAttackMob, Invento +@@ -134,6 +134,45 @@ public class Piglin extends AbstractPiglin implements CrossbowAttackMob, Invento this.xpReward = 5; } @@ -12155,15 +12188,16 @@ index 3e6cbf0166486995f7adcbd7b99a8b8c919956cd..fb58af763cf75c80703360a5c6681687 @Override protected void addAdditionalSaveData(ValueOutput output) { super.addAdditionalSaveData(output); -@@ -319,6 +358,7 @@ public class Piglin extends AbstractPiglin implements CrossbowAttackMob, Invento +@@ -307,7 +346,7 @@ public class Piglin extends AbstractPiglin implements CrossbowAttackMob, Invento private int behaviorTick; // Pufferfish @Override protected void customServerAiStep(ServerLevel level) { -+ //if ((getRider() == null || !this.isControllable()) && this.behaviorTick++ % this.activatedPriority == 0) // Pufferfish // Purpur - only use brain if no rider - if (this.behaviorTick++ % this.activatedPriority == 0) // Pufferfish +- if (this.behaviorTick++ % this.activatedPriority == 0) // Pufferfish ++ if ((getRider() == null || !this.isControllable()) && this.behaviorTick++ % this.activatedPriority == 0) // Pufferfish // Purpur - only use brain if no rider this.getBrain().tick(level, this); PiglinAi.updateActivity(this); -@@ -421,7 +461,7 @@ public class Piglin extends AbstractPiglin implements CrossbowAttackMob, Invento + super.customServerAiStep(level); +@@ -409,7 +448,7 @@ public class Piglin extends AbstractPiglin implements CrossbowAttackMob, Invento @Override public boolean wantsToPickUp(ServerLevel level, ItemStack stack) { @@ -12203,7 +12237,7 @@ index 4b1a3772f9e6b9e4efcf11e14b0fb882512ec86d..2841c765b2bd804f08bd0e603b4b29cf piglin.getBrain().eraseMemory(MemoryModuleType.WALK_TARGET); piglin.getNavigation().stop(); diff --git a/net/minecraft/world/entity/monster/piglin/PiglinBrute.java b/net/minecraft/world/entity/monster/piglin/PiglinBrute.java -index 589a130f8855f464c1930a0aa8b54c0326a22e23..c4eb58d0b0c51e930f9cb72e1de0103902badba7 100644 +index 589a130f8855f464c1930a0aa8b54c0326a22e23..54094e695976806fd7025a351fbd4bf4e74aca1b 100644 --- a/net/minecraft/world/entity/monster/piglin/PiglinBrute.java +++ b/net/minecraft/world/entity/monster/piglin/PiglinBrute.java @@ -63,6 +63,45 @@ public class PiglinBrute extends AbstractPiglin { @@ -12256,15 +12290,15 @@ index 589a130f8855f464c1930a0aa8b54c0326a22e23..c4eb58d0b0c51e930f9cb72e1de01039 @Override protected void customServerAiStep(ServerLevel level) { -+ if (getRider() == null || this.isControllable()) // Purpur - only use brain if no rider ++ if (getRider() == null || !this.isControllable()) // Purpur - only use brain if no rider this.getBrain().tick(level, this); PiglinBruteAi.updateActivity(this); PiglinBruteAi.maybePlayActivitySound(this); diff --git a/net/minecraft/world/entity/monster/warden/Warden.java b/net/minecraft/world/entity/monster/warden/Warden.java -index 6a9d3b749e251d3dac6fda13318bf5a0bf21f82b..147fb3eecf651dcee63d63255542ef2680140f66 100644 +index 96dc91a27550057783cc66b6c06f881fc4737898..213813c144945425d7edbe420db4510641b337bf 100644 --- a/net/minecraft/world/entity/monster/warden/Warden.java +++ b/net/minecraft/world/entity/monster/warden/Warden.java -@@ -122,8 +122,32 @@ public class Warden extends Monster implements VibrationSystem { +@@ -121,8 +121,32 @@ public class Warden extends Monster implements VibrationSystem { this.setPathfindingMalus(PathType.LAVA, 8.0F); this.setPathfindingMalus(PathType.DAMAGE_FIRE, 0.0F); this.setPathfindingMalus(PathType.DANGER_FIRE, 0.0F); @@ -12297,7 +12331,16 @@ index 6a9d3b749e251d3dac6fda13318bf5a0bf21f82b..147fb3eecf651dcee63d63255542ef26 @Override public Packet getAddEntityPacket(ServerEntity entity) { return new ClientboundAddEntityPacket(this, entity, this.hasPose(Pose.EMERGING) ? 1 : 0); -@@ -386,6 +410,7 @@ public class Warden extends Monster implements VibrationSystem { +@@ -277,7 +301,7 @@ public class Warden extends Monster implements VibrationSystem { + private int behaviorTick = 0; // Pufferfish + @Override + protected void customServerAiStep(ServerLevel level) { +- if (this.behaviorTick++ % this.activatedPriority == 0) // Pufferfish ++ if ((getRider() == null || !this.isControllable()) && this.behaviorTick++ % this.activatedPriority == 0) // Pufferfish // Purpur - only use brain if no rider + this.getBrain().tick(level, this); + super.customServerAiStep(level); + if ((this.tickCount + this.getId()) % 120 == 0) { +@@ -379,6 +403,7 @@ public class Warden extends Monster implements VibrationSystem { @Contract("null->false") public boolean canTargetEntity(@Nullable Entity entity) { @@ -12306,7 +12349,7 @@ index 6a9d3b749e251d3dac6fda13318bf5a0bf21f82b..147fb3eecf651dcee63d63255542ef26 && this.level() == entity.level() && EntitySelector.NO_CREATIVE_OR_SPECTATOR.test(entity) diff --git a/net/minecraft/world/entity/npc/AbstractVillager.java b/net/minecraft/world/entity/npc/AbstractVillager.java -index f8782cdcf3015cad2693663a3c222bd60822f45b..d1a77544df7bcaa5f1dbca3139324107d687ae0d 100644 +index cf4703cb909aa5906fdd689082208ea4dd77fc0f..8eceba09d1a410aaf359c71a2a0e5d44471e67b6 100644 --- a/net/minecraft/world/entity/npc/AbstractVillager.java +++ b/net/minecraft/world/entity/npc/AbstractVillager.java @@ -35,6 +35,7 @@ import net.minecraft.world.level.storage.ValueOutput; @@ -12318,19 +12361,19 @@ index f8782cdcf3015cad2693663a3c222bd60822f45b..d1a77544df7bcaa5f1dbca3139324107 public static final int VILLAGER_SLOT_OFFSET = 300; private static final int VILLAGER_INVENTORY_SIZE = 8; diff --git a/net/minecraft/world/entity/npc/CatSpawner.java b/net/minecraft/world/entity/npc/CatSpawner.java -index e282b6ab6d0d1c11ee40f5f436bd50fa90ddc88b..d6ae13c19481ce33bfa0b6c9db63283009339d8c 100644 +index 08e91aab23f326213538bd97f28cbc818770eb04..554c4dbc36040bdcfb973d5826da1448fa09725c 100644 --- a/net/minecraft/world/entity/npc/CatSpawner.java +++ b/net/minecraft/world/entity/npc/CatSpawner.java -@@ -25,7 +25,7 @@ public class CatSpawner implements CustomSpawner { - if (spawnFriendlies && level.getGameRules().getBoolean(GameRules.RULE_DOMOBSPAWNING)) { - this.nextTick--; - if (this.nextTick <= 0) { -- this.nextTick = 1200; -+ this.nextTick = level.purpurConfig.catSpawnDelay; // Purpur - Cat spawning options - Player randomPlayer = level.getRandomPlayer(); - if (randomPlayer != null) { - RandomSource randomSource = level.random; -@@ -48,9 +48,12 @@ public class CatSpawner implements CustomSpawner { +@@ -23,7 +23,7 @@ public class CatSpawner implements CustomSpawner { + public void tick(ServerLevel level, boolean spawnEnemies) { + this.nextTick--; + if (this.nextTick <= 0) { +- this.nextTick = 1200; ++ this.nextTick = level.purpurConfig.catSpawnDelay; // Purpur - Cat spawning options + Player randomPlayer = level.getRandomPlayer(); + if (randomPlayer != null) { + RandomSource randomSource = level.random; +@@ -45,9 +45,12 @@ public class CatSpawner implements CustomSpawner { } private void spawnInVillage(ServerLevel level, BlockPos pos) { @@ -12346,7 +12389,7 @@ index e282b6ab6d0d1c11ee40f5f436bd50fa90ddc88b..d6ae13c19481ce33bfa0b6c9db632830 if (entitiesOfClass.size() < 5) { this.spawnCat(pos, level, false); } -@@ -58,8 +61,11 @@ public class CatSpawner implements CustomSpawner { +@@ -55,8 +58,11 @@ public class CatSpawner implements CustomSpawner { } private void spawnInHut(ServerLevel level, BlockPos pos) { @@ -12361,7 +12404,7 @@ index e282b6ab6d0d1c11ee40f5f436bd50fa90ddc88b..d6ae13c19481ce33bfa0b6c9db632830 this.spawnCat(pos, level, true); } diff --git a/net/minecraft/world/entity/npc/Villager.java b/net/minecraft/world/entity/npc/Villager.java -index f37759161b2a682612c6676cdd0d15908259776c..014bb5b6e82bb11b756430999522f4b8f9356d9f 100644 +index 859174abf74a6015491a66775e28dae9590032e7..d29d3951f138d566ac752ec8a18d16665c65c468 100644 --- a/net/minecraft/world/entity/npc/Villager.java +++ b/net/minecraft/world/entity/npc/Villager.java @@ -178,6 +178,8 @@ public class Villager extends AbstractVillager implements ReputationEventHandler @@ -12495,7 +12538,7 @@ index f37759161b2a682612c6676cdd0d15908259776c..014bb5b6e82bb11b756430999522f4b8 } public boolean assignProfessionWhenSpawned() { -@@ -293,12 +392,21 @@ public class Villager extends AbstractVillager implements ReputationEventHandler +@@ -293,13 +392,21 @@ public class Villager extends AbstractVillager implements ReputationEventHandler // Paper start - EAR 2 this.customServerAiStep(level, false); } @@ -12509,26 +12552,27 @@ index f37759161b2a682612c6676cdd0d15908259776c..014bb5b6e82bb11b756430999522f4b8 + } else { + this.isLobotomized = false; + } -+ // Purpur end - Lobotomize stuck villagers // Pufferfish start - if (!inactive && this.behaviorTick++ % this.activatedPriority == 0) { + if (!inactive && (getRider() == null || !this.isControllable()) && this.behaviorTick++ % this.activatedPriority == 0) { // Purpur - Ridables this.getBrain().tick(level, this); // Paper - EAR 2 - } -+ else if (this.isLobotomized && shouldRestock()) restock(); // Purpur - Lobotomize stuck villagers +- } ++ } else if (this.isLobotomized && shouldRestock()) restock(); // Pufferfish end ++ // Purpur end - Lobotomize stuck villagers if (this.assignProfessionWhenSpawned) { this.assignProfessionWhenSpawned = false; -@@ -354,7 +462,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler + } +@@ -354,7 +461,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler return super.mobInteract(player, hand); } else if (this.isBaby()) { this.setUnhappy(); - return InteractionResult.SUCCESS; + return tryRide(player, hand, InteractionResult.SUCCESS); // Purpur - Ridables } else { - if (!this.level().isClientSide) { + if (!this.level().isClientSide()) { boolean isEmpty = this.getOffers().isEmpty(); -@@ -367,9 +475,12 @@ public class Villager extends AbstractVillager implements ReputationEventHandler +@@ -367,9 +474,12 @@ public class Villager extends AbstractVillager implements ReputationEventHandler } if (isEmpty) { @@ -12542,7 +12586,7 @@ index f37759161b2a682612c6676cdd0d15908259776c..014bb5b6e82bb11b756430999522f4b8 this.startTrading(player); } -@@ -506,7 +617,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler +@@ -506,7 +616,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler public void updateDemand() { for (MerchantOffer merchantOffer : this.getOffers()) { @@ -12551,7 +12595,7 @@ index f37759161b2a682612c6676cdd0d15908259776c..014bb5b6e82bb11b756430999522f4b8 } } -@@ -699,7 +810,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler +@@ -699,7 +809,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler @Override public boolean canBreed() { @@ -12560,7 +12604,7 @@ index f37759161b2a682612c6676cdd0d15908259776c..014bb5b6e82bb11b756430999522f4b8 } private boolean hungry() { -@@ -866,7 +977,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler +@@ -866,7 +976,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler } public boolean hasFarmSeeds() { @@ -12569,7 +12613,7 @@ index f37759161b2a682612c6676cdd0d15908259776c..014bb5b6e82bb11b756430999522f4b8 } @Override -@@ -921,6 +1032,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler +@@ -924,6 +1034,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler } public void spawnGolemIfNeeded(ServerLevel serverLevel, long gameTime, int minVillagerAmount) { @@ -12577,7 +12621,7 @@ index f37759161b2a682612c6676cdd0d15908259776c..014bb5b6e82bb11b756430999522f4b8 if (this.wantsToSpawnGolem(gameTime)) { AABB aabb = this.getBoundingBox().inflate(10.0, 10.0, 10.0); List entitiesOfClass = serverLevel.getEntitiesOfClass(Villager.class, aabb); -@@ -994,6 +1106,12 @@ public class Villager extends AbstractVillager implements ReputationEventHandler +@@ -991,6 +1102,12 @@ public class Villager extends AbstractVillager implements ReputationEventHandler @Override public void startSleeping(BlockPos pos) { @@ -12604,7 +12648,7 @@ index 0b7fdbc19f8a977be8168bca198c157fbe90044b..abfc2542a486d5a64bf88eac69f7d958 registry, FARMER, diff --git a/net/minecraft/world/entity/npc/WanderingTrader.java b/net/minecraft/world/entity/npc/WanderingTrader.java -index c2573946dd1244eb5d1ef2be7823211064daa80d..dc6b30518270486cf3b2eaab4db13a507917f37d 100644 +index 2cbd671fc5b5d35ed4bba5f33b540a96f446aaf0..1b86f903a1ef71465635ea04ed34832bf59ff6b5 100644 --- a/net/minecraft/world/entity/npc/WanderingTrader.java +++ b/net/minecraft/world/entity/npc/WanderingTrader.java @@ -60,6 +60,58 @@ public class WanderingTrader extends net.minecraft.world.entity.npc.AbstractVill @@ -12685,7 +12729,7 @@ index c2573946dd1244eb5d1ef2be7823211064daa80d..dc6b30518270486cf3b2eaab4db13a50 this.goalSelector.addGoal(9, new InteractGoal(this, Player.class, 3.0F, 1.0F)); @@ -121,11 +174,14 @@ public class WanderingTrader extends net.minecraft.world.entity.npc.AbstractVill - if (!this.level().isClientSide) { + if (!this.level().isClientSide()) { if (this.getOffers().isEmpty()) { - return InteractionResult.CONSUME; + return tryRide(player, hand, InteractionResult.CONSUME); // Purpur - Ridables @@ -12700,10 +12744,10 @@ index c2573946dd1244eb5d1ef2be7823211064daa80d..dc6b30518270486cf3b2eaab4db13a50 return InteractionResult.SUCCESS; diff --git a/net/minecraft/world/entity/npc/WanderingTraderSpawner.java b/net/minecraft/world/entity/npc/WanderingTraderSpawner.java -index fce3f0f81d3195045cdc9ad7320f1d92f033c36d..352f55882ea77e8d89942e6c58ef3b4b78eec887 100644 +index 95a635b5b6bacada298250f44eaad3ecb1ed1d68..1b057c55297df0f7c51635dd795e0f9536c7f604 100644 --- a/net/minecraft/world/entity/npc/WanderingTraderSpawner.java +++ b/net/minecraft/world/entity/npc/WanderingTraderSpawner.java -@@ -137,7 +137,17 @@ public class WanderingTraderSpawner implements CustomSpawner { +@@ -135,7 +135,17 @@ public class WanderingTraderSpawner implements CustomSpawner { int i1 = pos.getX() + this.random.nextInt(maxDistance * 2) - maxDistance; int i2 = pos.getZ() + this.random.nextInt(maxDistance * 2) - maxDistance; int height = level.getHeight(Heightmap.Types.WORLD_SURFACE, i1, i2); @@ -12723,10 +12767,10 @@ index fce3f0f81d3195045cdc9ad7320f1d92f033c36d..352f55882ea77e8d89942e6c58ef3b4b blockPos = blockPos1; break; diff --git a/net/minecraft/world/entity/player/Player.java b/net/minecraft/world/entity/player/Player.java -index 76b35938176a592beb8d490e11cf9970e5d09405..5841fc8c069286321dcc03e000049d7c88a3d3b6 100644 +index 3a1517771b500995d4082185a877cb6e8be21b98..651401bfe45a4dc6e14c5d46075a56df8f88514a 100644 --- a/net/minecraft/world/entity/player/Player.java +++ b/net/minecraft/world/entity/player/Player.java -@@ -220,17 +220,40 @@ public abstract class Player extends LivingEntity { +@@ -180,17 +180,40 @@ public abstract class Player extends Avatar implements ContainerUser { private int currentImpulseContextResetGraceTime = 0; public boolean affectsSpawning = true; // Paper - Affects Spawning API public net.kyori.adventure.util.TriState flyingFallDamage = net.kyori.adventure.util.TriState.NOT_SET; // Paper - flying fall damage @@ -12767,7 +12811,7 @@ index 76b35938176a592beb8d490e11cf9970e5d09405..5841fc8c069286321dcc03e000049d7c public final int sendAllPlayerInfoBucketIndex; // Gale - Purpur - spread out sending all player info public Player(Level level, GameProfile gameProfile) { -@@ -291,6 +314,12 @@ public abstract class Player extends LivingEntity { +@@ -249,6 +272,12 @@ public abstract class Player extends Avatar implements ContainerUser { @Override public void tick() { @@ -12780,7 +12824,7 @@ index 76b35938176a592beb8d490e11cf9970e5d09405..5841fc8c069286321dcc03e000049d7c this.noPhysics = this.isSpectator(); if (this.isSpectator() || this.isPassenger()) { this.setOnGround(false); -@@ -373,6 +402,17 @@ public abstract class Player extends LivingEntity { +@@ -304,6 +333,17 @@ public abstract class Player extends Avatar implements ContainerUser { this.turtleHelmetTick(); } @@ -12798,7 +12842,7 @@ index 76b35938176a592beb8d490e11cf9970e5d09405..5841fc8c069286321dcc03e000049d7c this.cooldowns.tick(); this.updatePlayerPose(); if (this.currentImpulseContextResetGraceTime > 0) { -@@ -638,7 +678,7 @@ public abstract class Player extends LivingEntity { +@@ -515,7 +555,7 @@ public abstract class Player extends Avatar implements ContainerUser { List list = Lists.newArrayList(); for (Entity entity : entities) { @@ -12807,7 +12851,7 @@ index 76b35938176a592beb8d490e11cf9970e5d09405..5841fc8c069286321dcc03e000049d7c list.add(entity); } else if (!entity.isRemoved()) { this.touch(entity); -@@ -1234,7 +1274,7 @@ public abstract class Player extends LivingEntity { +@@ -1077,7 +1117,7 @@ public abstract class Player extends Avatar implements ContainerUser { flag2 = flag2 && !this.level().paperConfig().entities.behavior.disablePlayerCrits; // Paper - Toggleable player crits if (flag2) { damageSource = damageSource.critical(); // Paper - critical damage API @@ -12816,7 +12860,7 @@ index 76b35938176a592beb8d490e11cf9970e5d09405..5841fc8c069286321dcc03e000049d7c } float f2 = f + f1; -@@ -1830,7 +1870,23 @@ public abstract class Player extends LivingEntity { +@@ -1677,7 +1717,23 @@ public abstract class Player extends Avatar implements ContainerUser { @Override protected int getBaseExperienceReward(ServerLevel level) { @@ -12841,7 +12885,7 @@ index 76b35938176a592beb8d490e11cf9970e5d09405..5841fc8c069286321dcc03e000049d7c } @Override -@@ -1869,6 +1925,13 @@ public abstract class Player extends LivingEntity { +@@ -1721,6 +1777,13 @@ public abstract class Player extends Avatar implements ContainerUser { return this.inventory.add(stack); } @@ -12852,11 +12896,11 @@ index 76b35938176a592beb8d490e11cf9970e5d09405..5841fc8c069286321dcc03e000049d7c + } + // Purpur end - Player ridable in water option + - public boolean setEntityOnShoulder(CompoundTag entityCompound) { - if (this.isPassenger() || !this.onGround() || this.isInWater() || this.isInPowderSnow) { - return false; + @Nullable + public abstract GameType gameMode(); + diff --git a/net/minecraft/world/entity/projectile/AbstractArrow.java b/net/minecraft/world/entity/projectile/AbstractArrow.java -index fe738894f82480c6a7c2ff8fde895daaa0ba8bc6..9874c20c2c1b0ebdbaa58f719ddefdac463accbe 100644 +index e21f08b8e073794cb4c7e3378894cc4a23dd53bf..468ed2a633d489e620faf8ac0dd5ce36b3970b72 100644 --- a/net/minecraft/world/entity/projectile/AbstractArrow.java +++ b/net/minecraft/world/entity/projectile/AbstractArrow.java @@ -76,6 +76,7 @@ public abstract class AbstractArrow extends Projectile { @@ -12867,7 +12911,7 @@ index fe738894f82480c6a7c2ff8fde895daaa0ba8bc6..9874c20c2c1b0ebdbaa58f719ddefdac protected AbstractArrow(EntityType entityType, Level level) { super(entityType, level); -@@ -573,6 +574,12 @@ public abstract class AbstractArrow extends Projectile { +@@ -575,6 +576,12 @@ public abstract class AbstractArrow extends Projectile { return this.firedFromWeapon; } @@ -12909,7 +12953,7 @@ index dd0ec97ea4561d2dccf735580faf0d65d6ac4b0d..779879f8d678a5e45e2752e6e033cc35 org.bukkit.event.entity.ExplosionPrimeEvent event = new org.bukkit.event.entity.ExplosionPrimeEvent((org.bukkit.entity.Explosive) this.getBukkitEntity()); if (event.callEvent()) { diff --git a/net/minecraft/world/entity/projectile/LlamaSpit.java b/net/minecraft/world/entity/projectile/LlamaSpit.java -index f736f72b8e76dd82236badcdd2756f0d4da89aa4..0dbfbadcabcf1b719addb034e676cb51b74199d7 100644 +index 51366d17e521b1f01ddb2e425328938cd069bc93..3e2cf2f74b0c788ec3ec6fd83ff51a1f52f197e0 100644 --- a/net/minecraft/world/entity/projectile/LlamaSpit.java +++ b/net/minecraft/world/entity/projectile/LlamaSpit.java @@ -33,6 +33,12 @@ public class LlamaSpit extends Projectile { @@ -12926,7 +12970,7 @@ index f736f72b8e76dd82236badcdd2756f0d4da89aa4..0dbfbadcabcf1b719addb034e676cb51 protected double getDefaultGravity() { return 0.06; diff --git a/net/minecraft/world/entity/projectile/Projectile.java b/net/minecraft/world/entity/projectile/Projectile.java -index e705dca7c5e2b9604cce7bce1ae80ebbbdecc20e..5daa37fc0e44d3c4f3755ec3d3d89213f6670de1 100644 +index d4a8ec0effa773b85519f0d428e4f23181f36335..3f18643af705864d3e7b18dc44d2c6dfa81a29fd 100644 --- a/net/minecraft/world/entity/projectile/Projectile.java +++ b/net/minecraft/world/entity/projectile/Projectile.java @@ -485,7 +485,7 @@ public abstract class Projectile extends Entity implements TraceableEntity { @@ -12939,7 +12983,7 @@ index e705dca7c5e2b9604cce7bce1ae80ebbbdecc20e..5daa37fc0e44d3c4f3755ec3d3d89213 public boolean mayBreak(ServerLevel level) { diff --git a/net/minecraft/world/entity/projectile/SmallFireball.java b/net/minecraft/world/entity/projectile/SmallFireball.java -index 8c84cea43fc0e42a576004663670977eac99f1a6..6a0ec832226894687b28f35e1a8a190ba1542201 100644 +index d0d54c67542544fd412d191bd4d4a83a1a629078..5f3b0435e4d1fbf27937887d0ef80c93fff87016 100644 --- a/net/minecraft/world/entity/projectile/SmallFireball.java +++ b/net/minecraft/world/entity/projectile/SmallFireball.java @@ -25,7 +25,7 @@ public class SmallFireball extends Fireball { @@ -12952,7 +12996,7 @@ index 8c84cea43fc0e42a576004663670977eac99f1a6..6a0ec832226894687b28f35e1a8a190b // CraftBukkit end } diff --git a/net/minecraft/world/entity/projectile/Snowball.java b/net/minecraft/world/entity/projectile/Snowball.java -index 677b4b681f9c2c09a8ae3cfdec72102265547a7b..d8f9fb603fd2e3e5c1dfc05face7f42b4844daf4 100644 +index 52537b157604d305e2a3db958dc5ada852a148b5..49694d7fe529fb8197ab4a3a7412d6923ee1bda7 100644 --- a/net/minecraft/world/entity/projectile/Snowball.java +++ b/net/minecraft/world/entity/projectile/Snowball.java @@ -52,10 +52,40 @@ public class Snowball extends ThrowableItemProjectile { @@ -12969,7 +13013,7 @@ index 677b4b681f9c2c09a8ae3cfdec72102265547a7b..d8f9fb603fd2e3e5c1dfc05face7f42b + protected void onHitBlock(net.minecraft.world.phys.BlockHitResult blockHitResult) { + super.onHitBlock(blockHitResult); + -+ if (!this.level().isClientSide) { ++ if (!this.level().isClientSide()) { + net.minecraft.core.BlockPos pos = blockHitResult.getBlockPos(); + net.minecraft.core.BlockPos relativePos = pos.relative(blockHitResult.getDirection()); + @@ -12998,22 +13042,22 @@ index 677b4b681f9c2c09a8ae3cfdec72102265547a7b..d8f9fb603fd2e3e5c1dfc05face7f42b protected void onHit(HitResult result) { super.onHit(result); diff --git a/net/minecraft/world/entity/projectile/ThrownEnderpearl.java b/net/minecraft/world/entity/projectile/ThrownEnderpearl.java -index 5aa63c90e1c0605faef76588efdc7c3903be4605..ebc7db0fc6e8fb8f4bd19945e61287b2ff61cdbc 100644 +index 283b1c92a2aa87db77aea0fe5bf38eb5ba0f5cee..382c8b51fbf908068f4e5bef01d71441f8c85d1a 100644 --- a/net/minecraft/world/entity/projectile/ThrownEnderpearl.java +++ b/net/minecraft/world/entity/projectile/ThrownEnderpearl.java -@@ -129,9 +129,10 @@ public class ThrownEnderpearl extends ThrowableItemProjectile { +@@ -114,9 +114,10 @@ public class ThrownEnderpearl extends ThrowableItemProjectile { return; } // CraftBukkit end -- if (this.random.nextFloat() < 0.05F && serverLevel.getGameRules().getBoolean(GameRules.RULE_DOMOBSPAWNING)) { -+ if (this.random.nextFloat() < serverLevel.purpurConfig.enderPearlEndermiteChance && serverLevel.getGameRules().getBoolean(GameRules.RULE_DOMOBSPAWNING)) { // Purpur - Configurable Ender Pearl RNG +- if (this.random.nextFloat() < 0.05F && serverLevel.isSpawningMonsters()) { ++ if (this.random.nextFloat() < serverLevel.purpurConfig.enderPearlEndermiteChance && serverLevel.isSpawningMonsters()) { // Purpur - Configurable Ender Pearl RNG Endermite endermite = EntityType.ENDERMITE.create(serverLevel, EntitySpawnReason.TRIGGERED); if (endermite != null) { + endermite.setPlayerSpawned(true); // Purpur - Add back player spawned endermite API endermite.snapTo(preTeleportX, preTeleportY, preTeleportZ, preTeleportYRot, preTeleportXRot); // Paper - spawn endermite at pre teleport position as teleport has been moved up - serverLevel.addFreshEntity(endermite, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.ENDER_PEARL); + serverLevel.addFreshEntity(endermite, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.ENDER_PEARL); // Paper - add reason } -@@ -151,7 +152,7 @@ public class ThrownEnderpearl extends ThrowableItemProjectile { +@@ -136,7 +137,7 @@ public class ThrownEnderpearl extends ThrowableItemProjectile { if (serverPlayer1 != null) { serverPlayer1.resetFallDistance(); serverPlayer1.resetCurrentImpulseContext(); @@ -13023,7 +13067,7 @@ index 5aa63c90e1c0605faef76588efdc7c3903be4605..ebc7db0fc6e8fb8f4bd19945e61287b2 this.playSound(serverLevel, vec3); diff --git a/net/minecraft/world/entity/projectile/ThrownTrident.java b/net/minecraft/world/entity/projectile/ThrownTrident.java -index bc04812ec840e255c0ae8651bf7a43e0f562aa9c..b6826fc742640e7f8311bd0269aa0d8a6a9b2db4 100644 +index f9697bf54843973ea53081d49eaab3f44f4b20c0..22611c2cd42d36fd8fa242828ba7575d7815df4f 100644 --- a/net/minecraft/world/entity/projectile/ThrownTrident.java +++ b/net/minecraft/world/entity/projectile/ThrownTrident.java @@ -66,7 +66,7 @@ public class ThrownTrident extends AbstractArrow { @@ -13036,12 +13080,12 @@ index bc04812ec840e255c0ae8651bf7a43e0f562aa9c..b6826fc742640e7f8311bd0269aa0d8a if (this.level() instanceof ServerLevel serverLevel && this.pickup == AbstractArrow.Pickup.ALLOWED) { this.spawnAtLocation(serverLevel, this.getPickupItem(), 0.1F); diff --git a/net/minecraft/world/entity/projectile/WitherSkull.java b/net/minecraft/world/entity/projectile/WitherSkull.java -index 2419c1db39c9ffbc54352c7fa5e0ac1ef813c13a..3b68e1a73da3e70f459cdc31e8447bcee37a914d 100644 +index 9a1ae7cd0937376b5d563dc190ead7319ab3ea83..1c9fae3eddd7372a60192a9361e67c2829078ab9 100644 --- a/net/minecraft/world/entity/projectile/WitherSkull.java +++ b/net/minecraft/world/entity/projectile/WitherSkull.java @@ -94,7 +94,7 @@ public class WitherSkull extends AbstractHurtingProjectile { super.onHit(result); - if (!this.level().isClientSide) { + if (!this.level().isClientSide()) { // CraftBukkit start - org.bukkit.event.entity.ExplosionPrimeEvent event = new org.bukkit.event.entity.ExplosionPrimeEvent(this.getBukkitEntity(), 1.0F, false); + org.bukkit.event.entity.ExplosionPrimeEvent event = new org.bukkit.event.entity.ExplosionPrimeEvent(this.getBukkitEntity(), this.level().purpurConfig.witherExplosionRadius, false); // Purpur - Config for wither explosion radius @@ -13084,10 +13128,10 @@ index a495789b2d21fa9a24d5dca4ecfa196ddce49466..2254493c889b8967011c09dc448ba375 return true; } else if (this.mob.getCurrentRaid().isOver()) { diff --git a/net/minecraft/world/entity/raid/Raids.java b/net/minecraft/world/entity/raid/Raids.java -index b8de00c5f13257d0b79b44b19fbfb88a3ca20353..fc5c1acec3cc2afed40589be6f8e159c3426c08e 100644 +index bd34a3e4920831e6ceceea834dcd767144949f64..9d6e5198c8f8d5fcc67b7b75f2150cc1864904f6 100644 --- a/net/minecraft/world/entity/raid/Raids.java +++ b/net/minecraft/world/entity/raid/Raids.java -@@ -29,6 +29,7 @@ import net.minecraft.world.phys.Vec3; +@@ -30,6 +30,7 @@ import net.minecraft.world.phys.Vec3; public class Raids extends SavedData { private static final String RAID_FILE_ID = "raids"; @@ -13095,7 +13139,7 @@ index b8de00c5f13257d0b79b44b19fbfb88a3ca20353..fc5c1acec3cc2afed40589be6f8e159c public static final Codec CODEC = RecordCodecBuilder.create( instance -> instance.group( Raids.RaidWithId.CODEC -@@ -81,6 +82,17 @@ public class Raids extends SavedData { +@@ -82,6 +83,17 @@ public class Raids extends SavedData { public void tick(ServerLevel level) { this.tick++; @@ -13113,7 +13157,7 @@ index b8de00c5f13257d0b79b44b19fbfb88a3ca20353..fc5c1acec3cc2afed40589be6f8e159c Iterator iterator = this.raidMap.values().iterator(); while (iterator.hasNext()) { -@@ -148,11 +160,13 @@ public class Raids extends SavedData { +@@ -147,11 +159,13 @@ public class Raids extends SavedData { // } if (!raid.isStarted() || (raid.isInProgress() && raid.getRaidOmenLevel() < raid.getMaxRaidOmenLevel())) { // CraftBukkit - fixed a bug with raid: players could add up Bad Omen level even when the raid had finished @@ -13128,10 +13172,10 @@ index b8de00c5f13257d0b79b44b19fbfb88a3ca20353..fc5c1acec3cc2afed40589be6f8e159c if (!raid.isStarted() && !this.raidMap.containsValue(raid)) { this.raidMap.put(this.getUniqueId(), raid); diff --git a/net/minecraft/world/entity/vehicle/AbstractBoat.java b/net/minecraft/world/entity/vehicle/AbstractBoat.java -index df360ff06d10fc7f996055dce5148825539e9261..d947801b616af5b5dcdcc8bb70b36f97d6a69fdd 100644 +index 4e3cd5974a872212eab8df8671da12df749a40a6..e6abec1b9245e07c8f0636272bece71865f59d9b 100644 --- a/net/minecraft/world/entity/vehicle/AbstractBoat.java +++ b/net/minecraft/world/entity/vehicle/AbstractBoat.java -@@ -436,6 +436,7 @@ public abstract class AbstractBoat extends VehicleEntity implements Leashable { +@@ -432,6 +432,7 @@ public abstract class AbstractBoat extends VehicleEntity implements Leashable { float groundFriction = this.getGroundFriction(); if (groundFriction > 0.0F) { this.landFriction = groundFriction; @@ -13139,7 +13183,7 @@ index df360ff06d10fc7f996055dce5148825539e9261..d947801b616af5b5dcdcc8bb70b36f97 return AbstractBoat.Status.ON_LAND; } else { return AbstractBoat.Status.IN_AIR; -@@ -824,7 +825,13 @@ public abstract class AbstractBoat extends VehicleEntity implements Leashable { +@@ -820,7 +821,13 @@ public abstract class AbstractBoat extends VehicleEntity implements Leashable { @Override public final ItemStack getPickResult() { @@ -13155,7 +13199,7 @@ index df360ff06d10fc7f996055dce5148825539e9261..d947801b616af5b5dcdcc8bb70b36f97 public static enum Status { diff --git a/net/minecraft/world/entity/vehicle/AbstractMinecart.java b/net/minecraft/world/entity/vehicle/AbstractMinecart.java -index 7e61d68b36ca2768f70dc1fc130a8d7b95347b6b..00eb9aef52ee54f9750c44832f2b3a9321a9f81a 100644 +index 2ae92078d69e5ab3cc27085a9c5e5ccf9f2c175d..d3099eed865e1c0eb7eb1eab440100c1815f0386 100644 --- a/net/minecraft/world/entity/vehicle/AbstractMinecart.java +++ b/net/minecraft/world/entity/vehicle/AbstractMinecart.java @@ -102,6 +102,10 @@ public abstract class AbstractMinecart extends VehicleEntity { @@ -13198,7 +13242,7 @@ index 7e61d68b36ca2768f70dc1fc130a8d7b95347b6b..00eb9aef52ee54f9750c44832f2b3a93 // CraftBukkit start double prevX = this.getX(); double prevY = this.getY(); -@@ -390,15 +407,61 @@ public abstract class AbstractMinecart extends VehicleEntity { +@@ -389,15 +406,61 @@ public abstract class AbstractMinecart extends VehicleEntity { this.behavior.moveAlongTrack(level); } @@ -13274,7 +13318,7 @@ index 090b19752fbfc856d9fbf118510afc6cda2b9989..325ec57df2885f5e81b8a6b61e3a9fed Vec3 redstoneDirection = this.minecart.getRedstoneDirection(pos); return redstoneDirection.lengthSqr() <= 0.0 ? speed : redstoneDirection.scale(speed.length() + 0.2); diff --git a/net/minecraft/world/entity/vehicle/OldMinecartBehavior.java b/net/minecraft/world/entity/vehicle/OldMinecartBehavior.java -index 0d09b0809e7b224538cf5cfac9e36ec5ba10b709..4d224dc127d245556892e761fa4927a76e4b8e9a 100644 +index bf91da8b6a5ff33af1e9a8d2271466df1a129f20..28a53ff65cee7dfab9d381f0cc174301237a7ef6 100644 --- a/net/minecraft/world/entity/vehicle/OldMinecartBehavior.java +++ b/net/minecraft/world/entity/vehicle/OldMinecartBehavior.java @@ -243,8 +243,8 @@ public class OldMinecartBehavior extends MinecartBehavior { @@ -13606,7 +13650,7 @@ index 0fffa384f928ab84451331380968fb4650eafe26..0399092c9f7a43ac100c11505176ade6 return new ChestMenu(MenuType.GENERIC_9x6, containerId, playerInventory, container, 6); } diff --git a/net/minecraft/world/inventory/EnchantmentMenu.java b/net/minecraft/world/inventory/EnchantmentMenu.java -index cf9ab4c9fba11f5a0b293978853e205de81d6fc7..d0d6ae9c9c432f8bd5d9c91113fc5491e321afad 100644 +index 0b404f28a7c82caa90bc46d8abef728b82762709..7369c90b3d84e272b572f20690a20798f409a269 100644 --- a/net/minecraft/world/inventory/EnchantmentMenu.java +++ b/net/minecraft/world/inventory/EnchantmentMenu.java @@ -63,6 +63,22 @@ public class EnchantmentMenu extends AbstractContainerMenu { @@ -13813,10 +13857,10 @@ index 34d52c941395645e77de810855b14012c259cf02..c605bd700fd9f5a6596a2bf964849278 return itemStack; diff --git a/net/minecraft/world/inventory/PlayerEnderChestContainer.java b/net/minecraft/world/inventory/PlayerEnderChestContainer.java -index 51148b7b95c93a9e25da70ac9275c63f1458d84c..96359fef8c83b54ea65d4358aa5d594723b38ead 100644 +index 8cf089874a75735be690ab72a01264bac5ff793d..611f78f93b70674b53c025d9151dacb54af3e803 100644 --- a/net/minecraft/world/inventory/PlayerEnderChestContainer.java +++ b/net/minecraft/world/inventory/PlayerEnderChestContainer.java -@@ -26,11 +26,18 @@ public class PlayerEnderChestContainer extends SimpleContainer { +@@ -27,11 +27,18 @@ public class PlayerEnderChestContainer extends SimpleContainer { } public PlayerEnderChestContainer(Player owner) { @@ -13852,10 +13896,10 @@ index 962483d6f7225f13f121141882262d36dacad8cb..89d4bc00898fd8f6d40cda87c04c5983 level.playSound( null, armorStand.getX(), armorStand.getY(), armorStand.getZ(), SoundEvents.ARMOR_STAND_PLACE, SoundSource.BLOCKS, 0.75F, 0.8F diff --git a/net/minecraft/world/item/AxeItem.java b/net/minecraft/world/item/AxeItem.java -index bd919b9a83f9736f02783b1ba3863fd1b77c7e89..eb8d2d6f9c65185f5fe16a13ab0cdbba78a25a40 100644 +index 3365b953ce08f599a3f7bd9769acd1b6c479ddb4..20c4cc7bbe33ecc53ddf484e7f10e2ce16c35381 100644 --- a/net/minecraft/world/item/AxeItem.java +++ b/net/minecraft/world/item/AxeItem.java -@@ -62,13 +62,15 @@ public class AxeItem extends Item { +@@ -64,13 +64,15 @@ public class AxeItem extends Item { if (playerHasBlockingItemUseIntent(context)) { return InteractionResult.PASS; } else { @@ -13873,7 +13917,7 @@ index bd919b9a83f9736f02783b1ba3863fd1b77c7e89..eb8d2d6f9c65185f5fe16a13ab0cdbba return InteractionResult.PASS; } // Paper end -@@ -76,8 +78,15 @@ public class AxeItem extends Item { +@@ -78,8 +80,15 @@ public class AxeItem extends Item { CriteriaTriggers.ITEM_USED_ON_BLOCK.trigger((ServerPlayer)player, clickedPos, itemInHand); } @@ -13889,9 +13933,9 @@ index bd919b9a83f9736f02783b1ba3863fd1b77c7e89..eb8d2d6f9c65185f5fe16a13ab0cdbba + level.gameEvent(GameEvent.BLOCK_CHANGE, clickedPos, GameEvent.Context.of(player, state)); + // Purpur end - Tool actionable options if (player != null) { - itemInHand.hurtAndBreak(1, player, LivingEntity.getSlotForHand(context.getHand())); + itemInHand.hurtAndBreak(1, player, context.getHand().asEquipmentSlot()); } -@@ -94,22 +103,24 @@ public class AxeItem extends Item { +@@ -96,21 +105,23 @@ public class AxeItem extends Item { && !player.isSecondaryUseActive(); } @@ -13907,9 +13951,8 @@ index bd919b9a83f9736f02783b1ba3863fd1b77c7e89..eb8d2d6f9c65185f5fe16a13ab0cdbba - Optional previous = WeatheringCopper.getPrevious(state); + Optional previous = Optional.ofNullable(level.purpurConfig.axeWeatherables.get(state.getBlock())); // Purpur - Tool actionable options if (previous.isPresent()) { -- level.playSound(player, pos, SoundEvents.AXE_SCRAPE, SoundSource.BLOCKS, 1.0F, 1.0F); -+ level.playSound(WeatheringCopper.getPrevious(state).isPresent() ? player : null, pos, SoundEvents.AXE_SCRAPE, SoundSource.BLOCKS, 1.0F, 1.0F); // Purpur - Tool actionable options - force sound - level.levelEvent(player, 3005, pos, 0); +- spawnSoundAndParticle(level, pos, player, state, SoundEvents.AXE_SCRAPE, 3005); ++ spawnSoundAndParticle(level, pos, WeatheringCopper.getPrevious(state).isPresent() ? player : null, state, SoundEvents.AXE_SCRAPE, 3005); // Purpur - Tool actionable options - force sound return previous; } else { - Optional optional = Optional.ofNullable(HoneycombItem.WAX_OFF_BY_BLOCK.get().get(state.getBlock())) @@ -13919,16 +13962,16 @@ index bd919b9a83f9736f02783b1ba3863fd1b77c7e89..eb8d2d6f9c65185f5fe16a13ab0cdbba + // .map(block -> block.withPropertiesOf(state)); + // Purpur end - Tool actionable options if (optional.isPresent()) { -- level.playSound(player, pos, SoundEvents.AXE_WAX_OFF, SoundSource.BLOCKS, 1.0F, 1.0F); -+ level.playSound(HoneycombItem.WAX_OFF_BY_BLOCK.get().containsKey(state.getBlock()) ? player : null, pos, SoundEvents.AXE_WAX_OFF, SoundSource.BLOCKS, 1.0F, 1.0F); // Purpur - Tool actionable options - force sound - level.levelEvent(player, 3004, pos, 0); +- spawnSoundAndParticle(level, pos, player, state, SoundEvents.AXE_WAX_OFF, 3004); ++ spawnSoundAndParticle(level, pos, HoneycombItem.WAX_OFF_BY_BLOCK.get().containsKey(state.getBlock()) ? player : null, state, SoundEvents.AXE_WAX_OFF, 3004); // Purpur - Tool actionable options - force sound return optional; } else { + return Optional.empty(); diff --git a/net/minecraft/world/item/BlockItem.java b/net/minecraft/world/item/BlockItem.java -index 6db566adf2d0df1d26221eda04aa01738df6d3d2..3dbdb5c30f8af89e768016bb683a4d2c1549aa0e 100644 +index dceb2b683064bbf4286c3fe71e0fd0c5a644cb07..5820129341698ce98d8edfb4673321e9e415c969 100644 --- a/net/minecraft/world/item/BlockItem.java +++ b/net/minecraft/world/item/BlockItem.java -@@ -144,7 +144,16 @@ public class BlockItem extends Item { +@@ -143,7 +143,16 @@ public class BlockItem extends Item { } protected boolean updateCustomBlockEntityTag(BlockPos pos, Level level, @Nullable Player player, ItemStack stack, BlockState state) { @@ -13946,15 +13989,15 @@ index 6db566adf2d0df1d26221eda04aa01738df6d3d2..3dbdb5c30f8af89e768016bb683a4d2c } @Nullable -@@ -211,6 +220,7 @@ public class BlockItem extends Item { +@@ -205,6 +214,7 @@ public class BlockItem extends Item { } if (!type.onlyOpCanSetNbt() || player != null && (player.canUseGameMasterBlocks() || (player.getAbilities().instabuild && player.getBukkitEntity().hasPermission("minecraft.nbt.place")))) { // Spigot - add permission + if (!(level.purpurConfig.silkTouchEnabled && blockEntity instanceof net.minecraft.world.level.block.entity.SpawnerBlockEntity && player.getBukkitEntity().hasPermission("purpur.drop.spawners"))) // Purpur - Silk touch spawners - return customData.loadInto(blockEntity, level.registryAccess()); + return typedEntityData.loadInto(blockEntity, level.registryAccess()); } -@@ -252,6 +262,7 @@ public class BlockItem extends Item { +@@ -245,6 +255,7 @@ public class BlockItem extends Item { public void onDestroyed(ItemEntity itemEntity) { ItemContainerContents itemContainerContents = itemEntity.getItem().set(DataComponents.CONTAINER, ItemContainerContents.EMPTY); if (itemContainerContents != null) { @@ -13963,7 +14006,7 @@ index 6db566adf2d0df1d26221eda04aa01738df6d3d2..3dbdb5c30f8af89e768016bb683a4d2c } } diff --git a/net/minecraft/world/item/BoatItem.java b/net/minecraft/world/item/BoatItem.java -index 13ce174e4f7e406f57a68ea0d3ef0ee3367f3f3b..ca86122e38688b29340cd8413ccf1746315e292a 100644 +index e849d3b8d3cc0203fa7736f88a669c67af699110..fdf09c4fe801a36589f54982b07371d2f9421084 100644 --- a/net/minecraft/world/item/BoatItem.java +++ b/net/minecraft/world/item/BoatItem.java @@ -63,6 +63,7 @@ public class BoatItem extends Item { @@ -14009,15 +14052,15 @@ index c4c8775de328d40bb8218d993872be5249e8174d..ce1ce18410fc1d47d999c918a8f880b4 } else { player.startUsingItem(hand); diff --git a/net/minecraft/world/item/BucketItem.java b/net/minecraft/world/item/BucketItem.java -index de287715568f358dd83383d68f845df9a7b5a117..8c7be8a71348a3e66c8bf6b6cb39fe002c20bdb0 100644 +index 6167f23ca459e0abc66069f75b024fc9ef3474b8..8ab6ad0a453993ee61fc273ee3780f1c862398a7 100644 --- a/net/minecraft/world/item/BucketItem.java +++ b/net/minecraft/world/item/BucketItem.java @@ -147,7 +147,7 @@ public class BucketItem extends Item implements DispensibleContainerItem { // CraftBukkit end - if (!flag) { + if (!flag2) { return hitResult != null && this.emptyContents(entity, level, hitResult.getBlockPos().relative(hitResult.getDirection()), null, direction, clicked, itemstack, hand); // CraftBukkit - } else if (level.dimensionType().ultraWarm() && this.content.is(FluidTags.WATER)) { -+ } else if ((level.dimensionType().ultraWarm() || (level.isTheEnd() && !org.purpurmc.purpur.PurpurConfig.allowWaterPlacementInTheEnd)) && this.content.is(FluidTags.WATER)) { // Purpur - Add allow water in end world option ++ } else if ((level.dimensionType().ultraWarm() || (level.isTheEnd() && !org.purpurmc.purpur.PurpurConfig.allowWaterPlacementInTheEnd)) && this.content == Fluids.WATER) { // Purpur - Add allow water in end world option int x = pos.getX(); int y = pos.getY(); int z = pos.getZ(); @@ -14031,7 +14074,7 @@ index de287715568f358dd83383d68f845df9a7b5a117..8c7be8a71348a3e66c8bf6b6cb39fe00 return true; diff --git a/net/minecraft/world/item/CrossbowItem.java b/net/minecraft/world/item/CrossbowItem.java -index 7c54e658acf32ba260457e32f4cc6620f80a5f3c..d49a5360d4a21e5b15bac94a823831e25d242a3d 100644 +index 058a3e0c6b1d029e0aa3f6558dcf7e06d3798e6e..5a011f05b31450b9b12c58a0d8d3e23d09e5dcf4 100644 --- a/net/minecraft/world/item/CrossbowItem.java +++ b/net/minecraft/world/item/CrossbowItem.java @@ -66,7 +66,7 @@ public class CrossbowItem extends ProjectileWeaponItem { @@ -14128,7 +14171,7 @@ index f86b0579e707ecfa5c2074ea22bbe383b5e11841..43a6d9bd3a2e301e3957e9933663c3af itemInHand.shrink(1); // Moved up from below } else { diff --git a/net/minecraft/world/item/HangingEntityItem.java b/net/minecraft/world/item/HangingEntityItem.java -index 5f9c166b8ba9e9dcabb7398308e7520a88335eae..e9e3a036290a5facc36cf6a484d03d4d3bfb65a5 100644 +index 0880db37298f9f338baa76028c132b4bb25f1d42..4a236dd14250bf0f1ce63e67349a4c48f104420c 100644 --- a/net/minecraft/world/item/HangingEntityItem.java +++ b/net/minecraft/world/item/HangingEntityItem.java @@ -59,7 +59,7 @@ public class HangingEntityItem extends Item { @@ -14138,13 +14181,13 @@ index 5f9c166b8ba9e9dcabb7398308e7520a88335eae..e9e3a036290a5facc36cf6a484d03d4d - EntityType.createDefaultStackConfig(level, itemInHand, player).accept(hangingEntity); + EntityType.appendDefaultStackConfig(entity -> {if (!level.purpurConfig.persistentDroppableEntityDisplayNames) entity.setCustomName(null);}, level, itemInHand, player).accept(hangingEntity); // Purpur - Apply display names from item forms of entities to entities and vice versa if (hangingEntity.survives()) { - if (!level.isClientSide) { + if (!level.isClientSide()) { // CraftBukkit start - fire HangingPlaceEvent diff --git a/net/minecraft/world/item/HoeItem.java b/net/minecraft/world/item/HoeItem.java -index 3bf3d4030c4da65fa386a8b8083d259a6046d15e..77a8d5d334cd93d23149afa8e58f4114412632df 100644 +index 892b99f25bc030f9b6e04a7a8bd9de38bfe0ea7b..f0065428e0fcd61ec114f9ddb3302eaec92b9c8a 100644 --- a/net/minecraft/world/item/HoeItem.java +++ b/net/minecraft/world/item/HoeItem.java -@@ -45,15 +45,25 @@ public class HoeItem extends Item { +@@ -44,15 +44,25 @@ public class HoeItem extends Item { public InteractionResult useOn(UseOnContext context) { Level level = context.getLevel(); BlockPos clickedPos = context.getClickedPos(); @@ -14172,14 +14215,14 @@ index 3bf3d4030c4da65fa386a8b8083d259a6046d15e..77a8d5d334cd93d23149afa8e58f4114 Player player = context.getPlayer(); - level.playSound(player, clickedPos, SoundEvents.HOE_TILL, SoundSource.BLOCKS, 1.0F, 1.0F); + if (!TILLABLES.containsKey(clickedBlock)) level.playSound(null, clickedPos, SoundEvents.HOE_TILL, SoundSource.BLOCKS, 1.0F, 1.0F); // Purpur - Tool actionable options - force sound - if (!level.isClientSide) { + if (!level.isClientSide()) { consumer.accept(context); if (player != null) { diff --git a/net/minecraft/world/item/ItemStack.java b/net/minecraft/world/item/ItemStack.java -index 6ceb6cf302bad28e453fa89ec16083b0e0c5c398..8c713d90e81df61d65fa6770516afc4704bbbb6f 100644 +index e7a6310301de9c07666e4cf5cfe3ed2951213025..8739cf4284ea45e5df2e2ee7e54da8b932e87f44 100644 --- a/net/minecraft/world/item/ItemStack.java +++ b/net/minecraft/world/item/ItemStack.java -@@ -450,6 +450,7 @@ public final class ItemStack implements DataComponentHolder { +@@ -451,6 +451,7 @@ public final class ItemStack implements DataComponentHolder { // revert back all captured blocks for (org.bukkit.block.BlockState blockstate : blocks) { ((org.bukkit.craftbukkit.block.CraftBlockState) blockstate).revertPlace(); @@ -14187,7 +14230,7 @@ index 6ceb6cf302bad28e453fa89ec16083b0e0c5c398..8c713d90e81df61d65fa6770516afc47 } SignItem.openSign = null; // SPIGOT-6758 - Reset on early return -@@ -473,6 +474,7 @@ public final class ItemStack implements DataComponentHolder { +@@ -474,6 +475,7 @@ public final class ItemStack implements DataComponentHolder { if (!(block.getBlock() instanceof net.minecraft.world.level.block.BaseEntityBlock)) { // Containers get placed automatically block.onPlace(serverLevel, newPos, oldBlock, true, context); } @@ -14195,7 +14238,7 @@ index 6ceb6cf302bad28e453fa89ec16083b0e0c5c398..8c713d90e81df61d65fa6770516afc47 serverLevel.notifyAndUpdatePhysics(newPos, null, oldBlock, block, serverLevel.getBlockState(newPos), updateFlags, net.minecraft.world.level.block.Block.UPDATE_LIMIT); // send null chunk as chunk.k() returns false by this point } -@@ -593,6 +595,26 @@ public final class ItemStack implements DataComponentHolder { +@@ -594,6 +596,26 @@ public final class ItemStack implements DataComponentHolder { return this.isDamageableItem() && this.getDamageValue() > 0; } @@ -14222,7 +14265,7 @@ index 6ceb6cf302bad28e453fa89ec16083b0e0c5c398..8c713d90e81df61d65fa6770516afc47 public int getDamageValue() { return Mth.clamp(this.getOrDefault(DataComponents.DAMAGE, 0), 0, this.getMaxDamage()); } -@@ -674,6 +696,14 @@ public final class ItemStack implements DataComponentHolder { +@@ -675,6 +697,14 @@ public final class ItemStack implements DataComponentHolder { org.bukkit.craftbukkit.event.CraftEventFactory.callPlayerItemBreakEvent(serverPlayer, this); // Paper - Add EntityDamageItemEvent } // CraftBukkit end @@ -14237,7 +14280,7 @@ index 6ceb6cf302bad28e453fa89ec16083b0e0c5c398..8c713d90e81df61d65fa6770516afc47 this.shrink(1); onBreak.accept(item); } -@@ -1206,6 +1236,12 @@ public final class ItemStack implements DataComponentHolder { +@@ -1210,6 +1240,12 @@ public final class ItemStack implements DataComponentHolder { return !this.getOrDefault(DataComponents.ENCHANTMENTS, ItemEnchantments.EMPTY).isEmpty(); } @@ -14251,10 +14294,10 @@ index 6ceb6cf302bad28e453fa89ec16083b0e0c5c398..8c713d90e81df61d65fa6770516afc47 return this.getOrDefault(DataComponents.ENCHANTMENTS, ItemEnchantments.EMPTY); } diff --git a/net/minecraft/world/item/Items.java b/net/minecraft/world/item/Items.java -index b89a7fae0321cbce09faf1503ddc57ca5acaa148..4d5a0b1bc794a3029b0724c6dddeffa6f549a7d5 100644 +index b37550fff62d07aab1a9bc955dcba6418f9f440c..9fdf823c0bb04965897b9775668d7ad73a3adfc0 100644 --- a/net/minecraft/world/item/Items.java +++ b/net/minecraft/world/item/Items.java -@@ -383,7 +383,7 @@ public class Items { +@@ -420,7 +420,7 @@ public class Items { public static final Item PURPUR_BLOCK = registerBlock(Blocks.PURPUR_BLOCK); public static final Item PURPUR_PILLAR = registerBlock(Blocks.PURPUR_PILLAR); public static final Item PURPUR_STAIRS = registerBlock(Blocks.PURPUR_STAIRS); @@ -14263,7 +14306,7 @@ index b89a7fae0321cbce09faf1503ddc57ca5acaa148..4d5a0b1bc794a3029b0724c6dddeffa6 public static final Item CREAKING_HEART = registerBlock(Blocks.CREAKING_HEART); public static final Item CHEST = registerBlock(Blocks.CHEST, properties -> properties.component(DataComponents.CONTAINER, ItemContainerContents.EMPTY)); public static final Item CRAFTING_TABLE = registerBlock(Blocks.CRAFTING_TABLE); -@@ -2092,7 +2092,7 @@ public class Items { +@@ -2178,7 +2178,7 @@ public class Items { "sweet_berries", createBlockItemWithCustomItemName(Blocks.SWEET_BERRY_BUSH), new Item.Properties().food(Foods.SWEET_BERRIES) ); public static final Item GLOW_BERRIES = registerItem( @@ -14273,7 +14316,7 @@ index b89a7fae0321cbce09faf1503ddc57ca5acaa148..4d5a0b1bc794a3029b0724c6dddeffa6 public static final Item CAMPFIRE = registerBlock( Blocks.CAMPFIRE, properties -> properties.component(DataComponents.CONTAINER, ItemContainerContents.EMPTY) diff --git a/net/minecraft/world/item/MapItem.java b/net/minecraft/world/item/MapItem.java -index ba0b254d43651bca1f29b5272af05d068fc37ba8..780793750c99185e8139a1cd0ad52bc7b80899a9 100644 +index f5be479d2acbb6243307283023f40ae6eefa11a0..9c64335ae2c37cdf00c3fedf585c95130ea056e3 100644 --- a/net/minecraft/world/item/MapItem.java +++ b/net/minecraft/world/item/MapItem.java @@ -194,6 +194,7 @@ public class MapItem extends Item { @@ -14309,7 +14352,7 @@ index e116ba0c2a1335ad009abc75675bd339dc034bd2..19fb2091ed57f10af52116519a5ac31d } } diff --git a/net/minecraft/world/item/NameTagItem.java b/net/minecraft/world/item/NameTagItem.java -index a928124ee46a10e9033f771970198e36712917a6..65ff8078474d5039238e9398d8cfc12e79cc6524 100644 +index 24bf4cd320c67b852d3905c50740c8006592bd68..7ee4bd968a43123e21e65f77f30495e65146aca5 100644 --- a/net/minecraft/world/item/NameTagItem.java +++ b/net/minecraft/world/item/NameTagItem.java @@ -24,6 +24,7 @@ public class NameTagItem extends Item { @@ -14321,7 +14364,7 @@ index a928124ee46a10e9033f771970198e36712917a6..65ff8078474d5039238e9398d8cfc12e // Paper end - Add PlayerNameEntityEvent mob.setPersistenceRequired(); diff --git a/net/minecraft/world/item/ProjectileWeaponItem.java b/net/minecraft/world/item/ProjectileWeaponItem.java -index f35c8b81a55a9b8dbeb7c918d657cf65189642bd..f12b9e4e8a78c713782af548d1cb15ef363305b4 100644 +index 663826d7e26bf647376eacbf0c6a2bb80bbdf55a..aa1cf1653d33cd35f77db28dbee0c2319e1975f3 100644 --- a/net/minecraft/world/item/ProjectileWeaponItem.java +++ b/net/minecraft/world/item/ProjectileWeaponItem.java @@ -106,6 +106,8 @@ public abstract class ProjectileWeaponItem extends Item { @@ -14334,10 +14377,10 @@ index f35c8b81a55a9b8dbeb7c918d657cf65189642bd..f12b9e4e8a78c713782af548d1cb15ef } diff --git a/net/minecraft/world/item/ShovelItem.java b/net/minecraft/world/item/ShovelItem.java -index 887ac9f547ceaf76fd533ae47239a64c29a64b18..a290ad578498da07093ea31080cc3fbc87aa3778 100644 +index 410739a0656836502717969bcedbb20812a2fe54..013f155677ab4a7588bd7ad1d612ce582bbd7927 100644 --- a/net/minecraft/world/item/ShovelItem.java +++ b/net/minecraft/world/item/ShovelItem.java -@@ -46,9 +46,12 @@ public class ShovelItem extends Item { +@@ -45,9 +45,12 @@ public class ShovelItem extends Item { BlockState blockState1 = FLATTENABLES.get(blockState.getBlock()); BlockState blockState2 = null; Runnable afterAction = null; // Paper @@ -14366,33 +14409,33 @@ index bef1a8faa8e9567c9707ffb2b34c278c75581e35..fa3a9501134226f269882a14900b924d if (event.callEvent() && snowball.attemptSpawn()) { player.awardStat(Stats.ITEM_USED.get(this)); diff --git a/net/minecraft/world/item/SpawnEggItem.java b/net/minecraft/world/item/SpawnEggItem.java -index 7a961e5ebbdac061f6e73e4ed07fe957ba759066..d48c1dedbd39770ccf3c9c3ff3351b391601cd77 100644 +index 480445383828411fbb65a21c233e7af1e9312794..261140da7cd8f0074fa6d4ff7468411610ed7f87 100644 --- a/net/minecraft/world/item/SpawnEggItem.java +++ b/net/minecraft/world/item/SpawnEggItem.java -@@ -57,6 +57,23 @@ public class SpawnEggItem extends Item { - if (level.getBlockEntity(clickedPos) instanceof Spawner spawner) { - if (level.paperConfig().entities.spawning.disableMobSpawnerSpawnEggTransformation) return InteractionResult.FAIL; // Paper - Allow disabling mob spawner spawn egg transformation - EntityType type = this.getType(level.registryAccess(), itemInHand); -+ // Purpur start - PlayerSetSpawnerTypeWithEggEvent -+ if (spawner instanceof net.minecraft.world.level.block.entity.SpawnerBlockEntity) { -+ org.bukkit.block.Block bukkitBlock = level.getWorld().getBlockAt(clickedPos.getX(), clickedPos.getY(), clickedPos.getZ()); -+ org.purpurmc.purpur.event.PlayerSetSpawnerTypeWithEggEvent event = new org.purpurmc.purpur.event.PlayerSetSpawnerTypeWithEggEvent((org.bukkit.entity.Player) context.getPlayer().getBukkitEntity(), bukkitBlock, (org.bukkit.block.CreatureSpawner) bukkitBlock.getState(), org.bukkit.entity.EntityType.fromName(type.getName())); -+ if (!event.callEvent()) { -+ return InteractionResult.FAIL; +@@ -68,6 +68,23 @@ public class SpawnEggItem extends Item { + return InteractionResult.FAIL; + } else { + if (level.paperConfig().entities.spawning.disableMobSpawnerSpawnEggTransformation) return InteractionResult.FAIL; // Paper - Allow disabling mob spawner spawn egg transformation ++ // Purpur start - PlayerSetSpawnerTypeWithEggEvent ++ if (spawner instanceof net.minecraft.world.level.block.entity.SpawnerBlockEntity) { ++ org.bukkit.block.Block bukkitBlock = level.getWorld().getBlockAt(clickedPos.getX(), clickedPos.getY(), clickedPos.getZ()); ++ org.purpurmc.purpur.event.PlayerSetSpawnerTypeWithEggEvent event = new org.purpurmc.purpur.event.PlayerSetSpawnerTypeWithEggEvent((org.bukkit.entity.Player) context.getPlayer().getBukkitEntity(), bukkitBlock, (org.bukkit.block.CreatureSpawner) bukkitBlock.getState(), org.bukkit.entity.EntityType.fromName(type.getName())); ++ if (!event.callEvent()) { ++ return InteractionResult.FAIL; ++ } ++ type = EntityType.getFromBukkitType(event.getEntityType()); ++ } else if (spawner instanceof net.minecraft.world.level.block.entity.TrialSpawnerBlockEntity) { ++ org.bukkit.block.Block bukkitBlock = level.getWorld().getBlockAt(clickedPos.getX(), clickedPos.getY(), clickedPos.getZ()); ++ org.purpurmc.purpur.event.PlayerSetTrialSpawnerTypeWithEggEvent event = new org.purpurmc.purpur.event.PlayerSetTrialSpawnerTypeWithEggEvent((org.bukkit.entity.Player) context.getPlayer().getBukkitEntity(), bukkitBlock, (org.bukkit.block.TrialSpawner) bukkitBlock.getState(), org.bukkit.entity.EntityType.fromName(type.getName())); ++ if (!event.callEvent()) { ++ return InteractionResult.FAIL; ++ } ++ type = EntityType.getFromBukkitType(event.getEntityType()); + } -+ type = EntityType.getFromBukkitType(event.getEntityType()); -+ } else if (spawner instanceof net.minecraft.world.level.block.entity.TrialSpawnerBlockEntity) { -+ org.bukkit.block.Block bukkitBlock = level.getWorld().getBlockAt(clickedPos.getX(), clickedPos.getY(), clickedPos.getZ()); -+ org.purpurmc.purpur.event.PlayerSetTrialSpawnerTypeWithEggEvent event = new org.purpurmc.purpur.event.PlayerSetTrialSpawnerTypeWithEggEvent((org.bukkit.entity.Player) context.getPlayer().getBukkitEntity(), bukkitBlock, (org.bukkit.block.TrialSpawner) bukkitBlock.getState(), org.bukkit.entity.EntityType.fromName(type.getName())); -+ if (!event.callEvent()) { -+ return InteractionResult.FAIL; -+ } -+ type = EntityType.getFromBukkitType(event.getEntityType()); -+ } -+ // Purpur end - PlayerSetSpawnerTypeWithEggEvent - spawner.setEntityId(type, level.getRandom()); - level.sendBlockUpdated(clickedPos, blockState, blockState, 3); - level.gameEvent(context.getPlayer(), GameEvent.BLOCK_CHANGE, clickedPos); ++ // Purpur end - PlayerSetSpawnerTypeWithEggEvent + spawner.setEntityId(type, level.getRandom()); + level.sendBlockUpdated(clickedPos, blockState, blockState, 3); + level.gameEvent(context.getPlayer(), GameEvent.BLOCK_CHANGE, clickedPos); diff --git a/net/minecraft/world/item/ThrowablePotionItem.java b/net/minecraft/world/item/ThrowablePotionItem.java index 92a2a9c84d8f0a44dffee22834f5ae6c6b4fec43..e2cdb3d43eca6e0e52fb00fbf3801f4b0983c19b 100644 --- a/net/minecraft/world/item/ThrowablePotionItem.java @@ -14407,7 +14450,7 @@ index 92a2a9c84d8f0a44dffee22834f5ae6c6b4fec43..e2cdb3d43eca6e0e52fb00fbf3801f4b if (event.callEvent() && thrownPotion.attemptSpawn()) { if (event.shouldConsume()) { diff --git a/net/minecraft/world/item/TridentItem.java b/net/minecraft/world/item/TridentItem.java -index 2c38f40e87e711942c41c0740fbb2b4080ab9bcf..3e2c23968087e8c60051059720edc3259c44bfa8 100644 +index 2c38f40e87e711942c41c0740fbb2b4080ab9bcf..8f7e6ac2ccb845133f6af69d2aac9b8674b1cc56 100644 --- a/net/minecraft/world/item/TridentItem.java +++ b/net/minecraft/world/item/TridentItem.java @@ -83,7 +83,7 @@ public class TridentItem extends Item implements ProjectileItem { @@ -14427,11 +14470,10 @@ index 2c38f40e87e711942c41c0740fbb2b4080ab9bcf..3e2c23968087e8c60051059720edc325 if (event.shouldConsume()) { stack.hurtWithoutBreaking(1, player); // Paper - PlayerLaunchProjectileEvent } -@@ -125,6 +126,18 @@ public class TridentItem extends Item implements ProjectileItem { +@@ -125,6 +126,17 @@ public class TridentItem extends Item implements ProjectileItem { f1 *= tridentSpinAttackStrength / squareRoot; f2 *= tridentSpinAttackStrength / squareRoot; if (!org.bukkit.craftbukkit.event.CraftEventFactory.callPlayerRiptideEvent(player, stack, f, f1, f2)) return false; // Paper - Add player riptide event -+ + // Purpur start - Implement elytra settings + List list = net.minecraft.world.entity.EquipmentSlot.VALUES.stream().filter((enumitemslot) -> LivingEntity.canGlideUsing(entity.getItemBySlot(enumitemslot), enumitemslot)).toList(); + if (!list.isEmpty()) { @@ -14488,7 +14530,7 @@ index 879c8fe1f20decc793cfa39e686b61d521bd76ba..9c383a1028988cdd3de8b29ba72a4d7b } diff --git a/net/minecraft/world/item/enchantment/EnchantmentHelper.java b/net/minecraft/world/item/enchantment/EnchantmentHelper.java -index b20415b47e209aedbc60ff17238e575dfe33849a..657ca9d8b1dc10777e73c450c9b8a4d52e314388 100644 +index 8d06c797c713fafba6b051a28bacd4ba79be8fd1..aeff7b980d655d5b1bffeff36d9af6e3b3d4ccfa 100644 --- a/net/minecraft/world/item/enchantment/EnchantmentHelper.java +++ b/net/minecraft/world/item/enchantment/EnchantmentHelper.java @@ -606,4 +606,58 @@ public class EnchantmentHelper { @@ -14589,7 +14631,7 @@ index 6040b73a5351c3eb166250566b5c2385cee39ee0..29619b87fe19c66934fe5aaee8a96419 } diff --git a/net/minecraft/world/item/trading/MerchantOffer.java b/net/minecraft/world/item/trading/MerchantOffer.java -index 64c99df8ff305fa28c75dc03fc5ef8c61634ad84..e1452d0694cad3db1800f8610fc095bf98f5f15f 100644 +index 6afeb92c2e00ca5b945b7c7de9257bd741d53c3d..3e2a1b3f1098bf4f45fed76b6ca4f9a3d5add6ee 100644 --- a/net/minecraft/world/item/trading/MerchantOffer.java +++ b/net/minecraft/world/item/trading/MerchantOffer.java @@ -143,8 +143,13 @@ public class MerchantOffer { @@ -14608,7 +14650,7 @@ index 64c99df8ff305fa28c75dc03fc5ef8c61634ad84..e1452d0694cad3db1800f8610fc095bf public ItemStack assemble() { diff --git a/net/minecraft/world/level/BaseSpawner.java b/net/minecraft/world/level/BaseSpawner.java -index 42f44222a8dd61f70d4583b0ca82a16400baaa5a..41ba9f234e840fadee3c8a52ba9655b97a8b7381 100644 +index a91eceb587b0a43785ce995c631e4bebf7e0817f..d2e371486a54ef01c2b86402304c0c217442ba59 100644 --- a/net/minecraft/world/level/BaseSpawner.java +++ b/net/minecraft/world/level/BaseSpawner.java @@ -61,6 +61,7 @@ public abstract class BaseSpawner { @@ -14633,10 +14675,10 @@ index 9175a7e4e6076626cb46144c5858c2f2474f1858..452b6df03152dbd2311774bf4872983d if (distance < 0.0 || d < distance * distance) { return true; diff --git a/net/minecraft/world/level/GameRules.java b/net/minecraft/world/level/GameRules.java -index 966ca1e0e828e4176e12cbcf8c4a6b16489708de..e4ac7ee4e39b609aa70d6d4b766962a4c942911e 100644 +index 3a4a208217df4dbe5056fb2619cadd65b4f5fbc4..0969c6ea8dc9675c8b5506d817b06f74a9a9199b 100644 --- a/net/minecraft/world/level/GameRules.java +++ b/net/minecraft/world/level/GameRules.java -@@ -354,6 +354,13 @@ public class GameRules { +@@ -369,6 +369,13 @@ public class GameRules { this.getRule(key).setFrom(rule, level); // CraftBukkit - per-world } @@ -14651,10 +14693,10 @@ index 966ca1e0e828e4176e12cbcf8c4a6b16489708de..e4ac7ee4e39b609aa70d6d4b766962a4 return this.getRule(key).get(); } diff --git a/net/minecraft/world/level/Level.java b/net/minecraft/world/level/Level.java -index 1f7b3db02e59c4cbc93bc0e4e42bd20e0031c4bd..bee67a32c63df0901b9a9b6b3f6e7a35bb87025e 100644 +index bfbc3e32c6007bd5413be38227b918c6def96e4c..37061bb9f7293557d61d9be1ad135139d0f36217 100644 --- a/net/minecraft/world/level/Level.java +++ b/net/minecraft/world/level/Level.java -@@ -164,12 +164,56 @@ public abstract class Level implements LevelAccessor, UUIDLookup, AutoCl +@@ -170,12 +170,56 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl } // Gale end - Gale configuration @@ -14711,16 +14753,16 @@ index 1f7b3db02e59c4cbc93bc0e4e42bd20e0031c4bd..bee67a32c63df0901b9a9b6b3f6e7a35 public CraftWorld getWorld() { return this.world; } -@@ -846,6 +890,8 @@ public abstract class Level implements LevelAccessor, UUIDLookup, AutoCl +@@ -851,6 +895,8 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl + // 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.galeConfig = galeWorldConfigCreator.apply(this.spigotConfig); // Gale - Gale configuration + this.purpurConfig = new org.purpurmc.purpur.PurpurWorldConfig(((net.minecraft.world.level.storage.PrimaryLevelData) levelData).getLevelName(), environment); // Purpur - Purpur config files + this.playerBreedingCooldowns = this.getNewBreedingCooldownCache(); // Purpur - Add adjustable breeding cooldown to config + this.galeConfig = galeWorldConfigCreator.apply(this.spigotConfig); // Gale - Gale configuration this.generator = generator; this.world = new CraftWorld((ServerLevel) this, generator, biomeProvider, environment); - -@@ -2124,4 +2170,14 @@ public abstract class Level implements LevelAccessor, UUIDLookup, AutoCl +@@ -2115,4 +2161,14 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl return this.id; } } @@ -14736,10 +14778,10 @@ index 1f7b3db02e59c4cbc93bc0e4e42bd20e0031c4bd..bee67a32c63df0901b9a9b6b3f6e7a35 + // Purpur end - Add allow water in end world option } diff --git a/net/minecraft/world/level/NaturalSpawner.java b/net/minecraft/world/level/NaturalSpawner.java -index ccbeda714085118b4dddf9fac6f3de2ed7a6426e..102d88fc2989f80a39826e50ee706d853bfb2c5e 100644 +index 1340d4d15dbc244a2bdef4cbec5c3fd1da97f174..b3649c97e5452d8cc6b7230891e827c6b460af44 100644 --- a/net/minecraft/world/level/NaturalSpawner.java +++ b/net/minecraft/world/level/NaturalSpawner.java -@@ -254,7 +254,7 @@ public final class NaturalSpawner { +@@ -256,7 +256,7 @@ public final class NaturalSpawner { mutableBlockPos.set(x, y, z); double d = x + 0.5; double d1 = z + 0.5; @@ -14749,10 +14791,10 @@ index ccbeda714085118b4dddf9fac6f3de2ed7a6426e..102d88fc2989f80a39826e50ee706d85 double d2 = nearestPlayer.distanceToSqr(d, y, d1); if (level.isLoadedAndInBounds(mutableBlockPos) && isRightDistanceToPlayerAndSpawnPoint(level, chunk, mutableBlockPos, d2)) { // Paper - don't load chunks for mob spawn diff --git a/net/minecraft/world/level/ServerExplosion.java b/net/minecraft/world/level/ServerExplosion.java -index fa4695b7ee56724b4d47ce4da0a5aeb8b5467db4..1669c21534a453c9cf16b992df7a6bf276dea887 100644 +index 78c4450ee097ca0b53b7c5fbef4cd42c35654b66..3c4de8b43a5658e02ddce7db9f453bfd344703e3 100644 --- a/net/minecraft/world/level/ServerExplosion.java +++ b/net/minecraft/world/level/ServerExplosion.java -@@ -646,6 +646,23 @@ public class ServerExplosion implements Explosion { +@@ -634,6 +634,23 @@ public class ServerExplosion implements Explosion { 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 @@ -14761,7 +14803,7 @@ index fa4695b7ee56724b4d47ce4da0a5aeb8b5467db4..1669c21534a453c9cf16b992df7a6bf2 + Location location = new Location(this.level.getWorld(), this.center.x, this.center.y, this.center.z); + if(!new org.purpurmc.purpur.event.entity.PreEntityExplodeEvent(this.source.getBukkitEntity(), location, this.blockInteraction == Explosion.BlockInteraction.DESTROY_WITH_DECAY ? 1.0F / this.radius : 1.0F, org.bukkit.craftbukkit.CraftExplosionResult.toExplosionResult(getBlockInteraction())).callEvent()) { + this.wasCanceled = true; -+ return; ++ return 0; + } + } else { + Location location = new Location(this.level.getWorld(), this.center.x, this.center.y, this.center.z); @@ -14769,7 +14811,7 @@ index fa4695b7ee56724b4d47ce4da0a5aeb8b5467db4..1669c21534a453c9cf16b992df7a6bf2 + org.bukkit.block.BlockState blockState = (this.damageSource.causingBlockSnapshot() != null) ? this.damageSource.causingBlockSnapshot() : block.getState(); + if(!new org.purpurmc.purpur.event.PreBlockExplodeEvent(location.getBlock(), this.blockInteraction == Explosion.BlockInteraction.DESTROY_WITH_DECAY ? 1.0F / this.radius : 1.0F, blockState, org.bukkit.craftbukkit.CraftExplosionResult.toExplosionResult(getBlockInteraction())).callEvent()) { + this.wasCanceled = true; -+ return; ++ return 0; + } + } + // Purpur end - Add PreExplodeEvents @@ -14777,7 +14819,7 @@ index fa4695b7ee56724b4d47ce4da0a5aeb8b5467db4..1669c21534a453c9cf16b992df7a6bf2 List list = this.calculateExplodedPositions(); this.hurtEntities(); diff --git a/net/minecraft/world/level/block/AnvilBlock.java b/net/minecraft/world/level/block/AnvilBlock.java -index e8bac6deb63e0f94fb5f8b38602b2e3333e5fa8d..b14736c25cfdd94c6e3f159e53865150b06edef6 100644 +index 9b1c2a860d5a31e8f7d3a0bf3c46ce7df5ad02db..04e9a472be9e21bae9091eb706f9ffbaa0499295 100644 --- a/net/minecraft/world/level/block/AnvilBlock.java +++ b/net/minecraft/world/level/block/AnvilBlock.java @@ -54,6 +54,53 @@ public class AnvilBlock extends FallingBlock { @@ -14833,7 +14875,7 @@ index e8bac6deb63e0f94fb5f8b38602b2e3333e5fa8d..b14736c25cfdd94c6e3f159e53865150 + @Override protected InteractionResult useWithoutItem(BlockState state, Level level, BlockPos pos, Player player, BlockHitResult hitResult) { - if (!level.isClientSide) { + if (!level.isClientSide()) { diff --git a/net/minecraft/world/level/block/AzaleaBlock.java b/net/minecraft/world/level/block/AzaleaBlock.java index 435a455ad2ec3dfb142d570a51a720bc6c49dac3..32a1dc20202bad7a15794e98cdc1bf2fb2ad5308 100644 --- a/net/minecraft/world/level/block/AzaleaBlock.java @@ -14872,7 +14914,7 @@ index fb6e9194440b85487660f91aea7e34fdf086187b..2653ae5bf66f2b117f86e4df04d9cc30 return true; } else { diff --git a/net/minecraft/world/level/block/BedBlock.java b/net/minecraft/world/level/block/BedBlock.java -index e72ead9ff6541f821a61ad3c50fe068a8c8bb69d..a6f4db5c99d332ac26a52d5174f75e7dc9f51fe5 100644 +index 502b5893a4a0e2959bb678d5089c8baf5a9af3df..16f434bdac6a6e439881a8bea8720d92d89f161a 100644 --- a/net/minecraft/world/level/block/BedBlock.java +++ b/net/minecraft/world/level/block/BedBlock.java @@ -98,7 +98,7 @@ public class BedBlock extends HorizontalDirectionalBlock implements EntityBlock @@ -14903,7 +14945,7 @@ index e72ead9ff6541f821a61ad3c50fe068a8c8bb69d..a6f4db5c99d332ac26a52d5174f75e7d @Override diff --git a/net/minecraft/world/level/block/BigDripleafBlock.java b/net/minecraft/world/level/block/BigDripleafBlock.java -index e1193bcb666b7d38c511df7c1ebddb5897cefa8f..29248afa290b3143375f0538b4dfc80a63f8945f 100644 +index 243243e6516dd5cf6af8d0fad3898e06bc59cc77..b9a3e2e151e57e8655153b0b3330defc0f766212 100644 --- a/net/minecraft/world/level/block/BigDripleafBlock.java +++ b/net/minecraft/world/level/block/BigDripleafBlock.java @@ -254,7 +254,7 @@ public class BigDripleafBlock extends HorizontalDirectionalBlock implements Bone @@ -14916,10 +14958,10 @@ index e1193bcb666b7d38c511df7c1ebddb5897cefa8f..29248afa290b3143375f0538b4dfc80a level.scheduleTick(pos, this, _int); } diff --git a/net/minecraft/world/level/block/Block.java b/net/minecraft/world/level/block/Block.java -index cc5e4e82c2339d17edf76b9212774c9dfd8e514d..4a92d21c2b1a9473d001534cb88cdc37108dd716 100644 +index 3b89a899a191f8b3f3d8643d11bf9468b2592897..15c02428965eede9e55554e9e5017397f39ba8d0 100644 --- a/net/minecraft/world/level/block/Block.java +++ b/net/minecraft/world/level/block/Block.java -@@ -99,6 +99,10 @@ public class Block extends BlockBehaviour implements ItemLike { +@@ -103,6 +103,10 @@ public class Block extends BlockBehaviour implements ItemLike { public static final int UPDATE_LIMIT = 512; protected final StateDefinition stateDefinition; private BlockState defaultBlockState; @@ -14930,7 +14972,7 @@ index cc5e4e82c2339d17edf76b9212774c9dfd8e514d..4a92d21c2b1a9473d001534cb88cdc37 // Paper start - Protect Bedrock and End Portal/Frames from being destroyed public final boolean isDestroyable() { return io.papermc.paper.configuration.GlobalConfiguration.get().unsupportedSettings.allowPermanentBlockBreakExploits || -@@ -345,7 +349,7 @@ public class Block extends BlockBehaviour implements ItemLike { +@@ -384,7 +388,7 @@ public class Block extends BlockBehaviour implements ItemLike { event.setExpToDrop(block.getExpDrop(state, serverLevel, pos, net.minecraft.world.item.ItemStack.EMPTY, true)); // Paper - Properly handle xp dropping event.callEvent(); for (org.bukkit.inventory.ItemStack drop : event.getDrops()) { @@ -14939,21 +14981,21 @@ index cc5e4e82c2339d17edf76b9212774c9dfd8e514d..4a92d21c2b1a9473d001534cb88cdc37 } state.spawnAfterBreak(serverLevel, pos, ItemStack.EMPTY, false); // Paper - Properly handle xp dropping block.popExperience(serverLevel, pos, event.getExpToDrop()); // Paper - Properly handle xp dropping -@@ -363,7 +367,7 @@ public class Block extends BlockBehaviour implements ItemLike { +@@ -402,7 +406,7 @@ public class Block extends BlockBehaviour implements ItemLike { public static void dropResources(BlockState state, LevelAccessor level, BlockPos pos, @Nullable BlockEntity blockEntity) { if (level instanceof ServerLevel) { -- getDrops(state, (ServerLevel)level, pos, blockEntity).forEach(stack -> popResource((ServerLevel)level, pos, stack)); -+ getDrops(state, (ServerLevel)level, pos, blockEntity).forEach(stack -> popResource((ServerLevel)level, pos, applyLoreFromTile(stack, blockEntity))); // Purpur - Persistent BlockEntity Lore and DisplayName +- getDrops(state, (ServerLevel)level, pos, blockEntity).forEach(itemStack -> popResource((ServerLevel)level, pos, itemStack)); ++ getDrops(state, (ServerLevel)level, pos, blockEntity).forEach(itemStack -> popResource((ServerLevel)level, pos, applyLoreFromTile(itemStack, blockEntity))); // Purpur - Persistent BlockEntity Lore and DisplayName state.spawnAfterBreak((ServerLevel)level, pos, ItemStack.EMPTY, true); } } -@@ -375,11 +379,30 @@ public class Block extends BlockBehaviour implements ItemLike { +@@ -414,11 +418,30 @@ public class Block extends BlockBehaviour implements ItemLike { public static void dropResources(BlockState state, Level level, BlockPos pos, @Nullable BlockEntity blockEntity, @Nullable Entity entity, ItemStack tool, boolean dropExperience) { // Paper end - Properly handle xp dropping if (level instanceof ServerLevel) { -- getDrops(state, (ServerLevel)level, pos, blockEntity, entity, tool).forEach(stack -> popResource(level, pos, stack)); -+ getDrops(state, (ServerLevel)level, pos, blockEntity, entity, tool).forEach(stack -> popResource(level, pos, applyLoreFromTile(stack, blockEntity))); // Purpur - Persistent BlockEntity Lore and DisplayName +- getDrops(state, (ServerLevel)level, pos, blockEntity, entity, tool).forEach(itemStack -> popResource(level, pos, itemStack)); ++ getDrops(state, (ServerLevel)level, pos, blockEntity, entity, tool).forEach(itemStack -> popResource(level, pos, applyLoreFromTile(itemStack, blockEntity))); // Purpur - Persistent BlockEntity Lore and DisplayName state.spawnAfterBreak((ServerLevel)level, pos, tool, dropExperience); // Paper - Properly handle xp dropping } } @@ -14980,7 +15022,7 @@ index cc5e4e82c2339d17edf76b9212774c9dfd8e514d..4a92d21c2b1a9473d001534cb88cdc37 public static void popResource(Level level, BlockPos pos, ItemStack stack) { double d = EntityType.ITEM.getHeight() / 2.0; double d1 = pos.getX() + 0.5 + Mth.nextDouble(level.random, -0.25, 0.25); -@@ -460,7 +483,15 @@ public class Block extends BlockBehaviour implements ItemLike { +@@ -499,7 +522,15 @@ public class Block extends BlockBehaviour implements ItemLike { } public void setPlacedBy(Level level, BlockPos pos, BlockState state, @Nullable LivingEntity placer, ItemStack stack) { @@ -14996,7 +15038,7 @@ index cc5e4e82c2339d17edf76b9212774c9dfd8e514d..4a92d21c2b1a9473d001534cb88cdc37 public boolean isPossibleToRespawnInThis(BlockState state) { return !state.isSolid() && !state.liquid(); -@@ -471,7 +502,7 @@ public class Block extends BlockBehaviour implements ItemLike { +@@ -510,7 +541,7 @@ public class Block extends BlockBehaviour implements ItemLike { } public void fallOn(Level level, BlockState state, BlockPos pos, Entity entity, double fallDistance) { @@ -15006,10 +15048,10 @@ index cc5e4e82c2339d17edf76b9212774c9dfd8e514d..4a92d21c2b1a9473d001534cb88cdc37 public void updateEntityMovementAfterFallOn(BlockGetter level, Entity entity) { diff --git a/net/minecraft/world/level/block/Blocks.java b/net/minecraft/world/level/block/Blocks.java -index ff2743d808f3c309bf098b98a6fcba7d019f54c1..941c57083803d69503e83c3ccbbb2759ba3db605 100644 +index 8c38e5476b6ef38781bb517f5773e2e8d0a11023..a46ce79b3c5905ac4b760e4cc70a9c839f0fa7c4 100644 --- a/net/minecraft/world/level/block/Blocks.java +++ b/net/minecraft/world/level/block/Blocks.java -@@ -6571,6 +6571,7 @@ public class Blocks { +@@ -6744,6 +6744,7 @@ public class Blocks { BlockBehaviour.Properties.of() .mapColor(MapColor.PLANT) .forceSolidOff() @@ -15017,7 +15059,7 @@ index ff2743d808f3c309bf098b98a6fcba7d019f54c1..941c57083803d69503e83c3ccbbb2759 .instabreak() .sound(SoundType.AZALEA) .noOcclusion() -@@ -6582,6 +6583,7 @@ public class Blocks { +@@ -6755,6 +6756,7 @@ public class Blocks { BlockBehaviour.Properties.of() .mapColor(MapColor.PLANT) .forceSolidOff() @@ -15099,7 +15141,7 @@ index d4fbf130e23a959be8268085067b3bea1541be9a..2e79ce7e02aaa4abcef1507bba71e030 + // Purpur end - bonemealable cactus } diff --git a/net/minecraft/world/level/block/CakeBlock.java b/net/minecraft/world/level/block/CakeBlock.java -index cdd138a1d25a23fe3ca783383b45226154242ef0..fb820f05c5b9cbb1d4a99e26421ae639a1955365 100644 +index 3d5a81d4bb442acaba8818583dd5a0144de7b63a..2a02f53d79ed931be59a087110bf03ad6dad6eef 100644 --- a/net/minecraft/world/level/block/CakeBlock.java +++ b/net/minecraft/world/level/block/CakeBlock.java @@ -109,6 +109,7 @@ public class CakeBlock extends Block { @@ -15124,27 +15166,28 @@ index 028e2ad8bcb23b3f9f80a5ec551204bb2d7db1ae..642550d59e17330437028a84830520f3 } diff --git a/net/minecraft/world/level/block/CarvedPumpkinBlock.java b/net/minecraft/world/level/block/CarvedPumpkinBlock.java -index 7cdf16c7216878350537b5331081cb30f44d6dbb..a4854370dfdcbc7ec4c27975e4feb69d4cb48a11 100644 +index d3e9ab6b4ba9e29afc785dbbdffdfff6694468e0..77c930ffb595a5c39ffc3b48fd92dcbfee441b1c 100644 --- a/net/minecraft/world/level/block/CarvedPumpkinBlock.java +++ b/net/minecraft/world/level/block/CarvedPumpkinBlock.java -@@ -64,7 +64,7 @@ public class CarvedPumpkinBlock extends HorizontalDirectionalBlock { +@@ -74,7 +74,7 @@ public class CarvedPumpkinBlock extends HorizontalDirectionalBlock { if (blockPatternMatch != null) { SnowGolem snowGolem = EntityType.SNOW_GOLEM.create(level, EntitySpawnReason.TRIGGERED); if (snowGolem != null) { - spawnGolemInWorld(level, blockPatternMatch, snowGolem, blockPatternMatch.getBlock(0, 2, 0).getPos()); + spawnGolemInWorld(level, blockPatternMatch, snowGolem, blockPatternMatch.getBlock(0, 2, 0).getPos(), this.placer); // Purpur - Summoner API - } - } else { - BlockPattern.BlockPatternMatch blockPatternMatch1 = this.getOrCreateIronGolemFull().find(level, pos); -@@ -72,13 +72,23 @@ public class CarvedPumpkinBlock extends HorizontalDirectionalBlock { - IronGolem ironGolem = EntityType.IRON_GOLEM.create(level, EntitySpawnReason.TRIGGERED); - if (ironGolem != null) { - ironGolem.setPlayerCreated(true); -- spawnGolemInWorld(level, blockPatternMatch1, ironGolem, blockPatternMatch1.getBlock(1, 2, 0).getPos()); -+ spawnGolemInWorld(level, blockPatternMatch1, ironGolem, blockPatternMatch1.getBlock(1, 2, 0).getPos(), this.placer); // Purpur - Summoner API - } + return; } } +@@ -84,7 +84,7 @@ public class CarvedPumpkinBlock extends HorizontalDirectionalBlock { + IronGolem ironGolem = EntityType.IRON_GOLEM.create(level, EntitySpawnReason.TRIGGERED); + if (ironGolem != null) { + ironGolem.setPlayerCreated(true); +- spawnGolemInWorld(level, blockPatternMatch1, ironGolem, blockPatternMatch1.getBlock(1, 2, 0).getPos()); ++ spawnGolemInWorld(level, blockPatternMatch1, ironGolem, blockPatternMatch1.getBlock(1, 2, 0).getPos(), this.placer); // Purpur - Summoner API + return; + } + } +@@ -112,6 +112,16 @@ public class CarvedPumpkinBlock extends HorizontalDirectionalBlock { } private static void spawnGolemInWorld(Level level, BlockPattern.BlockPatternMatch patternMatch, Entity golem, BlockPos pos) { @@ -15206,10 +15249,10 @@ index ba7dbfa3f95bf93f3e50b17aa48b772a3047b74d..d42062a86c1278b71bc085cc3fb29a69 } } diff --git a/net/minecraft/world/level/block/ChestBlock.java b/net/minecraft/world/level/block/ChestBlock.java -index c4937d1b482e2ec60961bda62ad6cc155f0ce8f7..43f9d4b8a7ab4cd0a1a5dee9d0c0c7790894a2ae 100644 +index b4d190a2f6ff8d21635c20bb8c1940d789e5c254..868c0898e78bac829fbcd11f3a072d162ec9b651 100644 --- a/net/minecraft/world/level/block/ChestBlock.java +++ b/net/minecraft/world/level/block/ChestBlock.java -@@ -337,6 +337,7 @@ public class ChestBlock extends AbstractChestBlock implements +@@ -369,6 +369,7 @@ public class ChestBlock extends AbstractChestBlock implements } public static boolean isBlockedChestByBlock(BlockGetter level, BlockPos pos) { @@ -15218,14 +15261,14 @@ index c4937d1b482e2ec60961bda62ad6cc155f0ce8f7..43f9d4b8a7ab4cd0a1a5dee9d0c0c779 return level.getBlockState(blockPos).isRedstoneConductor(level, blockPos); } diff --git a/net/minecraft/world/level/block/ComposterBlock.java b/net/minecraft/world/level/block/ComposterBlock.java -index 7977ecd013c55359f179b4b7f895099b7eb02294..be9fe9147cca1293c09dbfae0109a3c07a5c1e16 100644 +index b845f1c02bf0efa4799255d94043f25ed2a04f07..a20c331f8f533a8597e86f88fa3327d00e1ab66b 100644 --- a/net/minecraft/world/level/block/ComposterBlock.java +++ b/net/minecraft/world/level/block/ComposterBlock.java @@ -250,17 +250,27 @@ public class ComposterBlock extends Block implements WorldlyContainerHolder { ) { int levelValue = state.getValue(LEVEL); if (levelValue < 8 && COMPOSTABLES.containsKey(stack.getItem())) { -- if (levelValue < 7 && !level.isClientSide) { +- if (levelValue < 7 && !level.isClientSide()) { - BlockState blockState = addItem(player, state, level, pos, stack); - // Paper start - handle cancelled events - if (blockState == null) { @@ -15265,7 +15308,7 @@ index 7977ecd013c55359f179b4b7f895099b7eb02294..be9fe9147cca1293c09dbfae0109a3c0 + // Purpur start - sneak to bulk process composter + private static @Nullable BlockState process(int levelValue, Player player, BlockState state, Level level, BlockPos pos, ItemStack stack) { -+ if (levelValue < 7 && !level.isClientSide) { ++ if (levelValue < 7 && !level.isClientSide()) { + BlockState iblockdata1 = ComposterBlock.addItem(player, state, level, pos, stack); + // Paper start - handle cancelled events + if (iblockdata1 == null) { @@ -15327,7 +15370,7 @@ index a38ce03a4dab6c83a0b54f47fd3c36d6da46fa24..d345235db5a8d5f1ebbeb5bbb5e7924c + // Purpur end - Ability for hoe to replant crops } diff --git a/net/minecraft/world/level/block/DoorBlock.java b/net/minecraft/world/level/block/DoorBlock.java -index 7f40ccfe379ab284424d730213b343e17239dc0c..2fa6a85b0f1694d0989905a421198c6495271beb 100644 +index 3d0a085e36adb504953ac1577aa81aaf12c12871..fb5adb68ab409fcbeb19b49f442d9ae6b3b2dfef 100644 --- a/net/minecraft/world/level/block/DoorBlock.java +++ b/net/minecraft/world/level/block/DoorBlock.java @@ -199,6 +199,7 @@ public class DoorBlock extends Block { @@ -15358,7 +15401,7 @@ index 7f40ccfe379ab284424d730213b343e17239dc0c..2fa6a85b0f1694d0989905a421198c64 + // Purpur end - Option to make doors require redstone } diff --git a/net/minecraft/world/level/block/DragonEggBlock.java b/net/minecraft/world/level/block/DragonEggBlock.java -index 5c2f10486e3aed090c6545a86276e6927e424cb2..9ed7ffb10e0a172fe5f3dd4613922428af82e5db 100644 +index 247c912eaacdf2d39322232fabc72b692bc3bd01..7167104a494221e3cf7d102654df9eeb85306d9c 100644 --- a/net/minecraft/world/level/block/DragonEggBlock.java +++ b/net/minecraft/world/level/block/DragonEggBlock.java @@ -46,6 +46,7 @@ public class DragonEggBlock extends FallingBlock { @@ -15370,7 +15413,7 @@ index 5c2f10486e3aed090c6545a86276e6927e424cb2..9ed7ffb10e0a172fe5f3dd4613922428 for (int i = 0; i < 1000; i++) { diff --git a/net/minecraft/world/level/block/EndGatewayBlock.java b/net/minecraft/world/level/block/EndGatewayBlock.java -index 68914268ca9350a6c1d794e011e1f9a8aecd609c..8e53b45dbf740de6c6fe499ef424d11b2b15f9d8 100644 +index c70401544b4764518e62e42e3284ea185e4d997d..27e929b69db5b625fb566ec69162b7d3d482f9ab 100644 --- a/net/minecraft/world/level/block/EndGatewayBlock.java +++ b/net/minecraft/world/level/block/EndGatewayBlock.java @@ -99,6 +99,13 @@ public class EndGatewayBlock extends BaseEntityBlock implements Portal { @@ -15388,10 +15431,10 @@ index 68914268ca9350a6c1d794e011e1f9a8aecd609c..8e53b45dbf740de6c6fe499ef424d11b TheEndGatewayBlockEntity.triggerCooldown(level, pos, state, theEndGatewayBlockEntity); } diff --git a/net/minecraft/world/level/block/EndPortalBlock.java b/net/minecraft/world/level/block/EndPortalBlock.java -index f6c64277c3d6e16250e2bf963b6427404e27aa9b..997831c2b916899da8518c1415233812e6ec16b8 100644 +index cbd8c06f5bf4319dd2470c289442237c465cff57..3edc2b4a195103f617a8d211a96cfb1cfa5ab9db 100644 --- a/net/minecraft/world/level/block/EndPortalBlock.java +++ b/net/minecraft/world/level/block/EndPortalBlock.java -@@ -60,6 +60,13 @@ public class EndPortalBlock extends BaseEntityBlock implements Portal { +@@ -61,6 +61,13 @@ public class EndPortalBlock extends BaseEntityBlock implements Portal { protected void entityInside(BlockState state, Level level, BlockPos pos, Entity entity, InsideBlockEffectApplier effectApplier) { if (!new io.papermc.paper.event.entity.EntityInsideBlockEvent(entity.getBukkitEntity(), org.bukkit.craftbukkit.block.CraftBlock.at(level, pos)).callEvent()) { return; } // Paper - Add EntityInsideBlockEvent if (entity.canUsePortal(false)) { @@ -15406,7 +15449,7 @@ index f6c64277c3d6e16250e2bf963b6427404e27aa9b..997831c2b916899da8518c1415233812 org.bukkit.event.entity.EntityPortalEnterEvent event = new org.bukkit.event.entity.EntityPortalEnterEvent(entity.getBukkitEntity(), org.bukkit.craftbukkit.util.CraftLocation.toBukkit(pos, level), org.bukkit.PortalType.ENDER); // Paper - add portal type level.getCraftServer().getPluginManager().callEvent(event); diff --git a/net/minecraft/world/level/block/EnderChestBlock.java b/net/minecraft/world/level/block/EnderChestBlock.java -index 5077a9ff7b78801bdc53536a37aee07b8d86ee4d..72794e204f7fcc31ece94913b7fd9f36ae022b10 100644 +index 1518e035c4b6fdfc68b77fc42b043dd27f680767..a7b20c0781b0372a36e67c7b5a3eae90476f83e0 100644 --- a/net/minecraft/world/level/block/EnderChestBlock.java +++ b/net/minecraft/world/level/block/EnderChestBlock.java @@ -85,8 +85,8 @@ public class EnderChestBlock extends AbstractChestBlock i @@ -15626,10 +15669,10 @@ index 8e3f2518e705a4b8988a1c9da730f0c89f21bdce..6e6212fd891dcaea0d0a398a73416f31 + // Purpur end - kelp vines configurable max growth age } diff --git a/net/minecraft/world/level/block/LiquidBlock.java b/net/minecraft/world/level/block/LiquidBlock.java -index 7320b416e8d660419018b0699f49ab6f45a3373b..ae609e0603a78423c4c89b7efb9c41ab8fe7aa52 100644 +index 05a04c03ed529ee4bda6db676cc97781a07e7a6a..34a10afcc242e4e37673918ee271d683e35385b7 100644 --- a/net/minecraft/world/level/block/LiquidBlock.java +++ b/net/minecraft/world/level/block/LiquidBlock.java -@@ -134,7 +134,7 @@ public class LiquidBlock extends Block implements BucketPickup { +@@ -138,7 +138,7 @@ public class LiquidBlock extends Block implements BucketPickup { @Override protected void onPlace(BlockState state, Level level, BlockPos pos, BlockState oldState, boolean isMoving) { @@ -15638,7 +15681,7 @@ index 7320b416e8d660419018b0699f49ab6f45a3373b..ae609e0603a78423c4c89b7efb9c41ab level.scheduleTick(pos, state.getFluidState().getType(), this.getFlowSpeed(level, pos)); // Paper - Configurable speed for water flowing over lava } } -@@ -169,7 +169,7 @@ public class LiquidBlock extends Block implements BucketPickup { +@@ -173,7 +173,7 @@ public class LiquidBlock extends Block implements BucketPickup { BlockState neighborState, RandomSource random ) { @@ -15647,7 +15690,7 @@ index 7320b416e8d660419018b0699f49ab6f45a3373b..ae609e0603a78423c4c89b7efb9c41ab scheduledTickAccess.scheduleTick(pos, state.getFluidState().getType(), this.fluid.getTickDelay(level)); } -@@ -178,7 +178,7 @@ public class LiquidBlock extends Block implements BucketPickup { +@@ -182,7 +182,7 @@ public class LiquidBlock extends Block implements BucketPickup { @Override protected void neighborChanged(BlockState state, Level level, BlockPos pos, Block neighborBlock, @Nullable Orientation orientation, boolean movedByPiston) { @@ -15670,13 +15713,13 @@ index db83c3630064a6875b477021a1f78bdf59c4ddc3..bbf8447cf986015f8a2e55f39d7b4f0d } diff --git a/net/minecraft/world/level/block/NetherPortalBlock.java b/net/minecraft/world/level/block/NetherPortalBlock.java -index 6c5629a6f5f91496a55eb0bf281ceae1567915b1..44707c0bf2c11f7bf7e30f747357ca2a1c6057d6 100644 +index 11fefdb82fc89ac0a534512064c233df87642a3e..2f08f71f29580a99b6c5121e2283790e56af4daf 100644 --- a/net/minecraft/world/level/block/NetherPortalBlock.java +++ b/net/minecraft/world/level/block/NetherPortalBlock.java @@ -67,7 +67,7 @@ public class NetherPortalBlock extends Block implements Portal { protected void randomTick(BlockState state, ServerLevel level, BlockPos pos, RandomSource random) { if (level.spigotConfig.enableZombiePigmenPortalSpawns && level.dimensionType().natural() // Spigot - && level.getGameRules().getBoolean(GameRules.RULE_DOMOBSPAWNING) + && level.isSpawningMonsters() - && random.nextInt(2000) < level.getDifficulty().getId() + && random.nextInt(level.purpurConfig.piglinPortalSpawnModifier) < level.getDifficulty().getId() // Purpur - Piglin portal spawn modifier && level.anyPlayerCloseEnoughForSpawning(pos)) { @@ -15754,7 +15797,7 @@ index a8cb58de6223006150bc49b95e5964b8fc42cecc..d25e2a37abb5e4c98116048fe2e96194 + // Purpur end - bonemealable netherwart } diff --git a/net/minecraft/world/level/block/NoteBlock.java b/net/minecraft/world/level/block/NoteBlock.java -index 9467d5226797f67565edf8a46fd5b48135337410..7560d49b1952dba22e88758b15a24540ca576bbb 100644 +index 7a1d3423c4d3daf496e323470fda74491762c8d5..d17ba7be9aabd9d03e29c6f4ba1c51853c2de940 100644 --- a/net/minecraft/world/level/block/NoteBlock.java +++ b/net/minecraft/world/level/block/NoteBlock.java @@ -101,7 +101,7 @@ public class NoteBlock extends Block { @@ -15779,7 +15822,7 @@ index bd2aa00ce8b78c16f6107064dd00bfbb072df0df..9fa1ed439ef9adba44f3d4738688a95f } diff --git a/net/minecraft/world/level/block/PointedDripstoneBlock.java b/net/minecraft/world/level/block/PointedDripstoneBlock.java -index ef164fb4f24412e506b8abce74d509e8be6c4676..85e9aecc2045e1599488d6a137f5f9713fb1a245 100644 +index 31d2d5f548e8a03dbedbf8ce93a0071513c48c7c..17486e988857e4df0f2563c4e2e068754fa7e1a4 100644 --- a/net/minecraft/world/level/block/PointedDripstoneBlock.java +++ b/net/minecraft/world/level/block/PointedDripstoneBlock.java @@ -193,20 +193,20 @@ public class PointedDripstoneBlock extends Block implements Fallable, SimpleWate @@ -15807,10 +15850,10 @@ index ef164fb4f24412e506b8abce74d509e8be6c4676..85e9aecc2045e1599488d6a137f5f971 if (!(randChance >= f)) { diff --git a/net/minecraft/world/level/block/PowderSnowBlock.java b/net/minecraft/world/level/block/PowderSnowBlock.java -index a9b0e6c4dbccfc4f2ca31e0ff67bc7fb3ec4bef2..46a2726c3aa50d48eca8702cfde4ac87e2cfae82 100644 +index 90e613b28e0f293f3cb09ba93e41589de5b54fe3..03ec0eeca0f6e18e91918142a43d857412642f8a 100644 --- a/net/minecraft/world/level/block/PowderSnowBlock.java +++ b/net/minecraft/world/level/block/PowderSnowBlock.java -@@ -94,7 +94,7 @@ public class PowderSnowBlock extends Block implements BucketPickup { +@@ -96,7 +96,7 @@ public class PowderSnowBlock extends Block implements BucketPickup { // CraftBukkit - move down && entity1.mayInteract(serverLevel, blockPos)) { // CraftBukkit start @@ -15833,10 +15876,10 @@ index 61acb6ec728d46bf2b0b08439ab418f355f50c79..ebc0df13fc204472742a611b25f1ffd3 } else { int x = pos.getX(); diff --git a/net/minecraft/world/level/block/RespawnAnchorBlock.java b/net/minecraft/world/level/block/RespawnAnchorBlock.java -index 5b9d67d671ea70d4a8920a7f190d240c920971ac..f0b4ea2065f98f5430bba89f1a86ea5e8791aa1f 100644 +index daaa3a2599fcc13e1943454edc57e0f903ba2246..6e57f94c99655fff53000ebbc9a59ffbca57db72 100644 --- a/net/minecraft/world/level/block/RespawnAnchorBlock.java +++ b/net/minecraft/world/level/block/RespawnAnchorBlock.java -@@ -160,7 +160,7 @@ public class RespawnAnchorBlock extends Block { +@@ -161,7 +161,7 @@ public class RespawnAnchorBlock extends Block { }; Vec3 center = pos2.getCenter(); level.explode( @@ -15846,7 +15889,7 @@ index 5b9d67d671ea70d4a8920a7f190d240c920971ac..f0b4ea2065f98f5430bba89f1a86ea5e } diff --git a/net/minecraft/world/level/block/SculkShriekerBlock.java b/net/minecraft/world/level/block/SculkShriekerBlock.java -index 757f8453e147875ab9f14d9726bb734ef27447c9..f8c9a6d7c9f1a9d2afd820244017a709db79e080 100644 +index ef9f879e7819fcb977dadcfbb4b95b4f7b2f4266..d9384c2eb52e0a9572cd7559f786335d01d917bb 100644 --- a/net/minecraft/world/level/block/SculkShriekerBlock.java +++ b/net/minecraft/world/level/block/SculkShriekerBlock.java @@ -118,7 +118,7 @@ public class SculkShriekerBlock extends BaseEntityBlock implements SimpleWaterlo @@ -15901,7 +15944,7 @@ index 9131098e3ae4e6ffdf1491eb62537e385f75b6b2..ddedc08a96e500a390421d39be36590f && ( blockState.is(BlockTags.SNOW_LAYER_CAN_SURVIVE_ON) diff --git a/net/minecraft/world/level/block/SpawnerBlock.java b/net/minecraft/world/level/block/SpawnerBlock.java -index e8d7b6adbcb84e8d89067b54318e0feb3c3276a6..dc2846e26e778b2885fd9c558081c7677d48169a 100644 +index fda8626dc32cf8d1d42be2e30c28a53ad8808212..1eb37ed7fe5b5ab6a290016bee923f6583d6cd63 100644 --- a/net/minecraft/world/level/block/SpawnerBlock.java +++ b/net/minecraft/world/level/block/SpawnerBlock.java @@ -14,6 +14,7 @@ import net.minecraft.world.level.block.state.BlockBehaviour; @@ -16019,7 +16062,7 @@ index 6764a77998e23de08eaf3a82a0cc0006868e1c3e..f7b6c0029e8d35ebf0fad380b8bc3b15 if (!blockState.is(Blocks.KELP) && !blockState.is(Blocks.KELP_PLANT) diff --git a/net/minecraft/world/level/block/StonecutterBlock.java b/net/minecraft/world/level/block/StonecutterBlock.java -index 6d1ab251e7d09ada7edcde7f52ca49ae5efe16b6..a58c94a40bad1d60b970b06decde9851692a8b63 100644 +index 497470188b62356c30184226e2125abeb7359939..7591e1e55f8821887b3f68d9ce0243a33d4dc680 100644 --- a/net/minecraft/world/level/block/StonecutterBlock.java +++ b/net/minecraft/world/level/block/StonecutterBlock.java @@ -93,4 +93,14 @@ public class StonecutterBlock extends Block { @@ -16086,7 +16129,7 @@ index a8de37e173e244d7a16c19ac8805e0e4327c837a..baa56c6422c0924bb8b7c5a78db17acf + // Purpur end - bonemealable sugarcane } diff --git a/net/minecraft/world/level/block/TurtleEggBlock.java b/net/minecraft/world/level/block/TurtleEggBlock.java -index 8ee103e2752290db4cb4b22bb3552bf80e2ceb92..41e51cb4f1a2443361b52c8523688e2c307a1d75 100644 +index 492f82fedcb954d378d8b37071d1794082a1a2cc..91e43cbb8bf5faf2677b170f6884fb2b4e74ca86 100644 --- a/net/minecraft/world/level/block/TurtleEggBlock.java +++ b/net/minecraft/world/level/block/TurtleEggBlock.java @@ -156,7 +156,7 @@ public class TurtleEggBlock extends Block { @@ -16197,7 +16240,7 @@ index f4ff810cdd4206711312a4fffba18f4b30a5701f..96fb69aaf9ed020a328ff609d49f88ab + // Purpur end - weeping vines configurable max growth age } diff --git a/net/minecraft/world/level/block/WitherSkullBlock.java b/net/minecraft/world/level/block/WitherSkullBlock.java -index 0b6debe0e55e404e6f34b3bc437fe7c7a30cec7c..a70f552fddc58efdce770c36abb548ef8359d939 100644 +index 99f130e303d4c6ca275bbdbf4099b65386125f51..00aad961536b8a2a69665f69eb7ce1ed5f884832 100644 --- a/net/minecraft/world/level/block/WitherSkullBlock.java +++ b/net/minecraft/world/level/block/WitherSkullBlock.java @@ -71,6 +71,7 @@ public class WitherSkullBlock extends SkullBlock { @@ -16244,13 +16287,13 @@ index ca2cab797fc16f0961ce994fcb45029589b3c370..beda1b89b8083c63b9e177495ef063a7 private static boolean canBurn( diff --git a/net/minecraft/world/level/block/entity/BarrelBlockEntity.java b/net/minecraft/world/level/block/entity/BarrelBlockEntity.java -index d679ab599dfd0bdbdc3ab5530d7fcd1c38baf7fa..0e4f6455ec48c5a7fcd4613c1c5b79d599e4960a 100644 +index f8cad05f5f1692c9a8701ff01f33d83477600c34..a4a4150beab8f2fa409a2d1d495a56679aecbae3 100644 --- a/net/minecraft/world/level/block/entity/BarrelBlockEntity.java +++ b/net/minecraft/world/level/block/entity/BarrelBlockEntity.java -@@ -56,7 +56,17 @@ public class BarrelBlockEntity extends RandomizableContainerBlockEntity { +@@ -58,7 +58,16 @@ public class BarrelBlockEntity extends RandomizableContainerBlockEntity { } // CraftBukkit end - + private static final Component DEFAULT_NAME = Component.translatable("container.barrel"); - private NonNullList items = NonNullList.withSize(27, ItemStack.EMPTY); + // Purpur start - Barrels and enderchests 6 rows + private NonNullList items = NonNullList.withSize(switch (org.purpurmc.purpur.PurpurConfig.barrelRows) { @@ -16262,11 +16305,10 @@ index d679ab599dfd0bdbdc3ab5530d7fcd1c38baf7fa..0e4f6455ec48c5a7fcd4613c1c5b79d5 + default -> 27; + }, ItemStack.EMPTY); + // Purpur end - Barrels and enderchests 6 rows -+ public final ContainerOpenersCounter openersCounter = new ContainerOpenersCounter() { @Override protected void onOpen(Level level, BlockPos pos, BlockState state) { -@@ -108,7 +118,16 @@ public class BarrelBlockEntity extends RandomizableContainerBlockEntity { +@@ -110,7 +119,16 @@ public class BarrelBlockEntity extends RandomizableContainerBlockEntity { @Override public int getContainerSize() { @@ -16284,7 +16326,7 @@ index d679ab599dfd0bdbdc3ab5530d7fcd1c38baf7fa..0e4f6455ec48c5a7fcd4613c1c5b79d5 } @Override -@@ -128,7 +147,16 @@ public class BarrelBlockEntity extends RandomizableContainerBlockEntity { +@@ -130,7 +148,16 @@ public class BarrelBlockEntity extends RandomizableContainerBlockEntity { @Override protected AbstractContainerMenu createMenu(int id, Inventory player) { @@ -16303,7 +16345,7 @@ index d679ab599dfd0bdbdc3ab5530d7fcd1c38baf7fa..0e4f6455ec48c5a7fcd4613c1c5b79d5 @Override diff --git a/net/minecraft/world/level/block/entity/BeaconBlockEntity.java b/net/minecraft/world/level/block/entity/BeaconBlockEntity.java -index 503c8625cd77a564e55fc1427137d43a5cc12d9e..c2e15c6e1c6bfc5a9d89afc9b8aa9551bad2cc8f 100644 +index a517b57c504f7901e11cf435019e8e9bbb1ddbdb..9bfc2afb50a6f776441f666a2fc7ad119a758a7b 100644 --- a/net/minecraft/world/level/block/entity/BeaconBlockEntity.java +++ b/net/minecraft/world/level/block/entity/BeaconBlockEntity.java @@ -143,6 +143,16 @@ public class BeaconBlockEntity extends BlockEntity implements MenuProvider, Name @@ -16349,10 +16391,10 @@ index 503c8625cd77a564e55fc1427137d43a5cc12d9e..c2e15c6e1c6bfc5a9d89afc9b8aa9551 playSound(level, pos, SoundEvents.BEACON_AMBIENT); } diff --git a/net/minecraft/world/level/block/entity/BeehiveBlockEntity.java b/net/minecraft/world/level/block/entity/BeehiveBlockEntity.java -index 91f7ee163107d846e7f6a5783be6eff96e783886..b1b49fa83794f4237994e9b985816ddf6d20b7e9 100644 +index 2e58d918abe1d825af3b05dfd38d76cc12df3403..8f8e60158f7059a65eb9960bda6cd3c0034611a9 100644 --- a/net/minecraft/world/level/block/entity/BeehiveBlockEntity.java +++ b/net/minecraft/world/level/block/entity/BeehiveBlockEntity.java -@@ -75,7 +75,7 @@ public class BeehiveBlockEntity extends BlockEntity { +@@ -77,7 +77,7 @@ public class BeehiveBlockEntity extends BlockEntity { "leash", "UUID" ); @@ -16361,7 +16403,7 @@ index 91f7ee163107d846e7f6a5783be6eff96e783886..b1b49fa83794f4237994e9b985816ddf private static final int MIN_TICKS_BEFORE_REENTERING_HIVE = 400; private static final int MIN_OCCUPATION_TICKS_NECTAR = 2400; public static final int MIN_OCCUPATION_TICKS_NECTARLESS = 600; -@@ -150,11 +150,33 @@ public class BeehiveBlockEntity extends BlockEntity { +@@ -152,11 +152,33 @@ public class BeehiveBlockEntity extends BlockEntity { return list; } @@ -16395,8 +16437,8 @@ index 91f7ee163107d846e7f6a5783be6eff96e783886..b1b49fa83794f4237994e9b985816ddf // Paper start - Add EntityBlockStorage clearEntities public void clearBees() { this.stored.clear(); -@@ -392,8 +414,8 @@ public class BeehiveBlockEntity extends BlockEntity { - return this.stored.stream().map(BeehiveBlockEntity.BeeData::toOccupant).toList(); +@@ -397,8 +419,8 @@ public class BeehiveBlockEntity extends BlockEntity { + registration.register(DebugSubscriptions.BEE_HIVES, () -> DebugHiveInfo.pack(this)); } - static class BeeData { @@ -16407,10 +16449,10 @@ index 91f7ee163107d846e7f6a5783be6eff96e783886..b1b49fa83794f4237994e9b985816ddf private int ticksInHive; diff --git a/net/minecraft/world/level/block/entity/BlockEntity.java b/net/minecraft/world/level/block/entity/BlockEntity.java -index 5986825d6a381eeb445dd424dd127864aa703163..a5ade8268a74738170caf519e7e45e13862bc39d 100644 +index 39691f6ff8dc08c7d4ebff0612cb9777d809c6ed..bc3a151687663b18c2454c755d8f1d2414740d7e 100644 --- a/net/minecraft/world/level/block/entity/BlockEntity.java +++ b/net/minecraft/world/level/block/entity/BlockEntity.java -@@ -105,6 +105,10 @@ public abstract class BlockEntity { +@@ -107,6 +107,10 @@ public abstract class BlockEntity implements DebugValueSource { input.read("PublicBukkitValues", CompoundTag.CODEC) .ifPresent(this.persistentDataContainer::putAll); // Paper end - read persistent data container @@ -16421,7 +16463,7 @@ index 5986825d6a381eeb445dd424dd127864aa703163..a5ade8268a74738170caf519e7e45e13 } public final void loadWithComponents(ValueInput input) { -@@ -117,6 +121,11 @@ public abstract class BlockEntity { +@@ -119,6 +123,11 @@ public abstract class BlockEntity implements DebugValueSource { } protected void saveAdditional(ValueOutput output) { @@ -16433,7 +16475,7 @@ index 5986825d6a381eeb445dd424dd127864aa703163..a5ade8268a74738170caf519e7e45e13 } public final CompoundTag saveWithFullMetadata(HolderLookup.Provider registries) { -@@ -402,4 +411,17 @@ public abstract class BlockEntity { +@@ -408,4 +417,17 @@ public abstract class BlockEntity implements DebugValueSource { return this.blockEntity.getNameForReporting() + "@" + this.blockEntity.getBlockPos(); } } @@ -16452,7 +16494,7 @@ index 5986825d6a381eeb445dd424dd127864aa703163..a5ade8268a74738170caf519e7e45e13 + // Purpur end - Persistent BlockEntity Lore and DisplayName } diff --git a/net/minecraft/world/level/block/entity/ConduitBlockEntity.java b/net/minecraft/world/level/block/entity/ConduitBlockEntity.java -index 0e87d20639c382be2221d73c7498480d21ebeafb..3ea9fe4c936f024c15a6bba6e7c5d960a3def1f9 100644 +index 5c597b682c6988123971d0e3f6036e9faa14842e..db2f62b7226f7ad44113d3e5fcc49219dd96189f 100644 --- a/net/minecraft/world/level/block/entity/ConduitBlockEntity.java +++ b/net/minecraft/world/level/block/entity/ConduitBlockEntity.java @@ -151,7 +151,7 @@ public class ConduitBlockEntity extends BlockEntity { @@ -16483,7 +16525,7 @@ index 0e87d20639c382be2221d73c7498480d21ebeafb..3ea9fe4c936f024c15a6bba6e7c5d960 } @@ -202,7 +202,7 @@ public class ConduitBlockEntity extends BlockEntity { EntityReference entityReference = updateDestroyTarget(blockEntity.destroyTarget, level, pos, canDestroy); - LivingEntity livingEntity = EntityReference.get(entityReference, level, LivingEntity.class); + LivingEntity livingEntity = EntityReference.getLivingEntity(entityReference, level); if (damageTarget && livingEntity != null) { // CraftBukkit - 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 @@ -16493,7 +16535,7 @@ index 0e87d20639c382be2221d73c7498480d21ebeafb..3ea9fe4c936f024c15a6bba6e7c5d960 @@ -224,20 +224,26 @@ public class ConduitBlockEntity extends BlockEntity { return selectNewTarget(level, pos); } else { - LivingEntity livingEntity = EntityReference.get(destroyTarget, level, LivingEntity.class); + LivingEntity livingEntity = EntityReference.getLivingEntity(destroyTarget, level); - return livingEntity != null && livingEntity.isAlive() && pos.closerThan(livingEntity.blockPosition(), 8.0) ? destroyTarget : null; + return livingEntity != null && livingEntity.isAlive() && pos.closerThan(livingEntity.blockPosition(), level.purpurConfig.conduitDamageDistance) ? destroyTarget : null; // Purpur - Conduit behavior configuration } @@ -16505,7 +16547,7 @@ index 0e87d20639c382be2221d73c7498480d21ebeafb..3ea9fe4c936f024c15a6bba6e7c5d960 - LivingEntity.class, getDestroyRangeAABB(pos), livingEntity -> livingEntity instanceof Enemy && livingEntity.isInWaterOrRain() + LivingEntity.class, getDestroyRangeAABB(pos, level), livingEntity -> livingEntity instanceof Enemy && livingEntity.isInWaterOrRain() // Purpur - Conduit behavior configuration ); - return entitiesOfClass.isEmpty() ? null : new EntityReference<>(Util.getRandom(entitiesOfClass, level.random)); + return entitiesOfClass.isEmpty() ? null : EntityReference.of(Util.getRandom(entitiesOfClass, level.random)); } public static AABB getDestroyRangeAABB(BlockPos pos) { @@ -16521,10 +16563,10 @@ index 0e87d20639c382be2221d73c7498480d21ebeafb..3ea9fe4c936f024c15a6bba6e7c5d960 private static void animationTick(Level level, BlockPos pos, List positions, @Nullable Entity entity, int tickCount) { diff --git a/net/minecraft/world/level/block/entity/EnchantingTableBlockEntity.java b/net/minecraft/world/level/block/entity/EnchantingTableBlockEntity.java -index 5dd044c13e09423af43330df565bfe6ce88a883c..39a45a32b1c82e6d7641a1609384a902d0414659 100644 +index a9e08f9b94a5247461f5289db0e04baf455b0e6d..77d9bbf30c24667df5090abd11277b93e3538023 100644 --- a/net/minecraft/world/level/block/entity/EnchantingTableBlockEntity.java +++ b/net/minecraft/world/level/block/entity/EnchantingTableBlockEntity.java -@@ -30,6 +30,7 @@ public class EnchantingTableBlockEntity extends BlockEntity implements Nameable +@@ -31,6 +31,7 @@ public class EnchantingTableBlockEntity extends BlockEntity implements Nameable private static final RandomSource RANDOM = RandomSource.create(); @Nullable private Component name; @@ -16532,7 +16574,7 @@ index 5dd044c13e09423af43330df565bfe6ce88a883c..39a45a32b1c82e6d7641a1609384a902 public EnchantingTableBlockEntity(BlockPos pos, BlockState state) { super(BlockEntityType.ENCHANTING_TABLE, pos, state); -@@ -39,12 +40,14 @@ public class EnchantingTableBlockEntity extends BlockEntity implements Nameable +@@ -40,12 +41,14 @@ public class EnchantingTableBlockEntity extends BlockEntity implements Nameable protected void saveAdditional(ValueOutput output) { super.saveAdditional(output); output.storeNullable("CustomName", ComponentSerialization.CODEC, this.name); @@ -16547,7 +16589,7 @@ index 5dd044c13e09423af43330df565bfe6ce88a883c..39a45a32b1c82e6d7641a1609384a902 } public static void bookAnimationTick(Level level, BlockPos pos, BlockState state, EnchantingTableBlockEntity enchantingTable) { -@@ -136,4 +139,22 @@ public class EnchantingTableBlockEntity extends BlockEntity implements Nameable +@@ -137,4 +140,22 @@ public class EnchantingTableBlockEntity extends BlockEntity implements Nameable public void removeComponentsFromTag(ValueOutput output) { output.discard("CustomName"); } @@ -16571,7 +16613,7 @@ index 5dd044c13e09423af43330df565bfe6ce88a883c..39a45a32b1c82e6d7641a1609384a902 + // Purpur end - Enchantment Table Persists Lapis } diff --git a/net/minecraft/world/level/block/entity/SignBlockEntity.java b/net/minecraft/world/level/block/entity/SignBlockEntity.java -index be1b138a78d8cb87956d531a801d85e677ca6f4a..2e0b2b55031343e32b4972c0f0017e950d56652d 100644 +index 67b6bccaed53a098c269c2b6d3df8155736a2aa6..95d922a5eeb4d7d09f418a0400ead29ede11943d 100644 --- a/net/minecraft/world/level/block/entity/SignBlockEntity.java +++ b/net/minecraft/world/level/block/entity/SignBlockEntity.java @@ -148,16 +148,32 @@ public class SignBlockEntity extends BlockEntity { @@ -16681,10 +16723,10 @@ index f1f8575a4b37114ced3cdb1d2ea33a36a2db44fd..2afe96a69c09decbe972332d2d38f674 CompoundTag compoundTag1 = tagValueOutput.buildResult(); listTag.add(compoundTag1); diff --git a/net/minecraft/world/level/levelgen/DensityFunctions.java b/net/minecraft/world/level/levelgen/DensityFunctions.java -index 04527a5c65ad630f794fed9071d485aedd02257a..77731406cb3dc417aa2fe1cb4352f3d2d7d498aa 100644 +index 2dede0dc630097c878f4afc10b10a304eb458a99..9fcc23741fc2622b5f88fed47d811d75c6d2c9f8 100644 --- a/net/minecraft/world/level/levelgen/DensityFunctions.java +++ b/net/minecraft/world/level/levelgen/DensityFunctions.java -@@ -528,7 +528,7 @@ public final class DensityFunctions { +@@ -534,7 +534,7 @@ public final class DensityFunctions { int i1 = z / 2; int i2 = x % 2; int i3 = z % 2; @@ -16694,7 +16736,7 @@ index 04527a5c65ad630f794fed9071d485aedd02257a..77731406cb3dc417aa2fe1cb4352f3d2 NoiseCache cache = noiseCache.get().computeIfAbsent(noise, noiseKey -> new NoiseCache()); // Paper - Perf: Optimize end generation diff --git a/net/minecraft/world/level/levelgen/PhantomSpawner.java b/net/minecraft/world/level/levelgen/PhantomSpawner.java -index 77ecbcdec8e176b1a45e87d33f64b1a12c532e26..acd3161d88a22a4f6246321cb2af9195e416f94c 100644 +index 0c9c58a2f57b11f907c70440bf8bd5a513ce8243..0ab57209777d359cb35d2b3e44b826b3be86cda6 100644 --- a/net/minecraft/world/level/levelgen/PhantomSpawner.java +++ b/net/minecraft/world/level/levelgen/PhantomSpawner.java @@ -38,13 +38,13 @@ public class PhantomSpawner implements CustomSpawner { @@ -16724,10 +16766,10 @@ index 77ecbcdec8e176b1a45e87d33f64b1a12c532e26..acd3161d88a22a4f6246321cb2af9195 for (int i3 = 0; i3 < i2; i3++) { // Paper start - PhantomPreSpawnEvent diff --git a/net/minecraft/world/level/material/FlowingFluid.java b/net/minecraft/world/level/material/FlowingFluid.java -index 6bac3fb751e114855b9b072a7880ab370f111218..c4675d51bd459fcdc411b48115d512f77a232cef 100644 +index f5113a0739ba65c84378f53b7d1200a65b120028..251b65df77b53ff0253ae838f91f2036c422724d 100644 --- a/net/minecraft/world/level/material/FlowingFluid.java +++ b/net/minecraft/world/level/material/FlowingFluid.java -@@ -232,7 +232,7 @@ public abstract class FlowingFluid extends Fluid { +@@ -233,7 +233,7 @@ public abstract class FlowingFluid extends Fluid { } } @@ -16736,7 +16778,7 @@ index 6bac3fb751e114855b9b072a7880ab370f111218..c4675d51bd459fcdc411b48115d512f7 BlockState blockState1 = level.getBlockState(mutableBlockPos.setWithOffset(pos, Direction.DOWN)); FluidState fluidState1 = blockState1.getFluidState(); if (blockState1.isSolid() || this.isSourceBlockOfThisType(fluidState1)) { -@@ -320,6 +320,12 @@ public abstract class FlowingFluid extends Fluid { +@@ -323,6 +323,12 @@ public abstract class FlowingFluid extends Fluid { protected abstract boolean canConvertToSource(ServerLevel level); @@ -16750,10 +16792,10 @@ index 6bac3fb751e114855b9b072a7880ab370f111218..c4675d51bd459fcdc411b48115d512f7 if (blockState.getBlock() instanceof LiquidBlockContainer liquidBlockContainer) { liquidBlockContainer.placeLiquid(level, pos, blockState, fluidState); diff --git a/net/minecraft/world/level/material/LavaFluid.java b/net/minecraft/world/level/material/LavaFluid.java -index 033f252248b671e35135269dd2df6e7ca4585604..43cdc2f8fdfdeb1426e386e0084087779ef62754 100644 +index 22b18c4de4ee8eb94847c2e9df559c579cb26409..545c75cfd03a36d4e8b96a69fc8dcd893b548eeb 100644 --- a/net/minecraft/world/level/material/LavaFluid.java +++ b/net/minecraft/world/level/material/LavaFluid.java -@@ -189,7 +189,7 @@ public abstract class LavaFluid extends FlowingFluid { +@@ -190,7 +190,7 @@ public abstract class LavaFluid extends FlowingFluid { @Override public int getTickDelay(LevelReader level) { @@ -16762,7 +16804,7 @@ index 033f252248b671e35135269dd2df6e7ca4585604..43cdc2f8fdfdeb1426e386e008408777 } @Override -@@ -211,6 +211,13 @@ public abstract class LavaFluid extends FlowingFluid { +@@ -212,6 +212,13 @@ public abstract class LavaFluid extends FlowingFluid { level.levelEvent(1501, pos, 0); } @@ -16830,7 +16872,7 @@ index b19260f442fe272efed8e61d1316bf0d6ff38023..0ecc5a49de322d531c33042858f8420d private static final double SAFE_TRAVEL_MAX_VERTICAL_DELTA = 1.0; private final Direction.Axis axis; diff --git a/net/minecraft/world/level/saveddata/maps/MapItemSavedData.java b/net/minecraft/world/level/saveddata/maps/MapItemSavedData.java -index 98971a07757d29d6926a0aa05f229b8020af42b6..bf01c9d54248ceb8f97cf1e1c0e4234a338cb8ce 100644 +index af68bdde29137b2cc8d3939f54dd4639dde29add..26fab1b0bcc8c332cec9a0f133239dce4d16d8be 100644 --- a/net/minecraft/world/level/saveddata/maps/MapItemSavedData.java +++ b/net/minecraft/world/level/saveddata/maps/MapItemSavedData.java @@ -81,6 +81,7 @@ public class MapItemSavedData extends SavedData { @@ -16858,7 +16900,7 @@ index c4f29da30d63deb3f9eabafcf62a946ff148b6b7..f3083702286dfb7932f08e0b811eded7 return stack; } diff --git a/net/minecraft/world/phys/AABB.java b/net/minecraft/world/phys/AABB.java -index 84f3073444ae9e11e5d11224d6af6474ced925e2..e53398996bbb278c6e06024d8ca945b364a44c10 100644 +index f87d0bd3d65155fbc206a0dae8de67a9184436f3..9987e2e8278cd43c6c52063132670486ac189677 100644 --- a/net/minecraft/world/phys/AABB.java +++ b/net/minecraft/world/phys/AABB.java @@ -476,4 +476,10 @@ public class AABB { @@ -16874,10 +16916,10 @@ index 84f3073444ae9e11e5d11224d6af6474ced925e2..e53398996bbb278c6e06024d8ca945b3 } diff --git a/org/purpurmc/purpur/PurpurConfig.java b/org/purpurmc/purpur/PurpurConfig.java new file mode 100644 -index 0000000000000000000000000000000000000000..88f737304d4f4a774956a1cc39b5c01c37a3891d +index 0000000000000000000000000000000000000000..31bf765d2dfa75d854f7f8e55bab7792ace843ab --- /dev/null +++ b/org/purpurmc/purpur/PurpurConfig.java -@@ -0,0 +1,597 @@ +@@ -0,0 +1,623 @@ +package org.purpurmc.purpur; + +import com.google.common.base.Throwables; @@ -17110,11 +17152,21 @@ index 0000000000000000000000000000000000000000..88f737304d4f4a774956a1cc39b5c01c + deathMessageOnlyBroadcastToAffectedPlayer = getBoolean("settings.broadcasts.death.only-broadcast-to-affected-player", deathMessageOnlyBroadcastToAffectedPlayer); + } + ++ public static String serverModName = io.papermc.paper.ServerBuildInfo.buildInfo().brandName(); ++ private static void serverModName() { ++ serverModName = getString("settings.server-mod-name", serverModName); ++ } ++ + public static double laggingThreshold = 19.0D; + private static void tickLoopSettings() { + laggingThreshold = getDouble("settings.lagging-threshold", laggingThreshold); + } + ++ public static boolean useAlternateKeepAlive = false; ++ private static void useAlternateKeepAlive() { ++ useAlternateKeepAlive = getBoolean("settings.use-alternate-keepalive", useAlternateKeepAlive); ++ } ++ + public static boolean disableGiveCommandDrops = false; + private static void disableGiveCommandDrops() { + disableGiveCommandDrops = getBoolean("settings.disable-give-dropping", disableGiveCommandDrops); @@ -17348,6 +17400,20 @@ index 0000000000000000000000000000000000000000..88f737304d4f4a774956a1cc39b5c01c + beeCountPayload = getBoolean("settings.bee-count-payload", beeCountPayload); + } + ++ public static boolean loggerSuppressInitLegacyMaterialError = false; ++ public static boolean loggerSuppressIgnoredAdvancementWarnings = false; ++ public static boolean loggerSuppressUnrecognizedRecipeErrors = false; ++ public static boolean loggerSuppressSetBlockFarChunk = false; ++ public static boolean loggerSuppressLibraryLoader = false; ++ private static void loggerSettings() { ++ loggerSuppressInitLegacyMaterialError = getBoolean("settings.logger.suppress-init-legacy-material-errors", loggerSuppressInitLegacyMaterialError); ++ loggerSuppressIgnoredAdvancementWarnings = getBoolean("settings.logger.suppress-ignored-advancement-warnings", loggerSuppressIgnoredAdvancementWarnings); ++ loggerSuppressUnrecognizedRecipeErrors = getBoolean("settings.logger.suppress-unrecognized-recipe-errors", loggerSuppressUnrecognizedRecipeErrors); ++ loggerSuppressSetBlockFarChunk = getBoolean("settings.logger.suppress-setblock-in-far-chunk-errors", loggerSuppressSetBlockFarChunk); ++ loggerSuppressLibraryLoader = getBoolean("settings.logger.suppress-library-loader", loggerSuppressLibraryLoader); ++ org.bukkit.plugin.java.JavaPluginLoader.SuppressLibraryLoaderLogger = loggerSuppressLibraryLoader; ++ } ++ + public static boolean tpsCatchup = true; + private static void tpsCatchup() { + tpsCatchup = getBoolean("settings.tps-catchup", tpsCatchup); @@ -17355,9 +17421,11 @@ index 0000000000000000000000000000000000000000..88f737304d4f4a774956a1cc39b5c01c + + public static boolean useUPnP = false; + public static boolean maxJoinsPerSecond = false; ++ public static boolean kickForOutOfOrderChat = true; + private static void networkSettings() { + useUPnP = getBoolean("settings.network.upnp-port-forwarding", useUPnP); + maxJoinsPerSecond = getBoolean("settings.network.max-joins-per-second", maxJoinsPerSecond); ++ kickForOutOfOrderChat = getBoolean("settings.network.kick-for-out-of-order-chat", kickForOutOfOrderChat); + } + + public static Pattern usernameValidCharactersPattern; @@ -21130,7 +21198,7 @@ index 0000000000000000000000000000000000000000..79b8490832d2a0cc7846ddcb091cb6bc +} diff --git a/org/purpurmc/purpur/command/CreditsCommand.java b/org/purpurmc/purpur/command/CreditsCommand.java new file mode 100644 -index 0000000000000000000000000000000000000000..40d2fab4a9728ac90c36e30c130f3116b7025d11 +index 0000000000000000000000000000000000000000..87e41ddfb39dca1759966696088ecbc8c2f1f41c --- /dev/null +++ b/org/purpurmc/purpur/command/CreditsCommand.java @@ -0,0 +1,35 @@ @@ -21163,7 +21231,7 @@ index 0000000000000000000000000000000000000000..40d2fab4a9728ac90c36e30c130f3116 + for (ServerPlayer player : targets) { + ClientboundGameEventPacket packet = new ClientboundGameEventPacket(ClientboundGameEventPacket.WIN_GAME, 1F); + player.connection.send(packet); -+ String output = String.format(PurpurConfig.creditsCommandOutput, player.getGameProfile().getName()); ++ String output = String.format(PurpurConfig.creditsCommandOutput, player.getGameProfile().name()); + sender.sendSuccess(output, false); + } + return targets.size(); @@ -21171,7 +21239,7 @@ index 0000000000000000000000000000000000000000..40d2fab4a9728ac90c36e30c130f3116 +} diff --git a/org/purpurmc/purpur/command/DemoCommand.java b/org/purpurmc/purpur/command/DemoCommand.java new file mode 100644 -index 0000000000000000000000000000000000000000..235f3cd89f675b70a6152a00534608c0902f19fd +index 0000000000000000000000000000000000000000..24e987fda56593083ca3c85639606093d0b545fb --- /dev/null +++ b/org/purpurmc/purpur/command/DemoCommand.java @@ -0,0 +1,35 @@ @@ -21204,7 +21272,7 @@ index 0000000000000000000000000000000000000000..235f3cd89f675b70a6152a00534608c0 + for (ServerPlayer player : targets) { + ClientboundGameEventPacket packet = new ClientboundGameEventPacket(ClientboundGameEventPacket.DEMO_EVENT, 0); + player.connection.send(packet); -+ String output = String.format(PurpurConfig.demoCommandOutput, player.getGameProfile().getName()); ++ String output = String.format(PurpurConfig.demoCommandOutput, player.getGameProfile().name()); + sender.sendSuccess(output, false); + } + return targets.size(); @@ -21212,7 +21280,7 @@ index 0000000000000000000000000000000000000000..235f3cd89f675b70a6152a00534608c0 +} diff --git a/org/purpurmc/purpur/command/PingCommand.java b/org/purpurmc/purpur/command/PingCommand.java new file mode 100644 -index 0000000000000000000000000000000000000000..74a602c331e9581d7425a09e4094f1d646099676 +index 0000000000000000000000000000000000000000..fc400ddcbd7afdd95671c8839815890d1a7a4cb4 --- /dev/null +++ b/org/purpurmc/purpur/command/PingCommand.java @@ -0,0 +1,32 @@ @@ -21242,7 +21310,7 @@ index 0000000000000000000000000000000000000000..74a602c331e9581d7425a09e4094f1d6 + + private static int execute(CommandSourceStack sender, Collection targets) { + for (ServerPlayer player : targets) { -+ String output = String.format(PurpurConfig.pingCommandOutput, player.getGameProfile().getName(), player.connection.latency()); ++ String output = String.format(PurpurConfig.pingCommandOutput, player.getGameProfile().name(), player.connection.latency()); + sender.sendSuccess(output, false); + } + return targets.size(); @@ -21322,7 +21390,7 @@ index 0000000000000000000000000000000000000000..7163c8247c5f564c723409e4dc645ebe +} diff --git a/org/purpurmc/purpur/command/RamBarCommand.java b/org/purpurmc/purpur/command/RamBarCommand.java new file mode 100644 -index 0000000000000000000000000000000000000000..2852c07adb080c34905f5d1b19efed8ea47eecc6 +index 0000000000000000000000000000000000000000..3a3c706d5e528c138ff5a658b7ee42e22380bd61 --- /dev/null +++ b/org/purpurmc/purpur/command/RamBarCommand.java @@ -0,0 +1,44 @@ @@ -21363,7 +21431,7 @@ index 0000000000000000000000000000000000000000..2852c07adb080c34905f5d1b19efed8e + Component output = MiniMessage.miniMessage().deserialize(PurpurConfig.rambarCommandOutput, + Placeholder.component("onoff", Component.translatable(result ? "options.on" : "options.off") + .color(result ? NamedTextColor.GREEN : NamedTextColor.RED)), -+ Placeholder.parsed("target", player.getGameProfile().getName())); ++ Placeholder.parsed("target", player.getGameProfile().name())); + + sender.sendSuccess(output, false); + } @@ -21408,7 +21476,7 @@ index 0000000000000000000000000000000000000000..992f8dfc628c7485e335191e1308cdfd +} diff --git a/org/purpurmc/purpur/command/TPSBarCommand.java b/org/purpurmc/purpur/command/TPSBarCommand.java new file mode 100644 -index 0000000000000000000000000000000000000000..d8f9b044107ff7c29a83eb5378aa9f5465ba1995 +index 0000000000000000000000000000000000000000..854e6b04074fecbd54f8291d29a1c3268ce25e92 --- /dev/null +++ b/org/purpurmc/purpur/command/TPSBarCommand.java @@ -0,0 +1,44 @@ @@ -21449,7 +21517,7 @@ index 0000000000000000000000000000000000000000..d8f9b044107ff7c29a83eb5378aa9f54 + Component output = MiniMessage.miniMessage().deserialize(PurpurConfig.tpsbarCommandOutput, + Placeholder.component("onoff", Component.translatable(result ? "options.on" : "options.off") + .color(result ? NamedTextColor.GREEN : NamedTextColor.RED)), -+ Placeholder.parsed("target", player.getGameProfile().getName())); ++ Placeholder.parsed("target", player.getGameProfile().name())); + + sender.sendSuccess(output, false); + } @@ -21671,7 +21739,7 @@ index 0000000000000000000000000000000000000000..e0bbaec05afa0ae67ed486b14ea1fbad +} diff --git a/org/purpurmc/purpur/controller/LookControllerWASD.java b/org/purpurmc/purpur/controller/LookControllerWASD.java new file mode 100644 -index 0000000000000000000000000000000000000000..dd219518150ca90f89ad238904fd4095efe032d8 +index 0000000000000000000000000000000000000000..9b177a9a2b06eb238cd95ae3c6332bea3a24549b --- /dev/null +++ b/org/purpurmc/purpur/controller/LookControllerWASD.java @@ -0,0 +1,79 @@ @@ -21727,7 +21795,7 @@ index 0000000000000000000000000000000000000000..dd219518150ca90f89ad238904fd4095 + (byte) Mth.floor(entity.getXRot() * 256.0F / 360.0F), + entity.onGround + ); -+ ((ServerLevel) entity.level()).getChunkSource().broadcast(entity, entityPacket); ++ ((ServerLevel) entity.level()).getChunkSource().sendToTrackingPlayers(entity, entityPacket); + } + + public void setOffsets(float yaw, float pitch) { @@ -21913,7 +21981,7 @@ index 0000000000000000000000000000000000000000..922e48799c43ca322a8f550c98a26e1e +} diff --git a/org/purpurmc/purpur/entity/PurpurStoredBee.java b/org/purpurmc/purpur/entity/PurpurStoredBee.java new file mode 100644 -index 0000000000000000000000000000000000000000..683a98b424f170b4f819422550f3f7865abd39cf +index 0000000000000000000000000000000000000000..c468cfa59117835c7008eac71c057149aeaa7cc9 --- /dev/null +++ b/org/purpurmc/purpur/entity/PurpurStoredBee.java @@ -0,0 +1,116 @@ @@ -21956,7 +22024,7 @@ index 0000000000000000000000000000000000000000..683a98b424f170b4f819422550f3f786 + this.handle = data; + this.blockStorage = blockStorage; + -+ CompoundTag customData = handle.occupant.entityData().copyTag(); ++ CompoundTag customData = handle.occupant.entityData().copyTagWithEntityId(); + + try (ProblemReporter.ScopedCollector scopedCollector = new ProblemReporter.ScopedCollector(blockEntity.problemPath(), LOGGER)) { + ValueInput valueInput = TagValueInput.create(scopedCollector, RegistryAccess.EMPTY, customData); @@ -22025,11 +22093,11 @@ index 0000000000000000000000000000000000000000..683a98b424f170b4f819422550f3f786 + + @Override + public void update() { -+ handle.occupant.entityData().copyTag().put("BukkitValues", this.persistentDataContainer.toTagCompound()); ++ handle.occupant.entityData().copyTagWithEntityId().put("BukkitValues", this.persistentDataContainer.toTagCompound()); + if(customName == null) { -+ handle.occupant.entityData().copyTag().remove("CustomName"); ++ handle.occupant.entityData().copyTagWithEntityId().remove("CustomName"); + } else { -+ handle.occupant.entityData().copyTag().putString("CustomName", CraftChatMessage.toJSON(PaperAdventure.asVanilla(customName))); ++ handle.occupant.entityData().copyTagWithEntityId().putString("CustomName", CraftChatMessage.toJSON(PaperAdventure.asVanilla(customName))); + } + } +} diff --git a/leaf-server/minecraft-patches/features/0093-Fix-Pufferfish-and-Purpur-patches.patch b/leaf-server/minecraft-patches/features/0091-Fix-Pufferfish-and-Purpur-patches.patch similarity index 62% rename from leaf-server/minecraft-patches/features/0093-Fix-Pufferfish-and-Purpur-patches.patch rename to leaf-server/minecraft-patches/features/0091-Fix-Pufferfish-and-Purpur-patches.patch index 27c56437..6a30fd80 100644 --- a/leaf-server/minecraft-patches/features/0093-Fix-Pufferfish-and-Purpur-patches.patch +++ b/leaf-server/minecraft-patches/features/0091-Fix-Pufferfish-and-Purpur-patches.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Fix Pufferfish and Purpur patches diff --git a/net/minecraft/server/MinecraftServer.java b/net/minecraft/server/MinecraftServer.java -index 808f3adbae68cbd9863bfd8fa1d9592cae6b9ddf..b1245f93c915da28d245e6b5c6904166742211fa 100644 +index d1bac0988a41950cce8ffc5025bb1400a13f9b05..38857fd9d428ea0a022b1956bbcc8f3175d11cfe 100644 --- a/net/minecraft/server/MinecraftServer.java +++ b/net/minecraft/server/MinecraftServer.java -@@ -277,7 +277,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop pluginsBlockingSleep = new java.util.HashSet<>(); // Paper - API to allow/disallow tick sleeping public static final long SERVER_INIT = System.nanoTime(); // Paper - Lag compensation @@ -26,7 +26,7 @@ index 808f3adbae68cbd9863bfd8fa1d9592cae6b9ddf..b1245f93c915da28d245e6b5c6904166 public boolean lagging = false; // Purpur - Lagging threshold protected boolean upnp = false; // Purpur - UPnP Port Forwarding -@@ -1243,9 +1243,12 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop byteAllowed) { @@ -78,10 +69,10 @@ index 2c7f35ec3276f420875cf52596ada42b25fe64c8..a0941c15a9391f85af9fcb3784c66514 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; diff --git a/net/minecraft/world/entity/Entity.java b/net/minecraft/world/entity/Entity.java -index 30fc1634e6d3f40636d2aff7397d22e96526d36f..514d9eff053c59069a24a982d5fb0b619e532a4c 100644 +index e5227d2d5e79e9881ed80c38269463ad6a626319..5b11ba3e001252c702122ebedb251df4ae1f1625 100644 --- a/net/minecraft/world/entity/Entity.java +++ b/net/minecraft/world/entity/Entity.java -@@ -543,23 +543,36 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess +@@ -545,23 +545,36 @@ public abstract class Entity implements SyncedDataHolder, DebugValueSource, Name } // Purpur end - Add canSaveToDisk to Entity @@ -92,7 +83,7 @@ index 30fc1634e6d3f40636d2aff7397d22e96526d36f..514d9eff053c59069a24a982d5fb0b61 + // Gale end - JettPack - optimize sun burn tick - cache eye blockpos // Purpur start - copied from Mob - API for any mob to burn daylight public boolean isSunBurnTick() { - if (this.level().isBrightOutside() && !this.level().isClientSide) { + if (this.level().isBrightOutside() && !this.level().isClientSide()) { - float lightLevelDependentMagicValue = this.getLightLevelDependentMagicValue(); - BlockPos blockPos = BlockPos.containing(this.getX(), this.getEyeY(), this.getZ()); - boolean flag = this.isInWaterOrRain() || this.isInPowderSnow || this.wasInPowderSnow; @@ -128,10 +119,10 @@ index 30fc1634e6d3f40636d2aff7397d22e96526d36f..514d9eff053c59069a24a982d5fb0b61 public Entity(EntityType entityType, Level level) { this.type = entityType; diff --git a/net/minecraft/world/entity/LivingEntity.java b/net/minecraft/world/entity/LivingEntity.java -index fa5010a42970741b930fddedf11527216c8f9173..5aa749c46b0b84dfe1584788617e0f184e850239 100644 +index fc4e9a5ac773a9615fa8290a22cd5f456c68e6af..49b70d4faa6ad188d04dda696ca27eef0eed09a2 100644 --- a/net/minecraft/world/entity/LivingEntity.java +++ b/net/minecraft/world/entity/LivingEntity.java -@@ -1049,13 +1049,13 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin +@@ -1055,13 +1055,13 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin // Gale start - Petal - reduce skull ItemStack lookups for reduced visibility EntityType type = lookingEntity.getType(); // Purpur start - Mob head visibility percent @@ -150,10 +141,10 @@ index fa5010a42970741b930fddedf11527216c8f9173..5aa749c46b0b84dfe1584788617e0f18 } // Purpur end - Mob head visibility percent diff --git a/net/minecraft/world/entity/Mob.java b/net/minecraft/world/entity/Mob.java -index 706bdb81f831ee79afb8c32feba1a13bdac59c66..26db3eb9dfc3d9c0c7efa4cf25827f15c37a7775 100644 +index 0577527e2a38832d6ad2ee2ef03a8a2669574c2e..6078341135b093d30739e3469b4a2d67ba052ae2 100644 --- a/net/minecraft/world/entity/Mob.java +++ b/net/minecraft/world/entity/Mob.java -@@ -1538,10 +1538,6 @@ public abstract class Mob extends LivingEntity implements EquipmentUser, Leashab +@@ -1557,10 +1557,6 @@ public abstract class Mob extends LivingEntity implements EquipmentUser, Leashab protected void playAttackSound() { } @@ -194,109 +185,11 @@ index 60ec389615cfcad388ed37b8d3ee04e87db36755..34fe1d3bd6603225f84ab18794bbb118 ResourceKey resourceKey = level.dimension(); BlockPos blockPos = entity.blockPosition(); List list = Lists.newArrayList(); -diff --git a/net/minecraft/world/entity/animal/allay/Allay.java b/net/minecraft/world/entity/animal/allay/Allay.java -index 7127d8e5fff81be017f0aa04606cb8404ad7b2fd..a25976d6f0dec86b88017cd5f86f3b51c8d7444b 100644 ---- a/net/minecraft/world/entity/animal/allay/Allay.java -+++ b/net/minecraft/world/entity/animal/allay/Allay.java -@@ -268,8 +268,7 @@ public class Allay extends PathfinderMob implements InventoryCarrier, VibrationS - private int behaviorTick = 0; // Pufferfish - @Override - protected void customServerAiStep(ServerLevel level) { -- //if ((getRider() == null || !this.isControllable()) && this.behaviorTick++ % this.activatedPriority == 0) // Pufferfish // Purpur - only use brain if no rider -- if (this.behaviorTick++ % this.activatedPriority == 0) // Pufferfish -+ if ((getRider() == null || !this.isControllable()) && this.behaviorTick++ % this.activatedPriority == 0) // Pufferfish // Purpur - only use brain if no rider // Leaf - Fix Pufferfish and Purpur patches - this.getBrain().tick(level, this); - AllayAi.updateActivity(this); - super.customServerAiStep(level); -diff --git a/net/minecraft/world/entity/animal/axolotl/Axolotl.java b/net/minecraft/world/entity/animal/axolotl/Axolotl.java -index 02db38fa315ecb9d5bdba74848012710106b662e..2cdf2fb60d4d3642f0870944be9bd5abafa9e817 100644 ---- a/net/minecraft/world/entity/animal/axolotl/Axolotl.java -+++ b/net/minecraft/world/entity/animal/axolotl/Axolotl.java -@@ -374,8 +374,7 @@ public class Axolotl extends Animal implements Bucketable { - private int behaviorTick = 0; // Pufferfish - @Override - protected void customServerAiStep(ServerLevel level) { -- //if ((getRider() == null || !this.isControllable()) && this.behaviorTick++ % this.activatedPriority == 0) // Pufferfish // Purpur - only use brain if no rider -- if (this.behaviorTick++ % this.activatedPriority == 0) // Pufferfish -+ if ((getRider() == null || !this.isControllable()) && this.behaviorTick++ % this.activatedPriority == 0) // Pufferfish // Purpur - only use brain if no rider // Leaf - Fix Pufferfish and Purpur patches - this.getBrain().tick(level, this); - AxolotlAi.updateActivity(this); - if (!this.isNoAi()) { -diff --git a/net/minecraft/world/entity/animal/frog/Frog.java b/net/minecraft/world/entity/animal/frog/Frog.java -index c4db078db0b7bb2bd8f6757a8bd13d60a7a4fa14..a7e9179c287671a689cb5ce668b5a33896da87a4 100644 ---- a/net/minecraft/world/entity/animal/frog/Frog.java -+++ b/net/minecraft/world/entity/animal/frog/Frog.java -@@ -260,8 +260,7 @@ public class Frog extends Animal { - private int behaviorTick = 0; // Pufferfish - @Override - protected void customServerAiStep(ServerLevel level) { -- //if ((getRider() == null || !this.isControllable()) && this.behaviorTick++ % this.activatedPriority == 0) // Pufferfish // Purpur - only use brain if no rider -- if (this.behaviorTick++ % this.activatedPriority == 0) // Pufferfish -+ if ((getRider() == null || !this.isControllable()) && this.behaviorTick++ % this.activatedPriority == 0) // Pufferfish // Purpur - only use brain if no rider // Leaf - Fix Pufferfish and Purpur patches - this.getBrain().tick(level, this); - FrogAi.updateActivity(this); - super.customServerAiStep(level); -diff --git a/net/minecraft/world/entity/animal/frog/Tadpole.java b/net/minecraft/world/entity/animal/frog/Tadpole.java -index a3858465569c40fcfc7c8c4c4735335ac83cb078..5abdf4253f1d0a6f35d8e05f7a0a2b4100083f76 100644 ---- a/net/minecraft/world/entity/animal/frog/Tadpole.java -+++ b/net/minecraft/world/entity/animal/frog/Tadpole.java -@@ -136,8 +136,7 @@ public class Tadpole extends AbstractFish { - private int behaviorTick = 0; // Pufferfish - @Override - protected void customServerAiStep(ServerLevel level) { -- //if ((getRider() == null || !this.isControllable()) && this.behaviorTick++ % this.activatedPriority == 0) // Pufferfish // Purpur - only use brain if no rider -- if (this.behaviorTick++ % this.activatedPriority == 0) // Pufferfish -+ if ((getRider() == null || !this.isControllable()) && this.behaviorTick++ % this.activatedPriority == 0) // Pufferfish // Purpur - only use brain if no rider // Leaf - Fix Pufferfish and Purpur patches - this.getBrain().tick(level, this); - TadpoleAi.updateActivity(this); - super.customServerAiStep(level); -diff --git a/net/minecraft/world/entity/animal/goat/Goat.java b/net/minecraft/world/entity/animal/goat/Goat.java -index 11b020704a673c69bd2d4ab6313ea32e8e97cc23..c608c71eb601c169f543823c5c342b8928b9cf50 100644 ---- a/net/minecraft/world/entity/animal/goat/Goat.java -+++ b/net/minecraft/world/entity/animal/goat/Goat.java -@@ -227,8 +227,7 @@ public class Goat extends Animal { - private int behaviorTick = 0; // Pufferfish - @Override - protected void customServerAiStep(ServerLevel level) { -- //if ((getRider() == null || !this.isControllable()) && this.behaviorTick++ % this.activatedPriority == 0) // Pufferfish // Purpur - only use brain if no rider -- if (this.behaviorTick++ % this.activatedPriority == 0) // Pufferfish -+ if ((getRider() == null || !this.isControllable()) && this.behaviorTick++ % this.activatedPriority == 0) // Pufferfish // Purpur - only use brain if no rider // Leaf - Fix Pufferfish and Purpur patches - this.getBrain().tick(level, this); - GoatAi.updateActivity(this); - super.customServerAiStep(level); -diff --git a/net/minecraft/world/entity/monster/hoglin/Hoglin.java b/net/minecraft/world/entity/monster/hoglin/Hoglin.java -index 3c126b1610718a407c16775a935b295ecbaab533..8c9f240badf5a678ee4e1815e010a204f8704f4e 100644 ---- a/net/minecraft/world/entity/monster/hoglin/Hoglin.java -+++ b/net/minecraft/world/entity/monster/hoglin/Hoglin.java -@@ -207,8 +207,7 @@ public class Hoglin extends Animal implements Enemy, HoglinBase { - private int behaviorTick; // Pufferfish - @Override - protected void customServerAiStep(ServerLevel level) { -- //if ((getRider() == null || !this.isControllable()) && this.behaviorTick++ % this.activatedPriority == 0) // Pufferfish // Purpur - only use brain if no rider -- if (this.behaviorTick++ % this.activatedPriority == 0) // Pufferfish -+ if ((getRider() == null || !this.isControllable()) && this.behaviorTick++ % this.activatedPriority == 0) // Pufferfish // Purpur - only use brain if no rider // Leaf - Fix Pufferfish and Purpur patches - this.getBrain().tick(level, this); - HoglinAi.updateActivity(this); - if (this.isConverting()) { -diff --git a/net/minecraft/world/entity/monster/piglin/Piglin.java b/net/minecraft/world/entity/monster/piglin/Piglin.java -index fb58af763cf75c80703360a5c668168775b1458c..e442784741f1d0b4892284b6811343f954b50182 100644 ---- a/net/minecraft/world/entity/monster/piglin/Piglin.java -+++ b/net/minecraft/world/entity/monster/piglin/Piglin.java -@@ -358,8 +358,7 @@ public class Piglin extends AbstractPiglin implements CrossbowAttackMob, Invento - private int behaviorTick; // Pufferfish - @Override - protected void customServerAiStep(ServerLevel level) { -- //if ((getRider() == null || !this.isControllable()) && this.behaviorTick++ % this.activatedPriority == 0) // Pufferfish // Purpur - only use brain if no rider -- if (this.behaviorTick++ % this.activatedPriority == 0) // Pufferfish -+ if ((getRider() == null || !this.isControllable()) && this.behaviorTick++ % this.activatedPriority == 0) // Pufferfish // Purpur - only use brain if no rider // Leaf - Fix Pufferfish and Purpur patches - this.getBrain().tick(level, this); - PiglinAi.updateActivity(this); - super.customServerAiStep(level); diff --git a/net/minecraft/world/entity/projectile/Projectile.java b/net/minecraft/world/entity/projectile/Projectile.java -index 5daa37fc0e44d3c4f3755ec3d3d89213f6670de1..c98a15653e388e7d8301ac4f6baa11095b7b18cc 100644 +index 3f18643af705864d3e7b18dc44d2c6dfa81a29fd..c32a641e99083362987578f481ba5ef2c05f3059 100644 --- a/net/minecraft/world/entity/projectile/Projectile.java +++ b/net/minecraft/world/entity/projectile/Projectile.java -@@ -82,7 +82,7 @@ public abstract class Projectile extends Entity implements TraceableEntity { +@@ -83,7 +83,7 @@ public abstract class Projectile extends Entity implements TraceableEntity { if (maxChunkLoadsPerProjectile >= 0 && this.chunksLoadedByProjectile >= maxChunkLoadsPerProjectile) { if (maxProjectileChunkLoadsConfig.perProjectile.removeFromWorldAfterReachLimit) { @@ -306,7 +199,7 @@ index 5daa37fc0e44d3c4f3755ec3d3d89213f6670de1..c98a15653e388e7d8301ac4f6baa1109 this.setDeltaMovement(0, this.getDeltaMovement().y, 0); } diff --git a/net/minecraft/world/food/FoodProperties.java b/net/minecraft/world/food/FoodProperties.java -index 20f702c8266eb54a8835861188eb937f4732e078..b6a1b7e8546402ae7640a45878c074439edeace0 100644 +index 20f702c8266eb54a8835861188eb937f4732e078..5951b6f860cf3cda35f2d79d4c38ff7f253382fe 100644 --- a/net/minecraft/world/food/FoodProperties.java +++ b/net/minecraft/world/food/FoodProperties.java @@ -43,9 +43,15 @@ public record FoodProperties(int nutrition, float saturation, boolean canAlwaysE diff --git a/leaf-server/minecraft-patches/features/0094-Purpur-Configurable-server-mod-name.patch b/leaf-server/minecraft-patches/features/0092-Purpur-Configurable-server-mod-name.patch similarity index 84% rename from leaf-server/minecraft-patches/features/0094-Purpur-Configurable-server-mod-name.patch rename to leaf-server/minecraft-patches/features/0092-Purpur-Configurable-server-mod-name.patch index 0e8dce53..ecd4bcb2 100644 --- a/leaf-server/minecraft-patches/features/0094-Purpur-Configurable-server-mod-name.patch +++ b/leaf-server/minecraft-patches/features/0092-Purpur-Configurable-server-mod-name.patch @@ -7,10 +7,10 @@ Original license: MIT Original project: https://github.com/PurpurMC/Purpur diff --git a/net/minecraft/server/MinecraftServer.java b/net/minecraft/server/MinecraftServer.java -index b1245f93c915da28d245e6b5c6904166742211fa..7d301ae8d024608d294738f4a967a9b752f91e8a 100644 +index 38857fd9d428ea0a022b1956bbcc8f3175d11cfe..8db746c169642995fa902c435f25a4b20ca1550a 100644 --- a/net/minecraft/server/MinecraftServer.java +++ b/net/minecraft/server/MinecraftServer.java -@@ -1841,7 +1841,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop lookupGameProfile(GameProfileRepository profileRepo, String name) { -- if (!StringUtil.isValidPlayerName(name)) { -+ if (!StringUtil.isValidPlayerName(name, false)) { // Leaf start - Remove vanilla username check - Directly return, skip unnecessary following logic - return createUnknownProfile(name); + private Optional lookupGameProfile(GameProfileRepository profileRepository, String username) { +- if (!StringUtil.isValidPlayerName(username)) { ++ if (!StringUtil.isValidPlayerName(username, false)) { // Leaf start - Remove vanilla username check - Directly return, skip unnecessary following logic + return this.createUnknownProfile(username); } else { - final boolean shouldLookup = !org.apache.commons.lang3.StringUtils.isBlank(name) // Paper - Don't lookup a profile with a blank name + final boolean shouldLookup = !org.apache.commons.lang3.StringUtils.isBlank(username) // Paper - Don't lookup a profile with a blank name diff --git a/net/minecraft/util/StringUtil.java b/net/minecraft/util/StringUtil.java -index c3a99fe7b49858bc0ca9a7f800b0db40465f6901..863c62f076723a4c71a1d07bdc9cc8f9f1739886 100644 +index e476eb587179463d515aafc2faef057721de11f4..3cd5c6bd0f2623c71c3274d53c8e97c17ab71fb7 100644 --- a/net/minecraft/util/StringUtil.java +++ b/net/minecraft/util/StringUtil.java @@ -64,6 +64,12 @@ public class StringUtil { diff --git a/leaf-server/minecraft-patches/features/0097-Remove-Spigot-check-for-broken-BungeeCord-configurat.patch b/leaf-server/minecraft-patches/features/0095-Remove-Spigot-check-for-broken-BungeeCord-configurat.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0097-Remove-Spigot-check-for-broken-BungeeCord-configurat.patch rename to leaf-server/minecraft-patches/features/0095-Remove-Spigot-check-for-broken-BungeeCord-configurat.patch diff --git a/leaf-server/minecraft-patches/features/0098-Remove-UseItemOnPacket-Too-Far-check.patch b/leaf-server/minecraft-patches/features/0096-Remove-UseItemOnPacket-Too-Far-check.patch similarity index 91% rename from leaf-server/minecraft-patches/features/0098-Remove-UseItemOnPacket-Too-Far-check.patch rename to leaf-server/minecraft-patches/features/0096-Remove-UseItemOnPacket-Too-Far-check.patch index 36e0fc1d..b0dc9470 100644 --- a/leaf-server/minecraft-patches/features/0098-Remove-UseItemOnPacket-Too-Far-check.patch +++ b/leaf-server/minecraft-patches/features/0096-Remove-UseItemOnPacket-Too-Far-check.patch @@ -7,10 +7,10 @@ This Check is added in 1.17.x -> 1.18.x that updated by Mojang. By removing this check, it gives ability for hackers to use some modules of hack clients. diff --git a/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/net/minecraft/server/network/ServerGamePacketListenerImpl.java -index a0941c15a9391f85af9fcb3784c66514b314f4dc..f20cb459f83f870e1c04ed1d83eee885619dfe57 100644 +index 89e6e9aa1495fc363859501e22e5b09930908d67..ddc83171df2ad00f6714bd4c0e4ee459ebba852b 100644 --- a/net/minecraft/server/network/ServerGamePacketListenerImpl.java +++ b/net/minecraft/server/network/ServerGamePacketListenerImpl.java -@@ -2122,8 +2122,13 @@ public class ServerGamePacketListenerImpl +@@ -2129,8 +2129,13 @@ public class ServerGamePacketListenerImpl BlockPos blockPos = hitResult.getBlockPos(); if (this.player.canInteractWithBlock(blockPos, 1.0)) { Vec3 vec3 = location.subtract(Vec3.atCenterOf(blockPos)); diff --git a/leaf-server/minecraft-patches/features/0099-Remove-change-non-editable-sign-warning.patch b/leaf-server/minecraft-patches/features/0097-Remove-change-non-editable-sign-warning.patch similarity index 82% rename from leaf-server/minecraft-patches/features/0099-Remove-change-non-editable-sign-warning.patch rename to leaf-server/minecraft-patches/features/0097-Remove-change-non-editable-sign-warning.patch index c8c31ce3..14a228a8 100644 --- a/leaf-server/minecraft-patches/features/0099-Remove-change-non-editable-sign-warning.patch +++ b/leaf-server/minecraft-patches/features/0097-Remove-change-non-editable-sign-warning.patch @@ -5,15 +5,15 @@ Subject: [PATCH] Remove change non-editable sign warning diff --git a/net/minecraft/world/level/block/entity/SignBlockEntity.java b/net/minecraft/world/level/block/entity/SignBlockEntity.java -index 2e0b2b55031343e32b4972c0f0017e950d56652d..3b73a8af99e398642e9603593369420c4ca8eb77 100644 +index 95d922a5eeb4d7d09f418a0400ead29ede11943d..b18e1cc9e80dd8c09b864345f99b037c8942d9a3 100644 --- a/net/minecraft/world/level/block/entity/SignBlockEntity.java +++ b/net/minecraft/world/level/block/entity/SignBlockEntity.java @@ -137,7 +137,7 @@ public class SignBlockEntity extends BlockEntity { this.setAllowedPlayerEditor(null); this.level.sendBlockUpdated(this.getBlockPos(), this.getBlockState(), this.getBlockState(), 3); } else { -- LOGGER.warn("Player {} just tried to change non-editable sign", player.getName().getString()); -+ if (!org.dreeam.leaf.config.modules.misc.RemoveChangeNonEditableSignWarning.enabled) LOGGER.warn("Player {} just tried to change non-editable sign", player.getName().getString()); // Leaf - Remove change non-editable sign warning +- LOGGER.warn("Player {} just tried to change non-editable sign", player.getPlainTextName()); ++ if (!org.dreeam.leaf.config.modules.misc.RemoveChangeNonEditableSignWarning.enabled) LOGGER.warn("Player {} just tried to change non-editable sign", player.getPlainTextName()); // Leaf - Remove change non-editable sign warning if (player.distanceToSqr(this.getBlockPos().getX(), this.getBlockPos().getY(), this.getBlockPos().getZ()) < Mth.square(32)) // Paper - Don't send far away sign update ((net.minecraft.server.level.ServerPlayer) player).connection.send(this.getUpdatePacket()); // CraftBukkit } diff --git a/leaf-server/minecraft-patches/features/0100-KeYi-Add-an-option-for-spigot-item-merging-mechanism.patch b/leaf-server/minecraft-patches/features/0098-KeYi-Add-an-option-for-spigot-item-merging-mechanism.patch similarity index 87% rename from leaf-server/minecraft-patches/features/0100-KeYi-Add-an-option-for-spigot-item-merging-mechanism.patch rename to leaf-server/minecraft-patches/features/0098-KeYi-Add-an-option-for-spigot-item-merging-mechanism.patch index 6be9edf2..8bb404c1 100644 --- a/leaf-server/minecraft-patches/features/0100-KeYi-Add-an-option-for-spigot-item-merging-mechanism.patch +++ b/leaf-server/minecraft-patches/features/0098-KeYi-Add-an-option-for-spigot-item-merging-mechanism.patch @@ -7,10 +7,10 @@ Original license: MIT Original project: https://github.com/KeYiMC/KeYi diff --git a/net/minecraft/world/entity/item/ItemEntity.java b/net/minecraft/world/entity/item/ItemEntity.java -index 7dc97fccfd329253e0f6532d1cc2c06264674e15..605de72224f6baa112dbfd2c83fd7a1ceba6a540 100644 +index e6a77ef040f2b10eb14bc038b34f4c23c0da6fb4..847b21a29415084b8d25a0ab65779854dbfff806 100644 --- a/net/minecraft/world/entity/item/ItemEntity.java +++ b/net/minecraft/world/entity/item/ItemEntity.java -@@ -320,7 +320,7 @@ public class ItemEntity extends Entity implements TraceableEntity { +@@ -311,7 +311,7 @@ public class ItemEntity extends Entity implements TraceableEntity { ItemStack item = this.getItem(); ItemStack item1 = itemEntity.getItem(); if (Objects.equals(this.target, itemEntity.target) && areMergable(item, item1)) { diff --git a/leaf-server/minecraft-patches/features/0101-Carpet-Fixes-Optimized-getBiome-method.patch b/leaf-server/minecraft-patches/features/0099-Carpet-Fixes-Optimized-getBiome-method.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0101-Carpet-Fixes-Optimized-getBiome-method.patch rename to leaf-server/minecraft-patches/features/0099-Carpet-Fixes-Optimized-getBiome-method.patch diff --git a/leaf-server/minecraft-patches/features/0102-Carpet-Fixes-Use-optimized-RecipeManager.patch b/leaf-server/minecraft-patches/features/0100-Carpet-Fixes-Use-optimized-RecipeManager.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0102-Carpet-Fixes-Use-optimized-RecipeManager.patch rename to leaf-server/minecraft-patches/features/0100-Carpet-Fixes-Use-optimized-RecipeManager.patch diff --git a/leaf-server/minecraft-patches/features/0103-Akarin-Save-Json-list-asynchronously.patch b/leaf-server/minecraft-patches/features/0101-Akarin-Save-Json-list-asynchronously.patch similarity index 89% rename from leaf-server/minecraft-patches/features/0103-Akarin-Save-Json-list-asynchronously.patch rename to leaf-server/minecraft-patches/features/0101-Akarin-Save-Json-list-asynchronously.patch index e84fe00b..2ccdd4e3 100644 --- a/leaf-server/minecraft-patches/features/0103-Akarin-Save-Json-list-asynchronously.patch +++ b/leaf-server/minecraft-patches/features/0101-Akarin-Save-Json-list-asynchronously.patch @@ -8,10 +8,10 @@ Original license: GPL v3 Original project: https://github.com/Akarin-project/Akarin diff --git a/net/minecraft/server/players/StoredUserList.java b/net/minecraft/server/players/StoredUserList.java -index 39483f7b453d6faedeccc1ab1eda76669395ea5a..1fe9be5381b43d240593c8394977d7ffccd1132b 100644 +index 4488de18871e412556976048a0d2982fb75d91e1..3de521aa74d24a14e68712d9c4ce6b94c2057363 100644 --- a/net/minecraft/server/players/StoredUserList.java +++ b/net/minecraft/server/players/StoredUserList.java -@@ -97,13 +97,23 @@ public abstract class StoredUserList> { +@@ -124,13 +124,23 @@ public abstract class StoredUserList> { } public void save() throws IOException { diff --git a/leaf-server/minecraft-patches/features/0104-Slice-Smooth-Teleports.patch b/leaf-server/minecraft-patches/features/0102-Slice-Smooth-Teleports.patch similarity index 82% rename from leaf-server/minecraft-patches/features/0104-Slice-Smooth-Teleports.patch rename to leaf-server/minecraft-patches/features/0102-Slice-Smooth-Teleports.patch index de0fa881..43dcacb7 100644 --- a/leaf-server/minecraft-patches/features/0104-Slice-Smooth-Teleports.patch +++ b/leaf-server/minecraft-patches/features/0102-Slice-Smooth-Teleports.patch @@ -9,10 +9,10 @@ Original project: https://github.com/Cryptite/Slice Co-authored-by: HaHaWTH <102713261+HaHaWTH@users.noreply.github.com> diff --git a/net/minecraft/server/level/ServerPlayer.java b/net/minecraft/server/level/ServerPlayer.java -index fb585637383db4592f97f0c9040ffa86afb43c6a..880bf83929e636872eeb53c5c3ec9357972267db 100644 +index d64e9d540ca62ca72bca8651bccfbc2f9b002c4d..14fd49dbf0b01bea6db18c8dc21669b4e3df6efd 100644 --- a/net/minecraft/server/level/ServerPlayer.java +++ b/net/minecraft/server/level/ServerPlayer.java -@@ -431,6 +431,7 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc +@@ -445,6 +445,7 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc private boolean tpsBar = false; // Purpur - Implement TPSBar private boolean compassBar = false; // Purpur - Add compass command private boolean ramBar = false; // Purpur - Implement rambar commands @@ -21,10 +21,10 @@ index fb585637383db4592f97f0c9040ffa86afb43c6a..880bf83929e636872eeb53c5c3ec9357 // Paper start - rewrite chunk system private ca.spottedleaf.moonrise.patches.chunk_system.player.RegionizedPlayerChunkLoader.PlayerChunkLoaderData chunkLoader; diff --git a/net/minecraft/server/players/PlayerList.java b/net/minecraft/server/players/PlayerList.java -index 6396083993d248683b887774d2db3f3f03825033..c315655501aa79333c4a1c5b58382f186df5f7a1 100644 +index 017da769b43c4c54b082ee71d437fb1a46a45c6f..74ec0aa016b614812ea856700b6f9d7c9222edbe 100644 --- a/net/minecraft/server/players/PlayerList.java +++ b/net/minecraft/server/players/PlayerList.java -@@ -759,11 +759,11 @@ public abstract class PlayerList { +@@ -669,11 +669,11 @@ public abstract class PlayerList { byte b = (byte)(keepInventory ? 1 : 0); ServerLevel serverLevel = serverPlayer.level(); LevelData levelData = serverLevel.getLevelData(); @@ -33,12 +33,12 @@ index 6396083993d248683b887774d2db3f3f03825033..c315655501aa79333c4a1c5b58382f18 // serverPlayer.connection.teleport(serverPlayer.getX(), serverPlayer.getY(), serverPlayer.getZ(), serverPlayer.getYRot(), serverPlayer.getXRot()); serverPlayer.connection.send(new ClientboundSetChunkCacheRadiusPacket(serverLevel.spigotConfig.viewDistance)); // Spigot serverPlayer.connection.send(new ClientboundSetSimulationDistancePacket(serverLevel.spigotConfig.simulationDistance)); // Spigot -- serverPlayer.connection.teleport(org.bukkit.craftbukkit.util.CraftLocation.toBukkit(serverPlayer.position(), serverLevel.getWorld(), serverPlayer.getYRot(), serverPlayer.getXRot())); // CraftBukkit -+ if (!serverPlayer.smoothWorldTeleport || !isSameLogicalHeight((ServerLevel) fromWorld, level)) serverPlayer.connection.teleport(org.bukkit.craftbukkit.util.CraftLocation.toBukkit(serverPlayer.position(), serverLevel.getWorld(), serverPlayer.getYRot(), serverPlayer.getXRot())); // CraftBukkit // Leaf - Slice - serverPlayer.connection.send(new ClientboundSetDefaultSpawnPositionPacket(level.getSharedSpawnPos(), level.getSharedSpawnAngle())); +- serverPlayer.connection.teleport(org.bukkit.craftbukkit.util.CraftLocation.toBukkit(serverPlayer.position(), serverLevel, serverPlayer.getYRot(), serverPlayer.getXRot())); // CraftBukkit ++ if (!serverPlayer.smoothWorldTeleport || !isSameLogicalHeight((ServerLevel) fromWorld, level)) serverPlayer.connection.teleport(org.bukkit.craftbukkit.util.CraftLocation.toBukkit(serverPlayer.position(), serverLevel, serverPlayer.getYRot(), serverPlayer.getXRot())); // CraftBukkit // Leaf - Slice + serverPlayer.connection.send(new ClientboundSetDefaultSpawnPositionPacket(level.getRespawnData())); serverPlayer.connection.send(new ClientboundChangeDifficultyPacket(levelData.getDifficulty(), levelData.isDifficultyLocked())); serverPlayer.connection -@@ -851,6 +851,8 @@ public abstract class PlayerList { +@@ -762,6 +762,8 @@ public abstract class PlayerList { return serverPlayer; } diff --git a/leaf-server/minecraft-patches/features/0105-Parchment-Make-FixLight-use-action-bar.patch b/leaf-server/minecraft-patches/features/0103-Parchment-Make-FixLight-use-action-bar.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0105-Parchment-Make-FixLight-use-action-bar.patch rename to leaf-server/minecraft-patches/features/0103-Parchment-Make-FixLight-use-action-bar.patch diff --git a/leaf-server/minecraft-patches/features/0111-Petal-Async-Pathfinding.patch b/leaf-server/minecraft-patches/features/0104-Petal-Async-Pathfinding.patch similarity index 92% rename from leaf-server/minecraft-patches/features/0111-Petal-Async-Pathfinding.patch rename to leaf-server/minecraft-patches/features/0104-Petal-Async-Pathfinding.patch index cf4d5ad4..5d516ebf 100644 --- a/leaf-server/minecraft-patches/features/0111-Petal-Async-Pathfinding.patch +++ b/leaf-server/minecraft-patches/features/0104-Petal-Async-Pathfinding.patch @@ -19,10 +19,10 @@ This patch was ported downstream from the Petal fork. Makes most pathfinding-related work happen asynchronously diff --git a/net/minecraft/world/entity/Mob.java b/net/minecraft/world/entity/Mob.java -index 26db3eb9dfc3d9c0c7efa4cf25827f15c37a7775..e5a93f7256d904a3401a68ca8ad5962d92ed67f3 100644 +index 6078341135b093d30739e3469b4a2d67ba052ae2..4b2fbe7752cb249555fef7097d6b8e94c3210a75 100644 --- a/net/minecraft/world/entity/Mob.java +++ b/net/minecraft/world/entity/Mob.java -@@ -245,6 +245,7 @@ public abstract class Mob extends LivingEntity implements EquipmentUser, Leashab +@@ -255,6 +255,7 @@ public abstract class Mob extends LivingEntity implements EquipmentUser, Leashab @Nullable @Override public LivingEntity getTarget() { @@ -31,10 +31,10 @@ index 26db3eb9dfc3d9c0c7efa4cf25827f15c37a7775..e5a93f7256d904a3401a68ca8ad5962d } diff --git a/net/minecraft/world/entity/ai/behavior/AcquirePoi.java b/net/minecraft/world/entity/ai/behavior/AcquirePoi.java -index b0ca555cc3b565a8be8d01fe10b139ed27a2a2c3..3dac0c3b52bb979d402924ce3a8bae3e26a3c151 100644 +index 21046cde1bd1ede8e7851eb4ea414e33628aa4a9..09725627a75b1f19e54ecc22cc1a54405b776eb2 100644 --- a/net/minecraft/world/entity/ai/behavior/AcquirePoi.java +++ b/net/minecraft/world/entity/ai/behavior/AcquirePoi.java -@@ -94,21 +94,20 @@ public class AcquirePoi { +@@ -93,21 +93,20 @@ public class AcquirePoi { } } // Paper end - optimise POI access @@ -46,16 +46,17 @@ index b0ca555cc3b565a8be8d01fe10b139ed27a2a2c3..3dac0c3b52bb979d402924ce3a8bae3e - memoryAccessor.set(GlobalPos.of(level.dimension(), target)); - entityEventId.ifPresent(id -> level.broadcastEntityEvent(mob, id)); - map.clear(); -- DebugPackets.sendPoiTicketCountPacket(level, target); +- level.debugSynchronizers().updatePoi(target); +- }); + // Kaiiju start - petal - Async path processing + if (org.dreeam.leaf.config.modules.async.AsyncPathfinding.enabled) { + // await on path async + Path possiblePath = findPathToPois(mob, set); + + // wait on the path to be processed -+ org.dreeam.leaf.async.path.AsyncPathProcessor.awaitProcessing(possiblePath, path -> { -+ processPath(acquirablePois, entityEventId, map, memoryAccessor, level, mob, time, poiManager, set, path); - }); ++ org.dreeam.leaf.async.path.AsyncPathProcessor.awaitProcessing(possiblePath, path -> ++ processPath(acquirablePois, entityEventId, map, memoryAccessor, level, mob, time, poiManager, set, path) ++ ); } else { - for (Pair, BlockPos> pair : set) { - map.computeIfAbsent(pair.getSecond().asLong(), l -> new AcquirePoi.JitteredLinearRetry(level.random, time)); @@ -67,7 +68,7 @@ index b0ca555cc3b565a8be8d01fe10b139ed27a2a2c3..3dac0c3b52bb979d402924ce3a8bae3e return true; } -@@ -120,6 +119,34 @@ public class AcquirePoi { +@@ -119,6 +118,34 @@ public class AcquirePoi { : BehaviorBuilder.create(instance -> instance.group(instance.absent(existingAbsentMemory)).apply(instance, memoryAccessor -> oneShot)); } @@ -89,7 +90,7 @@ index b0ca555cc3b565a8be8d01fe10b139ed27a2a2c3..3dac0c3b52bb979d402924ce3a8bae3e + memoryAccessor.set(GlobalPos.of(level.dimension(), target)); + entityEventId.ifPresent(id -> level.broadcastEntityEvent(mob, id)); + map.clear(); -+ DebugPackets.sendPoiTicketCountPacket(level, target); ++ level.debugSynchronizers().updatePoi(target); + }); + } else { + for (Pair, BlockPos> pair : set) { @@ -228,13 +229,24 @@ index 621ba76784f2b92790eca62be4d0688834335ab6..e2e1532d2ffb709e347db42b1b5b6cae private boolean tryComputePath(Mob mob, WalkTarget target, long time) { BlockPos blockPos = target.getTarget().currentBlockPosition(); diff --git a/net/minecraft/world/entity/ai/behavior/SetClosestHomeAsWalkTarget.java b/net/minecraft/world/entity/ai/behavior/SetClosestHomeAsWalkTarget.java -index 4f9f3367b1ca3903df03a80fa2b01a3d24e6e77d..51413df5cd61b3ff59c6c6c3ec69d6732ab07d83 100644 +index 348ff9ef8595fa9324d41ec1328f8d7a503d1d13..c961348d20935377d83fdee16ead51bfb6ea1162 100644 --- a/net/minecraft/world/entity/ai/behavior/SetClosestHomeAsWalkTarget.java +++ b/net/minecraft/world/entity/ai/behavior/SetClosestHomeAsWalkTarget.java -@@ -60,17 +60,20 @@ public class SetClosestHomeAsWalkTarget { +@@ -59,17 +59,20 @@ public class SetClosestHomeAsWalkTarget { poi -> poi.is(PoiTypes.HOME), predicate, mob.blockPosition(), 48, PoiManager.Occupancy.ANY ) .collect(Collectors.toSet()); +- Path path = AcquirePoi.findPathToPois(mob, set); +- if (path != null && path.canReach()) { +- BlockPos target = path.getTarget(); +- Optional> type = poiManager.getType(target); +- if (type.isPresent()) { +- walkTarget.set(new WalkTarget(target, speedModifier, 1)); +- level.debugSynchronizers().updatePoi(target); +- } +- } else if (mutableInt.getValue() < 5) { +- map.long2LongEntrySet().removeIf(entry -> entry.getLongValue() < mutableLong.getValue()); +- } + // Kaiiju start - petal - Async path processing + if (org.dreeam.leaf.config.modules.async.AsyncPathfinding.enabled) { + // await on path async @@ -246,23 +258,13 @@ index 4f9f3367b1ca3903df03a80fa2b01a3d24e6e77d..51413df5cd61b3ff59c6c6c3ec69d673 + }); + } else { + // Kaiiju end - Path path = AcquirePoi.findPathToPois(mob, set); -- if (path != null && path.canReach()) { -- BlockPos target = path.getTarget(); -- Optional> type = poiManager.getType(target); -- if (type.isPresent()) { -- walkTarget.set(new WalkTarget(target, speedModifier, 1)); -- DebugPackets.sendPoiTicketCountPacket(level, target); -- } -- } else if (mutableInt.getValue() < 5) { -- map.long2LongEntrySet().removeIf(entry -> entry.getLongValue() < mutableLong.getValue()); -- } ++ Path path = AcquirePoi.findPathToPois(mob, set); + processPath(speedModifier, map, mutableLong, walkTarget, level, poiManager, mutableInt, path); + } // Kaiiju - async path processing return true; } else { -@@ -81,4 +84,26 @@ public class SetClosestHomeAsWalkTarget { +@@ -80,4 +83,26 @@ public class SetClosestHomeAsWalkTarget { ) ); } @@ -281,7 +283,7 @@ index 4f9f3367b1ca3903df03a80fa2b01a3d24e6e77d..51413df5cd61b3ff59c6c6c3ec69d673 + Optional> type = poiManager.getType(target); + if (type.isPresent()) { + walkTarget.set(new WalkTarget(target, speedModifier, 1)); -+ DebugPackets.sendPoiTicketCountPacket(level, target); ++ level.debugSynchronizers().updatePoi(target); + } + } else if (mutableInt.getValue() < 5) { + map.long2LongEntrySet().removeIf(entry -> entry.getLongValue() < mutableLong.getValue()); @@ -333,10 +335,10 @@ index 458ceec68ca138b0aa9b70d6c934473c01d468f4..dc42e63d1c166aed02081e687ada76a0 } diff --git a/net/minecraft/world/entity/ai/navigation/FlyingPathNavigation.java b/net/minecraft/world/entity/ai/navigation/FlyingPathNavigation.java -index 077863b758fbc3e51f25bcf842d00a2cc07c6a2f..29490cf3cb3c42dbc1dff683d8942a40e2df71b6 100644 +index e21a79f77b6775764816ec45fc9023f52a00af84..f7f5ec9e3c79ff93c9b5f051821a26e1d31bff04 100644 --- a/net/minecraft/world/entity/ai/navigation/FlyingPathNavigation.java +++ b/net/minecraft/world/entity/ai/navigation/FlyingPathNavigation.java -@@ -16,9 +16,25 @@ public class FlyingPathNavigation extends PathNavigation { +@@ -15,9 +15,25 @@ public class FlyingPathNavigation extends PathNavigation { super(mob, level); } @@ -362,7 +364,7 @@ index 077863b758fbc3e51f25bcf842d00a2cc07c6a2f..29490cf3cb3c42dbc1dff683d8942a40 return new PathFinder(this.nodeEvaluator, maxVisitedNodes); } -@@ -48,6 +64,7 @@ public class FlyingPathNavigation extends PathNavigation { +@@ -47,6 +63,7 @@ public class FlyingPathNavigation extends PathNavigation { if (this.hasDelayedRecomputation) { this.recomputePath(); } @@ -371,10 +373,10 @@ index 077863b758fbc3e51f25bcf842d00a2cc07c6a2f..29490cf3cb3c42dbc1dff683d8942a40 if (!this.isDone()) { if (this.canUpdatePath()) { diff --git a/net/minecraft/world/entity/ai/navigation/GroundPathNavigation.java b/net/minecraft/world/entity/ai/navigation/GroundPathNavigation.java -index 86fccf3617a32f3791b03d8067e2eaf6b8d8bebb..9cef6797e6d8eb43a51a1b94fea3947dd3d534da 100644 +index f2f07146a3638fe07f4814abd22a9bf815507fd2..5bcea553299bce0b83108e7f876502d0371b5fbd 100644 --- a/net/minecraft/world/entity/ai/navigation/GroundPathNavigation.java +++ b/net/minecraft/world/entity/ai/navigation/GroundPathNavigation.java -@@ -24,9 +24,25 @@ public class GroundPathNavigation extends PathNavigation { +@@ -25,9 +25,25 @@ public class GroundPathNavigation extends PathNavigation { super(mob, level); } @@ -401,10 +403,10 @@ index 86fccf3617a32f3791b03d8067e2eaf6b8d8bebb..9cef6797e6d8eb43a51a1b94fea3947d } diff --git a/net/minecraft/world/entity/ai/navigation/PathNavigation.java b/net/minecraft/world/entity/ai/navigation/PathNavigation.java -index 24dd92449f70144c79f25bf24942ebd666655ed2..5060a4051c251e59f36843d118aeee891b256dac 100644 +index 1f45b389553cd5782972193537ce7adcd9c7c600..82fde807ed066521ef8d8e0741c42e680270df61 100644 --- a/net/minecraft/world/entity/ai/navigation/PathNavigation.java +++ b/net/minecraft/world/entity/ai/navigation/PathNavigation.java -@@ -167,6 +167,10 @@ public abstract class PathNavigation { +@@ -173,6 +173,10 @@ public abstract class PathNavigation { return null; } else if (!this.canUpdatePath()) { return null; @@ -415,7 +417,7 @@ index 24dd92449f70144c79f25bf24942ebd666655ed2..5060a4051c251e59f36843d118aeee89 } else if (this.path != null && !this.path.isDone() && targets.contains(this.targetPos)) { return this.path; } else { -@@ -191,11 +195,29 @@ public abstract class PathNavigation { +@@ -197,11 +201,29 @@ public abstract class PathNavigation { int i = (int)(followRange + regionOffset); PathNavigationRegion pathNavigationRegion = new PathNavigationRegion(this.level, blockPos.offset(-i, -i, -i), blockPos.offset(i, i, i)); Path path = this.pathFinder.findPath(pathNavigationRegion, this.mob, targets, followRange, accuracy, this.maxVisitedNodesMultiplier); @@ -445,7 +447,7 @@ index 24dd92449f70144c79f25bf24942ebd666655ed2..5060a4051c251e59f36843d118aeee89 return path; } -@@ -246,8 +268,8 @@ public abstract class PathNavigation { +@@ -252,8 +274,8 @@ public abstract class PathNavigation { if (this.isDone()) { return false; } else { @@ -456,7 +458,7 @@ index 24dd92449f70144c79f25bf24942ebd666655ed2..5060a4051c251e59f36843d118aeee89 return false; } else { this.speedModifier = speed; -@@ -270,6 +292,7 @@ public abstract class PathNavigation { +@@ -276,6 +298,7 @@ public abstract class PathNavigation { if (this.hasDelayedRecomputation) { this.recomputePath(); } @@ -464,7 +466,7 @@ index 24dd92449f70144c79f25bf24942ebd666655ed2..5060a4051c251e59f36843d118aeee89 if (!this.isDone()) { if (this.canUpdatePath()) { -@@ -299,6 +322,7 @@ public abstract class PathNavigation { +@@ -304,6 +327,7 @@ public abstract class PathNavigation { } protected void followThePath() { @@ -472,7 +474,7 @@ index 24dd92449f70144c79f25bf24942ebd666655ed2..5060a4051c251e59f36843d118aeee89 Vec3 tempMobPos = this.getTempMobPos(); this.maxDistanceToWaypoint = this.mob.getBbWidth() > 0.75F ? this.mob.getBbWidth() / 2.0F : 0.75F - this.mob.getBbWidth() / 2.0F; Vec3i nextNodePos = this.path.getNextNodePos(); -@@ -455,7 +479,7 @@ public abstract class PathNavigation { +@@ -460,7 +484,7 @@ public abstract class PathNavigation { public boolean shouldRecomputePath(BlockPos pos) { if (this.hasDelayedRecomputation) { return false; @@ -560,10 +562,10 @@ index 1f96fd5085bacb4c584576c7cb9f51e7898e9b03..03b6c8c8dcd42e864751e68be9d35d20 + // Leaf end - Kaiiju - await on async path processing } diff --git a/net/minecraft/world/entity/animal/Bee.java b/net/minecraft/world/entity/animal/Bee.java -index 7573f1be88ca23096e02efe2fa933429fa4421ba..4821ec280cbd6f4b19241748c3bcc3fb66149ac2 100644 +index a520052f0feae97c5ed8eb4af4fb48cdf56d6550..8bdbc66f31252d0bd9f7637bca6b7fafc49f843a 100644 --- a/net/minecraft/world/entity/animal/Bee.java +++ b/net/minecraft/world/entity/animal/Bee.java -@@ -938,6 +938,14 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { +@@ -945,6 +945,14 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { Bee.this.pathfindRandomlyTowards(Bee.this.hivePos); } } else { @@ -578,7 +580,7 @@ index 7573f1be88ca23096e02efe2fa933429fa4421ba..4821ec280cbd6f4b19241748c3bcc3fb boolean flag = this.pathfindDirectlyTowards(Bee.this.hivePos); if (!flag) { this.dropAndBlacklistHive(); -@@ -991,7 +999,7 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { +@@ -998,7 +1006,7 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { return true; } else { Path path = Bee.this.navigation.getPath(); @@ -588,7 +590,7 @@ index 7573f1be88ca23096e02efe2fa933429fa4421ba..4821ec280cbd6f4b19241748c3bcc3fb } } diff --git a/net/minecraft/world/entity/animal/Rabbit.java b/net/minecraft/world/entity/animal/Rabbit.java -index 1af1b33702296f9aa74c33436ea2904c5e5ae43d..041ccb96d36cbe0f5683ff6e8b2adb0b79a96738 100644 +index 44dc38b94c311a791fadb073200fe04510f5123e..179bd912be09aef1654a901940db60f315cf08c8 100644 --- a/net/minecraft/world/entity/animal/Rabbit.java +++ b/net/minecraft/world/entity/animal/Rabbit.java @@ -612,6 +612,14 @@ public class Rabbit extends Animal { @@ -607,10 +609,10 @@ index 1af1b33702296f9aa74c33436ea2904c5e5ae43d..041ccb96d36cbe0f5683ff6e8b2adb0b this.rabbit.setSpeedModifier(0.0); } else if (this.hasWanted() || this.operation == MoveControl.Operation.JUMPING) { diff --git a/net/minecraft/world/entity/animal/frog/Frog.java b/net/minecraft/world/entity/animal/frog/Frog.java -index a7e9179c287671a689cb5ce668b5a33896da87a4..7d450b6ccde99657a7fac354ae386a80f9f7e879 100644 +index e5aeea7851deef6e7b36f479fa1985648c4d4cd9..873e6b3b198602279d2450f85920ae684fa28166 100644 --- a/net/minecraft/world/entity/animal/frog/Frog.java +++ b/net/minecraft/world/entity/animal/frog/Frog.java -@@ -489,9 +489,25 @@ public class Frog extends Animal { +@@ -482,9 +482,25 @@ public class Frog extends Animal { return pathType != PathType.WATER_BORDER && super.canCutCorner(pathType); } @@ -637,10 +639,10 @@ index a7e9179c287671a689cb5ce668b5a33896da87a4..7d450b6ccde99657a7fac354ae386a80 } } diff --git a/net/minecraft/world/entity/monster/Drowned.java b/net/minecraft/world/entity/monster/Drowned.java -index 2e6d0f035a01277aa28bbe912d5df8dc4cf04547..f4428016e4fabc99dc79ecc39b7f6e0617e4dc7a 100644 +index 592b4f139a184f0522e350f5b83777b235eb243c..5ef8c2a666084115bfbf8d8eb11f6f302db3f919 100644 --- a/net/minecraft/world/entity/monster/Drowned.java +++ b/net/minecraft/world/entity/monster/Drowned.java -@@ -308,7 +308,7 @@ public class Drowned extends Zombie implements RangedAttackMob { +@@ -303,7 +303,7 @@ public class Drowned extends Zombie implements RangedAttackMob { protected boolean closeToNextPos() { Path path = this.getNavigation().getPath(); @@ -650,7 +652,7 @@ index 2e6d0f035a01277aa28bbe912d5df8dc4cf04547..f4428016e4fabc99dc79ecc39b7f6e06 if (target != null) { double d = this.distanceToSqr(target.getX(), target.getY(), target.getZ()); diff --git a/net/minecraft/world/entity/monster/Strider.java b/net/minecraft/world/entity/monster/Strider.java -index fe31c4a45afd61be8b74efe9d0858ccd0aced075..e1717b5c854aa81fdd7b7e715d7c3498d9f86072 100644 +index 592095f4c78866c53745786a615f1681dcaf6bf6..c5966a315873a74223f4ab6a65243e19784349de 100644 --- a/net/minecraft/world/entity/monster/Strider.java +++ b/net/minecraft/world/entity/monster/Strider.java @@ -560,9 +560,25 @@ public class Strider extends Animal implements ItemSteerable { @@ -680,10 +682,10 @@ index fe31c4a45afd61be8b74efe9d0858ccd0aced075..e1717b5c854aa81fdd7b7e715d7c3498 } diff --git a/net/minecraft/world/entity/monster/warden/Warden.java b/net/minecraft/world/entity/monster/warden/Warden.java -index 147fb3eecf651dcee63d63255542ef2680140f66..a6109ac9d7f8a9aa4074b3e9504244b1d565a2d4 100644 +index 213813c144945425d7edbe420db4510641b337bf..fba09acf38fa6cc486dc92616d6b008ecb314f87 100644 --- a/net/minecraft/world/entity/monster/warden/Warden.java +++ b/net/minecraft/world/entity/monster/warden/Warden.java -@@ -576,6 +576,16 @@ public class Warden extends Monster implements VibrationSystem { +@@ -569,6 +569,16 @@ public class Warden extends Monster implements VibrationSystem { @Override protected PathFinder createPathFinder(int maxVisitedNodes) { this.nodeEvaluator = new WalkNodeEvaluator(); @@ -701,7 +703,7 @@ index 147fb3eecf651dcee63d63255542ef2680140f66..a6109ac9d7f8a9aa4074b3e9504244b1 @Override protected float distance(Node first, Node second) { diff --git a/net/minecraft/world/level/block/ShulkerBoxBlock.java b/net/minecraft/world/level/block/ShulkerBoxBlock.java -index 49bac7af90b0a7c490141be6357563447783c6ca..8aedb5497ea52ae59e477162cb8089694a17f091 100644 +index f3bc957110ef60ad5e4384b934b60dccea76d5a7..ff1b21591aafed579492f56d502e1c7c8a59bdee 100644 --- a/net/minecraft/world/level/block/ShulkerBoxBlock.java +++ b/net/minecraft/world/level/block/ShulkerBoxBlock.java @@ -166,9 +166,16 @@ public class ShulkerBoxBlock extends BaseEntityBlock { @@ -722,10 +724,10 @@ index 49bac7af90b0a7c490141be6357563447783c6ca..8aedb5497ea52ae59e477162cb808969 @Override diff --git a/net/minecraft/world/level/pathfinder/Path.java b/net/minecraft/world/level/pathfinder/Path.java -index d6d3c8f5e5dd4a8cab0d3fcc131c3a59f06130c6..add5b8b98e4d09617cbd4e7dd2710dc50781613a 100644 +index d8d086b54f07a855cf312b6f742802e267dfd034..90195c190b8fb14579ec718eb4c17971cb466cae 100644 --- a/net/minecraft/world/level/pathfinder/Path.java +++ b/net/minecraft/world/level/pathfinder/Path.java -@@ -26,6 +26,17 @@ public class Path { +@@ -28,6 +28,17 @@ public final class Path { this.reached = reached; } @@ -743,22 +745,22 @@ index d6d3c8f5e5dd4a8cab0d3fcc131c3a59f06130c6..add5b8b98e4d09617cbd4e7dd2710dc5 public void advance() { this.nextNodeIndex++; } -@@ -99,6 +110,7 @@ public class Path { +@@ -101,6 +112,7 @@ public final class Path { + } + + public boolean sameAs(@Nullable Path pathEntity) { ++ if (pathEntity == this) return true; // Kaiiju - petal - short circuit + return pathEntity != null && this.nodes.equals(pathEntity.nodes); } - public boolean sameAs(@Nullable Path pathentity) { -+ if (pathentity == this) return true; // Kaiiju - petal - short circuit - if (pathentity == null) { - return false; - } else if (pathentity.nodes.size() != this.nodes.size()) { diff --git a/net/minecraft/world/level/pathfinder/PathFinder.java b/net/minecraft/world/level/pathfinder/PathFinder.java -index c2baadcdceb1df6a881d6f73aa4eb4dd264bcdfe..61912c67611ded5a8f34e0c55d3d3017f144f970 100644 +index 98abda72d88fb38a5427a15cc59094f3a7db30dc..fe45865bdd65f9821f64d022489168241b0b4749 100644 --- a/net/minecraft/world/level/pathfinder/PathFinder.java +++ b/net/minecraft/world/level/pathfinder/PathFinder.java -@@ -22,10 +22,18 @@ public class PathFinder { +@@ -23,10 +23,18 @@ public class PathFinder { public final NodeEvaluator nodeEvaluator; - private static final boolean DEBUG = false; private final BinaryHeap openSet = new BinaryHeap(); + private BooleanSupplier captureDebug = () -> false; + private final @Nullable org.dreeam.leaf.async.path.NodeEvaluatorGenerator nodeEvaluatorGenerator; // Kaiiju - petal - we use this later to generate an evaluator - public PathFinder(NodeEvaluator nodeEvaluator, int maxVisitedNodes) { @@ -774,8 +776,8 @@ index c2baadcdceb1df6a881d6f73aa4eb4dd264bcdfe..61912c67611ded5a8f34e0c55d3d3017 + // Kaiiju end } - public void setMaxVisitedNodes(int maxVisitedNodes) { -@@ -34,26 +42,63 @@ public class PathFinder { + public void setCaptureDebug(BooleanSupplier captureDebug) { +@@ -39,26 +47,63 @@ public class PathFinder { @Nullable public Path findPath(PathNavigationRegion region, Mob mob, Set targetPositions, float maxRange, int accuracy, float searchDepthMultiplier) { @@ -843,11 +845,11 @@ index c2baadcdceb1df6a881d6f73aa4eb4dd264bcdfe..61912c67611ded5a8f34e0c55d3d3017 + private synchronized @org.jetbrains.annotations.NotNull Path processPath(NodeEvaluator nodeEvaluator, Node node, List> positions, float maxRange, int accuracy, float searchDepthMultiplier) { // sync to only use the caching functions in this class on a single thread + org.apache.commons.lang3.Validate.isTrue(!positions.isEmpty()); // ensure that we have at least one position, which means we'll always return a path + // Kaiiju end - // Set set = targetPositions.keySet(); // Paper + // Set set = targetPositions.keySet(); // Paper - unused node.g = 0.0F; node.h = this.getBestH(node, positions); // Paper - optimize collection -@@ -89,7 +134,7 @@ public class PathFinder { - } +@@ -96,7 +141,7 @@ public class PathFinder { + if (!(node1.distanceTo(node) >= maxRange)) { - int neighbors = this.nodeEvaluator.getNeighbors(this.neighbors, node1); @@ -855,7 +857,7 @@ index c2baadcdceb1df6a881d6f73aa4eb4dd264bcdfe..61912c67611ded5a8f34e0c55d3d3017 for (int i2 = 0; i2 < neighbors; i2++) { Node node2 = this.neighbors[i2]; -@@ -123,6 +168,7 @@ public class PathFinder { +@@ -130,6 +175,7 @@ public class PathFinder { best = path; } } diff --git a/leaf-server/minecraft-patches/features/0112-Petal-reduce-work-done-by-game-event-system.patch b/leaf-server/minecraft-patches/features/0105-Petal-reduce-work-done-by-game-event-system.patch similarity index 88% rename from leaf-server/minecraft-patches/features/0112-Petal-reduce-work-done-by-game-event-system.patch rename to leaf-server/minecraft-patches/features/0105-Petal-reduce-work-done-by-game-event-system.patch index d76de9de..4aa643e3 100644 --- a/leaf-server/minecraft-patches/features/0112-Petal-reduce-work-done-by-game-event-system.patch +++ b/leaf-server/minecraft-patches/features/0105-Petal-reduce-work-done-by-game-event-system.patch @@ -38,10 +38,10 @@ index 0a94670dc20bb9c521b0395633eb100393895f6a..83c811eb5e493fa6630f16c206787f22 if (entity.getLastHurtByMob() instanceof ServerPlayer serverPlayer) { DamageSource damageSource = entity.getLastDamageSource() == null diff --git a/net/minecraft/world/level/chunk/LevelChunk.java b/net/minecraft/world/level/chunk/LevelChunk.java -index 9e2debee38bc4b25281c8a8c6e7082cca1f7b569..27aa58ab47e7a7b0edddd1c483dc9165696ebf11 100644 +index f7c0629c3495d048a19b14d54815b669dee95229..8e461e9617b7ca6e41b99ab8cbd907ec4f56f81d 100644 --- a/net/minecraft/world/level/chunk/LevelChunk.java +++ b/net/minecraft/world/level/chunk/LevelChunk.java -@@ -82,7 +82,19 @@ public class LevelChunk extends ChunkAccess implements ca.spottedleaf.moonrise.p +@@ -89,7 +89,19 @@ public class LevelChunk extends ChunkAccess implements DebugValueSource, ca.spot private Supplier fullStatus; @Nullable private LevelChunk.PostLoadProcessor postLoad; @@ -62,16 +62,16 @@ index 9e2debee38bc4b25281c8a8c6e7082cca1f7b569..27aa58ab47e7a7b0edddd1c483dc9165 private final LevelChunkTicks blockTicks; private final LevelChunkTicks fluidTicks; private LevelChunk.UnsavedListener unsavedListener = chunkPos -> {}; -@@ -157,7 +169,7 @@ public class LevelChunk extends ChunkAccess implements ca.spottedleaf.moonrise.p +@@ -164,7 +176,7 @@ public class LevelChunk extends ChunkAccess implements DebugValueSource, ca.spot ) { - super(pos, data, level, net.minecraft.server.MinecraftServer.getServer().registryAccess().lookupOrThrow(Registries.BIOME), inhabitedTime, sections, blendingData); // Paper - Anti-Xray - The world isn't ready yet, use server singleton for registry + super(pos, data, level, PalettedContainerFactory.create(net.minecraft.server.MinecraftServer.getServer().registryAccess()), inhabitedTime, sections, blendingData); // Paper - Anti-Xray - The world isn't ready yet, use server singleton for registry this.level = (ServerLevel) level; // CraftBukkit - type - this.gameEventListenerRegistrySections = new Int2ObjectOpenHashMap<>(); + this.gameEventListenerRegistrySections = new GameEventListenerRegistry[getGameEventSectionLength(this.getSectionsCount())]; // Leaf - petal - reduce work done by game event system for (Heightmap.Types types : Heightmap.Types.values()) { if (ChunkStatus.FULL.heightmapsAfter().contains(types)) { -@@ -269,10 +281,27 @@ public class LevelChunk extends ChunkAccess implements ca.spottedleaf.moonrise.p +@@ -276,10 +288,27 @@ public class LevelChunk extends ChunkAccess implements DebugValueSource, ca.spot @Override public GameEventListenerRegistry getListenerRegistry(int sectionY) { @@ -103,7 +103,7 @@ index 9e2debee38bc4b25281c8a8c6e7082cca1f7b569..27aa58ab47e7a7b0edddd1c483dc9165 } // Paper start - Perf: Reduce instructions and provide final method -@@ -620,7 +649,7 @@ public class LevelChunk extends ChunkAccess implements ca.spottedleaf.moonrise.p +@@ -628,7 +657,7 @@ public class LevelChunk extends ChunkAccess implements DebugValueSource, ca.spot } private void removeGameEventListenerRegistry(int sectionY) { @@ -113,10 +113,10 @@ index 9e2debee38bc4b25281c8a8c6e7082cca1f7b569..27aa58ab47e7a7b0edddd1c483dc9165 private void removeBlockEntityTicker(BlockPos pos) { diff --git a/net/minecraft/world/level/gameevent/EuclideanGameEventListenerRegistry.java b/net/minecraft/world/level/gameevent/EuclideanGameEventListenerRegistry.java -index 5175fc90a1fc61c832c6697997a97ae199b195ac..fc56ef2d5ed813db51e35b635e373b6f8035593b 100644 +index 2f0f330b1ea42965e8790f74f00f060c545cd50b..2c9622177509ba1b74d25196e8d6a4a86c56ddda 100644 --- a/net/minecraft/world/level/gameevent/EuclideanGameEventListenerRegistry.java +++ b/net/minecraft/world/level/gameevent/EuclideanGameEventListenerRegistry.java -@@ -14,8 +14,8 @@ import net.minecraft.world.phys.Vec3; +@@ -16,8 +16,8 @@ import net.minecraft.world.phys.Vec3; public class EuclideanGameEventListenerRegistry implements GameEventListenerRegistry { private final List listeners = Lists.newArrayList(); @@ -127,7 +127,7 @@ index 5175fc90a1fc61c832c6697997a97ae199b195ac..fc56ef2d5ed813db51e35b635e373b6f private boolean processing; private final ServerLevel level; private final int sectionY; -@@ -35,7 +35,7 @@ public class EuclideanGameEventListenerRegistry implements GameEventListenerRegi +@@ -37,7 +37,7 @@ public class EuclideanGameEventListenerRegistry implements GameEventListenerRegi @Override public void register(GameEventListener listener) { if (this.processing) { @@ -136,7 +136,7 @@ index 5175fc90a1fc61c832c6697997a97ae199b195ac..fc56ef2d5ed813db51e35b635e373b6f } else { this.listeners.add(listener); } -@@ -46,7 +46,7 @@ public class EuclideanGameEventListenerRegistry implements GameEventListenerRegi +@@ -63,7 +63,7 @@ public class EuclideanGameEventListenerRegistry implements GameEventListenerRegi @Override public void unregister(GameEventListener listener) { if (this.processing) { @@ -145,7 +145,7 @@ index 5175fc90a1fc61c832c6697997a97ae199b195ac..fc56ef2d5ed813db51e35b635e373b6f } else { this.listeners.remove(listener); } -@@ -66,7 +66,7 @@ public class EuclideanGameEventListenerRegistry implements GameEventListenerRegi +@@ -83,7 +83,7 @@ public class EuclideanGameEventListenerRegistry implements GameEventListenerRegi while (iterator.hasNext()) { GameEventListener gameEventListener = iterator.next(); @@ -154,7 +154,7 @@ index 5175fc90a1fc61c832c6697997a97ae199b195ac..fc56ef2d5ed813db51e35b635e373b6f iterator.remove(); } else { Optional postableListenerPosition = getPostableListenerPosition(this.level, pos, gameEventListener); -@@ -80,6 +80,8 @@ public class EuclideanGameEventListenerRegistry implements GameEventListenerRegi +@@ -97,6 +97,8 @@ public class EuclideanGameEventListenerRegistry implements GameEventListenerRegi this.processing = false; } @@ -163,7 +163,7 @@ index 5175fc90a1fc61c832c6697997a97ae199b195ac..fc56ef2d5ed813db51e35b635e373b6f if (!this.listenersToAdd.isEmpty()) { this.listeners.addAll(this.listenersToAdd); this.listenersToAdd.clear(); -@@ -89,6 +91,8 @@ public class EuclideanGameEventListenerRegistry implements GameEventListenerRegi +@@ -106,6 +108,8 @@ public class EuclideanGameEventListenerRegistry implements GameEventListenerRegi this.listeners.removeAll(this.listenersToRemove); this.listenersToRemove.clear(); } @@ -173,10 +173,10 @@ index 5175fc90a1fc61c832c6697997a97ae199b195ac..fc56ef2d5ed813db51e35b635e373b6f return flag; } diff --git a/net/minecraft/world/level/gameevent/GameEventDispatcher.java b/net/minecraft/world/level/gameevent/GameEventDispatcher.java -index b06ded98c01cd2a71d52b96070a6b23da1e40f9c..a781038d42166e1dd1bfee0fbd5c2db8ec1d08c0 100644 +index e89f22cfdbe53b4097ae0981a7aee0af47d9e34a..68079dafeadce1256175edd6695cab0ec0866fb4 100644 --- a/net/minecraft/world/level/gameevent/GameEventDispatcher.java +++ b/net/minecraft/world/level/gameevent/GameEventDispatcher.java -@@ -38,6 +38,7 @@ public class GameEventDispatcher { +@@ -39,6 +39,7 @@ public class GameEventDispatcher { int sectionPosCoord5 = SectionPos.blockToSectionCoord(blockPos.getZ() + notificationRadius); List list = new ArrayList<>(); GameEventListenerRegistry.ListenerVisitor listenerVisitor = (listener, pos1) -> { diff --git a/leaf-server/minecraft-patches/features/0113-Reduce-canSee-work.patch b/leaf-server/minecraft-patches/features/0106-Reduce-canSee-work.patch similarity index 91% rename from leaf-server/minecraft-patches/features/0113-Reduce-canSee-work.patch rename to leaf-server/minecraft-patches/features/0106-Reduce-canSee-work.patch index 1bb1d9e3..043e998b 100644 --- a/leaf-server/minecraft-patches/features/0113-Reduce-canSee-work.patch +++ b/leaf-server/minecraft-patches/features/0106-Reduce-canSee-work.patch @@ -7,10 +7,10 @@ Co-authored by: Martijn Muijsers Co-authored by: MachineBreaker diff --git a/net/minecraft/world/level/Level.java b/net/minecraft/world/level/Level.java -index bee67a32c63df0901b9a9b6b3f6e7a35bb87025e..191214e2c3019e9e55cc1d9658c2446557f40173 100644 +index 37061bb9f7293557d61d9be1ad135139d0f36217..d8022ac9ed679b6c1260833f75671f409a6d95d4 100644 --- a/net/minecraft/world/level/Level.java +++ b/net/minecraft/world/level/Level.java -@@ -988,17 +988,19 @@ public abstract class Level implements LevelAccessor, UUIDLookup, AutoCl +@@ -942,17 +942,19 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl for (int i = 0, len = entities.size(); i < len; ++i) { Entity entity = entities.get(i); diff --git a/leaf-server/minecraft-patches/features/0114-Fix-sprint-glitch.patch b/leaf-server/minecraft-patches/features/0107-Fix-sprint-glitch.patch similarity index 83% rename from leaf-server/minecraft-patches/features/0114-Fix-sprint-glitch.patch rename to leaf-server/minecraft-patches/features/0107-Fix-sprint-glitch.patch index 6cb20fe3..42713698 100644 --- a/leaf-server/minecraft-patches/features/0114-Fix-sprint-glitch.patch +++ b/leaf-server/minecraft-patches/features/0107-Fix-sprint-glitch.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Fix sprint glitch diff --git a/net/minecraft/world/entity/LivingEntity.java b/net/minecraft/world/entity/LivingEntity.java -index 5aa749c46b0b84dfe1584788617e0f184e850239..1ba42eaaf9ceb41c5ef184f3002135c0781abe33 100644 +index 49b70d4faa6ad188d04dda696ca27eef0eed09a2..f4cdbbf283db4d28821cffc6e985b5c70f10352d 100644 --- a/net/minecraft/world/entity/LivingEntity.java +++ b/net/minecraft/world/entity/LivingEntity.java -@@ -1419,7 +1419,8 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin +@@ -1425,7 +1425,8 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin player.setRealHealth(health); } diff --git a/leaf-server/minecraft-patches/features/0115-Configurable-movement-speed-of-more-entities.patch b/leaf-server/minecraft-patches/features/0108-Configurable-movement-speed-of-more-entities.patch similarity index 94% rename from leaf-server/minecraft-patches/features/0115-Configurable-movement-speed-of-more-entities.patch rename to leaf-server/minecraft-patches/features/0108-Configurable-movement-speed-of-more-entities.patch index 32a33da7..a7aadf10 100644 --- a/leaf-server/minecraft-patches/features/0115-Configurable-movement-speed-of-more-entities.patch +++ b/leaf-server/minecraft-patches/features/0108-Configurable-movement-speed-of-more-entities.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Configurable movement speed of more entities diff --git a/net/minecraft/world/entity/monster/Drowned.java b/net/minecraft/world/entity/monster/Drowned.java -index f4428016e4fabc99dc79ecc39b7f6e0617e4dc7a..7ff380212ce5e56e0e58e5f52f8c75bda5061ef0 100644 +index 5ef8c2a666084115bfbf8d8eb11f6f302db3f919..8fb1dde33d010af5fa9a9014b407d5e83a5148d2 100644 --- a/net/minecraft/world/entity/monster/Drowned.java +++ b/net/minecraft/world/entity/monster/Drowned.java @@ -98,6 +98,7 @@ public class Drowned extends Zombie implements RangedAttackMob { @@ -17,10 +17,10 @@ index f4428016e4fabc99dc79ecc39b7f6e0617e4dc7a..7ff380212ce5e56e0e58e5f52f8c75bd @Override diff --git a/net/minecraft/world/entity/monster/Husk.java b/net/minecraft/world/entity/monster/Husk.java -index a4ce65911a5d778f60bcedb3acd9fe59a5094c96..f4200bdf2002c13259821b27811370896adf4b3e 100644 +index f2c55aa23ec647af6907b349b937c98fffd95523..544594040d61f0ff3a081a28135d8f7e4d9c2ad6 100644 --- a/net/minecraft/world/entity/monster/Husk.java +++ b/net/minecraft/world/entity/monster/Husk.java -@@ -43,6 +43,7 @@ public class Husk extends Zombie { +@@ -42,6 +42,7 @@ public class Husk extends Zombie { @Override public void initAttributes() { this.getAttribute(net.minecraft.world.entity.ai.attributes.Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.huskMaxHealth); @@ -29,10 +29,10 @@ index a4ce65911a5d778f60bcedb3acd9fe59a5094c96..f4200bdf2002c13259821b2781137089 @Override diff --git a/net/minecraft/world/entity/monster/Zombie.java b/net/minecraft/world/entity/monster/Zombie.java -index ab4dc7b3a7593d255dbd7d1df667fce3504af3ed..185d138f65e884eb9b3fdd753bc4e2a14a25c4b1 100644 +index 63b29933e262115062a082dcaed0d16146a181bd..74facb80e63508ff7196461b58cd69691d6ac58d 100644 --- a/net/minecraft/world/entity/monster/Zombie.java +++ b/net/minecraft/world/entity/monster/Zombie.java -@@ -126,6 +126,7 @@ public class Zombie extends Monster { +@@ -125,6 +125,7 @@ public class Zombie extends Monster { public void initAttributes() { this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.zombieMaxHealth); this.getAttribute(Attributes.SCALE).setBaseValue(this.level().purpurConfig.zombieScale); @@ -40,7 +40,7 @@ index ab4dc7b3a7593d255dbd7d1df667fce3504af3ed..185d138f65e884eb9b3fdd753bc4e2a1 } // Purpur end - Configurable entity base attributes -@@ -193,7 +194,7 @@ public class Zombie extends Monster { +@@ -192,7 +193,7 @@ public class Zombie extends Monster { public static AttributeSupplier.Builder createAttributes() { return Monster.createMonsterAttributes() .add(Attributes.FOLLOW_RANGE, 35.0) @@ -50,10 +50,10 @@ index ab4dc7b3a7593d255dbd7d1df667fce3504af3ed..185d138f65e884eb9b3fdd753bc4e2a1 .add(Attributes.ARMOR, 2.0) .add(Attributes.SPAWN_REINFORCEMENTS_CHANCE); diff --git a/net/minecraft/world/entity/monster/ZombieVillager.java b/net/minecraft/world/entity/monster/ZombieVillager.java -index e218e5d5f146ec996a6f5ce7e76b1d6506ac1cb9..18966860f550ad1f35ec6a03a0b78af73628b964 100644 +index f21f2c45edb5dc51154649b4406601c3c9840dfd..c2bd5902f7ede925fe6d0838b1d87f80bab5dbbb 100644 --- a/net/minecraft/world/entity/monster/ZombieVillager.java +++ b/net/minecraft/world/entity/monster/ZombieVillager.java -@@ -97,6 +97,7 @@ public class ZombieVillager extends Zombie implements VillagerDataHolder { +@@ -94,6 +94,7 @@ public class ZombieVillager extends Zombie implements VillagerDataHolder { @Override public void initAttributes() { this.getAttribute(net.minecraft.world.entity.ai.attributes.Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.zombieVillagerMaxHealth); @@ -62,7 +62,7 @@ index e218e5d5f146ec996a6f5ce7e76b1d6506ac1cb9..18966860f550ad1f35ec6a03a0b78af7 @Override diff --git a/net/minecraft/world/entity/monster/ZombifiedPiglin.java b/net/minecraft/world/entity/monster/ZombifiedPiglin.java -index f58c48d9de85fda3d13079f3e56b31af75b3c725..cc349403ceb9b094362e706f4e5b200a51071380 100644 +index 1955ea6cff628234342989249de6efd1180b0999..0a76e3649a847dbe2fae3ad50d628305fa7bdd71 100644 --- a/net/minecraft/world/entity/monster/ZombifiedPiglin.java +++ b/net/minecraft/world/entity/monster/ZombifiedPiglin.java @@ -86,6 +86,7 @@ public class ZombifiedPiglin extends Zombie implements NeutralMob { diff --git a/leaf-server/minecraft-patches/features/0116-Faster-sequencing-of-futures-for-chunk-structure-gen.patch b/leaf-server/minecraft-patches/features/0109-Faster-sequencing-of-futures-for-chunk-structure-gen.patch similarity index 95% rename from leaf-server/minecraft-patches/features/0116-Faster-sequencing-of-futures-for-chunk-structure-gen.patch rename to leaf-server/minecraft-patches/features/0109-Faster-sequencing-of-futures-for-chunk-structure-gen.patch index 59aa73b8..ff0ef098 100644 --- a/leaf-server/minecraft-patches/features/0116-Faster-sequencing-of-futures-for-chunk-structure-gen.patch +++ b/leaf-server/minecraft-patches/features/0109-Faster-sequencing-of-futures-for-chunk-structure-gen.patch @@ -7,10 +7,10 @@ Replace `thenApply` with `thenCompose`. Once one task is completed then the next to prevent blocking threads while waiting to complete all tasks. But may cause the sequence of future compose disorder. diff --git a/net/minecraft/Util.java b/net/minecraft/Util.java -index 138a58c5e5698b926b01e0170733dc3dbc5589ec..64372e0fd4eb7018fc36d0feb667c296ea48f927 100644 +index ae14ae3322c9ddf36ec182311f36a364e07138aa..9dbf650d4fadd34cc864dd0e787a51155789db45 100644 --- a/net/minecraft/Util.java +++ b/net/minecraft/Util.java -@@ -625,17 +625,39 @@ public class Util { +@@ -617,17 +617,39 @@ public class Util { return Maps.transformValues(map, mapper); } @@ -64,7 +64,7 @@ index 512d59188ff43e34463e2845aa8a174792c407a7..ca84304526050176ca7406f7a13c1447 list2 -> createAndValidateFullContext(registryAccess, provider, (List>)list2), backgroundExecutor ); diff --git a/net/minecraft/world/level/chunk/ChunkGeneratorStructureState.java b/net/minecraft/world/level/chunk/ChunkGeneratorStructureState.java -index 619b98e42e254c0c260c171a26a2472ddf59b885..f07a5416e5dc7e9a798a78ce9573a0c42bc59d04 100644 +index b7762440bfd4f5ac105c22e5ded56cc6a1b2815a..327b992196e22c2b3ede61dc584614449565ae84 100644 --- a/net/minecraft/world/level/chunk/ChunkGeneratorStructureState.java +++ b/net/minecraft/world/level/chunk/ChunkGeneratorStructureState.java @@ -255,7 +255,7 @@ public class ChunkGeneratorStructureState { diff --git a/leaf-server/minecraft-patches/features/0117-Reduce-active-items-finding-hopper-nearby-check.patch b/leaf-server/minecraft-patches/features/0110-Reduce-active-items-finding-hopper-nearby-check.patch similarity index 90% rename from leaf-server/minecraft-patches/features/0117-Reduce-active-items-finding-hopper-nearby-check.patch rename to leaf-server/minecraft-patches/features/0110-Reduce-active-items-finding-hopper-nearby-check.patch index 617f42dc..8b0648d1 100644 --- a/leaf-server/minecraft-patches/features/0117-Reduce-active-items-finding-hopper-nearby-check.patch +++ b/leaf-server/minecraft-patches/features/0110-Reduce-active-items-finding-hopper-nearby-check.patch @@ -9,10 +9,10 @@ But still recommend to turn-off `checkForMinecartNearItemWhileActive` Since `Reduce-hopper-item-checks.patch` will cause lag under massive dropped items diff --git a/net/minecraft/world/entity/item/ItemEntity.java b/net/minecraft/world/entity/item/ItemEntity.java -index 605de72224f6baa112dbfd2c83fd7a1ceba6a540..52314a8fe4188689431f9a1261226859b967f5f1 100644 +index 847b21a29415084b8d25a0ab65779854dbfff806..e5b12053e51213a10ca558112df14fd90698f2b9 100644 --- a/net/minecraft/world/entity/item/ItemEntity.java +++ b/net/minecraft/world/entity/item/ItemEntity.java -@@ -246,7 +246,11 @@ public class ItemEntity extends Entity implements TraceableEntity { +@@ -237,7 +237,11 @@ public class ItemEntity extends Entity implements TraceableEntity { this.discard(org.bukkit.event.entity.EntityRemoveEvent.Cause.DESPAWN); // CraftBukkit - add Bukkit remove cause return; // Gale - EMC - reduce hopper item checks } diff --git a/leaf-server/minecraft-patches/features/0118-Plazma-Add-some-missing-Pufferfish-configurations.patch b/leaf-server/minecraft-patches/features/0111-Plazma-Add-some-missing-Pufferfish-configurations.patch similarity index 64% rename from leaf-server/minecraft-patches/features/0118-Plazma-Add-some-missing-Pufferfish-configurations.patch rename to leaf-server/minecraft-patches/features/0111-Plazma-Add-some-missing-Pufferfish-configurations.patch index 6a63b0ce..e8b68a9e 100644 --- a/leaf-server/minecraft-patches/features/0118-Plazma-Add-some-missing-Pufferfish-configurations.patch +++ b/leaf-server/minecraft-patches/features/0111-Plazma-Add-some-missing-Pufferfish-configurations.patch @@ -10,10 +10,10 @@ Add Pufferfish DAB support for Camel, Sniffer https://github.com/pufferfish-gg/Pufferfish/issues/83 diff --git a/net/minecraft/world/entity/animal/HappyGhast.java b/net/minecraft/world/entity/animal/HappyGhast.java -index 9763a5e24e0fed9b49b6ac59911f6c9f8e893db5..b7306bcc60c2986b7f9b054d217a2b8cd76b118e 100644 +index 7fae9853c117cda03c516afc1508493af460fa8a..0f73d9036c6edfc33767959d6bc473568a42369b 100644 --- a/net/minecraft/world/entity/animal/HappyGhast.java +++ b/net/minecraft/world/entity/animal/HappyGhast.java -@@ -421,9 +421,11 @@ public class HappyGhast extends Animal { +@@ -425,9 +425,11 @@ public class HappyGhast extends Animal { return HappyGhastAi.makeBrain(this.brainProvider().makeBrain(dynamic)); } @@ -26,10 +26,10 @@ index 9763a5e24e0fed9b49b6ac59911f6c9f8e893db5..b7306bcc60c2986b7f9b054d217a2b8c HappyGhastAi.updateActivity(this); } diff --git a/net/minecraft/world/entity/animal/armadillo/Armadillo.java b/net/minecraft/world/entity/animal/armadillo/Armadillo.java -index b0ce3ab6939cb9e37171bb64e8c5308deb03195e..c520c4e478e3191cea7c2345a2e4c42b67c0762a 100644 +index 0d724ad5a8df9f96a21e2e2216aef4a3b87cd2ad..7b6d6395da302744eb7a11f5033f38b6d6f6b0e5 100644 --- a/net/minecraft/world/entity/animal/armadillo/Armadillo.java +++ b/net/minecraft/world/entity/animal/armadillo/Armadillo.java -@@ -163,8 +163,10 @@ public class Armadillo extends Animal { +@@ -157,8 +157,10 @@ public class Armadillo extends Animal { return ArmadilloAi.makeBrain(this.brainProvider().makeBrain(dynamic)); } @@ -41,10 +41,10 @@ index b0ce3ab6939cb9e37171bb64e8c5308deb03195e..c520c4e478e3191cea7c2345a2e4c42b ArmadilloAi.updateActivity(this); if (this.isAlive() && !this.isBaby() && --this.scuteTime <= 0) { diff --git a/net/minecraft/world/entity/animal/camel/Camel.java b/net/minecraft/world/entity/animal/camel/Camel.java -index 949b6c563658e6e46ac5842d6f088ecae6d4cd0c..c2107133d3def5ef5de7837499d33b5dbf5c20b6 100644 +index 5a436ae8893cd91944e8269f11c29bc82217c755..98d6411b92ee8923e7a52a008c3e79d4ca87c47e 100644 --- a/net/minecraft/world/entity/animal/camel/Camel.java +++ b/net/minecraft/world/entity/animal/camel/Camel.java -@@ -169,9 +169,11 @@ public class Camel extends AbstractHorse { +@@ -168,9 +168,11 @@ public class Camel extends AbstractHorse { return pose == Pose.SITTING ? SITTING_DIMENSIONS.scale(this.getAgeScale()) : super.getDefaultDimensions(pose); } @@ -56,26 +56,45 @@ index 949b6c563658e6e46ac5842d6f088ecae6d4cd0c..c2107133d3def5ef5de7837499d33b5d ((Brain)brain).tick(level, this); CamelAi.updateActivity(this); super.customServerAiStep(level); +diff --git a/net/minecraft/world/entity/animal/coppergolem/CopperGolem.java b/net/minecraft/world/entity/animal/coppergolem/CopperGolem.java +index 292c9a82028503566c8d3b50b87d09f79619aa7d..80b10da7151929878eb1790eb9fd8b6b55a46034 100644 +--- a/net/minecraft/world/entity/animal/coppergolem/CopperGolem.java ++++ b/net/minecraft/world/entity/animal/coppergolem/CopperGolem.java +@@ -181,11 +181,12 @@ public class CopperGolem extends AbstractGolem implements ContainerUser, Shearab + this.setWeatherState(input.read("weather_state", WeatheringCopper.WeatherState.CODEC).orElse(WeatheringCopper.WeatherState.UNAFFECTED)); + } + ++ private int behaviorTick; // Leaf - Plazma - Add missing Pufferfish configurations + @Override + protected void customServerAiStep(ServerLevel level) { + ProfilerFiller profilerFiller = Profiler.get(); + profilerFiller.push("copperGolemBrain"); +- if (getRider() == null || !this.isControllable()) // Purpur - only use brain if no rider ++ if ((getRider() == null || !this.isControllable()) && this.behaviorTick++ % this.activatedPriority == 0) // Purpur - only use brain if no rider // Leaf - Plazma - Add missing Pufferfish configurations + this.getBrain().tick(level, this); + profilerFiller.pop(); + profilerFiller.push("copperGolemActivityUpdate"); diff --git a/net/minecraft/world/entity/animal/sniffer/Sniffer.java b/net/minecraft/world/entity/animal/sniffer/Sniffer.java -index a762fc8a4616c4e48e11accdca2129fd47f300e6..08bc21733c08b9df28803b36d3fb17aa3cc29345 100644 +index b77b763a3eb58b3135ad9c9cbb8a39f67393397d..e5249022054abfa441b8f951db501a9cd1f5613f 100644 --- a/net/minecraft/world/entity/animal/sniffer/Sniffer.java +++ b/net/minecraft/world/entity/animal/sniffer/Sniffer.java -@@ -493,8 +493,10 @@ public class Sniffer extends Animal { +@@ -492,9 +492,10 @@ public class Sniffer extends Animal { return Brain.provider(SnifferAi.MEMORY_TYPES, SnifferAi.SENSOR_TYPES); } + private int behaviorTick; // Leaf - Plazma - Add missing Pufferfish configurations @Override protected void customServerAiStep(ServerLevel level) { -+ if (this.behaviorTick++ % this.activatedPriority == 0) // Leaf - Plazma - Add missing Pufferfish configurations +- if (getRider() == null || !this.isControllable()) // Purpur - only use brain if no rider ++ if ((getRider() == null || !this.isControllable()) && this.behaviorTick++ % this.activatedPriority == 0) // Purpur - only use brain if no rider // Leaf - Plazma - Add missing Pufferfish configurations this.getBrain().tick(level, this); SnifferAi.updateActivity(this); super.customServerAiStep(level); diff --git a/net/minecraft/world/entity/monster/Zoglin.java b/net/minecraft/world/entity/monster/Zoglin.java -index 2a905e8cdf22f9d7f38cc41c1474e80f704d0cb1..385e6d997ea511dd44a7319879baff14addee8bd 100644 +index 2eb7f602f452917b5d88fd8237898dff920cf0a9..39a17658ed6681e72ba9c6083347183649a816f5 100644 --- a/net/minecraft/world/entity/monster/Zoglin.java +++ b/net/minecraft/world/entity/monster/Zoglin.java -@@ -285,9 +285,10 @@ public class Zoglin extends Monster implements HoglinBase { +@@ -284,9 +284,10 @@ public class Zoglin extends Monster implements HoglinBase { this.setAggressive(this.brain.hasMemoryValue(MemoryModuleType.ATTACK_TARGET)); } @@ -88,25 +107,26 @@ index 2a905e8cdf22f9d7f38cc41c1474e80f704d0cb1..385e6d997ea511dd44a7319879baff14 this.updateActivity(); } diff --git a/net/minecraft/world/entity/monster/breeze/Breeze.java b/net/minecraft/world/entity/monster/breeze/Breeze.java -index d91ce14cc39b1b6ccd558f53ed605d4c6a5acae5..52558a99c915da3c46e5f63bd8014cfcdb38505f 100644 +index 44d638d5d96a58bcfd35cc8e2e0c08389717e48f..06b65dc3784de194f99532bdb85dbfc930a72ae2 100644 --- a/net/minecraft/world/entity/monster/breeze/Breeze.java +++ b/net/minecraft/world/entity/monster/breeze/Breeze.java -@@ -228,8 +228,10 @@ public class Breeze extends Monster { +@@ -230,9 +230,10 @@ public class Breeze extends Monster { return pos.closerThan(center, 4.0, 10.0); } + private int behaviorTick; // Leaf - Plazma - Add missing Pufferfish configurations @Override protected void customServerAiStep(ServerLevel level) { -+ if (this.behaviorTick++ % this.activatedPriority == 0) // Leaf - Plazma - Add missing Pufferfish configurations +- if (getRider() == null || !this.isControllable()) // Purpur - only use brain if no rider ++ if ((getRider() == null || !this.isControllable()) && this.behaviorTick++ % this.activatedPriority == 0) // Purpur - only use brain if no rider // Leaf - Plazma - Add missing Pufferfish configurations this.getBrain().tick(level, this); BreezeAi.updateActivity(this); super.customServerAiStep(level); diff --git a/net/minecraft/world/entity/monster/creaking/Creaking.java b/net/minecraft/world/entity/monster/creaking/Creaking.java -index 775c11f658b81379784f7e5bdfdc8105b3410480..49f962bbbce22dd26555ee2092ceff96e82aa6b2 100644 +index ffa881eb837aff53d50d0ffe8af44bbe2d0aeb6a..a4216d5febb2b432306e9f4de56f8f49d61cbb5e 100644 --- a/net/minecraft/world/entity/monster/creaking/Creaking.java +++ b/net/minecraft/world/entity/monster/creaking/Creaking.java -@@ -232,8 +232,10 @@ public class Creaking extends Monster { +@@ -231,8 +231,10 @@ public class Creaking extends Monster { return (Brain)super.getBrain(); } diff --git a/leaf-server/minecraft-patches/features/0119-Plazma-Add-missing-purpur-configuration-options.patch b/leaf-server/minecraft-patches/features/0112-Plazma-Add-missing-purpur-configuration-options.patch similarity index 87% rename from leaf-server/minecraft-patches/features/0119-Plazma-Add-missing-purpur-configuration-options.patch rename to leaf-server/minecraft-patches/features/0112-Plazma-Add-missing-purpur-configuration-options.patch index 7d820784..2951bd37 100644 --- a/leaf-server/minecraft-patches/features/0119-Plazma-Add-missing-purpur-configuration-options.patch +++ b/leaf-server/minecraft-patches/features/0112-Plazma-Add-missing-purpur-configuration-options.patch @@ -9,10 +9,10 @@ Original project: https://github.com/PlazmaMC/PlazmaBukkit Add more Purpur configurable options for entities diff --git a/net/minecraft/world/entity/animal/allay/Allay.java b/net/minecraft/world/entity/animal/allay/Allay.java -index a25976d6f0dec86b88017cd5f86f3b51c8d7444b..cb88b1afe261f95998a19fcb555f91143834ba3a 100644 +index e274bc617c19af52a79cfcb4cdb7fe70dd8bccdd..1451f09e4908d8e8e883fb68fb94a05fe71d1330 100644 --- a/net/minecraft/world/entity/animal/allay/Allay.java +++ b/net/minecraft/world/entity/animal/allay/Allay.java -@@ -174,6 +174,18 @@ public class Allay extends PathfinderMob implements InventoryCarrier, VibrationS +@@ -173,6 +173,18 @@ public class Allay extends PathfinderMob implements InventoryCarrier, VibrationS } // Purpur end - Configurable entity base attributes @@ -32,10 +32,10 @@ index a25976d6f0dec86b88017cd5f86f3b51c8d7444b..cb88b1afe261f95998a19fcb555f9114 protected Brain.Provider brainProvider() { return Brain.provider(MEMORY_TYPES, SENSOR_TYPES); diff --git a/net/minecraft/world/entity/animal/camel/Camel.java b/net/minecraft/world/entity/animal/camel/Camel.java -index c2107133d3def5ef5de7837499d33b5dbf5c20b6..04c3fb56a4014025b6a9c01e97f0ffbd678b414a 100644 +index 98d6411b92ee8923e7a52a008c3e79d4ca87c47e..80c84294f2294f76d1b65b03326022900e36d076 100644 --- a/net/minecraft/world/entity/animal/camel/Camel.java +++ b/net/minecraft/world/entity/animal/camel/Camel.java -@@ -103,6 +103,18 @@ public class Camel extends AbstractHorse { +@@ -102,6 +102,18 @@ public class Camel extends AbstractHorse { } // Purpur end - Make entity breeding times configurable @@ -54,7 +54,7 @@ index c2107133d3def5ef5de7837499d33b5dbf5c20b6..04c3fb56a4014025b6a9c01e97f0ffbd @Override protected void addAdditionalSaveData(ValueOutput output) { super.addAdditionalSaveData(output); -@@ -173,7 +185,7 @@ public class Camel extends AbstractHorse { +@@ -172,7 +184,7 @@ public class Camel extends AbstractHorse { @Override protected void customServerAiStep(ServerLevel level) { Brain brain = this.getBrain(); @@ -64,10 +64,10 @@ index c2107133d3def5ef5de7837499d33b5dbf5c20b6..04c3fb56a4014025b6a9c01e97f0ffbd CamelAi.updateActivity(this); super.customServerAiStep(level); diff --git a/net/minecraft/world/entity/animal/frog/Frog.java b/net/minecraft/world/entity/animal/frog/Frog.java -index 7d450b6ccde99657a7fac354ae386a80f9f7e879..7143a7b8aae713fd7f2f167a949f98b964e72c78 100644 +index 873e6b3b198602279d2450f85920ae684fa28166..f19cc08b957c1831d0ec75f59ac215a749e894ab 100644 --- a/net/minecraft/world/entity/animal/frog/Frog.java +++ b/net/minecraft/world/entity/animal/frog/Frog.java -@@ -170,6 +170,23 @@ public class Frog extends Animal { +@@ -169,6 +169,23 @@ public class Frog extends Animal { } // Purpur end - Make entity breeding times configurable @@ -92,10 +92,10 @@ index 7d450b6ccde99657a7fac354ae386a80f9f7e879..7143a7b8aae713fd7f2f167a949f98b9 protected Brain.Provider brainProvider() { return Brain.provider(MEMORY_TYPES, SENSOR_TYPES); diff --git a/net/minecraft/world/entity/animal/frog/Tadpole.java b/net/minecraft/world/entity/animal/frog/Tadpole.java -index 5d3479a55a10444e3ad3d9ec16160f9d520a1dc6..0e322f480e0a6302124847e26c4bed06678e78e4 100644 +index 9e1402a37a44a90b2172ba70c2f370e400aedd43..cd2e2a971f4664b17ad8a0d0ccdeb56c440d6592 100644 --- a/net/minecraft/world/entity/animal/frog/Tadpole.java +++ b/net/minecraft/world/entity/animal/frog/Tadpole.java -@@ -108,6 +108,23 @@ public class Tadpole extends AbstractFish { +@@ -107,6 +107,23 @@ public class Tadpole extends AbstractFish { } // Purpur end - Ridables @@ -120,10 +120,10 @@ index 5d3479a55a10444e3ad3d9ec16160f9d520a1dc6..0e322f480e0a6302124847e26c4bed06 protected PathNavigation createNavigation(Level level) { return new WaterBoundPathNavigation(this, level); diff --git a/net/minecraft/world/entity/animal/sniffer/Sniffer.java b/net/minecraft/world/entity/animal/sniffer/Sniffer.java -index 08bc21733c08b9df28803b36d3fb17aa3cc29345..1f545d4c9a3de0d6630a92481920ed6c3553ce97 100644 +index e5249022054abfa441b8f951db501a9cd1f5613f..adffd4112d5577397a42e0577d11b309b5e89113 100644 --- a/net/minecraft/world/entity/animal/sniffer/Sniffer.java +++ b/net/minecraft/world/entity/animal/sniffer/Sniffer.java -@@ -119,6 +119,18 @@ public class Sniffer extends Animal { +@@ -118,6 +118,18 @@ public class Sniffer extends Animal { } // Purpur end - Make entity breeding times configurable @@ -142,20 +142,11 @@ index 08bc21733c08b9df28803b36d3fb17aa3cc29345..1f545d4c9a3de0d6630a92481920ed6c @Override protected void defineSynchedData(SynchedEntityData.Builder builder) { super.defineSynchedData(builder); -@@ -496,7 +508,7 @@ public class Sniffer extends Animal { - private int behaviorTick; // Leaf - Plazma - Add missing Pufferfish configurations - @Override - protected void customServerAiStep(ServerLevel level) { -- if (this.behaviorTick++ % this.activatedPriority == 0) // Leaf - Plazma - Add missing Pufferfish configurations -+ if ((getRider() == null || !this.isControllable()) && this.behaviorTick++ % this.activatedPriority == 0) // Leaf - Plazma - Add missing Pufferfish configurations // Leaf - Plazma - Add missing purpur configuration options - this.getBrain().tick(level, this); - SnifferAi.updateActivity(this); - super.customServerAiStep(level); diff --git a/net/minecraft/world/entity/monster/creaking/Creaking.java b/net/minecraft/world/entity/monster/creaking/Creaking.java -index 49f962bbbce22dd26555ee2092ceff96e82aa6b2..ef0522feaa1cc9704f778309c1e6cf1d68379376 100644 +index a4216d5febb2b432306e9f4de56f8f49d61cbb5e..c4e06706f0bad3213f653a721921e2e9f6b53670 100644 --- a/net/minecraft/world/entity/monster/creaking/Creaking.java +++ b/net/minecraft/world/entity/monster/creaking/Creaking.java -@@ -132,6 +132,18 @@ public class Creaking extends Monster { +@@ -131,6 +131,18 @@ public class Creaking extends Monster { } // Purpur end - Configurable entity base attributes @@ -174,7 +165,7 @@ index 49f962bbbce22dd26555ee2092ceff96e82aa6b2..ef0522feaa1cc9704f778309c1e6cf1d @Override protected BodyRotationControl createBodyControl() { return new Creaking.CreakingBodyRotationControl(this); -@@ -235,7 +247,7 @@ public class Creaking extends Monster { +@@ -234,7 +246,7 @@ public class Creaking extends Monster { private int behaviorTick; // Leaf - Plazma - Add missing Pufferfish configurations @Override protected void customServerAiStep(ServerLevel level) { @@ -184,10 +175,10 @@ index 49f962bbbce22dd26555ee2092ceff96e82aa6b2..ef0522feaa1cc9704f778309c1e6cf1d CreakingAi.updateActivity(this); } diff --git a/net/minecraft/world/entity/monster/warden/Warden.java b/net/minecraft/world/entity/monster/warden/Warden.java -index a6109ac9d7f8a9aa4074b3e9504244b1d565a2d4..e0bd1268f77b7234331c9fea0b11b5b04a66a4ad 100644 +index fba09acf38fa6cc486dc92616d6b008ecb314f87..2c1ec1ede00eccdda0c0069040c899e3d19db72d 100644 --- a/net/minecraft/world/entity/monster/warden/Warden.java +++ b/net/minecraft/world/entity/monster/warden/Warden.java -@@ -148,6 +148,23 @@ public class Warden extends Monster implements VibrationSystem { +@@ -147,6 +147,23 @@ public class Warden extends Monster implements VibrationSystem { } // Purpur end - Ridables @@ -211,20 +202,11 @@ index a6109ac9d7f8a9aa4074b3e9504244b1d565a2d4..e0bd1268f77b7234331c9fea0b11b5b0 @Override public Packet getAddEntityPacket(ServerEntity entity) { return new ClientboundAddEntityPacket(this, entity, this.hasPose(Pose.EMERGING) ? 1 : 0); -@@ -302,7 +319,7 @@ public class Warden extends Monster implements VibrationSystem { - private int behaviorTick = 0; // Pufferfish - @Override - protected void customServerAiStep(ServerLevel level) { -- if (this.behaviorTick++ % this.activatedPriority == 0) // Pufferfish -+ if ((getRider() == null || !this.isControllable()) && this.behaviorTick++ % this.activatedPriority == 0) // Pufferfish // Leaf - Plazma - Add missing purpur configuration options - this.getBrain().tick(level, this); - super.customServerAiStep(level); - if ((this.tickCount + this.getId()) % 120 == 0) { diff --git a/net/minecraft/world/entity/vehicle/AbstractChestBoat.java b/net/minecraft/world/entity/vehicle/AbstractChestBoat.java -index 04b8d4be8d7b36585041b5ff69251d4150e54cae..c73840d0a08366b2d2ee3286589ab4e4e03d122d 100644 +index cf3d4603dc97077192c59f10027027725d9be742..6f6d7efeabd4dbbd627a55990f007c2080fba933 100644 --- a/net/minecraft/world/entity/vehicle/AbstractChestBoat.java +++ b/net/minecraft/world/entity/vehicle/AbstractChestBoat.java -@@ -28,7 +28,7 @@ import net.minecraft.world.level.storage.loot.LootTable; +@@ -29,7 +29,7 @@ import net.minecraft.world.level.storage.loot.LootTable; public abstract class AbstractChestBoat extends AbstractBoat implements HasCustomInventoryScreen, ContainerEntity { private static final int CONTAINER_SIZE = 27; @@ -233,7 +215,7 @@ index 04b8d4be8d7b36585041b5ff69251d4150e54cae..c73840d0a08366b2d2ee3286589ab4e4 @Nullable private ResourceKey lootTable; private long lootTableSeed; -@@ -108,7 +108,7 @@ public abstract class AbstractChestBoat extends AbstractBoat implements HasCusto +@@ -109,7 +109,7 @@ public abstract class AbstractChestBoat extends AbstractBoat implements HasCusto @Override public int getContainerSize() { @@ -243,10 +225,10 @@ index 04b8d4be8d7b36585041b5ff69251d4150e54cae..c73840d0a08366b2d2ee3286589ab4e4 @Override diff --git a/org/purpurmc/purpur/PurpurConfig.java b/org/purpurmc/purpur/PurpurConfig.java -index 88f737304d4f4a774956a1cc39b5c01c37a3891d..21fa7e0e6838bf9a81ee6faf19c944e69b1fe740 100644 +index 31bf765d2dfa75d854f7f8e55bab7792ace843ab..c0772be96d68f9cb6ed7ac686586b6623ae02975 100644 --- a/org/purpurmc/purpur/PurpurConfig.java +++ b/org/purpurmc/purpur/PurpurConfig.java -@@ -317,6 +317,7 @@ public class PurpurConfig { +@@ -327,6 +327,7 @@ public class PurpurConfig { } public static int barrelRows = 3; @@ -254,7 +236,7 @@ index 88f737304d4f4a774956a1cc39b5c01c37a3891d..21fa7e0e6838bf9a81ee6faf19c944e6 public static boolean enderChestSixRows = false; public static boolean enderChestPermissionRows = false; public static boolean cryingObsidianValidForPortalFrame = false; -@@ -360,6 +361,7 @@ public class PurpurConfig { +@@ -370,6 +371,7 @@ public class PurpurConfig { case 1 -> 9; default -> 27; }); diff --git a/leaf-server/minecraft-patches/features/0120-SparklyPaper-Skip-distanceToSqr-call-in-ServerEntity.patch b/leaf-server/minecraft-patches/features/0113-SparklyPaper-Skip-distanceToSqr-call-in-ServerEntity.patch similarity index 82% rename from leaf-server/minecraft-patches/features/0120-SparklyPaper-Skip-distanceToSqr-call-in-ServerEntity.patch rename to leaf-server/minecraft-patches/features/0113-SparklyPaper-Skip-distanceToSqr-call-in-ServerEntity.patch index db472574..33335eaa 100644 --- a/leaf-server/minecraft-patches/features/0120-SparklyPaper-Skip-distanceToSqr-call-in-ServerEntity.patch +++ b/leaf-server/minecraft-patches/features/0113-SparklyPaper-Skip-distanceToSqr-call-in-ServerEntity.patch @@ -11,10 +11,10 @@ The "distanceToSqr" call is a bit expensive, so avoiding it is pretty nice, arou We could also check if the x,y,z coordinates are equal, but for now, let's just keep the identity check, which also helps us since Minecraft's code does reuse the original delta movement Vec3 object diff --git a/net/minecraft/server/level/ServerEntity.java b/net/minecraft/server/level/ServerEntity.java -index b7581796dda77bca66c03e421f2a83a920f44ef1..4859433b0a4160e7ee0af4c2e750956f6ca07649 100644 +index 4e1a33e27f4fcfb21991ac71f8ab4ceb08f899bf..8a893e31be7ad16760b4b5fc561d61b2625aaca5 100644 --- a/net/minecraft/server/level/ServerEntity.java +++ b/net/minecraft/server/level/ServerEntity.java -@@ -215,6 +215,7 @@ public class ServerEntity { +@@ -203,6 +203,7 @@ public class ServerEntity { if (this.entity.hasImpulse || this.trackDelta || this.entity instanceof LivingEntity && ((LivingEntity)this.entity).isFallFlying()) { Vec3 deltaMovement = this.entity.getDeltaMovement(); @@ -22,8 +22,8 @@ index b7581796dda77bca66c03e421f2a83a920f44ef1..4859433b0a4160e7ee0af4c2e750956f double d = deltaMovement.distanceToSqr(this.lastSentMovement); if (d > 1.0E-7 || d > 0.0 && deltaMovement.lengthSqr() == 0.0) { this.lastSentMovement = deltaMovement; -@@ -232,6 +233,7 @@ public class ServerEntity { - this.broadcast.accept(new ClientboundSetEntityMotionPacket(this.entity.getId(), this.lastSentMovement)); +@@ -220,6 +221,7 @@ public class ServerEntity { + this.synchronizer.sendToTrackingPlayers(new ClientboundSetEntityMotionPacket(this.entity.getId(), this.lastSentMovement)); } } + } // SparklyPaper end diff --git a/leaf-server/minecraft-patches/features/0121-SparklyPaper-Skip-MapItem-update-if-the-map-does-not.patch b/leaf-server/minecraft-patches/features/0114-SparklyPaper-Skip-MapItem-update-if-the-map-does-not.patch similarity index 95% rename from leaf-server/minecraft-patches/features/0121-SparklyPaper-Skip-MapItem-update-if-the-map-does-not.patch rename to leaf-server/minecraft-patches/features/0114-SparklyPaper-Skip-MapItem-update-if-the-map-does-not.patch index 77de1c33..698c0b82 100644 --- a/leaf-server/minecraft-patches/features/0121-SparklyPaper-Skip-MapItem-update-if-the-map-does-not.patch +++ b/leaf-server/minecraft-patches/features/0114-SparklyPaper-Skip-MapItem-update-if-the-map-does-not.patch @@ -11,7 +11,7 @@ Optimizes "image in map" maps, without requiring the map to be locked, which som This has the disadvantage that the vanilla map data will never be updated while the CraftMapRenderer is not present, but that's not a huuuge problem for u diff --git a/net/minecraft/world/item/MapItem.java b/net/minecraft/world/item/MapItem.java -index 780793750c99185e8139a1cd0ad52bc7b80899a9..0073f21245c98e7b5791f9db1ad221aef7cb594a 100644 +index 9c64335ae2c37cdf00c3fedf585c95130ea056e3..147e100a0f3e5ce29f7d1828764e02994b4ada64 100644 --- a/net/minecraft/world/item/MapItem.java +++ b/net/minecraft/world/item/MapItem.java @@ -275,12 +275,24 @@ public class MapItem extends Item { diff --git a/leaf-server/minecraft-patches/features/0122-SparklyPaper-Optimize-canSee-checks.patch b/leaf-server/minecraft-patches/features/0115-SparklyPaper-Optimize-canSee-checks.patch similarity index 93% rename from leaf-server/minecraft-patches/features/0122-SparklyPaper-Optimize-canSee-checks.patch rename to leaf-server/minecraft-patches/features/0115-SparklyPaper-Optimize-canSee-checks.patch index 9d18069c..497ba428 100644 --- a/leaf-server/minecraft-patches/features/0122-SparklyPaper-Optimize-canSee-checks.patch +++ b/leaf-server/minecraft-patches/features/0115-SparklyPaper-Optimize-canSee-checks.patch @@ -16,10 +16,10 @@ This seems stupid, but it does seem that it improves the performance a bit, and We also create a "canSee" method tailored for "ChunkMap#updatePlayer()", a method without the equals check (the "updatePlayer()" already checks if the entity is the same entity) because the CraftPlayer's `equals()` check is a *bit* expensive compared to only checking the object's identity, and because the identity has already been check, we don't need to check it twice. diff --git a/net/minecraft/server/level/ChunkMap.java b/net/minecraft/server/level/ChunkMap.java -index 78040fb6b6fd168e62494d3953006bfb38c2909f..74d11e8983f12f6f33fe2eb3016730507e1031d4 100644 +index 42f5e8a1eb10525aa8466e89699cc8be1a098c11..6ecd7388b38804184917a455f7c1346d4b2665e7 100644 --- a/net/minecraft/server/level/ChunkMap.java +++ b/net/minecraft/server/level/ChunkMap.java -@@ -1295,7 +1295,7 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider +@@ -1338,7 +1338,7 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider flag = flag && this.entity.broadcastToPlayer(player) && ChunkMap.this.isChunkTracked(player, this.entity.chunkPosition().x, this.entity.chunkPosition().z); // Paper end - Configurable entity tracking range by Y // CraftBukkit start - respect vanish API diff --git a/leaf-server/minecraft-patches/features/0123-SparklyPaper-Allow-throttling-hopper-checks-if-the-t.patch b/leaf-server/minecraft-patches/features/0116-SparklyPaper-Allow-throttling-hopper-checks-if-the-t.patch similarity index 89% rename from leaf-server/minecraft-patches/features/0123-SparklyPaper-Allow-throttling-hopper-checks-if-the-t.patch rename to leaf-server/minecraft-patches/features/0116-SparklyPaper-Allow-throttling-hopper-checks-if-the-t.patch index cd4e0043..3699dc8f 100644 --- a/leaf-server/minecraft-patches/features/0123-SparklyPaper-Allow-throttling-hopper-checks-if-the-t.patch +++ b/leaf-server/minecraft-patches/features/0116-SparklyPaper-Allow-throttling-hopper-checks-if-the-t.patch @@ -7,10 +7,10 @@ Subject: [PATCH] SparklyPaper: Allow throttling hopper checks if the target Original project: https://github.com/SparklyPower/SparklyPaper diff --git a/net/minecraft/world/level/block/entity/HopperBlockEntity.java b/net/minecraft/world/level/block/entity/HopperBlockEntity.java -index c1fcd9e0ab47332ce48e391c6cd1455960340df3..8dd751dfb0cffbfaa0ec2337faedc508412bd5af 100644 +index 737344e0ca9babd4aaafb6c162eb44df920fac98..c1345bf0d29c6733109fc394cf2984c501d1ac1a 100644 --- a/net/minecraft/world/level/block/entity/HopperBlockEntity.java +++ b/net/minecraft/world/level/block/entity/HopperBlockEntity.java -@@ -423,6 +423,11 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen +@@ -424,6 +424,11 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen } else { Direction opposite = blockEntity.facing.getOpposite(); if (isFullContainer(attachedContainer, opposite)) { diff --git a/leaf-server/minecraft-patches/features/0124-Polpot-Make-egg-and-snowball-can-knockback-player.patch b/leaf-server/minecraft-patches/features/0117-Polpot-Make-egg-and-snowball-can-knockback-player.patch similarity index 93% rename from leaf-server/minecraft-patches/features/0124-Polpot-Make-egg-and-snowball-can-knockback-player.patch rename to leaf-server/minecraft-patches/features/0117-Polpot-Make-egg-and-snowball-can-knockback-player.patch index cf7ba776..f984ecfc 100644 --- a/leaf-server/minecraft-patches/features/0124-Polpot-Make-egg-and-snowball-can-knockback-player.patch +++ b/leaf-server/minecraft-patches/features/0117-Polpot-Make-egg-and-snowball-can-knockback-player.patch @@ -10,7 +10,7 @@ Set hurtMarked to true to be able to send velocity changes under Entity#sendChanges via ClientboundSetEntityMotionPacket diff --git a/net/minecraft/world/entity/projectile/Snowball.java b/net/minecraft/world/entity/projectile/Snowball.java -index d8f9fb603fd2e3e5c1dfc05face7f42b4844daf4..7eada2bc0396b3a167c17f9be2e5ce58add3089b 100644 +index 49694d7fe529fb8197ab4a3a7412d6923ee1bda7..cfa78ed95fd553a5f8cfa3872c8b261572398e9b 100644 --- a/net/minecraft/world/entity/projectile/Snowball.java +++ b/net/minecraft/world/entity/projectile/Snowball.java @@ -54,6 +54,12 @@ public class Snowball extends ThrowableItemProjectile { @@ -27,7 +27,7 @@ index d8f9fb603fd2e3e5c1dfc05face7f42b4844daf4..7eada2bc0396b3a167c17f9be2e5ce58 // Purpur start - options to extinguish fire blocks with snowballs - borrowed and modified code from ThrownPotion#onHitBlock and ThrownPotion#dowseFire diff --git a/net/minecraft/world/entity/projectile/ThrownEgg.java b/net/minecraft/world/entity/projectile/ThrownEgg.java -index 73ec34b43f3fb2aa3edc3f1cb48a923d1fa32036..1d2d8a8129f54ee3017eb8e9c0a6ca1d33fd7133 100644 +index 57cb5b73dae86379be857ffa0f55ef7a056a0b4a..0b6aaabf20bd9c3c2490c9c2d5da420d1de4c78d 100644 --- a/net/minecraft/world/entity/projectile/ThrownEgg.java +++ b/net/minecraft/world/entity/projectile/ThrownEgg.java @@ -54,7 +54,14 @@ public class ThrownEgg extends ThrowableItemProjectile { diff --git a/leaf-server/minecraft-patches/features/0125-Redirect-vanilla-getProfiler-to-inactive-in-PathNavi.patch b/leaf-server/minecraft-patches/features/0118-Redirect-vanilla-getProfiler-to-inactive-in-PathNavi.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0125-Redirect-vanilla-getProfiler-to-inactive-in-PathNavi.patch rename to leaf-server/minecraft-patches/features/0118-Redirect-vanilla-getProfiler-to-inactive-in-PathNavi.patch diff --git a/leaf-server/minecraft-patches/features/0126-Remove-useless-creating-stats-json-bases-on-player-n.patch b/leaf-server/minecraft-patches/features/0119-Remove-useless-creating-stats-json-bases-on-player-n.patch similarity index 85% rename from leaf-server/minecraft-patches/features/0126-Remove-useless-creating-stats-json-bases-on-player-n.patch rename to leaf-server/minecraft-patches/features/0119-Remove-useless-creating-stats-json-bases-on-player-n.patch index 168d2b0f..ff87a228 100644 --- a/leaf-server/minecraft-patches/features/0126-Remove-useless-creating-stats-json-bases-on-player-n.patch +++ b/leaf-server/minecraft-patches/features/0119-Remove-useless-creating-stats-json-bases-on-player-n.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Remove useless creating stats json bases on player name logic diff --git a/net/minecraft/server/players/PlayerList.java b/net/minecraft/server/players/PlayerList.java -index 5812f425870c8db5a48d3717bba40ff6ace2f0c6..f86560200a8625c82961683198541e52c02d7e7f 100644 +index 74ec0aa016b614812ea856700b6f9d7c9222edbe..ab62de68193b762559ef558b66fc259f4361c945 100644 --- a/net/minecraft/server/players/PlayerList.java +++ b/net/minecraft/server/players/PlayerList.java -@@ -1546,6 +1546,8 @@ public abstract class PlayerList { +@@ -1312,6 +1312,8 @@ public abstract class PlayerList { if (serverStatsCounter == null) { File file = this.server.getWorldPath(LevelResource.PLAYER_STATS_DIR).toFile(); File file1 = new File(file, uuid + ".json"); @@ -17,7 +17,7 @@ index 5812f425870c8db5a48d3717bba40ff6ace2f0c6..f86560200a8625c82961683198541e52 if (!file1.exists()) { File file2 = new File(file, displayName + ".json"); // CraftBukkit Path path = file2.toPath(); -@@ -1553,6 +1555,8 @@ public abstract class PlayerList { +@@ -1319,6 +1321,8 @@ public abstract class PlayerList { file2.renameTo(file1); } } diff --git a/leaf-server/minecraft-patches/features/0127-Improve-Purpur-AFK-system.patch b/leaf-server/minecraft-patches/features/0120-Improve-Purpur-AFK-system.patch similarity index 85% rename from leaf-server/minecraft-patches/features/0127-Improve-Purpur-AFK-system.patch rename to leaf-server/minecraft-patches/features/0120-Improve-Purpur-AFK-system.patch index bacf3e07..77af449d 100644 --- a/leaf-server/minecraft-patches/features/0127-Improve-Purpur-AFK-system.patch +++ b/leaf-server/minecraft-patches/features/0120-Improve-Purpur-AFK-system.patch @@ -7,10 +7,10 @@ AFK command & command cooldown AFK title message diff --git a/net/minecraft/commands/Commands.java b/net/minecraft/commands/Commands.java -index 287c0936930ff4f3ca6dc2a4cbfc796a120fe4c0..3f32da75ee0a8a993b54e4156f7e4be9cc922ade 100644 +index 2f2e59f01d6be9b5838f01b33fa74ba7841279b1..3d286d37d726996102f599d8dfbcb08425b58bc5 100644 --- a/net/minecraft/commands/Commands.java +++ b/net/minecraft/commands/Commands.java -@@ -283,6 +283,7 @@ public class Commands { +@@ -284,6 +284,7 @@ public class Commands { StopCommand.register(this.dispatcher); TransferCommand.register(this.dispatcher); WhitelistCommand.register(this.dispatcher); @@ -19,10 +19,10 @@ index 287c0936930ff4f3ca6dc2a4cbfc796a120fe4c0..3f32da75ee0a8a993b54e4156f7e4be9 org.purpurmc.purpur.command.DemoCommand.register(this.dispatcher); // Purpur - Add demo command org.purpurmc.purpur.command.PingCommand.register(this.dispatcher); // Purpur - Add ping command diff --git a/net/minecraft/server/level/ServerPlayer.java b/net/minecraft/server/level/ServerPlayer.java -index 880bf83929e636872eeb53c5c3ec9357972267db..37fe4bbc117c434293689c0a4a1e79e07cff7fd6 100644 +index 14fd49dbf0b01bea6db18c8dc21669b4e3df6efd..f8d40ff11da1be2e214f0a3965f7d856e3e4e366 100644 --- a/net/minecraft/server/level/ServerPlayer.java +++ b/net/minecraft/server/level/ServerPlayer.java -@@ -2434,6 +2434,10 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc +@@ -2555,6 +2555,10 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc // Purpur start - AFK API private boolean isAfk = false; @@ -33,7 +33,7 @@ index 880bf83929e636872eeb53c5c3ec9357972267db..37fe4bbc117c434293689c0a4a1e79e0 @Override public void setAfk(boolean afk) { -@@ -2471,6 +2475,18 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc +@@ -2592,6 +2596,18 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc String prefix = (split.length > 0 ? split[0] : "").replace(org.purpurmc.purpur.PurpurConfig.afkTabListPrefix, ""); String suffix = (split.length > 1 ? split[1] : "").replace(org.purpurmc.purpur.PurpurConfig.afkTabListSuffix, ""); if (afk) { @@ -53,18 +53,18 @@ index 880bf83929e636872eeb53c5c3ec9357972267db..37fe4bbc117c434293689c0a4a1e79e0 } else { getBukkitEntity().setPlayerListName(prefix + scoreboardName + suffix, true); diff --git a/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/net/minecraft/server/network/ServerGamePacketListenerImpl.java -index 2e504082ba5d68874b2d56baa8676b840caf1abe..e61ff0c5051a855e10310d4e6f76d79e9ab86716 100644 +index ddc83171df2ad00f6714bd4c0e4ee459ebba852b..c47f05853d731c967968ec217b8df5a2a8e3d890 100644 --- a/net/minecraft/server/network/ServerGamePacketListenerImpl.java +++ b/net/minecraft/server/network/ServerGamePacketListenerImpl.java -@@ -2371,6 +2371,7 @@ public class ServerGamePacketListenerImpl +@@ -2375,6 +2375,7 @@ public class ServerGamePacketListenerImpl @Override public void handleChatCommand(ServerboundChatCommandPacket packet) { + final boolean isAfkCommandCooldown = this.performAfkCooldown(packet.command()); // Leaf - Improve Purpur AFK system - this.tryHandleChat(packet.command(), () -> { + this.tryHandleChat(packet.command(), true, () -> { // CraftBukkit start - SPIGOT-7346: Prevent disconnected players from executing commands if (this.player.hasDisconnected()) { -@@ -2379,7 +2380,7 @@ public class ServerGamePacketListenerImpl +@@ -2383,7 +2384,7 @@ public class ServerGamePacketListenerImpl // CraftBukkit end this.performUnsignedChatCommand(packet.command()); this.detectRateSpam("/" + packet.command()); // Spigot @@ -73,15 +73,15 @@ index 2e504082ba5d68874b2d56baa8676b840caf1abe..e61ff0c5051a855e10310d4e6f76d79e } private void performUnsignedChatCommand(String command) { -@@ -2412,6 +2413,7 @@ public class ServerGamePacketListenerImpl +@@ -2416,6 +2417,7 @@ public class ServerGamePacketListenerImpl public void handleSignedChatCommand(ServerboundChatCommandSignedPacket packet) { Optional optional = this.unpackAndApplyLastSeen(packet.lastSeenMessages()); if (!optional.isEmpty()) { + final boolean isAfkCommandCooldown = this.performAfkCooldown(packet.command()); // Leaf - Improve Purpur AFK system - this.tryHandleChat(packet.command(), () -> { + this.tryHandleChat(packet.command(), true, () -> { // CraftBukkit start - SPIGOT-7346: Prevent disconnected players from executing commands if (this.player.hasDisconnected()) { -@@ -2420,7 +2422,7 @@ public class ServerGamePacketListenerImpl +@@ -2424,7 +2426,7 @@ public class ServerGamePacketListenerImpl // CraftBukkit end this.performSignedChatCommand(packet, optional.get()); this.detectRateSpam("/" + packet.command()); // Spigot @@ -90,27 +90,27 @@ index 2e504082ba5d68874b2d56baa8676b840caf1abe..e61ff0c5051a855e10310d4e6f76d79e } } -@@ -2527,12 +2529,17 @@ public class ServerGamePacketListenerImpl +@@ -2531,12 +2533,17 @@ public class ServerGamePacketListenerImpl return dispatcher.parse(command, this.player.createCommandSourceStack()); } -- private void tryHandleChat(String message, Runnable handler, boolean sync) { // CraftBukkit +- private void tryHandleChat(String message, boolean bypassHiddenChat, Runnable handler, boolean sync) { // CraftBukkit + // Leaf start - Improve Purpur AFK system -+ private void tryHandleChat(String message, Runnable handler, boolean sync) { -+ tryHandleChat(message, handler, sync, false); ++ private void tryHandleChat(String message, boolean bypassHiddenChat, Runnable handler, boolean sync) { ++ tryHandleChat(message, bypassHiddenChat, handler, sync, false); + } -+ private void tryHandleChat(String message, Runnable handler, boolean sync, boolean afkCommandCooldown) { // CraftBukkit ++ private void tryHandleChat(String message, boolean bypassHiddenChat, Runnable handler, boolean sync, boolean afkCommandCooldown) { // CraftBukkit + // Leaf end - Improve Purpur AFK system if (isChatMessageIllegal(message)) { this.disconnectAsync(Component.translatable("multiplayer.disconnect.illegal_characters"), org.bukkit.event.player.PlayerKickEvent.Cause.ILLEGAL_CHARACTERS); // Paper - add proper async disconnect - } else if (this.player.isRemoved() || this.player.getChatVisibility() == ChatVisiblity.HIDDEN) { // CraftBukkit - dead men tell no tales + } else if (this.player.isRemoved() || (!bypassHiddenChat && this.player.getChatVisibility() == ChatVisiblity.HIDDEN)) { // CraftBukkit - dead men tell no tales this.send(new ClientboundSystemChatPacket(Component.translatable("chat.disabled.options").withStyle(ChatFormatting.RED), false)); - } else if (player.didPlayerJoinEvent) { // Gale - EMC - do not process chat/commands before player has joined + } else if (player.didPlayerJoinEvent && !afkCommandCooldown) { // Gale - EMC - do not process chat/commands before player has joined // Leaf - Improve Purpur AFK system - don't process afk command if in cooldown this.player.resetLastActionTime(); // CraftBukkit start if (sync) { -@@ -2544,6 +2551,40 @@ public class ServerGamePacketListenerImpl +@@ -2548,6 +2555,40 @@ public class ServerGamePacketListenerImpl } } @@ -152,11 +152,11 @@ index 2e504082ba5d68874b2d56baa8676b840caf1abe..e61ff0c5051a855e10310d4e6f76d79e synchronized (this.lastSeenMessages) { Optional var10000; diff --git a/net/minecraft/server/players/PlayerList.java b/net/minecraft/server/players/PlayerList.java -index f86560200a8625c82961683198541e52c02d7e7f..cd7e2e7bdfff90b7147de20dd44fdf2709c4c28f 100644 +index ab62de68193b762559ef558b66fc259f4361c945..1d9c283997e17cc544caeab6547209d73c33458b 100644 --- a/net/minecraft/server/players/PlayerList.java +++ b/net/minecraft/server/players/PlayerList.java -@@ -676,6 +676,7 @@ public abstract class PlayerList { - org.leavesmc.leaves.protocol.core.LeavesProtocolManager.handlePlayerLeave(player); // Leaves - protocol +@@ -436,6 +436,7 @@ public abstract class PlayerList { + 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 org.purpurmc.purpur.task.BossBarTask.removeFromAll(player.getBukkitEntity()); // Purpur - Implement TPSBar + net.minecraft.server.network.ServerGamePacketListenerImpl.afkCooldown.remove(player.getBukkitEntity().getUniqueId()); // Leaf - Improve Purpur AFK system @@ -164,7 +164,7 @@ index f86560200a8625c82961683198541e52c02d7e7f..cd7e2e7bdfff90b7147de20dd44fdf27 player.awardStat(Stats.LEAVE_GAME); // CraftBukkit start - Quitting must be before we do final save of data, in case plugins need to modify it diff --git a/org/purpurmc/purpur/PurpurConfig.java b/org/purpurmc/purpur/PurpurConfig.java -index 21fa7e0e6838bf9a81ee6faf19c944e69b1fe740..f8045ef8b800b608388fbdc31337ab349a54b8a6 100644 +index c0772be96d68f9cb6ed7ac686586b6623ae02975..40e0545764ee3e7a8c8013151ae7928a20baab11 100644 --- a/org/purpurmc/purpur/PurpurConfig.java +++ b/org/purpurmc/purpur/PurpurConfig.java @@ -175,6 +175,11 @@ public class PurpurConfig { diff --git a/leaf-server/minecraft-patches/features/0128-Virtual-thread-for-chat-executor.patch b/leaf-server/minecraft-patches/features/0121-Virtual-thread-for-chat-executor.patch similarity index 90% rename from leaf-server/minecraft-patches/features/0128-Virtual-thread-for-chat-executor.patch rename to leaf-server/minecraft-patches/features/0121-Virtual-thread-for-chat-executor.patch index a158f225..51412774 100644 --- a/leaf-server/minecraft-patches/features/0128-Virtual-thread-for-chat-executor.patch +++ b/leaf-server/minecraft-patches/features/0121-Virtual-thread-for-chat-executor.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Virtual thread for chat executor diff --git a/net/minecraft/server/MinecraftServer.java b/net/minecraft/server/MinecraftServer.java -index 9da4c27c7d0b6c0d328d592aa78eac1d073eb1fe..07c371c4d65b4fec7b9701a7de62f18399d80df0 100644 +index 8db746c169642995fa902c435f25a4b20ca1550a..4b23df9c00c83e2229ca5c9ed9645082183d72ce 100644 --- a/net/minecraft/server/MinecraftServer.java +++ b/net/minecraft/server/MinecraftServer.java -@@ -2650,7 +2650,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop void writeJsonWithCodec(Codec codec, T value, int maxLength) { // Paper end - Adventure; add max length parameter DataResult dataResult = codec.encodeStart(JsonOps.INSTANCE, value); @@ -59,10 +59,10 @@ index b5afc05924ae899e020c303c8b86398e1d4ab8a0..73c2ed488c34cddbafdcbb6f2636264e } diff --git a/net/minecraft/network/protocol/status/ServerStatus.java b/net/minecraft/network/protocol/status/ServerStatus.java -index a491be4250de3199c3e1aa9e5482b568692bd2f5..5db038df25a1b5bf2f7395464250dc0bbf8d8241 100644 +index 88447fc2108126ccfad2fb7eb79ac94537f132d3..b92afce6de3daa968262db8d5d917a2c054fa15c 100644 --- a/net/minecraft/network/protocol/status/ServerStatus.java +++ b/net/minecraft/network/protocol/status/ServerStatus.java -@@ -23,7 +23,10 @@ public record ServerStatus( +@@ -22,7 +22,10 @@ public record ServerStatus( boolean enforcesSecureChat ) { public static final Codec CODEC = RecordCodecBuilder.create( @@ -74,7 +74,7 @@ index a491be4250de3199c3e1aa9e5482b568692bd2f5..5db038df25a1b5bf2f7395464250dc0b ComponentSerialization.CODEC.lenientOptionalFieldOf("description", CommonComponents.EMPTY).forGetter(ServerStatus::description), ServerStatus.Players.CODEC.lenientOptionalFieldOf("players").forGetter(ServerStatus::players), ServerStatus.Version.CODEC.lenientOptionalFieldOf("version").forGetter(ServerStatus::version), -@@ -31,6 +34,15 @@ public record ServerStatus( +@@ -30,6 +33,15 @@ public record ServerStatus( Codec.BOOL.lenientOptionalFieldOf("enforcesSecureChat", false).forGetter(ServerStatus::enforcesSecureChat) ) .apply(instance, ServerStatus::new) @@ -91,10 +91,10 @@ index a491be4250de3199c3e1aa9e5482b568692bd2f5..5db038df25a1b5bf2f7395464250dc0b public record Favicon(byte[] iconBytes) { diff --git a/net/minecraft/server/dedicated/DedicatedServer.java b/net/minecraft/server/dedicated/DedicatedServer.java -index 87fc8861948b50361ec04c5a23406d3abdec6eac..77f11179836636424927843f5f10c3fd23d2b2d4 100644 +index d95d21d7075cb3da4fcd4307443aad5a6b838768..2ad2b10ea5548097fcb0e4d40fb08766edb15279 100644 --- a/net/minecraft/server/dedicated/DedicatedServer.java +++ b/net/minecraft/server/dedicated/DedicatedServer.java -@@ -614,6 +614,7 @@ public class DedicatedServer extends MinecraftServer implements ServerInterface +@@ -823,6 +823,7 @@ public class DedicatedServer extends MinecraftServer implements ServerInterface @Override public boolean enforceSecureProfile() { @@ -103,10 +103,10 @@ index 87fc8861948b50361ec04c5a23406d3abdec6eac..77f11179836636424927843f5f10c3fd // Paper start - Add setting for proxy online mode status return properties.enforceSecureProfile diff --git a/net/minecraft/server/network/ServerCommonPacketListenerImpl.java b/net/minecraft/server/network/ServerCommonPacketListenerImpl.java -index c04772c15842a07e57d28a979bdceb1fe7547d61..3479ed772125b619dea7aed2a6695b8f7f08e1e8 100644 +index a174f188487ff769dd6712f926a8c450468a9267..e9fe1ed1c77daf7cfc79745d61d90855c92f779e 100644 --- a/net/minecraft/server/network/ServerCommonPacketListenerImpl.java +++ b/net/minecraft/server/network/ServerCommonPacketListenerImpl.java -@@ -363,10 +363,30 @@ public abstract class ServerCommonPacketListenerImpl implements ServerCommonPack +@@ -349,10 +349,30 @@ public abstract class ServerCommonPacketListenerImpl implements ServerCommonPack } public void send(Packet packet) { @@ -125,10 +125,10 @@ index c04772c15842a07e57d28a979bdceb1fe7547d61..3479ed772125b619dea7aed2a6695b8f this.send(packet, null); } - public void send(Packet packet, @Nullable ChannelFutureListener channelFutureListener) { + public void send(Packet packet, @Nullable ChannelFutureListener sendListener) { + // Leaf start - Mirai - Configurable chat message signatures + if (!org.dreeam.leaf.config.modules.network.ChatMessageSignature.enabled) { -+ if (packet instanceof net.minecraft.network.protocol.game.ClientboundPlayerChatPacket chat && channelFutureListener != null) { ++ if (packet instanceof net.minecraft.network.protocol.game.ClientboundPlayerChatPacket chat && sendListener != null) { + this.send(chat); + return; + } @@ -138,10 +138,10 @@ index c04772c15842a07e57d28a979bdceb1fe7547d61..3479ed772125b619dea7aed2a6695b8f if (packet == null || this.processedDisconnect) { // Spigot return; diff --git a/net/minecraft/server/players/PlayerList.java b/net/minecraft/server/players/PlayerList.java -index cd7e2e7bdfff90b7147de20dd44fdf2709c4c28f..f09c1472d465de94b16e958ec7051f34aae7402f 100644 +index 1d9c283997e17cc544caeab6547209d73c33458b..a4b08439929f6a746bd525e5d322c291fe128ea8 100644 --- a/net/minecraft/server/players/PlayerList.java +++ b/net/minecraft/server/players/PlayerList.java -@@ -1506,7 +1506,7 @@ public abstract class PlayerList { +@@ -1272,7 +1272,7 @@ public abstract class PlayerList { public void broadcastChatMessage(PlayerChatMessage message, Predicate shouldFilterMessageTo, @Nullable ServerPlayer sender, ChatType.Bound boundChatType, @Nullable Function unsignedFunction) { // Paper end boolean flag = this.verifyChatTrusted(message); @@ -150,7 +150,7 @@ index cd7e2e7bdfff90b7147de20dd44fdf2709c4c28f..f09c1472d465de94b16e958ec7051f34 OutgoingChatMessage outgoingChatMessage = OutgoingChatMessage.create(message); boolean flag1 = false; -@@ -1531,6 +1531,7 @@ public abstract class PlayerList { +@@ -1297,6 +1297,7 @@ public abstract class PlayerList { } public boolean verifyChatTrusted(PlayerChatMessage message) { diff --git a/leaf-server/minecraft-patches/features/0131-Matter-Secure-Seed.patch b/leaf-server/minecraft-patches/features/0124-Matter-Secure-Seed.patch similarity index 88% rename from leaf-server/minecraft-patches/features/0131-Matter-Secure-Seed.patch rename to leaf-server/minecraft-patches/features/0124-Matter-Secure-Seed.patch index 52605e3e..2a6964d4 100644 --- a/leaf-server/minecraft-patches/features/0131-Matter-Secure-Seed.patch +++ b/leaf-server/minecraft-patches/features/0124-Matter-Secure-Seed.patch @@ -13,10 +13,10 @@ Co-authored-by: Dreeam <61569423+Dreeam-qwq@users.noreply.github.com> Co-authored-by: HaHaWTH <102713261+HaHaWTH@users.noreply.github.com> diff --git a/net/minecraft/server/dedicated/DedicatedServerProperties.java b/net/minecraft/server/dedicated/DedicatedServerProperties.java -index b286dc17cda16fca3af9374d2a4a8bd137c24450..72028edf5bbe8094779139c4a52da2a95fef10e8 100644 +index a9cd61f0a7bde931e59f1496191f1f8d465aec5e..b5ceb373a3d4e6aacced8ad60100ac1f3a409b67 100644 --- a/net/minecraft/server/dedicated/DedicatedServerProperties.java +++ b/net/minecraft/server/dedicated/DedicatedServerProperties.java -@@ -116,7 +116,17 @@ public class DedicatedServerProperties extends Settings GsonHelper.parse(!property.isEmpty() ? property : "{}"), new JsonObject()), this.get("level-type", property -> property.toLowerCase(Locale.ROOT), WorldPresets.NORMAL.location().toString()) diff --git a/net/minecraft/server/level/ServerChunkCache.java b/net/minecraft/server/level/ServerChunkCache.java -index 4979171c8da6f366aab636fb3058ca457fe75061..91574985958950dffe0f393d7dfac4818af3b151 100644 +index fec85f11ad875b248c313230790af9bccc1260cf..81e6750d683818e644bc2b6593f332220112b8e0 100644 --- a/net/minecraft/server/level/ServerChunkCache.java +++ b/net/minecraft/server/level/ServerChunkCache.java -@@ -675,6 +675,7 @@ public class ServerChunkCache extends ChunkSource implements ca.spottedleaf.moon +@@ -670,6 +670,7 @@ public class ServerChunkCache extends ChunkSource implements ca.spottedleaf.moon } public ChunkGenerator getGenerator() { @@ -48,10 +48,10 @@ index 4979171c8da6f366aab636fb3058ca457fe75061..91574985958950dffe0f393d7dfac481 } diff --git a/net/minecraft/server/level/ServerLevel.java b/net/minecraft/server/level/ServerLevel.java -index 66b7205ea7da8b452e6e66676d75d2b29ed6b6d5..3e4d17bf0a67e8196baf405b3e95c4fb49df000d 100644 +index b1ac9bf962882294cd4545a4b2a351601652ac93..6ef4a0a547db00e637f57014ef5eea267838375a 100644 --- a/net/minecraft/server/level/ServerLevel.java +++ b/net/minecraft/server/level/ServerLevel.java -@@ -628,6 +628,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe +@@ -646,6 +646,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe chunkGenerator = new org.bukkit.craftbukkit.generator.CustomChunkGenerator(this, chunkGenerator, gen); } // CraftBukkit end @@ -60,10 +60,10 @@ index 66b7205ea7da8b452e6e66676d75d2b29ed6b6d5..3e4d17bf0a67e8196baf405b3e95c4fb DataFixer fixerUpper = server.getFixerUpper(); // Paper - rewrite chunk system diff --git a/net/minecraft/world/entity/monster/Slime.java b/net/minecraft/world/entity/monster/Slime.java -index b299fc08fe900b4d48ce3e6986bcea000253053e..2885d4271405409ad2a681ea13aadf383a3520ca 100644 +index 970105d598964194e167ad243f6e2fc2a19fba08..5371332ace4ea7b45d1cd4895d937364f40ad1a8 100644 --- a/net/minecraft/world/entity/monster/Slime.java +++ b/net/minecraft/world/entity/monster/Slime.java -@@ -413,7 +413,11 @@ public class Slime extends Mob implements Enemy { +@@ -408,7 +408,11 @@ public class Slime extends Mob implements Enemy { } ChunkPos chunkPos = new ChunkPos(pos); @@ -77,13 +77,13 @@ index b299fc08fe900b4d48ce3e6986bcea000253053e..2885d4271405409ad2a681ea13aadf38 final double maxHeightSlimeChunk = level.getMinecraftWorld().paperConfig().entities.spawning.slimeSpawnHeight.slimeChunk.maximum; if (random.nextInt(10) == 0 && flag && pos.getY() < maxHeightSlimeChunk) { diff --git a/net/minecraft/world/level/chunk/ChunkAccess.java b/net/minecraft/world/level/chunk/ChunkAccess.java -index 182c14b660f8860bed627eed4e01fd4002153e9a..686c031ec73acc80683aaa39a78fe9221f0215a6 100644 +index 9889485b15501c1adf1a73bb4603d3477860482d..2d08ce60ed63491388db1e5b9719fa0f3b5502a0 100644 --- a/net/minecraft/world/level/chunk/ChunkAccess.java +++ b/net/minecraft/world/level/chunk/ChunkAccess.java -@@ -88,6 +88,10 @@ public abstract class ChunkAccess implements BiomeManager.NoiseBiomeSource, Ligh +@@ -86,6 +86,10 @@ public abstract class ChunkAccess implements BiomeManager.NoiseBiomeSource, Ligh + private static final org.bukkit.craftbukkit.persistence.CraftPersistentDataTypeRegistry DATA_TYPE_REGISTRY = new org.bukkit.craftbukkit.persistence.CraftPersistentDataTypeRegistry(); public org.bukkit.craftbukkit.persistence.DirtyCraftPersistentDataContainer persistentDataContainer = new org.bukkit.craftbukkit.persistence.DirtyCraftPersistentDataContainer(ChunkAccess.DATA_TYPE_REGISTRY); // CraftBukkit end - public final Registry biomeRegistry; // CraftBukkit + // Leaf start - Matter - Secure Seed + private boolean slimeChunk; + private boolean hasComputedSlimeChunk; @@ -91,7 +91,7 @@ index 182c14b660f8860bed627eed4e01fd4002153e9a..686c031ec73acc80683aaa39a78fe922 // Paper start - rewrite chunk system private volatile ca.spottedleaf.moonrise.patches.starlight.light.SWMRNibbleArray[] blockNibbles; -@@ -192,6 +196,17 @@ public abstract class ChunkAccess implements BiomeManager.NoiseBiomeSource, Ligh +@@ -189,6 +193,17 @@ public abstract class ChunkAccess implements BiomeManager.NoiseBiomeSource, Ligh return GameEventListenerRegistry.NOOP; } @@ -110,10 +110,10 @@ index 182c14b660f8860bed627eed4e01fd4002153e9a..686c031ec73acc80683aaa39a78fe922 @Nullable diff --git a/net/minecraft/world/level/chunk/ChunkGenerator.java b/net/minecraft/world/level/chunk/ChunkGenerator.java -index 854578c7880dc124980142941ee471072668c8e2..b21822f069e112cdf16fe995485e2a5b1d229a8c 100644 +index 213fd45bd70d347a91c46244b61d8b77f11bf6fb..dfd662e25d8908c0fe4efea10cb7d669413f25b5 100644 --- a/net/minecraft/world/level/chunk/ChunkGenerator.java +++ b/net/minecraft/world/level/chunk/ChunkGenerator.java -@@ -342,7 +342,11 @@ public abstract class ChunkGenerator { +@@ -346,7 +346,11 @@ public abstract class ChunkGenerator { Registry registry = level.registryAccess().lookupOrThrow(Registries.STRUCTURE); Map> map = registry.stream().collect(Collectors.groupingBy(structure1 -> structure1.step().ordinal())); List list = this.featuresPerStep.get(); @@ -126,26 +126,26 @@ index 854578c7880dc124980142941ee471072668c8e2..b21822f069e112cdf16fe995485e2a5b long l = worldgenRandom.setDecorationSeed(level.getSeed(), blockPos.getX(), blockPos.getZ()); Set> set = new ObjectArraySet<>(); ChunkPos.rangeClosed(sectionPos.chunk(), 1).forEach(chunkPos -> { -@@ -551,8 +555,15 @@ public abstract class ChunkGenerator { - } else { - ArrayList list1 = new ArrayList<>(list.size()); - list1.addAll(list); -- WorldgenRandom worldgenRandom = new WorldgenRandom(new LegacyRandomSource(0L)); -- worldgenRandom.setLargeFeatureSeed(structureState.getLevelSeed(), pos.x, pos.z); -+ // Leaf start - Matter - Secure Seed -+ WorldgenRandom worldgenRandom; -+ if (org.dreeam.leaf.config.modules.misc.SecureSeed.enabled) { -+ worldgenRandom = new su.plo.matter.WorldgenCryptoRandom(pos.x, pos.z, su.plo.matter.Globals.Salt.GENERATE_FEATURE, 0); -+ } else { -+ worldgenRandom = new WorldgenRandom(new LegacyRandomSource(0L)); -+ worldgenRandom.setLargeFeatureSeed(structureState.getLevelSeed(), pos.x, pos.z); -+ } -+ // Leaf end - Matter - Secure Seed - int i = 0; +@@ -561,8 +565,15 @@ public abstract class ChunkGenerator { + } else { + ArrayList list1 = new ArrayList<>(list.size()); + list1.addAll(list); +- WorldgenRandom worldgenRandom = new WorldgenRandom(new LegacyRandomSource(0L)); +- worldgenRandom.setLargeFeatureSeed(structureState.getLevelSeed(), pos.x, pos.z); ++ // Leaf start - Matter - Secure Seed ++ WorldgenRandom worldgenRandom; ++ if (org.dreeam.leaf.config.modules.misc.SecureSeed.enabled) { ++ worldgenRandom = new su.plo.matter.WorldgenCryptoRandom(pos.x, pos.z, su.plo.matter.Globals.Salt.GENERATE_FEATURE, 0); ++ } else { ++ worldgenRandom = new WorldgenRandom(new LegacyRandomSource(0L)); ++ worldgenRandom.setLargeFeatureSeed(structureState.getLevelSeed(), pos.x, pos.z); ++ } ++ // Leaf end - Matter - Secure Seed + int i = 0; - for (StructureSet.StructureSelectionEntry structureSelectionEntry1 : list1) { + for (StructureSet.StructureSelectionEntry structureSelectionEntry1 : list1) { diff --git a/net/minecraft/world/level/chunk/ChunkGeneratorStructureState.java b/net/minecraft/world/level/chunk/ChunkGeneratorStructureState.java -index f07a5416e5dc7e9a798a78ce9573a0c42bc59d04..426692d9627f46d708f551bd22ce3c52b2a23b37 100644 +index 327b992196e22c2b3ede61dc584614449565ae84..5a4626ed32bd70e8584b065e706160a2f676d03f 100644 --- a/net/minecraft/world/level/chunk/ChunkGeneratorStructureState.java +++ b/net/minecraft/world/level/chunk/ChunkGeneratorStructureState.java @@ -205,7 +205,12 @@ public class ChunkGeneratorStructureState { @@ -363,13 +363,13 @@ index ee0d9dddb36b6879fa113299e24f1aa3b2b151cc..6584c9320361dbbdea1899ab9e43b444 int i3 = this.spreadType.evaluate(worldgenRandom, i2); int i4 = this.spreadType.evaluate(worldgenRandom, i2); diff --git a/net/minecraft/world/level/levelgen/structure/placement/StructurePlacement.java b/net/minecraft/world/level/levelgen/structure/placement/StructurePlacement.java -index f2eb0572b9d97d97bc847082461515a852310dfc..14e352aedeeb1cf088278d9551d0204b06593ceb 100644 +index 26b1b448c95ab38a449843a0ce929a008019b151..f2315e2c4d7a635ff17e22d2f80182f698544478 100644 --- a/net/minecraft/world/level/levelgen/structure/placement/StructurePlacement.java +++ b/net/minecraft/world/level/levelgen/structure/placement/StructurePlacement.java -@@ -119,8 +119,16 @@ public abstract class StructurePlacement { +@@ -119,8 +119,15 @@ public abstract class StructurePlacement { public abstract StructurePlacementType type(); - private static boolean probabilityReducer(long levelSeed, int regionX, int regionZ, int salt, float probability, @org.jetbrains.annotations.Nullable Integer saltOverride) { // Paper - Add missing structure set seed configs; ignore here + private static boolean probabilityReducer(long levelSeed, int regionX, int regionZ, int salt, float probability, @javax.annotation.Nullable Integer saltOverride) { // Paper - Add missing structure set seed configs; ignore here - WorldgenRandom worldgenRandom = new WorldgenRandom(new LegacyRandomSource(0L)); - worldgenRandom.setLargeFeatureWithSalt(levelSeed, regionX, regionZ, salt); + // Leaf start - Matter - Secure Seed @@ -378,15 +378,14 @@ index f2eb0572b9d97d97bc847082461515a852310dfc..14e352aedeeb1cf088278d9551d0204b + worldgenRandom = new su.plo.matter.WorldgenCryptoRandom(regionX, regionZ, su.plo.matter.Globals.Salt.UNDEFINED, salt); + } else { + worldgenRandom = new WorldgenRandom(new LegacyRandomSource(0L)); -+ worldgenRandom.setLargeFeatureWithSalt(levelSeed, salt, regionX, regionZ); ++ worldgenRandom.setLargeFeatureWithSalt(levelSeed, regionX, regionZ, salt); + } + // Leaf end - Matter - Secure Seed -+ return worldgenRandom.nextFloat() < probability; } diff --git a/net/minecraft/world/level/levelgen/structure/pools/JigsawPlacement.java b/net/minecraft/world/level/levelgen/structure/pools/JigsawPlacement.java -index 1cfa0fcd28685736fcdce4aef817e4d4cc4061cb..400e5d1c415835a87648ae0d1aa92ac4063ae93c 100644 +index 4e3302e8f28c7f12dc5fbaeb6c1f5715a9afc8e5..4cf44dea635adb8fe3eefc934dd7424b77652740 100644 --- a/net/minecraft/world/level/levelgen/structure/pools/JigsawPlacement.java +++ b/net/minecraft/world/level/levelgen/structure/pools/JigsawPlacement.java @@ -64,7 +64,11 @@ public class JigsawPlacement { diff --git a/leaf-server/minecraft-patches/features/0132-Matter-Secure-Seed-command.patch b/leaf-server/minecraft-patches/features/0125-Matter-Secure-Seed-command.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0132-Matter-Secure-Seed-command.patch rename to leaf-server/minecraft-patches/features/0125-Matter-Secure-Seed-command.patch diff --git a/leaf-server/minecraft-patches/features/0133-Faster-random-generator.patch b/leaf-server/minecraft-patches/features/0126-Faster-random-generator.patch similarity index 86% rename from leaf-server/minecraft-patches/features/0133-Faster-random-generator.patch rename to leaf-server/minecraft-patches/features/0126-Faster-random-generator.patch index cdad815f..bf37e32c 100644 --- a/leaf-server/minecraft-patches/features/0133-Faster-random-generator.patch +++ b/leaf-server/minecraft-patches/features/0126-Faster-random-generator.patch @@ -14,10 +14,10 @@ ThreadUnsafeRandom (Moonrise): 102,265,100 ns SimpleThreadUnsafeRandom (Moonrise): 97,054,600 ns diff --git a/net/minecraft/server/level/ServerChunkCache.java b/net/minecraft/server/level/ServerChunkCache.java -index 91574985958950dffe0f393d7dfac4818af3b151..eaaa66c4d86d4ebda0acf8f1dbe8ecb55aa28285 100644 +index 81e6750d683818e644bc2b6593f332220112b8e0..87bbe127a406d3e965c4240e1cf14e5b1ff18571 100644 --- a/net/minecraft/server/level/ServerChunkCache.java +++ b/net/minecraft/server/level/ServerChunkCache.java -@@ -154,7 +154,7 @@ public class ServerChunkCache extends ChunkSource implements ca.spottedleaf.moon +@@ -155,7 +155,7 @@ public class ServerChunkCache extends ChunkSource implements ca.spottedleaf.moon } // Paper end - rewrite chunk system // Paper start - chunk tick iteration optimisations @@ -27,10 +27,10 @@ index 91574985958950dffe0f393d7dfac4818af3b151..eaaa66c4d86d4ebda0acf8f1dbe8ecb5 final ServerLevel world = this.level; final int randomTickSpeed = world.getGameRules().getInt(GameRules.RULE_RANDOMTICKING); diff --git a/net/minecraft/server/level/ServerLevel.java b/net/minecraft/server/level/ServerLevel.java -index 3e4d17bf0a67e8196baf405b3e95c4fb49df000d..7734bb9678c58edba6148d48c6b8d89e0345bed1 100644 +index 6ef4a0a547db00e637f57014ef5eea267838375a..9f85d31b4f07d41f982b85b7d840e724bd0da148 100644 --- a/net/minecraft/server/level/ServerLevel.java +++ b/net/minecraft/server/level/ServerLevel.java -@@ -895,7 +895,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe +@@ -923,7 +923,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe private void optimiseRandomTick(final LevelChunk chunk, final int tickSpeed) { final LevelChunkSection[] sections = chunk.getSections(); final int minSection = ca.spottedleaf.moonrise.common.util.WorldUtil.getMinSection((ServerLevel)(Object)this); @@ -39,7 +39,7 @@ index 3e4d17bf0a67e8196baf405b3e95c4fb49df000d..7734bb9678c58edba6148d48c6b8d89e final boolean doubleTickFluids = !ca.spottedleaf.moonrise.common.PlatformHooks.get().configFixMC224294(); final ChunkPos cpos = chunk.getPos(); -@@ -944,7 +944,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe +@@ -972,7 +972,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe private int currentIceAndSnowTick = 0; protected void resetIceAndSnowTick() { this.currentIceAndSnowTick = this.simpleRandom.nextInt(16); } // Gale - Airplane - optimize random calls in chunk ticking public void tickChunk(LevelChunk chunk, int randomTickSpeed) { @@ -97,10 +97,10 @@ index 8516d47b0ba79d91638837199e7ae0fb6cb44a79..4f4b55dd099dd2c2fea118b18b535881 RandomSource fork(); diff --git a/net/minecraft/world/entity/Entity.java b/net/minecraft/world/entity/Entity.java -index 4a1cfd5247073bd57f88151425ea1c866d971c4d..d544d66542d53db1a847a6b1ab8cf5ee848f31de 100644 +index 5b11ba3e001252c702122ebedb251df4ae1f1625..1cd0936b0fc6b582bab45a56cee416b0d309f81a 100644 --- a/net/minecraft/world/entity/Entity.java +++ b/net/minecraft/world/entity/Entity.java -@@ -155,7 +155,7 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess +@@ -157,7 +157,7 @@ public abstract class Entity implements SyncedDataHolder, DebugValueSource, Name } // Paper start - Share random for entities to make them more random @@ -110,10 +110,10 @@ index 4a1cfd5247073bd57f88151425ea1c866d971c4d..d544d66542d53db1a847a6b1ab8cf5ee private static final class RandomRandomSource extends ca.spottedleaf.moonrise.common.util.ThreadUnsafeRandom { public RandomRandomSource() { diff --git a/net/minecraft/world/level/Level.java b/net/minecraft/world/level/Level.java -index 191214e2c3019e9e55cc1d9658c2446557f40173..3f02f57eca3768d843e58dd2936f37c7f5743402 100644 +index d8022ac9ed679b6c1260833f75671f409a6d95d4..e873db97a2a12a39c9e015ddcf7484a4aa917b90 100644 --- a/net/minecraft/world/level/Level.java +++ b/net/minecraft/world/level/Level.java -@@ -117,7 +117,7 @@ public abstract class Level implements LevelAccessor, UUIDLookup, AutoCl +@@ -123,7 +123,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl public float rainLevel; protected float oThunderLevel; public float thunderLevel; @@ -122,7 +122,7 @@ index 191214e2c3019e9e55cc1d9658c2446557f40173..3f02f57eca3768d843e58dd2936f37c7 @Deprecated private final RandomSource threadSafeRandom = RandomSource.createThreadSafe(); private final Holder dimensionTypeRegistration; -@@ -169,7 +169,7 @@ public abstract class Level implements LevelAccessor, UUIDLookup, AutoCl +@@ -175,7 +175,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl private int tileTickPosition; public final Map explosionDensityCache = new java.util.HashMap<>(); // Paper - Optimize explosions public java.util.ArrayDeque redstoneUpdateInfos; // Paper - Faster redstone torch rapid clock removal; Move from Map in BlockRedstoneTorch to here @@ -132,7 +132,7 @@ index 191214e2c3019e9e55cc1d9658c2446557f40173..3f02f57eca3768d843e58dd2936f37c7 // Purpur start - Add adjustable breeding cooldown to config private com.google.common.cache.Cache playerBreedingCooldowns; diff --git a/net/minecraft/world/level/biome/Biome.java b/net/minecraft/world/level/biome/Biome.java -index bad1a03167f7586e5279592adcb43350c9b528cd..336d42d4e85716843633030ba1aa21b7901ca601 100644 +index 91fd52eeb410cf6b4c8de1ed9d41d60506bf8dd1..f43aaa89aaae90ed42fb9d6165afc4c5d93bc0ec 100644 --- a/net/minecraft/world/level/biome/Biome.java +++ b/net/minecraft/world/level/biome/Biome.java @@ -55,14 +55,14 @@ public final class Biome { @@ -154,10 +154,10 @@ index bad1a03167f7586e5279592adcb43350c9b528cd..336d42d4e85716843633030ba1aa21b7 public final Biome.ClimateSettings climateSettings; private final BiomeGenerationSettings generationSettings; diff --git a/net/minecraft/world/level/chunk/ChunkGenerator.java b/net/minecraft/world/level/chunk/ChunkGenerator.java -index b21822f069e112cdf16fe995485e2a5b1d229a8c..a95a4b39604e3200b69093165a2c48efa3f165ab 100644 +index dfd662e25d8908c0fe4efea10cb7d669413f25b5..7eccf60bffac4bb6afd59f83ec3588d5fc634565 100644 --- a/net/minecraft/world/level/chunk/ChunkGenerator.java +++ b/net/minecraft/world/level/chunk/ChunkGenerator.java -@@ -455,7 +455,7 @@ public abstract class ChunkGenerator { +@@ -462,7 +462,7 @@ public abstract class ChunkGenerator { int x = chunk.getPos().x; int z = chunk.getPos().z; for (org.bukkit.generator.BlockPopulator populator : world.getPopulators()) { @@ -166,17 +166,17 @@ index b21822f069e112cdf16fe995485e2a5b1d229a8c..a95a4b39604e3200b69093165a2c48ef seededrandom.setDecorationSeed(level.getSeed(), x, z); populator.populate(world, new org.bukkit.craftbukkit.util.RandomSourceWrapper.RandomWrapper(seededrandom), x, z, limitedRegion); } -@@ -560,7 +560,7 @@ public abstract class ChunkGenerator { - if (org.dreeam.leaf.config.modules.misc.SecureSeed.enabled) { - worldgenRandom = new su.plo.matter.WorldgenCryptoRandom(pos.x, pos.z, su.plo.matter.Globals.Salt.GENERATE_FEATURE, 0); - } else { -- worldgenRandom = new WorldgenRandom(new LegacyRandomSource(0L)); -+ worldgenRandom = new WorldgenRandom(org.dreeam.leaf.config.modules.opt.FastRNG.worldgenEnabled() ? new org.dreeam.leaf.util.math.random.FasterRandomSource(0L) : new LegacyRandomSource(0L)); // Leaf - Faster random generator - worldgenRandom.setLargeFeatureSeed(structureState.getLevelSeed(), pos.x, pos.z); - } - // Leaf end - Matter - Secure Seed +@@ -570,7 +570,7 @@ public abstract class ChunkGenerator { + if (org.dreeam.leaf.config.modules.misc.SecureSeed.enabled) { + worldgenRandom = new su.plo.matter.WorldgenCryptoRandom(pos.x, pos.z, su.plo.matter.Globals.Salt.GENERATE_FEATURE, 0); + } else { +- worldgenRandom = new WorldgenRandom(new LegacyRandomSource(0L)); ++ worldgenRandom = new WorldgenRandom(org.dreeam.leaf.config.modules.opt.FastRNG.worldgenEnabled() ? new org.dreeam.leaf.util.math.random.FasterRandomSource(0L) : new LegacyRandomSource(0L)); // Leaf - Faster random generator + worldgenRandom.setLargeFeatureSeed(structureState.getLevelSeed(), pos.x, pos.z); + } + // Leaf end - Matter - Secure Seed diff --git a/net/minecraft/world/level/chunk/ChunkGeneratorStructureState.java b/net/minecraft/world/level/chunk/ChunkGeneratorStructureState.java -index 426692d9627f46d708f551bd22ce3c52b2a23b37..8a19fd2b816b07a7374cb9dc96896a122f95db20 100644 +index 5a4626ed32bd70e8584b065e706160a2f676d03f..e6df558063781f4be2dbb61cc40f2f048b4b53fe 100644 --- a/net/minecraft/world/level/chunk/ChunkGeneratorStructureState.java +++ b/net/minecraft/world/level/chunk/ChunkGeneratorStructureState.java @@ -208,7 +208,7 @@ public class ChunkGeneratorStructureState { @@ -189,10 +189,10 @@ index 426692d9627f46d708f551bd22ce3c52b2a23b37..8a19fd2b816b07a7374cb9dc96896a12 if (!org.dreeam.leaf.config.modules.misc.SecureSeed.enabled) { // Paper start - Add missing structure set seed configs diff --git a/net/minecraft/world/level/levelgen/DensityFunctions.java b/net/minecraft/world/level/levelgen/DensityFunctions.java -index 77731406cb3dc417aa2fe1cb4352f3d2d7d498aa..1420dac658c4b27d25882a6d7dd3efb2c5b7e720 100644 +index 9fcc23741fc2622b5f88fed47d811d75c6d2c9f8..9f26aa9082881b6a76123407d92e6be9aaa21c31 100644 --- a/net/minecraft/world/level/levelgen/DensityFunctions.java +++ b/net/minecraft/world/level/levelgen/DensityFunctions.java -@@ -518,7 +518,7 @@ public final class DensityFunctions { +@@ -524,7 +524,7 @@ public final class DensityFunctions { // Paper end - Perf: Optimize end generation public EndIslandDensityFunction(long seed) { @@ -202,19 +202,19 @@ index 77731406cb3dc417aa2fe1cb4352f3d2d7d498aa..1420dac658c4b27d25882a6d7dd3efb2 this.islandNoise = new SimplexNoise(randomSource); } diff --git a/net/minecraft/world/level/levelgen/NoiseBasedChunkGenerator.java b/net/minecraft/world/level/levelgen/NoiseBasedChunkGenerator.java -index 65728ef17e63d71833677fdcbd5bb90794b4822b..57ae4aaf1431021daf77c5638038d4910a358155 100644 +index 199a9c4fba5fc80f04524a188270fdc9014f7950..3376fbfb804cdad0872a0146c5f1a499354cfd5d 100644 --- a/net/minecraft/world/level/levelgen/NoiseBasedChunkGenerator.java +++ b/net/minecraft/world/level/levelgen/NoiseBasedChunkGenerator.java -@@ -254,7 +254,7 @@ public final class NoiseBasedChunkGenerator extends ChunkGenerator { - WorldGenRegion level, long seed, RandomState random, BiomeManager biomeManager, StructureManager structureManager, ChunkAccess chunk +@@ -261,7 +261,7 @@ public final class NoiseBasedChunkGenerator extends ChunkGenerator { ) { - BiomeManager biomeManager1 = biomeManager.withDifferentSource((x, y, z) -> this.biomeSource.getNoiseBiome(x, y, z, random.sampler())); -- WorldgenRandom worldgenRandom = new WorldgenRandom(new LegacyRandomSource(RandomSupport.generateUniqueSeed())); -+ WorldgenRandom worldgenRandom = new WorldgenRandom(org.dreeam.leaf.config.modules.opt.FastRNG.worldgenEnabled() ? new org.dreeam.leaf.util.math.random.FasterRandomSource(RandomSupport.generateUniqueSeed()) : new LegacyRandomSource(RandomSupport.generateUniqueSeed())); // Leaf - Faster random generator - int i = 8; - ChunkPos pos = chunk.getPos(); - NoiseChunk noiseChunk = chunk.getOrCreateNoiseChunk(chunkAccess -> this.createNoiseChunk(chunkAccess, structureManager, Blender.of(level), random)); -@@ -420,7 +420,7 @@ public final class NoiseBasedChunkGenerator extends ChunkGenerator { + if (!SharedConstants.DEBUG_DISABLE_CARVERS) { + BiomeManager biomeManager1 = biomeManager.withDifferentSource((x, y, z) -> this.biomeSource.getNoiseBiome(x, y, z, random.sampler())); +- WorldgenRandom worldgenRandom = new WorldgenRandom(new LegacyRandomSource(RandomSupport.generateUniqueSeed())); ++ WorldgenRandom worldgenRandom = new WorldgenRandom(org.dreeam.leaf.config.modules.opt.FastRNG.worldgenEnabled() ? new org.dreeam.leaf.util.math.random.FasterRandomSource(RandomSupport.generateUniqueSeed()) : new LegacyRandomSource(RandomSupport.generateUniqueSeed())); // Leaf - Faster random generator + int i = 8; + ChunkPos pos = chunk.getPos(); + NoiseChunk noiseChunk = chunk.getOrCreateNoiseChunk(chunkAccess -> this.createNoiseChunk(chunkAccess, structureManager, Blender.of(level), random)); +@@ -436,7 +436,7 @@ public final class NoiseBasedChunkGenerator extends ChunkGenerator { if (!this.settings.value().disableMobGeneration()) { ChunkPos center = level.getCenter(); Holder biome = level.getBiome(center.getWorldPosition().atY(level.getMaxY())); @@ -302,7 +302,7 @@ index 6584c9320361dbbdea1899ab9e43b444de5006a6..06083cc7612ef28bcd9264bb21ab0bbb } // Leaf end - Matter - Secure Seed diff --git a/net/minecraft/world/level/levelgen/structure/placement/StructurePlacement.java b/net/minecraft/world/level/levelgen/structure/placement/StructurePlacement.java -index 14e352aedeeb1cf088278d9551d0204b06593ceb..483f88767647358ec1297213953573fcb523b7a5 100644 +index f2315e2c4d7a635ff17e22d2f80182f698544478..cae6fbe2afb18af1fc245bb5e30a0ce349ebd6e5 100644 --- a/net/minecraft/world/level/levelgen/structure/placement/StructurePlacement.java +++ b/net/minecraft/world/level/levelgen/structure/placement/StructurePlacement.java @@ -124,7 +124,7 @@ public abstract class StructurePlacement { @@ -311,29 +311,29 @@ index 14e352aedeeb1cf088278d9551d0204b06593ceb..483f88767647358ec1297213953573fc } else { - worldgenRandom = new WorldgenRandom(new LegacyRandomSource(0L)); + worldgenRandom = new WorldgenRandom(org.dreeam.leaf.config.modules.opt.FastRNG.worldgenEnabled() ? new org.dreeam.leaf.util.math.random.FasterRandomSource(0L) : new LegacyRandomSource(0L)); // Leaf - Faster random generator - worldgenRandom.setLargeFeatureWithSalt(levelSeed, salt, regionX, regionZ); + worldgenRandom.setLargeFeatureWithSalt(levelSeed, regionX, regionZ, salt); } // Leaf end - Matter - Secure Seed -@@ -133,7 +133,7 @@ public abstract class StructurePlacement { +@@ -132,7 +132,7 @@ public abstract class StructurePlacement { } - private static boolean legacyProbabilityReducerWithDouble(long baseSeed, int salt, int chunkX, int chunkZ, float probability, @org.jetbrains.annotations.Nullable Integer saltOverride) { // Paper - Add missing structure set seed configs + private static boolean legacyProbabilityReducerWithDouble(long baseSeed, int salt, int chunkX, int chunkZ, float probability, @javax.annotation.Nullable Integer saltOverride) { // Paper - Add missing structure set seed configs - WorldgenRandom worldgenRandom = new WorldgenRandom(new LegacyRandomSource(0L)); + WorldgenRandom worldgenRandom = new WorldgenRandom(org.dreeam.leaf.config.modules.opt.FastRNG.worldgenEnabled() ? new org.dreeam.leaf.util.math.random.FasterRandomSource(0L) : new LegacyRandomSource(0L)); // Leaf - Faster random generator if (saltOverride == null) { // Paper - Add missing structure set seed configs worldgenRandom.setLargeFeatureSeed(baseSeed, chunkX, chunkZ); // Paper start - Add missing structure set seed configs -@@ -145,7 +145,7 @@ public abstract class StructurePlacement { +@@ -144,7 +144,7 @@ public abstract class StructurePlacement { } - private static boolean legacyArbitrarySaltProbabilityReducer(long levelSeed, int salt, int regionX, int regionZ, float probability, @org.jetbrains.annotations.Nullable Integer saltOverride) { // Paper - Add missing structure set seed configs + private static boolean legacyArbitrarySaltProbabilityReducer(long levelSeed, int salt, int regionX, int regionZ, float probability, @javax.annotation.Nullable Integer saltOverride) { // Paper - Add missing structure set seed configs - WorldgenRandom worldgenRandom = new WorldgenRandom(new LegacyRandomSource(0L)); + WorldgenRandom worldgenRandom = new WorldgenRandom(org.dreeam.leaf.config.modules.opt.FastRNG.worldgenEnabled() ? new org.dreeam.leaf.util.math.random.FasterRandomSource(0L) : new LegacyRandomSource(0L)); // Leaf - Faster random generator worldgenRandom.setLargeFeatureWithSalt(levelSeed, regionX, regionZ, saltOverride != null ? saltOverride : HIGHLY_ARBITRARY_RANDOM_SALT); // Paper - Add missing structure set seed configs return worldgenRandom.nextFloat() < probability; } -@@ -153,7 +153,7 @@ public abstract class StructurePlacement { - private static boolean legacyPillagerOutpostReducer(long levelSeed, int salt, int regionX, int regionZ, float probability, @org.jetbrains.annotations.Nullable Integer saltOverride) { // Paper - Add missing structure set seed configs; ignore here +@@ -152,7 +152,7 @@ public abstract class StructurePlacement { + private static boolean legacyPillagerOutpostReducer(long levelSeed, int salt, int regionX, int regionZ, float probability, @javax.annotation.Nullable Integer saltOverride) { // Paper - Add missing structure set seed configs; ignore here int i = regionX >> 4; int i1 = regionZ >> 4; - WorldgenRandom worldgenRandom = new WorldgenRandom(new LegacyRandomSource(0L)); diff --git a/leaf-server/minecraft-patches/features/0134-Don-t-save-primed-tnt-entity.patch b/leaf-server/minecraft-patches/features/0127-Don-t-save-primed-tnt-entity.patch similarity index 90% rename from leaf-server/minecraft-patches/features/0134-Don-t-save-primed-tnt-entity.patch rename to leaf-server/minecraft-patches/features/0127-Don-t-save-primed-tnt-entity.patch index a5c28e0d..db6671a0 100644 --- a/leaf-server/minecraft-patches/features/0134-Don-t-save-primed-tnt-entity.patch +++ b/leaf-server/minecraft-patches/features/0127-Don-t-save-primed-tnt-entity.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Don't save primed tnt entity diff --git a/net/minecraft/world/entity/item/PrimedTnt.java b/net/minecraft/world/entity/item/PrimedTnt.java -index ef070f8a9ab3a4676e2141f7c0bc20a000d0cc3a..1acfc005260628cc70ebf063acc92fb2904d7794 100644 +index 730caed2ea1877d855bb0b8be8f3ca786ea4c3c3..9f3cc2a462472b303f29b652c89e64c7dbd04063 100644 --- a/net/minecraft/world/entity/item/PrimedTnt.java +++ b/net/minecraft/world/entity/item/PrimedTnt.java @@ -266,4 +266,11 @@ public class PrimedTnt extends Entity implements TraceableEntity { diff --git a/leaf-server/minecraft-patches/features/0135-Don-t-save-falling-block-entity.patch b/leaf-server/minecraft-patches/features/0128-Don-t-save-falling-block-entity.patch similarity index 85% rename from leaf-server/minecraft-patches/features/0135-Don-t-save-falling-block-entity.patch rename to leaf-server/minecraft-patches/features/0128-Don-t-save-falling-block-entity.patch index 9a5c8158..31fc48fa 100644 --- a/leaf-server/minecraft-patches/features/0135-Don-t-save-falling-block-entity.patch +++ b/leaf-server/minecraft-patches/features/0128-Don-t-save-falling-block-entity.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Don't save falling block entity diff --git a/net/minecraft/world/entity/item/FallingBlockEntity.java b/net/minecraft/world/entity/item/FallingBlockEntity.java -index 595dee03e3a7d98d703e48fb53d82d7f392a2b3d..c99ddedaf25a009f0d19f97d01e7545b0c59aee2 100644 +index 308af61031070d57556532645f73b41517d696e9..83b23d93b1b462d24adae135441eb3ead6f6aef0 100644 --- a/net/minecraft/world/entity/item/FallingBlockEntity.java +++ b/net/minecraft/world/entity/item/FallingBlockEntity.java -@@ -390,4 +390,11 @@ public class FallingBlockEntity extends Entity { +@@ -389,4 +389,11 @@ public class FallingBlockEntity extends Entity { this.forceTickAfterTeleportToDuplicate = entity != null && flag && io.papermc.paper.configuration.GlobalConfiguration.get().unsupportedSettings.allowUnsafeEndPortalTeleportation; // Paper return entity; } diff --git a/leaf-server/minecraft-patches/features/0136-Configurable-connection-message.patch b/leaf-server/minecraft-patches/features/0129-Configurable-connection-message.patch similarity index 65% rename from leaf-server/minecraft-patches/features/0136-Configurable-connection-message.patch rename to leaf-server/minecraft-patches/features/0129-Configurable-connection-message.patch index d954171b..9dd96a67 100644 --- a/leaf-server/minecraft-patches/features/0136-Configurable-connection-message.patch +++ b/leaf-server/minecraft-patches/features/0129-Configurable-connection-message.patch @@ -5,37 +5,37 @@ Subject: [PATCH] Configurable connection message diff --git a/net/minecraft/server/players/PlayerList.java b/net/minecraft/server/players/PlayerList.java -index f09c1472d465de94b16e958ec7051f34aae7402f..b24e03e941da6e90b1b8419c7f33973aebec7818 100644 +index a4b08439929f6a746bd525e5d322c291fe128ea8..ba5640cd2051915eb1ee9097f4534438f6e8f3d2 100644 --- a/net/minecraft/server/players/PlayerList.java +++ b/net/minecraft/server/players/PlayerList.java +@@ -233,7 +233,7 @@ public abstract class PlayerList { + // Ensure that player inventory is populated with its viewer + player.containerMenu.transferTo(player.containerMenu, bukkitPlayer); + +- org.bukkit.event.player.PlayerJoinEvent playerJoinEvent = new org.bukkit.event.player.PlayerJoinEvent(bukkitPlayer, io.papermc.paper.adventure.PaperAdventure.asAdventure(mutableComponent)); // Paper - Adventure ++ org.bukkit.event.player.PlayerJoinEvent playerJoinEvent = new org.bukkit.event.player.PlayerJoinEvent(bukkitPlayer, getJoinMsg(mutableComponent, bukkitPlayer)); // Paper - Adventure // Leaf - Configurable connection message - join message + this.cserver.getPluginManager().callEvent(playerJoinEvent); + + if (!player.connection.isAcceptingMessages()) { +@@ -244,7 +244,7 @@ public abstract class PlayerList { + + final net.kyori.adventure.text.Component jm = playerJoinEvent.joinMessage(); + +- if (jm != null && !jm.equals(net.kyori.adventure.text.Component.empty())) { // Paper - Adventure ++ if (org.dreeam.leaf.config.modules.misc.ConnectionMessage.joinEnabled && jm != null && !jm.equals(net.kyori.adventure.text.Component.empty())) { // Paper - Adventure // Leaf - Configurable connection message - join message + joinMessage = io.papermc.paper.adventure.PaperAdventure.asVanilla(jm); // Paper - Adventure + this.server.getPlayerList().broadcastSystemMessage(joinMessage, false); // Paper - Adventure + } @@ -445,7 +445,7 @@ public abstract class PlayerList { - // Ensure that player inventory is populated with its viewer - player.containerMenu.transferTo(player.containerMenu, bukkitPlayer); - -- org.bukkit.event.player.PlayerJoinEvent playerJoinEvent = new org.bukkit.event.player.PlayerJoinEvent(bukkitPlayer, io.papermc.paper.adventure.PaperAdventure.asAdventure(mutableComponent)); // Paper - Adventure -+ org.bukkit.event.player.PlayerJoinEvent playerJoinEvent = new org.bukkit.event.player.PlayerJoinEvent(bukkitPlayer, getJoinMsg(mutableComponent, bukkitPlayer)); // Paper - Adventure // Leaf - Configurable connection message - join message - this.cserver.getPluginManager().callEvent(playerJoinEvent); - - if (!player.connection.isAcceptingMessages()) { -@@ -458,7 +458,7 @@ public abstract class PlayerList { - - final net.kyori.adventure.text.Component jm = playerJoinEvent.joinMessage(); - -- if (jm != null && !jm.equals(net.kyori.adventure.text.Component.empty())) { // Paper - Adventure -+ if (org.dreeam.leaf.config.modules.misc.ConnectionMessage.joinEnabled && jm != null && !jm.equals(net.kyori.adventure.text.Component.empty())) { // Paper - Adventure // Leaf - Configurable connection message - join message - joinMessage = io.papermc.paper.adventure.PaperAdventure.asVanilla(jm); // Paper - Adventure - this.server.getPlayerList().broadcastSystemMessage(joinMessage, false); // Paper - Adventure - } -@@ -685,7 +685,7 @@ public abstract class PlayerList { player.closeContainer(org.bukkit.event.inventory.InventoryCloseEvent.Reason.DISCONNECT); // Paper - Inventory close reason } - org.bukkit.event.player.PlayerQuitEvent playerQuitEvent = new org.bukkit.event.player.PlayerQuitEvent(player.getBukkitEntity(), leaveMessage, player.quitReason); // Paper - Adventure & Add API for quit reason -+ org.bukkit.event.player.PlayerQuitEvent playerQuitEvent = new org.bukkit.event.player.PlayerQuitEvent(player.getBukkitEntity(), getQuitMsg(leaveMessage, player.getBukkitEntity()), player.quitReason); // Paper - Adventure & Add API for quit reason // Leaf - Configurable connection message - quit message ++ org.bukkit.event.player.PlayerQuitEvent playerQuitEvent = new org.bukkit.event.player.PlayerQuitEvent(player.getBukkitEntity(), getQuitMsg(leaveMessage, player.getBukkitEntity()), player.quitReason); // Paper - Adventure & Add API for quit reason // Leaf - Configurable connection message - quit message this.cserver.getPluginManager().callEvent(playerQuitEvent); - player.getBukkitEntity().disconnect(playerQuitEvent.getQuitMessage()); + player.getBukkitEntity().disconnect(); -@@ -1659,4 +1659,40 @@ public abstract class PlayerList { +@@ -1435,4 +1435,40 @@ public abstract class PlayerList { public boolean isAllowCommandsForAllPlayers() { return this.allowCommandsForAllPlayers; } diff --git a/leaf-server/minecraft-patches/features/0137-Configurable-unknown-command-message.patch b/leaf-server/minecraft-patches/features/0130-Configurable-unknown-command-message.patch similarity index 97% rename from leaf-server/minecraft-patches/features/0137-Configurable-unknown-command-message.patch rename to leaf-server/minecraft-patches/features/0130-Configurable-unknown-command-message.patch index f62a31f7..beccce80 100644 --- a/leaf-server/minecraft-patches/features/0137-Configurable-unknown-command-message.patch +++ b/leaf-server/minecraft-patches/features/0130-Configurable-unknown-command-message.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Configurable unknown command message diff --git a/net/minecraft/commands/Commands.java b/net/minecraft/commands/Commands.java -index 3f32da75ee0a8a993b54e4156f7e4be9cc922ade..32a9d6e9b18ac1cf66c12462221ebb53f86eac3e 100644 +index 3d286d37d726996102f599d8dfbcb08425b58bc5..f10827481df288ec40fef125fe524689ef31bf07 100644 --- a/net/minecraft/commands/Commands.java +++ b/net/minecraft/commands/Commands.java -@@ -411,31 +411,8 @@ public class Commands { +@@ -412,31 +412,8 @@ public class Commands { // Paper start - Add UnknownCommandEvent final net.kyori.adventure.text.TextComponent.Builder builder = net.kyori.adventure.text.Component.text(); // source.sendFailure(ComponentUtils.fromMessage(var7.getRawMessage())); @@ -41,7 +41,7 @@ index 3f32da75ee0a8a993b54e4156f7e4be9cc922ade..32a9d6e9b18ac1cf66c12462221ebb53 org.bukkit.Bukkit.getServer().getPluginManager().callEvent(event); if (event.message() != null) { source.sendFailure(io.papermc.paper.adventure.PaperAdventure.asVanilla(event.message()), false); -@@ -669,6 +646,92 @@ public class Commands { +@@ -670,6 +647,92 @@ public class Commands { }; } diff --git a/leaf-server/minecraft-patches/features/0138-Remove-stream-in-BlockBehaviour-cache-blockstate.patch b/leaf-server/minecraft-patches/features/0131-Remove-stream-in-BlockBehaviour-cache-blockstate.patch similarity index 90% rename from leaf-server/minecraft-patches/features/0138-Remove-stream-in-BlockBehaviour-cache-blockstate.patch rename to leaf-server/minecraft-patches/features/0131-Remove-stream-in-BlockBehaviour-cache-blockstate.patch index 620df3e0..eb9157bb 100644 --- a/leaf-server/minecraft-patches/features/0138-Remove-stream-in-BlockBehaviour-cache-blockstate.patch +++ b/leaf-server/minecraft-patches/features/0131-Remove-stream-in-BlockBehaviour-cache-blockstate.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Remove stream in BlockBehaviour cache blockstate diff --git a/net/minecraft/world/level/block/state/BlockBehaviour.java b/net/minecraft/world/level/block/state/BlockBehaviour.java -index 3741afd1b2a5cb5cfce5e14cb78aa5ff5c3b218e..331474bb33c8612283a0ec478c1ae8768180b22d 100644 +index 471d35a9a77cc7d6744b275ee1307ef1c38ad77c..4cfb52283ea1ba715e95ad337c7a39d04af1bafb 100644 --- a/net/minecraft/world/level/block/state/BlockBehaviour.java +++ b/net/minecraft/world/level/block/state/BlockBehaviour.java -@@ -1064,8 +1064,14 @@ public abstract class BlockBehaviour implements FeatureElement { +@@ -1070,8 +1070,14 @@ public abstract class BlockBehaviour implements FeatureElement { ) ); } else { diff --git a/leaf-server/minecraft-patches/features/0139-Remove-stream-in-entity-visible-effects-filter.patch b/leaf-server/minecraft-patches/features/0132-Remove-stream-in-entity-visible-effects-filter.patch similarity index 89% rename from leaf-server/minecraft-patches/features/0139-Remove-stream-in-entity-visible-effects-filter.patch rename to leaf-server/minecraft-patches/features/0132-Remove-stream-in-entity-visible-effects-filter.patch index 2ceeba70..7e3ec7be 100644 --- a/leaf-server/minecraft-patches/features/0139-Remove-stream-in-entity-visible-effects-filter.patch +++ b/leaf-server/minecraft-patches/features/0132-Remove-stream-in-entity-visible-effects-filter.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Remove stream in entity visible effects filter diff --git a/net/minecraft/world/entity/LivingEntity.java b/net/minecraft/world/entity/LivingEntity.java -index 1ba42eaaf9ceb41c5ef184f3002135c0781abe33..2d8562ab5f399d5be8453bca0637586f7e221c8a 100644 +index f4cdbbf283db4d28821cffc6e985b5c70f10352d..ba012755648c087eb591d41a145a31c6cebaab29 100644 --- a/net/minecraft/world/entity/LivingEntity.java +++ b/net/minecraft/world/entity/LivingEntity.java -@@ -1013,12 +1013,15 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin +@@ -1019,12 +1019,15 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin } private void updateSynchronizedMobEffectParticles() { diff --git a/leaf-server/minecraft-patches/features/0140-Remove-stream-and-double-iteration-in-enough-deep-sl.patch b/leaf-server/minecraft-patches/features/0133-Remove-stream-and-double-iteration-in-enough-deep-sl.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0140-Remove-stream-and-double-iteration-in-enough-deep-sl.patch rename to leaf-server/minecraft-patches/features/0133-Remove-stream-and-double-iteration-in-enough-deep-sl.patch diff --git a/leaf-server/minecraft-patches/features/0141-Remove-stream-in-trial-spawner-ticking.patch b/leaf-server/minecraft-patches/features/0134-Remove-stream-in-trial-spawner-ticking.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0141-Remove-stream-in-trial-spawner-ticking.patch rename to leaf-server/minecraft-patches/features/0134-Remove-stream-in-trial-spawner-ticking.patch diff --git a/leaf-server/minecraft-patches/features/0142-Remove-stream-in-Brain.patch b/leaf-server/minecraft-patches/features/0135-Remove-stream-in-Brain.patch similarity index 97% rename from leaf-server/minecraft-patches/features/0142-Remove-stream-in-Brain.patch rename to leaf-server/minecraft-patches/features/0135-Remove-stream-in-Brain.patch index b41d28dd..fcea3983 100644 --- a/leaf-server/minecraft-patches/features/0142-Remove-stream-in-Brain.patch +++ b/leaf-server/minecraft-patches/features/0135-Remove-stream-in-Brain.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Remove stream in Brain diff --git a/net/minecraft/world/entity/ai/Brain.java b/net/minecraft/world/entity/ai/Brain.java -index 98652c2c549bd7657a606d25ba4fe3cffa0548da..29fdf94db0308031edfe7915fc587a2aa5a1a18a 100644 +index ebdd6f4f493ca52104a0c7094d1c474a951bde81..2b7c3dd5afdc3fc47e08f0cbbb3bcbd12f15b621 100644 --- a/net/minecraft/world/entity/ai/Brain.java +++ b/net/minecraft/world/entity/ai/Brain.java @@ -70,13 +70,22 @@ public class Brain { diff --git a/leaf-server/minecraft-patches/features/0143-Remove-stream-in-BehaviorUtils.patch b/leaf-server/minecraft-patches/features/0136-Remove-stream-in-BehaviorUtils.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0143-Remove-stream-in-BehaviorUtils.patch rename to leaf-server/minecraft-patches/features/0136-Remove-stream-in-BehaviorUtils.patch diff --git a/leaf-server/minecraft-patches/features/0144-Remove-stream-in-YieldJobSite.patch b/leaf-server/minecraft-patches/features/0137-Remove-stream-in-YieldJobSite.patch similarity index 76% rename from leaf-server/minecraft-patches/features/0144-Remove-stream-in-YieldJobSite.patch rename to leaf-server/minecraft-patches/features/0137-Remove-stream-in-YieldJobSite.patch index 55ff7c36..58f20dcb 100644 --- a/leaf-server/minecraft-patches/features/0144-Remove-stream-in-YieldJobSite.patch +++ b/leaf-server/minecraft-patches/features/0137-Remove-stream-in-YieldJobSite.patch @@ -5,13 +5,16 @@ Subject: [PATCH] Remove stream in YieldJobSite diff --git a/net/minecraft/world/entity/ai/behavior/YieldJobSite.java b/net/minecraft/world/entity/ai/behavior/YieldJobSite.java -index 44340aa26bc89faaf8842bb36048cf61dba34314..811cbeafaf907b1fc96cc0916073c5f0100c555e 100644 +index 22547468e407dbc7aa64deddbdcf0ae39ca810c2..bcabd994d562066398a164064cd7568d77122d13 100644 --- a/net/minecraft/world/entity/ai/behavior/YieldJobSite.java +++ b/net/minecraft/world/entity/ai/behavior/YieldJobSite.java -@@ -38,23 +38,26 @@ public class YieldJobSite { - if (type.isEmpty()) { - return true; - } else { +@@ -34,28 +34,29 @@ public class YieldJobSite { + } else { + BlockPos blockPos = instance.get(potentialJobSite).pos(); + Optional> type = level.getPoiManager().getType(blockPos); +- if (type.isEmpty()) { +- return true; +- } else { - instance.>get(nearestLivingEntities) - .stream() - .filter(nearEntity -> nearEntity instanceof Villager && nearEntity != villager) @@ -26,8 +29,9 @@ index 44340aa26bc89faaf8842bb36048cf61dba34314..811cbeafaf907b1fc96cc0916073c5f0 - if (nearVillager.getBrain().getMemory(MemoryModuleType.JOB_SITE).isEmpty()) { - BehaviorUtils.setWalkAndLookTargetMemories(nearVillager, blockPos, speedModifier, 1); - nearVillager.getBrain().setMemory(MemoryModuleType.POTENTIAL_JOB_SITE, GlobalPos.of(level.dimension(), blockPos)); -- DebugPackets.sendPoiTicketCountPacket(level, blockPos); -+ // Leaf start - Remove stream in YieldJobSite +- level.debugSynchronizers().updatePoi(blockPos); ++ // Leaf start - Remove stream in YieldJobSite ++ if (type.isPresent()) { + List mobsList = instance.get(nearestLivingEntities); + for (LivingEntity nearEntity : mobsList) { + if (nearEntity instanceof Villager nearVillager && nearEntity != villager && nearEntity.isAlive()) { @@ -39,15 +43,18 @@ index 44340aa26bc89faaf8842bb36048cf61dba34314..811cbeafaf907b1fc96cc0916073c5f0 + if (nearVillager.getBrain().getMemory(MemoryModuleType.JOB_SITE).isEmpty()) { + BehaviorUtils.setWalkAndLookTargetMemories(nearVillager, blockPos, speedModifier, 1); + nearVillager.getBrain().setMemory(MemoryModuleType.POTENTIAL_JOB_SITE, GlobalPos.of(level.dimension(), blockPos)); -+ DebugPackets.sendPoiTicketCountPacket(level, blockPos); ++ level.debugSynchronizers().updatePoi(blockPos); + } + + break; } - }); +- return true; + } + } + // Leaf end - Remove stream in YieldJobSite - return true; } ++ return true; } + } + ) diff --git a/leaf-server/minecraft-patches/features/0145-Remove-stream-in-PlayerSensor.patch b/leaf-server/minecraft-patches/features/0138-Remove-stream-in-PlayerSensor.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0145-Remove-stream-in-PlayerSensor.patch rename to leaf-server/minecraft-patches/features/0138-Remove-stream-in-PlayerSensor.patch diff --git a/leaf-server/minecraft-patches/features/0146-Remove-stream-in-GolemSensor.patch b/leaf-server/minecraft-patches/features/0139-Remove-stream-in-GolemSensor.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0146-Remove-stream-in-GolemSensor.patch rename to leaf-server/minecraft-patches/features/0139-Remove-stream-in-GolemSensor.patch diff --git a/leaf-server/minecraft-patches/features/0147-Remove-stream-in-GateBehavior.patch b/leaf-server/minecraft-patches/features/0140-Remove-stream-in-GateBehavior.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0147-Remove-stream-in-GateBehavior.patch rename to leaf-server/minecraft-patches/features/0140-Remove-stream-in-GateBehavior.patch diff --git a/leaf-server/minecraft-patches/features/0148-Remove-stream-in-matchingSlot.patch b/leaf-server/minecraft-patches/features/0141-Remove-stream-in-matchingSlot.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0148-Remove-stream-in-matchingSlot.patch rename to leaf-server/minecraft-patches/features/0141-Remove-stream-in-matchingSlot.patch diff --git a/leaf-server/minecraft-patches/features/0150-Replace-Entity-active-effects-map-with-optimized-col.patch b/leaf-server/minecraft-patches/features/0142-Replace-Entity-active-effects-map-with-optimized-col.patch similarity index 92% rename from leaf-server/minecraft-patches/features/0150-Replace-Entity-active-effects-map-with-optimized-col.patch rename to leaf-server/minecraft-patches/features/0142-Replace-Entity-active-effects-map-with-optimized-col.patch index ece8edfc..83d49dc5 100644 --- a/leaf-server/minecraft-patches/features/0150-Replace-Entity-active-effects-map-with-optimized-col.patch +++ b/leaf-server/minecraft-patches/features/0142-Replace-Entity-active-effects-map-with-optimized-col.patch @@ -6,10 +6,10 @@ Subject: [PATCH] Replace Entity active effects map with optimized collection Dreeam TODO: check this diff --git a/net/minecraft/world/entity/LivingEntity.java b/net/minecraft/world/entity/LivingEntity.java -index 2d8562ab5f399d5be8453bca0637586f7e221c8a..6214467ae7e2e9d84e46abed00a94bc22d4a3da7 100644 +index ba012755648c087eb591d41a145a31c6cebaab29..a2162834915c7268e412531be0ce09b6032fd139 100644 --- a/net/minecraft/world/entity/LivingEntity.java +++ b/net/minecraft/world/entity/LivingEntity.java -@@ -208,6 +208,10 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin +@@ -209,6 +209,10 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin private static final Dynamic EMPTY_BRAIN = new Dynamic<>(JavaOps.INSTANCE, Map.of("memories", Map.of())); private final AttributeMap attributes; public CombatTracker combatTracker = new CombatTracker(this); @@ -20,7 +20,7 @@ index 2d8562ab5f399d5be8453bca0637586f7e221c8a..6214467ae7e2e9d84e46abed00a94bc2 public final Map, MobEffectInstance> activeEffects = Maps.newHashMap(); private final Map lastEquipmentItems = Util.makeEnumMap(EquipmentSlot.class, slot -> ItemStack.EMPTY); public boolean swinging; -@@ -1015,15 +1019,16 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin +@@ -1021,15 +1025,16 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin private void updateSynchronizedMobEffectParticles() { // Leaf start - Remove stream in entity visible effects filter List list = new java.util.ArrayList<>(); diff --git a/leaf-server/minecraft-patches/features/0151-Replace-criterion-map-with-optimized-collection.patch b/leaf-server/minecraft-patches/features/0143-Replace-criterion-map-with-optimized-collection.patch similarity index 93% rename from leaf-server/minecraft-patches/features/0151-Replace-criterion-map-with-optimized-collection.patch rename to leaf-server/minecraft-patches/features/0143-Replace-criterion-map-with-optimized-collection.patch index 9fc76dac..d4d08ad2 100644 --- a/leaf-server/minecraft-patches/features/0151-Replace-criterion-map-with-optimized-collection.patch +++ b/leaf-server/minecraft-patches/features/0143-Replace-criterion-map-with-optimized-collection.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Replace criterion map with optimized collection diff --git a/net/minecraft/server/PlayerAdvancements.java b/net/minecraft/server/PlayerAdvancements.java -index eee5aaca8219802a56b8ba08986da672c40dc8b4..4bf87ebb49880b8e09203a48fce6371398281561 100644 +index 9ecc19b8a7d4e6b27335b542308f78e5005b0e15..e152c4c16b2b35cd2d3a3ac8cdd029806095ce04 100644 --- a/net/minecraft/server/PlayerAdvancements.java +++ b/net/minecraft/server/PlayerAdvancements.java @@ -60,7 +60,7 @@ public class PlayerAdvancements { diff --git a/leaf-server/minecraft-patches/features/0152-Replace-brain-with-optimized-collection.patch b/leaf-server/minecraft-patches/features/0144-Replace-brain-with-optimized-collection.patch similarity index 99% rename from leaf-server/minecraft-patches/features/0152-Replace-brain-with-optimized-collection.patch rename to leaf-server/minecraft-patches/features/0144-Replace-brain-with-optimized-collection.patch index cdbfe153..46fed63e 100644 --- a/leaf-server/minecraft-patches/features/0152-Replace-brain-with-optimized-collection.patch +++ b/leaf-server/minecraft-patches/features/0144-Replace-brain-with-optimized-collection.patch @@ -7,7 +7,7 @@ Co-authored-by: Taiyou06 Co-authored-by: hayanesuru diff --git a/net/minecraft/world/entity/ai/Brain.java b/net/minecraft/world/entity/ai/Brain.java -index 29fdf94db0308031edfe7915fc587a2aa5a1a18a..d423f325adbdfd524d05af28f1a1097891ea1c40 100644 +index 2b7c3dd5afdc3fc47e08f0cbbb3bcbd12f15b621..0cdc563c7b9232bbf398706acbc334bd8b83876d 100644 --- a/net/minecraft/world/entity/ai/Brain.java +++ b/net/minecraft/world/entity/ai/Brain.java @@ -45,14 +45,21 @@ public class Brain { diff --git a/leaf-server/minecraft-patches/features/0153-Reduce-worldgen-allocations.patch b/leaf-server/minecraft-patches/features/0145-Reduce-worldgen-allocations.patch similarity index 96% rename from leaf-server/minecraft-patches/features/0153-Reduce-worldgen-allocations.patch rename to leaf-server/minecraft-patches/features/0145-Reduce-worldgen-allocations.patch index cee918c6..256de4de 100644 --- a/leaf-server/minecraft-patches/features/0153-Reduce-worldgen-allocations.patch +++ b/leaf-server/minecraft-patches/features/0145-Reduce-worldgen-allocations.patch @@ -11,10 +11,10 @@ allocation by directly accessing the rules list, which further contributes to reducing garbage collection pressure during world generation. diff --git a/net/minecraft/world/level/levelgen/NoiseChunk.java b/net/minecraft/world/level/levelgen/NoiseChunk.java -index f861f9e087182470a3bbb22678dbdacb8a73e943..a3d0d17178eedfaef83e2e0df6b1c2d7784d8656 100644 +index d57f2a40fcfb076a607bdfc7d0bd5071ea8ce838..822294560d0d1b9810487ec8b8c9856813817849 100644 --- a/net/minecraft/world/level/levelgen/NoiseChunk.java +++ b/net/minecraft/world/level/levelgen/NoiseChunk.java -@@ -362,7 +362,17 @@ public class NoiseChunk implements DensityFunction.ContextProvider, DensityFunct +@@ -374,7 +374,17 @@ public class NoiseChunk implements DensityFunction.ContextProvider, DensityFunct } protected DensityFunction wrap(DensityFunction densityFunction) { diff --git a/leaf-server/minecraft-patches/features/0154-Use-caffeine-cache-for-kickPermission-instead-of-usi.patch b/leaf-server/minecraft-patches/features/0146-Use-caffeine-cache-for-kickPermission-instead-of-usi.patch similarity index 69% rename from leaf-server/minecraft-patches/features/0154-Use-caffeine-cache-for-kickPermission-instead-of-usi.patch rename to leaf-server/minecraft-patches/features/0146-Use-caffeine-cache-for-kickPermission-instead-of-usi.patch index 976d69be..2e46f94e 100644 --- a/leaf-server/minecraft-patches/features/0154-Use-caffeine-cache-for-kickPermission-instead-of-usi.patch +++ b/leaf-server/minecraft-patches/features/0146-Use-caffeine-cache-for-kickPermission-instead-of-usi.patch @@ -23,10 +23,10 @@ See the License for the specific language governing permissions and limitations under the License. diff --git a/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/net/minecraft/server/network/ServerGamePacketListenerImpl.java -index e61ff0c5051a855e10310d4e6f76d79e9ab86716..1556b2d4a758e3a15b6c4468bf994ea3781a4958 100644 +index c47f05853d731c967968ec217b8df5a2a8e3d890..c922de26a152ed9ecda9c34d5e250982bc3c0f2b 100644 --- a/net/minecraft/server/network/ServerGamePacketListenerImpl.java +++ b/net/minecraft/server/network/ServerGamePacketListenerImpl.java -@@ -342,17 +342,12 @@ public class ServerGamePacketListenerImpl +@@ -341,17 +341,12 @@ public class ServerGamePacketListenerImpl // Paper end - configuration phase API // Purpur start - AFK API @@ -48,12 +48,12 @@ index e61ff0c5051a855e10310d4e6f76d79e9ab86716..1556b2d4a758e3a15b6c4468bf994ea3 // Purpur end - AFK API @Override -@@ -415,7 +410,7 @@ public class ServerGamePacketListenerImpl - && Util.getMillis() - this.player.getLastActionTime() > this.server.getPlayerIdleTimeout() * 1000L * 60L && !this.player.wonGame) { // Paper - Prevent AFK kick while watching end credits - // Purpur start - AFK API - this.player.setAfk(true); -- if (!this.player.level().purpurConfig.idleTimeoutKick || (!Boolean.parseBoolean(System.getenv("PURPUR_FORCE_IDLE_KICK")) && kickPermissionCache.getUnchecked(this.player.getBukkitEntity()))) { -+ if (!this.player.level().purpurConfig.idleTimeoutKick || (!Boolean.parseBoolean(System.getenv("PURPUR_FORCE_IDLE_KICK")) && kickPermissionCache.get(this.player.getBukkitEntity()))) { // Leaf - Use caffeine cache for kickPermission instead of using google.common.cache - return; - } - // Purpur end - AFK API +@@ -373,7 +368,7 @@ public class ServerGamePacketListenerImpl + && !this.player.wonGame) { + // Purpur start - AFK API + this.player.setAfk(true); +- if (!this.player.level().purpurConfig.idleTimeoutKick || (!Boolean.parseBoolean(System.getenv("PURPUR_FORCE_IDLE_KICK")) && kickPermissionCache.getUnchecked(this.player.getBukkitEntity()))) { ++ if (!this.player.level().purpurConfig.idleTimeoutKick || (!Boolean.parseBoolean(System.getenv("PURPUR_FORCE_IDLE_KICK")) && kickPermissionCache.get(this.player.getBukkitEntity()))) { // Leaf - Use caffeine cache for kickPermission instead of using google.common.cache + return; + } + // Purpur end - AFK API diff --git a/leaf-server/minecraft-patches/features/0156-Fix-MC-65198.patch b/leaf-server/minecraft-patches/features/0147-Fix-MC-65198.patch similarity index 100% rename from leaf-server/minecraft-patches/features/0156-Fix-MC-65198.patch rename to leaf-server/minecraft-patches/features/0147-Fix-MC-65198.patch diff --git a/leaf-server/minecraft-patches/features/0157-Fix-MC-200418.patch b/leaf-server/minecraft-patches/features/0148-Fix-MC-200418.patch similarity index 88% rename from leaf-server/minecraft-patches/features/0157-Fix-MC-200418.patch rename to leaf-server/minecraft-patches/features/0148-Fix-MC-200418.patch index 8c49cbd7..2245a945 100644 --- a/leaf-server/minecraft-patches/features/0157-Fix-MC-200418.patch +++ b/leaf-server/minecraft-patches/features/0148-Fix-MC-200418.patch @@ -6,10 +6,10 @@ Subject: [PATCH] Fix MC-200418 Related MC issue: https://bugs.mojang.com/browse/MC/issues/MC-200418 diff --git a/net/minecraft/world/entity/monster/ZombieVillager.java b/net/minecraft/world/entity/monster/ZombieVillager.java -index 18966860f550ad1f35ec6a03a0b78af73628b964..22c1545a0329d56e0ec41ae4da1e1922aa1f9737 100644 +index c2bd5902f7ede925fe6d0838b1d87f80bab5dbbb..eee6a4f4be11aa3adb4f7b54d31be112c0f8be00 100644 --- a/net/minecraft/world/entity/monster/ZombieVillager.java +++ b/net/minecraft/world/entity/monster/ZombieVillager.java -@@ -293,6 +293,11 @@ public class ZombieVillager extends Zombie implements VillagerDataHolder { +@@ -302,6 +302,11 @@ public class ZombieVillager extends Zombie implements VillagerDataHolder { if (!this.isSilent()) { level.levelEvent(null, 1027, this.blockPosition(), 0); } diff --git a/leaf-server/minecraft-patches/features/0158-Fix-MC-119417.patch b/leaf-server/minecraft-patches/features/0149-Fix-MC-119417.patch similarity index 85% rename from leaf-server/minecraft-patches/features/0158-Fix-MC-119417.patch rename to leaf-server/minecraft-patches/features/0149-Fix-MC-119417.patch index 02a25a24..c8b31a21 100644 --- a/leaf-server/minecraft-patches/features/0158-Fix-MC-119417.patch +++ b/leaf-server/minecraft-patches/features/0149-Fix-MC-119417.patch @@ -6,10 +6,10 @@ Subject: [PATCH] Fix MC-119417 Related MC issue: https://bugs.mojang.com/browse/MC/issues/MC-119417 diff --git a/net/minecraft/server/level/ServerPlayer.java b/net/minecraft/server/level/ServerPlayer.java -index 37fe4bbc117c434293689c0a4a1e79e07cff7fd6..b8f5cc4540c4a992ae4cf5673886ce6107eb82a8 100644 +index f8d40ff11da1be2e214f0a3965f7d856e3e4e366..9f8dbcb5c2e6e8428e6aaee2ce68ad25bf95d2b5 100644 --- a/net/minecraft/server/level/ServerPlayer.java +++ b/net/minecraft/server/level/ServerPlayer.java -@@ -2238,6 +2238,7 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc +@@ -2359,6 +2359,7 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc this.connection.send(new ClientboundGameEventPacket(ClientboundGameEventPacket.CHANGE_GAME_MODE, gameMode.getId())); if (gameMode == GameType.SPECTATOR) { this.removeEntitiesOnShoulder(); diff --git a/leaf-server/minecraft-patches/features/0159-Fix-MC-223153.patch b/leaf-server/minecraft-patches/features/0150-Fix-MC-223153.patch similarity index 84% rename from leaf-server/minecraft-patches/features/0159-Fix-MC-223153.patch rename to leaf-server/minecraft-patches/features/0150-Fix-MC-223153.patch index 93580389..25c9a487 100644 --- a/leaf-server/minecraft-patches/features/0159-Fix-MC-223153.patch +++ b/leaf-server/minecraft-patches/features/0150-Fix-MC-223153.patch @@ -6,10 +6,10 @@ Subject: [PATCH] Fix MC-223153 Related MC issue: https://bugs.mojang.com/browse/MC/issues/MC-223153 diff --git a/net/minecraft/world/level/block/Blocks.java b/net/minecraft/world/level/block/Blocks.java -index 941c57083803d69503e83c3ccbbb2759ba3db605..57aad048034005543a72556e990b53db8deebfee 100644 +index a46ce79b3c5905ac4b760e4cc70a9c839f0fa7c4..8c2ef9af7268c2b58aa81aa5794a5e22e71eaced 100644 --- a/net/minecraft/world/level/block/Blocks.java +++ b/net/minecraft/world/level/block/Blocks.java -@@ -6732,6 +6732,7 @@ public class Blocks { +@@ -6905,6 +6905,7 @@ public class Blocks { .mapColor(MapColor.COLOR_ORANGE) .instrument(NoteBlockInstrument.BASEDRUM) .requiresCorrectToolForDrops() diff --git a/scripts/upstreamCommit.sh b/scripts/upstreamCommit.sh index 2a59729d..2297c020 100755 --- a/scripts/upstreamCommit.sh +++ b/scripts/upstreamCommit.sh @@ -53,7 +53,7 @@ logsuffix="" # Paper updates if [ -n "$paperHash" ]; then newHash=$(git diff gradle.properties | awk '/^+paperCommit =/{print $NF}') - paper=$(getCommits "PaperMC/Paper" "$paperHash" $(echo $newHash | grep . -q && echo $newHash || echo "main")) # Update this on every version update + paper=$(getCommits "PaperMC/Paper" "$paperHash" $(echo $newHash | grep . -q && echo $newHash || echo "dev/1.21.9")) # Update this on every version update # Updates found if [ -n "$paper" ]; then