From a0077699e6f0a8a59aac45e9e32f9fffcd43ee1b Mon Sep 17 00:00:00 2001 From: granny Date: Wed, 22 Mar 2023 05:27:54 -0700 Subject: [PATCH] include pufferfish patches --- TODO.md | 2 +- patches/api/0001-Pufferfish-API-Changes.patch | 527 +++ .../api/0002-Fix-pufferfish-issues.patch | 2 +- ....patch => 0003-Build-System-Changes.patch} | 4 +- ...s.patch => 0004-Purpur-config-files.patch} | 0 ...patch => 0005-Purpur-client-support.patch} | 2 +- ...s.patch => 0006-Default-permissions.patch} | 0 ...005-Ridables.patch => 0007-Ridables.patch} | 0 ...ch => 0008-Allow-inventory-resizing.patch} | 2 +- ...7-Llama-API.patch => 0009-Llama-API.patch} | 0 ...{0008-AFK-API.patch => 0010-AFK-API.patch} | 2 +- ...atch => 0011-Bring-back-server-name.patch} | 0 ...t.patch => 0012-ExecuteCommandEvent.patch} | 0 ... 0013-LivingEntity-safeFallDistance.patch} | 0 ...old.patch => 0014-Lagging-threshold.patch} | 0 ...15-PlayerSetSpawnerTypeWithEggEvent.patch} | 0 ...ch => 0016-EMC-MonsterEggSpawnEvent.patch} | 0 ...ch => 0017-Player-invulnerabilities.patch} | 2 +- ...6-Anvil-API.patch => 0018-Anvil-API.patch} | 0 ... 0019-ItemStack-convenience-methods.patch} | 2 +- ...d-to-crystals-and-crystals-shoot-ph.patch} | 0 ...atch => 0021-ChatColor-conveniences.patch} | 0 ...022-LivingEntity-broadcastItemBreak.patch} | 0 ...atch => 0023-Item-entity-immunities.patch} | 0 ...able-zombie-aggressiveness-towards-.patch} | 0 ...-to-recipe-s-ExactChoice-ingredient.patch} | 0 ...lf-API.patch => 0026-Rabid-Wolf-API.patch} | 0 ...tch => 0027-PlayerBookTooLargeEvent.patch} | 0 ...herite-armor-grants-fire-resistance.patch} | 0 ...029-Add-EntityTeleportHinderedEvent.patch} | 0 ...tment-target-for-bows-and-crossbows.patch} | 0 ...> 0031-Iron-golem-poppy-calms-anger.patch} | 0 ...32-API-for-any-mob-to-burn-daylight.patch} | 0 ...d-back-player-spawned-endermite-API.patch} | 0 ... 0034-Fix-default-permission-system.patch} | 0 ...oner-API.patch => 0035-Summoner-API.patch} | 0 ...036-Clean-up-version-command-output.patch} | 0 ... => 0037-Extended-OfflinePlayer-API.patch} | 0 ...he-ability-to-add-combustible-items.patch} | 0 ....patch => 0039-Potion-NamespacedKey.patch} | 0 ...ne-API.patch => 0040-Grindstone-API.patch} | 0 ...Shears-can-have-looting-enchantment.patch} | 0 ... => 0042-Lobotomize-stuck-villagers.patch} | 0 ...ch => 0043-Add-local-difficulty-api.patch} | 0 ...imings.patch => 0044-Remove-Timings.patch} | 0 ...d-Bee-API.patch => 0045-Add-Bee-API.patch} | 0 ...-API.patch => 0046-Debug-Marker-API.patch} | 2 +- ....patch => 0047-Add-death-screen-API.patch} | 2 +- ...048-Add-item-packet-serialize-event.patch} | 0 ...uage-API.patch => 0049-Language-API.patch} | 0 ...d-log-suppression-for-LibraryLoader.patch} | 2 +- ...API.patch => 0051-Fire-Immunity-API.patch} | 0 ....patch => 0052-Added-goat-ram-event.patch} | 0 ....patch => 0053-Add-PreExplodeEvents.patch} | 0 .../0001-Pufferfish-Server-Changes.patch | 3662 +++++++++++++++++ .../server/0002-Fix-pufferfish-issues.patch | 24 +- ...{0001-Rebrand.patch => 0003-Rebrand.patch} | 57 +- ...s.patch => 0004-Purpur-config-files.patch} | 22 +- ...patch => 0005-Purpur-client-support.patch} | 8 +- ....patch => 0006-Fix-decompile-errors.patch} | 0 ...0007-Component-related-conveniences.patch} | 4 +- ...006-Ridables.patch => 0008-Ridables.patch} | 119 +- ...Configurable-entity-base-attributes.patch} | 22 +- ...0010-Barrels-and-enderchests-6-rows.patch} | 0 ...9-Llama-API.patch => 0011-Llama-API.patch} | 0 ...{0010-AFK-API.patch => 0012-AFK-API.patch} | 16 +- ...atch => 0013-Bring-back-server-name.patch} | 4 +- ...> 0014-Configurable-server-mod-name.patch} | 8 +- ... 0015-LivingEntity-safeFallDistance.patch} | 8 +- ...old.patch => 0016-Lagging-threshold.patch} | 8 +- ...17-PlayerSetSpawnerTypeWithEggEvent.patch} | 6 +- ...ch => 0018-Player-invulnerabilities.patch} | 8 +- ...7-Anvil-API.patch => 0019-Anvil-API.patch} | 0 ...0020-Alternative-Keepalive-Handling.patch} | 4 +- ...s.patch => 0021-Silk-touch-spawners.patch} | 2 +- ...> 0022-Add-turtle-egg-block-options.patch} | 2 +- ...-vanilla-command-permission-handler.patch} | 0 ...settings-suppressing-pointless-logs.patch} | 0 ...> 0025-Disable-outdated-build-check.patch} | 2 +- ...gs.patch => 0026-Giants-AI-settings.patch} | 0 ...> 0027-Zombie-horse-naturally-spawn.patch} | 4 +- ...028-Charged-creeper-naturally-spawn.patch} | 0 ...it-naturally-spawn-toast-and-killer.patch} | 0 ...er-showing-in-ping-before-server-fu.patch} | 0 ...atch => 0031-Tulips-change-fox-type.patch} | 0 ...patch => 0032-Breedable-Polar-Bears.patch} | 0 ...atch => 0033-Chickens-can-retaliate.patch} | 0 ...ption-to-set-armorstand-step-height.patch} | 4 +- ....patch => 0035-Cat-spawning-options.patch} | 0 ...ms.patch => 0036-Cows-eat-mushrooms.patch} | 0 ...ow-rotation-when-shearing-mooshroom.patch} | 2 +- ...patch => 0038-Pigs-give-saddle-back.patch} | 0 ...9-Snowman-drop-and-put-back-pumpkin.patch} | 0 ...0-Ender-dragon-always-drop-full-exp.patch} | 0 ... 0041-Signs-editable-on-right-click.patch} | 2 +- ...oisten-from-water-directly-under-it.patch} | 2 +- ...Minecart-settings-and-WASD-controls.patch} | 2 +- ...ble-loot-drops-on-death-by-cramming.patch} | 8 +- ...tion-to-toggle-milk-curing-bad-omen.patch} | 2 +- ...ould-check-if-entity-can-use-portal.patch} | 0 ...Skip-events-if-there-s-no-listeners.patch} | 0 ... 0048-Add-permission-for-F3-N-debug.patch} | 0 ...ch => 0049-Configurable-TPS-Catchup.patch} | 4 +- ...ow-loyalty-on-tridents-to-work-in-t.patch} | 2 +- ...erman-and-creeper-griefing-controls.patch} | 6 +- ...052-Villagers-follow-emerald-blocks.patch} | 4 +- ...ch => 0053-Allow-leashing-villagers.patch} | 8 +- ... => 0054-Implement-infinite-liquids.patch} | 8 +- ...5-Make-lava-flow-speed-configurable.patch} | 2 +- ...dd-player-death-exp-control-options.patch} | 2 +- ...rable-void-damage-height-and-damage.patch} | 10 +- ...=> 0058-Add-canSaveToDisk-to-Entity.patch} | 12 +- ...spenser-curse-of-binding-protection.patch} | 6 +- ...-for-boats-to-eject-players-on-land.patch} | 2 +- ...-mends-most-damages-equipment-first.patch} | 4 +- ...062-Add-5-second-tps-average-in-tps.patch} | 10 +- ...h => 0063-Implement-elytra-settings.patch} | 8 +- ...atch => 0064-Item-entity-immunities.patch} | 10 +- ...mand.patch => 0065-Add-ping-command.patch} | 0 ...mand.patch => 0066-Add-demo-command.patch} | 0 ...d.patch => 0067-Add-credits-command.patch} | 0 ...=> 0068-Configurable-jockey-options.patch} | 0 ...d-to-crystals-and-crystals-shoot-ph.patch} | 0 ...> 0070-Add-phantom-spawning-options.patch} | 0 ...071-Implement-bed-explosion-options.patch} | 2 +- ...nt-respawn-anchor-explosion-options.patch} | 2 +- ...Add-allow-water-in-end-world-option.patch} | 4 +- ... => 0074-Allow-color-codes-in-books.patch} | 10 +- ...espan.patch => 0075-Entity-lifespan.patch} | 18 +- ...eport-to-spawn-if-outside-world-bor.patch} | 6 +- ...ty.patch => 0077-Squid-EAR-immunity.patch} | 4 +- ...atch => 0078-Phantoms-burn-in-light.patch} | 0 ...0079-Configurable-villager-breeding.patch} | 4 +- ... 0080-Redstone-deactivates-spawners.patch} | 2 +- ...ch => 0081-Totems-work-in-inventory.patch} | 6 +- ...-Add-vindicator-johnny-spawn-chance.patch} | 0 ...on-to-disable-certain-block-updates.patch} | 0 ...0084-Dispensers-place-anvils-option.patch} | 2 +- ...rs.patch => 0085-Allow-anvil-colors.patch} | 2 +- ...-disable-dolphin-treasure-searching.patch} | 0 ...patch => 0087-Short-enderman-height.patch} | 8 +- ...top-squids-floating-on-top-of-water.patch} | 6 +- ...ng-obsidian-valid-for-portal-frames.patch} | 0 ...ities-can-use-portals-configuration.patch} | 8 +- ...091-LivingEntity-broadcastItemBreak.patch} | 0 ...tomizable-wither-health-and-healing.patch} | 0 ...gling-special-MobSpawners-per-world.patch} | 4 +- ...patch => 0094-Raid-cooldown-setting.patch} | 2 +- ...-config-options-per-projectile-type.patch} | 2 +- ...able-zombie-aggressiveness-towards-.patch} | 0 ...-to-recipe-s-ExactChoice-ingredient.patch} | 0 ...y.patch => 0098-Flying-squids-Oh-my.patch} | 0 ...patch => 0099-Infinity-bow-settings.patch} | 2 +- ...=> 0100-Configurable-daylight-cycle.patch} | 12 +- ...e-and-mending-enchantments-together.patch} | 0 ...2-Furnace-uses-lava-from-underneath.patch} | 2 +- ...ws-should-not-reset-despawn-counter.patch} | 2 +- ...e-add-farmland-mechanics-from-Alpha.patch} | 2 +- ...ustable-breeding-cooldown-to-config.patch} | 6 +- ...-entity-breeding-times-configurable.patch} | 8 +- ...es-from-item-forms-of-entities-to-e.patch} | 2 +- ...when-using-a-Name-Tag-on-an-Armor-S.patch} | 2 +- ...lowing-Endermen-to-despawn-even-whi.patch} | 4 +- ...10-Add-configurable-snowball-damage.patch} | 2 +- ...1-Changeable-Mob-Left-Handed-Chance.patch} | 6 +- ...=> 0112-Add-boat-fall-damage-config.patch} | 2 +- ...0113-Snow-Golem-rate-of-fire-config.patch} | 0 ...-Configurable-disable-give-dropping.patch} | 0 ...illager-Clerics-to-farm-Nether-Wart.patch} | 6 +- ...ied-Piglin-death-always-counting-as.patch} | 0 ...le-chance-for-wolves-to-spawn-rabid.patch} | 0 ...8-Configurable-default-collar-color.patch} | 0 ...tch => 0119-Phantom-flames-on-swoop.patch} | 0 ...-to-open-even-with-a-solid-block-on.patch} | 2 +- ...SBar.patch => 0121-Implement-TPSBar.patch} | 10 +- ...h => 0122-Striders-give-saddle-back.patch} | 0 ...tch => 0123-PlayerBookTooLargeEvent.patch} | 6 +- ...herite-armor-grants-fire-resistance.patch} | 4 +- ...125-Fix-rotating-UP-DOWN-CW-and-CCW.patch} | 0 ...efing-bypass-to-everything-affected.patch} | 22 +- ...llow-Note-Block-sounds-when-blocked.patch} | 2 +- ...128-Add-EntityTeleportHinderedEvent.patch} | 4 +- ... => 0129-Farmland-trampling-changes.patch} | 2 +- ...0-Movement-options-for-armor-stands.patch} | 6 +- ....patch => 0131-Fix-stuck-in-portals.patch} | 6 +- ...ggle-for-water-sensitive-mob-damage.patch} | 16 +- ...3-Config-to-always-tame-in-Creative.patch} | 8 +- ... 0134-End-crystal-explosion-options.patch} | 4 +- ...ther-Ender-Dragon-can-ride-vehicles.patch} | 0 ...atch => 0136-Dont-run-with-scissors.patch} | 8 +- ...nch-Man.patch => 0137-One-Punch-Man.patch} | 6 +- ...r-Pearl-cooldown-damage-and-Endermi.patch} | 2 +- ...to-ignore-nearby-mobs-when-sleeping.patch} | 2 +- ...d-back-player-spawned-endermite-API.patch} | 2 +- ...n-aggressiveness-towards-Endermites.patch} | 2 +- ...Dragon-Head-wearers-and-stare-aggro.patch} | 2 +- ...ig.patch => 0143-Tick-fluids-config.patch} | 2 +- ...44-Config-to-disable-Llama-caravans.patch} | 0 ...g-to-make-Creepers-explode-on-death.patch} | 0 ...rable-ravager-griefable-blocks-list.patch} | 0 ...147-Sneak-to-bulk-process-composter.patch} | 2 +- ...h => 0148-Config-for-skipping-night.patch} | 4 +- ...149-Add-config-for-villager-trading.patch} | 4 +- ...=> 0150-Allow-infinity-on-crossbows.patch} | 0 ...ngs.patch => 0151-Drowning-Settings.patch} | 12 +- ...reak-individual-slabs-when-sneaking.patch} | 2 +- ...to-disable-hostile-mob-spawn-on-ice.patch} | 2 +- ...g-to-show-Armor-Stand-arms-on-spawn.patch} | 2 +- ...tion-to-make-doors-require-redstone.patch} | 2 +- ...Config-to-allow-for-unsafe-enchants.patch} | 0 ...0157-Configurable-sponge-absorption.patch} | 2 +- ...ch => 0158-Projectile-offset-config.patch} | 2 +- ...or-powered-rail-activation-distance.patch} | 2 +- ...> 0160-Piglin-portal-spawn-modifier.patch} | 0 ...Config-to-change-max-number-of-bees.patch} | 0 ...-Config-for-wither-explosion-radius.patch} | 0 ... => 0163-Gamemode-extra-permissions.patch} | 0 ...ng-the-blocks-that-turn-into-dirt-p.patch} | 2 +- ...0165-Configurable-piston-push-limit.patch} | 2 +- ...166-Configurable-broadcast-settings.patch} | 0 ... => 0167-Configurable-mob-blindness.patch} | 6 +- ...hidden-players-from-entity-selector.patch} | 0 ...-to-impact-Creeper-explosion-radius.patch} | 0 ... 0170-Iron-golem-calm-anger-options.patch} | 0 ...ots.patch => 0171-Breedable-parrots.patch} | 0 ...gurable-powered-rail-boost-modifier.patch} | 2 +- ...ge-multiplier-critical-damage-value.patch} | 2 +- ...n-to-disable-dragon-egg-teleporting.patch} | 2 +- ...fig-for-unverified-username-message.patch} | 0 ...-anvil-cumulative-cost-configurable.patch} | 0 ...7-ShulkerBox-allow-oversized-stacks.patch} | 2 +- ...e-can-work-when-raining-or-at-night.patch} | 0 ...79-API-for-any-mob-to-burn-daylight.patch} | 24 +- ...h => 0180-Config-MobEffect-by-world.patch} | 2 +- ...eacon-Activation-Range-Configurable.patch} | 2 +- ...0182-Add-toggle-for-sand-duping-fix.patch} | 2 +- ...gle-for-end-portal-safe-teleporting.patch} | 6 +- ...ke-lightning-rod-range-configurable.patch} | 4 +- ...fter-eating-food-fills-hunger-bar-c.patch} | 2 +- ...ayer-join-full-server-by-permission.patch} | 0 ...ermission-bypass-for-portal-waiting.patch} | 2 +- ...8-Shulker-spawn-from-bullet-options.patch} | 0 ...ating-glow-berries-adds-glow-effect.patch} | 2 +- ...-Option-to-make-drowned-break-doors.patch} | 0 ...nfigurable-hunger-starvation-damage.patch} | 0 ...patch => 0192-Enhance-SysoutCatcher.patch} | 0 ...nd.patch => 0193-Add-uptime-command.patch} | 2 +- ...tch => 0194-Tool-actionable-options.patch} | 2 +- ...5-Store-placer-on-Block-when-placed.patch} | 2 +- ...oner-API.patch => 0196-Summoner-API.patch} | 8 +- ...mizable-sleeping-actionbar-messages.patch} | 4 +- ...-shulker-box-items-from-dropping-co.patch} | 2 +- ...199-Silk-touchable-budding-amethyst.patch} | 0 ...tch => 0200-Big-dripleaf-tilt-delay.patch} | 2 +- ...0201-Player-ridable-in-water-option.patch} | 0 ...-Enderman-teleport-on-projectile-hi.patch} | 4 +- ...d.patch => 0203-Add-compass-command.patch} | 2 +- ...h => 0204-Toggle-for-kinetic-damage.patch} | 6 +- ...-Option-for-disable-observer-clocks.patch} | 2 +- ...zeable-Zombie-Villager-curing-times.patch} | 0 ...-Option-for-sponges-to-work-on-lava.patch} | 2 +- ...208-Toggle-for-Wither-s-spawn-sound.patch} | 0 ...-breaks-from-solid-neighbors-config.patch} | 2 +- ...move-curse-of-binding-with-weakness.patch} | 2 +- ...0211-Conduit-behavior-configuration.patch} | 0 ...patch => 0212-Cauldron-fill-chances.patch} | 0 ...o-allow-mobs-to-pathfind-over-rails.patch} | 2 +- ... 0214-Shulker-change-color-with-dye.patch} | 0 ... => 0215-Extended-OfflinePlayer-API.patch} | 2 +- ...he-ability-to-add-combustible-items.patch} | 4 +- ...in-and-thunder-should-stop-on-sleep.patch} | 8 +- ...-blocks-to-grow-into-trees-naturall.patch} | 2 +- ...-right-click-to-use-exp-for-mending.patch} | 6 +- ...urally-aggressive-to-players-chance.patch} | 0 ...urally-aggressive-to-players-chance.patch} | 0 ...r-beds-to-explode-on-villager-sleep.patch} | 6 +- ...Halloween-options-and-optimizations.patch} | 12 +- ...atch => 0224-Config-for-grindstones.patch} | 0 ....patch => 0225-UPnP-Port-Forwarding.patch} | 8 +- ...Campfire-option-for-lit-when-placed.patch} | 2 +- ...tinguish-fire-blocks-with-snowballs.patch} | 2 +- ...on-to-disable-zombie-villagers-cure.patch} | 0 ...nt-BlockEntity-Lore-and-DisplayName.patch} | 2 +- ...tch => 0230-Signs-allow-color-codes.patch} | 6 +- ...-and-twisting-vines-configurable-ma.patch} | 0 ...=> 0232-Mobs-always-drop-experience.patch} | 16 +- ....patch => 0233-Potion-NamespacedKey.patch} | 0 ...ne-API.patch => 0234-Grindstone-API.patch} | 0 ...e-to-replant-crops-and-nether-warts.patch} | 2 +- ...ring-jeb-produces-random-color-wool.patch} | 0 ...urtle-eggs-random-tick-crack-chance.patch} | 2 +- ...=> 0238-Mob-head-visibility-percent.patch} | 4 +- ...able-valid-characters-for-usernames.patch} | 0 ...Shears-can-have-looting-enchantment.patch} | 6 +- ...Stop-bees-from-dying-after-stinging.patch} | 0 ...ounts-in-beehives-to-Purpur-clients.patch} | 10 +- ...onfigurable-farmland-trample-height.patch} | 2 +- ...onfigurable-player-pickup-exp-delay.patch} | 4 +- ...ng.patch => 0245-Allow-void-trading.patch} | 6 +- ...nt-eat-blocks-in-non-ticking-chunks.patch} | 2 +- ...h => 0247-Configurable-phantom-size.patch} | 0 ...> 0248-Configurable-food-attributes.patch} | 0 ....patch => 0249-Max-joins-per-second.patch} | 0 ...figurable-minimum-demand-for-trades.patch} | 4 +- ... => 0251-Lobotomize-stuck-villagers.patch} | 16 +- ...ion-for-villager-display-trade-item.patch} | 0 ...wner-not-spawning-water-animals-cor.patch} | 2 +- ...ig-for-mob-last-hurt-by-player-time.patch} | 6 +- ...=> 0255-Anvil-repair-damage-options.patch} | 2 +- ...> 0256-Fix-legacy-colors-in-console.patch} | 0 ...-turtle-egg-trampling-with-feather-.patch} | 2 +- ...d-toggle-for-enchant-level-clamping.patch} | 0 ...kip-junit-tests-for-purpur-commands.patch} | 0 ...rable-search-radius-for-villagers-t.patch} | 4 +- ...ge.patch => 0261-Stonecutter-damage.patch} | 2 +- ...le-damage-settings-for-magma-blocks.patch} | 2 +- ...263-Add-config-for-snow-on-blue-ice.patch} | 2 +- ... => 0264-Skeletons-eat-wither-roses.patch} | 0 ...65-Enchantment-Table-Persists-Lapis.patch} | 0 ...ofiler.patch => 0266-Spark-Profiler.patch} | 0 ...-disable-kick-for-out-of-order-chat.patch} | 4 +- ...for-sculk-shrieker-can_summon-state.patch} | 2 +- ...=> 0269-Config-to-not-let-coral-die.patch} | 2 +- ...ch => 0270-Add-local-difficulty-api.patch} | 0 ...271-Add-toggle-for-RNG-manipulation.patch} | 8 +- ... 0272-Send-client-custom-name-of-BE.patch} | 0 ...Fix-exact-choice-recipe-book-clicks.patch} | 2 +- ...=> 0274-Allow-custom-ChatDecorators.patch} | 4 +- ...otd.patch => 0275-Cache-server-motd.patch} | 4 +- ...imings.patch => 0276-Remove-Timings.patch} | 124 +- ...atch => 0277-Remove-Mojang-Profiler.patch} | 283 +- ...r-output-for-invalid-movement-kicks.patch} | 4 +- ...d-Bee-API.patch => 0279-Add-Bee-API.patch} | 2 +- ...-API.patch => 0280-Debug-Marker-API.patch} | 6 +- ...g-option-to-ignore-creative-players.patch} | 4 +- ...82-Add-skeleton-bow-accuracy-option.patch} | 0 ...atch => 0283-Allay-respect-item-NBT.patch} | 4 +- ....patch => 0284-Add-death-screen-API.patch} | 2 +- ...5-Implement-ram-and-rambar-commands.patch} | 0 ...286-Add-item-packet-serialize-event.patch} | 8 +- ...-123848.patch => 0287-Fix-MC-123848.patch} | 0 ...quid-colors-for-rainglow-fabric-mod.patch} | 0 ...n-to-fix-MC-3304-projectile-looting.patch} | 0 ...Configurable-block-blast-resistance.patch} | 0 ...gurable-block-fall-damage-modifiers.patch} | 0 ...uage-API.patch => 0292-Language-API.patch} | 2 +- ... 0293-Milk-Keeps-Beneficial-Effects.patch} | 8 +- ...s-not-looking-up-and-down-when-stra.patch} | 0 ...d-log-suppression-for-LibraryLoader.patch} | 0 ...ransparent-Blocks-In-Enchanting-Box.patch} | 0 ...ow-creeper-to-encircle-target-when-.patch} | 0 ...API.patch => 0298-Fire-Immunity-API.patch} | 8 +- ...eport-to-spawn-on-nether-ceiling-da.patch} | 6 +- ...t.patch => 0300-Added-got-ram-event.patch} | 4 +- ... 0301-Log-skipped-entity-s-position.patch} | 4 +- ....patch => 0302-End-Crystal-Cramming.patch} | 2 +- ...eacon-effects-when-covered-by-tinte.patch} | 2 +- ...ute-clamping-and-armor-limit-config.patch} | 0 ...ig-to-remove-explosion-radius-clamp.patch} | 4 +- ...ble-sugarcane-cactus-and-netherwart.patch} | 2 +- ....patch => 0307-Add-PreExplodeEvents.patch} | 0 ...8-Improve-output-of-plugins-command.patch} | 0 362 files changed, 4983 insertions(+), 751 deletions(-) create mode 100644 patches/api/0001-Pufferfish-API-Changes.patch rename patches/{removed => }/api/0002-Fix-pufferfish-issues.patch (90%) rename patches/api/{0001-Build-System-Changes.patch => 0003-Build-System-Changes.patch} (85%) rename patches/api/{0002-Purpur-config-files.patch => 0004-Purpur-config-files.patch} (100%) rename patches/api/{0003-Purpur-client-support.patch => 0005-Purpur-client-support.patch} (89%) rename patches/api/{0004-Default-permissions.patch => 0006-Default-permissions.patch} (100%) rename patches/api/{0005-Ridables.patch => 0007-Ridables.patch} (100%) rename patches/api/{0006-Allow-inventory-resizing.patch => 0008-Allow-inventory-resizing.patch} (89%) rename patches/api/{0007-Llama-API.patch => 0009-Llama-API.patch} (100%) rename patches/api/{0008-AFK-API.patch => 0010-AFK-API.patch} (96%) rename patches/api/{0009-Bring-back-server-name.patch => 0011-Bring-back-server-name.patch} (100%) rename patches/api/{0010-ExecuteCommandEvent.patch => 0012-ExecuteCommandEvent.patch} (100%) rename patches/api/{0011-LivingEntity-safeFallDistance.patch => 0013-LivingEntity-safeFallDistance.patch} (100%) rename patches/api/{0012-Lagging-threshold.patch => 0014-Lagging-threshold.patch} (100%) rename patches/api/{0013-PlayerSetSpawnerTypeWithEggEvent.patch => 0015-PlayerSetSpawnerTypeWithEggEvent.patch} (100%) rename patches/api/{0014-EMC-MonsterEggSpawnEvent.patch => 0016-EMC-MonsterEggSpawnEvent.patch} (100%) rename patches/api/{0015-Player-invulnerabilities.patch => 0017-Player-invulnerabilities.patch} (92%) rename patches/api/{0016-Anvil-API.patch => 0018-Anvil-API.patch} (100%) rename patches/api/{0017-ItemStack-convenience-methods.patch => 0019-ItemStack-convenience-methods.patch} (99%) rename patches/api/{0018-Phantoms-attracted-to-crystals-and-crystals-shoot-ph.patch => 0020-Phantoms-attracted-to-crystals-and-crystals-shoot-ph.patch} (100%) rename patches/api/{0019-ChatColor-conveniences.patch => 0021-ChatColor-conveniences.patch} (100%) rename patches/api/{0020-LivingEntity-broadcastItemBreak.patch => 0022-LivingEntity-broadcastItemBreak.patch} (100%) rename patches/api/{0021-Item-entity-immunities.patch => 0023-Item-entity-immunities.patch} (100%) rename patches/api/{0022-Add-option-to-disable-zombie-aggressiveness-towards-.patch => 0024-Add-option-to-disable-zombie-aggressiveness-towards-.patch} (100%) rename patches/api/{0023-Add-predicate-to-recipe-s-ExactChoice-ingredient.patch => 0025-Add-predicate-to-recipe-s-ExactChoice-ingredient.patch} (100%) rename patches/api/{0024-Rabid-Wolf-API.patch => 0026-Rabid-Wolf-API.patch} (100%) rename patches/api/{0025-PlayerBookTooLargeEvent.patch => 0027-PlayerBookTooLargeEvent.patch} (100%) rename patches/api/{0026-Full-netherite-armor-grants-fire-resistance.patch => 0028-Full-netherite-armor-grants-fire-resistance.patch} (100%) rename patches/api/{0027-Add-EntityTeleportHinderedEvent.patch => 0029-Add-EntityTeleportHinderedEvent.patch} (100%) rename patches/api/{0028-Add-enchantment-target-for-bows-and-crossbows.patch => 0030-Add-enchantment-target-for-bows-and-crossbows.patch} (100%) rename patches/api/{0029-Iron-golem-poppy-calms-anger.patch => 0031-Iron-golem-poppy-calms-anger.patch} (100%) rename patches/api/{0030-API-for-any-mob-to-burn-daylight.patch => 0032-API-for-any-mob-to-burn-daylight.patch} (100%) rename patches/api/{0031-Add-back-player-spawned-endermite-API.patch => 0033-Add-back-player-spawned-endermite-API.patch} (100%) rename patches/api/{0032-Fix-default-permission-system.patch => 0034-Fix-default-permission-system.patch} (100%) rename patches/api/{0033-Summoner-API.patch => 0035-Summoner-API.patch} (100%) rename patches/api/{0034-Clean-up-version-command-output.patch => 0036-Clean-up-version-command-output.patch} (100%) rename patches/api/{0035-Extended-OfflinePlayer-API.patch => 0037-Extended-OfflinePlayer-API.patch} (100%) rename patches/api/{0036-Added-the-ability-to-add-combustible-items.patch => 0038-Added-the-ability-to-add-combustible-items.patch} (100%) rename patches/api/{0037-Potion-NamespacedKey.patch => 0039-Potion-NamespacedKey.patch} (100%) rename patches/api/{0038-Grindstone-API.patch => 0040-Grindstone-API.patch} (100%) rename patches/api/{0039-Shears-can-have-looting-enchantment.patch => 0041-Shears-can-have-looting-enchantment.patch} (100%) rename patches/api/{0040-Lobotomize-stuck-villagers.patch => 0042-Lobotomize-stuck-villagers.patch} (100%) rename patches/api/{0041-Add-local-difficulty-api.patch => 0043-Add-local-difficulty-api.patch} (100%) rename patches/api/{0042-Remove-Timings.patch => 0044-Remove-Timings.patch} (100%) rename patches/api/{0043-Add-Bee-API.patch => 0045-Add-Bee-API.patch} (100%) rename patches/api/{0044-Debug-Marker-API.patch => 0046-Debug-Marker-API.patch} (99%) rename patches/api/{0045-Add-death-screen-API.patch => 0047-Add-death-screen-API.patch} (92%) rename patches/api/{0046-Add-item-packet-serialize-event.patch => 0048-Add-item-packet-serialize-event.patch} (100%) rename patches/api/{0047-Language-API.patch => 0049-Language-API.patch} (100%) rename patches/api/{0048-Add-log-suppression-for-LibraryLoader.patch => 0050-Add-log-suppression-for-LibraryLoader.patch} (96%) rename patches/api/{0049-Fire-Immunity-API.patch => 0051-Fire-Immunity-API.patch} (100%) rename patches/api/{0050-Added-goat-ram-event.patch => 0052-Added-goat-ram-event.patch} (100%) rename patches/api/{0051-Add-PreExplodeEvents.patch => 0053-Add-PreExplodeEvents.patch} (100%) create mode 100644 patches/server/0001-Pufferfish-Server-Changes.patch rename patches/{removed => }/server/0002-Fix-pufferfish-issues.patch (91%) rename patches/server/{0001-Rebrand.patch => 0003-Rebrand.patch} (89%) rename patches/server/{0002-Purpur-config-files.patch => 0004-Purpur-config-files.patch} (96%) rename patches/server/{0003-Purpur-client-support.patch => 0005-Purpur-client-support.patch} (91%) rename patches/server/{0004-Fix-decompile-errors.patch => 0006-Fix-decompile-errors.patch} (100%) rename patches/server/{0005-Component-related-conveniences.patch => 0007-Component-related-conveniences.patch} (96%) rename patches/server/{0006-Ridables.patch => 0008-Ridables.patch} (98%) rename patches/server/{0007-Configurable-entity-base-attributes.patch => 0009-Configurable-entity-base-attributes.patch} (99%) rename patches/server/{0008-Barrels-and-enderchests-6-rows.patch => 0010-Barrels-and-enderchests-6-rows.patch} (100%) rename patches/server/{0009-Llama-API.patch => 0011-Llama-API.patch} (100%) rename patches/server/{0010-AFK-API.patch => 0012-AFK-API.patch} (96%) rename patches/server/{0011-Bring-back-server-name.patch => 0013-Bring-back-server-name.patch} (91%) rename patches/server/{0012-Configurable-server-mod-name.patch => 0014-Configurable-server-mod-name.patch} (78%) rename patches/server/{0013-LivingEntity-safeFallDistance.patch => 0015-LivingEntity-safeFallDistance.patch} (93%) rename patches/server/{0014-Lagging-threshold.patch => 0016-Lagging-threshold.patch} (88%) rename patches/server/{0015-PlayerSetSpawnerTypeWithEggEvent.patch => 0017-PlayerSetSpawnerTypeWithEggEvent.patch} (93%) rename patches/server/{0016-Player-invulnerabilities.patch => 0018-Player-invulnerabilities.patch} (96%) rename patches/server/{0017-Anvil-API.patch => 0019-Anvil-API.patch} (100%) rename patches/server/{0018-Alternative-Keepalive-Handling.patch => 0020-Alternative-Keepalive-Handling.patch} (96%) rename patches/server/{0019-Silk-touch-spawners.patch => 0021-Silk-touch-spawners.patch} (99%) rename patches/server/{0020-Add-turtle-egg-block-options.patch => 0022-Add-turtle-egg-block-options.patch} (96%) rename patches/server/{0021-Fix-vanilla-command-permission-handler.patch => 0023-Fix-vanilla-command-permission-handler.patch} (100%) rename patches/server/{0022-Logger-settings-suppressing-pointless-logs.patch => 0024-Logger-settings-suppressing-pointless-logs.patch} (100%) rename patches/server/{0023-Disable-outdated-build-check.patch => 0025-Disable-outdated-build-check.patch} (92%) rename patches/server/{0024-Giants-AI-settings.patch => 0026-Giants-AI-settings.patch} (100%) rename patches/server/{0025-Zombie-horse-naturally-spawn.patch => 0027-Zombie-horse-naturally-spawn.patch} (95%) rename patches/server/{0026-Charged-creeper-naturally-spawn.patch => 0028-Charged-creeper-naturally-spawn.patch} (100%) rename patches/server/{0027-Rabbit-naturally-spawn-toast-and-killer.patch => 0029-Rabbit-naturally-spawn-toast-and-killer.patch} (100%) rename patches/server/{0028-Fix-outdated-server-showing-in-ping-before-server-fu.patch => 0030-Fix-outdated-server-showing-in-ping-before-server-fu.patch} (100%) rename patches/server/{0029-Tulips-change-fox-type.patch => 0031-Tulips-change-fox-type.patch} (100%) rename patches/server/{0030-Breedable-Polar-Bears.patch => 0032-Breedable-Polar-Bears.patch} (100%) rename patches/server/{0031-Chickens-can-retaliate.patch => 0033-Chickens-can-retaliate.patch} (100%) rename patches/server/{0032-Add-option-to-set-armorstand-step-height.patch => 0034-Add-option-to-set-armorstand-step-height.patch} (92%) rename patches/server/{0033-Cat-spawning-options.patch => 0035-Cat-spawning-options.patch} (100%) rename patches/server/{0034-Cows-eat-mushrooms.patch => 0036-Cows-eat-mushrooms.patch} (100%) rename patches/server/{0035-Fix-cow-rotation-when-shearing-mooshroom.patch => 0037-Fix-cow-rotation-when-shearing-mooshroom.patch} (93%) rename patches/server/{0036-Pigs-give-saddle-back.patch => 0038-Pigs-give-saddle-back.patch} (100%) rename patches/server/{0037-Snowman-drop-and-put-back-pumpkin.patch => 0039-Snowman-drop-and-put-back-pumpkin.patch} (100%) rename patches/server/{0038-Ender-dragon-always-drop-full-exp.patch => 0040-Ender-dragon-always-drop-full-exp.patch} (100%) rename patches/server/{0039-Signs-editable-on-right-click.patch => 0041-Signs-editable-on-right-click.patch} (97%) rename patches/server/{0040-Allow-soil-to-moisten-from-water-directly-under-it.patch => 0042-Allow-soil-to-moisten-from-water-directly-under-it.patch} (94%) rename patches/server/{0041-Minecart-settings-and-WASD-controls.patch => 0043-Minecart-settings-and-WASD-controls.patch} (99%) rename patches/server/{0042-Disable-loot-drops-on-death-by-cramming.patch => 0044-Disable-loot-drops-on-death-by-cramming.patch} (87%) rename patches/server/{0043-Option-to-toggle-milk-curing-bad-omen.patch => 0045-Option-to-toggle-milk-curing-bad-omen.patch} (95%) rename patches/server/{0044-End-gateway-should-check-if-entity-can-use-portal.patch => 0046-End-gateway-should-check-if-entity-can-use-portal.patch} (100%) rename patches/server/{0045-Skip-events-if-there-s-no-listeners.patch => 0047-Skip-events-if-there-s-no-listeners.patch} (100%) rename patches/server/{0046-Add-permission-for-F3-N-debug.patch => 0048-Add-permission-for-F3-N-debug.patch} (100%) rename patches/server/{0047-Configurable-TPS-Catchup.patch => 0049-Configurable-TPS-Catchup.patch} (93%) rename patches/server/{0048-Add-option-to-allow-loyalty-on-tridents-to-work-in-t.patch => 0050-Add-option-to-allow-loyalty-on-tridents-to-work-in-t.patch} (96%) rename patches/server/{0049-Add-enderman-and-creeper-griefing-controls.patch => 0051-Add-enderman-and-creeper-griefing-controls.patch} (95%) rename patches/server/{0050-Villagers-follow-emerald-blocks.patch => 0052-Villagers-follow-emerald-blocks.patch} (97%) rename patches/server/{0051-Allow-leashing-villagers.patch => 0053-Allow-leashing-villagers.patch} (93%) rename patches/server/{0052-Implement-infinite-liquids.patch => 0054-Implement-infinite-liquids.patch} (93%) rename patches/server/{0053-Make-lava-flow-speed-configurable.patch => 0055-Make-lava-flow-speed-configurable.patch} (95%) rename patches/server/{0054-Add-player-death-exp-control-options.patch => 0056-Add-player-death-exp-control-options.patch} (97%) rename patches/server/{0055-Configurable-void-damage-height-and-damage.patch => 0057-Configurable-void-damage-height-and-damage.patch} (87%) rename patches/server/{0056-Add-canSaveToDisk-to-Entity.patch => 0058-Add-canSaveToDisk-to-Entity.patch} (86%) rename patches/server/{0057-Dispenser-curse-of-binding-protection.patch => 0059-Dispenser-curse-of-binding-protection.patch} (92%) rename patches/server/{0058-Add-option-for-boats-to-eject-players-on-land.patch => 0060-Add-option-for-boats-to-eject-players-on-land.patch} (95%) rename patches/server/{0059-Mending-mends-most-damages-equipment-first.patch => 0061-Mending-mends-most-damages-equipment-first.patch} (96%) rename patches/server/{0060-Add-5-second-tps-average-in-tps.patch => 0062-Add-5-second-tps-average-in-tps.patch} (94%) rename patches/server/{0061-Implement-elytra-settings.patch => 0063-Implement-elytra-settings.patch} (95%) rename patches/server/{0062-Item-entity-immunities.patch => 0064-Item-entity-immunities.patch} (95%) rename patches/server/{0063-Add-ping-command.patch => 0065-Add-ping-command.patch} (100%) rename patches/server/{0064-Add-demo-command.patch => 0066-Add-demo-command.patch} (100%) rename patches/server/{0065-Add-credits-command.patch => 0067-Add-credits-command.patch} (100%) rename patches/server/{0066-Configurable-jockey-options.patch => 0068-Configurable-jockey-options.patch} (100%) rename patches/server/{0067-Phantoms-attracted-to-crystals-and-crystals-shoot-ph.patch => 0069-Phantoms-attracted-to-crystals-and-crystals-shoot-ph.patch} (100%) rename patches/server/{0068-Add-phantom-spawning-options.patch => 0070-Add-phantom-spawning-options.patch} (100%) rename patches/server/{0069-Implement-bed-explosion-options.patch => 0071-Implement-bed-explosion-options.patch} (97%) rename patches/server/{0070-Implement-respawn-anchor-explosion-options.patch => 0072-Implement-respawn-anchor-explosion-options.patch} (97%) rename patches/server/{0071-Add-allow-water-in-end-world-option.patch => 0073-Add-allow-water-in-end-world-option.patch} (96%) rename patches/server/{0072-Allow-color-codes-in-books.patch => 0074-Allow-color-codes-in-books.patch} (92%) rename patches/server/{0073-Entity-lifespan.patch => 0075-Entity-lifespan.patch} (87%) rename patches/server/{0074-Add-option-to-teleport-to-spawn-if-outside-world-bor.patch => 0076-Add-option-to-teleport-to-spawn-if-outside-world-bor.patch} (93%) rename patches/server/{0075-Squid-EAR-immunity.patch => 0077-Squid-EAR-immunity.patch} (94%) rename patches/server/{0076-Phantoms-burn-in-light.patch => 0078-Phantoms-burn-in-light.patch} (100%) rename patches/server/{0077-Configurable-villager-breeding.patch => 0079-Configurable-villager-breeding.patch} (93%) rename patches/server/{0078-Redstone-deactivates-spawners.patch => 0080-Redstone-deactivates-spawners.patch} (94%) rename patches/server/{0079-Totems-work-in-inventory.patch => 0081-Totems-work-in-inventory.patch} (91%) rename patches/server/{0080-Add-vindicator-johnny-spawn-chance.patch => 0082-Add-vindicator-johnny-spawn-chance.patch} (100%) rename patches/server/{0081-Add-option-to-disable-certain-block-updates.patch => 0083-Add-option-to-disable-certain-block-updates.patch} (100%) rename patches/server/{0082-Dispensers-place-anvils-option.patch => 0084-Dispensers-place-anvils-option.patch} (96%) rename patches/server/{0083-Allow-anvil-colors.patch => 0085-Allow-anvil-colors.patch} (98%) rename patches/server/{0084-Add-option-to-disable-dolphin-treasure-searching.patch => 0086-Add-option-to-disable-dolphin-treasure-searching.patch} (100%) rename patches/server/{0085-Short-enderman-height.patch => 0087-Short-enderman-height.patch} (90%) rename patches/server/{0086-Stop-squids-floating-on-top-of-water.patch => 0088-Stop-squids-floating-on-top-of-water.patch} (92%) rename patches/server/{0087-Crying-obsidian-valid-for-portal-frames.patch => 0089-Crying-obsidian-valid-for-portal-frames.patch} (100%) rename patches/server/{0088-Entities-can-use-portals-configuration.patch => 0090-Entities-can-use-portals-configuration.patch} (90%) rename patches/server/{0089-LivingEntity-broadcastItemBreak.patch => 0091-LivingEntity-broadcastItemBreak.patch} (100%) rename patches/server/{0090-Customizable-wither-health-and-healing.patch => 0092-Customizable-wither-health-and-healing.patch} (100%) rename patches/server/{0091-Allow-toggling-special-MobSpawners-per-world.patch => 0093-Allow-toggling-special-MobSpawners-per-world.patch} (96%) rename patches/server/{0092-Raid-cooldown-setting.patch => 0094-Raid-cooldown-setting.patch} (97%) rename patches/server/{0093-Despawn-rate-config-options-per-projectile-type.patch => 0095-Despawn-rate-config-options-per-projectile-type.patch} (96%) rename patches/server/{0094-Add-option-to-disable-zombie-aggressiveness-towards-.patch => 0096-Add-option-to-disable-zombie-aggressiveness-towards-.patch} (100%) rename patches/server/{0095-Add-predicate-to-recipe-s-ExactChoice-ingredient.patch => 0097-Add-predicate-to-recipe-s-ExactChoice-ingredient.patch} (100%) rename patches/server/{0096-Flying-squids-Oh-my.patch => 0098-Flying-squids-Oh-my.patch} (100%) rename patches/server/{0097-Infinity-bow-settings.patch => 0099-Infinity-bow-settings.patch} (97%) rename patches/server/{0098-Configurable-daylight-cycle.patch => 0100-Configurable-daylight-cycle.patch} (92%) rename patches/server/{0099-Allow-infinite-and-mending-enchantments-together.patch => 0101-Allow-infinite-and-mending-enchantments-together.patch} (100%) rename patches/server/{0100-Furnace-uses-lava-from-underneath.patch => 0102-Furnace-uses-lava-from-underneath.patch} (97%) rename patches/server/{0101-Arrows-should-not-reset-despawn-counter.patch => 0103-Arrows-should-not-reset-despawn-counter.patch} (95%) rename patches/server/{0102-Ability-to-re-add-farmland-mechanics-from-Alpha.patch => 0104-Ability-to-re-add-farmland-mechanics-from-Alpha.patch} (95%) rename patches/server/{0103-Add-adjustable-breeding-cooldown-to-config.patch => 0105-Add-adjustable-breeding-cooldown-to-config.patch} (96%) rename patches/server/{0104-Make-entity-breeding-times-configurable.patch => 0106-Make-entity-breeding-times-configurable.patch} (99%) rename patches/server/{0105-Apply-display-names-from-item-forms-of-entities-to-e.patch => 0107-Apply-display-names-from-item-forms-of-entities-to-e.patch} (99%) rename patches/server/{0106-Set-name-visible-when-using-a-Name-Tag-on-an-Armor-S.patch => 0108-Set-name-visible-when-using-a-Name-Tag-on-an-Armor-S.patch} (96%) rename patches/server/{0107-Add-config-for-allowing-Endermen-to-despawn-even-whi.patch => 0109-Add-config-for-allowing-Endermen-to-despawn-even-whi.patch} (93%) rename patches/server/{0108-Add-configurable-snowball-damage.patch => 0110-Add-configurable-snowball-damage.patch} (95%) rename patches/server/{0109-Changeable-Mob-Left-Handed-Chance.patch => 0111-Changeable-Mob-Left-Handed-Chance.patch} (86%) rename patches/server/{0110-Add-boat-fall-damage-config.patch => 0112-Add-boat-fall-damage-config.patch} (97%) rename patches/server/{0111-Snow-Golem-rate-of-fire-config.patch => 0113-Snow-Golem-rate-of-fire-config.patch} (100%) rename patches/server/{0112-EMC-Configurable-disable-give-dropping.patch => 0114-EMC-Configurable-disable-give-dropping.patch} (100%) rename patches/server/{0113-Option-for-Villager-Clerics-to-farm-Nether-Wart.patch => 0115-Option-for-Villager-Clerics-to-farm-Nether-Wart.patch} (98%) rename patches/server/{0114-Toggle-for-Zombified-Piglin-death-always-counting-as.patch => 0116-Toggle-for-Zombified-Piglin-death-always-counting-as.patch} (100%) rename patches/server/{0115-Configurable-chance-for-wolves-to-spawn-rabid.patch => 0117-Configurable-chance-for-wolves-to-spawn-rabid.patch} (100%) rename patches/server/{0116-Configurable-default-collar-color.patch => 0118-Configurable-default-collar-color.patch} (100%) rename patches/server/{0117-Phantom-flames-on-swoop.patch => 0119-Phantom-flames-on-swoop.patch} (100%) rename patches/server/{0118-Option-for-chests-to-open-even-with-a-solid-block-on.patch => 0120-Option-for-chests-to-open-even-with-a-solid-block-on.patch} (94%) rename patches/server/{0119-Implement-TPSBar.patch => 0121-Implement-TPSBar.patch} (97%) rename patches/server/{0120-Striders-give-saddle-back.patch => 0122-Striders-give-saddle-back.patch} (100%) rename patches/server/{0121-PlayerBookTooLargeEvent.patch => 0123-PlayerBookTooLargeEvent.patch} (92%) rename patches/server/{0122-Full-netherite-armor-grants-fire-resistance.patch => 0124-Full-netherite-armor-grants-fire-resistance.patch} (94%) rename patches/server/{0123-Fix-rotating-UP-DOWN-CW-and-CCW.patch => 0125-Fix-rotating-UP-DOWN-CW-and-CCW.patch} (100%) rename patches/server/{0124-Add-mobGriefing-bypass-to-everything-affected.patch => 0126-Add-mobGriefing-bypass-to-everything-affected.patch} (98%) rename patches/server/{0125-Config-to-allow-Note-Block-sounds-when-blocked.patch => 0127-Config-to-allow-Note-Block-sounds-when-blocked.patch} (97%) rename patches/server/{0126-Add-EntityTeleportHinderedEvent.patch => 0128-Add-EntityTeleportHinderedEvent.patch} (98%) rename patches/server/{0127-Farmland-trampling-changes.patch => 0129-Farmland-trampling-changes.patch} (97%) rename patches/server/{0128-Movement-options-for-armor-stands.patch => 0130-Movement-options-for-armor-stands.patch} (94%) rename patches/server/{0129-Fix-stuck-in-portals.patch => 0131-Fix-stuck-in-portals.patch} (93%) rename patches/server/{0130-Toggle-for-water-sensitive-mob-damage.patch => 0132-Toggle-for-water-sensitive-mob-damage.patch} (99%) rename patches/server/{0131-Config-to-always-tame-in-Creative.patch => 0133-Config-to-always-tame-in-Creative.patch} (94%) rename patches/server/{0132-End-crystal-explosion-options.patch => 0134-End-crystal-explosion-options.patch} (97%) rename patches/server/{0133-Configs-for-if-Wither-Ender-Dragon-can-ride-vehicles.patch => 0135-Configs-for-if-Wither-Ender-Dragon-can-ride-vehicles.patch} (100%) rename patches/server/{0134-Dont-run-with-scissors.patch => 0136-Dont-run-with-scissors.patch} (94%) rename patches/server/{0135-One-Punch-Man.patch => 0137-One-Punch-Man.patch} (91%) rename patches/server/{0136-Configurable-Ender-Pearl-cooldown-damage-and-Endermi.patch => 0138-Configurable-Ender-Pearl-cooldown-damage-and-Endermi.patch} (98%) rename patches/server/{0137-Config-to-ignore-nearby-mobs-when-sleeping.patch => 0139-Config-to-ignore-nearby-mobs-when-sleeping.patch} (96%) rename patches/server/{0138-Add-back-player-spawned-endermite-API.patch => 0140-Add-back-player-spawned-endermite-API.patch} (97%) rename patches/server/{0139-Config-Enderman-aggressiveness-towards-Endermites.patch => 0141-Config-Enderman-aggressiveness-towards-Endermites.patch} (97%) rename patches/server/{0140-Config-to-ignore-Dragon-Head-wearers-and-stare-aggro.patch => 0142-Config-to-ignore-Dragon-Head-wearers-and-stare-aggro.patch} (96%) rename patches/server/{0141-Tick-fluids-config.patch => 0143-Tick-fluids-config.patch} (97%) rename patches/server/{0142-Config-to-disable-Llama-caravans.patch => 0144-Config-to-disable-Llama-caravans.patch} (100%) rename patches/server/{0143-Config-to-make-Creepers-explode-on-death.patch => 0145-Config-to-make-Creepers-explode-on-death.patch} (100%) rename patches/server/{0144-Configurable-ravager-griefable-blocks-list.patch => 0146-Configurable-ravager-griefable-blocks-list.patch} (100%) rename patches/server/{0145-Sneak-to-bulk-process-composter.patch => 0147-Sneak-to-bulk-process-composter.patch} (98%) rename patches/server/{0146-Config-for-skipping-night.patch => 0148-Config-for-skipping-night.patch} (92%) rename patches/server/{0147-Add-config-for-villager-trading.patch => 0149-Add-config-for-villager-trading.patch} (96%) rename patches/server/{0148-Allow-infinity-on-crossbows.patch => 0150-Allow-infinity-on-crossbows.patch} (100%) rename patches/server/{0149-Drowning-Settings.patch => 0151-Drowning-Settings.patch} (86%) rename patches/server/{0150-Break-individual-slabs-when-sneaking.patch => 0152-Break-individual-slabs-when-sneaking.patch} (97%) rename patches/server/{0151-Config-to-disable-hostile-mob-spawn-on-ice.patch => 0153-Config-to-disable-hostile-mob-spawn-on-ice.patch} (96%) rename patches/server/{0152-Config-to-show-Armor-Stand-arms-on-spawn.patch => 0154-Config-to-show-Armor-Stand-arms-on-spawn.patch} (96%) rename patches/server/{0153-Option-to-make-doors-require-redstone.patch => 0155-Option-to-make-doors-require-redstone.patch} (98%) rename patches/server/{0154-Config-to-allow-for-unsafe-enchants.patch => 0156-Config-to-allow-for-unsafe-enchants.patch} (100%) rename patches/server/{0155-Configurable-sponge-absorption.patch => 0157-Configurable-sponge-absorption.patch} (97%) rename patches/server/{0156-Projectile-offset-config.patch => 0158-Projectile-offset-config.patch} (99%) rename patches/server/{0157-Config-for-powered-rail-activation-distance.patch => 0159-Config-for-powered-rail-activation-distance.patch} (94%) rename patches/server/{0158-Piglin-portal-spawn-modifier.patch => 0160-Piglin-portal-spawn-modifier.patch} (100%) rename patches/server/{0159-Config-to-change-max-number-of-bees.patch => 0161-Config-to-change-max-number-of-bees.patch} (100%) rename patches/server/{0160-Config-for-wither-explosion-radius.patch => 0162-Config-for-wither-explosion-radius.patch} (100%) rename patches/server/{0161-Gamemode-extra-permissions.patch => 0163-Gamemode-extra-permissions.patch} (100%) rename patches/server/{0162-Config-for-changing-the-blocks-that-turn-into-dirt-p.patch => 0164-Config-for-changing-the-blocks-that-turn-into-dirt-p.patch} (96%) rename patches/server/{0163-Configurable-piston-push-limit.patch => 0165-Configurable-piston-push-limit.patch} (96%) rename patches/server/{0164-Configurable-broadcast-settings.patch => 0166-Configurable-broadcast-settings.patch} (100%) rename patches/server/{0165-Configurable-mob-blindness.patch => 0167-Configurable-mob-blindness.patch} (92%) rename patches/server/{0166-Hide-hidden-players-from-entity-selector.patch => 0168-Hide-hidden-players-from-entity-selector.patch} (100%) rename patches/server/{0167-Config-for-health-to-impact-Creeper-explosion-radius.patch => 0169-Config-for-health-to-impact-Creeper-explosion-radius.patch} (100%) rename patches/server/{0168-Iron-golem-calm-anger-options.patch => 0170-Iron-golem-calm-anger-options.patch} (100%) rename patches/server/{0169-Breedable-parrots.patch => 0171-Breedable-parrots.patch} (100%) rename patches/server/{0170-Configurable-powered-rail-boost-modifier.patch => 0172-Configurable-powered-rail-boost-modifier.patch} (96%) rename patches/server/{0171-Add-config-change-multiplier-critical-damage-value.patch => 0173-Add-config-change-multiplier-critical-damage-value.patch} (96%) rename patches/server/{0172-Option-to-disable-dragon-egg-teleporting.patch => 0174-Option-to-disable-dragon-egg-teleporting.patch} (95%) rename patches/server/{0173-Config-for-unverified-username-message.patch => 0175-Config-for-unverified-username-message.patch} (100%) rename patches/server/{0174-Make-anvil-cumulative-cost-configurable.patch => 0176-Make-anvil-cumulative-cost-configurable.patch} (100%) rename patches/server/{0175-ShulkerBox-allow-oversized-stacks.patch => 0177-ShulkerBox-allow-oversized-stacks.patch} (97%) rename patches/server/{0176-Bee-can-work-when-raining-or-at-night.patch => 0178-Bee-can-work-when-raining-or-at-night.patch} (100%) rename patches/server/{0177-API-for-any-mob-to-burn-daylight.patch => 0179-API-for-any-mob-to-burn-daylight.patch} (94%) rename patches/server/{0178-Config-MobEffect-by-world.patch => 0180-Config-MobEffect-by-world.patch} (98%) rename patches/server/{0179-Beacon-Activation-Range-Configurable.patch => 0181-Beacon-Activation-Range-Configurable.patch} (96%) rename patches/server/{0180-Add-toggle-for-sand-duping-fix.patch => 0182-Add-toggle-for-sand-duping-fix.patch} (95%) rename patches/server/{0181-Add-toggle-for-end-portal-safe-teleporting.patch => 0183-Add-toggle-for-end-portal-safe-teleporting.patch} (92%) rename patches/server/{0182-Make-lightning-rod-range-configurable.patch => 0184-Make-lightning-rod-range-configurable.patch} (93%) rename patches/server/{0183-Burp-delay-burp-after-eating-food-fills-hunger-bar-c.patch => 0185-Burp-delay-burp-after-eating-food-fills-hunger-bar-c.patch} (97%) rename patches/server/{0184-Allow-player-join-full-server-by-permission.patch => 0186-Allow-player-join-full-server-by-permission.patch} (100%) rename patches/server/{0185-Add-permission-bypass-for-portal-waiting.patch => 0187-Add-permission-bypass-for-portal-waiting.patch} (95%) rename patches/server/{0186-Shulker-spawn-from-bullet-options.patch => 0188-Shulker-spawn-from-bullet-options.patch} (100%) rename patches/server/{0187-Eating-glow-berries-adds-glow-effect.patch => 0189-Eating-glow-berries-adds-glow-effect.patch} (97%) rename patches/server/{0188-Option-to-make-drowned-break-doors.patch => 0190-Option-to-make-drowned-break-doors.patch} (100%) rename patches/server/{0189-Configurable-hunger-starvation-damage.patch => 0191-Configurable-hunger-starvation-damage.patch} (100%) rename patches/server/{0190-Enhance-SysoutCatcher.patch => 0192-Enhance-SysoutCatcher.patch} (100%) rename patches/server/{0191-Add-uptime-command.patch => 0193-Add-uptime-command.patch} (98%) rename patches/server/{0192-Tool-actionable-options.patch => 0194-Tool-actionable-options.patch} (99%) rename patches/server/{0193-Store-placer-on-Block-when-placed.patch => 0195-Store-placer-on-Block-when-placed.patch} (96%) rename patches/server/{0194-Summoner-API.patch => 0196-Summoner-API.patch} (97%) rename patches/server/{0195-Customizable-sleeping-actionbar-messages.patch => 0197-Customizable-sleeping-actionbar-messages.patch} (96%) rename patches/server/{0196-option-to-disable-shulker-box-items-from-dropping-co.patch => 0198-option-to-disable-shulker-box-items-from-dropping-co.patch} (96%) rename patches/server/{0197-Silk-touchable-budding-amethyst.patch => 0199-Silk-touchable-budding-amethyst.patch} (100%) rename patches/server/{0198-Big-dripleaf-tilt-delay.patch => 0200-Big-dripleaf-tilt-delay.patch} (96%) rename patches/server/{0199-Player-ridable-in-water-option.patch => 0201-Player-ridable-in-water-option.patch} (100%) rename patches/server/{0200-Config-to-disable-Enderman-teleport-on-projectile-hi.patch => 0202-Config-to-disable-Enderman-teleport-on-projectile-hi.patch} (94%) rename patches/server/{0201-Add-compass-command.patch => 0203-Add-compass-command.patch} (99%) rename patches/server/{0202-Toggle-for-kinetic-damage.patch => 0204-Toggle-for-kinetic-damage.patch} (89%) rename patches/server/{0203-Add-Option-for-disable-observer-clocks.patch => 0205-Add-Option-for-disable-observer-clocks.patch} (95%) rename patches/server/{0204-Customizeable-Zombie-Villager-curing-times.patch => 0206-Customizeable-Zombie-Villager-curing-times.patch} (100%) rename patches/server/{0205-Option-for-sponges-to-work-on-lava.patch => 0207-Option-for-sponges-to-work-on-lava.patch} (95%) rename patches/server/{0206-Toggle-for-Wither-s-spawn-sound.patch => 0208-Toggle-for-Wither-s-spawn-sound.patch} (100%) rename patches/server/{0207-Cactus-breaks-from-solid-neighbors-config.patch => 0209-Cactus-breaks-from-solid-neighbors-config.patch} (95%) rename patches/server/{0208-Config-to-remove-curse-of-binding-with-weakness.patch => 0210-Config-to-remove-curse-of-binding-with-weakness.patch} (96%) rename patches/server/{0209-Conduit-behavior-configuration.patch => 0211-Conduit-behavior-configuration.patch} (100%) rename patches/server/{0210-Cauldron-fill-chances.patch => 0212-Cauldron-fill-chances.patch} (100%) rename patches/server/{0211-Config-to-allow-mobs-to-pathfind-over-rails.patch => 0213-Config-to-allow-mobs-to-pathfind-over-rails.patch} (97%) rename patches/server/{0212-Shulker-change-color-with-dye.patch => 0214-Shulker-change-color-with-dye.patch} (100%) rename patches/server/{0213-Extended-OfflinePlayer-API.patch => 0215-Extended-OfflinePlayer-API.patch} (99%) rename patches/server/{0214-Added-the-ability-to-add-combustible-items.patch => 0216-Added-the-ability-to-add-combustible-items.patch} (96%) rename patches/server/{0215-Option-for-if-rain-and-thunder-should-stop-on-sleep.patch => 0217-Option-for-if-rain-and-thunder-should-stop-on-sleep.patch} (90%) rename patches/server/{0216-Chance-for-azalea-blocks-to-grow-into-trees-naturall.patch => 0218-Chance-for-azalea-blocks-to-grow-into-trees-naturall.patch} (98%) rename patches/server/{0217-Shift-right-click-to-use-exp-for-mending.patch => 0219-Shift-right-click-to-use-exp-for-mending.patch} (94%) rename patches/server/{0218-Dolphins-naturally-aggressive-to-players-chance.patch => 0220-Dolphins-naturally-aggressive-to-players-chance.patch} (100%) rename patches/server/{0219-Cows-naturally-aggressive-to-players-chance.patch => 0221-Cows-naturally-aggressive-to-players-chance.patch} (100%) rename patches/server/{0220-Option-for-beds-to-explode-on-villager-sleep.patch => 0222-Option-for-beds-to-explode-on-villager-sleep.patch} (90%) rename patches/server/{0221-Halloween-options-and-optimizations.patch => 0223-Halloween-options-and-optimizations.patch} (92%) rename patches/server/{0222-Config-for-grindstones.patch => 0224-Config-for-grindstones.patch} (100%) rename patches/server/{0223-UPnP-Port-Forwarding.patch => 0225-UPnP-Port-Forwarding.patch} (92%) rename patches/server/{0224-Campfire-option-for-lit-when-placed.patch => 0226-Campfire-option-for-lit-when-placed.patch} (96%) rename patches/server/{0225-options-to-extinguish-fire-blocks-with-snowballs.patch => 0227-options-to-extinguish-fire-blocks-with-snowballs.patch} (98%) rename patches/server/{0226-Add-option-to-disable-zombie-villagers-cure.patch => 0228-Add-option-to-disable-zombie-villagers-cure.patch} (100%) rename patches/server/{0227-Persistent-BlockEntity-Lore-and-DisplayName.patch => 0229-Persistent-BlockEntity-Lore-and-DisplayName.patch} (99%) rename patches/server/{0228-Signs-allow-color-codes.patch => 0230-Signs-allow-color-codes.patch} (95%) rename patches/server/{0229-Kelp-cave-weeping-and-twisting-vines-configurable-ma.patch => 0231-Kelp-cave-weeping-and-twisting-vines-configurable-ma.patch} (100%) rename patches/server/{0230-Mobs-always-drop-experience.patch => 0232-Mobs-always-drop-experience.patch} (99%) rename patches/server/{0231-Potion-NamespacedKey.patch => 0233-Potion-NamespacedKey.patch} (100%) rename patches/server/{0232-Grindstone-API.patch => 0234-Grindstone-API.patch} (100%) rename patches/server/{0233-Ability-for-hoe-to-replant-crops-and-nether-warts.patch => 0235-Ability-for-hoe-to-replant-crops-and-nether-warts.patch} (98%) rename patches/server/{0234-Shearing-jeb-produces-random-color-wool.patch => 0236-Shearing-jeb-produces-random-color-wool.patch} (100%) rename patches/server/{0235-Turtle-eggs-random-tick-crack-chance.patch => 0237-Turtle-eggs-random-tick-crack-chance.patch} (95%) rename patches/server/{0236-Mob-head-visibility-percent.patch => 0238-Mob-head-visibility-percent.patch} (97%) rename patches/server/{0237-Configurable-valid-characters-for-usernames.patch => 0239-Configurable-valid-characters-for-usernames.patch} (100%) rename patches/server/{0238-Shears-can-have-looting-enchantment.patch => 0240-Shears-can-have-looting-enchantment.patch} (97%) rename patches/server/{0239-Stop-bees-from-dying-after-stinging.patch => 0241-Stop-bees-from-dying-after-stinging.patch} (100%) rename patches/server/{0240-Give-bee-counts-in-beehives-to-Purpur-clients.patch => 0242-Give-bee-counts-in-beehives-to-Purpur-clients.patch} (91%) rename patches/server/{0241-Configurable-farmland-trample-height.patch => 0243-Configurable-farmland-trample-height.patch} (97%) rename patches/server/{0242-Configurable-player-pickup-exp-delay.patch => 0244-Configurable-player-pickup-exp-delay.patch} (95%) rename patches/server/{0243-Allow-void-trading.patch => 0245-Allow-void-trading.patch} (91%) rename patches/server/{0244-Dont-eat-blocks-in-non-ticking-chunks.patch => 0246-Dont-eat-blocks-in-non-ticking-chunks.patch} (96%) rename patches/server/{0245-Configurable-phantom-size.patch => 0247-Configurable-phantom-size.patch} (100%) rename patches/server/{0246-Configurable-food-attributes.patch => 0248-Configurable-food-attributes.patch} (100%) rename patches/server/{0247-Max-joins-per-second.patch => 0249-Max-joins-per-second.patch} (100%) rename patches/server/{0248-Configurable-minimum-demand-for-trades.patch => 0250-Configurable-minimum-demand-for-trades.patch} (95%) rename patches/server/{0249-Lobotomize-stuck-villagers.patch => 0251-Lobotomize-stuck-villagers.patch} (91%) rename patches/server/{0250-Option-for-villager-display-trade-item.patch => 0252-Option-for-villager-display-trade-item.patch} (100%) rename patches/server/{0251-MC-238526-Fix-spawner-not-spawning-water-animals-cor.patch => 0253-MC-238526-Fix-spawner-not-spawning-water-animals-cor.patch} (95%) rename patches/server/{0252-Config-for-mob-last-hurt-by-player-time.patch => 0254-Config-for-mob-last-hurt-by-player-time.patch} (93%) rename patches/server/{0253-Anvil-repair-damage-options.patch => 0255-Anvil-repair-damage-options.patch} (98%) rename patches/server/{0254-Fix-legacy-colors-in-console.patch => 0256-Fix-legacy-colors-in-console.patch} (100%) rename patches/server/{0255-Option-to-disable-turtle-egg-trampling-with-feather-.patch => 0257-Option-to-disable-turtle-egg-trampling-with-feather-.patch} (96%) rename patches/server/{0256-Add-toggle-for-enchant-level-clamping.patch => 0258-Add-toggle-for-enchant-level-clamping.patch} (100%) rename patches/server/{0257-Skip-junit-tests-for-purpur-commands.patch => 0259-Skip-junit-tests-for-purpur-commands.patch} (100%) rename patches/server/{0258-Implement-configurable-search-radius-for-villagers-t.patch => 0260-Implement-configurable-search-radius-for-villagers-t.patch} (94%) rename patches/server/{0259-Stonecutter-damage.patch => 0261-Stonecutter-damage.patch} (98%) rename patches/server/{0260-Configurable-damage-settings-for-magma-blocks.patch => 0262-Configurable-damage-settings-for-magma-blocks.patch} (96%) rename patches/server/{0261-Add-config-for-snow-on-blue-ice.patch => 0263-Add-config-for-snow-on-blue-ice.patch} (95%) rename patches/server/{0262-Skeletons-eat-wither-roses.patch => 0264-Skeletons-eat-wither-roses.patch} (100%) rename patches/server/{0263-Enchantment-Table-Persists-Lapis.patch => 0265-Enchantment-Table-Persists-Lapis.patch} (100%) rename patches/server/{0264-Spark-Profiler.patch => 0266-Spark-Profiler.patch} (100%) rename patches/server/{0265-Option-to-disable-kick-for-out-of-order-chat.patch => 0267-Option-to-disable-kick-for-out-of-order-chat.patch} (92%) rename patches/server/{0266-Config-for-sculk-shrieker-can_summon-state.patch => 0268-Config-for-sculk-shrieker-can_summon-state.patch} (95%) rename patches/server/{0267-Config-to-not-let-coral-die.patch => 0269-Config-to-not-let-coral-die.patch} (96%) rename patches/server/{0268-Add-local-difficulty-api.patch => 0270-Add-local-difficulty-api.patch} (100%) rename patches/server/{0269-Add-toggle-for-RNG-manipulation.patch => 0271-Add-toggle-for-RNG-manipulation.patch} (88%) rename patches/server/{0270-Send-client-custom-name-of-BE.patch => 0272-Send-client-custom-name-of-BE.patch} (100%) rename patches/server/{0271-PaperPR-Fix-exact-choice-recipe-book-clicks.patch => 0273-PaperPR-Fix-exact-choice-recipe-book-clicks.patch} (98%) rename patches/server/{0272-Allow-custom-ChatDecorators.patch => 0274-Allow-custom-ChatDecorators.patch} (90%) rename patches/server/{0273-Cache-server-motd.patch => 0275-Cache-server-motd.patch} (92%) rename patches/server/{0274-Remove-Timings.patch => 0276-Remove-Timings.patch} (91%) rename patches/server/{0275-Remove-Mojang-Profiler.patch => 0277-Remove-Mojang-Profiler.patch} (88%) rename patches/server/{0276-Add-more-logger-output-for-invalid-movement-kicks.patch => 0278-Add-more-logger-output-for-invalid-movement-kicks.patch} (94%) rename patches/server/{0277-Add-Bee-API.patch => 0279-Add-Bee-API.patch} (96%) rename patches/server/{0278-Debug-Marker-API.patch => 0280-Debug-Marker-API.patch} (96%) rename patches/server/{0279-mob-spawning-option-to-ignore-creative-players.patch => 0281-mob-spawning-option-to-ignore-creative-players.patch} (94%) rename patches/server/{0280-Add-skeleton-bow-accuracy-option.patch => 0282-Add-skeleton-bow-accuracy-option.patch} (100%) rename patches/server/{0281-Allay-respect-item-NBT.patch => 0283-Allay-respect-item-NBT.patch} (94%) rename patches/server/{0282-Add-death-screen-API.patch => 0284-Add-death-screen-API.patch} (96%) rename patches/server/{0283-Implement-ram-and-rambar-commands.patch => 0285-Implement-ram-and-rambar-commands.patch} (100%) rename patches/server/{0284-Add-item-packet-serialize-event.patch => 0286-Add-item-packet-serialize-event.patch} (92%) rename patches/server/{0285-Fix-MC-123848.patch => 0287-Fix-MC-123848.patch} (100%) rename patches/server/{0286-Implement-squid-colors-for-rainglow-fabric-mod.patch => 0288-Implement-squid-colors-for-rainglow-fabric-mod.patch} (100%) rename patches/server/{0287-Add-an-option-to-fix-MC-3304-projectile-looting.patch => 0289-Add-an-option-to-fix-MC-3304-projectile-looting.patch} (100%) rename patches/server/{0288-Configurable-block-blast-resistance.patch => 0290-Configurable-block-blast-resistance.patch} (100%) rename patches/server/{0289-Configurable-block-fall-damage-modifiers.patch => 0291-Configurable-block-fall-damage-modifiers.patch} (100%) rename patches/server/{0290-Language-API.patch => 0292-Language-API.patch} (93%) rename patches/server/{0291-Milk-Keeps-Beneficial-Effects.patch => 0293-Milk-Keeps-Beneficial-Effects.patch} (91%) rename patches/server/{0292-MC-121706-Fix-mobs-not-looking-up-and-down-when-stra.patch => 0294-MC-121706-Fix-mobs-not-looking-up-and-down-when-stra.patch} (100%) rename patches/server/{0293-Add-log-suppression-for-LibraryLoader.patch => 0295-Add-log-suppression-for-LibraryLoader.patch} (100%) rename patches/server/{0294-Allow-Transparent-Blocks-In-Enchanting-Box.patch => 0296-Allow-Transparent-Blocks-In-Enchanting-Box.patch} (100%) rename patches/server/{0295-Add-option-to-allow-creeper-to-encircle-target-when-.patch => 0297-Add-option-to-allow-creeper-to-encircle-target-when-.patch} (100%) rename patches/server/{0296-Fire-Immunity-API.patch => 0298-Fire-Immunity-API.patch} (93%) rename patches/server/{0297-Add-option-to-teleport-to-spawn-on-nether-ceiling-da.patch => 0299-Add-option-to-teleport-to-spawn-on-nether-ceiling-da.patch} (93%) rename patches/server/{0298-Added-got-ram-event.patch => 0300-Added-got-ram-event.patch} (86%) rename patches/server/{0299-Log-skipped-entity-s-position.patch => 0301-Log-skipped-entity-s-position.patch} (86%) rename patches/server/{0300-End-Crystal-Cramming.patch => 0302-End-Crystal-Cramming.patch} (96%) rename patches/server/{0301-Option-to-allow-beacon-effects-when-covered-by-tinte.patch => 0303-Option-to-allow-beacon-effects-when-covered-by-tinte.patch} (97%) rename patches/server/{0302-Add-attribute-clamping-and-armor-limit-config.patch => 0304-Add-attribute-clamping-and-armor-limit-config.patch} (100%) rename patches/server/{0303-Config-to-remove-explosion-radius-clamp.patch => 0305-Config-to-remove-explosion-radius-clamp.patch} (94%) rename patches/server/{0304-bonemealable-sugarcane-cactus-and-netherwart.patch => 0306-bonemealable-sugarcane-cactus-and-netherwart.patch} (98%) rename patches/server/{0305-Add-PreExplodeEvents.patch => 0307-Add-PreExplodeEvents.patch} (100%) rename patches/server/{0306-Improve-output-of-plugins-command.patch => 0308-Improve-output-of-plugins-command.patch} (100%) diff --git a/TODO.md b/TODO.md index b8bfc968b..d7ada73b4 100644 --- a/TODO.md +++ b/TODO.md @@ -4,7 +4,7 @@ - [x] test player ridable underwater - [ ] OPTIONAL: custom damage type instead of magic for scissors & stone cutter patch - [x] flip the boolean in the "display names from item forms of entities to entities" patch to keep feature parity with vanilla -- [ ] uncomment if conditions when including Pufferfish +- [x] uncomment if conditions when including Pufferfish - [x] entity attributes patch - [x] re-implement options for camel - [x] re-implement options for donkey diff --git a/patches/api/0001-Pufferfish-API-Changes.patch b/patches/api/0001-Pufferfish-API-Changes.patch new file mode 100644 index 000000000..479a011c6 --- /dev/null +++ b/patches/api/0001-Pufferfish-API-Changes.patch @@ -0,0 +1,527 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Kevin Raneri +Date: Tue, 9 Nov 2021 14:01:56 -0500 +Subject: [PATCH] Pufferfish API Changes + +Pufferfish +Copyright (C) 2022 Pufferfish Studios LLC + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . + +diff --git a/build.gradle.kts b/build.gradle.kts +index cad12a2632b9ebb569280441c42869685db1f31a..b83e2c5a0a094002d12aee55ec0cf8d12bf33f3e 100644 +--- a/build.gradle.kts ++++ b/build.gradle.kts +@@ -42,6 +42,7 @@ dependencies { + apiAndDocs("net.kyori:adventure-text-logger-slf4j") + api("org.apache.logging.log4j:log4j-api:2.17.1") + api("org.slf4j:slf4j-api:1.8.0-beta4") ++ api("io.sentry:sentry:5.4.0") // Pufferfish + + implementation("org.ow2.asm:asm:9.4") + implementation("org.ow2.asm:asm-commons:9.4") +@@ -85,6 +86,13 @@ val generateApiVersioningFile by tasks.registering { + } + } + ++// Pufferfish Start ++tasks.withType { ++ val compilerArgs = options.compilerArgs ++ compilerArgs.add("--add-modules=jdk.incubator.vector") ++} ++// Pufferfish End ++ + tasks.jar { + from(generateApiVersioningFile.map { it.outputs.files.singleFile }) { + into("META-INF/maven/${project.group}/${project.name}") +diff --git a/src/main/java/gg/pufferfish/pufferfish/sentry/SentryContext.java b/src/main/java/gg/pufferfish/pufferfish/sentry/SentryContext.java +new file mode 100644 +index 0000000000000000000000000000000000000000..6fbaf2a232745db0a41394b1c2cc0cc90cefc4ee +--- /dev/null ++++ b/src/main/java/gg/pufferfish/pufferfish/sentry/SentryContext.java +@@ -0,0 +1,161 @@ ++package gg.pufferfish.pufferfish.sentry; ++ ++import com.google.gson.Gson; ++import java.lang.reflect.Field; ++import java.lang.reflect.Modifier; ++import java.util.Map; ++import java.util.TreeMap; ++import org.apache.logging.log4j.ThreadContext; ++import org.bukkit.command.Command; ++import org.bukkit.command.CommandSender; ++import org.bukkit.entity.Player; ++import org.bukkit.event.Event; ++import org.bukkit.event.player.PlayerEvent; ++import org.bukkit.plugin.Plugin; ++import org.bukkit.plugin.RegisteredListener; ++import org.jetbrains.annotations.Nullable; ++ ++public class SentryContext { ++ ++ private static final Gson GSON = new Gson(); ++ ++ public static void setPluginContext(@Nullable Plugin plugin) { ++ if (plugin != null) { ++ ThreadContext.put("pufferfishsentry_pluginname", plugin.getName()); ++ ThreadContext.put("pufferfishsentry_pluginversion", plugin.getDescription().getVersion()); ++ } ++ } ++ ++ public static void removePluginContext() { ++ ThreadContext.remove("pufferfishsentry_pluginname"); ++ ThreadContext.remove("pufferfishsentry_pluginversion"); ++ } ++ ++ public static void setSenderContext(@Nullable CommandSender sender) { ++ if (sender != null) { ++ ThreadContext.put("pufferfishsentry_playername", sender.getName()); ++ if (sender instanceof Player player) { ++ ThreadContext.put("pufferfishsentry_playerid", player.getUniqueId().toString()); ++ } ++ } ++ } ++ ++ public static void removeSenderContext() { ++ ThreadContext.remove("pufferfishsentry_playername"); ++ ThreadContext.remove("pufferfishsentry_playerid"); ++ } ++ ++ public static void setEventContext(Event event, RegisteredListener registration) { ++ setPluginContext(registration.getPlugin()); ++ ++ try { ++ // Find the player that was involved with this event ++ Player player = null; ++ if (event instanceof PlayerEvent) { ++ player = ((PlayerEvent) event).getPlayer(); ++ } else { ++ Class eventClass = event.getClass(); ++ ++ Field playerField = null; ++ ++ for (Field field : eventClass.getDeclaredFields()) { ++ if (field.getType().equals(Player.class)) { ++ playerField = field; ++ break; ++ } ++ } ++ ++ if (playerField != null) { ++ playerField.setAccessible(true); ++ player = (Player) playerField.get(event); ++ } ++ } ++ ++ if (player != null) { ++ setSenderContext(player); ++ } ++ } catch (Exception e) {} // We can't really safely log exceptions. ++ ++ ThreadContext.put("pufferfishsentry_eventdata", GSON.toJson(serializeFields(event))); ++ } ++ ++ public static void removeEventContext() { ++ removePluginContext(); ++ removeSenderContext(); ++ ThreadContext.remove("pufferfishsentry_eventdata"); ++ } ++ ++ private static Map serializeFields(Object object) { ++ Map fields = new TreeMap<>(); ++ fields.put("_class", object.getClass().getName()); ++ for (Field declaredField : object.getClass().getDeclaredFields()) { ++ try { ++ if (Modifier.isStatic(declaredField.getModifiers())) { ++ continue; ++ } ++ ++ String fieldName = declaredField.getName(); ++ if (fieldName.equals("handlers")) { ++ continue; ++ } ++ declaredField.setAccessible(true); ++ Object value = declaredField.get(object); ++ if (value != null) { ++ fields.put(fieldName, value.toString()); ++ } else { ++ fields.put(fieldName, ""); ++ } ++ } catch (Exception e) {} // We can't really safely log exceptions. ++ } ++ return fields; ++ } ++ ++ public static class State { ++ ++ private Plugin plugin; ++ private Command command; ++ private String commandLine; ++ private Event event; ++ private RegisteredListener registeredListener; ++ ++ public Plugin getPlugin() { ++ return plugin; ++ } ++ ++ public void setPlugin(Plugin plugin) { ++ this.plugin = plugin; ++ } ++ ++ public Command getCommand() { ++ return command; ++ } ++ ++ public void setCommand(Command command) { ++ this.command = command; ++ } ++ ++ public String getCommandLine() { ++ return commandLine; ++ } ++ ++ public void setCommandLine(String commandLine) { ++ this.commandLine = commandLine; ++ } ++ ++ public Event getEvent() { ++ return event; ++ } ++ ++ public void setEvent(Event event) { ++ this.event = event; ++ } ++ ++ public RegisteredListener getRegisteredListener() { ++ return registeredListener; ++ } ++ ++ public void setRegisteredListener(RegisteredListener registeredListener) { ++ this.registeredListener = registeredListener; ++ } ++ } ++} +diff --git a/src/main/java/gg/pufferfish/pufferfish/simd/SIMDChecker.java b/src/main/java/gg/pufferfish/pufferfish/simd/SIMDChecker.java +new file mode 100644 +index 0000000000000000000000000000000000000000..6d266ebf5e52745ad13e90e5754b524383fa9b29 +--- /dev/null ++++ b/src/main/java/gg/pufferfish/pufferfish/simd/SIMDChecker.java +@@ -0,0 +1,40 @@ ++package gg.pufferfish.pufferfish.simd; ++ ++import java.util.logging.Level; ++import java.util.logging.Logger; ++import jdk.incubator.vector.FloatVector; ++import jdk.incubator.vector.IntVector; ++import jdk.incubator.vector.VectorSpecies; ++ ++/** ++ * Basically, java is annoying and we have to push this out to its own class. ++ */ ++@Deprecated ++public class SIMDChecker { ++ ++ @Deprecated ++ public static boolean canEnable(Logger logger) { ++ try { ++ if (SIMDDetection.getJavaVersion() != 17 && SIMDDetection.getJavaVersion() != 18 && SIMDDetection.getJavaVersion() != 19) { ++ return false; ++ } else { ++ SIMDDetection.testRun = true; ++ ++ VectorSpecies ISPEC = IntVector.SPECIES_PREFERRED; ++ VectorSpecies FSPEC = FloatVector.SPECIES_PREFERRED; ++ ++ logger.log(Level.INFO, "Max SIMD vector size on this system is " + ISPEC.vectorBitSize() + " bits (int)"); ++ logger.log(Level.INFO, "Max SIMD vector size on this system is " + FSPEC.vectorBitSize() + " bits (float)"); ++ ++ if (ISPEC.elementSize() < 2 || FSPEC.elementSize() < 2) { ++ logger.log(Level.WARNING, "SIMD is not properly supported on this system!"); ++ return false; ++ } ++ ++ return true; ++ } ++ } catch (NoClassDefFoundError | Exception ignored) {} // Basically, we don't do anything. This lets us detect if it's not functional and disable it. ++ return false; ++ } ++ ++} +diff --git a/src/main/java/gg/pufferfish/pufferfish/simd/SIMDDetection.java b/src/main/java/gg/pufferfish/pufferfish/simd/SIMDDetection.java +new file mode 100644 +index 0000000000000000000000000000000000000000..fd708554d6dab2ddcd24c3024330b8ebf9462111 +--- /dev/null ++++ b/src/main/java/gg/pufferfish/pufferfish/simd/SIMDDetection.java +@@ -0,0 +1,35 @@ ++package gg.pufferfish.pufferfish.simd; ++ ++import java.util.logging.Logger; ++ ++@Deprecated ++public class SIMDDetection { ++ ++ public static boolean isEnabled = false; ++ public static boolean versionLimited = false; ++ public static boolean testRun = false; ++ ++ @Deprecated ++ public static boolean canEnable(Logger logger) { ++ try { ++ return SIMDChecker.canEnable(logger); ++ } catch (NoClassDefFoundError | Exception ignored) { ++ return false; ++ } ++ } ++ ++ @Deprecated ++ public static int getJavaVersion() { ++ // https://stackoverflow.com/a/2591122 ++ String version = System.getProperty("java.version"); ++ if(version.startsWith("1.")) { ++ version = version.substring(2, 3); ++ } else { ++ int dot = version.indexOf("."); ++ if(dot != -1) { version = version.substring(0, dot); } ++ } ++ version = version.split("-")[0]; // Azul is stupid ++ return Integer.parseInt(version); ++ } ++ ++} +diff --git a/src/main/java/gg/pufferfish/pufferfish/simd/VectorMapPalette.java b/src/main/java/gg/pufferfish/pufferfish/simd/VectorMapPalette.java +new file mode 100644 +index 0000000000000000000000000000000000000000..20ec3b29b0cb4061cc89d635b3929ffe71008e22 +--- /dev/null ++++ b/src/main/java/gg/pufferfish/pufferfish/simd/VectorMapPalette.java +@@ -0,0 +1,83 @@ ++package gg.pufferfish.pufferfish.simd; ++ ++import java.awt.Color; ++import jdk.incubator.vector.FloatVector; ++import jdk.incubator.vector.IntVector; ++import jdk.incubator.vector.VectorMask; ++import jdk.incubator.vector.VectorSpecies; ++import org.bukkit.map.MapPalette; ++ ++@Deprecated ++public class VectorMapPalette { ++ ++ private static final VectorSpecies I_SPEC = IntVector.SPECIES_PREFERRED; ++ private static final VectorSpecies F_SPEC = FloatVector.SPECIES_PREFERRED; ++ ++ @Deprecated ++ public static void matchColorVectorized(int[] in, byte[] out) { ++ int speciesLength = I_SPEC.length(); ++ int i; ++ for (i = 0; i < in.length - speciesLength; i += speciesLength) { ++ float[] redsArr = new float[speciesLength]; ++ float[] bluesArr = new float[speciesLength]; ++ float[] greensArr = new float[speciesLength]; ++ int[] alphasArr = new int[speciesLength]; ++ ++ for (int j = 0; j < speciesLength; j++) { ++ alphasArr[j] = (in[i + j] >> 24) & 0xFF; ++ redsArr[j] = (in[i + j] >> 16) & 0xFF; ++ greensArr[j] = (in[i + j] >> 8) & 0xFF; ++ bluesArr[j] = (in[i + j] >> 0) & 0xFF; ++ } ++ ++ IntVector alphas = IntVector.fromArray(I_SPEC, alphasArr, 0); ++ FloatVector reds = FloatVector.fromArray(F_SPEC, redsArr, 0); ++ FloatVector greens = FloatVector.fromArray(F_SPEC, greensArr, 0); ++ FloatVector blues = FloatVector.fromArray(F_SPEC, bluesArr, 0); ++ IntVector resultIndex = IntVector.zero(I_SPEC); ++ VectorMask modificationMask = VectorMask.fromLong(I_SPEC, 0xffffffff); ++ ++ modificationMask = modificationMask.and(alphas.lt(128).not()); ++ FloatVector bestDistances = FloatVector.broadcast(F_SPEC, Float.MAX_VALUE); ++ ++ for (int c = 4; c < MapPalette.colors.length; c++) { ++ // We're using 32-bit floats here because it's 2x faster and nobody will know the difference. ++ // For correctness, the original algorithm uses 64-bit floats instead. Completely unnecessary. ++ FloatVector compReds = FloatVector.broadcast(F_SPEC, MapPalette.colors[c].getRed()); ++ FloatVector compGreens = FloatVector.broadcast(F_SPEC, MapPalette.colors[c].getGreen()); ++ FloatVector compBlues = FloatVector.broadcast(F_SPEC, MapPalette.colors[c].getBlue()); ++ ++ FloatVector rMean = reds.add(compReds).div(2.0f); ++ FloatVector rDiff = reds.sub(compReds); ++ FloatVector gDiff = greens.sub(compGreens); ++ FloatVector bDiff = blues.sub(compBlues); ++ ++ FloatVector weightR = rMean.div(256.0f).add(2); ++ FloatVector weightG = FloatVector.broadcast(F_SPEC, 4.0f); ++ FloatVector weightB = FloatVector.broadcast(F_SPEC, 255.0f).sub(rMean).div(256.0f).add(2.0f); ++ ++ FloatVector distance = weightR.mul(rDiff).mul(rDiff).add(weightG.mul(gDiff).mul(gDiff)).add(weightB.mul(bDiff).mul(bDiff)); ++ ++ // Now we compare to the best distance we've found. ++ // This mask contains a "1" if better, and a "0" otherwise. ++ VectorMask bestDistanceMask = distance.lt(bestDistances); ++ bestDistances = bestDistances.blend(distance, bestDistanceMask); // Update the best distances ++ ++ // Update the result array ++ // We also AND with the modification mask because we don't want to interfere if the alpha value isn't large enough. ++ resultIndex = resultIndex.blend(c, bestDistanceMask.cast(I_SPEC).and(modificationMask)); // Update the results ++ } ++ ++ for (int j = 0; j < speciesLength; j++) { ++ int index = resultIndex.lane(j); ++ out[i + j] = (byte) (index < 128 ? index : -129 + (index - 127)); ++ } ++ } ++ ++ // For the final ones, fall back to the regular method ++ for (; i < in.length; i++) { ++ out[i] = MapPalette.matchColor(new Color(in[i], true)); ++ } ++ } ++ ++} +diff --git a/src/main/java/org/bukkit/map/MapPalette.java b/src/main/java/org/bukkit/map/MapPalette.java +index 3a9aaca2e76411a9c27f9f5e0f22d060d5a66d06..9584e245144b561b4f6745b2f26a4f69a6f92891 100644 +--- a/src/main/java/org/bukkit/map/MapPalette.java ++++ b/src/main/java/org/bukkit/map/MapPalette.java +@@ -1,6 +1,7 @@ + package org.bukkit.map; + + import com.google.common.base.Preconditions; ++import gg.pufferfish.pufferfish.simd.SIMDDetection; // Pufferfish + import java.awt.Color; + import java.awt.Graphics2D; + import java.awt.Image; +@@ -40,7 +41,7 @@ public final class MapPalette { + } + + @NotNull +- static final Color[] colors = { ++ public static final Color[] colors = { // Pufferfish - public access + c(0, 0, 0, 0), c(0, 0, 0, 0), c(0, 0, 0, 0), c(0, 0, 0, 0), + c(89, 125, 39), c(109, 153, 48), c(127, 178, 56), c(67, 94, 29), + c(174, 164, 115), c(213, 201, 140), c(247, 233, 163), c(130, 123, 86), +@@ -211,9 +212,15 @@ public final class MapPalette { + temp.getRGB(0, 0, temp.getWidth(), temp.getHeight(), pixels, 0, temp.getWidth()); + + byte[] result = new byte[temp.getWidth() * temp.getHeight()]; ++ // Pufferfish start ++ if (!SIMDDetection.isEnabled) { + for (int i = 0; i < pixels.length; i++) { + result[i] = matchColor(new Color(pixels[i], true)); + } ++ } else { ++ gg.pufferfish.pufferfish.simd.VectorMapPalette.matchColorVectorized(pixels, result); ++ } ++ // Pufferfish end + return result; + } + +diff --git a/src/main/java/org/bukkit/plugin/SimplePluginManager.java b/src/main/java/org/bukkit/plugin/SimplePluginManager.java +index 2b8308989fce7f8a16907f8711b362e671fdbfb6..bd4d1a40f53784662174d426533ef4b5433a15b7 100644 +--- a/src/main/java/org/bukkit/plugin/SimplePluginManager.java ++++ b/src/main/java/org/bukkit/plugin/SimplePluginManager.java +@@ -584,7 +584,9 @@ public final class SimplePluginManager implements PluginManager { + + // Paper start + private void handlePluginException(String msg, Throwable ex, Plugin plugin) { ++ gg.pufferfish.pufferfish.sentry.SentryContext.setPluginContext(plugin); // Pufferfish + server.getLogger().log(Level.SEVERE, msg, ex); ++ gg.pufferfish.pufferfish.sentry.SentryContext.removePluginContext(); // Pufferfish + callEvent(new com.destroystokyo.paper.event.server.ServerExceptionEvent(new com.destroystokyo.paper.exception.ServerPluginEnableDisableException(msg, ex, plugin))); + } + // Paper end +@@ -654,9 +656,11 @@ public final class SimplePluginManager implements PluginManager { + )); + } + } catch (Throwable ex) { ++ gg.pufferfish.pufferfish.sentry.SentryContext.setEventContext(event, registration); // Pufferfish + // Paper start - error reporting + String msg = "Could not pass event " + event.getEventName() + " to " + registration.getPlugin().getDescription().getFullName(); + server.getLogger().log(Level.SEVERE, msg, ex); ++ gg.pufferfish.pufferfish.sentry.SentryContext.removeEventContext(); // Pufferfish + if (!(event instanceof com.destroystokyo.paper.event.server.ServerExceptionEvent)) { // We don't want to cause an endless event loop + callEvent(new com.destroystokyo.paper.event.server.ServerExceptionEvent(new com.destroystokyo.paper.exception.ServerEventException(msg, ex, registration.getPlugin(), registration.getListener(), event))); + } +diff --git a/src/main/java/org/bukkit/plugin/java/JavaPluginLoader.java b/src/main/java/org/bukkit/plugin/java/JavaPluginLoader.java +index eaefbb00e9993d54906cc8cf35cf753c0d6c7707..301e82369603f3dd6e6c1bd380da4bacacd7ef6c 100644 +--- a/src/main/java/org/bukkit/plugin/java/JavaPluginLoader.java ++++ b/src/main/java/org/bukkit/plugin/java/JavaPluginLoader.java +@@ -336,7 +336,13 @@ public final class JavaPluginLoader implements PluginLoader { + try { + jPlugin.setEnabled(true); + } catch (Throwable ex) { ++ gg.pufferfish.pufferfish.sentry.SentryContext.setPluginContext(plugin); // Pufferfish + server.getLogger().log(Level.SEVERE, "Error occurred while enabling " + plugin.getDescription().getFullName() + " (Is it up to date?)", ex); ++ gg.pufferfish.pufferfish.sentry.SentryContext.removePluginContext(); // Pufferfish ++ // Paper start - Disable plugins that fail to load ++ this.server.getPluginManager().disablePlugin(jPlugin); ++ return; ++ // Paper end + } + + // Perhaps abort here, rather than continue going, but as it stands, +@@ -361,7 +367,9 @@ public final class JavaPluginLoader implements PluginLoader { + try { + jPlugin.setEnabled(false); + } catch (Throwable ex) { ++ gg.pufferfish.pufferfish.sentry.SentryContext.setPluginContext(plugin); // Pufferfish + server.getLogger().log(Level.SEVERE, "Error occurred while disabling " + plugin.getDescription().getFullName() + " (Is it up to date?)", ex); ++ gg.pufferfish.pufferfish.sentry.SentryContext.removePluginContext(); // Pufferfish + } + + if (cloader instanceof PluginClassLoader) { +diff --git a/src/main/java/org/bukkit/plugin/java/PluginClassLoader.java b/src/main/java/org/bukkit/plugin/java/PluginClassLoader.java +index 1758e8a89c85eea8c2161ddcb5b0e745151a1f5e..fe21d31b463317eb90d58cbca5f098958ca93938 100644 +--- a/src/main/java/org/bukkit/plugin/java/PluginClassLoader.java ++++ b/src/main/java/org/bukkit/plugin/java/PluginClassLoader.java +@@ -48,6 +48,8 @@ public final class PluginClassLoader extends URLClassLoader implements io.paperm + private io.papermc.paper.plugin.provider.classloader.PluginClassLoaderGroup classLoaderGroup; // Paper + public io.papermc.paper.plugin.provider.entrypoint.DependencyContext dependencyContext; // Paper + ++ private boolean closed = false; // Pufferfish ++ + static { + ClassLoader.registerAsParallelCapable(); + } +@@ -183,6 +185,7 @@ public final class PluginClassLoader extends URLClassLoader implements io.paperm + throw new ClassNotFoundException(name); + } + ++ public boolean _airplane_hasClass(@NotNull String name) { return this.classes.containsKey(name); } // Pufferfish + @Override + protected Class findClass(String name) throws ClassNotFoundException { + if (name.startsWith("org.bukkit.") || name.startsWith("net.minecraft.")) { +@@ -190,7 +193,7 @@ public final class PluginClassLoader extends URLClassLoader implements io.paperm + } + Class result = classes.get(name); + +- if (result == null) { ++ if (result == null && !this.closed) { // Pufferfish + String path = name.replace('.', '/').concat(".class"); + JarEntry entry = jar.getJarEntry(path); + +@@ -237,6 +240,7 @@ public final class PluginClassLoader extends URLClassLoader implements io.paperm + this.setClass(name, result); // Paper + } + ++ if (result == null) throw new ClassNotFoundException(name); // Pufferfish + return result; + } + +@@ -251,6 +255,7 @@ public final class PluginClassLoader extends URLClassLoader implements io.paperm + // Paper end + super.close(); + } finally { ++ this.closed = true; // Pufferfish + jar.close(); + } + } diff --git a/patches/removed/api/0002-Fix-pufferfish-issues.patch b/patches/api/0002-Fix-pufferfish-issues.patch similarity index 90% rename from patches/removed/api/0002-Fix-pufferfish-issues.patch rename to patches/api/0002-Fix-pufferfish-issues.patch index 66de07685..593233a54 100644 --- a/patches/removed/api/0002-Fix-pufferfish-issues.patch +++ b/patches/api/0002-Fix-pufferfish-issues.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Fix pufferfish issues diff --git a/src/test/java/org/bukkit/AnnotationTest.java b/src/test/java/org/bukkit/AnnotationTest.java -index 4bca64b2a44ae032730575ecba39f9737a5a1ec7..7769e19a5a86b5c76094058d31269fc6cc9f0ac3 100644 +index 2cb81e6d253d70388da15c9d07b630277d486c70..fa7229ae5e00e36b0dc8b4cf15d3c99892cc3291 100644 --- a/src/test/java/org/bukkit/AnnotationTest.java +++ b/src/test/java/org/bukkit/AnnotationTest.java @@ -47,6 +47,10 @@ public class AnnotationTest { diff --git a/patches/api/0001-Build-System-Changes.patch b/patches/api/0003-Build-System-Changes.patch similarity index 85% rename from patches/api/0001-Build-System-Changes.patch rename to patches/api/0003-Build-System-Changes.patch index d724531f8..dd4ffe1dc 100644 --- a/patches/api/0001-Build-System-Changes.patch +++ b/patches/api/0003-Build-System-Changes.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Build System Changes diff --git a/build.gradle.kts b/build.gradle.kts -index 097b62f538970013d8297f9f2972d1d2b8a088a3..1d1f5147827466bd3d032d6ea084e75b1b9fa7ad 100644 +index b83e2c5a0a094002d12aee55ec0cf8d12bf33f3e..b5835fa536f90b7f88a5ee4df78733cf43e1cb23 100644 --- a/build.gradle.kts +++ b/build.gradle.kts -@@ -97,6 +97,8 @@ tasks.jar { +@@ -105,6 +105,8 @@ tasks.jar { } tasks.withType { diff --git a/patches/api/0002-Purpur-config-files.patch b/patches/api/0004-Purpur-config-files.patch similarity index 100% rename from patches/api/0002-Purpur-config-files.patch rename to patches/api/0004-Purpur-config-files.patch diff --git a/patches/api/0003-Purpur-client-support.patch b/patches/api/0005-Purpur-client-support.patch similarity index 89% rename from patches/api/0003-Purpur-client-support.patch rename to patches/api/0005-Purpur-client-support.patch index 27804f248..e605c4e0a 100644 --- a/patches/api/0003-Purpur-client-support.patch +++ b/patches/api/0005-Purpur-client-support.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Purpur client support diff --git a/src/main/java/org/bukkit/entity/Player.java b/src/main/java/org/bukkit/entity/Player.java -index 660f28e371176c62e38a84b187958aceb235c8e3..9306bd672a1c3aae9759e9d8cd434245be066749 100644 +index b5fd857896b3afcfa69cce55cbc2696dd625f805..7ff5d4554be858e6bad5440b8847e3f21523f796 100644 --- a/src/main/java/org/bukkit/entity/Player.java +++ b/src/main/java/org/bukkit/entity/Player.java @@ -3000,4 +3000,13 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM diff --git a/patches/api/0004-Default-permissions.patch b/patches/api/0006-Default-permissions.patch similarity index 100% rename from patches/api/0004-Default-permissions.patch rename to patches/api/0006-Default-permissions.patch diff --git a/patches/api/0005-Ridables.patch b/patches/api/0007-Ridables.patch similarity index 100% rename from patches/api/0005-Ridables.patch rename to patches/api/0007-Ridables.patch diff --git a/patches/api/0006-Allow-inventory-resizing.patch b/patches/api/0008-Allow-inventory-resizing.patch similarity index 89% rename from patches/api/0006-Allow-inventory-resizing.patch rename to patches/api/0008-Allow-inventory-resizing.patch index 6555810bc..fdd3e2445 100644 --- a/patches/api/0006-Allow-inventory-resizing.patch +++ b/patches/api/0008-Allow-inventory-resizing.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Allow inventory resizing diff --git a/src/main/java/org/bukkit/event/inventory/InventoryType.java b/src/main/java/org/bukkit/event/inventory/InventoryType.java -index 6957d5b88c549f08dd3afe272f018be122f3a4a6..c5824f7fb988ed68feb8758ce6db748218f10b9b 100644 +index 35aac79a7c58d00e6b3c6c042b291093c9c7af71..7fa8909f07ce768654b9ea7c42c4913b7e2593b7 100644 --- a/src/main/java/org/bukkit/event/inventory/InventoryType.java +++ b/src/main/java/org/bukkit/event/inventory/InventoryType.java @@ -155,7 +155,7 @@ public enum InventoryType { diff --git a/patches/api/0007-Llama-API.patch b/patches/api/0009-Llama-API.patch similarity index 100% rename from patches/api/0007-Llama-API.patch rename to patches/api/0009-Llama-API.patch diff --git a/patches/api/0008-AFK-API.patch b/patches/api/0010-AFK-API.patch similarity index 96% rename from patches/api/0008-AFK-API.patch rename to patches/api/0010-AFK-API.patch index 5c67502d5..747a2aeb6 100644 --- a/patches/api/0008-AFK-API.patch +++ b/patches/api/0010-AFK-API.patch @@ -5,7 +5,7 @@ Subject: [PATCH] AFK API diff --git a/src/main/java/org/bukkit/entity/Player.java b/src/main/java/org/bukkit/entity/Player.java -index 9306bd672a1c3aae9759e9d8cd434245be066749..8dcb8bd95cad85f80991b0f6ae0439ab070b202e 100644 +index 7ff5d4554be858e6bad5440b8847e3f21523f796..04b31e42865469f9760db061607a803787fbadf3 100644 --- a/src/main/java/org/bukkit/entity/Player.java +++ b/src/main/java/org/bukkit/entity/Player.java @@ -3008,5 +3008,24 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM diff --git a/patches/api/0009-Bring-back-server-name.patch b/patches/api/0011-Bring-back-server-name.patch similarity index 100% rename from patches/api/0009-Bring-back-server-name.patch rename to patches/api/0011-Bring-back-server-name.patch diff --git a/patches/api/0010-ExecuteCommandEvent.patch b/patches/api/0012-ExecuteCommandEvent.patch similarity index 100% rename from patches/api/0010-ExecuteCommandEvent.patch rename to patches/api/0012-ExecuteCommandEvent.patch diff --git a/patches/api/0011-LivingEntity-safeFallDistance.patch b/patches/api/0013-LivingEntity-safeFallDistance.patch similarity index 100% rename from patches/api/0011-LivingEntity-safeFallDistance.patch rename to patches/api/0013-LivingEntity-safeFallDistance.patch diff --git a/patches/api/0012-Lagging-threshold.patch b/patches/api/0014-Lagging-threshold.patch similarity index 100% rename from patches/api/0012-Lagging-threshold.patch rename to patches/api/0014-Lagging-threshold.patch diff --git a/patches/api/0013-PlayerSetSpawnerTypeWithEggEvent.patch b/patches/api/0015-PlayerSetSpawnerTypeWithEggEvent.patch similarity index 100% rename from patches/api/0013-PlayerSetSpawnerTypeWithEggEvent.patch rename to patches/api/0015-PlayerSetSpawnerTypeWithEggEvent.patch diff --git a/patches/api/0014-EMC-MonsterEggSpawnEvent.patch b/patches/api/0016-EMC-MonsterEggSpawnEvent.patch similarity index 100% rename from patches/api/0014-EMC-MonsterEggSpawnEvent.patch rename to patches/api/0016-EMC-MonsterEggSpawnEvent.patch diff --git a/patches/api/0015-Player-invulnerabilities.patch b/patches/api/0017-Player-invulnerabilities.patch similarity index 92% rename from patches/api/0015-Player-invulnerabilities.patch rename to patches/api/0017-Player-invulnerabilities.patch index 8eb47d71a..48a02ed0d 100644 --- a/patches/api/0015-Player-invulnerabilities.patch +++ b/patches/api/0017-Player-invulnerabilities.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Player invulnerabilities diff --git a/src/main/java/org/bukkit/entity/Player.java b/src/main/java/org/bukkit/entity/Player.java -index 8dcb8bd95cad85f80991b0f6ae0439ab070b202e..6d44768ac23b80dc170e242f040c5bcaabd0510f 100644 +index 04b31e42865469f9760db061607a803787fbadf3..819aa1f1e2c2c32510973e6fc9d8561366230851 100644 --- a/src/main/java/org/bukkit/entity/Player.java +++ b/src/main/java/org/bukkit/entity/Player.java @@ -3027,5 +3027,26 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM diff --git a/patches/api/0016-Anvil-API.patch b/patches/api/0018-Anvil-API.patch similarity index 100% rename from patches/api/0016-Anvil-API.patch rename to patches/api/0018-Anvil-API.patch diff --git a/patches/api/0017-ItemStack-convenience-methods.patch b/patches/api/0019-ItemStack-convenience-methods.patch similarity index 99% rename from patches/api/0017-ItemStack-convenience-methods.patch rename to patches/api/0019-ItemStack-convenience-methods.patch index 1028e1389..ecceed3e1 100644 --- a/patches/api/0017-ItemStack-convenience-methods.patch +++ b/patches/api/0019-ItemStack-convenience-methods.patch @@ -50,7 +50,7 @@ index 3c5e90f039f0d2991be442168703526405e18e3d..df992c41d736ee4e89773c2621d261d6 + // Purpur end } diff --git a/src/main/java/org/bukkit/inventory/ItemStack.java b/src/main/java/org/bukkit/inventory/ItemStack.java -index 449d6e1995eedbfaeffdc5d1f1c2295378006aa8..11261c659e3a378f468f4a19e2c24c1bb1f95a2b 100644 +index cd487177f6e391e114c394cd736796e20e0e8982..e5f129b7bbf4257e6be056af71c4e26a01ffd658 100644 --- a/src/main/java/org/bukkit/inventory/ItemStack.java +++ b/src/main/java/org/bukkit/inventory/ItemStack.java @@ -17,6 +17,18 @@ import org.bukkit.inventory.meta.ItemMeta; diff --git a/patches/api/0018-Phantoms-attracted-to-crystals-and-crystals-shoot-ph.patch b/patches/api/0020-Phantoms-attracted-to-crystals-and-crystals-shoot-ph.patch similarity index 100% rename from patches/api/0018-Phantoms-attracted-to-crystals-and-crystals-shoot-ph.patch rename to patches/api/0020-Phantoms-attracted-to-crystals-and-crystals-shoot-ph.patch diff --git a/patches/api/0019-ChatColor-conveniences.patch b/patches/api/0021-ChatColor-conveniences.patch similarity index 100% rename from patches/api/0019-ChatColor-conveniences.patch rename to patches/api/0021-ChatColor-conveniences.patch diff --git a/patches/api/0020-LivingEntity-broadcastItemBreak.patch b/patches/api/0022-LivingEntity-broadcastItemBreak.patch similarity index 100% rename from patches/api/0020-LivingEntity-broadcastItemBreak.patch rename to patches/api/0022-LivingEntity-broadcastItemBreak.patch diff --git a/patches/api/0021-Item-entity-immunities.patch b/patches/api/0023-Item-entity-immunities.patch similarity index 100% rename from patches/api/0021-Item-entity-immunities.patch rename to patches/api/0023-Item-entity-immunities.patch diff --git a/patches/api/0022-Add-option-to-disable-zombie-aggressiveness-towards-.patch b/patches/api/0024-Add-option-to-disable-zombie-aggressiveness-towards-.patch similarity index 100% rename from patches/api/0022-Add-option-to-disable-zombie-aggressiveness-towards-.patch rename to patches/api/0024-Add-option-to-disable-zombie-aggressiveness-towards-.patch diff --git a/patches/api/0023-Add-predicate-to-recipe-s-ExactChoice-ingredient.patch b/patches/api/0025-Add-predicate-to-recipe-s-ExactChoice-ingredient.patch similarity index 100% rename from patches/api/0023-Add-predicate-to-recipe-s-ExactChoice-ingredient.patch rename to patches/api/0025-Add-predicate-to-recipe-s-ExactChoice-ingredient.patch diff --git a/patches/api/0024-Rabid-Wolf-API.patch b/patches/api/0026-Rabid-Wolf-API.patch similarity index 100% rename from patches/api/0024-Rabid-Wolf-API.patch rename to patches/api/0026-Rabid-Wolf-API.patch diff --git a/patches/api/0025-PlayerBookTooLargeEvent.patch b/patches/api/0027-PlayerBookTooLargeEvent.patch similarity index 100% rename from patches/api/0025-PlayerBookTooLargeEvent.patch rename to patches/api/0027-PlayerBookTooLargeEvent.patch diff --git a/patches/api/0026-Full-netherite-armor-grants-fire-resistance.patch b/patches/api/0028-Full-netherite-armor-grants-fire-resistance.patch similarity index 100% rename from patches/api/0026-Full-netherite-armor-grants-fire-resistance.patch rename to patches/api/0028-Full-netherite-armor-grants-fire-resistance.patch diff --git a/patches/api/0027-Add-EntityTeleportHinderedEvent.patch b/patches/api/0029-Add-EntityTeleportHinderedEvent.patch similarity index 100% rename from patches/api/0027-Add-EntityTeleportHinderedEvent.patch rename to patches/api/0029-Add-EntityTeleportHinderedEvent.patch diff --git a/patches/api/0028-Add-enchantment-target-for-bows-and-crossbows.patch b/patches/api/0030-Add-enchantment-target-for-bows-and-crossbows.patch similarity index 100% rename from patches/api/0028-Add-enchantment-target-for-bows-and-crossbows.patch rename to patches/api/0030-Add-enchantment-target-for-bows-and-crossbows.patch diff --git a/patches/api/0029-Iron-golem-poppy-calms-anger.patch b/patches/api/0031-Iron-golem-poppy-calms-anger.patch similarity index 100% rename from patches/api/0029-Iron-golem-poppy-calms-anger.patch rename to patches/api/0031-Iron-golem-poppy-calms-anger.patch diff --git a/patches/api/0030-API-for-any-mob-to-burn-daylight.patch b/patches/api/0032-API-for-any-mob-to-burn-daylight.patch similarity index 100% rename from patches/api/0030-API-for-any-mob-to-burn-daylight.patch rename to patches/api/0032-API-for-any-mob-to-burn-daylight.patch diff --git a/patches/api/0031-Add-back-player-spawned-endermite-API.patch b/patches/api/0033-Add-back-player-spawned-endermite-API.patch similarity index 100% rename from patches/api/0031-Add-back-player-spawned-endermite-API.patch rename to patches/api/0033-Add-back-player-spawned-endermite-API.patch diff --git a/patches/api/0032-Fix-default-permission-system.patch b/patches/api/0034-Fix-default-permission-system.patch similarity index 100% rename from patches/api/0032-Fix-default-permission-system.patch rename to patches/api/0034-Fix-default-permission-system.patch diff --git a/patches/api/0033-Summoner-API.patch b/patches/api/0035-Summoner-API.patch similarity index 100% rename from patches/api/0033-Summoner-API.patch rename to patches/api/0035-Summoner-API.patch diff --git a/patches/api/0034-Clean-up-version-command-output.patch b/patches/api/0036-Clean-up-version-command-output.patch similarity index 100% rename from patches/api/0034-Clean-up-version-command-output.patch rename to patches/api/0036-Clean-up-version-command-output.patch diff --git a/patches/api/0035-Extended-OfflinePlayer-API.patch b/patches/api/0037-Extended-OfflinePlayer-API.patch similarity index 100% rename from patches/api/0035-Extended-OfflinePlayer-API.patch rename to patches/api/0037-Extended-OfflinePlayer-API.patch diff --git a/patches/api/0036-Added-the-ability-to-add-combustible-items.patch b/patches/api/0038-Added-the-ability-to-add-combustible-items.patch similarity index 100% rename from patches/api/0036-Added-the-ability-to-add-combustible-items.patch rename to patches/api/0038-Added-the-ability-to-add-combustible-items.patch diff --git a/patches/api/0037-Potion-NamespacedKey.patch b/patches/api/0039-Potion-NamespacedKey.patch similarity index 100% rename from patches/api/0037-Potion-NamespacedKey.patch rename to patches/api/0039-Potion-NamespacedKey.patch diff --git a/patches/api/0038-Grindstone-API.patch b/patches/api/0040-Grindstone-API.patch similarity index 100% rename from patches/api/0038-Grindstone-API.patch rename to patches/api/0040-Grindstone-API.patch diff --git a/patches/api/0039-Shears-can-have-looting-enchantment.patch b/patches/api/0041-Shears-can-have-looting-enchantment.patch similarity index 100% rename from patches/api/0039-Shears-can-have-looting-enchantment.patch rename to patches/api/0041-Shears-can-have-looting-enchantment.patch diff --git a/patches/api/0040-Lobotomize-stuck-villagers.patch b/patches/api/0042-Lobotomize-stuck-villagers.patch similarity index 100% rename from patches/api/0040-Lobotomize-stuck-villagers.patch rename to patches/api/0042-Lobotomize-stuck-villagers.patch diff --git a/patches/api/0041-Add-local-difficulty-api.patch b/patches/api/0043-Add-local-difficulty-api.patch similarity index 100% rename from patches/api/0041-Add-local-difficulty-api.patch rename to patches/api/0043-Add-local-difficulty-api.patch diff --git a/patches/api/0042-Remove-Timings.patch b/patches/api/0044-Remove-Timings.patch similarity index 100% rename from patches/api/0042-Remove-Timings.patch rename to patches/api/0044-Remove-Timings.patch diff --git a/patches/api/0043-Add-Bee-API.patch b/patches/api/0045-Add-Bee-API.patch similarity index 100% rename from patches/api/0043-Add-Bee-API.patch rename to patches/api/0045-Add-Bee-API.patch diff --git a/patches/api/0044-Debug-Marker-API.patch b/patches/api/0046-Debug-Marker-API.patch similarity index 99% rename from patches/api/0044-Debug-Marker-API.patch rename to patches/api/0046-Debug-Marker-API.patch index 3985abd7e..d9681ae8b 100644 --- a/patches/api/0044-Debug-Marker-API.patch +++ b/patches/api/0046-Debug-Marker-API.patch @@ -260,7 +260,7 @@ index bb249f7d54fd90d63f609eedf0bbb463f1aa96f1..a38863ebd363f54994753937a10e0410 /** diff --git a/src/main/java/org/bukkit/entity/Player.java b/src/main/java/org/bukkit/entity/Player.java -index 6d44768ac23b80dc170e242f040c5bcaabd0510f..c09c8e2c32b699301ae66b467582511e518bf3d3 100644 +index 819aa1f1e2c2c32510973e6fc9d8561366230851..12b659d13ce336cca52dd704caa7c20366cfe6d9 100644 --- a/src/main/java/org/bukkit/entity/Player.java +++ b/src/main/java/org/bukkit/entity/Player.java @@ -3048,5 +3048,75 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM diff --git a/patches/api/0045-Add-death-screen-API.patch b/patches/api/0047-Add-death-screen-API.patch similarity index 92% rename from patches/api/0045-Add-death-screen-API.patch rename to patches/api/0047-Add-death-screen-API.patch index 4972b8bb2..c61c821af 100644 --- a/patches/api/0045-Add-death-screen-API.patch +++ b/patches/api/0047-Add-death-screen-API.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Add death screen API diff --git a/src/main/java/org/bukkit/entity/Player.java b/src/main/java/org/bukkit/entity/Player.java -index c09c8e2c32b699301ae66b467582511e518bf3d3..134a573fd933dce1002d9e3b62dafce83b1d6aea 100644 +index 12b659d13ce336cca52dd704caa7c20366cfe6d9..08b5f448e92add21f9f9797d9cea3ac60581dff5 100644 --- a/src/main/java/org/bukkit/entity/Player.java +++ b/src/main/java/org/bukkit/entity/Player.java @@ -3118,5 +3118,21 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM diff --git a/patches/api/0046-Add-item-packet-serialize-event.patch b/patches/api/0048-Add-item-packet-serialize-event.patch similarity index 100% rename from patches/api/0046-Add-item-packet-serialize-event.patch rename to patches/api/0048-Add-item-packet-serialize-event.patch diff --git a/patches/api/0047-Language-API.patch b/patches/api/0049-Language-API.patch similarity index 100% rename from patches/api/0047-Language-API.patch rename to patches/api/0049-Language-API.patch diff --git a/patches/api/0048-Add-log-suppression-for-LibraryLoader.patch b/patches/api/0050-Add-log-suppression-for-LibraryLoader.patch similarity index 96% rename from patches/api/0048-Add-log-suppression-for-LibraryLoader.patch rename to patches/api/0050-Add-log-suppression-for-LibraryLoader.patch index 4948f9b89..95e4cd2ac 100644 --- a/patches/api/0048-Add-log-suppression-for-LibraryLoader.patch +++ b/patches/api/0050-Add-log-suppression-for-LibraryLoader.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Add log suppression for LibraryLoader diff --git a/src/main/java/org/bukkit/plugin/java/JavaPluginLoader.java b/src/main/java/org/bukkit/plugin/java/JavaPluginLoader.java -index eaefbb00e9993d54906cc8cf35cf753c0d6c7707..f1e58639213be0c43cd2ff090b625e7d0a67e8be 100644 +index 301e82369603f3dd6e6c1bd380da4bacacd7ef6c..0c6ca7588fb3d6b6497ddf032fe75e5c6c9719e5 100644 --- a/src/main/java/org/bukkit/plugin/java/JavaPluginLoader.java +++ b/src/main/java/org/bukkit/plugin/java/JavaPluginLoader.java @@ -55,6 +55,7 @@ public final class JavaPluginLoader implements PluginLoader { diff --git a/patches/api/0049-Fire-Immunity-API.patch b/patches/api/0051-Fire-Immunity-API.patch similarity index 100% rename from patches/api/0049-Fire-Immunity-API.patch rename to patches/api/0051-Fire-Immunity-API.patch diff --git a/patches/api/0050-Added-goat-ram-event.patch b/patches/api/0052-Added-goat-ram-event.patch similarity index 100% rename from patches/api/0050-Added-goat-ram-event.patch rename to patches/api/0052-Added-goat-ram-event.patch diff --git a/patches/api/0051-Add-PreExplodeEvents.patch b/patches/api/0053-Add-PreExplodeEvents.patch similarity index 100% rename from patches/api/0051-Add-PreExplodeEvents.patch rename to patches/api/0053-Add-PreExplodeEvents.patch diff --git a/patches/server/0001-Pufferfish-Server-Changes.patch b/patches/server/0001-Pufferfish-Server-Changes.patch new file mode 100644 index 000000000..dd04b21c4 --- /dev/null +++ b/patches/server/0001-Pufferfish-Server-Changes.patch @@ -0,0 +1,3662 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Kevin Raneri +Date: Wed, 3 Feb 2021 23:02:38 -0600 +Subject: [PATCH] Pufferfish Server Changes + +Pufferfish +Copyright (C) 2022 Pufferfish Studios LLC + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . + +diff --git a/build.gradle.kts b/build.gradle.kts +index 9cf389defdaeb887e9cad4f0fed3f3b95667b238..b41b186397d013c19436c345be98b785d4bd0295 100644 +--- a/build.gradle.kts ++++ b/build.gradle.kts +@@ -7,8 +7,12 @@ plugins { + } + + dependencies { +- implementation(project(":paper-api")) +- implementation(project(":paper-mojangapi")) ++ implementation(project(":pufferfish-api")) // Pufferfish // Paper ++ // Pufferfish start ++ implementation("io.papermc.paper:paper-mojangapi:1.19.2-R0.1-SNAPSHOT") { ++ exclude("io.papermc.paper", "paper-api") ++ } ++ // Pufferfish end + // Paper start + implementation("org.jline:jline-terminal-jansi:3.21.0") + implementation("net.minecrell:terminalconsoleappender:1.3.0") +@@ -42,6 +46,13 @@ dependencies { + runtimeOnly("org.apache.maven.resolver:maven-resolver-connector-basic:1.7.3") + runtimeOnly("org.apache.maven.resolver:maven-resolver-transport-http:1.7.3") + ++ // Pufferfish start ++ implementation("org.yaml:snakeyaml:1.32") ++ implementation ("me.carleslc.Simple-YAML:Simple-Yaml:1.8.2") { ++ exclude(group="org.yaml", module="snakeyaml") ++ } ++ // Pufferfish end ++ + testImplementation("io.github.classgraph:classgraph:4.8.47") // Paper - mob goal test + testImplementation("junit:junit:4.13.2") + testImplementation("org.hamcrest:hamcrest-library:1.3") +@@ -50,6 +61,14 @@ dependencies { + } + + val craftbukkitPackageVersion = "1_19_R3" // Paper ++ ++// Pufferfish Start ++tasks.withType { ++ val compilerArgs = options.compilerArgs ++ compilerArgs.add("--add-modules=jdk.incubator.vector") ++} ++// Pufferfish End ++ + tasks.jar { + archiveClassifier.set("dev") + +@@ -62,7 +81,7 @@ tasks.jar { + attributes( + "Main-Class" to "org.bukkit.craftbukkit.Main", + "Implementation-Title" to "CraftBukkit", +- "Implementation-Version" to "git-Paper-$implementationVersion", ++ "Implementation-Version" to "git-Pufferfish-$implementationVersion", // Pufferfish + "Implementation-Vendor" to date, // Paper + "Specification-Title" to "Bukkit", + "Specification-Version" to project.version, +diff --git a/src/main/java/co/aikar/timings/TimingsExport.java b/src/main/java/co/aikar/timings/TimingsExport.java +index 06bff37e4c1fddd3be6343049a66787c63fb420c..2cc44fbf8e5bd436b6d4e19f6c06b351e750cb31 100644 +--- a/src/main/java/co/aikar/timings/TimingsExport.java ++++ b/src/main/java/co/aikar/timings/TimingsExport.java +@@ -241,7 +241,8 @@ public class TimingsExport extends Thread { + parent.put("config", createObject( + pair("spigot", mapAsJSON(Bukkit.spigot().getSpigotConfig(), null)), + pair("bukkit", mapAsJSON(Bukkit.spigot().getBukkitConfig(), null)), +- pair("paper", mapAsJSON(Bukkit.spigot().getPaperConfig(), null)) ++ pair("paper", mapAsJSON(Bukkit.spigot().getPaperConfig(), null)), // Pufferfish ++ pair("pufferfish", mapAsJSON(gg.pufferfish.pufferfish.PufferfishConfig.getConfigCopy(), null)) // Pufferfish + )); + + new TimingsExport(listeners, parent, history).start(); +diff --git a/src/main/java/com/destroystokyo/paper/Metrics.java b/src/main/java/com/destroystokyo/paper/Metrics.java +index 4b002e8b75d117b726b0de274a76d3596fce015b..692c962193cf9fcc6801fc93f3220bdc673d527b 100644 +--- a/src/main/java/com/destroystokyo/paper/Metrics.java ++++ b/src/main/java/com/destroystokyo/paper/Metrics.java +@@ -593,7 +593,7 @@ public class Metrics { + boolean logFailedRequests = config.getBoolean("logFailedRequests", false); + // Only start Metrics, if it's enabled in the config + if (config.getBoolean("enabled", true)) { +- Metrics metrics = new Metrics("Paper", serverUUID, logFailedRequests, Bukkit.getLogger()); ++ Metrics metrics = new Metrics("Pufferfish", serverUUID, logFailedRequests, Bukkit.getLogger()); // Pufferfish + + metrics.addCustomChart(new Metrics.SimplePie("minecraft_version", () -> { + String minecraftVersion = Bukkit.getVersion(); +@@ -607,11 +607,11 @@ public class Metrics { + final String implVersion = org.bukkit.craftbukkit.Main.class.getPackage().getImplementationVersion(); + if (implVersion != null) { + final String buildOrHash = implVersion.substring(implVersion.lastIndexOf('-') + 1); +- paperVersion = "git-Paper-%s-%s".formatted(Bukkit.getServer().getMinecraftVersion(), buildOrHash); ++ paperVersion = "git-Pufferfish-%s-%s".formatted(Bukkit.getServer().getMinecraftVersion(), buildOrHash); // Pufferfish + } else { + paperVersion = "unknown"; + } +- metrics.addCustomChart(new Metrics.SimplePie("paper_version", () -> paperVersion)); ++ metrics.addCustomChart(new Metrics.SimplePie("pufferfish_version", () -> paperVersion)); // Pufferfish + + metrics.addCustomChart(new Metrics.DrilldownPie("java_version", () -> { + Map> map = new HashMap<>(); +diff --git a/src/main/java/com/destroystokyo/paper/util/misc/AreaMap.java b/src/main/java/com/destroystokyo/paper/util/misc/AreaMap.java +index 41b9405d6759d865e0d14dd4f95163e9690e967d..091b1ae822e1c0517e59572e7a9bda11e998c0ee 100644 +--- a/src/main/java/com/destroystokyo/paper/util/misc/AreaMap.java ++++ b/src/main/java/com/destroystokyo/paper/util/misc/AreaMap.java +@@ -26,7 +26,7 @@ public abstract class AreaMap { + + // we use linked for better iteration. + // map of: coordinate to set of objects in coordinate +- protected final Long2ObjectOpenHashMap> areaMap = new Long2ObjectOpenHashMap<>(1024, 0.7f); ++ protected Long2ObjectOpenHashMap> areaMap = new Long2ObjectOpenHashMap<>(1024, 0.7f); // Pufferfish - not actually final + protected final PooledLinkedHashSets pooledHashSets; + + protected final ChangeCallback addCallback; +@@ -160,7 +160,8 @@ public abstract class AreaMap { + protected abstract PooledLinkedHashSets.PooledObjectLinkedOpenHashSet getEmptySetFor(final E object); + + // expensive op, only for debug +- protected void validate(final E object, final int viewDistance) { ++ protected void validate0(final E object, final int viewDistance) { // Pufferfish - rename this thing just in case it gets used I'd rather a compile time error. ++ if (true) throw new UnsupportedOperationException(); // Pufferfish - not going to put in the effort to fix this if it doesn't ever get used. + int entiesGot = 0; + int expectedEntries = (2 * viewDistance + 1); + expectedEntries *= expectedEntries; +diff --git a/src/main/java/com/destroystokyo/paper/util/misc/PlayerAreaMap.java b/src/main/java/com/destroystokyo/paper/util/misc/PlayerAreaMap.java +index 46954db7ecd35ac4018fdf476df7c8020d7ce6c8..1ad890a244bdf6df48a8db68cb43450e08c788a6 100644 +--- a/src/main/java/com/destroystokyo/paper/util/misc/PlayerAreaMap.java ++++ b/src/main/java/com/destroystokyo/paper/util/misc/PlayerAreaMap.java +@@ -5,7 +5,7 @@ import net.minecraft.server.level.ServerPlayer; + /** + * @author Spottedleaf + */ +-public final class PlayerAreaMap extends AreaMap { ++public class PlayerAreaMap extends AreaMap { // Pufferfish - not actually final + + public PlayerAreaMap() { + super(); +diff --git a/src/main/java/gg/airplane/structs/FluidDirectionCache.java b/src/main/java/gg/airplane/structs/FluidDirectionCache.java +new file mode 100644 +index 0000000000000000000000000000000000000000..aa8467b9dda1f7707e41f50ac7b3e9d7343723ec +--- /dev/null ++++ b/src/main/java/gg/airplane/structs/FluidDirectionCache.java +@@ -0,0 +1,136 @@ ++package gg.airplane.structs; ++ ++import it.unimi.dsi.fastutil.HashCommon; ++ ++/** ++ * This is a replacement for the cache used in FluidTypeFlowing. ++ * The requirements for the previous cache were: ++ * - Store 200 entries ++ * - Look for the flag in the cache ++ * - If it exists, move to front of cache ++ * - If it doesn't exist, remove last entry in cache and insert in front ++ * ++ * This class accomplishes something similar, however has a few different ++ * requirements put into place to make this more optimize: ++ * ++ * - maxDistance is the most amount of entries to be checked, instead ++ * of having to check the entire list. ++ * - In combination with that, entries are all tracked by age and how ++ * frequently they're used. This enables us to remove old entries, ++ * without constantly shifting any around. ++ * ++ * Usage of the previous map would have to reset the head every single usage, ++ * shifting the entire map. Here, nothing happens except an increment when ++ * the cache is hit, and when it needs to replace an old element only a single ++ * element is modified. ++ */ ++public class FluidDirectionCache { ++ ++ private static class FluidDirectionEntry { ++ private final T data; ++ private final boolean flag; ++ private int uses = 0; ++ private int age = 0; ++ ++ private FluidDirectionEntry(T data, boolean flag) { ++ this.data = data; ++ this.flag = flag; ++ } ++ ++ public int getValue() { ++ return this.uses - (this.age >> 1); // age isn't as important as uses ++ } ++ ++ public void incrementUses() { ++ this.uses = this.uses + 1 & Integer.MAX_VALUE; ++ } ++ ++ public void incrementAge() { ++ this.age = this.age + 1 & Integer.MAX_VALUE; ++ } ++ } ++ ++ private final FluidDirectionEntry[] entries; ++ private final int mask; ++ private final int maxDistance; // the most amount of entries to check for a value ++ ++ public FluidDirectionCache(int size) { ++ int arraySize = HashCommon.nextPowerOfTwo(size); ++ this.entries = new FluidDirectionEntry[arraySize]; ++ this.mask = arraySize - 1; ++ this.maxDistance = Math.min(arraySize, 4); ++ } ++ ++ public Boolean getValue(T data) { ++ FluidDirectionEntry curr; ++ int pos; ++ ++ if ((curr = this.entries[pos = HashCommon.mix(data.hashCode()) & this.mask]) == null) { ++ return null; ++ } else if (data.equals(curr.data)) { ++ curr.incrementUses(); ++ return curr.flag; ++ } ++ ++ int checked = 1; // start at 1 because we already checked the first spot above ++ ++ while ((curr = this.entries[pos = (pos + 1) & this.mask]) != null) { ++ if (data.equals(curr.data)) { ++ curr.incrementUses(); ++ return curr.flag; ++ } else if (++checked >= this.maxDistance) { ++ break; ++ } ++ } ++ ++ return null; ++ } ++ ++ public void putValue(T data, boolean flag) { ++ FluidDirectionEntry curr; ++ int pos; ++ ++ if ((curr = this.entries[pos = HashCommon.mix(data.hashCode()) & this.mask]) == null) { ++ this.entries[pos] = new FluidDirectionEntry<>(data, flag); // add ++ return; ++ } else if (data.equals(curr.data)) { ++ curr.incrementUses(); ++ return; ++ } ++ ++ int checked = 1; // start at 1 because we already checked the first spot above ++ ++ while ((curr = this.entries[pos = (pos + 1) & this.mask]) != null) { ++ if (data.equals(curr.data)) { ++ curr.incrementUses(); ++ return; ++ } else if (++checked >= this.maxDistance) { ++ this.forceAdd(data, flag); ++ return; ++ } ++ } ++ ++ this.entries[pos] = new FluidDirectionEntry<>(data, flag); // add ++ } ++ ++ private void forceAdd(T data, boolean flag) { ++ int expectedPos = HashCommon.mix(data.hashCode()) & this.mask; ++ ++ int toRemovePos = expectedPos; ++ FluidDirectionEntry entryToRemove = this.entries[toRemovePos]; ++ ++ for (int i = expectedPos + 1; i < expectedPos + this.maxDistance; i++) { ++ int pos = i & this.mask; ++ FluidDirectionEntry entry = this.entries[pos]; ++ if (entry.getValue() < entryToRemove.getValue()) { ++ toRemovePos = pos; ++ entryToRemove = entry; ++ } ++ ++ entry.incrementAge(); // use this as a mechanism to age the other entries ++ } ++ ++ // remove the least used/oldest entry ++ this.entries[toRemovePos] = new FluidDirectionEntry(data, flag); ++ } ++} +diff --git a/src/main/java/gg/airplane/structs/ItemListWithBitset.java b/src/main/java/gg/airplane/structs/ItemListWithBitset.java +new file mode 100644 +index 0000000000000000000000000000000000000000..1b7a4ee47f4445d7f2ac91d3a73ae113edbdddb2 +--- /dev/null ++++ b/src/main/java/gg/airplane/structs/ItemListWithBitset.java +@@ -0,0 +1,114 @@ ++package gg.airplane.structs; ++ ++import net.minecraft.core.NonNullList; ++import net.minecraft.world.item.ItemStack; ++import org.apache.commons.lang.Validate; ++import org.jetbrains.annotations.NotNull; ++import org.jetbrains.annotations.Nullable; ++ ++import java.util.AbstractList; ++import java.util.Arrays; ++import java.util.List; ++ ++public class ItemListWithBitset extends AbstractList { ++ public static ItemListWithBitset fromList(List list) { ++ if (list instanceof ItemListWithBitset ours) { ++ return ours; ++ } ++ return new ItemListWithBitset(list); ++ } ++ ++ private static ItemStack[] createArray(int size) { ++ ItemStack[] array = new ItemStack[size]; ++ Arrays.fill(array, ItemStack.EMPTY); ++ return array; ++ } ++ ++ private final ItemStack[] items; ++ ++ private long bitSet = 0; ++ private final long allBits; ++ ++ private static class OurNonNullList extends NonNullList { ++ protected OurNonNullList(List delegate) { ++ super(delegate, ItemStack.EMPTY); ++ } ++ } ++ ++ public final NonNullList nonNullList = new OurNonNullList(this); ++ ++ private ItemListWithBitset(List list) { ++ this(list.size()); ++ ++ for (int i = 0; i < list.size(); i++) { ++ this.set(i, list.get(i)); ++ } ++ } ++ ++ public ItemListWithBitset(int size) { ++ Validate.isTrue(size < Long.BYTES * 8, "size is too large"); ++ ++ this.items = createArray(size); ++ this.allBits = ((1L << size) - 1); ++ } ++ ++ public boolean isCompletelyEmpty() { ++ return this.bitSet == 0; ++ } ++ ++ public boolean hasFullStacks() { ++ return (this.bitSet & this.allBits) == allBits; ++ } ++ ++ @Override ++ public ItemStack set(int index, @NotNull ItemStack itemStack) { ++ ItemStack existing = this.items[index]; ++ ++ this.items[index] = itemStack; ++ ++ if (itemStack == ItemStack.EMPTY) { ++ this.bitSet &= ~(1L << index); ++ } else { ++ this.bitSet |= 1L << index; ++ } ++ ++ return existing; ++ } ++ ++ @NotNull ++ @Override ++ public ItemStack get(int var0) { ++ return this.items[var0]; ++ } ++ ++ @Override ++ public int size() { ++ return this.items.length; ++ } ++ ++ @Override ++ public void clear() { ++ Arrays.fill(this.items, ItemStack.EMPTY); ++ } ++ ++ // these are unsupported for block inventories which have a static size ++ @Override ++ public void add(int var0, ItemStack var1) { ++ throw new UnsupportedOperationException(); ++ } ++ ++ @Override ++ public ItemStack remove(int var0) { ++ throw new UnsupportedOperationException(); ++ } ++ ++ @Override ++ public String toString() { ++ return "ItemListWithBitset{" + ++ "items=" + Arrays.toString(items) + ++ ", bitSet=" + Long.toString(bitSet, 2) + ++ ", allBits=" + Long.toString(allBits, 2) + ++ ", size=" + this.items.length + ++ '}'; ++ } ++} +diff --git a/src/main/java/gg/airplane/structs/Long2FloatAgingCache.java b/src/main/java/gg/airplane/structs/Long2FloatAgingCache.java +new file mode 100644 +index 0000000000000000000000000000000000000000..a7f297ebb569f7c1f205e967ca485be70013a714 +--- /dev/null ++++ b/src/main/java/gg/airplane/structs/Long2FloatAgingCache.java +@@ -0,0 +1,119 @@ ++package gg.airplane.structs; ++ ++import it.unimi.dsi.fastutil.HashCommon; ++ ++/** ++ * A replacement for the cache used in Biome. ++ */ ++public class Long2FloatAgingCache { ++ ++ private static class AgingEntry { ++ private long data; ++ private float value; ++ private int uses = 0; ++ private int age = 0; ++ ++ private AgingEntry(long data, float value) { ++ this.data = data; ++ this.value = value; ++ } ++ ++ public void replace(long data, float flag) { ++ this.data = data; ++ this.value = flag; ++ } ++ ++ public int getValue() { ++ return this.uses - (this.age >> 1); // age isn't as important as uses ++ } ++ ++ public void incrementUses() { ++ this.uses = this.uses + 1 & Integer.MAX_VALUE; ++ } ++ ++ public void incrementAge() { ++ this.age = this.age + 1 & Integer.MAX_VALUE; ++ } ++ } ++ ++ private final AgingEntry[] entries; ++ private final int mask; ++ private final int maxDistance; // the most amount of entries to check for a value ++ ++ public Long2FloatAgingCache(int size) { ++ int arraySize = HashCommon.nextPowerOfTwo(size); ++ this.entries = new AgingEntry[arraySize]; ++ this.mask = arraySize - 1; ++ this.maxDistance = Math.min(arraySize, 4); ++ } ++ ++ public float getValue(long data) { ++ AgingEntry curr; ++ int pos; ++ ++ if ((curr = this.entries[pos = HashCommon.mix(HashCommon.long2int(data)) & this.mask]) == null) { ++ return Float.NaN; ++ } else if (data == curr.data) { ++ curr.incrementUses(); ++ return curr.value; ++ } ++ ++ int checked = 1; // start at 1 because we already checked the first spot above ++ ++ while ((curr = this.entries[pos = (pos + 1) & this.mask]) != null) { ++ if (data == curr.data) { ++ curr.incrementUses(); ++ return curr.value; ++ } else if (++checked >= this.maxDistance) { ++ break; ++ } ++ } ++ ++ return Float.NaN; ++ } ++ ++ public void putValue(long data, float value) { ++ AgingEntry curr; ++ int pos; ++ ++ if ((curr = this.entries[pos = HashCommon.mix(HashCommon.long2int(data)) & this.mask]) == null) { ++ this.entries[pos] = new AgingEntry(data, value); // add ++ return; ++ } else if (data == curr.data) { ++ curr.incrementUses(); ++ return; ++ } ++ ++ int checked = 1; // start at 1 because we already checked the first spot above ++ ++ while ((curr = this.entries[pos = (pos + 1) & this.mask]) != null) { ++ if (data == curr.data) { ++ curr.incrementUses(); ++ return; ++ } else if (++checked >= this.maxDistance) { ++ this.forceAdd(data, value); ++ return; ++ } ++ } ++ ++ this.entries[pos] = new AgingEntry(data, value); // add ++ } ++ ++ private void forceAdd(long data, float value) { ++ int expectedPos = HashCommon.mix(HashCommon.long2int(data)) & this.mask; ++ AgingEntry entryToRemove = this.entries[expectedPos]; ++ ++ for (int i = expectedPos + 1; i < expectedPos + this.maxDistance; i++) { ++ int pos = i & this.mask; ++ AgingEntry entry = this.entries[pos]; ++ if (entry.getValue() < entryToRemove.getValue()) { ++ entryToRemove = entry; ++ } ++ ++ entry.incrementAge(); // use this as a mechanism to age the other entries ++ } ++ ++ // remove the least used/oldest entry ++ entryToRemove.replace(data, value); ++ } ++} +diff --git a/src/main/java/gg/pufferfish/pufferfish/PufferfishCommand.java b/src/main/java/gg/pufferfish/pufferfish/PufferfishCommand.java +new file mode 100644 +index 0000000000000000000000000000000000000000..e164237e749bcc43466d4ed7aeada5ab9fddf8a6 +--- /dev/null ++++ b/src/main/java/gg/pufferfish/pufferfish/PufferfishCommand.java +@@ -0,0 +1,68 @@ ++package gg.pufferfish.pufferfish; ++ ++import java.io.IOException; ++import java.util.Collections; ++import java.util.List; ++import java.util.stream.Collectors; ++import java.util.stream.Stream; ++import net.kyori.adventure.text.Component; ++import net.kyori.adventure.text.format.NamedTextColor; ++import net.md_5.bungee.api.ChatColor; ++import net.minecraft.server.MinecraftServer; ++import org.bukkit.Bukkit; ++import org.bukkit.Location; ++import org.bukkit.command.Command; ++import org.bukkit.command.CommandSender; ++ ++public class PufferfishCommand extends Command { ++ ++ public PufferfishCommand() { ++ super("pufferfish"); ++ this.description = "Pufferfish related commands"; ++ this.usageMessage = "/pufferfish [reload | version]"; ++ this.setPermission("bukkit.command.pufferfish"); ++ } ++ ++ public static void init() { ++ MinecraftServer.getServer().server.getCommandMap().register("pufferfish", "Pufferfish", new PufferfishCommand()); ++ } ++ ++ @Override ++ public List tabComplete(CommandSender sender, String alias, String[] args, Location location) throws IllegalArgumentException { ++ if (args.length == 1) { ++ return Stream.of("reload", "version") ++ .filter(arg -> arg.startsWith(args[0].toLowerCase())) ++ .collect(Collectors.toList()); ++ } ++ return Collections.emptyList(); ++ } ++ ++ @Override ++ public boolean execute(CommandSender sender, String commandLabel, String[] args) { ++ if (!testPermission(sender)) return true; ++ String prefix = ChatColor.of("#12fff6") + "" + ChatColor.BOLD + "Pufferfish » " + ChatColor.of("#e8f9f9"); ++ ++ if (args.length != 1) { ++ sender.sendMessage(prefix + "Usage: " + usageMessage); ++ args = new String[]{"version"}; ++ } ++ ++ if (args[0].equalsIgnoreCase("reload")) { ++ MinecraftServer console = MinecraftServer.getServer(); ++ try { ++ PufferfishConfig.load(); ++ } catch (IOException e) { ++ sender.sendMessage(Component.text("Failed to reload.", NamedTextColor.RED)); ++ e.printStackTrace(); ++ return true; ++ } ++ console.server.reloadCount++; ++ ++ Command.broadcastCommandMessage(sender, prefix + "Pufferfish configuration has been reloaded."); ++ } else if (args[0].equalsIgnoreCase("version")) { ++ Command.broadcastCommandMessage(sender, prefix + "This server is running " + Bukkit.getName() + " version " + Bukkit.getVersion() + " (Implementing API version " + Bukkit.getBukkitVersion() + ")"); ++ } ++ ++ return true; ++ } ++} +diff --git a/src/main/java/gg/pufferfish/pufferfish/PufferfishConfig.java b/src/main/java/gg/pufferfish/pufferfish/PufferfishConfig.java +new file mode 100644 +index 0000000000000000000000000000000000000000..a8cead500186142115d4dc029c942fdfc68f7fe5 +--- /dev/null ++++ b/src/main/java/gg/pufferfish/pufferfish/PufferfishConfig.java +@@ -0,0 +1,285 @@ ++package gg.pufferfish.pufferfish; ++ ++import gg.pufferfish.pufferfish.simd.SIMDDetection; ++import java.io.File; ++import java.io.IOException; ++import java.util.Collections; ++import net.minecraft.core.registries.BuiltInRegistries; ++import java.util.Locale; ++import java.util.Map; ++import net.minecraft.server.MinecraftServer; ++import net.minecraft.tags.TagKey; ++import org.apache.logging.log4j.Level; ++import org.bukkit.configuration.ConfigurationSection; ++import net.minecraft.world.entity.EntityType; ++import java.lang.reflect.Method; ++import java.lang.reflect.Modifier; ++import java.util.List; ++import net.minecraft.server.MinecraftServer; ++import org.apache.logging.log4j.Level; ++import org.bukkit.configuration.ConfigurationSection; ++import org.bukkit.configuration.MemoryConfiguration; ++import org.jetbrains.annotations.Nullable; ++import org.simpleyaml.configuration.comments.CommentType; ++import org.simpleyaml.configuration.file.YamlFile; ++import org.simpleyaml.exceptions.InvalidConfigurationException; ++ ++public class PufferfishConfig { ++ ++ private static final YamlFile config = new YamlFile(); ++ private static int updates = 0; ++ ++ private static ConfigurationSection convertToBukkit(org.simpleyaml.configuration.ConfigurationSection section) { ++ ConfigurationSection newSection = new MemoryConfiguration(); ++ for (String key : section.getKeys(false)) { ++ if (section.isConfigurationSection(key)) { ++ newSection.set(key, convertToBukkit(section.getConfigurationSection(key))); ++ } else { ++ newSection.set(key, section.get(key)); ++ } ++ } ++ return newSection; ++ } ++ ++ public static ConfigurationSection getConfigCopy() { ++ return convertToBukkit(config); ++ } ++ ++ public static int getUpdates() { ++ return updates; ++ } ++ ++ public static void load() throws IOException { ++ File configFile = new File("pufferfish.yml"); ++ ++ if (configFile.exists()) { ++ try { ++ config.load(configFile); ++ } catch (InvalidConfigurationException e) { ++ throw new IOException(e); ++ } ++ } ++ ++ getString("info.version", "1.0"); ++ setComment("info", ++ "Pufferfish Configuration", ++ "Check out Pufferfish Host for maximum performance server hosting: https://pufferfish.host", ++ "Join our Discord for support: https://discord.gg/reZw4vQV9H", ++ "Download new builds at https://ci.pufferfish.host/job/Pufferfish"); ++ ++ for (Method method : PufferfishConfig.class.getDeclaredMethods()) { ++ if (Modifier.isStatic(method.getModifiers()) && Modifier.isPrivate(method.getModifiers()) && method.getParameterCount() == 0 && ++ method.getReturnType() == Void.TYPE && !method.getName().startsWith("lambda")) { ++ method.setAccessible(true); ++ try { ++ method.invoke(null); ++ } catch (Throwable t) { ++ MinecraftServer.LOGGER.warn("Failed to load configuration option from " + method.getName(), t); ++ } ++ } ++ } ++ ++ updates++; ++ ++ config.save(configFile); ++ ++ // Attempt to detect vectorization ++ try { ++ SIMDDetection.isEnabled = SIMDDetection.canEnable(PufferfishLogger.LOGGER); ++ SIMDDetection.versionLimited = SIMDDetection.getJavaVersion() != 17 && SIMDDetection.getJavaVersion() != 18 && SIMDDetection.getJavaVersion() != 19; ++ } catch (NoClassDefFoundError | Exception ignored) { ++ ignored.printStackTrace(); ++ } ++ ++ if (SIMDDetection.isEnabled) { ++ PufferfishLogger.LOGGER.info("SIMD operations detected as functional. Will replace some operations with faster versions."); ++ } else if (SIMDDetection.versionLimited) { ++ PufferfishLogger.LOGGER.warning("Will not enable SIMD! These optimizations are only safely supported on Java 17, Java 18, and Java 19."); ++ } else { ++ PufferfishLogger.LOGGER.warning("SIMD operations are available for your server, but are not configured!"); ++ PufferfishLogger.LOGGER.warning("To enable additional optimizations, add \"--add-modules=jdk.incubator.vector\" to your startup flags, BEFORE the \"-jar\"."); ++ PufferfishLogger.LOGGER.warning("If you have already added this flag, then SIMD operations are not supported on your JVM or CPU."); ++ PufferfishLogger.LOGGER.warning("Debug: Java: " + System.getProperty("java.version") + ", test run: " + SIMDDetection.testRun); ++ } ++ } ++ ++ private static void setComment(String key, String... comment) { ++ if (config.contains(key)) { ++ config.setComment(key, String.join("\n", comment), CommentType.BLOCK); ++ } ++ } ++ ++ private static void ensureDefault(String key, Object defaultValue, String... comment) { ++ if (!config.contains(key)) { ++ config.set(key, defaultValue); ++ config.setComment(key, String.join("\n", comment), CommentType.BLOCK); ++ } ++ } ++ ++ private static boolean getBoolean(String key, boolean defaultValue, String... comment) { ++ return getBoolean(key, null, defaultValue, comment); ++ } ++ ++ private static boolean getBoolean(String key, @Nullable String oldKey, boolean defaultValue, String... comment) { ++ ensureDefault(key, defaultValue, comment); ++ return config.getBoolean(key, defaultValue); ++ } ++ ++ private static int getInt(String key, int defaultValue, String... comment) { ++ return getInt(key, null, defaultValue, comment); ++ } ++ ++ private static int getInt(String key, @Nullable String oldKey, int defaultValue, String... comment) { ++ ensureDefault(key, defaultValue, comment); ++ return config.getInt(key, defaultValue); ++ } ++ ++ private static double getDouble(String key, double defaultValue, String... comment) { ++ return getDouble(key, null, defaultValue, comment); ++ } ++ ++ private static double getDouble(String key, @Nullable String oldKey, double defaultValue, String... comment) { ++ ensureDefault(key, defaultValue, comment); ++ return config.getDouble(key, defaultValue); ++ } ++ ++ private static String getString(String key, String defaultValue, String... comment) { ++ return getOldString(key, null, defaultValue, comment); ++ } ++ ++ private static String getOldString(String key, @Nullable String oldKey, String defaultValue, String... comment) { ++ ensureDefault(key, defaultValue, comment); ++ return config.getString(key, defaultValue); ++ } ++ ++ private static List getStringList(String key, List defaultValue, String... comment) { ++ return getStringList(key, null, defaultValue, comment); ++ } ++ ++ private static List getStringList(String key, @Nullable String oldKey, List defaultValue, String... comment) { ++ ensureDefault(key, defaultValue, comment); ++ return config.getStringList(key); ++ } ++ ++ public static String sentryDsn; ++ private static void sentry() { ++ String sentryEnvironment = System.getenv("SENTRY_DSN"); ++ String sentryConfig = getString("sentry-dsn", "", "Sentry DSN for improved error logging, leave blank to disable", "Obtain from https://sentry.io/"); ++ ++ sentryDsn = sentryEnvironment == null ? sentryConfig : sentryEnvironment; ++ if (sentryDsn != null && !sentryDsn.isBlank()) { ++ gg.pufferfish.pufferfish.sentry.SentryManager.init(); ++ } ++ } ++ ++ public static boolean enableBooks; ++ private static void books() { ++ enableBooks = getBoolean("enable-books", true, ++ "Whether or not books should be writeable.", ++ "Servers that anticipate being a target for duping may want to consider", ++ "disabling this option.", ++ "This can be overridden per-player with the permission pufferfish.usebooks"); ++ } ++ ++ public static boolean enableSuffocationOptimization; ++ private static void suffocationOptimization() { ++ enableSuffocationOptimization = getBoolean("enable-suffocation-optimization", true, ++ "Optimizes the suffocation check by selectively skipping", ++ "the check in a way that still appears vanilla. This should", ++ "be left enabled on most servers, but is provided as a", ++ "configuration option if the vanilla deviation is undesirable."); ++ } ++ ++ public static boolean enableAsyncMobSpawning; ++ public static boolean asyncMobSpawningInitialized; ++ private static void asyncMobSpawning() { ++ boolean temp = getBoolean("enable-async-mob-spawning", true, ++ "Whether or not asynchronous mob spawning should be enabled.", ++ "On servers with many entities, this can improve performance by up to 15%. You must have", ++ "paper's per-player-mob-spawns setting set to true for this to work.", ++ "One quick note - this does not actually spawn mobs async (that would be very unsafe).", ++ "This just offloads some expensive calculations that are required for mob spawning."); ++ ++ // This prevents us from changing the value during a reload. ++ if (!asyncMobSpawningInitialized) { ++ asyncMobSpawningInitialized = true; ++ enableAsyncMobSpawning = temp; ++ } ++ } ++ ++ public static int maxProjectileLoadsPerTick; ++ public static int maxProjectileLoadsPerProjectile; ++ private static void projectileLoading() { ++ maxProjectileLoadsPerTick = getInt("projectile.max-loads-per-tick", 10, "Controls how many chunks are allowed", "to be sync loaded by projectiles in a tick."); ++ maxProjectileLoadsPerProjectile = getInt("projectile.max-loads-per-projectile", 10, "Controls how many chunks a projectile", "can load in its lifetime before it gets", "automatically removed."); ++ ++ setComment("projectile", "Optimizes projectile settings"); ++ } ++ ++ ++ public static boolean dearEnabled; ++ public static int startDistance; ++ public static int startDistanceSquared; ++ public static int maximumActivationPrio; ++ public static int activationDistanceMod; ++ ++ private static void dynamicActivationOfBrains() throws IOException { ++ dearEnabled = getBoolean("dab.enabled", "activation-range.enabled", true); ++ startDistance = getInt("dab.start-distance", "activation-range.start-distance", 12, ++ "This value determines how far away an entity has to be", ++ "from the player to start being effected by DEAR."); ++ startDistanceSquared = startDistance * startDistance; ++ maximumActivationPrio = getInt("dab.max-tick-freq", "activation-range.max-tick-freq", 20, ++ "This value defines how often in ticks, the furthest entity", ++ "will get their pathfinders and behaviors ticked. 20 = 1s"); ++ activationDistanceMod = getInt("dab.activation-dist-mod", "activation-range.activation-dist-mod", 8, ++ "This value defines how much distance modifies an entity's", ++ "tick frequency. freq = (distanceToPlayer^2) / (2^value)", ++ "If you want further away entities to tick less often, use 7.", ++ "If you want further away entities to tick more often, try 9."); ++ ++ for (EntityType entityType : BuiltInRegistries.ENTITY_TYPE) { ++ entityType.dabEnabled = true; // reset all, before setting the ones to true ++ } ++ getStringList("dab.blacklisted-entities", "activation-range.blacklisted-entities", Collections.emptyList(), "A list of entities to ignore for activation") ++ .forEach(name -> EntityType.byString(name).ifPresentOrElse(entityType -> { ++ entityType.dabEnabled = false; ++ }, () -> MinecraftServer.LOGGER.warn("Unknown entity \"" + name + "\""))); ++ ++ setComment("dab", "Optimizes entity brains when", "they're far away from the player"); ++ } ++ ++ public static Map projectileTimeouts; ++ private static void projectileTimeouts() { ++ // Set some defaults ++ getInt("entity_timeouts.SNOWBALL", -1); ++ getInt("entity_timeouts.LLAMA_SPIT", -1); ++ setComment("entity_timeouts", ++ "These values define a entity's maximum lifespan. If an", ++ "entity is in this list and it has survived for longer than", ++ "that number of ticks, then it will be removed. Setting a value to", ++ "-1 disables this feature."); ++ ++ for (EntityType entityType : BuiltInRegistries.ENTITY_TYPE) { ++ String type = EntityType.getKey(entityType).getPath().toUpperCase(Locale.ROOT); ++ entityType.ttl = config.getInt("entity_timeouts." + type, -1); ++ } ++ } ++ ++ public static boolean throttleInactiveGoalSelectorTick; ++ private static void inactiveGoalSelectorThrottle() { ++ getBoolean("inactive-goal-selector-throttle", "inactive-goal-selector-disable", true, ++ "Throttles the AI goal selector in entity inactive ticks.", ++ "This can improve performance by a few percent, but has minor gameplay implications."); ++ } ++ ++ ++ public static boolean disableMethodProfiler; ++ public static boolean disableOutOfOrderChat; ++ private static void miscSettings() { ++ disableMethodProfiler = getBoolean("misc.disable-method-profiler", true); ++ disableOutOfOrderChat = getBoolean("misc.disable-out-of-order-chat", false); ++ setComment("misc", "Settings for things that don't belong elsewhere"); ++ } ++ ++} +diff --git a/src/main/java/gg/pufferfish/pufferfish/PufferfishLogger.java b/src/main/java/gg/pufferfish/pufferfish/PufferfishLogger.java +new file mode 100644 +index 0000000000000000000000000000000000000000..53f2df00c6809618a9ee3d2ea72e85e8052fbcf1 +--- /dev/null ++++ b/src/main/java/gg/pufferfish/pufferfish/PufferfishLogger.java +@@ -0,0 +1,16 @@ ++package gg.pufferfish.pufferfish; ++ ++import java.util.logging.Level; ++import java.util.logging.Logger; ++import org.bukkit.Bukkit; ++ ++public class PufferfishLogger extends Logger { ++ public static final PufferfishLogger LOGGER = new PufferfishLogger(); ++ ++ private PufferfishLogger() { ++ super("Pufferfish", null); ++ ++ setParent(Bukkit.getLogger()); ++ setLevel(Level.ALL); ++ } ++} +diff --git a/src/main/java/gg/pufferfish/pufferfish/PufferfishVersionFetcher.java b/src/main/java/gg/pufferfish/pufferfish/PufferfishVersionFetcher.java +new file mode 100644 +index 0000000000000000000000000000000000000000..1adc3de7cdb5b5f309df45f463e4697d6ec2c245 +--- /dev/null ++++ b/src/main/java/gg/pufferfish/pufferfish/PufferfishVersionFetcher.java +@@ -0,0 +1,136 @@ ++package gg.pufferfish.pufferfish; ++ ++import static net.kyori.adventure.text.Component.text; ++import static net.kyori.adventure.text.format.NamedTextColor.GREEN; ++import static net.kyori.adventure.text.format.NamedTextColor.RED; ++ ++import com.destroystokyo.paper.VersionHistoryManager; ++import com.destroystokyo.paper.util.VersionFetcher; ++import com.google.gson.Gson; ++import com.google.gson.JsonObject; ++import java.io.IOException; ++import java.net.URI; ++import java.net.http.HttpClient; ++import java.net.http.HttpRequest; ++import java.net.http.HttpResponse; ++import java.nio.charset.StandardCharsets; ++import java.util.concurrent.TimeUnit; ++import java.util.logging.Level; ++import java.util.logging.Logger; ++import net.kyori.adventure.text.Component; ++import net.kyori.adventure.text.JoinConfiguration; ++import net.kyori.adventure.text.format.NamedTextColor; ++import net.kyori.adventure.text.format.TextDecoration; ++import org.bukkit.craftbukkit.CraftServer; ++import org.jetbrains.annotations.NotNull; ++import org.jetbrains.annotations.Nullable; ++ ++public class PufferfishVersionFetcher implements VersionFetcher { ++ ++ private static final Logger LOGGER = Logger.getLogger("PufferfishVersionFetcher"); ++ private static final HttpClient client = HttpClient.newHttpClient(); ++ ++ private static final URI JENKINS_URI = URI.create("https://ci.pufferfish.host/job/Pufferfish-1.19/lastSuccessfulBuild/buildNumber"); ++ private static final String GITHUB_FORMAT = "https://api.github.com/repos/pufferfish-gg/Pufferfish/compare/ver/1.19...%s"; ++ ++ private static final HttpResponse.BodyHandler JSON_OBJECT_BODY_HANDLER = responseInfo -> HttpResponse.BodySubscribers ++ .mapping( ++ HttpResponse.BodySubscribers.ofString(StandardCharsets.UTF_8), ++ string -> new Gson().fromJson(string, JsonObject.class) ++ ); ++ ++ @Override ++ public long getCacheTime() { ++ return TimeUnit.MINUTES.toMillis(30); ++ } ++ ++ @Override ++ public @NotNull Component getVersionMessage(final @NotNull String serverVersion) { ++ final String[] parts = CraftServer.class.getPackage().getImplementationVersion().split("-"); ++ @NotNull Component component; ++ ++ if (parts.length != 3) { ++ component = text("Unknown server version.", RED); ++ } else { ++ final String versionString = parts[2]; ++ ++ try { ++ component = this.fetchJenkinsVersion(Integer.parseInt(versionString)); ++ } catch (NumberFormatException e) { ++ component = this.fetchGithubVersion(versionString.substring(1, versionString.length() - 1)); ++ } ++ } ++ ++ final @Nullable Component history = this.getHistory(); ++ return history != null ? Component ++ .join(JoinConfiguration.noSeparators(), component, Component.newline(), this.getHistory()) : component; ++ } ++ ++ private @NotNull Component fetchJenkinsVersion(final int versionNumber) { ++ final HttpRequest request = HttpRequest.newBuilder(JENKINS_URI).build(); ++ try { ++ final HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString()); ++ if (response.statusCode() != 200) { ++ return text("Received invalid status code (" + response.statusCode() + ") from server.", RED); ++ } ++ ++ int latestVersionNumber; ++ try { ++ latestVersionNumber = Integer.parseInt(response.body()); ++ } catch (NumberFormatException e) { ++ LOGGER.log(Level.WARNING, "Received invalid response from Jenkins \"" + response.body() + "\"."); ++ return text("Received invalid response from server.", RED); ++ } ++ ++ final int versionDiff = latestVersionNumber - versionNumber; ++ return this.getResponseMessage(versionDiff); ++ } catch (IOException | InterruptedException e) { ++ LOGGER.log(Level.WARNING, "Failed to look up version from Jenkins", e); ++ return text("Failed to retrieve version from server.", RED); ++ } ++ } ++ ++ // Based off code contributed by Techcable in Paper/GH-65 ++ private @NotNull Component fetchGithubVersion(final @NotNull String hash) { ++ final URI uri = URI.create(String.format(GITHUB_FORMAT, hash)); ++ final HttpRequest request = HttpRequest.newBuilder(uri).build(); ++ try { ++ final HttpResponse response = client.send(request, JSON_OBJECT_BODY_HANDLER); ++ if (response.statusCode() != 200) { ++ return text("Received invalid status code (" + response.statusCode() + ") from server.", RED); ++ } ++ ++ final JsonObject obj = response.body(); ++ final int versionDiff = obj.get("behind_by").getAsInt(); ++ ++ return this.getResponseMessage(versionDiff); ++ } catch (IOException | InterruptedException e) { ++ LOGGER.log(Level.WARNING, "Failed to look up version from GitHub", e); ++ return text("Failed to retrieve version from server.", RED); ++ } ++ } ++ ++ private @NotNull Component getResponseMessage(final int versionDiff) { ++ return switch (Math.max(-1, Math.min(1, versionDiff))) { ++ case -1 -> text("You are running an unsupported version of Pufferfish.", RED); ++ case 0 -> text("You are on the latest version!", GREEN); ++ default -> text("You are running " + versionDiff + " version" + (versionDiff == 1 ? "" : "s") + " beyond. " + ++ "Please update your server when possible to maintain stability, security, and receive the latest optimizations.", ++ RED); ++ }; ++ } ++ ++ private @Nullable Component getHistory() { ++ final VersionHistoryManager.VersionData data = VersionHistoryManager.INSTANCE.getVersionData(); ++ if (data == null) { ++ return null; ++ } ++ ++ final String oldVersion = data.getOldVersion(); ++ if (oldVersion == null) { ++ return null; ++ } ++ ++ return Component.text("Previous version: " + oldVersion, NamedTextColor.GRAY, TextDecoration.ITALIC); ++ } ++} +\ No newline at end of file +diff --git a/src/main/java/gg/pufferfish/pufferfish/sentry/PufferfishSentryAppender.java b/src/main/java/gg/pufferfish/pufferfish/sentry/PufferfishSentryAppender.java +new file mode 100644 +index 0000000000000000000000000000000000000000..d04a8a4336566dbe6e1b9ec0d574cff43e003fa8 +--- /dev/null ++++ b/src/main/java/gg/pufferfish/pufferfish/sentry/PufferfishSentryAppender.java +@@ -0,0 +1,135 @@ ++package gg.pufferfish.pufferfish.sentry; ++ ++import com.google.common.reflect.TypeToken; ++import com.google.gson.Gson; ++import io.sentry.Breadcrumb; ++import io.sentry.Sentry; ++import io.sentry.SentryEvent; ++import io.sentry.SentryLevel; ++import io.sentry.protocol.Message; ++import io.sentry.protocol.User; ++import java.util.Map; ++import org.apache.logging.log4j.Level; ++import org.apache.logging.log4j.LogManager; ++import org.apache.logging.log4j.Marker; ++import org.apache.logging.log4j.core.LogEvent; ++import org.apache.logging.log4j.core.Logger; ++import org.apache.logging.log4j.core.appender.AbstractAppender; ++import org.apache.logging.log4j.core.filter.AbstractFilter; ++ ++public class PufferfishSentryAppender extends AbstractAppender { ++ ++ private static final org.apache.logging.log4j.Logger logger = LogManager.getLogger(PufferfishSentryAppender.class); ++ private static final Gson GSON = new Gson(); ++ ++ public PufferfishSentryAppender() { ++ super("PufferfishSentryAdapter", new SentryFilter(), null); ++ } ++ ++ @Override ++ public void append(LogEvent logEvent) { ++ if (logEvent.getThrown() != null && logEvent.getLevel().isMoreSpecificThan(Level.WARN)) { ++ try { ++ logException(logEvent); ++ } catch (Exception e) { ++ logger.warn("Failed to log event with sentry", e); ++ } ++ } else { ++ try { ++ logBreadcrumb(logEvent); ++ } catch (Exception e) { ++ logger.warn("Failed to log event with sentry", e); ++ } ++ } ++ } ++ ++ private void logException(LogEvent e) { ++ SentryEvent event = new SentryEvent(e.getThrown()); ++ ++ Message sentryMessage = new Message(); ++ sentryMessage.setMessage(e.getMessage().getFormattedMessage()); ++ ++ event.setThrowable(e.getThrown()); ++ event.setLevel(getLevel(e.getLevel())); ++ event.setLogger(e.getLoggerName()); ++ event.setTransaction(e.getLoggerName()); ++ event.setExtra("thread_name", e.getThreadName()); ++ ++ boolean hasContext = e.getContextData() != null; ++ ++ if (hasContext && e.getContextData().containsKey("pufferfishsentry_playerid")) { ++ User user = new User(); ++ user.setId(e.getContextData().getValue("pufferfishsentry_playerid")); ++ user.setUsername(e.getContextData().getValue("pufferfishsentry_playername")); ++ event.setUser(user); ++ } ++ ++ if (hasContext && e.getContextData().containsKey("pufferfishsentry_pluginname")) { ++ event.setExtra("plugin.name", e.getContextData().getValue("pufferfishsentry_pluginname")); ++ event.setExtra("plugin.version", e.getContextData().getValue("pufferfishsentry_pluginversion")); ++ event.setTransaction(e.getContextData().getValue("pufferfishsentry_pluginname")); ++ } ++ ++ if (hasContext && e.getContextData().containsKey("pufferfishsentry_eventdata")) { ++ Map eventFields = GSON.fromJson((String) e.getContextData().getValue("pufferfishsentry_eventdata"), new TypeToken>() {}.getType()); ++ if (eventFields != null) { ++ event.setExtra("event", eventFields); ++ } ++ } ++ ++ Sentry.captureEvent(event); ++ } ++ ++ private void logBreadcrumb(LogEvent e) { ++ Breadcrumb breadcrumb = new Breadcrumb(); ++ ++ breadcrumb.setLevel(getLevel(e.getLevel())); ++ breadcrumb.setCategory(e.getLoggerName()); ++ breadcrumb.setType(e.getLoggerName()); ++ breadcrumb.setMessage(e.getMessage().getFormattedMessage()); ++ ++ Sentry.addBreadcrumb(breadcrumb); ++ } ++ ++ private SentryLevel getLevel(Level level) { ++ switch (level.getStandardLevel()) { ++ case TRACE: ++ case DEBUG: ++ return SentryLevel.DEBUG; ++ case WARN: ++ return SentryLevel.WARNING; ++ case ERROR: ++ return SentryLevel.ERROR; ++ case FATAL: ++ return SentryLevel.FATAL; ++ case INFO: ++ default: ++ return SentryLevel.INFO; ++ } ++ } ++ ++ private static class SentryFilter extends AbstractFilter { ++ ++ @Override ++ public Result filter(Logger logger, org.apache.logging.log4j.Level level, Marker marker, String msg, ++ Object... params) { ++ return this.filter(logger.getName()); ++ } ++ ++ @Override ++ public Result filter(Logger logger, org.apache.logging.log4j.Level level, Marker marker, Object msg, Throwable t) { ++ return this.filter(logger.getName()); ++ } ++ ++ @Override ++ public Result filter(LogEvent event) { ++ return this.filter(event == null ? null : event.getLoggerName()); ++ } ++ ++ private Result filter(String loggerName) { ++ return loggerName != null && loggerName.startsWith("gg.castaway.pufferfish.sentry") ? Result.DENY ++ : Result.NEUTRAL; ++ } ++ ++ } ++} +diff --git a/src/main/java/gg/pufferfish/pufferfish/sentry/SentryManager.java b/src/main/java/gg/pufferfish/pufferfish/sentry/SentryManager.java +new file mode 100644 +index 0000000000000000000000000000000000000000..b011abbeb80b42de6be3785e47c7ba3c0f6dc161 +--- /dev/null ++++ b/src/main/java/gg/pufferfish/pufferfish/sentry/SentryManager.java +@@ -0,0 +1,40 @@ ++package gg.pufferfish.pufferfish.sentry; ++ ++import gg.pufferfish.pufferfish.PufferfishConfig; ++import io.sentry.Sentry; ++import org.apache.logging.log4j.LogManager; ++import org.apache.logging.log4j.Logger; ++ ++public class SentryManager { ++ ++ private static final Logger logger = LogManager.getLogger(SentryManager.class); ++ ++ private SentryManager() { ++ ++ } ++ ++ private static boolean initialized = false; ++ ++ public static synchronized void init() { ++ if (initialized) { ++ return; ++ } ++ try { ++ initialized = true; ++ ++ Sentry.init(options -> { ++ options.setDsn(PufferfishConfig.sentryDsn); ++ options.setMaxBreadcrumbs(100); ++ }); ++ ++ PufferfishSentryAppender appender = new PufferfishSentryAppender(); ++ appender.start(); ++ ((org.apache.logging.log4j.core.Logger) LogManager.getRootLogger()).addAppender(appender); ++ logger.info("Sentry logging started!"); ++ } catch (Exception e) { ++ logger.warn("Failed to initialize sentry!", e); ++ initialized = false; ++ } ++ } ++ ++} +diff --git a/src/main/java/gg/pufferfish/pufferfish/util/AsyncExecutor.java b/src/main/java/gg/pufferfish/pufferfish/util/AsyncExecutor.java +new file mode 100644 +index 0000000000000000000000000000000000000000..0fe6243ea01f39fc43c4ca8897a70feddb7fb11d +--- /dev/null ++++ b/src/main/java/gg/pufferfish/pufferfish/util/AsyncExecutor.java +@@ -0,0 +1,73 @@ ++package gg.pufferfish.pufferfish.util; ++ ++import com.google.common.collect.Queues; ++import gg.pufferfish.pufferfish.PufferfishLogger; ++import java.util.Queue; ++import java.util.concurrent.locks.Condition; ++import java.util.concurrent.locks.Lock; ++import java.util.concurrent.locks.ReentrantLock; ++import java.util.logging.Level; ++ ++public class AsyncExecutor implements Runnable { ++ ++ private final Queue jobs = Queues.newArrayDeque(); ++ private final Lock mutex = new ReentrantLock(); ++ private final Condition cond = mutex.newCondition(); ++ private final Thread thread; ++ private volatile boolean killswitch = false; ++ ++ public AsyncExecutor(String threadName) { ++ this.thread = new Thread(this, threadName); ++ } ++ ++ public void start() { ++ thread.start(); ++ } ++ ++ public void kill() { ++ killswitch = true; ++ cond.signalAll(); ++ } ++ ++ public void submit(Runnable runnable) { ++ mutex.lock(); ++ try { ++ jobs.offer(runnable); ++ cond.signalAll(); ++ } finally { ++ mutex.unlock(); ++ } ++ } ++ ++ @Override ++ public void run() { ++ while (!killswitch) { ++ try { ++ Runnable runnable = takeRunnable(); ++ if (runnable != null) { ++ runnable.run(); ++ } ++ } catch (InterruptedException e) { ++ Thread.currentThread().interrupt(); ++ } catch (Exception e) { ++ PufferfishLogger.LOGGER.log(Level.SEVERE, e, () -> "Failed to execute async job for thread " + thread.getName()); ++ } ++ } ++ } ++ ++ private Runnable takeRunnable() throws InterruptedException { ++ mutex.lock(); ++ try { ++ while (jobs.isEmpty() && !killswitch) { ++ cond.await(); ++ } ++ ++ if (jobs.isEmpty()) return null; // We've set killswitch ++ ++ return jobs.remove(); ++ } finally { ++ mutex.unlock(); ++ } ++ } ++ ++} +diff --git a/src/main/java/gg/pufferfish/pufferfish/util/AsyncPlayerAreaMap.java b/src/main/java/gg/pufferfish/pufferfish/util/AsyncPlayerAreaMap.java +new file mode 100644 +index 0000000000000000000000000000000000000000..a93ee99c2399def1e221260547a3e6bce2d621fa +--- /dev/null ++++ b/src/main/java/gg/pufferfish/pufferfish/util/AsyncPlayerAreaMap.java +@@ -0,0 +1,31 @@ ++package gg.pufferfish.pufferfish.util; ++ ++import com.destroystokyo.paper.util.misc.PlayerAreaMap; ++import com.destroystokyo.paper.util.misc.PooledLinkedHashSets; ++import java.util.concurrent.ConcurrentHashMap; ++import net.minecraft.server.level.ServerPlayer; ++ ++public final class AsyncPlayerAreaMap extends PlayerAreaMap { ++ ++ public AsyncPlayerAreaMap() { ++ super(); ++ this.areaMap = new Long2ObjectOpenHashMapWrapper<>(new ConcurrentHashMap<>(1024, 0.7f)); ++ } ++ ++ public AsyncPlayerAreaMap(final PooledLinkedHashSets pooledHashSets) { ++ super(pooledHashSets); ++ this.areaMap = new Long2ObjectOpenHashMapWrapper<>(new ConcurrentHashMap<>(1024, 0.7f)); ++ } ++ ++ public AsyncPlayerAreaMap(final PooledLinkedHashSets pooledHashSets, final ChangeCallback addCallback, ++ final ChangeCallback removeCallback) { ++ this(pooledHashSets, addCallback, removeCallback, null); ++ } ++ ++ public AsyncPlayerAreaMap(final PooledLinkedHashSets pooledHashSets, final ChangeCallback addCallback, ++ final ChangeCallback removeCallback, final ChangeSourceCallback changeSourceCallback) { ++ super(pooledHashSets, addCallback, removeCallback, changeSourceCallback); ++ this.areaMap = new Long2ObjectOpenHashMapWrapper<>(new ConcurrentHashMap<>(1024, 0.7f)); ++ } ++ ++} +diff --git a/src/main/java/gg/pufferfish/pufferfish/util/IterableWrapper.java b/src/main/java/gg/pufferfish/pufferfish/util/IterableWrapper.java +new file mode 100644 +index 0000000000000000000000000000000000000000..c1929840254a3e6d721816f4a20415bea1742580 +--- /dev/null ++++ b/src/main/java/gg/pufferfish/pufferfish/util/IterableWrapper.java +@@ -0,0 +1,20 @@ ++package gg.pufferfish.pufferfish.util; ++ ++import java.util.Iterator; ++import org.jetbrains.annotations.NotNull; ++ ++public class IterableWrapper implements Iterable { ++ ++ private final Iterator iterator; ++ ++ public IterableWrapper(Iterator iterator) { ++ this.iterator = iterator; ++ } ++ ++ @NotNull ++ @Override ++ public Iterator iterator() { ++ return iterator; ++ } ++ ++} +diff --git a/src/main/java/gg/pufferfish/pufferfish/util/Long2ObjectOpenHashMapWrapper.java b/src/main/java/gg/pufferfish/pufferfish/util/Long2ObjectOpenHashMapWrapper.java +new file mode 100644 +index 0000000000000000000000000000000000000000..42cdc43d6b739973a0944f502089757247ee6c61 +--- /dev/null ++++ b/src/main/java/gg/pufferfish/pufferfish/util/Long2ObjectOpenHashMapWrapper.java +@@ -0,0 +1,40 @@ ++package gg.pufferfish.pufferfish.util; ++ ++import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap; ++import java.util.Map; ++import org.jetbrains.annotations.Nullable; ++ ++public class Long2ObjectOpenHashMapWrapper extends Long2ObjectOpenHashMap { ++ ++ private final Map backingMap; ++ ++ public Long2ObjectOpenHashMapWrapper(Map map) { ++ backingMap = map; ++ } ++ ++ @Override ++ public V put(Long key, V value) { ++ return backingMap.put(key, value); ++ } ++ ++ @Override ++ public V get(Object key) { ++ return backingMap.get(key); ++ } ++ ++ @Override ++ public V remove(Object key) { ++ return backingMap.remove(key); ++ } ++ ++ @Nullable ++ @Override ++ public V putIfAbsent(Long key, V value) { ++ return backingMap.putIfAbsent(key, value); ++ } ++ ++ @Override ++ public int size() { ++ return backingMap.size(); ++ } ++} +diff --git a/src/main/java/io/papermc/paper/configuration/GlobalConfiguration.java b/src/main/java/io/papermc/paper/configuration/GlobalConfiguration.java +index 8d442c5a498ecf288a0cc0c54889c6e2fda849ce..01bdf134fc21220ab7ecca51f2dcd51c0b466bba 100644 +--- a/src/main/java/io/papermc/paper/configuration/GlobalConfiguration.java ++++ b/src/main/java/io/papermc/paper/configuration/GlobalConfiguration.java +@@ -7,6 +7,7 @@ import net.kyori.adventure.text.Component; + import net.kyori.adventure.text.format.NamedTextColor; + import net.minecraft.network.protocol.Packet; + import net.minecraft.network.protocol.game.ServerboundPlaceRecipePacket; ++import org.bukkit.Bukkit; // Pufferfish + import org.checkerframework.checker.nullness.qual.Nullable; + import org.spongepowered.configurate.objectmapping.ConfigSerializable; + import org.spongepowered.configurate.objectmapping.meta.Comment; +@@ -16,6 +17,7 @@ import org.spongepowered.configurate.objectmapping.meta.Setting; + import java.util.List; + import java.util.Map; + import java.util.Objects; ++import java.util.logging.Level; // Pufferfish + + @SuppressWarnings({"CanBeFinal", "FieldCanBeLocal", "FieldMayBeFinal", "NotNullFieldNotInitialized", "InnerClassMayBeStatic"}) + public class GlobalConfiguration extends ConfigurationPart { +@@ -51,6 +53,7 @@ public class GlobalConfiguration extends ConfigurationPart { + + public class Timings extends ConfigurationPart.Post { + public boolean enabled = true; ++ public boolean reallyEnabled = false; + public boolean verbose = true; + public String url = "https://timings.aikar.co/"; + public boolean serverNamePrivacy = false; +@@ -64,6 +67,14 @@ public class GlobalConfiguration extends ConfigurationPart { + + @Override + public void postProcess() { ++ // Pufferfish start ++ if (enabled && !reallyEnabled) { ++ Bukkit.getLogger().log(Level.WARNING, "[Pufferfish] To improve performance, timings have been disabled by default"); ++ Bukkit.getLogger().log(Level.WARNING, "[Pufferfish] You can still use timings by using /timings on, but they will not start on server startup unless you set timings.really-enabled to true in paper.yml"); ++ Bukkit.getLogger().log(Level.WARNING, "[Pufferfish] If you would like to disable this message, either set timings.really-enabled to true or timings.enabled to false."); ++ } ++ enabled = reallyEnabled; ++ // Pufferfish end + MinecraftTimings.processConfig(this); + } + } +diff --git a/src/main/java/io/papermc/paper/util/MCUtil.java b/src/main/java/io/papermc/paper/util/MCUtil.java +index 6efb8b10f17c70b05128039376d254e6beda3841..57e8c6673c7cfe447a75f15506e8000062d813fe 100644 +--- a/src/main/java/io/papermc/paper/util/MCUtil.java ++++ b/src/main/java/io/papermc/paper/util/MCUtil.java +@@ -210,7 +210,7 @@ public final class MCUtil { + } + + public static long getCoordinateKey(final Entity entity) { +- return ((long)(MCUtil.fastFloor(entity.getZ()) >> 4) << 32) | ((MCUtil.fastFloor(entity.getX()) >> 4) & 0xFFFFFFFFL); ++ return ((long)(entity.blockPosition.getZ() >> 4) << 32) | ((entity.blockPosition.getX() >> 4) & 0xFFFFFFFFL); // Pufferfish - eliminate double->long cast in hotpath + } + + public static long getCoordinateKey(final ChunkPos pair) { +diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java +index 4450d825a5474da211f0e83f845d8c7129fa08aa..a4c64b1cc11955fb279b8ed0fb7d2668a7b90d2b 100644 +--- a/src/main/java/net/minecraft/server/MinecraftServer.java ++++ b/src/main/java/net/minecraft/server/MinecraftServer.java +@@ -313,6 +313,8 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop S spin(Function serverFactory) { + AtomicReference atomicreference = new AtomicReference(); + Thread thread = new io.papermc.paper.util.TickThread(() -> { // Paper - rewrite chunk system +@@ -1681,7 +1683,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop // Spigot - Spigot > // CraftBukkit - cb > vanilla! ++ return "Pufferfish"; // Pufferfish - Pufferfish > // Paper - Paper > // Spigot - Spigot > // CraftBukkit - cb > vanilla! + } + + public SystemReport fillSystemReport(SystemReport details) { +@@ -2266,6 +2268,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop passengers = parent.getPassengers(); ++ ++ for (int i = 0, size = passengers.size(); i < size; i++) { ++ Entity entity = passengers.get(i); ++ int range = entity.getType().clientTrackingRange() * 16; ++ range = org.spigotmc.TrackingRange.getEntityTrackingRange(entity, range); // Paper ++ ++ if (range > highest) { // Paper - we need the lowest range thanks to the fact that our tracker doesn't account for passenger logic // Tuinity - not anymore! ++ highest = range; ++ } ++ ++ highest = getHighestRange(entity, highest); ++ } ++ ++ return highest; ++ } ++ + private int getEffectiveRange() { + int i = this.range; ++ // Pufferfish start - remove iterators and streams ++ /* + Iterator iterator = this.entity.getIndirectPassengers().iterator(); + + while (iterator.hasNext()) { +@@ -1650,6 +1670,9 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider + i = j; + } + } ++ */ ++ i = getHighestRange(this.entity, i); ++ // Pufferfish end + + return this.scaledRange(i); + } +diff --git a/src/main/java/net/minecraft/server/level/ServerChunkCache.java b/src/main/java/net/minecraft/server/level/ServerChunkCache.java +index ca84eddbdb1e198b899750e5f6b3eafd25ce970f..8438354e482b6f892c3344eceff1abd23cfa128a 100644 +--- a/src/main/java/net/minecraft/server/level/ServerChunkCache.java ++++ b/src/main/java/net/minecraft/server/level/ServerChunkCache.java +@@ -77,6 +77,9 @@ public class ServerChunkCache extends ChunkSource { + + private final LevelChunk[] lastLoadedChunks = new LevelChunk[4 * 4]; + ++ public boolean firstRunSpawnCounts = true; // Pufferfish ++ public final java.util.concurrent.atomic.AtomicBoolean _pufferfish_spawnCountsReady = new java.util.concurrent.atomic.AtomicBoolean(false); // Pufferfish - optimize countmobs ++ + private static int getChunkCacheKey(int x, int z) { + return x & 3 | ((z & 3) << 2); + } +@@ -703,6 +706,7 @@ public class ServerChunkCache extends ChunkSource { + ProfilerFiller gameprofilerfiller = this.level.getProfiler(); + + gameprofilerfiller.push("pollingChunks"); ++ this.level.resetIceAndSnowTick(); // Pufferfish - reset ice & snow tick random + int k = this.level.getGameRules().getInt(GameRules.RULE_RANDOMTICKING); + boolean flag1 = level.ticksPerSpawnCategory.getLong(org.bukkit.entity.SpawnCategory.ANIMAL) != 0L && worlddata.getGameTime() % level.ticksPerSpawnCategory.getLong(org.bukkit.entity.SpawnCategory.ANIMAL) == 0L; // CraftBukkit + +@@ -712,18 +716,25 @@ public class ServerChunkCache extends ChunkSource { + // Paper start - per player mob spawning + NaturalSpawner.SpawnState spawnercreature_d; // moved down + if ((this.spawnFriendlies || this.spawnEnemies) && this.chunkMap.playerMobDistanceMap != null) { // don't count mobs when animals and monsters are disabled +- // re-set mob counts +- for (ServerPlayer player : this.level.players) { +- Arrays.fill(player.mobCounts, 0); ++ // Pufferfish start - moved down when async processing ++ if (!gg.pufferfish.pufferfish.PufferfishConfig.enableAsyncMobSpawning) { ++ // re-set mob counts ++ for (ServerPlayer player : this.level.players) { ++ Arrays.fill(player.mobCounts, 0); ++ } ++ lastSpawnState = NaturalSpawner.createState(l, this.level.getAllEntities(), this::getFullChunk, null, true); + } +- spawnercreature_d = NaturalSpawner.createState(l, this.level.getAllEntities(), this::getFullChunk, null, true); ++ // Pufferfish end + } else { +- spawnercreature_d = NaturalSpawner.createState(l, this.level.getAllEntities(), this::getFullChunk, this.chunkMap.playerMobDistanceMap == null ? new LocalMobCapCalculator(this.chunkMap) : null, false); ++ // Pufferfish start - this is only implemented for per-player mob spawning so this makes everything work if this setting is disabled. ++ lastSpawnState = NaturalSpawner.createState(l, this.level.getAllEntities(), this::getFullChunk, this.chunkMap.playerMobDistanceMap == null ? new LocalMobCapCalculator(this.chunkMap) : null, false); ++ _pufferfish_spawnCountsReady.set(true); ++ // Pufferfish end + } + // Paper end + this.level.timings.countNaturalMobs.stopTiming(); // Paper - timings + +- this.lastSpawnState = spawnercreature_d; ++ //this.lastSpawnState = spawnercreature_d; // Pufferfish - this is managed asynchronously + gameprofilerfiller.popPush("filteringLoadedChunks"); + // Paper - moved down + this.level.timings.chunkTicks.startTiming(); // Paper +@@ -761,8 +772,8 @@ public class ServerChunkCache extends ChunkSource { + + if ((true || this.level.isNaturalSpawningAllowed(chunkcoordintpair)) && this.chunkMap.anyPlayerCloseEnoughForSpawning(holder, chunkcoordintpair, false)) { // Paper - optimise anyPlayerCloseEnoughForSpawning // Paper - the chunk is known ticking + chunk1.incrementInhabitedTime(j); +- if (flag2 && (this.spawnEnemies || this.spawnFriendlies) && this.level.getWorldBorder().isWithinBounds(chunkcoordintpair) && this.chunkMap.anyPlayerCloseEnoughForSpawning(holder, chunkcoordintpair, true)) { // Spigot // Paper - optimise anyPlayerCloseEnoughForSpawning & optimise chunk tick iteration +- NaturalSpawner.spawnForChunk(this.level, chunk1, spawnercreature_d, this.spawnFriendlies, this.spawnEnemies, flag1); ++ if (flag2 && (!gg.pufferfish.pufferfish.PufferfishConfig.enableAsyncMobSpawning || _pufferfish_spawnCountsReady.get()) && (this.spawnEnemies || this.spawnFriendlies) && this.level.getWorldBorder().isWithinBounds(chunkcoordintpair) && this.chunkMap.anyPlayerCloseEnoughForSpawning(holder, chunkcoordintpair, true)) { // Spigot // Paper - optimise anyPlayerCloseEnoughForSpawning & optimise chunk tick iteration ++ NaturalSpawner.spawnForChunk(this.level, chunk1, lastSpawnState, this.spawnFriendlies, this.spawnEnemies, flag1); // Pufferfish + } + + if (true || this.level.shouldTickBlocksAt(chunkcoordintpair.toLong())) { // Paper - the chunk is known ticking +@@ -824,6 +835,30 @@ public class ServerChunkCache extends ChunkSource { + } + // Paper end - controlled flush for entity tracker packets + } ++ ++ // Pufferfish start - optimize mob spawning ++ if (gg.pufferfish.pufferfish.PufferfishConfig.enableAsyncMobSpawning) { ++ for (ServerPlayer player : this.level.players) { ++ Arrays.fill(player.mobCounts, 0); ++ } ++ if (firstRunSpawnCounts) { ++ firstRunSpawnCounts = false; ++ _pufferfish_spawnCountsReady.set(true); ++ } ++ if (chunkMap.playerMobDistanceMap != null && _pufferfish_spawnCountsReady.getAndSet(false)) { ++ net.minecraft.server.MinecraftServer.getServer().mobSpawnExecutor.submit(() -> { ++ int mapped = distanceManager.getNaturalSpawnChunkCount(); ++ io.papermc.paper.util.maplist.IteratorSafeOrderedReferenceSet.Iterator objectiterator = ++ level.entityTickList.entities.iterator(io.papermc.paper.util.maplist.IteratorSafeOrderedReferenceSet.ITERATOR_FLAG_SEE_ADDITIONS); ++ gg.pufferfish.pufferfish.util.IterableWrapper wrappedIterator = ++ new gg.pufferfish.pufferfish.util.IterableWrapper<>(objectiterator); ++ lastSpawnState = NaturalSpawner.createState(mapped, wrappedIterator, this::getFullChunk, null, true); ++ objectiterator.finishedIterating(); ++ _pufferfish_spawnCountsReady.set(true); ++ }); ++ } ++ } ++ // Pufferfish end + } + + private void getFullChunk(long pos, Consumer chunkConsumer) { +diff --git a/src/main/java/net/minecraft/server/level/ServerEntity.java b/src/main/java/net/minecraft/server/level/ServerEntity.java +index b7fd8e70413c38923d0719aff803449e392383ac..d5cb594f0b17ec9dc1a19cdb99bba553e70171be 100644 +--- a/src/main/java/net/minecraft/server/level/ServerEntity.java ++++ b/src/main/java/net/minecraft/server/level/ServerEntity.java +@@ -185,6 +185,7 @@ public class ServerEntity { + boolean flag6 = k < -32768L || k > 32767L || l < -32768L || l > 32767L || i1 < -32768L || i1 > 32767L; + + if (!flag6 && this.teleportDelay <= 400 && !this.wasRiding && this.wasOnGround == this.entity.isOnGround() && !(io.papermc.paper.configuration.GlobalConfiguration.get().collisions.sendFullPosForHardCollidingEntities && this.entity.hardCollides())) { // Paper - send full pos for hard colliding entities to prevent collision problems due to desync ++ if (flag2 || flag3 || this.entity instanceof AbstractArrow) { // Pufferfish + if ((!flag2 || !flag3) && !(this.entity instanceof AbstractArrow)) { + if (flag2) { + packet1 = new ClientboundMoveEntityPacket.Pos(this.entity.getId(), (short) ((int) k), (short) ((int) l), (short) ((int) i1), this.entity.isOnGround()); +@@ -198,6 +199,7 @@ public class ServerEntity { + flag4 = true; + flag5 = true; + } ++ } // Pufferfish + } else { + this.wasOnGround = this.entity.isOnGround(); + this.teleportDelay = 0; +diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java +index 5a5ff40df37db9cbd53c584ed26a3ce4888b29c0..ff2862bf1f511196d1e911e2584262ed728e9a81 100644 +--- a/src/main/java/net/minecraft/server/level/ServerLevel.java ++++ b/src/main/java/net/minecraft/server/level/ServerLevel.java +@@ -709,6 +709,7 @@ public class ServerLevel extends Level implements WorldGenLevel { + org.spigotmc.ActivationRange.activateEntities(this); // Spigot + timings.entityTick.startTiming(); // Spigot + this.entityTickList.forEach((entity) -> { ++ entity.activatedPriorityReset = false; // Pufferfish - DAB + if (!entity.isRemoved()) { + if (false && this.shouldDiscardEntity(entity)) { // CraftBukkit - We prevent spawning in general, so this butchering is not needed + entity.discard(); +@@ -728,7 +729,20 @@ public class ServerLevel extends Level implements WorldGenLevel { + } + + gameprofilerfiller.push("tick"); +- this.guardEntityTick(this::tickNonPassenger, entity); ++ // Pufferfish start - copied from this.guardEntityTick ++ try { ++ this.tickNonPassenger(entity); // Pufferfish - changed ++ MinecraftServer.getServer().executeMidTickTasks(); // Tuinity - execute chunk tasks mid tick ++ } catch (Throwable throwable) { ++ if (throwable instanceof ThreadDeath) throw throwable; // Paper ++ // Paper start - Prevent tile entity and entity crashes ++ final String msg = String.format("Entity threw exception at %s:%s,%s,%s", entity.level.getWorld().getName(), entity.getX(), entity.getY(), entity.getZ()); ++ MinecraftServer.LOGGER.error(msg, throwable); ++ getCraftServer().getPluginManager().callEvent(new com.destroystokyo.paper.event.server.ServerExceptionEvent(new com.destroystokyo.paper.exception.ServerInternalException(msg, throwable))); ++ entity.discard(); ++ // Paper end ++ } ++ // Pufferfish end + gameprofilerfiller.pop(); + } + } +@@ -793,9 +807,11 @@ public class ServerLevel extends Level implements WorldGenLevel { + } + // Paper start - optimise random block ticking + private final BlockPos.MutableBlockPos chunkTickMutablePosition = new BlockPos.MutableBlockPos(); +- private final io.papermc.paper.util.math.ThreadUnsafeRandom randomTickRandom = new io.papermc.paper.util.math.ThreadUnsafeRandom(this.random.nextLong()); ++ // private final io.papermc.paper.util.math.ThreadUnsafeRandom randomTickRandom = new io.papermc.paper.util.math.ThreadUnsafeRandom(); // Pufferfish - moved to super + // Paper end + ++ private int currentIceAndSnowTick = 0; protected void resetIceAndSnowTick() { this.currentIceAndSnowTick = this.randomTickRandom.nextInt(16); } // Pufferfish ++ + public void tickChunk(LevelChunk chunk, int randomTickSpeed) { + ChunkPos chunkcoordintpair = chunk.getPos(); + boolean flag = this.isRaining(); +@@ -806,7 +822,7 @@ public class ServerLevel extends Level implements WorldGenLevel { + gameprofilerfiller.push("thunder"); + final BlockPos.MutableBlockPos blockposition = this.chunkTickMutablePosition; // Paper - use mutable to reduce allocation rate, final to force compile fail on change + +- if (!this.paperConfig().environment.disableThunder && flag && this.isThundering() && this.spigotConfig.thunderChance > 0 && this.random.nextInt(this.spigotConfig.thunderChance) == 0) { // Spigot // Paper - disable thunder ++ if (!this.paperConfig().environment.disableThunder && flag && this.isThundering() && this.spigotConfig.thunderChance > 0 && /*this.random.nextInt(this.spigotConfig.thunderChance) == 0 &&*/ chunk.shouldDoLightning(this.random)) { // Spigot // Paper - disable thunder // Pufferfish - replace random with shouldDoLightning + blockposition.set(this.findLightningTargetAround(this.getBlockRandomPos(j, 0, k, 15))); // Paper + if (this.isRainingAt(blockposition)) { + DifficultyInstance difficultydamagescaler = this.getCurrentDifficultyAt(blockposition); +@@ -836,7 +852,7 @@ public class ServerLevel extends Level implements WorldGenLevel { + gameprofilerfiller.popPush("iceandsnow"); + int l; + +- if (!this.paperConfig().environment.disableIceAndSnow && this.random.nextInt(16) == 0) { // Paper - Disable ice and snow ++ if (!this.paperConfig().environment.disableIceAndSnow && (this.currentIceAndSnowTick++ & 15) == 0) { // Paper - Disable ice and snow // Paper - optimise random ticking // Pufferfish - optimize further random ticking + // Paper start - optimise chunk ticking + this.getRandomBlockPosition(j, 0, k, 15, blockposition); + int normalY = chunk.getHeight(Heightmap.Types.MOTION_BLOCKING, blockposition.getX() & 15, blockposition.getZ() & 15) + 1; +diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java +index 2d8488b9aa088b6d5f0c7e557b8ad0b29bc4cd88..24d48fb4a63c2db19c7f957ad2260415fe1db9fe 100644 +--- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java ++++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java +@@ -1206,6 +1206,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic + + @Override + public void handleEditBook(ServerboundEditBookPacket packet) { ++ if (!gg.pufferfish.pufferfish.PufferfishConfig.enableBooks && !this.player.getBukkitEntity().hasPermission("pufferfish.usebooks")) return; // Pufferfish + // Paper start + if (!this.cserver.isPrimaryThread()) { + List pageList = packet.getPages(); +@@ -2346,6 +2347,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic + } + + private boolean updateChatOrder(Instant timestamp) { ++ if (gg.pufferfish.pufferfish.PufferfishConfig.disableOutOfOrderChat) return true; + Instant instant1; + + do { +diff --git a/src/main/java/net/minecraft/world/CompoundContainer.java b/src/main/java/net/minecraft/world/CompoundContainer.java +index 241fec02e6869c638d3a160819b32173a081467b..6a8f9e8f5bf108674c47018def28906e2d0a729c 100644 +--- a/src/main/java/net/minecraft/world/CompoundContainer.java ++++ b/src/main/java/net/minecraft/world/CompoundContainer.java +@@ -1,5 +1,6 @@ + package net.minecraft.world; + ++import net.minecraft.core.Direction; // Pufferfish + import net.minecraft.world.entity.player.Player; + import net.minecraft.world.item.ItemStack; + +@@ -64,6 +65,23 @@ public class CompoundContainer implements Container { + this.container2 = second; + } + ++ // Pufferfish start ++ @Override ++ public boolean hasEmptySlot(Direction enumdirection) { ++ return this.container1.hasEmptySlot(null) || this.container2.hasEmptySlot(null); ++ } ++ ++ @Override ++ public boolean isCompletelyFull(Direction enumdirection) { ++ return this.container1.isCompletelyFull(null) && this.container2.isCompletelyFull(null); ++ } ++ ++ @Override ++ public boolean isCompletelyEmpty(Direction enumdirection) { ++ return this.container1.isCompletelyEmpty(null) && this.container2.isCompletelyEmpty(null); ++ } ++ // Pufferfish end ++ + @Override + public int getContainerSize() { + return this.container1.getContainerSize() + this.container2.getContainerSize(); +diff --git a/src/main/java/net/minecraft/world/Container.java b/src/main/java/net/minecraft/world/Container.java +index 04b1531572e8fff1e46fe1c94e7fc863841e0f66..47ddc42f2b63d9d3fae5ae6ea93d418352d76c94 100644 +--- a/src/main/java/net/minecraft/world/Container.java ++++ b/src/main/java/net/minecraft/world/Container.java +@@ -3,6 +3,8 @@ package net.minecraft.world; + import java.util.Set; + import java.util.function.Predicate; + import net.minecraft.core.BlockPos; ++ ++import net.minecraft.core.Direction; // Pufferfish + import net.minecraft.world.entity.player.Player; + import net.minecraft.world.item.Item; + import net.minecraft.world.item.ItemStack; +@@ -13,6 +15,63 @@ import org.bukkit.craftbukkit.entity.CraftHumanEntity; + // CraftBukkit end + + public interface Container extends Clearable { ++ // Pufferfish start - allow the inventory to override and optimize these frequent calls ++ default boolean hasEmptySlot(@org.jetbrains.annotations.Nullable Direction enumdirection) { // there is a slot with 0 items in it ++ if (this instanceof WorldlyContainer worldlyContainer) { ++ for (int i : worldlyContainer.getSlotsForFace(enumdirection)) { ++ if (this.getItem(i).isEmpty()) { ++ return true; ++ } ++ } ++ } else { ++ int size = this.getContainerSize(); ++ for (int i = 0; i < size; i++) { ++ if (this.getItem(i).isEmpty()) { ++ return true; ++ } ++ } ++ } ++ return false; ++ } ++ ++ default boolean isCompletelyFull(@org.jetbrains.annotations.Nullable Direction enumdirection) { // every stack is maxed ++ if (this instanceof WorldlyContainer worldlyContainer) { ++ for (int i : worldlyContainer.getSlotsForFace(enumdirection)) { ++ ItemStack itemStack = this.getItem(i); ++ if (itemStack.getCount() < itemStack.getMaxStackSize()) { ++ return false; ++ } ++ } ++ } else { ++ int size = this.getContainerSize(); ++ for (int i = 0; i < size; i++) { ++ ItemStack itemStack = this.getItem(i); ++ if (itemStack.getCount() < itemStack.getMaxStackSize()) { ++ return false; ++ } ++ } ++ } ++ return true; ++ } ++ ++ default boolean isCompletelyEmpty(@org.jetbrains.annotations.Nullable Direction enumdirection) { ++ if (this instanceof WorldlyContainer worldlyContainer) { ++ for (int i : worldlyContainer.getSlotsForFace(enumdirection)) { ++ if (!this.getItem(i).isEmpty()) { ++ return false; ++ } ++ } ++ } else { ++ int size = this.getContainerSize(); ++ for (int i = 0; i < size; i++) { ++ if (!this.getItem(i).isEmpty()) { ++ return false; ++ } ++ } ++ } ++ return true; ++ } ++ // Pufferfish end + + int LARGE_MAX_STACK_SIZE = 64; + int DEFAULT_DISTANCE_LIMIT = 8; +diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java +index 9a1e8589e6b371869b2199650172d61ae186c907..6e8a76d64418c214fcdd021f23bdfaf9827470a9 100644 +--- a/src/main/java/net/minecraft/world/entity/Entity.java ++++ b/src/main/java/net/minecraft/world/entity/Entity.java +@@ -291,7 +291,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { + public double yo; + public double zo; + private Vec3 position; +- private BlockPos blockPosition; ++ public BlockPos blockPosition; // Pufferfish - private->public + private ChunkPos chunkPosition; + private Vec3 deltaMovement; + private float yRot; +@@ -415,6 +415,12 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { + return this.originWorld; + } + // Paper end ++ // Pufferfish start ++ public boolean activatedPriorityReset = false; // DAB ++ public int activatedPriority = gg.pufferfish.pufferfish.PufferfishConfig.maximumActivationPrio; // golf score ++ public final BlockPos.MutableBlockPos cachedBlockPos = new BlockPos.MutableBlockPos(); // used where needed ++ // Pufferfish end ++ + public float getBukkitYaw() { + return this.yRot; + } +@@ -489,17 +495,36 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { + this.isLegacyTrackingEntity = isLegacyTrackingEntity; + } + ++ private org.spigotmc.TrackingRange.TrackingRangeType getFurthestEntity(Entity entity, net.minecraft.server.level.ChunkMap chunkMap, org.spigotmc.TrackingRange.TrackingRangeType type, int range) { ++ List passengers = entity.getPassengers(); ++ for (int i = 0, size = passengers.size(); i < size; i++) { ++ Entity passenger = passengers.get(i); ++ org.spigotmc.TrackingRange.TrackingRangeType passengerType = passenger.trackingRangeType; ++ int passengerRange = chunkMap.getEntityTrackerRange(passengerType.ordinal()); ++ if (passengerRange > range) { ++ type = passengerType; ++ range = passengerRange; ++ } ++ ++ type = this.getFurthestEntity(passenger, chunkMap, type, range); ++ } ++ ++ return type; ++ } ++ + public final com.destroystokyo.paper.util.misc.PooledLinkedHashSets.PooledObjectLinkedOpenHashSet getPlayersInTrackRange() { + // determine highest range of passengers + if (this.passengers.isEmpty()) { + return ((ServerLevel)this.level).getChunkSource().chunkMap.playerEntityTrackerTrackMaps[this.trackingRangeType.ordinal()] + .getObjectsInRange(MCUtil.getCoordinateKey(this)); + } +- Iterable passengers = this.getIndirectPassengers(); ++ //Iterable passengers = this.getIndirectPassengers(); // Pufferfish + net.minecraft.server.level.ChunkMap chunkMap = ((ServerLevel)this.level).getChunkSource().chunkMap; + org.spigotmc.TrackingRange.TrackingRangeType type = this.trackingRangeType; + int range = chunkMap.getEntityTrackerRange(type.ordinal()); + ++ // Pufferfish start - use getFurthestEntity to skip getIndirectPassengers ++ /* + for (Entity passenger : passengers) { + org.spigotmc.TrackingRange.TrackingRangeType passengerType = passenger.trackingRangeType; + int passengerRange = chunkMap.getEntityTrackerRange(passengerType.ordinal()); +@@ -508,6 +533,9 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { + range = passengerRange; + } + } ++ */ ++ type = this.getFurthestEntity(this, chunkMap, type, range); ++ // Pufferfish end + + return chunkMap.playerEntityTrackerTrackMaps[type.ordinal()].getObjectsInRange(MCUtil.getCoordinateKey(this)); + } +@@ -789,6 +817,12 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { + // CraftBukkit end + + public void baseTick() { ++ // Pufferfish start - entity TTL ++ if (type != EntityType.PLAYER && type.ttl >= 0 && this.tickCount >= type.ttl) { ++ remove(RemovalReason.DISCARDED); ++ return; ++ } ++ // Pufferfish end - entity TTL + this.level.getProfiler().push("entityBaseTick"); + if (firstTick && this instanceof net.minecraft.world.entity.NeutralMob neutralMob) neutralMob.tickInitialPersistentAnger(level); // Paper - Update last hurt when ticking + this.feetBlockState = null; +@@ -4156,16 +4190,18 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { + } + + public boolean updateFluidHeightAndDoFluidPushing(TagKey tag, double speed) { +- if (this.touchingUnloadedChunk()) { ++ if (false && this.touchingUnloadedChunk()) { // Pufferfish - cost of a lookup here is the same cost as below, so skip + return false; + } else { + AABB axisalignedbb = this.getBoundingBox().deflate(0.001D); +- int i = Mth.floor(axisalignedbb.minX); +- int j = Mth.ceil(axisalignedbb.maxX); +- int k = Mth.floor(axisalignedbb.minY); +- int l = Mth.ceil(axisalignedbb.maxY); +- int i1 = Mth.floor(axisalignedbb.minZ); +- int j1 = Mth.ceil(axisalignedbb.maxZ); ++ // Pufferfish start - rename ++ int minBlockX = Mth.floor(axisalignedbb.minX); ++ int maxBlockX = Mth.ceil(axisalignedbb.maxX); ++ int minBlockY = Mth.floor(axisalignedbb.minY); ++ int maxBlockY = Mth.ceil(axisalignedbb.maxY); ++ int minBlockZ = Mth.floor(axisalignedbb.minZ); ++ int maxBlockZ = Mth.ceil(axisalignedbb.maxZ); ++ // Pufferfish end + double d1 = 0.0D; + boolean flag = this.isPushedByFluid(); + boolean flag1 = false; +@@ -4173,14 +4209,61 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { + int k1 = 0; + BlockPos.MutableBlockPos blockposition_mutableblockposition = new BlockPos.MutableBlockPos(); + +- for (int l1 = i; l1 < j; ++l1) { +- for (int i2 = k; i2 < l; ++i2) { +- for (int j2 = i1; j2 < j1; ++j2) { +- blockposition_mutableblockposition.set(l1, i2, j2); +- FluidState fluid = this.level.getFluidState(blockposition_mutableblockposition); ++ // Pufferfish start - based off CollisionUtil.getCollisionsForBlocksOrWorldBorder ++ final int minSection = io.papermc.paper.util.WorldUtil.getMinSection(this.level); ++ final int maxSection = io.papermc.paper.util.WorldUtil.getMaxSection(this.level); ++ final int minBlock = minSection << 4; ++ final int maxBlock = (maxSection << 4) | 15; ++ ++ // special cases: ++ if (minBlockY > maxBlock || maxBlockY < minBlock) { ++ // no point in checking ++ return false; ++ } ++ ++ int minYIterate = Math.max(minBlock, minBlockY); ++ int maxYIterate = Math.min(maxBlock, maxBlockY); ++ ++ int minChunkX = minBlockX >> 4; ++ int maxChunkX = maxBlockX >> 4; ++ ++ int minChunkZ = minBlockZ >> 4; ++ int maxChunkZ = maxBlockZ >> 4; ++ ++ for (int currChunkZ = minChunkZ; currChunkZ <= maxChunkZ; ++currChunkZ) { ++ int minZ = currChunkZ == minChunkZ ? minBlockZ & 15 : 0; // coordinate in chunk ++ int maxZ = currChunkZ == maxChunkZ ? maxBlockZ & 15 : 16; // coordinate in chunk ++ ++ for (int currChunkX = minChunkX; currChunkX <= maxChunkX; ++currChunkX) { ++ int minX = currChunkX == minChunkX ? minBlockX & 15 : 0; // coordinate in chunk ++ int maxX = currChunkX == maxChunkX ? maxBlockX & 15 : 16; // coordinate in chunk ++ ++ net.minecraft.world.level.chunk.ChunkAccess chunk = this.level.getChunkIfLoadedImmediately(currChunkX, currChunkZ); ++ if (chunk == null) { ++ return false; // if we're touching an unloaded chunk then it's false ++ } ++ ++ net.minecraft.world.level.chunk.LevelChunkSection[] sections = chunk.getSections(); ++ ++ for (int currY = minYIterate; currY < maxYIterate; ++currY) { ++ net.minecraft.world.level.chunk.LevelChunkSection section = sections[(currY >> 4) - minSection]; ++ ++ if (section == null || section.hasOnlyAir() || section.fluidStateCount == 0) { // if no fluids, nothing in this section ++ // empty ++ // skip to next section ++ currY = (currY & ~(15)) + 15; // increment by 15: iterator loop increments by the extra one ++ continue; ++ } ++ ++ net.minecraft.world.level.chunk.PalettedContainer blocks = section.states; ++ ++ for (int currZ = minZ; currZ < maxZ; ++currZ) { ++ for (int currX = minX; currX < maxX; ++currX) { ++ FluidState fluid = blocks.get(currX & 15, currY & 15, currZ & 15).getFluidState(); + + if (fluid.is(tag)) { +- double d2 = (double) ((float) i2 + fluid.getHeight(this.level, blockposition_mutableblockposition)); ++ blockposition_mutableblockposition.set((currChunkX << 4) + currX, currY, (currChunkZ << 4) + currZ); ++ double d2 = (double) ((float) currY + fluid.getHeight(this.level, blockposition_mutableblockposition)); + + if (d2 >= axisalignedbb.minY) { + flag1 = true; +@@ -4202,9 +4285,12 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { + // CraftBukkit end + } + } ++ } ++ } + } + } + } ++ // Pufferfish end + + if (vec3d.length() > 0.0D) { + if (k1 > 0) { +diff --git a/src/main/java/net/minecraft/world/entity/EntityType.java b/src/main/java/net/minecraft/world/entity/EntityType.java +index ceacc0d383e2ee674783d3c0a7df0a951595faca..8af0918d3a62de58a4b2af55022c812bb0e46092 100644 +--- a/src/main/java/net/minecraft/world/entity/EntityType.java ++++ b/src/main/java/net/minecraft/world/entity/EntityType.java +@@ -300,6 +300,8 @@ public class EntityType implements FeatureElement, EntityTypeT + private final boolean canSpawnFarFromPlayer; + private final int clientTrackingRange; + private final int updateInterval; ++ public boolean dabEnabled = false; // Pufferfish ++ public int ttl = -1; // Pufferfish + @Nullable + private String descriptionId; + @Nullable +diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java +index dcfb71b5a53df789e366fea2080921d677549a2e..791f672b30f2a4d3b329e2ce0f4fb9c2ca627b01 100644 +--- a/src/main/java/net/minecraft/world/entity/LivingEntity.java ++++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java +@@ -141,7 +141,6 @@ import org.bukkit.event.entity.EntityTeleportEvent; + import org.bukkit.event.player.PlayerItemConsumeEvent; + // CraftBukkit end + +-import co.aikar.timings.MinecraftTimings; // Paper + + public abstract class LivingEntity extends Entity implements Attackable { + +@@ -397,7 +396,7 @@ public abstract class LivingEntity extends Entity implements Attackable { + boolean flag = this instanceof net.minecraft.world.entity.player.Player; + + if (!this.level.isClientSide) { +- if (this.isInWall()) { ++ if ((!gg.pufferfish.pufferfish.PufferfishConfig.enableSuffocationOptimization || (tickCount % 10 == 0 && couldPossiblyBeHurt(1.0F))) && this.isInWall()) { // Pufferfish - optimize suffocation + this.hurt(this.damageSources().inWall(), 1.0F); + } else if (flag && !this.level.getWorldBorder().isWithinBounds(this.getBoundingBox())) { + double d0 = this.level.getWorldBorder().getDistanceToBorder(this) + this.level.getWorldBorder().getDamageSafeZone(); +@@ -1321,6 +1320,15 @@ public abstract class LivingEntity extends Entity implements Attackable { + return this.getHealth() <= 0.0F; + } + ++ // Pufferfish start - optimize suffocation ++ public boolean couldPossiblyBeHurt(float amount) { ++ if ((float) this.invulnerableTime > (float) this.invulnerableDuration / 2.0F && amount <= this.lastHurt) { ++ return false; ++ } ++ return true; ++ } ++ // Pufferfish end ++ + @Override + public boolean hurt(DamageSource source, float amount) { + if (this.isInvulnerableTo(source)) { +@@ -1929,6 +1937,20 @@ public abstract class LivingEntity extends Entity implements Attackable { + return this.lastClimbablePos; + } + ++ ++ // Pufferfish start ++ private boolean cachedOnClimable = false; ++ private BlockPos lastClimbingPosition = null; ++ ++ public boolean onClimableCached() { ++ if (!this.blockPosition().equals(this.lastClimbingPosition)) { ++ this.cachedOnClimable = this.onClimbable(); ++ this.lastClimbingPosition = this.blockPosition(); ++ } ++ return this.cachedOnClimable; ++ } ++ // Pufferfish end ++ + public boolean onClimbable() { + if (this.isSpectator()) { + return false; +@@ -3609,7 +3631,10 @@ public abstract class LivingEntity extends Entity implements Attackable { + Vec3 vec3d1 = new Vec3(entity.getX(), entity.getEyeY(), entity.getZ()); + + // Paper - diff on change - used in CraftLivingEntity#hasLineOfSight(Location) and CraftWorld#lineOfSightExists +- return vec3d1.distanceToSqr(vec3d) > 128D * 128D ? false : this.level.clip(new ClipContext(vec3d, vec3d1, ClipContext.Block.COLLIDER, ClipContext.Fluid.NONE, this)).getType() == HitResult.Type.MISS; // Paper - use distanceToSqr ++ // Pufferfish start ++ //return vec3d1.distanceToSqr(vec3d) > 128D * 128D ? false : this.level.clip(new ClipContext(vec3d, vec3d1, ClipContext.Block.COLLIDER, ClipContext.Fluid.NONE, this)).getType() == HitResult.Type.MISS; // Paper - use distanceToSqr ++ return vec3d1.distanceToSqr(vec3d) > 128D * 128D ? false : this.level.rayTraceDirect(vec3d, vec3d1, net.minecraft.world.phys.shapes.CollisionContext.of(this)) == net.minecraft.world.phys.BlockHitResult.Type.MISS; ++ // Pufferfish end + } + } + +diff --git a/src/main/java/net/minecraft/world/entity/Mob.java b/src/main/java/net/minecraft/world/entity/Mob.java +index 02cb6b8c1d59855ff4a8aad3024fe12007eca0ee..636e601b004a412d02e5be86e97d489b52c28e1b 100644 +--- a/src/main/java/net/minecraft/world/entity/Mob.java ++++ b/src/main/java/net/minecraft/world/entity/Mob.java +@@ -215,14 +215,16 @@ public abstract class Mob extends LivingEntity implements Targeting { + return this.lookControl; + } + ++ int _pufferfish_inactiveTickDisableCounter = 0; // Pufferfish - throttle inactive goal selector ticking + // Paper start + @Override + public void inactiveTick() { + super.inactiveTick(); +- if (this.goalSelector.inactiveTick()) { ++ boolean isThrottled = gg.pufferfish.pufferfish.PufferfishConfig.throttleInactiveGoalSelectorTick && _pufferfish_inactiveTickDisableCounter++ % 20 != 0; // Pufferfish - throttle inactive goal selector ticking ++ if (this.goalSelector.inactiveTick(this.activatedPriority, true) && !isThrottled) { // Pufferfish - pass activated priroity // Pufferfish - throttle inactive goal selector ticking + this.goalSelector.tick(); + } +- if (this.targetSelector.inactiveTick()) { ++ if (this.targetSelector.inactiveTick(this.activatedPriority, true)) { // Pufferfish - pass activated priority + this.targetSelector.tick(); + } + } +@@ -907,16 +909,20 @@ public abstract class Mob extends LivingEntity implements Targeting { + + if (i % 2 != 0 && this.tickCount > 1) { + this.level.getProfiler().push("targetSelector"); ++ if (this.targetSelector.inactiveTick(this.activatedPriority, false)) // Pufferfish - use this to alternate ticking + this.targetSelector.tickRunningGoals(false); + this.level.getProfiler().pop(); + this.level.getProfiler().push("goalSelector"); ++ if (this.goalSelector.inactiveTick(this.activatedPriority, false)) // Pufferfish - use this to alternate ticking + this.goalSelector.tickRunningGoals(false); + this.level.getProfiler().pop(); + } else { + this.level.getProfiler().push("targetSelector"); ++ if (this.targetSelector.inactiveTick(this.activatedPriority, false)) // Pufferfish - use this to alternate ticking + this.targetSelector.tick(); + this.level.getProfiler().pop(); + this.level.getProfiler().push("goalSelector"); ++ if (this.goalSelector.inactiveTick(this.activatedPriority, false)) // Pufferfish - use this to alternate ticking + this.goalSelector.tick(); + this.level.getProfiler().pop(); + } +diff --git a/src/main/java/net/minecraft/world/entity/ai/attributes/AttributeMap.java b/src/main/java/net/minecraft/world/entity/ai/attributes/AttributeMap.java +index dd1102d5291ef6f18e82400a6d8a0a376cc071e9..e283eb57c25f7de222f9d09dca851169f5f6e488 100644 +--- a/src/main/java/net/minecraft/world/entity/ai/attributes/AttributeMap.java ++++ b/src/main/java/net/minecraft/world/entity/ai/attributes/AttributeMap.java +@@ -23,9 +23,11 @@ public class AttributeMap { + private final Map attributes = Maps.newHashMap(); + private final Set dirtyAttributes = Sets.newHashSet(); + private final AttributeSupplier supplier; ++ private final java.util.function.Function createInstance; // Pufferfish + + public AttributeMap(AttributeSupplier defaultAttributes) { + this.supplier = defaultAttributes; ++ this.createInstance = attribute -> this.supplier.createInstance(this::onAttributeModified, attribute); // Pufferfish + } + + private void onAttributeModified(AttributeInstance instance) { +@@ -45,11 +47,10 @@ public class AttributeMap { + }).collect(Collectors.toList()); + } + ++ + @Nullable + public AttributeInstance getInstance(Attribute attribute) { +- return this.attributes.computeIfAbsent(attribute, (attributex) -> { +- return this.supplier.createInstance(this::onAttributeModified, attributex); +- }); ++ return this.attributes.computeIfAbsent(attribute, this.createInstance); // Pufferfish - cache lambda, as for some reason java allocates it anyways + } + + @Nullable +diff --git a/src/main/java/net/minecraft/world/entity/ai/behavior/AcquirePoi.java b/src/main/java/net/minecraft/world/entity/ai/behavior/AcquirePoi.java +index d4c91e0a0c64fcb7f1145de3f30134cb1f1f8ee6..fe502445a77afe7e3807afae48d7bf03f370e290 100644 +--- a/src/main/java/net/minecraft/world/entity/ai/behavior/AcquirePoi.java ++++ b/src/main/java/net/minecraft/world/entity/ai/behavior/AcquirePoi.java +@@ -47,6 +47,7 @@ public class AcquirePoi { + return false; + } else { + mutableLong.setValue(time + 20L + (long)world.getRandom().nextInt(20)); ++ if (entity.getNavigation().isStuck()) mutableLong.add(200); // Pufferfish - wait an additional 10s to check again if they're stuck + PoiManager poiManager = world.getPoiManager(); + long2ObjectMap.long2ObjectEntrySet().removeIf((entry) -> { + return !entry.getValue().isStillValid(time); +diff --git a/src/main/java/net/minecraft/world/entity/ai/behavior/VillagerPanicTrigger.java b/src/main/java/net/minecraft/world/entity/ai/behavior/VillagerPanicTrigger.java +index 646d9a121d908a2fc3e4e302484dd5cd1bfc6804..e546ecdccde352502e26a8668eaaafe048d6e282 100644 +--- a/src/main/java/net/minecraft/world/entity/ai/behavior/VillagerPanicTrigger.java ++++ b/src/main/java/net/minecraft/world/entity/ai/behavior/VillagerPanicTrigger.java +@@ -37,7 +37,11 @@ public class VillagerPanicTrigger extends Behavior { + + @Override + protected void tick(ServerLevel world, Villager entity, long time) { +- if (time % 100L == 0L) { ++ // Pufferfish start ++ if (entity.nextGolemPanic < 0) entity.nextGolemPanic = time + 100; ++ if (--entity.nextGolemPanic < time) { ++ entity.nextGolemPanic = -1; ++ // Pufferfish end + entity.spawnGolemIfNeeded(world, time, 3); + } + +diff --git a/src/main/java/net/minecraft/world/entity/ai/goal/GoalSelector.java b/src/main/java/net/minecraft/world/entity/ai/goal/GoalSelector.java +index b738ee2d3801fadfd09313f05ae24593e56b0ec6..1635818fc4b1788c0d397085239df6dd75b210ab 100644 +--- a/src/main/java/net/minecraft/world/entity/ai/goal/GoalSelector.java ++++ b/src/main/java/net/minecraft/world/entity/ai/goal/GoalSelector.java +@@ -53,9 +53,12 @@ public class GoalSelector { + } + + // Paper start +- public boolean inactiveTick() { ++ public boolean inactiveTick(int tickRate, boolean inactive) { // Pufferfish start ++ if (inactive && !gg.pufferfish.pufferfish.PufferfishConfig.dearEnabled) tickRate = 4; // reset to Paper's ++ tickRate = Math.min(tickRate, this.newGoalRate); + this.curRate++; +- return this.curRate % this.newGoalRate == 0; ++ return this.curRate % tickRate == 0; ++ // Pufferfish end + } + public boolean hasTasks() { + for (WrappedGoal task : this.availableGoals) { +diff --git a/src/main/java/net/minecraft/world/entity/ai/goal/MoveToBlockGoal.java b/src/main/java/net/minecraft/world/entity/ai/goal/MoveToBlockGoal.java +index 26bf383caea68834c654b25653ced9017f1b1b22..615eb55e24d365d994fbfe9d45d2be387fd5d561 100644 +--- a/src/main/java/net/minecraft/world/entity/ai/goal/MoveToBlockGoal.java ++++ b/src/main/java/net/minecraft/world/entity/ai/goal/MoveToBlockGoal.java +@@ -119,6 +119,7 @@ public abstract class MoveToBlockGoal extends Goal { + for(int m = 0; m <= l; m = m > 0 ? -m : 1 - m) { + for(int n = m < l && m > -l ? l : 0; n <= l; n = n > 0 ? -n : 1 - n) { + mutableBlockPos.setWithOffset(blockPos, m, k - 1, n); ++ if (!this.mob.level.hasChunkAt(mutableBlockPos)) continue; // Pufferfish - if this block isn't loaded, continue + if (this.mob.isWithinRestriction(mutableBlockPos) && this.isValidTarget(this.mob.level, mutableBlockPos)) { + this.blockPos = mutableBlockPos; + setTargetPosition(mutableBlockPos.immutable()); // Paper +diff --git a/src/main/java/net/minecraft/world/entity/ai/targeting/TargetingConditions.java b/src/main/java/net/minecraft/world/entity/ai/targeting/TargetingConditions.java +index a7575b5ef56af6f53448d391abb4956e130148ca..e752c83df50fb9b670ecea2abc95426c2a009b6f 100644 +--- a/src/main/java/net/minecraft/world/entity/ai/targeting/TargetingConditions.java ++++ b/src/main/java/net/minecraft/world/entity/ai/targeting/TargetingConditions.java +@@ -75,9 +75,18 @@ public class TargetingConditions { + } + + if (this.range > 0.0D) { +- double d = this.testInvisible ? targetEntity.getVisibilityPercent(baseEntity) : 1.0D; +- double e = Math.max((this.useFollowRange ? this.getFollowRange(baseEntity) : this.range) * d, 2.0D); // Paper ++ // Pufferfish start - check range before getting visibility ++ // d = invisibility percent, e = follow range adjusted for invisibility, f = distance + double f = baseEntity.distanceToSqr(targetEntity.getX(), targetEntity.getY(), targetEntity.getZ()); ++ double followRangeRaw = this.useFollowRange ? this.getFollowRange(baseEntity) : this.range; ++ ++ if (f > followRangeRaw * followRangeRaw) { // the actual follow range will always be this value or smaller, so if the distance is larger then it never will return true after getting invis ++ return false; ++ } ++ ++ double d = this.testInvisible ? targetEntity.getVisibilityPercent(baseEntity) : 1.0D; ++ double e = Math.max((followRangeRaw) * d, 2.0D); // Paper ++ // Pufferfish end + if (f > e * e) { + return false; + } +diff --git a/src/main/java/net/minecraft/world/entity/ambient/Bat.java b/src/main/java/net/minecraft/world/entity/ambient/Bat.java +index f5efdf59617d43de18a2267351fa784c0be3ae83..59338d739b6130f667d151bc27646c4a346886a2 100644 +--- a/src/main/java/net/minecraft/world/entity/ambient/Bat.java ++++ b/src/main/java/net/minecraft/world/entity/ambient/Bat.java +@@ -251,13 +251,22 @@ public class Bat extends AmbientCreature { + } + } + ++ // Pufferfish start - only check for spooky season once an hour ++ private static boolean isSpookySeason = false; ++ private static final int ONE_HOUR = 20 * 60 * 60; ++ private static int lastSpookyCheck = -ONE_HOUR; + private static boolean isHalloween() { ++ if (net.minecraft.server.MinecraftServer.currentTick - lastSpookyCheck > ONE_HOUR) { + LocalDate localdate = LocalDate.now(); + int i = localdate.get(ChronoField.DAY_OF_MONTH); + int j = localdate.get(ChronoField.MONTH_OF_YEAR); + +- return j == 10 && i >= 20 || j == 11 && i <= 3; ++ isSpookySeason = j == 10 && i >= 20 || j == 11 && i <= 3; ++ lastSpookyCheck = net.minecraft.server.MinecraftServer.currentTick; ++ } ++ return isSpookySeason; + } ++ // Pufferfish end + + @Override + protected float getStandingEyeHeight(Pose pose, EntityDimensions dimensions) { +diff --git a/src/main/java/net/minecraft/world/entity/animal/allay/Allay.java b/src/main/java/net/minecraft/world/entity/animal/allay/Allay.java +index 9b57d2b766f2de2d3fb4a3b5ef4df8d6756a1942..a41d8101c960163803179d3717889aee6182d0bb 100644 +--- a/src/main/java/net/minecraft/world/entity/animal/allay/Allay.java ++++ b/src/main/java/net/minecraft/world/entity/animal/allay/Allay.java +@@ -223,9 +223,11 @@ public class Allay extends PathfinderMob implements InventoryCarrier { + return 0.4F; + } + ++ private int behaviorTick = 0; // Pufferfish + @Override + protected void customServerAiStep() { + this.level.getProfiler().push("allayBrain"); ++ if (this.behaviorTick++ % this.activatedPriority == 0) // Pufferfish + this.getBrain().tick((ServerLevel) this.level, this); + this.level.getProfiler().pop(); + this.level.getProfiler().push("allayActivityUpdate"); +diff --git a/src/main/java/net/minecraft/world/entity/animal/axolotl/Axolotl.java b/src/main/java/net/minecraft/world/entity/animal/axolotl/Axolotl.java +index a4e98b02175da96472474b8d7ad5975ce4d2fc43..38d21943fb2940f53c2d0ac2c3b94a6f0e46e700 100644 +--- a/src/main/java/net/minecraft/world/entity/animal/axolotl/Axolotl.java ++++ b/src/main/java/net/minecraft/world/entity/animal/axolotl/Axolotl.java +@@ -285,9 +285,11 @@ public class Axolotl extends Animal implements LerpingModel, VariantHolder { + return true; + } + ++ private int behaviorTick = 0; // Pufferfish + @Override + protected void customServerAiStep() { + this.level.getProfiler().push("frogBrain"); ++ if (this.behaviorTick++ % this.activatedPriority == 0) // Pufferfish + this.getBrain().tick((ServerLevel)this.level, this); + this.level.getProfiler().pop(); + this.level.getProfiler().push("frogActivityUpdate"); +diff --git a/src/main/java/net/minecraft/world/entity/animal/frog/Tadpole.java b/src/main/java/net/minecraft/world/entity/animal/frog/Tadpole.java +index 9058f9f2e561cda9f475f33218bf7a78297de4bc..e591b0a09f5a8475b3ec9cd28bd5d5b69809ed73 100644 +--- a/src/main/java/net/minecraft/world/entity/animal/frog/Tadpole.java ++++ b/src/main/java/net/minecraft/world/entity/animal/frog/Tadpole.java +@@ -77,9 +77,11 @@ public class Tadpole extends AbstractFish { + return SoundEvents.TADPOLE_FLOP; + } + ++ private int behaviorTick = 0; // Pufferfish + @Override + protected void customServerAiStep() { + this.level.getProfiler().push("tadpoleBrain"); ++ if (this.behaviorTick++ % this.activatedPriority == 0) // Pufferfish + this.getBrain().tick((ServerLevel) this.level, this); + this.level.getProfiler().pop(); + this.level.getProfiler().push("tadpoleActivityUpdate"); +diff --git a/src/main/java/net/minecraft/world/entity/animal/goat/Goat.java b/src/main/java/net/minecraft/world/entity/animal/goat/Goat.java +index cfa904d42734d0fb0c1ed8b18f4d8bc131027962..4fdc3bd591b6df4c28901e4571aa23baf034d885 100644 +--- a/src/main/java/net/minecraft/world/entity/animal/goat/Goat.java ++++ b/src/main/java/net/minecraft/world/entity/animal/goat/Goat.java +@@ -188,9 +188,11 @@ public class Goat extends Animal { + return (Brain) super.getBrain(); // CraftBukkit - decompile error + } + ++ private int behaviorTick = 0; // Pufferfish + @Override + protected void customServerAiStep() { + this.level.getProfiler().push("goatBrain"); ++ if (this.behaviorTick++ % this.activatedPriority == 0) // Pufferfish + this.getBrain().tick((ServerLevel) this.level, this); + this.level.getProfiler().pop(); + this.level.getProfiler().push("goatActivityUpdate"); +diff --git a/src/main/java/net/minecraft/world/entity/item/ItemEntity.java b/src/main/java/net/minecraft/world/entity/item/ItemEntity.java +index d47b3ac633e7936d30abfda6fc46c2c7412d76fe..453f0f7042bdf204db73be139aa36f211c5455e7 100644 +--- a/src/main/java/net/minecraft/world/entity/item/ItemEntity.java ++++ b/src/main/java/net/minecraft/world/entity/item/ItemEntity.java +@@ -264,10 +264,16 @@ public class ItemEntity extends Entity implements TraceableEntity { + if (entityitem.isMergable()) { + // Paper Start - Fix items merging through walls + if (this.level.paperConfig().fixes.fixItemsMergingThroughWalls) { ++ // Pufferfish start - skip the allocations ++ /* + net.minecraft.world.level.ClipContext rayTrace = new net.minecraft.world.level.ClipContext(this.position(), entityitem.position(), + net.minecraft.world.level.ClipContext.Block.COLLIDER, net.minecraft.world.level.ClipContext.Fluid.NONE, this); + net.minecraft.world.phys.BlockHitResult rayTraceResult = level.clip(rayTrace); + if (rayTraceResult.getType() == net.minecraft.world.phys.HitResult.Type.BLOCK) continue; ++ */ ++ if (level.rayTraceDirect(this.position(), entityitem.position(), net.minecraft.world.phys.shapes.CollisionContext.of(this)) == ++ net.minecraft.world.phys.HitResult.Type.BLOCK) continue; ++ // Pufferfish end + } + // Paper End + this.tryToMerge(entityitem); +diff --git a/src/main/java/net/minecraft/world/entity/monster/EnderMan.java b/src/main/java/net/minecraft/world/entity/monster/EnderMan.java +index 418d6301f067803e2471e59ac2d52a68cbff249b..c2f5dabb41b172547864decc06aa632d89dff3e1 100644 +--- a/src/main/java/net/minecraft/world/entity/monster/EnderMan.java ++++ b/src/main/java/net/minecraft/world/entity/monster/EnderMan.java +@@ -322,11 +322,17 @@ public class EnderMan extends Monster implements NeutralMob { + private boolean teleport(double x, double y, double z) { + BlockPos.MutableBlockPos blockposition_mutableblockposition = new BlockPos.MutableBlockPos(x, y, z); + +- while (blockposition_mutableblockposition.getY() > this.level.getMinBuildHeight() && !this.level.getBlockState(blockposition_mutableblockposition).getMaterial().blocksMotion()) { ++ // Pufferfish start - single chunk lookup ++ net.minecraft.world.level.chunk.LevelChunk chunk = this.level.getChunkIfLoaded(blockposition_mutableblockposition); ++ if (chunk == null) { ++ return false; ++ } ++ // Pufferfish end ++ while (blockposition_mutableblockposition.getY() > this.level.getMinBuildHeight() && !chunk.getBlockState(blockposition_mutableblockposition).getMaterial().blocksMotion()) { // Pufferfish + blockposition_mutableblockposition.move(Direction.DOWN); + } + +- BlockState iblockdata = this.level.getBlockState(blockposition_mutableblockposition); ++ BlockState iblockdata = chunk.getBlockState(blockposition_mutableblockposition); // Pufferfish + boolean flag = iblockdata.getMaterial().blocksMotion(); + boolean flag1 = iblockdata.getFluidState().is(FluidTags.WATER); + +diff --git a/src/main/java/net/minecraft/world/entity/monster/hoglin/Hoglin.java b/src/main/java/net/minecraft/world/entity/monster/hoglin/Hoglin.java +index 5d3b3cb3a882eb5d716f678095a65b28d0967476..daa2224b021c966751eb39f269ffbfe6e7f3d426 100644 +--- a/src/main/java/net/minecraft/world/entity/monster/hoglin/Hoglin.java ++++ b/src/main/java/net/minecraft/world/entity/monster/hoglin/Hoglin.java +@@ -126,9 +126,11 @@ public class Hoglin extends Animal implements Enemy, HoglinBase { + return (Brain) super.getBrain(); // Paper - decompile fix + } + ++ private int behaviorTick; // Pufferfish + @Override + protected void customServerAiStep() { + this.level.getProfiler().push("hoglinBrain"); ++ if (this.behaviorTick++ % this.activatedPriority == 0) // Pufferfish + this.getBrain().tick((ServerLevel)this.level, this); + this.level.getProfiler().pop(); + HoglinAi.updateActivity(this); +diff --git a/src/main/java/net/minecraft/world/entity/monster/piglin/Piglin.java b/src/main/java/net/minecraft/world/entity/monster/piglin/Piglin.java +index afa7ecfa8453da510ec5ccecb1ceeb1d9893d259..b401fb4f276ca81b4bb18426ee56abed8a9f7a7b 100644 +--- a/src/main/java/net/minecraft/world/entity/monster/piglin/Piglin.java ++++ b/src/main/java/net/minecraft/world/entity/monster/piglin/Piglin.java +@@ -308,9 +308,11 @@ public class Piglin extends AbstractPiglin implements CrossbowAttackMob, Invento + return !this.cannotHunt; + } + ++ private int behaviorTick; // Pufferfish + @Override + protected void customServerAiStep() { + this.level.getProfiler().push("piglinBrain"); ++ if (this.behaviorTick++ % this.activatedPriority == 0) // Pufferfish + this.getBrain().tick((ServerLevel) this.level, this); + this.level.getProfiler().pop(); + PiglinAi.updateActivity(this); +diff --git a/src/main/java/net/minecraft/world/entity/monster/warden/Warden.java b/src/main/java/net/minecraft/world/entity/monster/warden/Warden.java +index b2b63d9df3c07696f47281e9be74f1799f50b93e..907d77dd74066c723238155b42028a811365b1f8 100644 +--- a/src/main/java/net/minecraft/world/entity/monster/warden/Warden.java ++++ b/src/main/java/net/minecraft/world/entity/monster/warden/Warden.java +@@ -270,11 +270,13 @@ public class Warden extends Monster implements VibrationListener.VibrationListen + + } + ++ private int behaviorTick = 0; // Pufferfish + @Override + protected void customServerAiStep() { + ServerLevel worldserver = (ServerLevel) this.level; + + worldserver.getProfiler().push("wardenBrain"); ++ if (this.behaviorTick++ % this.activatedPriority == 0) // Pufferfish + this.getBrain().tick(worldserver, this); + this.level.getProfiler().pop(); + super.customServerAiStep(); +diff --git a/src/main/java/net/minecraft/world/entity/npc/Villager.java b/src/main/java/net/minecraft/world/entity/npc/Villager.java +index 6023b9eb3001e1a98ab8b970d853c4e7c7603f4d..5402a084ef5fe0b3cfea897a90cffade1eff5b66 100644 +--- a/src/main/java/net/minecraft/world/entity/npc/Villager.java ++++ b/src/main/java/net/minecraft/world/entity/npc/Villager.java +@@ -140,6 +140,8 @@ public class Villager extends AbstractVillager implements ReputationEventHandler + return holder.is(PoiTypes.MEETING); + }); + ++ public long nextGolemPanic = -1; // Pufferfish ++ + public Villager(EntityType entityType, Level world) { + this(entityType, world, VillagerType.PLAINS); + } +@@ -243,11 +245,17 @@ public class Villager extends AbstractVillager implements ReputationEventHandler + } + // Spigot End + ++ private int behaviorTick = 0; // Pufferfish + @Override + protected void customServerAiStep() { mobTick(false); } + protected void mobTick(boolean inactive) { + this.level.getProfiler().push("villagerBrain"); +- if (!inactive) this.getBrain().tick((ServerLevel) this.level, this); // Paper ++ // Pufferfish start ++ if (!inactive) { ++ if (this.behaviorTick++ % this.activatedPriority == 0) // Pufferfish ++ this.getBrain().tick((ServerLevel) this.level, this); // Paper ++ } ++ // Pufferfish end + this.level.getProfiler().pop(); + if (this.assignProfessionWhenSpawned) { + this.assignProfessionWhenSpawned = false; +diff --git a/src/main/java/net/minecraft/world/entity/player/Inventory.java b/src/main/java/net/minecraft/world/entity/player/Inventory.java +index 27c028ab6b1edb6e413af3bbaa27bf30f2d85540..302ca7391109c10e81a7745504b3c530bc3be6ad 100644 +--- a/src/main/java/net/minecraft/world/entity/player/Inventory.java ++++ b/src/main/java/net/minecraft/world/entity/player/Inventory.java +@@ -682,6 +682,8 @@ public class Inventory implements Container, Nameable { + } + + public boolean contains(ItemStack stack) { ++ // Pufferfish start - don't allocate iterators ++ /* + Iterator iterator = this.compartments.iterator(); + + while (iterator.hasNext()) { +@@ -696,6 +698,18 @@ public class Inventory implements Container, Nameable { + } + } + } ++ */ ++ for (int i = 0; i < this.compartments.size(); i++) { ++ List list = this.compartments.get(i); ++ for (int j = 0; j < list.size(); j++) { ++ ItemStack itemstack1 = list.get(j); ++ ++ if (!itemstack1.isEmpty() && itemstack1.sameItem(stack)) { ++ return true; ++ } ++ } ++ } ++ // Pufferfish end + + return false; + } +diff --git a/src/main/java/net/minecraft/world/entity/projectile/Projectile.java b/src/main/java/net/minecraft/world/entity/projectile/Projectile.java +index 8b2a3a8482018b7db7de81bc295862f783e17ce5..e6f87e1e3c99195ed11c81162cb54e7f5750c4ba 100644 +--- a/src/main/java/net/minecraft/world/entity/projectile/Projectile.java ++++ b/src/main/java/net/minecraft/world/entity/projectile/Projectile.java +@@ -44,6 +44,36 @@ public abstract class Projectile extends Entity implements TraceableEntity { + super(type, world); + } + ++ // Pufferfish start ++ private static int loadedThisTick = 0; ++ private static int loadedTick; ++ ++ private int loadedLifetime = 0; ++ @Override ++ public void setPos(double x, double y, double z) { ++ int currentTick = net.minecraft.server.MinecraftServer.currentTick; ++ if (loadedTick != currentTick) { ++ loadedTick = currentTick; ++ loadedThisTick = 0; ++ } ++ int previousX = Mth.floor(this.getX()) >> 4, previousZ = Mth.floor(this.getZ()) >> 4; ++ int newX = Mth.floor(x) >> 4, newZ = Mth.floor(z) >> 4; ++ if (previousX != newX || previousZ != newZ) { ++ boolean isLoaded = ((net.minecraft.server.level.ServerChunkCache) this.level.getChunkSource()).getChunkAtIfLoadedMainThread(newX, newZ) != null; ++ if (!isLoaded) { ++ if (Projectile.loadedThisTick > gg.pufferfish.pufferfish.PufferfishConfig.maxProjectileLoadsPerTick) { ++ if (++this.loadedLifetime > gg.pufferfish.pufferfish.PufferfishConfig.maxProjectileLoadsPerProjectile) { ++ this.discard(); ++ } ++ return; ++ } ++ Projectile.loadedThisTick++; ++ } ++ } ++ super.setPos(x, y, z); ++ } ++ // Pufferfish start ++ + public void setOwner(@Nullable Entity entity) { + if (entity != null) { + this.ownerUUID = entity.getUUID(); +diff --git a/src/main/java/net/minecraft/world/entity/vehicle/AbstractMinecartContainer.java b/src/main/java/net/minecraft/world/entity/vehicle/AbstractMinecartContainer.java +index 08f027cdcaeeca7b545483cb8c5eb8d13e4933b9..992ff554643b149d9c6101562a9754a84263ed7e 100644 +--- a/src/main/java/net/minecraft/world/entity/vehicle/AbstractMinecartContainer.java ++++ b/src/main/java/net/minecraft/world/entity/vehicle/AbstractMinecartContainer.java +@@ -27,7 +27,10 @@ import org.bukkit.inventory.InventoryHolder; + + public abstract class AbstractMinecartContainer extends AbstractMinecart implements ContainerEntity { + ++ // Pufferfish start + private NonNullList itemStacks; ++ private gg.airplane.structs.ItemListWithBitset itemStacksOptimized; ++ // Pufferfish end + @Nullable + public ResourceLocation lootTable; + public long lootTableSeed; +@@ -89,12 +92,18 @@ public abstract class AbstractMinecartContainer extends AbstractMinecart impleme + + protected AbstractMinecartContainer(EntityType type, Level world) { + super(type, world); +- this.itemStacks = NonNullList.withSize(this.getContainerSize(), ItemStack.EMPTY); // CraftBukkit - SPIGOT-3513 ++ // Pufferfish start ++ this.itemStacksOptimized = new gg.airplane.structs.ItemListWithBitset(this.getContainerSize()); // CraftBukkit - SPIGOT-3513 ++ this.itemStacks = this.itemStacksOptimized.nonNullList; ++ // Pufferfish end + } + + protected AbstractMinecartContainer(EntityType type, double x, double y, double z, Level world) { + super(type, world, x, y, z); +- this.itemStacks = NonNullList.withSize(this.getContainerSize(), ItemStack.EMPTY); // CraftBukkit - SPIGOT-3513 ++ // Pufferfish start ++ this.itemStacksOptimized = new gg.airplane.structs.ItemListWithBitset(this.getContainerSize()); // CraftBukkit - SPIGOT-3513 ++ this.itemStacks = this.itemStacksOptimized.nonNullList; ++ // Pufferfish end + } + + @Override +@@ -156,6 +165,10 @@ public abstract class AbstractMinecartContainer extends AbstractMinecart impleme + protected void readAdditionalSaveData(CompoundTag nbt) { + super.readAdditionalSaveData(nbt); + this.lootableData.loadNbt(nbt); // Paper ++ // Pufferfish start ++ this.itemStacksOptimized = new gg.airplane.structs.ItemListWithBitset(this.getContainerSize()); ++ this.itemStacks = this.itemStacksOptimized.nonNullList; ++ // Pufferfish end + this.readChestVehicleSaveData(nbt); + } + +diff --git a/src/main/java/net/minecraft/world/item/crafting/ShapelessRecipe.java b/src/main/java/net/minecraft/world/item/crafting/ShapelessRecipe.java +index f4f3f3a19d3cadaef1ae1a47daa68251a983dcf2..8da06f8bea0239c5206d5d4f4ff48bdeb0a89f9d 100644 +--- a/src/main/java/net/minecraft/world/item/crafting/ShapelessRecipe.java ++++ b/src/main/java/net/minecraft/world/item/crafting/ShapelessRecipe.java +@@ -27,8 +27,13 @@ public class ShapelessRecipe implements CraftingRecipe { + final CraftingBookCategory category; + final ItemStack result; + final NonNullList ingredients; ++ private final boolean isBukkit; // Pufferfish + ++ // Pufferfish start + public ShapelessRecipe(ResourceLocation id, String group, CraftingBookCategory category, ItemStack output, NonNullList input) { ++ this(id, group, category, output, input, false); ++ } ++ public ShapelessRecipe(ResourceLocation id, String group, CraftingBookCategory category, ItemStack output, NonNullList input, boolean isBukkit) { this.isBukkit = isBukkit; // Pufferfish end + this.id = id; + this.group = group; + this.category = category; +@@ -82,6 +87,28 @@ public class ShapelessRecipe implements CraftingRecipe { + } + + public boolean matches(CraftingContainer inventory, Level world) { ++ // Pufferfish start ++ if (!this.isBukkit) { ++ java.util.List ingredients = com.google.common.collect.Lists.newArrayList(this.ingredients.toArray(new Ingredient[0])); ++ ++ inventory: for (int index = 0; index < inventory.getContainerSize(); index++) { ++ ItemStack itemStack = inventory.getItem(index); ++ ++ if (!itemStack.isEmpty()) { ++ for (int i = 0; i < ingredients.size(); i++) { ++ if (ingredients.get(i).test(itemStack)) { ++ ingredients.remove(i); ++ continue inventory; ++ } ++ } ++ return false; ++ } ++ } ++ ++ return ingredients.isEmpty(); ++ } ++ // Pufferfish end ++ + StackedContents autorecipestackmanager = new StackedContents(); + int i = 0; + +diff --git a/src/main/java/net/minecraft/world/level/BlockGetter.java b/src/main/java/net/minecraft/world/level/BlockGetter.java +index 2ee9e8e3c1a28c1823de8e1fe421cc1f3e72f384..cf4a8084158b10bf047d418dda375f8c1fd3216e 100644 +--- a/src/main/java/net/minecraft/world/level/BlockGetter.java ++++ b/src/main/java/net/minecraft/world/level/BlockGetter.java +@@ -73,6 +73,16 @@ public interface BlockGetter extends LevelHeightAccessor { + }); + } + ++ // Pufferfish start - broken down variant of below rayTraceBlock, used by World#rayTraceDirect ++ default net.minecraft.world.phys.BlockHitResult.Type rayTraceBlockDirect(Vec3 vec3d, Vec3 vec3d1, BlockPos blockposition, BlockState iblockdata, net.minecraft.world.phys.shapes.CollisionContext voxelshapecoll) { ++ if (iblockdata.isAir()) return null; // Tuinity - optimise air cases ++ VoxelShape voxelshape = ClipContext.Block.COLLIDER.get(iblockdata, this, blockposition, voxelshapecoll); ++ net.minecraft.world.phys.BlockHitResult movingobjectpositionblock = this.clipWithInteractionOverride(vec3d, vec3d1, blockposition, voxelshape, iblockdata); ++ ++ return movingobjectpositionblock == null ? null : movingobjectpositionblock.getType(); ++ } ++ // Pufferfish end ++ + // CraftBukkit start - moved block handling into separate method for use by Block#rayTrace + default BlockHitResult clip(ClipContext raytrace1, BlockPos blockposition) { + // Paper start - Prevent raytrace from loading chunks +diff --git a/src/main/java/net/minecraft/world/level/GameRules.java b/src/main/java/net/minecraft/world/level/GameRules.java +index edd2c9d0cf5a81c779011cb4215d496a8987b784..29d1f78dbc8410f9292f409b17705acde55979df 100644 +--- a/src/main/java/net/minecraft/world/level/GameRules.java ++++ b/src/main/java/net/minecraft/world/level/GameRules.java +@@ -100,6 +100,7 @@ public class GameRules { + public static final GameRules.Key RULE_GLOBAL_SOUND_EVENTS = GameRules.register("globalSoundEvents", GameRules.Category.MISC, GameRules.BooleanValue.create(true)); + public static final GameRules.Key RULE_DO_VINES_SPREAD = GameRules.register("doVinesSpread", GameRules.Category.UPDATES, GameRules.BooleanValue.create(true)); + private final Map, GameRules.Value> rules; ++ private final GameRules.Value[] gameruleArray; + + private static > GameRules.Key register(String name, GameRules.Category category, GameRules.Type type) { + GameRules.Key gamerules_gamerulekey = new GameRules.Key<>(name, category); +@@ -118,17 +119,33 @@ public class GameRules { + } + + public GameRules() { +- this.rules = (Map) GameRules.GAME_RULE_TYPES.entrySet().stream().collect(ImmutableMap.toImmutableMap(Entry::getKey, (entry) -> { ++ // Pufferfish start - use this to ensure gameruleArray is initialized ++ this((Map) GameRules.GAME_RULE_TYPES.entrySet().stream().collect(ImmutableMap.toImmutableMap(Entry::getKey, (entry) -> { + return ((GameRules.Type) entry.getValue()).createRule(); +- })); ++ }))); ++ // Pufferfish end + } + + private GameRules(Map, GameRules.Value> rules) { + this.rules = rules; ++ ++ // Pufferfish start ++ int arraySize = rules.keySet().stream().mapToInt(key -> key.gameRuleIndex).max().orElse(-1) + 1; ++ GameRules.Value[] values = new GameRules.Value[arraySize]; ++ ++ for (Entry, GameRules.Value> entry : rules.entrySet()) { ++ values[entry.getKey().gameRuleIndex] = entry.getValue(); ++ } ++ ++ this.gameruleArray = values; ++ // Pufferfish end + } + + public > T getRule(GameRules.Key key) { +- return (T) this.rules.get(key); // CraftBukkit - decompile error ++ // Pufferfish start ++ return key == null ? null : (T) this.gameruleArray[key.gameRuleIndex]; ++ //return (T) this.rules.get(key); // CraftBukkit - decompile error ++ // Pufferfish end + } + + public CompoundTag createTag() { +@@ -187,6 +204,10 @@ public class GameRules { + } + + public static final class Key> { ++ // Pufferfish start ++ private static int lastGameRuleIndex = 0; ++ public final int gameRuleIndex = lastGameRuleIndex++; ++ // Pufferfish end + + final String id; + private final GameRules.Category category; +diff --git a/src/main/java/net/minecraft/world/level/Level.java b/src/main/java/net/minecraft/world/level/Level.java +index 973ecd50f9cb6b86c353586e84d15dcb118ccb60..6aec1983a0236d6aa0507a2b3ad1c08b3330f0fc 100644 +--- a/src/main/java/net/minecraft/world/level/Level.java ++++ b/src/main/java/net/minecraft/world/level/Level.java +@@ -274,6 +274,17 @@ public abstract class Level implements LevelAccessor, AutoCloseable { + + public abstract ResourceKey getTypeKey(); + ++ protected final io.papermc.paper.util.math.ThreadUnsafeRandom randomTickRandom = new io.papermc.paper.util.math.ThreadUnsafeRandom(java.util.concurrent.ThreadLocalRandom.current().nextLong()); public net.minecraft.util.RandomSource getThreadUnsafeRandom() { return this.randomTickRandom; } // Pufferfish - move thread unsafe random initialization // Pufferfish - getter ++ ++ // Pufferfish start - ensure these get inlined ++ private final int minBuildHeight, minSection, height, maxBuildHeight, maxSection; ++ @Override public final int getMaxBuildHeight() { return this.maxBuildHeight; } ++ @Override public final int getMinSection() { return this.minSection; } ++ @Override public final int getMaxSection() { return this.maxSection; } ++ @Override public final int getMinBuildHeight() { return this.minBuildHeight; } ++ @Override public final int getHeight() { return this.height; } ++ // Pufferfish end ++ + protected Level(WritableLevelData worlddatamutable, ResourceKey resourcekey, RegistryAccess iregistrycustom, Holder holder, Supplier supplier, boolean flag, boolean flag1, long i, int j, org.bukkit.generator.ChunkGenerator gen, org.bukkit.generator.BiomeProvider biomeProvider, org.bukkit.World.Environment env, java.util.function.Function paperWorldConfigCreator, java.util.concurrent.Executor executor) { // Paper - Async-Anti-Xray - Pass executor + this.spigotConfig = new org.spigotmc.SpigotWorldConfig(((net.minecraft.world.level.storage.PrimaryLevelData) worlddatamutable).getLevelName()); // Spigot + this.paperConfig = paperWorldConfigCreator.apply(this.spigotConfig); // Paper +@@ -296,6 +307,13 @@ public abstract class Level implements LevelAccessor, AutoCloseable { + }); + final DimensionType dimensionmanager = (DimensionType) holder.value(); + ++ // Pufferfish start ++ this.minBuildHeight = dimensionmanager.minY(); ++ this.minSection = SectionPos.blockToSectionCoord(this.minBuildHeight); ++ this.height = dimensionmanager.height(); ++ this.maxBuildHeight = this.minBuildHeight + this.height; ++ this.maxSection = SectionPos.blockToSectionCoord(this.maxBuildHeight - 1) + 1; ++ // Pufferfish end + this.dimension = resourcekey; + this.isClientSide = flag; + if (dimensionmanager.coordinateScale() != 1.0D) { +@@ -413,6 +431,91 @@ public abstract class Level implements LevelAccessor, AutoCloseable { + return null; + } + ++ // Pufferfish start - broken down method of raytracing for EntityLiving#hasLineOfSight, replaces IBlockAccess#rayTrace(RayTrace) ++ public net.minecraft.world.phys.BlockHitResult.Type rayTraceDirect(net.minecraft.world.phys.Vec3 vec3d, net.minecraft.world.phys.Vec3 vec3d1, net.minecraft.world.phys.shapes.CollisionContext voxelshapecoll) { ++ // most of this code comes from IBlockAccess#a(RayTrace, BiFunction, Function), but removes the needless functions ++ if (vec3d.equals(vec3d1)) { ++ return net.minecraft.world.phys.BlockHitResult.Type.MISS; ++ } ++ ++ double endX = Mth.lerp(-1.0E-7D, vec3d1.x, vec3d.x); ++ double endY = Mth.lerp(-1.0E-7D, vec3d1.y, vec3d.y); ++ double endZ = Mth.lerp(-1.0E-7D, vec3d1.z, vec3d.z); ++ ++ double startX = Mth.lerp(-1.0E-7D, vec3d.x, vec3d1.x); ++ double startY = Mth.lerp(-1.0E-7D, vec3d.y, vec3d1.y); ++ double startZ = Mth.lerp(-1.0E-7D, vec3d.z, vec3d1.z); ++ ++ int currentX = Mth.floor(startX); ++ int currentY = Mth.floor(startY); ++ int currentZ = Mth.floor(startZ); ++ ++ BlockPos.MutableBlockPos currentBlock = new BlockPos.MutableBlockPos(currentX, currentY, currentZ); ++ ++ LevelChunk chunk = this.getChunkIfLoaded(currentBlock); ++ if (chunk == null) { ++ return net.minecraft.world.phys.BlockHitResult.Type.MISS; ++ } ++ ++ net.minecraft.world.phys.BlockHitResult.Type initialCheck = this.rayTraceBlockDirect(vec3d, vec3d1, currentBlock, chunk.getBlockState(currentBlock), voxelshapecoll); ++ ++ if (initialCheck != null) { ++ return initialCheck; ++ } ++ ++ double diffX = endX - startX; ++ double diffY = endY - startY; ++ double diffZ = endZ - startZ; ++ ++ int xDirection = Mth.sign(diffX); ++ int yDirection = Mth.sign(diffY); ++ int zDirection = Mth.sign(diffZ); ++ ++ double normalizedX = xDirection == 0 ? Double.MAX_VALUE : (double) xDirection / diffX; ++ double normalizedY = yDirection == 0 ? Double.MAX_VALUE : (double) yDirection / diffY; ++ double normalizedZ = zDirection == 0 ? Double.MAX_VALUE : (double) zDirection / diffZ; ++ ++ double normalizedXDirection = normalizedX * (xDirection > 0 ? 1.0D - Mth.frac(startX) : Mth.frac(startX)); ++ double normalizedYDirection = normalizedY * (yDirection > 0 ? 1.0D - Mth.frac(startY) : Mth.frac(startY)); ++ double normalizedZDirection = normalizedZ * (zDirection > 0 ? 1.0D - Mth.frac(startZ) : Mth.frac(startZ)); ++ ++ net.minecraft.world.phys.BlockHitResult.Type result; ++ ++ do { ++ if (normalizedXDirection > 1.0D && normalizedYDirection > 1.0D && normalizedZDirection > 1.0D) { ++ return net.minecraft.world.phys.BlockHitResult.Type.MISS; ++ } ++ ++ if (normalizedXDirection < normalizedYDirection) { ++ if (normalizedXDirection < normalizedZDirection) { ++ currentX += xDirection; ++ normalizedXDirection += normalizedX; ++ } else { ++ currentZ += zDirection; ++ normalizedZDirection += normalizedZ; ++ } ++ } else if (normalizedYDirection < normalizedZDirection) { ++ currentY += yDirection; ++ normalizedYDirection += normalizedY; ++ } else { ++ currentZ += zDirection; ++ normalizedZDirection += normalizedZ; ++ } ++ ++ currentBlock.set(currentX, currentY, currentZ); ++ if (chunk.getPos().x != currentBlock.getX() >> 4 || chunk.getPos().z != currentBlock.getZ() >> 4) { ++ chunk = this.getChunkIfLoaded(currentBlock); ++ if (chunk == null) { ++ return net.minecraft.world.phys.BlockHitResult.Type.MISS; ++ } ++ } ++ result = this.rayTraceBlockDirect(vec3d, vec3d1, currentBlock, chunk.getBlockState(currentBlock), voxelshapecoll); ++ } while (result == null); ++ ++ return result; ++ } ++ // Pufferfish end ++ + public boolean isInWorldBounds(BlockPos pos) { + return pos.isInsideBuildHeightAndWorldBoundsHorizontal(this); // Paper - use better/optimized check + } +@@ -925,13 +1028,13 @@ public abstract class Level implements LevelAccessor, AutoCloseable { + try { + tickConsumer.accept(entity); + MinecraftServer.getServer().executeMidTickTasks(); // Paper - execute chunk tasks mid tick +- } catch (Throwable throwable) { ++ } catch (Throwable throwable) { // Pufferfish - diff on change ServerLevel.tick + if (throwable instanceof ThreadDeath) throw throwable; // Paper + // Paper start - Prevent tile entity and entity crashes + final String msg = String.format("Entity threw exception at %s:%s,%s,%s", entity.level.getWorld().getName(), entity.getX(), entity.getY(), entity.getZ()); + MinecraftServer.LOGGER.error(msg, throwable); + getCraftServer().getPluginManager().callEvent(new ServerExceptionEvent(new ServerInternalException(msg, throwable))); +- entity.discard(); ++ entity.discard(); // Pufferfish - diff on change ServerLevel.tick + // Paper end + } + } +@@ -1454,6 +1557,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { + } + + public ProfilerFiller getProfiler() { ++ if (gg.pufferfish.pufferfish.PufferfishConfig.disableMethodProfiler) return net.minecraft.util.profiling.InactiveProfiler.INSTANCE; // Pufferfish + return (ProfilerFiller) this.profiler.get(); + } + +diff --git a/src/main/java/net/minecraft/world/level/NaturalSpawner.java b/src/main/java/net/minecraft/world/level/NaturalSpawner.java +index 15d266fc97eb73338f4f6fb2cfe25d6861e79810..6180679d922ea61d05d452971ec2d506a724d3c3 100644 +--- a/src/main/java/net/minecraft/world/level/NaturalSpawner.java ++++ b/src/main/java/net/minecraft/world/level/NaturalSpawner.java +@@ -417,12 +417,12 @@ public final class NaturalSpawner { + } + } + +- private static BlockPos getRandomPosWithin(Level world, LevelChunk chunk) { ++ private static BlockPos getRandomPosWithin(ServerLevel world, LevelChunk chunk) { // Pufferfish - accept serverlevel + ChunkPos chunkcoordintpair = chunk.getPos(); +- int i = chunkcoordintpair.getMinBlockX() + world.random.nextInt(16); +- int j = chunkcoordintpair.getMinBlockZ() + world.random.nextInt(16); ++ int i = chunkcoordintpair.getMinBlockX() + world.getThreadUnsafeRandom().nextInt(16); // Pufferfish - use thread unsafe random ++ int j = chunkcoordintpair.getMinBlockZ() + world.getThreadUnsafeRandom().nextInt(16); // Pufferfish + int k = chunk.getHeight(Heightmap.Types.WORLD_SURFACE, i, j) + 1; +- int l = Mth.randomBetweenInclusive(world.random, world.getMinBuildHeight(), k); ++ int l = Mth.randomBetweenInclusive(world.getThreadUnsafeRandom(), world.getMinBuildHeight(), k); // Pufferfish + + return new BlockPos(i, l, j); + } +diff --git a/src/main/java/net/minecraft/world/level/biome/Biome.java b/src/main/java/net/minecraft/world/level/biome/Biome.java +index 65012a12e1430956ef55ced56773e6354ac26444..ed439b7e94646141c93a7dd3704d1cdeb5c27e16 100644 +--- a/src/main/java/net/minecraft/world/level/biome/Biome.java ++++ b/src/main/java/net/minecraft/world/level/biome/Biome.java +@@ -66,14 +66,20 @@ public final class Biome { + private final BiomeGenerationSettings generationSettings; + private final MobSpawnSettings mobSettings; + private final BiomeSpecialEffects specialEffects; +- private final ThreadLocal temperatureCache = ThreadLocal.withInitial(() -> { ++ // Pufferfish start - use our cache ++ private final ThreadLocal temperatureCache = ThreadLocal.withInitial(() -> { + return Util.make(() -> { ++ /* + Long2FloatLinkedOpenHashMap long2FloatLinkedOpenHashMap = new Long2FloatLinkedOpenHashMap(1024, 0.25F) { + protected void rehash(int i) { + } + }; + long2FloatLinkedOpenHashMap.defaultReturnValue(Float.NaN); + return long2FloatLinkedOpenHashMap; ++ ++ */ ++ return new gg.airplane.structs.Long2FloatAgingCache(TEMPERATURE_CACHE_SIZE); ++ // Pufferfish end + }); + }); + +@@ -118,17 +124,15 @@ public final class Biome { + @Deprecated + public float getTemperature(BlockPos blockPos) { + long l = blockPos.asLong(); +- Long2FloatLinkedOpenHashMap long2FloatLinkedOpenHashMap = this.temperatureCache.get(); +- float f = long2FloatLinkedOpenHashMap.get(l); ++ // Pufferfish start ++ gg.airplane.structs.Long2FloatAgingCache cache = this.temperatureCache.get(); ++ float f = cache.getValue(l); + if (!Float.isNaN(f)) { + return f; + } else { + float g = this.getHeightAdjustedTemperature(blockPos); +- if (long2FloatLinkedOpenHashMap.size() == 1024) { +- long2FloatLinkedOpenHashMap.removeFirstFloat(); +- } +- +- long2FloatLinkedOpenHashMap.put(l, g); ++ cache.putValue(l, g); ++ // Pufferfish end + return g; + } + } +diff --git a/src/main/java/net/minecraft/world/level/block/entity/ChestBlockEntity.java b/src/main/java/net/minecraft/world/level/block/entity/ChestBlockEntity.java +index a71414397bd45ee7bcacfeef0041d80dfa25f114..d66806565770cb03a21794f99e5c4b0f3040b26a 100644 +--- a/src/main/java/net/minecraft/world/level/block/entity/ChestBlockEntity.java ++++ b/src/main/java/net/minecraft/world/level/block/entity/ChestBlockEntity.java +@@ -31,7 +31,10 @@ import org.bukkit.entity.HumanEntity; + public class ChestBlockEntity extends RandomizableContainerBlockEntity implements LidBlockEntity { + + private static final int EVENT_SET_OPEN_COUNT = 1; ++ // Pufferfish start + private NonNullList items; ++ private gg.airplane.structs.ItemListWithBitset optimizedItems; ++ // Pufferfish end + public final ContainerOpenersCounter openersCounter; + private final ChestLidController chestLidController; + +@@ -65,9 +68,13 @@ public class ChestBlockEntity extends RandomizableContainerBlockEntity implement + } + // CraftBukkit end + ++ private final boolean isNative = getClass().equals(ChestBlockEntity.class); // Pufferfish + protected ChestBlockEntity(BlockEntityType type, BlockPos pos, BlockState state) { + super(type, pos, state); +- this.items = NonNullList.withSize(27, ItemStack.EMPTY); ++ // Pufferfish start ++ this.optimizedItems = new gg.airplane.structs.ItemListWithBitset(27); ++ this.items = this.optimizedItems.nonNullList; ++ // Pufferfish end + this.openersCounter = new ContainerOpenersCounter() { + @Override + protected void onOpen(Level world, BlockPos pos, BlockState state) { +@@ -98,6 +105,23 @@ public class ChestBlockEntity extends RandomizableContainerBlockEntity implement + this.chestLidController = new ChestLidController(); + } + ++ // Pufferfish start ++ @Override ++ public boolean hasEmptySlot(Direction enumdirection) { ++ return isNative ? !this.optimizedItems.hasFullStacks() : super.hasEmptySlot(enumdirection); ++ } ++ ++ @Override ++ public boolean isCompletelyFull(Direction enumdirection) { ++ return isNative ? this.optimizedItems.hasFullStacks() && super.isCompletelyFull(enumdirection) : super.isCompletelyFull(enumdirection); ++ } ++ ++ @Override ++ public boolean isCompletelyEmpty(Direction enumdirection) { ++ return isNative && this.optimizedItems.isCompletelyEmpty() || super.isCompletelyEmpty(enumdirection); ++ } ++ // Pufferfish end ++ + public ChestBlockEntity(BlockPos pos, BlockState state) { + this(BlockEntityType.CHEST, pos, state); + } +@@ -115,7 +139,10 @@ public class ChestBlockEntity extends RandomizableContainerBlockEntity implement + @Override + public void load(CompoundTag nbt) { + super.load(nbt); +- this.items = NonNullList.withSize(this.getContainerSize(), ItemStack.EMPTY); ++ // Pufferfish start ++ this.optimizedItems = new gg.airplane.structs.ItemListWithBitset(this.getContainerSize()); ++ this.items = this.optimizedItems.nonNullList; ++ // Pufferfish end + if (!this.tryLoadLootTable(nbt)) { + ContainerHelper.loadAllItems(nbt, this.items); + } +@@ -187,7 +214,10 @@ public class ChestBlockEntity extends RandomizableContainerBlockEntity implement + + @Override + protected void setItems(NonNullList list) { +- this.items = list; ++ // Pufferfish start ++ this.optimizedItems = gg.airplane.structs.ItemListWithBitset.fromList(list); ++ this.items = this.optimizedItems.nonNullList; ++ // Pufferfish end + } + + @Override +diff --git a/src/main/java/net/minecraft/world/level/block/entity/HopperBlockEntity.java b/src/main/java/net/minecraft/world/level/block/entity/HopperBlockEntity.java +index cba114f554644a37339c93026630c66c43f524b9..746b71ea96ecc441afd45cc779a1777c15d58ff2 100644 +--- a/src/main/java/net/minecraft/world/level/block/entity/HopperBlockEntity.java ++++ b/src/main/java/net/minecraft/world/level/block/entity/HopperBlockEntity.java +@@ -47,7 +47,10 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen + + public static final int MOVE_ITEM_SPEED = 8; + public static final int HOPPER_CONTAINER_SIZE = 5; ++ // Pufferfish start + private NonNullList items; ++ private gg.airplane.structs.ItemListWithBitset optimizedItems; // Pufferfish ++ // Pufferfish end + private int cooldownTime; + private long tickedGameTime; + +@@ -83,14 +86,37 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen + + public HopperBlockEntity(BlockPos pos, BlockState state) { + super(BlockEntityType.HOPPER, pos, state); +- this.items = NonNullList.withSize(5, ItemStack.EMPTY); ++ // Pufferfish start ++ this.optimizedItems = new gg.airplane.structs.ItemListWithBitset(5); ++ this.items = this.optimizedItems.nonNullList; ++ // Pufferfish end + this.cooldownTime = -1; + } + ++ // Pufferfish start ++ @Override ++ public boolean hasEmptySlot(Direction enumdirection) { ++ return !this.optimizedItems.hasFullStacks(); ++ } ++ ++ @Override ++ public boolean isCompletelyFull(Direction enumdirection) { ++ return this.optimizedItems.hasFullStacks() && super.isCompletelyFull(enumdirection); ++ } ++ ++ @Override ++ public boolean isCompletelyEmpty(Direction enumdirection) { ++ return this.optimizedItems.isCompletelyEmpty() || super.isCompletelyEmpty(enumdirection); ++ } ++ // Pufferfish end ++ + @Override + public void load(CompoundTag nbt) { + super.load(nbt); +- this.items = NonNullList.withSize(this.getContainerSize(), ItemStack.EMPTY); ++ // Pufferfish start ++ this.optimizedItems = new gg.airplane.structs.ItemListWithBitset(this.getContainerSize()); ++ this.items = this.optimizedItems.nonNullList; ++ // Pufferfish end + if (!this.tryLoadLootTable(nbt)) { + ContainerHelper.loadAllItems(nbt, this.items); + } +@@ -162,7 +188,7 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen + flag = HopperBlockEntity.ejectItems(world, pos, state, (Container) blockEntity, blockEntity); // CraftBukkit + } + +- if (!blockEntity.inventoryFull()) { ++ if (!blockEntity.optimizedItems.hasFullStacks() || !blockEntity.inventoryFull()) { // Pufferfish - use bitset first + flag |= booleansupplier.getAsBoolean(); + } + +@@ -451,11 +477,18 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen + } + + private static boolean isFullContainer(Container inventory, Direction direction) { +- return allMatch(inventory, direction, STACK_SIZE_TEST); // Paper - no streams ++ // Pufferfish start - use bitsets ++ //return allMatch(inventory, direction, STACK_SIZE_TEST); // Paper - no streams ++ return inventory.isCompletelyFull(direction); ++ // Pufferfish end + } + + private static boolean isEmptyContainer(Container inv, Direction facing) { +- return allMatch(inv, facing, IS_EMPTY_TEST); ++ // Paper start ++ // Pufferfish start - use bitsets ++ //return allMatch(inv, facing, IS_EMPTY_TEST); ++ return inv.isCompletelyEmpty(facing); ++ // Pufferfish end + } + + public static boolean suckInItems(Level world, Hopper hopper) { +@@ -636,7 +669,7 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen + + if (HopperBlockEntity.canPlaceItemInContainer(to, stack, slot, side)) { + boolean flag = false; +- boolean flag1 = to.isEmpty(); ++ boolean flag1 = to.isCompletelyEmpty(side); // Pufferfish + + if (itemstack1.isEmpty()) { + // Spigot start - SPIGOT-6693, InventorySubcontainer#setItem +@@ -813,7 +846,10 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen + + @Override + protected void setItems(NonNullList list) { +- this.items = list; ++ // Pufferfish start ++ this.optimizedItems = gg.airplane.structs.ItemListWithBitset.fromList(list); ++ this.items = this.optimizedItems.nonNullList; ++ // Pufferfish end + } + + public static void entityInside(Level world, BlockPos pos, BlockState state, Entity entity, HopperBlockEntity blockEntity) { +diff --git a/src/main/java/net/minecraft/world/level/block/entity/RandomizableContainerBlockEntity.java b/src/main/java/net/minecraft/world/level/block/entity/RandomizableContainerBlockEntity.java +index 79b01e32f89defb6b78f4764600d33d4945af592..6d62cc8fb347ccafd51df05896e616995990f005 100644 +--- a/src/main/java/net/minecraft/world/level/block/entity/RandomizableContainerBlockEntity.java ++++ b/src/main/java/net/minecraft/world/level/block/entity/RandomizableContainerBlockEntity.java +@@ -97,12 +97,7 @@ public abstract class RandomizableContainerBlockEntity extends BaseContainerBloc + public boolean isEmpty() { + this.unpackLootTable((Player)null); + // Paper start +- for (final ItemStack itemStack : this.getItems()) { +- if (!itemStack.isEmpty()) { +- return false; +- } +- } +- return true; ++ return this.isCompletelyEmpty(null); // Pufferfish - use super + // Paper end + } + +diff --git a/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java b/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java +index 206dc04086a218b510930739a6c573f2653ab0fa..e7e2b0fc88c9320449bcd0e0929269c2508886e4 100644 +--- a/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java ++++ b/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java +@@ -88,6 +88,18 @@ public class LevelChunk extends ChunkAccess { + private final LevelChunkTicks blockTicks; + private final LevelChunkTicks fluidTicks; + ++ // Pufferfish start - instead of using a random every time the chunk is ticked, define when lightning strikes preemptively ++ private int lightningTick; ++ // shouldDoLightning compiles down to 29 bytes, which with the default of 35 byte inlining should guarantee an inline ++ public final boolean shouldDoLightning(net.minecraft.util.RandomSource random) { ++ if (this.lightningTick-- <= 0) { ++ this.lightningTick = random.nextInt(this.level.spigotConfig.thunderChance) << 1; ++ return true; ++ } ++ return false; ++ } ++ // Pufferfish end ++ + public LevelChunk(Level world, ChunkPos pos) { + this(world, pos, UpgradeData.EMPTY, new LevelChunkTicks<>(), new LevelChunkTicks<>(), 0L, (LevelChunkSection[]) null, (LevelChunk.PostLoadProcessor) null, (BlendingData) null); + } +@@ -118,6 +130,7 @@ public class LevelChunk extends ChunkAccess { + this.fluidTicks = fluidTickScheduler; + // CraftBukkit start + this.bukkitChunk = new org.bukkit.craftbukkit.CraftChunk(this); ++ this.lightningTick = this.level.getThreadUnsafeRandom().nextInt(100000) << 1; // Pufferfish - initialize lightning tick + } + + public org.bukkit.Chunk bukkitChunk; +diff --git a/src/main/java/net/minecraft/world/level/chunk/LevelChunkSection.java b/src/main/java/net/minecraft/world/level/chunk/LevelChunkSection.java +index 1b80a91fa36c59a31b57ef7ef4a68eacbb0f17f5..b5e118456af6421ae3f85cb8232dc97a8b2d46b7 100644 +--- a/src/main/java/net/minecraft/world/level/chunk/LevelChunkSection.java ++++ b/src/main/java/net/minecraft/world/level/chunk/LevelChunkSection.java +@@ -27,6 +27,7 @@ public class LevelChunkSection { + public final PalettedContainer states; + // CraftBukkit start - read/write + private PalettedContainer> biomes; ++ public short fluidStateCount; // Pufferfish + public final com.destroystokyo.paper.util.maplist.IBlockDataList tickingList = new com.destroystokyo.paper.util.maplist.IBlockDataList(); // Paper + + public LevelChunkSection(int i, PalettedContainer datapaletteblock, PalettedContainer> palettedcontainerro) { +@@ -198,6 +199,7 @@ public class LevelChunkSection { + + if (!fluid.isEmpty()) { + --this.tickingFluidCount; ++ --this.fluidStateCount; // Pufferfish + } + + if (!state.isAir()) { +@@ -212,6 +214,7 @@ public class LevelChunkSection { + + if (!fluid1.isEmpty()) { + ++this.tickingFluidCount; ++ ++this.fluidStateCount; // Pufferfish + } + + this.updateKnownBlockInfo(x | (z << 4) | (y << 8), iblockdata1, state); // Paper +@@ -260,6 +263,7 @@ public class LevelChunkSection { + if (fluid.isRandomlyTicking()) { + this.tickingFluidCount = (short) (this.tickingFluidCount + 1); + } ++ this.fluidStateCount++; // Pufferfish + } + + }); +diff --git a/src/main/java/net/minecraft/world/level/entity/EntityTickList.java b/src/main/java/net/minecraft/world/level/entity/EntityTickList.java +index 4cdfc433df67afcd455422e9baf56f167dd712ae..57fcf3910f45ce371ac2e237b277b1034caaac4e 100644 +--- a/src/main/java/net/minecraft/world/level/entity/EntityTickList.java ++++ b/src/main/java/net/minecraft/world/level/entity/EntityTickList.java +@@ -8,7 +8,7 @@ import javax.annotation.Nullable; + import net.minecraft.world.entity.Entity; + + public class EntityTickList { +- private final io.papermc.paper.util.maplist.IteratorSafeOrderedReferenceSet entities = new io.papermc.paper.util.maplist.IteratorSafeOrderedReferenceSet<>(true); // Paper - rewrite this, always keep this updated - why would we EVER tick an entity that's not ticking? ++ public final io.papermc.paper.util.maplist.IteratorSafeOrderedReferenceSet entities = new io.papermc.paper.util.maplist.IteratorSafeOrderedReferenceSet<>(true); // Paper - rewrite this, always keep this updated - why would we EVER tick an entity that's not ticking? // Pufferfish - private->public + + private void ensureActiveIsNotIterated() { + // Paper - replace with better logic, do not delay removals +diff --git a/src/main/java/net/minecraft/world/level/material/FlowingFluid.java b/src/main/java/net/minecraft/world/level/material/FlowingFluid.java +index bf4de7b8fd630c596e096a411a8c84c64c13ebf7..6063665b8848a2cd9f0b262eed36a9dd48db6035 100644 +--- a/src/main/java/net/minecraft/world/level/material/FlowingFluid.java ++++ b/src/main/java/net/minecraft/world/level/material/FlowingFluid.java +@@ -43,6 +43,8 @@ public abstract class FlowingFluid extends Fluid { + public static final BooleanProperty FALLING = BlockStateProperties.FALLING; + public static final IntegerProperty LEVEL = BlockStateProperties.LEVEL_FLOWING; + private static final int CACHE_SIZE = 200; ++ // Pufferfish start - use our own cache ++ /* + private static final ThreadLocal> OCCLUSION_CACHE = ThreadLocal.withInitial(() -> { + Object2ByteLinkedOpenHashMap object2bytelinkedopenhashmap = new Object2ByteLinkedOpenHashMap(200) { + protected void rehash(int i) {} +@@ -51,6 +53,14 @@ public abstract class FlowingFluid extends Fluid { + object2bytelinkedopenhashmap.defaultReturnValue((byte) 127); + return object2bytelinkedopenhashmap; + }); ++ */ ++ ++ private static final ThreadLocal> localFluidDirectionCache = ThreadLocal.withInitial(() -> { ++ // Pufferfish todo - mess with this number for performance ++ // with 2048 it seems very infrequent on a small world that it has to remove old entries ++ return new gg.airplane.structs.FluidDirectionCache<>(2048); ++ }); ++ // Pufferfish end + private final Map shapes = Maps.newIdentityHashMap(); + + public FlowingFluid() {} +@@ -239,6 +249,8 @@ public abstract class FlowingFluid extends Fluid { + } + + private boolean canPassThroughWall(Direction face, BlockGetter world, BlockPos pos, BlockState state, BlockPos fromPos, BlockState fromState) { ++ // Pufferfish start - modify to use our cache ++ /* + Object2ByteLinkedOpenHashMap object2bytelinkedopenhashmap; + + if (!state.getBlock().hasDynamicShape() && !fromState.getBlock().hasDynamicShape()) { +@@ -246,9 +258,16 @@ public abstract class FlowingFluid extends Fluid { + } else { + object2bytelinkedopenhashmap = null; + } ++ */ ++ gg.airplane.structs.FluidDirectionCache cache = null; ++ ++ if (!state.getBlock().hasDynamicShape() && !fromState.getBlock().hasDynamicShape()) { ++ cache = localFluidDirectionCache.get(); ++ } + + Block.BlockStatePairKey block_a; + ++ /* + if (object2bytelinkedopenhashmap != null) { + block_a = new Block.BlockStatePairKey(state, fromState, face); + byte b0 = object2bytelinkedopenhashmap.getAndMoveToFirst(block_a); +@@ -259,11 +278,22 @@ public abstract class FlowingFluid extends Fluid { + } else { + block_a = null; + } ++ */ ++ if (cache != null) { ++ block_a = new Block.BlockStatePairKey(state, fromState, face); ++ Boolean flag = cache.getValue(block_a); ++ if (flag != null) { ++ return flag; ++ } ++ } else { ++ block_a = null; ++ } + + VoxelShape voxelshape = state.getCollisionShape(world, pos); + VoxelShape voxelshape1 = fromState.getCollisionShape(world, fromPos); + boolean flag = !Shapes.mergedFaceOccludes(voxelshape, voxelshape1, face); + ++ /* + if (object2bytelinkedopenhashmap != null) { + if (object2bytelinkedopenhashmap.size() == 200) { + object2bytelinkedopenhashmap.removeLastByte(); +@@ -271,6 +301,11 @@ public abstract class FlowingFluid extends Fluid { + + object2bytelinkedopenhashmap.putAndMoveToFirst(block_a, (byte) (flag ? 1 : 0)); + } ++ */ ++ if (cache != null) { ++ cache.putValue(block_a, flag); ++ } ++ // Pufferfish end + + return flag; + } +diff --git a/src/main/java/net/minecraft/world/level/storage/loot/LootContext.java b/src/main/java/net/minecraft/world/level/storage/loot/LootContext.java +index 35f9b11a3a61976c952a2c1c64bb2a932538f54f..9e9ac64764cf0a84e25e75d8d6f516cde6047284 100644 +--- a/src/main/java/net/minecraft/world/level/storage/loot/LootContext.java ++++ b/src/main/java/net/minecraft/world/level/storage/loot/LootContext.java +@@ -41,8 +41,10 @@ public class LootContext { + this.level = world; + this.lootTables = tableGetter; + this.conditions = conditionGetter; +- this.params = ImmutableMap.copyOf(parameters); +- this.dynamicDrops = ImmutableMap.copyOf(drops); ++ // Pufferfish start - use unmodifiable maps instead of immutable ones to skip the copy ++ this.params = java.util.Collections.unmodifiableMap(parameters); ++ this.dynamicDrops = java.util.Collections.unmodifiableMap(drops); ++ // Pufferfish end + } + + public boolean hasParam(LootContextParam parameter) { +diff --git a/src/main/java/net/minecraft/world/phys/shapes/EntityCollisionContext.java b/src/main/java/net/minecraft/world/phys/shapes/EntityCollisionContext.java +index ebe65474a4a05ff1637d7f37ebcfe690af59def5..42142c512b12e5b269c19f1e821c50e7496a5f25 100644 +--- a/src/main/java/net/minecraft/world/phys/shapes/EntityCollisionContext.java ++++ b/src/main/java/net/minecraft/world/phys/shapes/EntityCollisionContext.java +@@ -19,47 +19,66 @@ public class EntityCollisionContext implements CollisionContext { + return defaultValue; + } + }; +- private final boolean descending; +- private final double entityBottom; +- private final ItemStack heldItem; +- private final Predicate canStandOnFluid; ++ // Pufferfish start - remove these and pray no plugin uses them ++ // private final boolean descending; ++ // private final double entityBottom; ++ // private final ItemStack heldItem; ++ // private final Predicate canStandOnFluid; ++ // Pufferfish end + @Nullable + private final Entity entity; + + protected EntityCollisionContext(boolean descending, double minY, ItemStack heldItem, Predicate walkOnFluidPredicate, @Nullable Entity entity) { +- this.descending = descending; +- this.entityBottom = minY; +- this.heldItem = heldItem; +- this.canStandOnFluid = walkOnFluidPredicate; ++ // Pufferfish start - remove these ++ // this.descending = descending; ++ // this.entityBottom = minY; ++ // this.heldItem = heldItem; ++ // this.canStandOnFluid = walkOnFluidPredicate; ++ // Pufferfish end + this.entity = entity; + } + + /** @deprecated */ + @Deprecated + protected EntityCollisionContext(Entity entity) { +- this(entity.isDescending(), entity.getY(), entity instanceof LivingEntity ? ((LivingEntity)entity).getMainHandItem() : ItemStack.EMPTY, entity instanceof LivingEntity ? ((LivingEntity)entity)::canStandOnFluid : (fluidState) -> { +- return false; +- }, entity); ++ // Pufferfish start - remove this ++ // this(entity.isDescending(), entity.getY(), entity instanceof LivingEntity ? ((LivingEntity)entity).getMainHandItem() : ItemStack.EMPTY, entity instanceof LivingEntity ? ((LivingEntity)entity)::canStandOnFluid : (fluidState) -> { ++ // return false; ++ // }, entity); ++ // Pufferfish end ++ this.entity = entity; + } + + @Override + public boolean isHoldingItem(Item item) { +- return this.heldItem.is(item); ++ // Pufferfish start ++ Entity entity = this.entity; ++ if (entity instanceof LivingEntity livingEntity) { ++ return livingEntity.getMainHandItem().is(item); ++ } ++ return ItemStack.EMPTY.is(item); ++ // Pufferfish end + } + + @Override + public boolean canStandOnFluid(FluidState stateAbove, FluidState state) { +- return this.canStandOnFluid.test(state) && !stateAbove.getType().isSame(state.getType()); ++ // Pufferfish start ++ Entity entity = this.entity; ++ if (entity instanceof LivingEntity livingEntity) { ++ return livingEntity.canStandOnFluid(state) && !stateAbove.getType().isSame(state.getType()); ++ } ++ return false; ++ // Pufferfish end + } + + @Override + public boolean isDescending() { +- return this.descending; ++ return this.entity != null && this.entity.isDescending(); // Pufferfish + } + + @Override + public boolean isAbove(VoxelShape shape, BlockPos pos, boolean defaultValue) { +- return this.entityBottom > (double)pos.getY() + shape.max(Direction.Axis.Y) - (double)1.0E-5F; ++ return (this.entity == null ? -Double.MAX_VALUE : entity.getY()) > (double)pos.getY() + shape.max(Direction.Axis.Y) - (double)1.0E-5F; // Pufferfish + } + + @Nullable +diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java +index f9a9d2bb7b6d1bf4a0931438de4d8c7ee0757479..b2d94582037c091bd6a04451bf62b3f9c4923d19 100644 +--- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java ++++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java +@@ -256,7 +256,7 @@ import javax.annotation.Nullable; // Paper + import javax.annotation.Nonnull; // Paper + + public final class CraftServer implements Server { +- private final String serverName = "Paper"; // Paper ++ private final String serverName = "Pufferfish"; // Paper // Pufferfish + private final String serverVersion; + private final String bukkitVersion = Versioning.getBukkitVersion(); + private final Logger logger = Logger.getLogger("Minecraft"); +@@ -1043,6 +1043,11 @@ public final class CraftServer implements Server { + plugin.getDescription().getName(), + "This plugin is not properly shutting down its async tasks when it is being shut down. This task may throw errors during the final shutdown logs and might not complete before process dies." + )); ++ getLogger().log(Level.SEVERE, String.format("%s Stacktrace", worker.getThread().getName())); ++ StackTraceElement[] stackTrace = worker.getThread().getStackTrace(); ++ for (StackTraceElement element : stackTrace) { ++ getLogger().log(Level.SEVERE, " " + element.toString()); ++ } + } + } + // Paper end +diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftShapelessRecipe.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftShapelessRecipe.java +index f7ea77dd82d978ad307f99c743efacfb34478b3d..009ab06182359862b8f543030ec4fe4e2572c93c 100644 +--- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftShapelessRecipe.java ++++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftShapelessRecipe.java +@@ -44,6 +44,6 @@ public class CraftShapelessRecipe extends ShapelessRecipe implements CraftRecipe + data.set(i, toNMS(ingred.get(i), true)); + } + +- MinecraftServer.getServer().getRecipeManager().addRecipe(new net.minecraft.world.item.crafting.ShapelessRecipe(CraftNamespacedKey.toMinecraft(this.getKey()), this.getGroup(), CraftRecipe.getCategory(this.getCategory()), CraftItemStack.asNMSCopy(this.getResult()), data)); ++ MinecraftServer.getServer().getRecipeManager().addRecipe(new net.minecraft.world.item.crafting.ShapelessRecipe(CraftNamespacedKey.toMinecraft(this.getKey()), this.getGroup(), CraftRecipe.getCategory(this.getCategory()), CraftItemStack.asNMSCopy(this.getResult()), data, true)); + } + } +diff --git a/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java b/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java +index 64c50c52c11214740de7903e5592b8b6b2c170b3..d4f62940504e3ef7a70e13b1f4a7726f23b4c637 100644 +--- a/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java ++++ b/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java +@@ -464,7 +464,7 @@ public final class CraftMagicNumbers implements UnsafeValues { + + @Override + public com.destroystokyo.paper.util.VersionFetcher getVersionFetcher() { +- return new com.destroystokyo.paper.PaperVersionFetcher(); ++ return new gg.pufferfish.pufferfish.PufferfishVersionFetcher(); // Pufferfish + } + + @Override +diff --git a/src/main/java/org/bukkit/craftbukkit/util/Versioning.java b/src/main/java/org/bukkit/craftbukkit/util/Versioning.java +index 774556a62eb240da42e84db4502e2ed43495be17..80553face9c70c2a3d897681e7761df85b22d464 100644 +--- a/src/main/java/org/bukkit/craftbukkit/util/Versioning.java ++++ b/src/main/java/org/bukkit/craftbukkit/util/Versioning.java +@@ -11,7 +11,7 @@ public final class Versioning { + public static String getBukkitVersion() { + String result = "Unknown-Version"; + +- InputStream stream = Bukkit.class.getClassLoader().getResourceAsStream("META-INF/maven/io.papermc.paper/paper-api/pom.properties"); ++ InputStream stream = Bukkit.class.getClassLoader().getResourceAsStream("META-INF/maven/gg.pufferfish.pufferfish/pufferfish-api/pom.properties"); // Pufferfish + Properties properties = new Properties(); + + if (stream != null) { +diff --git a/src/main/java/org/spigotmc/ActivationRange.java b/src/main/java/org/spigotmc/ActivationRange.java +index e881584d38dc354204479863f004e974a0ac6c07..63d3fcc45be732a4cd2dc8b5347d860fd6577bdd 100644 +--- a/src/main/java/org/spigotmc/ActivationRange.java ++++ b/src/main/java/org/spigotmc/ActivationRange.java +@@ -38,6 +38,10 @@ import co.aikar.timings.MinecraftTimings; + import net.minecraft.world.entity.schedule.Activity; + import net.minecraft.world.level.Level; + import net.minecraft.world.phys.AABB; ++// Pufferfish start ++import net.minecraft.world.phys.Vec3; ++import java.util.List; ++// Pufferfish end + + public class ActivationRange + { +@@ -216,6 +220,25 @@ public class ActivationRange + for (int i = 0; i < entities.size(); i++) { + Entity entity = entities.get(i); + ActivationRange.activateEntity(entity); ++ ++ // Pufferfish start ++ if (gg.pufferfish.pufferfish.PufferfishConfig.dearEnabled && entity.getType().dabEnabled) { ++ if (!entity.activatedPriorityReset) { ++ entity.activatedPriorityReset = true; ++ entity.activatedPriority = gg.pufferfish.pufferfish.PufferfishConfig.maximumActivationPrio; ++ } ++ Vec3 playerVec = player.position(); ++ Vec3 entityVec = entity.position(); ++ double diffX = playerVec.x - entityVec.x, diffY = playerVec.y - entityVec.y, diffZ = playerVec.z - entityVec.z; ++ int squaredDistance = (int) (diffX * diffX + diffY * diffY + diffZ * diffZ); ++ entity.activatedPriority = squaredDistance > gg.pufferfish.pufferfish.PufferfishConfig.startDistanceSquared ? ++ Math.max(1, Math.min(squaredDistance >> gg.pufferfish.pufferfish.PufferfishConfig.activationDistanceMod, entity.activatedPriority)) : ++ 1; ++ } else { ++ entity.activatedPriority = 1; ++ } ++ // Pufferfish end ++ + } + // Paper end + } +@@ -232,12 +255,12 @@ public class ActivationRange + if ( MinecraftServer.currentTick > entity.activatedTick ) + { + if ( entity.defaultActivationState ) +- { ++ { // Pufferfish - diff on change + entity.activatedTick = MinecraftServer.currentTick; + return; + } + if ( entity.activationType.boundingBox.intersects( entity.getBoundingBox() ) ) +- { ++ { // Pufferfish - diff on change + entity.activatedTick = MinecraftServer.currentTick; + } + } +@@ -291,7 +314,7 @@ public class ActivationRange + if ( entity instanceof LivingEntity ) + { + LivingEntity living = (LivingEntity) entity; +- if ( living.onClimbable() || living.jumping || living.hurtTime > 0 || living.activeEffects.size() > 0 ) // Paper ++ if ( living.onClimableCached() || living.jumping || living.hurtTime > 0 || living.activeEffects.size() > 0 ) // Paper // Pufferfish - use cached + { + return 1; // Paper + } diff --git a/patches/removed/server/0002-Fix-pufferfish-issues.patch b/patches/server/0002-Fix-pufferfish-issues.patch similarity index 91% rename from patches/removed/server/0002-Fix-pufferfish-issues.patch rename to patches/server/0002-Fix-pufferfish-issues.patch index 8856cca80..b33cc4eb0 100644 --- a/patches/removed/server/0002-Fix-pufferfish-issues.patch +++ b/patches/server/0002-Fix-pufferfish-issues.patch @@ -5,12 +5,12 @@ Subject: [PATCH] Fix pufferfish issues diff --git a/src/main/java/gg/pufferfish/pufferfish/PufferfishConfig.java b/src/main/java/gg/pufferfish/pufferfish/PufferfishConfig.java -index 6e441a1a28ba72a8b1cc09fe5fca71b3c70627d4..5c691db595ee412b77f729e90172bc4f8ae57226 100644 +index a8cead500186142115d4dc029c942fdfc68f7fe5..866498779e824b971479e92b736b97aa05ce48a3 100644 --- a/src/main/java/gg/pufferfish/pufferfish/PufferfishConfig.java +++ b/src/main/java/gg/pufferfish/pufferfish/PufferfishConfig.java @@ -224,7 +224,7 @@ public class PufferfishConfig { public static int activationDistanceMod; - + private static void dynamicActivationOfBrains() throws IOException { - dearEnabled = getBoolean("dab.enabled", "activation-range.enabled", true); + dearEnabled = getBoolean("dab.enabled", "activation-range.enabled", false); // Purpur @@ -18,7 +18,7 @@ index 6e441a1a28ba72a8b1cc09fe5fca71b3c70627d4..5c691db595ee412b77f729e90172bc4f "This value determines how far away an entity has to be", "from the player to start being effected by DEAR."); @@ -268,7 +268,7 @@ public class PufferfishConfig { - + public static boolean throttleInactiveGoalSelectorTick; private static void inactiveGoalSelectorThrottle() { - getBoolean("inactive-goal-selector-throttle", "inactive-goal-selector-disable", true, @@ -27,7 +27,7 @@ index 6e441a1a28ba72a8b1cc09fe5fca71b3c70627d4..5c691db595ee412b77f729e90172bc4f "This can improve performance by a few percent, but has minor gameplay implications."); } diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java -index 53198ebfa30273c5ddc1bb4324f5174ff99f688d..ccb905ad68465199516534a2ab74f7b3092297a8 100644 +index ff2862bf1f511196d1e911e2584262ed728e9a81..87d6b8e0cd8fec7959fb052dce1b73feb8cdb967 100644 --- a/src/main/java/net/minecraft/server/level/ServerLevel.java +++ b/src/main/java/net/minecraft/server/level/ServerLevel.java @@ -807,7 +807,7 @@ public class ServerLevel extends Level implements WorldGenLevel { @@ -37,23 +37,23 @@ index 53198ebfa30273c5ddc1bb4324f5174ff99f688d..ccb905ad68465199516534a2ab74f7b3 - // private final io.papermc.paper.util.math.ThreadUnsafeRandom randomTickRandom = new io.papermc.paper.util.math.ThreadUnsafeRandom(); // Pufferfish - moved to super + private final io.papermc.paper.util.math.ThreadUnsafeRandom randomTickRandom = new io.papermc.paper.util.math.ThreadUnsafeRandom(this.random.nextLong()); public net.minecraft.util.RandomSource getThreadUnsafeRandom() { return this.randomTickRandom; } // Pufferfish - moved to super // Purpur - dont break ABI // Paper end - + private int currentIceAndSnowTick = 0; protected void resetIceAndSnowTick() { this.currentIceAndSnowTick = this.randomTickRandom.nextInt(16); } // Pufferfish diff --git a/src/main/java/net/minecraft/world/level/Level.java b/src/main/java/net/minecraft/world/level/Level.java -index edd2c236ca7c37e1a3aec0048b8974f4cd62f2cc..42299fd6ae663b01bb5f010b96887caa744dcb96 100644 +index 6aec1983a0236d6aa0507a2b3ad1c08b3330f0fc..66cc44d9f14b01f6c8e53b0f990866ac897c1c81 100644 --- a/src/main/java/net/minecraft/world/level/Level.java +++ b/src/main/java/net/minecraft/world/level/Level.java -@@ -270,7 +270,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { - +@@ -274,7 +274,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { + public abstract ResourceKey getTypeKey(); - + - protected final io.papermc.paper.util.math.ThreadUnsafeRandom randomTickRandom = new io.papermc.paper.util.math.ThreadUnsafeRandom(java.util.concurrent.ThreadLocalRandom.current().nextLong()); public net.minecraft.util.RandomSource getThreadUnsafeRandom() { return this.randomTickRandom; } // Pufferfish - move thread unsafe random initialization // Pufferfish - getter + //protected final io.papermc.paper.util.math.ThreadUnsafeRandom randomTickRandom = new io.papermc.paper.util.math.ThreadUnsafeRandom(java.util.concurrent.ThreadLocalRandom.current().nextLong()); public net.minecraft.util.RandomSource getThreadUnsafeRandom() { return this.randomTickRandom; } // Pufferfish - move thread unsafe random initialization // Pufferfish - getter // Purpur - dont break ABI - + // Pufferfish start - ensure these get inlined private final int minBuildHeight, minSection, height, maxBuildHeight, maxSection; diff --git a/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java b/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java -index de7a5f3812a017131fd1b32fbeff10e325b1cd2e..aa327e549949052b5babf4101cc2fc9a37868fa8 100644 +index e7e2b0fc88c9320449bcd0e0929269c2508886e4..b5e361d2170d2741ef990ec342f32ccde0c05750 100644 --- a/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java +++ b/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java @@ -130,7 +130,7 @@ public class LevelChunk extends ChunkAccess { @@ -63,5 +63,5 @@ index de7a5f3812a017131fd1b32fbeff10e325b1cd2e..aa327e549949052b5babf4101cc2fc9a - this.lightningTick = this.level.getThreadUnsafeRandom().nextInt(100000) << 1; // Pufferfish - initialize lightning tick + this.lightningTick = java.util.concurrent.ThreadLocalRandom.current().nextInt(100000) << 1; // Pufferfish - initialize lightning tick // Purpur - any random will do } - + public org.bukkit.Chunk bukkitChunk; diff --git a/patches/server/0001-Rebrand.patch b/patches/server/0003-Rebrand.patch similarity index 89% rename from patches/server/0001-Rebrand.patch rename to patches/server/0003-Rebrand.patch index 4236c12ae..3ed0606fa 100644 --- a/patches/server/0001-Rebrand.patch +++ b/patches/server/0003-Rebrand.patch @@ -5,21 +5,25 @@ Subject: [PATCH] Rebrand diff --git a/build.gradle.kts b/build.gradle.kts -index 9cf389defdaeb887e9cad4f0fed3f3b95667b238..761bee802da0d3616ba0739434261b14a030805d 100644 +index b41b186397d013c19436c345be98b785d4bd0295..22470f0ab8354a9f31a0f195f3fe80f2f5ee2f0e 100644 --- a/build.gradle.kts +++ b/build.gradle.kts -@@ -7,8 +7,8 @@ plugins { +@@ -7,12 +7,8 @@ plugins { } dependencies { -- implementation(project(":paper-api")) -- implementation(project(":paper-mojangapi")) +- implementation(project(":pufferfish-api")) // Pufferfish // Paper +- // Pufferfish start +- implementation("io.papermc.paper:paper-mojangapi:1.19.2-R0.1-SNAPSHOT") { +- exclude("io.papermc.paper", "paper-api") +- } +- // Pufferfish end + implementation(project(":purpur-api")) // Purpur + implementation("io.papermc.paper:paper-mojangapi:1.19.4-R0.1-SNAPSHOT") // Purpur // Paper start implementation("org.jline:jline-terminal-jansi:3.21.0") implementation("net.minecrell:terminalconsoleappender:1.3.0") -@@ -38,6 +38,10 @@ dependencies { +@@ -42,6 +38,10 @@ dependencies { } // Paper end @@ -30,16 +34,16 @@ index 9cf389defdaeb887e9cad4f0fed3f3b95667b238..761bee802da0d3616ba0739434261b14 runtimeOnly("org.apache.maven:maven-resolver-provider:3.8.5") runtimeOnly("org.apache.maven.resolver:maven-resolver-connector-basic:1.7.3") runtimeOnly("org.apache.maven.resolver:maven-resolver-transport-http:1.7.3") -@@ -62,7 +66,7 @@ tasks.jar { +@@ -81,7 +81,7 @@ tasks.jar { attributes( "Main-Class" to "org.bukkit.craftbukkit.Main", "Implementation-Title" to "CraftBukkit", -- "Implementation-Version" to "git-Paper-$implementationVersion", -+ "Implementation-Version" to "git-Purpur-$implementationVersion", // Purpur +- "Implementation-Version" to "git-Pufferfish-$implementationVersion", // Pufferfish ++ "Implementation-Version" to "git-Purpur-$implementationVersion", // Pufferfish // Purpur "Implementation-Vendor" to date, // Paper "Specification-Title" to "Bukkit", "Specification-Version" to project.version, -@@ -134,7 +138,7 @@ fun TaskContainer.registerRunTask( +@@ -153,7 +153,7 @@ fun TaskContainer.registerRunTask( name: String, block: JavaExec.() -> Unit ): TaskProvider = register(name) { @@ -171,10 +175,10 @@ index abe37c7c3c6f5ab73afd738ec78f06d7e4d2ed96..b5b6657e52e4f7a630229bd3ba433438 stringbuilder.append(CrashReport.getErrorComment()); stringbuilder.append("\n\n"); diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java -index e67c4a7aaa11f5c67f926f92e0a174af526c2ec3..ac0693f439f063d19ea68d8b216d4ecf10441b15 100644 +index a4c64b1cc11955fb279b8ed0fb7d2668a7b90d2b..ab70642d26439ce071a5ad505a83c81d8836c87f 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java -@@ -924,7 +924,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop // Spigot - Spigot > // CraftBukkit - cb > vanilla! -+ return "Purpur"; // Purpur - Purpur > // Paper - Paper > // Spigot - Spigot > // CraftBukkit - cb > vanilla! +- return "Pufferfish"; // Pufferfish - Pufferfish > // Paper - Paper > // Spigot - Spigot > // CraftBukkit - cb > vanilla! ++ return "Purpur"; // Purpur - Purpur > // Pufferfish - Pufferfish > // Paper - Paper > // Spigot - Spigot > // CraftBukkit - cb > vanilla! } public SystemReport fillSystemReport(SystemReport details) { diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -index f9a9d2bb7b6d1bf4a0931438de4d8c7ee0757479..e288fd33be490b3269470cd0728a81a0ea6385f1 100644 +index b2d94582037c091bd6a04451bf62b3f9c4923d19..430df6a2b852f07e3a1cd9dfcd5ecf3e52e63b66 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java @@ -256,7 +256,7 @@ import javax.annotation.Nullable; // Paper import javax.annotation.Nonnull; // Paper public final class CraftServer implements Server { -- private final String serverName = "Paper"; // Paper -+ private final String serverName = "Purpur"; // Paper // Purpur +- private final String serverName = "Pufferfish"; // Paper // Pufferfish ++ private final String serverName = "Purpur"; // Paper // Pufferfish // Purpur private final String serverVersion; private final String bukkitVersion = Versioning.getBukkitVersion(); private final Logger logger = Logger.getLogger("Minecraft"); @@ -258,16 +262,29 @@ index cdefb2025eedea7e204d70d568adaf1c1ec4c03c..d1526ed7197b883e1d1f07baf285bf5e // We don't need to parse pending // (async tasks must live with race-conditions if they attempt to cancel between these few lines of code) } +diff --git a/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java b/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java +index d4f62940504e3ef7a70e13b1f4a7726f23b4c637..1dd7f923dd6adb41eafc3ea0c063e3aae6670124 100644 +--- a/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java ++++ b/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java +@@ -464,7 +464,7 @@ public final class CraftMagicNumbers implements UnsafeValues { + + @Override + public com.destroystokyo.paper.util.VersionFetcher getVersionFetcher() { +- return new gg.pufferfish.pufferfish.PufferfishVersionFetcher(); // Pufferfish ++ return new com.destroystokyo.paper.PaperVersionFetcher(); // Purpur + } + + @Override diff --git a/src/main/java/org/bukkit/craftbukkit/util/Versioning.java b/src/main/java/org/bukkit/craftbukkit/util/Versioning.java -index 774556a62eb240da42e84db4502e2ed43495be17..fb87620c742ff7912f5e8ccd2a7930dd605576d9 100644 +index 80553face9c70c2a3d897681e7761df85b22d464..99597258e8e88cd9e2c901c4ac3ff7faeeabee2b 100644 --- a/src/main/java/org/bukkit/craftbukkit/util/Versioning.java +++ b/src/main/java/org/bukkit/craftbukkit/util/Versioning.java @@ -11,7 +11,7 @@ public final class Versioning { public static String getBukkitVersion() { String result = "Unknown-Version"; -- InputStream stream = Bukkit.class.getClassLoader().getResourceAsStream("META-INF/maven/io.papermc.paper/paper-api/pom.properties"); -+ InputStream stream = Bukkit.class.getClassLoader().getResourceAsStream("META-INF/maven/org.purpurmc.purpur/purpur-api/pom.properties"); // Purpur +- InputStream stream = Bukkit.class.getClassLoader().getResourceAsStream("META-INF/maven/gg.pufferfish.pufferfish/pufferfish-api/pom.properties"); // Pufferfish ++ InputStream stream = Bukkit.class.getClassLoader().getResourceAsStream("META-INF/maven/org.purpurmc.purpur/purpur-api/pom.properties"); // Pufferfish // Purpur Properties properties = new Properties(); if (stream != null) { diff --git a/patches/server/0002-Purpur-config-files.patch b/patches/server/0004-Purpur-config-files.patch similarity index 96% rename from patches/server/0002-Purpur-config-files.patch rename to patches/server/0004-Purpur-config-files.patch index 708e55b1b..4e1c4da94 100644 --- a/patches/server/0002-Purpur-config-files.patch +++ b/patches/server/0004-Purpur-config-files.patch @@ -5,15 +5,15 @@ Subject: [PATCH] Purpur config files diff --git a/src/main/java/com/destroystokyo/paper/Metrics.java b/src/main/java/com/destroystokyo/paper/Metrics.java -index 4b002e8b75d117b726b0de274a76d3596fce015b..9713263c3bd34ab8a3bfc0a8797ba0b1b88ed733 100644 +index 692c962193cf9fcc6801fc93f3220bdc673d527b..8cde30544e14f8fc2dac32966ae3c21f8cf3a551 100644 --- a/src/main/java/com/destroystokyo/paper/Metrics.java +++ b/src/main/java/com/destroystokyo/paper/Metrics.java @@ -593,7 +593,7 @@ public class Metrics { boolean logFailedRequests = config.getBoolean("logFailedRequests", false); // Only start Metrics, if it's enabled in the config if (config.getBoolean("enabled", true)) { -- Metrics metrics = new Metrics("Paper", serverUUID, logFailedRequests, Bukkit.getLogger()); -+ Metrics metrics = new Metrics("Purpur", serverUUID, logFailedRequests, Bukkit.getLogger()); // Purpur +- Metrics metrics = new Metrics("Pufferfish", serverUUID, logFailedRequests, Bukkit.getLogger()); // Pufferfish ++ Metrics metrics = new Metrics("Purpur", serverUUID, logFailedRequests, Bukkit.getLogger()); // Pufferfish // Purpur metrics.addCustomChart(new Metrics.SimplePie("minecraft_version", () -> { String minecraftVersion = Bukkit.getVersion(); @@ -26,11 +26,11 @@ index 4b002e8b75d117b726b0de274a76d3596fce015b..9713263c3bd34ab8a3bfc0a8797ba0b1 - final String implVersion = org.bukkit.craftbukkit.Main.class.getPackage().getImplementationVersion(); - if (implVersion != null) { - final String buildOrHash = implVersion.substring(implVersion.lastIndexOf('-') + 1); -- paperVersion = "git-Paper-%s-%s".formatted(Bukkit.getServer().getMinecraftVersion(), buildOrHash); +- paperVersion = "git-Pufferfish-%s-%s".formatted(Bukkit.getServer().getMinecraftVersion(), buildOrHash); // Pufferfish - } else { - paperVersion = "unknown"; - } -- metrics.addCustomChart(new Metrics.SimplePie("paper_version", () -> paperVersion)); +- metrics.addCustomChart(new Metrics.SimplePie("pufferfish_version", () -> paperVersion)); // Pufferfish + metrics.addCustomChart(new Metrics.SimplePie("online_mode", () -> Bukkit.getOnlineMode() ? "online" : (io.papermc.paper.configuration.GlobalConfiguration.get().proxies.isProxyOnlineMode() ? "bungee" : "offline"))); // Purpur + metrics.addCustomChart(new Metrics.SimplePie("purpur_version", () -> (org.bukkit.craftbukkit.Main.class.getPackage().getImplementationVersion() != null) ? org.bukkit.craftbukkit.Main.class.getPackage().getImplementationVersion() : "unknown")); // Purpur @@ -72,7 +72,7 @@ index 7b6b51392b123d34382233adcf4c3d4867bdaa32..ccc78857b51e25640ec1e4dcfe4c76a0 if (this.source.acceptsSuccess() && !this.silent) { this.source.sendSystemMessage(message); diff --git a/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java b/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java -index a7e133f3495e9132a5fdae2c24f225e7b026295a..329ebc3d94997199ad342cb8e4d9f103ecca169f 100644 +index ad4fdbdcf09f30d10e61ccf47f8fb9ce6bd92e73..ca6a2fee12ac8a89dae57aa2787462f190463cd0 100644 --- a/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java +++ b/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java @@ -218,6 +218,15 @@ public class DedicatedServer extends MinecraftServer implements ServerInterface @@ -92,7 +92,7 @@ index a7e133f3495e9132a5fdae2c24f225e7b026295a..329ebc3d94997199ad342cb8e4d9f103 io.papermc.paper.brigadier.PaperBrigadierProviderImpl.INSTANCE.getClass(); // init PaperBrigadierProvider // Paper end diff --git a/src/main/java/net/minecraft/world/level/Level.java b/src/main/java/net/minecraft/world/level/Level.java -index 973ecd50f9cb6b86c353586e84d15dcb118ccb60..2ae800110dc90b7f2d96d2c05ba3a53aea6c0c53 100644 +index 66cc44d9f14b01f6c8e53b0f990866ac897c1c81..c38aff50c6f0bc37e539bb4d5206f7b6065fa680 100644 --- a/src/main/java/net/minecraft/world/level/Level.java +++ b/src/main/java/net/minecraft/world/level/Level.java @@ -177,6 +177,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { @@ -103,7 +103,7 @@ index 973ecd50f9cb6b86c353586e84d15dcb118ccb60..2ae800110dc90b7f2d96d2c05ba3a53a public final co.aikar.timings.WorldTimingsHandler timings; // Paper public static BlockPos lastPhysicsProblem; // Spigot private org.spigotmc.TickLimiter entityLimiter; -@@ -277,6 +278,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { +@@ -288,6 +289,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { protected Level(WritableLevelData worlddatamutable, ResourceKey resourcekey, RegistryAccess iregistrycustom, Holder holder, Supplier supplier, boolean flag, boolean flag1, long i, int j, org.bukkit.generator.ChunkGenerator gen, org.bukkit.generator.BiomeProvider biomeProvider, org.bukkit.World.Environment env, java.util.function.Function paperWorldConfigCreator, java.util.concurrent.Executor executor) { // Paper - Async-Anti-Xray - Pass executor this.spigotConfig = new org.spigotmc.SpigotWorldConfig(((net.minecraft.world.level.storage.PrimaryLevelData) worlddatamutable).getLevelName()); // Spigot this.paperConfig = paperWorldConfigCreator.apply(this.spigotConfig); // Paper @@ -112,7 +112,7 @@ index 973ecd50f9cb6b86c353586e84d15dcb118ccb60..2ae800110dc90b7f2d96d2c05ba3a53a this.world = new CraftWorld((ServerLevel) this, gen, biomeProvider, env); diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -index e288fd33be490b3269470cd0728a81a0ea6385f1..3ae359a7334d8e398558fbb7c13cfd490a963d27 100644 +index 430df6a2b852f07e3a1cd9dfcd5ecf3e52e63b66..6f59ff3dda4adaa24065ac388c8de556f3934313 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java @@ -956,6 +956,7 @@ public final class CraftServer implements Server { @@ -139,7 +139,7 @@ index e288fd33be490b3269470cd0728a81a0ea6385f1..3ae359a7334d8e398558fbb7c13cfd49 this.overrideAllCommandBlockCommands = this.commandsConfiguration.getStringList("command-block-overrides").contains("*"); this.ignoreVanillaPermissions = this.commandsConfiguration.getBoolean("ignore-vanilla-permissions"); -@@ -2744,6 +2747,18 @@ public final class CraftServer implements Server { +@@ -2749,6 +2752,18 @@ public final class CraftServer implements Server { return CraftServer.this.console.paperConfigurations.createLegacyObject(CraftServer.this.console); } @@ -159,7 +159,7 @@ index e288fd33be490b3269470cd0728a81a0ea6385f1..3ae359a7334d8e398558fbb7c13cfd49 public void restart() { org.spigotmc.RestartCommand.restart(); diff --git a/src/main/java/org/bukkit/craftbukkit/Main.java b/src/main/java/org/bukkit/craftbukkit/Main.java -index d51650d3e37eb76a0cf991e95d28a552aa567af9..0206b97cdc244998b1a4f148a71457dabb9236de 100644 +index 4966a1e3dd35357a8ea6a7d2944c84c9c3e9058e..f5266df43726a7805ee2664ed18a2dcf79ab6cde 100644 --- a/src/main/java/org/bukkit/craftbukkit/Main.java +++ b/src/main/java/org/bukkit/craftbukkit/Main.java @@ -173,6 +173,14 @@ public class Main { diff --git a/patches/server/0003-Purpur-client-support.patch b/patches/server/0005-Purpur-client-support.patch similarity index 91% rename from patches/server/0003-Purpur-client-support.patch rename to patches/server/0005-Purpur-client-support.patch index 9a47ca79c..ca5f08cf8 100644 --- a/patches/server/0003-Purpur-client-support.patch +++ b/patches/server/0005-Purpur-client-support.patch @@ -17,10 +17,10 @@ index ca5291a9573a62cb5c19539cf5c7aceff11f9829..98d92f6d6a98d66e369286b079db2c4d public ServerPlayer(MinecraftServer server, ServerLevel world, GameProfile profile) { super(world, world.getSharedSpawnPos(), world.getSharedSpawnAngle(), profile); diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -index 2d8488b9aa088b6d5f0c7e557b8ad0b29bc4cd88..5e407aadb8b880f5bb8a485e681d6d6201cb0f31 100644 +index 24d48fb4a63c2db19c7f957ad2260415fe1db9fe..56b9a7059e3b9c2bc66961cb50bc6be3d02cf41c 100644 --- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java +++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -@@ -3523,6 +3523,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic +@@ -3525,6 +3525,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic private static final ResourceLocation CUSTOM_UNREGISTER = new ResourceLocation("unregister"); private static final ResourceLocation MINECRAFT_BRAND = new ResourceLocation("brand"); // Paper - Brand support @@ -28,7 +28,7 @@ index 2d8488b9aa088b6d5f0c7e557b8ad0b29bc4cd88..5e407aadb8b880f5bb8a485e681d6d62 @Override public void handleCustomPayload(ServerboundCustomPayloadPacket packet) { -@@ -3547,6 +3548,13 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic +@@ -3549,6 +3550,13 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic ServerGamePacketListenerImpl.LOGGER.error("Couldn\'t unregister custom payload", ex); this.disconnect("Invalid payload UNREGISTER!", org.bukkit.event.player.PlayerKickEvent.Cause.INVALID_PAYLOAD); // Paper - kick event cause } @@ -43,7 +43,7 @@ index 2d8488b9aa088b6d5f0c7e557b8ad0b29bc4cd88..5e407aadb8b880f5bb8a485e681d6d62 try { byte[] data = new byte[packet.data.readableBytes()]; diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -index eca5e6b93dd84307bf9dbadf32414d6f506e69dc..6c502a804344d2121653d330a689d012cf5c4562 100644 +index 1bada55af5d16437da4d16f9ded55f88a6121eb4..18a32f55727283f73f8d0089a4b1784ae8248076 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java @@ -3148,4 +3148,11 @@ public class CraftPlayer extends CraftHumanEntity implements Player { diff --git a/patches/server/0004-Fix-decompile-errors.patch b/patches/server/0006-Fix-decompile-errors.patch similarity index 100% rename from patches/server/0004-Fix-decompile-errors.patch rename to patches/server/0006-Fix-decompile-errors.patch diff --git a/patches/server/0005-Component-related-conveniences.patch b/patches/server/0007-Component-related-conveniences.patch similarity index 96% rename from patches/server/0005-Component-related-conveniences.patch rename to patches/server/0007-Component-related-conveniences.patch index c4fa028f5..f46694700 100644 --- a/patches/server/0005-Component-related-conveniences.patch +++ b/patches/server/0007-Component-related-conveniences.patch @@ -81,10 +81,10 @@ index 93a1e990b0a6caae4143c2f9d09bfb368fa1d6db..615611fe372d6edaef56db058bbf2cf7 return this.type().msgId(); } diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java -index 9a1e8589e6b371869b2199650172d61ae186c907..bd109784a4ab836febef2926e69a7cf88fd2a873 100644 +index 6e8a76d64418c214fcdd021f23bdfaf9827470a9..a0aeb144f4f92b0cfdee1449b44771d0b6808d35 100644 --- a/src/main/java/net/minecraft/world/entity/Entity.java +++ b/src/main/java/net/minecraft/world/entity/Entity.java -@@ -3874,6 +3874,20 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { +@@ -3908,6 +3908,20 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { return SlotAccess.NULL; } diff --git a/patches/server/0006-Ridables.patch b/patches/server/0008-Ridables.patch similarity index 98% rename from patches/server/0006-Ridables.patch rename to patches/server/0008-Ridables.patch index 72f79d46e..29e20d398 100644 --- a/patches/server/0006-Ridables.patch +++ b/patches/server/0008-Ridables.patch @@ -22,10 +22,10 @@ index b37e0ff164a894d2033fb94bbbc2f630a0e66bcd..ac335ec4f70830c7687ac4e0aa2a6cba super(x, y, z); } diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java -index 4cd9c56b3aea40996e249db163ffed0625d99b16..a5ed221909bd267711fdfb29c4557220c0998b4b 100644 +index ab70642d26439ce071a5ad505a83c81d8836c87f..276d8594a70f30b90d46319d95629fc262617063 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java -@@ -1526,6 +1526,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop 0; // Paper net.minecraft.world.level.block.entity.HopperBlockEntity.skipHopperEvents = worldserver.paperConfig().hopper.disableMoveEvent || org.bukkit.event.inventory.InventoryMoveItemEvent.getHandlerList().getRegisteredListeners().length == 0; // Paper worldserver.hasEntityMoveEvent = io.papermc.paper.event.entity.EntityMoveEvent.getHandlerList().getRegisteredListeners().length > 0; // Paper @@ -34,7 +34,7 @@ index 4cd9c56b3aea40996e249db163ffed0625d99b16..a5ed221909bd267711fdfb29c4557220 this.profiler.push(() -> { return worldserver + " " + worldserver.dimension().location(); diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java -index 5a5ff40df37db9cbd53c584ed26a3ce4888b29c0..ffde1d129c5434e7748cbdaac9109cbd3d0d29bc 100644 +index 87d6b8e0cd8fec7959fb052dce1b73feb8cdb967..b40bc54e80dadc8eb426ed6217b879631833e4d7 100644 --- a/src/main/java/net/minecraft/server/level/ServerLevel.java +++ b/src/main/java/net/minecraft/server/level/ServerLevel.java @@ -220,6 +220,7 @@ public class ServerLevel extends Level implements WorldGenLevel { @@ -66,10 +66,10 @@ index d5369a39c86353bd99b4b404028db2aea97f8438..8fa36563e130f8af0fc60d84d08134fa public void doTick() { diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -index 5e407aadb8b880f5bb8a485e681d6d6201cb0f31..4037ab672c5dfe417307b2c40474b3c48ae529f0 100644 +index 56b9a7059e3b9c2bc66961cb50bc6be3d02cf41c..df46668a78adab398f57b4df98d1347844a6674a 100644 --- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java +++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -@@ -2790,6 +2790,8 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic +@@ -2792,6 +2792,8 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic ServerGamePacketListenerImpl.this.cserver.getPluginManager().callEvent(event); @@ -79,7 +79,7 @@ index 5e407aadb8b880f5bb8a485e681d6d6201cb0f31..4037ab672c5dfe417307b2c40474b3c4 if ((entity instanceof Bucketable && entity instanceof LivingEntity && origItem != null && origItem.asItem() == Items.WATER_BUCKET) && (event.isCancelled() || ServerGamePacketListenerImpl.this.player.getInventory().getSelected() == null || ServerGamePacketListenerImpl.this.player.getInventory().getSelected().getItem() != origItem)) { entity.getEntityData().resendPossiblyDesyncedEntity(player); // Paper - The entire mob gets deleted, so resend it. diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java -index bd109784a4ab836febef2926e69a7cf88fd2a873..ceabcb24504228f25412b8821969b8e151ecaf1b 100644 +index a0aeb144f4f92b0cfdee1449b44771d0b6808d35..f216a136c693a202d1e07f8760ab493e51a4738e 100644 --- a/src/main/java/net/minecraft/world/entity/Entity.java +++ b/src/main/java/net/minecraft/world/entity/Entity.java @@ -361,7 +361,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { @@ -91,7 +91,7 @@ index bd109784a4ab836febef2926e69a7cf88fd2a873..ceabcb24504228f25412b8821969b8e1 private float eyeHeight; public boolean isInPowderSnow; public boolean wasInPowderSnow; -@@ -2788,6 +2788,13 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { +@@ -2822,6 +2822,13 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { this.passengers = ImmutableList.copyOf(list); } @@ -105,7 +105,7 @@ index bd109784a4ab836febef2926e69a7cf88fd2a873..ceabcb24504228f25412b8821969b8e1 this.gameEvent(GameEvent.ENTITY_MOUNT, entity); } return true; // CraftBukkit -@@ -2829,6 +2836,14 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { +@@ -2863,6 +2870,14 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { return false; } // Spigot end @@ -120,7 +120,7 @@ index bd109784a4ab836febef2926e69a7cf88fd2a873..ceabcb24504228f25412b8821969b8e1 if (this.passengers.size() == 1 && this.passengers.get(0) == entity) { this.passengers = ImmutableList.of(); } else { -@@ -4645,4 +4660,45 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { +@@ -4731,4 +4746,45 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { return ((net.minecraft.server.level.ServerChunkCache) level.getChunkSource()).isPositionTicking(this); } // Paper end @@ -191,10 +191,10 @@ index c1e9b40a4a0f9cdc650caa88b5ea132e06ee2496..7b1ca8fd2908b8a02ec2cd1966a31e06 protected ParticleOptions getInkParticle() { return ParticleTypes.GLOW_SQUID_INK; diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java -index dcfb71b5a53df789e366fea2080921d677549a2e..e8798de526e2836308eca8e5f4a4388aa7e9d3c0 100644 +index 791f672b30f2a4d3b329e2ce0f4fb9c2ca627b01..223371a33f1c22874d9cc7b8655fef4c61ee5cb4 100644 --- a/src/main/java/net/minecraft/world/entity/LivingEntity.java +++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java -@@ -217,9 +217,9 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -216,9 +216,9 @@ public abstract class LivingEntity extends Entity implements Attackable { protected int deathScore; public float lastHurt; public boolean jumping; @@ -207,7 +207,7 @@ index dcfb71b5a53df789e366fea2080921d677549a2e..e8798de526e2836308eca8e5f4a4388a protected int lerpSteps; protected double lerpX; protected double lerpY; -@@ -285,7 +285,7 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -284,7 +284,7 @@ public abstract class LivingEntity extends Entity implements Attackable { this.effectsDirty = true; this.useItem = ItemStack.EMPTY; this.lastClimbablePos = Optional.empty(); @@ -216,7 +216,7 @@ index dcfb71b5a53df789e366fea2080921d677549a2e..e8798de526e2836308eca8e5f4a4388a this.craftAttributes = new CraftAttributeMap(this.attributes); // CraftBukkit // CraftBukkit - setHealth(getMaxHealth()) inlined and simplified to skip the instanceof check for EntityPlayer, as getBukkitEntity() is not initialized in constructor this.entityData.set(LivingEntity.DATA_HEALTH_ID, (float) this.getAttribute(Attributes.MAX_HEALTH).getValue()); -@@ -336,6 +336,7 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -335,6 +335,7 @@ public abstract class LivingEntity extends Entity implements Attackable { public static AttributeSupplier.Builder createLivingAttributes() { return AttributeSupplier.builder().add(Attributes.MAX_HEALTH).add(Attributes.KNOCKBACK_RESISTANCE).add(Attributes.MOVEMENT_SPEED).add(Attributes.ARMOR).add(Attributes.ARMOR_TOUGHNESS); } @@ -224,7 +224,7 @@ index dcfb71b5a53df789e366fea2080921d677549a2e..e8798de526e2836308eca8e5f4a4388a @Override protected void checkFallDamage(double heightDifference, boolean onGround, BlockState state, BlockPos landedPosition) { -@@ -2630,7 +2631,7 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -2652,7 +2653,7 @@ public abstract class LivingEntity extends Entity implements Attackable { } protected long lastJumpTime = 0L; // Paper @@ -233,7 +233,7 @@ index dcfb71b5a53df789e366fea2080921d677549a2e..e8798de526e2836308eca8e5f4a4388a double d0 = (double) this.getJumpPower() + this.getJumpBoostPower(); Vec3 vec3d = this.getDeltaMovement(); // Paper start -@@ -3394,8 +3395,10 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -3416,8 +3417,10 @@ public abstract class LivingEntity extends Entity implements Attackable { this.pushEntities(); this.level.getProfiler().pop(); // Paper start @@ -246,7 +246,7 @@ index dcfb71b5a53df789e366fea2080921d677549a2e..e8798de526e2836308eca8e5f4a4388a 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()); -@@ -3405,6 +3408,21 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -3427,6 +3430,21 @@ public abstract class LivingEntity extends Entity implements Attackable { absMoveTo(event.getTo().getX(), event.getTo().getY(), event.getTo().getZ(), event.getTo().getYaw(), event.getTo().getPitch()); } } @@ -269,7 +269,7 @@ index dcfb71b5a53df789e366fea2080921d677549a2e..e8798de526e2836308eca8e5f4a4388a // Paper end if (!this.level.isClientSide && this.isSensitiveToWater() && this.isInWaterRainOrBubble()) { diff --git a/src/main/java/net/minecraft/world/entity/Mob.java b/src/main/java/net/minecraft/world/entity/Mob.java -index 02cb6b8c1d59855ff4a8aad3024fe12007eca0ee..76d8bab7cc1bdbd1946af60a1a2ffef1c7ef4415 100644 +index 636e601b004a412d02e5be86e97d489b52c28e1b..f6ec6a249b4559e681382c9690ddc7b9e17c9efb 100644 --- a/src/main/java/net/minecraft/world/entity/Mob.java +++ b/src/main/java/net/minecraft/world/entity/Mob.java @@ -146,8 +146,8 @@ public abstract class Mob extends LivingEntity implements Targeting { @@ -283,7 +283,7 @@ index 02cb6b8c1d59855ff4a8aad3024fe12007eca0ee..76d8bab7cc1bdbd1946af60a1a2ffef1 this.jumpControl = new JumpControl(this); this.bodyRotationControl = this.createBodyControl(); this.navigation = this.createNavigation(world); -@@ -1372,7 +1372,7 @@ public abstract class Mob extends LivingEntity implements Targeting { +@@ -1378,7 +1378,7 @@ public abstract class Mob extends LivingEntity implements Targeting { protected void onOffspringSpawnedFromEgg(Player player, Mob child) {} protected InteractionResult mobInteract(Player player, InteractionHand hand) { @@ -292,7 +292,7 @@ index 02cb6b8c1d59855ff4a8aad3024fe12007eca0ee..76d8bab7cc1bdbd1946af60a1a2ffef1 } public boolean isWithinRestriction() { -@@ -1748,4 +1748,56 @@ public abstract class Mob extends LivingEntity implements Targeting { +@@ -1754,4 +1754,56 @@ public abstract class Mob extends LivingEntity implements Targeting { return itemmonsteregg == null ? null : new ItemStack(itemmonsteregg); } @@ -350,13 +350,13 @@ index 02cb6b8c1d59855ff4a8aad3024fe12007eca0ee..76d8bab7cc1bdbd1946af60a1a2ffef1 + // Purpur end } diff --git a/src/main/java/net/minecraft/world/entity/ai/attributes/AttributeMap.java b/src/main/java/net/minecraft/world/entity/ai/attributes/AttributeMap.java -index dd1102d5291ef6f18e82400a6d8a0a376cc071e9..9932a801be1bde1c57697396c097fb47a6b26ede 100644 +index e283eb57c25f7de222f9d09dca851169f5f6e488..210a0bee1227e4671909dd553ab22027cfc868fb 100644 --- a/src/main/java/net/minecraft/world/entity/ai/attributes/AttributeMap.java +++ b/src/main/java/net/minecraft/world/entity/ai/attributes/AttributeMap.java -@@ -23,13 +23,20 @@ public class AttributeMap { - private final Map attributes = Maps.newHashMap(); +@@ -24,14 +24,21 @@ public class AttributeMap { private final Set dirtyAttributes = Sets.newHashSet(); private final AttributeSupplier supplier; + private final java.util.function.Function createInstance; // Pufferfish + private final net.minecraft.world.entity.LivingEntity entity; // Purpur public AttributeMap(AttributeSupplier defaultAttributes) { @@ -367,6 +367,7 @@ index dd1102d5291ef6f18e82400a6d8a0a376cc071e9..9932a801be1bde1c57697396c097fb47 + this.entity = entity; + // Purpur end this.supplier = defaultAttributes; + this.createInstance = attribute -> this.supplier.createInstance(this::onAttributeModified, attribute); // Pufferfish } private void onAttributeModified(AttributeInstance instance) { @@ -375,7 +376,7 @@ index dd1102d5291ef6f18e82400a6d8a0a376cc071e9..9932a801be1bde1c57697396c097fb47 this.dirtyAttributes.add(instance); } -@@ -41,7 +48,7 @@ public class AttributeMap { +@@ -43,7 +50,7 @@ public class AttributeMap { public Collection getSyncableAttributes() { return this.attributes.values().stream().filter((attribute) -> { @@ -538,7 +539,7 @@ index 7df56705a4a0de2dc4ff7ab133fc26612c219162..60d21d6171b9af20a4c6fcc0d564a31a } diff --git a/src/main/java/net/minecraft/world/entity/ambient/Bat.java b/src/main/java/net/minecraft/world/entity/ambient/Bat.java -index f5efdf59617d43de18a2267351fa784c0be3ae83..a48d40e4242f35c6830286739172459635be3e43 100644 +index 59338d739b6130f667d151bc27646c4a346886a2..29bfea3c4f92033aed1de1cf159d61b38708a281 100644 --- a/src/main/java/net/minecraft/world/entity/ambient/Bat.java +++ b/src/main/java/net/minecraft/world/entity/ambient/Bat.java @@ -18,6 +18,7 @@ import net.minecraft.world.entity.EntityDimensions; @@ -2152,7 +2153,7 @@ index 612601b2536dc522356d4dd2c2ea1192f6435f72..c8a18ecd36393747a95ad9026c5a7b1d this.targetSelector.addGoal(2, new OwnerHurtTargetGoal(this)); this.targetSelector.addGoal(3, (new HurtByTargetGoal(this, new Class[0])).setAlertOthers()); diff --git a/src/main/java/net/minecraft/world/entity/animal/allay/Allay.java b/src/main/java/net/minecraft/world/entity/animal/allay/Allay.java -index 9b57d2b766f2de2d3fb4a3b5ef4df8d6756a1942..3e5755764eb585c861c607c1f9fbeeeffc33cff1 100644 +index a41d8101c960163803179d3717889aee6182d0bb..c743f487b7a327ee66cffc86cbe5d13c81fd2cab 100644 --- a/src/main/java/net/minecraft/world/entity/animal/allay/Allay.java +++ b/src/main/java/net/minecraft/world/entity/animal/allay/Allay.java @@ -101,10 +101,23 @@ public class Allay extends PathfinderMob implements InventoryCarrier { @@ -2210,7 +2211,7 @@ index 9b57d2b766f2de2d3fb4a3b5ef4df8d6756a1942..3e5755764eb585c861c607c1f9fbeeef protected Brain.Provider brainProvider() { return Brain.provider(Allay.MEMORY_TYPES, Allay.SENSOR_TYPES); diff --git a/src/main/java/net/minecraft/world/entity/animal/axolotl/Axolotl.java b/src/main/java/net/minecraft/world/entity/animal/axolotl/Axolotl.java -index a4e98b02175da96472474b8d7ad5975ce4d2fc43..f30aad7e722f895b8f6966f042021fc80f470994 100644 +index 38d21943fb2940f53c2d0ac2c3b94a6f0e46e700..2c5aa1fe81a2411de81c233092bbe3841ed627ea 100644 --- a/src/main/java/net/minecraft/world/entity/animal/axolotl/Axolotl.java +++ b/src/main/java/net/minecraft/world/entity/animal/axolotl/Axolotl.java @@ -98,6 +98,23 @@ public class Axolotl extends Animal implements LerpingModel, VariantHolder getModelRotationValues() { return this.modelRotationValues; -@@ -519,14 +536,22 @@ public class Axolotl extends Animal implements LerpingModel, VariantHolder { @@ -2343,7 +2344,7 @@ index a65cec3c9837882df5b61de58f03d276d4db6bfc..12962698dd354dc5da325e8bb24e5fff @Override protected Brain.Provider brainProvider() { return Brain.provider(MEMORY_TYPES, SENSOR_TYPES); -@@ -374,7 +423,7 @@ public class Frog extends Animal implements VariantHolder { +@@ -376,7 +425,7 @@ public class Frog extends Animal implements VariantHolder { return world.getBlockState(pos.below()).is(BlockTags.FROGS_SPAWNABLE_ON) && isBrightEnoughToSpawn(world, pos); } @@ -2353,7 +2354,7 @@ index a65cec3c9837882df5b61de58f03d276d4db6bfc..12962698dd354dc5da325e8bb24e5fff super(entity); } diff --git a/src/main/java/net/minecraft/world/entity/animal/frog/Tadpole.java b/src/main/java/net/minecraft/world/entity/animal/frog/Tadpole.java -index 9058f9f2e561cda9f475f33218bf7a78297de4bc..5551f67b4b4a32487c2f26f2c1e1e97cb21a22ee 100644 +index e591b0a09f5a8475b3ec9cd28bd5d5b69809ed73..63553436193cc3063cd4c4e9f50695fb5209ff9d 100644 --- a/src/main/java/net/minecraft/world/entity/animal/frog/Tadpole.java +++ b/src/main/java/net/minecraft/world/entity/animal/frog/Tadpole.java @@ -45,13 +45,50 @@ public class Tadpole extends AbstractFish { @@ -2409,7 +2410,7 @@ index 9058f9f2e561cda9f475f33218bf7a78297de4bc..5551f67b4b4a32487c2f26f2c1e1e97c protected PathNavigation createNavigation(Level world) { return new WaterBoundPathNavigation(this, world); diff --git a/src/main/java/net/minecraft/world/entity/animal/goat/Goat.java b/src/main/java/net/minecraft/world/entity/animal/goat/Goat.java -index cfa904d42734d0fb0c1ed8b18f4d8bc131027962..1cfc1ade52b79c6c5577935fe5c37a0e7a1673f0 100644 +index 4fdc3bd591b6df4c28901e4571aa23baf034d885..81790ac38ef67682053751a9e6813eed8d744337 100644 --- a/src/main/java/net/minecraft/world/entity/animal/goat/Goat.java +++ b/src/main/java/net/minecraft/world/entity/animal/goat/Goat.java @@ -89,6 +89,23 @@ public class Goat extends Animal { @@ -2436,11 +2437,12 @@ index cfa904d42734d0fb0c1ed8b18f4d8bc131027962..1cfc1ade52b79c6c5577935fe5c37a0e @Override protected Brain.Provider brainProvider() { return Brain.provider(Goat.MEMORY_TYPES, Goat.SENSOR_TYPES); -@@ -191,6 +208,7 @@ public class Goat extends Animal { +@@ -192,7 +209,7 @@ public class Goat extends Animal { @Override protected void customServerAiStep() { this.level.getProfiler().push("goatBrain"); -+ if ((getRider() == null || !this.isControllable())/* && this.behaviorTick++ % this.activatedPriority == 0*/) // Pufferfish // Purpur - only use brain if no rider TODO: uncomment when including 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((ServerLevel) this.level, this); this.level.getProfiler().pop(); this.level.getProfiler().push("goatActivityUpdate"); @@ -3417,7 +3419,7 @@ index d02286d553c600fe7e75f48e278e380d21c5b868..4fbae6e88daaabfce22bb9d6e60e02a1 return Guardian.createAttributes().add(Attributes.MOVEMENT_SPEED, 0.30000001192092896D).add(Attributes.ATTACK_DAMAGE, 8.0D).add(Attributes.MAX_HEALTH, 80.0D); } diff --git a/src/main/java/net/minecraft/world/entity/monster/EnderMan.java b/src/main/java/net/minecraft/world/entity/monster/EnderMan.java -index 418d6301f067803e2471e59ac2d52a68cbff249b..db5427939d62434ad2d3271e44ffad58b96f121b 100644 +index c2f5dabb41b172547864decc06aa632d89dff3e1..d1e6b930fe393c4e3c52749819373cc98092aa20 100644 --- a/src/main/java/net/minecraft/world/entity/monster/EnderMan.java +++ b/src/main/java/net/minecraft/world/entity/monster/EnderMan.java @@ -92,9 +92,27 @@ public class EnderMan extends Monster implements NeutralMob { @@ -3465,7 +3467,7 @@ index 418d6301f067803e2471e59ac2d52a68cbff249b..db5427939d62434ad2d3271e44ffad58 float f = this.getLightLevelDependentMagicValue(); if (f > 0.5F && this.level.canSeeSky(this.blockPosition()) && this.random.nextFloat() * 30.0F < (f - 0.4F) * 2.0F && this.tryEscape(com.destroystokyo.paper.event.entity.EndermanEscapeEvent.Reason.RUNAWAY)) { // Paper -@@ -398,6 +417,7 @@ public class EnderMan extends Monster implements NeutralMob { +@@ -404,6 +423,7 @@ public class EnderMan extends Monster implements NeutralMob { public boolean hurt(DamageSource source, float amount) { if (this.isInvulnerableTo(source)) { return false; @@ -4806,7 +4808,7 @@ index b75945807b425609394c343da56c316a769f0a29..ad82c064c9e31ffc1dd96e4451718763 public void setPersistentAngerTarget(@Nullable UUID angryAt) { this.persistentAngerTarget = angryAt; diff --git a/src/main/java/net/minecraft/world/entity/monster/hoglin/Hoglin.java b/src/main/java/net/minecraft/world/entity/monster/hoglin/Hoglin.java -index 5d3b3cb3a882eb5d716f678095a65b28d0967476..b4deb7fa656aadd9c62db68bb46d3fb39f8429e5 100644 +index daa2224b021c966751eb39f269ffbfe6e7f3d426..74d3068c4f74c19740ad3e2f507489d405d78598 100644 --- a/src/main/java/net/minecraft/world/entity/monster/hoglin/Hoglin.java +++ b/src/main/java/net/minecraft/world/entity/monster/hoglin/Hoglin.java @@ -67,6 +67,23 @@ public class Hoglin extends Animal implements Enemy, HoglinBase { @@ -4833,16 +4835,17 @@ index 5d3b3cb3a882eb5d716f678095a65b28d0967476..b4deb7fa656aadd9c62db68bb46d3fb3 @Override public boolean canBeLeashed(Player player) { return !this.isLeashed(); -@@ -129,6 +146,7 @@ public class Hoglin extends Animal implements Enemy, HoglinBase { +@@ -130,7 +147,7 @@ public class Hoglin extends Animal implements Enemy, HoglinBase { @Override protected void customServerAiStep() { this.level.getProfiler().push("hoglinBrain"); -+ if ((getRider() == null || !this.isControllable())/* && this.behaviorTick++ % this.activatedPriority == 0*/) // Pufferfish // Purpur - only use brain if no rider TODO: uncomment when including 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((ServerLevel)this.level, this); this.level.getProfiler().pop(); HoglinAi.updateActivity(this); diff --git a/src/main/java/net/minecraft/world/entity/monster/piglin/Piglin.java b/src/main/java/net/minecraft/world/entity/monster/piglin/Piglin.java -index afa7ecfa8453da510ec5ccecb1ceeb1d9893d259..dad688184896720099357bf91fe092da3eac8931 100644 +index b401fb4f276ca81b4bb18426ee56abed8a9f7a7b..5dcaa05ee11872502736c39588dfe03cb59c8e2d 100644 --- a/src/main/java/net/minecraft/world/entity/monster/piglin/Piglin.java +++ b/src/main/java/net/minecraft/world/entity/monster/piglin/Piglin.java @@ -97,6 +97,23 @@ public class Piglin extends AbstractPiglin implements CrossbowAttackMob, Invento @@ -4869,11 +4872,12 @@ index afa7ecfa8453da510ec5ccecb1ceeb1d9893d259..dad688184896720099357bf91fe092da @Override public void addAdditionalSaveData(CompoundTag nbt) { super.addAdditionalSaveData(nbt); -@@ -311,6 +328,7 @@ public class Piglin extends AbstractPiglin implements CrossbowAttackMob, Invento +@@ -312,7 +329,7 @@ public class Piglin extends AbstractPiglin implements CrossbowAttackMob, Invento @Override protected void customServerAiStep() { this.level.getProfiler().push("piglinBrain"); -+ if ((getRider() == null || !this.isControllable())/* && this.behaviorTick++ % this.activatedPriority == 0*/) // Pufferfish // Purpur - only use brain if no rider TODO: uncomment when including 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((ServerLevel) this.level, this); this.level.getProfiler().pop(); PiglinAi.updateActivity(this); @@ -4914,7 +4918,7 @@ index 769e4fbaac01a4fe3a45bd9cab5c63b61fc69f53..ac066b2f3e369321752470722941ae26 this.level.getProfiler().pop(); PiglinBruteAi.updateActivity(this); diff --git a/src/main/java/net/minecraft/world/entity/monster/warden/Warden.java b/src/main/java/net/minecraft/world/entity/monster/warden/Warden.java -index b2b63d9df3c07696f47281e9be74f1799f50b93e..129bba44b8a5ada75b2f73050522975e56d9a069 100644 +index 907d77dd74066c723238155b42028a811365b1f8..f40806e7d9c08cf7b85215fbf0c66169eb4dc6ae 100644 --- a/src/main/java/net/minecraft/world/entity/monster/warden/Warden.java +++ b/src/main/java/net/minecraft/world/entity/monster/warden/Warden.java @@ -120,8 +120,32 @@ public class Warden extends Monster implements VibrationListener.VibrationListen @@ -4950,7 +4954,7 @@ index b2b63d9df3c07696f47281e9be74f1799f50b93e..129bba44b8a5ada75b2f73050522975e @Override public Packet getAddEntityPacket() { return new ClientboundAddEntityPacket(this, this.hasPose(Pose.EMERGING) ? 1 : 0); -@@ -403,19 +427,16 @@ public class Warden extends Monster implements VibrationListener.VibrationListen +@@ -405,19 +429,16 @@ public class Warden extends Monster implements VibrationListener.VibrationListen @Contract("null->false") public boolean canTargetEntity(@Nullable Entity entity) { @@ -4974,10 +4978,10 @@ index b2b63d9df3c07696f47281e9be74f1799f50b93e..129bba44b8a5ada75b2f73050522975e public static void applyDarknessAround(ServerLevel world, Vec3 pos, @Nullable Entity entity, int range) { diff --git a/src/main/java/net/minecraft/world/entity/npc/Villager.java b/src/main/java/net/minecraft/world/entity/npc/Villager.java -index 6023b9eb3001e1a98ab8b970d853c4e7c7603f4d..dcebf1f79f11b032c12199db8ca0a40396663871 100644 +index 5402a084ef5fe0b3cfea897a90cffade1eff5b66..bf232c81f07e5783071b79b5f3510f9ed473e400 100644 --- a/src/main/java/net/minecraft/world/entity/npc/Villager.java +++ b/src/main/java/net/minecraft/world/entity/npc/Villager.java -@@ -153,6 +153,28 @@ public class Villager extends AbstractVillager implements ReputationEventHandler +@@ -155,6 +155,28 @@ public class Villager extends AbstractVillager implements ReputationEventHandler this.setVillagerData(this.getVillagerData().setType(type).setProfession(VillagerProfession.NONE)); } @@ -5006,19 +5010,16 @@ index 6023b9eb3001e1a98ab8b970d853c4e7c7603f4d..dcebf1f79f11b032c12199db8ca0a403 @Override public Brain getBrain() { return (Brain) super.getBrain(); // CraftBukkit - decompile error -@@ -247,7 +269,10 @@ public class Villager extends AbstractVillager implements ReputationEventHandler - protected void customServerAiStep() { mobTick(false); } - protected void mobTick(boolean inactive) { +@@ -252,7 +274,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler this.level.getProfiler().push("villagerBrain"); -- if (!inactive) this.getBrain().tick((ServerLevel) this.level, this); // Paper -+ if (!inactive) { -+ if ((getRider() == null || !this.isControllable())/* && this.behaviorTick++ % this.activatedPriority == 0*/) // Pufferfish // Purpur - only use brain if no rider TODO: uncomment when including Pufferfish -+ this.getBrain().tick((ServerLevel) this.level, this); // Paper -+ } - this.level.getProfiler().pop(); - if (this.assignProfessionWhenSpawned) { - this.assignProfessionWhenSpawned = false; -@@ -304,7 +329,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler + // Pufferfish start + if (!inactive) { +- 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((ServerLevel) this.level, this); // Paper + } + // Pufferfish end +@@ -312,7 +334,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler if (!itemstack.is(Items.VILLAGER_SPAWN_EGG) && this.isAlive() && !this.isTrading() && !this.isSleeping()) { if (this.isBaby()) { this.setUnhappy(); @@ -5027,7 +5028,7 @@ index 6023b9eb3001e1a98ab8b970d853c4e7c7603f4d..dcebf1f79f11b032c12199db8ca0a403 } else { boolean flag = this.getOffers().isEmpty(); -@@ -317,8 +342,9 @@ public class Villager extends AbstractVillager implements ReputationEventHandler +@@ -325,8 +347,9 @@ public class Villager extends AbstractVillager implements ReputationEventHandler } if (flag) { diff --git a/patches/server/0007-Configurable-entity-base-attributes.patch b/patches/server/0009-Configurable-entity-base-attributes.patch similarity index 99% rename from patches/server/0007-Configurable-entity-base-attributes.patch rename to patches/server/0009-Configurable-entity-base-attributes.patch index 3232229c2..120dfca1d 100644 --- a/patches/server/0007-Configurable-entity-base-attributes.patch +++ b/patches/server/0009-Configurable-entity-base-attributes.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Configurable entity base attributes diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java -index ceabcb24504228f25412b8821969b8e151ecaf1b..d6ac9c9811449a651e6d13538b9efa7015617b09 100644 +index f216a136c693a202d1e07f8760ab493e51a4738e..a0f63263a2439df93757309a6d9f6394abf81073 100644 --- a/src/main/java/net/minecraft/world/entity/Entity.java +++ b/src/main/java/net/minecraft/world/entity/Entity.java @@ -155,7 +155,7 @@ import org.bukkit.plugin.PluginManager; @@ -34,10 +34,10 @@ index 7b1ca8fd2908b8a02ec2cd1966a31e06eaa2dd1f..b86329a18dc83073462049da975dd71b @Override diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java -index e8798de526e2836308eca8e5f4a4388aa7e9d3c0..1152cdb64ff72358292400d33a4a4f3ca88eff75 100644 +index 223371a33f1c22874d9cc7b8655fef4c61ee5cb4..d8b8547f5561baa5f39d6b5f251a484033483757 100644 --- a/src/main/java/net/minecraft/world/entity/LivingEntity.java +++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java -@@ -286,6 +286,7 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -285,6 +285,7 @@ public abstract class LivingEntity extends Entity implements Attackable { this.useItem = ItemStack.EMPTY; this.lastClimbablePos = Optional.empty(); this.attributes = new AttributeMap(DefaultAttributes.getSupplier(type), this); // Purpur @@ -45,7 +45,7 @@ index e8798de526e2836308eca8e5f4a4388aa7e9d3c0..1152cdb64ff72358292400d33a4a4f3c this.craftAttributes = new CraftAttributeMap(this.attributes); // CraftBukkit // CraftBukkit - setHealth(getMaxHealth()) inlined and simplified to skip the instanceof check for EntityPlayer, as getBukkitEntity() is not initialized in constructor this.entityData.set(LivingEntity.DATA_HEALTH_ID, (float) this.getAttribute(Attributes.MAX_HEALTH).getValue()); -@@ -301,6 +302,8 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -300,6 +301,8 @@ public abstract class LivingEntity extends Entity implements Attackable { this.brain = this.makeBrain(new Dynamic(dynamicopsnbt, (Tag) dynamicopsnbt.createMap((Map) ImmutableMap.of(dynamicopsnbt.createString("memories"), (Tag) dynamicopsnbt.emptyMap())))); } @@ -55,7 +55,7 @@ index e8798de526e2836308eca8e5f4a4388aa7e9d3c0..1152cdb64ff72358292400d33a4a4f3c return this.brain; } diff --git a/src/main/java/net/minecraft/world/entity/ambient/Bat.java b/src/main/java/net/minecraft/world/entity/ambient/Bat.java -index a48d40e4242f35c6830286739172459635be3e43..da2b0dfd8a3c033488a1e5d928c40fd66ada5091 100644 +index 29bfea3c4f92033aed1de1cf159d61b38708a281..b1fb9035dc3a1e0d34e1e339f89d9eba073b0d1c 100644 --- a/src/main/java/net/minecraft/world/entity/ambient/Bat.java +++ b/src/main/java/net/minecraft/world/entity/ambient/Bat.java @@ -93,6 +93,18 @@ public class Bat extends AmbientCreature { @@ -459,7 +459,7 @@ index c8a18ecd36393747a95ad9026c5a7b1d62ff727a..05792466a89bdcffe1a4241761b7c23a @Override diff --git a/src/main/java/net/minecraft/world/entity/animal/axolotl/Axolotl.java b/src/main/java/net/minecraft/world/entity/animal/axolotl/Axolotl.java -index f30aad7e722f895b8f6966f042021fc80f470994..eaf2e6b9865a36b7c648bd1205db922a62cd7ee8 100644 +index 2c5aa1fe81a2411de81c233092bbe3841ed627ea..65587c422eb7e2b64670dd869e01297998765c30 100644 --- a/src/main/java/net/minecraft/world/entity/animal/axolotl/Axolotl.java +++ b/src/main/java/net/minecraft/world/entity/animal/axolotl/Axolotl.java @@ -113,6 +113,11 @@ public class Axolotl extends Animal implements LerpingModel, VariantHolder org.spigotmc.SpigotConfig.movedWronglyThreshold && !this.player.isSleeping() && !this.player.gameMode.isCreative() && this.player.gameMode.getGameModeForPlayer() != GameType.SPECTATOR) { // Spigot flag2 = true; // Paper - diff on change, this should be moved wrongly @@ -128,7 +128,7 @@ index 4037ab672c5dfe417307b2c40474b3c48ae529f0..1e3aa42d2e293f465d91964d2a5aa911 } this.player.absMoveTo(d0, d1, d2, f, f1); -@@ -1588,6 +1610,8 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic +@@ -1589,6 +1611,8 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic this.lastYaw = to.getYaw(); this.lastPitch = to.getPitch(); @@ -172,7 +172,7 @@ index 72abebff2018cde2922e97ad6478f93da9aed3ec..412963d7af38a53b6010007278d959a5 private EntitySelector() {} // Paper start diff --git a/src/main/java/net/minecraft/world/entity/ai/targeting/TargetingConditions.java b/src/main/java/net/minecraft/world/entity/ai/targeting/TargetingConditions.java -index a7575b5ef56af6f53448d391abb4956e130148ca..0a9e4dc5d6d567605c587df9bcbb57d379b62877 100644 +index e752c83df50fb9b670ecea2abc95426c2a009b6f..baa4f9026d31de92210300ecb8ee8c1b6d575435 100644 --- a/src/main/java/net/minecraft/world/entity/ai/targeting/TargetingConditions.java +++ b/src/main/java/net/minecraft/world/entity/ai/targeting/TargetingConditions.java @@ -64,6 +64,10 @@ public class TargetingConditions { @@ -218,7 +218,7 @@ index 3b959f42d958bf0f426853aee56753d6c455fcdb..d17abb283ea818244df0379d6b57fc63 if (range < 0.0D || d < range * range) { return true; diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -index 6c502a804344d2121653d330a689d012cf5c4562..840849cebbf9090c21923d30e0e3afbc7f14ac43 100644 +index 18a32f55727283f73f8d0089a4b1784ae8248076..2d1ff613dabbc6ae247caf03e79bb7033c28c739 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java @@ -525,10 +525,15 @@ public class CraftPlayer extends CraftHumanEntity implements Player { @@ -281,7 +281,7 @@ index 2f684a8f976f1f1a18c31f4c1a7eba9080099e55..c517873abdcb1e5334ba9e7a1c2f06bb public static int barrelRows = 3; diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 08b8d90ebdfd3937b6c32a7f18f08aeeaa4a8189..63b5be2433b5fba5c4139a9c1dbaaa79655fba7a 100644 +index 46b6994812086405f20a4dd410c1d79621958cd5..21a33a7952ea9d70df45a99e82286713fd939696 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -92,6 +92,24 @@ public class PurpurWorldConfig { @@ -310,10 +310,10 @@ index 08b8d90ebdfd3937b6c32a7f18f08aeeaa4a8189..63b5be2433b5fba5c4139a9c1dbaaa79 public boolean untamedTamablesAreRidable = true; public boolean useNightVisionWhenRiding = false; diff --git a/src/main/java/org/spigotmc/ActivationRange.java b/src/main/java/org/spigotmc/ActivationRange.java -index e881584d38dc354204479863f004e974a0ac6c07..5fde2a74385e621ae96922fd8aa6e386f5b780bb 100644 +index 63d3fcc45be732a4cd2dc8b5347d860fd6577bdd..f1abcd9c63d7bb9797f05e3764262e0080c60da2 100644 --- a/src/main/java/org/spigotmc/ActivationRange.java +++ b/src/main/java/org/spigotmc/ActivationRange.java -@@ -199,6 +199,7 @@ public class ActivationRange +@@ -203,6 +203,7 @@ public class ActivationRange continue; } diff --git a/patches/server/0011-Bring-back-server-name.patch b/patches/server/0013-Bring-back-server-name.patch similarity index 91% rename from patches/server/0011-Bring-back-server-name.patch rename to patches/server/0013-Bring-back-server-name.patch index cc26f9512..bcaaf4ea5 100644 --- a/patches/server/0011-Bring-back-server-name.patch +++ b/patches/server/0013-Bring-back-server-name.patch @@ -17,10 +17,10 @@ index 818289e831e3dad29345c43265e2efd7689bc500..1ea3012995c738c67b31e997c138f824 public final boolean spawnNpcs = this.get("spawn-npcs", true); public final boolean pvp = this.get("pvp", true); diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -index 3ae359a7334d8e398558fbb7c13cfd490a963d27..e313f4a9025e19b9afd5a725b89dca803516919b 100644 +index 6f59ff3dda4adaa24065ac388c8de556f3934313..3ed3375c327f426c8e20efde000806a8b4bfa24d 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -@@ -2934,4 +2934,11 @@ public final class CraftServer implements Server { +@@ -2939,4 +2939,11 @@ public final class CraftServer implements Server { } // Paper end diff --git a/patches/server/0012-Configurable-server-mod-name.patch b/patches/server/0014-Configurable-server-mod-name.patch similarity index 78% rename from patches/server/0012-Configurable-server-mod-name.patch rename to patches/server/0014-Configurable-server-mod-name.patch index d6623754a..2bf755a93 100644 --- a/patches/server/0012-Configurable-server-mod-name.patch +++ b/patches/server/0014-Configurable-server-mod-name.patch @@ -5,15 +5,15 @@ Subject: [PATCH] Configurable server mod name diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java -index 9fb7e742b91311bf542f533e2a411e9847be7038..14990205ac4bb02f26a90b91002e1dc07d36d40d 100644 +index 276d8594a70f30b90d46319d95629fc262617063..4ef09e062e1f5157b04623a107ef6bef28b276c9 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java -@@ -1682,7 +1682,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop // Paper - Paper > // Spigot - Spigot > // CraftBukkit - cb > vanilla! -+ return org.purpurmc.purpur.PurpurConfig.serverModName; // Purpur - Purpur > // Paper - Paper > // Spigot - Spigot > // CraftBukkit - cb > vanilla! +- return "Purpur"; // Purpur - Purpur > // Pufferfish - Pufferfish > // Paper - Paper > // Spigot - Spigot > // CraftBukkit - cb > vanilla! ++ return org.purpurmc.purpur.PurpurConfig.serverModName; // Purpur - Purpur > // Pufferfish - Pufferfish > // Paper - Paper > // Spigot - Spigot > // CraftBukkit - cb > vanilla! } public SystemReport fillSystemReport(SystemReport details) { diff --git a/patches/server/0013-LivingEntity-safeFallDistance.patch b/patches/server/0015-LivingEntity-safeFallDistance.patch similarity index 93% rename from patches/server/0013-LivingEntity-safeFallDistance.patch rename to patches/server/0015-LivingEntity-safeFallDistance.patch index 2b6f6d3ec..1356b4e7e 100644 --- a/patches/server/0013-LivingEntity-safeFallDistance.patch +++ b/patches/server/0015-LivingEntity-safeFallDistance.patch @@ -5,10 +5,10 @@ Subject: [PATCH] LivingEntity safeFallDistance diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java -index 1152cdb64ff72358292400d33a4a4f3ca88eff75..40f9e0969eef6d3543c6ca65915a68479fab700d 100644 +index d8b8547f5561baa5f39d6b5f251a484033483757..cf7ac9f5e18921723b0a8cfd0ed8a829d73e1fd4 100644 --- a/src/main/java/net/minecraft/world/entity/LivingEntity.java +++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java -@@ -252,6 +252,7 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -251,6 +251,7 @@ public abstract class LivingEntity extends Entity implements Attackable { private boolean skipDropExperience; // CraftBukkit start public int expToDrop; @@ -16,7 +16,7 @@ index 1152cdb64ff72358292400d33a4a4f3ca88eff75..40f9e0969eef6d3543c6ca65915a6847 public boolean forceDrops; public ArrayList drops = new ArrayList(); public final org.bukkit.craftbukkit.attribute.CraftAttributeMap craftAttributes; -@@ -352,8 +353,8 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -351,8 +352,8 @@ public abstract class LivingEntity extends Entity implements Attackable { this.tryAddSoulSpeed(); } @@ -27,7 +27,7 @@ index 1152cdb64ff72358292400d33a4a4f3ca88eff75..40f9e0969eef6d3543c6ca65915a6847 if (!state.isAir()) { double d1 = Math.min((double) (0.2F + f / 15.0F), 2.5D); -@@ -1996,7 +1997,7 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -2018,7 +2019,7 @@ public abstract class LivingEntity extends Entity implements Attackable { MobEffectInstance mobeffect = this.getEffect(MobEffects.JUMP); float f2 = mobeffect == null ? 0.0F : (float) (mobeffect.getAmplifier() + 1); diff --git a/patches/server/0014-Lagging-threshold.patch b/patches/server/0016-Lagging-threshold.patch similarity index 88% rename from patches/server/0014-Lagging-threshold.patch rename to patches/server/0016-Lagging-threshold.patch index 32ddcfdba..5da453e3d 100644 --- a/patches/server/0014-Lagging-threshold.patch +++ b/patches/server/0016-Lagging-threshold.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Lagging threshold diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java -index 1af65fe3e5f05900b25f49ee6b70286eb7b466ed..3bb2aec5a3d73acc47f28a168cbe4973c81bfca5 100644 +index 4ef09e062e1f5157b04623a107ef6bef28b276c9..03358854c88f97bb557da30b29d5a10068d96c99 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java @@ -308,6 +308,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop implements FeatureElement, EntityTypeT +@@ -315,6 +315,16 @@ public class EntityType implements FeatureElement, EntityTypeT return (EntityType) Registry.register(BuiltInRegistries.ENTITY_TYPE, id, (EntityType) type.build(id)); // CraftBukkit - decompile error } @@ -25,7 +25,7 @@ index ceacc0d383e2ee674783d3c0a7df0a951595faca..b8007196d117fa30722b81fc1cf8f1ce public static ResourceLocation getKey(EntityType type) { return BuiltInRegistries.ENTITY_TYPE.getKey(type); } -@@ -528,6 +538,16 @@ public class EntityType implements FeatureElement, EntityTypeT +@@ -530,6 +540,16 @@ public class EntityType implements FeatureElement, EntityTypeT return this.category; } diff --git a/patches/server/0016-Player-invulnerabilities.patch b/patches/server/0018-Player-invulnerabilities.patch similarity index 96% rename from patches/server/0016-Player-invulnerabilities.patch rename to patches/server/0018-Player-invulnerabilities.patch index 785b8a1d3..29cb09f94 100644 --- a/patches/server/0016-Player-invulnerabilities.patch +++ b/patches/server/0018-Player-invulnerabilities.patch @@ -82,10 +82,10 @@ index dae286863e7bf9316b23724f14d0f22f522cad4a..90baf612964501ce7048610f62e53894 public Scoreboard getScoreboard() { return this.getBukkitEntity().getScoreboard().getHandle(); diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -index 1e3aa42d2e293f465d91964d2a5aa9118fc4c57b..5248a576c65f5758252bb9428c3363b25432ac3e 100644 +index db1ff7b3a5d19171480d065ff827606efecbba0f..6568f3dac5a77ac0cbbaffe7bf499ca1b5f3ff81 100644 --- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java +++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -@@ -2081,12 +2081,21 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic +@@ -2082,12 +2082,21 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic @Override public void handleResourcePackResponse(ServerboundResourcePackPacket packet) { PacketUtils.ensureRunningOnSameThread(packet, this, this.player.getLevel()); @@ -121,7 +121,7 @@ index 86a1f0733ed2aabe09fc748bdf9561d9b9a8286e..3ed1af31cf0beb945699480bca104e7a return entityplayer1; } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -index 840849cebbf9090c21923d30e0e3afbc7f14ac43..17ea58f45f4bc4eb8bbbeadd6f25a477061d1617 100644 +index 2d1ff613dabbc6ae247caf03e79bb7033c28c739..254d91e2a06186d602f7edae7a46b0e4ee9be662 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java @@ -3174,5 +3174,20 @@ public class CraftPlayer extends CraftHumanEntity implements Player { @@ -146,7 +146,7 @@ index 840849cebbf9090c21923d30e0e3afbc7f14ac43..17ea58f45f4bc4eb8bbbeadd6f25a477 // Purpur end } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 63b5be2433b5fba5c4139a9c1dbaaa79655fba7a..38bfaa8e15d56bc2934f3281ec43954f94ea1ca7 100644 +index 21a33a7952ea9d70df45a99e82286713fd939696..786c1e30c56dfe28d00a9727c97d837cf7310ad3 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -97,6 +97,8 @@ public class PurpurWorldConfig { diff --git a/patches/server/0017-Anvil-API.patch b/patches/server/0019-Anvil-API.patch similarity index 100% rename from patches/server/0017-Anvil-API.patch rename to patches/server/0019-Anvil-API.patch diff --git a/patches/server/0018-Alternative-Keepalive-Handling.patch b/patches/server/0020-Alternative-Keepalive-Handling.patch similarity index 96% rename from patches/server/0018-Alternative-Keepalive-Handling.patch rename to patches/server/0020-Alternative-Keepalive-Handling.patch index 95692b011..228612d7c 100644 --- a/patches/server/0018-Alternative-Keepalive-Handling.patch +++ b/patches/server/0020-Alternative-Keepalive-Handling.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Alternative Keepalive Handling diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -index 5248a576c65f5758252bb9428c3363b25432ac3e..a225da8118b25f15876d700f2b3b02b1c6bc5ddb 100644 +index 6568f3dac5a77ac0cbbaffe7bf499ca1b5f3ff81..4e23ff71e14be7b88abc0bbcb8523eeb87556310 100644 --- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java +++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java @@ -261,6 +261,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic @@ -38,7 +38,7 @@ index 5248a576c65f5758252bb9428c3363b25432ac3e..a225da8118b25f15876d700f2b3b02b1 if (this.keepAlivePending) { if (!this.processedDisconnect && elapsedTime >= KEEPALIVE_LIMIT) { // check keepalive limit, don't fire if already disconnected ServerGamePacketListenerImpl.LOGGER.warn("{} was kicked due to keepalive timeout!", this.player.getScoreboardName()); // more info -@@ -3508,6 +3524,16 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic +@@ -3510,6 +3526,16 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic @Override public void handleKeepAlive(ServerboundKeepAlivePacket packet) { diff --git a/patches/server/0019-Silk-touch-spawners.patch b/patches/server/0021-Silk-touch-spawners.patch similarity index 99% rename from patches/server/0019-Silk-touch-spawners.patch rename to patches/server/0021-Silk-touch-spawners.patch index fc6c84a55..213923e7e 100644 --- a/patches/server/0019-Silk-touch-spawners.patch +++ b/patches/server/0021-Silk-touch-spawners.patch @@ -89,7 +89,7 @@ index 936d844a5a246138c9f9ae4ae6e318242b8f1420..d58dc4aa02fe371deaf879df8692dbe9 int i = 15 + worldserver.random.nextInt(15) + worldserver.random.nextInt(15); diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 38bfaa8e15d56bc2934f3281ec43954f94ea1ca7..c0e4a7228420ad552e65d2a5fec3cddee18a13fb 100644 +index 786c1e30c56dfe28d00a9727c97d837cf7310ad3..e7b23899c4787fbcb6a8c65ece88967eece4f3e1 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -114,6 +114,38 @@ public class PurpurWorldConfig { diff --git a/patches/server/0020-Add-turtle-egg-block-options.patch b/patches/server/0022-Add-turtle-egg-block-options.patch similarity index 96% rename from patches/server/0020-Add-turtle-egg-block-options.patch rename to patches/server/0022-Add-turtle-egg-block-options.patch index b05161867..f5119e132 100644 --- a/patches/server/0020-Add-turtle-egg-block-options.patch +++ b/patches/server/0022-Add-turtle-egg-block-options.patch @@ -36,7 +36,7 @@ index 6c1a0e6f961e46a1a89850746a71e97b32514adf..1942649e868fc985a488034c411a6721 } } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index c0e4a7228420ad552e65d2a5fec3cddee18a13fb..a5b2f8611d5270f9188b257b7adcf209da51e1ec 100644 +index e7b23899c4787fbcb6a8c65ece88967eece4f3e1..1046f6de8a04c4368870596f90236fe01671173d 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -146,6 +146,15 @@ public class PurpurWorldConfig { diff --git a/patches/server/0021-Fix-vanilla-command-permission-handler.patch b/patches/server/0023-Fix-vanilla-command-permission-handler.patch similarity index 100% rename from patches/server/0021-Fix-vanilla-command-permission-handler.patch rename to patches/server/0023-Fix-vanilla-command-permission-handler.patch diff --git a/patches/server/0022-Logger-settings-suppressing-pointless-logs.patch b/patches/server/0024-Logger-settings-suppressing-pointless-logs.patch similarity index 100% rename from patches/server/0022-Logger-settings-suppressing-pointless-logs.patch rename to patches/server/0024-Logger-settings-suppressing-pointless-logs.patch diff --git a/patches/server/0023-Disable-outdated-build-check.patch b/patches/server/0025-Disable-outdated-build-check.patch similarity index 92% rename from patches/server/0023-Disable-outdated-build-check.patch rename to patches/server/0025-Disable-outdated-build-check.patch index 5b5e1aa28..0d63114c6 100644 --- a/patches/server/0023-Disable-outdated-build-check.patch +++ b/patches/server/0025-Disable-outdated-build-check.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Disable outdated build check diff --git a/src/main/java/org/bukkit/craftbukkit/Main.java b/src/main/java/org/bukkit/craftbukkit/Main.java -index 0206b97cdc244998b1a4f148a71457dabb9236de..1b366a36e78aecce6ae1022c4caa65923b8693a9 100644 +index f5266df43726a7805ee2664ed18a2dcf79ab6cde..ad4bc3f46bb6f02284ecf62e2701bb627e096b15 100644 --- a/src/main/java/org/bukkit/craftbukkit/Main.java +++ b/src/main/java/org/bukkit/craftbukkit/Main.java @@ -285,7 +285,7 @@ public class Main { diff --git a/patches/server/0024-Giants-AI-settings.patch b/patches/server/0026-Giants-AI-settings.patch similarity index 100% rename from patches/server/0024-Giants-AI-settings.patch rename to patches/server/0026-Giants-AI-settings.patch diff --git a/patches/server/0025-Zombie-horse-naturally-spawn.patch b/patches/server/0027-Zombie-horse-naturally-spawn.patch similarity index 95% rename from patches/server/0025-Zombie-horse-naturally-spawn.patch rename to patches/server/0027-Zombie-horse-naturally-spawn.patch index 6de3adcad..cdc641da2 100644 --- a/patches/server/0025-Zombie-horse-naturally-spawn.patch +++ b/patches/server/0027-Zombie-horse-naturally-spawn.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Zombie horse naturally spawn diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java -index ffde1d129c5434e7748cbdaac9109cbd3d0d29bc..057f4b71ff295cf6fed9cc5b86aa40345e448af3 100644 +index b40bc54e80dadc8eb426ed6217b879631833e4d7..a7c153f957af48cf42ecbb01ada5f8f384c4e5e4 100644 --- a/src/main/java/net/minecraft/server/level/ServerLevel.java +++ b/src/main/java/net/minecraft/server/level/ServerLevel.java -@@ -814,10 +814,18 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -830,10 +830,18 @@ public class ServerLevel extends Level implements WorldGenLevel { boolean flag1 = this.getGameRules().getBoolean(GameRules.RULE_DOMOBSPAWNING) && this.random.nextDouble() < (double) difficultydamagescaler.getEffectiveDifficulty() * this.paperConfig().entities.spawning.skeletonHorseThunderSpawnChance.or(0.01D) && !this.getBlockState(blockposition.below()).is(Blocks.LIGHTNING_ROD); // Paper if (flag1) { diff --git a/patches/server/0026-Charged-creeper-naturally-spawn.patch b/patches/server/0028-Charged-creeper-naturally-spawn.patch similarity index 100% rename from patches/server/0026-Charged-creeper-naturally-spawn.patch rename to patches/server/0028-Charged-creeper-naturally-spawn.patch diff --git a/patches/server/0027-Rabbit-naturally-spawn-toast-and-killer.patch b/patches/server/0029-Rabbit-naturally-spawn-toast-and-killer.patch similarity index 100% rename from patches/server/0027-Rabbit-naturally-spawn-toast-and-killer.patch rename to patches/server/0029-Rabbit-naturally-spawn-toast-and-killer.patch diff --git a/patches/server/0028-Fix-outdated-server-showing-in-ping-before-server-fu.patch b/patches/server/0030-Fix-outdated-server-showing-in-ping-before-server-fu.patch similarity index 100% rename from patches/server/0028-Fix-outdated-server-showing-in-ping-before-server-fu.patch rename to patches/server/0030-Fix-outdated-server-showing-in-ping-before-server-fu.patch diff --git a/patches/server/0029-Tulips-change-fox-type.patch b/patches/server/0031-Tulips-change-fox-type.patch similarity index 100% rename from patches/server/0029-Tulips-change-fox-type.patch rename to patches/server/0031-Tulips-change-fox-type.patch diff --git a/patches/server/0030-Breedable-Polar-Bears.patch b/patches/server/0032-Breedable-Polar-Bears.patch similarity index 100% rename from patches/server/0030-Breedable-Polar-Bears.patch rename to patches/server/0032-Breedable-Polar-Bears.patch diff --git a/patches/server/0031-Chickens-can-retaliate.patch b/patches/server/0033-Chickens-can-retaliate.patch similarity index 100% rename from patches/server/0031-Chickens-can-retaliate.patch rename to patches/server/0033-Chickens-can-retaliate.patch diff --git a/patches/server/0032-Add-option-to-set-armorstand-step-height.patch b/patches/server/0034-Add-option-to-set-armorstand-step-height.patch similarity index 92% rename from patches/server/0032-Add-option-to-set-armorstand-step-height.patch rename to patches/server/0034-Add-option-to-set-armorstand-step-height.patch index 92193db1d..951b1cefd 100644 --- a/patches/server/0032-Add-option-to-set-armorstand-step-height.patch +++ b/patches/server/0034-Add-option-to-set-armorstand-step-height.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Add option to set armorstand step height diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java -index d6ac9c9811449a651e6d13538b9efa7015617b09..2e263243651e9feb1ea7e011507502b6a634a49c 100644 +index a0f63263a2439df93757309a6d9f6394abf81073..af6da7a9b93ef808759c7e213354ebfeed7e7a77 100644 --- a/src/main/java/net/minecraft/world/entity/Entity.java +++ b/src/main/java/net/minecraft/world/entity/Entity.java @@ -319,7 +319,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { @@ -30,7 +30,7 @@ index 3677dd991ae73428984e62e4d6fb757317987887..697d6d6cca0a1c8df9c5bf6852495130 if (!this.canTick) { if (this.noTickPoseDirty) { diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 6d9c429b91aef725bc0da88c790ef63417595208..652f9dc1dc0f31f72d15d2fa99406b4860109b1f 100644 +index 47bd9c45b4a560b1fcc01eee9606afef7416f70d..7fe6efbed2bd5f9a9d5b9a8ff5118a799cda4d11 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -92,6 +92,11 @@ public class PurpurWorldConfig { diff --git a/patches/server/0033-Cat-spawning-options.patch b/patches/server/0035-Cat-spawning-options.patch similarity index 100% rename from patches/server/0033-Cat-spawning-options.patch rename to patches/server/0035-Cat-spawning-options.patch diff --git a/patches/server/0034-Cows-eat-mushrooms.patch b/patches/server/0036-Cows-eat-mushrooms.patch similarity index 100% rename from patches/server/0034-Cows-eat-mushrooms.patch rename to patches/server/0036-Cows-eat-mushrooms.patch diff --git a/patches/server/0035-Fix-cow-rotation-when-shearing-mooshroom.patch b/patches/server/0037-Fix-cow-rotation-when-shearing-mooshroom.patch similarity index 93% rename from patches/server/0035-Fix-cow-rotation-when-shearing-mooshroom.patch rename to patches/server/0037-Fix-cow-rotation-when-shearing-mooshroom.patch index 55ff680bb..6f0d8a0ff 100644 --- a/patches/server/0035-Fix-cow-rotation-when-shearing-mooshroom.patch +++ b/patches/server/0037-Fix-cow-rotation-when-shearing-mooshroom.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Fix cow rotation when shearing mooshroom diff --git a/src/main/java/net/minecraft/world/entity/animal/MushroomCow.java b/src/main/java/net/minecraft/world/entity/animal/MushroomCow.java -index 19bd997d421a338966fcd3e3dfeb8669a6fb542f..2f85004a9dac740a9ddadd18b47cf3be821e5add 100644 +index b1c2663a7f42714a620d59096f26f0a965875846..12b715086a347b82726327358ac71c72a4fca8b0 100644 --- a/src/main/java/net/minecraft/world/entity/animal/MushroomCow.java +++ b/src/main/java/net/minecraft/world/entity/animal/MushroomCow.java @@ -202,7 +202,13 @@ public class MushroomCow extends Cow implements Shearable, VariantHolder { diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index ba924f551f0d67007b94521f7e7925916e46f429..d3ebe9773e7b2b590956a5744cbec6d45ef96af7 100644 +index 4ed7b12a08df116807be89123b7b9b689eace49a..6cfd8e222d432ffc23eeb21db240a21e1e52f678 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -97,6 +97,11 @@ public class PurpurWorldConfig { diff --git a/patches/server/0043-Option-to-toggle-milk-curing-bad-omen.patch b/patches/server/0045-Option-to-toggle-milk-curing-bad-omen.patch similarity index 95% rename from patches/server/0043-Option-to-toggle-milk-curing-bad-omen.patch rename to patches/server/0045-Option-to-toggle-milk-curing-bad-omen.patch index 8b2fdfd9a..9e4bae146 100644 --- a/patches/server/0043-Option-to-toggle-milk-curing-bad-omen.patch +++ b/patches/server/0045-Option-to-toggle-milk-curing-bad-omen.patch @@ -28,7 +28,7 @@ index f33977d95b6db473be4f95075ba99caf90ad0220..56dc04d8875971ee9a5d077a695509af return stack.isEmpty() ? new ItemStack(Items.BUCKET) : stack; diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index d3ebe9773e7b2b590956a5744cbec6d45ef96af7..35a8eda30400a606358f62c02f984376632cce92 100644 +index 6cfd8e222d432ffc23eeb21db240a21e1e52f678..58ada439e2d02383573c69859f48a2f6286a8899 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -98,8 +98,10 @@ public class PurpurWorldConfig { diff --git a/patches/server/0044-End-gateway-should-check-if-entity-can-use-portal.patch b/patches/server/0046-End-gateway-should-check-if-entity-can-use-portal.patch similarity index 100% rename from patches/server/0044-End-gateway-should-check-if-entity-can-use-portal.patch rename to patches/server/0046-End-gateway-should-check-if-entity-can-use-portal.patch diff --git a/patches/server/0045-Skip-events-if-there-s-no-listeners.patch b/patches/server/0047-Skip-events-if-there-s-no-listeners.patch similarity index 100% rename from patches/server/0045-Skip-events-if-there-s-no-listeners.patch rename to patches/server/0047-Skip-events-if-there-s-no-listeners.patch diff --git a/patches/server/0046-Add-permission-for-F3-N-debug.patch b/patches/server/0048-Add-permission-for-F3-N-debug.patch similarity index 100% rename from patches/server/0046-Add-permission-for-F3-N-debug.patch rename to patches/server/0048-Add-permission-for-F3-N-debug.patch diff --git a/patches/server/0047-Configurable-TPS-Catchup.patch b/patches/server/0049-Configurable-TPS-Catchup.patch similarity index 93% rename from patches/server/0047-Configurable-TPS-Catchup.patch rename to patches/server/0049-Configurable-TPS-Catchup.patch index daf3b255c..5e26494b0 100644 --- a/patches/server/0047-Configurable-TPS-Catchup.patch +++ b/patches/server/0049-Configurable-TPS-Catchup.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Configurable TPS Catchup diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java -index 3bb2aec5a3d73acc47f28a168cbe4973c81bfca5..f25f70717847ddd5dea4e86e3be3e7cb9b7eb879 100644 +index 03358854c88f97bb557da30b29d5a10068d96c99..dc5bcb68afe684bcbd3cdb29774baa6cb91546c2 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java -@@ -1175,7 +1175,13 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop { @@ -47,7 +47,7 @@ index 36deebd7d721f400cd07b2be3d1551e2d9ab7f85..fb2c1b024baded0dc929ec473ad707ea final EntityType entityType = entity.getType(); final int saveLimit = level.paperConfig().chunks.entityPerChunkSaveLimit.getOrDefault(entityType, -1); diff --git a/src/main/java/org/purpurmc/purpur/entity/DolphinSpit.java b/src/main/java/org/purpurmc/purpur/entity/DolphinSpit.java -index d55f7611599b2a339293688861100cb8dae9f6c6..5e99789e5156e8ffbf125e77114c547e1f8e7925 100644 +index 602df34e3ec0d05f58737a54a1e8585e8730095c..f0279d6cdc93f524f321c3c40967fdeeb8d2c46b 100644 --- a/src/main/java/org/purpurmc/purpur/entity/DolphinSpit.java +++ b/src/main/java/org/purpurmc/purpur/entity/DolphinSpit.java @@ -35,6 +35,11 @@ public class DolphinSpit extends LlamaSpit { @@ -63,7 +63,7 @@ index d55f7611599b2a339293688861100cb8dae9f6c6..5e99789e5156e8ffbf125e77114c547e super_tick(); diff --git a/src/main/java/org/purpurmc/purpur/entity/PhantomFlames.java b/src/main/java/org/purpurmc/purpur/entity/PhantomFlames.java -index 2eca8317e991ec46cc88a4c7d6d8b50152ba4ea7..b6a594cd6b08c687cf51c2f5494297ef96ec4b92 100644 +index 9ee7fc642d05fd61d91d09c754c6f0680bc39e56..1542f038621b97a298a0fb31ab3be912e2bcd0d6 100644 --- a/src/main/java/org/purpurmc/purpur/entity/PhantomFlames.java +++ b/src/main/java/org/purpurmc/purpur/entity/PhantomFlames.java @@ -38,6 +38,11 @@ public class PhantomFlames extends LlamaSpit { diff --git a/patches/server/0057-Dispenser-curse-of-binding-protection.patch b/patches/server/0059-Dispenser-curse-of-binding-protection.patch similarity index 92% rename from patches/server/0057-Dispenser-curse-of-binding-protection.patch rename to patches/server/0059-Dispenser-curse-of-binding-protection.patch index 657996460..b83b1f280 100644 --- a/patches/server/0057-Dispenser-curse-of-binding-protection.patch +++ b/patches/server/0059-Dispenser-curse-of-binding-protection.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Dispenser curse of binding protection diff --git a/src/main/java/net/minecraft/world/entity/Mob.java b/src/main/java/net/minecraft/world/entity/Mob.java -index 636b073f839393c0095f178131e54d18df68119b..1445bd7503a45e52974d147bfdc98b6a52a58233 100644 +index 7fda4e04a3e0ca8a09dccd1af36b77cca0b78a2b..89981efcb852fed1ca79f8b239aa1f044d713c6d 100644 --- a/src/main/java/net/minecraft/world/entity/Mob.java +++ b/src/main/java/net/minecraft/world/entity/Mob.java @@ -65,6 +65,7 @@ import net.minecraft.world.item.ProjectileWeaponItem; @@ -16,7 +16,7 @@ index 636b073f839393c0095f178131e54d18df68119b..1445bd7503a45e52974d147bfdc98b6a import net.minecraft.world.level.GameRules; import net.minecraft.world.level.ItemLike; import net.minecraft.world.level.Level; -@@ -1157,6 +1158,12 @@ public abstract class Mob extends LivingEntity implements Targeting { +@@ -1163,6 +1164,12 @@ public abstract class Mob extends LivingEntity implements Targeting { } @@ -43,7 +43,7 @@ index d7a0cbde8f8c99276307502674c71463fbe7e89c..3500c56cb85d8c76b2acd77976d374ea // CraftBukkit start Level world = pointer.getLevel(); diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 0ec7e88c00e1dedf9d1069bc508826d4b54ddc38..94a1e12c0a016754e9c15559bff5642ee766a24b 100644 +index 79861cc30db69fcd41890da881fc8713fce25935..e089e59365459966dcae4108b908200534e9858d 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -230,6 +230,11 @@ public class PurpurWorldConfig { diff --git a/patches/server/0058-Add-option-for-boats-to-eject-players-on-land.patch b/patches/server/0060-Add-option-for-boats-to-eject-players-on-land.patch similarity index 95% rename from patches/server/0058-Add-option-for-boats-to-eject-players-on-land.patch rename to patches/server/0060-Add-option-for-boats-to-eject-players-on-land.patch index 27b0512ca..cd0c51eb1 100644 --- a/patches/server/0058-Add-option-for-boats-to-eject-players-on-land.patch +++ b/patches/server/0060-Add-option-for-boats-to-eject-players-on-land.patch @@ -17,7 +17,7 @@ index 5095e47b4910167235afdd8f1a7e9c45124ecadb..fb8f2d0a15c7a56c8e75b8fda781bf36 } else { return Boat.Status.IN_AIR; diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 94a1e12c0a016754e9c15559bff5642ee766a24b..487a15e59b5d7cc1a3d2bbd03af2b0b76eb59174 100644 +index e089e59365459966dcae4108b908200534e9858d..8f1b86b3511615281aca45cf7ffba506bbd09e0d 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -97,12 +97,14 @@ public class PurpurWorldConfig { diff --git a/patches/server/0059-Mending-mends-most-damages-equipment-first.patch b/patches/server/0061-Mending-mends-most-damages-equipment-first.patch similarity index 96% rename from patches/server/0059-Mending-mends-most-damages-equipment-first.patch rename to patches/server/0061-Mending-mends-most-damages-equipment-first.patch index 008c54dea..965378cc9 100644 --- a/patches/server/0059-Mending-mends-most-damages-equipment-first.patch +++ b/patches/server/0061-Mending-mends-most-damages-equipment-first.patch @@ -18,7 +18,7 @@ index 2d3994de8e40eedc78c27ea842b6265b1c5ea822..7043f15f84d6c847bf376025c8e2150b if (entry != null) { ItemStack itemstack = (ItemStack) entry.getValue(); diff --git a/src/main/java/net/minecraft/world/item/ItemStack.java b/src/main/java/net/minecraft/world/item/ItemStack.java -index 75ee1abaadabbe8add0972c48780f5e7b85df069..fafb286115b57729542de670112a4dad911fb22f 100644 +index a6253272205337b3b855679b3057c2519a807a4c..d3483aef38a10f70fc89c1fa538add28565bcda4 100644 --- a/src/main/java/net/minecraft/world/item/ItemStack.java +++ b/src/main/java/net/minecraft/world/item/ItemStack.java @@ -558,6 +558,16 @@ public final class ItemStack { @@ -73,7 +73,7 @@ index ecf640b00007a386290f8dfe9935a8aa610079fd..2048899f8e4c8211e8dde0d11148d647 public static Map.Entry getRandomItemWith(Enchantment enchantment, LivingEntity entity) { return getRandomItemWith(enchantment, entity, (stack) -> { diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 487a15e59b5d7cc1a3d2bbd03af2b0b76eb59174..c16685c4cedf070788eeeb0a9aceb67b68a31344 100644 +index 8f1b86b3511615281aca45cf7ffba506bbd09e0d..b36b6e836c5f221434f58143265bd36687b02b75 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -97,6 +97,7 @@ public class PurpurWorldConfig { diff --git a/patches/server/0060-Add-5-second-tps-average-in-tps.patch b/patches/server/0062-Add-5-second-tps-average-in-tps.patch similarity index 94% rename from patches/server/0060-Add-5-second-tps-average-in-tps.patch rename to patches/server/0062-Add-5-second-tps-average-in-tps.patch index be74f11a7..9fbe28b39 100644 --- a/patches/server/0060-Add-5-second-tps-average-in-tps.patch +++ b/patches/server/0062-Add-5-second-tps-average-in-tps.patch @@ -27,7 +27,7 @@ index fa56cd09102a89692b42f1d14257990508c5c720..f9251183df72ddc56662fd3f02acf216 setListData(vector); } diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java -index f25f70717847ddd5dea4e86e3be3e7cb9b7eb879..4f10682ffa42423eed6382ec0b53cc2fa931c7c9 100644 +index dc5bcb68afe684bcbd3cdb29774baa6cb91546c2..899bf1a7820f480fa20a68c480c3aaae926a1a3e 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java @@ -304,7 +304,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop> consumer, Set trackedPlayers) { this.trackedPlayers = trackedPlayers; diff --git a/src/main/java/net/minecraft/world/entity/item/ItemEntity.java b/src/main/java/net/minecraft/world/entity/item/ItemEntity.java -index d47b3ac633e7936d30abfda6fc46c2c7412d76fe..1b7784666312d50a957d023c2bf869194ee9e593 100644 +index 453f0f7042bdf204db73be139aa36f211c5455e7..52a14af24e3c51c53b40fdb6594b1664eef6d486 100644 --- a/src/main/java/net/minecraft/world/entity/item/ItemEntity.java +++ b/src/main/java/net/minecraft/world/entity/item/ItemEntity.java @@ -55,6 +55,12 @@ public class ItemEntity extends Entity implements TraceableEntity { @@ -34,7 +34,7 @@ index d47b3ac633e7936d30abfda6fc46c2c7412d76fe..1b7784666312d50a957d023c2bf86919 public ItemEntity(EntityType type, Level world) { super(type, world); -@@ -343,6 +349,15 @@ public class ItemEntity extends Entity implements TraceableEntity { +@@ -349,6 +355,15 @@ public class ItemEntity extends Entity implements TraceableEntity { return false; } else if (!this.getItem().getItem().canBeHurtBy(source)) { return false; @@ -50,7 +50,7 @@ index d47b3ac633e7936d30abfda6fc46c2c7412d76fe..1b7784666312d50a957d023c2bf86919 } else if (this.level.isClientSide) { return true; } else { -@@ -541,6 +556,12 @@ public class ItemEntity extends Entity implements TraceableEntity { +@@ -547,6 +562,12 @@ public class ItemEntity extends Entity implements TraceableEntity { this.getEntityData().set(ItemEntity.DATA_ITEM, stack); this.getEntityData().markDirty(ItemEntity.DATA_ITEM); // CraftBukkit - SPIGOT-4591, must mark dirty this.despawnRate = level.paperConfig().entities.spawning.altItemDespawnRate.enabled ? level.paperConfig().entities.spawning.altItemDespawnRate.items.getOrDefault(stack.getItem(), level.spigotConfig.itemDespawnRate) : level.spigotConfig.itemDespawnRate; // Paper @@ -115,7 +115,7 @@ index a925b5c490e7129b27370aa57b5fad1cf05530c6..09001578b88658c44d0661d340a0ee0f + // Purpur end } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 55b7f582c6bc06412900e843c3263a69e67d2af5..ead0ea1613da4a23fe20283555f3dd7e55299073 100644 +index 7a20e3b127edf85de93d1ea0d1dbee3a06f11e43..2802191b8582840532e0774369082bca487a081d 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -127,6 +127,49 @@ public class PurpurWorldConfig { diff --git a/patches/server/0063-Add-ping-command.patch b/patches/server/0065-Add-ping-command.patch similarity index 100% rename from patches/server/0063-Add-ping-command.patch rename to patches/server/0065-Add-ping-command.patch diff --git a/patches/server/0064-Add-demo-command.patch b/patches/server/0066-Add-demo-command.patch similarity index 100% rename from patches/server/0064-Add-demo-command.patch rename to patches/server/0066-Add-demo-command.patch diff --git a/patches/server/0065-Add-credits-command.patch b/patches/server/0067-Add-credits-command.patch similarity index 100% rename from patches/server/0065-Add-credits-command.patch rename to patches/server/0067-Add-credits-command.patch diff --git a/patches/server/0066-Configurable-jockey-options.patch b/patches/server/0068-Configurable-jockey-options.patch similarity index 100% rename from patches/server/0066-Configurable-jockey-options.patch rename to patches/server/0068-Configurable-jockey-options.patch diff --git a/patches/server/0067-Phantoms-attracted-to-crystals-and-crystals-shoot-ph.patch b/patches/server/0069-Phantoms-attracted-to-crystals-and-crystals-shoot-ph.patch similarity index 100% rename from patches/server/0067-Phantoms-attracted-to-crystals-and-crystals-shoot-ph.patch rename to patches/server/0069-Phantoms-attracted-to-crystals-and-crystals-shoot-ph.patch diff --git a/patches/server/0068-Add-phantom-spawning-options.patch b/patches/server/0070-Add-phantom-spawning-options.patch similarity index 100% rename from patches/server/0068-Add-phantom-spawning-options.patch rename to patches/server/0070-Add-phantom-spawning-options.patch diff --git a/patches/server/0069-Implement-bed-explosion-options.patch b/patches/server/0071-Implement-bed-explosion-options.patch similarity index 97% rename from patches/server/0069-Implement-bed-explosion-options.patch rename to patches/server/0071-Implement-bed-explosion-options.patch index 1e5c970e1..fcc952641 100644 --- a/patches/server/0069-Implement-bed-explosion-options.patch +++ b/patches/server/0071-Implement-bed-explosion-options.patch @@ -27,7 +27,7 @@ index 96434f14525a2159f335b94aad95081f488fadf3..fec04d23d1b4f706c04b3c647e9afaf0 } } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 25e392910e20edd7bdaf6e1be20d5ff075cde65e..a9a4c0fcaf37d9e4d64622e72f08fd6234793b0e 100644 +index cf0842e65e1360d6860f4b519631a71a91c40145..8adb2b6094da7c1d865b3cf78c2f2dd7f810be5b 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -290,6 +290,27 @@ public class PurpurWorldConfig { diff --git a/patches/server/0070-Implement-respawn-anchor-explosion-options.patch b/patches/server/0072-Implement-respawn-anchor-explosion-options.patch similarity index 97% rename from patches/server/0070-Implement-respawn-anchor-explosion-options.patch rename to patches/server/0072-Implement-respawn-anchor-explosion-options.patch index 8b9067411..9097a21f8 100644 --- a/patches/server/0070-Implement-respawn-anchor-explosion-options.patch +++ b/patches/server/0072-Implement-respawn-anchor-explosion-options.patch @@ -18,7 +18,7 @@ index bcea8af63b9911c36873290e5c34567b1eeaacf4..a81fe948398a4d65929d75c821177f09 public static boolean canSetSpawn(Level world) { diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index a9a4c0fcaf37d9e4d64622e72f08fd6234793b0e..e20c7b8b3abc40dc0d39a8df2e5ee21f3695a447 100644 +index 8adb2b6094da7c1d865b3cf78c2f2dd7f810be5b..f3e0e2096ffbc6d2577bf1ffa34930855cd94102 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -330,6 +330,27 @@ public class PurpurWorldConfig { diff --git a/patches/server/0071-Add-allow-water-in-end-world-option.patch b/patches/server/0073-Add-allow-water-in-end-world-option.patch similarity index 96% rename from patches/server/0071-Add-allow-water-in-end-world-option.patch rename to patches/server/0073-Add-allow-water-in-end-world-option.patch index f11cee4cb..0ca0dc20e 100644 --- a/patches/server/0071-Add-allow-water-in-end-world-option.patch +++ b/patches/server/0073-Add-allow-water-in-end-world-option.patch @@ -27,10 +27,10 @@ index 5c6aa9c464784ad5ee366412d080c72d3d22a76f..c03abc9589bf5f37abc1b0d355ed9784 return true; diff --git a/src/main/java/net/minecraft/world/level/Level.java b/src/main/java/net/minecraft/world/level/Level.java -index 2ae800110dc90b7f2d96d2c05ba3a53aea6c0c53..85e5492a172bc493ef7d97dee355cab621f4aae8 100644 +index c38aff50c6f0bc37e539bb4d5206f7b6065fa680..d0e0ce953dd0cdd6b54bb00224e82dca62f793cd 100644 --- a/src/main/java/net/minecraft/world/level/Level.java +++ b/src/main/java/net/minecraft/world/level/Level.java -@@ -1546,4 +1546,14 @@ public abstract class Level implements LevelAccessor, AutoCloseable { +@@ -1650,4 +1650,14 @@ public abstract class Level implements LevelAccessor, AutoCloseable { return null; } // Paper end diff --git a/patches/server/0072-Allow-color-codes-in-books.patch b/patches/server/0074-Allow-color-codes-in-books.patch similarity index 92% rename from patches/server/0072-Allow-color-codes-in-books.patch rename to patches/server/0074-Allow-color-codes-in-books.patch index 4b9a4b524..c2e84c98d 100644 --- a/patches/server/0072-Allow-color-codes-in-books.patch +++ b/patches/server/0074-Allow-color-codes-in-books.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Allow color codes in books diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -index a225da8118b25f15876d700f2b3b02b1c6bc5ddb..bc9929bff495947e140fa48624b26c8356aac596 100644 +index 4e23ff71e14be7b88abc0bbcb8523eeb87556310..ee1a16c9fa76685e43b47495cff95b2abe1c040b 100644 --- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java +++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -@@ -1331,13 +1331,16 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic +@@ -1332,13 +1332,16 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic itemstack1.setTag(nbttagcompound.copy()); } @@ -28,7 +28,7 @@ index a225da8118b25f15876d700f2b3b02b1c6bc5ddb..bc9929bff495947e140fa48624b26c83 this.updateBookPages(pages, (s) -> { return Component.Serializer.toJson(Component.literal(s)); -@@ -1349,10 +1352,13 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic +@@ -1350,10 +1353,13 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic private void updateBookPages(List list, UnaryOperator unaryoperator, ItemStack itemstack, int slot, ItemStack handItem) { // CraftBukkit ListTag nbttaglist = new ListTag(); @@ -44,7 +44,7 @@ index a225da8118b25f15876d700f2b3b02b1c6bc5ddb..bc9929bff495947e140fa48624b26c83 Objects.requireNonNull(nbttaglist); stream.forEach(nbttaglist::add); -@@ -1362,11 +1368,11 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic +@@ -1363,11 +1369,11 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic for (int j = list.size(); i < j; ++i) { FilteredText filteredtext = (FilteredText) list.get(i); @@ -58,7 +58,7 @@ index a225da8118b25f15876d700f2b3b02b1c6bc5ddb..bc9929bff495947e140fa48624b26c83 } } -@@ -1379,6 +1385,16 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic +@@ -1380,6 +1386,16 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic this.player.getInventory().setItem(slot, CraftEventFactory.handleEditBookEvent(player, slot, handItem, itemstack)); // CraftBukkit // Paper - Don't ignore result (see other callsite for handleEditBookEvent) } diff --git a/patches/server/0073-Entity-lifespan.patch b/patches/server/0075-Entity-lifespan.patch similarity index 87% rename from patches/server/0073-Entity-lifespan.patch rename to patches/server/0075-Entity-lifespan.patch index 24cf926bc..614a95017 100644 --- a/patches/server/0073-Entity-lifespan.patch +++ b/patches/server/0075-Entity-lifespan.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Entity lifespan diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -index bc9929bff495947e140fa48624b26c8356aac596..7ef7863259e9a4ac892d3efe1a175dc754758604 100644 +index ee1a16c9fa76685e43b47495cff95b2abe1c040b..f82e2a6e3803645ec002afeb62ccb44c5ec15fde 100644 --- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java +++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -@@ -2842,6 +2842,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic +@@ -2844,6 +2844,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic AABB axisalignedbb = entity.getBoundingBox(); if (axisalignedbb.distanceToSqr(this.player.getEyePosition()) < ServerGamePacketListenerImpl.MAX_INTERACTION_DISTANCE) { @@ -17,7 +17,7 @@ index bc9929bff495947e140fa48624b26c8356aac596..7ef7863259e9a4ac892d3efe1a175dc7 private void performInteraction(InteractionHand enumhand, ServerGamePacketListenerImpl.EntityInteraction playerconnection_a, PlayerInteractEntityEvent event) { // CraftBukkit ItemStack itemstack = ServerGamePacketListenerImpl.this.player.getItemInHand(enumhand); diff --git a/src/main/java/net/minecraft/world/entity/Mob.java b/src/main/java/net/minecraft/world/entity/Mob.java -index 1445bd7503a45e52974d147bfdc98b6a52a58233..5bff6bf091a61d1414ca1408960d50ce0d646458 100644 +index 89981efcb852fed1ca79f8b239aa1f044d713c6d..183261a031a2a0b6b95dbb983236cee3cd3a0398 100644 --- a/src/main/java/net/minecraft/world/entity/Mob.java +++ b/src/main/java/net/minecraft/world/entity/Mob.java @@ -134,6 +134,7 @@ public abstract class Mob extends LivingEntity implements Targeting { @@ -28,7 +28,7 @@ index 1445bd7503a45e52974d147bfdc98b6a52a58233..5bff6bf091a61d1414ca1408960d50ce public boolean aware = true; // CraftBukkit protected Mob(EntityType type, Level world) { -@@ -318,6 +319,7 @@ public abstract class Mob extends LivingEntity implements Targeting { +@@ -320,6 +321,7 @@ public abstract class Mob extends LivingEntity implements Targeting { entityliving = null; } } @@ -36,7 +36,7 @@ index 1445bd7503a45e52974d147bfdc98b6a52a58233..5bff6bf091a61d1414ca1408960d50ce this.target = entityliving; return true; // CraftBukkit end -@@ -364,9 +366,29 @@ public abstract class Mob extends LivingEntity implements Targeting { +@@ -366,9 +368,29 @@ public abstract class Mob extends LivingEntity implements Targeting { this.playAmbientSound(); } @@ -66,7 +66,7 @@ index 1445bd7503a45e52974d147bfdc98b6a52a58233..5bff6bf091a61d1414ca1408960d50ce @Override protected void playHurtSound(DamageSource source) { this.resetAmbientSoundTime(); -@@ -556,6 +578,7 @@ public abstract class Mob extends LivingEntity implements Targeting { +@@ -558,6 +580,7 @@ public abstract class Mob extends LivingEntity implements Targeting { } nbt.putBoolean("Bukkit.Aware", this.aware); // CraftBukkit @@ -74,7 +74,7 @@ index 1445bd7503a45e52974d147bfdc98b6a52a58233..5bff6bf091a61d1414ca1408960d50ce } @Override -@@ -626,6 +649,11 @@ public abstract class Mob extends LivingEntity implements Targeting { +@@ -628,6 +651,11 @@ public abstract class Mob extends LivingEntity implements Targeting { this.aware = nbt.getBoolean("Bukkit.Aware"); } // CraftBukkit end @@ -86,7 +86,7 @@ index 1445bd7503a45e52974d147bfdc98b6a52a58233..5bff6bf091a61d1414ca1408960d50ce } @Override -@@ -1686,6 +1714,7 @@ public abstract class Mob extends LivingEntity implements Targeting { +@@ -1692,6 +1720,7 @@ public abstract class Mob extends LivingEntity implements Targeting { this.setLastHurtMob(target); } @@ -95,7 +95,7 @@ index 1445bd7503a45e52974d147bfdc98b6a52a58233..5bff6bf091a61d1414ca1408960d50ce } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index e20c7b8b3abc40dc0d39a8df2e5ee21f3695a447..15014ea6bc22892bd6fb9382f172ffd97cdedf4e 100644 +index f3e0e2096ffbc6d2577bf1ffa34930855cd94102..bf122a8219ed6259f7f1face69fbf246a1fcdc4d 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -127,6 +127,11 @@ public class PurpurWorldConfig { diff --git a/patches/server/0074-Add-option-to-teleport-to-spawn-if-outside-world-bor.patch b/patches/server/0076-Add-option-to-teleport-to-spawn-if-outside-world-bor.patch similarity index 93% rename from patches/server/0074-Add-option-to-teleport-to-spawn-if-outside-world-bor.patch rename to patches/server/0076-Add-option-to-teleport-to-spawn-if-outside-world-bor.patch index 07d3390a0..f1d60267a 100644 --- a/patches/server/0074-Add-option-to-teleport-to-spawn-if-outside-world-bor.patch +++ b/patches/server/0076-Add-option-to-teleport-to-spawn-if-outside-world-bor.patch @@ -36,10 +36,10 @@ index 60485e1d5abcc01698f364592d43d5dbc461cb7f..8dfc4763df3cd207e7200828f8237f68 + // Purpur end } diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java -index 0ce0761af346194444ef0bedce02493583cc5ea8..f069cf9a4fe6a554291de2de41880ba569d0c86d 100644 +index 063ba101f751deecfbd7708b767e952fc4a273a3..e41d27f486c5efa1269822c177bc2f1214d27b58 100644 --- a/src/main/java/net/minecraft/world/entity/LivingEntity.java +++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java -@@ -411,6 +411,7 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -410,6 +410,7 @@ public abstract class LivingEntity extends Entity implements Attackable { double d1 = this.level.getWorldBorder().getDamagePerBlock(); if (d1 > 0.0D) { @@ -48,7 +48,7 @@ index 0ce0761af346194444ef0bedce02493583cc5ea8..f069cf9a4fe6a554291de2de41880ba5 } } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 15014ea6bc22892bd6fb9382f172ffd97cdedf4e..0b1b14746be9aa10fb5d48b820395b505e79cb74 100644 +index bf122a8219ed6259f7f1face69fbf246a1fcdc4d..2cbab8dc920fff0d1573072b791f39debd61a710 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -246,6 +246,7 @@ public class PurpurWorldConfig { diff --git a/patches/server/0075-Squid-EAR-immunity.patch b/patches/server/0077-Squid-EAR-immunity.patch similarity index 94% rename from patches/server/0075-Squid-EAR-immunity.patch rename to patches/server/0077-Squid-EAR-immunity.patch index dc5a60e8a..a1475d232 100644 --- a/patches/server/0075-Squid-EAR-immunity.patch +++ b/patches/server/0077-Squid-EAR-immunity.patch @@ -25,7 +25,7 @@ index 2cbab8dc920fff0d1573072b791f39debd61a710..6b2a2b898d8a4b75f7c9d1ec7112e4f7 public boolean spiderRidable = false; diff --git a/src/main/java/org/spigotmc/ActivationRange.java b/src/main/java/org/spigotmc/ActivationRange.java -index 5fde2a74385e621ae96922fd8aa6e386f5b780bb..8a846e821f763f0c47ca43376d857cdc0ada763c 100644 +index f1abcd9c63d7bb9797f05e3764262e0080c60da2..00744aceb25ddc689b8c5ed90ae27e1ea28057ad 100644 --- a/src/main/java/org/spigotmc/ActivationRange.java +++ b/src/main/java/org/spigotmc/ActivationRange.java @@ -15,6 +15,7 @@ import net.minecraft.world.entity.ambient.AmbientCreature; @@ -36,7 +36,7 @@ index 5fde2a74385e621ae96922fd8aa6e386f5b780bb..8a846e821f763f0c47ca43376d857cdc import net.minecraft.world.entity.animal.WaterAnimal; import net.minecraft.world.entity.animal.horse.Llama; import net.minecraft.world.entity.boss.EnderDragonPart; -@@ -373,6 +374,7 @@ public class ActivationRange +@@ -396,6 +397,7 @@ public class ActivationRange */ public static boolean checkIfActive(Entity entity) { diff --git a/patches/server/0076-Phantoms-burn-in-light.patch b/patches/server/0078-Phantoms-burn-in-light.patch similarity index 100% rename from patches/server/0076-Phantoms-burn-in-light.patch rename to patches/server/0078-Phantoms-burn-in-light.patch diff --git a/patches/server/0077-Configurable-villager-breeding.patch b/patches/server/0079-Configurable-villager-breeding.patch similarity index 93% rename from patches/server/0077-Configurable-villager-breeding.patch rename to patches/server/0079-Configurable-villager-breeding.patch index 5ae7dd23f..f6ee9fdaf 100644 --- a/patches/server/0077-Configurable-villager-breeding.patch +++ b/patches/server/0079-Configurable-villager-breeding.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Configurable villager breeding diff --git a/src/main/java/net/minecraft/world/entity/npc/Villager.java b/src/main/java/net/minecraft/world/entity/npc/Villager.java -index 10e9786b03618232f67cdd88e68161f96ea97ca4..a6d6faf9fed28a97de763e2bd0af38fa9656517e 100644 +index 979bbbf4229a9355b31913454cb565fc98049911..aa95cd7e04e25dec63c172d219f1f16cd6c9c4b5 100644 --- a/src/main/java/net/minecraft/world/entity/npc/Villager.java +++ b/src/main/java/net/minecraft/world/entity/npc/Villager.java -@@ -775,7 +775,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler +@@ -780,7 +780,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler @Override public boolean canBreed() { diff --git a/patches/server/0078-Redstone-deactivates-spawners.patch b/patches/server/0080-Redstone-deactivates-spawners.patch similarity index 94% rename from patches/server/0078-Redstone-deactivates-spawners.patch rename to patches/server/0080-Redstone-deactivates-spawners.patch index e74a81af9..2d04279f3 100644 --- a/patches/server/0078-Redstone-deactivates-spawners.patch +++ b/patches/server/0080-Redstone-deactivates-spawners.patch @@ -17,7 +17,7 @@ index 31ac0e5ca26c7bdfa9b710d0bb78d846ddf6863e..feb65fc9ee04141fe6f77400660442ed } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index d1cd6f374f4ea26bfbb40a8918a34082e72be491..7e5975ee115ea69896f9d1406856a4442f30f91d 100644 +index 992b4fd09aeb6ef23310b1351b8dec38e4527c8d..4be13340ff4de6205b0e35f60e785ad458d7539c 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -363,6 +363,11 @@ public class PurpurWorldConfig { diff --git a/patches/server/0079-Totems-work-in-inventory.patch b/patches/server/0081-Totems-work-in-inventory.patch similarity index 91% rename from patches/server/0079-Totems-work-in-inventory.patch rename to patches/server/0081-Totems-work-in-inventory.patch index 1088c7888..367f92230 100644 --- a/patches/server/0079-Totems-work-in-inventory.patch +++ b/patches/server/0081-Totems-work-in-inventory.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Totems work in inventory diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java -index d2d7511ababe945edc2f22038c2c5531ed1b8b7e..56781b5cf331400703bdda49508390651b506208 100644 +index e41d27f486c5efa1269822c177bc2f1214d27b58..91d4f504b3f2992c8d98b8d75504229101816139 100644 --- a/src/main/java/net/minecraft/world/entity/LivingEntity.java +++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java -@@ -1543,6 +1543,18 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -1551,6 +1551,18 @@ public abstract class LivingEntity extends Entity implements Attackable { } } @@ -28,7 +28,7 @@ index d2d7511ababe945edc2f22038c2c5531ed1b8b7e..56781b5cf331400703bdda4950839065 EntityResurrectEvent event = new EntityResurrectEvent((org.bukkit.entity.LivingEntity) this.getBukkitEntity(), handSlot); event.setCancelled(itemstack == null); diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 7e5975ee115ea69896f9d1406856a4442f30f91d..68dda88f2d6eea8fb84f3db5877375e33a87b204 100644 +index 4be13340ff4de6205b0e35f60e785ad458d7539c..e683f958f1d2afca87b7e337d04151b7aba35efb 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -247,6 +247,7 @@ public class PurpurWorldConfig { diff --git a/patches/server/0080-Add-vindicator-johnny-spawn-chance.patch b/patches/server/0082-Add-vindicator-johnny-spawn-chance.patch similarity index 100% rename from patches/server/0080-Add-vindicator-johnny-spawn-chance.patch rename to patches/server/0082-Add-vindicator-johnny-spawn-chance.patch diff --git a/patches/server/0081-Add-option-to-disable-certain-block-updates.patch b/patches/server/0083-Add-option-to-disable-certain-block-updates.patch similarity index 100% rename from patches/server/0081-Add-option-to-disable-certain-block-updates.patch rename to patches/server/0083-Add-option-to-disable-certain-block-updates.patch diff --git a/patches/server/0082-Dispensers-place-anvils-option.patch b/patches/server/0084-Dispensers-place-anvils-option.patch similarity index 96% rename from patches/server/0082-Dispensers-place-anvils-option.patch rename to patches/server/0084-Dispensers-place-anvils-option.patch index b17208c8d..38976a2c8 100644 --- a/patches/server/0082-Dispensers-place-anvils-option.patch +++ b/patches/server/0084-Dispensers-place-anvils-option.patch @@ -41,7 +41,7 @@ index 9598aa381978194fee859721731196f0e6ee08fc..2db46452d374f9b53db7bd80be5fbd9c static void setEntityPokingOutOfBlock(BlockSource pointer, Entity entity, Direction direction) { diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 88bd6c7e9902002dcdb5997ae5294fd5f99a2142..1d48314c274ac75735014b601d004e8c88d86298 100644 +index 5fd70f3cb91fa4f965f829a354155f5d075f485f..994b43f68127ab6f10e86efa079f0f833be352be 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -321,8 +321,10 @@ public class PurpurWorldConfig { diff --git a/patches/server/0083-Allow-anvil-colors.patch b/patches/server/0085-Allow-anvil-colors.patch similarity index 98% rename from patches/server/0083-Allow-anvil-colors.patch rename to patches/server/0085-Allow-anvil-colors.patch index 7627f67a2..586720fc3 100644 --- a/patches/server/0083-Allow-anvil-colors.patch +++ b/patches/server/0085-Allow-anvil-colors.patch @@ -64,7 +64,7 @@ index 8475a8514b39d543cc7cf0dbfef6d2aabb6127d0..2281dba58d32b6314a7abcdb103c03c7 } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 1d48314c274ac75735014b601d004e8c88d86298..05404b37c6a1974ead2f630cf5405c9489cc6463 100644 +index 994b43f68127ab6f10e86efa079f0f833be352be..c336b4df270b324e6ef8a897c8cafcfd7d0c9c7d 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -299,6 +299,13 @@ public class PurpurWorldConfig { diff --git a/patches/server/0084-Add-option-to-disable-dolphin-treasure-searching.patch b/patches/server/0086-Add-option-to-disable-dolphin-treasure-searching.patch similarity index 100% rename from patches/server/0084-Add-option-to-disable-dolphin-treasure-searching.patch rename to patches/server/0086-Add-option-to-disable-dolphin-treasure-searching.patch diff --git a/patches/server/0085-Short-enderman-height.patch b/patches/server/0087-Short-enderman-height.patch similarity index 90% rename from patches/server/0085-Short-enderman-height.patch rename to patches/server/0087-Short-enderman-height.patch index 63896e07b..dcdafcfba 100644 --- a/patches/server/0085-Short-enderman-height.patch +++ b/patches/server/0087-Short-enderman-height.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Short enderman height diff --git a/src/main/java/net/minecraft/world/entity/EntityType.java b/src/main/java/net/minecraft/world/entity/EntityType.java -index b8007196d117fa30722b81fc1cf8f1ce04c97c68..f3a1bd8509b49ea69282567c08eef1e603d3afb2 100644 +index 944ccfacd740ea0cdd0b8ffbd75bd2e561ebad9b..314a2a31079fcb7619ff9ebef8e6cf161f5c7c9c 100644 --- a/src/main/java/net/minecraft/world/entity/EntityType.java +++ b/src/main/java/net/minecraft/world/entity/EntityType.java -@@ -306,7 +306,8 @@ public class EntityType implements FeatureElement, EntityTypeT +@@ -308,7 +308,8 @@ public class EntityType implements FeatureElement, EntityTypeT private Component description; @Nullable private ResourceLocation lootTable; @@ -19,10 +19,10 @@ index b8007196d117fa30722b81fc1cf8f1ce04c97c68..f3a1bd8509b49ea69282567c08eef1e6 private static EntityType register(String id, EntityType.Builder type) { // CraftBukkit - decompile error diff --git a/src/main/java/net/minecraft/world/entity/monster/EnderMan.java b/src/main/java/net/minecraft/world/entity/monster/EnderMan.java -index da8d81bfba08f1e6e2b789e960b1d39692bb990b..9f78f0e28aff1c9b77520140d3c24b0c8d9b196d 100644 +index b24d890fb9a85434d612c57b4a8763652565d017..d8123aa5585cb4c0cc1210ced04fdf08f731fdb2 100644 --- a/src/main/java/net/minecraft/world/entity/monster/EnderMan.java +++ b/src/main/java/net/minecraft/world/entity/monster/EnderMan.java -@@ -423,6 +423,7 @@ public class EnderMan extends Monster implements NeutralMob { +@@ -429,6 +429,7 @@ public class EnderMan extends Monster implements NeutralMob { if (this.isInvulnerableTo(source)) { return false; } else if (getRider() != null && this.isControllable()) { return super.hurt(source, amount); // Purpur - no teleporting on damage diff --git a/patches/server/0086-Stop-squids-floating-on-top-of-water.patch b/patches/server/0088-Stop-squids-floating-on-top-of-water.patch similarity index 92% rename from patches/server/0086-Stop-squids-floating-on-top-of-water.patch rename to patches/server/0088-Stop-squids-floating-on-top-of-water.patch index ed678163f..140ea4842 100644 --- a/patches/server/0086-Stop-squids-floating-on-top-of-water.patch +++ b/patches/server/0088-Stop-squids-floating-on-top-of-water.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Stop squids floating on top of water diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java -index c9b2798db90a6743112caa80992d6547c8b8d996..b5552ede65f9acf86880909f822fab08eb9e75a8 100644 +index 3726b52e088d745285864fb2fb99cbb1aa5963d8..ac6d250f143ea0198a823f2c24166bfa891adfe9 100644 --- a/src/main/java/net/minecraft/world/entity/Entity.java +++ b/src/main/java/net/minecraft/world/entity/Entity.java -@@ -4184,6 +4184,12 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { +@@ -4218,6 +4218,12 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { this.yRotO = this.getYRot(); } @@ -19,7 +19,7 @@ index c9b2798db90a6743112caa80992d6547c8b8d996..b5552ede65f9acf86880909f822fab08 + // Purpur end + public boolean updateFluidHeightAndDoFluidPushing(TagKey tag, double speed) { - if (this.touchingUnloadedChunk()) { + if (false && this.touchingUnloadedChunk()) { // Pufferfish - cost of a lookup here is the same cost as below, so skip return false; diff --git a/src/main/java/net/minecraft/world/entity/animal/Squid.java b/src/main/java/net/minecraft/world/entity/animal/Squid.java index 0c2b930a0fc5e32afd12a4850acaaa7eb732fc01..de1bf4aea2661763948aba01d93e7685f3ef73cb 100644 diff --git a/patches/server/0087-Crying-obsidian-valid-for-portal-frames.patch b/patches/server/0089-Crying-obsidian-valid-for-portal-frames.patch similarity index 100% rename from patches/server/0087-Crying-obsidian-valid-for-portal-frames.patch rename to patches/server/0089-Crying-obsidian-valid-for-portal-frames.patch diff --git a/patches/server/0088-Entities-can-use-portals-configuration.patch b/patches/server/0090-Entities-can-use-portals-configuration.patch similarity index 90% rename from patches/server/0088-Entities-can-use-portals-configuration.patch rename to patches/server/0090-Entities-can-use-portals-configuration.patch index f9f236f96..ec6e7d498 100644 --- a/patches/server/0088-Entities-can-use-portals-configuration.patch +++ b/patches/server/0090-Entities-can-use-portals-configuration.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Entities can use portals configuration diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java -index c928b8451815ac68b45bd5ac4e0ebbea5be82e34..5cdce4da91905c955d1daf2490338bbc4a1461c5 100644 +index ac6d250f143ea0198a823f2c24166bfa891adfe9..d3d920d647168c8c7445f526726736d454ccaffc 100644 --- a/src/main/java/net/minecraft/world/entity/Entity.java +++ b/src/main/java/net/minecraft/world/entity/Entity.java -@@ -2906,7 +2906,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { +@@ -2940,7 +2940,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { public void handleInsidePortal(BlockPos pos) { if (this.isOnPortalCooldown()) { this.setPortalCooldown(); @@ -17,7 +17,7 @@ index c928b8451815ac68b45bd5ac4e0ebbea5be82e34..5cdce4da91905c955d1daf2490338bbc if (!this.level.isClientSide && !pos.equals(this.portalEntrancePos)) { this.portalEntrancePos = pos.immutable(); } -@@ -3598,7 +3598,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { +@@ -3632,7 +3632,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { } public boolean canChangeDimensions() { @@ -27,7 +27,7 @@ index c928b8451815ac68b45bd5ac4e0ebbea5be82e34..5cdce4da91905c955d1daf2490338bbc public float getBlockExplosionResistance(Explosion explosion, BlockGetter world, BlockPos pos, BlockState blockState, FluidState fluidState, float max) { diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 73039cf2e685514a7c6a553310c27c4d42b06054..049aed0affed3a169c79fbd8371bf452a249e65a 100644 +index 404300394bf9e4e7ff43cae3c39e8898382e5ac0..c68801aa022a59155d37bb8a930a5cbef4b91dfa 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -100,6 +100,7 @@ public class PurpurWorldConfig { diff --git a/patches/server/0089-LivingEntity-broadcastItemBreak.patch b/patches/server/0091-LivingEntity-broadcastItemBreak.patch similarity index 100% rename from patches/server/0089-LivingEntity-broadcastItemBreak.patch rename to patches/server/0091-LivingEntity-broadcastItemBreak.patch diff --git a/patches/server/0090-Customizable-wither-health-and-healing.patch b/patches/server/0092-Customizable-wither-health-and-healing.patch similarity index 100% rename from patches/server/0090-Customizable-wither-health-and-healing.patch rename to patches/server/0092-Customizable-wither-health-and-healing.patch diff --git a/patches/server/0091-Allow-toggling-special-MobSpawners-per-world.patch b/patches/server/0093-Allow-toggling-special-MobSpawners-per-world.patch similarity index 96% rename from patches/server/0091-Allow-toggling-special-MobSpawners-per-world.patch rename to patches/server/0093-Allow-toggling-special-MobSpawners-per-world.patch index 6145279ed..c72cfbc0f 100644 --- a/patches/server/0091-Allow-toggling-special-MobSpawners-per-world.patch +++ b/patches/server/0093-Allow-toggling-special-MobSpawners-per-world.patch @@ -6,7 +6,7 @@ Subject: [PATCH] Allow toggling special MobSpawners per world In vanilla, these are all hardcoded on for world type 0 (overworld) and hardcoded off for every other world type. Default config behaviour matches this. diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java -index 057f4b71ff295cf6fed9cc5b86aa40345e448af3..34a2fd0ad0bdca9488093364d255e190173debfa 100644 +index a7c153f957af48cf42ecbb01ada5f8f384c4e5e4..5a6c5972f6044cc4bda46259679d7ca19f2d7704 100644 --- a/src/main/java/net/minecraft/server/level/ServerLevel.java +++ b/src/main/java/net/minecraft/server/level/ServerLevel.java @@ -543,7 +543,24 @@ public class ServerLevel extends Level implements WorldGenLevel { @@ -59,7 +59,7 @@ index ae9f9112ce9bec82e7571f679017f1723d9eb982..6f8f03c868b671ea42b45aea97d823fe if (NaturalSpawner.isSpawnPositionOk(SpawnPlacements.Type.ON_GROUND, world, blockposition2, EntityType.WANDERING_TRADER)) { blockposition1 = blockposition2; diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index f24ea5c30b5a608ee3b0d5dc7e17af1447391471..47e90f13c3b829dcf89160f743091c221c725c78 100644 +index 146dfeddb9572eb017e137656c849dcd15162db8..dd70c75ef196dec6e3c781695240fb74fbbf48c7 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -71,6 +71,12 @@ public class PurpurWorldConfig { diff --git a/patches/server/0092-Raid-cooldown-setting.patch b/patches/server/0094-Raid-cooldown-setting.patch similarity index 97% rename from patches/server/0092-Raid-cooldown-setting.patch rename to patches/server/0094-Raid-cooldown-setting.patch index 3665a7ea8..ed503ad01 100644 --- a/patches/server/0092-Raid-cooldown-setting.patch +++ b/patches/server/0094-Raid-cooldown-setting.patch @@ -49,7 +49,7 @@ index fabce3bc592b1b172b227395a07febdbb66ec3c9..df48bcc8f329e3855bb7426bdfe0e3c7 if (!this.raidMap.containsKey(raid.getId())) { this.raidMap.put(raid.getId(), raid); diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 47e90f13c3b829dcf89160f743091c221c725c78..8fd3ca92d8d3ac07cc4c0a3bd9b54ead9d4c6f7c 100644 +index dd70c75ef196dec6e3c781695240fb74fbbf48c7..f5e89d6193b4bb032355571320fbc56fd1ef934b 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -111,6 +111,7 @@ public class PurpurWorldConfig { diff --git a/patches/server/0093-Despawn-rate-config-options-per-projectile-type.patch b/patches/server/0095-Despawn-rate-config-options-per-projectile-type.patch similarity index 96% rename from patches/server/0093-Despawn-rate-config-options-per-projectile-type.patch rename to patches/server/0095-Despawn-rate-config-options-per-projectile-type.patch index 1864cb17e..fa109836b 100644 --- a/patches/server/0093-Despawn-rate-config-options-per-projectile-type.patch +++ b/patches/server/0095-Despawn-rate-config-options-per-projectile-type.patch @@ -7,7 +7,7 @@ This patch's implementation has been removed in favor of Pufferfish's entity-tim The config remains for migration purposes. diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 8fd3ca92d8d3ac07cc4c0a3bd9b54ead9d4c6f7c..185d1055a5f9567707f5464c447a3d496ad1331d 100644 +index f5e89d6193b4bb032355571320fbc56fd1ef934b..8b7da9f1e1c073b1cf93aa403aadf0b42da9a1e6 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -292,6 +292,39 @@ public class PurpurWorldConfig { diff --git a/patches/server/0094-Add-option-to-disable-zombie-aggressiveness-towards-.patch b/patches/server/0096-Add-option-to-disable-zombie-aggressiveness-towards-.patch similarity index 100% rename from patches/server/0094-Add-option-to-disable-zombie-aggressiveness-towards-.patch rename to patches/server/0096-Add-option-to-disable-zombie-aggressiveness-towards-.patch diff --git a/patches/server/0095-Add-predicate-to-recipe-s-ExactChoice-ingredient.patch b/patches/server/0097-Add-predicate-to-recipe-s-ExactChoice-ingredient.patch similarity index 100% rename from patches/server/0095-Add-predicate-to-recipe-s-ExactChoice-ingredient.patch rename to patches/server/0097-Add-predicate-to-recipe-s-ExactChoice-ingredient.patch diff --git a/patches/server/0096-Flying-squids-Oh-my.patch b/patches/server/0098-Flying-squids-Oh-my.patch similarity index 100% rename from patches/server/0096-Flying-squids-Oh-my.patch rename to patches/server/0098-Flying-squids-Oh-my.patch diff --git a/patches/server/0097-Infinity-bow-settings.patch b/patches/server/0099-Infinity-bow-settings.patch similarity index 97% rename from patches/server/0097-Infinity-bow-settings.patch rename to patches/server/0099-Infinity-bow-settings.patch index c7e932593..95728d2ab 100644 --- a/patches/server/0097-Infinity-bow-settings.patch +++ b/patches/server/0099-Infinity-bow-settings.patch @@ -27,7 +27,7 @@ index 08d597db1a5345a343777a01427655e6bf2c926b..33df0ca406dc8321b76b393f317bbd1c } else { user.startUsingItem(hand); diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 19f16d8b71ba7fe636326ef0990134518c7ab1ed..ea9354c558c13bc6a2d85c289230911ae7e964f7 100644 +index e279df79e3ce5a12205c45c611e252bfaa6ffbdb..7853ce4653b379d1510e62bec0d784620e9e5347 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -142,6 +142,17 @@ public class PurpurWorldConfig { diff --git a/patches/server/0098-Configurable-daylight-cycle.patch b/patches/server/0100-Configurable-daylight-cycle.patch similarity index 92% rename from patches/server/0098-Configurable-daylight-cycle.patch rename to patches/server/0100-Configurable-daylight-cycle.patch index 10345babf..9f8cb7c8d 100644 --- a/patches/server/0098-Configurable-daylight-cycle.patch +++ b/patches/server/0100-Configurable-daylight-cycle.patch @@ -18,10 +18,10 @@ index 9ec6145fe04ec64bbee8ec6a837719caebdbc6f5..358d610ad020cada1bb83e393deeeaae public ClientboundSetTimePacket(long time, long timeOfDay, boolean doDaylightCycle) { this.gameTime = time; diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java -index 49504728dd67343cd9b5a57e9a82fb447a2aeda9..a4c59668906df746117d7fe6ac4bafc1180d6d8e 100644 +index 899bf1a7820f480fa20a68c480c3aaae926a1a3e..156018623d8723c397a8548c9def80ba28a88e75 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java -@@ -1519,7 +1519,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop recipe, NonNullList slots, int count) { diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 1cb41bdbc856d14bc10b0191b28949402c602fde..72b3c842ec4e569c25a190cdc1dc35597ece0132 100644 +index 1faa69be3acd182d9c7d676b05c820ab1b6eff06..8b80282e3816dacb428ee08acd1a5cb034a75457 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -415,6 +415,17 @@ public class PurpurWorldConfig { diff --git a/patches/server/0101-Arrows-should-not-reset-despawn-counter.patch b/patches/server/0103-Arrows-should-not-reset-despawn-counter.patch similarity index 95% rename from patches/server/0101-Arrows-should-not-reset-despawn-counter.patch rename to patches/server/0103-Arrows-should-not-reset-despawn-counter.patch index 858d37274..3ac3108db 100644 --- a/patches/server/0101-Arrows-should-not-reset-despawn-counter.patch +++ b/patches/server/0103-Arrows-should-not-reset-despawn-counter.patch @@ -20,7 +20,7 @@ index 5d6d26cfe8f0ab68a3145214b3fc126ca7a71a66..1ea5664e1e7dc73cbd2d1cc38c830a19 @Override diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 72b3c842ec4e569c25a190cdc1dc35597ece0132..291a2ec95730cba6ead558ae2ec4e3d514f03b7a 100644 +index 8b80282e3816dacb428ee08acd1a5cb034a75457..9569c51ceffe45931211353893c56fe896bac952 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -103,6 +103,11 @@ public class PurpurWorldConfig { diff --git a/patches/server/0102-Ability-to-re-add-farmland-mechanics-from-Alpha.patch b/patches/server/0104-Ability-to-re-add-farmland-mechanics-from-Alpha.patch similarity index 95% rename from patches/server/0102-Ability-to-re-add-farmland-mechanics-from-Alpha.patch rename to patches/server/0104-Ability-to-re-add-farmland-mechanics-from-Alpha.patch index 21c87893e..4037302c3 100644 --- a/patches/server/0102-Ability-to-re-add-farmland-mechanics-from-Alpha.patch +++ b/patches/server/0104-Ability-to-re-add-farmland-mechanics-from-Alpha.patch @@ -24,7 +24,7 @@ index fce9ebcaaac18ecee24c7091ea77a32ac567762e..8725ca6eec1becc401951a746a90f678 return; } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 291a2ec95730cba6ead558ae2ec4e3d514f03b7a..1f9df5b322cc99b14a5a501b18ce269973f646c3 100644 +index 9569c51ceffe45931211353893c56fe896bac952..cc6ba8be24f9ac5c08a17dff9f22ae9c0159a54c 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -416,8 +416,10 @@ public class PurpurWorldConfig { diff --git a/patches/server/0103-Add-adjustable-breeding-cooldown-to-config.patch b/patches/server/0105-Add-adjustable-breeding-cooldown-to-config.patch similarity index 96% rename from patches/server/0103-Add-adjustable-breeding-cooldown-to-config.patch rename to patches/server/0105-Add-adjustable-breeding-cooldown-to-config.patch index 1904e89fc..ebd7e1121 100644 --- a/patches/server/0103-Add-adjustable-breeding-cooldown-to-config.patch +++ b/patches/server/0105-Add-adjustable-breeding-cooldown-to-config.patch @@ -33,7 +33,7 @@ index 3c4d142e982c34a23bdb5da1f51c8dcacc0532c1..f185215b826c4b50a819c8454089cb8c entityageable.setBaby(true); entityageable.moveTo(this.getX(), this.getY(), this.getZ(), 0.0F, 0.0F); diff --git a/src/main/java/net/minecraft/world/level/Level.java b/src/main/java/net/minecraft/world/level/Level.java -index 85e5492a172bc493ef7d97dee355cab621f4aae8..40c675564614e1307b2cf85584e23a94734ec36b 100644 +index d0e0ce953dd0cdd6b54bb00224e82dca62f793cd..52d2fa575a29ec36280bb4dbcab6954ac468d2a1 100644 --- a/src/main/java/net/minecraft/world/level/Level.java +++ b/src/main/java/net/minecraft/world/level/Level.java @@ -195,6 +195,49 @@ public abstract class Level implements LevelAccessor, AutoCloseable { @@ -86,7 +86,7 @@ index 85e5492a172bc493ef7d97dee355cab621f4aae8..40c675564614e1307b2cf85584e23a94 public CraftWorld getWorld() { return this.world; } -@@ -279,6 +322,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { +@@ -290,6 +333,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { this.spigotConfig = new org.spigotmc.SpigotWorldConfig(((net.minecraft.world.level.storage.PrimaryLevelData) worlddatamutable).getLevelName()); // Spigot this.paperConfig = paperWorldConfigCreator.apply(this.spigotConfig); // Paper this.purpurConfig = new org.purpurmc.purpur.PurpurWorldConfig(((net.minecraft.world.level.storage.PrimaryLevelData) worlddatamutable).getLevelName(), env); // Purpur @@ -95,7 +95,7 @@ index 85e5492a172bc493ef7d97dee355cab621f4aae8..40c675564614e1307b2cf85584e23a94 this.world = new CraftWorld((ServerLevel) this, gen, biomeProvider, env); diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 1f9df5b322cc99b14a5a501b18ce269973f646c3..2ca801b99afa3b7c880b8266c841445262905651 100644 +index cc6ba8be24f9ac5c08a17dff9f22ae9c0159a54c..94e2fe3e094b2519d4a12ff653e5041b4f93b94c 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -117,6 +117,7 @@ public class PurpurWorldConfig { diff --git a/patches/server/0104-Make-entity-breeding-times-configurable.patch b/patches/server/0106-Make-entity-breeding-times-configurable.patch similarity index 99% rename from patches/server/0104-Make-entity-breeding-times-configurable.patch rename to patches/server/0106-Make-entity-breeding-times-configurable.patch index 059998ea8..22152e6cf 100644 --- a/patches/server/0104-Make-entity-breeding-times-configurable.patch +++ b/patches/server/0106-Make-entity-breeding-times-configurable.patch @@ -300,7 +300,7 @@ index 05792466a89bdcffe1a4241761b7c23afcc6bc88..6ddcf37ce8dbc6a57cabd43b04be6bab @Override diff --git a/src/main/java/net/minecraft/world/entity/animal/axolotl/Axolotl.java b/src/main/java/net/minecraft/world/entity/animal/axolotl/Axolotl.java -index eaf2e6b9865a36b7c648bd1205db922a62cd7ee8..1af75e173958c192b8f53b7e17e75d980cbbbcbc 100644 +index 65587c422eb7e2b64670dd869e01297998765c30..6fb82a4497dbc1ace86b8446f45ddecda18302bb 100644 --- a/src/main/java/net/minecraft/world/entity/animal/axolotl/Axolotl.java +++ b/src/main/java/net/minecraft/world/entity/animal/axolotl/Axolotl.java @@ -118,6 +118,11 @@ public class Axolotl extends Animal implements LerpingModel, VariantHolder { @@ -349,7 +349,7 @@ index 12962698dd354dc5da325e8bb24e5fff40af9e51..4807eb6487c3a394ee4eb88d7f68b09e @Override diff --git a/src/main/java/net/minecraft/world/entity/animal/goat/Goat.java b/src/main/java/net/minecraft/world/entity/animal/goat/Goat.java -index 1cfc1ade52b79c6c5577935fe5c37a0e7a1673f0..b2c025184b9d8d272fab720a5930c030312d6e03 100644 +index 81790ac38ef67682053751a9e6813eed8d744337..c16caaf748d5972be455234b4e2cb8a3980e17b0 100644 --- a/src/main/java/net/minecraft/world/entity/animal/goat/Goat.java +++ b/src/main/java/net/minecraft/world/entity/animal/goat/Goat.java @@ -104,6 +104,11 @@ public class Goat extends Animal { @@ -509,7 +509,7 @@ index 0a480333373c3f3a9504d0b4a3e00fba2e8b2e15..1be6dc3608b839b0ed7d2fcd968991ce public static boolean checkStriderSpawnRules(EntityType type, LevelAccessor world, MobSpawnType spawnReason, BlockPos pos, RandomSource random) { diff --git a/src/main/java/net/minecraft/world/entity/monster/hoglin/Hoglin.java b/src/main/java/net/minecraft/world/entity/monster/hoglin/Hoglin.java -index 930d74e5fd20b69baeec60dfc54da37a1290fccc..2161df2ebee7dc00c924bfbc56377d68906b1f18 100644 +index b855647ebd374e4d01e90b78a5d650ceab85173d..6e8715bf332826c8326c00c5288e2402f02339a1 100644 --- a/src/main/java/net/minecraft/world/entity/monster/hoglin/Hoglin.java +++ b/src/main/java/net/minecraft/world/entity/monster/hoglin/Hoglin.java @@ -87,6 +87,11 @@ public class Hoglin extends Animal implements Enemy, HoglinBase { diff --git a/patches/server/0105-Apply-display-names-from-item-forms-of-entities-to-e.patch b/patches/server/0107-Apply-display-names-from-item-forms-of-entities-to-e.patch similarity index 99% rename from patches/server/0105-Apply-display-names-from-item-forms-of-entities-to-e.patch rename to patches/server/0107-Apply-display-names-from-item-forms-of-entities-to-e.patch index 3b67b326a..5ba02c8f7 100644 --- a/patches/server/0105-Apply-display-names-from-item-forms-of-entities-to-e.patch +++ b/patches/server/0107-Apply-display-names-from-item-forms-of-entities-to-e.patch @@ -136,7 +136,7 @@ index b2ad6d230de2c29f371178bccde1111c7532ee70..6667926519a0f1c151e53f59cce36e74 if (((HangingEntity) object).survives()) { diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index d7669999bcf294c71c4238ccbeade1cdddd59400..c54c236df83d4c44388155423fb90eb0369859b8 100644 +index 901fc6601b9e0cb25e9641de9e14755b12c6297d..09aff91bb1609b4ec91a16a3843839269eb536e0 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -99,8 +99,10 @@ public class PurpurWorldConfig { diff --git a/patches/server/0106-Set-name-visible-when-using-a-Name-Tag-on-an-Armor-S.patch b/patches/server/0108-Set-name-visible-when-using-a-Name-Tag-on-an-Armor-S.patch similarity index 96% rename from patches/server/0106-Set-name-visible-when-using-a-Name-Tag-on-an-Armor-S.patch rename to patches/server/0108-Set-name-visible-when-using-a-Name-Tag-on-an-Armor-S.patch index a65158169..1bceff4db 100644 --- a/patches/server/0106-Set-name-visible-when-using-a-Name-Tag-on-an-Armor-S.patch +++ b/patches/server/0108-Set-name-visible-when-using-a-Name-Tag-on-an-Armor-S.patch @@ -17,7 +17,7 @@ index 623f78c078fb3aa2665d7e8a37672438227bce6b..500c69e555c7247e20ef8cc59d834155 ((Mob) newEntityLiving).setPersistenceRequired(); // Paper end diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index c54c236df83d4c44388155423fb90eb0369859b8..0ad3060844347541efe021e5cdc1703c0fc0740f 100644 +index 09aff91bb1609b4ec91a16a3843839269eb536e0..a0f05155f761941de87710d5c7846b878eb86ec7 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -100,9 +100,11 @@ public class PurpurWorldConfig { diff --git a/patches/server/0107-Add-config-for-allowing-Endermen-to-despawn-even-whi.patch b/patches/server/0109-Add-config-for-allowing-Endermen-to-despawn-even-whi.patch similarity index 93% rename from patches/server/0107-Add-config-for-allowing-Endermen-to-despawn-even-whi.patch rename to patches/server/0109-Add-config-for-allowing-Endermen-to-despawn-even-whi.patch index 233116c25..5c0cd13fe 100644 --- a/patches/server/0107-Add-config-for-allowing-Endermen-to-despawn-even-whi.patch +++ b/patches/server/0109-Add-config-for-allowing-Endermen-to-despawn-even-whi.patch @@ -8,10 +8,10 @@ This should help to reduce the amount of dirt, gravel, grass, and etc. that Endermen like to randomly place all over the world. diff --git a/src/main/java/net/minecraft/world/entity/monster/EnderMan.java b/src/main/java/net/minecraft/world/entity/monster/EnderMan.java -index cb746b678639e09559d6913c989a6ef27a739ff7..565ac4434fdf61bfde7636af9a10ba9a072b8160 100644 +index d8123aa5585cb4c0cc1210ced04fdf08f731fdb2..757aa2e3fa1c4608f07adbff0f718ad8f04be475 100644 --- a/src/main/java/net/minecraft/world/entity/monster/EnderMan.java +++ b/src/main/java/net/minecraft/world/entity/monster/EnderMan.java -@@ -484,7 +484,7 @@ public class EnderMan extends Monster implements NeutralMob { +@@ -490,7 +490,7 @@ public class EnderMan extends Monster implements NeutralMob { @Override public boolean requiresCustomPersistence() { diff --git a/patches/server/0108-Add-configurable-snowball-damage.patch b/patches/server/0110-Add-configurable-snowball-damage.patch similarity index 95% rename from patches/server/0108-Add-configurable-snowball-damage.patch rename to patches/server/0110-Add-configurable-snowball-damage.patch index 293c76402..dba5d181e 100644 --- a/patches/server/0108-Add-configurable-snowball-damage.patch +++ b/patches/server/0110-Add-configurable-snowball-damage.patch @@ -18,7 +18,7 @@ index 6cded52e4627c2b6073fa221fc6d6583f1b2a96d..5827236f351cd0679af764644bb22bb2 } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 1f45018079de15231473041166ee6f9fcd940f9a..5a1c7e187efcfddc1a0b50c45c616b6858446057 100644 +index 8410a3c5f13b94b096d1d544690abe684595df9b..5e1bfa72f902fb24dd67a973b4ef4b202d803269 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -356,6 +356,11 @@ public class PurpurWorldConfig { diff --git a/patches/server/0109-Changeable-Mob-Left-Handed-Chance.patch b/patches/server/0111-Changeable-Mob-Left-Handed-Chance.patch similarity index 86% rename from patches/server/0109-Changeable-Mob-Left-Handed-Chance.patch rename to patches/server/0111-Changeable-Mob-Left-Handed-Chance.patch index 30f4488b8..3227912bd 100644 --- a/patches/server/0109-Changeable-Mob-Left-Handed-Chance.patch +++ b/patches/server/0111-Changeable-Mob-Left-Handed-Chance.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Changeable Mob Left Handed Chance diff --git a/src/main/java/net/minecraft/world/entity/Mob.java b/src/main/java/net/minecraft/world/entity/Mob.java -index 5bff6bf091a61d1414ca1408960d50ce0d646458..318ad01371bb5e8d53f366a891dc642373f0d66f 100644 +index 183261a031a2a0b6b95dbb983236cee3cd3a0398..9dae07b1f1e18cbc86d64e5f793a5eb1685c2f7b 100644 --- a/src/main/java/net/minecraft/world/entity/Mob.java +++ b/src/main/java/net/minecraft/world/entity/Mob.java -@@ -1286,7 +1286,7 @@ public abstract class Mob extends LivingEntity implements Targeting { +@@ -1292,7 +1292,7 @@ public abstract class Mob extends LivingEntity implements Targeting { RandomSource randomsource = world.getRandom(); this.getAttribute(Attributes.FOLLOW_RANGE).addPermanentModifier(new AttributeModifier("Random spawn bonus", randomsource.triangle(0.0D, 0.11485000000000001D), AttributeModifier.Operation.MULTIPLY_BASE)); @@ -18,7 +18,7 @@ index 5bff6bf091a61d1414ca1408960d50ce0d646458..318ad01371bb5e8d53f366a891dc6423 } else { this.setLeftHanded(false); diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 5a1c7e187efcfddc1a0b50c45c616b6858446057..71858bd4d8987c2da7c67a473c1f60e66494742d 100644 +index 5e1bfa72f902fb24dd67a973b4ef4b202d803269..1b19d4cd80166420a9a7918bd96cf39d5616b439 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -158,8 +158,10 @@ public class PurpurWorldConfig { diff --git a/patches/server/0110-Add-boat-fall-damage-config.patch b/patches/server/0112-Add-boat-fall-damage-config.patch similarity index 97% rename from patches/server/0110-Add-boat-fall-damage-config.patch rename to patches/server/0112-Add-boat-fall-damage-config.patch index b2d198cdd..7f7fcd0e2 100644 --- a/patches/server/0110-Add-boat-fall-damage-config.patch +++ b/patches/server/0112-Add-boat-fall-damage-config.patch @@ -27,7 +27,7 @@ index 8dfc4763df3cd207e7200828f8237f680b47f986..d15b29153d8112ed59ce38ab37142208 if (!flag && isSpawnInvulnerable() && !source.is(DamageTypeTags.BYPASSES_INVULNERABILITY)) { // Purpur diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 71858bd4d8987c2da7c67a473c1f60e66494742d..991dae6f29cc919de49533d03478cb3b6c16106d 100644 +index 1b19d4cd80166420a9a7918bd96cf39d5616b439..a79b5fcfdee45cca589a13c470b9fc83a750980c 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -114,6 +114,7 @@ public class PurpurWorldConfig { diff --git a/patches/server/0111-Snow-Golem-rate-of-fire-config.patch b/patches/server/0113-Snow-Golem-rate-of-fire-config.patch similarity index 100% rename from patches/server/0111-Snow-Golem-rate-of-fire-config.patch rename to patches/server/0113-Snow-Golem-rate-of-fire-config.patch diff --git a/patches/server/0112-EMC-Configurable-disable-give-dropping.patch b/patches/server/0114-EMC-Configurable-disable-give-dropping.patch similarity index 100% rename from patches/server/0112-EMC-Configurable-disable-give-dropping.patch rename to patches/server/0114-EMC-Configurable-disable-give-dropping.patch diff --git a/patches/server/0113-Option-for-Villager-Clerics-to-farm-Nether-Wart.patch b/patches/server/0115-Option-for-Villager-Clerics-to-farm-Nether-Wart.patch similarity index 98% rename from patches/server/0113-Option-for-Villager-Clerics-to-farm-Nether-Wart.patch rename to patches/server/0115-Option-for-Villager-Clerics-to-farm-Nether-Wart.patch index aacfb75ae..8f6adfcd8 100644 --- a/patches/server/0113-Option-for-Villager-Clerics-to-farm-Nether-Wart.patch +++ b/patches/server/0115-Option-for-Villager-Clerics-to-farm-Nether-Wart.patch @@ -143,10 +143,10 @@ index cb1d91f9fe98f21c2afbe3894dfd9bca3bdd3ba6..d2703432af207c74ea8d298a784329c3 brain.setMemory(MemoryModuleType.SECONDARY_JOB_SITE, list); } else { diff --git a/src/main/java/net/minecraft/world/entity/npc/Villager.java b/src/main/java/net/minecraft/world/entity/npc/Villager.java -index a6d6faf9fed28a97de763e2bd0af38fa9656517e..4f7b37030454aa2fba5d04c4a629576a78cb5592 100644 +index aa95cd7e04e25dec63c172d219f1f16cd6c9c4b5..8e2015fc122a93015482a81b2bbfa1127d6a0db6 100644 --- a/src/main/java/net/minecraft/world/entity/npc/Villager.java +++ b/src/main/java/net/minecraft/world/entity/npc/Villager.java -@@ -220,7 +220,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler +@@ -222,7 +222,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler brain.addActivity(Activity.PLAY, VillagerGoalPackages.getPlayPackage(0.5F)); } else { brain.setSchedule(Schedule.VILLAGER_DEFAULT); @@ -155,7 +155,7 @@ index a6d6faf9fed28a97de763e2bd0af38fa9656517e..4f7b37030454aa2fba5d04c4a629576a } brain.addActivity(Activity.CORE, VillagerGoalPackages.getCorePackage(villagerprofession, 0.5F)); -@@ -967,6 +967,11 @@ public class Villager extends AbstractVillager implements ReputationEventHandler +@@ -972,6 +972,11 @@ public class Villager extends AbstractVillager implements ReputationEventHandler } public boolean hasFarmSeeds() { diff --git a/patches/server/0114-Toggle-for-Zombified-Piglin-death-always-counting-as.patch b/patches/server/0116-Toggle-for-Zombified-Piglin-death-always-counting-as.patch similarity index 100% rename from patches/server/0114-Toggle-for-Zombified-Piglin-death-always-counting-as.patch rename to patches/server/0116-Toggle-for-Zombified-Piglin-death-always-counting-as.patch diff --git a/patches/server/0115-Configurable-chance-for-wolves-to-spawn-rabid.patch b/patches/server/0117-Configurable-chance-for-wolves-to-spawn-rabid.patch similarity index 100% rename from patches/server/0115-Configurable-chance-for-wolves-to-spawn-rabid.patch rename to patches/server/0117-Configurable-chance-for-wolves-to-spawn-rabid.patch diff --git a/patches/server/0116-Configurable-default-collar-color.patch b/patches/server/0118-Configurable-default-collar-color.patch similarity index 100% rename from patches/server/0116-Configurable-default-collar-color.patch rename to patches/server/0118-Configurable-default-collar-color.patch diff --git a/patches/server/0117-Phantom-flames-on-swoop.patch b/patches/server/0119-Phantom-flames-on-swoop.patch similarity index 100% rename from patches/server/0117-Phantom-flames-on-swoop.patch rename to patches/server/0119-Phantom-flames-on-swoop.patch diff --git a/patches/server/0118-Option-for-chests-to-open-even-with-a-solid-block-on.patch b/patches/server/0120-Option-for-chests-to-open-even-with-a-solid-block-on.patch similarity index 94% rename from patches/server/0118-Option-for-chests-to-open-even-with-a-solid-block-on.patch rename to patches/server/0120-Option-for-chests-to-open-even-with-a-solid-block-on.patch index d47d7ea52..e4dd41d87 100644 --- a/patches/server/0118-Option-for-chests-to-open-even-with-a-solid-block-on.patch +++ b/patches/server/0120-Option-for-chests-to-open-even-with-a-solid-block-on.patch @@ -17,7 +17,7 @@ index 5e22d175b1048a58802cdf64ac70a8b56329e915..d81946b400f208c39941128ce823ff77 return world.getBlockState(blockposition1).isRedstoneConductor(world, blockposition1); diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 648716c472887ee24dc3d5fd8a072e511ec9e314..9cdbc268c4ca2296d0126a974e1bd04bb67eebdd 100644 +index 39a31ab49d6b8eeac6df8fb86faee4bde1f519f7..6d5571112fb8e13291121cd0942230996be58224 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -425,6 +425,11 @@ public class PurpurWorldConfig { diff --git a/patches/server/0119-Implement-TPSBar.patch b/patches/server/0121-Implement-TPSBar.patch similarity index 97% rename from patches/server/0119-Implement-TPSBar.patch rename to patches/server/0121-Implement-TPSBar.patch index 10fa47e75..b89820e38 100644 --- a/patches/server/0119-Implement-TPSBar.patch +++ b/patches/server/0121-Implement-TPSBar.patch @@ -17,10 +17,10 @@ index 277fb799d898ca726205519b1516861901be33c5..144e83bac0d8885c48d97d7fbb4b712d if (environment.includeIntegrated) { diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java -index 2f6dee9900c8edc9a8a7b1ead52a426024bcac00..9a6a2208e75ab2e35fd7b807b3a9fa04e28bcd58 100644 +index 156018623d8723c397a8548c9def80ba28a88e75..b2c661f4194a25497e385f587c9da088d7c36965 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java -@@ -1023,6 +1023,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop this.disconnect("Book too large!", org.bukkit.event.player.PlayerKickEvent.Cause.ILLEGAL_ACTION)); // Paper - kick event cause return; } -@@ -1278,6 +1280,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic +@@ -1279,6 +1281,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic if (byteTotal > byteAllowed) { ServerGamePacketListenerImpl.LOGGER.warn(this.player.getScoreboardName() + " tried to send too large of a book. Book Size: " + byteTotal + " - Allowed: "+ byteAllowed + " - Pages: " + pageList.size()); diff --git a/patches/server/0122-Full-netherite-armor-grants-fire-resistance.patch b/patches/server/0124-Full-netherite-armor-grants-fire-resistance.patch similarity index 94% rename from patches/server/0122-Full-netherite-armor-grants-fire-resistance.patch rename to patches/server/0124-Full-netherite-armor-grants-fire-resistance.patch index 5e2fa4402..2319dcdbf 100644 --- a/patches/server/0122-Full-netherite-armor-grants-fire-resistance.patch +++ b/patches/server/0124-Full-netherite-armor-grants-fire-resistance.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Full netherite armor grants fire resistance diff --git a/src/main/java/net/minecraft/world/entity/player/Player.java b/src/main/java/net/minecraft/world/entity/player/Player.java -index 7518564208579de9104bdaddcab67db736d263f8..150aaa68340f25c39a9b10eda43e9941a22d0aae 100644 +index 9e4a8278ef601b17311ba53cb187329a434f7bab..dc395219fddf7f994200bc943768d9348201e656 100644 --- a/src/main/java/net/minecraft/world/entity/player/Player.java +++ b/src/main/java/net/minecraft/world/entity/player/Player.java @@ -365,6 +365,16 @@ public abstract class Player extends LivingEntity { @@ -26,7 +26,7 @@ index 7518564208579de9104bdaddcab67db736d263f8..150aaa68340f25c39a9b10eda43e9941 protected ItemCooldowns createItemCooldowns() { diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 89b0e3753ae2c4728e337ee080d17abc2403040c..1314ab21523e5fa5acdbf24a7c811988f9dbf98b 100644 +index 4f2416691bea7b53166d7d8448f57019147e1629..2224f6ef1b011c52597a769a3c0d7ae2dfb11b35 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -297,6 +297,19 @@ public class PurpurWorldConfig { diff --git a/patches/server/0123-Fix-rotating-UP-DOWN-CW-and-CCW.patch b/patches/server/0125-Fix-rotating-UP-DOWN-CW-and-CCW.patch similarity index 100% rename from patches/server/0123-Fix-rotating-UP-DOWN-CW-and-CCW.patch rename to patches/server/0125-Fix-rotating-UP-DOWN-CW-and-CCW.patch diff --git a/patches/server/0124-Add-mobGriefing-bypass-to-everything-affected.patch b/patches/server/0126-Add-mobGriefing-bypass-to-everything-affected.patch similarity index 98% rename from patches/server/0124-Add-mobGriefing-bypass-to-everything-affected.patch rename to patches/server/0126-Add-mobGriefing-bypass-to-everything-affected.patch index 8e8df8721..2062ae8d9 100644 --- a/patches/server/0124-Add-mobGriefing-bypass-to-everything-affected.patch +++ b/patches/server/0126-Add-mobGriefing-bypass-to-everything-affected.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Add mobGriefing bypass to everything affected diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java -index b5d6060af4f806896ea499cad4073778ed5659e4..3ac340ec29845321e1ed4d1afb3687ba564b06b3 100644 +index 91d4f504b3f2992c8d98b8d75504229101816139..39f59d3575e8663d5b1a0acd31421158d25b6b67 100644 --- a/src/main/java/net/minecraft/world/entity/LivingEntity.java +++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java -@@ -1715,7 +1715,7 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -1723,7 +1723,7 @@ public abstract class LivingEntity extends Entity implements Attackable { boolean flag = false; if (this.dead && adversary instanceof WitherBoss) { // Paper @@ -18,10 +18,10 @@ index b5d6060af4f806896ea499cad4073778ed5659e4..3ac340ec29845321e1ed4d1afb3687ba BlockState iblockdata = Blocks.WITHER_ROSE.defaultBlockState(); diff --git a/src/main/java/net/minecraft/world/entity/Mob.java b/src/main/java/net/minecraft/world/entity/Mob.java -index 318ad01371bb5e8d53f366a891dc642373f0d66f..4d5d667b4c4ea324c91f85d8e6baa886dcda5406 100644 +index 9dae07b1f1e18cbc86d64e5f793a5eb1685c2f7b..34eb04112fa47cbcd233f8a959036d988d73f1b4 100644 --- a/src/main/java/net/minecraft/world/entity/Mob.java +++ b/src/main/java/net/minecraft/world/entity/Mob.java -@@ -698,7 +698,7 @@ public abstract class Mob extends LivingEntity implements Targeting { +@@ -700,7 +700,7 @@ public abstract class Mob extends LivingEntity implements Targeting { public void aiStep() { super.aiStep(); this.level.getProfiler().push("looting"); @@ -157,10 +157,10 @@ index b22d0af2267581467af9a4d0e8104146b3da9b71..334ffb3553e1b87b538ac42155942049 j = Mth.floor(this.getX()); int i1 = Mth.floor(this.getZ()); diff --git a/src/main/java/net/minecraft/world/entity/monster/EnderMan.java b/src/main/java/net/minecraft/world/entity/monster/EnderMan.java -index 565ac4434fdf61bfde7636af9a10ba9a072b8160..e0680147eacde7f06fe7d836fa45cdd8e70fbf88 100644 +index 757aa2e3fa1c4608f07adbff0f718ad8f04be475..643a3b83b7b7e173372e8ffa1607ea8bbf67f50f 100644 --- a/src/main/java/net/minecraft/world/entity/monster/EnderMan.java +++ b/src/main/java/net/minecraft/world/entity/monster/EnderMan.java -@@ -532,7 +532,15 @@ public class EnderMan extends Monster implements NeutralMob { +@@ -538,7 +538,15 @@ public class EnderMan extends Monster implements NeutralMob { @Override public boolean canUse() { if (!enderman.level.purpurConfig.endermanAllowGriefing) return false; // Purpur @@ -177,7 +177,7 @@ index 565ac4434fdf61bfde7636af9a10ba9a072b8160..e0680147eacde7f06fe7d836fa45cdd8 } @Override -@@ -580,7 +588,15 @@ public class EnderMan extends Monster implements NeutralMob { +@@ -586,7 +594,15 @@ public class EnderMan extends Monster implements NeutralMob { @Override public boolean canUse() { if (!enderman.level.purpurConfig.endermanAllowGriefing) return false; // Purpur @@ -243,10 +243,10 @@ index 77204ec0e18807dd46cadb515b07a919b1bee16b..a676bb029fc4575028ce6833e608e316 BlockPos blockposition = BlockPos.containing(this.mob.getX(), this.mob.getY() + 0.5D, this.mob.getZ()).relative(this.selectedDirection); BlockState iblockdata = this.mob.level.getBlockState(blockposition); diff --git a/src/main/java/net/minecraft/world/entity/monster/piglin/Piglin.java b/src/main/java/net/minecraft/world/entity/monster/piglin/Piglin.java -index 9b7e38e7a73206663a06dd180b7ef746d2237f16..4f2332b3255912bede00d27f3d2348cf1314be9c 100644 +index c36b17a7f209ce5f2b366077a192c16fc389cbf7..5b93bd222895c493dbdbcfa134c91b5e4b315c47 100644 --- a/src/main/java/net/minecraft/world/entity/monster/piglin/Piglin.java +++ b/src/main/java/net/minecraft/world/entity/monster/piglin/Piglin.java -@@ -431,7 +431,7 @@ public class Piglin extends AbstractPiglin implements CrossbowAttackMob, Invento +@@ -432,7 +432,7 @@ public class Piglin extends AbstractPiglin implements CrossbowAttackMob, Invento @Override public boolean wantsToPickUp(ItemStack stack) { @@ -284,10 +284,10 @@ index 4daa368881e4fa59a9365d7b3810ae7dc1455fa3..a4041580061b2acd150836a1437df66e // CraftBukkit start - fire ExplosionPrimeEvent ExplosionPrimeEvent event = new ExplosionPrimeEvent((org.bukkit.entity.Explosive) this.getBukkitEntity()); diff --git a/src/main/java/net/minecraft/world/entity/projectile/Projectile.java b/src/main/java/net/minecraft/world/entity/projectile/Projectile.java -index 8b2a3a8482018b7db7de81bc295862f783e17ce5..f6abea3ed0c3838ad591d0d117da26398e608c5a 100644 +index e6f87e1e3c99195ed11c81162cb54e7f5750c4ba..220690cbd6552b06626f4edf5c71bed5cf1f12c4 100644 --- a/src/main/java/net/minecraft/world/entity/projectile/Projectile.java +++ b/src/main/java/net/minecraft/world/entity/projectile/Projectile.java -@@ -277,6 +277,6 @@ public abstract class Projectile extends Entity implements TraceableEntity { +@@ -307,6 +307,6 @@ public abstract class Projectile extends Entity implements TraceableEntity { public boolean mayInteract(Level world, BlockPos pos) { Entity entity = this.getOwner(); diff --git a/patches/server/0125-Config-to-allow-Note-Block-sounds-when-blocked.patch b/patches/server/0127-Config-to-allow-Note-Block-sounds-when-blocked.patch similarity index 97% rename from patches/server/0125-Config-to-allow-Note-Block-sounds-when-blocked.patch rename to patches/server/0127-Config-to-allow-Note-Block-sounds-when-blocked.patch index 59ecc0b99..fec04ec3e 100644 --- a/patches/server/0125-Config-to-allow-Note-Block-sounds-when-blocked.patch +++ b/patches/server/0127-Config-to-allow-Note-Block-sounds-when-blocked.patch @@ -22,7 +22,7 @@ index 42e8e2d9d673947ecbfb55e0f31fc22afe3223b6..0b5ce2db558e721807944d9d0f672a77 // org.bukkit.event.block.NotePlayEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callNotePlayEvent(world, pos, state.getValue(NoteBlock.INSTRUMENT), state.getValue(NoteBlock.NOTE)); // if (event.isCancelled()) { diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 553a3996e7d5eb350d070bd53162cde1e571b5de..9d7b84fb02b6673fbd547ec7fd46b0a9b57c7a19 100644 +index e83b296e24d561080b679193ebe7e32d9ad08688..622a6226ac1ed4e97dc667fdc30679a97d4f44b0 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -120,6 +120,7 @@ public class PurpurWorldConfig { diff --git a/patches/server/0126-Add-EntityTeleportHinderedEvent.patch b/patches/server/0128-Add-EntityTeleportHinderedEvent.patch similarity index 98% rename from patches/server/0126-Add-EntityTeleportHinderedEvent.patch rename to patches/server/0128-Add-EntityTeleportHinderedEvent.patch index efc2512b6..40c300ef3 100644 --- a/patches/server/0126-Add-EntityTeleportHinderedEvent.patch +++ b/patches/server/0128-Add-EntityTeleportHinderedEvent.patch @@ -89,7 +89,7 @@ index fa6938626c64ed17a2f56739d5801494ea6f3be1..df33bd0c97faa3c7eb4ab6cbe7286f6a } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -index 17ea58f45f4bc4eb8bbbeadd6f25a477061d1617..9cf61d67d5e8f364ab68b26044daf2432754f31b 100644 +index 254d91e2a06186d602f7edae7a46b0e4ee9be662..2aaebeb6dc44f5be176471816de29056ea4e1043 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java @@ -1341,6 +1341,10 @@ public class CraftPlayer extends CraftHumanEntity implements Player { @@ -104,7 +104,7 @@ index 17ea58f45f4bc4eb8bbbeadd6f25a477061d1617..9cf61d67d5e8f364ab68b26044daf243 } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 9d7b84fb02b6673fbd547ec7fd46b0a9b57c7a19..4a89a59996c154dbab5f3e3c541cf0c5ec8b7fe3 100644 +index 622a6226ac1ed4e97dc667fdc30679a97d4f44b0..444879c211a1298d59e6c38e769a5521241fa060 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -119,6 +119,7 @@ public class PurpurWorldConfig { diff --git a/patches/server/0127-Farmland-trampling-changes.patch b/patches/server/0129-Farmland-trampling-changes.patch similarity index 97% rename from patches/server/0127-Farmland-trampling-changes.patch rename to patches/server/0129-Farmland-trampling-changes.patch index de89e1824..ce5ce7063 100644 --- a/patches/server/0127-Farmland-trampling-changes.patch +++ b/patches/server/0129-Farmland-trampling-changes.patch @@ -37,7 +37,7 @@ index f66a556e93469204e19baa5bf2decbf974701a5d..eed062c9cf1103d7ac96695e3620d427 if (CraftEventFactory.callEntityChangeBlockEvent(entity, pos, Blocks.DIRT.defaultBlockState()).isCancelled()) { return; diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index f46bb02b960acfa596541b9b243aa277557ca4ef..76404c262c07c5644aa9830bb63f0fc34a9ebe29 100644 +index 444879c211a1298d59e6c38e769a5521241fa060..d4586962197af458eebeb56a27abc43797f21e02 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -463,10 +463,16 @@ public class PurpurWorldConfig { diff --git a/patches/server/0128-Movement-options-for-armor-stands.patch b/patches/server/0130-Movement-options-for-armor-stands.patch similarity index 94% rename from patches/server/0128-Movement-options-for-armor-stands.patch rename to patches/server/0130-Movement-options-for-armor-stands.patch index a52ba156d..864e5bafa 100644 --- a/patches/server/0128-Movement-options-for-armor-stands.patch +++ b/patches/server/0130-Movement-options-for-armor-stands.patch @@ -17,10 +17,10 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java -index ebd4007797bda63e276056bee1eb85b08bc40309..a466eb10690bc0fe204815d758cc69798ce94f13 100644 +index d3d920d647168c8c7445f526726736d454ccaffc..a1a7efb5cc2859c40ae99e13032b5da62974122b 100644 --- a/src/main/java/net/minecraft/world/entity/Entity.java +++ b/src/main/java/net/minecraft/world/entity/Entity.java -@@ -1711,7 +1711,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { +@@ -1745,7 +1745,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { return this.isInWater() || flag; } @@ -66,7 +66,7 @@ index 5b4523320de59167bd5864b2f17187590afb5ad6..88949e8ca7e4a5e74a8a365bb1aa6d46 + // Purpur end } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 076aeb4d30dcf968a6c84af9da091e72ec547c78..7836da33836986cec3f0aac1dee2ec01a9c568d4 100644 +index d4586962197af458eebeb56a27abc43797f21e02..98b72e5d2492391aaabb002521ab41e14ea12525 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -101,10 +101,16 @@ public class PurpurWorldConfig { diff --git a/patches/server/0129-Fix-stuck-in-portals.patch b/patches/server/0131-Fix-stuck-in-portals.patch similarity index 93% rename from patches/server/0129-Fix-stuck-in-portals.patch rename to patches/server/0131-Fix-stuck-in-portals.patch index b2a3c701b..8feb54536 100644 --- a/patches/server/0129-Fix-stuck-in-portals.patch +++ b/patches/server/0131-Fix-stuck-in-portals.patch @@ -17,10 +17,10 @@ index 7a9b5f6665e910f12bcc9d3ade8534a93aa09dd9..bc2c592a416c64619527bf5d1040f4a2 // CraftBukkit end this.setLevel(worldserver); diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java -index a952685ec8907fe4ad0fb9f12855679e0983d9ca..41887aef504f1c2cb5cd3d16afd7c557f8831fc2 100644 +index a1a7efb5cc2859c40ae99e13032b5da62974122b..ada853423c30e96257405b55d12afef60df9acfb 100644 --- a/src/main/java/net/minecraft/world/entity/Entity.java +++ b/src/main/java/net/minecraft/world/entity/Entity.java -@@ -2903,12 +2903,15 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { +@@ -2937,12 +2937,15 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { return Vec3.directionFromRotation(this.getRotationVector()); } @@ -37,7 +37,7 @@ index a952685ec8907fe4ad0fb9f12855679e0983d9ca..41887aef504f1c2cb5cd3d16afd7c557 this.isInsidePortal = true; diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 6ebc9259107efa55298f0f99cac8e07f79a8b83e..eab135372764fe2be0244cddadaa8891bba0fb45 100644 +index 98b72e5d2492391aaabb002521ab41e14ea12525..a329762e693829a7d80390163f6d8b960cc825d9 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -337,6 +337,7 @@ public class PurpurWorldConfig { diff --git a/patches/server/0130-Toggle-for-water-sensitive-mob-damage.patch b/patches/server/0132-Toggle-for-water-sensitive-mob-damage.patch similarity index 99% rename from patches/server/0130-Toggle-for-water-sensitive-mob-damage.patch rename to patches/server/0132-Toggle-for-water-sensitive-mob-damage.patch index 8e5b3ecbf..a28e8fc5f 100644 --- a/patches/server/0130-Toggle-for-water-sensitive-mob-damage.patch +++ b/patches/server/0132-Toggle-for-water-sensitive-mob-damage.patch @@ -21,7 +21,7 @@ index b0581379619a1ac510b1973512f70db0e961a1f3..7d5b34f69c3ceed3c350ae641eef87cc @Override diff --git a/src/main/java/net/minecraft/world/entity/ambient/Bat.java b/src/main/java/net/minecraft/world/entity/ambient/Bat.java -index da2b0dfd8a3c033488a1e5d928c40fd66ada5091..991e0eadbce4b949698c1ddde61080715f888805 100644 +index b1fb9035dc3a1e0d34e1e339f89d9eba073b0d1c..01a407d9bdf3c3bc5a85054529d696044be53377 100644 --- a/src/main/java/net/minecraft/world/entity/ambient/Bat.java +++ b/src/main/java/net/minecraft/world/entity/ambient/Bat.java @@ -105,6 +105,11 @@ public class Bat extends AmbientCreature { @@ -411,7 +411,7 @@ index 214d5d27f8c4f352839c1a45a083c329f41164bd..9b2422f9fb0d046ba2246167f9350ed6 @Override diff --git a/src/main/java/net/minecraft/world/entity/animal/axolotl/Axolotl.java b/src/main/java/net/minecraft/world/entity/animal/axolotl/Axolotl.java -index 1af75e173958c192b8f53b7e17e75d980cbbbcbc..5e705c84e5deeb3b3bdede80bf2acd9a252e3972 100644 +index 6fb82a4497dbc1ace86b8446f45ddecda18302bb..1a7eaa2477c611b08619e95a63ac9d83e8662122 100644 --- a/src/main/java/net/minecraft/world/entity/animal/axolotl/Axolotl.java +++ b/src/main/java/net/minecraft/world/entity/animal/axolotl/Axolotl.java @@ -123,6 +123,11 @@ public class Axolotl extends Animal implements LerpingModel, VariantHolder { @@ -33,7 +33,7 @@ index 60259730eef583c13a07f6ac2a41a2a8db96dd7a..05edeb6da8181aa7e2d01d64bc5fbb89 this.setOrderedToSit(true); this.level.broadcastEntityEvent(this, (byte) 7); diff --git a/src/main/java/net/minecraft/world/entity/animal/Parrot.java b/src/main/java/net/minecraft/world/entity/animal/Parrot.java -index 1638b0f23ef2247c6d1055529f47d71ef56b0f55..9228dc98360ff34e4cdd105be36ed249c5b67067 100644 +index b4d1411a7578768fbd57ff4e87e86c5527e45b1a..c4114ec129b1acacfae920d67423b8ef6836a8d6 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Parrot.java +++ b/src/main/java/net/minecraft/world/entity/animal/Parrot.java @@ -334,7 +334,7 @@ public class Parrot extends ShoulderRidingEntity implements VariantHolder diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java -index 7fb4000cde782c79e252d73b59b26e0039077de2..89ad0987084828037154d88d80788a8479f3732a 100644 +index 88ee27ba72be1180def7e0b48c74449189b7ea1e..fd382ff7ee45bfc6a9bfd83d960390f94299b295 100644 --- a/src/main/java/net/minecraft/world/entity/Entity.java +++ b/src/main/java/net/minecraft/world/entity/Entity.java -@@ -4713,5 +4713,20 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { +@@ -4799,5 +4799,20 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { public boolean canSaveToDisk() { return true; } @@ -31,10 +31,10 @@ index 7fb4000cde782c79e252d73b59b26e0039077de2..89ad0987084828037154d88d80788a84 // Purpur end } diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java -index 08f520fe9d793309e3b315f2dc25ed44e0d22af8..851d12caeedbe86f78056cf7b32b4f2ce9e5fc0c 100644 +index d07e2077756d322823ddb11ad1adc1ca610a8ad2..e3055bba8b8bed8044e9a8b2b5c83f02d3f2fbc2 100644 --- a/src/main/java/net/minecraft/world/entity/LivingEntity.java +++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java -@@ -262,6 +262,7 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -261,6 +261,7 @@ public abstract class LivingEntity extends Entity implements Attackable { 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 @@ -42,7 +42,7 @@ index 08f520fe9d793309e3b315f2dc25ed44e0d22af8..851d12caeedbe86f78056cf7b32b4f2c @Override public float getBukkitYaw() { -@@ -788,6 +789,7 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -787,6 +788,7 @@ public abstract class LivingEntity extends Entity implements Attackable { dataresult.resultOrPartial(logger::error).ifPresent((nbtbase) -> { nbt.put("Brain", nbtbase); }); @@ -50,7 +50,7 @@ index 08f520fe9d793309e3b315f2dc25ed44e0d22af8..851d12caeedbe86f78056cf7b32b4f2c } @Override -@@ -872,6 +874,11 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -871,6 +873,11 @@ public abstract class LivingEntity extends Entity implements Attackable { this.brain = this.makeBrain(new Dynamic(NbtOps.INSTANCE, nbt.get("Brain"))); } @@ -62,7 +62,7 @@ index 08f520fe9d793309e3b315f2dc25ed44e0d22af8..851d12caeedbe86f78056cf7b32b4f2c } // CraftBukkit start -@@ -3473,6 +3480,27 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -3495,6 +3502,27 @@ public abstract class LivingEntity extends Entity implements Attackable { this.hurt(this.damageSources().drown(), 1.0F); } @@ -91,10 +91,10 @@ index 08f520fe9d793309e3b315f2dc25ed44e0d22af8..851d12caeedbe86f78056cf7b32b4f2c public boolean isSensitiveToWater() { diff --git a/src/main/java/net/minecraft/world/entity/Mob.java b/src/main/java/net/minecraft/world/entity/Mob.java -index 4d5d667b4c4ea324c91f85d8e6baa886dcda5406..4ec17daac1b4dc1dc6a4dfe22d37ff87c6feb8fe 100644 +index 34eb04112fa47cbcd233f8a959036d988d73f1b4..bf5705551720d338ee0b790504727685b1f8f026 100644 --- a/src/main/java/net/minecraft/world/entity/Mob.java +++ b/src/main/java/net/minecraft/world/entity/Mob.java -@@ -1731,17 +1731,7 @@ public abstract class Mob extends LivingEntity implements Targeting { +@@ -1737,17 +1737,7 @@ public abstract class Mob extends LivingEntity implements Targeting { } public boolean isSunBurnTick() { @@ -190,7 +190,7 @@ index 8fad4a642e2d430ad4b195f77422ba6855be1d63..ea897da752c96c58d137af56544e9bf5 // Paper end diff --git a/src/main/java/net/minecraft/world/entity/monster/Husk.java b/src/main/java/net/minecraft/world/entity/monster/Husk.java -index f1b4e28f5f42c19d2dc0c6f8ccfb542620e2629b..de5bb8a7a0184d03223cbfe47b72c7fcc895ef7f 100644 +index 94175bf66886fbf2808d1587e229c74086482589..7d40c970990241d39b22196e9af6354ab2a2c66b 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Husk.java +++ b/src/main/java/net/minecraft/world/entity/monster/Husk.java @@ -20,6 +20,7 @@ public class Husk extends Zombie { @@ -211,7 +211,7 @@ index f1b4e28f5f42c19d2dc0c6f8ccfb542620e2629b..de5bb8a7a0184d03223cbfe47b72c7fc @Override diff --git a/src/main/java/net/minecraft/world/entity/monster/Phantom.java b/src/main/java/net/minecraft/world/entity/monster/Phantom.java -index a0bce86414db70d068544f74e551b9157646a162..9ffc6f0e687bbad8521a5cfd1964ad0dfba1c01d 100644 +index 7d8441d433a9c3e5456e7e96c503cdbbf53959c6..ac94212c2c844f3d426b16a7f3b4a44707389916 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Phantom.java +++ b/src/main/java/net/minecraft/world/entity/monster/Phantom.java @@ -60,6 +60,7 @@ public class Phantom extends FlyingMob implements Enemy { @@ -275,7 +275,7 @@ index a0bce86414db70d068544f74e551b9157646a162..9ffc6f0e687bbad8521a5cfd1964ad0d // Paper end private static enum AttackPhase { diff --git a/src/main/java/net/minecraft/world/entity/monster/Zombie.java b/src/main/java/net/minecraft/world/entity/monster/Zombie.java -index 390a31286e17173ec8f1e40b69b09bcdd6012f7d..f4b9d73f5ce95c7725dbffbafc29c837fe1f87e6 100644 +index 5cf17a81d8c2a784bbd406dc3725ebbbbdf4a045..114093185454a428e0ef9f0877ea4efd9532c2f8 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Zombie.java +++ b/src/main/java/net/minecraft/world/entity/monster/Zombie.java @@ -95,11 +95,12 @@ public class Zombie extends Monster { diff --git a/patches/server/0178-Config-MobEffect-by-world.patch b/patches/server/0180-Config-MobEffect-by-world.patch similarity index 98% rename from patches/server/0178-Config-MobEffect-by-world.patch rename to patches/server/0180-Config-MobEffect-by-world.patch index f8cce6c95..1a70fdadd 100644 --- a/patches/server/0178-Config-MobEffect-by-world.patch +++ b/patches/server/0180-Config-MobEffect-by-world.patch @@ -40,7 +40,7 @@ index 2cc714585fc3790b70a7ad1ab8034543462e2b3b..22d7f04cefafa0115a4504e373807877 ((ServerPlayer) entityhuman).connection.send(new ClientboundSetHealthPacket(((ServerPlayer) entityhuman).getBukkitEntity().getScaledHealth(), entityhuman.getFoodData().foodLevel, entityhuman.getFoodData().saturationLevel)); diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index cbcbd108222b560ac3a483e5ebcfbc7a4ae3c23f..d3835f73e52ae3204276bf8716404a66fccdb21d 100644 +index a334273dde8c301f88bf2ba35a895d96b470d55a..13e2d7c7e5528c26e83f0f9b6d61ad9f5b7d7ab3 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -333,6 +333,21 @@ public class PurpurWorldConfig { diff --git a/patches/server/0179-Beacon-Activation-Range-Configurable.patch b/patches/server/0181-Beacon-Activation-Range-Configurable.patch similarity index 96% rename from patches/server/0179-Beacon-Activation-Range-Configurable.patch rename to patches/server/0181-Beacon-Activation-Range-Configurable.patch index 308979978..fd13d0248 100644 --- a/patches/server/0179-Beacon-Activation-Range-Configurable.patch +++ b/patches/server/0181-Beacon-Activation-Range-Configurable.patch @@ -26,7 +26,7 @@ index ef740d1ad6352ca4af299001a081b720bc472d2e..c787019b5cbadec81dd33ef4021708b9 } else { return effectRange; diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index d3835f73e52ae3204276bf8716404a66fccdb21d..757bd64bbdf4ac2abadef4edd0dd0ef0bbe20e08 100644 +index 13e2d7c7e5528c26e83f0f9b6d61ad9f5b7d7ab3..75640d2a794319d9900725dc50f05629c5f73c23 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -525,6 +525,17 @@ public class PurpurWorldConfig { diff --git a/patches/server/0180-Add-toggle-for-sand-duping-fix.patch b/patches/server/0182-Add-toggle-for-sand-duping-fix.patch similarity index 95% rename from patches/server/0180-Add-toggle-for-sand-duping-fix.patch rename to patches/server/0182-Add-toggle-for-sand-duping-fix.patch index a37283dcc..7a9c8174f 100644 --- a/patches/server/0180-Add-toggle-for-sand-duping-fix.patch +++ b/patches/server/0182-Add-toggle-for-sand-duping-fix.patch @@ -27,7 +27,7 @@ index ce2c3c146ef64400e00084bd2245d2b87a67fbc2..b0dd274fde1ce23a984de9492d7605ff } // Paper end - fix sand duping diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 757bd64bbdf4ac2abadef4edd0dd0ef0bbe20e08..532e7e8fabf89c45707cc5c256f81fd0d4081b1f 100644 +index 75640d2a794319d9900725dc50f05629c5f73c23..14fed3d54bce458cfc36c77f8d77648532f86f90 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -704,6 +704,11 @@ public class PurpurWorldConfig { diff --git a/patches/server/0181-Add-toggle-for-end-portal-safe-teleporting.patch b/patches/server/0183-Add-toggle-for-end-portal-safe-teleporting.patch similarity index 92% rename from patches/server/0181-Add-toggle-for-end-portal-safe-teleporting.patch rename to patches/server/0183-Add-toggle-for-end-portal-safe-teleporting.patch index 71e68f891..bc3a5aaad 100644 --- a/patches/server/0181-Add-toggle-for-end-portal-safe-teleporting.patch +++ b/patches/server/0183-Add-toggle-for-end-portal-safe-teleporting.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Add toggle for end portal safe teleporting diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java -index 89ad0987084828037154d88d80788a8479f3732a..6f876403388f95a5b52f00985df2cde2f4d991f8 100644 +index fd382ff7ee45bfc6a9bfd83d960390f94299b295..05e23fd43cca166f8a058debd9dc3fd1e1c2a595 100644 --- a/src/main/java/net/minecraft/world/entity/Entity.java +++ b/src/main/java/net/minecraft/world/entity/Entity.java -@@ -2962,7 +2962,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { +@@ -2996,7 +2996,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { } this.processPortalCooldown(); @@ -45,7 +45,7 @@ index f80f6da484f4144e743079e5104bf503419074b2..2deddc746e43896584bd65ba8e7971a8 entity.portalWorld = ((ServerLevel)world); entity.portalBlock = pos.immutable(); diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 532e7e8fabf89c45707cc5c256f81fd0d4081b1f..cfefd0aab5032133c8512f94280457a4673d7f4f 100644 +index 14fed3d54bce458cfc36c77f8d77648532f86f90..2e3827a40a2cba69a2fd7c099941be8f23637b6b 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -652,6 +652,11 @@ public class PurpurWorldConfig { diff --git a/patches/server/0182-Make-lightning-rod-range-configurable.patch b/patches/server/0184-Make-lightning-rod-range-configurable.patch similarity index 93% rename from patches/server/0182-Make-lightning-rod-range-configurable.patch rename to patches/server/0184-Make-lightning-rod-range-configurable.patch index 5a9ae109f..b80ac5e1e 100644 --- a/patches/server/0182-Make-lightning-rod-range-configurable.patch +++ b/patches/server/0184-Make-lightning-rod-range-configurable.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Make lightning rod range configurable diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java -index 53f1e0b0f982054c9056f0fe27931bb7b75c4218..e303a846fce88b442077b37dceed084f4b004999 100644 +index ab71f7e0ab1275f01c916e62e5bf50fb7b660b14..cb8870189396b30fcd89b64f909e60f0674fda2c 100644 --- a/src/main/java/net/minecraft/server/level/ServerLevel.java +++ b/src/main/java/net/minecraft/server/level/ServerLevel.java -@@ -978,7 +978,7 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -994,7 +994,7 @@ public class ServerLevel extends Level implements WorldGenLevel { return holder.is(PoiTypes.LIGHTNING_ROD); }, (blockposition1) -> { return blockposition1.getY() == this.getHeight(Heightmap.Types.WORLD_SURFACE, blockposition1.getX(), blockposition1.getZ()) - 1; diff --git a/patches/server/0183-Burp-delay-burp-after-eating-food-fills-hunger-bar-c.patch b/patches/server/0185-Burp-delay-burp-after-eating-food-fills-hunger-bar-c.patch similarity index 97% rename from patches/server/0183-Burp-delay-burp-after-eating-food-fills-hunger-bar-c.patch rename to patches/server/0185-Burp-delay-burp-after-eating-food-fills-hunger-bar-c.patch index 396c86f38..e09cf524f 100644 --- a/patches/server/0183-Burp-delay-burp-after-eating-food-fills-hunger-bar-c.patch +++ b/patches/server/0185-Burp-delay-burp-after-eating-food-fills-hunger-bar-c.patch @@ -56,7 +56,7 @@ index 4a2dcf9bd83dd3fdff43483f887f4f58dc4715cd..87f9e03fb5e095396e054a84be60ec45 public void eat(Item item, ItemStack stack) { diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index cfefd0aab5032133c8512f94280457a4673d7f4f..c24cadbdb14e7b16f342b4d22fa0730d42e9c7d1 100644 +index 2e3827a40a2cba69a2fd7c099941be8f23637b6b..08befb60564bb8e06f576b2762dac11ecf09d720 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -392,6 +392,8 @@ public class PurpurWorldConfig { diff --git a/patches/server/0184-Allow-player-join-full-server-by-permission.patch b/patches/server/0186-Allow-player-join-full-server-by-permission.patch similarity index 100% rename from patches/server/0184-Allow-player-join-full-server-by-permission.patch rename to patches/server/0186-Allow-player-join-full-server-by-permission.patch diff --git a/patches/server/0185-Add-permission-bypass-for-portal-waiting.patch b/patches/server/0187-Add-permission-bypass-for-portal-waiting.patch similarity index 95% rename from patches/server/0185-Add-permission-bypass-for-portal-waiting.patch rename to patches/server/0187-Add-permission-bypass-for-portal-waiting.patch index 7a52e9667..dc59801a2 100644 --- a/patches/server/0185-Add-permission-bypass-for-portal-waiting.patch +++ b/patches/server/0187-Add-permission-bypass-for-portal-waiting.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Add permission bypass for portal waiting diff --git a/src/main/java/net/minecraft/world/entity/player/Player.java b/src/main/java/net/minecraft/world/entity/player/Player.java -index ba0684615a20218cf1727ac02b6326589f80cb96..456460e867626ffe4a895d4d78a6afd6526ef695 100644 +index 53769c1781a3ea5e3c0330684d6b998adbe15a4e..af882016364257f01a154b99783e96f5e932364f 100644 --- a/src/main/java/net/minecraft/world/entity/player/Player.java +++ b/src/main/java/net/minecraft/world/entity/player/Player.java @@ -187,6 +187,7 @@ public abstract class Player extends LivingEntity { diff --git a/patches/server/0186-Shulker-spawn-from-bullet-options.patch b/patches/server/0188-Shulker-spawn-from-bullet-options.patch similarity index 100% rename from patches/server/0186-Shulker-spawn-from-bullet-options.patch rename to patches/server/0188-Shulker-spawn-from-bullet-options.patch diff --git a/patches/server/0187-Eating-glow-berries-adds-glow-effect.patch b/patches/server/0189-Eating-glow-berries-adds-glow-effect.patch similarity index 97% rename from patches/server/0187-Eating-glow-berries-adds-glow-effect.patch rename to patches/server/0189-Eating-glow-berries-adds-glow-effect.patch index 72004443b..59bd6be67 100644 --- a/patches/server/0187-Eating-glow-berries-adds-glow-effect.patch +++ b/patches/server/0189-Eating-glow-berries-adds-glow-effect.patch @@ -18,7 +18,7 @@ index 42e6aeea8d2e076aea7fa2c1ccf5edcc5efba46f..1f2e467272dddf3e91b7ab7037a0367b public static final Item SOUL_CAMPFIRE = registerBlock(Blocks.SOUL_CAMPFIRE); public static final Item SHROOMLIGHT = registerBlock(Blocks.SHROOMLIGHT); diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 9060abce4148ea3b9a4878463d94135f3aa000a6..5aa344d013bc4d5b7c83a3c6c32cbcbe140985bd 100644 +index cf0bc79ffdf63b16c495896c5d5204d752c8e19e..96fe670ad1759e10e07e2ebe12af349259396f2e 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -222,6 +222,7 @@ public class PurpurWorldConfig { diff --git a/patches/server/0188-Option-to-make-drowned-break-doors.patch b/patches/server/0190-Option-to-make-drowned-break-doors.patch similarity index 100% rename from patches/server/0188-Option-to-make-drowned-break-doors.patch rename to patches/server/0190-Option-to-make-drowned-break-doors.patch diff --git a/patches/server/0189-Configurable-hunger-starvation-damage.patch b/patches/server/0191-Configurable-hunger-starvation-damage.patch similarity index 100% rename from patches/server/0189-Configurable-hunger-starvation-damage.patch rename to patches/server/0191-Configurable-hunger-starvation-damage.patch diff --git a/patches/server/0190-Enhance-SysoutCatcher.patch b/patches/server/0192-Enhance-SysoutCatcher.patch similarity index 100% rename from patches/server/0190-Enhance-SysoutCatcher.patch rename to patches/server/0192-Enhance-SysoutCatcher.patch diff --git a/patches/server/0191-Add-uptime-command.patch b/patches/server/0193-Add-uptime-command.patch similarity index 98% rename from patches/server/0191-Add-uptime-command.patch rename to patches/server/0193-Add-uptime-command.patch index 3a7860721..57fa962f5 100644 --- a/patches/server/0191-Add-uptime-command.patch +++ b/patches/server/0193-Add-uptime-command.patch @@ -17,7 +17,7 @@ index 144e83bac0d8885c48d97d7fbb4b712d4c0fc4b3..23e19bfbc41c5982a746ad0b5ba8c583 } diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java -index 9a6a2208e75ab2e35fd7b807b3a9fa04e28bcd58..fbfda36df01795cb64bd61263d3263067912518e 100644 +index b2c661f4194a25497e385f587c9da088d7c36965..3719a6e1228840977e2dcf939629655c8ea6216f 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java @@ -295,6 +295,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop 0.0F) { this.playSound(this.getFallDamageSound((int) f3), 1.0F, 1.0F); @@ -17,7 +17,7 @@ index 501b801fc474009bd6f1b43781804edad8eda921..0da0fe3bba883633422a516bf3245277 } } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 4450897735088ca7b126556ebb7ee785241e850b..8725552721e2171a4f00339eb05bd347bab1818f 100644 +index e6696e1f5d4a38a6972102f1ff2b8b3f8b66d732..ae3dfebfc8c5e0ae0669cda3479103a1d2046b1e 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -184,12 +184,14 @@ public class PurpurWorldConfig { diff --git a/patches/server/0203-Add-Option-for-disable-observer-clocks.patch b/patches/server/0205-Add-Option-for-disable-observer-clocks.patch similarity index 95% rename from patches/server/0203-Add-Option-for-disable-observer-clocks.patch rename to patches/server/0205-Add-Option-for-disable-observer-clocks.patch index af05cb6a3..740af7125 100644 --- a/patches/server/0203-Add-Option-for-disable-observer-clocks.patch +++ b/patches/server/0205-Add-Option-for-disable-observer-clocks.patch @@ -18,7 +18,7 @@ index 7b45d6b9a005036ca5051d089a7be792eb87012f..8806c97ecc6bdd8a64c2d82bb2f58f46 } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 9f8257758ea9766f1cae5c8f8753efc79f18e1e9..e16210dc87535705091b9aa9edb4a59fef06cbfd 100644 +index ae3dfebfc8c5e0ae0669cda3479103a1d2046b1e..2f69f6080951acfd41e31b70fdd269d8cead2bf0 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -371,6 +371,11 @@ public class PurpurWorldConfig { diff --git a/patches/server/0204-Customizeable-Zombie-Villager-curing-times.patch b/patches/server/0206-Customizeable-Zombie-Villager-curing-times.patch similarity index 100% rename from patches/server/0204-Customizeable-Zombie-Villager-curing-times.patch rename to patches/server/0206-Customizeable-Zombie-Villager-curing-times.patch diff --git a/patches/server/0205-Option-for-sponges-to-work-on-lava.patch b/patches/server/0207-Option-for-sponges-to-work-on-lava.patch similarity index 95% rename from patches/server/0205-Option-for-sponges-to-work-on-lava.patch rename to patches/server/0207-Option-for-sponges-to-work-on-lava.patch index 67621f484..0230d1624 100644 --- a/patches/server/0205-Option-for-sponges-to-work-on-lava.patch +++ b/patches/server/0207-Option-for-sponges-to-work-on-lava.patch @@ -18,7 +18,7 @@ index d96e3fbc0fd4275c29e7e6154ef66e9ed1a5d829..df04a571ebd3c04bc7b58c1ee5661a1f ++i; if (j < world.purpurConfig.spongeAbsorptionRadius) { // Purpur diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index e503b9018183fa6491529d1c5fe630906fb61a50..24232ea98d8ba1983b363689397ce4cef2826557 100644 +index 3e6c97169688d462b00a1437449473b5aef59623..d413cb0e6a5806a70ca697f8e842b8b0285e479b 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -929,9 +929,11 @@ public class PurpurWorldConfig { diff --git a/patches/server/0206-Toggle-for-Wither-s-spawn-sound.patch b/patches/server/0208-Toggle-for-Wither-s-spawn-sound.patch similarity index 100% rename from patches/server/0206-Toggle-for-Wither-s-spawn-sound.patch rename to patches/server/0208-Toggle-for-Wither-s-spawn-sound.patch diff --git a/patches/server/0207-Cactus-breaks-from-solid-neighbors-config.patch b/patches/server/0209-Cactus-breaks-from-solid-neighbors-config.patch similarity index 95% rename from patches/server/0207-Cactus-breaks-from-solid-neighbors-config.patch rename to patches/server/0209-Cactus-breaks-from-solid-neighbors-config.patch index 268369a27..c5c02c51d 100644 --- a/patches/server/0207-Cactus-breaks-from-solid-neighbors-config.patch +++ b/patches/server/0209-Cactus-breaks-from-solid-neighbors-config.patch @@ -18,7 +18,7 @@ index 7579946ce222b6ab3685a7fd9821bcd5a4babe33..2fffe4452d8f3fa5b9365dff1cfe5b5d return false; } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 9d16759f8e736e3981a448ab3a7d784636bc05f3..558ce467d5b39d763abc7377053f1432b5d4d3e3 100644 +index e719863a96e888dc67cbb6ffeb40c53e9db2fec8..009d34916d454bed127c37e238af4183e09b69da 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -750,6 +750,11 @@ public class PurpurWorldConfig { diff --git a/patches/server/0208-Config-to-remove-curse-of-binding-with-weakness.patch b/patches/server/0210-Config-to-remove-curse-of-binding-with-weakness.patch similarity index 96% rename from patches/server/0208-Config-to-remove-curse-of-binding-with-weakness.patch rename to patches/server/0210-Config-to-remove-curse-of-binding-with-weakness.patch index e534dcd1c..d18118862 100644 --- a/patches/server/0208-Config-to-remove-curse-of-binding-with-weakness.patch +++ b/patches/server/0210-Config-to-remove-curse-of-binding-with-weakness.patch @@ -26,7 +26,7 @@ index da0f5c5e6ca7ce7b38792e6da52c5cdcdbae3b78..4136bcd49fe05d916ab65de0e8661451 @Override diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 558ce467d5b39d763abc7377053f1432b5d4d3e3..6146547d1d980ccf78e7265e51b1c34718834773 100644 +index 009d34916d454bed127c37e238af4183e09b69da..22eb44e4b9f5ee5485de35ab28766bcc5546c264 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -408,6 +408,7 @@ public class PurpurWorldConfig { diff --git a/patches/server/0209-Conduit-behavior-configuration.patch b/patches/server/0211-Conduit-behavior-configuration.patch similarity index 100% rename from patches/server/0209-Conduit-behavior-configuration.patch rename to patches/server/0211-Conduit-behavior-configuration.patch diff --git a/patches/server/0210-Cauldron-fill-chances.patch b/patches/server/0212-Cauldron-fill-chances.patch similarity index 100% rename from patches/server/0210-Cauldron-fill-chances.patch rename to patches/server/0212-Cauldron-fill-chances.patch diff --git a/patches/server/0211-Config-to-allow-mobs-to-pathfind-over-rails.patch b/patches/server/0213-Config-to-allow-mobs-to-pathfind-over-rails.patch similarity index 97% rename from patches/server/0211-Config-to-allow-mobs-to-pathfind-over-rails.patch rename to patches/server/0213-Config-to-allow-mobs-to-pathfind-over-rails.patch index 11c71a21e..545d2c7a9 100644 --- a/patches/server/0211-Config-to-allow-mobs-to-pathfind-over-rails.patch +++ b/patches/server/0213-Config-to-allow-mobs-to-pathfind-over-rails.patch @@ -18,7 +18,7 @@ index 94a0fde36dda9404e5eb62d323c71dac1929a46b..17a7fab20b4174273354fdc2fc700b7f if (node != null && (node.type == BlockPathTypes.OPEN || node.type == BlockPathTypes.WALKABLE) && this.mob.getBbWidth() < 1.0F) { double g = (double)(x - direction.getStepX()) + 0.5D; diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 912b53d574e3dc329f3727706ffe9c8b6a98b3b6..79d12e8b16f72badca9cca05bc70423de2fd1e58 100644 +index f7851eb0d2e328b8c31f7fe71e974812a53d163f..a8fe10ba0f275b57d587fb99bf6a5120e52bd7d4 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -140,6 +140,7 @@ public class PurpurWorldConfig { diff --git a/patches/server/0212-Shulker-change-color-with-dye.patch b/patches/server/0214-Shulker-change-color-with-dye.patch similarity index 100% rename from patches/server/0212-Shulker-change-color-with-dye.patch rename to patches/server/0214-Shulker-change-color-with-dye.patch diff --git a/patches/server/0213-Extended-OfflinePlayer-API.patch b/patches/server/0215-Extended-OfflinePlayer-API.patch similarity index 99% rename from patches/server/0213-Extended-OfflinePlayer-API.patch rename to patches/server/0215-Extended-OfflinePlayer-API.patch index 6d88bda4e..42477a666 100644 --- a/patches/server/0213-Extended-OfflinePlayer-API.patch +++ b/patches/server/0215-Extended-OfflinePlayer-API.patch @@ -223,7 +223,7 @@ index 714afc98b5150907b45a00060be4e41582333204..312a6d90c0a09570aef24c205dc2ff27 + // Purpur end - OfflinePlayer API } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -index 9cf61d67d5e8f364ab68b26044daf2432754f31b..a92f80fab1de7b20e46d2f2fd4ba4fb2d5581746 100644 +index 2aaebeb6dc44f5be176471816de29056ea4e1043..9e8bdd260cec5bb02a87bd946301fc29afa15279 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java @@ -2365,6 +2365,28 @@ public class CraftPlayer extends CraftHumanEntity implements Player { diff --git a/patches/server/0214-Added-the-ability-to-add-combustible-items.patch b/patches/server/0216-Added-the-ability-to-add-combustible-items.patch similarity index 96% rename from patches/server/0214-Added-the-ability-to-add-combustible-items.patch rename to patches/server/0216-Added-the-ability-to-add-combustible-items.patch index fe893c219..16f06de6f 100644 --- a/patches/server/0214-Added-the-ability-to-add-combustible-items.patch +++ b/patches/server/0216-Added-the-ability-to-add-combustible-items.patch @@ -51,10 +51,10 @@ index ffc05b20105227799904b66a7d208ccef04cb876..507b3756238ec3054232b805a9b689be private int maxStack = MAX_STACK; public List transaction = new java.util.ArrayList(); diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -index f47bfd9826fb4a7bbbd4d1311ebf6dec391b6e5f..674d16d8c40d88d6c387c0bb233f32eba56b50e7 100644 +index 6f4cb22b477042cb895572596797556e0f21a100..86e40bf7cf90c33f914c38f2edb3bd8c5bb00f1c 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -@@ -1430,6 +1430,19 @@ public final class CraftServer implements Server { +@@ -1435,6 +1435,19 @@ public final class CraftServer implements Server { return true; } diff --git a/patches/server/0215-Option-for-if-rain-and-thunder-should-stop-on-sleep.patch b/patches/server/0217-Option-for-if-rain-and-thunder-should-stop-on-sleep.patch similarity index 90% rename from patches/server/0215-Option-for-if-rain-and-thunder-should-stop-on-sleep.patch rename to patches/server/0217-Option-for-if-rain-and-thunder-should-stop-on-sleep.patch index 0f02b9a8f..a6f35811c 100644 --- a/patches/server/0215-Option-for-if-rain-and-thunder-should-stop-on-sleep.patch +++ b/patches/server/0217-Option-for-if-rain-and-thunder-should-stop-on-sleep.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Option for if rain and thunder should stop on sleep diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java -index da8549ce25ce06d100baa4c36149ea5797841914..59d07b07ea81e5462ff7e57c6bc9e6f8d7213b79 100644 +index 346a006b2dd10b1e4fb29662661abfeffd07013f..34761f14354ce29db48859ebb142740ea6b53ff9 100644 --- a/src/main/java/net/minecraft/server/level/ServerLevel.java +++ b/src/main/java/net/minecraft/server/level/ServerLevel.java -@@ -1186,6 +1186,7 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -1202,6 +1202,7 @@ public class ServerLevel extends Level implements WorldGenLevel { private void resetWeatherCycle() { // CraftBukkit start @@ -16,7 +16,7 @@ index da8549ce25ce06d100baa4c36149ea5797841914..59d07b07ea81e5462ff7e57c6bc9e6f8 this.serverLevelData.setRaining(false, org.bukkit.event.weather.WeatherChangeEvent.Cause.SLEEP); // Paper - when passing the night // 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.... -@@ -1193,6 +1194,7 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -1209,6 +1210,7 @@ public class ServerLevel extends Level implements WorldGenLevel { this.serverLevelData.setRainTime(0); } // CraftBukkit end @@ -25,7 +25,7 @@ index da8549ce25ce06d100baa4c36149ea5797841914..59d07b07ea81e5462ff7e57c6bc9e6f8 // CraftBukkit start // If we stop due to everyone sleeping we should reset the weather duration to some other random value. diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 8418214dce4920bb42e0042dc4d11cb4764c2f78..a0adc2d1bec20b8feb170dab5cc40c306ef453e9 100644 +index dd79e857ec11812a58dbf79cf746d88f39f51a64..e7b884b465dbe47550134277f528fb23601f70bc 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -141,6 +141,8 @@ public class PurpurWorldConfig { diff --git a/patches/server/0216-Chance-for-azalea-blocks-to-grow-into-trees-naturall.patch b/patches/server/0218-Chance-for-azalea-blocks-to-grow-into-trees-naturall.patch similarity index 98% rename from patches/server/0216-Chance-for-azalea-blocks-to-grow-into-trees-naturall.patch rename to patches/server/0218-Chance-for-azalea-blocks-to-grow-into-trees-naturall.patch index c14b6ea98..db1c9ca10 100644 --- a/patches/server/0216-Chance-for-azalea-blocks-to-grow-into-trees-naturall.patch +++ b/patches/server/0218-Chance-for-azalea-blocks-to-grow-into-trees-naturall.patch @@ -45,7 +45,7 @@ index 8584a65433555133cdcfc24a078fb0b53b9f83bc..4afc4670f9b00a4087410ec366fe45fe public static final Block PINK_PETALS = register("pink_petals", new PinkPetalsBlock(BlockBehaviour.Properties.of(Material.PLANT).noCollission().sound(SoundType.PINK_PETALS).requiredFeatures(FeatureFlags.UPDATE_1_20))); public static final Block MOSS_BLOCK = register("moss_block", new MossBlock(BlockBehaviour.Properties.of(Material.MOSS, MaterialColor.COLOR_GREEN).strength(0.1F).sound(SoundType.MOSS))); diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index a9fedadbfad4fc18a553ae4c31508b7295471840..5a3101216f34ec82d2b49596f1c01a5a1508954d 100644 +index e7b884b465dbe47550134277f528fb23601f70bc..85f40c9255fe6ceb75b526b128ec7772d1fe4928 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -705,6 +705,11 @@ public class PurpurWorldConfig { diff --git a/patches/server/0217-Shift-right-click-to-use-exp-for-mending.patch b/patches/server/0219-Shift-right-click-to-use-exp-for-mending.patch similarity index 94% rename from patches/server/0217-Shift-right-click-to-use-exp-for-mending.patch rename to patches/server/0219-Shift-right-click-to-use-exp-for-mending.patch index 638d8de19..55c845758 100644 --- a/patches/server/0217-Shift-right-click-to-use-exp-for-mending.patch +++ b/patches/server/0219-Shift-right-click-to-use-exp-for-mending.patch @@ -36,10 +36,10 @@ index 49335b4fc2a9caab1418531a814210bf52b3cc43..ebf1ac089202c06fd2cc593dc12c21fe + // Purpur end } diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -index 2bfa3ee8fba634c33545b68dbd5d49fa1984ed55..47ff0f978bac2552a04c946ac0bf59ddf6338f7d 100644 +index a004ee039ed9129ffbcbba3d591e16de70c7eff1..672fb9b917f994e9778a833ce722d6b5b3900e5a 100644 --- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java +++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -@@ -2076,6 +2076,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic +@@ -2077,6 +2077,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic boolean cancelled; if (movingobjectposition == null || movingobjectposition.getType() != HitResult.Type.BLOCK) { @@ -48,7 +48,7 @@ index 2bfa3ee8fba634c33545b68dbd5d49fa1984ed55..47ff0f978bac2552a04c946ac0bf59dd cancelled = event.useItemInHand() == Event.Result.DENY; } else { diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 5a3101216f34ec82d2b49596f1c01a5a1508954d..a61b258279e5c44eac353c4e991a7eb5fe238e53 100644 +index 85f40c9255fe6ceb75b526b128ec7772d1fe4928..4e136afc1d1eb052a0c87cde7bb81a50824b3e63 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -415,6 +415,7 @@ public class PurpurWorldConfig { diff --git a/patches/server/0218-Dolphins-naturally-aggressive-to-players-chance.patch b/patches/server/0220-Dolphins-naturally-aggressive-to-players-chance.patch similarity index 100% rename from patches/server/0218-Dolphins-naturally-aggressive-to-players-chance.patch rename to patches/server/0220-Dolphins-naturally-aggressive-to-players-chance.patch diff --git a/patches/server/0219-Cows-naturally-aggressive-to-players-chance.patch b/patches/server/0221-Cows-naturally-aggressive-to-players-chance.patch similarity index 100% rename from patches/server/0219-Cows-naturally-aggressive-to-players-chance.patch rename to patches/server/0221-Cows-naturally-aggressive-to-players-chance.patch diff --git a/patches/server/0220-Option-for-beds-to-explode-on-villager-sleep.patch b/patches/server/0222-Option-for-beds-to-explode-on-villager-sleep.patch similarity index 90% rename from patches/server/0220-Option-for-beds-to-explode-on-villager-sleep.patch rename to patches/server/0222-Option-for-beds-to-explode-on-villager-sleep.patch index e600d76ad..fd672ab48 100644 --- a/patches/server/0220-Option-for-beds-to-explode-on-villager-sleep.patch +++ b/patches/server/0222-Option-for-beds-to-explode-on-villager-sleep.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Option for beds to explode on villager sleep diff --git a/src/main/java/net/minecraft/world/entity/npc/Villager.java b/src/main/java/net/minecraft/world/entity/npc/Villager.java -index 1649070edaf0812dd480429cd6d07af84def8311..4f114d7cf5e6429e74bcf3653568beb1a944b6ae 100644 +index 401d0885852edbb30b12cfb58c86479d722143ff..2e759f0b3766377c65608deb3d1859c7924159f5 100644 --- a/src/main/java/net/minecraft/world/entity/npc/Villager.java +++ b/src/main/java/net/minecraft/world/entity/npc/Villager.java -@@ -1098,6 +1098,12 @@ public class Villager extends AbstractVillager implements ReputationEventHandler +@@ -1103,6 +1103,12 @@ public class Villager extends AbstractVillager implements ReputationEventHandler @Override public void startSleeping(BlockPos pos) { @@ -22,7 +22,7 @@ index 1649070edaf0812dd480429cd6d07af84def8311..4f114d7cf5e6429e74bcf3653568beb1 this.brain.setMemory(MemoryModuleType.LAST_SLEPT, this.level.getGameTime()); // CraftBukkit - decompile error this.brain.eraseMemory(MemoryModuleType.WALK_TARGET); diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 068d204154cf18397fad3a3240a88e76e9a703cc..c36db31a08bf32bf299a98556ef1b603904c0e5d 100644 +index 2a333fa507ef6d1076ce85b47e0eded7b06c4c12..c8e15efc4acc34d77a338467f91032cd3a843cd5 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -724,6 +724,7 @@ public class PurpurWorldConfig { diff --git a/patches/server/0221-Halloween-options-and-optimizations.patch b/patches/server/0223-Halloween-options-and-optimizations.patch similarity index 92% rename from patches/server/0221-Halloween-options-and-optimizations.patch rename to patches/server/0223-Halloween-options-and-optimizations.patch index d840ef6ae..18304977c 100644 --- a/patches/server/0221-Halloween-options-and-optimizations.patch +++ b/patches/server/0223-Halloween-options-and-optimizations.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Halloween options and optimizations diff --git a/src/main/java/net/minecraft/world/entity/ambient/Bat.java b/src/main/java/net/minecraft/world/entity/ambient/Bat.java -index 991e0eadbce4b949698c1ddde61080715f888805..987ac3cb9ea726ed084d02ad738d3f1a60b2561b 100644 +index 01a407d9bdf3c3bc5a85054529d696044be53377..fe6fba48082d3cf54d4350f836a03cac83e1a45c 100644 --- a/src/main/java/net/minecraft/world/entity/ambient/Bat.java +++ b/src/main/java/net/minecraft/world/entity/ambient/Bat.java @@ -314,7 +314,7 @@ public class Bat extends AmbientCreature { @@ -17,14 +17,14 @@ index 991e0eadbce4b949698c1ddde61080715f888805..987ac3cb9ea726ed084d02ad738d3f1a b0 = 7; } else if (random.nextBoolean()) { return false; -@@ -324,6 +324,7 @@ public class Bat extends AmbientCreature { - } - } - +@@ -328,6 +328,7 @@ public class Bat extends AmbientCreature { + private static boolean isSpookySeason = false; + private static final int ONE_HOUR = 20 * 60 * 60; + private static int lastSpookyCheck = -ONE_HOUR; + public static boolean isHalloweenSeason(Level level) { return level.purpurConfig.forceHalloweenSeason || isHalloween(); } // Purpur private static boolean isHalloween() { + if (net.minecraft.server.MinecraftServer.currentTick - lastSpookyCheck > ONE_HOUR) { LocalDate localdate = LocalDate.now(); - int i = localdate.get(ChronoField.DAY_OF_MONTH); diff --git a/src/main/java/net/minecraft/world/entity/monster/AbstractSkeleton.java b/src/main/java/net/minecraft/world/entity/monster/AbstractSkeleton.java index ea897da752c96c58d137af56544e9bf50135c6ec..32a303f9ac9768daf621e3aa561cd6b31e5f5dff 100644 --- a/src/main/java/net/minecraft/world/entity/monster/AbstractSkeleton.java diff --git a/patches/server/0222-Config-for-grindstones.patch b/patches/server/0224-Config-for-grindstones.patch similarity index 100% rename from patches/server/0222-Config-for-grindstones.patch rename to patches/server/0224-Config-for-grindstones.patch diff --git a/patches/server/0223-UPnP-Port-Forwarding.patch b/patches/server/0225-UPnP-Port-Forwarding.patch similarity index 92% rename from patches/server/0223-UPnP-Port-Forwarding.patch rename to patches/server/0225-UPnP-Port-Forwarding.patch index dcafa3b5c..dc8fd6ead 100644 --- a/patches/server/0223-UPnP-Port-Forwarding.patch +++ b/patches/server/0225-UPnP-Port-Forwarding.patch @@ -5,7 +5,7 @@ Subject: [PATCH] UPnP Port Forwarding diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java -index fbfda36df01795cb64bd61263d3263067912518e..80e9d8614fd0acab384a1d715076f8bac85c8c9b 100644 +index 3719a6e1228840977e2dcf939629655c8ea6216f..08a23e0d6a575febb90e4f1bfe4f89cea5acaa01 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java @@ -310,6 +310,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop entitytypes = entity.getType(); diff --git a/patches/server/0237-Configurable-valid-characters-for-usernames.patch b/patches/server/0239-Configurable-valid-characters-for-usernames.patch similarity index 100% rename from patches/server/0237-Configurable-valid-characters-for-usernames.patch rename to patches/server/0239-Configurable-valid-characters-for-usernames.patch diff --git a/patches/server/0238-Shears-can-have-looting-enchantment.patch b/patches/server/0240-Shears-can-have-looting-enchantment.patch similarity index 97% rename from patches/server/0238-Shears-can-have-looting-enchantment.patch rename to patches/server/0240-Shears-can-have-looting-enchantment.patch index f7af9f844..57365b16e 100644 --- a/patches/server/0238-Shears-can-have-looting-enchantment.patch +++ b/patches/server/0240-Shears-can-have-looting-enchantment.patch @@ -37,7 +37,7 @@ index 5e8cc5cfac8888628c6d513148f41be09ca65a2c..a089fc61ec09be6b7490375489178dc6 boolean readyForShearing(); } diff --git a/src/main/java/net/minecraft/world/entity/animal/MushroomCow.java b/src/main/java/net/minecraft/world/entity/animal/MushroomCow.java -index f517658a240a7c79889f9047e94e9afc884df78c..046e851a5c49e58fa4e84d398ffbe11baa9c4072 100644 +index 55d0abd9344de528dffda7598045cc44861fc66d..b5d0d3aaa0442b4753aef8fdf8f85f017e1dd811 100644 --- a/src/main/java/net/minecraft/world/entity/animal/MushroomCow.java +++ b/src/main/java/net/minecraft/world/entity/animal/MushroomCow.java @@ -164,7 +164,7 @@ public class MushroomCow extends Cow implements Shearable, VariantHolder entityType, Level world) { - this(entityType, world, VillagerType.PLAINS); -@@ -194,6 +196,47 @@ public class Villager extends AbstractVillager implements ReputationEventHandler + public long nextGolemPanic = -1; // Pufferfish + +@@ -196,6 +198,47 @@ public class Villager extends AbstractVillager implements ReputationEventHandler protected boolean isAlwaysExperienceDropper() { return this.level.purpurConfig.villagerAlwaysDropExp; } @@ -65,7 +65,7 @@ index 3e600058279f9a08511984dc92d88a78dc2cc083..bb49c74d3e625968fd99977a61b7e125 // Purpur end @Override -@@ -290,10 +333,25 @@ public class Villager extends AbstractVillager implements ReputationEventHandler +@@ -293,12 +336,27 @@ public class Villager extends AbstractVillager implements ReputationEventHandler protected void customServerAiStep() { mobTick(false); } protected void mobTick(boolean inactive) { this.level.getProfiler().push("villagerBrain"); @@ -78,10 +78,12 @@ index 3e600058279f9a08511984dc92d88a78dc2cc083..bb49c74d3e625968fd99977a61b7e125 + this.isLobotomized = false; + } + // Purpur end + // Pufferfish start if (!inactive) { - if ((getRider() == null || !this.isControllable())/* && this.behaviorTick++ % this.activatedPriority == 0*/) // Pufferfish // Purpur - only use brain if no rider TODO: uncomment when including Pufferfish + if ((getRider() == null || !this.isControllable()) && this.behaviorTick++ % this.activatedPriority == 0) // Pufferfish // Purpur - only use brain if no rider this.getBrain().tick((ServerLevel) this.level, this); // Paper - } + } + // Pufferfish end + // Purpur start + else if (this.isLobotomized && shouldRestock()) { + // make sure we restock if needed when lobotomized diff --git a/patches/server/0250-Option-for-villager-display-trade-item.patch b/patches/server/0252-Option-for-villager-display-trade-item.patch similarity index 100% rename from patches/server/0250-Option-for-villager-display-trade-item.patch rename to patches/server/0252-Option-for-villager-display-trade-item.patch diff --git a/patches/server/0251-MC-238526-Fix-spawner-not-spawning-water-animals-cor.patch b/patches/server/0253-MC-238526-Fix-spawner-not-spawning-water-animals-cor.patch similarity index 95% rename from patches/server/0251-MC-238526-Fix-spawner-not-spawning-water-animals-cor.patch rename to patches/server/0253-MC-238526-Fix-spawner-not-spawning-water-animals-cor.patch index 069167d67..f6e7d9c9d 100644 --- a/patches/server/0251-MC-238526-Fix-spawner-not-spawning-water-animals-cor.patch +++ b/patches/server/0253-MC-238526-Fix-spawner-not-spawning-water-animals-cor.patch @@ -17,7 +17,7 @@ index 35cfa366baf6747105faa93f1220bb9cc31a5bd5..ff3a6755d04f2280a36bd363ab1722e0 } } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index ce7d7aafcdd59618c13b7cbb0c037601014db26f..dba6e60aa3c998964b64fbb5ac82a58732eeee54 100644 +index 7ad03e4bd91efb2d9476a00bc71dda5161ff63f2..5be0e35536fd02df9aa6b820e0a3e5a53f45862f 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -975,8 +975,10 @@ public class PurpurWorldConfig { diff --git a/patches/server/0252-Config-for-mob-last-hurt-by-player-time.patch b/patches/server/0254-Config-for-mob-last-hurt-by-player-time.patch similarity index 93% rename from patches/server/0252-Config-for-mob-last-hurt-by-player-time.patch rename to patches/server/0254-Config-for-mob-last-hurt-by-player-time.patch index 12eb47915..3bb5a7b91 100644 --- a/patches/server/0252-Config-for-mob-last-hurt-by-player-time.patch +++ b/patches/server/0254-Config-for-mob-last-hurt-by-player-time.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Config for mob last hurt by player time diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java -index 8a38970579e9ffefb4dcb09a6970b2573a6e0a2d..f1c4ee3416592b91a255a482c272d3df8114e8c8 100644 +index 43bdfe35c54d353b99968fcc07bcc1e3e90ad451..fe68a9e0cf53c4a8c3411123521e71a482e3ced9 100644 --- a/src/main/java/net/minecraft/world/entity/LivingEntity.java +++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java -@@ -1455,13 +1455,13 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -1463,13 +1463,13 @@ public abstract class LivingEntity extends Entity implements Attackable { if (entity1 instanceof net.minecraft.world.entity.player.Player) { net.minecraft.world.entity.player.Player entityhuman = (net.minecraft.world.entity.player.Player) entity1; @@ -38,7 +38,7 @@ index d7261e00c993eb96014373001b158c3525b43ec3..cf7ba8724ab68f6955b5ebfa1ba46c43 // Paper end diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index a874dbc550040d6f802408661640f8111600bfd4..7125f8af5c76ce43128bb747c9f2cd869117dbe6 100644 +index 5be0e35536fd02df9aa6b820e0a3e5a53f45862f..a62d483a5231b29215d63b562707953dec1a4ff8 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -144,6 +144,7 @@ public class PurpurWorldConfig { diff --git a/patches/server/0253-Anvil-repair-damage-options.patch b/patches/server/0255-Anvil-repair-damage-options.patch similarity index 98% rename from patches/server/0253-Anvil-repair-damage-options.patch rename to patches/server/0255-Anvil-repair-damage-options.patch index f0c344ba8..49c7ca437 100644 --- a/patches/server/0253-Anvil-repair-damage-options.patch +++ b/patches/server/0255-Anvil-repair-damage-options.patch @@ -64,7 +64,7 @@ index 5c5a3b169795bf8a527b316c666cbc2105c66622..020afeca950d2c7fb6c7b179d424548f return InteractionResult.SUCCESS; } else { diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 5e318050a59db7dbb18f96a176726d9134de4cd6..73d2caf7eccc2c5904f81e6cf9aba2d37f7c5d32 100644 +index a62d483a5231b29215d63b562707953dec1a4ff8..ec54f2f7f76cfe34d9be7a9e2ccfbea09be2f3e5 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -720,9 +720,13 @@ public class PurpurWorldConfig { diff --git a/patches/server/0254-Fix-legacy-colors-in-console.patch b/patches/server/0256-Fix-legacy-colors-in-console.patch similarity index 100% rename from patches/server/0254-Fix-legacy-colors-in-console.patch rename to patches/server/0256-Fix-legacy-colors-in-console.patch diff --git a/patches/server/0255-Option-to-disable-turtle-egg-trampling-with-feather-.patch b/patches/server/0257-Option-to-disable-turtle-egg-trampling-with-feather-.patch similarity index 96% rename from patches/server/0255-Option-to-disable-turtle-egg-trampling-with-feather-.patch rename to patches/server/0257-Option-to-disable-turtle-egg-trampling-with-feather-.patch index 1e36e39e8..4274796cb 100644 --- a/patches/server/0255-Option-to-disable-turtle-egg-trampling-with-feather-.patch +++ b/patches/server/0257-Option-to-disable-turtle-egg-trampling-with-feather-.patch @@ -24,7 +24,7 @@ index 70997b83fd7631ebf3c5bda67ef77bef605eb464..a8c227e2cb62cfa8225798329cde9078 return world.purpurConfig.turtleEggsBypassMobGriefing || world.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING); // Purpur end diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 73d2caf7eccc2c5904f81e6cf9aba2d37f7c5d32..6c0077316aa3fc284d93ad9b21d3e3760ec1e183 100644 +index ec54f2f7f76cfe34d9be7a9e2ccfbea09be2f3e5..ab17cf6c92083bf0ca0b1566b2c20288f85135a6 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -1001,12 +1001,14 @@ public class PurpurWorldConfig { diff --git a/patches/server/0256-Add-toggle-for-enchant-level-clamping.patch b/patches/server/0258-Add-toggle-for-enchant-level-clamping.patch similarity index 100% rename from patches/server/0256-Add-toggle-for-enchant-level-clamping.patch rename to patches/server/0258-Add-toggle-for-enchant-level-clamping.patch diff --git a/patches/server/0257-Skip-junit-tests-for-purpur-commands.patch b/patches/server/0259-Skip-junit-tests-for-purpur-commands.patch similarity index 100% rename from patches/server/0257-Skip-junit-tests-for-purpur-commands.patch rename to patches/server/0259-Skip-junit-tests-for-purpur-commands.patch diff --git a/patches/server/0258-Implement-configurable-search-radius-for-villagers-t.patch b/patches/server/0260-Implement-configurable-search-radius-for-villagers-t.patch similarity index 94% rename from patches/server/0258-Implement-configurable-search-radius-for-villagers-t.patch rename to patches/server/0260-Implement-configurable-search-radius-for-villagers-t.patch index 72f122d37..086f86820 100644 --- a/patches/server/0258-Implement-configurable-search-radius-for-villagers-t.patch +++ b/patches/server/0260-Implement-configurable-search-radius-for-villagers-t.patch @@ -6,10 +6,10 @@ Subject: [PATCH] Implement configurable search radius for villagers to spawn diff --git a/src/main/java/net/minecraft/world/entity/npc/Villager.java b/src/main/java/net/minecraft/world/entity/npc/Villager.java -index bb49c74d3e625968fd99977a61b7e1255e81077e..e6349547695394786a46757170aae2230cb26bd1 100644 +index bee6020bb8f36f8b5622d3bafaf7b37e48c29db2..505411b18989191ffa976283d08b644e11ef3f05 100644 --- a/src/main/java/net/minecraft/world/entity/npc/Villager.java +++ b/src/main/java/net/minecraft/world/entity/npc/Villager.java -@@ -1088,6 +1088,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler +@@ -1093,6 +1093,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler } public void spawnGolemIfNeeded(ServerLevel world, long time, int requiredCount) { diff --git a/patches/server/0259-Stonecutter-damage.patch b/patches/server/0261-Stonecutter-damage.patch similarity index 98% rename from patches/server/0259-Stonecutter-damage.patch rename to patches/server/0261-Stonecutter-damage.patch index 5aafed5fe..7991b8b4b 100644 --- a/patches/server/0259-Stonecutter-damage.patch +++ b/patches/server/0261-Stonecutter-damage.patch @@ -63,7 +63,7 @@ index 636c032127c2026509764745f805ae0693e4a983..3734f6279005872eac6697e6e22c3a2e public static boolean advancementOnlyBroadcastToAffectedPlayer = false; diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 29ad2bdcc29b3758369acc130517c64d4ce56fa0..ffde66cb0ffa0651ac308f9020591277c267ca2a 100644 +index 607106eed6cd801885fb8073f2f74b21dfc2e593..0d31953521cd16255b8f314a0ee7fce3556548f1 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -996,6 +996,11 @@ public class PurpurWorldConfig { diff --git a/patches/server/0260-Configurable-damage-settings-for-magma-blocks.patch b/patches/server/0262-Configurable-damage-settings-for-magma-blocks.patch similarity index 96% rename from patches/server/0260-Configurable-damage-settings-for-magma-blocks.patch rename to patches/server/0262-Configurable-damage-settings-for-magma-blocks.patch index 62728adf0..7d3174136 100644 --- a/patches/server/0260-Configurable-damage-settings-for-magma-blocks.patch +++ b/patches/server/0262-Configurable-damage-settings-for-magma-blocks.patch @@ -18,7 +18,7 @@ index 12ffb5714f088f4aeafa1ad6a36f5b64a86c4c96..293aa5c8f91a997045f8d9f2951fe3a7 entity.hurt(world.damageSources().hotFloor(), 1.0F); org.bukkit.craftbukkit.event.CraftEventFactory.blockDamage = null; // CraftBukkit diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index ffde66cb0ffa0651ac308f9020591277c267ca2a..c9d125d372978859aaac0ebcf7173ad17ea77c28 100644 +index 0d31953521cd16255b8f314a0ee7fce3556548f1..44e76c5b3070727299340109e7950a788ae970de 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -927,6 +927,13 @@ public class PurpurWorldConfig { diff --git a/patches/server/0261-Add-config-for-snow-on-blue-ice.patch b/patches/server/0263-Add-config-for-snow-on-blue-ice.patch similarity index 95% rename from patches/server/0261-Add-config-for-snow-on-blue-ice.patch rename to patches/server/0263-Add-config-for-snow-on-blue-ice.patch index 59cfc9fb4..187e46d83 100644 --- a/patches/server/0261-Add-config-for-snow-on-blue-ice.patch +++ b/patches/server/0263-Add-config-for-snow-on-blue-ice.patch @@ -22,7 +22,7 @@ index 14e00c7feb1c051d56a3d27cd00dcef072dd771a..4952fb1aaaafb55baa0fddb389f966a1 } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index c9d125d372978859aaac0ebcf7173ad17ea77c28..9b10778c3ea1bd0228faef3ce3b90fc18fadbca8 100644 +index 44e76c5b3070727299340109e7950a788ae970de..00156cc02bb7cf0e66eb1bc48c014971e284304b 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -908,9 +908,11 @@ public class PurpurWorldConfig { diff --git a/patches/server/0262-Skeletons-eat-wither-roses.patch b/patches/server/0264-Skeletons-eat-wither-roses.patch similarity index 100% rename from patches/server/0262-Skeletons-eat-wither-roses.patch rename to patches/server/0264-Skeletons-eat-wither-roses.patch diff --git a/patches/server/0263-Enchantment-Table-Persists-Lapis.patch b/patches/server/0265-Enchantment-Table-Persists-Lapis.patch similarity index 100% rename from patches/server/0263-Enchantment-Table-Persists-Lapis.patch rename to patches/server/0265-Enchantment-Table-Persists-Lapis.patch diff --git a/patches/server/0264-Spark-Profiler.patch b/patches/server/0266-Spark-Profiler.patch similarity index 100% rename from patches/server/0264-Spark-Profiler.patch rename to patches/server/0266-Spark-Profiler.patch diff --git a/patches/server/0265-Option-to-disable-kick-for-out-of-order-chat.patch b/patches/server/0267-Option-to-disable-kick-for-out-of-order-chat.patch similarity index 92% rename from patches/server/0265-Option-to-disable-kick-for-out-of-order-chat.patch rename to patches/server/0267-Option-to-disable-kick-for-out-of-order-chat.patch index 0e9a313a0..83e0922fb 100644 --- a/patches/server/0265-Option-to-disable-kick-for-out-of-order-chat.patch +++ b/patches/server/0267-Option-to-disable-kick-for-out-of-order-chat.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Option to disable kick for out of order chat diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -index 00981d521fd8e73e586efb46926d5e42520ac4f9..a66f5b8438d499c705cc4025ba31f72bd1fea3cf 100644 +index 9b68df653a3cdc6ebc25300e9da5b38d7625fe1a..355bd13f6d15ca1c94f56868b23d19f8bd0b0e1e 100644 --- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java +++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -@@ -2433,7 +2433,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic +@@ -2435,7 +2435,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic do { instant1 = (Instant) this.lastChatTimeStamp.get(); if (timestamp.isBefore(instant1)) { diff --git a/patches/server/0266-Config-for-sculk-shrieker-can_summon-state.patch b/patches/server/0268-Config-for-sculk-shrieker-can_summon-state.patch similarity index 95% rename from patches/server/0266-Config-for-sculk-shrieker-can_summon-state.patch rename to patches/server/0268-Config-for-sculk-shrieker-can_summon-state.patch index 7d6000dcb..69e70732c 100644 --- a/patches/server/0266-Config-for-sculk-shrieker-can_summon-state.patch +++ b/patches/server/0268-Config-for-sculk-shrieker-can_summon-state.patch @@ -18,7 +18,7 @@ index 437b44fb68bcbe81d1c431689431225b6a17a1a6..06d091b7c4df949c4abda16c4f73c194 @Override diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 9d040d4dc7b0f1ff7884356d9ca1c0fab62c98cf..5f3f4e4b8dec024816f26103df6eb9e6bdd67f5c 100644 +index 555e550f82c493f44711cacf5a193e6367c0ac04..3923879b14654ae591c785ce41a71dd85db6043e 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -972,6 +972,11 @@ public class PurpurWorldConfig { diff --git a/patches/server/0267-Config-to-not-let-coral-die.patch b/patches/server/0269-Config-to-not-let-coral-die.patch similarity index 96% rename from patches/server/0267-Config-to-not-let-coral-die.patch rename to patches/server/0269-Config-to-not-let-coral-die.patch index acfbcc89b..3b50461f0 100644 --- a/patches/server/0267-Config-to-not-let-coral-die.patch +++ b/patches/server/0269-Config-to-not-let-coral-die.patch @@ -29,7 +29,7 @@ index 88faea00be60a519f56f975a5311df5e1eb3e6b8..cbb726ac367be81e27d3a86643baf7c4 int i = aenumdirection.length; diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 5f3f4e4b8dec024816f26103df6eb9e6bdd67f5c..5c9ef7afc1afc55958e8a63b30208adfd1576110 100644 +index 3923879b14654ae591c785ce41a71dd85db6043e..80f400e6abfc3f04dddee921f020b660509b226c 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -809,6 +809,11 @@ public class PurpurWorldConfig { diff --git a/patches/server/0268-Add-local-difficulty-api.patch b/patches/server/0270-Add-local-difficulty-api.patch similarity index 100% rename from patches/server/0268-Add-local-difficulty-api.patch rename to patches/server/0270-Add-local-difficulty-api.patch diff --git a/patches/server/0269-Add-toggle-for-RNG-manipulation.patch b/patches/server/0271-Add-toggle-for-RNG-manipulation.patch similarity index 88% rename from patches/server/0269-Add-toggle-for-RNG-manipulation.patch rename to patches/server/0271-Add-toggle-for-RNG-manipulation.patch index bc5931269..93002559a 100644 --- a/patches/server/0269-Add-toggle-for-RNG-manipulation.patch +++ b/patches/server/0271-Add-toggle-for-RNG-manipulation.patch @@ -7,10 +7,10 @@ Paper patches RNG maniplulation by using a shared (and locked) random source. This comes with a performance gain, but technical players may prefer the ability to manipulate RNG. diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java -index 51bb177a52ea52d642ec3300ccd6fd28b3b66bb3..6bb9b0b84367e6b670aeb2de51f94714821db53d 100644 +index 05e23fd43cca166f8a058debd9dc3fd1e1c2a595..1a918da8b04a463bcce9359c8053b8fb4eeaacb8 100644 --- a/src/main/java/net/minecraft/world/entity/Entity.java +++ b/src/main/java/net/minecraft/world/entity/Entity.java -@@ -550,7 +550,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { +@@ -578,7 +578,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { this.bb = Entity.INITIAL_AABB; this.stuckSpeedMultiplier = Vec3.ZERO; this.nextStep = 1.0F; @@ -20,7 +20,7 @@ index 51bb177a52ea52d642ec3300ccd6fd28b3b66bb3..6bb9b0b84367e6b670aeb2de51f94714 this.fluidHeight = new Object2DoubleArrayMap(2); this.fluidOnEyes = new HashSet(); diff --git a/src/main/java/net/minecraft/world/entity/animal/Squid.java b/src/main/java/net/minecraft/world/entity/animal/Squid.java -index 802afd3dc36bc9be97b39d20288dec3c6ed496eb..6de0017e3a3aebdb726f327ffa970a1d268200b4 100644 +index 2a2b56940cd39ca0f14dc8246b41cf6640caa3bd..31c89a6b8f766e1fd03608723c2d03f7f64e2e9b 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Squid.java +++ b/src/main/java/net/minecraft/world/entity/animal/Squid.java @@ -46,7 +46,7 @@ public class Squid extends WaterAnimal { @@ -33,7 +33,7 @@ index 802afd3dc36bc9be97b39d20288dec3c6ed496eb..6de0017e3a3aebdb726f327ffa970a1d } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 8be28314335e2242c12f9e4b2e49c614ca7d10b5..7f8bfb94cbbe7b8c569a5df638cc5607c2ea5951 100644 +index 80f400e6abfc3f04dddee921f020b660509b226c..f1956454d745902053e6583f0321c319d5266222 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -206,9 +206,11 @@ public class PurpurWorldConfig { diff --git a/patches/server/0270-Send-client-custom-name-of-BE.patch b/patches/server/0272-Send-client-custom-name-of-BE.patch similarity index 100% rename from patches/server/0270-Send-client-custom-name-of-BE.patch rename to patches/server/0272-Send-client-custom-name-of-BE.patch diff --git a/patches/server/0271-PaperPR-Fix-exact-choice-recipe-book-clicks.patch b/patches/server/0273-PaperPR-Fix-exact-choice-recipe-book-clicks.patch similarity index 98% rename from patches/server/0271-PaperPR-Fix-exact-choice-recipe-book-clicks.patch rename to patches/server/0273-PaperPR-Fix-exact-choice-recipe-book-clicks.patch index 795de7fa9..6d1aedf12 100644 --- a/patches/server/0271-PaperPR-Fix-exact-choice-recipe-book-clicks.patch +++ b/patches/server/0273-PaperPR-Fix-exact-choice-recipe-book-clicks.patch @@ -85,7 +85,7 @@ index 574ebb3a2fcd0e4e426a8a7ee88d722ed3b9c3f5..842b921799111789b37a34b76644c921 } diff --git a/src/main/java/net/minecraft/world/item/ItemStack.java b/src/main/java/net/minecraft/world/item/ItemStack.java -index 02815ee37a5106c9a5cbf8649ef98420fb727b7a..dbcaf01760f2e87d1f3119a55a16957b4caad6d5 100644 +index 4a5e5da67f00870e05893f541cd1716dbee78c83..234d992206f34febc7aff24b78cb3e526254e35f 100644 --- a/src/main/java/net/minecraft/world/item/ItemStack.java +++ b/src/main/java/net/minecraft/world/item/ItemStack.java @@ -109,6 +109,7 @@ import org.bukkit.event.world.StructureGrowEvent; diff --git a/patches/server/0272-Allow-custom-ChatDecorators.patch b/patches/server/0274-Allow-custom-ChatDecorators.patch similarity index 90% rename from patches/server/0272-Allow-custom-ChatDecorators.patch rename to patches/server/0274-Allow-custom-ChatDecorators.patch index ee4e15169..b2bf0df37 100644 --- a/patches/server/0272-Allow-custom-ChatDecorators.patch +++ b/patches/server/0274-Allow-custom-ChatDecorators.patch @@ -6,10 +6,10 @@ Subject: [PATCH] Allow custom ChatDecorators Requires NMS to utilize. I'll write an API for this once our upstreams calm down with the changes. diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java -index 1507fdb55ec29a0b56c67d8082144ffb3e10617c..33d2bc0d193dfe5a257abdfde50aa0ea719173f6 100644 +index a5f1fc0366ea9b2518d4f2cf2e99b8a518d8859c..acf012ac619cf2f71449c1f495cf9c8485f9d0e5 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java -@@ -2661,6 +2661,15 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop { return ichunkaccess1; -@@ -598,17 +598,17 @@ public class ServerChunkCache extends ChunkSource { +@@ -601,17 +601,17 @@ public class ServerChunkCache extends ChunkSource { public void save(boolean flush) { this.runDistanceManagerUpdates(); @@ -378,7 +386,7 @@ index ca84eddbdb1e198b899750e5f6b3eafd25ce970f..2338be893b15eeecda336aea12803b7d } // Paper end -@@ -638,22 +638,22 @@ public class ServerChunkCache extends ChunkSource { +@@ -641,22 +641,22 @@ public class ServerChunkCache extends ChunkSource { @Override public void tick(BooleanSupplier shouldKeepTicking, boolean tickChunks) { this.level.getProfiler().push("purge"); @@ -407,7 +415,7 @@ index ca84eddbdb1e198b899750e5f6b3eafd25ce970f..2338be893b15eeecda336aea12803b7d this.level.getProfiler().pop(); this.clearCache(); } -@@ -707,7 +707,7 @@ public class ServerChunkCache extends ChunkSource { +@@ -711,7 +711,7 @@ public class ServerChunkCache extends ChunkSource { boolean flag1 = level.ticksPerSpawnCategory.getLong(org.bukkit.entity.SpawnCategory.ANIMAL) != 0L && worlddata.getGameTime() % level.ticksPerSpawnCategory.getLong(org.bukkit.entity.SpawnCategory.ANIMAL) == 0L; // CraftBukkit gameprofilerfiller.push("naturalSpawnCount"); @@ -416,14 +424,14 @@ index ca84eddbdb1e198b899750e5f6b3eafd25ce970f..2338be893b15eeecda336aea12803b7d int l = this.distanceManager.getNaturalSpawnChunkCount(); // Paper start - per player mob spawning NaturalSpawner.SpawnState spawnercreature_d; // moved down -@@ -721,12 +721,12 @@ public class ServerChunkCache extends ChunkSource { - spawnercreature_d = NaturalSpawner.createState(l, this.level.getAllEntities(), this::getFullChunk, this.chunkMap.playerMobDistanceMap == null ? new LocalMobCapCalculator(this.chunkMap) : null, false); +@@ -732,12 +732,12 @@ public class ServerChunkCache extends ChunkSource { + // Pufferfish end } // Paper end - this.level.timings.countNaturalMobs.stopTiming(); // Paper - timings + //this.level.timings.countNaturalMobs.stopTiming(); // Paper - timings // Purpur - this.lastSpawnState = spawnercreature_d; + //this.lastSpawnState = spawnercreature_d; // Pufferfish - this is managed asynchronously gameprofilerfiller.popPush("filteringLoadedChunks"); // Paper - moved down - this.level.timings.chunkTicks.startTiming(); // Paper @@ -431,7 +439,7 @@ index ca84eddbdb1e198b899750e5f6b3eafd25ce970f..2338be893b15eeecda336aea12803b7d // Paper - moved down -@@ -780,17 +780,17 @@ public class ServerChunkCache extends ChunkSource { +@@ -791,17 +791,17 @@ public class ServerChunkCache extends ChunkSource { } } // Paper end - optimise chunk tick iteration @@ -453,7 +461,7 @@ index ca84eddbdb1e198b899750e5f6b3eafd25ce970f..2338be893b15eeecda336aea12803b7d if (!this.chunkMap.needsChangeBroadcasting.isEmpty()) { ReferenceOpenHashSet copy = this.chunkMap.needsChangeBroadcasting.clone(); this.chunkMap.needsChangeBroadcasting.clear(); -@@ -802,7 +802,7 @@ public class ServerChunkCache extends ChunkSource { +@@ -813,7 +813,7 @@ public class ServerChunkCache extends ChunkSource { } } } @@ -463,7 +471,7 @@ index ca84eddbdb1e198b899750e5f6b3eafd25ce970f..2338be893b15eeecda336aea12803b7d // Paper end - use set of chunks requiring updates, rather than iterating every single one loaded // Paper start - controlled flush for entity tracker packets diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java -index 2d61a0c7dfeb868403d64abbf847121f60905f93..752a298e96e75580ec7eef14cc7eab964f57414c 100644 +index e0951fd02868f04bb12afab15b73b6d41e814abd..74ab15db63acae728a55ad2cde40ae9bfa3003f3 100644 --- a/src/main/java/net/minecraft/server/level/ServerLevel.java +++ b/src/main/java/net/minecraft/server/level/ServerLevel.java @@ -687,7 +687,7 @@ public class ServerLevel extends Level implements WorldGenLevel { @@ -519,9 +527,9 @@ index 2d61a0c7dfeb868403d64abbf847121f60905f93..752a298e96e75580ec7eef14cc7eab96 - timings.entityTick.startTiming(); // Spigot + //timings.entityTick.startTiming(); // Spigot // Purpur this.entityTickList.forEach((entity) -> { + entity.activatedPriorityReset = false; // Pufferfish - DAB if (!entity.isRemoved()) { - if (false && this.shouldDiscardEntity(entity)) { // CraftBukkit - We prevent spawning in general, so this butchering is not needed -@@ -755,8 +755,8 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -769,8 +769,8 @@ public class ServerLevel extends Level implements WorldGenLevel { } } }); @@ -532,7 +540,7 @@ index 2d61a0c7dfeb868403d64abbf847121f60905f93..752a298e96e75580ec7eef14cc7eab96 gameprofilerfiller.pop(); this.tickBlockEntities(); } -@@ -935,7 +935,7 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -951,7 +951,7 @@ public class ServerLevel extends Level implements WorldGenLevel { // Paper start - optimise random block ticking gameprofilerfiller.popPush("randomTick"); @@ -541,7 +549,7 @@ index 2d61a0c7dfeb868403d64abbf847121f60905f93..752a298e96e75580ec7eef14cc7eab96 if (randomTickSpeed > 0) { LevelChunkSection[] sections = chunk.getSections(); int minSection = io.papermc.paper.util.WorldUtil.getMinSection(this); -@@ -969,7 +969,7 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -985,7 +985,7 @@ public class ServerLevel extends Level implements WorldGenLevel { } } // Paper end - optimise random block ticking @@ -550,7 +558,7 @@ index 2d61a0c7dfeb868403d64abbf847121f60905f93..752a298e96e75580ec7eef14cc7eab96 gameprofilerfiller.pop(); } -@@ -1262,8 +1262,8 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -1278,8 +1278,8 @@ public class ServerLevel extends Level implements WorldGenLevel { // Spigot end // Paper start- timings final boolean isActive = org.spigotmc.ActivationRange.checkIfActive(entity); @@ -561,7 +569,7 @@ index 2d61a0c7dfeb868403d64abbf847121f60905f93..752a298e96e75580ec7eef14cc7eab96 // Paper end - timings entity.setOldPosAndRot(); ProfilerFiller gameprofilerfiller = this.getProfiler(); -@@ -1279,7 +1279,7 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -1295,7 +1295,7 @@ public class ServerLevel extends Level implements WorldGenLevel { entity.postTick(); // CraftBukkit } else { entity.inactiveTick(); } // Paper - EAR 2 this.getProfiler().pop(); @@ -570,7 +578,7 @@ index 2d61a0c7dfeb868403d64abbf847121f60905f93..752a298e96e75580ec7eef14cc7eab96 Iterator iterator = entity.getPassengers().iterator(); while (iterator.hasNext()) { -@@ -1302,8 +1302,8 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -1318,8 +1318,8 @@ public class ServerLevel extends Level implements WorldGenLevel { if (passenger instanceof Player || this.entityTickList.contains(passenger)) { // Paper - EAR 2 final boolean isActive = org.spigotmc.ActivationRange.checkIfActive(passenger); @@ -581,7 +589,7 @@ index 2d61a0c7dfeb868403d64abbf847121f60905f93..752a298e96e75580ec7eef14cc7eab96 // Paper end passenger.setOldPosAndRot(); ++passenger.tickCount; -@@ -1333,7 +1333,7 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -1349,7 +1349,7 @@ public class ServerLevel extends Level implements WorldGenLevel { this.tickPassenger(passenger, entity2); } @@ -590,7 +598,7 @@ index 2d61a0c7dfeb868403d64abbf847121f60905f93..752a298e96e75580ec7eef14cc7eab96 } } else { passenger.stopRiding(); -@@ -1353,14 +1353,14 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -1369,14 +1369,14 @@ public class ServerLevel extends Level implements WorldGenLevel { org.bukkit.Bukkit.getPluginManager().callEvent(new org.bukkit.event.world.WorldSaveEvent(getWorld())); } @@ -608,7 +616,7 @@ index 2d61a0c7dfeb868403d64abbf847121f60905f93..752a298e96e75580ec7eef14cc7eab96 // Copied from save() // CraftBukkit start - moved from MinecraftServer.saveChunks -@@ -1372,7 +1372,7 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -1388,7 +1388,7 @@ public class ServerLevel extends Level implements WorldGenLevel { this.convertable.saveDataTag(this.server.registryAccess(), this.serverLevelData, this.server.getPlayerList().getSingleplayerData()); } // CraftBukkit end @@ -617,7 +625,7 @@ index 2d61a0c7dfeb868403d64abbf847121f60905f93..752a298e96e75580ec7eef14cc7eab96 } // Paper end -@@ -1386,7 +1386,7 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -1402,7 +1402,7 @@ public class ServerLevel extends Level implements WorldGenLevel { if (!savingDisabled) { org.bukkit.Bukkit.getPluginManager().callEvent(new org.bukkit.event.world.WorldSaveEvent(getWorld())); // CraftBukkit @@ -626,7 +634,7 @@ index 2d61a0c7dfeb868403d64abbf847121f60905f93..752a298e96e75580ec7eef14cc7eab96 if (progressListener != null) { progressListener.progressStartNoAbort(Component.translatable("menu.savingLevel")); } -@@ -1396,11 +1396,11 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -1412,11 +1412,11 @@ public class ServerLevel extends Level implements WorldGenLevel { progressListener.progressStage(Component.translatable("menu.savingChunks")); } @@ -642,10 +650,10 @@ index 2d61a0c7dfeb868403d64abbf847121f60905f93..752a298e96e75580ec7eef14cc7eab96 } else if (close) { chunkproviderserver.close(false); } // Paper - rewrite chunk system diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -index 0373d0d050f89e3754d6c94946501227db0c19df..82fcf0593b4739e32d02ffc779f9fbb5f64d26f1 100644 +index 355bd13f6d15ca1c94f56868b23d19f8bd0b0e1e..9cfe9f137a20a15af87d48fef0f7ee48400026ac 100644 --- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java +++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -@@ -2570,7 +2570,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic +@@ -2572,7 +2572,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic } } // Paper End @@ -654,7 +662,7 @@ index 0373d0d050f89e3754d6c94946501227db0c19df..82fcf0593b4739e32d02ffc779f9fbb5 if ( org.spigotmc.SpigotConfig.logCommands ) // Spigot this.LOGGER.info(this.player.getScoreboardName() + " issued server command: " + s); -@@ -2580,7 +2580,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic +@@ -2582,7 +2582,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic this.cserver.getPluginManager().callEvent(event); if (event.isCancelled()) { @@ -663,7 +671,7 @@ index 0373d0d050f89e3754d6c94946501227db0c19df..82fcf0593b4739e32d02ffc779f9fbb5 return; } -@@ -2593,7 +2593,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic +@@ -2595,7 +2595,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic java.util.logging.Logger.getLogger(ServerGamePacketListenerImpl.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); return; } finally { @@ -744,10 +752,10 @@ index fcdb9bde8e1605e30dde3e580491522d4b62cdc0..7094701d213c73ba47ace806962244c1 } diff --git a/src/main/java/net/minecraft/world/level/Level.java b/src/main/java/net/minecraft/world/level/Level.java -index 40c675564614e1307b2cf85584e23a94734ec36b..65b815a2e68e70639ed555a2a2635b6c5f98fe6c 100644 +index 52d2fa575a29ec36280bb4dbcab6954ac468d2a1..547f51eeaab3555559d0bf8456753df471725de1 100644 --- a/src/main/java/net/minecraft/world/level/Level.java +++ b/src/main/java/net/minecraft/world/level/Level.java -@@ -919,15 +919,15 @@ public abstract class Level implements LevelAccessor, AutoCloseable { +@@ -1022,15 +1022,15 @@ public abstract class Level implements LevelAccessor, AutoCloseable { ProfilerFiller gameprofilerfiller = this.getProfiler(); gameprofilerfiller.push("blockEntities"); @@ -766,7 +774,7 @@ index 40c675564614e1307b2cf85584e23a94734ec36b..65b815a2e68e70639ed555a2a2635b6c // Spigot start // Iterator iterator = this.blockEntityTickers.iterator(); int tilesThisCycle = 0; -@@ -960,7 +960,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { +@@ -1063,7 +1063,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { } this.blockEntityTickers.removeAll(toRemove); @@ -776,7 +784,7 @@ index 40c675564614e1307b2cf85584e23a94734ec36b..65b815a2e68e70639ed555a2a2635b6c co.aikar.timings.TimingHistory.tileEntityTicks += this.blockEntityTickers.size(); // Paper gameprofilerfiller.pop(); diff --git a/src/main/java/net/minecraft/world/level/NaturalSpawner.java b/src/main/java/net/minecraft/world/level/NaturalSpawner.java -index 15d266fc97eb73338f4f6fb2cfe25d6861e79810..ee594416ede3deed34170d04bee29492ba221061 100644 +index 6180679d922ea61d05d452971ec2d506a724d3c3..54467e5ab4a4629f88fe48bd4b7f0db821e4553f 100644 --- a/src/main/java/net/minecraft/world/level/NaturalSpawner.java +++ b/src/main/java/net/minecraft/world/level/NaturalSpawner.java @@ -133,7 +133,7 @@ public final class NaturalSpawner { @@ -798,10 +806,10 @@ index 15d266fc97eb73338f4f6fb2cfe25d6861e79810..ee594416ede3deed34170d04bee29492 } diff --git a/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java b/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java -index 206dc04086a218b510930739a6c573f2653ab0fa..3fe35f4ea24ed541e11986ce5ea487290b993a03 100644 +index b5e361d2170d2741ef990ec342f32ccde0c05750..3922a639a91b12c419ce566f6cf84f5466c2e0e3 100644 --- a/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java +++ b/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java -@@ -917,7 +917,7 @@ public class LevelChunk extends ChunkAccess { +@@ -930,7 +930,7 @@ public class LevelChunk extends ChunkAccess { this.chunkHolder.getEntityChunk().callEntitiesLoadEvent(); // Paper - rewrite chunk system if (this.needsDecoration) { @@ -810,7 +818,7 @@ index 206dc04086a218b510930739a6c573f2653ab0fa..3fe35f4ea24ed541e11986ce5ea48729 this.needsDecoration = false; java.util.Random random = new java.util.Random(); random.setSeed(this.level.getSeed()); -@@ -937,7 +937,7 @@ public class LevelChunk extends ChunkAccess { +@@ -950,7 +950,7 @@ public class LevelChunk extends ChunkAccess { } } server.getPluginManager().callEvent(new org.bukkit.event.world.ChunkPopulateEvent(this.bukkitChunk)); @@ -819,7 +827,7 @@ index 206dc04086a218b510930739a6c573f2653ab0fa..3fe35f4ea24ed541e11986ce5ea48729 } } } -@@ -1309,7 +1309,7 @@ public class LevelChunk extends ChunkAccess { +@@ -1322,7 +1322,7 @@ public class LevelChunk extends ChunkAccess { ProfilerFiller gameprofilerfiller = LevelChunk.this.level.getProfiler(); gameprofilerfiller.push(this::getType); @@ -828,7 +836,7 @@ index 206dc04086a218b510930739a6c573f2653ab0fa..3fe35f4ea24ed541e11986ce5ea48729 BlockState iblockdata = LevelChunk.this.getBlockState(blockposition); if (this.blockEntity.getType().isValid(iblockdata)) { -@@ -1331,7 +1331,7 @@ public class LevelChunk extends ChunkAccess { +@@ -1344,7 +1344,7 @@ public class LevelChunk extends ChunkAccess { // Paper end // Spigot start } finally { @@ -915,10 +923,10 @@ index 138407c2d4b0bc55ddb9aac5d2aa3edadda090fb..a6e9e503a496c18e2501b03ec84f4600 // Paper end - add timings for scoreboard search } diff --git a/src/main/java/org/spigotmc/ActivationRange.java b/src/main/java/org/spigotmc/ActivationRange.java -index 8a846e821f763f0c47ca43376d857cdc0ada763c..8fc2a9942875d38bc0e6ff021e6458f5b9239715 100644 +index 00744aceb25ddc689b8c5ed90ae27e1ea28057ad..665625c69b93a2568b1f2218a0db39da435d8c99 100644 --- a/src/main/java/org/spigotmc/ActivationRange.java +++ b/src/main/java/org/spigotmc/ActivationRange.java -@@ -166,7 +166,7 @@ public class ActivationRange +@@ -170,7 +170,7 @@ public class ActivationRange */ public static void activateEntities(Level world) { @@ -927,7 +935,7 @@ index 8a846e821f763f0c47ca43376d857cdc0ada763c..8fc2a9942875d38bc0e6ff021e6458f5 final int miscActivationRange = world.spigotConfig.miscActivationRange; final int raiderActivationRange = world.spigotConfig.raiderActivationRange; final int animalActivationRange = world.spigotConfig.animalActivationRange; -@@ -221,7 +221,7 @@ public class ActivationRange +@@ -244,7 +244,7 @@ public class ActivationRange } // Paper end } diff --git a/patches/server/0275-Remove-Mojang-Profiler.patch b/patches/server/0277-Remove-Mojang-Profiler.patch similarity index 88% rename from patches/server/0275-Remove-Mojang-Profiler.patch rename to patches/server/0277-Remove-Mojang-Profiler.patch index e542c564e..7bbce24f1 100644 --- a/patches/server/0275-Remove-Mojang-Profiler.patch +++ b/patches/server/0277-Remove-Mojang-Profiler.patch @@ -39,10 +39,10 @@ index 314ab6183e31b4bac6a40c1f8007d48e9cab1760..6b05907bfec377e72a8858534d001bda return b0; diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java -index 7e6afc1f09bae9b9a52ca0fa3238bad6c406bef9..cb69dbf0261eee1f6d77e052ff474e0b142c356b 100644 +index 28f608a813ce155c4f075092b417d244738091e5..fc6ce3c622a7e7b6f061284d57af44f4a0dfa0d4 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java -@@ -340,13 +340,13 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop 0 && this.tickCount % autosavePeriod == 0; try { this.isSaving = true; -@@ -1444,7 +1444,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop 0; // Paper worldserver.hasRidableMoveEvent = org.purpurmc.purpur.event.entity.RidableMoveEvent.getHandlerList().getRegisteredListeners().length > 0; // Purpur @@ -192,7 +192,7 @@ index 7e6afc1f09bae9b9a52ca0fa3238bad6c406bef9..cb69dbf0261eee1f6d77e052ff474e0b try { //worldserver.timings.doTick.startTiming(); // Spigot // Purpur -@@ -1590,17 +1590,17 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop { this.executeBlocking(() -> { this.saveDebugReport(path.resolve("server")); -@@ -2536,40 +2536,40 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop> completablefuture = this.getChunkFutureMainThread(x, z, leastStatus, create, true); // Paper ServerChunkCache.MainThreadExecutor chunkproviderserver_b = this.mainThreadProcessor; -@@ -625,24 +625,24 @@ public class ServerChunkCache extends ChunkSource { +@@ -628,24 +628,24 @@ public class ServerChunkCache extends ChunkSource { // CraftBukkit start - modelled on below public void purgeUnload() { if (true) return; // Paper - tickets will be removed later, this behavior isn't really well accounted for by the chunk system @@ -471,7 +471,7 @@ index 2338be893b15eeecda336aea12803b7d2636f4be..105cdab3a1c912299dbcfb670ace810b if (tickChunks) { //this.level.timings.chunks.startTiming(); // Paper - timings // Purpur this.chunkMap.playerChunkManager.tick(); // Paper - this is mostly is to account for view distance changes -@@ -651,10 +651,10 @@ public class ServerChunkCache extends ChunkSource { +@@ -654,10 +654,10 @@ public class ServerChunkCache extends ChunkSource { } //this.level.timings.doChunkUnload.startTiming(); // Spigot // Purpur @@ -484,7 +484,7 @@ index 2338be893b15eeecda336aea12803b7d2636f4be..105cdab3a1c912299dbcfb670ace810b this.clearCache(); } -@@ -700,13 +700,13 @@ public class ServerChunkCache extends ChunkSource { +@@ -703,14 +703,14 @@ public class ServerChunkCache extends ChunkSource { } // Paper end - optimize isOutisdeRange LevelData worlddata = this.level.getLevelData(); @@ -493,6 +493,7 @@ index 2338be893b15eeecda336aea12803b7d2636f4be..105cdab3a1c912299dbcfb670ace810b - gameprofilerfiller.push("pollingChunks"); + //gameprofilerfiller.push("pollingChunks"); // Purpur + this.level.resetIceAndSnowTick(); // Pufferfish - reset ice & snow tick random int k = this.level.getGameRules().getInt(GameRules.RULE_RANDOMTICKING); boolean flag1 = level.ticksPerSpawnCategory.getLong(org.bukkit.entity.SpawnCategory.ANIMAL) != 0L && worlddata.getGameTime() % level.ticksPerSpawnCategory.getLong(org.bukkit.entity.SpawnCategory.ANIMAL) == 0L; // CraftBukkit @@ -501,10 +502,10 @@ index 2338be893b15eeecda336aea12803b7d2636f4be..105cdab3a1c912299dbcfb670ace810b //this.level.timings.countNaturalMobs.startTiming(); // Paper - timings // Purpur int l = this.distanceManager.getNaturalSpawnChunkCount(); // Paper start - per player mob spawning -@@ -724,13 +724,13 @@ public class ServerChunkCache extends ChunkSource { +@@ -735,13 +735,13 @@ public class ServerChunkCache extends ChunkSource { //this.level.timings.countNaturalMobs.stopTiming(); // Paper - timings // Purpur - this.lastSpawnState = spawnercreature_d; + //this.lastSpawnState = spawnercreature_d; // Pufferfish - this is managed asynchronously - gameprofilerfiller.popPush("filteringLoadedChunks"); + //gameprofilerfiller.popPush("filteringLoadedChunks"); // Purpur // Paper - moved down @@ -517,7 +518,7 @@ index 2338be893b15eeecda336aea12803b7d2636f4be..105cdab3a1c912299dbcfb670ace810b boolean flag2 = this.level.getGameRules().getBoolean(GameRules.RULE_DOMOBSPAWNING) && !this.level.players().isEmpty(); // CraftBukkit // Paper - only shuffle if per-player mob spawning is disabled -@@ -781,15 +781,15 @@ public class ServerChunkCache extends ChunkSource { +@@ -792,15 +792,15 @@ public class ServerChunkCache extends ChunkSource { } // Paper end - optimise chunk tick iteration //this.level.timings.chunkTicks.stopTiming(); // Paper // Purpur @@ -536,7 +537,7 @@ index 2338be893b15eeecda336aea12803b7d2636f4be..105cdab3a1c912299dbcfb670ace810b //this.level.timings.broadcastChunkUpdates.startTiming(); // Paper - timing // Purpur if (!this.chunkMap.needsChangeBroadcasting.isEmpty()) { ReferenceOpenHashSet copy = this.chunkMap.needsChangeBroadcasting.clone(); -@@ -803,7 +803,7 @@ public class ServerChunkCache extends ChunkSource { +@@ -814,7 +814,7 @@ public class ServerChunkCache extends ChunkSource { } } //this.level.timings.broadcastChunkUpdates.stopTiming(); // Paper - timing // Purpur @@ -545,7 +546,7 @@ index 2338be893b15eeecda336aea12803b7d2636f4be..105cdab3a1c912299dbcfb670ace810b // Paper end - use set of chunks requiring updates, rather than iterating every single one loaded // Paper start - controlled flush for entity tracker packets List disabledFlushes = new java.util.ArrayList<>(this.level.players.size()); -@@ -994,7 +994,7 @@ public class ServerChunkCache extends ChunkSource { +@@ -1029,7 +1029,7 @@ public class ServerChunkCache extends ChunkSource { @Override protected void doRunTask(Runnable task) { @@ -555,7 +556,7 @@ index 2338be893b15eeecda336aea12803b7d2636f4be..105cdab3a1c912299dbcfb670ace810b } diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java -index 752a298e96e75580ec7eef14cc7eab964f57414c..69ba84de4880a579c400b6daefdb98b44e9e28e8 100644 +index 74ab15db63acae728a55ad2cde40ae9bfa3003f3..43bf3285729ec5cedb3de84f2b60673928b079db 100644 --- a/src/main/java/net/minecraft/server/level/ServerLevel.java +++ b/src/main/java/net/minecraft/server/level/ServerLevel.java @@ -654,12 +654,12 @@ public class ServerLevel extends Level implements WorldGenLevel { @@ -631,7 +632,7 @@ index 752a298e96e75580ec7eef14cc7eab964f57414c..69ba84de4880a579c400b6daefdb98b4 } org.spigotmc.ActivationRange.activateEntities(this); // Spigot -@@ -734,9 +734,9 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -735,9 +735,9 @@ public class ServerLevel extends Level implements WorldGenLevel { if (false && this.shouldDiscardEntity(entity)) { // CraftBukkit - We prevent spawning in general, so this butchering is not needed entity.discard(); } else { @@ -643,13 +644,19 @@ index 752a298e96e75580ec7eef14cc7eab964f57414c..69ba84de4880a579c400b6daefdb98b4 if (true || this.chunkSource.chunkMap.getDistanceManager().inEntityTickingRange(entity.chunkPosition().toLong())) { // Paper - now always true if in the ticking list Entity entity1 = entity.getVehicle(); -@@ -748,22 +748,21 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -749,7 +749,7 @@ public class ServerLevel extends Level implements WorldGenLevel { entity.stopRiding(); } - gameprofilerfiller.push("tick"); + //gameprofilerfiller.push("tick"); // Purpur - this.guardEntityTick(this::tickNonPassenger, entity); + // Pufferfish start - copied from this.guardEntityTick + try { + this.tickNonPassenger(entity); // Pufferfish - changed +@@ -764,20 +764,19 @@ public class ServerLevel extends Level implements WorldGenLevel { + // Paper end + } + // Pufferfish end - gameprofilerfiller.pop(); + //gameprofilerfiller.pop(); // Purpur } @@ -670,7 +677,7 @@ index 752a298e96e75580ec7eef14cc7eab964f57414c..69ba84de4880a579c400b6daefdb98b4 } @Override -@@ -843,9 +842,9 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -859,9 +858,9 @@ public class ServerLevel extends Level implements WorldGenLevel { boolean flag = this.isRaining(); int j = chunkcoordintpair.getMinBlockX(); int k = chunkcoordintpair.getMinBlockZ(); @@ -681,8 +688,8 @@ index 752a298e96e75580ec7eef14cc7eab964f57414c..69ba84de4880a579c400b6daefdb98b4 + //gameprofilerfiller.push("thunder"); // Purpur final BlockPos.MutableBlockPos blockposition = this.chunkTickMutablePosition; // Paper - use mutable to reduce allocation rate, final to force compile fail on change - if (!this.paperConfig().environment.disableThunder && flag && this.isThundering() && this.spigotConfig.thunderChance > 0 && this.random.nextInt(this.spigotConfig.thunderChance) == 0) { // Spigot // Paper - disable thunder -@@ -883,7 +882,7 @@ public class ServerLevel extends Level implements WorldGenLevel { + if (!this.paperConfig().environment.disableThunder && flag && this.isThundering() && this.spigotConfig.thunderChance > 0 && /*this.random.nextInt(this.spigotConfig.thunderChance) == 0 &&*/ chunk.shouldDoLightning(this.random)) { // Spigot // Paper - disable thunder // Pufferfish - replace random with shouldDoLightning +@@ -899,7 +898,7 @@ public class ServerLevel extends Level implements WorldGenLevel { } } @@ -690,8 +697,8 @@ index 752a298e96e75580ec7eef14cc7eab964f57414c..69ba84de4880a579c400b6daefdb98b4 + //gameprofilerfiller.popPush("iceandsnow"); // Purpur int l; - if (!this.paperConfig().environment.disableIceAndSnow && this.random.nextInt(16) == 0) { // Paper - Disable ice and snow -@@ -934,7 +933,7 @@ public class ServerLevel extends Level implements WorldGenLevel { + if (!this.paperConfig().environment.disableIceAndSnow && (this.currentIceAndSnowTick++ & 15) == 0) { // Paper - Disable ice and snow // Paper - optimise random ticking // Pufferfish - optimize further random ticking +@@ -950,7 +949,7 @@ public class ServerLevel extends Level implements WorldGenLevel { } // Paper start - optimise random block ticking @@ -700,7 +707,7 @@ index 752a298e96e75580ec7eef14cc7eab964f57414c..69ba84de4880a579c400b6daefdb98b4 //timings.chunkTicksBlocks.startTiming(); // Paper // Purpur if (randomTickSpeed > 0) { LevelChunkSection[] sections = chunk.getSections(); -@@ -970,7 +969,7 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -986,7 +985,7 @@ public class ServerLevel extends Level implements WorldGenLevel { } // Paper end - optimise random block ticking //timings.chunkTicksBlocks.stopTiming(); // Paper // Purpur @@ -709,7 +716,7 @@ index 752a298e96e75580ec7eef14cc7eab964f57414c..69ba84de4880a579c400b6daefdb98b4 } public Optional findLightningRod(BlockPos pos) { -@@ -1266,19 +1265,19 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -1282,19 +1281,19 @@ public class ServerLevel extends Level implements WorldGenLevel { //try { // Purpur // Paper end - timings entity.setOldPosAndRot(); @@ -734,7 +741,7 @@ index 752a298e96e75580ec7eef14cc7eab964f57414c..69ba84de4880a579c400b6daefdb98b4 //} finally { timer.stopTiming(); } // Paper - timings // Purpur Iterator iterator = entity.getPassengers().iterator(); -@@ -1307,12 +1306,12 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -1323,12 +1322,12 @@ public class ServerLevel extends Level implements WorldGenLevel { // Paper end passenger.setOldPosAndRot(); ++passenger.tickCount; @@ -751,7 +758,7 @@ index 752a298e96e75580ec7eef14cc7eab964f57414c..69ba84de4880a579c400b6daefdb98b4 // Paper start - EAR 2 if (isActive) { passenger.rideTick(); -@@ -1324,7 +1323,7 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -1340,7 +1339,7 @@ public class ServerLevel extends Level implements WorldGenLevel { vehicle.positionRider(passenger); } // Paper end - EAR 2 @@ -794,7 +801,7 @@ index 087fd880ec62fed20383ef665b4f4d2e4aa882c7..ef56e8e8496443c85474bfc98a71518f this.connection.send(new ClientboundPlayerAbilitiesPacket(this.getAbilities())); playerlist.sendLevelInfo(this, worldserver); diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -index c904c50eb44be76293727f203b3abd5d220d8a31..d6305552fee6d849dd1dbc2603b584bd8d957a5f 100644 +index 9cfe9f137a20a15af87d48fef0f7ee48400026ac..c7f8f15f8982b8514ee0ca0871a6934cdccd8d29 100644 --- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java +++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java @@ -407,7 +407,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic @@ -1020,19 +1027,19 @@ index 2e6e8eac987c4ef6b2dcd3de592d8a51d2b29792..863343a87fe34d72f04af89d75268b47 }; } diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java -index b7f1dad5ffe5a0f5d337fbe39345242940b82e4b..ffe329e624b4d7db6c2b6f49f31093ab02116214 100644 +index 1a918da8b04a463bcce9359c8053b8fb4eeaacb8..c88eda6be7ffe312a2efd90eae85bc7fbc5397ef 100644 --- a/src/main/java/net/minecraft/world/entity/Entity.java +++ b/src/main/java/net/minecraft/world/entity/Entity.java -@@ -789,7 +789,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { - // CraftBukkit end - - public void baseTick() { +@@ -823,7 +823,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { + return; + } + // Pufferfish end - entity TTL - this.level.getProfiler().push("entityBaseTick"); + //this.level.getProfiler().push("entityBaseTick"); // Purpur if (firstTick && this instanceof net.minecraft.world.entity.NeutralMob neutralMob) neutralMob.tickInitialPersistentAnger(level); // Paper - Update last hurt when ticking this.feetBlockState = null; if (this.isPassenger() && this.getVehicle().isRemoved()) { -@@ -850,7 +850,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { +@@ -884,7 +884,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { } this.firstTick = false; @@ -1041,7 +1048,7 @@ index b7f1dad5ffe5a0f5d337fbe39345242940b82e4b..ffe329e624b4d7db6c2b6f49f31093ab } public void setSharedFlagOnFire(boolean onFire) { -@@ -1024,7 +1024,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { +@@ -1058,7 +1058,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { } } @@ -1050,7 +1057,7 @@ index b7f1dad5ffe5a0f5d337fbe39345242940b82e4b..ffe329e624b4d7db6c2b6f49f31093ab if (this.stuckSpeedMultiplier.lengthSqr() > 1.0E-7D) { movement = movement.multiply(this.stuckSpeedMultiplier); this.stuckSpeedMultiplier = Vec3.ZERO; -@@ -1033,7 +1033,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { +@@ -1067,7 +1067,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { // Paper start - ignore movement changes while inactive. if (isTemporarilyActive && !(this instanceof ItemEntity || this instanceof net.minecraft.world.entity.vehicle.AbstractMinecart) && movement == getDeltaMovement() && movementType == MoverType.SELF) { setDeltaMovement(Vec3.ZERO); @@ -1059,7 +1066,7 @@ index b7f1dad5ffe5a0f5d337fbe39345242940b82e4b..ffe329e624b4d7db6c2b6f49f31093ab return; } // Paper end -@@ -1054,8 +1054,8 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { +@@ -1088,8 +1088,8 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { this.setPos(this.getX() + vec3d1.x, this.getY() + vec3d1.y, this.getZ() + vec3d1.z); } @@ -1070,7 +1077,7 @@ index b7f1dad5ffe5a0f5d337fbe39345242940b82e4b..ffe329e624b4d7db6c2b6f49f31093ab boolean flag = !Mth.equal(movement.x, vec3d1.x); boolean flag1 = !Mth.equal(movement.z, vec3d1.z); -@@ -1074,7 +1074,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { +@@ -1108,7 +1108,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { this.checkFallDamage(vec3d1.y, this.onGround, iblockdata, blockposition); if (this.isRemoved()) { @@ -1079,7 +1086,7 @@ index b7f1dad5ffe5a0f5d337fbe39345242940b82e4b..ffe329e624b4d7db6c2b6f49f31093ab } else { if (this.horizontalCollision) { Vec3 vec3d2 = this.getDeltaMovement(); -@@ -1215,7 +1215,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { +@@ -1249,7 +1249,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { this.setRemainingFireTicks(-this.getFireImmuneTicks()); } @@ -1088,7 +1095,7 @@ index b7f1dad5ffe5a0f5d337fbe39345242940b82e4b..ffe329e624b4d7db6c2b6f49f31093ab } } // Paper start - detailed watchdog information -@@ -2929,7 +2929,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { +@@ -2963,7 +2963,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { ServerLevel worldserver1 = minecraftserver.getLevel(resourcekey); if (true && !this.isPassenger() && this.portalTime++ >= i) { // CraftBukkit @@ -1097,7 +1104,7 @@ index b7f1dad5ffe5a0f5d337fbe39345242940b82e4b..ffe329e624b4d7db6c2b6f49f31093ab this.portalTime = i; // Paper start io.papermc.paper.event.entity.EntityPortalReadyEvent event = new io.papermc.paper.event.entity.EntityPortalReadyEvent(this.getBukkitEntity(), worldserver1 == null ? null : worldserver1.getWorld(), org.bukkit.PortalType.NETHER); -@@ -2947,7 +2947,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { +@@ -2981,7 +2981,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { } } // Paper // CraftBukkit end @@ -1106,7 +1113,7 @@ index b7f1dad5ffe5a0f5d337fbe39345242940b82e4b..ffe329e624b4d7db6c2b6f49f31093ab } this.isInsidePortal = false; -@@ -3414,14 +3414,14 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { +@@ -3448,14 +3448,14 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { } // Paper end if (this.level instanceof ServerLevel && !this.isRemoved()) { @@ -1123,7 +1130,7 @@ index b7f1dad5ffe5a0f5d337fbe39345242940b82e4b..ffe329e624b4d7db6c2b6f49f31093ab PortalInfo shapedetectorshape = (location == null) ? this.findDimensionEntryPoint(worldserver) : new PortalInfo(new Vec3(location.x(), location.y(), location.z()), Vec3.ZERO, this.yRot, this.xRot, worldserver, null); // CraftBukkit if (shapedetectorshape == null) { -@@ -3455,7 +3455,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { +@@ -3489,7 +3489,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { this.unRide(); // CraftBukkit end @@ -1132,7 +1139,7 @@ index b7f1dad5ffe5a0f5d337fbe39345242940b82e4b..ffe329e624b4d7db6c2b6f49f31093ab // Paper start - Change lead drop timing to prevent dupe if (this instanceof Mob) { ((Mob) this).dropLeash(true, true); // Paper drop lead -@@ -3478,10 +3478,10 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { +@@ -3512,10 +3512,10 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { } this.removeAfterChangingDimensions(); @@ -1146,10 +1153,10 @@ index b7f1dad5ffe5a0f5d337fbe39345242940b82e4b..ffe329e624b4d7db6c2b6f49f31093ab } } else { diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java -index ed46721bd5d6802bb74a7c478c411d964e6aa9a2..13279cc07ceb45f5c04dfac838a639eb0fbe2130 100644 +index fe68a9e0cf53c4a8c3411123521e71a482e3ced9..79925dcc3dec57bae886263a804de28e2bd6ad72 100644 --- a/src/main/java/net/minecraft/world/entity/LivingEntity.java +++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java -@@ -394,7 +394,7 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -393,7 +393,7 @@ public abstract class LivingEntity extends Entity implements Attackable { } super.baseTick(); @@ -1158,7 +1165,7 @@ index ed46721bd5d6802bb74a7c478c411d964e6aa9a2..13279cc07ceb45f5c04dfac838a639eb if (this.fireImmune() || this.level.isClientSide) { this.clearFire(); } -@@ -497,7 +497,7 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -496,7 +496,7 @@ public abstract class LivingEntity extends Entity implements Attackable { this.yHeadRotO = this.yHeadRot; this.yRotO = this.getYRot(); this.xRotO = this.getXRot(); @@ -1167,7 +1174,7 @@ index ed46721bd5d6802bb74a7c478c411d964e6aa9a2..13279cc07ceb45f5c04dfac838a639eb } public boolean canSpawnSoulSpeedParticle() { -@@ -3070,10 +3070,10 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -3092,10 +3092,10 @@ public abstract class LivingEntity extends Entity implements Attackable { } this.run += (f3 - this.run) * 0.3F; @@ -1181,7 +1188,7 @@ index ed46721bd5d6802bb74a7c478c411d964e6aa9a2..13279cc07ceb45f5c04dfac838a639eb // Paper start - stop large pitch and yaw changes from crashing the server this.yRotO += Math.round((this.getYRot() - this.yRotO) / 360.0F) * 360.0F; -@@ -3085,7 +3085,7 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -3107,7 +3107,7 @@ public abstract class LivingEntity extends Entity implements Attackable { this.yHeadRotO += Math.round((this.yHeadRot - this.yHeadRotO) / 360.0F) * 360.0F; // Paper end @@ -1190,7 +1197,7 @@ index ed46721bd5d6802bb74a7c478c411d964e6aa9a2..13279cc07ceb45f5c04dfac838a639eb this.animStep += f2; if (this.isFallFlying()) { ++this.fallFlyTicks; -@@ -3374,19 +3374,19 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -3396,19 +3396,19 @@ public abstract class LivingEntity extends Entity implements Attackable { } this.setDeltaMovement(d4, d5, d6); @@ -1215,7 +1222,7 @@ index ed46721bd5d6802bb74a7c478c411d964e6aa9a2..13279cc07ceb45f5c04dfac838a639eb if (this.jumping && this.isAffectedByFluids()) { double d7; -@@ -3413,8 +3413,8 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -3435,8 +3435,8 @@ public abstract class LivingEntity extends Entity implements Attackable { this.noJumpDelay = 0; } @@ -1226,7 +1233,7 @@ index ed46721bd5d6802bb74a7c478c411d964e6aa9a2..13279cc07ceb45f5c04dfac838a639eb this.xxa *= 0.98F; this.zza *= 0.98F; this.updateFallFlying(); -@@ -3430,8 +3430,8 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -3452,8 +3452,8 @@ public abstract class LivingEntity extends Entity implements Attackable { } //SpigotTimings.timerEntityAIMove.stopTiming(); // Spigot // Paper @@ -1237,7 +1244,7 @@ index ed46721bd5d6802bb74a7c478c411d964e6aa9a2..13279cc07ceb45f5c04dfac838a639eb if (!this.level.isClientSide && !this.isDeadOrDying() && !freezeLocked) { // Paper - Freeze Tick Lock API int i = this.getTicksFrozen(); -@@ -3448,15 +3448,15 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -3470,15 +3470,15 @@ public abstract class LivingEntity extends Entity implements Attackable { this.hurt(this.damageSources().freeze(), 1.0F); } @@ -1257,10 +1264,10 @@ index ed46721bd5d6802bb74a7c478c411d964e6aa9a2..13279cc07ceb45f5c04dfac838a639eb // Purpur start if (this.xo != this.getX() || this.yo != this.getY() || this.zo != this.getZ() || this.yRotO != this.getYRot() || this.xRotO != this.getXRot()) { diff --git a/src/main/java/net/minecraft/world/entity/Mob.java b/src/main/java/net/minecraft/world/entity/Mob.java -index 4ec17daac1b4dc1dc6a4dfe22d37ff87c6feb8fe..a56cec72ab0df3e655fc05ad59e1e0ad9794a9b2 100644 +index bf5705551720d338ee0b790504727685b1f8f026..141b25060905f598208cb1a39f4c2b2e9f3ef766 100644 --- a/src/main/java/net/minecraft/world/entity/Mob.java +++ b/src/main/java/net/minecraft/world/entity/Mob.java -@@ -360,14 +360,14 @@ public abstract class Mob extends LivingEntity implements Targeting { +@@ -362,14 +362,14 @@ public abstract class Mob extends LivingEntity implements Targeting { @Override public void baseTick() { super.baseTick(); @@ -1277,7 +1284,7 @@ index 4ec17daac1b4dc1dc6a4dfe22d37ff87c6feb8fe..a56cec72ab0df3e655fc05ad59e1e0ad } // Purpur start -@@ -697,7 +697,7 @@ public abstract class Mob extends LivingEntity implements Targeting { +@@ -699,7 +699,7 @@ public abstract class Mob extends LivingEntity implements Targeting { @Override public void aiStep() { super.aiStep(); @@ -1286,7 +1293,7 @@ index 4ec17daac1b4dc1dc6a4dfe22d37ff87c6feb8fe..a56cec72ab0df3e655fc05ad59e1e0ad if (!this.level.isClientSide && this.canPickUpLoot() && this.isAlive() && !this.dead && (this.level.purpurConfig.entitiesPickUpLootBypassMobGriefing || this.level.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING))) { Vec3i baseblockposition = this.getPickupReach(); List list = this.level.getEntitiesOfClass(ItemEntity.class, this.getBoundingBox().inflate((double) baseblockposition.getX(), (double) baseblockposition.getY(), (double) baseblockposition.getZ())); -@@ -717,7 +717,7 @@ public abstract class Mob extends LivingEntity implements Targeting { +@@ -719,7 +719,7 @@ public abstract class Mob extends LivingEntity implements Targeting { } } @@ -1295,7 +1302,7 @@ index 4ec17daac1b4dc1dc6a4dfe22d37ff87c6feb8fe..a56cec72ab0df3e655fc05ad59e1e0ad } protected Vec3i getPickupReach() { -@@ -929,42 +929,42 @@ public abstract class Mob extends LivingEntity implements Targeting { +@@ -931,46 +931,46 @@ public abstract class Mob extends LivingEntity implements Targeting { return; } // Paper end @@ -1309,22 +1316,25 @@ index 4ec17daac1b4dc1dc6a4dfe22d37ff87c6feb8fe..a56cec72ab0df3e655fc05ad59e1e0ad if (i % 2 != 0 && this.tickCount > 1) { - this.level.getProfiler().push("targetSelector"); + //this.level.getProfiler().push("targetSelector"); // Purpur + if (this.targetSelector.inactiveTick(this.activatedPriority, false)) // Pufferfish - use this to alternate ticking this.targetSelector.tickRunningGoals(false); - this.level.getProfiler().pop(); - this.level.getProfiler().push("goalSelector"); + //this.level.getProfiler().pop(); // Purpur + //this.level.getProfiler().push("goalSelector"); // Purpur + if (this.goalSelector.inactiveTick(this.activatedPriority, false)) // Pufferfish - use this to alternate ticking this.goalSelector.tickRunningGoals(false); - this.level.getProfiler().pop(); + //this.level.getProfiler().pop(); // Purpur } else { -- this.level.getProfiler().push("targetSelector"); -+ //this.level.getProfiler().push("targetSelector"); // Purpur + this.level.getProfiler().push("targetSelector"); + if (this.targetSelector.inactiveTick(this.activatedPriority, false)) // Pufferfish - use this to alternate ticking this.targetSelector.tick(); - this.level.getProfiler().pop(); - this.level.getProfiler().push("goalSelector"); + //this.level.getProfiler().pop(); // Purpur + //this.level.getProfiler().push("goalSelector"); // Purpur + if (this.goalSelector.inactiveTick(this.activatedPriority, false)) // Pufferfish - use this to alternate ticking this.goalSelector.tick(); - this.level.getProfiler().pop(); + //this.level.getProfiler().pop(); // Purpur @@ -1359,10 +1369,10 @@ index 4ec17daac1b4dc1dc6a4dfe22d37ff87c6feb8fe..a56cec72ab0df3e655fc05ad59e1e0ad } diff --git a/src/main/java/net/minecraft/world/entity/ai/goal/GoalSelector.java b/src/main/java/net/minecraft/world/entity/ai/goal/GoalSelector.java -index b738ee2d3801fadfd09313f05ae24593e56b0ec6..8a70bc63e12838f45fa3eade74f2899438715886 100644 +index 1635818fc4b1788c0d397085239df6dd75b210ab..02978315bc2b828cc603ce7478408f3f82c249c2 100644 --- a/src/main/java/net/minecraft/world/entity/ai/goal/GoalSelector.java +++ b/src/main/java/net/minecraft/world/entity/ai/goal/GoalSelector.java -@@ -102,8 +102,8 @@ public class GoalSelector { +@@ -105,8 +105,8 @@ public class GoalSelector { } public void tick() { @@ -1373,7 +1383,7 @@ index b738ee2d3801fadfd09313f05ae24593e56b0ec6..8a70bc63e12838f45fa3eade74f28994 for(WrappedGoal wrappedGoal : this.availableGoals) { if (wrappedGoal.isRunning() && (goalContainsAnyFlags(wrappedGoal, this.goalTypes) || !wrappedGoal.canContinueToUse())) { -@@ -120,8 +120,8 @@ public class GoalSelector { +@@ -123,8 +123,8 @@ public class GoalSelector { } } @@ -1384,7 +1394,7 @@ index b738ee2d3801fadfd09313f05ae24593e56b0ec6..8a70bc63e12838f45fa3eade74f28994 for(WrappedGoal wrappedGoal2 : this.availableGoals) { // Paper start -@@ -141,13 +141,13 @@ public class GoalSelector { +@@ -144,13 +144,13 @@ public class GoalSelector { } } @@ -1401,7 +1411,7 @@ index b738ee2d3801fadfd09313f05ae24593e56b0ec6..8a70bc63e12838f45fa3eade74f28994 for(WrappedGoal wrappedGoal : this.availableGoals) { if (wrappedGoal.isRunning() && (tickAll || wrappedGoal.requiresUpdateEveryTick())) { -@@ -155,7 +155,7 @@ public class GoalSelector { +@@ -158,7 +158,7 @@ public class GoalSelector { } } @@ -1446,15 +1456,16 @@ index 288c6627906d07c0d223eacd84ae4eb31a349998..9babe636176da3c40598eb5bdac0919a this.seen.add(i); } else { diff --git a/src/main/java/net/minecraft/world/entity/animal/allay/Allay.java b/src/main/java/net/minecraft/world/entity/animal/allay/Allay.java -index 4e9f4bddaf9221c02e5dc127aa796a24c83ed8f7..afbce4fdece213e456ef4e993f07bfb448bb2dd1 100644 +index c743f487b7a327ee66cffc86cbe5d13c81fd2cab..1c136aa0d6dcad18b5e6e2084d2c166105d54a3a 100644 --- a/src/main/java/net/minecraft/world/entity/animal/allay/Allay.java +++ b/src/main/java/net/minecraft/world/entity/animal/allay/Allay.java -@@ -260,12 +260,12 @@ public class Allay extends PathfinderMob implements InventoryCarrier { - +@@ -261,13 +261,13 @@ public class Allay extends PathfinderMob implements InventoryCarrier { + private int behaviorTick = 0; // Pufferfish @Override protected void customServerAiStep() { - this.level.getProfiler().push("allayBrain"); + //this.level.getProfiler().push("allayBrain"); // Purpur + if (this.behaviorTick++ % this.activatedPriority == 0) // Pufferfish this.getBrain().tick((ServerLevel) this.level, this); - this.level.getProfiler().pop(); - this.level.getProfiler().push("allayActivityUpdate"); @@ -1467,15 +1478,16 @@ index 4e9f4bddaf9221c02e5dc127aa796a24c83ed8f7..afbce4fdece213e456ef4e993f07bfb4 } diff --git a/src/main/java/net/minecraft/world/entity/animal/axolotl/Axolotl.java b/src/main/java/net/minecraft/world/entity/animal/axolotl/Axolotl.java -index d61d9a7e7fa4d360dc740fdcb31efd028452fe61..e46105d1d15b4f8d24f726cc75be3020a5770c5c 100644 +index ca559f1871abaee97fe488a2c57b5247f5a161fb..18ce5389040b516a7061d2d8e104f400183fdeec 100644 --- a/src/main/java/net/minecraft/world/entity/animal/axolotl/Axolotl.java +++ b/src/main/java/net/minecraft/world/entity/animal/axolotl/Axolotl.java -@@ -324,12 +324,12 @@ public class Axolotl extends Animal implements LerpingModel, VariantHolder optional = this.getBrain().getMemory(MemoryModuleType.PLAY_DEAD_TICKS); diff --git a/src/main/java/net/minecraft/world/entity/animal/camel/Camel.java b/src/main/java/net/minecraft/world/entity/animal/camel/Camel.java -index bda7a0e29e40386c57766c224ffb8938d33447e8..450bbceb12b8edf48afc3512fad33a4952298791 100644 +index a66f77ec5cb5a2b9f6944c2a747b22d8f89e9cb7..31922ac1139f34e0da61a719e3645c1aaa188890 100644 --- a/src/main/java/net/minecraft/world/entity/animal/camel/Camel.java +++ b/src/main/java/net/minecraft/world/entity/animal/camel/Camel.java @@ -156,13 +156,13 @@ public class Camel extends AbstractHorse implements PlayerRideableJumping, Rider @@ -1510,15 +1522,16 @@ index bda7a0e29e40386c57766c224ffb8938d33447e8..450bbceb12b8edf48afc3512fad33a49 } diff --git a/src/main/java/net/minecraft/world/entity/animal/frog/Frog.java b/src/main/java/net/minecraft/world/entity/animal/frog/Frog.java -index 61c604a05eedb1928bdac8c8544b0cad074f29ee..695b4fa27fc989ead95e4c46d9305a62f17487fa 100644 +index 84de3dc9695eb857874cb60940049a978222c9ad..c355aaed76663d37a5da8b2f49f9808828b4ef9b 100644 --- a/src/main/java/net/minecraft/world/entity/animal/frog/Frog.java +++ b/src/main/java/net/minecraft/world/entity/animal/frog/Frog.java -@@ -222,12 +222,12 @@ public class Frog extends Animal implements VariantHolder { - +@@ -223,13 +223,13 @@ public class Frog extends Animal implements VariantHolder { + private int behaviorTick = 0; // Pufferfish @Override protected void customServerAiStep() { - this.level.getProfiler().push("frogBrain"); + //this.level.getProfiler().push("frogBrain"); // Purpur + if (this.behaviorTick++ % this.activatedPriority == 0) // Pufferfish this.getBrain().tick((ServerLevel)this.level, this); - this.level.getProfiler().pop(); - this.level.getProfiler().push("frogActivityUpdate"); @@ -1531,15 +1544,16 @@ index 61c604a05eedb1928bdac8c8544b0cad074f29ee..695b4fa27fc989ead95e4c46d9305a62 } diff --git a/src/main/java/net/minecraft/world/entity/animal/frog/Tadpole.java b/src/main/java/net/minecraft/world/entity/animal/frog/Tadpole.java -index f12bd0227af77bec164f2938957c0c8100be9d03..16cc27ad7c152c5ea0854ba095a72ea3de64eb7e 100644 +index 63553436193cc3063cd4c4e9f50695fb5209ff9d..aadc6743deb195ac3368548a75be641ffd3da404 100644 --- a/src/main/java/net/minecraft/world/entity/animal/frog/Tadpole.java +++ b/src/main/java/net/minecraft/world/entity/animal/frog/Tadpole.java -@@ -116,12 +116,12 @@ public class Tadpole extends AbstractFish { - +@@ -117,13 +117,13 @@ public class Tadpole extends AbstractFish { + private int behaviorTick = 0; // Pufferfish @Override protected void customServerAiStep() { - this.level.getProfiler().push("tadpoleBrain"); + //this.level.getProfiler().push("tadpoleBrain"); // Purpur + if (this.behaviorTick++ % this.activatedPriority == 0) // Pufferfish this.getBrain().tick((ServerLevel) this.level, this); - this.level.getProfiler().pop(); - this.level.getProfiler().push("tadpoleActivityUpdate"); @@ -1552,16 +1566,16 @@ index f12bd0227af77bec164f2938957c0c8100be9d03..16cc27ad7c152c5ea0854ba095a72ea3 } diff --git a/src/main/java/net/minecraft/world/entity/animal/goat/Goat.java b/src/main/java/net/minecraft/world/entity/animal/goat/Goat.java -index f61843b76ad0dd50ed0ccaaf5f83a0c63e460343..5229a5af3ba875247db0228fef290f764b3c8b2c 100644 +index cb55b8479f8874ff2fa0941e277c4891cf3fe8d9..8129ad2ca6e0b4c6ca586dc221dcce1e883def9b 100644 --- a/src/main/java/net/minecraft/world/entity/animal/goat/Goat.java +++ b/src/main/java/net/minecraft/world/entity/animal/goat/Goat.java -@@ -222,13 +222,14 @@ public class Goat extends Animal { - +@@ -223,13 +223,14 @@ public class Goat extends Animal { + private int behaviorTick = 0; // Pufferfish @Override protected void customServerAiStep() { - this.level.getProfiler().push("goatBrain"); + //this.level.getProfiler().push("goatBrain"); // Purpur - if ((getRider() == null || !this.isControllable())/* && this.behaviorTick++ % this.activatedPriority == 0*/) // Pufferfish // Purpur - only use brain if no rider TODO: uncomment when including Pufferfish + if ((getRider() == null || !this.isControllable()) && this.behaviorTick++ % this.activatedPriority == 0) // Pufferfish // Purpur - only use brain if no rider this.getBrain().tick((ServerLevel) this.level, this); - this.level.getProfiler().pop(); - this.level.getProfiler().push("goatActivityUpdate"); @@ -1575,7 +1589,7 @@ index f61843b76ad0dd50ed0ccaaf5f83a0c63e460343..5229a5af3ba875247db0228fef290f76 } diff --git a/src/main/java/net/minecraft/world/entity/animal/sniffer/Sniffer.java b/src/main/java/net/minecraft/world/entity/animal/sniffer/Sniffer.java -index 12aab69aca179717ea2a2ac04e28a78eff98af20..b04fed9d827d195fb8c014b99ccc677a15726d44 100644 +index f5d2f12c2a95c274823ec37ac1c14a54a48a9cdc..0c5efd0b364e4c1f510d30094757ddb7dc979a68 100644 --- a/src/main/java/net/minecraft/world/entity/animal/sniffer/Sniffer.java +++ b/src/main/java/net/minecraft/world/entity/animal/sniffer/Sniffer.java @@ -462,11 +462,11 @@ public class Sniffer extends Animal { @@ -1594,7 +1608,7 @@ index 12aab69aca179717ea2a2ac04e28a78eff98af20..b04fed9d827d195fb8c014b99ccc677a } diff --git a/src/main/java/net/minecraft/world/entity/monster/Zoglin.java b/src/main/java/net/minecraft/world/entity/monster/Zoglin.java -index af31d334485139ef06bc534484a69f720ed1b5cf..d5cc573bd73a241594bd6c0505821ec10acf9b3d 100644 +index d7b76ae05754e0ccbddb4bfd5f545b9e0ca6c3a1..052eac2c63ecaa052c9fe6ea3d3d1000da8a33fa 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Zoglin.java +++ b/src/main/java/net/minecraft/world/entity/monster/Zoglin.java @@ -230,10 +230,10 @@ public class Zoglin extends Monster implements Enemy, HoglinBase { @@ -1611,16 +1625,16 @@ index af31d334485139ef06bc534484a69f720ed1b5cf..d5cc573bd73a241594bd6c0505821ec1 } diff --git a/src/main/java/net/minecraft/world/entity/monster/hoglin/Hoglin.java b/src/main/java/net/minecraft/world/entity/monster/hoglin/Hoglin.java -index 92685decf4ed1c9f673cf607458788c2f807d626..d3524004f447fff9b091f03b8fe18f6656b98313 100644 +index f03b8721991810c50887e24171a45d8f37fea446..63ffb8c04f1408d028af086ba907551a05b96e72 100644 --- a/src/main/java/net/minecraft/world/entity/monster/hoglin/Hoglin.java +++ b/src/main/java/net/minecraft/world/entity/monster/hoglin/Hoglin.java -@@ -165,10 +165,10 @@ public class Hoglin extends Animal implements Enemy, HoglinBase { - +@@ -166,10 +166,10 @@ public class Hoglin extends Animal implements Enemy, HoglinBase { + private int behaviorTick; // Pufferfish @Override protected void customServerAiStep() { - this.level.getProfiler().push("hoglinBrain"); + //this.level.getProfiler().push("hoglinBrain"); // Purpur - if ((getRider() == null || !this.isControllable())/* && this.behaviorTick++ % this.activatedPriority == 0*/) // Pufferfish // Purpur - only use brain if no rider TODO: uncomment when including Pufferfish + if ((getRider() == null || !this.isControllable()) && this.behaviorTick++ % this.activatedPriority == 0) // Pufferfish // Purpur - only use brain if no rider this.getBrain().tick((ServerLevel)this.level, this); - this.level.getProfiler().pop(); + //this.level.getProfiler().pop(); // Purpur @@ -1628,16 +1642,16 @@ index 92685decf4ed1c9f673cf607458788c2f807d626..d3524004f447fff9b091f03b8fe18f66 if (this.isConverting()) { ++this.timeInOverworld; diff --git a/src/main/java/net/minecraft/world/entity/monster/piglin/Piglin.java b/src/main/java/net/minecraft/world/entity/monster/piglin/Piglin.java -index ff2c7610d39e50ffb548aa9a687d7973a1f17a35..e7528b55713c0719c1510856fd029bcf5c2b75c2 100644 +index 5ad6b780a0f8e27eb49c2606fed6dc3e73a30aaa..c8db72dbdaedddb712f20cf0e3a9c731312307a0 100644 --- a/src/main/java/net/minecraft/world/entity/monster/piglin/Piglin.java +++ b/src/main/java/net/minecraft/world/entity/monster/piglin/Piglin.java -@@ -342,10 +342,10 @@ public class Piglin extends AbstractPiglin implements CrossbowAttackMob, Invento - +@@ -343,10 +343,10 @@ public class Piglin extends AbstractPiglin implements CrossbowAttackMob, Invento + private int behaviorTick; // Pufferfish @Override protected void customServerAiStep() { - this.level.getProfiler().push("piglinBrain"); + //this.level.getProfiler().push("piglinBrain"); // Purpur - if ((getRider() == null || !this.isControllable())/* && this.behaviorTick++ % this.activatedPriority == 0*/) // Pufferfish // Purpur - only use brain if no rider TODO: uncomment when including Pufferfish + if ((getRider() == null || !this.isControllable()) && this.behaviorTick++ % this.activatedPriority == 0) // Pufferfish // Purpur - only use brain if no rider this.getBrain().tick((ServerLevel) this.level, this); - this.level.getProfiler().pop(); + //this.level.getProfiler().pop(); // Purpur @@ -1645,7 +1659,7 @@ index ff2c7610d39e50ffb548aa9a687d7973a1f17a35..e7528b55713c0719c1510856fd029bcf super.customServerAiStep(); } diff --git a/src/main/java/net/minecraft/world/entity/monster/piglin/PiglinBrute.java b/src/main/java/net/minecraft/world/entity/monster/piglin/PiglinBrute.java -index b6165a1d513bea0d441289eb0df05ea866941bb3..061868ea8d7bb9825a2f097949e1430cf59dbf81 100644 +index 85592cffdd04bdab9b2d39cf168a5c920471ba7b..df4d1745c4957e564bab11d68a37178fdb398543 100644 --- a/src/main/java/net/minecraft/world/entity/monster/piglin/PiglinBrute.java +++ b/src/main/java/net/minecraft/world/entity/monster/piglin/PiglinBrute.java @@ -117,10 +117,10 @@ public class PiglinBrute extends AbstractPiglin { @@ -1662,15 +1676,16 @@ index b6165a1d513bea0d441289eb0df05ea866941bb3..061868ea8d7bb9825a2f097949e1430c PiglinBruteAi.maybePlayActivitySound(this); super.customServerAiStep(); diff --git a/src/main/java/net/minecraft/world/entity/monster/warden/Warden.java b/src/main/java/net/minecraft/world/entity/monster/warden/Warden.java -index a268f6a39b972f91ca04d6b0004efda4cf086e10..d72221ab3e6d92a1bb5b8303ce3152f8f15449d8 100644 +index f40806e7d9c08cf7b85215fbf0c66169eb4dc6ae..69e5b4b6c8d5725bc2fb7cd819219e4ff9df45bd 100644 --- a/src/main/java/net/minecraft/world/entity/monster/warden/Warden.java +++ b/src/main/java/net/minecraft/world/entity/monster/warden/Warden.java -@@ -298,9 +298,9 @@ public class Warden extends Monster implements VibrationListener.VibrationListen +@@ -299,10 +299,10 @@ public class Warden extends Monster implements VibrationListener.VibrationListen protected void customServerAiStep() { ServerLevel worldserver = (ServerLevel) this.level; - worldserver.getProfiler().push("wardenBrain"); + //worldserver.getProfiler().push("wardenBrain"); // Purpur + if (this.behaviorTick++ % this.activatedPriority == 0) // Pufferfish this.getBrain().tick(worldserver, this); - this.level.getProfiler().pop(); + //this.level.getProfiler().pop(); // Purpur @@ -1678,10 +1693,10 @@ index a268f6a39b972f91ca04d6b0004efda4cf086e10..d72221ab3e6d92a1bb5b8303ce3152f8 if ((this.tickCount + this.getId()) % 120 == 0) { Warden.applyDarknessAround(worldserver, this.position(), this, 20); diff --git a/src/main/java/net/minecraft/world/entity/npc/Villager.java b/src/main/java/net/minecraft/world/entity/npc/Villager.java -index d5fce1215d99de3393d06fdc65939920386b9318..9d19f6701acd9b5e430263347ee8a9925b9c49c2 100644 +index 505411b18989191ffa976283d08b644e11ef3f05..26857b0e5134f56df47115031727e0ad68216bc6 100644 --- a/src/main/java/net/minecraft/world/entity/npc/Villager.java +++ b/src/main/java/net/minecraft/world/entity/npc/Villager.java -@@ -332,7 +332,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler +@@ -335,7 +335,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler @Override protected void customServerAiStep() { mobTick(false); } protected void mobTick(boolean inactive) { @@ -1690,7 +1705,7 @@ index d5fce1215d99de3393d06fdc65939920386b9318..9d19f6701acd9b5e430263347ee8a992 // Purpur start if (this.level.purpurConfig.villagerLobotomizeEnabled) { // treat as inactive if lobotomized -@@ -352,7 +352,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler +@@ -357,7 +357,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler restock(); } // Purpur end @@ -1722,10 +1737,10 @@ index 59837144c2c0460aca6e8c349eb3d6528111d1dc..4392336d28aa3cc7a767a2e638e2227c } diff --git a/src/main/java/net/minecraft/world/level/Level.java b/src/main/java/net/minecraft/world/level/Level.java -index 65b815a2e68e70639ed555a2a2635b6c5f98fe6c..d6cfb0f147c8269b9ab8736a2e00294a83d560e0 100644 +index 547f51eeaab3555559d0bf8456753df471725de1..b8001bca2a33ec1e60566948a651400418a6e9e7 100644 --- a/src/main/java/net/minecraft/world/level/Level.java +++ b/src/main/java/net/minecraft/world/level/Level.java -@@ -615,9 +615,9 @@ public abstract class Level implements LevelAccessor, AutoCloseable { +@@ -718,9 +718,9 @@ public abstract class Level implements LevelAccessor, AutoCloseable { BlockState iblockdata2 = this.getBlockState(pos); if ((flags & 128) == 0 && iblockdata2 != iblockdata1 && (iblockdata2.getLightBlock(this, pos) != iblockdata1.getLightBlock(this, pos) || iblockdata2.getLightEmission() != iblockdata1.getLightEmission() || iblockdata2.useShapeForLightOcclusion() || iblockdata1.useShapeForLightOcclusion())) { @@ -1737,7 +1752,7 @@ index 65b815a2e68e70639ed555a2a2635b6c5f98fe6c..d6cfb0f147c8269b9ab8736a2e00294a } /* -@@ -916,9 +916,9 @@ public abstract class Level implements LevelAccessor, AutoCloseable { +@@ -1019,9 +1019,9 @@ public abstract class Level implements LevelAccessor, AutoCloseable { } protected void tickBlockEntities() { @@ -1749,7 +1764,7 @@ index 65b815a2e68e70639ed555a2a2635b6c5f98fe6c..d6cfb0f147c8269b9ab8736a2e00294a //timings.tileEntityPending.startTiming(); // Spigot // Purpur this.tickingBlockEntities = true; if (!this.pendingBlockEntityTickers.isEmpty()) { -@@ -963,7 +963,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { +@@ -1066,7 +1066,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { //timings.tileEntityTick.stopTiming(); // Spigot // Purpur this.tickingBlockEntities = false; co.aikar.timings.TimingHistory.tileEntityTicks += this.blockEntityTickers.size(); // Paper @@ -1758,7 +1773,7 @@ index 65b815a2e68e70639ed555a2a2635b6c5f98fe6c..d6cfb0f147c8269b9ab8736a2e00294a spigotConfig.currentPrimedTnt = 0; // Spigot } -@@ -1156,7 +1156,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { +@@ -1259,7 +1259,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { @Override public List getEntities(@Nullable Entity except, AABB box, Predicate predicate) { @@ -1767,7 +1782,7 @@ index 65b815a2e68e70639ed555a2a2635b6c5f98fe6c..d6cfb0f147c8269b9ab8736a2e00294a List list = Lists.newArrayList(); ((ServerLevel)this).getEntityLookup().getEntities(except, box, list, predicate); // Paper - optimise this call return list; -@@ -1175,7 +1175,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { +@@ -1278,7 +1278,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { } public void getEntities(EntityTypeTest filter, AABB box, Predicate predicate, List result, int limit) { @@ -1776,17 +1791,17 @@ index 65b815a2e68e70639ed555a2a2635b6c5f98fe6c..d6cfb0f147c8269b9ab8736a2e00294a // Paper start - optimise this call //TODO use limit if (filter instanceof net.minecraft.world.entity.EntityType entityTypeTest) { -@@ -1500,7 +1500,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { +@@ -1603,7 +1603,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { } public ProfilerFiller getProfiler() { -- return (ProfilerFiller) this.profiler.get(); -+ return net.minecraft.util.profiling.InactiveProfiler.INSTANCE; // Purpur +- if (gg.pufferfish.pufferfish.PufferfishConfig.disableMethodProfiler) return net.minecraft.util.profiling.InactiveProfiler.INSTANCE; // Pufferfish ++ if (true || gg.pufferfish.pufferfish.PufferfishConfig.disableMethodProfiler) return net.minecraft.util.profiling.InactiveProfiler.INSTANCE; // Pufferfish + return (ProfilerFiller) this.profiler.get(); } - public Supplier getProfilerSupplier() { diff --git a/src/main/java/net/minecraft/world/level/NaturalSpawner.java b/src/main/java/net/minecraft/world/level/NaturalSpawner.java -index ee594416ede3deed34170d04bee29492ba221061..6d9af03d434c372f3d306c37809365659122d019 100644 +index 54467e5ab4a4629f88fe48bd4b7f0db821e4553f..ba4f51e081f4352530998a9a7fbf025216e2f503 100644 --- a/src/main/java/net/minecraft/world/level/NaturalSpawner.java +++ b/src/main/java/net/minecraft/world/level/NaturalSpawner.java @@ -132,7 +132,7 @@ public final class NaturalSpawner { @@ -1808,10 +1823,10 @@ index ee594416ede3deed34170d04bee29492ba221061..6d9af03d434c372f3d306c3780936565 // Paper start diff --git a/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java b/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java -index 3fe35f4ea24ed541e11986ce5ea487290b993a03..96d7927fb2a2a57e5bc10e680baefa2917a033e2 100644 +index 3922a639a91b12c419ce566f6cf84f5466c2e0e3..b367184f415b6e20c2fc02a1e8853003349a0a1b 100644 --- a/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java +++ b/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java -@@ -1306,9 +1306,9 @@ public class LevelChunk extends ChunkAccess { +@@ -1319,9 +1319,9 @@ public class LevelChunk extends ChunkAccess { if (LevelChunk.this.isTicking(blockposition)) { try { @@ -1823,7 +1838,7 @@ index 3fe35f4ea24ed541e11986ce5ea487290b993a03..96d7927fb2a2a57e5bc10e680baefa29 //this.blockEntity.tickTimer.startTiming(); // Spigot // Purpur BlockState iblockdata = LevelChunk.this.getBlockState(blockposition); -@@ -1320,7 +1320,7 @@ public class LevelChunk extends ChunkAccess { +@@ -1333,7 +1333,7 @@ public class LevelChunk extends ChunkAccess { LevelChunk.LOGGER.warn("Block entity {} @ {} state {} invalid for ticking:", new Object[]{LogUtils.defer(this::getType), LogUtils.defer(this::getPos), iblockdata}); } diff --git a/patches/server/0276-Add-more-logger-output-for-invalid-movement-kicks.patch b/patches/server/0278-Add-more-logger-output-for-invalid-movement-kicks.patch similarity index 94% rename from patches/server/0276-Add-more-logger-output-for-invalid-movement-kicks.patch rename to patches/server/0278-Add-more-logger-output-for-invalid-movement-kicks.patch index f94a54ecb..b180274d4 100644 --- a/patches/server/0276-Add-more-logger-output-for-invalid-movement-kicks.patch +++ b/patches/server/0278-Add-more-logger-output-for-invalid-movement-kicks.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Add more logger output for invalid movement kicks diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -index d4070bfedfff53d85063fe6c542a5dac7904a45c..d507d93aa52d39f1c1016fa2508b4aad3c164386 100644 +index c7f8f15f8982b8514ee0ca0871a6934cdccd8d29..88cd723ecb0fe646db4225d036b8aeafba849b22 100644 --- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java +++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java @@ -848,6 +848,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic @@ -16,7 +16,7 @@ index d4070bfedfff53d85063fe6c542a5dac7904a45c..d507d93aa52d39f1c1016fa2508b4aad return; } -@@ -1427,8 +1428,16 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic +@@ -1428,8 +1429,16 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic @Override public void handleMovePlayer(ServerboundMovePlayerPacket packet) { PacketUtils.ensureRunningOnSameThread(packet, this, this.player.getLevel()); diff --git a/patches/server/0277-Add-Bee-API.patch b/patches/server/0279-Add-Bee-API.patch similarity index 96% rename from patches/server/0277-Add-Bee-API.patch rename to patches/server/0279-Add-Bee-API.patch index 005ff86c6..f8be915a8 100644 --- a/patches/server/0277-Add-Bee-API.patch +++ b/patches/server/0279-Add-Bee-API.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Add Bee API diff --git a/src/main/java/net/minecraft/world/entity/animal/Bee.java b/src/main/java/net/minecraft/world/entity/animal/Bee.java -index 7d7f95d8197214505a8309f947aba1a7c8b780e4..d4cf1b44a6a286d540e66b2372b2bcc767991719 100644 +index e97731c58b86562827fb6b0a32a7a00e7b714cd3..d47dc0c3fe8c2b80d7b7eb828a12af6eb32145e4 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Bee.java +++ b/src/main/java/net/minecraft/world/entity/animal/Bee.java @@ -804,6 +804,7 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { diff --git a/patches/server/0278-Debug-Marker-API.patch b/patches/server/0280-Debug-Marker-API.patch similarity index 96% rename from patches/server/0278-Debug-Marker-API.patch rename to patches/server/0280-Debug-Marker-API.patch index 3c8cd9250..365cf49dd 100644 --- a/patches/server/0278-Debug-Marker-API.patch +++ b/patches/server/0280-Debug-Marker-API.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Debug Marker API diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -index 674d16d8c40d88d6c387c0bb233f32eba56b50e7..12823737057fc91ecd925e8db36127de813bb641 100644 +index 86e40bf7cf90c33f914c38f2edb3bd8c5bb00f1c..37f0618747e0615ff1ef583e12b434b0cfacdaba 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -@@ -1441,6 +1441,42 @@ public final class CraftServer implements Server { +@@ -1446,6 +1446,42 @@ public final class CraftServer implements Server { public void removeFuel(org.bukkit.Material material) { net.minecraft.world.level.block.entity.AbstractFurnaceBlockEntity.removeFuel(net.minecraft.world.item.ItemStack.fromBukkitCopy(new ItemStack(material))); } @@ -99,7 +99,7 @@ index 24b390702d6abc256aee4a282cca64a654b95bd8..c6a3b59c65466f9f2b16cefe0059a6e5 @Override diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -index a92f80fab1de7b20e46d2f2fd4ba4fb2d5581746..e20c73b2e4b9e1c2745d177aa46470eaed24b21b 100644 +index 9e8bdd260cec5bb02a87bd946301fc29afa15279..8283abd590d0c15a0ae79042389bcb6cbae3c11e 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java @@ -3215,5 +3215,48 @@ public class CraftPlayer extends CraftHumanEntity implements Player { diff --git a/patches/server/0279-mob-spawning-option-to-ignore-creative-players.patch b/patches/server/0281-mob-spawning-option-to-ignore-creative-players.patch similarity index 94% rename from patches/server/0279-mob-spawning-option-to-ignore-creative-players.patch rename to patches/server/0281-mob-spawning-option-to-ignore-creative-players.patch index 3b7c68f6f..d258ba732 100644 --- a/patches/server/0279-mob-spawning-option-to-ignore-creative-players.patch +++ b/patches/server/0281-mob-spawning-option-to-ignore-creative-players.patch @@ -5,7 +5,7 @@ Subject: [PATCH] mob spawning option to ignore creative players diff --git a/src/main/java/net/minecraft/world/level/NaturalSpawner.java b/src/main/java/net/minecraft/world/level/NaturalSpawner.java -index 6d9af03d434c372f3d306c37809365659122d019..d36e301a1c46c457bc94edb1bab8685fd66c567e 100644 +index ba4f51e081f4352530998a9a7fbf025216e2f503..132041362b2707946bd386c88bbdf871a317afb7 100644 --- a/src/main/java/net/minecraft/world/level/NaturalSpawner.java +++ b/src/main/java/net/minecraft/world/level/NaturalSpawner.java @@ -260,7 +260,7 @@ public final class NaturalSpawner { @@ -18,7 +18,7 @@ index 6d9af03d434c372f3d306c37809365659122d019..d36e301a1c46c457bc94edb1bab8685f if (entityhuman != null) { double d2 = entityhuman.distanceToSqr(d0, (double) i, d1); diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 4687c35911b92683cb371d5221ab011371982961..0fd388db152724327853ec5d27a306b427689b03 100644 +index f1956454d745902053e6583f0321c319d5266222..b5bfa490c437eae6b6b03043cd8be80aca110094 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -379,6 +379,7 @@ public class PurpurWorldConfig { diff --git a/patches/server/0280-Add-skeleton-bow-accuracy-option.patch b/patches/server/0282-Add-skeleton-bow-accuracy-option.patch similarity index 100% rename from patches/server/0280-Add-skeleton-bow-accuracy-option.patch rename to patches/server/0282-Add-skeleton-bow-accuracy-option.patch diff --git a/patches/server/0281-Allay-respect-item-NBT.patch b/patches/server/0283-Allay-respect-item-NBT.patch similarity index 94% rename from patches/server/0281-Allay-respect-item-NBT.patch rename to patches/server/0283-Allay-respect-item-NBT.patch index fb836a292..8fb2eb5df 100644 --- a/patches/server/0281-Allay-respect-item-NBT.patch +++ b/patches/server/0283-Allay-respect-item-NBT.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Allay respect item NBT diff --git a/src/main/java/net/minecraft/world/entity/animal/allay/Allay.java b/src/main/java/net/minecraft/world/entity/animal/allay/Allay.java -index 10f386e7da49061a24beb7e934f3e75aefd3a5e9..0646a515b8ebcf004b372e8556451d05a02a4fc1 100644 +index 1c136aa0d6dcad18b5e6e2084d2c166105d54a3a..e95540122ae6a486ce12a5f50fb4d2d073239554 100644 --- a/src/main/java/net/minecraft/world/entity/animal/allay/Allay.java +++ b/src/main/java/net/minecraft/world/entity/animal/allay/Allay.java -@@ -407,9 +407,31 @@ public class Allay extends PathfinderMob implements InventoryCarrier { +@@ -409,9 +409,31 @@ public class Allay extends PathfinderMob implements InventoryCarrier { @Override public boolean wantsToPickUp(ItemStack stack) { diff --git a/patches/server/0282-Add-death-screen-API.patch b/patches/server/0284-Add-death-screen-API.patch similarity index 96% rename from patches/server/0282-Add-death-screen-API.patch rename to patches/server/0284-Add-death-screen-API.patch index a16fe05fb..096e7be60 100644 --- a/patches/server/0282-Add-death-screen-API.patch +++ b/patches/server/0284-Add-death-screen-API.patch @@ -30,7 +30,7 @@ index 53b75f5737a910ffc5448cd9a85eae57f9c1488f..ea95873dd034779e56a8b924cd27f937 } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -index e20c73b2e4b9e1c2745d177aa46470eaed24b21b..350905a8353cbd5bad9dbb05c8d222bfb5f55ae5 100644 +index 8283abd590d0c15a0ae79042389bcb6cbae3c11e..2b647aeb75e2207186bf9506fba0d92a745cfae8 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java @@ -3258,5 +3258,18 @@ public class CraftPlayer extends CraftHumanEntity implements Player { diff --git a/patches/server/0283-Implement-ram-and-rambar-commands.patch b/patches/server/0285-Implement-ram-and-rambar-commands.patch similarity index 100% rename from patches/server/0283-Implement-ram-and-rambar-commands.patch rename to patches/server/0285-Implement-ram-and-rambar-commands.patch diff --git a/patches/server/0284-Add-item-packet-serialize-event.patch b/patches/server/0286-Add-item-packet-serialize-event.patch similarity index 92% rename from patches/server/0284-Add-item-packet-serialize-event.patch rename to patches/server/0286-Add-item-packet-serialize-event.patch index f17baaac1..f530a1bd6 100644 --- a/patches/server/0284-Add-item-packet-serialize-event.patch +++ b/patches/server/0286-Add-item-packet-serialize-event.patch @@ -36,10 +36,10 @@ index 9938bb90bef84cf784f9a1ceb02a1a45aa8b48a1..1f4b64a5f812376c499c98cb4be62469 this.writeId(BuiltInRegistries.ITEM, item); diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java -index cb6c9f278bed1e70814af51e0a8644c3cabfb050..fb6935f4795616d34d38f067a93019048529bb24 100644 +index ece713391f4ab35a61b733ef00bf156b5b814c21..17a623c3fa095ab530b9d311874c92c3d5b583c1 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java -@@ -1545,6 +1545,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop(this, Zombie.class, 8.0F, 0.5D, 0.5D)); diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index daa23852c1aa4981715bead42db82b766d402a97..87255f33094ed9718327321a3a0e85e3aef2dc9a 100644 +index ba76cd6207ee0e66338718d2bceb8f7bc58076ba..49c12f24cc5446f8d996490740ede863ed232562 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -130,6 +130,7 @@ public class PurpurWorldConfig { diff --git a/patches/server/0292-MC-121706-Fix-mobs-not-looking-up-and-down-when-stra.patch b/patches/server/0294-MC-121706-Fix-mobs-not-looking-up-and-down-when-stra.patch similarity index 100% rename from patches/server/0292-MC-121706-Fix-mobs-not-looking-up-and-down-when-stra.patch rename to patches/server/0294-MC-121706-Fix-mobs-not-looking-up-and-down-when-stra.patch diff --git a/patches/server/0293-Add-log-suppression-for-LibraryLoader.patch b/patches/server/0295-Add-log-suppression-for-LibraryLoader.patch similarity index 100% rename from patches/server/0293-Add-log-suppression-for-LibraryLoader.patch rename to patches/server/0295-Add-log-suppression-for-LibraryLoader.patch diff --git a/patches/server/0294-Allow-Transparent-Blocks-In-Enchanting-Box.patch b/patches/server/0296-Allow-Transparent-Blocks-In-Enchanting-Box.patch similarity index 100% rename from patches/server/0294-Allow-Transparent-Blocks-In-Enchanting-Box.patch rename to patches/server/0296-Allow-Transparent-Blocks-In-Enchanting-Box.patch diff --git a/patches/server/0295-Add-option-to-allow-creeper-to-encircle-target-when-.patch b/patches/server/0297-Add-option-to-allow-creeper-to-encircle-target-when-.patch similarity index 100% rename from patches/server/0295-Add-option-to-allow-creeper-to-encircle-target-when-.patch rename to patches/server/0297-Add-option-to-allow-creeper-to-encircle-target-when-.patch diff --git a/patches/server/0296-Fire-Immunity-API.patch b/patches/server/0298-Fire-Immunity-API.patch similarity index 93% rename from patches/server/0296-Fire-Immunity-API.patch rename to patches/server/0298-Fire-Immunity-API.patch index a5fdedacc..71b7d3a65 100644 --- a/patches/server/0296-Fire-Immunity-API.patch +++ b/patches/server/0298-Fire-Immunity-API.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Fire Immunity API diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java -index ffe329e624b4d7db6c2b6f49f31093ab02116214..099b7da30aaf2dca7fe556d26c1395f662fbf80a 100644 +index c88eda6be7ffe312a2efd90eae85bc7fbc5397ef..b22c988cc7d5aee6eb4fcb53af9485ee89dc3497 100644 --- a/src/main/java/net/minecraft/world/entity/Entity.java +++ b/src/main/java/net/minecraft/world/entity/Entity.java @@ -399,6 +399,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { @@ -16,7 +16,7 @@ index ffe329e624b4d7db6c2b6f49f31093ab02116214..099b7da30aaf2dca7fe556d26c1395f6 public void setOrigin(@javax.annotation.Nonnull Location location) { this.origin = location.toVector(); -@@ -1642,7 +1643,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { +@@ -1676,7 +1677,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { } public boolean fireImmune() { @@ -25,7 +25,7 @@ index ffe329e624b4d7db6c2b6f49f31093ab02116214..099b7da30aaf2dca7fe556d26c1395f6 } public boolean causeFallDamage(float fallDistance, float damageMultiplier, DamageSource damageSource) { -@@ -2304,6 +2305,11 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { +@@ -2338,6 +2339,11 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { nbt.putBoolean("Paper.FreezeLock", true); } // Paper end @@ -37,7 +37,7 @@ index ffe329e624b4d7db6c2b6f49f31093ab02116214..099b7da30aaf2dca7fe556d26c1395f6 return nbt; } catch (Throwable throwable) { CrashReport crashreport = CrashReport.forThrowable(throwable, "Saving entity NBT"); -@@ -2472,6 +2478,11 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { +@@ -2506,6 +2512,11 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { freezeLocked = nbt.getBoolean("Paper.FreezeLock"); } // Paper end diff --git a/patches/server/0297-Add-option-to-teleport-to-spawn-on-nether-ceiling-da.patch b/patches/server/0299-Add-option-to-teleport-to-spawn-on-nether-ceiling-da.patch similarity index 93% rename from patches/server/0297-Add-option-to-teleport-to-spawn-on-nether-ceiling-da.patch rename to patches/server/0299-Add-option-to-teleport-to-spawn-on-nether-ceiling-da.patch index eae46148f..7b2604511 100644 --- a/patches/server/0297-Add-option-to-teleport-to-spawn-on-nether-ceiling-da.patch +++ b/patches/server/0299-Add-option-to-teleport-to-spawn-on-nether-ceiling-da.patch @@ -18,10 +18,10 @@ index 15a6e8d23d8f626d7d5587f97c6ec5b10ab9afa8..74238a87d1ff3391aac5812b24b84af2 this.server.getPlayerList().respawn(this, toLevel, true, to, !toLevel.paperConfig().environment.disableTeleportationSuffocationCheck); } diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java -index 099b7da30aaf2dca7fe556d26c1395f662fbf80a..3f59268a8e01cebd9e08984ae754e928b085a0ac 100644 +index b22c988cc7d5aee6eb4fcb53af9485ee89dc3497..b49c60217eb5f1e2872827f944c45886ffb27bef 100644 --- a/src/main/java/net/minecraft/world/entity/Entity.java +++ b/src/main/java/net/minecraft/world/entity/Entity.java -@@ -864,6 +864,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { +@@ -898,6 +898,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { && this.level.paperConfig().environment.netherCeilingVoidDamageHeight.test(v -> this.getY() >= v) && (!(this instanceof Player player) || !player.getAbilities().invulnerable))) { // Paper end @@ -30,7 +30,7 @@ index 099b7da30aaf2dca7fe556d26c1395f662fbf80a..3f59268a8e01cebd9e08984ae754e928 } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 1e729867df0f3f80a785dd6b3b69a045c21f2156..44cfe5afb0e5ec087880c0739b1f1c6115d6a05a 100644 +index fd565abe6bb48f3ec112bdbbe4a698d88fd2d0dc..f4c20ea2b683901a68a41e4145b62d0bb61fbbef 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -421,6 +421,7 @@ public class PurpurWorldConfig { diff --git a/patches/server/0298-Added-got-ram-event.patch b/patches/server/0300-Added-got-ram-event.patch similarity index 86% rename from patches/server/0298-Added-got-ram-event.patch rename to patches/server/0300-Added-got-ram-event.patch index f6bcf7d70..302a44cfa 100644 --- a/patches/server/0298-Added-got-ram-event.patch +++ b/patches/server/0300-Added-got-ram-event.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Added got ram event diff --git a/src/main/java/net/minecraft/world/entity/animal/goat/Goat.java b/src/main/java/net/minecraft/world/entity/animal/goat/Goat.java -index 5229a5af3ba875247db0228fef290f764b3c8b2c..094440b4c1a07e8d69224fc852dbcdf8ae80f491 100644 +index 8129ad2ca6e0b4c6ca586dc221dcce1e883def9b..f5c0fc9f30bdf7935200b875ada0ff1011fdb034 100644 --- a/src/main/java/net/minecraft/world/entity/animal/goat/Goat.java +++ b/src/main/java/net/minecraft/world/entity/animal/goat/Goat.java -@@ -421,6 +421,7 @@ public class Goat extends Animal { +@@ -422,6 +422,7 @@ public class Goat extends Animal { // Paper start - Goat ram API public void ram(net.minecraft.world.entity.LivingEntity entity) { diff --git a/patches/server/0299-Log-skipped-entity-s-position.patch b/patches/server/0301-Log-skipped-entity-s-position.patch similarity index 86% rename from patches/server/0299-Log-skipped-entity-s-position.patch rename to patches/server/0301-Log-skipped-entity-s-position.patch index 6ceb76ccc..584bfb4d7 100644 --- a/patches/server/0299-Log-skipped-entity-s-position.patch +++ b/patches/server/0301-Log-skipped-entity-s-position.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Log skipped entity's position diff --git a/src/main/java/net/minecraft/world/entity/EntityType.java b/src/main/java/net/minecraft/world/entity/EntityType.java -index f3a1bd8509b49ea69282567c08eef1e603d3afb2..1a37a521b54a3bf6fdd1416e6fd92a3f9422d850 100644 +index 314a2a31079fcb7619ff9ebef8e6cf161f5c7c9c..3fc26a8976f4bfa28c2c6a862aac997d5f721f51 100644 --- a/src/main/java/net/minecraft/world/entity/EntityType.java +++ b/src/main/java/net/minecraft/world/entity/EntityType.java -@@ -610,6 +610,12 @@ public class EntityType implements FeatureElement, EntityTypeT +@@ -612,6 +612,12 @@ public class EntityType implements FeatureElement, EntityTypeT entity.load(nbt); }, () -> { EntityType.LOGGER.warn("Skipping Entity with id {}", nbt.getString("id")); diff --git a/patches/server/0300-End-Crystal-Cramming.patch b/patches/server/0302-End-Crystal-Cramming.patch similarity index 96% rename from patches/server/0300-End-Crystal-Cramming.patch rename to patches/server/0302-End-Crystal-Cramming.patch index e9d346909..c4078256c 100644 --- a/patches/server/0300-End-Crystal-Cramming.patch +++ b/patches/server/0302-End-Crystal-Cramming.patch @@ -17,7 +17,7 @@ index a4fc0e9cb52bb5937effe5cd09f8bbefcf8dd531..e3fe5f18c77e36479eaeb7edfd2a3eb9 // Purpur start diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 44cfe5afb0e5ec087880c0739b1f1c6115d6a05a..05c8f4ca98b95d883d962db0aa43903e4a0785f0 100644 +index f4c20ea2b683901a68a41e4145b62d0bb61fbbef..7a7feba3ce560a508aaa352b0ae63299c248e434 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -852,6 +852,7 @@ public class PurpurWorldConfig { diff --git a/patches/server/0301-Option-to-allow-beacon-effects-when-covered-by-tinte.patch b/patches/server/0303-Option-to-allow-beacon-effects-when-covered-by-tinte.patch similarity index 97% rename from patches/server/0301-Option-to-allow-beacon-effects-when-covered-by-tinte.patch rename to patches/server/0303-Option-to-allow-beacon-effects-when-covered-by-tinte.patch index 8b014e041..759a43eb0 100644 --- a/patches/server/0301-Option-to-allow-beacon-effects-when-covered-by-tinte.patch +++ b/patches/server/0303-Option-to-allow-beacon-effects-when-covered-by-tinte.patch @@ -36,7 +36,7 @@ index c787019b5cbadec81dd33ef4021708b9b423485a..8f82b0ce87afc8890c5b3386d5f6e22c BeaconBlockEntity.playSound(world, pos, SoundEvents.BEACON_AMBIENT); } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 05c8f4ca98b95d883d962db0aa43903e4a0785f0..dce83c76bf4d4e3e0e98dc0c6b34b2fbff3cfee5 100644 +index 7a7feba3ce560a508aaa352b0ae63299c248e434..ab04966c16dc9929ae70fb727d3f8fbb54ffd57f 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -746,11 +746,13 @@ public class PurpurWorldConfig { diff --git a/patches/server/0302-Add-attribute-clamping-and-armor-limit-config.patch b/patches/server/0304-Add-attribute-clamping-and-armor-limit-config.patch similarity index 100% rename from patches/server/0302-Add-attribute-clamping-and-armor-limit-config.patch rename to patches/server/0304-Add-attribute-clamping-and-armor-limit-config.patch diff --git a/patches/server/0303-Config-to-remove-explosion-radius-clamp.patch b/patches/server/0305-Config-to-remove-explosion-radius-clamp.patch similarity index 94% rename from patches/server/0303-Config-to-remove-explosion-radius-clamp.patch rename to patches/server/0305-Config-to-remove-explosion-radius-clamp.patch index 133b9d0df..8d892bf17 100644 --- a/patches/server/0303-Config-to-remove-explosion-radius-clamp.patch +++ b/patches/server/0305-Config-to-remove-explosion-radius-clamp.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Config to remove explosion radius clamp diff --git a/src/main/java/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java b/src/main/java/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java -index 7c0d7aa465b2a04aa4808d2346ea4eb5c6ae47e4..8b4c924c21f09ea37d997a11d42e7ee05e51010c 100644 +index 790160cfcb113e046379c2fe5af32667faf3be8c..b6ac41633e91f6ee2755d1f05aac4c8046a4aa8a 100644 --- a/src/main/java/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java +++ b/src/main/java/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java @@ -108,6 +108,7 @@ public class EnderDragon extends Mob implements Enemy { @@ -39,7 +39,7 @@ index 4392336d28aa3cc7a767a2e638e2227c16a597f4..4929149dde7630a2249a86f4ed0bf00e } // CraftBukkit end diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 3ae4c95763caf2b4a815c1e4553ead37ea80eb30..401803ac4e2d176d8509f240629ad3fb7d1eabc4 100644 +index ab04966c16dc9929ae70fb727d3f8fbb54ffd57f..7b93c263fa7d2d69cbf1a6d2f791199f0f477493 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -215,6 +215,11 @@ public class PurpurWorldConfig { diff --git a/patches/server/0304-bonemealable-sugarcane-cactus-and-netherwart.patch b/patches/server/0306-bonemealable-sugarcane-cactus-and-netherwart.patch similarity index 98% rename from patches/server/0304-bonemealable-sugarcane-cactus-and-netherwart.patch rename to patches/server/0306-bonemealable-sugarcane-cactus-and-netherwart.patch index 508be1995..4fca764d0 100644 --- a/patches/server/0304-bonemealable-sugarcane-cactus-and-netherwart.patch +++ b/patches/server/0306-bonemealable-sugarcane-cactus-and-netherwart.patch @@ -137,7 +137,7 @@ index 6b400a4759c8c8612a3b5c96ca0d87ef9dc71435..992de1ab2c00a2545a857f1b5533926b + // Purpur end } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index e7e4511abdfa94b990ceb7accee8a5f9e3bf5291..40a66f4ae7be0abd10a62a8945ba62c603c75470 100644 +index 7b93c263fa7d2d69cbf1a6d2f791199f0f477493..fe903b1e1bd211651e3808becd34a2d28dc57f34 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -805,8 +805,20 @@ public class PurpurWorldConfig { diff --git a/patches/server/0305-Add-PreExplodeEvents.patch b/patches/server/0307-Add-PreExplodeEvents.patch similarity index 100% rename from patches/server/0305-Add-PreExplodeEvents.patch rename to patches/server/0307-Add-PreExplodeEvents.patch diff --git a/patches/server/0306-Improve-output-of-plugins-command.patch b/patches/server/0308-Improve-output-of-plugins-command.patch similarity index 100% rename from patches/server/0306-Improve-output-of-plugins-command.patch rename to patches/server/0308-Improve-output-of-plugins-command.patch