From cff698bfcd609e3908189537e2815226612f00bc Mon Sep 17 00:00:00 2001 From: granny Date: Fri, 10 Jun 2022 23:25:34 -0700 Subject: [PATCH] add pufferfish back to purpur --- patches/api/0001-Pufferfish-API-Changes.patch | 514 ++ ....patch => 0002-Build-System-Changes.patch} | 4 +- ...s.patch => 0003-Purpur-config-files.patch} | 2 +- ...patch => 0004-Purpur-client-support.patch} | 0 ...s.patch => 0005-Default-permissions.patch} | 0 ...005-Ridables.patch => 0006-Ridables.patch} | 0 ...ch => 0007-Allow-inventory-resizing.patch} | 0 ...7-Llama-API.patch => 0008-Llama-API.patch} | 0 ...{0008-AFK-API.patch => 0009-AFK-API.patch} | 0 ...atch => 0010-Bring-back-server-name.patch} | 0 ...t.patch => 0011-ExecuteCommandEvent.patch} | 0 ... 0012-LivingEntity-safeFallDistance.patch} | 0 ...old.patch => 0013-Lagging-threshold.patch} | 0 ...14-PlayerSetSpawnerTypeWithEggEvent.patch} | 0 ...ch => 0015-EMC-MonsterEggSpawnEvent.patch} | 0 ...ch => 0016-Player-invulnerabilities.patch} | 0 ...6-Anvil-API.patch => 0017-Anvil-API.patch} | 0 ... 0018-ItemStack-convenience-methods.patch} | 0 ...d-to-crystals-and-crystals-shoot-ph.patch} | 0 ...atch => 0020-ChatColor-conveniences.patch} | 0 ...021-LivingEntity-broadcastItemBreak.patch} | 0 ...atch => 0022-Item-entity-immunities.patch} | 0 ...t-Improve-output-of-plugins-command.patch} | 0 ...able-zombie-aggressiveness-towards-.patch} | 0 ...-to-recipe-s-ExactChoice-ingredient.patch} | 0 ...26-Alphabetize-in-game-plugins-list.patch} | 0 ...lf-API.patch => 0027-Rabid-Wolf-API.patch} | 0 ...tch => 0028-PlayerBookTooLargeEvent.patch} | 0 ...herite-armor-grants-fire-resistance.patch} | 0 ...030-Add-EntityTeleportHinderedEvent.patch} | 0 ...tment-target-for-bows-and-crossbows.patch} | 0 ...> 0032-Iron-golem-poppy-calms-anger.patch} | 0 ...33-API-for-any-mob-to-burn-daylight.patch} | 0 ...atch => 0034-Flying-Fall-Damage-API.patch} | 0 ...d-back-player-spawned-endermite-API.patch} | 0 ... 0036-Fix-default-permission-system.patch} | 0 ...oner-API.patch => 0037-Summoner-API.patch} | 0 ...038-Clean-up-version-command-output.patch} | 0 ... => 0039-Extended-OfflinePlayer-API.patch} | 0 ...he-ability-to-add-combustible-items.patch} | 0 ....patch => 0041-Potion-NamespacedKey.patch} | 0 ...ne-API.patch => 0042-Grindstone-API.patch} | 0 ...Shears-can-have-looting-enchantment.patch} | 0 ... => 0044-Lobotomize-stuck-villagers.patch} | 0 .../0001-Pufferfish-Server-Changes.patch | 4353 +++++++++++++++++ ...{0001-Rebrand.patch => 0002-Rebrand.patch} | 53 +- ...s.patch => 0003-Purpur-config-files.patch} | 16 +- ...patch => 0004-Purpur-client-support.patch} | 6 +- ...0005-Component-related-conveniences.patch} | 8 +- ...005-Ridables.patch => 0006-Ridables.patch} | 106 +- ...Configurable-entity-base-attributes.patch} | 32 +- ...s-stuff.patch => 0008-Timings-stuff.patch} | 10 +- ...0009-Barrels-and-enderchests-6-rows.patch} | 4 +- ...9-Llama-API.patch => 0010-Llama-API.patch} | 2 +- ...{0010-AFK-API.patch => 0011-AFK-API.patch} | 12 +- ...atch => 0012-Bring-back-server-name.patch} | 4 +- ...> 0013-Configurable-server-mod-name.patch} | 4 +- ... 0014-LivingEntity-safeFallDistance.patch} | 10 +- ...old.patch => 0015-Lagging-threshold.patch} | 8 +- ...16-PlayerSetSpawnerTypeWithEggEvent.patch} | 6 +- ...ch => 0017-EMC-MonsterEggSpawnEvent.patch} | 6 +- ...ch => 0018-Player-invulnerabilities.patch} | 4 +- ...8-Anvil-API.patch => 0019-Anvil-API.patch} | 0 ...0-Configurable-villager-brain-ticks.patch} | 28 +- ...0021-Alternative-Keepalive-Handling.patch} | 4 +- ...s.patch => 0022-Silk-touch-spawners.patch} | 0 ...72-Fix-Add-turtle-egg-block-options.patch} | 0 ...-vanilla-command-permission-handler.patch} | 0 ...settings-suppressing-pointless-logs.patch} | 0 ...> 0026-Disable-outdated-build-check.patch} | 0 ...gs.patch => 0027-Giants-AI-settings.patch} | 0 ...> 0028-Zombie-horse-naturally-spawn.patch} | 4 +- ...029-Charged-creeper-naturally-spawn.patch} | 2 +- ...it-naturally-spawn-toast-and-killer.patch} | 0 ...er-showing-in-ping-before-server-fu.patch} | 0 ...atch => 0032-Tulips-change-fox-type.patch} | 0 ...patch => 0033-Breedable-Polar-Bears.patch} | 0 ...atch => 0034-Chickens-can-retaliate.patch} | 0 ...ption-to-set-armorstand-step-height.patch} | 2 +- ....patch => 0036-Cat-spawning-options.patch} | 0 ...n-black-cats-spawning-in-swamp-huts.patch} | 0 ...ms.patch => 0038-Cows-eat-mushrooms.patch} | 0 ...ow-rotation-when-shearing-mooshroom.patch} | 0 ...patch => 0040-Pigs-give-saddle-back.patch} | 0 ...1-Snowman-drop-and-put-back-pumpkin.patch} | 0 ...2-Ender-dragon-always-drop-full-exp.patch} | 2 +- ... 0043-Signs-editable-on-right-click.patch} | 0 ...oisten-from-water-directly-under-it.patch} | 0 ...Minecart-settings-and-WASD-controls.patch} | 6 +- ...ble-loot-drops-on-death-by-cramming.patch} | 6 +- ...tion-to-toggle-milk-curing-bad-omen.patch} | 0 ...ould-check-if-entity-can-use-portal.patch} | 0 ...049-Fix-the-dead-lagging-the-server.patch} | 8 +- ...Skip-events-if-there-s-no-listeners.patch} | 2 +- ... 0051-Add-permission-for-F3-N-debug.patch} | 2 +- ...ch => 0052-Configurable-TPS-Catchup.patch} | 4 +- ...ow-loyalty-on-tridents-to-work-in-t.patch} | 0 ...erman-and-creeper-griefing-controls.patch} | 8 +- ...055-Villagers-follow-emerald-blocks.patch} | 4 +- ...ch => 0056-Allow-leashing-villagers.patch} | 8 +- ... => 0057-Implement-infinite-liquids.patch} | 6 +- ...8-Make-lava-flow-speed-configurable.patch} | 0 ...dd-player-death-exp-control-options.patch} | 2 +- ...rable-void-damage-height-and-damage.patch} | 8 +- ...=> 0061-Add-canSaveToDisk-to-Entity.patch} | 6 +- ...spenser-curse-of-binding-protection.patch} | 4 +- ...-for-boats-to-eject-players-on-land.patch} | 2 +- ...-mends-most-damages-equipment-first.patch} | 0 ...065-Add-5-second-tps-average-in-tps.patch} | 10 +- ...h => 0066-Implement-elytra-settings.patch} | 4 +- ...atch => 0067-Item-entity-immunities.patch} | 10 +- ...mand.patch => 0068-Add-ping-command.patch} | 2 +- ...mand.patch => 0069-Add-demo-command.patch} | 2 +- ...d.patch => 0070-Add-credits-command.patch} | 2 +- ...=> 0071-Configurable-jockey-options.patch} | 0 ...d-to-crystals-and-crystals-shoot-ph.patch} | 4 +- ...> 0073-Add-phantom-spawning-options.patch} | 0 ...074-Implement-bed-explosion-options.patch} | 0 ...nt-respawn-anchor-explosion-options.patch} | 0 ...Add-allow-water-in-end-world-option.patch} | 4 +- ... => 0077-Allow-color-codes-in-books.patch} | 10 +- ...espan.patch => 0078-Entity-lifespan.patch} | 16 +- ...eport-to-spawn-if-outside-world-bor.patch} | 4 +- ...ty.patch => 0080-Squid-EAR-immunity.patch} | 4 +- ...atch => 0081-Phantoms-burn-in-light.patch} | 2 +- ...0082-Configurable-villager-breeding.patch} | 4 +- ... 0083-Redstone-deactivates-spawners.patch} | 2 +- ...ch => 0084-Totems-work-in-inventory.patch} | 4 +- ...-Add-vindicator-johnny-spawn-chance.patch} | 2 +- ...on-to-disable-certain-block-updates.patch} | 0 ...0087-Dispensers-place-anvils-option.patch} | 0 ...rs.patch => 0088-Allow-anvil-colors.patch} | 0 ...-disable-dolphin-treasure-searching.patch} | 0 ...patch => 0090-Short-enderman-height.patch} | 6 +- ...top-squids-floating-on-top-of-water.patch} | 6 +- ...ng-obsidian-valid-for-portal-frames.patch} | 0 ...ities-can-use-portals-configuration.patch} | 6 +- ...094-LivingEntity-broadcastItemBreak.patch} | 0 ...tomizable-wither-health-and-healing.patch} | 2 +- ...gling-special-MobSpawners-per-world.patch} | 2 +- ...patch => 0097-Raid-cooldown-setting.patch} | 0 ...-config-options-per-projectile-type.patch} | 8 +- ...able-zombie-aggressiveness-towards-.patch} | 0 ...-to-recipe-s-ExactChoice-ingredient.patch} | 0 ...y.patch => 0101-Flying-squids-Oh-my.patch} | 0 ...patch => 0102-Infinity-bow-settings.patch} | 0 ...=> 0103-Configurable-daylight-cycle.patch} | 10 +- ...e-and-mending-enchantments-together.patch} | 0 ...5-Furnace-uses-lava-from-underneath.patch} | 0 ...ws-should-not-reset-despawn-counter.patch} | 2 +- ...e-add-farmland-mechanics-from-Alpha.patch} | 0 ...ustable-breeding-cooldown-to-config.patch} | 4 +- ...-entity-breeding-times-configurable.patch} | 6 +- ...es-from-item-forms-of-entities-to-e.patch} | 4 +- ...when-using-a-Name-Tag-on-an-Armor-S.patch} | 0 ...lowing-Endermen-to-despawn-even-whi.patch} | 4 +- ...13-Add-configurable-snowball-damage.patch} | 0 ...4-Changeable-Mob-Left-Handed-Chance.patch} | 4 +- ...=> 0115-Add-boat-fall-damage-config.patch} | 2 +- ...0116-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 ...timise-player-list-ticksSpread-out-.patch} | 0 ...le-chance-for-wolves-to-spawn-rabid.patch} | 0 ...2-Configurable-default-collar-color.patch} | 0 ...tch => 0123-Phantom-flames-on-swoop.patch} | 2 +- ...-to-open-even-with-a-solid-block-on.patch} | 2 +- ...SBar.patch => 0125-Implement-TPSBar.patch} | 10 +- ...h => 0126-Striders-give-saddle-back.patch} | 0 ...tch => 0127-PlayerBookTooLargeEvent.patch} | 6 +- ...herite-armor-grants-fire-resistance.patch} | 2 +- ...129-Fix-rotating-UP-DOWN-CW-and-CCW.patch} | 0 ...efing-bypass-to-everything-affected.patch} | 32 +- ...llow-Note-Block-sounds-when-blocked.patch} | 0 ...132-Add-EntityTeleportHinderedEvent.patch} | 0 ... => 0133-Farmland-trampling-changes.patch} | 0 ...4-Movement-options-for-armor-stands.patch} | 4 +- ....patch => 0135-Fix-stuck-in-portals.patch} | 6 +- ...ggle-for-water-sensitive-mob-damage.patch} | 24 +- ...7-Config-to-always-tame-in-Creative.patch} | 0 ... 0138-End-crystal-explosion-options.patch} | 2 +- ...ther-Ender-Dragon-can-ride-vehicles.patch} | 4 +- ...atch => 0140-Dont-run-with-scissors.patch} | 6 +- ...nch-Man.patch => 0141-One-Punch-Man.patch} | 4 +- ...r-Pearl-cooldown-damage-and-Endermi.patch} | 0 ...to-ignore-nearby-mobs-when-sleeping.patch} | 2 +- ...d-back-player-spawned-endermite-API.patch} | 0 ...n-aggressiveness-towards-Endermites.patch} | 2 +- ...Dragon-Head-wearers-and-stare-aggro.patch} | 2 +- ...ig.patch => 0147-Tick-fluids-config.patch} | 0 ...48-Config-to-disable-Llama-caravans.patch} | 2 +- ...g-to-make-Creepers-explode-on-death.patch} | 2 +- ...rable-ravager-griefable-blocks-list.patch} | 0 ...151-Sneak-to-bulk-process-composter.patch} | 0 ...h => 0152-Config-for-skipping-night.patch} | 2 +- ...153-Add-config-for-villager-trading.patch} | 4 +- ...=> 0154-Allow-infinity-on-crossbows.patch} | 2 +- ...ngs.patch => 0155-Drowning-Settings.patch} | 10 +- ...reak-individual-slabs-when-sneaking.patch} | 0 ...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} | 0 ...Config-to-allow-for-unsafe-enchants.patch} | 0 ...0161-Configurable-sponge-absorption.patch} | 0 ...ch => 0162-Projectile-offset-config.patch} | 0 ...or-powered-rail-activation-distance.patch} | 0 ...> 0164-Piglin-portal-spawn-modifier.patch} | 2 +- ...Config-to-change-max-number-of-bees.patch} | 0 ...-Config-for-wither-explosion-radius.patch} | 0 ... => 0167-Gamemode-extra-permissions.patch} | 4 +- ...ng-the-blocks-that-turn-into-dirt-p.patch} | 0 ...0169-Configurable-piston-push-limit.patch} | 0 ...170-Configurable-broadcast-settings.patch} | 2 +- ... => 0171-Configurable-mob-blindness.patch} | 4 +- ...hidden-players-from-entity-selector.patch} | 0 ...-to-impact-Creeper-explosion-radius.patch} | 2 +- ... 0174-Iron-golem-calm-anger-options.patch} | 2 +- ...ots.patch => 0175-Breedable-parrots.patch} | 0 ...gurable-powered-rail-boost-modifier.patch} | 2 +- ...ge-multiplier-critical-damage-value.patch} | 0 ...n-to-disable-dragon-egg-teleporting.patch} | 0 ...fig-for-unverified-username-message.patch} | 2 +- ...-anvil-cumulative-cost-configurable.patch} | 0 ...1-ShulkerBox-allow-oversized-stacks.patch} | 0 ...e-can-work-when-raining-or-at-night.patch} | 0 ...83-API-for-any-mob-to-burn-daylight.patch} | 18 +- ...h => 0184-Config-MobEffect-by-world.patch} | 0 ...eacon-Activation-Range-Configurable.patch} | 0 ...0186-Add-toggle-for-sand-duping-fix.patch} | 2 +- ...gle-for-end-portal-safe-teleporting.patch} | 4 +- ...atch => 0188-Flying-Fall-Damage-API.patch} | 0 ...ke-lightning-rod-range-configurable.patch} | 4 +- ...ng-food-fills-hunger-bar-completely.patch} | 2 +- ...ayer-join-full-server-by-permission.patch} | 2 +- ...ermission-bypass-for-portal-waiting.patch} | 0 ...3-Shulker-spawn-from-bullet-options.patch} | 0 ...ating-glow-berries-adds-glow-effect.patch} | 0 ...-Option-to-make-drowned-break-doors.patch} | 0 ...nfigurable-hunger-starvation-damage.patch} | 0 ...patch => 0197-Enhance-SysoutCatcher.patch} | 0 ...h => 0198-Armor-click-equip-options.patch} | 0 ...nd.patch => 0199-Add-uptime-command.patch} | 2 +- ...atch => 0200-Structure-seed-options.patch} | 0 ...tch => 0201-Tool-actionable-options.patch} | 0 ...2-Store-placer-on-Block-when-placed.patch} | 2 +- ...oner-API.patch => 0203-Summoner-API.patch} | 4 +- ...mizable-sleeping-actionbar-messages.patch} | 4 +- ...-shulker-box-items-from-dropping-co.patch} | 0 ...206-Silk-touchable-budding-amethyst.patch} | 0 ...tch => 0207-Big-dripleaf-tilt-delay.patch} | 0 ...0208-Player-ridable-in-water-option.patch} | 2 +- ...-Enderman-teleport-on-projectile-hi.patch} | 4 +- ...d.patch => 0210-Add-compass-command.patch} | 4 +- ...nt-horses-from-standing-with-riders.patch} | 2 +- ...h => 0212-Toggle-for-kinetic-damage.patch} | 4 +- ...-Option-for-disable-observer-clocks.patch} | 2 +- ...zeable-Zombie-Villager-curing-times.patch} | 0 ...-Option-for-sponges-to-work-on-lava.patch} | 0 ...216-Toggle-for-Wither-s-spawn-sound.patch} | 2 +- ...-breaks-from-solid-neighbors-config.patch} | 2 +- ...move-curse-of-binding-with-weakness.patch} | 0 ...0219-Conduit-behavior-configuration.patch} | 0 ...patch => 0220-Cauldron-fill-chances.patch} | 0 ...o-allow-mobs-to-pathfind-over-rails.patch} | 0 ... 0222-Shulker-change-color-with-dye.patch} | 0 ... => 0223-Extended-OfflinePlayer-API.patch} | 0 ...he-ability-to-add-combustible-items.patch} | 6 +- ...in-and-thunder-should-stop-on-sleep.patch} | 6 +- ...-blocks-to-grow-into-trees-naturall.patch} | 0 ...-right-click-to-use-exp-for-mending.patch} | 4 +- ...urally-aggressive-to-players-chance.patch} | 0 ...urally-aggressive-to-players-chance.patch} | 0 ...r-beds-to-explode-on-villager-sleep.patch} | 4 +- ...Halloween-options-and-optimizations.patch} | 12 +- ...atch => 0232-Config-for-grindstones.patch} | 0 ....patch => 0233-UPnP-Port-Forwarding.patch} | 8 +- ...Campfire-option-for-lit-when-placed.patch} | 0 ...tinguish-fire-blocks-with-snowballs.patch} | 0 ...on-to-disable-zombie-villagers-cure.patch} | 0 ...nt-BlockEntity-Lore-and-DisplayName.patch} | 2 +- ...tch => 0238-Signs-allow-color-codes.patch} | 6 +- ...twisting-vines-configurable-max-gro.patch} | 0 ...=> 0240-Mobs-always-drop-experience.patch} | 22 +- ....patch => 0241-Potion-NamespacedKey.patch} | 0 ...ne-API.patch => 0242-Grindstone-API.patch} | 0 ...-spiders-from-climbing-world-border.patch} | 6 +- ...e-to-replant-crops-and-nether-warts.patch} | 0 ...ring-jeb-produces-random-color-wool.patch} | 0 ...urtle-eggs-random-tick-crack-chance.patch} | 0 ...=> 0247-Mob-head-visibility-percent.patch} | 4 +- ...able-valid-characters-for-usernames.patch} | 2 +- ...Shears-can-have-looting-enchantment.patch} | 0 ...Stop-bees-from-dying-after-stinging.patch} | 0 ...ounts-in-beehives-to-Purpur-clients.patch} | 10 +- ...onfigurable-farmland-trample-height.patch} | 0 ...onfigurable-player-pickup-exp-delay.patch} | 2 +- ...ng.patch => 0254-Allow-void-trading.patch} | 4 +- ...nt-eat-blocks-in-non-ticking-chunks.patch} | 15 +- ...h => 0256-Configurable-phantom-size.patch} | 2 +- ...> 0257-Configurable-food-attributes.patch} | 0 ....patch => 0258-Max-joins-per-second.patch} | 0 ...figurable-minimum-demand-for-trades.patch} | 4 +- ... => 0260-Lobotomize-stuck-villagers.patch} | 29 +- ...ion-for-villager-display-trade-item.patch} | 0 ...> 0262-Fill-command-max-area-option.patch} | 0 ...wner-not-spawning-water-animals-cor.patch} | 0 ...ig-for-mob-last-hurt-by-player-time.patch} | 6 +- ...=> 0265-Anvil-repair-damage-options.patch} | 0 ...> 0266-Fix-legacy-colors-in-console.patch} | 2 +- ...-turtle-egg-trampling-with-feather-.patch} | 0 ...d-toggle-for-enchant-level-clamping.patch} | 0 ...vent-horses-from-standing-when-hurt.patch} | 2 +- ...tch => 0270-Drop-incompatible-tests.patch} | 0 ...rable-search-radius-for-villagers-t.patch} | 4 +- ...ge.patch => 0272-Stonecutter-damage.patch} | 0 ...le-damage-settings-for-magma-blocks.patch} | 0 ...274-Add-config-for-snow-on-blue-ice.patch} | 0 318 files changed, 5353 insertions(+), 471 deletions(-) create mode 100644 patches/api/0001-Pufferfish-API-Changes.patch rename patches/api/{0001-Build-System-Changes.patch => 0002-Build-System-Changes.patch} (85%) rename patches/api/{0002-Purpur-config-files.patch => 0003-Purpur-config-files.patch} (91%) rename patches/api/{0003-Purpur-client-support.patch => 0004-Purpur-client-support.patch} (100%) rename patches/api/{0004-Default-permissions.patch => 0005-Default-permissions.patch} (100%) rename patches/api/{0005-Ridables.patch => 0006-Ridables.patch} (100%) rename patches/api/{0006-Allow-inventory-resizing.patch => 0007-Allow-inventory-resizing.patch} (100%) rename patches/api/{0007-Llama-API.patch => 0008-Llama-API.patch} (100%) rename patches/api/{0008-AFK-API.patch => 0009-AFK-API.patch} (100%) rename patches/api/{0009-Bring-back-server-name.patch => 0010-Bring-back-server-name.patch} (100%) rename patches/api/{0010-ExecuteCommandEvent.patch => 0011-ExecuteCommandEvent.patch} (100%) rename patches/api/{0011-LivingEntity-safeFallDistance.patch => 0012-LivingEntity-safeFallDistance.patch} (100%) rename patches/api/{0012-Lagging-threshold.patch => 0013-Lagging-threshold.patch} (100%) rename patches/api/{0013-PlayerSetSpawnerTypeWithEggEvent.patch => 0014-PlayerSetSpawnerTypeWithEggEvent.patch} (100%) rename patches/api/{0014-EMC-MonsterEggSpawnEvent.patch => 0015-EMC-MonsterEggSpawnEvent.patch} (100%) rename patches/api/{0015-Player-invulnerabilities.patch => 0016-Player-invulnerabilities.patch} (100%) rename patches/api/{0016-Anvil-API.patch => 0017-Anvil-API.patch} (100%) rename patches/api/{0017-ItemStack-convenience-methods.patch => 0018-ItemStack-convenience-methods.patch} (100%) rename patches/api/{0018-Phantoms-attracted-to-crystals-and-crystals-shoot-ph.patch => 0019-Phantoms-attracted-to-crystals-and-crystals-shoot-ph.patch} (100%) rename patches/api/{0019-ChatColor-conveniences.patch => 0020-ChatColor-conveniences.patch} (100%) rename patches/api/{0020-LivingEntity-broadcastItemBreak.patch => 0021-LivingEntity-broadcastItemBreak.patch} (100%) rename patches/api/{0021-Item-entity-immunities.patch => 0022-Item-entity-immunities.patch} (100%) rename patches/api/{0022-Spigot-Improve-output-of-plugins-command.patch => 0023-Spigot-Improve-output-of-plugins-command.patch} (100%) rename patches/api/{0023-Add-option-to-disable-zombie-aggressiveness-towards-.patch => 0024-Add-option-to-disable-zombie-aggressiveness-towards-.patch} (100%) rename patches/api/{0024-Add-predicate-to-recipe-s-ExactChoice-ingredient.patch => 0025-Add-predicate-to-recipe-s-ExactChoice-ingredient.patch} (100%) rename patches/api/{0025-Alphabetize-in-game-plugins-list.patch => 0026-Alphabetize-in-game-plugins-list.patch} (100%) rename patches/api/{0026-Rabid-Wolf-API.patch => 0027-Rabid-Wolf-API.patch} (100%) rename patches/api/{0027-PlayerBookTooLargeEvent.patch => 0028-PlayerBookTooLargeEvent.patch} (100%) rename patches/api/{0028-Full-netherite-armor-grants-fire-resistance.patch => 0029-Full-netherite-armor-grants-fire-resistance.patch} (100%) rename patches/api/{0029-Add-EntityTeleportHinderedEvent.patch => 0030-Add-EntityTeleportHinderedEvent.patch} (100%) rename patches/api/{0030-Add-enchantment-target-for-bows-and-crossbows.patch => 0031-Add-enchantment-target-for-bows-and-crossbows.patch} (100%) rename patches/api/{0031-Iron-golem-poppy-calms-anger.patch => 0032-Iron-golem-poppy-calms-anger.patch} (100%) rename patches/api/{0032-API-for-any-mob-to-burn-daylight.patch => 0033-API-for-any-mob-to-burn-daylight.patch} (100%) rename patches/api/{0033-Flying-Fall-Damage-API.patch => 0034-Flying-Fall-Damage-API.patch} (100%) rename patches/api/{0034-Add-back-player-spawned-endermite-API.patch => 0035-Add-back-player-spawned-endermite-API.patch} (100%) rename patches/api/{0035-Fix-default-permission-system.patch => 0036-Fix-default-permission-system.patch} (100%) rename patches/api/{0036-Summoner-API.patch => 0037-Summoner-API.patch} (100%) rename patches/api/{0037-Clean-up-version-command-output.patch => 0038-Clean-up-version-command-output.patch} (100%) rename patches/api/{0038-Extended-OfflinePlayer-API.patch => 0039-Extended-OfflinePlayer-API.patch} (100%) rename patches/api/{0039-Added-the-ability-to-add-combustible-items.patch => 0040-Added-the-ability-to-add-combustible-items.patch} (100%) rename patches/api/{0040-Potion-NamespacedKey.patch => 0041-Potion-NamespacedKey.patch} (100%) rename patches/api/{0041-Grindstone-API.patch => 0042-Grindstone-API.patch} (100%) rename patches/api/{0042-Shears-can-have-looting-enchantment.patch => 0043-Shears-can-have-looting-enchantment.patch} (100%) rename patches/api/{0043-Lobotomize-stuck-villagers.patch => 0044-Lobotomize-stuck-villagers.patch} (100%) create mode 100644 patches/server/0001-Pufferfish-Server-Changes.patch rename patches/server/{0001-Rebrand.patch => 0002-Rebrand.patch} (96%) rename patches/server/{0002-Purpur-config-files.patch => 0003-Purpur-config-files.patch} (96%) rename patches/server/{0003-Purpur-client-support.patch => 0004-Purpur-client-support.patch} (93%) rename patches/server/{0004-Component-related-conveniences.patch => 0005-Component-related-conveniences.patch} (93%) rename patches/server/{0005-Ridables.patch => 0006-Ridables.patch} (98%) rename patches/server/{0006-Configurable-entity-base-attributes.patch => 0007-Configurable-entity-base-attributes.patch} (99%) rename patches/server/{0007-Timings-stuff.patch => 0008-Timings-stuff.patch} (79%) rename patches/server/{0008-Barrels-and-enderchests-6-rows.patch => 0009-Barrels-and-enderchests-6-rows.patch} (98%) rename patches/server/{0009-Llama-API.patch => 0010-Llama-API.patch} (98%) rename patches/server/{0010-AFK-API.patch => 0011-AFK-API.patch} (97%) rename patches/server/{0011-Bring-back-server-name.patch => 0012-Bring-back-server-name.patch} (91%) rename patches/server/{0012-Configurable-server-mod-name.patch => 0013-Configurable-server-mod-name.patch} (91%) rename patches/server/{0013-LivingEntity-safeFallDistance.patch => 0014-LivingEntity-safeFallDistance.patch} (91%) rename patches/server/{0014-Lagging-threshold.patch => 0015-Lagging-threshold.patch} (88%) rename patches/server/{0015-PlayerSetSpawnerTypeWithEggEvent.patch => 0016-PlayerSetSpawnerTypeWithEggEvent.patch} (92%) rename patches/server/{0016-EMC-MonsterEggSpawnEvent.patch => 0017-EMC-MonsterEggSpawnEvent.patch} (96%) rename patches/server/{0017-Player-invulnerabilities.patch => 0018-Player-invulnerabilities.patch} (98%) rename patches/server/{0018-Anvil-API.patch => 0019-Anvil-API.patch} (100%) rename patches/server/{0019-Configurable-villager-brain-ticks.patch => 0020-Configurable-villager-brain-ticks.patch} (72%) rename patches/server/{0020-Alternative-Keepalive-Handling.patch => 0021-Alternative-Keepalive-Handling.patch} (96%) rename patches/server/{0021-Silk-touch-spawners.patch => 0022-Silk-touch-spawners.patch} (100%) rename patches/server/{0022-MC-168772-Fix-Add-turtle-egg-block-options.patch => 0023-MC-168772-Fix-Add-turtle-egg-block-options.patch} (100%) rename patches/server/{0023-Fix-vanilla-command-permission-handler.patch => 0024-Fix-vanilla-command-permission-handler.patch} (100%) rename patches/server/{0024-Logger-settings-suppressing-pointless-logs.patch => 0025-Logger-settings-suppressing-pointless-logs.patch} (100%) rename patches/server/{0025-Disable-outdated-build-check.patch => 0026-Disable-outdated-build-check.patch} (100%) rename patches/server/{0026-Giants-AI-settings.patch => 0027-Giants-AI-settings.patch} (100%) rename patches/server/{0027-Zombie-horse-naturally-spawn.patch => 0028-Zombie-horse-naturally-spawn.patch} (95%) rename patches/server/{0028-Charged-creeper-naturally-spawn.patch => 0029-Charged-creeper-naturally-spawn.patch} (96%) rename patches/server/{0029-Rabbit-naturally-spawn-toast-and-killer.patch => 0030-Rabbit-naturally-spawn-toast-and-killer.patch} (100%) rename patches/server/{0030-Fix-outdated-server-showing-in-ping-before-server-fu.patch => 0031-Fix-outdated-server-showing-in-ping-before-server-fu.patch} (100%) rename patches/server/{0031-Tulips-change-fox-type.patch => 0032-Tulips-change-fox-type.patch} (100%) rename patches/server/{0032-Breedable-Polar-Bears.patch => 0033-Breedable-Polar-Bears.patch} (100%) rename patches/server/{0033-Chickens-can-retaliate.patch => 0034-Chickens-can-retaliate.patch} (100%) rename patches/server/{0034-Add-option-to-set-armorstand-step-height.patch => 0035-Add-option-to-set-armorstand-step-height.patch} (94%) rename patches/server/{0035-Cat-spawning-options.patch => 0036-Cat-spawning-options.patch} (100%) rename patches/server/{0036-MC-147659-Fix-non-black-cats-spawning-in-swamp-huts.patch => 0037-MC-147659-Fix-non-black-cats-spawning-in-swamp-huts.patch} (100%) rename patches/server/{0037-Cows-eat-mushrooms.patch => 0038-Cows-eat-mushrooms.patch} (100%) rename patches/server/{0038-Fix-cow-rotation-when-shearing-mooshroom.patch => 0039-Fix-cow-rotation-when-shearing-mooshroom.patch} (100%) rename patches/server/{0039-Pigs-give-saddle-back.patch => 0040-Pigs-give-saddle-back.patch} (100%) rename patches/server/{0040-Snowman-drop-and-put-back-pumpkin.patch => 0041-Snowman-drop-and-put-back-pumpkin.patch} (100%) rename patches/server/{0041-Ender-dragon-always-drop-full-exp.patch => 0042-Ender-dragon-always-drop-full-exp.patch} (95%) rename patches/server/{0042-Signs-editable-on-right-click.patch => 0043-Signs-editable-on-right-click.patch} (100%) rename patches/server/{0043-Allow-soil-to-moisten-from-water-directly-under-it.patch => 0044-Allow-soil-to-moisten-from-water-directly-under-it.patch} (100%) rename patches/server/{0044-Minecart-settings-and-WASD-controls.patch => 0045-Minecart-settings-and-WASD-controls.patch} (97%) rename patches/server/{0045-Disable-loot-drops-on-death-by-cramming.patch => 0046-Disable-loot-drops-on-death-by-cramming.patch} (91%) rename patches/server/{0046-Option-to-toggle-milk-curing-bad-omen.patch => 0047-Option-to-toggle-milk-curing-bad-omen.patch} (100%) rename patches/server/{0047-End-gateway-should-check-if-entity-can-use-portal.patch => 0048-End-gateway-should-check-if-entity-can-use-portal.patch} (100%) rename patches/server/{0048-Fix-the-dead-lagging-the-server.patch => 0049-Fix-the-dead-lagging-the-server.patch} (81%) rename patches/server/{0049-Skip-events-if-there-s-no-listeners.patch => 0050-Skip-events-if-there-s-no-listeners.patch} (93%) rename patches/server/{0050-Add-permission-for-F3-N-debug.patch => 0051-Add-permission-for-F3-N-debug.patch} (89%) rename patches/server/{0051-Configurable-TPS-Catchup.patch => 0052-Configurable-TPS-Catchup.patch} (93%) rename patches/server/{0052-Add-option-to-allow-loyalty-on-tridents-to-work-in-t.patch => 0053-Add-option-to-allow-loyalty-on-tridents-to-work-in-t.patch} (100%) rename patches/server/{0053-Add-enderman-and-creeper-griefing-controls.patch => 0054-Add-enderman-and-creeper-griefing-controls.patch} (93%) rename patches/server/{0054-Villagers-follow-emerald-blocks.patch => 0055-Villagers-follow-emerald-blocks.patch} (97%) rename patches/server/{0055-Allow-leashing-villagers.patch => 0056-Allow-leashing-villagers.patch} (94%) rename patches/server/{0056-Implement-infinite-liquids.patch => 0057-Implement-infinite-liquids.patch} (95%) rename patches/server/{0057-Make-lava-flow-speed-configurable.patch => 0058-Make-lava-flow-speed-configurable.patch} (100%) rename patches/server/{0058-Add-player-death-exp-control-options.patch => 0059-Add-player-death-exp-control-options.patch} (97%) rename patches/server/{0059-Configurable-void-damage-height-and-damage.patch => 0060-Configurable-void-damage-height-and-damage.patch} (90%) rename patches/server/{0060-Add-canSaveToDisk-to-Entity.patch => 0061-Add-canSaveToDisk-to-Entity.patch} (93%) rename patches/server/{0061-Dispenser-curse-of-binding-protection.patch => 0062-Dispenser-curse-of-binding-protection.patch} (95%) rename patches/server/{0062-Add-option-for-boats-to-eject-players-on-land.patch => 0063-Add-option-for-boats-to-eject-players-on-land.patch} (95%) rename patches/server/{0063-Mending-mends-most-damages-equipment-first.patch => 0064-Mending-mends-most-damages-equipment-first.patch} (100%) rename patches/server/{0064-Add-5-second-tps-average-in-tps.patch => 0065-Add-5-second-tps-average-in-tps.patch} (94%) rename patches/server/{0065-Implement-elytra-settings.patch => 0066-Implement-elytra-settings.patch} (98%) rename patches/server/{0066-Item-entity-immunities.patch => 0067-Item-entity-immunities.patch} (95%) rename patches/server/{0067-Add-ping-command.patch => 0068-Add-ping-command.patch} (97%) rename patches/server/{0068-Add-demo-command.patch => 0069-Add-demo-command.patch} (97%) rename patches/server/{0069-Add-credits-command.patch => 0070-Add-credits-command.patch} (97%) rename patches/server/{0070-Configurable-jockey-options.patch => 0071-Configurable-jockey-options.patch} (100%) rename patches/server/{0071-Phantoms-attracted-to-crystals-and-crystals-shoot-ph.patch => 0072-Phantoms-attracted-to-crystals-and-crystals-shoot-ph.patch} (98%) rename patches/server/{0072-Add-phantom-spawning-options.patch => 0073-Add-phantom-spawning-options.patch} (100%) rename patches/server/{0073-Implement-bed-explosion-options.patch => 0074-Implement-bed-explosion-options.patch} (100%) rename patches/server/{0074-Implement-respawn-anchor-explosion-options.patch => 0075-Implement-respawn-anchor-explosion-options.patch} (100%) rename patches/server/{0075-Add-allow-water-in-end-world-option.patch => 0076-Add-allow-water-in-end-world-option.patch} (97%) rename patches/server/{0076-Allow-color-codes-in-books.patch => 0077-Allow-color-codes-in-books.patch} (92%) rename patches/server/{0077-Entity-lifespan.patch => 0078-Entity-lifespan.patch} (88%) rename patches/server/{0078-Add-option-to-teleport-to-spawn-if-outside-world-bor.patch => 0079-Add-option-to-teleport-to-spawn-if-outside-world-bor.patch} (96%) rename patches/server/{0079-Squid-EAR-immunity.patch => 0080-Squid-EAR-immunity.patch} (94%) rename patches/server/{0080-Phantoms-burn-in-light.patch => 0081-Phantoms-burn-in-light.patch} (98%) rename patches/server/{0081-Configurable-villager-breeding.patch => 0082-Configurable-villager-breeding.patch} (93%) rename patches/server/{0082-Redstone-deactivates-spawners.patch => 0083-Redstone-deactivates-spawners.patch} (94%) rename patches/server/{0083-Totems-work-in-inventory.patch => 0084-Totems-work-in-inventory.patch} (94%) rename patches/server/{0084-Add-vindicator-johnny-spawn-chance.patch => 0085-Add-vindicator-johnny-spawn-chance.patch} (96%) rename patches/server/{0085-Add-option-to-disable-certain-block-updates.patch => 0086-Add-option-to-disable-certain-block-updates.patch} (100%) rename patches/server/{0086-Dispensers-place-anvils-option.patch => 0087-Dispensers-place-anvils-option.patch} (100%) rename patches/server/{0087-Allow-anvil-colors.patch => 0088-Allow-anvil-colors.patch} (100%) rename patches/server/{0088-Add-option-to-disable-dolphin-treasure-searching.patch => 0089-Add-option-to-disable-dolphin-treasure-searching.patch} (100%) rename patches/server/{0089-Short-enderman-height.patch => 0090-Short-enderman-height.patch} (92%) rename patches/server/{0090-Stop-squids-floating-on-top-of-water.patch => 0091-Stop-squids-floating-on-top-of-water.patch} (92%) rename patches/server/{0091-Crying-obsidian-valid-for-portal-frames.patch => 0092-Crying-obsidian-valid-for-portal-frames.patch} (100%) rename patches/server/{0092-Entities-can-use-portals-configuration.patch => 0093-Entities-can-use-portals-configuration.patch} (92%) rename patches/server/{0093-LivingEntity-broadcastItemBreak.patch => 0094-LivingEntity-broadcastItemBreak.patch} (100%) rename patches/server/{0094-Customizable-wither-health-and-healing.patch => 0095-Customizable-wither-health-and-healing.patch} (96%) rename patches/server/{0095-Allow-toggling-special-MobSpawners-per-world.patch => 0096-Allow-toggling-special-MobSpawners-per-world.patch} (98%) rename patches/server/{0096-Raid-cooldown-setting.patch => 0097-Raid-cooldown-setting.patch} (100%) rename patches/server/{0097-Despawn-rate-config-options-per-projectile-type.patch => 0098-Despawn-rate-config-options-per-projectile-type.patch} (98%) rename patches/server/{0098-Add-option-to-disable-zombie-aggressiveness-towards-.patch => 0099-Add-option-to-disable-zombie-aggressiveness-towards-.patch} (100%) rename patches/server/{0099-Add-predicate-to-recipe-s-ExactChoice-ingredient.patch => 0100-Add-predicate-to-recipe-s-ExactChoice-ingredient.patch} (100%) rename patches/server/{0100-Flying-squids-Oh-my.patch => 0101-Flying-squids-Oh-my.patch} (100%) rename patches/server/{0101-Infinity-bow-settings.patch => 0102-Infinity-bow-settings.patch} (100%) rename patches/server/{0102-Configurable-daylight-cycle.patch => 0103-Configurable-daylight-cycle.patch} (93%) rename patches/server/{0103-Allow-infinite-and-mending-enchantments-together.patch => 0104-Allow-infinite-and-mending-enchantments-together.patch} (100%) rename patches/server/{0104-Furnace-uses-lava-from-underneath.patch => 0105-Furnace-uses-lava-from-underneath.patch} (100%) rename patches/server/{0105-Arrows-should-not-reset-despawn-counter.patch => 0106-Arrows-should-not-reset-despawn-counter.patch} (91%) rename patches/server/{0106-Ability-to-re-add-farmland-mechanics-from-Alpha.patch => 0107-Ability-to-re-add-farmland-mechanics-from-Alpha.patch} (100%) rename patches/server/{0107-Add-adjustable-breeding-cooldown-to-config.patch => 0108-Add-adjustable-breeding-cooldown-to-config.patch} (97%) rename patches/server/{0108-Make-entity-breeding-times-configurable.patch => 0109-Make-entity-breeding-times-configurable.patch} (99%) rename patches/server/{0109-Apply-display-names-from-item-forms-of-entities-to-e.patch => 0110-Apply-display-names-from-item-forms-of-entities-to-e.patch} (98%) rename patches/server/{0110-Set-name-visible-when-using-a-Name-Tag-on-an-Armor-S.patch => 0111-Set-name-visible-when-using-a-Name-Tag-on-an-Armor-S.patch} (100%) rename patches/server/{0111-Add-config-for-allowing-Endermen-to-despawn-even-whi.patch => 0112-Add-config-for-allowing-Endermen-to-despawn-even-whi.patch} (93%) rename patches/server/{0112-Add-configurable-snowball-damage.patch => 0113-Add-configurable-snowball-damage.patch} (100%) rename patches/server/{0113-Changeable-Mob-Left-Handed-Chance.patch => 0114-Changeable-Mob-Left-Handed-Chance.patch} (91%) rename patches/server/{0114-Add-boat-fall-damage-config.patch => 0115-Add-boat-fall-damage-config.patch} (97%) rename patches/server/{0115-Snow-Golem-rate-of-fire-config.patch => 0116-Snow-Golem-rate-of-fire-config.patch} (100%) rename patches/server/{0116-EMC-Configurable-disable-give-dropping.patch => 0117-EMC-Configurable-disable-give-dropping.patch} (100%) rename patches/server/{0117-Option-for-Villager-Clerics-to-farm-Nether-Wart.patch => 0118-Option-for-Villager-Clerics-to-farm-Nether-Wart.patch} (98%) rename patches/server/{0118-Toggle-for-Zombified-Piglin-death-always-counting-as.patch => 0119-Toggle-for-Zombified-Piglin-death-always-counting-as.patch} (100%) rename patches/server/{0119-Spread-out-and-optimise-player-list-ticksSpread-out-.patch => 0120-Spread-out-and-optimise-player-list-ticksSpread-out-.patch} (100%) rename patches/server/{0120-Configurable-chance-for-wolves-to-spawn-rabid.patch => 0121-Configurable-chance-for-wolves-to-spawn-rabid.patch} (100%) rename patches/server/{0121-Configurable-default-collar-color.patch => 0122-Configurable-default-collar-color.patch} (100%) rename patches/server/{0122-Phantom-flames-on-swoop.patch => 0123-Phantom-flames-on-swoop.patch} (95%) rename patches/server/{0123-Option-for-chests-to-open-even-with-a-solid-block-on.patch => 0124-Option-for-chests-to-open-even-with-a-solid-block-on.patch} (94%) rename patches/server/{0124-Implement-TPSBar.patch => 0125-Implement-TPSBar.patch} (97%) rename patches/server/{0125-Striders-give-saddle-back.patch => 0126-Striders-give-saddle-back.patch} (100%) rename patches/server/{0126-PlayerBookTooLargeEvent.patch => 0127-PlayerBookTooLargeEvent.patch} (92%) rename patches/server/{0127-Full-netherite-armor-grants-fire-resistance.patch => 0128-Full-netherite-armor-grants-fire-resistance.patch} (97%) rename patches/server/{0128-Fix-rotating-UP-DOWN-CW-and-CCW.patch => 0129-Fix-rotating-UP-DOWN-CW-and-CCW.patch} (100%) rename patches/server/{0129-Add-mobGriefing-bypass-to-everything-affected.patch => 0130-Add-mobGriefing-bypass-to-everything-affected.patch} (97%) rename patches/server/{0130-Config-to-allow-Note-Block-sounds-when-blocked.patch => 0131-Config-to-allow-Note-Block-sounds-when-blocked.patch} (100%) rename patches/server/{0131-Add-EntityTeleportHinderedEvent.patch => 0132-Add-EntityTeleportHinderedEvent.patch} (100%) rename patches/server/{0132-Farmland-trampling-changes.patch => 0133-Farmland-trampling-changes.patch} (100%) rename patches/server/{0133-Movement-options-for-armor-stands.patch => 0134-Movement-options-for-armor-stands.patch} (96%) rename patches/server/{0134-Fix-stuck-in-portals.patch => 0135-Fix-stuck-in-portals.patch} (92%) rename patches/server/{0135-Toggle-for-water-sensitive-mob-damage.patch => 0136-Toggle-for-water-sensitive-mob-damage.patch} (99%) rename patches/server/{0136-Config-to-always-tame-in-Creative.patch => 0137-Config-to-always-tame-in-Creative.patch} (100%) rename patches/server/{0137-End-crystal-explosion-options.patch => 0138-End-crystal-explosion-options.patch} (98%) rename patches/server/{0138-Configs-for-if-Wither-Ender-Dragon-can-ride-vehicles.patch => 0139-Configs-for-if-Wither-Ender-Dragon-can-ride-vehicles.patch} (95%) rename patches/server/{0139-Dont-run-with-scissors.patch => 0140-Dont-run-with-scissors.patch} (97%) rename patches/server/{0140-One-Punch-Man.patch => 0141-One-Punch-Man.patch} (94%) rename patches/server/{0141-Configurable-Ender-Pearl-cooldown-damage-and-Endermi.patch => 0142-Configurable-Ender-Pearl-cooldown-damage-and-Endermi.patch} (100%) rename patches/server/{0142-Config-to-ignore-nearby-mobs-when-sleeping.patch => 0143-Config-to-ignore-nearby-mobs-when-sleeping.patch} (96%) rename patches/server/{0143-Add-back-player-spawned-endermite-API.patch => 0144-Add-back-player-spawned-endermite-API.patch} (100%) rename patches/server/{0144-Config-Enderman-aggressiveness-towards-Endermites.patch => 0145-Config-Enderman-aggressiveness-towards-Endermites.patch} (97%) rename patches/server/{0145-Config-to-ignore-Dragon-Head-wearers-and-stare-aggro.patch => 0146-Config-to-ignore-Dragon-Head-wearers-and-stare-aggro.patch} (96%) rename patches/server/{0146-Tick-fluids-config.patch => 0147-Tick-fluids-config.patch} (100%) rename patches/server/{0147-Config-to-disable-Llama-caravans.patch => 0148-Config-to-disable-Llama-caravans.patch} (97%) rename patches/server/{0148-Config-to-make-Creepers-explode-on-death.patch => 0149-Config-to-make-Creepers-explode-on-death.patch} (97%) rename patches/server/{0149-Configurable-ravager-griefable-blocks-list.patch => 0150-Configurable-ravager-griefable-blocks-list.patch} (100%) rename patches/server/{0150-Sneak-to-bulk-process-composter.patch => 0151-Sneak-to-bulk-process-composter.patch} (100%) rename patches/server/{0151-Config-for-skipping-night.patch => 0152-Config-for-skipping-night.patch} (96%) rename patches/server/{0152-Add-config-for-villager-trading.patch => 0153-Add-config-for-villager-trading.patch} (96%) rename patches/server/{0153-Allow-infinity-on-crossbows.patch => 0154-Allow-infinity-on-crossbows.patch} (98%) rename patches/server/{0154-Drowning-Settings.patch => 0155-Drowning-Settings.patch} (88%) rename patches/server/{0155-Break-individual-slabs-when-sneaking.patch => 0156-Break-individual-slabs-when-sneaking.patch} (100%) rename patches/server/{0156-Config-to-disable-hostile-mob-spawn-on-ice.patch => 0157-Config-to-disable-hostile-mob-spawn-on-ice.patch} (96%) rename patches/server/{0157-Config-to-show-Armor-Stand-arms-on-spawn.patch => 0158-Config-to-show-Armor-Stand-arms-on-spawn.patch} (96%) rename patches/server/{0158-Option-to-make-doors-require-redstone.patch => 0159-Option-to-make-doors-require-redstone.patch} (100%) rename patches/server/{0159-Config-to-allow-for-unsafe-enchants.patch => 0160-Config-to-allow-for-unsafe-enchants.patch} (100%) rename patches/server/{0160-Configurable-sponge-absorption.patch => 0161-Configurable-sponge-absorption.patch} (100%) rename patches/server/{0161-Projectile-offset-config.patch => 0162-Projectile-offset-config.patch} (100%) rename patches/server/{0162-Config-for-powered-rail-activation-distance.patch => 0163-Config-for-powered-rail-activation-distance.patch} (100%) rename patches/server/{0163-Piglin-portal-spawn-modifier.patch => 0164-Piglin-portal-spawn-modifier.patch} (96%) rename patches/server/{0164-Config-to-change-max-number-of-bees.patch => 0165-Config-to-change-max-number-of-bees.patch} (100%) rename patches/server/{0165-Config-for-wither-explosion-radius.patch => 0166-Config-for-wither-explosion-radius.patch} (100%) rename patches/server/{0166-Gamemode-extra-permissions.patch => 0167-Gamemode-extra-permissions.patch} (97%) rename patches/server/{0167-Config-for-changing-the-blocks-that-turn-into-dirt-p.patch => 0168-Config-for-changing-the-blocks-that-turn-into-dirt-p.patch} (100%) rename patches/server/{0168-Configurable-piston-push-limit.patch => 0169-Configurable-piston-push-limit.patch} (100%) rename patches/server/{0169-Configurable-broadcast-settings.patch => 0170-Configurable-broadcast-settings.patch} (97%) rename patches/server/{0170-Configurable-mob-blindness.patch => 0171-Configurable-mob-blindness.patch} (94%) rename patches/server/{0171-Hide-hidden-players-from-entity-selector.patch => 0172-Hide-hidden-players-from-entity-selector.patch} (100%) rename patches/server/{0172-Config-for-health-to-impact-Creeper-explosion-radius.patch => 0173-Config-for-health-to-impact-Creeper-explosion-radius.patch} (96%) rename patches/server/{0173-Iron-golem-calm-anger-options.patch => 0174-Iron-golem-calm-anger-options.patch} (98%) rename patches/server/{0174-Breedable-parrots.patch => 0175-Breedable-parrots.patch} (100%) rename patches/server/{0175-Configurable-powered-rail-boost-modifier.patch => 0176-Configurable-powered-rail-boost-modifier.patch} (96%) rename patches/server/{0176-Add-config-change-multiplier-critical-damage-value.patch => 0177-Add-config-change-multiplier-critical-damage-value.patch} (100%) rename patches/server/{0177-Option-to-disable-dragon-egg-teleporting.patch => 0178-Option-to-disable-dragon-egg-teleporting.patch} (100%) rename patches/server/{0178-Config-for-unverified-username-message.patch => 0179-Config-for-unverified-username-message.patch} (97%) rename patches/server/{0179-Make-anvil-cumulative-cost-configurable.patch => 0180-Make-anvil-cumulative-cost-configurable.patch} (100%) rename patches/server/{0180-ShulkerBox-allow-oversized-stacks.patch => 0181-ShulkerBox-allow-oversized-stacks.patch} (100%) rename patches/server/{0181-Bee-can-work-when-raining-or-at-night.patch => 0182-Bee-can-work-when-raining-or-at-night.patch} (100%) rename patches/server/{0182-API-for-any-mob-to-burn-daylight.patch => 0183-API-for-any-mob-to-burn-daylight.patch} (96%) rename patches/server/{0183-Config-MobEffect-by-world.patch => 0184-Config-MobEffect-by-world.patch} (100%) rename patches/server/{0184-Beacon-Activation-Range-Configurable.patch => 0185-Beacon-Activation-Range-Configurable.patch} (100%) rename patches/server/{0185-Add-toggle-for-sand-duping-fix.patch => 0186-Add-toggle-for-sand-duping-fix.patch} (95%) rename patches/server/{0186-Add-toggle-for-end-portal-safe-teleporting.patch => 0187-Add-toggle-for-end-portal-safe-teleporting.patch} (95%) rename patches/server/{0187-Flying-Fall-Damage-API.patch => 0188-Flying-Fall-Damage-API.patch} (100%) rename patches/server/{0188-Make-lightning-rod-range-configurable.patch => 0189-Make-lightning-rod-range-configurable.patch} (93%) rename patches/server/{0189-Burp-after-eating-food-fills-hunger-bar-completely.patch => 0190-Burp-after-eating-food-fills-hunger-bar-completely.patch} (97%) rename patches/server/{0190-Allow-player-join-full-server-by-permission.patch => 0191-Allow-player-join-full-server-by-permission.patch} (93%) rename patches/server/{0191-Add-permission-bypass-for-portal-waiting.patch => 0192-Add-permission-bypass-for-portal-waiting.patch} (100%) rename patches/server/{0192-Shulker-spawn-from-bullet-options.patch => 0193-Shulker-spawn-from-bullet-options.patch} (100%) rename patches/server/{0193-Eating-glow-berries-adds-glow-effect.patch => 0194-Eating-glow-berries-adds-glow-effect.patch} (100%) rename patches/server/{0194-Option-to-make-drowned-break-doors.patch => 0195-Option-to-make-drowned-break-doors.patch} (100%) rename patches/server/{0195-Configurable-hunger-starvation-damage.patch => 0196-Configurable-hunger-starvation-damage.patch} (100%) rename patches/server/{0196-Enhance-SysoutCatcher.patch => 0197-Enhance-SysoutCatcher.patch} (100%) rename patches/server/{0197-Armor-click-equip-options.patch => 0198-Armor-click-equip-options.patch} (100%) rename patches/server/{0198-Add-uptime-command.patch => 0199-Add-uptime-command.patch} (98%) rename patches/server/{0199-Structure-seed-options.patch => 0200-Structure-seed-options.patch} (100%) rename patches/server/{0200-Tool-actionable-options.patch => 0201-Tool-actionable-options.patch} (100%) rename patches/server/{0201-Store-placer-on-Block-when-placed.patch => 0202-Store-placer-on-Block-when-placed.patch} (96%) rename patches/server/{0202-Summoner-API.patch => 0203-Summoner-API.patch} (98%) rename patches/server/{0203-Customizable-sleeping-actionbar-messages.patch => 0204-Customizable-sleeping-actionbar-messages.patch} (96%) rename patches/server/{0204-option-to-disable-shulker-box-items-from-dropping-co.patch => 0205-option-to-disable-shulker-box-items-from-dropping-co.patch} (100%) rename patches/server/{0205-Silk-touchable-budding-amethyst.patch => 0206-Silk-touchable-budding-amethyst.patch} (100%) rename patches/server/{0206-Big-dripleaf-tilt-delay.patch => 0207-Big-dripleaf-tilt-delay.patch} (100%) rename patches/server/{0207-Player-ridable-in-water-option.patch => 0208-Player-ridable-in-water-option.patch} (96%) rename patches/server/{0208-Config-to-disable-Enderman-teleport-on-projectile-hi.patch => 0209-Config-to-disable-Enderman-teleport-on-projectile-hi.patch} (94%) rename patches/server/{0209-Add-compass-command.patch => 0210-Add-compass-command.patch} (98%) rename patches/server/{0210-Config-to-prevent-horses-from-standing-with-riders.patch => 0211-Config-to-prevent-horses-from-standing-with-riders.patch} (96%) rename patches/server/{0211-Toggle-for-kinetic-damage.patch => 0212-Toggle-for-kinetic-damage.patch} (93%) rename patches/server/{0212-Add-Option-for-disable-observer-clocks.patch => 0213-Add-Option-for-disable-observer-clocks.patch} (95%) rename patches/server/{0213-Customizeable-Zombie-Villager-curing-times.patch => 0214-Customizeable-Zombie-Villager-curing-times.patch} (100%) rename patches/server/{0214-Option-for-sponges-to-work-on-lava.patch => 0215-Option-for-sponges-to-work-on-lava.patch} (100%) rename patches/server/{0215-Toggle-for-Wither-s-spawn-sound.patch => 0216-Toggle-for-Wither-s-spawn-sound.patch} (96%) rename patches/server/{0216-Cactus-breaks-from-solid-neighbors-config.patch => 0217-Cactus-breaks-from-solid-neighbors-config.patch} (95%) rename patches/server/{0217-Config-to-remove-curse-of-binding-with-weakness.patch => 0218-Config-to-remove-curse-of-binding-with-weakness.patch} (100%) rename patches/server/{0218-Conduit-behavior-configuration.patch => 0219-Conduit-behavior-configuration.patch} (100%) rename patches/server/{0219-Cauldron-fill-chances.patch => 0220-Cauldron-fill-chances.patch} (100%) rename patches/server/{0220-Config-to-allow-mobs-to-pathfind-over-rails.patch => 0221-Config-to-allow-mobs-to-pathfind-over-rails.patch} (100%) rename patches/server/{0221-Shulker-change-color-with-dye.patch => 0222-Shulker-change-color-with-dye.patch} (100%) rename patches/server/{0222-Extended-OfflinePlayer-API.patch => 0223-Extended-OfflinePlayer-API.patch} (100%) rename patches/server/{0223-Added-the-ability-to-add-combustible-items.patch => 0224-Added-the-ability-to-add-combustible-items.patch} (93%) rename patches/server/{0224-Option-for-if-rain-and-thunder-should-stop-on-sleep.patch => 0225-Option-for-if-rain-and-thunder-should-stop-on-sleep.patch} (93%) rename patches/server/{0225-Chance-for-azalea-blocks-to-grow-into-trees-naturall.patch => 0226-Chance-for-azalea-blocks-to-grow-into-trees-naturall.patch} (100%) rename patches/server/{0226-Shift-right-click-to-use-exp-for-mending.patch => 0227-Shift-right-click-to-use-exp-for-mending.patch} (96%) rename patches/server/{0227-Dolphins-naturally-aggressive-to-players-chance.patch => 0228-Dolphins-naturally-aggressive-to-players-chance.patch} (100%) rename patches/server/{0228-Cows-naturally-aggressive-to-players-chance.patch => 0229-Cows-naturally-aggressive-to-players-chance.patch} (100%) rename patches/server/{0229-Option-for-beds-to-explode-on-villager-sleep.patch => 0230-Option-for-beds-to-explode-on-villager-sleep.patch} (93%) rename patches/server/{0230-Halloween-options-and-optimizations.patch => 0231-Halloween-options-and-optimizations.patch} (92%) rename patches/server/{0231-Config-for-grindstones.patch => 0232-Config-for-grindstones.patch} (100%) rename patches/server/{0232-UPnP-Port-Forwarding.patch => 0233-UPnP-Port-Forwarding.patch} (92%) rename patches/server/{0233-Campfire-option-for-lit-when-placed.patch => 0234-Campfire-option-for-lit-when-placed.patch} (100%) rename patches/server/{0234-options-to-extinguish-fire-blocks-with-snowballs.patch => 0235-options-to-extinguish-fire-blocks-with-snowballs.patch} (100%) rename patches/server/{0235-Add-option-to-disable-zombie-villagers-cure.patch => 0236-Add-option-to-disable-zombie-villagers-cure.patch} (100%) rename patches/server/{0236-Persistent-BlockEntity-Lore-and-DisplayName.patch => 0237-Persistent-BlockEntity-Lore-and-DisplayName.patch} (99%) rename patches/server/{0237-Signs-allow-color-codes.patch => 0238-Signs-allow-color-codes.patch} (95%) rename patches/server/{0238-Kelp-weeping-and-twisting-vines-configurable-max-gro.patch => 0239-Kelp-weeping-and-twisting-vines-configurable-max-gro.patch} (100%) rename patches/server/{0239-Mobs-always-drop-experience.patch => 0240-Mobs-always-drop-experience.patch} (99%) rename patches/server/{0240-Potion-NamespacedKey.patch => 0241-Potion-NamespacedKey.patch} (100%) rename patches/server/{0241-Grindstone-API.patch => 0242-Grindstone-API.patch} (100%) rename patches/server/{0242-Option-to-prevent-spiders-from-climbing-world-border.patch => 0243-Option-to-prevent-spiders-from-climbing-world-border.patch} (93%) rename patches/server/{0243-Ability-for-hoe-to-replant-crops-and-nether-warts.patch => 0244-Ability-for-hoe-to-replant-crops-and-nether-warts.patch} (100%) rename patches/server/{0244-Shearing-jeb-produces-random-color-wool.patch => 0245-Shearing-jeb-produces-random-color-wool.patch} (100%) rename patches/server/{0245-Turtle-eggs-random-tick-crack-chance.patch => 0246-Turtle-eggs-random-tick-crack-chance.patch} (100%) rename patches/server/{0246-Mob-head-visibility-percent.patch => 0247-Mob-head-visibility-percent.patch} (96%) rename patches/server/{0247-Configurable-valid-characters-for-usernames.patch => 0248-Configurable-valid-characters-for-usernames.patch} (95%) rename patches/server/{0248-Shears-can-have-looting-enchantment.patch => 0249-Shears-can-have-looting-enchantment.patch} (100%) rename patches/server/{0249-Stop-bees-from-dying-after-stinging.patch => 0250-Stop-bees-from-dying-after-stinging.patch} (100%) rename patches/server/{0250-Give-bee-counts-in-beehives-to-Purpur-clients.patch => 0251-Give-bee-counts-in-beehives-to-Purpur-clients.patch} (91%) rename patches/server/{0251-Configurable-farmland-trample-height.patch => 0252-Configurable-farmland-trample-height.patch} (100%) rename patches/server/{0252-Configurable-player-pickup-exp-delay.patch => 0253-Configurable-player-pickup-exp-delay.patch} (97%) rename patches/server/{0253-Allow-void-trading.patch => 0254-Allow-void-trading.patch} (94%) rename patches/server/{0254-Dont-eat-blocks-in-non-ticking-chunks.patch => 0255-Dont-eat-blocks-in-non-ticking-chunks.patch} (74%) rename patches/server/{0255-Configurable-phantom-size.patch => 0256-Configurable-phantom-size.patch} (96%) rename patches/server/{0256-Configurable-food-attributes.patch => 0257-Configurable-food-attributes.patch} (100%) rename patches/server/{0257-Max-joins-per-second.patch => 0258-Max-joins-per-second.patch} (100%) rename patches/server/{0258-Configurable-minimum-demand-for-trades.patch => 0259-Configurable-minimum-demand-for-trades.patch} (95%) rename patches/server/{0259-Lobotomize-stuck-villagers.patch => 0260-Lobotomize-stuck-villagers.patch} (86%) rename patches/server/{0260-Option-for-villager-display-trade-item.patch => 0261-Option-for-villager-display-trade-item.patch} (100%) rename patches/server/{0261-Fill-command-max-area-option.patch => 0262-Fill-command-max-area-option.patch} (100%) rename patches/server/{0262-MC-238526-Fix-spawner-not-spawning-water-animals-cor.patch => 0263-MC-238526-Fix-spawner-not-spawning-water-animals-cor.patch} (100%) rename patches/server/{0263-Config-for-mob-last-hurt-by-player-time.patch => 0264-Config-for-mob-last-hurt-by-player-time.patch} (93%) rename patches/server/{0264-Anvil-repair-damage-options.patch => 0265-Anvil-repair-damage-options.patch} (100%) rename patches/server/{0265-Fix-legacy-colors-in-console.patch => 0266-Fix-legacy-colors-in-console.patch} (97%) rename patches/server/{0266-Option-to-disable-turtle-egg-trampling-with-feather-.patch => 0267-Option-to-disable-turtle-egg-trampling-with-feather-.patch} (100%) rename patches/server/{0267-Add-toggle-for-enchant-level-clamping.patch => 0268-Add-toggle-for-enchant-level-clamping.patch} (100%) rename patches/server/{0268-Config-to-prevent-horses-from-standing-when-hurt.patch => 0269-Config-to-prevent-horses-from-standing-when-hurt.patch} (96%) rename patches/server/{0269-Drop-incompatible-tests.patch => 0270-Drop-incompatible-tests.patch} (100%) rename patches/server/{0270-Implement-configurable-search-radius-for-villagers-t.patch => 0271-Implement-configurable-search-radius-for-villagers-t.patch} (94%) rename patches/server/{0271-Stonecutter-damage.patch => 0272-Stonecutter-damage.patch} (100%) rename patches/server/{0272-Configurable-damage-settings-for-magma-blocks.patch => 0273-Configurable-damage-settings-for-magma-blocks.patch} (100%) rename patches/server/{0273-Add-config-for-snow-on-blue-ice.patch => 0274-Add-config-for-snow-on-blue-ice.patch} (100%) diff --git a/patches/api/0001-Pufferfish-API-Changes.patch b/patches/api/0001-Pufferfish-API-Changes.patch new file mode 100644 index 000000000..44c2a2c37 --- /dev/null +++ b/patches/api/0001-Pufferfish-API-Changes.patch @@ -0,0 +1,514 @@ +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 921b301de020ce73126ca518556b3435e776783d..104d3841879f64510ddd4b20b80b6cb24c4ecd24 100644 +--- a/build.gradle.kts ++++ b/build.gradle.kts +@@ -40,6 +40,7 @@ dependencies { + apiAndDocs("net.kyori:adventure-text-serializer-plain") + 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.2") + implementation("org.ow2.asm:asm-commons:9.2") +@@ -82,6 +83,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..10310fdd53de28efb8a8250f6d3b0c8eb08fb68a +--- /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..93f5d7ca36e043e6c0f959450d38e6946b348eaf +--- /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) { ++ 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..a84889d3e9cfc4d7ab5f867820a6484c6070711b +--- /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..ae2464920c9412ac90b819a540ee58be0741465f +--- /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 b937441d2fb46b108644c49fcf073859765aa02e..d95b01bfd0657cf089c0f5412453cca08e36c02f 100644 +--- a/src/main/java/org/bukkit/map/MapPalette.java ++++ b/src/main/java/org/bukkit/map/MapPalette.java +@@ -1,5 +1,6 @@ + package org.bukkit.map; + ++import gg.pufferfish.pufferfish.simd.SIMDDetection; + import java.awt.Color; + import java.awt.Graphics2D; + import java.awt.Image; +@@ -34,7 +35,7 @@ public final class MapPalette { + } + + @NotNull +- static final Color[] colors = { ++ public static final Color[] colors = { // Pufferfish - public access + c(0, 0, 0), c(0, 0, 0), c(0, 0, 0), c(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), +@@ -205,9 +206,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 ed07f5820281b139739f673fa4e25171de81b894..aed2209b66f11a0d03473cf19437f3da0e9e573a 100644 +--- a/src/main/java/org/bukkit/plugin/SimplePluginManager.java ++++ b/src/main/java/org/bukkit/plugin/SimplePluginManager.java +@@ -617,7 +617,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 +@@ -676,9 +678,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 8ff78fad47f6086aa289e32590f4fbec24b3d500..a16c841751bc44e46d27fc4efbfc2ab23cc7b0d7 100644 +--- a/src/main/java/org/bukkit/plugin/java/JavaPluginLoader.java ++++ b/src/main/java/org/bukkit/plugin/java/JavaPluginLoader.java +@@ -369,7 +369,9 @@ 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; +@@ -398,7 +400,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 345394132df70593800127d34a38f8f8a4dafe00..4f736a267eb4c8a3bedb2d02fb30468484b991d5 100644 +--- a/src/main/java/org/bukkit/plugin/java/PluginClassLoader.java ++++ b/src/main/java/org/bukkit/plugin/java/PluginClassLoader.java +@@ -46,6 +46,8 @@ public final class PluginClassLoader extends URLClassLoader { // Spigot + private final Set seenIllegalAccess = Collections.newSetFromMap(new ConcurrentHashMap<>()); + private java.util.logging.Logger logger; // Paper - add field + ++ private boolean closed = false; // Pufferfish ++ + static { + ClassLoader.registerAsParallelCapable(); + } +@@ -151,6 +153,7 @@ public final class PluginClassLoader extends URLClassLoader { // Spigot + 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.")) { +@@ -158,7 +161,7 @@ public final class PluginClassLoader extends URLClassLoader { // Spigot + } + 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); + +@@ -213,6 +216,7 @@ public final class PluginClassLoader extends URLClassLoader { // Spigot + try { + super.close(); + } finally { ++ this.closed = true; // Pufferfish + jar.close(); + } + } diff --git a/patches/api/0001-Build-System-Changes.patch b/patches/api/0002-Build-System-Changes.patch similarity index 85% rename from patches/api/0001-Build-System-Changes.patch rename to patches/api/0002-Build-System-Changes.patch index 62f9e9e71..77f367cc3 100644 --- a/patches/api/0001-Build-System-Changes.patch +++ b/patches/api/0002-Build-System-Changes.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Build System Changes diff --git a/build.gradle.kts b/build.gradle.kts -index 921b301de020ce73126ca518556b3435e776783d..40b21b114a52a0388d7c9b805c90c27e88d98cd0 100644 +index 104d3841879f64510ddd4b20b80b6cb24c4ecd24..10fa4d1478b9f1173dd4ec887cf231356fedd65d 100644 --- a/build.gradle.kts +++ b/build.gradle.kts -@@ -94,6 +94,8 @@ tasks.jar { +@@ -102,6 +102,8 @@ tasks.jar { } tasks.withType { diff --git a/patches/api/0002-Purpur-config-files.patch b/patches/api/0003-Purpur-config-files.patch similarity index 91% rename from patches/api/0002-Purpur-config-files.patch rename to patches/api/0003-Purpur-config-files.patch index 7da5a1b3e..b1bbc1e33 100644 --- a/patches/api/0002-Purpur-config-files.patch +++ b/patches/api/0003-Purpur-config-files.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Purpur config files diff --git a/src/main/java/org/bukkit/Server.java b/src/main/java/org/bukkit/Server.java -index 79b26045a68ebb9b01e5bd06abbccaaef5489777..30a1ba5ec7752a1771046072d00ed1718e6d0b84 100644 +index 30b49aed62fa67276e8964922ea3f84458d854bb..1895962c5ad0e9549cc90b0fa2861b7874d3e5aa 100644 --- a/src/main/java/org/bukkit/Server.java +++ b/src/main/java/org/bukkit/Server.java @@ -1897,6 +1897,18 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi diff --git a/patches/api/0003-Purpur-client-support.patch b/patches/api/0004-Purpur-client-support.patch similarity index 100% rename from patches/api/0003-Purpur-client-support.patch rename to patches/api/0004-Purpur-client-support.patch diff --git a/patches/api/0004-Default-permissions.patch b/patches/api/0005-Default-permissions.patch similarity index 100% rename from patches/api/0004-Default-permissions.patch rename to patches/api/0005-Default-permissions.patch diff --git a/patches/api/0005-Ridables.patch b/patches/api/0006-Ridables.patch similarity index 100% rename from patches/api/0005-Ridables.patch rename to patches/api/0006-Ridables.patch diff --git a/patches/api/0006-Allow-inventory-resizing.patch b/patches/api/0007-Allow-inventory-resizing.patch similarity index 100% rename from patches/api/0006-Allow-inventory-resizing.patch rename to patches/api/0007-Allow-inventory-resizing.patch diff --git a/patches/api/0007-Llama-API.patch b/patches/api/0008-Llama-API.patch similarity index 100% rename from patches/api/0007-Llama-API.patch rename to patches/api/0008-Llama-API.patch diff --git a/patches/api/0008-AFK-API.patch b/patches/api/0009-AFK-API.patch similarity index 100% rename from patches/api/0008-AFK-API.patch rename to patches/api/0009-AFK-API.patch diff --git a/patches/api/0009-Bring-back-server-name.patch b/patches/api/0010-Bring-back-server-name.patch similarity index 100% rename from patches/api/0009-Bring-back-server-name.patch rename to patches/api/0010-Bring-back-server-name.patch diff --git a/patches/api/0010-ExecuteCommandEvent.patch b/patches/api/0011-ExecuteCommandEvent.patch similarity index 100% rename from patches/api/0010-ExecuteCommandEvent.patch rename to patches/api/0011-ExecuteCommandEvent.patch diff --git a/patches/api/0011-LivingEntity-safeFallDistance.patch b/patches/api/0012-LivingEntity-safeFallDistance.patch similarity index 100% rename from patches/api/0011-LivingEntity-safeFallDistance.patch rename to patches/api/0012-LivingEntity-safeFallDistance.patch diff --git a/patches/api/0012-Lagging-threshold.patch b/patches/api/0013-Lagging-threshold.patch similarity index 100% rename from patches/api/0012-Lagging-threshold.patch rename to patches/api/0013-Lagging-threshold.patch diff --git a/patches/api/0013-PlayerSetSpawnerTypeWithEggEvent.patch b/patches/api/0014-PlayerSetSpawnerTypeWithEggEvent.patch similarity index 100% rename from patches/api/0013-PlayerSetSpawnerTypeWithEggEvent.patch rename to patches/api/0014-PlayerSetSpawnerTypeWithEggEvent.patch diff --git a/patches/api/0014-EMC-MonsterEggSpawnEvent.patch b/patches/api/0015-EMC-MonsterEggSpawnEvent.patch similarity index 100% rename from patches/api/0014-EMC-MonsterEggSpawnEvent.patch rename to patches/api/0015-EMC-MonsterEggSpawnEvent.patch diff --git a/patches/api/0015-Player-invulnerabilities.patch b/patches/api/0016-Player-invulnerabilities.patch similarity index 100% rename from patches/api/0015-Player-invulnerabilities.patch rename to patches/api/0016-Player-invulnerabilities.patch diff --git a/patches/api/0016-Anvil-API.patch b/patches/api/0017-Anvil-API.patch similarity index 100% rename from patches/api/0016-Anvil-API.patch rename to patches/api/0017-Anvil-API.patch diff --git a/patches/api/0017-ItemStack-convenience-methods.patch b/patches/api/0018-ItemStack-convenience-methods.patch similarity index 100% rename from patches/api/0017-ItemStack-convenience-methods.patch rename to patches/api/0018-ItemStack-convenience-methods.patch diff --git a/patches/api/0018-Phantoms-attracted-to-crystals-and-crystals-shoot-ph.patch b/patches/api/0019-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/0019-Phantoms-attracted-to-crystals-and-crystals-shoot-ph.patch diff --git a/patches/api/0019-ChatColor-conveniences.patch b/patches/api/0020-ChatColor-conveniences.patch similarity index 100% rename from patches/api/0019-ChatColor-conveniences.patch rename to patches/api/0020-ChatColor-conveniences.patch diff --git a/patches/api/0020-LivingEntity-broadcastItemBreak.patch b/patches/api/0021-LivingEntity-broadcastItemBreak.patch similarity index 100% rename from patches/api/0020-LivingEntity-broadcastItemBreak.patch rename to patches/api/0021-LivingEntity-broadcastItemBreak.patch diff --git a/patches/api/0021-Item-entity-immunities.patch b/patches/api/0022-Item-entity-immunities.patch similarity index 100% rename from patches/api/0021-Item-entity-immunities.patch rename to patches/api/0022-Item-entity-immunities.patch diff --git a/patches/api/0022-Spigot-Improve-output-of-plugins-command.patch b/patches/api/0023-Spigot-Improve-output-of-plugins-command.patch similarity index 100% rename from patches/api/0022-Spigot-Improve-output-of-plugins-command.patch rename to patches/api/0023-Spigot-Improve-output-of-plugins-command.patch diff --git a/patches/api/0023-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/0023-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/0024-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/0024-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/0025-Alphabetize-in-game-plugins-list.patch b/patches/api/0026-Alphabetize-in-game-plugins-list.patch similarity index 100% rename from patches/api/0025-Alphabetize-in-game-plugins-list.patch rename to patches/api/0026-Alphabetize-in-game-plugins-list.patch diff --git a/patches/api/0026-Rabid-Wolf-API.patch b/patches/api/0027-Rabid-Wolf-API.patch similarity index 100% rename from patches/api/0026-Rabid-Wolf-API.patch rename to patches/api/0027-Rabid-Wolf-API.patch diff --git a/patches/api/0027-PlayerBookTooLargeEvent.patch b/patches/api/0028-PlayerBookTooLargeEvent.patch similarity index 100% rename from patches/api/0027-PlayerBookTooLargeEvent.patch rename to patches/api/0028-PlayerBookTooLargeEvent.patch diff --git a/patches/api/0028-Full-netherite-armor-grants-fire-resistance.patch b/patches/api/0029-Full-netherite-armor-grants-fire-resistance.patch similarity index 100% rename from patches/api/0028-Full-netherite-armor-grants-fire-resistance.patch rename to patches/api/0029-Full-netherite-armor-grants-fire-resistance.patch diff --git a/patches/api/0029-Add-EntityTeleportHinderedEvent.patch b/patches/api/0030-Add-EntityTeleportHinderedEvent.patch similarity index 100% rename from patches/api/0029-Add-EntityTeleportHinderedEvent.patch rename to patches/api/0030-Add-EntityTeleportHinderedEvent.patch diff --git a/patches/api/0030-Add-enchantment-target-for-bows-and-crossbows.patch b/patches/api/0031-Add-enchantment-target-for-bows-and-crossbows.patch similarity index 100% rename from patches/api/0030-Add-enchantment-target-for-bows-and-crossbows.patch rename to patches/api/0031-Add-enchantment-target-for-bows-and-crossbows.patch diff --git a/patches/api/0031-Iron-golem-poppy-calms-anger.patch b/patches/api/0032-Iron-golem-poppy-calms-anger.patch similarity index 100% rename from patches/api/0031-Iron-golem-poppy-calms-anger.patch rename to patches/api/0032-Iron-golem-poppy-calms-anger.patch diff --git a/patches/api/0032-API-for-any-mob-to-burn-daylight.patch b/patches/api/0033-API-for-any-mob-to-burn-daylight.patch similarity index 100% rename from patches/api/0032-API-for-any-mob-to-burn-daylight.patch rename to patches/api/0033-API-for-any-mob-to-burn-daylight.patch diff --git a/patches/api/0033-Flying-Fall-Damage-API.patch b/patches/api/0034-Flying-Fall-Damage-API.patch similarity index 100% rename from patches/api/0033-Flying-Fall-Damage-API.patch rename to patches/api/0034-Flying-Fall-Damage-API.patch diff --git a/patches/api/0034-Add-back-player-spawned-endermite-API.patch b/patches/api/0035-Add-back-player-spawned-endermite-API.patch similarity index 100% rename from patches/api/0034-Add-back-player-spawned-endermite-API.patch rename to patches/api/0035-Add-back-player-spawned-endermite-API.patch diff --git a/patches/api/0035-Fix-default-permission-system.patch b/patches/api/0036-Fix-default-permission-system.patch similarity index 100% rename from patches/api/0035-Fix-default-permission-system.patch rename to patches/api/0036-Fix-default-permission-system.patch diff --git a/patches/api/0036-Summoner-API.patch b/patches/api/0037-Summoner-API.patch similarity index 100% rename from patches/api/0036-Summoner-API.patch rename to patches/api/0037-Summoner-API.patch diff --git a/patches/api/0037-Clean-up-version-command-output.patch b/patches/api/0038-Clean-up-version-command-output.patch similarity index 100% rename from patches/api/0037-Clean-up-version-command-output.patch rename to patches/api/0038-Clean-up-version-command-output.patch diff --git a/patches/api/0038-Extended-OfflinePlayer-API.patch b/patches/api/0039-Extended-OfflinePlayer-API.patch similarity index 100% rename from patches/api/0038-Extended-OfflinePlayer-API.patch rename to patches/api/0039-Extended-OfflinePlayer-API.patch diff --git a/patches/api/0039-Added-the-ability-to-add-combustible-items.patch b/patches/api/0040-Added-the-ability-to-add-combustible-items.patch similarity index 100% rename from patches/api/0039-Added-the-ability-to-add-combustible-items.patch rename to patches/api/0040-Added-the-ability-to-add-combustible-items.patch diff --git a/patches/api/0040-Potion-NamespacedKey.patch b/patches/api/0041-Potion-NamespacedKey.patch similarity index 100% rename from patches/api/0040-Potion-NamespacedKey.patch rename to patches/api/0041-Potion-NamespacedKey.patch diff --git a/patches/api/0041-Grindstone-API.patch b/patches/api/0042-Grindstone-API.patch similarity index 100% rename from patches/api/0041-Grindstone-API.patch rename to patches/api/0042-Grindstone-API.patch diff --git a/patches/api/0042-Shears-can-have-looting-enchantment.patch b/patches/api/0043-Shears-can-have-looting-enchantment.patch similarity index 100% rename from patches/api/0042-Shears-can-have-looting-enchantment.patch rename to patches/api/0043-Shears-can-have-looting-enchantment.patch diff --git a/patches/api/0043-Lobotomize-stuck-villagers.patch b/patches/api/0044-Lobotomize-stuck-villagers.patch similarity index 100% rename from patches/api/0043-Lobotomize-stuck-villagers.patch rename to patches/api/0044-Lobotomize-stuck-villagers.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..28c7a9325 --- /dev/null +++ b/patches/server/0001-Pufferfish-Server-Changes.patch @@ -0,0 +1,4353 @@ +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 eefbd0a742b5875e0e9826b87c6bd4da66b2d7f7..4f01bbc22b2e94d5415c36c8cd828e0551e929aa 100644 +--- a/build.gradle.kts ++++ b/build.gradle.kts +@@ -9,8 +9,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-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") +@@ -44,12 +48,28 @@ 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.30") ++ implementation ("me.carleslc.Simple-YAML:Simple-Yaml:1.8") { ++ exclude(group="org.yaml", module="snakeyaml") ++ } ++ // Pufferfish end ++ implementation("com.github.technove:Flare:34637f3f87") // Pufferfish - flare ++ + 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") + } + + val craftbukkitPackageVersion = "1_19_R1" // 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 +82,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 7b1843e16745ca8db2244e17490d291401f22679..061716934ba0a1f01e4d85d664034f72b3c7a765 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(); +@@ -603,7 +603,7 @@ public class Metrics { + + metrics.addCustomChart(new Metrics.SingleLineChart("players", () -> Bukkit.getOnlinePlayers().size())); + metrics.addCustomChart(new Metrics.SimplePie("online_mode", () -> Bukkit.getOnlineMode() ? "online" : "offline")); +- metrics.addCustomChart(new Metrics.SimplePie("paper_version", () -> (Metrics.class.getPackage().getImplementationVersion() != null) ? Metrics.class.getPackage().getImplementationVersion() : "unknown")); ++ metrics.addCustomChart(new Metrics.SimplePie("pufferfish_version", () -> (Metrics.class.getPackage().getImplementationVersion() != null) ? Metrics.class.getPackage().getImplementationVersion() : "unknown")); + + 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 c89f6986eda5a132a948732ea1b6923370685317..a69c13e20040c1561d9c2d4d89ec7d4e635134fc 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..020368da69b9a492155f6de6297f74732f4ab6ea +--- /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..a125abc75ed2bbd905c8fdec442416a45264f531 +--- /dev/null ++++ b/src/main/java/gg/pufferfish/pufferfish/PufferfishConfig.java +@@ -0,0 +1,313 @@ ++package gg.pufferfish.pufferfish; ++ ++import gg.pufferfish.pufferfish.simd.SIMDDetection; ++import java.io.File; ++import java.io.IOException; ++import java.util.Collections; ++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.core.Registry; ++import net.minecraft.world.entity.EntityType; ++import java.lang.reflect.Method; ++import java.lang.reflect.Modifier; ++import java.util.List; ++import gg.pufferfish.pufferfish.flare.FlareCommand; ++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; ++import org.bukkit.command.SimpleCommandMap; ++ ++import java.lang.reflect.Method; ++import java.lang.reflect.Modifier; ++import java.util.List; ++import java.net.URI; ++import java.util.Collections; ++ ++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; ++ } catch (NoClassDefFoundError | Exception ignored) {} ++ ++ 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 and Java 18."); ++ } 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 : Registry.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 : Registry.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 URI profileWebUrl; ++ private static void profilerOptions() { ++ profileWebUrl = URI.create(getString("flare.url", "https://flare.airplane.gg", "Sets the server to use for profiles.")); ++ ++ setComment("flare", "Configures Flare, the built-in profiler"); ++ } ++ ++ ++ public static String accessToken; ++ private static void airplaneWebServices() { ++ accessToken = getString("web-services.token", ""); ++ // todo lookup token (off-thread) and let users know if their token is valid ++ if (accessToken.length() > 0) { ++ gg.pufferfish.pufferfish.flare.FlareSetup.init(); // Pufferfish ++ SimpleCommandMap commandMap = MinecraftServer.getServer().server.getCommandMap(); ++ if (commandMap.getCommand("flare") == null) { ++ commandMap.register("flare", "Pufferfish", new FlareCommand()); ++ } ++ } ++ ++ setComment("web-services", "Options for connecting to Pufferfish/Airplane's online utilities"); ++ ++ } ++ ++ ++ public static boolean disableMethodProfiler; ++ private static void miscSettings() { ++ disableMethodProfiler = getBoolean("misc.disable-method-profiler", true); ++ 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..adafc4fd661cf080b004b86c3eaed231a0133101 +--- /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.18/lastSuccessfulBuild/buildNumber"); ++ private static final String GITHUB_FORMAT = "https://api.github.com/repos/pufferfish-gg/Pufferfish/compare/ver/1.18...%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/compat/ServerConfigurations.java b/src/main/java/gg/pufferfish/pufferfish/compat/ServerConfigurations.java +new file mode 100644 +index 0000000000000000000000000000000000000000..f0ec1f3944c00d38537f6f3b3f13236b22562458 +--- /dev/null ++++ b/src/main/java/gg/pufferfish/pufferfish/compat/ServerConfigurations.java +@@ -0,0 +1,78 @@ ++package gg.pufferfish.pufferfish.compat; ++ ++import co.aikar.timings.TimingsManager; ++import com.google.common.io.Files; ++import org.bukkit.configuration.InvalidConfigurationException; ++import org.bukkit.configuration.file.YamlConfiguration; ++ ++import java.io.ByteArrayOutputStream; ++import java.io.File; ++import java.io.FileInputStream; ++import java.io.IOException; ++import java.nio.charset.StandardCharsets; ++import java.util.Arrays; ++import java.util.HashMap; ++import java.util.List; ++import java.util.Map; ++import java.util.Properties; ++import java.util.stream.Collectors; ++ ++public class ServerConfigurations { ++ ++ public static final String[] configurationFiles = new String[]{ ++ "server.properties", ++ "bukkit.yml", ++ "spigot.yml", ++ "paper.yml", ++ "pufferfish.yml" ++ }; ++ ++ public static Map getCleanCopies() throws IOException { ++ Map files = new HashMap<>(configurationFiles.length); ++ for (String file : configurationFiles) { ++ files.put(file, getCleanCopy(file)); ++ } ++ return files; ++ } ++ ++ public static String getCleanCopy(String configName) throws IOException { ++ File file = new File(configName); ++ List hiddenConfigs = TimingsManager.hiddenConfigs; ++ ++ switch (Files.getFileExtension(configName)) { ++ case "properties": { ++ Properties properties = new Properties(); ++ try (FileInputStream inputStream = new FileInputStream(file)) { ++ properties.load(inputStream); ++ } ++ for (String hiddenConfig : hiddenConfigs) { ++ properties.remove(hiddenConfig); ++ } ++ ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); ++ properties.store(outputStream, ""); ++ return Arrays.stream(outputStream.toString() ++ .split("\n")) ++ .filter(line -> !line.startsWith("#")) ++ .collect(Collectors.joining("\n")); ++ } ++ case "yml": { ++ YamlConfiguration configuration = new YamlConfiguration(); ++ try { ++ configuration.load(file); ++ } catch (InvalidConfigurationException e) { ++ throw new IOException(e); ++ } ++ configuration.options().header(null); ++ for (String key : configuration.getKeys(true)) { ++ if (hiddenConfigs.contains(key)) { ++ configuration.set(key, null); ++ } ++ } ++ return configuration.saveToString(); ++ } ++ default: ++ throw new IllegalArgumentException("Bad file type " + configName); ++ } ++ } ++ ++} +diff --git a/src/main/java/gg/pufferfish/pufferfish/flare/CustomCategories.java b/src/main/java/gg/pufferfish/pufferfish/flare/CustomCategories.java +new file mode 100644 +index 0000000000000000000000000000000000000000..401b42e29bccb5251684062f10b2e0f8b091bc95 +--- /dev/null ++++ b/src/main/java/gg/pufferfish/pufferfish/flare/CustomCategories.java +@@ -0,0 +1,8 @@ ++package gg.pufferfish.pufferfish.flare; ++ ++import co.technove.flare.live.category.GraphCategory; ++ ++public class CustomCategories { ++ public static final GraphCategory MC_PERF = new GraphCategory("MC Performance"); ++ public static final GraphCategory ENTITIES_AND_CHUNKS = new GraphCategory("Entities & Chunks"); ++} +diff --git a/src/main/java/gg/pufferfish/pufferfish/flare/FlareCommand.java b/src/main/java/gg/pufferfish/pufferfish/flare/FlareCommand.java +new file mode 100644 +index 0000000000000000000000000000000000000000..3785d1512eb650f91d58903672c059e7449598fc +--- /dev/null ++++ b/src/main/java/gg/pufferfish/pufferfish/flare/FlareCommand.java +@@ -0,0 +1,136 @@ ++package gg.pufferfish.pufferfish.flare; ++ ++import co.technove.flare.exceptions.UserReportableException; ++import co.technove.flare.internal.profiling.ProfileType; ++import gg.pufferfish.pufferfish.PufferfishConfig; ++import net.kyori.adventure.text.Component; ++import net.kyori.adventure.text.event.ClickEvent; ++import net.kyori.adventure.text.format.NamedTextColor; ++import net.kyori.adventure.text.format.TextColor; ++import net.kyori.adventure.text.format.TextDecoration; ++import net.minecraft.server.MinecraftServer; ++import org.apache.logging.log4j.Level; ++import org.bukkit.Bukkit; ++import org.bukkit.command.Command; ++import org.bukkit.command.CommandSender; ++import org.bukkit.command.ConsoleCommandSender; ++import org.bukkit.craftbukkit.scheduler.MinecraftInternalPlugin; ++import org.bukkit.util.StringUtil; ++import org.jetbrains.annotations.NotNull; ++ ++import java.time.Duration; ++import java.util.ArrayList; ++import java.util.Collections; ++import java.util.List; ++ ++public class FlareCommand extends Command { ++ ++ private static final String BASE_URL = "https://blog.airplane.gg/flare-tutorial/#setting-the-access-token"; ++ private static final TextColor HEX = TextColor.fromHexString("#e3eaea"); ++ private static final Component PREFIX = Component.text() ++ .append(Component.text("Flare ✈") ++ .color(TextColor.fromHexString("#6a7eda")) ++ .decoration(TextDecoration.BOLD, true) ++ .append(Component.text(" ", HEX) ++ .decoration(TextDecoration.BOLD, false))) ++ .asComponent(); ++ ++ public FlareCommand() { ++ super("flare", "Profile your server with Flare", "/flare", Collections.singletonList("profile")); ++ this.setPermission("airplane.flare"); ++ } ++ ++ @Override ++ public boolean execute(@NotNull CommandSender sender, @NotNull String commandLabel, String @NotNull [] args) { ++ if (!testPermission(sender)) return true; ++ if (PufferfishConfig.accessToken.length() == 0) { ++ Component clickable = Component.text(BASE_URL, HEX, TextDecoration.UNDERLINED).clickEvent(ClickEvent.clickEvent(ClickEvent.Action.OPEN_URL, BASE_URL)); ++ ++ sender.sendMessage(PREFIX.append(Component.text("Flare currently requires an access token to use. To learn more, visit ").color(HEX).append(clickable))); ++ return true; ++ } ++ ++ if (!FlareSetup.isSupported()) { ++ sender.sendMessage(PREFIX.append( ++ Component.text("Profiling is not supported in this environment, check your startup logs for the error.", NamedTextColor.RED))); ++ return true; ++ } ++ if (ProfilingManager.isProfiling()) { ++ if (args.length == 1 && args[0].equalsIgnoreCase("status")) { ++ sender.sendMessage(PREFIX.append(Component.text("Current profile has been ran for " + ProfilingManager.getTimeRan().toString(), HEX))); ++ return true; ++ } ++ if (ProfilingManager.stop()) { ++ if (!(sender instanceof ConsoleCommandSender)) { ++ sender.sendMessage(PREFIX.append(Component.text("Profiling has been stopped.", HEX))); ++ } ++ } else { ++ sender.sendMessage(PREFIX.append(Component.text("Profiling has already been stopped.", HEX))); ++ } ++ } else { ++ ProfileType profileType = ProfileType.ITIMER; ++ if (args.length > 0) { ++ try { ++ profileType = ProfileType.valueOf(args[0].toUpperCase()); ++ } catch (Exception e) { ++ sender.sendMessage(PREFIX.append(Component ++ .text("Invalid profile type ", HEX) ++ .append(Component.text(args[0], HEX, TextDecoration.BOLD) ++ .append(Component.text("!", HEX))) ++ )); ++ } ++ } ++ ProfileType finalProfileType = profileType; ++ Bukkit.getScheduler().runTaskAsynchronously(new MinecraftInternalPlugin(), () -> { ++ try { ++ if (ProfilingManager.start(finalProfileType)) { ++ if (!(sender instanceof ConsoleCommandSender)) { ++ sender.sendMessage(PREFIX.append(Component ++ .text("Flare has been started: " + ProfilingManager.getProfilingUri(), HEX) ++ .clickEvent(ClickEvent.openUrl(ProfilingManager.getProfilingUri())) ++ )); ++ sender.sendMessage(PREFIX.append(Component.text(" Run /" + commandLabel + " to stop the Flare.", HEX))); ++ } ++ } else { ++ sender.sendMessage(PREFIX.append(Component ++ .text("Flare has already been started: " + ProfilingManager.getProfilingUri(), HEX) ++ .clickEvent(ClickEvent.openUrl(ProfilingManager.getProfilingUri())) ++ )); ++ } ++ } catch (UserReportableException e) { ++ sender.sendMessage(Component.text("Flare failed to start: " + e.getUserError(), NamedTextColor.RED)); ++ if (e.getCause() != null) { ++ MinecraftServer.LOGGER.warn("Flare failed to start", e); ++ } ++ } ++ }); ++ } ++ return true; ++ } ++ ++ @Override ++ public @NotNull List tabComplete(@NotNull CommandSender sender, @NotNull String alias, String @NotNull [] args) throws IllegalArgumentException { ++ List list = new ArrayList<>(); ++ if (ProfilingManager.isProfiling()) { ++ if (args.length == 1) { ++ String lastWord = args[0]; ++ if (StringUtil.startsWithIgnoreCase("status", lastWord)) { ++ list.add("status"); ++ } ++ if (StringUtil.startsWithIgnoreCase("stop", lastWord)) { ++ list.add("stop"); ++ } ++ } ++ } else { ++ if (args.length <= 1) { ++ String lastWord = args.length == 0 ? "" : args[0]; ++ for (ProfileType value : ProfileType.values()) { ++ if (StringUtil.startsWithIgnoreCase(value.getInternalName(), lastWord)) { ++ list.add(value.name().toLowerCase()); ++ } ++ } ++ } ++ } ++ return list; ++ } ++} +diff --git a/src/main/java/gg/pufferfish/pufferfish/flare/FlareSetup.java b/src/main/java/gg/pufferfish/pufferfish/flare/FlareSetup.java +new file mode 100644 +index 0000000000000000000000000000000000000000..cd22e4dcc8b7b57b10a95ef084637249a98e524f +--- /dev/null ++++ b/src/main/java/gg/pufferfish/pufferfish/flare/FlareSetup.java +@@ -0,0 +1,33 @@ ++package gg.pufferfish.pufferfish.flare; ++ ++import co.technove.flare.FlareInitializer; ++import co.technove.flare.internal.profiling.InitializationException; ++import net.minecraft.server.MinecraftServer; ++import org.apache.logging.log4j.Level; ++ ++public class FlareSetup { ++ ++ private static boolean initialized = false; ++ private static boolean supported = false; ++ ++ public static void init() { ++ if (initialized) { ++ return; ++ } ++ ++ initialized = true; ++ try { ++ for (String warning : FlareInitializer.initialize()) { ++ MinecraftServer.LOGGER.warn("Flare warning: " + warning); ++ } ++ supported = true; ++ } catch (InitializationException e) { ++ MinecraftServer.LOGGER.warn("Failed to enable Flare:", e); ++ } ++ } ++ ++ public static boolean isSupported() { ++ return supported; ++ } ++ ++} +diff --git a/src/main/java/gg/pufferfish/pufferfish/flare/PluginLookup.java b/src/main/java/gg/pufferfish/pufferfish/flare/PluginLookup.java +new file mode 100644 +index 0000000000000000000000000000000000000000..74aab5eb4b54ffbaf19b8976ffb8ca4a64584006 +--- /dev/null ++++ b/src/main/java/gg/pufferfish/pufferfish/flare/PluginLookup.java +@@ -0,0 +1,44 @@ ++package gg.pufferfish.pufferfish.flare; ++ ++import com.google.common.cache.Cache; ++import com.google.common.cache.CacheBuilder; ++import org.bukkit.Bukkit; ++import org.bukkit.plugin.Plugin; ++import org.bukkit.plugin.java.PluginClassLoader; ++ ++import java.util.Optional; ++import java.util.concurrent.TimeUnit; ++ ++public class PluginLookup { ++ private static final Cache pluginNameCache = CacheBuilder.newBuilder() ++ .expireAfterAccess(1, TimeUnit.MINUTES) ++ .maximumSize(1024) ++ .build(); ++ ++ public static Optional getPluginForClass(String name) { ++ if (name.startsWith("net.minecraft") || name.startsWith("java.") || name.startsWith("com.mojang") || ++ name.startsWith("com.google") || name.startsWith("it.unimi") || name.startsWith("sun")) { ++ return Optional.empty(); ++ } ++ ++ String existing = pluginNameCache.getIfPresent(name); ++ if (existing != null) { ++ return Optional.ofNullable(existing.isEmpty() ? null : existing); ++ } ++ ++ String newValue = ""; ++ ++ for (Plugin plugin : Bukkit.getPluginManager().getPlugins()) { ++ ClassLoader classLoader = plugin.getClass().getClassLoader(); ++ if (classLoader instanceof PluginClassLoader) { ++ if (((PluginClassLoader) classLoader)._airplane_hasClass(name)) { ++ newValue = plugin.getName(); ++ break; ++ } ++ } ++ } ++ ++ pluginNameCache.put(name, newValue); ++ return Optional.ofNullable(newValue.isEmpty() ? null : newValue); ++ } ++} +diff --git a/src/main/java/gg/pufferfish/pufferfish/flare/ProfilingManager.java b/src/main/java/gg/pufferfish/pufferfish/flare/ProfilingManager.java +new file mode 100644 +index 0000000000000000000000000000000000000000..e3f76eb11a261c3347f0cd89b5da309bc2dc82f9 +--- /dev/null ++++ b/src/main/java/gg/pufferfish/pufferfish/flare/ProfilingManager.java +@@ -0,0 +1,151 @@ ++package gg.pufferfish.pufferfish.flare; ++ ++import co.technove.flare.Flare; ++import co.technove.flare.FlareAuth; ++import co.technove.flare.FlareBuilder; ++import co.technove.flare.exceptions.UserReportableException; ++import co.technove.flare.internal.profiling.ProfileType; ++import gg.pufferfish.pufferfish.PufferfishConfig; ++import gg.pufferfish.pufferfish.PufferfishLogger; ++import gg.pufferfish.pufferfish.compat.ServerConfigurations; ++import gg.pufferfish.pufferfish.flare.collectors.GCEventCollector; ++import gg.pufferfish.pufferfish.flare.collectors.StatCollector; ++import gg.pufferfish.pufferfish.flare.collectors.TPSCollector; ++import gg.pufferfish.pufferfish.flare.collectors.WorldCountCollector; ++import org.bukkit.Bukkit; ++import org.bukkit.craftbukkit.scheduler.MinecraftInternalPlugin; ++import org.bukkit.scheduler.BukkitTask; ++import oshi.SystemInfo; ++import oshi.hardware.CentralProcessor; ++import oshi.hardware.GlobalMemory; ++import oshi.hardware.HardwareAbstractionLayer; ++import oshi.hardware.VirtualMemory; ++import oshi.software.os.OperatingSystem; ++ ++import java.io.IOException; ++import java.net.URI; ++import java.time.Duration; ++import java.util.Objects; ++import java.util.logging.Level; ++ ++public class ProfilingManager { ++ ++ private static Flare currentFlare; ++ private static BukkitTask currentTask = null; ++ ++ public static synchronized boolean isProfiling() { ++ return currentFlare != null && currentFlare.isRunning(); ++ } ++ ++ public static synchronized String getProfilingUri() { ++ return Objects.requireNonNull(currentFlare).getURI().map(URI::toString).orElse("Flare is not running"); ++ } ++ ++ public static Duration getTimeRan() { ++ Flare flare = currentFlare; // copy reference so no need to sync ++ if (flare == null) { ++ return Duration.ofMillis(0); ++ } ++ return flare.getCurrentDuration(); ++ } ++ ++ public static synchronized boolean start(ProfileType profileType) throws UserReportableException { ++ if (currentFlare != null && !currentFlare.isRunning()) { ++ currentFlare = null; // errored out ++ } ++ if (isProfiling()) { ++ return false; ++ } ++ if (Bukkit.isPrimaryThread()) { ++ throw new UserReportableException("Profiles should be started off-thread"); ++ } ++ ++ try { ++ OperatingSystem os = new SystemInfo().getOperatingSystem(); ++ ++ SystemInfo systemInfo = new SystemInfo(); ++ HardwareAbstractionLayer hardware = systemInfo.getHardware(); ++ ++ CentralProcessor processor = hardware.getProcessor(); ++ CentralProcessor.ProcessorIdentifier processorIdentifier = processor.getProcessorIdentifier(); ++ ++ GlobalMemory memory = hardware.getMemory(); ++ VirtualMemory virtualMemory = memory.getVirtualMemory(); ++ ++ FlareBuilder builder = new FlareBuilder() ++ .withProfileType(profileType) ++ .withMemoryProfiling(true) ++ .withAuth(FlareAuth.fromTokenAndUrl(PufferfishConfig.accessToken, PufferfishConfig.profileWebUrl)) ++ ++ .withFiles(ServerConfigurations.getCleanCopies()) ++ .withVersion("Primary Version", Bukkit.getVersion()) ++ .withVersion("Bukkit Version", Bukkit.getBukkitVersion()) ++ .withVersion("Minecraft Version", Bukkit.getMinecraftVersion()) ++ ++ .withGraphCategories(CustomCategories.ENTITIES_AND_CHUNKS, CustomCategories.MC_PERF) ++ .withCollectors(new TPSCollector(), new WorldCountCollector(), new GCEventCollector(), new StatCollector()) ++ .withClassIdentifier(PluginLookup::getPluginForClass) ++ ++ .withHardware(new FlareBuilder.HardwareBuilder() ++ .setCoreCount(processor.getPhysicalProcessorCount()) ++ .setThreadCount(processor.getLogicalProcessorCount()) ++ .setCpuModel(processorIdentifier.getName()) ++ .setCpuFrequency(processor.getMaxFreq()) ++ ++ .setTotalMemory(memory.getTotal()) ++ .setTotalSwap(virtualMemory.getSwapTotal()) ++ .setTotalVirtual(virtualMemory.getVirtualMax()) ++ ) ++ ++ .withOperatingSystem(new FlareBuilder.OperatingSystemBuilder() ++ .setManufacturer(os.getManufacturer()) ++ .setFamily(os.getFamily()) ++ .setVersion(os.getVersionInfo().toString()) ++ .setBitness(os.getBitness()) ++ ); ++ ++ currentFlare = builder.build(); ++ } catch (IOException e) { ++ PufferfishLogger.LOGGER.log(Level.WARNING, "Failed to read configuration files:", e); ++ throw new UserReportableException("Failed to load configuration files, check logs for further details."); ++ } ++ ++ try { ++ currentFlare.start(); ++ } catch (IllegalStateException e) { ++ PufferfishLogger.LOGGER.log(Level.WARNING, "Error starting Flare:", e); ++ throw new UserReportableException("Failed to start Flare, check logs for further details."); ++ } ++ ++ currentTask = Bukkit.getScheduler().runTaskLater(new MinecraftInternalPlugin(), ProfilingManager::stop, 20 * 60 * 15); ++ PufferfishLogger.LOGGER.log(Level.INFO, "Flare has been started: " + getProfilingUri()); ++ return true; ++ } ++ ++ public static synchronized boolean stop() { ++ if (!isProfiling()) { ++ return false; ++ } ++ if (!currentFlare.isRunning()) { ++ currentFlare = null; ++ return true; ++ } ++ PufferfishLogger.LOGGER.log(Level.INFO, "Flare has been stopped: " + getProfilingUri()); ++ try { ++ currentFlare.stop(); ++ } catch (IllegalStateException e) { ++ PufferfishLogger.LOGGER.log(Level.WARNING, "Error occurred stopping Flare", e); ++ } ++ currentFlare = null; ++ ++ try { ++ currentTask.cancel(); ++ } catch (Throwable t) { ++ PufferfishLogger.LOGGER.log(Level.WARNING, "Error occurred stopping Flare", t); ++ } ++ ++ currentTask = null; ++ return true; ++ } ++ ++} +diff --git a/src/main/java/gg/pufferfish/pufferfish/flare/collectors/GCEventCollector.java b/src/main/java/gg/pufferfish/pufferfish/flare/collectors/GCEventCollector.java +new file mode 100644 +index 0000000000000000000000000000000000000000..d426575c669020f369960107da1e2de2f11f082f +--- /dev/null ++++ b/src/main/java/gg/pufferfish/pufferfish/flare/collectors/GCEventCollector.java +@@ -0,0 +1,66 @@ ++package gg.pufferfish.pufferfish.flare.collectors; ++ ++import co.technove.flare.Flare; ++import co.technove.flare.internal.FlareInternal; ++import co.technove.flare.live.CollectorData; ++import co.technove.flare.live.EventCollector; ++import co.technove.flare.live.LiveEvent; ++import co.technove.flare.live.category.GraphCategory; ++import co.technove.flare.live.formatter.DataFormatter; ++import com.google.common.collect.ImmutableMap; ++import com.sun.management.GarbageCollectionNotificationInfo; ++ ++import javax.management.ListenerNotFoundException; ++import javax.management.Notification; ++import javax.management.NotificationEmitter; ++import javax.management.NotificationListener; ++import javax.management.openmbean.CompositeData; ++import java.lang.management.GarbageCollectorMXBean; ++import java.lang.management.ManagementFactory; ++ ++public class GCEventCollector extends EventCollector implements NotificationListener { ++ ++ private static final CollectorData MINOR_GC = new CollectorData("builtin:gc:minor", "Minor GC", "A small pause in the program to allow Garbage Collection to run.", DataFormatter.MILLISECONDS, GraphCategory.SYSTEM); ++ private static final CollectorData MAJOR_GC = new CollectorData("builtin:gc:major", "Major GC", "A large pause in the program to allow Garbage Collection to run.", DataFormatter.MILLISECONDS, GraphCategory.SYSTEM); ++ private static final CollectorData UNKNOWN_GC = new CollectorData("builtin:gc:generic", "Major GC", "A run of the Garbage Collection.", DataFormatter.MILLISECONDS, GraphCategory.SYSTEM); ++ ++ public GCEventCollector() { ++ super(MINOR_GC, MAJOR_GC, UNKNOWN_GC); ++ } ++ ++ private static CollectorData fromString(String string) { ++ if (string.endsWith("minor GC")) { ++ return MINOR_GC; ++ } else if (string.endsWith("major GC")) { ++ return MAJOR_GC; ++ } ++ return UNKNOWN_GC; ++ } ++ ++ @Override ++ public void start(Flare flare) { ++ for (GarbageCollectorMXBean garbageCollectorBean : ManagementFactory.getGarbageCollectorMXBeans()) { ++ NotificationEmitter notificationEmitter = (NotificationEmitter) garbageCollectorBean; ++ notificationEmitter.addNotificationListener(this, null, null); ++ } ++ } ++ ++ @Override ++ public void stop(Flare flare) { ++ for (GarbageCollectorMXBean garbageCollectorBean : ManagementFactory.getGarbageCollectorMXBeans()) { ++ NotificationEmitter notificationEmitter = (NotificationEmitter) garbageCollectorBean; ++ try { ++ notificationEmitter.removeNotificationListener(this); ++ } catch (ListenerNotFoundException e) { ++ } ++ } ++ } ++ ++ @Override ++ public void handleNotification(Notification notification, Object o) { ++ if (notification.getType().equals(GarbageCollectionNotificationInfo.GARBAGE_COLLECTION_NOTIFICATION)) { ++ GarbageCollectionNotificationInfo gcInfo = GarbageCollectionNotificationInfo.from((CompositeData) notification.getUserData()); ++ reportEvent(new LiveEvent(fromString(gcInfo.getGcAction()), System.currentTimeMillis(), (int) gcInfo.getGcInfo().getDuration(), ImmutableMap.of())); ++ } ++ } ++} +diff --git a/src/main/java/gg/pufferfish/pufferfish/flare/collectors/StatCollector.java b/src/main/java/gg/pufferfish/pufferfish/flare/collectors/StatCollector.java +new file mode 100644 +index 0000000000000000000000000000000000000000..a22c6dbae53667e4c72464fa27153aee30c7946e +--- /dev/null ++++ b/src/main/java/gg/pufferfish/pufferfish/flare/collectors/StatCollector.java +@@ -0,0 +1,41 @@ ++package gg.pufferfish.pufferfish.flare.collectors; ++ ++import co.technove.flare.live.CollectorData; ++import co.technove.flare.live.LiveCollector; ++import co.technove.flare.live.category.GraphCategory; ++import co.technove.flare.live.formatter.DataFormatter; ++import com.sun.management.OperatingSystemMXBean; ++import oshi.SystemInfo; ++import oshi.hardware.CentralProcessor; ++ ++import java.lang.management.ManagementFactory; ++import java.time.Duration; ++ ++public class StatCollector extends LiveCollector { ++ ++ private static final CollectorData CPU = new CollectorData("builtin:stat:cpu", "CPU Load", "The total amount of CPU usage across all cores.", DataFormatter.PERCENT, GraphCategory.SYSTEM); ++ private static final CollectorData CPU_PROCESS = new CollectorData("builtin:stat:cpu_process", "Process CPU", "The amount of CPU being used by this process.", DataFormatter.PERCENT, GraphCategory.SYSTEM); ++ private static final CollectorData MEMORY = new CollectorData("builtin:stat:memory_used", "Memory", "The amount of memory being used currently.", DataFormatter.BYTES, GraphCategory.SYSTEM); ++ private static final CollectorData MEMORY_TOTAL = new CollectorData("builtin:stat:memory_total", "Memory Total", "The total amount of memory allocated.", DataFormatter.BYTES, GraphCategory.SYSTEM); ++ ++ private final OperatingSystemMXBean bean; ++ private final CentralProcessor processor; ++ ++ public StatCollector() { ++ super(CPU, CPU_PROCESS, MEMORY, MEMORY_TOTAL); ++ this.interval = Duration.ofSeconds(5); ++ ++ this.bean = (OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean(); ++ this.processor = new SystemInfo().getHardware().getProcessor(); ++ } ++ ++ @Override ++ public void run() { ++ Runtime runtime = Runtime.getRuntime(); ++ ++ this.report(CPU, this.processor.getSystemLoadAverage(1)[0] / 100); // percentage ++ this.report(CPU_PROCESS, this.bean.getProcessCpuLoad()); ++ this.report(MEMORY, runtime.totalMemory() - runtime.freeMemory()); ++ this.report(MEMORY_TOTAL, runtime.totalMemory()); ++ } ++} +diff --git a/src/main/java/gg/pufferfish/pufferfish/flare/collectors/TPSCollector.java b/src/main/java/gg/pufferfish/pufferfish/flare/collectors/TPSCollector.java +new file mode 100644 +index 0000000000000000000000000000000000000000..40447d00aefb5ffedb8a2ee87155a04088f0649f +--- /dev/null ++++ b/src/main/java/gg/pufferfish/pufferfish/flare/collectors/TPSCollector.java +@@ -0,0 +1,31 @@ ++package gg.pufferfish.pufferfish.flare.collectors; ++ ++import co.technove.flare.live.CollectorData; ++import co.technove.flare.live.LiveCollector; ++import co.technove.flare.live.formatter.SuffixFormatter; ++import gg.pufferfish.pufferfish.flare.CustomCategories; ++import net.minecraft.server.MinecraftServer; ++import org.bukkit.Bukkit; ++ ++import java.time.Duration; ++import java.util.Arrays; ++ ++public class TPSCollector extends LiveCollector { ++ private static final CollectorData TPS = new CollectorData("airplane:tps", "TPS", "Ticks per second, or how fast the server updates. For a smooth server this should be a constant 20TPS.", SuffixFormatter.of("TPS"), CustomCategories.MC_PERF); ++ private static final CollectorData MSPT = new CollectorData("airplane:mspt", "MSPT", "Milliseconds per tick, which can show how well your server is performing. This value should always be under 50mspt.", SuffixFormatter.of("mspt"), CustomCategories.MC_PERF); ++ ++ public TPSCollector() { ++ super(TPS, MSPT); ++ ++ this.interval = Duration.ofSeconds(5); ++ } ++ ++ @Override ++ public void run() { ++ long[] times = MinecraftServer.getServer().tickTimes5s.getTimes(); ++ double mspt = ((double) Arrays.stream(times).sum() / (double) times.length) * 1.0E-6D; ++ ++ this.report(TPS, Math.min(20D, Math.round(Bukkit.getServer().getTPS()[0] * 100d) / 100d)); ++ this.report(MSPT, (double) Math.round(mspt * 100d) / 100d); ++ } ++} +diff --git a/src/main/java/gg/pufferfish/pufferfish/flare/collectors/WorldCountCollector.java b/src/main/java/gg/pufferfish/pufferfish/flare/collectors/WorldCountCollector.java +new file mode 100644 +index 0000000000000000000000000000000000000000..db15d3fbe2b65fc8035573f5fdbea382055db9b2 +--- /dev/null ++++ b/src/main/java/gg/pufferfish/pufferfish/flare/collectors/WorldCountCollector.java +@@ -0,0 +1,45 @@ ++package gg.pufferfish.pufferfish.flare.collectors; ++ ++import co.technove.flare.live.CollectorData; ++import co.technove.flare.live.LiveCollector; ++import co.technove.flare.live.formatter.SuffixFormatter; ++import gg.pufferfish.pufferfish.flare.CustomCategories; ++import org.bukkit.Bukkit; ++import org.bukkit.World; ++import org.bukkit.craftbukkit.CraftWorld; ++ ++import java.time.Duration; ++ ++public class WorldCountCollector extends LiveCollector { ++ ++ private static final CollectorData PLAYER_COUNT = new CollectorData("airplane:world:playercount", "Player Count", "The number of players currently on the server.", new SuffixFormatter(" Player", " Players"), CustomCategories.ENTITIES_AND_CHUNKS); ++ private static final CollectorData ENTITY_COUNT = new CollectorData("airplane:world:entitycount", "Entity Count", "The number of entities in all worlds", new SuffixFormatter(" Entity", " Entities"), CustomCategories.ENTITIES_AND_CHUNKS); ++ private static final CollectorData CHUNK_COUNT = new CollectorData("airplane:world:chunkcount", "Chunk Count", "The number of chunks currently loaded.", new SuffixFormatter(" Chunk", " Chunks"), CustomCategories.ENTITIES_AND_CHUNKS); ++ private static final CollectorData TILE_ENTITY_COUNT = new CollectorData("airplane:world:blockentitycount", "Block Entity Count", "The number of block entities currently loaded.", new SuffixFormatter(" Block Entity", " Block Entities"), CustomCategories.ENTITIES_AND_CHUNKS); ++ ++ public WorldCountCollector() { ++ super(PLAYER_COUNT, ENTITY_COUNT, CHUNK_COUNT, TILE_ENTITY_COUNT); ++ ++ this.interval = Duration.ofSeconds(5); ++ } ++ ++ @Override ++ public void run() { ++ int entities = 0; ++ int chunkCount = 0; ++ int tileEntityCount = 0; ++ ++ if (!Bukkit.isStopping()) { ++ for (World world : Bukkit.getWorlds()) { ++ entities += ((CraftWorld) world).getHandle().entityManager.getEntityGetter().getCount(); ++ chunkCount += world.getChunkCount(); ++ tileEntityCount += world.getTileEntityCount(); ++ } ++ } ++ ++ this.report(PLAYER_COUNT, Bukkit.getOnlinePlayers().size()); ++ this.report(ENTITY_COUNT, entities); ++ this.report(CHUNK_COUNT, chunkCount); ++ this.report(TILE_ENTITY_COUNT, tileEntityCount); ++ } ++} +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..731ef11c7a025ae95ed8a757b530d834733d0621 +--- /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..1b29210ad0bbb4ada150f23357f0c80d331c996d +--- /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..9d6dc2c80945bec9bea74714c657c7a2e0bdde9e +--- /dev/null ++++ b/src/main/java/gg/pufferfish/pufferfish/util/AsyncExecutor.java +@@ -0,0 +1,51 @@ ++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.LockSupport; ++import java.util.function.BooleanSupplier; ++import java.util.logging.Level; ++ ++public class AsyncExecutor implements Runnable { ++ ++ private Queue jobs = Queues.newConcurrentLinkedQueue(); ++ private final Thread thread; ++ private final BooleanSupplier shouldRun; ++ private volatile boolean killswitch = false; ++ ++ public AsyncExecutor(String threadName, BooleanSupplier shouldRun) { ++ this.thread = new Thread(this, threadName); ++ this.shouldRun = shouldRun; ++ } ++ ++ public void start() { ++ thread.start(); ++ } ++ ++ public void kill() { ++ killswitch = true; ++ } ++ ++ public void submit(Runnable runnable) { ++ jobs.offer(runnable); ++ } ++ ++ @Override ++ public void run() { ++ while (!killswitch) { ++ if (shouldRun.getAsBoolean()) { ++ try { ++ Runnable runnable; ++ while ((runnable = jobs.poll()) != null) { ++ runnable.run(); ++ } ++ } catch (Exception e) { ++ PufferfishLogger.LOGGER.log(Level.SEVERE, e, () -> "Failed to execute async job for thread " + thread.getName()); ++ } ++ } ++ LockSupport.parkNanos("executing tasks", 1000L); ++ } ++ } ++ ++} +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..fdcb62d12164024a5f354d60cc863821a18d1b2a +--- /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..facd55463d44cb7e3d2ca6892982f5497b8dded1 +--- /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 5a808a09291da691cbee75a55f6aa1b70ac9f018..13e49592a70285e92bf0d14ab596f3bcdebedf4c 100644 +--- a/src/main/java/io/papermc/paper/configuration/GlobalConfiguration.java ++++ b/src/main/java/io/papermc/paper/configuration/GlobalConfiguration.java +@@ -8,6 +8,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; +@@ -17,6 +18,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 { +@@ -52,6 +54,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; +@@ -65,6 +68,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/net/minecraft/server/MCUtil.java b/src/main/java/net/minecraft/server/MCUtil.java +index 33ccab88b93f93993b6e17d5e0a2539b08235f78..3d02750fc035742bd54b12a703e91497b04df473 100644 +--- a/src/main/java/net/minecraft/server/MCUtil.java ++++ b/src/main/java/net/minecraft/server/MCUtil.java +@@ -209,7 +209,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 9e1d3a22ed7e34e4968b5fb34cc77b661eb4747d..dc864d87b634bb317a3240832e1f5129733f248f 100644 +--- a/src/main/java/net/minecraft/server/MinecraftServer.java ++++ b/src/main/java/net/minecraft/server/MinecraftServer.java +@@ -295,6 +295,8 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop true); // Pufferfish - optimize mob spawning + + public static S spin(Function serverFactory) { + AtomicReference atomicreference = new AtomicReference(); +@@ -1654,7 +1656,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) { +@@ -2221,6 +2223,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()) { +@@ -2416,6 +2436,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 59acbf6249f8f5285504c0ddea448a3433d1d68d..378cc1f9e19eb9b18037ab8af92f65897e15a405 100644 +--- a/src/main/java/net/minecraft/server/level/ServerChunkCache.java ++++ b/src/main/java/net/minecraft/server/level/ServerChunkCache.java +@@ -75,6 +75,9 @@ public class ServerChunkCache extends ChunkSource { + final it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap loadedChunkMap = new it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap<>(8192, 0.5f); + + 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); +@@ -962,6 +965,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 + +@@ -971,18 +975,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 +@@ -1020,8 +1031,8 @@ public class ServerChunkCache extends ChunkSource { + + if ((true || this.level.isNaturalSpawningAllowed(chunkcoordintpair)) && this.chunkMap.anyPlayerCloseEnoughForSpawning(holder, chunkcoordintpair, false)) { // Paper - optimise anyPlayerCloseEnoughForSpawning // Paper - replace player chunk loader system + 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 - replace player chunk loader system +@@ -1083,6 +1094,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 946cde51334568c62d9546254a8d4e5d46d95324..9539470e037ec6461413455ded1dd69074051ba2 100644 +--- a/src/main/java/net/minecraft/server/level/ServerEntity.java ++++ b/src/main/java/net/minecraft/server/level/ServerEntity.java +@@ -159,6 +159,7 @@ public class ServerEntity { + boolean flag4 = k < -32768L || k > 32767L || l < -32768L || l > 32767L || i1 < -32768L || i1 > 32767L; + + if (!flag4 && 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()); +@@ -168,6 +169,7 @@ public class ServerEntity { + } else { + packet1 = new ClientboundMoveEntityPacket.PosRot(this.entity.getId(), (short) ((int) k), (short) ((int) l), (short) ((int) i1), (byte) i, (byte) j, this.entity.isOnGround()); + } ++ } // 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 aaa7ad2a14389dc0dbc0d0fa3fb5ea16ec4172f6..f492833ff7b7162638777f0777366cfc70274d5d 100644 +--- a/src/main/java/net/minecraft/server/level/ServerLevel.java ++++ b/src/main/java/net/minecraft/server/level/ServerLevel.java +@@ -689,7 +689,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(); + } + } +@@ -756,9 +769,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(); ++ private final io.papermc.paper.util.math.ThreadUnsafeRandom randomTickRandom = new io.papermc.paper.util.math.ThreadUnsafeRandom(); public net.minecraft.util.RandomSource getThreadUnsafeRandom() { return this.randomTickRandom; } // Pufferfish - getter + // 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(); +@@ -769,7 +784,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); +@@ -793,7 +808,7 @@ public class ServerLevel extends Level implements WorldGenLevel { + } + + gameprofilerfiller.popPush("iceandsnow"); +- 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 03507b5ac5908962e9ebc4b98f53f23110573baa..01ecd6548c57bd24b3c3e1ad0640062f4b781bbe 100644 +--- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java ++++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java +@@ -1149,6 +1149,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Ser + + @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(); +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 540bc9500c35c0db719b00aa26f6fb3a1b08ed9f..806cb760822a99316b08ad95ff8922df717050e2 100644 +--- a/src/main/java/net/minecraft/world/Container.java ++++ b/src/main/java/net/minecraft/world/Container.java +@@ -2,6 +2,8 @@ package net.minecraft.world; + + import java.util.Set; + import java.util.function.Predicate; ++ ++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; +@@ -10,6 +12,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; + +diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java +index ade1e37d20ef3021f73da6d1905cea76d3ff0aa7..fa3263bffcfe042c2f210f85c6868fff08132a7c 100644 +--- a/src/main/java/net/minecraft/world/entity/Entity.java ++++ b/src/main/java/net/minecraft/world/entity/Entity.java +@@ -286,7 +286,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; + public float yRot; // Paper - private->public +@@ -408,6 +408,11 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { + return this.originWorld; + } + // Paper end ++ // Pufferfish start ++ 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; + } +@@ -431,17 +436,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()); +@@ -450,6 +474,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)); + } +@@ -781,6 +808,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; +@@ -3973,16 +4006,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; +@@ -3990,14 +4025,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; +@@ -4019,9 +4101,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 ac0f0a4da4282c13f6e1f37710cb615d66b8ef2c..ec0319dd4b115e18b368027cc5dbe4d4d9c64840 100644 +--- a/src/main/java/net/minecraft/world/entity/EntityType.java ++++ b/src/main/java/net/minecraft/world/entity/EntityType.java +@@ -305,6 +305,8 @@ public class EntityType implements EntityTypeTest { + return Registry.ENTITY_TYPE.getOptional(ResourceLocation.tryParse(id)); + } + ++ public boolean dabEnabled = false; // Pufferfish ++ public int ttl = -1; // Pufferfish + // Paper start - add id + public final String id; + +diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java +index e8dc99752d06ca40f17f3ad2c829b2447b703d7c..39fab6a5195e32ae6ffc9988e6fcecfe96be2f76 100644 +--- a/src/main/java/net/minecraft/world/entity/LivingEntity.java ++++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java +@@ -142,7 +142,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 { + +@@ -398,8 +397,7 @@ public abstract class LivingEntity extends Entity { + + if (this.isAlive()) { + boolean flag = this instanceof net.minecraft.world.entity.player.Player; +- +- if (this.isInWall()) { ++ if ((!gg.pufferfish.pufferfish.PufferfishConfig.enableSuffocationOptimization || (tickCount % 10 == 0 && couldPossiblyBeHurt(1.0F))) && this.isInWall()) { // Pufferfish - optimize suffocation + this.hurt(DamageSource.IN_WALL, 1.0F); + } else if (flag && !this.level.getWorldBorder().isWithinBounds(this.getBoundingBox())) { + double d0 = this.level.getWorldBorder().getDistanceToBorder(this) + this.level.getWorldBorder().getDamageSafeZone(); +@@ -1313,6 +1311,15 @@ public abstract class LivingEntity extends Entity { + 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)) { +@@ -1881,6 +1888,20 @@ public abstract class LivingEntity extends Entity { + 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; +@@ -3580,7 +3601,10 @@ public abstract class LivingEntity extends Entity { + 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 3646b969fa51b9683ab4137e530c3a6f6fc6c465..e8e60ea8b9e97ed87be78752f398ab25ba8e9a1b 100644 +--- a/src/main/java/net/minecraft/world/entity/Mob.java ++++ b/src/main/java/net/minecraft/world/entity/Mob.java +@@ -210,14 +210,16 @@ public abstract class Mob extends LivingEntity { + 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(); + } + } +@@ -854,16 +856,20 @@ public abstract class Mob extends LivingEntity { + + 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 c770ee21b7b699522941f6a1584d532001c04082..9bce290eb0c2cfef4896a3f2076c80bf3d76bd56 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 +@@ -22,9 +22,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) { +@@ -44,11 +46,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 + } + + public boolean hasAttribute(Attribute attribute) { +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 43243537b765a2d270be6de3f053fea77ff67d18..bf3b8ccb3e031e0ad24cd51e28ea8cbd4f8a8030 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 +@@ -72,6 +72,7 @@ public class AcquirePoi extends Behavior { + @Override + protected void start(ServerLevel world, PathfinderMob entity, long time) { + this.nextScheduledStart = time + 20L + (long)world.getRandom().nextInt(20); ++ if (entity.getNavigation().isStuck()) this.nextScheduledStart += 200L; // Pufferfish - wait an additional 10s to check again if they're stuck + PoiManager poiManager = world.getPoiManager(); + this.batchCache.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 42d466f7f162943886078eba3db18f2dfc2d7bee..6c0dda1ce018ec6bb2ebb97147045fffae0a89d5 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 serverLevel, Villager villager, long l) { +- if (l % 100L == 0L) { ++ // Pufferfish start ++ if (villager.nextGolemPanic < 0) villager.nextGolemPanic = l + 100; ++ if (--villager.nextGolemPanic < l) { ++ villager.nextGolemPanic = -1; ++ // Pufferfish end + villager.spawnGolemIfNeeded(serverLevel, l, 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 a910189177da0c1134c954b3d81b9e9bc4bc1420..0cc0d719e95e108263683b7a40f4ce3a8ca9465b 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 +@@ -50,9 +50,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 50d4595b81f24949011c7565c5e3fc8c26c86019..234ad92d666775dcf5a29a60551b17cbb1d8e6ec 100644 +--- a/src/main/java/net/minecraft/world/entity/ambient/Bat.java ++++ b/src/main/java/net/minecraft/world/entity/ambient/Bat.java +@@ -253,13 +253,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/axolotl/Axolotl.java b/src/main/java/net/minecraft/world/entity/animal/axolotl/Axolotl.java +index da5e6141f548539cac720aba558e1b6f3a87e474..fdd2c63ff0017bafa544a3cff2ee6d2d62c92cb3 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 +@@ -283,9 +283,11 @@ public class Axolotl extends Animal implements LerpingModel, Bucketable { + return true; + } + ++ private int behaviorTick = 0; // Pufferfish + @Override + protected void customServerAiStep() { + this.level.getProfiler().push("axolotlBrain"); ++ if (this.behaviorTick++ % this.activatedPriority == 0) // Pufferfish + this.getBrain().tick((ServerLevel) this.level, this); + this.level.getProfiler().pop(); + this.level.getProfiler().push("axolotlActivityUpdate"); +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 56dd01801f56c56d07101e7e22b58ac059f5f07f..f489301701f8abfb8f509d91089c1433db2346f8 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 +@@ -163,9 +163,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 ae4b251e10babb07055d031ff48ac7dd5d4be4a0..fa612a4f4abc5185c9142af31f5d7f6e92549350 100644 +--- a/src/main/java/net/minecraft/world/entity/item/ItemEntity.java ++++ b/src/main/java/net/minecraft/world/entity/item/ItemEntity.java +@@ -249,10 +249,16 @@ public class ItemEntity extends Entity { + 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 f22e615dba31619c97bf58930da060476a52facf..f5bb64f9f683cf21e772035e9be100ed2ddf8bc6 100644 +--- a/src/main/java/net/minecraft/world/entity/monster/EnderMan.java ++++ b/src/main/java/net/minecraft/world/entity/monster/EnderMan.java +@@ -317,11 +317,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 45741410a13cffe3419e34b5607b048bbcf1c3ff..5d487f1613b1fc5807283c20e5cc23a432d08f42 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 793576928dad6752dddd86e62d4c0800d8515fc4..9bde52b723237b1f0f945bc564009e3507993508 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 +@@ -289,9 +289,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/npc/Villager.java b/src/main/java/net/minecraft/world/entity/npc/Villager.java +index 10b45ec24a5a0867106d1694312385ad1e267f43..93077e8c6b5a35adc6febb749d1d08be172402f1 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 a1a625a8dacf4d2bbf75ddd90dce1b1be663c919..23e375c9a6955d03e0fc9be91ff0403251c8216c 100644 +--- a/src/main/java/net/minecraft/world/entity/player/Inventory.java ++++ b/src/main/java/net/minecraft/world/entity/player/Inventory.java +@@ -681,6 +681,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()) { +@@ -695,6 +697,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 66c3f374a779cd3a4548393ba23e9219f1caf6d3..39ba6ca32b827daee300e1240bd76fd8f680ea02 100644 +--- a/src/main/java/net/minecraft/world/entity/projectile/Projectile.java ++++ b/src/main/java/net/minecraft/world/entity/projectile/Projectile.java +@@ -42,6 +42,36 @@ public abstract class Projectile extends Entity { + 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 b8fb7b5a347298ada16bc8b818edf1863e3f6040..637118601237e0f994b12571b74db99065bdd60c 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 +@@ -157,6 +166,10 @@ public abstract class AbstractMinecartContainer extends AbstractMinecart impleme + super.readAdditionalSaveData(nbt); + this.lootableData.loadNbt(nbt); // Paper + this.readChestVehicleSaveData(nbt); ++ // Pufferfish start ++ this.itemStacksOptimized = new gg.airplane.structs.ItemListWithBitset(this.getContainerSize()); ++ this.itemStacks = this.itemStacksOptimized.nonNullList; ++ // Pufferfish end + } + + @Override +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 ffe5476d8ed15ee4384b679c341688787205ce59..9051559e78851257a56a998b4b882ebbcc394639 100644 +--- a/src/main/java/net/minecraft/world/item/crafting/ShapelessRecipe.java ++++ b/src/main/java/net/minecraft/world/item/crafting/ShapelessRecipe.java +@@ -25,8 +25,13 @@ public class ShapelessRecipe implements CraftingRecipe { + final String group; + final ItemStack result; + final NonNullList ingredients; ++ private final boolean isBukkit; // Pufferfish + ++ // Pufferfish start + public ShapelessRecipe(ResourceLocation id, String group, ItemStack output, NonNullList input) { ++ this(id, group, output, input, false); ++ } ++ public ShapelessRecipe(ResourceLocation id, String group, ItemStack output, NonNullList input, boolean isBukkit) { this.isBukkit = isBukkit; // Pufferfish end + this.id = id; + this.group = group; + this.result = output; +@@ -73,6 +78,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 d1eefa6ef3e9abfe7af4d8310aa64465fa2d5463..0f4aa330e5b179bb706a31917c671f165e22b9cd 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 468c635d31cfa8051666bbefce8df4b448e9ed93..17e869074b8cf29a8c3280499a27e95179896750 100644 +--- a/src/main/java/net/minecraft/world/level/GameRules.java ++++ b/src/main/java/net/minecraft/world/level/GameRules.java +@@ -91,6 +91,7 @@ public class GameRules { + public static final GameRules.Key RULE_UNIVERSAL_ANGER = GameRules.register("universalAnger", GameRules.Category.MOBS, GameRules.BooleanValue.create(false)); + public static final GameRules.Key RULE_PLAYERS_SLEEPING_PERCENTAGE = GameRules.register("playersSleepingPercentage", GameRules.Category.PLAYER, GameRules.IntegerValue.create(100)); + 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); +@@ -109,17 +110,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() { +@@ -178,6 +195,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 d59dea221ba0f1b9c14f403d3c6ea61b2c454316..683ab88e76b53331e5d9fbcb0e1ee65365008693 100644 +--- a/src/main/java/net/minecraft/world/level/Level.java ++++ b/src/main/java/net/minecraft/world/level/Level.java +@@ -272,6 +272,15 @@ public abstract class Level implements LevelAccessor, AutoCloseable { + + public abstract ResourceKey getTypeKey(); + ++ // 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, 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 +@@ -294,6 +303,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) { +@@ -410,6 +426,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 + } +@@ -897,13 +998,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 + } + } +@@ -1389,6 +1490,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 e31a2eea9a62ab2c0bed1a97dab6bae231b8cd8b..1f4acc1a2605f1e9051126fc811a5479351fc61a 100644 +--- a/src/main/java/net/minecraft/world/level/NaturalSpawner.java ++++ b/src/main/java/net/minecraft/world/level/NaturalSpawner.java +@@ -414,12 +414,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 ca259e278ad10347567c021376abca0287610432..021f7c44285b13a0904c09ea7210f2a5d10c7c61 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 + }); + }); + +@@ -114,17 +120,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 8ab1d401ed55d4cce55704317cbffe53ebc9f119..cfc7901125c127b155c5e7d5875f0fd0c8bb9c01 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 +@@ -43,7 +43,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; + +@@ -79,14 +82,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); + } +@@ -158,7 +184,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(); + } + +@@ -197,7 +223,7 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen + skipPushModeEventFire = skipHopperEvents; + boolean foundItem = false; + for (int i = 0; i < hopper.getContainerSize(); ++i) { +- ItemStack item = hopper.getItem(i); ++ ItemStack item = hopper.getItem(i); // Pufferfish + if (!item.isEmpty()) { + foundItem = true; + ItemStack origItemStack = item; +@@ -400,12 +426,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) { + // Paper start +- return allMatch(inv, facing, IS_EMPTY_TEST); ++ // Pufferfish start - use bitsets ++ //return allMatch(inv, facing, IS_EMPTY_TEST); ++ return inv.isCompletelyEmpty(facing); ++ // Pufferfish end + } + private static boolean allMatch(Container iinventory, Direction enumdirection, java.util.function.BiPredicate test) { + if (iinventory instanceof WorldlyContainer) { +@@ -582,7 +614,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 +@@ -730,7 +762,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 d559f93a9a09bac414dd5d58afccad42c127f09b..13e749a3c40f0b2cc002f13675a9a56eedbefdac 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 +@@ -96,13 +96,8 @@ public abstract class RandomizableContainerBlockEntity extends BaseContainerBloc + public boolean isEmpty() { + this.unpackLootTable((Player)null); + // Paper start +- for (ItemStack itemStack : this.getItems()) { +- if (!itemStack.isEmpty()) { +- return false; +- } +- } ++ return this.isCompletelyEmpty(null); // Pufferfish - use super + // Paper end +- return true; + } + + @Override +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 c46cbbf9ac4c5661933b03bc0b2559f7ade8c798..b3997b6abc8721c366e8ef5219ed449127d06899 100644 +--- a/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java ++++ b/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java +@@ -94,6 +94,18 @@ public class LevelChunk extends ChunkAccess { + } + // Paper end + ++ // 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); + } +@@ -124,6 +136,7 @@ public class LevelChunk extends ChunkAccess { + this.fluidTicks = fluidTickScheduler; + // CraftBukkit start + this.bukkitChunk = new org.bukkit.craftbukkit.CraftChunk(this); ++ this.lightningTick = this.level.random.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 5afb598d288d32877834cfb7d9796b334767286d..9465b2ab698362824f837abfd824e8f48fe3235c 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/entity/LevelEntityGetter.java b/src/main/java/net/minecraft/world/level/entity/LevelEntityGetter.java +index da1ad0b2679e392ed81b50c15f012c63cb5c939e..9c6ab057dccd6331e9c577e0c6192c0d84718906 100644 +--- a/src/main/java/net/minecraft/world/level/entity/LevelEntityGetter.java ++++ b/src/main/java/net/minecraft/world/level/entity/LevelEntityGetter.java +@@ -6,6 +6,8 @@ import javax.annotation.Nullable; + import net.minecraft.world.phys.AABB; + + public interface LevelEntityGetter { ++ int getCount(); // Pufferfish ++ + @Nullable + T get(int id); + +diff --git a/src/main/java/net/minecraft/world/level/entity/LevelEntityGetterAdapter.java b/src/main/java/net/minecraft/world/level/entity/LevelEntityGetterAdapter.java +index 3b13f6ea36a3bfecabe09221eb5c48dddab119db..563b6c47df0c5ae9efcb91fd53a065b1da1cdb94 100644 +--- a/src/main/java/net/minecraft/world/level/entity/LevelEntityGetterAdapter.java ++++ b/src/main/java/net/minecraft/world/level/entity/LevelEntityGetterAdapter.java +@@ -14,6 +14,8 @@ public class LevelEntityGetterAdapter implements LevelEn + this.sectionStorage = cache; + } + ++ @Override public int getCount() { return this.visibleEntities.count(); } // Pufferfish ++ + @Nullable + @Override + public T get(int id) { +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 ff40fe323964f173561a6838fb443e79abf9df38..c2c3ed6ba79f9f41497e042571f699a0fc6e9335 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 842fa4c360146d7a9e27cb7b2cef68c683f4ada6..fc7aae06bbcba84cc8072b2e8df4612ec87ec3ea 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 b1992ed5136cc7dcf04219868b94b3c37ae36b4b..5b5339cba819368f4d6b7eaf404fa59bca4c0518 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 state, FluidState fluidState) { +- return this.canStandOnFluid.test(fluidState) && !state.getType().isSame(fluidState.getType()); ++ // Pufferfish start ++ Entity entity = this.entity; ++ if (entity instanceof LivingEntity livingEntity) { ++ return livingEntity.canStandOnFluid(fluidState) && !state.getType().isSame(fluidState.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 f1e5ccfbcd08a73ac3aba9a1cb7b414faef81f9e..7899ae5e60ee2b30c6d4d7056c59bb38cc05b7c8 100644 +--- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java ++++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java +@@ -243,7 +243,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"); +@@ -1036,6 +1036,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 0b3b46348ac9195bff1492ffc11fcbff7d3f5c6f..4010052c53f3a2831b4d5aa1c041d85897856acb 100644 +--- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftShapelessRecipe.java ++++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftShapelessRecipe.java +@@ -43,6 +43,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(), CraftItemStack.asNMSCopy(this.getResult()), data)); ++ MinecraftServer.getServer().getRecipeManager().addRecipe(new net.minecraft.world.item.crafting.ShapelessRecipe(CraftNamespacedKey.toMinecraft(this.getKey()), this.getGroup(), CraftItemStack.asNMSCopy(this.getResult()), data, true)); + } + } +diff --git a/src/main/java/org/bukkit/craftbukkit/scheduler/MinecraftInternalPlugin.java b/src/main/java/org/bukkit/craftbukkit/scheduler/MinecraftInternalPlugin.java +index 909b2c98e7a9117d2f737245e4661792ffafb744..0d9e2b3728f9ab500bd5e44702718535d338e9a5 100644 +--- a/src/main/java/org/bukkit/craftbukkit/scheduler/MinecraftInternalPlugin.java ++++ b/src/main/java/org/bukkit/craftbukkit/scheduler/MinecraftInternalPlugin.java +@@ -22,7 +22,8 @@ public class MinecraftInternalPlugin extends PluginBase { + private boolean enabled = true; + + private final String pluginName; +- private PluginDescriptionFile pdf; ++ private org.bukkit.plugin.PluginLogger logger; ++ private PluginDescriptionFile pdf; // Pufferfish + + public MinecraftInternalPlugin() { + this.pluginName = "Minecraft"; +@@ -75,7 +76,12 @@ public class MinecraftInternalPlugin extends PluginBase { + + @Override + public PluginLogger getLogger() { +- throw new UnsupportedOperationException("Not supported."); ++ // Pufferfish start ++ if (this.logger == null) { ++ this.logger = new org.bukkit.plugin.PluginLogger(this); // Pufferfish ++ } ++ return this.logger; ++ // Pufferfish end + } + + @Override +@@ -85,7 +91,7 @@ public class MinecraftInternalPlugin extends PluginBase { + + @Override + public Server getServer() { +- throw new UnsupportedOperationException("Not supported."); ++ return org.bukkit.Bukkit.getServer(); // Pufferfish - impl + } + + @Override +diff --git a/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java b/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java +index 7c1e510a0ad4b69c1fedc3367a8216046efb228e..2d9c98931df5d1c54adcfba78a9136841764f853 100644 +--- a/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java ++++ b/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java +@@ -430,7 +430,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/ServerShutdownThread.java b/src/main/java/org/bukkit/craftbukkit/util/ServerShutdownThread.java +index d752720f2f234b9dbd2117333fee1bfad663ec02..f1be8a98c49a63d09c838a85eb58041733f71776 100644 +--- a/src/main/java/org/bukkit/craftbukkit/util/ServerShutdownThread.java ++++ b/src/main/java/org/bukkit/craftbukkit/util/ServerShutdownThread.java +@@ -11,6 +11,7 @@ public class ServerShutdownThread extends Thread { + + @Override + public void run() { ++ try { gg.pufferfish.pufferfish.flare.ProfilingManager.stop(); } catch (Throwable t) {} // Pufferfish - shut down Flare if it's running + try { + // Paper start - try to shutdown on main + server.safeShutdown(false, false); +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 1a1a1f4d0ac025daccc2d3f84faf6592819f4d5c..8643df8d81714edf60eebd6984bac2c933d1fbd6 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 + { +@@ -215,6 +219,21 @@ 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) { ++ 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, gg.pufferfish.pufferfish.PufferfishConfig.maximumActivationPrio)) : ++ 1; ++ } else { ++ entity.activatedPriority = 1; ++ } ++ // Pufferfish end ++ + } + // Paper end + } +@@ -231,12 +250,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; + } + } +@@ -290,7 +309,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/server/0001-Rebrand.patch b/patches/server/0002-Rebrand.patch similarity index 96% rename from patches/server/0001-Rebrand.patch rename to patches/server/0002-Rebrand.patch index bab32d1fa..a4326a2a8 100644 --- a/patches/server/0001-Rebrand.patch +++ b/patches/server/0002-Rebrand.patch @@ -5,21 +5,25 @@ Subject: [PATCH] Rebrand diff --git a/build.gradle.kts b/build.gradle.kts -index eefbd0a742b5875e0e9826b87c6bd4da66b2d7f7..b7310d4b38561a9314a9fb04bd1a15f15ee5028e 100644 +index 4f01bbc22b2e94d5415c36c8cd828e0551e929aa..a9e3d314581b7ce5110266bdd53af1978b66e336 100644 --- a/build.gradle.kts +++ b/build.gradle.kts -@@ -9,8 +9,8 @@ plugins { +@@ -9,12 +9,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-R0.1-SNAPSHOT") { +- exclude("io.papermc.paper", "paper-api") +- } +- // Pufferfish end + implementation(project(":purpur-api")) // Purpur + implementation("io.papermc.paper:paper-mojangapi:1.18.2-R0.1-SNAPSHOT") { exclude("io.papermc.paper", "paper-api") } // Purpur // todo: 1.19 // Paper start implementation("org.jline:jline-terminal-jansi:3.21.0") implementation("net.minecrell:terminalconsoleappender:1.3.0") -@@ -40,6 +40,9 @@ dependencies { +@@ -44,6 +40,9 @@ dependencies { runtimeOnly("mysql:mysql-connector-java:8.0.29") runtimeOnly("com.lmax:disruptor:3.4.4") // Paper @@ -29,16 +33,16 @@ index eefbd0a742b5875e0e9826b87c6bd4da66b2d7f7..b7310d4b38561a9314a9fb04bd1a15f1 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 +65,7 @@ tasks.jar { +@@ -82,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-Version" to "git-Purpur-$implementationVersion",// Purpur "Implementation-Vendor" to date, // Paper "Specification-Title" to "Bukkit", "Specification-Version" to project.version, -@@ -150,7 +153,7 @@ fun TaskContainer.registerRunTask( +@@ -170,7 +169,7 @@ fun TaskContainer.registerRunTask( name: String, block: JavaExec.() -> Unit ): TaskProvider = register(name) { @@ -170,10 +174,19 @@ index 1a859fef0848cf23a672012e9764965ae1c07ec5..14ed740609b14242c2a8d377a78b2f71 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 9e1d3a22ed7e34e4968b5fb34cc77b661eb4747d..ef42da89af85367d7733de8896ce8dc45ea12d36 100644 +index dc864d87b634bb317a3240832e1f5129733f248f..8b36917fe25c5a6f12bf834ef29335153aa43c34 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java -@@ -908,7 +908,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop true); // Pufferfish - optimize mob spawning + + public static S spin(Function serverFactory) { +@@ -910,7 +910,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop // Spigot - Spigot > // CraftBukkit - cb > vanilla! +- return "Pufferfish"; // Pufferfish - Pufferfish > // Paper - Paper > // Spigot - Spigot > // CraftBukkit - cb > vanilla! + return "Purpur"; // Purpur - Purpur > // Paper - Paper > // Spigot - Spigot > // CraftBukkit - cb > vanilla! } public SystemReport fillSystemReport(SystemReport details) { diff --git a/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java b/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java -index aea18838a17fc52e1bf8cd84cd185565e6e2246d..ddfee22ad840970e495c1a6d537fee810b137cbb 100644 +index 5d6ceeecfbb55a1bfe77a1f1ac39b02993e714e3..85daf1de8ca0d48b348d1195c4243368999efee0 100644 --- a/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java +++ b/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java -@@ -283,11 +283,12 @@ public class DedicatedServer extends MinecraftServer implements ServerInterface +@@ -285,11 +285,12 @@ public class DedicatedServer extends MinecraftServer implements ServerInterface DedicatedServer.LOGGER.warn("**** SERVER IS RUNNING IN OFFLINE/INSECURE MODE!"); DedicatedServer.LOGGER.warn("The server will make no attempt to authenticate usernames. Beware."); // Spigot start @@ -224,14 +237,14 @@ index c31b9a6b1d4548d507ecb60d42ca9f96f49f6c4b..f613825c69a8d683b8029fe345031259 private static final int DEFAULT_SIZE_THRESHOLD = 1024 * 8; diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -index f1e5ccfbcd08a73ac3aba9a1cb7b414faef81f9e..db154e64869ff7792d8d3c2c317cb9e00a25f048 100644 +index 7899ae5e60ee2b30c6d4d7056c59bb38cc05b7c8..4bfcee5f8d60a082e3e8ca39eb59ebc5f33c159e 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java @@ -243,7 +243,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 serverName = "Purpur"; // Paper // Purpur private final String serverVersion; private final String bukkitVersion = Versioning.getBukkitVersion(); @@ -290,27 +303,27 @@ index cdefb2025eedea7e204d70d568adaf1c1ec4c03c..d1526ed7197b883e1d1f07baf285bf5e // (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 7c1e510a0ad4b69c1fedc3367a8216046efb228e..f736cc6b3dc5242a30eefd344af65f6958ece3a4 100644 +index 2d9c98931df5d1c54adcfba78a9136841764f853..f736cc6b3dc5242a30eefd344af65f6958ece3a4 100644 --- a/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java +++ b/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java @@ -430,7 +430,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 + 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..fb87620c742ff7912f5e8ccd2a7930dd605576d9 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 + InputStream stream = Bukkit.class.getClassLoader().getResourceAsStream("META-INF/maven/org.purpurmc.purpur/purpur-api/pom.properties"); // Purpur Properties properties = new Properties(); diff --git a/patches/server/0002-Purpur-config-files.patch b/patches/server/0003-Purpur-config-files.patch similarity index 96% rename from patches/server/0002-Purpur-config-files.patch rename to patches/server/0003-Purpur-config-files.patch index 634725633..02ef8b3b6 100644 --- a/patches/server/0002-Purpur-config-files.patch +++ b/patches/server/0003-Purpur-config-files.patch @@ -5,14 +5,14 @@ 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 7b1843e16745ca8db2244e17490d291401f22679..acd95cf1dc7f009b63e44e4404e1736283fd458e 100644 +index 061716934ba0a1f01e4d85d664034f72b3c7a765..acd95cf1dc7f009b63e44e4404e1736283fd458e 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 metrics = new Metrics("Purpur", serverUUID, logFailedRequests, Bukkit.getLogger()); // Purpur metrics.addCustomChart(new Metrics.SimplePie("minecraft_version", () -> { @@ -22,7 +22,7 @@ index 7b1843e16745ca8db2244e17490d291401f22679..acd95cf1dc7f009b63e44e4404e17362 metrics.addCustomChart(new Metrics.SingleLineChart("players", () -> Bukkit.getOnlinePlayers().size())); - metrics.addCustomChart(new Metrics.SimplePie("online_mode", () -> Bukkit.getOnlineMode() ? "online" : "offline")); -- metrics.addCustomChart(new Metrics.SimplePie("paper_version", () -> (Metrics.class.getPackage().getImplementationVersion() != null) ? Metrics.class.getPackage().getImplementationVersion() : "unknown")); +- metrics.addCustomChart(new Metrics.SimplePie("pufferfish_version", () -> (Metrics.class.getPackage().getImplementationVersion() != null) ? Metrics.class.getPackage().getImplementationVersion() : "unknown")); + 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", () -> (Metrics.class.getPackage().getImplementationVersion() != null) ? Metrics.class.getPackage().getImplementationVersion() : "unknown")); // Purpur @@ -64,7 +64,7 @@ index 0148cadbeb41a882a05d982f0b34770b2829a04a..5213f132f826b47e2825644242aaece2 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 ddfee22ad840970e495c1a6d537fee810b137cbb..a4f19720738b167fd5932defabff9aa144f59c37 100644 +index 85daf1de8ca0d48b348d1195c4243368999efee0..23454b660c123f4309d1b6eaab8f626f2663f2ef 100644 --- a/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java +++ b/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java @@ -223,6 +223,15 @@ public class DedicatedServer extends MinecraftServer implements ServerInterface @@ -84,7 +84,7 @@ index ddfee22ad840970e495c1a6d537fee810b137cbb..a4f19720738b167fd5932defabff9aa1 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 d59dea221ba0f1b9c14f403d3c6ea61b2c454316..9c7943b8712133aa71de113a5581f591cfd68657 100644 +index 683ab88e76b53331e5d9fbcb0e1ee65365008693..32518aa959e3ea95376ac2c1904aa51fb7e52508 100644 --- a/src/main/java/net/minecraft/world/level/Level.java +++ b/src/main/java/net/minecraft/world/level/Level.java @@ -175,6 +175,8 @@ public abstract class Level implements LevelAccessor, AutoCloseable { @@ -96,7 +96,7 @@ index d59dea221ba0f1b9c14f403d3c6ea61b2c454316..9c7943b8712133aa71de113a5581f591 public final co.aikar.timings.WorldTimingsHandler timings; // Paper public static BlockPos lastPhysicsProblem; // Spigot private org.spigotmc.TickLimiter entityLimiter; -@@ -275,6 +277,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { +@@ -284,6 +286,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { protected Level(WritableLevelData worlddatamutable, ResourceKey resourcekey, 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 @@ -105,7 +105,7 @@ index d59dea221ba0f1b9c14f403d3c6ea61b2c454316..9c7943b8712133aa71de113a5581f591 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 db154e64869ff7792d8d3c2c317cb9e00a25f048..00fdfad4164f010ddfbdbf8c4567a94641cc3789 100644 +index 4bfcee5f8d60a082e3e8ca39eb59ebc5f33c159e..3d2763791fb50838d85387bbe37c726d9280a05b 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java @@ -950,6 +950,7 @@ public final class CraftServer implements Server { @@ -132,7 +132,7 @@ index db154e64869ff7792d8d3c2c317cb9e00a25f048..00fdfad4164f010ddfbdbf8c4567a946 this.overrideAllCommandBlockCommands = this.commandsConfiguration.getStringList("command-block-overrides").contains("*"); this.ignoreVanillaPermissions = this.commandsConfiguration.getBoolean("ignore-vanilla-permissions"); -@@ -2694,6 +2697,18 @@ public final class CraftServer implements Server { +@@ -2699,6 +2702,18 @@ public final class CraftServer implements Server { return CraftServer.this.console.paperConfigurations.createLegacyObject(CraftServer.this.console); } diff --git a/patches/server/0003-Purpur-client-support.patch b/patches/server/0004-Purpur-client-support.patch similarity index 93% rename from patches/server/0003-Purpur-client-support.patch rename to patches/server/0004-Purpur-client-support.patch index 6bb91adce..707b3f63b 100644 --- a/patches/server/0003-Purpur-client-support.patch +++ b/patches/server/0004-Purpur-client-support.patch @@ -17,10 +17,10 @@ index c8057f98e16ba6e19640e0b250e5201e0f4f57db..9a5e3f75663f6dd3351e23d850c44687 public double lastEntitySpawnRadiusSquared; // Paper - optimise isOutsideRange, this field is in blocks public final com.destroystokyo.paper.util.misc.PooledLinkedHashSets.PooledObjectLinkedOpenHashSet cachedSingleHashSet; // Paper diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -index 03507b5ac5908962e9ebc4b98f53f23110573baa..ec60f7b80c0443fa5baf5acb1829a64b563049ff 100644 +index 01ecd6548c57bd24b3c3e1ad0640062f4b781bbe..cf36af454fb82ecd34af2c468a209f6f3fd0e067 100644 --- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java +++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -@@ -3372,6 +3372,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Ser +@@ -3373,6 +3373,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Ser 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 03507b5ac5908962e9ebc4b98f53f23110573baa..ec60f7b80c0443fa5baf5acb1829a64b @Override public void handleCustomPayload(ServerboundCustomPayloadPacket packet) { -@@ -3396,6 +3397,13 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Ser +@@ -3397,6 +3398,13 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Ser 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 } diff --git a/patches/server/0004-Component-related-conveniences.patch b/patches/server/0005-Component-related-conveniences.patch similarity index 93% rename from patches/server/0004-Component-related-conveniences.patch rename to patches/server/0005-Component-related-conveniences.patch index 4e2c0b81f..67c21d399 100644 --- a/patches/server/0004-Component-related-conveniences.patch +++ b/patches/server/0005-Component-related-conveniences.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Component related conveniences diff --git a/src/main/java/net/minecraft/server/level/ServerPlayer.java b/src/main/java/net/minecraft/server/level/ServerPlayer.java -index 062a06dbff672235acc87624f1b7c28f04ffce32..54999c41a39e8c5baed67e01be3d28385d9f64b7 100644 +index 9a5e3f75663f6dd3351e23d850c446874c03b6a0..070b7d49b46e6e23b4baf33ac045582194579137 100644 --- a/src/main/java/net/minecraft/server/level/ServerPlayer.java +++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java @@ -1699,6 +1699,26 @@ public class ServerPlayer extends Player { @@ -36,7 +36,7 @@ index 062a06dbff672235acc87624f1b7c28f04ffce32..54999c41a39e8c5baed67e01be3d2838 public void displayClientMessage(Component message, boolean actionBar) { this.sendSystemMessage(message, actionBar ? ChatType.GAME_INFO : ChatType.SYSTEM); diff --git a/src/main/java/net/minecraft/server/players/PlayerList.java b/src/main/java/net/minecraft/server/players/PlayerList.java -index f79c4212a5a3f564d00749f21e32639096c3257a..f5031d16853a3462f6049963180f50536889a301 100644 +index 20cdfdb3b9351f74e89bc45b3ab972384165659a..3a52624a0e0f5f6667f4bd78c4a42f5568a25ce3 100644 --- a/src/main/java/net/minecraft/server/players/PlayerList.java +++ b/src/main/java/net/minecraft/server/players/PlayerList.java @@ -1067,6 +1067,20 @@ public abstract class PlayerList { @@ -81,10 +81,10 @@ index 67bce77093dcc126098731047447da2031e3388d..c4088446d30c3b25cf196f51fd394cd0 return this.isFireSource; } diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java -index 0473a4d80f58538ea3cabcd38684339b27c1d29c..2c42e2c39a13372833a4ba9a027e0315b150ab6c 100644 +index fa3263bffcfe042c2f210f85c6868fff08132a7c..2ec7eed33a322254ea9382554e0b7bfc558e0960 100644 --- a/src/main/java/net/minecraft/world/entity/Entity.java +++ b/src/main/java/net/minecraft/world/entity/Entity.java -@@ -3732,6 +3732,20 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { +@@ -3765,6 +3765,20 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { return SlotAccess.NULL; } diff --git a/patches/server/0005-Ridables.patch b/patches/server/0006-Ridables.patch similarity index 98% rename from patches/server/0005-Ridables.patch rename to patches/server/0006-Ridables.patch index 37c873bb6..15f57d07c 100644 --- a/patches/server/0005-Ridables.patch +++ b/patches/server/0006-Ridables.patch @@ -22,10 +22,10 @@ index 153451ecd5b3c8e8ecb2d5ec91ccd582d4300899..56536c39bccfe097f8227c74a0d16799 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 ef42da89af85367d7733de8896ce8dc45ea12d36..257ab642762724ea9ed1bab719e1f7844835e410 100644 +index 8b36917fe25c5a6f12bf834ef29335153aa43c34..bee6004f68f344b2979f9262d99d5d08802751ab 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java -@@ -1531,6 +1531,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop 0; // Paper worldserver.hasEntityMoveEvent = io.papermc.paper.event.entity.EntityMoveEvent.getHandlerList().getRegisteredListeners().length > 0; // Paper @@ -34,7 +34,7 @@ index ef42da89af85367d7733de8896ce8dc45ea12d36..257ab642762724ea9ed1bab719e1f784 this.profiler.push(() -> { diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java -index aaa7ad2a14389dc0dbc0d0fa3fb5ea16ec4172f6..d3624f5a4e3ab9f09d1588a648acba6920e95cfc 100644 +index f492833ff7b7162638777f0777366cfc70274d5d..d8c014f2bccd7a47c064d802fcc0acb787c18eda 100644 --- a/src/main/java/net/minecraft/server/level/ServerLevel.java +++ b/src/main/java/net/minecraft/server/level/ServerLevel.java @@ -218,6 +218,7 @@ public class ServerLevel extends Level implements WorldGenLevel { @@ -66,10 +66,10 @@ index 070b7d49b46e6e23b4baf33ac045582194579137..f4b33e5788665eefef35e701ed99d58d 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 ec60f7b80c0443fa5baf5acb1829a64b563049ff..e3f900e33096ff5636f5ed6d39531e05a05f6593 100644 +index cf36af454fb82ecd34af2c468a209f6f3fd0e067..3b7427d6d59006c84fbd8d16d4446e7670761e66 100644 --- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java +++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -@@ -2659,6 +2659,8 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Ser +@@ -2660,6 +2660,8 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Ser ServerGamePacketListenerImpl.this.cserver.getPluginManager().callEvent(event); @@ -79,7 +79,7 @@ index ec60f7b80c0443fa5baf5acb1829a64b563049ff..e3f900e33096ff5636f5ed6d39531e05 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)) { ServerGamePacketListenerImpl.this.send(new ClientboundAddEntityPacket(entity)); diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java -index 3f8bddf450f3b0382144bac750195c6390dd7495..a964f9a09b9b9d16c72691ee4d7924e0a25b7876 100644 +index 2ec7eed33a322254ea9382554e0b7bfc558e0960..dd4f434d26814f46285f2bd23f8a4b53c89872d7 100644 --- a/src/main/java/net/minecraft/world/entity/Entity.java +++ b/src/main/java/net/minecraft/world/entity/Entity.java @@ -356,7 +356,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { @@ -91,7 +91,7 @@ index 3f8bddf450f3b0382144bac750195c6390dd7495..a964f9a09b9b9d16c72691ee4d7924e0 private float eyeHeight; public boolean isInPowderSnow; public boolean wasInPowderSnow; -@@ -2723,6 +2723,12 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { +@@ -2756,6 +2756,12 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { this.passengers = ImmutableList.copyOf(list); } @@ -104,7 +104,7 @@ index 3f8bddf450f3b0382144bac750195c6390dd7495..a964f9a09b9b9d16c72691ee4d7924e0 } return true; // CraftBukkit } -@@ -2763,6 +2769,14 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { +@@ -2796,6 +2802,14 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { return false; } // Spigot end @@ -119,7 +119,7 @@ index 3f8bddf450f3b0382144bac750195c6390dd7495..a964f9a09b9b9d16c72691ee4d7924e0 if (this.passengers.size() == 1 && this.passengers.get(0) == entity) { this.passengers = ImmutableList.of(); } else { -@@ -4417,4 +4431,45 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { +@@ -4502,4 +4516,45 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { return ((ServerChunkCache) level.getChunkSource()).isPositionTicking(this); } // Paper end @@ -194,10 +194,10 @@ index c1e9b40a4a0f9cdc650caa88b5ea132e06ee2496..882ab40c8cdea8c214cb8344b3ccecdd 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 e8dc99752d06ca40f17f3ad2c829b2447b703d7c..577e7737d234e89a8a0a16bd00b4f2757f8443f8 100644 +index 39fab6a5195e32ae6ffc9988e6fcecfe96be2f76..14444b86758912e9938026178ac3ba4e16e3b966 100644 --- a/src/main/java/net/minecraft/world/entity/LivingEntity.java +++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java -@@ -221,9 +221,9 @@ public abstract class LivingEntity extends Entity { +@@ -220,9 +220,9 @@ public abstract class LivingEntity extends Entity { protected int deathScore; public float lastHurt; public boolean jumping; @@ -210,7 +210,7 @@ index e8dc99752d06ca40f17f3ad2c829b2447b703d7c..577e7737d234e89a8a0a16bd00b4f275 protected int lerpSteps; protected double lerpX; protected double lerpY; -@@ -288,7 +288,7 @@ public abstract class LivingEntity extends Entity { +@@ -287,7 +287,7 @@ public abstract class LivingEntity extends Entity { this.effectsDirty = true; this.useItem = ItemStack.EMPTY; this.lastClimbablePos = Optional.empty(); @@ -219,7 +219,7 @@ index e8dc99752d06ca40f17f3ad2c829b2447b703d7c..577e7737d234e89a8a0a16bd00b4f275 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()); -@@ -339,6 +339,7 @@ public abstract class LivingEntity extends Entity { +@@ -338,6 +338,7 @@ public abstract class LivingEntity extends Entity { 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); } @@ -227,7 +227,7 @@ index e8dc99752d06ca40f17f3ad2c829b2447b703d7c..577e7737d234e89a8a0a16bd00b4f275 @Override protected void checkFallDamage(double heightDifference, boolean onGround, BlockState state, BlockPos landedPosition) { -@@ -2627,7 +2628,7 @@ public abstract class LivingEntity extends Entity { +@@ -2648,7 +2649,7 @@ public abstract class LivingEntity extends Entity { } protected long lastJumpTime = 0L; // Paper @@ -236,7 +236,7 @@ index e8dc99752d06ca40f17f3ad2c829b2447b703d7c..577e7737d234e89a8a0a16bd00b4f275 double d0 = (double) this.getJumpPower() + this.getJumpBoostPower(); Vec3 vec3d = this.getDeltaMovement(); // Paper start -@@ -3377,8 +3378,10 @@ public abstract class LivingEntity extends Entity { +@@ -3398,8 +3399,10 @@ public abstract class LivingEntity extends Entity { this.pushEntities(); this.level.getProfiler().pop(); // Paper start @@ -249,7 +249,7 @@ index e8dc99752d06ca40f17f3ad2c829b2447b703d7c..577e7737d234e89a8a0a16bd00b4f275 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()); -@@ -3388,6 +3391,21 @@ public abstract class LivingEntity extends Entity { +@@ -3409,6 +3412,21 @@ public abstract class LivingEntity extends Entity { absMoveTo(event.getTo().getX(), event.getTo().getY(), event.getTo().getZ(), event.getTo().getYaw(), event.getTo().getPitch()); } } @@ -272,7 +272,7 @@ index e8dc99752d06ca40f17f3ad2c829b2447b703d7c..577e7737d234e89a8a0a16bd00b4f275 // 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 3646b969fa51b9683ab4137e530c3a6f6fc6c465..c04de0abe8ff2eb9a8ca38912e60520f6b2af0f5 100644 +index e8e60ea8b9e97ed87be78752f398ab25ba8e9a1b..2be421f6584dc184dcd5d7589bd65c1f402a0eaf 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 { @@ -286,7 +286,7 @@ index 3646b969fa51b9683ab4137e530c3a6f6fc6c465..c04de0abe8ff2eb9a8ca38912e60520f this.jumpControl = new JumpControl(this); this.bodyRotationControl = this.createBodyControl(); this.navigation = this.createNavigation(world); -@@ -1317,7 +1317,7 @@ public abstract class Mob extends LivingEntity { +@@ -1323,7 +1323,7 @@ public abstract class Mob extends LivingEntity { protected void onOffspringSpawnedFromEgg(Player player, Mob child) {} protected InteractionResult mobInteract(Player player, InteractionHand hand) { @@ -295,7 +295,7 @@ index 3646b969fa51b9683ab4137e530c3a6f6fc6c465..c04de0abe8ff2eb9a8ca38912e60520f } public boolean isWithinRestriction() { -@@ -1688,4 +1688,52 @@ public abstract class Mob extends LivingEntity { +@@ -1694,4 +1694,52 @@ public abstract class Mob extends LivingEntity { public Iterable iteratePathfindingStartNodeCandidatePositions() { return ImmutableSet.of(new BlockPos(this.getBoundingBox().minX, (double) this.getBlockY(), this.getBoundingBox().minZ), new BlockPos(this.getBoundingBox().minX, (double) this.getBlockY(), this.getBoundingBox().maxZ), new BlockPos(this.getBoundingBox().maxX, (double) this.getBlockY(), this.getBoundingBox().minZ), new BlockPos(this.getBoundingBox().maxX, (double) this.getBlockY(), this.getBoundingBox().maxZ)); } @@ -349,14 +349,15 @@ index 3646b969fa51b9683ab4137e530c3a6f6fc6c465..c04de0abe8ff2eb9a8ca38912e60520f + // 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 c770ee21b7b699522941f6a1584d532001c04082..f274bef4726f9e23640f3a84c620e7343e96deb3 100644 +index 9bce290eb0c2cfef4896a3f2076c80bf3d76bd56..00fc98797aea23e1f586b8e7f85fc27e2019352f 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 -@@ -22,13 +22,20 @@ public class AttributeMap { +@@ -22,15 +22,22 @@ public class AttributeMap { private final Map attributes = Maps.newHashMap(); private final Set dirtyAttributes = Sets.newHashSet(); private final AttributeSupplier supplier; + private final net.minecraft.world.entity.LivingEntity entity; // Purpur + private final java.util.function.Function createInstance; // Pufferfish public AttributeMap(AttributeSupplier defaultAttributes) { + // Purpur start @@ -366,6 +367,7 @@ index c770ee21b7b699522941f6a1584d532001c04082..f274bef4726f9e23640f3a84c620e734 + this.entity = entity; + // Purpur end this.supplier = defaultAttributes; + this.createInstance = attribute -> this.supplier.createInstance(this::onAttributeModified, attribute); // Pufferfish } private void onAttributeModified(AttributeInstance instance) { @@ -374,7 +376,7 @@ index c770ee21b7b699522941f6a1584d532001c04082..f274bef4726f9e23640f3a84c620e734 this.dirtyAttributes.add(instance); } -@@ -40,7 +47,7 @@ public class AttributeMap { +@@ -42,11 +49,10 @@ public class AttributeMap { public Collection getSyncableAttributes() { return this.attributes.values().stream().filter((attribute) -> { @@ -383,6 +385,10 @@ index c770ee21b7b699522941f6a1584d532001c04082..f274bef4726f9e23640f3a84c620e734 }).collect(Collectors.toList()); } +- + @Nullable + public AttributeInstance getInstance(Attribute attribute) { + return this.attributes.computeIfAbsent(attribute, this.createInstance); // Pufferfish - cache lambda, as for some reason java allocates it anyways diff --git a/src/main/java/net/minecraft/world/entity/ai/attributes/DefaultAttributes.java b/src/main/java/net/minecraft/world/entity/ai/attributes/DefaultAttributes.java index d5d2b58f103d6bb50a4657299876ac02b77f258a..449b13ab3aeaebdf1e315700446b62b20e275e9b 100644 --- a/src/main/java/net/minecraft/world/entity/ai/attributes/DefaultAttributes.java @@ -547,7 +553,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 50d4595b81f24949011c7565c5e3fc8c26c86019..f7f3daa646e3f43ae503a67b7c52faef84bff0da 100644 +index 234ad92d666775dcf5a29a60551b17cbb1d8e6ec..2edc11b093dbfc96d287dc9d3e208cc2a39c537e 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; @@ -2188,7 +2194,7 @@ index 45c3cec839a7c23903dedf6e3e004305da2adceb..248531727dcafb71d7d2d2767205e09a 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/axolotl/Axolotl.java b/src/main/java/net/minecraft/world/entity/animal/axolotl/Axolotl.java -index da5e6141f548539cac720aba558e1b6f3a87e474..bd88b617eb5a496943b4c21d4fad1be8e208eb23 100644 +index fdd2c63ff0017bafa544a3cff2ee6d2d62c92cb3..32b31e5efb5fc68430b9bcd4cd972494f53accc8 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 @@ -97,6 +97,28 @@ public class Axolotl extends Animal implements LerpingModel, Bucketable { @@ -2220,7 +2226,7 @@ index da5e6141f548539cac720aba558e1b6f3a87e474..bd88b617eb5a496943b4c21d4fad1be8 @Override public Map getModelRotationValues() { return this.modelRotationValues; -@@ -523,14 +545,22 @@ public class Axolotl extends Animal implements LerpingModel, Bucketable { +@@ -525,14 +547,22 @@ public class Axolotl extends Animal implements LerpingModel, Bucketable { private static class AxolotlMoveControl extends SmoothSwimmingMoveControl { private final Axolotl axolotl; @@ -2243,7 +2249,7 @@ index da5e6141f548539cac720aba558e1b6f3a87e474..bd88b617eb5a496943b4c21d4fad1be8 if (!this.axolotl.isPlayingDead()) { super.tick(); } -@@ -545,9 +575,9 @@ public class Axolotl extends Animal implements LerpingModel, Bucketable { +@@ -547,9 +577,9 @@ public class Axolotl extends Animal implements LerpingModel, Bucketable { } @Override @@ -2256,7 +2262,7 @@ index da5e6141f548539cac720aba558e1b6f3a87e474..bd88b617eb5a496943b4c21d4fad1be8 } 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 56dd01801f56c56d07101e7e22b58ac059f5f07f..edf7defbd600f289de35af4a7fc57aedf8504442 100644 +index f489301701f8abfb8f509d91089c1433db2346f8..ba47201f7b9ebfba28dc2f7ddc89375a8662476d 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 { @@ -2283,11 +2289,12 @@ index 56dd01801f56c56d07101e7e22b58ac059f5f07f..edf7defbd600f289de35af4a7fc57aed @Override protected Brain.Provider brainProvider() { return Brain.provider(Goat.MEMORY_TYPES, Goat.SENSOR_TYPES); -@@ -166,6 +183,7 @@ public class Goat extends Animal { +@@ -167,7 +184,7 @@ public class Goat extends Animal { @Override protected void customServerAiStep() { this.level.getProfiler().push("goatBrain"); -+ if (getRider() == null || !this.isControllable())// Purpur - only use brain if no rider +- if (this.behaviorTick++ % this.activatedPriority == 0) // Pufferfish ++ if ((getRider() == null || !this.isControllable()) && this.behaviorTick++ % this.activatedPriority == 0) // Pufferfish // Purpur - only use brain if no rider this.getBrain().tick((ServerLevel) this.level, this); this.level.getProfiler().pop(); this.level.getProfiler().push("goatActivityUpdate"); @@ -3220,7 +3227,7 @@ index d02286d553c600fe7e75f48e278e380d21c5b868..82b03488178962eb74fe252d561ba8ce 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 f22e615dba31619c97bf58930da060476a52facf..94dbdbd161202e346e1c496924139a18f6cdf9fe 100644 +index f5bb64f9f683cf21e772035e9be100ed2ddf8bc6..a27394f0188f643a602e126c484d0de440d19409 100644 --- a/src/main/java/net/minecraft/world/entity/monster/EnderMan.java +++ b/src/main/java/net/minecraft/world/entity/monster/EnderMan.java @@ -87,9 +87,27 @@ public class EnderMan extends Monster implements NeutralMob { @@ -3268,7 +3275,7 @@ index f22e615dba31619c97bf58930da060476a52facf..94dbdbd161202e346e1c496924139a18 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 -@@ -382,6 +401,7 @@ public class EnderMan extends Monster implements NeutralMob { +@@ -388,6 +407,7 @@ public class EnderMan extends Monster implements NeutralMob { public boolean hurt(DamageSource source, float amount) { if (this.isInvulnerableTo(source)) { return false; @@ -4636,7 +4643,7 @@ index d0567234d1261227d29bb254f959604dc91b3c72..cf9f43d1205453af88ffdc2e96fe4376 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 45741410a13cffe3419e34b5607b048bbcf1c3ff..8e93f0c152a5ac98588b3afaa631ebbbc9e4ed79 100644 +index 5d487f1613b1fc5807283c20e5cc23a432d08f42..f2afd5f8ad916f0cf4674c6b4f973715999c6641 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 { @@ -4663,16 +4670,17 @@ index 45741410a13cffe3419e34b5607b048bbcf1c3ff..8e93f0c152a5ac98588b3afaa631ebbb @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())// Purpur - only use brain if no rider +- if (this.behaviorTick++ % this.activatedPriority == 0) // Pufferfish ++ if ((getRider() == null || !this.isControllable()) && this.behaviorTick++ % this.activatedPriority == 0) // Pufferfish // Purpur - only use brain if no rider 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 793576928dad6752dddd86e62d4c0800d8515fc4..d30e9c880323481695824f39abc1cb02204bfe44 100644 +index 9bde52b723237b1f0f945bc564009e3507993508..b5b2d1f8ab8dedfa38e0ed4c99a0e0088fa4e4cc 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 @@ -95,6 +95,23 @@ public class Piglin extends AbstractPiglin implements CrossbowAttackMob, Invento @@ -4699,11 +4707,12 @@ index 793576928dad6752dddd86e62d4c0800d8515fc4..d30e9c880323481695824f39abc1cb02 @Override public void addAdditionalSaveData(CompoundTag nbt) { super.addAdditionalSaveData(nbt); -@@ -292,6 +309,7 @@ public class Piglin extends AbstractPiglin implements CrossbowAttackMob, Invento +@@ -293,7 +310,7 @@ public class Piglin extends AbstractPiglin implements CrossbowAttackMob, Invento @Override protected void customServerAiStep() { this.level.getProfiler().push("piglinBrain"); -+ if (getRider() == null || !this.isControllable()) // Purpur - only use brain if no rider +- if (this.behaviorTick++ % this.activatedPriority == 0) // Pufferfish ++ if ((getRider() == null || !this.isControllable()) && this.behaviorTick++ % this.activatedPriority == 0) // Pufferfish // Purpur - only use brain if no rider this.getBrain().tick((ServerLevel) this.level, this); this.level.getProfiler().pop(); PiglinAi.updateActivity(this); @@ -4753,10 +4762,10 @@ index ac75c54e897565e340b66823caeed92ba1d1641a..ff149234a8f3e1c94961e41d5bc81174 this.level.getProfiler().pop(); PiglinBruteAi.updateActivity(this); 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 10b45ec24a5a0867106d1694312385ad1e267f43..850bfb8d08281c91ae8e17b4db38ffdaae2dbf96 100644 +index 93077e8c6b5a35adc6febb749d1d08be172402f1..a6519bf96f39fa69ecb65ef25dba80261bb03323 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)); } @@ -4785,15 +4794,16 @@ index 10b45ec24a5a0867106d1694312385ad1e267f43..850bfb8d08281c91ae8e17b4db38ffda @Override public Brain getBrain() { return (Brain) super.getBrain(); // CraftBukkit - decompile error -@@ -247,6 +269,7 @@ 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 (getRider() == null || !this.isControllable())// Purpur - only use brain if no rider - if (!inactive) this.getBrain().tick((ServerLevel) this.level, this); // Paper - this.level.getProfiler().pop(); - if (this.assignProfessionWhenSpawned) { -@@ -304,7 +327,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(); @@ -4802,7 +4812,7 @@ index 10b45ec24a5a0867106d1694312385ad1e267f43..850bfb8d08281c91ae8e17b4db38ffda } else { boolean flag = this.getOffers().isEmpty(); -@@ -317,8 +340,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/0006-Configurable-entity-base-attributes.patch b/patches/server/0007-Configurable-entity-base-attributes.patch similarity index 99% rename from patches/server/0006-Configurable-entity-base-attributes.patch rename to patches/server/0007-Configurable-entity-base-attributes.patch index bc7773c3f..cf67c36a4 100644 --- a/patches/server/0006-Configurable-entity-base-attributes.patch +++ b/patches/server/0007-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 a964f9a09b9b9d16c72691ee4d7924e0a25b7876..f58ad1b263af2ab9d829cd93056352e2ef9254e4 100644 +index dd4f434d26814f46285f2bd23f8a4b53c89872d7..aea8814bf1ed44075c54b18fcdc8676579f07a6e 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 882ab40c8cdea8c214cb8344b3ccecddb2967c1c..cb79d2c958fbd34f8c8818e7e1c0db88 @Override diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java -index 577e7737d234e89a8a0a16bd00b4f2757f8443f8..402bd611231d4547a469a70429f006a84546a0eb 100644 +index 14444b86758912e9938026178ac3ba4e16e3b966..5a45e04f81171b3682cf39fcd3e35e440dec9090 100644 --- a/src/main/java/net/minecraft/world/entity/LivingEntity.java +++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java -@@ -289,6 +289,7 @@ public abstract class LivingEntity extends Entity { +@@ -288,6 +288,7 @@ public abstract class LivingEntity extends Entity { this.useItem = ItemStack.EMPTY; this.lastClimbablePos = Optional.empty(); this.attributes = new AttributeMap(DefaultAttributes.getSupplier(type), this); // Purpur @@ -45,7 +45,7 @@ index 577e7737d234e89a8a0a16bd00b4f2757f8443f8..402bd611231d4547a469a70429f006a8 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()); -@@ -304,6 +305,8 @@ public abstract class LivingEntity extends Entity { +@@ -303,6 +304,8 @@ public abstract class LivingEntity extends Entity { this.brain = this.makeBrain(new Dynamic(dynamicopsnbt, (Tag) dynamicopsnbt.createMap((Map) ImmutableMap.of(dynamicopsnbt.createString("memories"), (Tag) dynamicopsnbt.emptyMap())))); } @@ -55,7 +55,7 @@ index 577e7737d234e89a8a0a16bd00b4f2757f8443f8..402bd611231d4547a469a70429f006a8 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 f7f3daa646e3f43ae503a67b7c52faef84bff0da..a02502ce8916c6b817270297412f961d5fcf4689 100644 +index 2edc11b093dbfc96d287dc9d3e208cc2a39c537e..007c945725721ddb8a3dc4b8085e8c68da741b93 100644 --- a/src/main/java/net/minecraft/world/entity/ambient/Bat.java +++ b/src/main/java/net/minecraft/world/entity/ambient/Bat.java @@ -90,6 +90,18 @@ public class Bat extends AmbientCreature { @@ -459,7 +459,7 @@ index 248531727dcafb71d7d2d2767205e09a8c0f1876..01c8508571a88c22359cbf36341338c5 @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 bd88b617eb5a496943b4c21d4fad1be8e208eb23..53aef0ac481c3e79dfb04c33cb17bbdd89b2438b 100644 +index 32b31e5efb5fc68430b9bcd4cd972494f53accc8..a80a7d460051a39fe805ae669b4586fb42e46943 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 @@ -117,6 +117,11 @@ public class Axolotl extends Animal implements LerpingModel, Bucketable { @@ -475,7 +475,7 @@ index bd88b617eb5a496943b4c21d4fad1be8e208eb23..53aef0ac481c3e79dfb04c33cb17bbdd @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 edf7defbd600f289de35af4a7fc57aedf8504442..49b289fce943719a63df454fefab725a2b3a7de5 100644 +index ba47201f7b9ebfba28dc2f7ddc89375a8662476d..aa2abe00478b002fc90166441d8b89c7046ed022 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 { @@ -719,7 +719,7 @@ index 0f8ce0c6ddbb37a61c6b15bb769b627bcd8105fa..6ed9e4e98c46b51cf398641ffb66abf3 public static AttributeSupplier.Builder createAttributes() { 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 314454b8c0197002c6c2529ffb75724de16cf7a6..49454ad2de73c0a50ac1e3b9cda35f6c66e416f6 100644 +index 079a85f1520cda6a0fb72d0dd7f9e18aec6a6c91..c1b67d5dc5fd533fb2aa28a5c7d9dd87cc7412d8 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 @@ -160,6 +160,11 @@ public class EnderDragon extends Mob implements Enemy { @@ -735,7 +735,7 @@ index 314454b8c0197002c6c2529ffb75724de16cf7a6..49454ad2de73c0a50ac1e3b9cda35f6c public static AttributeSupplier.Builder createAttributes() { diff --git a/src/main/java/net/minecraft/world/entity/boss/wither/WitherBoss.java b/src/main/java/net/minecraft/world/entity/boss/wither/WitherBoss.java -index b271c8b1aa75df1b9e0d7b011aacacccfe5ea4bc..ef528ad1571b7dcd180c70160fe6b17b2d7a18b8 100644 +index dd7bd70e0b905eea690c2d20b8438b9476d2badc..1005e47452f6437b75b050e695493647c92b7cf5 100644 --- a/src/main/java/net/minecraft/world/entity/boss/wither/WitherBoss.java +++ b/src/main/java/net/minecraft/world/entity/boss/wither/WitherBoss.java @@ -212,6 +212,11 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob @@ -829,7 +829,7 @@ index 869a2ee5e0775cc477fb56063dfa4ce4a0c6e3f2..4b58ca48deda0410edf9ad3c9079858d @Override diff --git a/src/main/java/net/minecraft/world/entity/monster/ElderGuardian.java b/src/main/java/net/minecraft/world/entity/monster/ElderGuardian.java -index 1bf856171a9eccf77857232a30d6327b9d8017c6..725e98128fca670e370a35e763050909074b2653 100644 +index 82b03488178962eb74fe252d561ba8cee32eda95..01be40f1740fc689b101fc596dbbb1e66de0bfb1 100644 --- a/src/main/java/net/minecraft/world/entity/monster/ElderGuardian.java +++ b/src/main/java/net/minecraft/world/entity/monster/ElderGuardian.java @@ -48,6 +48,11 @@ public class ElderGuardian extends Guardian { @@ -845,7 +845,7 @@ index 1bf856171a9eccf77857232a30d6327b9d8017c6..725e98128fca670e370a35e763050909 public static AttributeSupplier.Builder createAttributes() { 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 94dbdbd161202e346e1c496924139a18f6cdf9fe..1878375dc4535e0b681c9fe11c3d04b4811679be 100644 +index a27394f0188f643a602e126c484d0de440d19409..d86aeb3f91a01206e7cb13caae3e5c571a73952c 100644 --- a/src/main/java/net/minecraft/world/entity/monster/EnderMan.java +++ b/src/main/java/net/minecraft/world/entity/monster/EnderMan.java @@ -102,6 +102,11 @@ public class EnderMan extends Monster implements NeutralMob { @@ -1131,7 +1131,7 @@ index e73644f453bed8523bfad47764018362a416b5ea..e239bcc4d4afe48e9fc204ad38d8bc76 @Override diff --git a/src/main/java/net/minecraft/world/entity/monster/Slime.java b/src/main/java/net/minecraft/world/entity/monster/Slime.java -index e84a23c52a53095a077ed21bf4d1ddbad303442d..d1d58b8b109fb96ffe0561c8f8e3bb38a5a06e59 100644 +index 3ccf5083333751ee1eede1d3e1a28b6f7bf7f23c..5146ae55c6c486d5a6619a0f30e41e07988faf95 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Slime.java +++ b/src/main/java/net/minecraft/world/entity/monster/Slime.java @@ -103,6 +103,37 @@ public class Slime extends Mob implements Enemy { @@ -1384,7 +1384,7 @@ index cf9f43d1205453af88ffdc2e96fe4376ecd45fbf..bc3ffb8867d5f7c2fa548d31256341d3 @Nullable 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 8e93f0c152a5ac98588b3afaa631ebbbc9e4ed79..958b32de685653e75a9495cb0108e6982cc4cc97 100644 +index f2afd5f8ad916f0cf4674c6b4f973715999c6641..e99ffbf30652e188e88f8e17ed41d39ff25c9f73 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 @@ -82,6 +82,11 @@ public class Hoglin extends Animal implements Enemy, HoglinBase { @@ -1400,7 +1400,7 @@ index 8e93f0c152a5ac98588b3afaa631ebbbc9e4ed79..958b32de685653e75a9495cb0108e698 @Override 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 d30e9c880323481695824f39abc1cb02204bfe44..9b8925fe938962264fdf49e97abc660d7fe8476a 100644 +index b5b2d1f8ab8dedfa38e0ed4c99a0e0088fa4e4cc..9a14ac198433e9bdfa2dabd4d3ae88ba17fd86ea 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 @@ -110,6 +110,11 @@ public class Piglin extends AbstractPiglin implements CrossbowAttackMob, Invento @@ -1432,10 +1432,10 @@ index ff149234a8f3e1c94961e41d5bc8117460b301d9..75db61c5aab66234b26f7899229ddca8 public static AttributeSupplier.Builder createAttributes() { 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 850bfb8d08281c91ae8e17b4db38ffdaae2dbf96..8f220534aa2af1d85968f1fa138b1d21f05ee0b2 100644 +index a6519bf96f39fa69ecb65ef25dba80261bb03323..ef08ec3eb88ee1ab624e2bd38aaff5e8f97720f2 100644 --- a/src/main/java/net/minecraft/world/entity/npc/Villager.java +++ b/src/main/java/net/minecraft/world/entity/npc/Villager.java -@@ -173,6 +173,11 @@ public class Villager extends AbstractVillager implements ReputationEventHandler +@@ -175,6 +175,11 @@ public class Villager extends AbstractVillager implements ReputationEventHandler protected void registerGoals() { this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); } diff --git a/patches/server/0007-Timings-stuff.patch b/patches/server/0008-Timings-stuff.patch similarity index 79% rename from patches/server/0007-Timings-stuff.patch rename to patches/server/0008-Timings-stuff.patch index e572a0e1a..0ca6ea63a 100644 --- a/patches/server/0007-Timings-stuff.patch +++ b/patches/server/0008-Timings-stuff.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Timings stuff diff --git a/src/main/java/co/aikar/timings/TimingsExport.java b/src/main/java/co/aikar/timings/TimingsExport.java -index 06bff37e4c1fddd3be6343049a66787c63fb420c..fcc9d08b70671beee7db681544b0d50bf0784c5a 100644 +index 2cc44fbf8e5bd436b6d4e19f6c06b351e750cb31..fa8eb9fb4122097d2a5cb1d07f75c830ad6b2f57 100644 --- a/src/main/java/co/aikar/timings/TimingsExport.java +++ b/src/main/java/co/aikar/timings/TimingsExport.java -@@ -239,9 +239,13 @@ public class TimingsExport extends Thread { +@@ -239,10 +239,14 @@ public class TimingsExport extends Thread { // Information on the users Config parent.put("config", createObject( @@ -16,15 +16,17 @@ index 06bff37e4c1fddd3be6343049a66787c63fb420c..fcc9d08b70671beee7db681544b0d50b + // Purpur start + pair("server.properties", mapAsJSON(Bukkit.spigot().getServerProperties())), 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 + pair("spigot", mapAsJSON(Bukkit.spigot().getSpigotConfig(), null)), + pair("paper", mapAsJSON(Bukkit.spigot().getPaperConfig(), null)), ++ pair("pufferfish", mapAsJSON(gg.pufferfish.pufferfish.PufferfishConfig.getConfigCopy(), null)), // Pufferfish + pair("purpur", mapAsJSON(Bukkit.spigot().getPurpurConfig(), null)) + // Purpur end )); new TimingsExport(listeners, parent, history).start(); -@@ -282,6 +286,19 @@ public class TimingsExport extends Thread { +@@ -283,6 +287,19 @@ public class TimingsExport extends Thread { return timingsCost; } diff --git a/patches/server/0008-Barrels-and-enderchests-6-rows.patch b/patches/server/0009-Barrels-and-enderchests-6-rows.patch similarity index 98% rename from patches/server/0008-Barrels-and-enderchests-6-rows.patch rename to patches/server/0009-Barrels-and-enderchests-6-rows.patch index 2d2492489..596660867 100644 --- a/patches/server/0008-Barrels-and-enderchests-6-rows.patch +++ b/patches/server/0009-Barrels-and-enderchests-6-rows.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Barrels and enderchests 6 rows diff --git a/src/main/java/net/minecraft/server/players/PlayerList.java b/src/main/java/net/minecraft/server/players/PlayerList.java -index f5031d16853a3462f6049963180f50536889a301..ae3a7cc79897b2a247d63d1428d1a97e586d64ca 100644 +index 3a52624a0e0f5f6667f4bd78c4a42f5568a25ce3..1e4be9af14b305aed38a7a3cf38a4659ba3aeb18 100644 --- a/src/main/java/net/minecraft/server/players/PlayerList.java +++ b/src/main/java/net/minecraft/server/players/PlayerList.java @@ -1192,6 +1192,27 @@ public abstract class PlayerList { @@ -37,7 +37,7 @@ index f5031d16853a3462f6049963180f50536889a301..ae3a7cc79897b2a247d63d1428d1a97e public boolean isWhiteListed(GameProfile profile) { 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 4a04249441959340ad5f3a1879edd21208c7a9dc..e0a30fdeeb3402f9b34dc6b53594c85b10eab86f 100644 +index 02cf1fdc58c33431a070a970add325eb7a278974..f86fd6a5712d1a3b6e0a306421eaf833f6377e65 100644 --- a/src/main/java/net/minecraft/world/entity/player/Player.java +++ b/src/main/java/net/minecraft/world/entity/player/Player.java @@ -186,6 +186,7 @@ public abstract class Player extends LivingEntity { diff --git a/patches/server/0009-Llama-API.patch b/patches/server/0010-Llama-API.patch similarity index 98% rename from patches/server/0009-Llama-API.patch rename to patches/server/0010-Llama-API.patch index 5275159c0..0f42a65d8 100644 --- a/patches/server/0009-Llama-API.patch +++ b/patches/server/0010-Llama-API.patch @@ -25,7 +25,7 @@ index 721971f7618751a2e95f1c49fdc48a9c0c672cab..7b141c495095afcd9c8b04c059d692e8 double d = this.llama.distanceToSqr(this.llama.getCaravanHead()); if (d > 676.0D) { diff --git a/src/main/java/net/minecraft/world/entity/animal/horse/Llama.java b/src/main/java/net/minecraft/world/entity/animal/horse/Llama.java -index 19457fa164c81fd640dbe8bf1f666cb437a20487..5b15b9451007a0ffcf442a33de81ff5d8b8649a5 100644 +index fd5802bf7554590a19b3d5fc50c9ced02232f294..8512103686380c2114851666fce649d573a61355 100644 --- a/src/main/java/net/minecraft/world/entity/animal/horse/Llama.java +++ b/src/main/java/net/minecraft/world/entity/animal/horse/Llama.java @@ -68,6 +68,7 @@ public class Llama extends AbstractChestedHorse implements RangedAttackMob { diff --git a/patches/server/0010-AFK-API.patch b/patches/server/0011-AFK-API.patch similarity index 97% rename from patches/server/0010-AFK-API.patch rename to patches/server/0011-AFK-API.patch index 63a9df62b..6642c37bc 100644 --- a/patches/server/0010-AFK-API.patch +++ b/patches/server/0011-AFK-API.patch @@ -68,7 +68,7 @@ index f4b33e5788665eefef35e701ed99d58d0ea1b3c2..e40e8e837273c243f5ccc192514d5404 return this.stats; } diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -index e3f900e33096ff5636f5ed6d39531e05a05f6593..b67bd2d606e44804f51478847e01da18f0d64349 100644 +index 3b7427d6d59006c84fbd8d16d4446e7670761e66..df5cbfda7b3eae38583d01ea96874bdb7f5b3b65 100644 --- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java +++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java @@ -313,6 +313,20 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Ser @@ -114,7 +114,7 @@ index e3f900e33096ff5636f5ed6d39531e05a05f6593..b67bd2d606e44804f51478847e01da18 // Skip the first time we do this if (true) { // Spigot - don't skip any move events Location oldTo = to.clone(); -@@ -1478,7 +1500,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Ser +@@ -1479,7 +1501,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Ser if (!this.player.isChangingDimension() && d11 > 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 @@ -123,7 +123,7 @@ index e3f900e33096ff5636f5ed6d39531e05a05f6593..b67bd2d606e44804f51478847e01da18 } this.player.absMoveTo(d0, d1, d2, f, f1); -@@ -1528,6 +1550,8 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Ser +@@ -1529,6 +1551,8 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Ser this.lastYaw = to.getYaw(); this.lastPitch = to.getPitch(); @@ -167,7 +167,7 @@ index e39965c2e50bc8ee424ea07819346e0611398e28..212ea98eeaaf4b20ba0896dab03cd092 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 { @@ -305,10 +305,10 @@ index c38d9583d8ce50670d78b60d92c90d1d5eb4bbfc..01a2d17790b3adbc63fe742b9e5c11dd 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 1a1a1f4d0ac025daccc2d3f84faf6592819f4d5c..1ae88964fc3c05493516278d150537fd6699df2d 100644 +index 8643df8d81714edf60eebd6984bac2c933d1fbd6..4e5583cdd78608108bb1788e6881d4b4fbf014af 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/0012-Bring-back-server-name.patch similarity index 91% rename from patches/server/0011-Bring-back-server-name.patch rename to patches/server/0012-Bring-back-server-name.patch index 547d3a654..7e5e42237 100644 --- a/patches/server/0011-Bring-back-server-name.patch +++ b/patches/server/0012-Bring-back-server-name.patch @@ -17,10 +17,10 @@ index 26345494ce190b5cd2ab58dd7d4b046796767b20..20d579a20e186e59975df1b35112015e 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 00fdfad4164f010ddfbdbf8c4567a94641cc3789..dac6769842d8e168d0366d610a0bd404062d341c 100644 +index 3d2763791fb50838d85387bbe37c726d9280a05b..f6d46130130279f64caa21bfe1f702a2e3034527 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -@@ -2884,4 +2884,11 @@ public final class CraftServer implements Server { +@@ -2889,4 +2889,11 @@ public final class CraftServer implements Server { } // Paper end diff --git a/patches/server/0012-Configurable-server-mod-name.patch b/patches/server/0013-Configurable-server-mod-name.patch similarity index 91% rename from patches/server/0012-Configurable-server-mod-name.patch rename to patches/server/0013-Configurable-server-mod-name.patch index e16645dea..42b9d388d 100644 --- a/patches/server/0012-Configurable-server-mod-name.patch +++ b/patches/server/0013-Configurable-server-mod-name.patch @@ -5,10 +5,10 @@ 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 8184fcc7c2ec8e3fdfeb7d089860e7aa9c17ac4e..d0fef308a6b8848a7473484956716e6c36c315c0 100644 +index bee6004f68f344b2979f9262d99d5d08802751ab..b844bffb6363efcb4d8a6fc8489542d7bcfa35d0 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java -@@ -1655,7 +1655,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop drops = new ArrayList(); public final org.bukkit.craftbukkit.attribute.CraftAttributeMap craftAttributes; -@@ -355,8 +356,8 @@ public abstract class LivingEntity extends Entity { +@@ -354,8 +355,8 @@ public abstract class LivingEntity extends Entity { this.tryAddSoulSpeed(); } @@ -27,7 +27,7 @@ index 68bbd0c1facef4d3e21975ead5b7af19ac3c1254..33235a2aa69726b14b37dfbab0f6518f if (!state.isAir()) { double d1 = Math.min((double) (0.2F + f / 15.0F), 2.5D); -@@ -1945,7 +1946,7 @@ public abstract class LivingEntity extends Entity { +@@ -1966,7 +1967,7 @@ public abstract class LivingEntity extends Entity { MobEffectInstance mobeffect = this.getEffect(MobEffects.JUMP); float f2 = mobeffect == null ? 0.0F : (float) (mobeffect.getAmplifier() + 1); @@ -37,7 +37,7 @@ index 68bbd0c1facef4d3e21975ead5b7af19ac3c1254..33235a2aa69726b14b37dfbab0f6518f protected void playBlockFallSound() { diff --git a/src/main/java/net/minecraft/world/entity/animal/horse/AbstractHorse.java b/src/main/java/net/minecraft/world/entity/animal/horse/AbstractHorse.java -index 66dfa478f941b47f470759f6b5e7050dae6387ab..aaf1264886394b156bd7d80a2021d2e8294ade99 100644 +index 075c668b6855dd44102bf521864133565fcf16db..a1ffa88c3796df2973a2fc0aeafda5f78208bf85 100644 --- a/src/main/java/net/minecraft/world/entity/animal/horse/AbstractHorse.java +++ b/src/main/java/net/minecraft/world/entity/animal/horse/AbstractHorse.java @@ -325,7 +325,7 @@ public abstract class AbstractHorse extends Animal implements ContainerListener, diff --git a/patches/server/0014-Lagging-threshold.patch b/patches/server/0015-Lagging-threshold.patch similarity index 88% rename from patches/server/0014-Lagging-threshold.patch rename to patches/server/0015-Lagging-threshold.patch index 35f1483c2..bf3c5f5b4 100644 --- a/patches/server/0014-Lagging-threshold.patch +++ b/patches/server/0015-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 089a50948619f87e44c795453c6565c4b555cfc4..cb3b6708fcf647feac832023a00fe7ab0939da6b 100644 +index b844bffb6363efcb4d8a6fc8489542d7bcfa35d0..cd583a9f0382ba7d58342df8a30ad7399f193db5 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java @@ -291,6 +291,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop implements EntityTypeTest { @@ -25,7 +25,7 @@ index b3a769bd144f948b4782bf47a7d37c45b52deab0..6ab4b747647f6fcd36a1f4d7ef8a3423 public static ResourceLocation getKey(EntityType type) { return Registry.ENTITY_TYPE.getKey(type); } -@@ -463,6 +473,16 @@ public class EntityType implements EntityTypeTest { +@@ -465,6 +475,16 @@ public class EntityType implements EntityTypeTest { return this.category; } @@ -43,7 +43,7 @@ index b3a769bd144f948b4782bf47a7d37c45b52deab0..6ab4b747647f6fcd36a1f4d7ef8a3423 if (this.descriptionId == null) { this.descriptionId = Util.makeDescriptionId("entity", Registry.ENTITY_TYPE.getKey(this)); diff --git a/src/main/java/net/minecraft/world/item/SpawnEggItem.java b/src/main/java/net/minecraft/world/item/SpawnEggItem.java -index fb37846e1c9b7715e32d0d5416b1ce4968e543df..d041b9e0a3e497f173cc64b191291c19f9b5b6bb 100644 +index 6df94a75b7c4c2593598088d84cf0a4a57e3fd99..7aaf698239d0890f9633e6e01ada2a1a02de419a 100644 --- a/src/main/java/net/minecraft/world/item/SpawnEggItem.java +++ b/src/main/java/net/minecraft/world/item/SpawnEggItem.java @@ -68,6 +68,15 @@ public class SpawnEggItem extends Item { diff --git a/patches/server/0016-EMC-MonsterEggSpawnEvent.patch b/patches/server/0017-EMC-MonsterEggSpawnEvent.patch similarity index 96% rename from patches/server/0016-EMC-MonsterEggSpawnEvent.patch rename to patches/server/0017-EMC-MonsterEggSpawnEvent.patch index 04dafae77..4ccb03687 100644 --- a/patches/server/0016-EMC-MonsterEggSpawnEvent.patch +++ b/patches/server/0017-EMC-MonsterEggSpawnEvent.patch @@ -5,10 +5,10 @@ Subject: [PATCH] EMC - MonsterEggSpawnEvent diff --git a/src/main/java/net/minecraft/world/entity/EntityType.java b/src/main/java/net/minecraft/world/entity/EntityType.java -index 6ab4b747647f6fcd36a1f4d7ef8a3423a8171fcf..f2a59e99e35e5c704bb8399e48d92aebcd17ed35 100644 +index 6f461397fa0ce8540aecd3c291bb5f59909b2690..2c3c3071a3987b2175f26e08714e47bf13f20345 100644 --- a/src/main/java/net/minecraft/world/entity/EntityType.java +++ b/src/main/java/net/minecraft/world/entity/EntityType.java -@@ -346,22 +346,40 @@ public class EntityType implements EntityTypeTest { +@@ -348,22 +348,40 @@ public class EntityType implements EntityTypeTest { @Nullable public Entity spawn(ServerLevel world, @Nullable ItemStack stack, @Nullable Player player, BlockPos pos, MobSpawnType spawnReason, boolean alignPosition, boolean invertY) { @@ -52,7 +52,7 @@ index 6ab4b747647f6fcd36a1f4d7ef8a3423a8171fcf..f2a59e99e35e5c704bb8399e48d92aeb // Paper end // Paper start - Call PreCreatureSpawnEvent org.bukkit.entity.EntityType type = org.bukkit.entity.EntityType.fromName(EntityType.getKey(this).getPath()); -@@ -380,6 +398,19 @@ public class EntityType implements EntityTypeTest { +@@ -382,6 +400,19 @@ public class EntityType implements EntityTypeTest { T t0 = this.create(worldserver, nbttagcompound, ichatbasecomponent, entityhuman, blockposition, enummobspawn, flag, flag1); if (t0 != null && op != null) op.accept(t0); // Paper diff --git a/patches/server/0017-Player-invulnerabilities.patch b/patches/server/0018-Player-invulnerabilities.patch similarity index 98% rename from patches/server/0017-Player-invulnerabilities.patch rename to patches/server/0018-Player-invulnerabilities.patch index 20e32f211..c7d5bbfad 100644 --- a/patches/server/0017-Player-invulnerabilities.patch +++ b/patches/server/0018-Player-invulnerabilities.patch @@ -82,10 +82,10 @@ index e40e8e837273c243f5ccc192514d540440f49310..64183c02cf278b20ed59120fa20fc726 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 b67bd2d606e44804f51478847e01da18f0d64349..194c352c1d038ca9726aecfd944b38d572bd2c02 100644 +index df5cbfda7b3eae38583d01ea96874bdb7f5b3b65..487ce0230306fbfc78bc604e0a6ce202df628382 100644 --- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java +++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -@@ -2002,12 +2002,21 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Ser +@@ -2003,12 +2003,21 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Ser @Override public void handleResourcePackResponse(ServerboundResourcePackPacket packet) { PacketUtils.ensureRunningOnSameThread(packet, this, this.player.getLevel()); diff --git a/patches/server/0018-Anvil-API.patch b/patches/server/0019-Anvil-API.patch similarity index 100% rename from patches/server/0018-Anvil-API.patch rename to patches/server/0019-Anvil-API.patch diff --git a/patches/server/0019-Configurable-villager-brain-ticks.patch b/patches/server/0020-Configurable-villager-brain-ticks.patch similarity index 72% rename from patches/server/0019-Configurable-villager-brain-ticks.patch rename to patches/server/0020-Configurable-villager-brain-ticks.patch index 10a1a0505..1da3f9ac5 100644 --- a/patches/server/0019-Configurable-villager-brain-ticks.patch +++ b/patches/server/0020-Configurable-villager-brain-ticks.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Configurable villager brain ticks 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 1e56f842c0c76ae2c8ee79a31b319cb2c5c29765..32eb697dd08c1ef0b832659e702675f70f9145cf 100644 +index ef08ec3eb88ee1ab624e2bd38aaff5e8f97720f2..4cb1cf2b51f1c58e2600996f1d67dcef9e05e3fe 100644 --- a/src/main/java/net/minecraft/world/entity/npc/Villager.java +++ b/src/main/java/net/minecraft/world/entity/npc/Villager.java @@ -139,6 +139,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler @@ -14,9 +14,9 @@ index 1e56f842c0c76ae2c8ee79a31b319cb2c5c29765..32eb697dd08c1ef0b832659e702675f7 }); + private final int brainTickOffset; // Purpur - public Villager(EntityType entityType, Level world) { - this(entityType, world, VillagerType.PLAINS); -@@ -151,6 +152,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler + public long nextGolemPanic = -1; // Pufferfish + +@@ -153,6 +154,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler this.getNavigation().setCanFloat(true); this.setCanPickUpLoot(true); this.setVillagerData(this.getVillagerData().setType(type).setProfession(VillagerProfession.NONE)); @@ -24,17 +24,17 @@ index 1e56f842c0c76ae2c8ee79a31b319cb2c5c29765..32eb697dd08c1ef0b832659e702675f7 } // Purpur start -@@ -274,6 +276,10 @@ public class Villager extends AbstractVillager implements ReputationEventHandler - protected void customServerAiStep() { mobTick(false); } - protected void mobTick(boolean inactive) { +@@ -279,6 +281,10 @@ public class Villager extends AbstractVillager implements ReputationEventHandler this.level.getProfiler().push("villagerBrain"); -+ // Purpur start -+ boolean tick = (level.getGameTime() + brainTickOffset) % level.purpurConfig.villagerBrainTicks == 0; -+ if (((ServerLevel) level).getServer().lagging ? tick : level.purpurConfig.villagerUseBrainTicksOnlyWhenLagging || tick) -+ // Purpur end - if (getRider() == null || !this.isControllable())// Purpur - only use brain if no rider - if (!inactive) this.getBrain().tick((ServerLevel) this.level, this); // Paper - this.level.getProfiler().pop(); + // Pufferfish start + if (!inactive) { ++ // Purpur start ++ boolean tick = (level.getGameTime() + brainTickOffset) % level.purpurConfig.villagerBrainTicks == 0; ++ if (((ServerLevel) level).getServer().lagging ? tick : level.purpurConfig.villagerUseBrainTicksOnlyWhenLagging || tick) ++ // Purpur end + 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 + } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java index 81524c4f676766c09125187876b46e0704294880..93d89fb27044e5e97574122b0e7863694d245bf0 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java diff --git a/patches/server/0020-Alternative-Keepalive-Handling.patch b/patches/server/0021-Alternative-Keepalive-Handling.patch similarity index 96% rename from patches/server/0020-Alternative-Keepalive-Handling.patch rename to patches/server/0021-Alternative-Keepalive-Handling.patch index b0e0f891a..ae0b96c0f 100644 --- a/patches/server/0020-Alternative-Keepalive-Handling.patch +++ b/patches/server/0021-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 194c352c1d038ca9726aecfd944b38d572bd2c02..b48b16e7e4a451c8a1603b2f89ff59c91947211e 100644 +index 487ce0230306fbfc78bc604e0a6ce202df628382..1f7dbc3c773179a21f8b11c455ef9f4fa1971048 100644 --- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java +++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java @@ -245,6 +245,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Ser @@ -38,7 +38,7 @@ index 194c352c1d038ca9726aecfd944b38d572bd2c02..b48b16e7e4a451c8a1603b2f89ff59c9 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 -@@ -3357,6 +3373,16 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Ser +@@ -3358,6 +3374,16 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Ser @Override public void handleKeepAlive(ServerboundKeepAlivePacket packet) { diff --git a/patches/server/0021-Silk-touch-spawners.patch b/patches/server/0022-Silk-touch-spawners.patch similarity index 100% rename from patches/server/0021-Silk-touch-spawners.patch rename to patches/server/0022-Silk-touch-spawners.patch diff --git a/patches/server/0022-MC-168772-Fix-Add-turtle-egg-block-options.patch b/patches/server/0023-MC-168772-Fix-Add-turtle-egg-block-options.patch similarity index 100% rename from patches/server/0022-MC-168772-Fix-Add-turtle-egg-block-options.patch rename to patches/server/0023-MC-168772-Fix-Add-turtle-egg-block-options.patch diff --git a/patches/server/0023-Fix-vanilla-command-permission-handler.patch b/patches/server/0024-Fix-vanilla-command-permission-handler.patch similarity index 100% rename from patches/server/0023-Fix-vanilla-command-permission-handler.patch rename to patches/server/0024-Fix-vanilla-command-permission-handler.patch diff --git a/patches/server/0024-Logger-settings-suppressing-pointless-logs.patch b/patches/server/0025-Logger-settings-suppressing-pointless-logs.patch similarity index 100% rename from patches/server/0024-Logger-settings-suppressing-pointless-logs.patch rename to patches/server/0025-Logger-settings-suppressing-pointless-logs.patch diff --git a/patches/server/0025-Disable-outdated-build-check.patch b/patches/server/0026-Disable-outdated-build-check.patch similarity index 100% rename from patches/server/0025-Disable-outdated-build-check.patch rename to patches/server/0026-Disable-outdated-build-check.patch diff --git a/patches/server/0026-Giants-AI-settings.patch b/patches/server/0027-Giants-AI-settings.patch similarity index 100% rename from patches/server/0026-Giants-AI-settings.patch rename to patches/server/0027-Giants-AI-settings.patch diff --git a/patches/server/0027-Zombie-horse-naturally-spawn.patch b/patches/server/0028-Zombie-horse-naturally-spawn.patch similarity index 95% rename from patches/server/0027-Zombie-horse-naturally-spawn.patch rename to patches/server/0028-Zombie-horse-naturally-spawn.patch index 20110da8b..2f7f567fe 100644 --- a/patches/server/0027-Zombie-horse-naturally-spawn.patch +++ b/patches/server/0028-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 d3624f5a4e3ab9f09d1588a648acba6920e95cfc..f9df95b189318f08c42bb120c4fa815fc47683ac 100644 +index d8c014f2bccd7a47c064d802fcc0acb787c18eda..16c6eedc545a34b92bccf448011b40f0916bbdb0 100644 --- a/src/main/java/net/minecraft/server/level/ServerLevel.java +++ b/src/main/java/net/minecraft/server/level/ServerLevel.java -@@ -777,9 +777,15 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -792,9 +792,15 @@ 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/0028-Charged-creeper-naturally-spawn.patch b/patches/server/0029-Charged-creeper-naturally-spawn.patch similarity index 96% rename from patches/server/0028-Charged-creeper-naturally-spawn.patch rename to patches/server/0029-Charged-creeper-naturally-spawn.patch index 9a6c5a6c8..e3c82ba1a 100644 --- a/patches/server/0028-Charged-creeper-naturally-spawn.patch +++ b/patches/server/0029-Charged-creeper-naturally-spawn.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Charged creeper naturally spawn diff --git a/src/main/java/net/minecraft/world/entity/monster/Creeper.java b/src/main/java/net/minecraft/world/entity/monster/Creeper.java -index 9921fd8278d14deeae9d61101f6800be58412948..e51bcd5158d17db613311e38f2810b650d522cf4 100644 +index 0bf2355b7ac80227c06b3e85f1645559275a96e5..2a5f7fb0e60f41b6627255146ca18b271ac6395f 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Creeper.java +++ b/src/main/java/net/minecraft/world/entity/monster/Creeper.java @@ -143,6 +143,14 @@ public class Creeper extends Monster implements PowerableMob { diff --git a/patches/server/0029-Rabbit-naturally-spawn-toast-and-killer.patch b/patches/server/0030-Rabbit-naturally-spawn-toast-and-killer.patch similarity index 100% rename from patches/server/0029-Rabbit-naturally-spawn-toast-and-killer.patch rename to patches/server/0030-Rabbit-naturally-spawn-toast-and-killer.patch diff --git a/patches/server/0030-Fix-outdated-server-showing-in-ping-before-server-fu.patch b/patches/server/0031-Fix-outdated-server-showing-in-ping-before-server-fu.patch similarity index 100% rename from patches/server/0030-Fix-outdated-server-showing-in-ping-before-server-fu.patch rename to patches/server/0031-Fix-outdated-server-showing-in-ping-before-server-fu.patch diff --git a/patches/server/0031-Tulips-change-fox-type.patch b/patches/server/0032-Tulips-change-fox-type.patch similarity index 100% rename from patches/server/0031-Tulips-change-fox-type.patch rename to patches/server/0032-Tulips-change-fox-type.patch diff --git a/patches/server/0032-Breedable-Polar-Bears.patch b/patches/server/0033-Breedable-Polar-Bears.patch similarity index 100% rename from patches/server/0032-Breedable-Polar-Bears.patch rename to patches/server/0033-Breedable-Polar-Bears.patch diff --git a/patches/server/0033-Chickens-can-retaliate.patch b/patches/server/0034-Chickens-can-retaliate.patch similarity index 100% rename from patches/server/0033-Chickens-can-retaliate.patch rename to patches/server/0034-Chickens-can-retaliate.patch diff --git a/patches/server/0034-Add-option-to-set-armorstand-step-height.patch b/patches/server/0035-Add-option-to-set-armorstand-step-height.patch similarity index 94% rename from patches/server/0034-Add-option-to-set-armorstand-step-height.patch rename to patches/server/0035-Add-option-to-set-armorstand-step-height.patch index 145bcfb55..ce46fabeb 100644 --- a/patches/server/0034-Add-option-to-set-armorstand-step-height.patch +++ b/patches/server/0035-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/decoration/ArmorStand.java b/src/main/java/net/minecraft/world/entity/decoration/ArmorStand.java -index 593f210e5bf842d38955205757c162c2fdede511..9b71425f2c321d3130a409a0a5b47ac9c0c4bae6 100644 +index 150afceb491cfd254c0f1b84800e6df14cf26676..ba9e851eebb25edf94efe8dfbd591e265ac3ac5a 100644 --- a/src/main/java/net/minecraft/world/entity/decoration/ArmorStand.java +++ b/src/main/java/net/minecraft/world/entity/decoration/ArmorStand.java @@ -666,6 +666,7 @@ public class ArmorStand extends LivingEntity { diff --git a/patches/server/0035-Cat-spawning-options.patch b/patches/server/0036-Cat-spawning-options.patch similarity index 100% rename from patches/server/0035-Cat-spawning-options.patch rename to patches/server/0036-Cat-spawning-options.patch diff --git a/patches/server/0036-MC-147659-Fix-non-black-cats-spawning-in-swamp-huts.patch b/patches/server/0037-MC-147659-Fix-non-black-cats-spawning-in-swamp-huts.patch similarity index 100% rename from patches/server/0036-MC-147659-Fix-non-black-cats-spawning-in-swamp-huts.patch rename to patches/server/0037-MC-147659-Fix-non-black-cats-spawning-in-swamp-huts.patch diff --git a/patches/server/0037-Cows-eat-mushrooms.patch b/patches/server/0038-Cows-eat-mushrooms.patch similarity index 100% rename from patches/server/0037-Cows-eat-mushrooms.patch rename to patches/server/0038-Cows-eat-mushrooms.patch diff --git a/patches/server/0038-Fix-cow-rotation-when-shearing-mooshroom.patch b/patches/server/0039-Fix-cow-rotation-when-shearing-mooshroom.patch similarity index 100% rename from patches/server/0038-Fix-cow-rotation-when-shearing-mooshroom.patch rename to patches/server/0039-Fix-cow-rotation-when-shearing-mooshroom.patch diff --git a/patches/server/0039-Pigs-give-saddle-back.patch b/patches/server/0040-Pigs-give-saddle-back.patch similarity index 100% rename from patches/server/0039-Pigs-give-saddle-back.patch rename to patches/server/0040-Pigs-give-saddle-back.patch diff --git a/patches/server/0040-Snowman-drop-and-put-back-pumpkin.patch b/patches/server/0041-Snowman-drop-and-put-back-pumpkin.patch similarity index 100% rename from patches/server/0040-Snowman-drop-and-put-back-pumpkin.patch rename to patches/server/0041-Snowman-drop-and-put-back-pumpkin.patch diff --git a/patches/server/0041-Ender-dragon-always-drop-full-exp.patch b/patches/server/0042-Ender-dragon-always-drop-full-exp.patch similarity index 95% rename from patches/server/0041-Ender-dragon-always-drop-full-exp.patch rename to patches/server/0042-Ender-dragon-always-drop-full-exp.patch index 31c0ead2c..ea03d9727 100644 --- a/patches/server/0041-Ender-dragon-always-drop-full-exp.patch +++ b/patches/server/0042-Ender-dragon-always-drop-full-exp.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Ender dragon always drop full exp 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 49454ad2de73c0a50ac1e3b9cda35f6c66e416f6..bf05e13e6d385c87fdd36ac32db170f9b0a644af 100644 +index c1b67d5dc5fd533fb2aa28a5c7d9dd87cc7412d8..9ce2527054f5163eae3d1216427378dcdf92a2fe 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 @@ -724,7 +724,7 @@ public class EnderDragon extends Mob implements Enemy { diff --git a/patches/server/0042-Signs-editable-on-right-click.patch b/patches/server/0043-Signs-editable-on-right-click.patch similarity index 100% rename from patches/server/0042-Signs-editable-on-right-click.patch rename to patches/server/0043-Signs-editable-on-right-click.patch diff --git a/patches/server/0043-Allow-soil-to-moisten-from-water-directly-under-it.patch b/patches/server/0044-Allow-soil-to-moisten-from-water-directly-under-it.patch similarity index 100% rename from patches/server/0043-Allow-soil-to-moisten-from-water-directly-under-it.patch rename to patches/server/0044-Allow-soil-to-moisten-from-water-directly-under-it.patch diff --git a/patches/server/0044-Minecart-settings-and-WASD-controls.patch b/patches/server/0045-Minecart-settings-and-WASD-controls.patch similarity index 97% rename from patches/server/0044-Minecart-settings-and-WASD-controls.patch rename to patches/server/0045-Minecart-settings-and-WASD-controls.patch index 1d8c73f0b..7a892aae7 100644 --- a/patches/server/0044-Minecart-settings-and-WASD-controls.patch +++ b/patches/server/0045-Minecart-settings-and-WASD-controls.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Minecart settings and WASD controls diff --git a/src/main/java/net/minecraft/server/level/ServerPlayer.java b/src/main/java/net/minecraft/server/level/ServerPlayer.java -index 39d86b7b3a01f2eefb7c0725e930a5371e7baf46..317ce5fde32fd4869b41dfabfb5bdc7366f7d517 100644 +index 64183c02cf278b20ed59120fa20fc7265321fc40..71f3fb4d60abff73dce22006345e210c706d448b 100644 --- a/src/main/java/net/minecraft/server/level/ServerPlayer.java +++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java @@ -1032,6 +1032,7 @@ public class ServerPlayer extends Player { @@ -17,7 +17,7 @@ index 39d86b7b3a01f2eefb7c0725e930a5371e7baf46..317ce5fde32fd4869b41dfabfb5bdc73 if (!flag && isSpawnInvulnerable() && source != DamageSource.OUT_OF_WORLD) { // Purpur diff --git a/src/main/java/net/minecraft/world/entity/vehicle/AbstractMinecart.java b/src/main/java/net/minecraft/world/entity/vehicle/AbstractMinecart.java -index dd2dfffcb5715b34a58262a52e83ff3030212ac4..e3cf90b1506b5c6b96140799bc51c495ef5657ac 100644 +index 3f31a3c17ecca6e93b794478129b95ecff4e1a9c..05031a1a8b9c42ea5cdf9d8ad9b6aeebe1fc823c 100644 --- a/src/main/java/net/minecraft/world/entity/vehicle/AbstractMinecart.java +++ b/src/main/java/net/minecraft/world/entity/vehicle/AbstractMinecart.java @@ -107,11 +107,13 @@ public abstract class AbstractMinecart extends Entity { @@ -135,7 +135,7 @@ index 127a799f7848b32664b77bf67847ca6b8ac9a90d..178cd88a7de291136e0486617e8347b7 } } diff --git a/src/main/java/net/minecraft/world/level/block/state/BlockBehaviour.java b/src/main/java/net/minecraft/world/level/block/state/BlockBehaviour.java -index 771c6cf992664b65ffbf4ae0192bc7b09f77c2e6..480f00ef2026e84b133655c5e18b1dc36b5a02ca 100644 +index 939aca929038b90738c9b78c2fc3611088b18e72..2fe9daf2a1a4a007c9831155039159815242a545 100644 --- a/src/main/java/net/minecraft/world/level/block/state/BlockBehaviour.java +++ b/src/main/java/net/minecraft/world/level/block/state/BlockBehaviour.java @@ -72,7 +72,7 @@ import net.minecraft.world.phys.shapes.VoxelShape; diff --git a/patches/server/0045-Disable-loot-drops-on-death-by-cramming.patch b/patches/server/0046-Disable-loot-drops-on-death-by-cramming.patch similarity index 91% rename from patches/server/0045-Disable-loot-drops-on-death-by-cramming.patch rename to patches/server/0046-Disable-loot-drops-on-death-by-cramming.patch index ec14c3438..f9454ef9a 100644 --- a/patches/server/0045-Disable-loot-drops-on-death-by-cramming.patch +++ b/patches/server/0046-Disable-loot-drops-on-death-by-cramming.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Disable loot drops on death by cramming diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java -index 33235a2aa69726b14b37dfbab0f6518f7874e4d9..5e161a8cdd6d6303fa334600f70ac0352807c756 100644 +index 6c769141376f6995d6572d5e3cf3a999ff954e82..ccc034d345d4c7ea1b8317023e2e410d5c231ec9 100644 --- a/src/main/java/net/minecraft/world/entity/LivingEntity.java +++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java -@@ -1740,6 +1740,7 @@ public abstract class LivingEntity extends Entity { +@@ -1747,6 +1747,7 @@ public abstract class LivingEntity extends Entity { this.dropEquipment(); // CraftBukkit - from below if (this.shouldDropLoot() && this.level.getGameRules().getBoolean(GameRules.RULE_DOMOBLOOT)) { @@ -16,7 +16,7 @@ index 33235a2aa69726b14b37dfbab0f6518f7874e4d9..5e161a8cdd6d6303fa334600f70ac035 this.dropFromLootTable(source, flag); // Paper start final boolean prev = this.clearEquipmentSlots; -@@ -1748,6 +1749,7 @@ public abstract class LivingEntity extends Entity { +@@ -1755,6 +1756,7 @@ public abstract class LivingEntity extends Entity { // Paper end this.dropCustomDeathLoot(source, i, flag); this.clearEquipmentSlots = prev; // Paper diff --git a/patches/server/0046-Option-to-toggle-milk-curing-bad-omen.patch b/patches/server/0047-Option-to-toggle-milk-curing-bad-omen.patch similarity index 100% rename from patches/server/0046-Option-to-toggle-milk-curing-bad-omen.patch rename to patches/server/0047-Option-to-toggle-milk-curing-bad-omen.patch diff --git a/patches/server/0047-End-gateway-should-check-if-entity-can-use-portal.patch b/patches/server/0048-End-gateway-should-check-if-entity-can-use-portal.patch similarity index 100% rename from patches/server/0047-End-gateway-should-check-if-entity-can-use-portal.patch rename to patches/server/0048-End-gateway-should-check-if-entity-can-use-portal.patch diff --git a/patches/server/0048-Fix-the-dead-lagging-the-server.patch b/patches/server/0049-Fix-the-dead-lagging-the-server.patch similarity index 81% rename from patches/server/0048-Fix-the-dead-lagging-the-server.patch rename to patches/server/0049-Fix-the-dead-lagging-the-server.patch index 8853b5867..1a54d53a1 100644 --- a/patches/server/0048-Fix-the-dead-lagging-the-server.patch +++ b/patches/server/0049-Fix-the-dead-lagging-the-server.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Fix the dead lagging the server diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java -index cbd0f1ef7b3dad972b2e1f4b1d35c1f66ca9854f..10c46a38e55463f584afc69bd6af91ee96862fd8 100644 +index aea8814bf1ed44075c54b18fcdc8676579f07a6e..24728fbacddf7cb6e5b6f3956cd950ab83867dc4 100644 --- a/src/main/java/net/minecraft/world/entity/Entity.java +++ b/src/main/java/net/minecraft/world/entity/Entity.java -@@ -1832,6 +1832,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { +@@ -1865,6 +1865,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { this.yRotO = this.getYRot(); this.xRotO = this.getXRot(); this.setYHeadRot(yaw); // Paper - Update head rotation @@ -17,10 +17,10 @@ index cbd0f1ef7b3dad972b2e1f4b1d35c1f66ca9854f..10c46a38e55463f584afc69bd6af91ee public void absMoveTo(double x, double y, double z) { diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java -index 5e161a8cdd6d6303fa334600f70ac0352807c756..38067bee49ec2498d840ded86ceeae4518034ae1 100644 +index ccc034d345d4c7ea1b8317023e2e410d5c231ec9..bc19439abb1cbf548b1eda2a6527d9e825ea34ab 100644 --- a/src/main/java/net/minecraft/world/entity/LivingEntity.java +++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java -@@ -2953,7 +2953,7 @@ public abstract class LivingEntity extends Entity { +@@ -2974,7 +2974,7 @@ public abstract class LivingEntity extends Entity { } } diff --git a/patches/server/0049-Skip-events-if-there-s-no-listeners.patch b/patches/server/0050-Skip-events-if-there-s-no-listeners.patch similarity index 93% rename from patches/server/0049-Skip-events-if-there-s-no-listeners.patch rename to patches/server/0050-Skip-events-if-there-s-no-listeners.patch index c07486361..4bd7e78b7 100644 --- a/patches/server/0049-Skip-events-if-there-s-no-listeners.patch +++ b/patches/server/0050-Skip-events-if-there-s-no-listeners.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Skip events if there's no listeners diff --git a/src/main/java/net/minecraft/commands/Commands.java b/src/main/java/net/minecraft/commands/Commands.java -index a51040aec86c0be2b124619d8fea2111778ad684..231ef7aab08e0be4dd3e17617efa94581116aad0 100644 +index ea5f0600d47b0f7c08b96eed91e5de255114637b..02add91d477dfef1bafa39c28b23dfc09418c939 100644 --- a/src/main/java/net/minecraft/commands/Commands.java +++ b/src/main/java/net/minecraft/commands/Commands.java @@ -393,6 +393,7 @@ public class Commands { diff --git a/patches/server/0050-Add-permission-for-F3-N-debug.patch b/patches/server/0051-Add-permission-for-F3-N-debug.patch similarity index 89% rename from patches/server/0050-Add-permission-for-F3-N-debug.patch rename to patches/server/0051-Add-permission-for-F3-N-debug.patch index 6a738a929..b0a698ec2 100644 --- a/patches/server/0050-Add-permission-for-F3-N-debug.patch +++ b/patches/server/0051-Add-permission-for-F3-N-debug.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Add permission for F3+N debug diff --git a/src/main/java/net/minecraft/server/players/PlayerList.java b/src/main/java/net/minecraft/server/players/PlayerList.java -index d7e65c889167de315206ae2a36f305c6255950a1..a4a895a54ad0266301d50f95eaec3a2bb604f8f1 100644 +index 407bcae5459cbc6c670f7f44dd8bb593935ffffa..db23e2afd1b9a7a8e1b29e48a31441b0a64beb5d 100644 --- a/src/main/java/net/minecraft/server/players/PlayerList.java +++ b/src/main/java/net/minecraft/server/players/PlayerList.java @@ -1186,6 +1186,7 @@ public abstract class PlayerList { diff --git a/patches/server/0051-Configurable-TPS-Catchup.patch b/patches/server/0052-Configurable-TPS-Catchup.patch similarity index 93% rename from patches/server/0051-Configurable-TPS-Catchup.patch rename to patches/server/0052-Configurable-TPS-Catchup.patch index a30993880..2c867e23b 100644 --- a/patches/server/0051-Configurable-TPS-Catchup.patch +++ b/patches/server/0052-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 a653b79b3c81d5908d73e4f444d8c2baf62662de..2603e73b86c87125cd3f1804463281324a75105a 100644 +index cd583a9f0382ba7d58342df8a30ad7399f193db5..832f6c7d38975426725f999659765ba49cfd7ccf 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java -@@ -1189,7 +1189,13 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop= this.level.paperConfig().environment.netherCeilingVoidDamageHeight)) { // Paper end diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java -index 8e2fbf9f356650be37099d4e72cd949ddcc52ec6..0a481fca2e115a48cf10fa6f664b1cbecd5763a7 100644 +index bc19439abb1cbf548b1eda2a6527d9e825ea34ab..40c716bd22d54f7f669d570d1bebcb1848ae66aa 100644 --- a/src/main/java/net/minecraft/world/entity/LivingEntity.java +++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java -@@ -2445,7 +2445,7 @@ public abstract class LivingEntity extends Entity { +@@ -2466,7 +2466,7 @@ public abstract class LivingEntity extends Entity { @Override protected void outOfWorld() { diff --git a/patches/server/0060-Add-canSaveToDisk-to-Entity.patch b/patches/server/0061-Add-canSaveToDisk-to-Entity.patch similarity index 93% rename from patches/server/0060-Add-canSaveToDisk-to-Entity.patch rename to patches/server/0061-Add-canSaveToDisk-to-Entity.patch index 359d76ae9..43280b41e 100644 --- a/patches/server/0060-Add-canSaveToDisk-to-Entity.patch +++ b/patches/server/0061-Add-canSaveToDisk-to-Entity.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Add canSaveToDisk to Entity diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java -index e5097185d44062427e7fe21da89a552a4ff97277..50c79b36429e13a12dd7fac0afd1160528b01035 100644 +index 2619685affa6a3fa8fee4fdc3047e44ab7e7042e..6b92be36b86ecc5a82b4ca70ba187c53ec102adc 100644 --- a/src/main/java/net/minecraft/world/entity/Entity.java +++ b/src/main/java/net/minecraft/world/entity/Entity.java -@@ -4472,5 +4472,9 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { +@@ -4557,5 +4557,9 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { public boolean processClick(InteractionHand hand) { return false; } @@ -19,7 +19,7 @@ index e5097185d44062427e7fe21da89a552a4ff97277..50c79b36429e13a12dd7fac0afd11605 // Purpur end } diff --git a/src/main/java/net/minecraft/world/entity/boss/wither/WitherBoss.java b/src/main/java/net/minecraft/world/entity/boss/wither/WitherBoss.java -index ef528ad1571b7dcd180c70160fe6b17b2d7a18b8..4f9b14e523019c87178304f250e3d10606145fad 100644 +index 1005e47452f6437b75b050e695493647c92b7cf5..d88012af58aedf5f92885d74e69b06f5cf98aa71 100644 --- a/src/main/java/net/minecraft/world/entity/boss/wither/WitherBoss.java +++ b/src/main/java/net/minecraft/world/entity/boss/wither/WitherBoss.java @@ -208,6 +208,11 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob diff --git a/patches/server/0061-Dispenser-curse-of-binding-protection.patch b/patches/server/0062-Dispenser-curse-of-binding-protection.patch similarity index 95% rename from patches/server/0061-Dispenser-curse-of-binding-protection.patch rename to patches/server/0062-Dispenser-curse-of-binding-protection.patch index c4ba7b1ec..a075f9105 100644 --- a/patches/server/0061-Dispenser-curse-of-binding-protection.patch +++ b/patches/server/0062-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 382f4d5ee0eba4a2ad9f7aa6895fda5390c43ac6..08d40550c898a63fb4ab37f5ed4807d19a4db13b 100644 +index 1e71f0d617b8ddd6d2d0466e5fa5acf98804a97b..1e4629de69b762f89efe54a93f28292d3657bccb 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 382f4d5ee0eba4a2ad9f7aa6895fda5390c43ac6..08d40550c898a63fb4ab37f5ed4807d1 import net.minecraft.world.level.GameRules; import net.minecraft.world.level.ItemLike; import net.minecraft.world.level.Level; -@@ -1104,6 +1105,12 @@ public abstract class Mob extends LivingEntity { +@@ -1110,6 +1111,12 @@ public abstract class Mob extends LivingEntity { } diff --git a/patches/server/0062-Add-option-for-boats-to-eject-players-on-land.patch b/patches/server/0063-Add-option-for-boats-to-eject-players-on-land.patch similarity index 95% rename from patches/server/0062-Add-option-for-boats-to-eject-players-on-land.patch rename to patches/server/0063-Add-option-for-boats-to-eject-players-on-land.patch index 2e2eb1a93..aaee17c0d 100644 --- a/patches/server/0062-Add-option-for-boats-to-eject-players-on-land.patch +++ b/patches/server/0063-Add-option-for-boats-to-eject-players-on-land.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Add option for boats to eject players on land diff --git a/src/main/java/net/minecraft/world/entity/vehicle/Boat.java b/src/main/java/net/minecraft/world/entity/vehicle/Boat.java -index 4642012c72cb77302f69c808d73d8d42e8bbc39e..fabc444f819e7ecf9a1e7b156276e1ec63b53a08 100644 +index eb753323f67badb1bed28405c07b03078e322b44..c9ce0f1f798ee73e985798e7e7271aa51e405d05 100644 --- a/src/main/java/net/minecraft/world/entity/vehicle/Boat.java +++ b/src/main/java/net/minecraft/world/entity/vehicle/Boat.java @@ -523,6 +523,7 @@ public class Boat extends Entity { diff --git a/patches/server/0063-Mending-mends-most-damages-equipment-first.patch b/patches/server/0064-Mending-mends-most-damages-equipment-first.patch similarity index 100% rename from patches/server/0063-Mending-mends-most-damages-equipment-first.patch rename to patches/server/0064-Mending-mends-most-damages-equipment-first.patch diff --git a/patches/server/0064-Add-5-second-tps-average-in-tps.patch b/patches/server/0065-Add-5-second-tps-average-in-tps.patch similarity index 94% rename from patches/server/0064-Add-5-second-tps-average-in-tps.patch rename to patches/server/0065-Add-5-second-tps-average-in-tps.patch index c6e40ad1a..44d5286ca 100644 --- a/patches/server/0064-Add-5-second-tps-average-in-tps.patch +++ b/patches/server/0065-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 9dc2dd5bc5894ff33826613f2fae28d51085b751..5a51ec9a9cba605b2fc32e51dcd78f0cbb253628 100644 +index 832f6c7d38975426725f999659765ba49cfd7ccf..76bc94d5263f0ad354a385eb5b5270cda21c727b 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java @@ -287,7 +287,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 ae4b251e10babb07055d031ff48ac7dd5d4be4a0..1e9f3d5f52a34a9ce70f6e57ad53a24df5e22c4b 100644 +index fa612a4f4abc5185c9142af31f5d7f6e92549350..eb5aa3618ec402b851244d742a9d42e95d502fd7 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 { @@ -47,7 +47,7 @@ index ae4b251e10babb07055d031ff48ac7dd5d4be4a0..1e9f3d5f52a34a9ce70f6e57ad53a24d public ItemEntity(EntityType type, Level world) { super(type, world); -@@ -328,6 +334,15 @@ public class ItemEntity extends Entity { +@@ -334,6 +340,15 @@ public class ItemEntity extends Entity { return false; } else if (!this.getItem().getItem().canBeHurtBy(source)) { return false; @@ -63,7 +63,7 @@ index ae4b251e10babb07055d031ff48ac7dd5d4be4a0..1e9f3d5f52a34a9ce70f6e57ad53a24d } else if (this.level.isClientSide) { return true; } else { -@@ -513,6 +528,12 @@ public class ItemEntity extends Entity { +@@ -519,6 +534,12 @@ public class ItemEntity extends Entity { 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 diff --git a/patches/server/0067-Add-ping-command.patch b/patches/server/0068-Add-ping-command.patch similarity index 97% rename from patches/server/0067-Add-ping-command.patch rename to patches/server/0068-Add-ping-command.patch index ac6d185c4..f3f85119f 100644 --- a/patches/server/0067-Add-ping-command.patch +++ b/patches/server/0068-Add-ping-command.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Add ping command diff --git a/src/main/java/net/minecraft/commands/Commands.java b/src/main/java/net/minecraft/commands/Commands.java -index 231ef7aab08e0be4dd3e17617efa94581116aad0..adae7fdeb02b51f17f75b1ceacc7511bbd9d2f5f 100644 +index 02add91d477dfef1bafa39c28b23dfc09418c939..e36445045701e0176cca07ba2686e7bd50b37dad 100644 --- a/src/main/java/net/minecraft/commands/Commands.java +++ b/src/main/java/net/minecraft/commands/Commands.java @@ -205,6 +205,7 @@ public class Commands { diff --git a/patches/server/0068-Add-demo-command.patch b/patches/server/0069-Add-demo-command.patch similarity index 97% rename from patches/server/0068-Add-demo-command.patch rename to patches/server/0069-Add-demo-command.patch index 8ed953359..f2958228e 100644 --- a/patches/server/0068-Add-demo-command.patch +++ b/patches/server/0069-Add-demo-command.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Add demo command diff --git a/src/main/java/net/minecraft/commands/Commands.java b/src/main/java/net/minecraft/commands/Commands.java -index adae7fdeb02b51f17f75b1ceacc7511bbd9d2f5f..03696224f2cc99f98fe6d635763323945e7089f2 100644 +index e36445045701e0176cca07ba2686e7bd50b37dad..362b1b2f48f29354cbc7776a262131dd10eb48c1 100644 --- a/src/main/java/net/minecraft/commands/Commands.java +++ b/src/main/java/net/minecraft/commands/Commands.java @@ -205,6 +205,7 @@ public class Commands { diff --git a/patches/server/0069-Add-credits-command.patch b/patches/server/0070-Add-credits-command.patch similarity index 97% rename from patches/server/0069-Add-credits-command.patch rename to patches/server/0070-Add-credits-command.patch index e9fb0eebe..f35fd60b8 100644 --- a/patches/server/0069-Add-credits-command.patch +++ b/patches/server/0070-Add-credits-command.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Add credits command diff --git a/src/main/java/net/minecraft/commands/Commands.java b/src/main/java/net/minecraft/commands/Commands.java -index 03696224f2cc99f98fe6d635763323945e7089f2..72ab7ba92d6f20c1711d9720c02c11ce0e4ede71 100644 +index 362b1b2f48f29354cbc7776a262131dd10eb48c1..a26672fce303a2ad468014d88033c55789a95e87 100644 --- a/src/main/java/net/minecraft/commands/Commands.java +++ b/src/main/java/net/minecraft/commands/Commands.java @@ -205,6 +205,7 @@ public class Commands { diff --git a/patches/server/0070-Configurable-jockey-options.patch b/patches/server/0071-Configurable-jockey-options.patch similarity index 100% rename from patches/server/0070-Configurable-jockey-options.patch rename to patches/server/0071-Configurable-jockey-options.patch diff --git a/patches/server/0071-Phantoms-attracted-to-crystals-and-crystals-shoot-ph.patch b/patches/server/0072-Phantoms-attracted-to-crystals-and-crystals-shoot-ph.patch similarity index 98% rename from patches/server/0071-Phantoms-attracted-to-crystals-and-crystals-shoot-ph.patch rename to patches/server/0072-Phantoms-attracted-to-crystals-and-crystals-shoot-ph.patch index f093854cf..ca8025fbd 100644 --- a/patches/server/0071-Phantoms-attracted-to-crystals-and-crystals-shoot-ph.patch +++ b/patches/server/0072-Phantoms-attracted-to-crystals-and-crystals-shoot-ph.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Phantoms attracted to crystals and crystals shoot phantoms diff --git a/src/main/java/net/minecraft/world/entity/boss/enderdragon/EndCrystal.java b/src/main/java/net/minecraft/world/entity/boss/enderdragon/EndCrystal.java -index d8c4f36ae0e65c6d0398fac80c93b78646bdf6a4..f8863cabad1bd0c3c2c62b8e17612d9559237d68 100644 +index 6a08ab40e60b80f8f5c4d3f02da121be9da05111..e1493079d06a91f3e14e333e2a0408725a8f5bea 100644 --- a/src/main/java/net/minecraft/world/entity/boss/enderdragon/EndCrystal.java +++ b/src/main/java/net/minecraft/world/entity/boss/enderdragon/EndCrystal.java @@ -31,6 +31,12 @@ public class EndCrystal extends Entity { @@ -73,7 +73,7 @@ index d8c4f36ae0e65c6d0398fac80c93b78646bdf6a4..f8863cabad1bd0c3c2c62b8e17612d95 @Override protected void addAdditionalSaveData(CompoundTag nbt) { 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 6df40b92a7006c8ad6a8d89c7d81a0f4326cad42..6d8847b2019c87f2cf152a0939753ed604bf14e1 100644 +index a3b871797c3e006f66978a73da01fede52fc8c49..9c82953b45471a40faea41f164feabbd2af02984 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Phantom.java +++ b/src/main/java/net/minecraft/world/entity/monster/Phantom.java @@ -49,6 +49,7 @@ public class Phantom extends FlyingMob implements Enemy { diff --git a/patches/server/0072-Add-phantom-spawning-options.patch b/patches/server/0073-Add-phantom-spawning-options.patch similarity index 100% rename from patches/server/0072-Add-phantom-spawning-options.patch rename to patches/server/0073-Add-phantom-spawning-options.patch diff --git a/patches/server/0073-Implement-bed-explosion-options.patch b/patches/server/0074-Implement-bed-explosion-options.patch similarity index 100% rename from patches/server/0073-Implement-bed-explosion-options.patch rename to patches/server/0074-Implement-bed-explosion-options.patch diff --git a/patches/server/0074-Implement-respawn-anchor-explosion-options.patch b/patches/server/0075-Implement-respawn-anchor-explosion-options.patch similarity index 100% rename from patches/server/0074-Implement-respawn-anchor-explosion-options.patch rename to patches/server/0075-Implement-respawn-anchor-explosion-options.patch diff --git a/patches/server/0075-Add-allow-water-in-end-world-option.patch b/patches/server/0076-Add-allow-water-in-end-world-option.patch similarity index 97% rename from patches/server/0075-Add-allow-water-in-end-world-option.patch rename to patches/server/0076-Add-allow-water-in-end-world-option.patch index b177feab4..4f53a4e55 100644 --- a/patches/server/0075-Add-allow-water-in-end-world-option.patch +++ b/patches/server/0076-Add-allow-water-in-end-world-option.patch @@ -27,10 +27,10 @@ index 73f1211470d9626c82c8345037da19aed9db3f23..40c7bf266eccc43faa081ade9402bee5 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 9c7943b8712133aa71de113a5581f591cfd68657..c5176597ce07b3173a1446150103ba9b6d296c2f 100644 +index 32518aa959e3ea95376ac2c1904aa51fb7e52508..39454ba18ef3ec312b367a397c0e555f0d5f5ae6 100644 --- a/src/main/java/net/minecraft/world/level/Level.java +++ b/src/main/java/net/minecraft/world/level/Level.java -@@ -1467,4 +1467,14 @@ public abstract class Level implements LevelAccessor, AutoCloseable { +@@ -1569,4 +1569,14 @@ public abstract class Level implements LevelAccessor, AutoCloseable { return null; } // Paper end diff --git a/patches/server/0076-Allow-color-codes-in-books.patch b/patches/server/0077-Allow-color-codes-in-books.patch similarity index 92% rename from patches/server/0076-Allow-color-codes-in-books.patch rename to patches/server/0077-Allow-color-codes-in-books.patch index c61d63903..8c2a06496 100644 --- a/patches/server/0076-Allow-color-codes-in-books.patch +++ b/patches/server/0077-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 b48b16e7e4a451c8a1603b2f89ff59c91947211e..be37b44693f77266944f973cb8431df44c3641bf 100644 +index 1f7dbc3c773179a21f8b11c455ef9f4fa1971048..f4046f090ba589529b13671b790a3c3596af1247 100644 --- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java +++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -@@ -1272,13 +1272,16 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Ser +@@ -1273,13 +1273,16 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Ser itemstack1.setTag(nbttagcompound.copy()); } @@ -28,7 +28,7 @@ index b48b16e7e4a451c8a1603b2f89ff59c91947211e..be37b44693f77266944f973cb8431df4 this.updateBookPages(pages, (s) -> { return Component.Serializer.toJson(Component.literal(s)); -@@ -1290,10 +1293,13 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Ser +@@ -1291,10 +1294,13 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Ser public void updateBookPages(List> list, UnaryOperator unaryoperator, ItemStack itemstack, int slot, ItemStack handItem) { // CraftBukkit ListTag nbttaglist = new ListTag(); @@ -44,7 +44,7 @@ index b48b16e7e4a451c8a1603b2f89ff59c91947211e..be37b44693f77266944f973cb8431df4 Objects.requireNonNull(nbttaglist); stream.forEach(nbttaglist::add); -@@ -1303,11 +1309,11 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Ser +@@ -1304,11 +1310,11 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Ser for (int j = list.size(); i < j; ++i) { FilteredText filteredtext = (FilteredText) list.get(i); @@ -58,7 +58,7 @@ index b48b16e7e4a451c8a1603b2f89ff59c91947211e..be37b44693f77266944f973cb8431df4 } } -@@ -1320,6 +1326,16 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Ser +@@ -1321,6 +1327,16 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Ser 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/0077-Entity-lifespan.patch b/patches/server/0078-Entity-lifespan.patch similarity index 88% rename from patches/server/0077-Entity-lifespan.patch rename to patches/server/0078-Entity-lifespan.patch index 6efabcca1..a24a108b3 100644 --- a/patches/server/0077-Entity-lifespan.patch +++ b/patches/server/0078-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 de5fd575e12a3a991cb907675f256324d0147aef..d4e821e30a1151e71d2e4d87a74f5468929356da 100644 +index f4046f090ba589529b13671b790a3c3596af1247..0a717f7691f054a8dbe05a5e1003339e28757ffe 100644 --- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java +++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -@@ -2714,6 +2714,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Ser +@@ -2715,6 +2715,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Ser } if (entity.distanceToSqr(this.player.getEyePosition()) < ServerGamePacketListenerImpl.MAX_INTERACTION_DISTANCE) { @@ -17,7 +17,7 @@ index de5fd575e12a3a991cb907675f256324d0147aef..d4e821e30a1151e71d2e4d87a74f5468 private void performInteraction(InteractionHand enumhand, ServerGamePacketListenerImpl.EntityInteraction playerconnection_a, PlayerInteractEntityEvent event) { // CraftBukkit ItemStack itemstack = ServerGamePacketListenerImpl.this.player.getItemInHand(enumhand).copy(); diff --git a/src/main/java/net/minecraft/world/entity/Mob.java b/src/main/java/net/minecraft/world/entity/Mob.java -index 741bd85f10afb7b6f79213d5270af8e27741ad62..5385c1b97cd2a85b43e75ef1dfae770879f29954 100644 +index 1e4629de69b762f89efe54a93f28292d3657bccb..fe97b5b327af1189b166243c42be99892226cd9e 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 { @@ -28,7 +28,7 @@ index 741bd85f10afb7b6f79213d5270af8e27741ad62..5385c1b97cd2a85b43e75ef1dfae7708 public boolean aware = true; // CraftBukkit protected Mob(EntityType type, Level world) { -@@ -288,6 +289,7 @@ public abstract class Mob extends LivingEntity { +@@ -290,6 +291,7 @@ public abstract class Mob extends LivingEntity { entityliving = null; } } @@ -36,7 +36,7 @@ index 741bd85f10afb7b6f79213d5270af8e27741ad62..5385c1b97cd2a85b43e75ef1dfae7708 this.target = entityliving; return true; // CraftBukkit end -@@ -334,9 +336,29 @@ public abstract class Mob extends LivingEntity { +@@ -336,9 +338,29 @@ public abstract class Mob extends LivingEntity { this.playAmbientSound(); } @@ -66,7 +66,7 @@ index 741bd85f10afb7b6f79213d5270af8e27741ad62..5385c1b97cd2a85b43e75ef1dfae7708 @Override protected void playHurtSound(DamageSource source) { this.resetAmbientSoundTime(); -@@ -520,6 +542,7 @@ public abstract class Mob extends LivingEntity { +@@ -522,6 +544,7 @@ public abstract class Mob extends LivingEntity { } nbt.putBoolean("Bukkit.Aware", this.aware); // CraftBukkit @@ -74,7 +74,7 @@ index 741bd85f10afb7b6f79213d5270af8e27741ad62..5385c1b97cd2a85b43e75ef1dfae7708 } @Override -@@ -590,6 +613,11 @@ public abstract class Mob extends LivingEntity { +@@ -592,6 +615,11 @@ public abstract class Mob extends LivingEntity { this.aware = nbt.getBoolean("Bukkit.Aware"); } // CraftBukkit end @@ -86,7 +86,7 @@ index 741bd85f10afb7b6f79213d5270af8e27741ad62..5385c1b97cd2a85b43e75ef1dfae7708 } @Override -@@ -1628,6 +1656,7 @@ public abstract class Mob extends LivingEntity { +@@ -1634,6 +1662,7 @@ public abstract class Mob extends LivingEntity { this.setLastHurtMob(target); } diff --git a/patches/server/0078-Add-option-to-teleport-to-spawn-if-outside-world-bor.patch b/patches/server/0079-Add-option-to-teleport-to-spawn-if-outside-world-bor.patch similarity index 96% rename from patches/server/0078-Add-option-to-teleport-to-spawn-if-outside-world-bor.patch rename to patches/server/0079-Add-option-to-teleport-to-spawn-if-outside-world-bor.patch index e87eb7d30..6849504ee 100644 --- a/patches/server/0078-Add-option-to-teleport-to-spawn-if-outside-world-bor.patch +++ b/patches/server/0079-Add-option-to-teleport-to-spawn-if-outside-world-bor.patch @@ -36,7 +36,7 @@ index 71f3fb4d60abff73dce22006345e210c706d448b..8e5aa1666ca929780670ce513d969973 + // 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 2f0e1869bb7a0ebca2a8c669ecfa48c79550286a..55b12a4cac8a6176f16fe9c95b7696725dd43306 100644 +index dc6177e8d5c6f6615ccbfa55a2e0a8c891fc6b52..d75a3d62eeb151c2451b20feb7fd088c513a2571 100644 --- a/src/main/java/net/minecraft/world/entity/LivingEntity.java +++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java @@ -44,6 +44,7 @@ import net.minecraft.network.syncher.EntityDataAccessor; @@ -47,7 +47,7 @@ index 2f0e1869bb7a0ebca2a8c669ecfa48c79550286a..55b12a4cac8a6176f16fe9c95b769672 import net.minecraft.server.level.ServerChunkCache; import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; -@@ -413,6 +414,7 @@ public abstract class LivingEntity extends Entity { +@@ -411,6 +412,7 @@ public abstract class LivingEntity extends Entity { double d1 = this.level.getWorldBorder().getDamagePerBlock(); if (d1 > 0.0D) { diff --git a/patches/server/0079-Squid-EAR-immunity.patch b/patches/server/0080-Squid-EAR-immunity.patch similarity index 94% rename from patches/server/0079-Squid-EAR-immunity.patch rename to patches/server/0080-Squid-EAR-immunity.patch index 7dbc2bdb5..e1ad78ffc 100644 --- a/patches/server/0079-Squid-EAR-immunity.patch +++ b/patches/server/0080-Squid-EAR-immunity.patch @@ -25,7 +25,7 @@ index a28d11edcf87f3e01477e8d7aa70b8a822b76fa6..ecb950c9e43e952b95d47e49c5c4d641 public boolean spiderRidable = false; diff --git a/src/main/java/org/spigotmc/ActivationRange.java b/src/main/java/org/spigotmc/ActivationRange.java -index 1ae88964fc3c05493516278d150537fd6699df2d..222cde68f466156eecdb2f3bfbed46e26800d3dd 100644 +index 4e5583cdd78608108bb1788e6881d4b4fbf014af..08d678f781a86e709a8b6066a12fd76830d142cc 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 1ae88964fc3c05493516278d150537fd6699df2d..222cde68f466156eecdb2f3bfbed46e2 import net.minecraft.world.entity.animal.WaterAnimal; import net.minecraft.world.entity.animal.horse.Llama; import net.minecraft.world.entity.boss.EnderDragonPart; -@@ -372,6 +373,7 @@ public class ActivationRange +@@ -391,6 +392,7 @@ public class ActivationRange */ public static boolean checkIfActive(Entity entity) { diff --git a/patches/server/0080-Phantoms-burn-in-light.patch b/patches/server/0081-Phantoms-burn-in-light.patch similarity index 98% rename from patches/server/0080-Phantoms-burn-in-light.patch rename to patches/server/0081-Phantoms-burn-in-light.patch index f69268133..4ad138f06 100644 --- a/patches/server/0080-Phantoms-burn-in-light.patch +++ b/patches/server/0081-Phantoms-burn-in-light.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Phantoms burn in light 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 6d8847b2019c87f2cf152a0939753ed604bf14e1..056a7487e265182f7b50eba30aa6adaa4ba39eba 100644 +index 9c82953b45471a40faea41f164feabbd2af02984..82d56a6968f3bbea5a2d32c2a7a84a8ba36d3d15 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Phantom.java +++ b/src/main/java/net/minecraft/world/entity/monster/Phantom.java @@ -50,6 +50,7 @@ public class Phantom extends FlyingMob implements Enemy { diff --git a/patches/server/0081-Configurable-villager-breeding.patch b/patches/server/0082-Configurable-villager-breeding.patch similarity index 93% rename from patches/server/0081-Configurable-villager-breeding.patch rename to patches/server/0082-Configurable-villager-breeding.patch index c0f11c03a..92437f1d0 100644 --- a/patches/server/0081-Configurable-villager-breeding.patch +++ b/patches/server/0082-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 6dd8e9c7d1999552b4b39a038cd733d695469e99..5e82e82ab3afd8dba8588d84a02f4a6d626db51a 100644 +index 2087b4a4fbc4076c5ec59aaf73f1367ffcd0ef7c..09a7af00e05f5369c1c87c51f121ed34d4fd2734 100644 --- a/src/main/java/net/minecraft/world/entity/npc/Villager.java +++ b/src/main/java/net/minecraft/world/entity/npc/Villager.java -@@ -767,7 +767,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler +@@ -774,7 +774,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler @Override public boolean canBreed() { diff --git a/patches/server/0082-Redstone-deactivates-spawners.patch b/patches/server/0083-Redstone-deactivates-spawners.patch similarity index 94% rename from patches/server/0082-Redstone-deactivates-spawners.patch rename to patches/server/0083-Redstone-deactivates-spawners.patch index 8c77cff88..5cebaf0d4 100644 --- a/patches/server/0082-Redstone-deactivates-spawners.patch +++ b/patches/server/0083-Redstone-deactivates-spawners.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Redstone deactivates spawners diff --git a/src/main/java/net/minecraft/world/level/BaseSpawner.java b/src/main/java/net/minecraft/world/level/BaseSpawner.java -index 51463da77739859aaa6fbc018345659afe16c2ee..740f70c1bd58b4d4c7c8a02b397aba5533ec647a 100644 +index ee619590aa49323059947fbaee9e88d61df99789..deffa277272c34adb39d7c3e69e91502780a090e 100644 --- a/src/main/java/net/minecraft/world/level/BaseSpawner.java +++ b/src/main/java/net/minecraft/world/level/BaseSpawner.java @@ -52,6 +52,7 @@ public abstract class BaseSpawner { diff --git a/patches/server/0083-Totems-work-in-inventory.patch b/patches/server/0084-Totems-work-in-inventory.patch similarity index 94% rename from patches/server/0083-Totems-work-in-inventory.patch rename to patches/server/0084-Totems-work-in-inventory.patch index 7682269f5..be9227b60 100644 --- a/patches/server/0083-Totems-work-in-inventory.patch +++ b/patches/server/0084-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 ab01fd7486d8d068d645a033b5d28f70a313a92c..5ba6377ebf77b78d0bd15c01b302ef33ffdd4200 100644 +index d75a3d62eeb151c2451b20feb7fd088c513a2571..2b7d14e3de4520188c1701ac00044a64d8228aed 100644 --- a/src/main/java/net/minecraft/world/entity/LivingEntity.java +++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java -@@ -1537,6 +1537,19 @@ public abstract class LivingEntity extends Entity { +@@ -1544,6 +1544,19 @@ public abstract class LivingEntity extends Entity { } } diff --git a/patches/server/0084-Add-vindicator-johnny-spawn-chance.patch b/patches/server/0085-Add-vindicator-johnny-spawn-chance.patch similarity index 96% rename from patches/server/0084-Add-vindicator-johnny-spawn-chance.patch rename to patches/server/0085-Add-vindicator-johnny-spawn-chance.patch index b8d5e0f12..8ce7584b5 100644 --- a/patches/server/0084-Add-vindicator-johnny-spawn-chance.patch +++ b/patches/server/0085-Add-vindicator-johnny-spawn-chance.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Add vindicator johnny spawn chance diff --git a/src/main/java/net/minecraft/world/entity/monster/Vindicator.java b/src/main/java/net/minecraft/world/entity/monster/Vindicator.java -index 656dd2b01250c749db0acfa41992210709f5dcd3..036a5835152e2f1d72d2b9f37009ad053d046f2d 100644 +index c3b8bce2d8e1dccb619267923964e06abfed8762..021550a0465dd1fd152b4c2e763014058730e8ca 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Vindicator.java +++ b/src/main/java/net/minecraft/world/entity/monster/Vindicator.java @@ -154,6 +154,12 @@ public class Vindicator extends AbstractIllager { diff --git a/patches/server/0085-Add-option-to-disable-certain-block-updates.patch b/patches/server/0086-Add-option-to-disable-certain-block-updates.patch similarity index 100% rename from patches/server/0085-Add-option-to-disable-certain-block-updates.patch rename to patches/server/0086-Add-option-to-disable-certain-block-updates.patch diff --git a/patches/server/0086-Dispensers-place-anvils-option.patch b/patches/server/0087-Dispensers-place-anvils-option.patch similarity index 100% rename from patches/server/0086-Dispensers-place-anvils-option.patch rename to patches/server/0087-Dispensers-place-anvils-option.patch diff --git a/patches/server/0087-Allow-anvil-colors.patch b/patches/server/0088-Allow-anvil-colors.patch similarity index 100% rename from patches/server/0087-Allow-anvil-colors.patch rename to patches/server/0088-Allow-anvil-colors.patch diff --git a/patches/server/0088-Add-option-to-disable-dolphin-treasure-searching.patch b/patches/server/0089-Add-option-to-disable-dolphin-treasure-searching.patch similarity index 100% rename from patches/server/0088-Add-option-to-disable-dolphin-treasure-searching.patch rename to patches/server/0089-Add-option-to-disable-dolphin-treasure-searching.patch diff --git a/patches/server/0089-Short-enderman-height.patch b/patches/server/0090-Short-enderman-height.patch similarity index 92% rename from patches/server/0089-Short-enderman-height.patch rename to patches/server/0090-Short-enderman-height.patch index c311f9bb2..7e1b21235 100644 --- a/patches/server/0089-Short-enderman-height.patch +++ b/patches/server/0090-Short-enderman-height.patch @@ -5,7 +5,7 @@ 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 f2a59e99e35e5c704bb8399e48d92aebcd17ed35..ad97065699d25567b63811b6e668b32186f828d4 100644 +index 2c3c3071a3987b2175f26e08714e47bf13f20345..86fa3f03e72b0c656ed86cae9ee64feb3f77fb3d 100644 --- a/src/main/java/net/minecraft/world/entity/EntityType.java +++ b/src/main/java/net/minecraft/world/entity/EntityType.java @@ -291,7 +291,8 @@ public class EntityType implements EntityTypeTest { @@ -19,10 +19,10 @@ index f2a59e99e35e5c704bb8399e48d92aebcd17ed35..ad97065699d25567b63811b6e668b321 private static EntityType register(String id, EntityType.Builder type) { // CraftBukkit - decompile error return (EntityType) Registry.register(Registry.ENTITY_TYPE, id, (EntityType) type.build(id)); // 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 da2f01f44ac24a3b3886436aa7356ebc315f5ed6..d058bafa0b9dff551d5f26f18e1652df250a8de4 100644 +index ad47267eb6797e1591841cb7a576fb65f6e81382..9458cab33d4ff468d3d009cc1c3b3736f21f649b 100644 --- a/src/main/java/net/minecraft/world/entity/monster/EnderMan.java +++ b/src/main/java/net/minecraft/world/entity/monster/EnderMan.java -@@ -407,6 +407,7 @@ public class EnderMan extends Monster implements NeutralMob { +@@ -413,6 +413,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/0090-Stop-squids-floating-on-top-of-water.patch b/patches/server/0091-Stop-squids-floating-on-top-of-water.patch similarity index 92% rename from patches/server/0090-Stop-squids-floating-on-top-of-water.patch rename to patches/server/0091-Stop-squids-floating-on-top-of-water.patch index 686ba0806..4bb29517c 100644 --- a/patches/server/0090-Stop-squids-floating-on-top-of-water.patch +++ b/patches/server/0091-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 1c9e36b6b474e305695fa79af5544c45717bdb47..a7b987fcc1af08253ba8843812394572773b771a 100644 +index 6b92be36b86ecc5a82b4ca70ba187c53ec102adc..d152c3192108cdd16507e75649516a33916314a9 100644 --- a/src/main/java/net/minecraft/world/entity/Entity.java +++ b/src/main/java/net/minecraft/world/entity/Entity.java -@@ -4001,6 +4001,12 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { +@@ -4034,6 +4034,12 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { this.yRotO = this.getYRot(); } @@ -19,7 +19,7 @@ index 1c9e36b6b474e305695fa79af5544c45717bdb47..a7b987fcc1af08253ba8843812394572 + // 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 99248a9e2769a573839b199150da312d33344f95..709aaa9dc834d91219ce1087d8f89ef5bf3d915c 100644 diff --git a/patches/server/0091-Crying-obsidian-valid-for-portal-frames.patch b/patches/server/0092-Crying-obsidian-valid-for-portal-frames.patch similarity index 100% rename from patches/server/0091-Crying-obsidian-valid-for-portal-frames.patch rename to patches/server/0092-Crying-obsidian-valid-for-portal-frames.patch diff --git a/patches/server/0092-Entities-can-use-portals-configuration.patch b/patches/server/0093-Entities-can-use-portals-configuration.patch similarity index 92% rename from patches/server/0092-Entities-can-use-portals-configuration.patch rename to patches/server/0093-Entities-can-use-portals-configuration.patch index 836fe705e..5c33d55d4 100644 --- a/patches/server/0092-Entities-can-use-portals-configuration.patch +++ b/patches/server/0093-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 f5377087edd30e5ce8f68bebbba76c36f7cc0f6a..3097e87cece6aad796be215d524d9cb30fcc21c9 100644 +index d152c3192108cdd16507e75649516a33916314a9..3a6e7e7a71f5fe796e668a24c790abef8b524c6c 100644 --- a/src/main/java/net/minecraft/world/entity/Entity.java +++ b/src/main/java/net/minecraft/world/entity/Entity.java -@@ -2835,7 +2835,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { +@@ -2868,7 +2868,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { public void handleInsidePortal(BlockPos pos) { if (this.isOnPortalCooldown()) { this.setPortalCooldown(); @@ -17,7 +17,7 @@ index f5377087edd30e5ce8f68bebbba76c36f7cc0f6a..3097e87cece6aad796be215d524d9cb3 if (!this.level.isClientSide && !pos.equals(this.portalEntrancePos)) { this.portalEntrancePos = pos.immutable(); } -@@ -3500,7 +3500,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { +@@ -3533,7 +3533,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { } public boolean canChangeDimensions() { diff --git a/patches/server/0093-LivingEntity-broadcastItemBreak.patch b/patches/server/0094-LivingEntity-broadcastItemBreak.patch similarity index 100% rename from patches/server/0093-LivingEntity-broadcastItemBreak.patch rename to patches/server/0094-LivingEntity-broadcastItemBreak.patch diff --git a/patches/server/0094-Customizable-wither-health-and-healing.patch b/patches/server/0095-Customizable-wither-health-and-healing.patch similarity index 96% rename from patches/server/0094-Customizable-wither-health-and-healing.patch rename to patches/server/0095-Customizable-wither-health-and-healing.patch index 9a1772b35..becce1b49 100644 --- a/patches/server/0094-Customizable-wither-health-and-healing.patch +++ b/patches/server/0095-Customizable-wither-health-and-healing.patch @@ -6,7 +6,7 @@ Subject: [PATCH] Customizable wither health and healing Adds the ability to customize the health of the wither, as well as the amount that it heals, and how often. diff --git a/src/main/java/net/minecraft/world/entity/boss/wither/WitherBoss.java b/src/main/java/net/minecraft/world/entity/boss/wither/WitherBoss.java -index a15fb55ae69fa7255086df336ed8daf016a46a87..b1d0ddcdd7da03d62ef952931ace03c2a0e0bd93 100644 +index d88012af58aedf5f92885d74e69b06f5cf98aa71..2a7eac0dc5dbf71cb1b98903e78532cb8d506cfc 100644 --- a/src/main/java/net/minecraft/world/entity/boss/wither/WitherBoss.java +++ b/src/main/java/net/minecraft/world/entity/boss/wither/WitherBoss.java @@ -519,8 +519,10 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob diff --git a/patches/server/0095-Allow-toggling-special-MobSpawners-per-world.patch b/patches/server/0096-Allow-toggling-special-MobSpawners-per-world.patch similarity index 98% rename from patches/server/0095-Allow-toggling-special-MobSpawners-per-world.patch rename to patches/server/0096-Allow-toggling-special-MobSpawners-per-world.patch index 252d42e29..1ab64ebcf 100644 --- a/patches/server/0095-Allow-toggling-special-MobSpawners-per-world.patch +++ b/patches/server/0096-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 f9df95b189318f08c42bb120c4fa815fc47683ac..31368f0747e1e63d9b2f66db69dacc3af05d41a5 100644 +index 16c6eedc545a34b92bccf448011b40f0916bbdb0..a179cc4b66b830ee2b7764fe54f4e861666afd5e 100644 --- a/src/main/java/net/minecraft/server/level/ServerLevel.java +++ b/src/main/java/net/minecraft/server/level/ServerLevel.java @@ -505,7 +505,24 @@ public class ServerLevel extends Level implements WorldGenLevel { diff --git a/patches/server/0096-Raid-cooldown-setting.patch b/patches/server/0097-Raid-cooldown-setting.patch similarity index 100% rename from patches/server/0096-Raid-cooldown-setting.patch rename to patches/server/0097-Raid-cooldown-setting.patch diff --git a/patches/server/0097-Despawn-rate-config-options-per-projectile-type.patch b/patches/server/0098-Despawn-rate-config-options-per-projectile-type.patch similarity index 98% rename from patches/server/0097-Despawn-rate-config-options-per-projectile-type.patch rename to patches/server/0098-Despawn-rate-config-options-per-projectile-type.patch index 3c0be7661..48dc1f4eb 100644 --- a/patches/server/0097-Despawn-rate-config-options-per-projectile-type.patch +++ b/patches/server/0098-Despawn-rate-config-options-per-projectile-type.patch @@ -132,7 +132,7 @@ index 1a945a32c3d3705a318ebca72a365931a8c001b7..c7fdcfae1ba823046fdfe78aa97b4a7a + // Purpur end } 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 66c3f374a779cd3a4548393ba23e9219f1caf6d3..a9b958b5630944f0512e113b65c223419abd47f3 100644 +index 39ba6ca32b827daee300e1240bd76fd8f680ea02..0cfbb462e3c359d216e35a972e98585d17c65586 100644 --- a/src/main/java/net/minecraft/world/entity/projectile/Projectile.java +++ b/src/main/java/net/minecraft/world/entity/projectile/Projectile.java @@ -33,6 +33,7 @@ public abstract class Projectile extends Entity { @@ -143,9 +143,9 @@ index 66c3f374a779cd3a4548393ba23e9219f1caf6d3..a9b958b5630944f0512e113b65c22341 // CraftBukkit start protected boolean hitCancelled = false; -@@ -42,6 +43,23 @@ public abstract class Projectile extends Entity { - super(type, world); +@@ -72,6 +73,23 @@ public abstract class Projectile extends Entity { } + // Pufferfish start + // Purpur start + protected final void tickDespawnCounter() { @@ -167,7 +167,7 @@ index 66c3f374a779cd3a4548393ba23e9219f1caf6d3..a9b958b5630944f0512e113b65c22341 public void setOwner(@Nullable Entity entity) { if (entity != null) { this.ownerUUID = entity.getUUID(); -@@ -118,6 +136,8 @@ public abstract class Projectile extends Entity { +@@ -148,6 +166,8 @@ public abstract class Projectile extends Entity { this.leftOwner = this.checkLeftOwner(); } diff --git a/patches/server/0098-Add-option-to-disable-zombie-aggressiveness-towards-.patch b/patches/server/0099-Add-option-to-disable-zombie-aggressiveness-towards-.patch similarity index 100% rename from patches/server/0098-Add-option-to-disable-zombie-aggressiveness-towards-.patch rename to patches/server/0099-Add-option-to-disable-zombie-aggressiveness-towards-.patch diff --git a/patches/server/0099-Add-predicate-to-recipe-s-ExactChoice-ingredient.patch b/patches/server/0100-Add-predicate-to-recipe-s-ExactChoice-ingredient.patch similarity index 100% rename from patches/server/0099-Add-predicate-to-recipe-s-ExactChoice-ingredient.patch rename to patches/server/0100-Add-predicate-to-recipe-s-ExactChoice-ingredient.patch diff --git a/patches/server/0100-Flying-squids-Oh-my.patch b/patches/server/0101-Flying-squids-Oh-my.patch similarity index 100% rename from patches/server/0100-Flying-squids-Oh-my.patch rename to patches/server/0101-Flying-squids-Oh-my.patch diff --git a/patches/server/0101-Infinity-bow-settings.patch b/patches/server/0102-Infinity-bow-settings.patch similarity index 100% rename from patches/server/0101-Infinity-bow-settings.patch rename to patches/server/0102-Infinity-bow-settings.patch diff --git a/patches/server/0102-Configurable-daylight-cycle.patch b/patches/server/0103-Configurable-daylight-cycle.patch similarity index 93% rename from patches/server/0102-Configurable-daylight-cycle.patch rename to patches/server/0103-Configurable-daylight-cycle.patch index c0b0cc1ed..13f5e8c2b 100644 --- a/patches/server/0102-Configurable-daylight-cycle.patch +++ b/patches/server/0103-Configurable-daylight-cycle.patch @@ -18,10 +18,10 @@ index 689ad22925b2561f7c8db961743eb1f821dbb25f..fa3c960992cc240161817e54659d83fe public ClientboundSetTimePacket(long time, long timeOfDay, boolean doDaylightCycle) { this.gameTime = time % 192000; // Paper - fix guardian beam diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java -index 863cb20d9f67f9399dc0bd5c5f7cd955519f7e1d..f1198c07e479954a1be1e9fe52329a660ed15e9b 100644 +index 76bc94d5263f0ad354a385eb5b5270cda21c727b..0705540e8131d4c4bcc28fbf403b342323b11e5a 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java -@@ -1526,7 +1526,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop 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 958b32de685653e75a9495cb0108e6982cc4cc97..748718c41d26dd49a69142ddc1f9cbe355e120ce 100644 +index e99ffbf30652e188e88f8e17ed41d39ff25c9f73..c335a32832c6eef95658fbf632b943bb10ac44b0 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/0109-Apply-display-names-from-item-forms-of-entities-to-e.patch b/patches/server/0110-Apply-display-names-from-item-forms-of-entities-to-e.patch similarity index 98% rename from patches/server/0109-Apply-display-names-from-item-forms-of-entities-to-e.patch rename to patches/server/0110-Apply-display-names-from-item-forms-of-entities-to-e.patch index ce6d59531..4a8e41950 100644 --- a/patches/server/0109-Apply-display-names-from-item-forms-of-entities-to-e.patch +++ b/patches/server/0110-Apply-display-names-from-item-forms-of-entities-to-e.patch @@ -6,7 +6,7 @@ Subject: [PATCH] Apply display names from item forms of entities to entities diff --git a/src/main/java/net/minecraft/world/entity/decoration/ArmorStand.java b/src/main/java/net/minecraft/world/entity/decoration/ArmorStand.java -index 9b71425f2c321d3130a409a0a5b47ac9c0c4bae6..29939e851e38fcd494c7556760191e0100bc2e07 100644 +index ba9e851eebb25edf94efe8dfbd591e265ac3ac5a..9dcb46959c723723a369cde50427cbee0349f5a1 100644 --- a/src/main/java/net/minecraft/world/entity/decoration/ArmorStand.java +++ b/src/main/java/net/minecraft/world/entity/decoration/ArmorStand.java @@ -594,7 +594,13 @@ public class ArmorStand extends LivingEntity { @@ -63,7 +63,7 @@ index 18697701ca6406b2a74f190b22d5b276359547d0..ee72748a8c07587c95bdce8f982fcdd7 } diff --git a/src/main/java/net/minecraft/world/entity/vehicle/Boat.java b/src/main/java/net/minecraft/world/entity/vehicle/Boat.java -index fabc444f819e7ecf9a1e7b156276e1ec63b53a08..72eecae88812c0b55df07e7019ae79cd81dbd2cf 100644 +index c9ce0f1f798ee73e985798e7e7271aa51e405d05..a933a135e40097f88c22342159a13a4f500f0a8f 100644 --- a/src/main/java/net/minecraft/world/entity/vehicle/Boat.java +++ b/src/main/java/net/minecraft/world/entity/vehicle/Boat.java @@ -220,7 +220,13 @@ public class Boat extends Entity { diff --git a/patches/server/0110-Set-name-visible-when-using-a-Name-Tag-on-an-Armor-S.patch b/patches/server/0111-Set-name-visible-when-using-a-Name-Tag-on-an-Armor-S.patch similarity index 100% rename from patches/server/0110-Set-name-visible-when-using-a-Name-Tag-on-an-Armor-S.patch rename to patches/server/0111-Set-name-visible-when-using-a-Name-Tag-on-an-Armor-S.patch diff --git a/patches/server/0111-Add-config-for-allowing-Endermen-to-despawn-even-whi.patch b/patches/server/0112-Add-config-for-allowing-Endermen-to-despawn-even-whi.patch similarity index 93% rename from patches/server/0111-Add-config-for-allowing-Endermen-to-despawn-even-whi.patch rename to patches/server/0112-Add-config-for-allowing-Endermen-to-despawn-even-whi.patch index 4d1b6c45b..41ee20589 100644 --- a/patches/server/0111-Add-config-for-allowing-Endermen-to-despawn-even-whi.patch +++ b/patches/server/0112-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 d058bafa0b9dff551d5f26f18e1652df250a8de4..2bff3ace8ea2bd2ee3ec6025c41208e283dee266 100644 +index 9458cab33d4ff468d3d009cc1c3b3736f21f649b..4443a4a300d17e8568a81bcb9af89251d53a6a46 100644 --- a/src/main/java/net/minecraft/world/entity/monster/EnderMan.java +++ b/src/main/java/net/minecraft/world/entity/monster/EnderMan.java -@@ -471,7 +471,7 @@ public class EnderMan extends Monster implements NeutralMob { +@@ -477,7 +477,7 @@ public class EnderMan extends Monster implements NeutralMob { @Override public boolean requiresCustomPersistence() { diff --git a/patches/server/0112-Add-configurable-snowball-damage.patch b/patches/server/0113-Add-configurable-snowball-damage.patch similarity index 100% rename from patches/server/0112-Add-configurable-snowball-damage.patch rename to patches/server/0113-Add-configurable-snowball-damage.patch diff --git a/patches/server/0113-Changeable-Mob-Left-Handed-Chance.patch b/patches/server/0114-Changeable-Mob-Left-Handed-Chance.patch similarity index 91% rename from patches/server/0113-Changeable-Mob-Left-Handed-Chance.patch rename to patches/server/0114-Changeable-Mob-Left-Handed-Chance.patch index 2ef69d3a8..4180cf445 100644 --- a/patches/server/0113-Changeable-Mob-Left-Handed-Chance.patch +++ b/patches/server/0114-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 7dd8fdb921e8ad0a2d21f67241ed7c07614347a0..034aa7c98397bd9e4fd1e615e3cdad7e3473eb70 100644 +index fe97b5b327af1189b166243c42be99892226cd9e..5a907375d1497229d3b566b30c34248e7a134dff 100644 --- a/src/main/java/net/minecraft/world/entity/Mob.java +++ b/src/main/java/net/minecraft/world/entity/Mob.java -@@ -1233,7 +1233,7 @@ public abstract class Mob extends LivingEntity { +@@ -1239,7 +1239,7 @@ public abstract class Mob extends LivingEntity { 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)); diff --git a/patches/server/0114-Add-boat-fall-damage-config.patch b/patches/server/0115-Add-boat-fall-damage-config.patch similarity index 97% rename from patches/server/0114-Add-boat-fall-damage-config.patch rename to patches/server/0115-Add-boat-fall-damage-config.patch index 41c2bb980..452192157 100644 --- a/patches/server/0114-Add-boat-fall-damage-config.patch +++ b/patches/server/0115-Add-boat-fall-damage-config.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Add boat fall damage config diff --git a/src/main/java/net/minecraft/server/level/ServerPlayer.java b/src/main/java/net/minecraft/server/level/ServerPlayer.java -index 03faa935d23b53b4749469b0b9b8e8ea2fe83c82..4209f076877e560f2e0463281c0a343526cab5e4 100644 +index 8e5aa1666ca929780670ce513d969973a513e21e..fe2d7acece87d5b825f3f3668c11c0efc877439b 100644 --- a/src/main/java/net/minecraft/server/level/ServerPlayer.java +++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java @@ -1032,7 +1032,16 @@ public class ServerPlayer extends Player { diff --git a/patches/server/0115-Snow-Golem-rate-of-fire-config.patch b/patches/server/0116-Snow-Golem-rate-of-fire-config.patch similarity index 100% rename from patches/server/0115-Snow-Golem-rate-of-fire-config.patch rename to patches/server/0116-Snow-Golem-rate-of-fire-config.patch diff --git a/patches/server/0116-EMC-Configurable-disable-give-dropping.patch b/patches/server/0117-EMC-Configurable-disable-give-dropping.patch similarity index 100% rename from patches/server/0116-EMC-Configurable-disable-give-dropping.patch rename to patches/server/0117-EMC-Configurable-disable-give-dropping.patch diff --git a/patches/server/0117-Option-for-Villager-Clerics-to-farm-Nether-Wart.patch b/patches/server/0118-Option-for-Villager-Clerics-to-farm-Nether-Wart.patch similarity index 98% rename from patches/server/0117-Option-for-Villager-Clerics-to-farm-Nether-Wart.patch rename to patches/server/0118-Option-for-Villager-Clerics-to-farm-Nether-Wart.patch index 34d456953..320f10ce9 100644 --- a/patches/server/0117-Option-for-Villager-Clerics-to-farm-Nether-Wart.patch +++ b/patches/server/0118-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 5e82e82ab3afd8dba8588d84a02f4a6d626db51a..18a184633362c43f59f9493c56b33ccfb09d2873 100644 +index 09a7af00e05f5369c1c87c51f121ed34d4fd2734..73bb73cf0f0a20d0218f4080f547e279613f14bf 100644 --- a/src/main/java/net/minecraft/world/entity/npc/Villager.java +++ b/src/main/java/net/minecraft/world/entity/npc/Villager.java -@@ -222,7 +222,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler +@@ -224,7 +224,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 5e82e82ab3afd8dba8588d84a02f4a6d626db51a..18a184633362c43f59f9493c56b33ccf } brain.addActivity(Activity.CORE, VillagerGoalPackages.getCorePackage(villagerprofession, 0.5F)); -@@ -955,6 +955,11 @@ public class Villager extends AbstractVillager implements ReputationEventHandler +@@ -962,6 +962,11 @@ public class Villager extends AbstractVillager implements ReputationEventHandler } public boolean hasFarmSeeds() { diff --git a/patches/server/0118-Toggle-for-Zombified-Piglin-death-always-counting-as.patch b/patches/server/0119-Toggle-for-Zombified-Piglin-death-always-counting-as.patch similarity index 100% rename from patches/server/0118-Toggle-for-Zombified-Piglin-death-always-counting-as.patch rename to patches/server/0119-Toggle-for-Zombified-Piglin-death-always-counting-as.patch diff --git a/patches/server/0119-Spread-out-and-optimise-player-list-ticksSpread-out-.patch b/patches/server/0120-Spread-out-and-optimise-player-list-ticksSpread-out-.patch similarity index 100% rename from patches/server/0119-Spread-out-and-optimise-player-list-ticksSpread-out-.patch rename to patches/server/0120-Spread-out-and-optimise-player-list-ticksSpread-out-.patch diff --git a/patches/server/0120-Configurable-chance-for-wolves-to-spawn-rabid.patch b/patches/server/0121-Configurable-chance-for-wolves-to-spawn-rabid.patch similarity index 100% rename from patches/server/0120-Configurable-chance-for-wolves-to-spawn-rabid.patch rename to patches/server/0121-Configurable-chance-for-wolves-to-spawn-rabid.patch diff --git a/patches/server/0121-Configurable-default-collar-color.patch b/patches/server/0122-Configurable-default-collar-color.patch similarity index 100% rename from patches/server/0121-Configurable-default-collar-color.patch rename to patches/server/0122-Configurable-default-collar-color.patch diff --git a/patches/server/0122-Phantom-flames-on-swoop.patch b/patches/server/0123-Phantom-flames-on-swoop.patch similarity index 95% rename from patches/server/0122-Phantom-flames-on-swoop.patch rename to patches/server/0123-Phantom-flames-on-swoop.patch index dd0118791..29e9131c7 100644 --- a/patches/server/0122-Phantom-flames-on-swoop.patch +++ b/patches/server/0123-Phantom-flames-on-swoop.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Phantom flames on swoop 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 056a7487e265182f7b50eba30aa6adaa4ba39eba..2be9ab670e93067fe23745cafa0655a1dfa2bc0f 100644 +index 82d56a6968f3bbea5a2d32c2a7a84a8ba36d3d15..f23ca987666fd23621d3d731fd1a4ab26ff04aa8 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Phantom.java +++ b/src/main/java/net/minecraft/world/entity/monster/Phantom.java @@ -244,6 +244,7 @@ public class Phantom extends FlyingMob implements Enemy { diff --git a/patches/server/0123-Option-for-chests-to-open-even-with-a-solid-block-on.patch b/patches/server/0124-Option-for-chests-to-open-even-with-a-solid-block-on.patch similarity index 94% rename from patches/server/0123-Option-for-chests-to-open-even-with-a-solid-block-on.patch rename to patches/server/0124-Option-for-chests-to-open-even-with-a-solid-block-on.patch index fc3ed4f28..c9cff5f4a 100644 --- a/patches/server/0123-Option-for-chests-to-open-even-with-a-solid-block-on.patch +++ b/patches/server/0124-Option-for-chests-to-open-even-with-a-solid-block-on.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Option for chests to open even with a solid block on top diff --git a/src/main/java/net/minecraft/world/level/block/ChestBlock.java b/src/main/java/net/minecraft/world/level/block/ChestBlock.java -index 2f6b5142543aec14b27a996fe1a6817ac44c77b8..b69b72363d8b764b0bd21aa4d0799f7686ab4cf5 100644 +index c6b57d45383441aa35510e759ce3cb82bc98f305..330ff3bc5fd8625e37b79e1204eddbe88de62c03 100644 --- a/src/main/java/net/minecraft/world/level/block/ChestBlock.java +++ b/src/main/java/net/minecraft/world/level/block/ChestBlock.java @@ -355,6 +355,7 @@ public class ChestBlock extends AbstractChestBlock implements diff --git a/patches/server/0124-Implement-TPSBar.patch b/patches/server/0125-Implement-TPSBar.patch similarity index 97% rename from patches/server/0124-Implement-TPSBar.patch rename to patches/server/0125-Implement-TPSBar.patch index 7610c7e69..86609d944 100644 --- a/patches/server/0124-Implement-TPSBar.patch +++ b/patches/server/0125-Implement-TPSBar.patch @@ -17,10 +17,10 @@ index a26672fce303a2ad468014d88033c55789a95e87..c6a97b3fa04c683a92a8d838f98e73b5 if (environment.includeIntegrated) { diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java -index f1198c07e479954a1be1e9fe52329a660ed15e9b..e5c42c28556d1ffca8b4c7a51fffb9c54236dad7 100644 +index 0705540e8131d4c4bcc28fbf403b342323b11e5a..85c7da8849a3976bd214a822c780b447ada5f727 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java -@@ -1043,6 +1043,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; } -@@ -1221,6 +1223,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Ser +@@ -1222,6 +1224,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Ser 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/0127-Full-netherite-armor-grants-fire-resistance.patch b/patches/server/0128-Full-netherite-armor-grants-fire-resistance.patch similarity index 97% rename from patches/server/0127-Full-netherite-armor-grants-fire-resistance.patch rename to patches/server/0128-Full-netherite-armor-grants-fire-resistance.patch index b68fc32fe..ba76e44d8 100644 --- a/patches/server/0127-Full-netherite-armor-grants-fire-resistance.patch +++ b/patches/server/0128-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 292333dc9857c92808b3b7ec19ad84366ad073d6..120ac554b5ffd677731ed959f01da7478d37e2f3 100644 +index e0ea8b1b3ccde9616a721d677a8217b25aadfefe..b416c8606ef53aa49458bb6f36689068bc9b54cc 100644 --- a/src/main/java/net/minecraft/world/entity/player/Player.java +++ b/src/main/java/net/minecraft/world/entity/player/Player.java @@ -367,6 +367,16 @@ public abstract class Player extends LivingEntity { diff --git a/patches/server/0128-Fix-rotating-UP-DOWN-CW-and-CCW.patch b/patches/server/0129-Fix-rotating-UP-DOWN-CW-and-CCW.patch similarity index 100% rename from patches/server/0128-Fix-rotating-UP-DOWN-CW-and-CCW.patch rename to patches/server/0129-Fix-rotating-UP-DOWN-CW-and-CCW.patch diff --git a/patches/server/0129-Add-mobGriefing-bypass-to-everything-affected.patch b/patches/server/0130-Add-mobGriefing-bypass-to-everything-affected.patch similarity index 97% rename from patches/server/0129-Add-mobGriefing-bypass-to-everything-affected.patch rename to patches/server/0130-Add-mobGriefing-bypass-to-everything-affected.patch index 0fef23c5b..94396e189 100644 --- a/patches/server/0129-Add-mobGriefing-bypass-to-everything-affected.patch +++ b/patches/server/0130-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 5ba6377ebf77b78d0bd15c01b302ef33ffdd4200..1c5daf93cca4c54b35d08092a7662e88d5d18f6d 100644 +index 2b7d14e3de4520188c1701ac00044a64d8228aed..6a7a83a3fc58cbb7e97c0ba13715a8e6ea5f6de6 100644 --- a/src/main/java/net/minecraft/world/entity/LivingEntity.java +++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java -@@ -1709,7 +1709,7 @@ public abstract class LivingEntity extends Entity { +@@ -1716,7 +1716,7 @@ public abstract class LivingEntity extends Entity { boolean flag = false; if (this.dead && adversary instanceof WitherBoss) { // Paper @@ -18,10 +18,10 @@ index 5ba6377ebf77b78d0bd15c01b302ef33ffdd4200..1c5daf93cca4c54b35d08092a7662e88 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 034aa7c98397bd9e4fd1e615e3cdad7e3473eb70..ce72ba463449958ddc798feea3824a97fbba0bed 100644 +index 5a907375d1497229d3b566b30c34248e7a134dff..f1ff212f419bb8f21c692c2174c32fab9ce91305 100644 --- a/src/main/java/net/minecraft/world/entity/Mob.java +++ b/src/main/java/net/minecraft/world/entity/Mob.java -@@ -662,7 +662,7 @@ public abstract class Mob extends LivingEntity { +@@ -664,7 +664,7 @@ public abstract class Mob extends LivingEntity { public void aiStep() { super.aiStep(); this.level.getProfiler().push("looting"); @@ -31,7 +31,7 @@ index 034aa7c98397bd9e4fd1e615e3cdad7e3473eb70..ce72ba463449958ddc798feea3824a97 List list = this.level.getEntitiesOfClass(ItemEntity.class, this.getBoundingBox().inflate((double) baseblockposition.getX(), (double) baseblockposition.getY(), (double) baseblockposition.getZ())); Iterator iterator = list.iterator(); diff --git a/src/main/java/net/minecraft/world/entity/ai/behavior/HarvestFarmland.java b/src/main/java/net/minecraft/world/entity/ai/behavior/HarvestFarmland.java -index c7b9cd17cd2b13da9eedc8fd26a3bbdd8b307681..22bec44fa23370ce57ba485546d665e120a50396 100644 +index 2ad6f887db730466da39ad8fdd7c97c098e9966a..6fb6b505b83bbb439eed75ece472074fb752c1fb 100644 --- a/src/main/java/net/minecraft/world/entity/ai/behavior/HarvestFarmland.java +++ b/src/main/java/net/minecraft/world/entity/ai/behavior/HarvestFarmland.java @@ -41,7 +41,7 @@ public class HarvestFarmland extends Behavior { @@ -105,7 +105,7 @@ index aa18947d3822a1093985799e87ad6c2b28f51eb1..364863d14e7c0ac6dffa1ac5df5f1af5 if (iblockdata.is(Blocks.SWEET_BERRY_BUSH)) { diff --git a/src/main/java/net/minecraft/world/entity/animal/Rabbit.java b/src/main/java/net/minecraft/world/entity/animal/Rabbit.java -index e990e6f416854197bd5a4d31e4c7acc3fb69b390..68579837bbe1f532b94de072bcb614d2baa3f74d 100644 +index 93d65e8e7b15060c9d7931d22aa2ff77a2616d0b..b8dd08ad346e90ddde14289441d6e52776c42538 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Rabbit.java +++ b/src/main/java/net/minecraft/world/entity/animal/Rabbit.java @@ -619,7 +619,7 @@ public class Rabbit extends Animal { @@ -131,7 +131,7 @@ index b9025929fcc89e72aa820953b91a65423878ba0f..edf4537f08a54e1a5b043927678bbddf } 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 bf05e13e6d385c87fdd36ac32db170f9b0a644af..dc27fb79ee596c39a8ea4a422b9a069bfccb08e9 100644 +index 9ce2527054f5163eae3d1216427378dcdf92a2fe..d655bd2ecce01a54695d135b12b2f930fa368ffe 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 @@ -578,7 +578,7 @@ public class EnderDragon extends Mob implements Enemy { @@ -144,7 +144,7 @@ index bf05e13e6d385c87fdd36ac32db170f9b0a644af..dc27fb79ee596c39a8ea4a422b9a069b // flag1 = this.level.removeBlock(blockposition, false) || flag1; flag1 = true; diff --git a/src/main/java/net/minecraft/world/entity/boss/wither/WitherBoss.java b/src/main/java/net/minecraft/world/entity/boss/wither/WitherBoss.java -index b1d0ddcdd7da03d62ef952931ace03c2a0e0bd93..4da6fbb66350e4513dde28ba6f3c5d414ef92ad1 100644 +index 2a7eac0dc5dbf71cb1b98903e78532cb8d506cfc..3dfb7f3d11b69e08682d8b955adde3576c3ce6a1 100644 --- a/src/main/java/net/minecraft/world/entity/boss/wither/WitherBoss.java +++ b/src/main/java/net/minecraft/world/entity/boss/wither/WitherBoss.java @@ -390,7 +390,7 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob @@ -166,7 +166,7 @@ index b1d0ddcdd7da03d62ef952931ace03c2a0e0bd93..4da6fbb66350e4513dde28ba6f3c5d41 j = Mth.floor(this.getX()); int i1 = Mth.floor(this.getZ()); diff --git a/src/main/java/net/minecraft/world/entity/monster/Creeper.java b/src/main/java/net/minecraft/world/entity/monster/Creeper.java -index f486b722ef0c82b449238effc045fa9f68860193..f4aeaeef7d781a655e765993fb38a9d920c47109 100644 +index 9db014c82f6e8d1c64d592252b171683bd55c400..6acdd443e1e9d59efab8966f5f3ddbfb7be72336 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Creeper.java +++ b/src/main/java/net/minecraft/world/entity/monster/Creeper.java @@ -349,7 +349,7 @@ public class Creeper extends Monster implements PowerableMob { @@ -179,10 +179,10 @@ index f486b722ef0c82b449238effc045fa9f68860193..f4aeaeef7d781a655e765993fb38a9d9 // CraftBukkit start 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 2bff3ace8ea2bd2ee3ec6025c41208e283dee266..2da54b559ba48eec118727499068ce1d937eee5a 100644 +index 4443a4a300d17e8568a81bcb9af89251d53a6a46..306da3808e98847534f4d4190c5b2f82ef50224c 100644 --- a/src/main/java/net/minecraft/world/entity/monster/EnderMan.java +++ b/src/main/java/net/minecraft/world/entity/monster/EnderMan.java -@@ -519,7 +519,7 @@ public class EnderMan extends Monster implements NeutralMob { +@@ -525,7 +525,7 @@ public class EnderMan extends Monster implements NeutralMob { @Override public boolean canUse() { if (!enderman.level.purpurConfig.endermanAllowGriefing) return false; // Purpur @@ -191,7 +191,7 @@ index 2bff3ace8ea2bd2ee3ec6025c41208e283dee266..2da54b559ba48eec118727499068ce1d } @Override -@@ -567,7 +567,7 @@ public class EnderMan extends Monster implements NeutralMob { +@@ -573,7 +573,7 @@ public class EnderMan extends Monster implements NeutralMob { @Override public boolean canUse() { if (!enderman.level.purpurConfig.endermanAllowGriefing) return false; // Purpur @@ -249,10 +249,10 @@ index 4f0f7b2685696c48f2fe297ceea7a03322b8d45e..45aab92a976ac4c7e1f9b066119f0b4a BlockPos blockposition = (new BlockPos(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 9b8925fe938962264fdf49e97abc660d7fe8476a..eb16e4b51a90224fdd0696ac57861dea541c6dab 100644 +index 9a14ac198433e9bdfa2dabd4d3ae88ba17fd86ea..592a1a95b4cdfd731574299d2096f279f99b59f7 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 -@@ -412,7 +412,7 @@ public class Piglin extends AbstractPiglin implements CrossbowAttackMob, Invento +@@ -413,7 +413,7 @@ public class Piglin extends AbstractPiglin implements CrossbowAttackMob, Invento @Override public boolean wantsToPickUp(ItemStack stack) { @@ -290,10 +290,10 @@ index e69213b43c8aa5a7c04add7a87482d531fbf52d2..f51ea103238b4a50439f5162a248cd9a // 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 877a568b74e9f12decfeb70459e0cc0737f176cf..40645c931a10a3631a9240e25c823097afe89dec 100644 +index 0cfbb462e3c359d216e35a972e98585d17c65586..d576943e4f0f0e416d59cebcd475d231ebb1ae07 100644 --- a/src/main/java/net/minecraft/world/entity/projectile/Projectile.java +++ b/src/main/java/net/minecraft/world/entity/projectile/Projectile.java -@@ -298,6 +298,6 @@ public abstract class Projectile extends Entity { +@@ -328,6 +328,6 @@ public abstract class Projectile extends Entity { public boolean mayInteract(Level world, BlockPos pos) { Entity entity = this.getOwner(); diff --git a/patches/server/0130-Config-to-allow-Note-Block-sounds-when-blocked.patch b/patches/server/0131-Config-to-allow-Note-Block-sounds-when-blocked.patch similarity index 100% rename from patches/server/0130-Config-to-allow-Note-Block-sounds-when-blocked.patch rename to patches/server/0131-Config-to-allow-Note-Block-sounds-when-blocked.patch diff --git a/patches/server/0131-Add-EntityTeleportHinderedEvent.patch b/patches/server/0132-Add-EntityTeleportHinderedEvent.patch similarity index 100% rename from patches/server/0131-Add-EntityTeleportHinderedEvent.patch rename to patches/server/0132-Add-EntityTeleportHinderedEvent.patch diff --git a/patches/server/0132-Farmland-trampling-changes.patch b/patches/server/0133-Farmland-trampling-changes.patch similarity index 100% rename from patches/server/0132-Farmland-trampling-changes.patch rename to patches/server/0133-Farmland-trampling-changes.patch diff --git a/patches/server/0133-Movement-options-for-armor-stands.patch b/patches/server/0134-Movement-options-for-armor-stands.patch similarity index 96% rename from patches/server/0133-Movement-options-for-armor-stands.patch rename to patches/server/0134-Movement-options-for-armor-stands.patch index 86cf72c07..b04a45891 100644 --- a/patches/server/0133-Movement-options-for-armor-stands.patch +++ b/patches/server/0134-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 3f0e8cc9376f2d7a5b97a57ac7f7504aa14f6c54..178168ec7e27f02ed455440f0c265ab536f509f5 100644 +index 3a6e7e7a71f5fe796e668a24c790abef8b524c6c..45310792113bf32aa5e4c79ff910d1efca292299 100644 --- a/src/main/java/net/minecraft/world/entity/Entity.java +++ b/src/main/java/net/minecraft/world/entity/Entity.java -@@ -1684,7 +1684,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { +@@ -1717,7 +1717,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { return this.isInWater() || flag; } diff --git a/patches/server/0134-Fix-stuck-in-portals.patch b/patches/server/0135-Fix-stuck-in-portals.patch similarity index 92% rename from patches/server/0134-Fix-stuck-in-portals.patch rename to patches/server/0135-Fix-stuck-in-portals.patch index 37cf1dee3..ca7ec81f5 100644 --- a/patches/server/0134-Fix-stuck-in-portals.patch +++ b/patches/server/0135-Fix-stuck-in-portals.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Fix stuck in portals diff --git a/src/main/java/net/minecraft/server/level/ServerPlayer.java b/src/main/java/net/minecraft/server/level/ServerPlayer.java -index 730a2f16fe9fea9662edf502419ad57387169c8f..ca1b2d02ec7a51fe2bee5037c09a0fdcf00ac58e 100644 +index c65eeec4ee990a1efaf5648ca31f8bb4a178ce2b..4980b0b46e75a4bc914cb3719d8b394fbcd8c224 100644 --- a/src/main/java/net/minecraft/server/level/ServerPlayer.java +++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java @@ -1185,6 +1185,7 @@ public class ServerPlayer extends Player { @@ -17,10 +17,10 @@ index 730a2f16fe9fea9662edf502419ad57387169c8f..ca1b2d02ec7a51fe2bee5037c09a0fdc // 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 d0b8fd430a76a55cd179b92b38eb61df7ac6f04a..3be125765c069a0c7a78e151426b26964f388a92 100644 +index 45310792113bf32aa5e4c79ff910d1efca292299..6019cb0c18840abc9be0f059e6ee1301b56636b3 100644 --- a/src/main/java/net/minecraft/world/entity/Entity.java +++ b/src/main/java/net/minecraft/world/entity/Entity.java -@@ -2832,12 +2832,15 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { +@@ -2865,12 +2865,15 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { return Vec3.directionFromRotation(this.getRotationVector()); } diff --git a/patches/server/0135-Toggle-for-water-sensitive-mob-damage.patch b/patches/server/0136-Toggle-for-water-sensitive-mob-damage.patch similarity index 99% rename from patches/server/0135-Toggle-for-water-sensitive-mob-damage.patch rename to patches/server/0136-Toggle-for-water-sensitive-mob-damage.patch index 64436ee3d..3105ec1f3 100644 --- a/patches/server/0135-Toggle-for-water-sensitive-mob-damage.patch +++ b/patches/server/0136-Toggle-for-water-sensitive-mob-damage.patch @@ -21,7 +21,7 @@ index b6df98797757462f35c306aa4c6ea1585a9a6ddc..506632a6b5107f5ef08cd87808b8c4be @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 a02502ce8916c6b817270297412f961d5fcf4689..9c8f26a7510c43e24b49660546d524f7bed85a5e 100644 +index 007c945725721ddb8a3dc4b8085e8c68da741b93..53ef2004d1b6acaf27fef9a658fff99b7d343215 100644 --- a/src/main/java/net/minecraft/world/entity/ambient/Bat.java +++ b/src/main/java/net/minecraft/world/entity/ambient/Bat.java @@ -102,6 +102,11 @@ public class Bat extends AmbientCreature { @@ -411,7 +411,7 @@ index ffe8f80cfe3bec8fe79415015f5290749fcb770e..dd514cbf2f03b688eb4d8cd49052f177 @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 cf5b71dd336341556f5b9effa531bc8d42e5880d..e83cd1f4e56f4ac2c9f0dcc060ddf94d936d7b07 100644 +index 6d444248b9e283e31d5777d450a52643cc84f59b..83eef99d7f24634e301a51d2825370c9283b53ac 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 @@ -127,6 +127,11 @@ public class Axolotl extends Animal implements LerpingModel, Bucketable { @@ -427,7 +427,7 @@ index cf5b71dd336341556f5b9effa531bc8d42e5880d..e83cd1f4e56f4ac2c9f0dcc060ddf94d @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 6d3a39c0f65e19cff3c13355a53995df34ee136f..327a2161ba4b400952f104113015cbb630d1950d 100644 +index 47c08d7f3e30aa335fb7c43179679b6ae9f23952..60b40bf64de5562d124857614f3ebe7b505a59f1 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 @@ -114,6 +114,11 @@ public class Goat extends Animal { @@ -555,7 +555,7 @@ index a2636f6e4767d408ef9d2cda4c346abdaa88da37..6d1938f1cbad394f218b36ec8958d5e7 public static AttributeSupplier.Builder createAttributes() { 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 dc27fb79ee596c39a8ea4a422b9a069bfccb08e9..34e1ee5f67027cd7301e22e966f65c838e249bf6 100644 +index d655bd2ecce01a54695d135b12b2f930fa368ffe..a9e07815fdde8509267c48d41d0e5fd5a38a93da 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 @@ -165,6 +165,11 @@ public class EnderDragon extends Mob implements Enemy { @@ -571,7 +571,7 @@ index dc27fb79ee596c39a8ea4a422b9a069bfccb08e9..34e1ee5f67027cd7301e22e966f65c83 public static AttributeSupplier.Builder createAttributes() { diff --git a/src/main/java/net/minecraft/world/entity/boss/wither/WitherBoss.java b/src/main/java/net/minecraft/world/entity/boss/wither/WitherBoss.java -index f2dad991a4a5fc43870a508f4c24f75f1b058f26..4283c4426dac5db7730b2c4c21e92732806d7e29 100644 +index 3dfb7f3d11b69e08682d8b955adde3576c3ce6a1..4af8c387f47017e453e74a86a53726386ed2d1b9 100644 --- a/src/main/java/net/minecraft/world/entity/boss/wither/WitherBoss.java +++ b/src/main/java/net/minecraft/world/entity/boss/wither/WitherBoss.java @@ -222,6 +222,11 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob @@ -657,7 +657,7 @@ index 1d57ee963416e784a759f2ecee7b7c380f0597eb..037d77b47d0be69dfeda01f4a0d52ad7 @Override diff --git a/src/main/java/net/minecraft/world/entity/monster/ElderGuardian.java b/src/main/java/net/minecraft/world/entity/monster/ElderGuardian.java -index 725e98128fca670e370a35e763050909074b2653..9d5dc4540ef3207cdfd9b80d00e0a04c7bf13028 100644 +index 01be40f1740fc689b101fc596dbbb1e66de0bfb1..64193dab104b735a9fa3b335774e662629110c79 100644 --- a/src/main/java/net/minecraft/world/entity/monster/ElderGuardian.java +++ b/src/main/java/net/minecraft/world/entity/monster/ElderGuardian.java @@ -53,6 +53,11 @@ public class ElderGuardian extends Guardian { @@ -673,7 +673,7 @@ index 725e98128fca670e370a35e763050909074b2653..9d5dc4540ef3207cdfd9b80d00e0a04c public static AttributeSupplier.Builder createAttributes() { 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 2da54b559ba48eec118727499068ce1d937eee5a..74dff7ef5234f4b01fef7ccff5eeb2aafa82edc0 100644 +index 306da3808e98847534f4d4190c5b2f82ef50224c..6c9b3bb54b163cb2a6c05993e792558e983feecc 100644 --- a/src/main/java/net/minecraft/world/entity/monster/EnderMan.java +++ b/src/main/java/net/minecraft/world/entity/monster/EnderMan.java @@ -84,7 +84,7 @@ public class EnderMan extends Monster implements NeutralMob { @@ -919,7 +919,7 @@ index e239bcc4d4afe48e9fc204ad38d8bc76833994f4..8ce46cc00a01a678270e906078097aa7 @Override diff --git a/src/main/java/net/minecraft/world/entity/monster/Slime.java b/src/main/java/net/minecraft/world/entity/monster/Slime.java -index d1d58b8b109fb96ffe0561c8f8e3bb38a5a06e59..8f8ac9e39ec046b86843099d2daefc4f67c62b72 100644 +index 5146ae55c6c486d5a6619a0f30e41e07988faf95..efe072c4452857aad31ed87c519502078b62f61b 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Slime.java +++ b/src/main/java/net/minecraft/world/entity/monster/Slime.java @@ -134,6 +134,11 @@ public class Slime extends Mob implements Enemy { @@ -1117,7 +1117,7 @@ index 1f0003fb08a45af02e6d38e28fa548abe480426b..ad5197636e367f863ca3d044dd343ae5 @Override 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 748718c41d26dd49a69142ddc1f9cbe355e120ce..d356b239237ad79fdace1fab10bba156fbde16f2 100644 +index c335a32832c6eef95658fbf632b943bb10ac44b0..68cb79ad43a11195eb2245f6d9081212c7adb0dd 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 @@ -92,6 +92,11 @@ public class Hoglin extends Animal implements Enemy, HoglinBase { @@ -1133,7 +1133,7 @@ index 748718c41d26dd49a69142ddc1f9cbe355e120ce..d356b239237ad79fdace1fab10bba156 @Override 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 eb16e4b51a90224fdd0696ac57861dea541c6dab..8b8f9225aef90f1aeabb3a3fac97121d15ff9aae 100644 +index 592a1a95b4cdfd731574299d2096f279f99b59f7..52655c0e78673e8194276af665c13030f92201e2 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 @@ -115,6 +115,11 @@ public class Piglin extends AbstractPiglin implements CrossbowAttackMob, Invento @@ -1165,10 +1165,10 @@ index 75db61c5aab66234b26f7899229ddca8896e2086..a44f9a59fbec146df95d89c26df12efb public static AttributeSupplier.Builder createAttributes() { 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 bbf1e5c900d293da044809bf1871125264ce89c9..d2463e17dabb592bf799a1d851141339cd962222 100644 +index 73bb73cf0f0a20d0218f4080f547e279613f14bf..373f74742323367c7fa1984313c99c42c253cfa9 100644 --- a/src/main/java/net/minecraft/world/entity/npc/Villager.java +++ b/src/main/java/net/minecraft/world/entity/npc/Villager.java -@@ -186,6 +186,11 @@ public class Villager extends AbstractVillager implements ReputationEventHandler +@@ -188,6 +188,11 @@ public class Villager extends AbstractVillager implements ReputationEventHandler public boolean canBeLeashed(Player player) { return level.purpurConfig.villagerCanBeLeashed && !this.isLeashed(); } diff --git a/patches/server/0136-Config-to-always-tame-in-Creative.patch b/patches/server/0137-Config-to-always-tame-in-Creative.patch similarity index 100% rename from patches/server/0136-Config-to-always-tame-in-Creative.patch rename to patches/server/0137-Config-to-always-tame-in-Creative.patch diff --git a/patches/server/0137-End-crystal-explosion-options.patch b/patches/server/0138-End-crystal-explosion-options.patch similarity index 98% rename from patches/server/0137-End-crystal-explosion-options.patch rename to patches/server/0138-End-crystal-explosion-options.patch index 8f676d5f3..ea3b092cc 100644 --- a/patches/server/0137-End-crystal-explosion-options.patch +++ b/patches/server/0138-End-crystal-explosion-options.patch @@ -5,7 +5,7 @@ Subject: [PATCH] End crystal explosion options diff --git a/src/main/java/net/minecraft/world/entity/boss/enderdragon/EndCrystal.java b/src/main/java/net/minecraft/world/entity/boss/enderdragon/EndCrystal.java -index f8863cabad1bd0c3c2c62b8e17612d9559237d68..06c6addfa2a8dab1ad52a3588e9aeba5208eb997 100644 +index e1493079d06a91f3e14e333e2a0408725a8f5bea..59d7f4ef118b2a87d1fe9cc1dd2fea89772b4fd7 100644 --- a/src/main/java/net/minecraft/world/entity/boss/enderdragon/EndCrystal.java +++ b/src/main/java/net/minecraft/world/entity/boss/enderdragon/EndCrystal.java @@ -129,6 +129,22 @@ public class EndCrystal extends Entity { diff --git a/patches/server/0138-Configs-for-if-Wither-Ender-Dragon-can-ride-vehicles.patch b/patches/server/0139-Configs-for-if-Wither-Ender-Dragon-can-ride-vehicles.patch similarity index 95% rename from patches/server/0138-Configs-for-if-Wither-Ender-Dragon-can-ride-vehicles.patch rename to patches/server/0139-Configs-for-if-Wither-Ender-Dragon-can-ride-vehicles.patch index 0ec8062c4..d659fc57e 100644 --- a/patches/server/0138-Configs-for-if-Wither-Ender-Dragon-can-ride-vehicles.patch +++ b/patches/server/0139-Configs-for-if-Wither-Ender-Dragon-can-ride-vehicles.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Configs for if Wither/Ender Dragon can ride vehicles 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 34e1ee5f67027cd7301e22e966f65c838e249bf6..0bcf2f853add232526d92ec2099fa63c9fff6f5e 100644 +index a9e07815fdde8509267c48d41d0e5fd5a38a93da..41a0dfd14b970b3f36ac7cc134226a797d23aa3c 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 @@ -1130,6 +1130,7 @@ public class EnderDragon extends Mob implements Enemy { @@ -17,7 +17,7 @@ index 34e1ee5f67027cd7301e22e966f65c838e249bf6..0bcf2f853add232526d92ec2099fa63c } diff --git a/src/main/java/net/minecraft/world/entity/boss/wither/WitherBoss.java b/src/main/java/net/minecraft/world/entity/boss/wither/WitherBoss.java -index e0c960a07fcecec58fecdf88c190ab85b25a3658..3cdf02e3376a24afe7fff9ebb981f7ffffa4cc1f 100644 +index 4af8c387f47017e453e74a86a53726386ed2d1b9..fd5d0a75ea5e30df4f606bc4756a32ecbbe9abad 100644 --- a/src/main/java/net/minecraft/world/entity/boss/wither/WitherBoss.java +++ b/src/main/java/net/minecraft/world/entity/boss/wither/WitherBoss.java @@ -737,6 +737,7 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob diff --git a/patches/server/0139-Dont-run-with-scissors.patch b/patches/server/0140-Dont-run-with-scissors.patch similarity index 97% rename from patches/server/0139-Dont-run-with-scissors.patch rename to patches/server/0140-Dont-run-with-scissors.patch index 6db80d008..a16d34700 100644 --- a/patches/server/0139-Dont-run-with-scissors.patch +++ b/patches/server/0140-Dont-run-with-scissors.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Dont run with scissors! diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -index 966e06237b51759f548f6dfb64ae94ce3de7afab..a0e784c3f58e1b335d5a12a20e7079be9069dd62 100644 +index 11f0e539de92e5b802f722ae1bff2d76d07bd03f..e3e182a5e578a06d7543b78aae8fcfe45eefbcb3 100644 --- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java +++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -@@ -1626,6 +1626,13 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Ser +@@ -1627,6 +1627,13 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Ser this.player.resetFallDistance(); } @@ -22,7 +22,7 @@ index 966e06237b51759f548f6dfb64ae94ce3de7afab..a0e784c3f58e1b335d5a12a20e7079be this.player.checkMovementStatistics(this.player.getX() - d3, this.player.getY() - d4, this.player.getZ() - d5); this.lastGoodX = this.player.getX(); this.lastGoodY = this.player.getY(); -@@ -1659,6 +1666,12 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Ser +@@ -1660,6 +1667,12 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Ser } // Paper end - optimise out extra getCubes diff --git a/patches/server/0140-One-Punch-Man.patch b/patches/server/0141-One-Punch-Man.patch similarity index 94% rename from patches/server/0140-One-Punch-Man.patch rename to patches/server/0141-One-Punch-Man.patch index f6591c869..5e7974be4 100644 --- a/patches/server/0140-One-Punch-Man.patch +++ b/patches/server/0141-One-Punch-Man.patch @@ -5,10 +5,10 @@ Subject: [PATCH] One Punch Man! diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java -index 1c5daf93cca4c54b35d08092a7662e88d5d18f6d..12610d678830e92d90f42a518a7eda251be9c936 100644 +index 6a7a83a3fc58cbb7e97c0ba13715a8e6ea5f6de6..e9ee22f12f542f0c2d1a4ecedc891d708491a8eb 100644 --- a/src/main/java/net/minecraft/world/entity/LivingEntity.java +++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java -@@ -2180,6 +2180,20 @@ public abstract class LivingEntity extends Entity { +@@ -2201,6 +2201,20 @@ public abstract class LivingEntity extends Entity { ((ServerPlayer) damagesource.getEntity()).awardStat(Stats.DAMAGE_DEALT_ABSORBED, Math.round(f2 * 10.0F)); } diff --git a/patches/server/0141-Configurable-Ender-Pearl-cooldown-damage-and-Endermi.patch b/patches/server/0142-Configurable-Ender-Pearl-cooldown-damage-and-Endermi.patch similarity index 100% rename from patches/server/0141-Configurable-Ender-Pearl-cooldown-damage-and-Endermi.patch rename to patches/server/0142-Configurable-Ender-Pearl-cooldown-damage-and-Endermi.patch diff --git a/patches/server/0142-Config-to-ignore-nearby-mobs-when-sleeping.patch b/patches/server/0143-Config-to-ignore-nearby-mobs-when-sleeping.patch similarity index 96% rename from patches/server/0142-Config-to-ignore-nearby-mobs-when-sleeping.patch rename to patches/server/0143-Config-to-ignore-nearby-mobs-when-sleeping.patch index a771ba036..2b91dd6fe 100644 --- a/patches/server/0142-Config-to-ignore-nearby-mobs-when-sleeping.patch +++ b/patches/server/0143-Config-to-ignore-nearby-mobs-when-sleeping.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Config to ignore nearby mobs when sleeping diff --git a/src/main/java/net/minecraft/server/level/ServerPlayer.java b/src/main/java/net/minecraft/server/level/ServerPlayer.java -index ca1b2d02ec7a51fe2bee5037c09a0fdcf00ac58e..1b6a8932972862a5f2c4f0614362b5c3cf37b096 100644 +index 4980b0b46e75a4bc914cb3719d8b394fbcd8c224..c74e15d4776d98f288454eb609a798a183e51ee8 100644 --- a/src/main/java/net/minecraft/server/level/ServerPlayer.java +++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java @@ -1335,7 +1335,7 @@ public class ServerPlayer extends Player { diff --git a/patches/server/0143-Add-back-player-spawned-endermite-API.patch b/patches/server/0144-Add-back-player-spawned-endermite-API.patch similarity index 100% rename from patches/server/0143-Add-back-player-spawned-endermite-API.patch rename to patches/server/0144-Add-back-player-spawned-endermite-API.patch diff --git a/patches/server/0144-Config-Enderman-aggressiveness-towards-Endermites.patch b/patches/server/0145-Config-Enderman-aggressiveness-towards-Endermites.patch similarity index 97% rename from patches/server/0144-Config-Enderman-aggressiveness-towards-Endermites.patch rename to patches/server/0145-Config-Enderman-aggressiveness-towards-Endermites.patch index 5cde341cf..15fcba2d0 100644 --- a/patches/server/0144-Config-Enderman-aggressiveness-towards-Endermites.patch +++ b/patches/server/0145-Config-Enderman-aggressiveness-towards-Endermites.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Config Enderman aggressiveness towards Endermites 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 74dff7ef5234f4b01fef7ccff5eeb2aafa82edc0..4df4aead6a0e69175dd9464d50a6a855a5ad470a 100644 +index 6c9b3bb54b163cb2a6c05993e792558e983feecc..99e4c23140b85d37c7b266c2fcf57c94fd19ec7c 100644 --- a/src/main/java/net/minecraft/world/entity/monster/EnderMan.java +++ b/src/main/java/net/minecraft/world/entity/monster/EnderMan.java @@ -123,7 +123,7 @@ public class EnderMan extends Monster implements NeutralMob { diff --git a/patches/server/0145-Config-to-ignore-Dragon-Head-wearers-and-stare-aggro.patch b/patches/server/0146-Config-to-ignore-Dragon-Head-wearers-and-stare-aggro.patch similarity index 96% rename from patches/server/0145-Config-to-ignore-Dragon-Head-wearers-and-stare-aggro.patch rename to patches/server/0146-Config-to-ignore-Dragon-Head-wearers-and-stare-aggro.patch index ce2f27037..a449269e4 100644 --- a/patches/server/0145-Config-to-ignore-Dragon-Head-wearers-and-stare-aggro.patch +++ b/patches/server/0146-Config-to-ignore-Dragon-Head-wearers-and-stare-aggro.patch @@ -7,7 +7,7 @@ Prevents Enderman from becoming aggresive towards players that are wearing a Dra Adds functionality to a useless item! 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 4df4aead6a0e69175dd9464d50a6a855a5ad470a..3bf86f01a32237efb9b95fc9cd3ca0a570c6dcff 100644 +index 99e4c23140b85d37c7b266c2fcf57c94fd19ec7c..b0c4c90ab2d532a60911d53ac4764dcf49fff6c8 100644 --- a/src/main/java/net/minecraft/world/entity/monster/EnderMan.java +++ b/src/main/java/net/minecraft/world/entity/monster/EnderMan.java @@ -260,7 +260,7 @@ public class EnderMan extends Monster implements NeutralMob { diff --git a/patches/server/0146-Tick-fluids-config.patch b/patches/server/0147-Tick-fluids-config.patch similarity index 100% rename from patches/server/0146-Tick-fluids-config.patch rename to patches/server/0147-Tick-fluids-config.patch diff --git a/patches/server/0147-Config-to-disable-Llama-caravans.patch b/patches/server/0148-Config-to-disable-Llama-caravans.patch similarity index 97% rename from patches/server/0147-Config-to-disable-Llama-caravans.patch rename to patches/server/0148-Config-to-disable-Llama-caravans.patch index d7eadd740..67d82cfc0 100644 --- a/patches/server/0147-Config-to-disable-Llama-caravans.patch +++ b/patches/server/0148-Config-to-disable-Llama-caravans.patch @@ -19,7 +19,7 @@ index 7b141c495095afcd9c8b04c059d692e829259e7a..ad30f2d678cfc4b0d693e84e6e152c63 List list = this.llama.level.getEntities(this.llama, this.llama.getBoundingBox().inflate(9.0D, 4.0D, 9.0D), (entity) -> { EntityType entityType = entity.getType(); diff --git a/src/main/java/net/minecraft/world/entity/animal/horse/Llama.java b/src/main/java/net/minecraft/world/entity/animal/horse/Llama.java -index 57589a54362a4e0d23ba32957d5db47da2b9ec83..5506acea9b84a42eff7bdd593fec69c5031363b6 100644 +index 708f0bccffc05fac0d711df13dd1b5e173ff6109..b7b8d7587018759fc418043694abd38fd043852b 100644 --- a/src/main/java/net/minecraft/world/entity/animal/horse/Llama.java +++ b/src/main/java/net/minecraft/world/entity/animal/horse/Llama.java @@ -540,7 +540,7 @@ public class Llama extends AbstractChestedHorse implements RangedAttackMob { diff --git a/patches/server/0148-Config-to-make-Creepers-explode-on-death.patch b/patches/server/0149-Config-to-make-Creepers-explode-on-death.patch similarity index 97% rename from patches/server/0148-Config-to-make-Creepers-explode-on-death.patch rename to patches/server/0149-Config-to-make-Creepers-explode-on-death.patch index cea0d3ce6..a7679e0cb 100644 --- a/patches/server/0148-Config-to-make-Creepers-explode-on-death.patch +++ b/patches/server/0149-Config-to-make-Creepers-explode-on-death.patch @@ -6,7 +6,7 @@ Subject: [PATCH] Config to make Creepers explode on death Creepers exploded after being killed in the alpha days. This brings that back. diff --git a/src/main/java/net/minecraft/world/entity/monster/Creeper.java b/src/main/java/net/minecraft/world/entity/monster/Creeper.java -index 614baf25654c770a6cdac02f8cd4301a3ccdfb23..ca66ac64fd8fac10622e9458faecc4f05b9b629c 100644 +index fa4d5579dcdaad04fa2e6cd9ae47af1154739121..bd58b7d364b5e0361e7b8c67d1b26b7f8d3906d3 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Creeper.java +++ b/src/main/java/net/minecraft/world/entity/monster/Creeper.java @@ -64,6 +64,7 @@ public class Creeper extends Monster implements PowerableMob { diff --git a/patches/server/0149-Configurable-ravager-griefable-blocks-list.patch b/patches/server/0150-Configurable-ravager-griefable-blocks-list.patch similarity index 100% rename from patches/server/0149-Configurable-ravager-griefable-blocks-list.patch rename to patches/server/0150-Configurable-ravager-griefable-blocks-list.patch diff --git a/patches/server/0150-Sneak-to-bulk-process-composter.patch b/patches/server/0151-Sneak-to-bulk-process-composter.patch similarity index 100% rename from patches/server/0150-Sneak-to-bulk-process-composter.patch rename to patches/server/0151-Sneak-to-bulk-process-composter.patch diff --git a/patches/server/0151-Config-for-skipping-night.patch b/patches/server/0152-Config-for-skipping-night.patch similarity index 96% rename from patches/server/0151-Config-for-skipping-night.patch rename to patches/server/0152-Config-for-skipping-night.patch index 53eba1dba..a4e184988 100644 --- a/patches/server/0151-Config-for-skipping-night.patch +++ b/patches/server/0152-Config-for-skipping-night.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Config for skipping night diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java -index f20a904362fbbf1e6ff4ace1af78cece87f9f431..b2d2c63b02c00ebb5d85fe729fccf1acf11888a9 100644 +index fd1129945d777746c4579e72f993859c9935a694..1c33d008b1d1d798a18a301a891709d6a656f1a6 100644 --- a/src/main/java/net/minecraft/server/level/ServerLevel.java +++ b/src/main/java/net/minecraft/server/level/ServerLevel.java @@ -625,7 +625,7 @@ public class ServerLevel extends Level implements WorldGenLevel { diff --git a/patches/server/0152-Add-config-for-villager-trading.patch b/patches/server/0153-Add-config-for-villager-trading.patch similarity index 96% rename from patches/server/0152-Add-config-for-villager-trading.patch rename to patches/server/0153-Add-config-for-villager-trading.patch index 7f235383c..41b2b9d76 100644 --- a/patches/server/0152-Add-config-for-villager-trading.patch +++ b/patches/server/0153-Add-config-for-villager-trading.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Add config for villager trading 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 7962332c16f8cd83e5a05176b34674a3b3ff6a4b..ebc2a2f0518423dbc527d2b622d71320a56a34a9 100644 +index 373f74742323367c7fa1984313c99c42c253cfa9..89435b0742064d77c7cc8bb871949acc9852f2c0 100644 --- a/src/main/java/net/minecraft/world/entity/npc/Villager.java +++ b/src/main/java/net/minecraft/world/entity/npc/Villager.java -@@ -365,7 +365,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler +@@ -372,7 +372,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler return tryRide(player, hand); // Purpur } else { if (level.purpurConfig.villagerRidable && itemstack.isEmpty()) return tryRide(player, hand); // Purpur diff --git a/patches/server/0153-Allow-infinity-on-crossbows.patch b/patches/server/0154-Allow-infinity-on-crossbows.patch similarity index 98% rename from patches/server/0153-Allow-infinity-on-crossbows.patch rename to patches/server/0154-Allow-infinity-on-crossbows.patch index 5102190e5..e745b83ba 100644 --- a/patches/server/0153-Allow-infinity-on-crossbows.patch +++ b/patches/server/0154-Allow-infinity-on-crossbows.patch @@ -65,7 +65,7 @@ index 6f6106ca4d74d50a7b74b086adc96c58c7906cb6..d6417c1e77ac8823e18a179dc9f61757 public abstract boolean canEnchant(Item item); diff --git a/src/main/java/org/bukkit/craftbukkit/enchantments/CraftEnchantment.java b/src/main/java/org/bukkit/craftbukkit/enchantments/CraftEnchantment.java -index d94ca202033edff679d9471cb33a314735f57be7..e883e966811ef47137a16f42969f7ff539a69265 100644 +index 873185fd4d4c994130f2e7c271b3e03cefb2278c..a371bbe337daf9abce320ce0d8c21fa35badb6e4 100644 --- a/src/main/java/org/bukkit/craftbukkit/enchantments/CraftEnchantment.java +++ b/src/main/java/org/bukkit/craftbukkit/enchantments/CraftEnchantment.java @@ -59,6 +59,7 @@ public class CraftEnchantment extends Enchantment { diff --git a/patches/server/0154-Drowning-Settings.patch b/patches/server/0155-Drowning-Settings.patch similarity index 88% rename from patches/server/0154-Drowning-Settings.patch rename to patches/server/0155-Drowning-Settings.patch index b5fb82953..06fe5c076 100644 --- a/patches/server/0154-Drowning-Settings.patch +++ b/patches/server/0155-Drowning-Settings.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Drowning Settings diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java -index 3be125765c069a0c7a78e151426b26964f388a92..07d5609825a8b3c635043d95a3c6fc3b0e0bafec 100644 +index 6019cb0c18840abc9be0f059e6ee1301b56636b3..c988fc2d7fbd8db60ddcde8532dbdf3feda5bd48 100644 --- a/src/main/java/net/minecraft/world/entity/Entity.java +++ b/src/main/java/net/minecraft/world/entity/Entity.java -@@ -3063,7 +3063,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { +@@ -3096,7 +3096,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { } public int getMaxAirSupply() { @@ -18,10 +18,10 @@ index 3be125765c069a0c7a78e151426b26964f388a92..07d5609825a8b3c635043d95a3c6fc3b public int getAirSupply() { diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java -index 12610d678830e92d90f42a518a7eda251be9c936..1d2536b5c410997b3a584b179f4c41a13fcbcfca 100644 +index e9ee22f12f542f0c2d1a4ecedc891d708491a8eb..4f9b44c1a1421969f454cb2984d0b7ce21357225 100644 --- a/src/main/java/net/minecraft/world/entity/LivingEntity.java +++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java -@@ -425,7 +425,7 @@ public abstract class LivingEntity extends Entity { +@@ -423,7 +423,7 @@ public abstract class LivingEntity extends Entity { if (flag1) { this.setAirSupply(this.decreaseAirSupply(this.getAirSupply())); @@ -30,7 +30,7 @@ index 12610d678830e92d90f42a518a7eda251be9c936..1d2536b5c410997b3a584b179f4c41a1 this.setAirSupply(0); Vec3 vec3d = this.getDeltaMovement(); -@@ -437,7 +437,7 @@ public abstract class LivingEntity extends Entity { +@@ -435,7 +435,7 @@ public abstract class LivingEntity extends Entity { this.level.addParticle(ParticleTypes.BUBBLE, this.getX() + d2, this.getY() + d3, this.getZ() + d4, vec3d.x, vec3d.y, vec3d.z); } diff --git a/patches/server/0155-Break-individual-slabs-when-sneaking.patch b/patches/server/0156-Break-individual-slabs-when-sneaking.patch similarity index 100% rename from patches/server/0155-Break-individual-slabs-when-sneaking.patch rename to patches/server/0156-Break-individual-slabs-when-sneaking.patch diff --git a/patches/server/0156-Config-to-disable-hostile-mob-spawn-on-ice.patch b/patches/server/0157-Config-to-disable-hostile-mob-spawn-on-ice.patch similarity index 96% rename from patches/server/0156-Config-to-disable-hostile-mob-spawn-on-ice.patch rename to patches/server/0157-Config-to-disable-hostile-mob-spawn-on-ice.patch index 4d3ee535d..5f5c57815 100644 --- a/patches/server/0156-Config-to-disable-hostile-mob-spawn-on-ice.patch +++ b/patches/server/0157-Config-to-disable-hostile-mob-spawn-on-ice.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Config to disable hostile mob spawn on ice diff --git a/src/main/java/net/minecraft/world/entity/monster/Monster.java b/src/main/java/net/minecraft/world/entity/monster/Monster.java -index 37539f7680013ab99ed3313b82f9829617d17a71..01eb60c7086be32c64f119a1c492a11cd070a073 100644 +index 55c245d0dfa369dc6de2197ae37335fba4fae4ae..c9b40515f4c2ff1eedfc9510930c3baebc078ebd 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Monster.java +++ b/src/main/java/net/minecraft/world/entity/monster/Monster.java @@ -89,6 +89,14 @@ public abstract class Monster extends PathfinderMob implements Enemy { diff --git a/patches/server/0157-Config-to-show-Armor-Stand-arms-on-spawn.patch b/patches/server/0158-Config-to-show-Armor-Stand-arms-on-spawn.patch similarity index 96% rename from patches/server/0157-Config-to-show-Armor-Stand-arms-on-spawn.patch rename to patches/server/0158-Config-to-show-Armor-Stand-arms-on-spawn.patch index 0c6970f90..9f4e89c7c 100644 --- a/patches/server/0157-Config-to-show-Armor-Stand-arms-on-spawn.patch +++ b/patches/server/0158-Config-to-show-Armor-Stand-arms-on-spawn.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Config to show Armor Stand arms on spawn diff --git a/src/main/java/net/minecraft/world/entity/decoration/ArmorStand.java b/src/main/java/net/minecraft/world/entity/decoration/ArmorStand.java -index 1865fa0173dbd9362ba8186f0726f14d149d7602..fefb8c81df91c8ba30b0cf48735b47ab4f24f0a7 100644 +index 6bd31ed84049bc36a060b5e01b0599bf5f47765c..bdb0efdcac171a92a0e05557db7d099fdb6497f2 100644 --- a/src/main/java/net/minecraft/world/entity/decoration/ArmorStand.java +++ b/src/main/java/net/minecraft/world/entity/decoration/ArmorStand.java @@ -113,6 +113,7 @@ public class ArmorStand extends LivingEntity { diff --git a/patches/server/0158-Option-to-make-doors-require-redstone.patch b/patches/server/0159-Option-to-make-doors-require-redstone.patch similarity index 100% rename from patches/server/0158-Option-to-make-doors-require-redstone.patch rename to patches/server/0159-Option-to-make-doors-require-redstone.patch diff --git a/patches/server/0159-Config-to-allow-for-unsafe-enchants.patch b/patches/server/0160-Config-to-allow-for-unsafe-enchants.patch similarity index 100% rename from patches/server/0159-Config-to-allow-for-unsafe-enchants.patch rename to patches/server/0160-Config-to-allow-for-unsafe-enchants.patch diff --git a/patches/server/0160-Configurable-sponge-absorption.patch b/patches/server/0161-Configurable-sponge-absorption.patch similarity index 100% rename from patches/server/0160-Configurable-sponge-absorption.patch rename to patches/server/0161-Configurable-sponge-absorption.patch diff --git a/patches/server/0161-Projectile-offset-config.patch b/patches/server/0162-Projectile-offset-config.patch similarity index 100% rename from patches/server/0161-Projectile-offset-config.patch rename to patches/server/0162-Projectile-offset-config.patch diff --git a/patches/server/0162-Config-for-powered-rail-activation-distance.patch b/patches/server/0163-Config-for-powered-rail-activation-distance.patch similarity index 100% rename from patches/server/0162-Config-for-powered-rail-activation-distance.patch rename to patches/server/0163-Config-for-powered-rail-activation-distance.patch diff --git a/patches/server/0163-Piglin-portal-spawn-modifier.patch b/patches/server/0164-Piglin-portal-spawn-modifier.patch similarity index 96% rename from patches/server/0163-Piglin-portal-spawn-modifier.patch rename to patches/server/0164-Piglin-portal-spawn-modifier.patch index 7b2ba44e0..527d62f9f 100644 --- a/patches/server/0163-Piglin-portal-spawn-modifier.patch +++ b/patches/server/0164-Piglin-portal-spawn-modifier.patch @@ -18,7 +18,7 @@ Difficulties: 3 - hard diff --git a/src/main/java/net/minecraft/world/level/block/NetherPortalBlock.java b/src/main/java/net/minecraft/world/level/block/NetherPortalBlock.java -index 352568607e16be8f0e5942acd0097b4b2cf13bbc..68de09debf05853bb4a2e74ad34d0af221eb5161 100644 +index 65fa00b3d4d35a4125f8de444e77ac54e9e28551..dd9badfb2879def258bf725a5d802f7d93bebce8 100644 --- a/src/main/java/net/minecraft/world/level/block/NetherPortalBlock.java +++ b/src/main/java/net/minecraft/world/level/block/NetherPortalBlock.java @@ -55,7 +55,7 @@ public class NetherPortalBlock extends Block { diff --git a/patches/server/0164-Config-to-change-max-number-of-bees.patch b/patches/server/0165-Config-to-change-max-number-of-bees.patch similarity index 100% rename from patches/server/0164-Config-to-change-max-number-of-bees.patch rename to patches/server/0165-Config-to-change-max-number-of-bees.patch diff --git a/patches/server/0165-Config-for-wither-explosion-radius.patch b/patches/server/0166-Config-for-wither-explosion-radius.patch similarity index 100% rename from patches/server/0165-Config-for-wither-explosion-radius.patch rename to patches/server/0166-Config-for-wither-explosion-radius.patch diff --git a/patches/server/0166-Gamemode-extra-permissions.patch b/patches/server/0167-Gamemode-extra-permissions.patch similarity index 97% rename from patches/server/0166-Gamemode-extra-permissions.patch rename to patches/server/0167-Gamemode-extra-permissions.patch index fd450dcfc..53f7b485c 100644 --- a/patches/server/0166-Gamemode-extra-permissions.patch +++ b/patches/server/0167-Gamemode-extra-permissions.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Gamemode extra permissions diff --git a/src/main/java/net/minecraft/commands/CommandSourceStack.java b/src/main/java/net/minecraft/commands/CommandSourceStack.java -index 25b38ae65250a0b3c34dfbf2d853f65368fd916f..2e83251080e82e6418350199be29f74b69694898 100644 +index 5213f132f826b47e2825644242aaece2bb48f594..1f5a52c7890bfb399539362142241542788c7a19 100644 --- a/src/main/java/net/minecraft/commands/CommandSourceStack.java +++ b/src/main/java/net/minecraft/commands/CommandSourceStack.java @@ -203,6 +203,21 @@ public class CommandSourceStack implements SharedSuggestionProvider, com.destroy @@ -54,7 +54,7 @@ index 7882ee2b7813d437d3b7580f046f38e79fc9e7b6..afdf86826efc1c8c73a722d7709641b3 for(ServerPlayer serverPlayer : targets) { diff --git a/src/main/java/org/bukkit/craftbukkit/util/permissions/CommandPermissions.java b/src/main/java/org/bukkit/craftbukkit/util/permissions/CommandPermissions.java -index 045ebc5533de7486d1975efe9d51ab368969178a..bfd82778acd2849a9f75b20b78a9a3f37c32402d 100644 +index 0467419fc8a06c241a46216c8f8c32abeb9fbc26..bc178d7305f38b77393b827d7b71412d92ea1acb 100644 --- a/src/main/java/org/bukkit/craftbukkit/util/permissions/CommandPermissions.java +++ b/src/main/java/org/bukkit/craftbukkit/util/permissions/CommandPermissions.java @@ -23,7 +23,15 @@ public final class CommandPermissions { diff --git a/patches/server/0167-Config-for-changing-the-blocks-that-turn-into-dirt-p.patch b/patches/server/0168-Config-for-changing-the-blocks-that-turn-into-dirt-p.patch similarity index 100% rename from patches/server/0167-Config-for-changing-the-blocks-that-turn-into-dirt-p.patch rename to patches/server/0168-Config-for-changing-the-blocks-that-turn-into-dirt-p.patch diff --git a/patches/server/0168-Configurable-piston-push-limit.patch b/patches/server/0169-Configurable-piston-push-limit.patch similarity index 100% rename from patches/server/0168-Configurable-piston-push-limit.patch rename to patches/server/0169-Configurable-piston-push-limit.patch diff --git a/patches/server/0169-Configurable-broadcast-settings.patch b/patches/server/0170-Configurable-broadcast-settings.patch similarity index 97% rename from patches/server/0169-Configurable-broadcast-settings.patch rename to patches/server/0170-Configurable-broadcast-settings.patch index b54de43a4..7d799685d 100644 --- a/patches/server/0169-Configurable-broadcast-settings.patch +++ b/patches/server/0170-Configurable-broadcast-settings.patch @@ -17,7 +17,7 @@ index 161a2b122843318a1bc411ea09ef83bc56bff0d1..fb1f9574235aec9e6b2e0fa289ce0853 // Paper end } diff --git a/src/main/java/net/minecraft/server/level/ServerPlayer.java b/src/main/java/net/minecraft/server/level/ServerPlayer.java -index 7be90aca3c5b9a1a7aad22890c4bfd1a6544aa4c..2642fb12c68cf60f2e57c0717a20f5ef8564da59 100644 +index c74e15d4776d98f288454eb609a798a183e51ee8..3927087d5cea154c2e8dba370fea47bdba65d05d 100644 --- a/src/main/java/net/minecraft/server/level/ServerPlayer.java +++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java @@ -923,6 +923,7 @@ public class ServerPlayer extends Player { diff --git a/patches/server/0170-Configurable-mob-blindness.patch b/patches/server/0171-Configurable-mob-blindness.patch similarity index 94% rename from patches/server/0170-Configurable-mob-blindness.patch rename to patches/server/0171-Configurable-mob-blindness.patch index d0cb245e4..04cc71e88 100644 --- a/patches/server/0170-Configurable-mob-blindness.patch +++ b/patches/server/0171-Configurable-mob-blindness.patch @@ -6,10 +6,10 @@ Subject: [PATCH] Configurable mob blindness Ported from https://github.com/raltsmc/mobblindness diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java -index 1d2536b5c410997b3a584b179f4c41a13fcbcfca..5a742e95da47208366e791a10ce1e82d0c3524b4 100644 +index 4f9b44c1a1421969f454cb2984d0b7ce21357225..5fd7fc273f7b33e24d9b1a320c0bdd76c9ee0ac2 100644 --- a/src/main/java/net/minecraft/world/entity/LivingEntity.java +++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java -@@ -1013,6 +1013,17 @@ public abstract class LivingEntity extends Entity { +@@ -1011,6 +1011,17 @@ public abstract class LivingEntity extends Entity { if (entitytypes == EntityType.SKELETON && itemstack.is(Items.SKELETON_SKULL) || entitytypes == EntityType.ZOMBIE && itemstack.is(Items.ZOMBIE_HEAD) || entitytypes == EntityType.CREEPER && itemstack.is(Items.CREEPER_HEAD)) { d0 *= 0.5D; } diff --git a/patches/server/0171-Hide-hidden-players-from-entity-selector.patch b/patches/server/0172-Hide-hidden-players-from-entity-selector.patch similarity index 100% rename from patches/server/0171-Hide-hidden-players-from-entity-selector.patch rename to patches/server/0172-Hide-hidden-players-from-entity-selector.patch diff --git a/patches/server/0172-Config-for-health-to-impact-Creeper-explosion-radius.patch b/patches/server/0173-Config-for-health-to-impact-Creeper-explosion-radius.patch similarity index 96% rename from patches/server/0172-Config-for-health-to-impact-Creeper-explosion-radius.patch rename to patches/server/0173-Config-for-health-to-impact-Creeper-explosion-radius.patch index 72ecdd61e..82b6327be 100644 --- a/patches/server/0172-Config-for-health-to-impact-Creeper-explosion-radius.patch +++ b/patches/server/0173-Config-for-health-to-impact-Creeper-explosion-radius.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Config for health to impact Creeper explosion radius diff --git a/src/main/java/net/minecraft/world/entity/monster/Creeper.java b/src/main/java/net/minecraft/world/entity/monster/Creeper.java -index ca66ac64fd8fac10622e9458faecc4f05b9b629c..09d41e2adef76a4d3fb68b3a3002572144c9044c 100644 +index bd58b7d364b5e0361e7b8c67d1b26b7f8d3906d3..b19e130b56839c261dd71bbf62b052ede5fb7227 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Creeper.java +++ b/src/main/java/net/minecraft/world/entity/monster/Creeper.java @@ -366,9 +366,10 @@ public class Creeper extends Monster implements PowerableMob { diff --git a/patches/server/0173-Iron-golem-calm-anger-options.patch b/patches/server/0174-Iron-golem-calm-anger-options.patch similarity index 98% rename from patches/server/0173-Iron-golem-calm-anger-options.patch rename to patches/server/0174-Iron-golem-calm-anger-options.patch index e31d70232..183e54cc6 100644 --- a/patches/server/0173-Iron-golem-calm-anger-options.patch +++ b/patches/server/0174-Iron-golem-calm-anger-options.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Iron golem calm anger options diff --git a/src/main/java/net/minecraft/world/entity/animal/IronGolem.java b/src/main/java/net/minecraft/world/entity/animal/IronGolem.java -index 1f87f6879b9c23526a2d1b490959d60606657e02..6e4cb77ed0f0aefb2ce403f8ede0d3c04ebef833 100644 +index e3d725e656bc5ffc5fc92133794a80799fb21c48..fdad66c329ff8945a76a944deca7751ab9d3214b 100644 --- a/src/main/java/net/minecraft/world/entity/animal/IronGolem.java +++ b/src/main/java/net/minecraft/world/entity/animal/IronGolem.java @@ -100,6 +100,7 @@ public class IronGolem extends AbstractGolem implements NeutralMob { diff --git a/patches/server/0174-Breedable-parrots.patch b/patches/server/0175-Breedable-parrots.patch similarity index 100% rename from patches/server/0174-Breedable-parrots.patch rename to patches/server/0175-Breedable-parrots.patch diff --git a/patches/server/0175-Configurable-powered-rail-boost-modifier.patch b/patches/server/0176-Configurable-powered-rail-boost-modifier.patch similarity index 96% rename from patches/server/0175-Configurable-powered-rail-boost-modifier.patch rename to patches/server/0176-Configurable-powered-rail-boost-modifier.patch index 71891b2ad..820b78ba0 100644 --- a/patches/server/0175-Configurable-powered-rail-boost-modifier.patch +++ b/patches/server/0176-Configurable-powered-rail-boost-modifier.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Configurable powered rail boost modifier diff --git a/src/main/java/net/minecraft/world/entity/vehicle/AbstractMinecart.java b/src/main/java/net/minecraft/world/entity/vehicle/AbstractMinecart.java -index e3cf90b1506b5c6b96140799bc51c495ef5657ac..e2c75a715a1c2180344c19e5206a4586c15fb732 100644 +index 05031a1a8b9c42ea5cdf9d8ad9b6aeebe1fc823c..8c6e5e98dd5f425bd9322c01bba06c90d76673dc 100644 --- a/src/main/java/net/minecraft/world/entity/vehicle/AbstractMinecart.java +++ b/src/main/java/net/minecraft/world/entity/vehicle/AbstractMinecart.java @@ -714,7 +714,7 @@ public abstract class AbstractMinecart extends Entity { diff --git a/patches/server/0176-Add-config-change-multiplier-critical-damage-value.patch b/patches/server/0177-Add-config-change-multiplier-critical-damage-value.patch similarity index 100% rename from patches/server/0176-Add-config-change-multiplier-critical-damage-value.patch rename to patches/server/0177-Add-config-change-multiplier-critical-damage-value.patch diff --git a/patches/server/0177-Option-to-disable-dragon-egg-teleporting.patch b/patches/server/0178-Option-to-disable-dragon-egg-teleporting.patch similarity index 100% rename from patches/server/0177-Option-to-disable-dragon-egg-teleporting.patch rename to patches/server/0178-Option-to-disable-dragon-egg-teleporting.patch diff --git a/patches/server/0178-Config-for-unverified-username-message.patch b/patches/server/0179-Config-for-unverified-username-message.patch similarity index 97% rename from patches/server/0178-Config-for-unverified-username-message.patch rename to patches/server/0179-Config-for-unverified-username-message.patch index 607b5e365..8755de79f 100644 --- a/patches/server/0178-Config-for-unverified-username-message.patch +++ b/patches/server/0179-Config-for-unverified-username-message.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Config for unverified username message diff --git a/src/main/java/net/minecraft/server/network/ServerLoginPacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerLoginPacketListenerImpl.java -index 5f46bdcb109ec4af7e1241a278737b3dc41299f5..a62825d8f8c79ac15183b7b1eb9ba0c5e9a1fc6e 100644 +index 2991ae752fa8e7bf7e7aaaca9a02430e6973aea4..940d201f0df9ac1b5628a5fa09294e83db5ddc0e 100644 --- a/src/main/java/net/minecraft/server/network/ServerLoginPacketListenerImpl.java +++ b/src/main/java/net/minecraft/server/network/ServerLoginPacketListenerImpl.java @@ -401,7 +401,7 @@ public class ServerLoginPacketListenerImpl implements ServerLoginPacketListener diff --git a/patches/server/0179-Make-anvil-cumulative-cost-configurable.patch b/patches/server/0180-Make-anvil-cumulative-cost-configurable.patch similarity index 100% rename from patches/server/0179-Make-anvil-cumulative-cost-configurable.patch rename to patches/server/0180-Make-anvil-cumulative-cost-configurable.patch diff --git a/patches/server/0180-ShulkerBox-allow-oversized-stacks.patch b/patches/server/0181-ShulkerBox-allow-oversized-stacks.patch similarity index 100% rename from patches/server/0180-ShulkerBox-allow-oversized-stacks.patch rename to patches/server/0181-ShulkerBox-allow-oversized-stacks.patch diff --git a/patches/server/0181-Bee-can-work-when-raining-or-at-night.patch b/patches/server/0182-Bee-can-work-when-raining-or-at-night.patch similarity index 100% rename from patches/server/0181-Bee-can-work-when-raining-or-at-night.patch rename to patches/server/0182-Bee-can-work-when-raining-or-at-night.patch diff --git a/patches/server/0182-API-for-any-mob-to-burn-daylight.patch b/patches/server/0183-API-for-any-mob-to-burn-daylight.patch similarity index 96% rename from patches/server/0182-API-for-any-mob-to-burn-daylight.patch rename to patches/server/0183-API-for-any-mob-to-burn-daylight.patch index c681bf1f1..f162e5813 100644 --- a/patches/server/0182-API-for-any-mob-to-burn-daylight.patch +++ b/patches/server/0183-API-for-any-mob-to-burn-daylight.patch @@ -6,10 +6,10 @@ Subject: [PATCH] API for any mob to burn daylight Co-authored by: Encode42 diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java -index 189c3fe0977ee6d67943421af903ed61968c3d9b..c4f9623696e07ee33e4f42f36126f2b3e7a80865 100644 +index c988fc2d7fbd8db60ddcde8532dbdf3feda5bd48..e41a77c86d71f31ff36595b1daa2da1cd94e3a99 100644 --- a/src/main/java/net/minecraft/world/entity/Entity.java +++ b/src/main/java/net/minecraft/world/entity/Entity.java -@@ -4485,5 +4485,20 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { +@@ -4570,5 +4570,20 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { public boolean canSaveToDisk() { return true; } @@ -31,10 +31,10 @@ index 189c3fe0977ee6d67943421af903ed61968c3d9b..c4f9623696e07ee33e4f42f36126f2b3 // 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 fde87b5a2c3b3d94facf02ba9538685cc1f26651..2d1f5dfbaee60cac7cd24ca90dedea893e93e128 100644 +index 5fd7fc273f7b33e24d9b1a320c0bdd76c9ee0ac2..6959ea94bc2efc4417345365be4c506ee11c60bf 100644 --- a/src/main/java/net/minecraft/world/entity/LivingEntity.java +++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java -@@ -266,6 +266,7 @@ public abstract class LivingEntity extends Entity { +@@ -265,6 +265,7 @@ public abstract class LivingEntity extends Entity { public boolean bukkitPickUpLoot; 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 @@ -42,7 +42,7 @@ index fde87b5a2c3b3d94facf02ba9538685cc1f26651..2d1f5dfbaee60cac7cd24ca90dedea89 @Override public float getBukkitYaw() { -@@ -790,6 +791,7 @@ public abstract class LivingEntity extends Entity { +@@ -788,6 +789,7 @@ public abstract class LivingEntity extends Entity { dataresult.resultOrPartial(logger::error).ifPresent((nbtbase) -> { nbt.put("Brain", nbtbase); }); @@ -50,7 +50,7 @@ index fde87b5a2c3b3d94facf02ba9538685cc1f26651..2d1f5dfbaee60cac7cd24ca90dedea89 } @Override -@@ -865,6 +867,11 @@ public abstract class LivingEntity extends Entity { +@@ -863,6 +865,11 @@ public abstract class LivingEntity extends Entity { this.brain = this.makeBrain(new Dynamic(NbtOps.INSTANCE, nbt.get("Brain"))); } @@ -62,7 +62,7 @@ index fde87b5a2c3b3d94facf02ba9538685cc1f26651..2d1f5dfbaee60cac7cd24ca90dedea89 } // CraftBukkit start -@@ -3458,6 +3465,27 @@ public abstract class LivingEntity extends Entity { +@@ -3479,6 +3486,27 @@ public abstract class LivingEntity extends Entity { this.hurt(DamageSource.DROWN, 1.0F); } @@ -91,10 +91,10 @@ index fde87b5a2c3b3d94facf02ba9538685cc1f26651..2d1f5dfbaee60cac7cd24ca90dedea89 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 45e00fc1a5a695db0bf711e8f826722c814b481b..46eafe918a660fba8b18b6565a395bf6043b3978 100644 +index f1ff212f419bb8f21c692c2174c32fab9ce91305..34db1bd524bb97fbbe0f86b088a2ac343e730f5e 100644 --- a/src/main/java/net/minecraft/world/entity/Mob.java +++ b/src/main/java/net/minecraft/world/entity/Mob.java -@@ -1673,17 +1673,7 @@ public abstract class Mob extends LivingEntity { +@@ -1679,17 +1679,7 @@ public abstract class Mob extends LivingEntity { } public boolean isSunBurnTick() { diff --git a/patches/server/0183-Config-MobEffect-by-world.patch b/patches/server/0184-Config-MobEffect-by-world.patch similarity index 100% rename from patches/server/0183-Config-MobEffect-by-world.patch rename to patches/server/0184-Config-MobEffect-by-world.patch diff --git a/patches/server/0184-Beacon-Activation-Range-Configurable.patch b/patches/server/0185-Beacon-Activation-Range-Configurable.patch similarity index 100% rename from patches/server/0184-Beacon-Activation-Range-Configurable.patch rename to patches/server/0185-Beacon-Activation-Range-Configurable.patch diff --git a/patches/server/0185-Add-toggle-for-sand-duping-fix.patch b/patches/server/0186-Add-toggle-for-sand-duping-fix.patch similarity index 95% rename from patches/server/0185-Add-toggle-for-sand-duping-fix.patch rename to patches/server/0186-Add-toggle-for-sand-duping-fix.patch index 82d7aaa7d..5b5b45cab 100644 --- a/patches/server/0185-Add-toggle-for-sand-duping-fix.patch +++ b/patches/server/0186-Add-toggle-for-sand-duping-fix.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Add toggle for sand duping fix diff --git a/src/main/java/net/minecraft/world/entity/item/FallingBlockEntity.java b/src/main/java/net/minecraft/world/entity/item/FallingBlockEntity.java -index 318ea6ebf4c13a984b3815f00bf6cb3856ff6fe0..ae35add70d25c6c202e24237d6626665bb1bdcd5 100644 +index ef07967b64180c54338b8fb2ba1780adec87f333..71e4178bf7d553141719c8a6cb7488d3aaca0f9f 100644 --- a/src/main/java/net/minecraft/world/entity/item/FallingBlockEntity.java +++ b/src/main/java/net/minecraft/world/entity/item/FallingBlockEntity.java @@ -128,7 +128,7 @@ public class FallingBlockEntity extends Entity { diff --git a/patches/server/0186-Add-toggle-for-end-portal-safe-teleporting.patch b/patches/server/0187-Add-toggle-for-end-portal-safe-teleporting.patch similarity index 95% rename from patches/server/0186-Add-toggle-for-end-portal-safe-teleporting.patch rename to patches/server/0187-Add-toggle-for-end-portal-safe-teleporting.patch index 0bd352d08..c5ad616f9 100644 --- a/patches/server/0186-Add-toggle-for-end-portal-safe-teleporting.patch +++ b/patches/server/0187-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 49f6bf5ab0baf318d75a85b92db4ecc61b7028fd..1c59160a9848d3580b8075100a49bc854e9a43da 100644 +index e41a77c86d71f31ff36595b1daa2da1cd94e3a99..0397a5ef8ae2ec074d97055879d46d8e72496da8 100644 --- a/src/main/java/net/minecraft/world/entity/Entity.java +++ b/src/main/java/net/minecraft/world/entity/Entity.java -@@ -2883,7 +2883,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { +@@ -2916,7 +2916,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { } this.processPortalCooldown(); diff --git a/patches/server/0187-Flying-Fall-Damage-API.patch b/patches/server/0188-Flying-Fall-Damage-API.patch similarity index 100% rename from patches/server/0187-Flying-Fall-Damage-API.patch rename to patches/server/0188-Flying-Fall-Damage-API.patch diff --git a/patches/server/0188-Make-lightning-rod-range-configurable.patch b/patches/server/0189-Make-lightning-rod-range-configurable.patch similarity index 93% rename from patches/server/0188-Make-lightning-rod-range-configurable.patch rename to patches/server/0189-Make-lightning-rod-range-configurable.patch index dfbefa0a3..b3e879015 100644 --- a/patches/server/0188-Make-lightning-rod-range-configurable.patch +++ b/patches/server/0189-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 b2d2c63b02c00ebb5d85fe729fccf1acf11888a9..f83ed9b55bc079cf90e51b52aaf027f0adc53873 100644 +index 1c33d008b1d1d798a18a301a891709d6a656f1a6..b21a476816f3fe4affa7162d49ed16c4df165faf 100644 --- a/src/main/java/net/minecraft/server/level/ServerLevel.java +++ b/src/main/java/net/minecraft/server/level/ServerLevel.java -@@ -920,7 +920,7 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -935,7 +935,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/0189-Burp-after-eating-food-fills-hunger-bar-completely.patch b/patches/server/0190-Burp-after-eating-food-fills-hunger-bar-completely.patch similarity index 97% rename from patches/server/0189-Burp-after-eating-food-fills-hunger-bar-completely.patch rename to patches/server/0190-Burp-after-eating-food-fills-hunger-bar-completely.patch index 2873932d2..2fe588d10 100644 --- a/patches/server/0189-Burp-after-eating-food-fills-hunger-bar-completely.patch +++ b/patches/server/0190-Burp-after-eating-food-fills-hunger-bar-completely.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Burp after eating food fills hunger bar completely 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 e8b1dd7f413a27fa5d495a03bc725cead85a2c34..f8c196dc452fb1f79c6a6c2dea479fc98870728e 100644 +index 38b1807c7abf7278b2d00be1e1c8e3e3b42fabce..a4b46199099c654d6fb6373e0cf340dd69bd7bf8 100644 --- a/src/main/java/net/minecraft/world/entity/player/Player.java +++ b/src/main/java/net/minecraft/world/entity/player/Player.java @@ -200,6 +200,8 @@ public abstract class Player extends LivingEntity { diff --git a/patches/server/0190-Allow-player-join-full-server-by-permission.patch b/patches/server/0191-Allow-player-join-full-server-by-permission.patch similarity index 93% rename from patches/server/0190-Allow-player-join-full-server-by-permission.patch rename to patches/server/0191-Allow-player-join-full-server-by-permission.patch index 219d18a4a..303703343 100644 --- a/patches/server/0190-Allow-player-join-full-server-by-permission.patch +++ b/patches/server/0191-Allow-player-join-full-server-by-permission.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Allow player join full server by permission diff --git a/src/main/java/net/minecraft/server/players/PlayerList.java b/src/main/java/net/minecraft/server/players/PlayerList.java -index 0f80cec6b613c4fae52cfdc868ab1f738fc1264d..1af8a30f9300e355792d0016b1ccf7eda8a64544 100644 +index 7b3ad3316243d0d8fd2106a0f0475e1b5fadb1d0..fecd65dc87a99a5692c59dd590b20327b1eb31c2 100644 --- a/src/main/java/net/minecraft/server/players/PlayerList.java +++ b/src/main/java/net/minecraft/server/players/PlayerList.java @@ -776,7 +776,7 @@ public abstract class PlayerList { diff --git a/patches/server/0191-Add-permission-bypass-for-portal-waiting.patch b/patches/server/0192-Add-permission-bypass-for-portal-waiting.patch similarity index 100% rename from patches/server/0191-Add-permission-bypass-for-portal-waiting.patch rename to patches/server/0192-Add-permission-bypass-for-portal-waiting.patch diff --git a/patches/server/0192-Shulker-spawn-from-bullet-options.patch b/patches/server/0193-Shulker-spawn-from-bullet-options.patch similarity index 100% rename from patches/server/0192-Shulker-spawn-from-bullet-options.patch rename to patches/server/0193-Shulker-spawn-from-bullet-options.patch diff --git a/patches/server/0193-Eating-glow-berries-adds-glow-effect.patch b/patches/server/0194-Eating-glow-berries-adds-glow-effect.patch similarity index 100% rename from patches/server/0193-Eating-glow-berries-adds-glow-effect.patch rename to patches/server/0194-Eating-glow-berries-adds-glow-effect.patch diff --git a/patches/server/0194-Option-to-make-drowned-break-doors.patch b/patches/server/0195-Option-to-make-drowned-break-doors.patch similarity index 100% rename from patches/server/0194-Option-to-make-drowned-break-doors.patch rename to patches/server/0195-Option-to-make-drowned-break-doors.patch diff --git a/patches/server/0195-Configurable-hunger-starvation-damage.patch b/patches/server/0196-Configurable-hunger-starvation-damage.patch similarity index 100% rename from patches/server/0195-Configurable-hunger-starvation-damage.patch rename to patches/server/0196-Configurable-hunger-starvation-damage.patch diff --git a/patches/server/0196-Enhance-SysoutCatcher.patch b/patches/server/0197-Enhance-SysoutCatcher.patch similarity index 100% rename from patches/server/0196-Enhance-SysoutCatcher.patch rename to patches/server/0197-Enhance-SysoutCatcher.patch diff --git a/patches/server/0197-Armor-click-equip-options.patch b/patches/server/0198-Armor-click-equip-options.patch similarity index 100% rename from patches/server/0197-Armor-click-equip-options.patch rename to patches/server/0198-Armor-click-equip-options.patch diff --git a/patches/server/0198-Add-uptime-command.patch b/patches/server/0199-Add-uptime-command.patch similarity index 98% rename from patches/server/0198-Add-uptime-command.patch rename to patches/server/0199-Add-uptime-command.patch index c95954055..4cb0892d3 100644 --- a/patches/server/0198-Add-uptime-command.patch +++ b/patches/server/0199-Add-uptime-command.patch @@ -17,7 +17,7 @@ index c6a97b3fa04c683a92a8d838f98e73b59bb7558a..2fbb65c685ac88c77d54f27a5981a132 } diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java -index 90b192ea540c99df4d9ba8713f126cd7f1cdc81d..d6faf01b6225fec11a4290592ac6ddf674ca6ce2 100644 +index 85c7da8849a3976bd214a822c780b447ada5f727..00d3fca3906d59bf8c840f0773cd59b72d355e84 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java @@ -278,6 +278,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop 0.0F) { this.playSound(this.getFallDamageSound((int) f3), 1.0F, 1.0F); diff --git a/patches/server/0212-Add-Option-for-disable-observer-clocks.patch b/patches/server/0213-Add-Option-for-disable-observer-clocks.patch similarity index 95% rename from patches/server/0212-Add-Option-for-disable-observer-clocks.patch rename to patches/server/0213-Add-Option-for-disable-observer-clocks.patch index b254666a1..c04026b02 100644 --- a/patches/server/0212-Add-Option-for-disable-observer-clocks.patch +++ b/patches/server/0213-Add-Option-for-disable-observer-clocks.patch @@ -6,7 +6,7 @@ Subject: [PATCH] Add Option for disable observer clocks Allow to disable observer clocks: https://www.spigotmc.org/attachments/observerclock-gif.365936/ diff --git a/src/main/java/net/minecraft/world/level/block/ObserverBlock.java b/src/main/java/net/minecraft/world/level/block/ObserverBlock.java -index 7b45d6b9a005036ca5051d089a7be792eb87012f..8806c97ecc6bdd8a64c2d82bb2f58f46ac37c468 100644 +index 25c2c44bde443ab08734253ed7c98c81a345e573..e6a8c78a1a76241bcc6f0dee07838cb46e0f70bf 100644 --- a/src/main/java/net/minecraft/world/level/block/ObserverBlock.java +++ b/src/main/java/net/minecraft/world/level/block/ObserverBlock.java @@ -64,6 +64,7 @@ public class ObserverBlock extends DirectionalBlock { diff --git a/patches/server/0213-Customizeable-Zombie-Villager-curing-times.patch b/patches/server/0214-Customizeable-Zombie-Villager-curing-times.patch similarity index 100% rename from patches/server/0213-Customizeable-Zombie-Villager-curing-times.patch rename to patches/server/0214-Customizeable-Zombie-Villager-curing-times.patch diff --git a/patches/server/0214-Option-for-sponges-to-work-on-lava.patch b/patches/server/0215-Option-for-sponges-to-work-on-lava.patch similarity index 100% rename from patches/server/0214-Option-for-sponges-to-work-on-lava.patch rename to patches/server/0215-Option-for-sponges-to-work-on-lava.patch diff --git a/patches/server/0215-Toggle-for-Wither-s-spawn-sound.patch b/patches/server/0216-Toggle-for-Wither-s-spawn-sound.patch similarity index 96% rename from patches/server/0215-Toggle-for-Wither-s-spawn-sound.patch rename to patches/server/0216-Toggle-for-Wither-s-spawn-sound.patch index ec9c9f855..e5e32d30c 100644 --- a/patches/server/0215-Toggle-for-Wither-s-spawn-sound.patch +++ b/patches/server/0216-Toggle-for-Wither-s-spawn-sound.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Toggle for Wither's spawn sound diff --git a/src/main/java/net/minecraft/world/entity/boss/wither/WitherBoss.java b/src/main/java/net/minecraft/world/entity/boss/wither/WitherBoss.java -index 8b47c7bdf900a75fee842a27eb415314439fcbb2..93b5df1b561a89ee2f7826662e70106cfbd1d271 100644 +index bb62e4750e1a59d33803b516d7118f92c612c85e..5d567d97ce0be0728e538055ce6349a8861abddb 100644 --- a/src/main/java/net/minecraft/world/entity/boss/wither/WitherBoss.java +++ b/src/main/java/net/minecraft/world/entity/boss/wither/WitherBoss.java @@ -418,7 +418,7 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob diff --git a/patches/server/0216-Cactus-breaks-from-solid-neighbors-config.patch b/patches/server/0217-Cactus-breaks-from-solid-neighbors-config.patch similarity index 95% rename from patches/server/0216-Cactus-breaks-from-solid-neighbors-config.patch rename to patches/server/0217-Cactus-breaks-from-solid-neighbors-config.patch index 0a2ab00c0..b99486636 100644 --- a/patches/server/0216-Cactus-breaks-from-solid-neighbors-config.patch +++ b/patches/server/0217-Cactus-breaks-from-solid-neighbors-config.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Cactus breaks from solid neighbors config diff --git a/src/main/java/net/minecraft/world/level/block/CactusBlock.java b/src/main/java/net/minecraft/world/level/block/CactusBlock.java -index 1a735974c784c545d7f25548964b25b38ecdc762..36671c0e63daca1f56f7bfec4aee7355badff999 100644 +index 0fbabb84ef13e68b12212d9bfeb885c78893c116..56fa0e377b20ed063e47358be9e6bba8cf2c7955 100644 --- a/src/main/java/net/minecraft/world/level/block/CactusBlock.java +++ b/src/main/java/net/minecraft/world/level/block/CactusBlock.java @@ -109,7 +109,7 @@ public class CactusBlock extends Block { diff --git a/patches/server/0217-Config-to-remove-curse-of-binding-with-weakness.patch b/patches/server/0218-Config-to-remove-curse-of-binding-with-weakness.patch similarity index 100% rename from patches/server/0217-Config-to-remove-curse-of-binding-with-weakness.patch rename to patches/server/0218-Config-to-remove-curse-of-binding-with-weakness.patch diff --git a/patches/server/0218-Conduit-behavior-configuration.patch b/patches/server/0219-Conduit-behavior-configuration.patch similarity index 100% rename from patches/server/0218-Conduit-behavior-configuration.patch rename to patches/server/0219-Conduit-behavior-configuration.patch diff --git a/patches/server/0219-Cauldron-fill-chances.patch b/patches/server/0220-Cauldron-fill-chances.patch similarity index 100% rename from patches/server/0219-Cauldron-fill-chances.patch rename to patches/server/0220-Cauldron-fill-chances.patch diff --git a/patches/server/0220-Config-to-allow-mobs-to-pathfind-over-rails.patch b/patches/server/0221-Config-to-allow-mobs-to-pathfind-over-rails.patch similarity index 100% rename from patches/server/0220-Config-to-allow-mobs-to-pathfind-over-rails.patch rename to patches/server/0221-Config-to-allow-mobs-to-pathfind-over-rails.patch diff --git a/patches/server/0221-Shulker-change-color-with-dye.patch b/patches/server/0222-Shulker-change-color-with-dye.patch similarity index 100% rename from patches/server/0221-Shulker-change-color-with-dye.patch rename to patches/server/0222-Shulker-change-color-with-dye.patch diff --git a/patches/server/0222-Extended-OfflinePlayer-API.patch b/patches/server/0223-Extended-OfflinePlayer-API.patch similarity index 100% rename from patches/server/0222-Extended-OfflinePlayer-API.patch rename to patches/server/0223-Extended-OfflinePlayer-API.patch diff --git a/patches/server/0223-Added-the-ability-to-add-combustible-items.patch b/patches/server/0224-Added-the-ability-to-add-combustible-items.patch similarity index 93% rename from patches/server/0223-Added-the-ability-to-add-combustible-items.patch rename to patches/server/0224-Added-the-ability-to-add-combustible-items.patch index 6c4d59878..e895e5549 100644 --- a/patches/server/0223-Added-the-ability-to-add-combustible-items.patch +++ b/patches/server/0224-Added-the-ability-to-add-combustible-items.patch @@ -24,7 +24,7 @@ index 4adfc26062b322443828e94e6b0943884a18846b..0d9ecca25bff63f3428ccf93e2789fca } else if (this.isFuel(itemstack1)) { if (!this.moveItemStackTo(itemstack1, 1, 2, false)) { diff --git a/src/main/java/net/minecraft/world/level/block/entity/AbstractFurnaceBlockEntity.java b/src/main/java/net/minecraft/world/level/block/entity/AbstractFurnaceBlockEntity.java -index 800c80398acb007ae71b06d1a887aa159e866eda..abb90af5eb73eb9c4c73f52feef9a29cccb7bbb9 100644 +index c617a8aacbbefb37d53d0e005e822469d29aa642..e1abe61edfaa7b1497b5367310b49146f10fa139 100644 --- a/src/main/java/net/minecraft/world/level/block/entity/AbstractFurnaceBlockEntity.java +++ b/src/main/java/net/minecraft/world/level/block/entity/AbstractFurnaceBlockEntity.java @@ -213,6 +213,22 @@ public abstract class AbstractFurnaceBlockEntity extends BaseContainerBlockEntit @@ -51,10 +51,10 @@ index 800c80398acb007ae71b06d1a887aa159e866eda..abb90af5eb73eb9c4c73f52feef9a29c 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 e0026d35131fa0b7029a9d23bda22bf27c234744..988fdfae38f0e9f472a7a5fddcf41a25484bafbe 100644 +index eac409f4700ced854fddc3d1ce1c69866f3d98e2..58d5fd4b65ca281691dbef63c03f4881d7aa2656 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -@@ -1404,6 +1404,19 @@ public final class CraftServer implements Server { +@@ -1409,6 +1409,19 @@ public final class CraftServer implements Server { return true; } diff --git a/patches/server/0224-Option-for-if-rain-and-thunder-should-stop-on-sleep.patch b/patches/server/0225-Option-for-if-rain-and-thunder-should-stop-on-sleep.patch similarity index 93% rename from patches/server/0224-Option-for-if-rain-and-thunder-should-stop-on-sleep.patch rename to patches/server/0225-Option-for-if-rain-and-thunder-should-stop-on-sleep.patch index efd73641a..cfbf82205 100644 --- a/patches/server/0224-Option-for-if-rain-and-thunder-should-stop-on-sleep.patch +++ b/patches/server/0225-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 dfff5fd35838987dab4d971731a093721f683073..f6416542dc491c8852a86e76c9300419ff6a0106 100644 +index a4e08994016af22aca29a3be506f18cf37e7952e..d36902dd0143df9a342acf0547aac7aa8832cab5 100644 --- a/src/main/java/net/minecraft/server/level/ServerLevel.java +++ b/src/main/java/net/minecraft/server/level/ServerLevel.java -@@ -1128,6 +1128,7 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -1143,6 +1143,7 @@ public class ServerLevel extends Level implements WorldGenLevel { private void resetWeatherCycle() { // CraftBukkit start @@ -16,7 +16,7 @@ index dfff5fd35838987dab4d971731a093721f683073..f6416542dc491c8852a86e76c9300419 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.... -@@ -1135,6 +1136,7 @@ public class ServerLevel extends Level implements WorldGenLevel { +@@ -1150,6 +1151,7 @@ public class ServerLevel extends Level implements WorldGenLevel { this.serverLevelData.setRainTime(0); } // CraftBukkit end diff --git a/patches/server/0225-Chance-for-azalea-blocks-to-grow-into-trees-naturall.patch b/patches/server/0226-Chance-for-azalea-blocks-to-grow-into-trees-naturall.patch similarity index 100% rename from patches/server/0225-Chance-for-azalea-blocks-to-grow-into-trees-naturall.patch rename to patches/server/0226-Chance-for-azalea-blocks-to-grow-into-trees-naturall.patch diff --git a/patches/server/0226-Shift-right-click-to-use-exp-for-mending.patch b/patches/server/0227-Shift-right-click-to-use-exp-for-mending.patch similarity index 96% rename from patches/server/0226-Shift-right-click-to-use-exp-for-mending.patch rename to patches/server/0227-Shift-right-click-to-use-exp-for-mending.patch index 5d0013853..e06fefb3d 100644 --- a/patches/server/0226-Shift-right-click-to-use-exp-for-mending.patch +++ b/patches/server/0227-Shift-right-click-to-use-exp-for-mending.patch @@ -36,10 +36,10 @@ index 5204b8157a45468a314bbcd2703896b9316128ac..4fb8ced22cb9f106fbe39ca233a844a7 + // 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 a0e784c3f58e1b335d5a12a20e7079be9069dd62..03e9478ca06ce6327bcaa49e897a088ca6c6f467 100644 +index e3e182a5e578a06d7543b78aae8fcfe45eefbcb3..13da39f5bbd3550961bfb7d462428e8dac988ad0 100644 --- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java +++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -@@ -1998,6 +1998,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Ser +@@ -1999,6 +1999,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Ser boolean cancelled; if (movingobjectposition == null || movingobjectposition.getType() != HitResult.Type.BLOCK) { diff --git a/patches/server/0227-Dolphins-naturally-aggressive-to-players-chance.patch b/patches/server/0228-Dolphins-naturally-aggressive-to-players-chance.patch similarity index 100% rename from patches/server/0227-Dolphins-naturally-aggressive-to-players-chance.patch rename to patches/server/0228-Dolphins-naturally-aggressive-to-players-chance.patch diff --git a/patches/server/0228-Cows-naturally-aggressive-to-players-chance.patch b/patches/server/0229-Cows-naturally-aggressive-to-players-chance.patch similarity index 100% rename from patches/server/0228-Cows-naturally-aggressive-to-players-chance.patch rename to patches/server/0229-Cows-naturally-aggressive-to-players-chance.patch diff --git a/patches/server/0229-Option-for-beds-to-explode-on-villager-sleep.patch b/patches/server/0230-Option-for-beds-to-explode-on-villager-sleep.patch similarity index 93% rename from patches/server/0229-Option-for-beds-to-explode-on-villager-sleep.patch rename to patches/server/0230-Option-for-beds-to-explode-on-villager-sleep.patch index 7d8f78171..2038a3479 100644 --- a/patches/server/0229-Option-for-beds-to-explode-on-villager-sleep.patch +++ b/patches/server/0230-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 ebc2a2f0518423dbc527d2b622d71320a56a34a9..c8a82fd10cadc27f394a7cde646a5a2e9eb39371 100644 +index 89435b0742064d77c7cc8bb871949acc9852f2c0..f04778287545e9619ee0359f1e51151d87fca092 100644 --- a/src/main/java/net/minecraft/world/entity/npc/Villager.java +++ b/src/main/java/net/minecraft/world/entity/npc/Villager.java -@@ -1078,6 +1078,12 @@ public class Villager extends AbstractVillager implements ReputationEventHandler +@@ -1085,6 +1085,12 @@ public class Villager extends AbstractVillager implements ReputationEventHandler @Override public void startSleeping(BlockPos pos) { diff --git a/patches/server/0230-Halloween-options-and-optimizations.patch b/patches/server/0231-Halloween-options-and-optimizations.patch similarity index 92% rename from patches/server/0230-Halloween-options-and-optimizations.patch rename to patches/server/0231-Halloween-options-and-optimizations.patch index 77af0718a..f36c0df71 100644 --- a/patches/server/0230-Halloween-options-and-optimizations.patch +++ b/patches/server/0231-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 9c8f26a7510c43e24b49660546d524f7bed85a5e..0a859842e16e2cd2dfc25f0fa9920966506dccdb 100644 +index 53ef2004d1b6acaf27fef9a658fff99b7d343215..a851aaf84085c9bd79e933246bb2c79e435ab0f1 100644 --- a/src/main/java/net/minecraft/world/entity/ambient/Bat.java +++ b/src/main/java/net/minecraft/world/entity/ambient/Bat.java @@ -316,7 +316,7 @@ public class Bat extends AmbientCreature { @@ -17,14 +17,14 @@ index 9c8f26a7510c43e24b49660546d524f7bed85a5e..0a859842e16e2cd2dfc25f0fa9920966 b0 = 7; } else if (random.nextBoolean()) { return false; -@@ -326,6 +326,7 @@ public class Bat extends AmbientCreature { - } - } - +@@ -330,6 +330,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 4505b61f10c3aad3d0ab144cea5ef6efc6ad7357..e542407894f58fb8c0339a7a6d2e7b2cb5891eb4 100644 --- a/src/main/java/net/minecraft/world/entity/monster/AbstractSkeleton.java diff --git a/patches/server/0231-Config-for-grindstones.patch b/patches/server/0232-Config-for-grindstones.patch similarity index 100% rename from patches/server/0231-Config-for-grindstones.patch rename to patches/server/0232-Config-for-grindstones.patch diff --git a/patches/server/0232-UPnP-Port-Forwarding.patch b/patches/server/0233-UPnP-Port-Forwarding.patch similarity index 92% rename from patches/server/0232-UPnP-Port-Forwarding.patch rename to patches/server/0233-UPnP-Port-Forwarding.patch index 06a15b48c..699689f24 100644 --- a/patches/server/0232-UPnP-Port-Forwarding.patch +++ b/patches/server/0233-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 9adefd365fe7e9ad76bf1ae2494e5cfb53cad2b0..ccab594285628af829e556d41ec34846d689f186 100644 +index 00d3fca3906d59bf8c840f0773cd59b72d355e84..39e3d848a1c5955d4de25d91eff427595c131e25 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java @@ -293,6 +293,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop filteredtext = (signText.get(i)).map(Component::literal); // CraftBukkit - decompile error diff --git a/patches/server/0238-Kelp-weeping-and-twisting-vines-configurable-max-gro.patch b/patches/server/0239-Kelp-weeping-and-twisting-vines-configurable-max-gro.patch similarity index 100% rename from patches/server/0238-Kelp-weeping-and-twisting-vines-configurable-max-gro.patch rename to patches/server/0239-Kelp-weeping-and-twisting-vines-configurable-max-gro.patch diff --git a/patches/server/0239-Mobs-always-drop-experience.patch b/patches/server/0240-Mobs-always-drop-experience.patch similarity index 99% rename from patches/server/0239-Mobs-always-drop-experience.patch rename to patches/server/0240-Mobs-always-drop-experience.patch index cc87f8a66..a28f8baec 100644 --- a/patches/server/0239-Mobs-always-drop-experience.patch +++ b/patches/server/0240-Mobs-always-drop-experience.patch @@ -21,7 +21,7 @@ index 506632a6b5107f5ef08cd87808b8c4be1e96b49f..b7abcaa32341c292f9f884fa6319fd65 @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 0a859842e16e2cd2dfc25f0fa9920966506dccdb..14e4c7f2e2b47fc0cbf7cc8709d7b013b96a5e34 100644 +index a851aaf84085c9bd79e933246bb2c79e435ab0f1..1436f9f62ce20b39c5ae2425c2fe47f5942be157 100644 --- a/src/main/java/net/minecraft/world/entity/ambient/Bat.java +++ b/src/main/java/net/minecraft/world/entity/ambient/Bat.java @@ -107,6 +107,11 @@ public class Bat extends AmbientCreature { @@ -405,7 +405,7 @@ index ed33573a96e96d557156fbe2f725e3d65c7d5ec4..22a66e59687ca889965536464b628f45 @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 e83cd1f4e56f4ac2c9f0dcc060ddf94d936d7b07..c93fbeec27aede8513581c6589ec857bb3b6b431 100644 +index 83eef99d7f24634e301a51d2825370c9283b53ac..32870e6727d09fbf1c4913ffdf321a278b5b6f64 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 @@ -132,6 +132,11 @@ public class Axolotl extends Animal implements LerpingModel, Bucketable { @@ -421,7 +421,7 @@ index e83cd1f4e56f4ac2c9f0dcc060ddf94d936d7b07..c93fbeec27aede8513581c6589ec857b @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 327a2161ba4b400952f104113015cbb630d1950d..b8ec588e021a33fa2a41b583605603c0f95cfc02 100644 +index 60b40bf64de5562d124857614f3ebe7b505a59f1..52608eb55f0a191313fbf5a1ace8eafa3eb1bfcb 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 @@ -119,6 +119,11 @@ public class Goat extends Animal { @@ -549,7 +549,7 @@ index 6d1938f1cbad394f218b36ec8958d5e7ba6623f7..215c2a75fc53e558a5d804055138ee0f public static AttributeSupplier.Builder createAttributes() { diff --git a/src/main/java/net/minecraft/world/entity/boss/wither/WitherBoss.java b/src/main/java/net/minecraft/world/entity/boss/wither/WitherBoss.java -index ebaf3945f30c45a0c4d0844ca7bf7a803cc636a7..3afe99e22854aaf50b48256d7f9b83bed12cad2e 100644 +index 5d567d97ce0be0728e538055ce6349a8861abddb..b5116c5450cc06492aceffa011b17246d8fc6cab 100644 --- a/src/main/java/net/minecraft/world/entity/boss/wither/WitherBoss.java +++ b/src/main/java/net/minecraft/world/entity/boss/wither/WitherBoss.java @@ -237,6 +237,11 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob @@ -629,7 +629,7 @@ index 6e0a575a95ac0bcbc9e3909178ea566a158dd561..68e31cf561f3d76bce6fa4324a75594c @Override diff --git a/src/main/java/net/minecraft/world/entity/monster/ElderGuardian.java b/src/main/java/net/minecraft/world/entity/monster/ElderGuardian.java -index 9d5dc4540ef3207cdfd9b80d00e0a04c7bf13028..57ab602fb1d07e67ed7b48ad29570b1f3c641a07 100644 +index 64193dab104b735a9fa3b335774e662629110c79..3533414fcb112b75df7226d32b220bfcd6bd869f 100644 --- a/src/main/java/net/minecraft/world/entity/monster/ElderGuardian.java +++ b/src/main/java/net/minecraft/world/entity/monster/ElderGuardian.java @@ -58,6 +58,11 @@ public class ElderGuardian extends Guardian { @@ -645,7 +645,7 @@ index 9d5dc4540ef3207cdfd9b80d00e0a04c7bf13028..57ab602fb1d07e67ed7b48ad29570b1f public static AttributeSupplier.Builder createAttributes() { 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 fd4961b29e05e57ec68550eb9a7531eebc55e2c4..d3e1df950df2222277aaebf13e1f5d7713f1a3d7 100644 +index 372400d5ce38407b577e5ee403ce39fc60b399e4..6fc891e78b7a3839755a719ebc23f2ed2d714870 100644 --- a/src/main/java/net/minecraft/world/entity/monster/EnderMan.java +++ b/src/main/java/net/minecraft/world/entity/monster/EnderMan.java @@ -107,6 +107,11 @@ public class EnderMan extends Monster implements NeutralMob { @@ -885,7 +885,7 @@ index 8ce46cc00a01a678270e906078097aa717abdc41..51c548cd84bd83624fbff3f853a8050d @Override diff --git a/src/main/java/net/minecraft/world/entity/monster/Slime.java b/src/main/java/net/minecraft/world/entity/monster/Slime.java -index 8f8ac9e39ec046b86843099d2daefc4f67c62b72..b808e03311f22045a2a59b86dc28592143acf8e6 100644 +index efe072c4452857aad31ed87c519502078b62f61b..523f82f994fe4bfbd015281389d96a8bb8a0cefc 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Slime.java +++ b/src/main/java/net/minecraft/world/entity/monster/Slime.java @@ -139,6 +139,11 @@ public class Slime extends Mob implements Enemy { @@ -1077,7 +1077,7 @@ index ad5197636e367f863ca3d044dd343ae5ae722cc2..dd1b5c84682ebfb2ec3c52c8831c4b83 @Override 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 d356b239237ad79fdace1fab10bba156fbde16f2..ac127b39a07deb639372a751861733dfed683d56 100644 +index 68cb79ad43a11195eb2245f6d9081212c7adb0dd..9d65b412e30f528d378de9072b48632c56c3e5bb 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 @@ -97,6 +97,11 @@ public class Hoglin extends Animal implements Enemy, HoglinBase { @@ -1093,7 +1093,7 @@ index d356b239237ad79fdace1fab10bba156fbde16f2..ac127b39a07deb639372a751861733df @Override 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 8b8f9225aef90f1aeabb3a3fac97121d15ff9aae..0cd122b792b5e7775cc149e4566f03a5d5032189 100644 +index 52655c0e78673e8194276af665c13030f92201e2..68cb1fb0b1d5b4d4b656f71a35a5ba69e37511e2 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 @@ -120,6 +120,11 @@ public class Piglin extends AbstractPiglin implements CrossbowAttackMob, Invento @@ -1125,10 +1125,10 @@ index a44f9a59fbec146df95d89c26df12efb79f6179a..760015f7a98e70b735707c77472c084d public static AttributeSupplier.Builder createAttributes() { 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 dba831d07a2be3dd79a9b8f0862faca85a37b171..ffd03c6955ba94af097d2937b74c5862b12e82f2 100644 +index f04778287545e9619ee0359f1e51151d87fca092..b0674eeea341a725ed774c5de040fe173a6fb833 100644 --- a/src/main/java/net/minecraft/world/entity/npc/Villager.java +++ b/src/main/java/net/minecraft/world/entity/npc/Villager.java -@@ -191,6 +191,11 @@ public class Villager extends AbstractVillager implements ReputationEventHandler +@@ -193,6 +193,11 @@ public class Villager extends AbstractVillager implements ReputationEventHandler public boolean isSensitiveToWater() { return this.level.purpurConfig.villagerTakeDamageFromWater; } diff --git a/patches/server/0240-Potion-NamespacedKey.patch b/patches/server/0241-Potion-NamespacedKey.patch similarity index 100% rename from patches/server/0240-Potion-NamespacedKey.patch rename to patches/server/0241-Potion-NamespacedKey.patch diff --git a/patches/server/0241-Grindstone-API.patch b/patches/server/0242-Grindstone-API.patch similarity index 100% rename from patches/server/0241-Grindstone-API.patch rename to patches/server/0242-Grindstone-API.patch diff --git a/patches/server/0242-Option-to-prevent-spiders-from-climbing-world-border.patch b/patches/server/0243-Option-to-prevent-spiders-from-climbing-world-border.patch similarity index 93% rename from patches/server/0242-Option-to-prevent-spiders-from-climbing-world-border.patch rename to patches/server/0243-Option-to-prevent-spiders-from-climbing-world-border.patch index e1d2740b1..1e6eba171 100644 --- a/patches/server/0242-Option-to-prevent-spiders-from-climbing-world-border.patch +++ b/patches/server/0243-Option-to-prevent-spiders-from-climbing-world-border.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Option to prevent spiders from climbing world border diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java -index 1c59160a9848d3580b8075100a49bc854e9a43da..53d0ccf95a6e07a00918f05ddaeeca699737d2eb 100644 +index 0397a5ef8ae2ec074d97055879d46d8e72496da8..fb44bbf972a2b558c8dd04be429ab4cb969cf73e 100644 --- a/src/main/java/net/minecraft/world/entity/Entity.java +++ b/src/main/java/net/minecraft/world/entity/Entity.java @@ -299,6 +299,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { @@ -16,7 +16,7 @@ index 1c59160a9848d3580b8075100a49bc854e9a43da..53d0ccf95a6e07a00918f05ddaeeca69 public boolean hurtMarked; protected Vec3 stuckSpeedMultiplier; @Nullable -@@ -1377,7 +1378,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { +@@ -1410,7 +1411,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { io.papermc.paper.util.CollisionUtil.getCollisions(world, this, collisionBox, potentialCollisions, false, true, false, false, null, null); @@ -26,7 +26,7 @@ index 1c59160a9848d3580b8075100a49bc854e9a43da..53d0ccf95a6e07a00918f05ddaeeca69 } diff --git a/src/main/java/net/minecraft/world/entity/monster/Spider.java b/src/main/java/net/minecraft/world/entity/monster/Spider.java -index 194b6a976e032ddf3e4cbdffdd68dbb9a48ec720..644df87ec14394678eb00ea6b36305db9190d5dd 100644 +index bdd4fc3072f7a5ea504ba35f6a08ae971e83b69f..b9ac8cefefe1f47548166330b7c889dfbc05e583 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Spider.java +++ b/src/main/java/net/minecraft/world/entity/monster/Spider.java @@ -118,7 +118,7 @@ public class Spider extends Monster { diff --git a/patches/server/0243-Ability-for-hoe-to-replant-crops-and-nether-warts.patch b/patches/server/0244-Ability-for-hoe-to-replant-crops-and-nether-warts.patch similarity index 100% rename from patches/server/0243-Ability-for-hoe-to-replant-crops-and-nether-warts.patch rename to patches/server/0244-Ability-for-hoe-to-replant-crops-and-nether-warts.patch diff --git a/patches/server/0244-Shearing-jeb-produces-random-color-wool.patch b/patches/server/0245-Shearing-jeb-produces-random-color-wool.patch similarity index 100% rename from patches/server/0244-Shearing-jeb-produces-random-color-wool.patch rename to patches/server/0245-Shearing-jeb-produces-random-color-wool.patch diff --git a/patches/server/0245-Turtle-eggs-random-tick-crack-chance.patch b/patches/server/0246-Turtle-eggs-random-tick-crack-chance.patch similarity index 100% rename from patches/server/0245-Turtle-eggs-random-tick-crack-chance.patch rename to patches/server/0246-Turtle-eggs-random-tick-crack-chance.patch diff --git a/patches/server/0246-Mob-head-visibility-percent.patch b/patches/server/0247-Mob-head-visibility-percent.patch similarity index 96% rename from patches/server/0246-Mob-head-visibility-percent.patch rename to patches/server/0247-Mob-head-visibility-percent.patch index 1bc84e455..f8c4ada5f 100644 --- a/patches/server/0246-Mob-head-visibility-percent.patch +++ b/patches/server/0247-Mob-head-visibility-percent.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Mob head visibility percent diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java -index 18bff5cbbb4da87ea6d905402ac2494cd4778dcd..1919ae2551e29249fa3e6c85b5ed842540bbbded 100644 +index 6e7af1939df4ff99d6d4645f7ed270110d9d0373..d120c8808c6a8df2c8615fe02f2c8a5b6a126d8e 100644 --- a/src/main/java/net/minecraft/world/entity/LivingEntity.java +++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java -@@ -1017,9 +1017,17 @@ public abstract class LivingEntity extends Entity { +@@ -1015,9 +1015,17 @@ public abstract class LivingEntity extends Entity { ItemStack itemstack = this.getItemBySlot(EquipmentSlot.HEAD); EntityType entitytypes = entity.getType(); diff --git a/patches/server/0247-Configurable-valid-characters-for-usernames.patch b/patches/server/0248-Configurable-valid-characters-for-usernames.patch similarity index 95% rename from patches/server/0247-Configurable-valid-characters-for-usernames.patch rename to patches/server/0248-Configurable-valid-characters-for-usernames.patch index df0cec64c..7388974d5 100644 --- a/patches/server/0247-Configurable-valid-characters-for-usernames.patch +++ b/patches/server/0248-Configurable-valid-characters-for-usernames.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Configurable valid characters for usernames diff --git a/src/main/java/net/minecraft/server/network/ServerLoginPacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerLoginPacketListenerImpl.java -index a62825d8f8c79ac15183b7b1eb9ba0c5e9a1fc6e..22b1836931e63a626ee12cb2b9c6db01daabf93e 100644 +index 940d201f0df9ac1b5628a5fa09294e83db5ddc0e..59647ca64997bf81f575acca692c6ad6772a4612 100644 --- a/src/main/java/net/minecraft/server/network/ServerLoginPacketListenerImpl.java +++ b/src/main/java/net/minecraft/server/network/ServerLoginPacketListenerImpl.java @@ -269,6 +269,8 @@ public class ServerLoginPacketListenerImpl implements ServerLoginPacketListener diff --git a/patches/server/0248-Shears-can-have-looting-enchantment.patch b/patches/server/0249-Shears-can-have-looting-enchantment.patch similarity index 100% rename from patches/server/0248-Shears-can-have-looting-enchantment.patch rename to patches/server/0249-Shears-can-have-looting-enchantment.patch diff --git a/patches/server/0249-Stop-bees-from-dying-after-stinging.patch b/patches/server/0250-Stop-bees-from-dying-after-stinging.patch similarity index 100% rename from patches/server/0249-Stop-bees-from-dying-after-stinging.patch rename to patches/server/0250-Stop-bees-from-dying-after-stinging.patch diff --git a/patches/server/0250-Give-bee-counts-in-beehives-to-Purpur-clients.patch b/patches/server/0251-Give-bee-counts-in-beehives-to-Purpur-clients.patch similarity index 91% rename from patches/server/0250-Give-bee-counts-in-beehives-to-Purpur-clients.patch rename to patches/server/0251-Give-bee-counts-in-beehives-to-Purpur-clients.patch index 4e9e0756c..1fe42d368 100644 --- a/patches/server/0250-Give-bee-counts-in-beehives-to-Purpur-clients.patch +++ b/patches/server/0251-Give-bee-counts-in-beehives-to-Purpur-clients.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Give bee counts in beehives to Purpur clients diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java -index ccab594285628af829e556d41ec34846d689f186..a76a3df1c4c9c804a24c4337fc499515b2c3e3cf 100644 +index 39e3d848a1c5955d4de25d91eff427595c131e25..aef3a977a74255b5a81af608ac7e3dd9d3a583b7 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java -@@ -1054,6 +1054,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop playersInRange = reducedRange ? playerchunk.playersInMobSpawnRange : playerchunk.playersInChunkTickRange; -diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java -index a6bd9ced7805d4c0f0185feca2afe87e198b6f98..bd2b4cbb3286ef72e40a8089aa41230826203959 100644 ---- a/src/main/java/net/minecraft/world/entity/Entity.java -+++ b/src/main/java/net/minecraft/world/entity/Entity.java -@@ -286,7 +286,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { - public double yo; - public double zo; - private Vec3 position; -- private BlockPos blockPosition; -+ public BlockPos blockPosition; // Purpur - private->public - private ChunkPos chunkPosition; - private Vec3 deltaMovement; - public float yRot; // Paper - private->public diff --git a/src/main/java/net/minecraft/world/entity/ai/goal/EatBlockGoal.java b/src/main/java/net/minecraft/world/entity/ai/goal/EatBlockGoal.java index 3a633f369af8005de3c06cfa715a42e3b248b2f0..a7b878f97128e530c5b47873dd226490d471406b 100644 --- a/src/main/java/net/minecraft/world/entity/ai/goal/EatBlockGoal.java diff --git a/patches/server/0255-Configurable-phantom-size.patch b/patches/server/0256-Configurable-phantom-size.patch similarity index 96% rename from patches/server/0255-Configurable-phantom-size.patch rename to patches/server/0256-Configurable-phantom-size.patch index 1b723e047..26585729f 100644 --- a/patches/server/0255-Configurable-phantom-size.patch +++ b/patches/server/0256-Configurable-phantom-size.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Configurable phantom size 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 bc5d6300c2e5f6cf8fbad73096e8a6e5d279a873..0200766dbfefa31acbf8f017792bf908a048e59f 100644 +index 33b347474b7485633ca77bdff28e4b32580b51b8..bfca1101025e473c97cd4804e74bed04725a7792 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Phantom.java +++ b/src/main/java/net/minecraft/world/entity/monster/Phantom.java @@ -272,7 +272,11 @@ public class Phantom extends FlyingMob implements Enemy { diff --git a/patches/server/0256-Configurable-food-attributes.patch b/patches/server/0257-Configurable-food-attributes.patch similarity index 100% rename from patches/server/0256-Configurable-food-attributes.patch rename to patches/server/0257-Configurable-food-attributes.patch diff --git a/patches/server/0257-Max-joins-per-second.patch b/patches/server/0258-Max-joins-per-second.patch similarity index 100% rename from patches/server/0257-Max-joins-per-second.patch rename to patches/server/0258-Max-joins-per-second.patch diff --git a/patches/server/0258-Configurable-minimum-demand-for-trades.patch b/patches/server/0259-Configurable-minimum-demand-for-trades.patch similarity index 95% rename from patches/server/0258-Configurable-minimum-demand-for-trades.patch rename to patches/server/0259-Configurable-minimum-demand-for-trades.patch index 8ef3953e6..63fbb0eba 100644 --- a/patches/server/0258-Configurable-minimum-demand-for-trades.patch +++ b/patches/server/0259-Configurable-minimum-demand-for-trades.patch @@ -9,10 +9,10 @@ This patch adds a config option to allow the minimum demand to instead be configurable. 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 05fb8c7f968b736c8430ab2ea56900c14485b10b..69ed8f31be96c438ed61416f566f41f0cce64cba 100644 +index b0674eeea341a725ed774c5de040fe173a6fb833..c985f302812be364c07866727c9d2c2714bec249 100644 --- a/src/main/java/net/minecraft/world/entity/npc/Villager.java +++ b/src/main/java/net/minecraft/world/entity/npc/Villager.java -@@ -527,7 +527,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler +@@ -534,7 +534,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler while (iterator.hasNext()) { MerchantOffer merchantrecipe = (MerchantOffer) iterator.next(); diff --git a/patches/server/0259-Lobotomize-stuck-villagers.patch b/patches/server/0260-Lobotomize-stuck-villagers.patch similarity index 86% rename from patches/server/0259-Lobotomize-stuck-villagers.patch rename to patches/server/0260-Lobotomize-stuck-villagers.patch index 592179c51..e385cde26 100644 --- a/patches/server/0259-Lobotomize-stuck-villagers.patch +++ b/patches/server/0260-Lobotomize-stuck-villagers.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Lobotomize stuck villagers 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 69ed8f31be96c438ed61416f566f41f0cce64cba..715003af5363d3163d78871ff360a142be66f037 100644 +index c985f302812be364c07866727c9d2c2714bec249..9951509d1f9bd7266ad8eb17de57d1c9ba0cc512 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 @@ -15,9 +15,9 @@ index 69ed8f31be96c438ed61416f566f41f0cce64cba..715003af5363d3163d78871ff360a142 + private boolean isLobotomized = false; public boolean isLobotomized() { return this.isLobotomized; } // Purpur + private int notLobotomizedCount = 0; // Purpur - public Villager(EntityType entityType, Level world) { - this(entityType, world, VillagerType.PLAINS); -@@ -196,6 +198,47 @@ public class Villager extends AbstractVillager implements ReputationEventHandler + public long nextGolemPanic = -1; // Pufferfish + +@@ -198,6 +200,47 @@ public class Villager extends AbstractVillager implements ReputationEventHandler protected boolean isAlwaysExperienceDropper() { return this.level.purpurConfig.villagerAlwaysDropExp; } @@ -46,7 +46,7 @@ index 69ed8f31be96c438ed61416f566f41f0cce64cba..715003af5363d3163d78871ff360a142 + } + + private boolean canTravelTo(BlockPos pos) { -+ net.minecraft.world.level.block.state.BlockState state = this.level.getBlockStateIfLoaded(pos); ++ BlockState state = this.level.getBlockStateIfLoaded(pos); + if (state == null) { + // chunk not loaded + return false; @@ -65,10 +65,11 @@ index 69ed8f31be96c438ed61416f566f41f0cce64cba..715003af5363d3163d78871ff360a142 // Purpur end @Override -@@ -293,11 +336,25 @@ public class Villager extends AbstractVillager implements ReputationEventHandler +@@ -295,6 +338,15 @@ public class Villager extends AbstractVillager implements ReputationEventHandler + protected void customServerAiStep() { mobTick(false); } protected void mobTick(boolean inactive) { this.level.getProfiler().push("villagerBrain"); - // Purpur start ++ // Purpur start + if (this.level.purpurConfig.villagerLobotomizeEnabled) { + // treat as inactive if lobotomized + inactive = inactive || checkLobotomized(); @@ -76,12 +77,14 @@ index 69ed8f31be96c438ed61416f566f41f0cce64cba..715003af5363d3163d78871ff360a142 + // clean up state for API + this.isLobotomized = false; + } -+ - boolean tick = (level.getGameTime() + brainTickOffset) % level.purpurConfig.villagerBrainTicks == 0; - if (((ServerLevel) level).getServer().lagging ? tick : level.purpurConfig.villagerUseBrainTicksOnlyWhenLagging || tick) - // Purpur end - if (getRider() == null || !this.isControllable())// Purpur - only use brain if no rider - if (!inactive) this.getBrain().tick((ServerLevel) this.level, this); // Paper ++ // Purpur end + // Pufferfish start + if (!inactive) { + // Purpur start +@@ -305,6 +357,12 @@ public class Villager extends AbstractVillager implements ReputationEventHandler + 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/0260-Option-for-villager-display-trade-item.patch b/patches/server/0261-Option-for-villager-display-trade-item.patch similarity index 100% rename from patches/server/0260-Option-for-villager-display-trade-item.patch rename to patches/server/0261-Option-for-villager-display-trade-item.patch diff --git a/patches/server/0261-Fill-command-max-area-option.patch b/patches/server/0262-Fill-command-max-area-option.patch similarity index 100% rename from patches/server/0261-Fill-command-max-area-option.patch rename to patches/server/0262-Fill-command-max-area-option.patch diff --git a/patches/server/0262-MC-238526-Fix-spawner-not-spawning-water-animals-cor.patch b/patches/server/0263-MC-238526-Fix-spawner-not-spawning-water-animals-cor.patch similarity index 100% rename from patches/server/0262-MC-238526-Fix-spawner-not-spawning-water-animals-cor.patch rename to patches/server/0263-MC-238526-Fix-spawner-not-spawning-water-animals-cor.patch diff --git a/patches/server/0263-Config-for-mob-last-hurt-by-player-time.patch b/patches/server/0264-Config-for-mob-last-hurt-by-player-time.patch similarity index 93% rename from patches/server/0263-Config-for-mob-last-hurt-by-player-time.patch rename to patches/server/0264-Config-for-mob-last-hurt-by-player-time.patch index ff73fd513..d70675843 100644 --- a/patches/server/0263-Config-for-mob-last-hurt-by-player-time.patch +++ b/patches/server/0264-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 1919ae2551e29249fa3e6c85b5ed842540bbbded..4050734e4aaf8eec15080c9c6fe62802cc3d944c 100644 +index d120c8808c6a8df2c8615fe02f2c8a5b6a126d8e..ebc92079fa9434689c30782000950842929d6102 100644 --- a/src/main/java/net/minecraft/world/entity/LivingEntity.java +++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java -@@ -1434,13 +1434,13 @@ public abstract class LivingEntity extends Entity { +@@ -1441,13 +1441,13 @@ public abstract class LivingEntity extends Entity { } if (entity1 instanceof net.minecraft.world.entity.player.Player) { @@ -25,7 +25,7 @@ index 1919ae2551e29249fa3e6c85b5ed842540bbbded..4050734e4aaf8eec15080c9c6fe62802 if (entityliving != null && entityliving.getType() == EntityType.PLAYER) { diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java -index 7534889c4169cbd26f7e778cbd3be49bd2640c83..ca767d5a8ecb1d0c41ed149fd77eb2f49221c919 100644 +index 1e854090c986f480e35fac5c6f347e72904f9ab5..76a4803decea19f8bed8cb11e73bd7895675a3f4 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java @@ -425,7 +425,7 @@ public class CraftLivingEntity extends CraftEntity implements LivingEntity { diff --git a/patches/server/0264-Anvil-repair-damage-options.patch b/patches/server/0265-Anvil-repair-damage-options.patch similarity index 100% rename from patches/server/0264-Anvil-repair-damage-options.patch rename to patches/server/0265-Anvil-repair-damage-options.patch diff --git a/patches/server/0265-Fix-legacy-colors-in-console.patch b/patches/server/0266-Fix-legacy-colors-in-console.patch similarity index 97% rename from patches/server/0265-Fix-legacy-colors-in-console.patch rename to patches/server/0266-Fix-legacy-colors-in-console.patch index a36c5c519..47c2395c7 100644 --- a/patches/server/0265-Fix-legacy-colors-in-console.patch +++ b/patches/server/0266-Fix-legacy-colors-in-console.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Fix legacy colors in console diff --git a/src/main/java/io/papermc/paper/console/HexFormattingConverter.java b/src/main/java/io/papermc/paper/console/HexFormattingConverter.java -index ea83ee8762c126c449993a7497257b0bd8663452..ecd3da582fe9f77f39f920029f5121c6d8099525 100644 +index f39ae450e316255d315aeb362bf967eadef6ba23..489dc33154bebd70b31480807f104e15e97f4f2c 100644 --- a/src/main/java/io/papermc/paper/console/HexFormattingConverter.java +++ b/src/main/java/io/papermc/paper/console/HexFormattingConverter.java @@ -38,6 +38,7 @@ public final class HexFormattingConverter extends LogEventPatternConverter { diff --git a/patches/server/0266-Option-to-disable-turtle-egg-trampling-with-feather-.patch b/patches/server/0267-Option-to-disable-turtle-egg-trampling-with-feather-.patch similarity index 100% rename from patches/server/0266-Option-to-disable-turtle-egg-trampling-with-feather-.patch rename to patches/server/0267-Option-to-disable-turtle-egg-trampling-with-feather-.patch diff --git a/patches/server/0267-Add-toggle-for-enchant-level-clamping.patch b/patches/server/0268-Add-toggle-for-enchant-level-clamping.patch similarity index 100% rename from patches/server/0267-Add-toggle-for-enchant-level-clamping.patch rename to patches/server/0268-Add-toggle-for-enchant-level-clamping.patch diff --git a/patches/server/0268-Config-to-prevent-horses-from-standing-when-hurt.patch b/patches/server/0269-Config-to-prevent-horses-from-standing-when-hurt.patch similarity index 96% rename from patches/server/0268-Config-to-prevent-horses-from-standing-when-hurt.patch rename to patches/server/0269-Config-to-prevent-horses-from-standing-when-hurt.patch index 659e1fb37..747b1ecea 100644 --- a/patches/server/0268-Config-to-prevent-horses-from-standing-when-hurt.patch +++ b/patches/server/0269-Config-to-prevent-horses-from-standing-when-hurt.patch @@ -8,7 +8,7 @@ Horses have a chance to stand when their hurt noise plays (i.e. when taking dama This patch adds an option to toggle this behaviour ('stand-when-hurt'). diff --git a/src/main/java/net/minecraft/world/entity/animal/horse/AbstractHorse.java b/src/main/java/net/minecraft/world/entity/animal/horse/AbstractHorse.java -index 36910e03941171cbfa3c61b2aff7535a2920ce24..b252d9a254aedcdd67169e793b08dc093fd4829c 100644 +index 7466c437b2e996f16a08aaefc5c2b7cba216a14c..205ce2bd91a98a0c67d3c5dd640eb88c052f9425 100644 --- a/src/main/java/net/minecraft/world/entity/animal/horse/AbstractHorse.java +++ b/src/main/java/net/minecraft/world/entity/animal/horse/AbstractHorse.java @@ -388,7 +388,7 @@ public abstract class AbstractHorse extends Animal implements ContainerListener, diff --git a/patches/server/0269-Drop-incompatible-tests.patch b/patches/server/0270-Drop-incompatible-tests.patch similarity index 100% rename from patches/server/0269-Drop-incompatible-tests.patch rename to patches/server/0270-Drop-incompatible-tests.patch diff --git a/patches/server/0270-Implement-configurable-search-radius-for-villagers-t.patch b/patches/server/0271-Implement-configurable-search-radius-for-villagers-t.patch similarity index 94% rename from patches/server/0270-Implement-configurable-search-radius-for-villagers-t.patch rename to patches/server/0271-Implement-configurable-search-radius-for-villagers-t.patch index 2b2302028..abaa2fe63 100644 --- a/patches/server/0270-Implement-configurable-search-radius-for-villagers-t.patch +++ b/patches/server/0271-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 715003af5363d3163d78871ff360a142be66f037..256e4d396c9fe0822f4006ef101f1a8f1fbd1d2a 100644 +index 9951509d1f9bd7266ad8eb17de57d1c9ba0cc512..c07886ca859a6c178901ac5c15953d686c5a9e16 100644 --- a/src/main/java/net/minecraft/world/entity/npc/Villager.java +++ b/src/main/java/net/minecraft/world/entity/npc/Villager.java -@@ -1067,6 +1067,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler +@@ -1075,6 +1075,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler } public void spawnGolemIfNeeded(ServerLevel world, long time, int requiredCount) { diff --git a/patches/server/0271-Stonecutter-damage.patch b/patches/server/0272-Stonecutter-damage.patch similarity index 100% rename from patches/server/0271-Stonecutter-damage.patch rename to patches/server/0272-Stonecutter-damage.patch diff --git a/patches/server/0272-Configurable-damage-settings-for-magma-blocks.patch b/patches/server/0273-Configurable-damage-settings-for-magma-blocks.patch similarity index 100% rename from patches/server/0272-Configurable-damage-settings-for-magma-blocks.patch rename to patches/server/0273-Configurable-damage-settings-for-magma-blocks.patch diff --git a/patches/server/0273-Add-config-for-snow-on-blue-ice.patch b/patches/server/0274-Add-config-for-snow-on-blue-ice.patch similarity index 100% rename from patches/server/0273-Add-config-for-snow-on-blue-ice.patch rename to patches/server/0274-Add-config-for-snow-on-blue-ice.patch