From a32448bda1fa2fd1d64fefc6ef9dd5fab82ce33e Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Sun, 8 Mar 2020 12:49:59 -0500 Subject: [PATCH] Merge in Tuinity patches --- current-paper | 2 +- patches/api/0002-Tuinity-API-Patches.patch | 113 + ...s.patch => 0003-Purpur-config-files.patch} | 2 +- ....patch => 0004-Host-our-own-timings.patch} | 4 +- ...004-Ridables.patch => 0005-Ridables.patch} | 2 +- ...ntless-annotations-and-deprecations.patch} | 2 +- ...ch => 0007-Allow-inventory-resizing.patch} | 2 +- ...API.patch => 0008-Implement-AFK-API.patch} | 6 +- ... => 0009-Add-EntityPortalReadyEvent.patch} | 2 +- ...PI.patch => 0010-Add-tick-times-API.patch} | 2 +- ...atch => 0011-Bring-back-server-name.patch} | 2 +- ...ement-LivingEntity-safeFallDistance.patch} | 2 +- ...tch => 0013-Add-ExecuteCommandEvent.patch} | 2 +- ...> 0014-Implement-ChunkTooLargeEvent.patch} | 2 +- ...=> 0015-Implement-lagging-threshold.patch} | 2 +- ...h => 0016-Advancement-API-Additions.patch} | 2 +- ...Implement-ItemFactory-getMonsterEgg.patch} | 2 +- ...nt-PlayerSetSpawnerTypeWithEggEvent.patch} | 2 +- ...ch => 0019-Add-MonsterEggSpawnEvent.patch} | 2 +- ...tch => 0020-Add-ThrownEggHatchEvent.patch} | 2 +- ...PI.patch => 0021-Add-moon-phase-API.patch} | 6 +- ...22-Add-API-for-Villager-resetOffers.patch} | 2 +- ...023-Expose-getItemStack-for-Trident.patch} | 2 +- ...PI.patch => 0024-Add-more-llama-API.patch} | 2 +- ...I.patch => 0025-Add-more-evoker-API.patch} | 2 +- ...-Add-getPlacementBlockData-to-World.patch} | 6 +- ...PickupItemAnimation-to-LivingEntity.patch} | 2 +- ...getPlayer-to-SkeletonHorseTrapEvent.patch} | 2 +- ...Add-LootableInventoryFirstFillEvent.patch} | 2 +- ...tyCreatePortalEvent-for-EnderDragon.patch} | 2 +- ...h => 0031-Implement-EntityMoveEvent.patch} | 2 +- .../server/0002-Tuinity-Server-Patches.patch | 10280 ++++++++++++++++ ...s.patch => 0003-Purpur-config-files.patch} | 53 +- ...fixes.patch => 0004-decompile-fixes.patch} | 168 +- ....patch => 0005-Host-our-own-timings.patch} | 4 +- ...005-Ridables.patch => 0006-Ridables.patch} | 210 +- ...settings-suppressing-pointless-logs.patch} | 10 +- ...> 0008-Disable-outdated-build-check.patch} | 6 +- ... 0009-Add-obfhelpers-for-plugin-use.patch} | 8 +- ...s.patch => 0010-Silk-touch-spawners.patch} | 8 +- ...nts-AI.patch => 0011-Give-giants-AI.patch} | 12 +- ...tch => 0012-Illusioners-AI-settings.patch} | 6 +- ...> 0013-Zombie-horse-naturally-spawn.patch} | 8 +- ...014-Charged-creeper-naturally-spawn.patch} | 6 +- ...it-naturally-spawn-toast-and-killer.patch} | 6 +- ....patch => 0016-Cat-spawning-options.patch} | 6 +- ...ck-cat-types-spawning-in-swamp-huts.patch} | 4 +- ...ms.patch => 0018-Cows-eat-mushrooms.patch} | 14 +- ...ow-rotation-when-shearing-mooshroom.patch} | 4 +- ...patch => 0020-Pigs-give-saddle-back.patch} | 6 +- ...ms-do-not-spawn-on-creative-players.patch} | 6 +- ...022-Phantoms-only-attack-insomniacs.patch} | 8 +- ...d-to-crystals-and-crystals-shoot-ph.patch} | 18 +- ...4-Snowman-drop-and-put-back-pumpkin.patch} | 6 +- ...> 0025-Ender-dragon-always-drop-egg.patch} | 6 +- ...6-Ender-dragon-always-drop-full-exp.patch} | 6 +- ... 0027-Signs-editable-on-right-click.patch} | 8 +- ...er-showing-in-ping-before-server-fu.patch} | 4 +- ...e-egg-block-options-fixes-MC-168772.patch} | 6 +- ...patch => 0030-Make-Iron-Golems-Swim.patch} | 6 +- ...oisten-from-water-directly-under-it.patch} | 6 +- ...atch => 0032-Controllable-Minecarts.patch} | 12 +- ...tch => 0033-Signs-allow-color-codes.patch} | 12 +- ...=> 0034-Campfires-have-regen-effect.patch} | 12 +- ...ble-loot-drops-on-death-by-cramming.patch} | 6 +- ... => 0036-Campfires-burn-out-in-rain.patch} | 8 +- ...-Campfires-should-fall-with-gravity.patch} | 6 +- ...38-Dont-send-useless-entity-packets.patch} | 18 +- ... 0039-Fix-item-position-desync-MC-4.patch} | 20 +- ...limit-incoming-packets-from-players.patch} | 10 +- ...ch => 0041-Fix-pig-zombies-MC-56653.patch} | 6 +- ...API.patch => 0042-Implement-AFK-API.patch} | 53 +- ...tion-to-toggle-milk-curing-bad-omen.patch} | 6 +- ...-mends-most-damages-equipment-first.patch} | 10 +- ...atch => 0045-Tulips-change-fox-type.patch} | 8 +- ...d-limit-for-pillager-outpost-spawns.patch} | 6 +- ...r.patch => 0047-Make-the-GUI-better.patch} | 44 +- ...48-Players-should-not-cram-to-death.patch} | 6 +- ... => 0049-Add-EntityPortalReadyEvent.patch} | 12 +- ...h => 0050-Implement-elytra-settings.patch} | 14 +- ...PI.patch => 0051-Add-tick-times-API.patch} | 8 +- ...Add-blacklist-option-for-grindstone.patch} | 8 +- ...=> 0053-Implement-lagging-threshold.patch} | 10 +- ...t-configurable-villager-brain-ticks.patch} | 6 +- ...-for-zombies-targetting-turtle-eggs.patch} | 6 +- ...56-Implement-bamboo-growth-settings.patch} | 6 +- ...should-not-bypass-cramming-gamerule.patch} | 24 +- ...0058-Option-for-slimes-not-pushable.patch} | 8 +- ...atch => 0059-Bring-back-server-name.patch} | 8 +- ...spenser-curse-of-binding-protection.patch} | 10 +- ...ement-LivingEntity-safeFallDistance.patch} | 10 +- ...-for-boats-to-eject-players-on-land.patch} | 6 +- ...h => 0063-Advancement-API-Additions.patch} | 14 +- ...ption-to-set-armorstand-step-height.patch} | 6 +- ...Implement-ItemFactory-getMonsterEgg.patch} | 6 +- ...0066-Alternative-Keepalive-Handling.patch} | 8 +- ...nt-PlayerSetSpawnerTypeWithEggEvent.patch} | 4 +- ...ch => 0068-Add-MonsterEggSpawnEvent.patch} | 4 +- ...PI.patch => 0069-Add-moon-phase-API.patch} | 6 +- ...-Add-getPlacementBlockData-to-World.patch} | 12 +- ...s.patch => 0071-Barrels-have-6-rows.patch} | 10 +- ...ch => 0072-Ender-chests-have-6-rows.patch} | 12 +- ...073-Add-5-second-tps-average-in-tps.patch} | 10 +- ...o-allow-iron-golems-to-spawn-in-air.patch} | 6 +- ...-permissions-for-players-on-world-c.patch} | 6 +- ...PickupItemAnimation-to-LivingEntity.patch} | 4 +- ...I.patch => 0077-Add-more-evoker-API.patch} | 6 +- ...78-Add-API-for-Villager-resetOffers.patch} | 6 +- ...PI.patch => 0079-Add-more-llama-API.patch} | 8 +- ...speed-multiplier-using-values-betwe.patch} | 4 +- ...tch => 0081-Implement-infinite-lava.patch} | 10 +- ...082-Expose-getItemStack-for-Trident.patch} | 6 +- ...=> 0083-Despawn-egg-hatches-chicken.patch} | 6 +- ...eEvent-not-firing-for-all-use-cases.patch} | 10 +- ...ons.patch => 0085-Add-sleep-options.patch} | 6 +- ...86-Option-for-hay-block-fall-damage.patch} | 6 +- ...getPlayer-to-SkeletonHorseTrapEvent.patch} | 4 +- ...Add-LootableInventoryFirstFillEvent.patch} | 6 +- ...089-Villagers-follow-emerald-blocks.patch} | 10 +- ...dd-player-death-exp-control-options.patch} | 6 +- ... 0091-Add-permission-for-F3-N-debug.patch} | 4 +- ...ch => 0092-Allow-leashing-villagers.patch} | 12 +- ...rable-search-radius-for-villagers-t.patch} | 6 +- ...mbie-villager-transformation-chance.patch} | 6 +- ...5-Make-lava-flow-speed-configurable.patch} | 8 +- ...skeleton-takes-wither-damage-option.patch} | 6 +- ...> 0097-UPnP-Port-Forwarding-Service.patch} | 18 +- ...h => 0098-Implement-EntityMoveEvent.patch} | 4 +- ...-disable-saving-projectiles-to-disk.patch} | 8 +- ...arrow-despawn-counter-fixes-MC-1257.patch} | 4 +- ...101-Implement-bed-explosion-options.patch} | 6 +- ...tch => 0102-Add-item-entity-options.patch} | 10 +- ...tural-spawns-per-biome-configurable.patch} | 158 +- ...104-Configurable-void-damage-height.patch} | 8 +- .../server/0104-Optimize-Chunk-Ticks.patch | 546 - ...tch => 0105-Optimise-Chunk-getFluid.patch} | 8 +- ...educe-entity-tracker-updates-on-move.patch | 218 - ...106-Fix-the-dead-lagging-the-server.patch} | 6 +- ...-Optimize-entity-pathfinder-selector.patch | 344 - .../server/0109-Optimize-Pathfinding.patch | 59 - 140 files changed, 11159 insertions(+), 1947 deletions(-) create mode 100644 patches/api/0002-Tuinity-API-Patches.patch rename patches/api/{0002-Purpur-config-files.patch => 0003-Purpur-config-files.patch} (93%) rename patches/api/{0003-Host-our-own-timings.patch => 0004-Host-our-own-timings.patch} (94%) rename patches/api/{0004-Ridables.patch => 0005-Ridables.patch} (97%) rename patches/api/{0005-Remove-pointless-annotations-and-deprecations.patch => 0006-Remove-pointless-annotations-and-deprecations.patch} (99%) rename patches/api/{0006-Allow-inventory-resizing.patch => 0007-Allow-inventory-resizing.patch} (94%) rename patches/api/{0007-Implement-AFK-API.patch => 0008-Implement-AFK-API.patch} (95%) rename patches/api/{0008-Add-EntityPortalReadyEvent.patch => 0009-Add-EntityPortalReadyEvent.patch} (96%) rename patches/api/{0009-Add-tick-times-API.patch => 0010-Add-tick-times-API.patch} (96%) rename patches/api/{0010-Bring-back-server-name.patch => 0011-Bring-back-server-name.patch} (95%) rename patches/api/{0011-Implement-LivingEntity-safeFallDistance.patch => 0012-Implement-LivingEntity-safeFallDistance.patch} (94%) rename patches/api/{0012-Add-ExecuteCommandEvent.patch => 0013-Add-ExecuteCommandEvent.patch} (98%) rename patches/api/{0013-Implement-ChunkTooLargeEvent.patch => 0014-Implement-ChunkTooLargeEvent.patch} (98%) rename patches/api/{0014-Implement-lagging-threshold.patch => 0015-Implement-lagging-threshold.patch} (95%) rename patches/api/{0015-Advancement-API-Additions.patch => 0016-Advancement-API-Additions.patch} (98%) rename patches/api/{0016-Implement-ItemFactory-getMonsterEgg.patch => 0017-Implement-ItemFactory-getMonsterEgg.patch} (93%) rename patches/api/{0017-Implement-PlayerSetSpawnerTypeWithEggEvent.patch => 0018-Implement-PlayerSetSpawnerTypeWithEggEvent.patch} (97%) rename patches/api/{0018-Add-MonsterEggSpawnEvent.patch => 0019-Add-MonsterEggSpawnEvent.patch} (97%) rename patches/api/{0019-Add-ThrownEggHatchEvent.patch => 0020-Add-ThrownEggHatchEvent.patch} (98%) rename patches/api/{0020-Add-moon-phase-API.patch => 0021-Add-moon-phase-API.patch} (92%) rename patches/api/{0021-Add-API-for-Villager-resetOffers.patch => 0022-Add-API-for-Villager-resetOffers.patch} (93%) rename patches/api/{0022-Expose-getItemStack-for-Trident.patch => 0023-Expose-getItemStack-for-Trident.patch} (94%) rename patches/api/{0023-Add-more-llama-API.patch => 0024-Add-more-llama-API.patch} (98%) rename patches/api/{0024-Add-more-evoker-API.patch => 0025-Add-more-evoker-API.patch} (94%) rename patches/api/{0025-Add-getPlacementBlockData-to-World.patch => 0026-Add-getPlacementBlockData-to-World.patch} (85%) rename patches/api/{0026-Add-playPickupItemAnimation-to-LivingEntity.patch => 0027-Add-playPickupItemAnimation-to-LivingEntity.patch} (95%) rename patches/api/{0027-Add-getPlayer-to-SkeletonHorseTrapEvent.patch => 0028-Add-getPlayer-to-SkeletonHorseTrapEvent.patch} (97%) rename patches/api/{0028-Add-LootableInventoryFirstFillEvent.patch => 0029-Add-LootableInventoryFirstFillEvent.patch} (96%) rename patches/api/{0029-Add-back-EntityCreatePortalEvent-for-EnderDragon.patch => 0030-Add-back-EntityCreatePortalEvent-for-EnderDragon.patch} (96%) rename patches/api/{0030-Implement-EntityMoveEvent.patch => 0031-Implement-EntityMoveEvent.patch} (97%) create mode 100644 patches/server/0002-Tuinity-Server-Patches.patch rename patches/server/{0002-Purpur-config-files.patch => 0003-Purpur-config-files.patch} (96%) rename patches/server/{0003-decompile-fixes.patch => 0004-decompile-fixes.patch} (97%) rename patches/server/{0004-Host-our-own-timings.patch => 0005-Host-our-own-timings.patch} (88%) rename patches/server/{0005-Ridables.patch => 0006-Ridables.patch} (98%) rename patches/server/{0006-Logger-settings-suppressing-pointless-logs.patch => 0007-Logger-settings-suppressing-pointless-logs.patch} (95%) rename patches/server/{0007-Disable-outdated-build-check.patch => 0008-Disable-outdated-build-check.patch} (88%) rename patches/server/{0008-Add-obfhelpers-for-plugin-use.patch => 0009-Add-obfhelpers-for-plugin-use.patch} (93%) rename patches/server/{0009-Silk-touch-spawners.patch => 0010-Silk-touch-spawners.patch} (96%) rename patches/server/{0010-Give-giants-AI.patch => 0011-Give-giants-AI.patch} (95%) rename patches/server/{0011-Illusioners-AI-settings.patch => 0012-Illusioners-AI-settings.patch} (95%) rename patches/server/{0012-Zombie-horse-naturally-spawn.patch => 0013-Zombie-horse-naturally-spawn.patch} (94%) rename patches/server/{0013-Charged-creeper-naturally-spawn.patch => 0014-Charged-creeper-naturally-spawn.patch} (94%) rename patches/server/{0014-Rabbit-naturally-spawn-toast-and-killer.patch => 0015-Rabbit-naturally-spawn-toast-and-killer.patch} (95%) rename patches/server/{0015-Cat-spawning-options.patch => 0016-Cat-spawning-options.patch} (96%) rename patches/server/{0016-Fix-non-black-cat-types-spawning-in-swamp-huts.patch => 0017-Fix-non-black-cat-types-spawning-in-swamp-huts.patch} (92%) rename patches/server/{0017-Cows-eat-mushrooms.patch => 0018-Cows-eat-mushrooms.patch} (95%) rename patches/server/{0018-Fix-cow-rotation-when-shearing-mooshroom.patch => 0019-Fix-cow-rotation-when-shearing-mooshroom.patch} (93%) rename patches/server/{0019-Pigs-give-saddle-back.patch => 0020-Pigs-give-saddle-back.patch} (93%) rename patches/server/{0020-Phantoms-do-not-spawn-on-creative-players.patch => 0021-Phantoms-do-not-spawn-on-creative-players.patch} (94%) rename patches/server/{0021-Phantoms-only-attack-insomniacs.patch => 0022-Phantoms-only-attack-insomniacs.patch} (95%) rename patches/server/{0022-Phantoms-attracted-to-crystals-and-crystals-shoot-ph.patch => 0023-Phantoms-attracted-to-crystals-and-crystals-shoot-ph.patch} (97%) rename patches/server/{0023-Snowman-drop-and-put-back-pumpkin.patch => 0024-Snowman-drop-and-put-back-pumpkin.patch} (96%) rename patches/server/{0024-Ender-dragon-always-drop-egg.patch => 0025-Ender-dragon-always-drop-egg.patch} (95%) rename patches/server/{0025-Ender-dragon-always-drop-full-exp.patch => 0026-Ender-dragon-always-drop-full-exp.patch} (94%) rename patches/server/{0026-Signs-editable-on-right-click.patch => 0027-Signs-editable-on-right-click.patch} (94%) rename patches/server/{0027-Fix-outdated-server-showing-in-ping-before-server-fu.patch => 0028-Fix-outdated-server-showing-in-ping-before-server-fu.patch} (91%) rename patches/server/{0028-Add-turtle-egg-block-options-fixes-MC-168772.patch => 0029-Add-turtle-egg-block-options-fixes-MC-168772.patch} (95%) rename patches/server/{0029-Make-Iron-Golems-Swim.patch => 0030-Make-Iron-Golems-Swim.patch} (93%) rename patches/server/{0030-Allow-soil-to-moisten-from-water-directly-under-it.patch => 0031-Allow-soil-to-moisten-from-water-directly-under-it.patch} (95%) rename patches/server/{0031-Controllable-Minecarts.patch => 0032-Controllable-Minecarts.patch} (96%) rename patches/server/{0032-Signs-allow-color-codes.patch => 0033-Signs-allow-color-codes.patch} (94%) rename patches/server/{0033-Campfires-have-regen-effect.patch => 0034-Campfires-have-regen-effect.patch} (97%) rename patches/server/{0034-Disable-loot-drops-on-death-by-cramming.patch => 0035-Disable-loot-drops-on-death-by-cramming.patch} (95%) rename patches/server/{0035-Campfires-burn-out-in-rain.patch => 0036-Campfires-burn-out-in-rain.patch} (96%) rename patches/server/{0036-Campfires-should-fall-with-gravity.patch => 0037-Campfires-should-fall-with-gravity.patch} (97%) rename patches/server/{0037-Dont-send-useless-entity-packets.patch => 0038-Dont-send-useless-entity-packets.patch} (90%) rename patches/server/{0038-Fix-item-position-desync-MC-4.patch => 0039-Fix-item-position-desync-MC-4.patch} (80%) rename patches/server/{0039-Rate-limit-incoming-packets-from-players.patch => 0040-Rate-limit-incoming-packets-from-players.patch} (98%) rename patches/server/{0040-Fix-pig-zombies-MC-56653.patch => 0041-Fix-pig-zombies-MC-56653.patch} (95%) rename patches/server/{0041-Implement-AFK-API.patch => 0042-Implement-AFK-API.patch} (88%) rename patches/server/{0042-Option-to-toggle-milk-curing-bad-omen.patch => 0043-Option-to-toggle-milk-curing-bad-omen.patch} (94%) rename patches/server/{0043-Mending-mends-most-damages-equipment-first.patch => 0044-Mending-mends-most-damages-equipment-first.patch} (96%) rename patches/server/{0044-Tulips-change-fox-type.patch => 0045-Tulips-change-fox-type.patch} (96%) rename patches/server/{0045-Implement-a-hard-limit-for-pillager-outpost-spawns.patch => 0046-Implement-a-hard-limit-for-pillager-outpost-spawns.patch} (94%) rename patches/server/{0046-Make-the-GUI-better.patch => 0047-Make-the-GUI-better.patch} (98%) rename patches/server/{0047-Players-should-not-cram-to-death.patch => 0048-Players-should-not-cram-to-death.patch} (85%) rename patches/server/{0048-Add-EntityPortalReadyEvent.patch => 0049-Add-EntityPortalReadyEvent.patch} (96%) rename patches/server/{0049-Implement-elytra-settings.patch => 0050-Implement-elytra-settings.patch} (96%) rename patches/server/{0050-Add-tick-times-API.patch => 0051-Add-tick-times-API.patch} (92%) rename patches/server/{0051-Add-blacklist-option-for-grindstone.patch => 0052-Add-blacklist-option-for-grindstone.patch} (96%) rename patches/server/{0052-Implement-lagging-threshold.patch => 0053-Implement-lagging-threshold.patch} (92%) rename patches/server/{0053-Implement-configurable-villager-brain-ticks.patch => 0054-Implement-configurable-villager-brain-ticks.patch} (96%) rename patches/server/{0054-Add-option-for-zombies-targetting-turtle-eggs.patch => 0055-Add-option-for-zombies-targetting-turtle-eggs.patch} (94%) rename patches/server/{0055-Implement-bamboo-growth-settings.patch => 0056-Implement-bamboo-growth-settings.patch} (97%) rename patches/server/{0056-Ladders-should-not-bypass-cramming-gamerule.patch => 0057-Ladders-should-not-bypass-cramming-gamerule.patch} (94%) rename patches/server/{0057-Option-for-slimes-not-pushable.patch => 0058-Option-for-slimes-not-pushable.patch} (94%) rename patches/server/{0058-Bring-back-server-name.patch => 0059-Bring-back-server-name.patch} (89%) rename patches/server/{0059-Dispenser-curse-of-binding-protection.patch => 0060-Dispenser-curse-of-binding-protection.patch} (93%) rename patches/server/{0060-Implement-LivingEntity-safeFallDistance.patch => 0061-Implement-LivingEntity-safeFallDistance.patch} (94%) rename patches/server/{0061-Add-option-for-boats-to-eject-players-on-land.patch => 0062-Add-option-for-boats-to-eject-players-on-land.patch} (94%) rename patches/server/{0062-Advancement-API-Additions.patch => 0063-Advancement-API-Additions.patch} (96%) rename patches/server/{0063-Add-option-to-set-armorstand-step-height.patch => 0064-Add-option-to-set-armorstand-step-height.patch} (95%) rename patches/server/{0064-Implement-ItemFactory-getMonsterEgg.patch => 0065-Implement-ItemFactory-getMonsterEgg.patch} (94%) rename patches/server/{0065-Alternative-Keepalive-Handling.patch => 0066-Alternative-Keepalive-Handling.patch} (96%) rename patches/server/{0066-Implement-PlayerSetSpawnerTypeWithEggEvent.patch => 0067-Implement-PlayerSetSpawnerTypeWithEggEvent.patch} (95%) rename patches/server/{0067-Add-MonsterEggSpawnEvent.patch => 0068-Add-MonsterEggSpawnEvent.patch} (97%) rename patches/server/{0068-Add-moon-phase-API.patch => 0069-Add-moon-phase-API.patch} (84%) rename patches/server/{0069-Add-getPlacementBlockData-to-World.patch => 0070-Add-getPlacementBlockData-to-World.patch} (93%) rename patches/server/{0070-Barrels-have-6-rows.patch => 0071-Barrels-have-6-rows.patch} (96%) rename patches/server/{0071-Ender-chests-have-6-rows.patch => 0072-Ender-chests-have-6-rows.patch} (95%) rename patches/server/{0072-Add-5-second-tps-average-in-tps.patch => 0073-Add-5-second-tps-average-in-tps.patch} (95%) rename patches/server/{0073-Add-option-to-allow-iron-golems-to-spawn-in-air.patch => 0074-Add-option-to-allow-iron-golems-to-spawn-in-air.patch} (94%) rename patches/server/{0074-Don-t-recalculate-permissions-for-players-on-world-c.patch => 0075-Don-t-recalculate-permissions-for-players-on-world-c.patch} (96%) rename patches/server/{0075-Add-playPickupItemAnimation-to-LivingEntity.patch => 0076-Add-playPickupItemAnimation-to-LivingEntity.patch} (90%) rename patches/server/{0076-Add-more-evoker-API.patch => 0077-Add-more-evoker-API.patch} (94%) rename patches/server/{0077-Add-API-for-Villager-resetOffers.patch => 0078-Add-API-for-Villager-resetOffers.patch} (93%) rename patches/server/{0078-Add-more-llama-API.patch => 0079-Add-more-llama-API.patch} (97%) rename patches/server/{0079-Fix-furnace-cook-speed-multiplier-using-values-betwe.patch => 0080-Fix-furnace-cook-speed-multiplier-using-values-betwe.patch} (93%) rename patches/server/{0080-Implement-infinite-lava.patch => 0081-Implement-infinite-lava.patch} (94%) rename patches/server/{0081-Expose-getItemStack-for-Trident.patch => 0082-Expose-getItemStack-for-Trident.patch} (91%) rename patches/server/{0082-Despawn-egg-hatches-chicken.patch => 0083-Despawn-egg-hatches-chicken.patch} (95%) rename patches/server/{0083-Fix-SpawnChangeEvent-not-firing-for-all-use-cases.patch => 0084-Fix-SpawnChangeEvent-not-firing-for-all-use-cases.patch} (89%) rename patches/server/{0084-Add-sleep-options.patch => 0085-Add-sleep-options.patch} (96%) rename patches/server/{0085-Option-for-hay-block-fall-damage.patch => 0086-Option-for-hay-block-fall-damage.patch} (91%) rename patches/server/{0086-Add-getPlayer-to-SkeletonHorseTrapEvent.patch => 0087-Add-getPlayer-to-SkeletonHorseTrapEvent.patch} (95%) rename patches/server/{0087-Add-LootableInventoryFirstFillEvent.patch => 0088-Add-LootableInventoryFirstFillEvent.patch} (94%) rename patches/server/{0088-Villagers-follow-emerald-blocks.patch => 0089-Villagers-follow-emerald-blocks.patch} (95%) rename patches/server/{0089-Add-player-death-exp-control-options.patch => 0090-Add-player-death-exp-control-options.patch} (96%) rename patches/server/{0090-Add-permission-for-F3-N-debug.patch => 0091-Add-permission-for-F3-N-debug.patch} (89%) rename patches/server/{0091-Allow-leashing-villagers.patch => 0092-Allow-leashing-villagers.patch} (94%) rename patches/server/{0092-Implement-configurable-search-radius-for-villagers-t.patch => 0093-Implement-configurable-search-radius-for-villagers-t.patch} (95%) rename patches/server/{0093-Add-option-for-zombie-villager-transformation-chance.patch => 0094-Add-option-for-zombie-villager-transformation-chance.patch} (95%) rename patches/server/{0094-Make-lava-flow-speed-configurable.patch => 0095-Make-lava-flow-speed-configurable.patch} (93%) rename patches/server/{0095-Add-wither-skeleton-takes-wither-damage-option.patch => 0096-Add-wither-skeleton-takes-wither-damage-option.patch} (94%) rename patches/server/{0096-UPnP-Port-Forwarding-Service.patch => 0097-UPnP-Port-Forwarding-Service.patch} (95%) rename patches/server/{0097-Implement-EntityMoveEvent.patch => 0098-Implement-EntityMoveEvent.patch} (94%) rename patches/server/{0098-Add-option-to-disable-saving-projectiles-to-disk.patch => 0099-Add-option-to-disable-saving-projectiles-to-disk.patch} (94%) rename patches/server/{0099-Always-increment-arrow-despawn-counter-fixes-MC-1257.patch => 0100-Always-increment-arrow-despawn-counter-fixes-MC-1257.patch} (95%) rename patches/server/{0100-Implement-bed-explosion-options.patch => 0101-Implement-bed-explosion-options.patch} (96%) rename patches/server/{0101-Add-item-entity-options.patch => 0102-Add-item-entity-options.patch} (96%) rename patches/server/{0102-Make-natural-spawns-per-biome-configurable.patch => 0103-Make-natural-spawns-per-biome-configurable.patch} (98%) rename patches/server/{0103-Configurable-void-damage-height.patch => 0104-Configurable-void-damage-height.patch} (91%) delete mode 100644 patches/server/0104-Optimize-Chunk-Ticks.patch rename patches/server/{0106-Optimise-Chunk-getFluid.patch => 0105-Optimise-Chunk-getFluid.patch} (92%) delete mode 100644 patches/server/0105-Reduce-entity-tracker-updates-on-move.patch rename patches/server/{0107-Fix-the-dead-lagging-the-server.patch => 0106-Fix-the-dead-lagging-the-server.patch} (91%) delete mode 100644 patches/server/0108-Optimize-entity-pathfinder-selector.patch delete mode 100644 patches/server/0109-Optimize-Pathfinding.patch diff --git a/current-paper b/current-paper index 7a1ad87b2..0ef0c9b53 100644 --- a/current-paper +++ b/current-paper @@ -1 +1 @@ -1.15.2--9d13d07cc7a8ea9c980692890d7407bc20350c03 +1.15.2--14a713f6ad2e85105f0be4e3ddebef4e19d0c22e diff --git a/patches/api/0002-Tuinity-API-Patches.patch b/patches/api/0002-Tuinity-API-Patches.patch new file mode 100644 index 000000000..9f2ba9579 --- /dev/null +++ b/patches/api/0002-Tuinity-API-Patches.patch @@ -0,0 +1,113 @@ +From ac2da46e3db5951ece720838726cf5b0d8ceb7f2 Mon Sep 17 00:00:00 2001 +From: Spottedleaf +Date: Fri, 14 Dec 2018 21:52:29 -0800 +Subject: [PATCH] Tuinity API Patches + +--- + pom.xml | 8 ++++-- + src/main/java/org/bukkit/World.java | 28 +++++++++++++++++++++ + src/main/java/org/bukkit/entity/Player.java | 23 +++++++++++++++++ + 3 files changed, 57 insertions(+), 2 deletions(-) + +diff --git a/pom.xml b/pom.xml +index 58a1f7d07..19d003fa8 100644 +--- a/pom.xml ++++ b/pom.xml +@@ -18,8 +18,8 @@ + + + +- 1.8 +- 1.8 ++ 11 ++ 11 + UTF-8 + + +@@ -154,6 +154,10 @@ + org.apache.maven.plugins + maven-compiler-plugin + 3.8.1 ++ ++ ++ true ++ + + + +diff --git a/src/main/java/org/bukkit/World.java b/src/main/java/org/bukkit/World.java +index 5047be15f..d9df7509a 100644 +--- a/src/main/java/org/bukkit/World.java ++++ b/src/main/java/org/bukkit/World.java +@@ -3067,6 +3067,34 @@ public interface World extends PluginMessageRecipient, Metadatable { + int getViewDistance(); + // Spigot end + ++ // Tuinity start - view distance api ++ /** ++ * Sets the view distance for this world. ++ * @param viewDistance view distance in [2, 32] ++ */ ++ void setViewDistance(int viewDistance); ++ ++ /** ++ * Returns the no-tick view distance for this world. ++ *

++ * No-tick view distance is the view distance where chunks will load, however the chunks and their entities will not ++ * be set to tick. ++ *

++ * @return The no-tick view distance for this world. ++ */ ++ int getNoTickViewDistance(); ++ ++ /** ++ * Sets the no-tick view distance for this world. ++ *

++ * No-tick view distance is the view distance where chunks will load, however the chunks and their entities will not ++ * be set to tick. ++ *

++ * @param viewDistance view distance in [2, 32] ++ */ ++ void setNoTickViewDistance(int viewDistance); ++ // Tuinity end - view distance api ++ + // Spigot start + public class Spigot { + +diff --git a/src/main/java/org/bukkit/entity/Player.java b/src/main/java/org/bukkit/entity/Player.java +index 877ea4f32..5367975ac 100644 +--- a/src/main/java/org/bukkit/entity/Player.java ++++ b/src/main/java/org/bukkit/entity/Player.java +@@ -1969,6 +1969,29 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM + void resetCooldown(); + // Paper end + ++ // Tuinity start ++ /** ++ * Returns the no-tick view distance for this player. ++ *

++ * No-tick view distance is the view distance where chunks will load, however the chunks and their entities will not ++ * be set to tick. ++ *

++ * @return The no-tick view distance for this player. ++ */ ++ int getNoTickViewDistance(); ++ ++ /** ++ * Sets the no-tick view distance for this player. Setting to a value of -1 will default to the world no-tick ++ * view distance. ++ *

++ * No-tick view distance is the view distance where chunks will load, however the chunks and their entities will not ++ * be set to tick. ++ *

++ * @param viewDistance view distance in [2, 32] or -1 ++ */ ++ void setNoTickViewDistance(int viewDistance); ++ // Tuinity end ++ + // Spigot start + public class Spigot extends Entity.Spigot { + +-- +2.24.0 + diff --git a/patches/api/0002-Purpur-config-files.patch b/patches/api/0003-Purpur-config-files.patch similarity index 93% rename from patches/api/0002-Purpur-config-files.patch rename to patches/api/0003-Purpur-config-files.patch index 4b84ef84c..4a627c53b 100644 --- a/patches/api/0002-Purpur-config-files.patch +++ b/patches/api/0003-Purpur-config-files.patch @@ -1,4 +1,4 @@ -From a5bf35da63687caa3e7bca2b719c2c4f279d5723 Mon Sep 17 00:00:00 2001 +From 2cab1732fb9596bf2c2b692f3f018dd51609596f Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Tue, 18 Feb 2020 20:30:03 -0600 Subject: [PATCH] Purpur config files diff --git a/patches/api/0003-Host-our-own-timings.patch b/patches/api/0004-Host-our-own-timings.patch similarity index 94% rename from patches/api/0003-Host-our-own-timings.patch rename to patches/api/0004-Host-our-own-timings.patch index 4b2f7ba08..5cee298d5 100644 --- a/patches/api/0003-Host-our-own-timings.patch +++ b/patches/api/0004-Host-our-own-timings.patch @@ -1,4 +1,4 @@ -From 8a1d326049c054417215c4323b06599aa1c5542b Mon Sep 17 00:00:00 2001 +From 31d3ec5ad187df9a8a60c212260a729abc029703 Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Tue, 18 Feb 2020 20:38:26 -0600 Subject: [PATCH] Host our own timings @@ -8,7 +8,7 @@ Subject: [PATCH] Host our own timings 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/co/aikar/timings/TimingsExport.java b/src/main/java/co/aikar/timings/TimingsExport.java -index 23eb8c65c..13f335997 100644 +index 93d5a3f97..a4ae730da 100644 --- a/src/main/java/co/aikar/timings/TimingsExport.java +++ b/src/main/java/co/aikar/timings/TimingsExport.java @@ -206,7 +206,8 @@ class TimingsExport extends Thread { diff --git a/patches/api/0004-Ridables.patch b/patches/api/0005-Ridables.patch similarity index 97% rename from patches/api/0004-Ridables.patch rename to patches/api/0005-Ridables.patch index 40afb4159..a28f59826 100644 --- a/patches/api/0004-Ridables.patch +++ b/patches/api/0005-Ridables.patch @@ -1,4 +1,4 @@ -From 2226788f01d043f4c3839259447f0bacb3c166fb Mon Sep 17 00:00:00 2001 +From d8696f7eef73586001263719c3c51525c2760d13 Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Sat, 4 May 2019 00:57:16 -0500 Subject: [PATCH] Ridables diff --git a/patches/api/0005-Remove-pointless-annotations-and-deprecations.patch b/patches/api/0006-Remove-pointless-annotations-and-deprecations.patch similarity index 99% rename from patches/api/0005-Remove-pointless-annotations-and-deprecations.patch rename to patches/api/0006-Remove-pointless-annotations-and-deprecations.patch index 94f7fa3e4..8e0f25405 100644 --- a/patches/api/0005-Remove-pointless-annotations-and-deprecations.patch +++ b/patches/api/0006-Remove-pointless-annotations-and-deprecations.patch @@ -1,4 +1,4 @@ -From 53631afe68d9acea33e6902859a2e3a39fe370b4 Mon Sep 17 00:00:00 2001 +From 88169f864dd54bc7ee722705785554377e745594 Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Tue, 31 Dec 2019 23:00:07 -0600 Subject: [PATCH] Remove pointless annotations and deprecations diff --git a/patches/api/0006-Allow-inventory-resizing.patch b/patches/api/0007-Allow-inventory-resizing.patch similarity index 94% rename from patches/api/0006-Allow-inventory-resizing.patch rename to patches/api/0007-Allow-inventory-resizing.patch index a8d213d51..177224b7f 100644 --- a/patches/api/0006-Allow-inventory-resizing.patch +++ b/patches/api/0007-Allow-inventory-resizing.patch @@ -1,4 +1,4 @@ -From fc6e3fdc54656b498d5bb9ae14fad4892ba50229 Mon Sep 17 00:00:00 2001 +From 3f163f0caeb3cbf242e1fc7a7d52905a36a52d72 Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Tue, 23 Jul 2019 06:50:55 -0500 Subject: [PATCH] Allow inventory resizing diff --git a/patches/api/0007-Implement-AFK-API.patch b/patches/api/0008-Implement-AFK-API.patch similarity index 95% rename from patches/api/0007-Implement-AFK-API.patch rename to patches/api/0008-Implement-AFK-API.patch index 596197e1f..f5d60684c 100644 --- a/patches/api/0007-Implement-AFK-API.patch +++ b/patches/api/0008-Implement-AFK-API.patch @@ -1,4 +1,4 @@ -From 2485a3cead97fe0e750fc0d9e91541d22e433593 Mon Sep 17 00:00:00 2001 +From a97b62ca22425cb2e180fe13b2e537905b240822 Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Sat, 10 Aug 2019 22:19:56 -0500 Subject: [PATCH] Implement AFK API @@ -86,10 +86,10 @@ index 000000000..4db334854 + } +} diff --git a/src/main/java/org/bukkit/entity/Player.java b/src/main/java/org/bukkit/entity/Player.java -index 877ea4f32..b9fe2a0fa 100644 +index 5367975ac..c7cba5046 100644 --- a/src/main/java/org/bukkit/entity/Player.java +++ b/src/main/java/org/bukkit/entity/Player.java -@@ -2067,4 +2067,25 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM +@@ -2090,4 +2090,25 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM @Override Spigot spigot(); // Spigot end diff --git a/patches/api/0008-Add-EntityPortalReadyEvent.patch b/patches/api/0009-Add-EntityPortalReadyEvent.patch similarity index 96% rename from patches/api/0008-Add-EntityPortalReadyEvent.patch rename to patches/api/0009-Add-EntityPortalReadyEvent.patch index d6772d6c9..e35b9c1dc 100644 --- a/patches/api/0008-Add-EntityPortalReadyEvent.patch +++ b/patches/api/0009-Add-EntityPortalReadyEvent.patch @@ -1,4 +1,4 @@ -From 5674b1e40686d33ce2ca4bf877784dadd9aec77f Mon Sep 17 00:00:00 2001 +From fb1b62df2e5107f2a3f0a8d3a99a48a6c711ed62 Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Sat, 11 Jan 2020 23:12:00 -0600 Subject: [PATCH] Add EntityPortalReadyEvent diff --git a/patches/api/0009-Add-tick-times-API.patch b/patches/api/0010-Add-tick-times-API.patch similarity index 96% rename from patches/api/0009-Add-tick-times-API.patch rename to patches/api/0010-Add-tick-times-API.patch index 9d9c767f8..49b41ea8e 100644 --- a/patches/api/0009-Add-tick-times-API.patch +++ b/patches/api/0010-Add-tick-times-API.patch @@ -1,4 +1,4 @@ -From 91cf9066559c224fe335daba79f4cad4a0aac81c Mon Sep 17 00:00:00 2001 +From edf1d2066b94a4e52c17e326ace3b64289ecee8b Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Thu, 30 Jan 2020 00:41:08 -0600 Subject: [PATCH] Add tick times API diff --git a/patches/api/0010-Bring-back-server-name.patch b/patches/api/0011-Bring-back-server-name.patch similarity index 95% rename from patches/api/0010-Bring-back-server-name.patch rename to patches/api/0011-Bring-back-server-name.patch index fcd70424a..cb9011d2d 100644 --- a/patches/api/0010-Bring-back-server-name.patch +++ b/patches/api/0011-Bring-back-server-name.patch @@ -1,4 +1,4 @@ -From ff8c9b346b116a2558a9c6499b600ce56c5f7904 Mon Sep 17 00:00:00 2001 +From 598786fbe7fa753987cb8593d89e16758f118fc6 Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Sun, 26 May 2019 15:18:40 -0500 Subject: [PATCH] Bring back server name diff --git a/patches/api/0011-Implement-LivingEntity-safeFallDistance.patch b/patches/api/0012-Implement-LivingEntity-safeFallDistance.patch similarity index 94% rename from patches/api/0011-Implement-LivingEntity-safeFallDistance.patch rename to patches/api/0012-Implement-LivingEntity-safeFallDistance.patch index cbdc77731..5caec5f4a 100644 --- a/patches/api/0011-Implement-LivingEntity-safeFallDistance.patch +++ b/patches/api/0012-Implement-LivingEntity-safeFallDistance.patch @@ -1,4 +1,4 @@ -From 1797a7519f80bf7356430fe1c8e9444942ba35db Mon Sep 17 00:00:00 2001 +From 778fce635a6e952ffde90f502fe471cc363913b3 Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Sun, 5 May 2019 12:58:19 -0500 Subject: [PATCH] Implement LivingEntity safeFallDistance diff --git a/patches/api/0012-Add-ExecuteCommandEvent.patch b/patches/api/0013-Add-ExecuteCommandEvent.patch similarity index 98% rename from patches/api/0012-Add-ExecuteCommandEvent.patch rename to patches/api/0013-Add-ExecuteCommandEvent.patch index 3ebd1a3f6..b5fb33e14 100644 --- a/patches/api/0012-Add-ExecuteCommandEvent.patch +++ b/patches/api/0013-Add-ExecuteCommandEvent.patch @@ -1,4 +1,4 @@ -From f142340af07c20e2e48954e21d0395563028f742 Mon Sep 17 00:00:00 2001 +From e4c1a33b0b4c1f5fab1b728f52585dd283ab9ddc Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Fri, 31 May 2019 00:08:28 -0500 Subject: [PATCH] Add ExecuteCommandEvent diff --git a/patches/api/0013-Implement-ChunkTooLargeEvent.patch b/patches/api/0014-Implement-ChunkTooLargeEvent.patch similarity index 98% rename from patches/api/0013-Implement-ChunkTooLargeEvent.patch rename to patches/api/0014-Implement-ChunkTooLargeEvent.patch index 146749d85..947aae4a4 100644 --- a/patches/api/0013-Implement-ChunkTooLargeEvent.patch +++ b/patches/api/0014-Implement-ChunkTooLargeEvent.patch @@ -1,4 +1,4 @@ -From 20b2357b34fb3596a795660ec87e3ec2a4488f62 Mon Sep 17 00:00:00 2001 +From 903689d819caca268cb23ae68aa7d452e89cf5e7 Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Fri, 12 Jul 2019 02:09:58 -0500 Subject: [PATCH] Implement ChunkTooLargeEvent diff --git a/patches/api/0014-Implement-lagging-threshold.patch b/patches/api/0015-Implement-lagging-threshold.patch similarity index 95% rename from patches/api/0014-Implement-lagging-threshold.patch rename to patches/api/0015-Implement-lagging-threshold.patch index b24a6d201..15b4e9b15 100644 --- a/patches/api/0014-Implement-lagging-threshold.patch +++ b/patches/api/0015-Implement-lagging-threshold.patch @@ -1,4 +1,4 @@ -From 5d638f431165d9cce1456fa35e5f5947c2dc5893 Mon Sep 17 00:00:00 2001 +From 438626929d0f7ecdc1a476539c93fe94230d4226 Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Tue, 23 Jul 2019 10:07:24 -0500 Subject: [PATCH] Implement lagging threshold diff --git a/patches/api/0015-Advancement-API-Additions.patch b/patches/api/0016-Advancement-API-Additions.patch similarity index 98% rename from patches/api/0015-Advancement-API-Additions.patch rename to patches/api/0016-Advancement-API-Additions.patch index 9da0738db..86abdb23f 100644 --- a/patches/api/0015-Advancement-API-Additions.patch +++ b/patches/api/0016-Advancement-API-Additions.patch @@ -1,4 +1,4 @@ -From e43f10dce3d188e53ec6cd1a4d9e8819350e95d4 Mon Sep 17 00:00:00 2001 +From e073e5ae742d57f67c3d9a075319d00835c1542a Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Fri, 31 May 2019 21:24:21 -0500 Subject: [PATCH] Advancement API Additions diff --git a/patches/api/0016-Implement-ItemFactory-getMonsterEgg.patch b/patches/api/0017-Implement-ItemFactory-getMonsterEgg.patch similarity index 93% rename from patches/api/0016-Implement-ItemFactory-getMonsterEgg.patch rename to patches/api/0017-Implement-ItemFactory-getMonsterEgg.patch index 5a19c57cd..6bfe2bb6b 100644 --- a/patches/api/0016-Implement-ItemFactory-getMonsterEgg.patch +++ b/patches/api/0017-Implement-ItemFactory-getMonsterEgg.patch @@ -1,4 +1,4 @@ -From ba7c31d363c124d1d76e449314cea73c71eaf513 Mon Sep 17 00:00:00 2001 +From 5ecbac582fc2724107823f64b9adf673bdf3d84b Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Fri, 5 Jul 2019 16:37:04 -0500 Subject: [PATCH] Implement ItemFactory#getMonsterEgg diff --git a/patches/api/0017-Implement-PlayerSetSpawnerTypeWithEggEvent.patch b/patches/api/0018-Implement-PlayerSetSpawnerTypeWithEggEvent.patch similarity index 97% rename from patches/api/0017-Implement-PlayerSetSpawnerTypeWithEggEvent.patch rename to patches/api/0018-Implement-PlayerSetSpawnerTypeWithEggEvent.patch index 993393e04..eb958706e 100644 --- a/patches/api/0017-Implement-PlayerSetSpawnerTypeWithEggEvent.patch +++ b/patches/api/0018-Implement-PlayerSetSpawnerTypeWithEggEvent.patch @@ -1,4 +1,4 @@ -From 1706141ee6b09fd3eacc90cd54ce8e10f9bc2b7b Mon Sep 17 00:00:00 2001 +From 873158f78a95d7943a75f989a9f35dd8ec9831df Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Fri, 5 Jul 2019 18:21:15 -0500 Subject: [PATCH] Implement PlayerSetSpawnerTypeWithEggEvent diff --git a/patches/api/0018-Add-MonsterEggSpawnEvent.patch b/patches/api/0019-Add-MonsterEggSpawnEvent.patch similarity index 97% rename from patches/api/0018-Add-MonsterEggSpawnEvent.patch rename to patches/api/0019-Add-MonsterEggSpawnEvent.patch index fbcb92bd8..dd75ee092 100644 --- a/patches/api/0018-Add-MonsterEggSpawnEvent.patch +++ b/patches/api/0019-Add-MonsterEggSpawnEvent.patch @@ -1,4 +1,4 @@ -From 42efc2192856cf55d70e06391ac7f8fadf19681a Mon Sep 17 00:00:00 2001 +From 78387652cf81f45c5f036d405da4daf466b1c63e Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Sat, 19 Oct 2019 03:20:49 -0500 Subject: [PATCH] Add MonsterEggSpawnEvent diff --git a/patches/api/0019-Add-ThrownEggHatchEvent.patch b/patches/api/0020-Add-ThrownEggHatchEvent.patch similarity index 98% rename from patches/api/0019-Add-ThrownEggHatchEvent.patch rename to patches/api/0020-Add-ThrownEggHatchEvent.patch index 336744661..8cec21897 100644 --- a/patches/api/0019-Add-ThrownEggHatchEvent.patch +++ b/patches/api/0020-Add-ThrownEggHatchEvent.patch @@ -1,4 +1,4 @@ -From 11affff10e4891f58f728891f8fdbcf29de19984 Mon Sep 17 00:00:00 2001 +From fbb8402a553e112483f966d23b5066dc844dcfb3 Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Sat, 19 Oct 2019 03:27:55 -0500 Subject: [PATCH] Add ThrownEggHatchEvent diff --git a/patches/api/0020-Add-moon-phase-API.patch b/patches/api/0021-Add-moon-phase-API.patch similarity index 92% rename from patches/api/0020-Add-moon-phase-API.patch rename to patches/api/0021-Add-moon-phase-API.patch index 6442bab81..ce955b270 100644 --- a/patches/api/0020-Add-moon-phase-API.patch +++ b/patches/api/0021-Add-moon-phase-API.patch @@ -1,4 +1,4 @@ -From 0b2ca9d055cbef330876bd0a759210ce7fd9b907 Mon Sep 17 00:00:00 2001 +From 21773eb994120e80f72be1ed9d0a51523149b022 Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Sat, 1 Feb 2020 22:22:07 -0600 Subject: [PATCH] Add moon phase API @@ -52,10 +52,10 @@ index 000000000..f5ad98c62 + } +} diff --git a/src/main/java/org/bukkit/World.java b/src/main/java/org/bukkit/World.java -index 5047be15f..80d63e250 100644 +index d9df7509a..d8178abfc 100644 --- a/src/main/java/org/bukkit/World.java +++ b/src/main/java/org/bukkit/World.java -@@ -3117,6 +3117,16 @@ public interface World extends PluginMessageRecipient, Metadatable { +@@ -3145,6 +3145,16 @@ public interface World extends PluginMessageRecipient, Metadatable { @NotNull public List getRaids(); diff --git a/patches/api/0021-Add-API-for-Villager-resetOffers.patch b/patches/api/0022-Add-API-for-Villager-resetOffers.patch similarity index 93% rename from patches/api/0021-Add-API-for-Villager-resetOffers.patch rename to patches/api/0022-Add-API-for-Villager-resetOffers.patch index 966f64aea..436538755 100644 --- a/patches/api/0021-Add-API-for-Villager-resetOffers.patch +++ b/patches/api/0022-Add-API-for-Villager-resetOffers.patch @@ -1,4 +1,4 @@ -From c4edd7018545faf35f370d4e8fe4f08ecb2baced Mon Sep 17 00:00:00 2001 +From 57837a0e93830ce84c108064a1457cb59a56e385 Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Mon, 7 Oct 2019 00:15:28 -0500 Subject: [PATCH] Add API for Villager#resetOffers() diff --git a/patches/api/0022-Expose-getItemStack-for-Trident.patch b/patches/api/0023-Expose-getItemStack-for-Trident.patch similarity index 94% rename from patches/api/0022-Expose-getItemStack-for-Trident.patch rename to patches/api/0023-Expose-getItemStack-for-Trident.patch index f3fbba229..114882d90 100644 --- a/patches/api/0022-Expose-getItemStack-for-Trident.patch +++ b/patches/api/0023-Expose-getItemStack-for-Trident.patch @@ -1,4 +1,4 @@ -From 0b7223ebf7e15b584fc72ec60da3ca841f90ed08 Mon Sep 17 00:00:00 2001 +From b51632e4cebc06f041b40c0612164edc4eccaaf6 Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Fri, 18 Oct 2019 22:19:31 -0500 Subject: [PATCH] Expose getItemStack for Trident diff --git a/patches/api/0023-Add-more-llama-API.patch b/patches/api/0024-Add-more-llama-API.patch similarity index 98% rename from patches/api/0023-Add-more-llama-API.patch rename to patches/api/0024-Add-more-llama-API.patch index fbe3ff9cd..cdab77a77 100644 --- a/patches/api/0023-Add-more-llama-API.patch +++ b/patches/api/0024-Add-more-llama-API.patch @@ -1,4 +1,4 @@ -From b3769f637f3dc7e629337a2d1fc24b68d37069d0 Mon Sep 17 00:00:00 2001 +From dfa71eca3789c870c339374b97e07dde48bd57ef Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Fri, 18 Oct 2019 22:50:05 -0500 Subject: [PATCH] Add more llama API diff --git a/patches/api/0024-Add-more-evoker-API.patch b/patches/api/0025-Add-more-evoker-API.patch similarity index 94% rename from patches/api/0024-Add-more-evoker-API.patch rename to patches/api/0025-Add-more-evoker-API.patch index cf82eb152..60a645e5d 100644 --- a/patches/api/0024-Add-more-evoker-API.patch +++ b/patches/api/0025-Add-more-evoker-API.patch @@ -1,4 +1,4 @@ -From 8b6dbecee0d1542ac21cc0e0b7cb0972459ad31c Mon Sep 17 00:00:00 2001 +From c2c0ee0dfa314e6df207e32e2bfd9516e9efa0f6 Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Sat, 19 Oct 2019 00:28:53 -0500 Subject: [PATCH] Add more evoker API diff --git a/patches/api/0025-Add-getPlacementBlockData-to-World.patch b/patches/api/0026-Add-getPlacementBlockData-to-World.patch similarity index 85% rename from patches/api/0025-Add-getPlacementBlockData-to-World.patch rename to patches/api/0026-Add-getPlacementBlockData-to-World.patch index 4fea1edb7..16cf9426e 100644 --- a/patches/api/0025-Add-getPlacementBlockData-to-World.patch +++ b/patches/api/0026-Add-getPlacementBlockData-to-World.patch @@ -1,4 +1,4 @@ -From 751e2690ac68caf38a98e10dba2fd5638798c468 Mon Sep 17 00:00:00 2001 +From c5c975aca49194cc02c4af567d9b73a8edcc6f22 Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Sat, 19 Oct 2019 00:34:36 -0500 Subject: [PATCH] Add getPlacementBlockData to World @@ -8,10 +8,10 @@ Subject: [PATCH] Add getPlacementBlockData to World 1 file changed, 10 insertions(+) diff --git a/src/main/java/org/bukkit/World.java b/src/main/java/org/bukkit/World.java -index 80d63e250..3a0be1004 100644 +index d8178abfc..b17a03334 100644 --- a/src/main/java/org/bukkit/World.java +++ b/src/main/java/org/bukkit/World.java -@@ -3125,6 +3125,16 @@ public interface World extends PluginMessageRecipient, Metadatable { +@@ -3153,6 +3153,16 @@ public interface World extends PluginMessageRecipient, Metadatable { */ @NotNull net.pl3x.purpur.MoonPhase getMoonPhase(); diff --git a/patches/api/0026-Add-playPickupItemAnimation-to-LivingEntity.patch b/patches/api/0027-Add-playPickupItemAnimation-to-LivingEntity.patch similarity index 95% rename from patches/api/0026-Add-playPickupItemAnimation-to-LivingEntity.patch rename to patches/api/0027-Add-playPickupItemAnimation-to-LivingEntity.patch index 221c509e3..d6023c5cd 100644 --- a/patches/api/0026-Add-playPickupItemAnimation-to-LivingEntity.patch +++ b/patches/api/0027-Add-playPickupItemAnimation-to-LivingEntity.patch @@ -1,4 +1,4 @@ -From c6a7136fcdf483a98edb1d05c4f04622d4f57c87 Mon Sep 17 00:00:00 2001 +From 46686f8401311206e87ecd14fef0bd3db10fda27 Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Sat, 19 Oct 2019 02:25:05 -0500 Subject: [PATCH] Add playPickupItemAnimation to LivingEntity diff --git a/patches/api/0027-Add-getPlayer-to-SkeletonHorseTrapEvent.patch b/patches/api/0028-Add-getPlayer-to-SkeletonHorseTrapEvent.patch similarity index 97% rename from patches/api/0027-Add-getPlayer-to-SkeletonHorseTrapEvent.patch rename to patches/api/0028-Add-getPlayer-to-SkeletonHorseTrapEvent.patch index d61547a94..aecba3d3b 100644 --- a/patches/api/0027-Add-getPlayer-to-SkeletonHorseTrapEvent.patch +++ b/patches/api/0028-Add-getPlayer-to-SkeletonHorseTrapEvent.patch @@ -1,4 +1,4 @@ -From 562ac86ea29bd27b5fc5d752b6420f3453417d62 Mon Sep 17 00:00:00 2001 +From 58841d3d8e5e181681cabd0855899db6ad1dc73f Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Sat, 19 Oct 2019 02:35:24 -0500 Subject: [PATCH] Add getPlayer to SkeletonHorseTrapEvent diff --git a/patches/api/0028-Add-LootableInventoryFirstFillEvent.patch b/patches/api/0029-Add-LootableInventoryFirstFillEvent.patch similarity index 96% rename from patches/api/0028-Add-LootableInventoryFirstFillEvent.patch rename to patches/api/0029-Add-LootableInventoryFirstFillEvent.patch index fe6f1aad6..73cc7dd33 100644 --- a/patches/api/0028-Add-LootableInventoryFirstFillEvent.patch +++ b/patches/api/0029-Add-LootableInventoryFirstFillEvent.patch @@ -1,4 +1,4 @@ -From ddf19ccd8ab11161730a8343d8d3b7d519645581 Mon Sep 17 00:00:00 2001 +From f4f5c5f77c403730091b31b16aa5420b0186377a Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Sat, 19 Oct 2019 02:43:10 -0500 Subject: [PATCH] Add LootableInventoryFirstFillEvent diff --git a/patches/api/0029-Add-back-EntityCreatePortalEvent-for-EnderDragon.patch b/patches/api/0030-Add-back-EntityCreatePortalEvent-for-EnderDragon.patch similarity index 96% rename from patches/api/0029-Add-back-EntityCreatePortalEvent-for-EnderDragon.patch rename to patches/api/0030-Add-back-EntityCreatePortalEvent-for-EnderDragon.patch index 6b18f27c6..45dedfb9c 100644 --- a/patches/api/0029-Add-back-EntityCreatePortalEvent-for-EnderDragon.patch +++ b/patches/api/0030-Add-back-EntityCreatePortalEvent-for-EnderDragon.patch @@ -1,4 +1,4 @@ -From cac280553cbb6a3332741a1eb53118a46eecee90 Mon Sep 17 00:00:00 2001 +From fdba4b920a64e6c43993c7afa7a75c2edc13bade Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Sat, 19 Oct 2019 03:53:46 -0500 Subject: [PATCH] Add back EntityCreatePortalEvent for EnderDragon diff --git a/patches/api/0030-Implement-EntityMoveEvent.patch b/patches/api/0031-Implement-EntityMoveEvent.patch similarity index 97% rename from patches/api/0030-Implement-EntityMoveEvent.patch rename to patches/api/0031-Implement-EntityMoveEvent.patch index 4c589c9e0..4b209b4c9 100644 --- a/patches/api/0030-Implement-EntityMoveEvent.patch +++ b/patches/api/0031-Implement-EntityMoveEvent.patch @@ -1,4 +1,4 @@ -From 534c94b62bf879c90aeecd784759b4e4564b884e Mon Sep 17 00:00:00 2001 +From c34b526bbe4747bcfaef76680f94101a76a6bfe0 Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Tue, 11 Feb 2020 21:56:38 -0600 Subject: [PATCH] Implement EntityMoveEvent diff --git a/patches/server/0002-Tuinity-Server-Patches.patch b/patches/server/0002-Tuinity-Server-Patches.patch new file mode 100644 index 000000000..bb639c602 --- /dev/null +++ b/patches/server/0002-Tuinity-Server-Patches.patch @@ -0,0 +1,10280 @@ +From fe6acadbec2da9de314a4f31eda7b6f0c5d4c64c Mon Sep 17 00:00:00 2001 +From: Spottedleaf +Date: Fri, 14 Dec 2018 21:53:58 -0800 +Subject: [PATCH] Tuinity Server Patches + +--- + pom.xml | 16 +- + .../com/destroystokyo/paper/PaperCommand.java | 2 +- + .../destroystokyo/paper/PaperWorldConfig.java | 3 +- + .../paper/io/PrioritizedTaskQueue.java | 20 +- + .../com/mojang/datafixers/util/Either.java | 6 +- + .../tuinity/chunk/ChunkRegionManager.java | 165 ++++ + .../chunk/QueuedChangesMapLong2Int.java | 155 ++++ + .../chunk/QueuedChangesMapLong2Object.java | 170 ++++ + .../tuinity/tuinity/config/TuinityConfig.java | 225 +++++ + .../server/TickListServerInterval.java | 42 + + .../tuinity/server/TuinityTickList.java | 614 ++++++++++++ + .../com/tuinity/tuinity/util/ChunkList.java | 119 +++ + .../com/tuinity/tuinity/util/EntityList.java | 124 +++ + .../tuinity/tuinity/util/IBlockDataList.java | 123 +++ + .../tuinity/util/OptimizedSmallEnumSet.java | 65 ++ + .../tuinity/util/PrimaryThreadList.java | 241 +++++ + .../tuinity/util/PrimaryThreadSet.java | 282 ++++++ + .../util/TickSynchronizationPoint.java | 40 + + .../com/tuinity/tuinity/util/TickThread.java | 40 + + .../java/com/tuinity/tuinity/util/Util.java | 103 +++ + .../fastutil/ExtendedAbstractDoubleList.java | 39 + + .../fastutil/ExtendedDoubleArrayList.java | 65 ++ + .../fastutil/ExtendedObjectAVLTreeSet.java | 90 ++ + .../com/tuinity/tuinity/util/map/AreaMap.java | 388 ++++++++ + .../tuinity/util/map/PlayerAreaMap.java | 25 + + .../util/map/PooledLinkedHashSets.java | 287 ++++++ + .../util/pool/PooledBlockPositions.java | 40 + + .../tuinity/util/set/LinkedSortedSet.java | 142 +++ + .../net/minecraft/server/ArraySetSorted.java | 41 +- + .../net/minecraft/server/AxisAlignedBB.java | 2 + + .../net/minecraft/server/BlockPosition.java | 1 + + src/main/java/net/minecraft/server/Chunk.java | 134 +++ + .../java/net/minecraft/server/ChunkMap.java | 15 +- + .../minecraft/server/ChunkMapDistance.java | 387 +++++++- + .../minecraft/server/ChunkProviderServer.java | 186 +++- + .../minecraft/server/ChunkRegionLoader.java | 12 +- + .../net/minecraft/server/ChunkStatus.java | 5 +- + .../net/minecraft/server/DedicatedServer.java | 3 +- + .../minecraft/server/DoubleListOffset.java | 2 +- + .../java/net/minecraft/server/Entity.java | 53 ++ + .../minecraft/server/EntityEnderDragon.java | 4 +- + .../minecraft/server/EntityInsentient.java | 19 +- + .../net/minecraft/server/EntityPlayer.java | 41 +- + .../minecraft/server/EntityTrackerEntry.java | 41 +- + .../net/minecraft/server/EntityWither.java | 4 +- + .../java/net/minecraft/server/HeightMap.java | 5 +- + .../minecraft/server/IAsyncTaskHandler.java | 2 +- + .../net/minecraft/server/IEntityAccess.java | 33 +- + .../minecraft/server/LightEngineBlock.java | 2 +- + .../minecraft/server/LightEngineLayer.java | 2 +- + .../net/minecraft/server/LightEngineSky.java | 2 +- + .../minecraft/server/LightEngineStorage.java | 17 +- + .../server/LightEngineStorageArray.java | 26 +- + .../server/LightEngineStorageBlock.java | 8 +- + .../server/LightEngineStorageSky.java | 38 +- + .../java/net/minecraft/server/MCUtil.java | 30 +- + .../net/minecraft/server/MinecraftServer.java | 6 +- + .../net/minecraft/server/NBTTagCompound.java | 2 +- + .../minecraft/server/NavigationAbstract.java | 24 +- + .../net/minecraft/server/NetworkManager.java | 2 +- + .../minecraft/server/NextTickListEntry.java | 41 +- + .../server/PacketPlayOutMapChunk.java | 15 +- + .../net/minecraft/server/PairedQueue.java | 44 +- + .../net/minecraft/server/PathfinderGoal.java | 15 +- + .../server/PathfinderGoalSelector.java | 125 ++- + .../server/PathfinderGoalWrapped.java | 6 +- + .../minecraft/server/PathfinderNormal.java | 4 +- + .../server/PathfinderTargetCondition.java | 1 + + .../net/minecraft/server/PlayerChunk.java | 112 ++- + .../net/minecraft/server/PlayerChunkMap.java | 870 +++++++++++++++--- + .../server/PlayerInteractManager.java | 45 +- + .../net/minecraft/server/PlayerInventory.java | 6 +- + .../java/net/minecraft/server/PlayerList.java | 6 +- + .../java/net/minecraft/server/ProtoChunk.java | 16 +- + .../java/net/minecraft/server/RegionFile.java | 420 ++++++++- + .../minecraft/server/RegionFileBitSet.java | 26 +- + .../net/minecraft/server/RegionFileCache.java | 45 +- + .../server/RegionFileCompression.java | 7 +- + .../server/StructureBoundingBox.java | 14 +- + .../net/minecraft/server/ThreadedMailbox.java | 2 +- + .../net/minecraft/server/TickListServer.java | 51 + + .../java/net/minecraft/server/Ticket.java | 6 +- + .../java/net/minecraft/server/TicketType.java | 1 + + .../net/minecraft/server/VoxelShapeArray.java | 2 +- + .../minecraft/server/VoxelShapeCubePoint.java | 2 +- + .../server/VoxelShapeMergerList.java | 2 +- + .../net/minecraft/server/VoxelShapes.java | 2 +- + src/main/java/net/minecraft/server/World.java | 23 +- + .../net/minecraft/server/WorldServer.java | 478 +++++++++- + .../net/minecraft/server/WorldUpgrader.java | 2 +- + .../org/bukkit/craftbukkit/CraftServer.java | 7 +- + .../org/bukkit/craftbukkit/CraftWorld.java | 67 +- + .../java/org/bukkit/craftbukkit/Main.java | 7 + + .../craftbukkit/entity/CraftEntity.java | 12 + + .../craftbukkit/entity/CraftPlayer.java | 37 +- + .../java/org/spigotmc/ActivationRange.java | 41 +- + src/main/java/org/spigotmc/AsyncCatcher.java | 2 +- + 97 files changed, 6857 insertions(+), 485 deletions(-) + create mode 100644 src/main/java/com/tuinity/tuinity/chunk/ChunkRegionManager.java + create mode 100644 src/main/java/com/tuinity/tuinity/chunk/QueuedChangesMapLong2Int.java + create mode 100644 src/main/java/com/tuinity/tuinity/chunk/QueuedChangesMapLong2Object.java + create mode 100644 src/main/java/com/tuinity/tuinity/config/TuinityConfig.java + create mode 100644 src/main/java/com/tuinity/tuinity/server/TickListServerInterval.java + create mode 100644 src/main/java/com/tuinity/tuinity/server/TuinityTickList.java + create mode 100644 src/main/java/com/tuinity/tuinity/util/ChunkList.java + create mode 100644 src/main/java/com/tuinity/tuinity/util/EntityList.java + create mode 100644 src/main/java/com/tuinity/tuinity/util/IBlockDataList.java + create mode 100644 src/main/java/com/tuinity/tuinity/util/OptimizedSmallEnumSet.java + create mode 100644 src/main/java/com/tuinity/tuinity/util/PrimaryThreadList.java + create mode 100644 src/main/java/com/tuinity/tuinity/util/PrimaryThreadSet.java + create mode 100644 src/main/java/com/tuinity/tuinity/util/TickSynchronizationPoint.java + create mode 100644 src/main/java/com/tuinity/tuinity/util/TickThread.java + create mode 100644 src/main/java/com/tuinity/tuinity/util/Util.java + create mode 100644 src/main/java/com/tuinity/tuinity/util/fastutil/ExtendedAbstractDoubleList.java + create mode 100644 src/main/java/com/tuinity/tuinity/util/fastutil/ExtendedDoubleArrayList.java + create mode 100644 src/main/java/com/tuinity/tuinity/util/fastutil/ExtendedObjectAVLTreeSet.java + create mode 100644 src/main/java/com/tuinity/tuinity/util/map/AreaMap.java + create mode 100644 src/main/java/com/tuinity/tuinity/util/map/PlayerAreaMap.java + create mode 100644 src/main/java/com/tuinity/tuinity/util/map/PooledLinkedHashSets.java + create mode 100644 src/main/java/com/tuinity/tuinity/util/pool/PooledBlockPositions.java + create mode 100644 src/main/java/com/tuinity/tuinity/util/set/LinkedSortedSet.java + +diff --git a/pom.xml b/pom.xml +index e6fc4d014..ffac75de2 100644 +--- a/pom.xml ++++ b/pom.xml +@@ -1,4 +1,4 @@ +- + 4.0.0 + purpur +@@ -16,8 +16,8 @@ + git-Bukkit- + + yyyyMMdd-HHmm +- 1.8 +- 1.8 ++ 11 ++ 11 + + + +@@ -119,6 +119,12 @@ + 1.3 + test +
++ ++ ++ ca.spottedleaf.concurrentutil ++ concurrentutil ++ 1.0.0-SNAPSHOT ++ +
+ + +@@ -282,6 +288,10 @@ + org.apache.maven.plugins + maven-compiler-plugin + 3.8.1 ++ ++ ++ true ++ + + + +diff --git a/src/main/java/com/destroystokyo/paper/PaperCommand.java b/src/main/java/com/destroystokyo/paper/PaperCommand.java +index 132397b3f..4e12f416f 100644 +--- a/src/main/java/com/destroystokyo/paper/PaperCommand.java ++++ b/src/main/java/com/destroystokyo/paper/PaperCommand.java +@@ -215,7 +215,7 @@ public class PaperCommand extends Command { + int ticking = 0; + int entityTicking = 0; + +- for (PlayerChunk chunk : world.getChunkProvider().playerChunkMap.updatingChunks.values()) { ++ for (PlayerChunk chunk : world.getChunkProvider().playerChunkMap.chunkMap.getUpdatingValues()) { // Tuinity - replace chunk map + if (chunk.getFullChunkIfCached() == null) { + continue; + } +diff --git a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java +index 7d408542e..a61d936fc 100644 +--- a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java ++++ b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java +@@ -108,7 +108,7 @@ public class PaperWorldConfig { + } + + public int softDespawnDistance; +- public int hardDespawnDistance; ++ public int hardDespawnDistance; public double hardDespawnDistanceNotSquared; // Tuinity + private void despawnDistances() { + softDespawnDistance = getInt("despawn-ranges.soft", 32); // 32^2 = 1024, Minecraft Default + hardDespawnDistance = getInt("despawn-ranges.hard", 128); // 128^2 = 16384, Minecraft Default +@@ -118,6 +118,7 @@ public class PaperWorldConfig { + } + + log("Living Entity Despawn Ranges: Soft: " + softDespawnDistance + " Hard: " + hardDespawnDistance); ++ hardDespawnDistanceNotSquared = hardDespawnDistance; // Tuinity + + softDespawnDistance = softDespawnDistance*softDespawnDistance; + hardDespawnDistance = hardDespawnDistance*hardDespawnDistance; +diff --git a/src/main/java/com/destroystokyo/paper/io/PrioritizedTaskQueue.java b/src/main/java/com/destroystokyo/paper/io/PrioritizedTaskQueue.java +index 78bd238f4..8a7893268 100644 +--- a/src/main/java/com/destroystokyo/paper/io/PrioritizedTaskQueue.java ++++ b/src/main/java/com/destroystokyo/paper/io/PrioritizedTaskQueue.java +@@ -1,5 +1,6 @@ + package com.destroystokyo.paper.io; + ++import ca.spottedleaf.concurrentutil.queue.MultiThreadedQueue; // Tuinity - use concurrentutil + import java.util.concurrent.ConcurrentLinkedQueue; + import java.util.concurrent.atomic.AtomicBoolean; + import java.util.concurrent.atomic.AtomicInteger; +@@ -48,13 +49,13 @@ public class PrioritizedTaskQueue[] queues = (ConcurrentLinkedQueue[])new ConcurrentLinkedQueue[TOTAL_PRIORITIES]; ++ final MultiThreadedQueue[] queues = new MultiThreadedQueue[TOTAL_PRIORITIES]; // Tuinity - use concurrentutil + + private final AtomicBoolean shutdown = new AtomicBoolean(); + + { + for (int i = 0; i < TOTAL_PRIORITIES; ++i) { +- this.queues[i] = new ConcurrentLinkedQueue<>(); ++ this.queues[i] = new MultiThreadedQueue<>(); // Tuinity - use concurrentutil + } + } + +@@ -73,9 +74,8 @@ public class PrioritizedTaskQueue queue = this.queues[i]; ++ final MultiThreadedQueue queue = this.queues[i]; // Tuinity - use concurrentutil + + while ((task = queue.poll()) != null) { + final int prevPriority = task.tryComplete(i); +@@ -109,7 +109,7 @@ public class PrioritizedTaskQueue queue = this.queues[i]; ++ final MultiThreadedQueue queue = this.queues[i]; // Tuinity - use concurrentutil + + if (queue.peek() != null) { + return true; +@@ -130,6 +130,12 @@ public class PrioritizedTaskQueue queue = this.queues[i]; ++ queue.preventAdds(); ++ } ++ // Tuinity end - use concurrentutil + return this.shutdown.getAndSet(false); + } + +diff --git a/src/main/java/com/mojang/datafixers/util/Either.java b/src/main/java/com/mojang/datafixers/util/Either.java +index a90adac7b..2e7cbf8bf 100644 +--- a/src/main/java/com/mojang/datafixers/util/Either.java ++++ b/src/main/java/com/mojang/datafixers/util/Either.java +@@ -23,6 +23,7 @@ public abstract class Either implements App, L> { + + private static final class Left extends Either { + private final L value; ++ private Optional cachedLeft; // Tuinity - reduce allocation of these for chunks... + + public Left(final L value) { + this.value = value; +@@ -51,7 +52,7 @@ public abstract class Either implements App, L> { + + @Override + public Optional left() { +- return Optional.of(value); ++ return this.cachedLeft == null ? this.cachedLeft = Optional.of(value) : this.cachedLeft; // Tuinity - cache optional + } + + @Override +@@ -84,6 +85,7 @@ public abstract class Either implements App, L> { + + private static final class Right extends Either { + private final R value; ++ private Optional cachedRight; // Tuinity - reduce allocation of these for chunks... + + public Right(final R value) { + this.value = value; +@@ -117,7 +119,7 @@ public abstract class Either implements App, L> { + + @Override + public Optional right() { +- return Optional.of(value); ++ return this.cachedRight == null ? this.cachedRight = Optional.of(value) : this.cachedRight; // Tuinity - cache optional + } + + @Override +diff --git a/src/main/java/com/tuinity/tuinity/chunk/ChunkRegionManager.java b/src/main/java/com/tuinity/tuinity/chunk/ChunkRegionManager.java +new file mode 100644 +index 000000000..ff17a100b +--- /dev/null ++++ b/src/main/java/com/tuinity/tuinity/chunk/ChunkRegionManager.java +@@ -0,0 +1,165 @@ ++package com.tuinity.tuinity.chunk; ++ ++import com.tuinity.tuinity.util.TickSynchronizationPoint; ++import com.tuinity.tuinity.util.TickThread; ++import com.tuinity.tuinity.util.Util; ++import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap; ++import it.unimi.dsi.fastutil.longs.LongIterator; ++import it.unimi.dsi.fastutil.longs.LongOpenHashSet; ++import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet; ++import net.minecraft.server.World; ++ ++public final class ChunkRegionManager { ++ ++ private static final int REGION_MERGE_RADIUS = 1; ++ ++ public final Long2ObjectOpenHashMap regions = new Long2ObjectOpenHashMap<>(8192, 0.25f); ++ public final World world; ++ public final TickSynchronizationPoint synchronizationPoint; ++ ++ private final TickThread[] threads; ++ ++ public ChunkRegionManager(final World world, final TickSynchronizationPoint synchronizationPoint, final TickThread[] threads) { ++ this.world = world; ++ this.synchronizationPoint = synchronizationPoint; ++ this.threads = threads; ++ } ++ ++ public void addToRegion(final long coordinate) { ++ this.addToRegion(Util.getCoordinateX(coordinate), Util.getCoordinateZ(coordinate), coordinate); ++ } ++ ++ public void addToRegion(final int chunkX, final int chunkZ) { ++ this.addToRegion(chunkX, chunkZ, Util.getCoordinateKey(chunkX, chunkZ)); ++ } ++ ++ // note: for MT, when we want to merge regions we actually need to tell the owning thread (if any) to merge it ++ // themselves ++ public void addToRegion(final int chunkX, final int chunkZ, final long coordinate) { ++ // find the ideal region to merge into ++ ++ ChunkRegionHolder regionHolder = null; ++ ChunkRegion region = null; ++ int regionHolderChunks = 0; ++ ++ for (int dx = -REGION_MERGE_RADIUS; dx <= REGION_MERGE_RADIUS; ++dx) { ++ for (int dz = -REGION_MERGE_RADIUS; dz <= REGION_MERGE_RADIUS; ++dz) { ++ final int checkX = dx + chunkX; ++ final int checkZ = dz + chunkZ; ++ final long k = Util.getCoordinateKey(checkX, checkZ); ++ ++ ChunkRegionHolder currentRegion = this.regions.get(k); ++ ++ if (currentRegion != null) { ++ final int currentSize = currentRegion.region.coordinates.size(); ++ if (currentSize > regionHolderChunks) { ++ regionHolderChunks = currentSize; ++ regionHolder = currentRegion; ++ region = currentRegion.region; ++ } ++ } ++ } ++ } ++ ++ if (regionHolder == null) { ++ regionHolder = new ChunkRegionHolder(region = new ChunkRegion()); ++ } ++ ++ // now merge regions in radius ++ ++ region.addChunk(chunkX, chunkZ, coordinate); ++ ++ for (int dx = -REGION_MERGE_RADIUS; dx <= REGION_MERGE_RADIUS; ++dx) { ++ for (int dz = -REGION_MERGE_RADIUS; dz <= REGION_MERGE_RADIUS; ++dz) { ++ final int checkX = dx + chunkX; ++ final int checkZ = dz + chunkZ; ++ final long k = Util.getCoordinateKey(checkX, checkZ); ++ ++ ChunkRegionHolder currentRegion = this.regions.putIfAbsent(k, regionHolder); ++ ++ if (currentRegion != null && currentRegion.region != region) { ++ currentRegion.region.mergeInto(region); ++ } ++ } ++ } ++ } ++ ++ static final class ChunkRegionHolder { ++ ++ public ChunkRegion region; ++ ++ public ChunkRegionHolder(final ChunkRegion region) { ++ this.region = region; ++ this.region.addRegionHolder(this); ++ } ++ } ++ ++ static final class ChunkRegion { ++ ++ private final LongOpenHashSet coordinates = new LongOpenHashSet(); ++ private boolean dead; ++ ++ private int lowerX; ++ private int lowerZ; ++ ++ private int upperX; ++ private int upperZ; ++ ++ private final ObjectOpenHashSet regionHolders = new ObjectOpenHashSet<>(); ++ ++ void addRegionHolder(final ChunkRegionHolder regionHolder) { ++ this.regionHolders.add(regionHolder); ++ } ++ ++ public void mergeInto(final ChunkRegion region) { ++ if (region.dead) { ++ throw new IllegalStateException("Attempting to merge into a dead region"); ++ } else if (this.dead) { ++ throw new IllegalStateException("Attempting to merge from a dead region"); ++ } ++ ++ for (LongIterator iterator = this.coordinates.iterator(); iterator.hasNext();) { ++ region.addChunk(iterator.nextLong()); ++ } ++ ++ // forward our old region holders ++ for (final ChunkRegionHolder regionHolder : this.regionHolders) { ++ regionHolder.region = region; ++ } ++ ++ this.dead = true; ++ } ++ ++ void addChunk(final long coordinate) { ++ this.addChunk(Util.getCoordinateX(coordinate), Util.getCoordinateZ(coordinate), coordinate); ++ } ++ ++ void addChunk(final int chunkX, final int chunkZ) { ++ this.addChunk(chunkX, chunkZ, Util.getCoordinateKey(chunkX, chunkZ)); ++ } ++ ++ boolean addChunk(final int chunkX, final int chunkZ, final long coordinate) { ++ if (!this.coordinates.add(coordinate)) { ++ return false; ++ } ++ ++ if (this.coordinates.size() == 1) { ++ this.lowerX = this.upperX = chunkX; ++ this.lowerZ = this.upperZ = chunkZ; ++ } else { ++ if (chunkX < this.lowerX) { ++ this.lowerX = chunkX; ++ } else if (chunkX > this.upperX) { ++ this.upperX = chunkX; ++ } ++ if (chunkZ < this.lowerZ) { ++ this.lowerZ = chunkZ; ++ } else if (chunkZ > this.upperZ) { ++ this.upperZ = chunkZ; ++ } ++ } ++ ++ return true; ++ } ++ } ++} +\ No newline at end of file +diff --git a/src/main/java/com/tuinity/tuinity/chunk/QueuedChangesMapLong2Int.java b/src/main/java/com/tuinity/tuinity/chunk/QueuedChangesMapLong2Int.java +new file mode 100644 +index 000000000..d528d08ea +--- /dev/null ++++ b/src/main/java/com/tuinity/tuinity/chunk/QueuedChangesMapLong2Int.java +@@ -0,0 +1,155 @@ ++package com.tuinity.tuinity.chunk; ++ ++import ca.spottedleaf.concurrentutil.lock.WeakSeqLock; ++import it.unimi.dsi.fastutil.longs.Long2IntMap; ++import it.unimi.dsi.fastutil.longs.Long2IntOpenHashMap; ++import it.unimi.dsi.fastutil.longs.Long2ObjectMap; ++import it.unimi.dsi.fastutil.longs.LongIterator; ++import it.unimi.dsi.fastutil.longs.LongOpenHashSet; ++import it.unimi.dsi.fastutil.objects.ObjectIterator; ++ ++public class QueuedChangesMapLong2Int { ++ ++ protected final Long2IntOpenHashMap updatingMap; ++ protected final Long2IntOpenHashMap visibleMap; ++ protected final Long2IntOpenHashMap queuedPuts; ++ protected final LongOpenHashSet queuedRemove; ++ ++ protected int queuedDefaultReturnValue; ++ ++ // we use a seqlock as writes are not common. ++ protected final WeakSeqLock updatingMapSeqLock = new WeakSeqLock(); ++ ++ public QueuedChangesMapLong2Int() { ++ this(16, 0.75f); ++ } ++ ++ public QueuedChangesMapLong2Int(final int capacity, final float loadFactor) { ++ this.updatingMap = new Long2IntOpenHashMap(capacity, loadFactor); ++ this.visibleMap = new Long2IntOpenHashMap(capacity, loadFactor); ++ this.queuedPuts = new Long2IntOpenHashMap(); ++ this.queuedRemove = new LongOpenHashSet(); ++ } ++ ++ public void queueDefaultReturnValue(final int dfl) { ++ this.queuedDefaultReturnValue = dfl; ++ this.updatingMap.defaultReturnValue(dfl); ++ } ++ ++ public int queueUpdate(final long k, final int v) { ++ this.queuedRemove.remove(k); ++ this.queuedPuts.put(k, v); ++ ++ return this.updatingMap.put(k, v); ++ } ++ ++ public int queueRemove(final long k) { ++ this.queuedPuts.remove(k); ++ this.queuedRemove.add(k); ++ ++ return this.updatingMap.remove(k); ++ } ++ ++ public int getUpdating(final long k) { ++ return this.updatingMap.get(k); ++ } ++ ++ public int getVisible(final long k) { ++ return this.visibleMap.get(k); ++ } ++ ++ public int getVisibleAsync(final long k) { ++ int readlock; ++ int ret = 0; ++ ++ do { ++ readlock = this.updatingMapSeqLock.acquireRead(); ++ try { ++ ret = this.visibleMap.get(k); ++ } catch (final Throwable thr) { ++ if (thr instanceof ThreadDeath) { ++ throw (ThreadDeath)thr; ++ } ++ // ignore... ++ continue; ++ } ++ ++ } while (!this.updatingMapSeqLock.tryReleaseRead(readlock)); ++ ++ return ret; ++ } ++ ++ public boolean performUpdates() { ++ this.updatingMapSeqLock.acquireWrite(); ++ this.visibleMap.defaultReturnValue(this.queuedDefaultReturnValue); ++ this.updatingMapSeqLock.releaseWrite(); ++ ++ if (this.queuedPuts.isEmpty() && this.queuedRemove.isEmpty()) { ++ return false; ++ } ++ ++ // update puts ++ final ObjectIterator iterator0 = this.queuedPuts.long2IntEntrySet().fastIterator(); ++ while (iterator0.hasNext()) { ++ final Long2IntMap.Entry entry = iterator0.next(); ++ final long key = entry.getLongKey(); ++ final int val = entry.getValue(); ++ ++ this.updatingMapSeqLock.acquireWrite(); ++ try { ++ this.visibleMap.put(key, val); ++ } finally { ++ this.updatingMapSeqLock.releaseWrite(); ++ } ++ } ++ ++ final LongIterator iterator1 = this.queuedRemove.iterator(); ++ while (iterator1.hasNext()) { ++ final long key = iterator1.nextLong(); ++ ++ this.updatingMapSeqLock.acquireWrite(); ++ try { ++ this.visibleMap.remove(key); ++ } finally { ++ this.updatingMapSeqLock.releaseWrite(); ++ } ++ } ++ ++ ++ return true; ++ } ++ ++ public boolean performUpdatesLockMap() { ++ this.updatingMapSeqLock.acquireWrite(); ++ try { ++ this.visibleMap.defaultReturnValue(this.queuedDefaultReturnValue); ++ ++ if (this.queuedPuts.isEmpty() && this.queuedRemove.isEmpty()) { ++ return false; ++ } ++ ++ // update puts ++ final ObjectIterator iterator0 = this.queuedPuts.long2IntEntrySet().fastIterator(); ++ while (iterator0.hasNext()) { ++ final Long2IntMap.Entry entry = iterator0.next(); ++ final long key = entry.getLongKey(); ++ final int val = entry.getValue(); ++ ++ this.visibleMap.put(key, val); ++ } ++ ++ final LongIterator iterator1 = this.queuedRemove.iterator(); ++ while (iterator1.hasNext()) { ++ final long key = iterator1.nextLong(); ++ ++ this.visibleMap.remove(key); ++ } ++ ++ ++ return true; ++ } finally { ++ this.updatingMapSeqLock.releaseWrite(); ++ } ++ } ++ ++} +diff --git a/src/main/java/com/tuinity/tuinity/chunk/QueuedChangesMapLong2Object.java b/src/main/java/com/tuinity/tuinity/chunk/QueuedChangesMapLong2Object.java +new file mode 100644 +index 000000000..e5bb56cca +--- /dev/null ++++ b/src/main/java/com/tuinity/tuinity/chunk/QueuedChangesMapLong2Object.java +@@ -0,0 +1,170 @@ ++package com.tuinity.tuinity.chunk; ++ ++import ca.spottedleaf.concurrentutil.lock.WeakSeqLock; ++import it.unimi.dsi.fastutil.longs.Long2ObjectLinkedOpenHashMap; ++import it.unimi.dsi.fastutil.longs.Long2ObjectMap; ++import it.unimi.dsi.fastutil.objects.ObjectBidirectionalIterator; ++ ++import java.util.ArrayList; ++import java.util.Collection; ++import java.util.List; ++ ++public class QueuedChangesMapLong2Object { ++ ++ protected static final Object REMOVED = new Object(); ++ ++ protected final Long2ObjectLinkedOpenHashMap updatingMap; ++ protected final Long2ObjectLinkedOpenHashMap visibleMap; ++ protected final Long2ObjectLinkedOpenHashMap queuedChanges; ++ ++ // we use a seqlock as writes are not common. ++ protected final WeakSeqLock updatingMapSeqLock = new WeakSeqLock(); ++ ++ public QueuedChangesMapLong2Object() { ++ this(16, 0.75f); // dfl for fastutil ++ } ++ ++ public QueuedChangesMapLong2Object(final int capacity, final float loadFactor) { ++ this.updatingMap = new Long2ObjectLinkedOpenHashMap<>(capacity, loadFactor); ++ this.visibleMap = new Long2ObjectLinkedOpenHashMap<>(capacity, loadFactor); ++ this.queuedChanges = new Long2ObjectLinkedOpenHashMap<>(); ++ } ++ ++ public V queueUpdate(final long k, final V value) { ++ this.queuedChanges.put(k, value); ++ return this.updatingMap.put(k, value); ++ } ++ ++ public V queueRemove(final long k) { ++ this.queuedChanges.put(k, REMOVED); ++ return this.updatingMap.remove(k); ++ } ++ ++ public V getUpdating(final long k) { ++ return this.updatingMap.get(k); ++ } ++ ++ public V getVisible(final long k) { ++ return this.visibleMap.get(k); ++ } ++ ++ public V getVisibleAsync(final long k) { ++ int readlock; ++ V ret = null; ++ ++ do { ++ readlock = this.updatingMapSeqLock.acquireRead(); ++ ++ try { ++ ret = this.visibleMap.get(k); ++ } catch (final Throwable thr) { ++ if (thr instanceof ThreadDeath) { ++ throw (ThreadDeath)thr; ++ } ++ // ignore... ++ continue; ++ } ++ ++ } while (!this.updatingMapSeqLock.tryReleaseRead(readlock)); ++ ++ return ret; ++ } ++ ++ public Long2ObjectLinkedOpenHashMap getVisibleMap() { ++ return this.visibleMap; ++ } ++ ++ public Long2ObjectLinkedOpenHashMap getUpdatingMap() { ++ return this.updatingMap; ++ } ++ ++ public int getVisibleSize() { ++ return this.visibleMap.size(); ++ } ++ ++ public int getVisibleSizeAsync() { ++ int readlock; ++ int ret; ++ ++ do { ++ readlock = this.updatingMapSeqLock.acquireRead(); ++ ret = this.visibleMap.size(); ++ } while (!this.updatingMapSeqLock.tryReleaseRead(readlock)); ++ ++ return ret; ++ } ++ ++ // unlike mojang's impl this cannot be used async since it's not a view of an immutable map ++ public Collection getUpdatingValues() { ++ return this.updatingMap.values(); ++ } ++ ++ public List getUpdatingValuesCopy() { ++ return new ArrayList<>(this.updatingMap.values()); ++ } ++ ++ // unlike mojang's impl this cannot be used async since it's not a view of an immutable map ++ public Collection getVisibleValues() { ++ return this.visibleMap.values(); ++ } ++ ++ public List getVisibleValuesCopy() { ++ return new ArrayList<>(this.visibleMap.values()); ++ } ++ ++ public boolean performUpdates() { ++ if (this.queuedChanges.isEmpty()) { ++ return false; ++ } ++ ++ final ObjectBidirectionalIterator> iterator = this.queuedChanges.long2ObjectEntrySet().fastIterator(); ++ while (iterator.hasNext()) { ++ final Long2ObjectMap.Entry entry = iterator.next(); ++ final long key = entry.getLongKey(); ++ final Object val = entry.getValue(); ++ ++ this.updatingMapSeqLock.acquireWrite(); ++ try { ++ if (val == REMOVED) { ++ this.visibleMap.remove(key); ++ } else { ++ this.visibleMap.put(key, (V)val); ++ } ++ } finally { ++ this.updatingMapSeqLock.releaseWrite(); ++ } ++ } ++ ++ this.queuedChanges.clear(); ++ return true; ++ } ++ ++ public boolean performUpdatesLockMap() { ++ if (this.queuedChanges.isEmpty()) { ++ return false; ++ } ++ ++ final ObjectBidirectionalIterator> iterator = this.queuedChanges.long2ObjectEntrySet().fastIterator(); ++ ++ try { ++ this.updatingMapSeqLock.acquireWrite(); ++ ++ while (iterator.hasNext()) { ++ final Long2ObjectMap.Entry entry = iterator.next(); ++ final long key = entry.getLongKey(); ++ final Object val = entry.getValue(); ++ ++ if (val == REMOVED) { ++ this.visibleMap.remove(key); ++ } else { ++ this.visibleMap.put(key, (V)val); ++ } ++ } ++ } finally { ++ this.updatingMapSeqLock.releaseWrite(); ++ } ++ ++ this.queuedChanges.clear(); ++ return true; ++ } ++} +\ No newline at end of file +diff --git a/src/main/java/com/tuinity/tuinity/config/TuinityConfig.java b/src/main/java/com/tuinity/tuinity/config/TuinityConfig.java +new file mode 100644 +index 000000000..5edae85e7 +--- /dev/null ++++ b/src/main/java/com/tuinity/tuinity/config/TuinityConfig.java +@@ -0,0 +1,225 @@ ++package com.tuinity.tuinity.config; ++ ++import ca.spottedleaf.concurrentutil.util.Throw; ++import net.minecraft.server.TicketType; ++import org.bukkit.Bukkit; ++import org.bukkit.configuration.ConfigurationSection; ++import org.bukkit.configuration.file.YamlConfiguration; ++ ++import java.io.File; ++import java.lang.reflect.Method; ++import java.lang.reflect.Modifier; ++import java.util.logging.Level; ++ ++public final class TuinityConfig { ++ ++ public static final String CONFIG_HEADER = "Configuration file for Tuinity."; ++ public static final int CURRENT_CONFIG_VERSION = 0; ++ ++ private static final Object[] EMPTY = new Object[0]; ++ ++ private static File configFile; ++ private static YamlConfiguration config; ++ private static int configVersion; ++ ++ public static void init(final File file) { ++ // TODO remove this in the future... ++ final File tuinityConfig = new File(file.getParent(), "tuinity.yml"); ++ if (!tuinityConfig.exists()) { ++ final File oldConfig = new File(file.getParent(), "concrete.yml"); ++ oldConfig.renameTo(tuinityConfig); ++ } ++ TuinityConfig.configFile = file; ++ final YamlConfiguration config = new YamlConfiguration(); ++ config.options().header(CONFIG_HEADER); ++ config.options().copyDefaults(true); ++ ++ if (!file.exists()) { ++ try { ++ file.createNewFile(); ++ } catch (final Exception ex) { ++ Bukkit.getLogger().log(Level.SEVERE, "Failure to create tuinity config", ex); ++ } ++ } else { ++ try { ++ config.load(file); ++ } catch (final Exception ex) { ++ Bukkit.getLogger().log(Level.SEVERE, "Failure to load tuinity config", ex); ++ Throw.rethrow(ex); /* Rethrow, this is critical */ ++ throw new RuntimeException(ex); // unreachable ++ } ++ } ++ ++ TuinityConfig.load(config); ++ } ++ ++ public static void load(final YamlConfiguration config) { ++ TuinityConfig.config = config; ++ TuinityConfig.configVersion = TuinityConfig.getInt("config-version-please-do-not-modify-me", CURRENT_CONFIG_VERSION); ++ ++ for (final Method method : TuinityConfig.class.getDeclaredMethods()) { ++ if (method.getReturnType() != void.class || method.getParameterCount() != 0 || ++ !Modifier.isPrivate(method.getModifiers()) || !Modifier.isStatic(method.getModifiers())) { ++ continue; ++ } ++ ++ try { ++ method.setAccessible(true); ++ method.invoke(null, EMPTY); ++ } catch (final Exception ex) { ++ Throw.rethrow(ex); ++ throw new RuntimeException(ex); // unreachable ++ } ++ } ++ ++ /* We re-save to add new options */ ++ try { ++ config.save(TuinityConfig.configFile); ++ } catch (final Exception ex) { ++ Bukkit.getLogger().log(Level.SEVERE, "Unable to save tuinity config", ex); ++ } ++ } ++ ++ private static boolean getBoolean(final String path, final boolean dfl) { ++ TuinityConfig.config.addDefault(path, Boolean.valueOf(dfl)); ++ return TuinityConfig.config.getBoolean(path, dfl); ++ } ++ ++ private static int getInt(final String path, final int dfl) { ++ TuinityConfig.config.addDefault(path, Integer.valueOf(dfl)); ++ return TuinityConfig.config.getInt(path, dfl); ++ } ++ ++ private static double getDouble(final String path, final double dfl) { ++ TuinityConfig.config.addDefault(path, Double.valueOf(dfl)); ++ return TuinityConfig.config.getDouble(path, dfl); ++ } ++ ++ public static boolean tickWorldsInParallel; ++ ++ /** ++ * if tickWorldsInParallel == true, then this value is used as a default only for worlds ++ */ ++ public static int tickThreads; ++ ++ /* ++ private static void worldticking() { ++ tickWorldsInParallel = TuinityConfig.getBoolean("tick-worlds-in-parallel", false); ++ tickThreads = TuinityConfig.getInt("server-tick-threads", 1); // will be 4 in the future ++ }*/ ++ ++ public static int delayChunkUnloadsBy; ++ ++ private static void delayChunkUnloadsBy() { ++ delayChunkUnloadsBy = TuinityConfig.getInt("delay-chunkunloads-by", 10) * 20; ++ if (delayChunkUnloadsBy >= 0) { ++ TicketType.DELAYED_UNLOAD.loadPeriod = delayChunkUnloadsBy; ++ } ++ } ++ ++ public static int maxChunkLoadsPerPlayer; ++ ++ private static void maxChunkLoadsPerPlayer() { ++ maxChunkLoadsPerPlayer = TuinityConfig.getInt("max-pending-chunk-tickets-per-player", 49); ++ if (maxChunkLoadsPerPlayer <= -1) { ++ maxChunkLoadsPerPlayer = Integer.MAX_VALUE; ++ } ++ } ++ ++ public static final class WorldConnfig { ++ ++ public final String worldName; ++ public ConfigurationSection config; ++ ++ public WorldConnfig(final String worldName) { ++ this.worldName = worldName; ++ this.init(); ++ } ++ ++ public void init() { ++ ConfigurationSection section = TuinityConfig.config.getConfigurationSection(this.worldName); ++ if (section == null) { ++ section = TuinityConfig.config.createSection(this.worldName); ++ } ++ TuinityConfig.config.set(this.worldName, section); ++ ++ this.load(section); ++ } ++ ++ public void load(final ConfigurationSection config) { ++ this.config = config; ++ ++ for (final Method method : TuinityConfig.WorldConnfig.class.getDeclaredMethods()) { ++ if (method.getReturnType() != void.class || method.getParameterCount() != 0 || ++ !Modifier.isPrivate(method.getModifiers()) || Modifier.isStatic(method.getModifiers())) { ++ continue; ++ } ++ ++ try { ++ method.setAccessible(true); ++ method.invoke(this, EMPTY); ++ } catch (final Exception ex) { ++ Throw.rethrow(ex); ++ throw new RuntimeException(ex); // unreachable ++ } ++ } ++ ++ /* We re-save to add new options */ ++ try { ++ TuinityConfig.config.save(TuinityConfig.configFile); ++ } catch (final Exception ex) { ++ Bukkit.getLogger().log(Level.SEVERE, "Unable to save tuinity config", ex); ++ } ++ } ++ ++ private boolean getBoolean(final String path, final boolean dfl) { ++ this.config.addDefault(path, Boolean.valueOf(dfl)); ++ return this.config.getBoolean(path, dfl); ++ } ++ ++ private int getInt(final String path, final int dfl) { ++ this.config.addDefault(path, Integer.valueOf(dfl)); ++ return this.config.getInt(path, dfl); ++ } ++ ++ private double getDouble(final String path, final double dfl) { ++ this.config.addDefault(path, Double.valueOf(dfl)); ++ return this.config.getDouble(path, dfl); ++ } ++ ++ /** ignored if {@link TuinityConfig#tickWorldsInParallel} == false */ ++ public int threads; ++ ++ /* ++ private void worldthreading() { ++ final int threads = this.getInt("tick-threads", -1); ++ this.threads = threads == -1 ? TuinityConfig.tickThreads : threads; ++ }*/ ++ ++ public int noTickViewDistance; ++ private void noTickViewDistance() { ++ this.noTickViewDistance = this.getInt("no-tick-view-distance", -1); ++ } ++ ++ public boolean useOptimizedTracker; ++ public int optimizedTrackerTrackRange; ++ public int optimizedTrackerUntrackRange; ++ ++ private void optimizetracker() { ++ this.useOptimizedTracker = this.getBoolean("optimized-tracker", true); ++ this.optimizedTrackerTrackRange = this.getInt("optimized-tracker-track-range", -1); ++ this.optimizedTrackerUntrackRange = this.getInt("optimized-tracker-untrack-range", -1); ++ if (!this.useOptimizedTracker) { ++ this.optimizedTrackerTrackRange = -1; ++ this.optimizedTrackerUntrackRange = -1; ++ return; ++ } ++ if (this.optimizedTrackerTrackRange != this.optimizedTrackerUntrackRange && (this.optimizedTrackerTrackRange | this.optimizedTrackerUntrackRange) == -1) { ++ // TODO error here ++ this.optimizedTrackerTrackRange = -1; ++ this.optimizedTrackerUntrackRange = -1; ++ } ++ } ++ } ++ ++} +\ No newline at end of file +diff --git a/src/main/java/com/tuinity/tuinity/server/TickListServerInterval.java b/src/main/java/com/tuinity/tuinity/server/TickListServerInterval.java +new file mode 100644 +index 000000000..bef788ccf +--- /dev/null ++++ b/src/main/java/com/tuinity/tuinity/server/TickListServerInterval.java +@@ -0,0 +1,42 @@ ++package com.tuinity.tuinity.server; ++ ++import com.tuinity.tuinity.util.set.LinkedSortedSet; ++import net.minecraft.server.NextTickListEntry; ++import net.minecraft.server.TickListPriority; ++ ++import java.util.Comparator; ++ ++// represents a set of entries to tick at a specified time ++public final class TickListServerInterval { ++ ++ public static final int TOTAL_PRIORITIES = TickListPriority.values().length; ++ public static final Comparator> ENTRY_COMPARATOR_BY_ID = (entry1, entry2) -> { ++ return Long.compare(entry1.getId(), entry2.getId()); ++ }; ++ public static final Comparator> ENTRY_COMPARATOR = (Comparator)NextTickListEntry.comparator(); ++ ++ // we do not record the interval, this class is meant to be used on a ring buffer ++ ++ // inlined enum map for TickListPriority ++ public final LinkedSortedSet>[] byPriority = new LinkedSortedSet[TOTAL_PRIORITIES]; ++ ++ { ++ for (int i = 0, len = this.byPriority.length; i < len; ++i) { ++ this.byPriority[i] = new LinkedSortedSet<>(ENTRY_COMPARATOR_BY_ID); ++ } ++ } ++ ++ public void addEntryLast(final NextTickListEntry entry) { ++ this.byPriority[entry.getPriority().ordinal()].addLast(entry); ++ } ++ ++ public void addEntryFirst(final NextTickListEntry entry) { ++ this.byPriority[entry.getPriority().ordinal()].addFirst(entry); ++ } ++ ++ public void clear() { ++ for (int i = 0, len = this.byPriority.length; i < len; ++i) { ++ this.byPriority[i].clear(); // O(1) clear ++ } ++ } ++} +diff --git a/src/main/java/com/tuinity/tuinity/server/TuinityTickList.java b/src/main/java/com/tuinity/tuinity/server/TuinityTickList.java +new file mode 100644 +index 000000000..4118dd7e1 +--- /dev/null ++++ b/src/main/java/com/tuinity/tuinity/server/TuinityTickList.java +@@ -0,0 +1,614 @@ ++package com.tuinity.tuinity.server; ++ ++import com.tuinity.tuinity.util.TickThread; ++import com.tuinity.tuinity.util.Util; ++import ca.spottedleaf.concurrentutil.util.Validate; ++import it.unimi.dsi.fastutil.longs.Long2ObjectMap; ++import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap; ++import it.unimi.dsi.fastutil.objects.ObjectRBTreeSet; ++import net.minecraft.server.BaseBlockPosition; ++import net.minecraft.server.BlockPosition; ++import net.minecraft.server.ChunkCoordIntPair; ++import net.minecraft.server.ChunkProviderServer; ++import net.minecraft.server.CrashReport; ++import net.minecraft.server.CrashReportSystemDetails; ++import net.minecraft.server.IBlockData; ++import net.minecraft.server.MinecraftKey; ++import net.minecraft.server.NBTTagList; ++import net.minecraft.server.NextTickListEntry; ++import net.minecraft.server.ReportedException; ++import net.minecraft.server.StructureBoundingBox; ++import net.minecraft.server.TickListPriority; ++import net.minecraft.server.TickListServer; ++import net.minecraft.server.WorldServer; ++ ++import java.util.ArrayDeque; ++import java.util.ArrayList; ++import java.util.Collections; ++import java.util.Comparator; ++import java.util.Iterator; ++import java.util.List; ++import java.util.function.Consumer; ++import java.util.function.Function; ++import java.util.function.Predicate; ++import java.util.stream.Stream; ++ ++public final class TuinityTickList extends TickListServer { // extend to avoid breaking ABI ++ ++ // in the order the state is expected to change (mostly) ++ public static final int STATE_UNSCHEDULED = 1 << 0; ++ public static final int STATE_SCHEDULED = 1 << 1; // scheduled for some tick ++ public static final int STATE_PENDING_TICK = 1 << 2; // for this tick ++ public static final int STATE_TICKING = 1 << 3; ++ public static final int STATE_TICKED = 1 << 4; // after this, it gets thrown back to unscheduled ++ public static final int STATE_CANCELLED_TICK = 1 << 5; // still gets moved to unscheduled after tick ++ ++ private static final int SHORT_SCHEDULE_TICK_THRESHOLD = 20 * 5 + 1; // 5 seconds ++ ++ private final WorldServer world; ++ private final Predicate excludeFromScheduling; ++ private final Function getMinecraftKeyFrom; ++ private final Function getObjectFronMinecraftKey; ++ private final Consumer> tickFunction; ++ ++ private final co.aikar.timings.Timing timingCleanup; // Paper ++ private final co.aikar.timings.Timing timingTicking; // Paper ++ private final co.aikar.timings.Timing timingFinished; ++ ++ // note: remove ops / add ops suck on fastutil, a chained hashtable implementation would work better, but Long... ++ // try to alleviate with a very small load factor ++ private final Long2ObjectOpenHashMap>> entriesByBlock = new Long2ObjectOpenHashMap<>(1024, 0.25f); ++ private final Long2ObjectOpenHashMap>> entriesByChunk = new Long2ObjectOpenHashMap<>(1024, 0.25f); ++ private final Long2ObjectOpenHashMap>> pendingChunkTickLoad = new Long2ObjectOpenHashMap<>(1024, 0.5f); ++ ++ // fastutil has O(1) first/last while TreeMap/TreeSet are log(n) ++ private final ObjectRBTreeSet> longScheduled = new ObjectRBTreeSet<>(TickListServerInterval.ENTRY_COMPARATOR); ++ ++ private final ArrayDeque> toTickThisTick = new ArrayDeque<>(); ++ ++ private final TickListServerInterval[] shortScheduled = new TickListServerInterval[SHORT_SCHEDULE_TICK_THRESHOLD]; ++ { ++ for (int i = 0, len = this.shortScheduled.length; i < len; ++i) { ++ this.shortScheduled[i] = new TickListServerInterval<>(); ++ } ++ } ++ private int shortScheduledIndex; ++ ++ private long nextTick; ++ ++ // assume index < length ++ private static int getWrappedIndex(final int start, final int length, final int index) { ++ final int next = start + index; ++ return next < length ? next : next - length; ++ } ++ ++ private static int getNextIndex(final int curr, final int length) { ++ final int next = curr + 1; ++ return next < length ? next : 0; ++ } ++ ++ public TuinityTickList(final WorldServer world, final Predicate excludeFromScheduling, final Function getMinecraftKeyFrom, ++ final Function getObjectFronMinecraftKey, final Consumer> tickFunction, final String timingsType) { ++ super(world, excludeFromScheduling, getMinecraftKeyFrom, getObjectFronMinecraftKey, tickFunction, timingsType); ++ this.world = world; ++ this.excludeFromScheduling = excludeFromScheduling; ++ this.getMinecraftKeyFrom = getMinecraftKeyFrom; ++ this.getObjectFronMinecraftKey = getObjectFronMinecraftKey; ++ this.tickFunction = tickFunction; ++ this.timingCleanup = co.aikar.timings.WorldTimingsHandler.getTickList(world, timingsType + " - Cleanup"); // Paper ++ this.timingTicking = co.aikar.timings.WorldTimingsHandler.getTickList(world, timingsType + " - Ticking"); // Paper ++ this.timingFinished = co.aikar.timings.WorldTimingsHandler.getTickList(world, timingsType + " - Finish"); ++ this.nextTick = this.world.getTime(); ++ } ++ ++ private void queueEntryForTick(final NextTickListEntry entry, final ChunkProviderServer chunkProvider) { ++ if (entry.tickState == STATE_SCHEDULED) { ++ if (chunkProvider.isTickingReadyMainThread(entry.getPosition())) { ++ this.toTickThisTick.add(entry); ++ entry.tickState = STATE_PENDING_TICK; ++ } else { ++ // we dump them to a map to avoid constantly re-scheduling them ++ this.addToNotTickingReady(entry); ++ } ++ } ++ } ++ ++ private void addToNotTickingReady(final NextTickListEntry entry) { ++ this.pendingChunkTickLoad.computeIfAbsent(Util.getCoordinateKey(entry.getPosition()), (long keyInMap) -> { ++ return new ArrayList<>(); ++ }).add(entry); ++ } ++ ++ private void addToSchedule(final NextTickListEntry entry) { ++ long delay = entry.getTargetTick() - this.nextTick; ++ if (delay < SHORT_SCHEDULE_TICK_THRESHOLD) { ++ if (delay < 0) { ++ // longScheduled orders by tick time, short scheduled does not ++ this.longScheduled.add(entry); ++ } else { ++ this.shortScheduled[getWrappedIndex(this.shortScheduledIndex, SHORT_SCHEDULE_TICK_THRESHOLD, (int)delay)].addEntryLast(entry); ++ } ++ } else { ++ this.longScheduled.add(entry); ++ } ++ } ++ ++ private void removeEntry(final NextTickListEntry entry) { ++ entry.tickState = STATE_CANCELLED_TICK; ++ // short/long scheduled will skip the entry ++ ++ final BlockPosition pos = entry.getPosition(); ++ final long blockKey = Util.getBlockKey(pos); ++ ++ final ArrayList> currentEntries = this.entriesByBlock.get(blockKey); ++ ++ if (currentEntries.size() == 1) { ++ // it should contain our entry ++ this.entriesByBlock.remove(blockKey); ++ } else { ++ // it's more likely that this entry is at the start of the list than the end ++ for (int i = 0, len = currentEntries.size(); i < len; ++i) { ++ final NextTickListEntry currentEntry = currentEntries.get(i); ++ if (currentEntry == entry) { ++ currentEntries.remove(i); ++ break; ++ } ++ } ++ } ++ ++ final long chunkKey = Util.getCoordinateKey(entry.getPosition()); ++ ++ ObjectRBTreeSet> set = this.entriesByChunk.get(chunkKey); ++ ++ set.remove(entry); ++ ++ if (set.isEmpty()) { ++ this.entriesByChunk.remove(chunkKey); ++ } ++ ++ ArrayList> pendingTickingLoad = this.pendingChunkTickLoad.get(chunkKey); ++ ++ if (pendingTickingLoad != null) { ++ for (int i = 0, len = pendingTickingLoad.size(); i < len; ++i) { ++ if (pendingTickingLoad.get(i) == entry) { ++ pendingTickingLoad.remove(i); ++ break; ++ } ++ } ++ ++ if (pendingTickingLoad.isEmpty()) { ++ this.pendingChunkTickLoad.remove(chunkKey); ++ } ++ } ++ } ++ ++ public void onChunkSetTicking(final int chunkX, final int chunkZ) { ++ TickThread.softEnsureTickThread("async tick list chunk ticking update"); ++ final ArrayList> pending = this.pendingChunkTickLoad.remove(Util.getCoordinateKey(chunkX, chunkZ)); ++ if (pending == null) { ++ return; ++ } ++ ++ for (int i = 0, size = pending.size(); i < size; ++i) { ++ final NextTickListEntry entry = pending.get(i); ++ // already in all the relevant reference maps, just need to add to longScheduled or shortScheduled ++ this.addToSchedule(entry); ++ } ++ } ++ ++ private void prepare() { ++ final long currentTick = this.world.getTime(); ++ ++ final ChunkProviderServer chunkProvider = this.world.getChunkProvider(); ++ ++ // here we setup what's going to tick ++ ++ // we don't remove items from shortScheduled (but do from longScheduled) because they're cleared at the end of ++ // this tick ++ if (this.longScheduled.isEmpty() || this.longScheduled.first().getTargetTick() > currentTick) { ++ // nothing in longScheduled to worry about ++ final TickListServerInterval interval = this.shortScheduled[this.shortScheduledIndex]; ++ for (int i = 0, len = interval.byPriority.length; i < len; ++i) { ++ for (final Iterator> iterator = interval.byPriority[i].iterator(); iterator.hasNext();) { ++ this.queueEntryForTick(iterator.next(), chunkProvider); ++ } ++ } ++ } else { ++ final TickListServerInterval interval = this.shortScheduled[this.shortScheduledIndex]; ++ ++ // combine interval and longScheduled, keeping order ++ final Comparator> comparator = (Comparator)TickListServerInterval.ENTRY_COMPARATOR; ++ final Iterator> longScheduledIterator = this.longScheduled.iterator(); ++ NextTickListEntry longCurrent = longScheduledIterator.next(); ++ ++ for (int i = 0, len = interval.byPriority.length; i < len; ++i) { ++ for (final Iterator> iterator = interval.byPriority[i].iterator(); iterator.hasNext();) { ++ final NextTickListEntry shortCurrent = iterator.next(); ++ if (longCurrent != null) { ++ // drain longCurrent until we can add shortCurrent ++ while (comparator.compare(longCurrent, shortCurrent) <= 0) { ++ this.queueEntryForTick(longCurrent, chunkProvider); ++ longScheduledIterator.remove(); ++ if (longScheduledIterator.hasNext()) { ++ longCurrent = longScheduledIterator.next(); ++ if (longCurrent.getTargetTick() > currentTick) { ++ longCurrent = null; ++ break; ++ } ++ } else { ++ longCurrent = null; ++ break; ++ } ++ } ++ } ++ this.queueEntryForTick(shortCurrent, chunkProvider); ++ } ++ } ++ ++ // add remaining from long scheduled ++ for (;;) { ++ if (longCurrent == null || longCurrent.getTargetTick() > currentTick) { ++ break; ++ } ++ longScheduledIterator.remove(); ++ this.queueEntryForTick(longCurrent, chunkProvider); ++ ++ if (longScheduledIterator.hasNext()) { ++ longCurrent = longScheduledIterator.next(); ++ } else { ++ break; ++ } ++ } ++ } ++ } ++ ++ @Override ++ public void tick() { ++ TickThread.softEnsureTickThread("async tick list tick"); ++ final ChunkProviderServer chunkProvider = this.world.getChunkProvider(); ++ ++ this.world.getMethodProfiler().enter("cleaning"); ++ this.timingCleanup.startTiming(); ++ ++ this.prepare(); ++ ++ // this must be done here in case something schedules in the tick code ++ this.shortScheduled[this.shortScheduledIndex].clear(); ++ this.shortScheduledIndex = getNextIndex(this.shortScheduledIndex, SHORT_SCHEDULE_TICK_THRESHOLD); ++ this.nextTick = this.world.getTime() + 1; ++ ++ this.timingCleanup.stopTiming(); ++ this.world.getMethodProfiler().exitEnter("ticking"); ++ this.timingTicking.startTiming(); ++ ++ for (final NextTickListEntry toTick : this.toTickThisTick) { ++ if (toTick.tickState != STATE_PENDING_TICK) { ++ // onTickEnd gets called at end of tick ++ continue; ++ } ++ try { ++ if (chunkProvider.isTickingReadyMainThread(toTick.getPosition())) { ++ toTick.tickState = STATE_TICKING; ++ this.tickFunction.accept(toTick); ++ toTick.tickState = STATE_TICKED; ++ } else { ++ // re-schedule eventually ++ toTick.tickState = STATE_SCHEDULED; ++ this.addToNotTickingReady(toTick); ++ } ++ } catch (final Throwable thr) { ++ // start copy from TickListServer // TODO check on update ++ CrashReport crashreport = CrashReport.a(thr, "Exception while ticking"); ++ CrashReportSystemDetails crashreportsystemdetails = crashreport.a("Block being ticked"); ++ ++ CrashReportSystemDetails.a(crashreportsystemdetails, toTick.getPosition(), (IBlockData) null); ++ throw new ReportedException(crashreport); ++ // end copy from TickListServer ++ } ++ } ++ ++ this.timingTicking.stopTiming(); ++ this.world.getMethodProfiler().exit(); ++ this.timingFinished.startTiming(); ++ ++ // finished ticking, actual cleanup time ++ for (int i = 0, len = this.toTickThisTick.size(); i < len; ++i) { ++ final NextTickListEntry entry = this.toTickThisTick.poll(); ++ if (entry.tickState != STATE_SCHEDULED) { ++ // some entries get re-scheduled due to their chunk not being loaded/at correct status, so do not ++ // call onTickEnd for them ++ this.onTickEnd(entry); ++ } ++ } ++ ++ this.timingFinished.stopTiming(); ++ } ++ ++ private void onTickEnd(final NextTickListEntry entry) { ++ entry.tickState = STATE_UNSCHEDULED; ++ ++ final BlockPosition pos = entry.getPosition(); ++ final long blockKey = Util.getBlockKey(pos); ++ ++ final ArrayList> currentEntries = this.entriesByBlock.get(blockKey); ++ ++ if (currentEntries.size() == 1) { ++ // it should contain our entry ++ this.entriesByBlock.remove(blockKey); ++ } else { ++ // it's more likely that this entry is at the start of the list than the end ++ for (int i = 0, len = currentEntries.size(); i < len; ++i) { ++ final NextTickListEntry currentEntry = currentEntries.get(i); ++ if (currentEntry == entry) { ++ currentEntries.remove(i); ++ break; ++ } ++ } ++ } ++ ++ final long chunkKey = Util.getCoordinateKey(entry.getPosition()); ++ ++ ObjectRBTreeSet> set = this.entriesByChunk.get(chunkKey); ++ ++ set.remove(entry); ++ ++ if (set.isEmpty()) { ++ this.entriesByChunk.remove(chunkKey); ++ } ++ ++ // already removed from longScheduled or shortScheduled ++ } ++ ++ @Override ++ public boolean isPendingTickThisTick(final BlockPosition blockposition, final T data) { ++ final ArrayList> entries = this.entriesByBlock.get(Util.getBlockKey(blockposition)); ++ ++ if (entries == null) { ++ return false; ++ } ++ ++ for (int i = 0, size = entries.size(); i < size; ++i) { ++ final NextTickListEntry entry = entries.get(i); ++ if (entry.getData() == data && entry.tickState == STATE_PENDING_TICK) { ++ return true; ++ } ++ } ++ ++ return false; ++ } ++ ++ @Override ++ public boolean isScheduledForTick(final BlockPosition blockposition, final T data) { ++ final ArrayList> entries = this.entriesByBlock.get(Util.getBlockKey(blockposition)); ++ ++ if (entries == null) { ++ return false; ++ } ++ ++ for (int i = 0, size = entries.size(); i < size; ++i) { ++ final NextTickListEntry entry = entries.get(i); ++ if (entry.getData() == data && entry.tickState == STATE_SCHEDULED) { ++ return true; ++ } ++ } ++ ++ return false; ++ } ++ ++ @Override ++ public void schedule(BlockPosition blockPosition, T t, int i, TickListPriority tickListPriority) { ++ this.schedule(blockPosition, t, i + this.world.getTime(), tickListPriority); ++ } ++ ++ public void schedule(final NextTickListEntry entry) { ++ this.schedule(entry.getPosition(), entry.getData(), entry.getTargetTick(), entry.getPriority()); ++ } ++ ++ public void schedule(final BlockPosition pos, final T data, final long targetTick, final TickListPriority priority) { ++ TickThread.softEnsureTickThread("async tick list schedule"); ++ ++ final NextTickListEntry entry = new NextTickListEntry<>(pos, data, targetTick, priority); ++ Validate.notNull(entry, "null entry"); ++ if (this.excludeFromScheduling.test(entry.getData())) { ++ return; ++ } ++ ++ final long blockKey = Util.getBlockKey(pos); ++ ++ final ArrayList> currentEntries = this.entriesByBlock.computeIfAbsent(blockKey, (long keyInMap) -> new ArrayList<>(3)); ++ ++ if (currentEntries.isEmpty()) { ++ currentEntries.add(entry); ++ } else { ++ for (int i = 0, size = currentEntries.size(); i < size; ++i) { ++ final NextTickListEntry currentEntry = currentEntries.get(i); ++ ++ // entries are only blocked from scheduling if currentEntry.equals(toSchedule) && currentEntry is scheduled to tick (NOT including pending) ++ if (currentEntry.getData() == entry.getData() && currentEntry.tickState == STATE_SCHEDULED) { ++ // can't add ++ return; ++ } ++ } ++ currentEntries.add(entry); ++ } ++ ++ entry.tickState = STATE_SCHEDULED; ++ ++ this.entriesByChunk.computeIfAbsent(Util.getCoordinateKey(entry.getPosition()), (final long keyInMap) -> { ++ return new ObjectRBTreeSet<>(TickListServerInterval.ENTRY_COMPARATOR); ++ }).add(entry); ++ ++ this.addToSchedule(entry); ++ } ++ ++ @Override ++ public void scheduleAll(final Stream> stream) { ++ this.scheduleAll(stream.iterator()); ++ } ++ public void scheduleAll(final Iterator> iterator) { ++ while (iterator.hasNext()) { ++ this.schedule(iterator.next()); ++ } ++ } ++ ++ // this is not the standard interception calculation, but it's the one vanilla uses ++ // i.e the y value is ignored? the x, z calc isn't correct? ++ // however for the copy op they use the correct intersection, after using this one of course... ++ private static boolean isBlockInSortof(final StructureBoundingBox boundingBox, final BlockPosition pos) { ++ return pos.getX() >= boundingBox.getMinX() && pos.getX() < boundingBox.getMaxX() && pos.getZ() >= boundingBox.getMinZ() && pos.getZ() < boundingBox.getMaxZ(); ++ } ++ ++ @Override ++ public List> getEntriesInBoundingBox(final StructureBoundingBox structureboundingbox, final boolean removeReturned, final boolean excludeTicked) { ++ TickThread.softEnsureTickThread("async tick list get"); ++ if (structureboundingbox.getMinX() == structureboundingbox.getMaxX() || structureboundingbox.getMinZ() == structureboundingbox.getMaxZ()) { ++ return Collections.emptyList(); // vanilla behaviour, check isBlockInSortof above ++ } ++ ++ final int lowerChunkX = structureboundingbox.getMinX() >> 4; ++ final int upperChunkX = (structureboundingbox.getMaxX() - 1) >> 4; // subtract 1 since maxX is exclusive ++ final int lowerChunkZ = structureboundingbox.getMinZ() >> 4; ++ final int upperChunkZ = (structureboundingbox.getMaxZ() - 1) >> 4; // subtract 1 since maxZ is exclusive ++ ++ final int xChunksLength = (upperChunkX - lowerChunkX + 1); ++ final int zChunksLength = (upperChunkZ - lowerChunkZ + 1); ++ ++ final ObjectRBTreeSet>[] containingChunks = new ObjectRBTreeSet[xChunksLength * zChunksLength]; ++ ++ final int offset = (xChunksLength * -lowerChunkZ - lowerChunkX); ++ int totalEntries = 0; ++ for (int currChunkX = lowerChunkX; currChunkX <= upperChunkX; ++currChunkX) { ++ for (int currChunkZ = lowerChunkZ; currChunkZ <= upperChunkZ; ++currChunkZ) { ++ // todo optimize ++ //final int index = (currChunkX - lowerChunkX) + xChunksLength * (currChunkZ - lowerChunkZ); ++ final int index = offset + currChunkX + xChunksLength * currChunkZ; ++ final ObjectRBTreeSet> set = containingChunks[index] = this.entriesByChunk.get(Util.getCoordinateKey(currChunkX, currChunkZ)); ++ if (set != null) { ++ totalEntries += set.size(); ++ } ++ } ++ } ++ ++ final List> ret = new ArrayList<>(totalEntries); ++ ++ final int matchOne = (STATE_SCHEDULED | STATE_PENDING_TICK) | (excludeTicked ? 0 : (STATE_TICKING | STATE_TICKED)); ++ ++ Util.mergeSortedSets((NextTickListEntry entry) -> { ++ if (!isBlockInSortof(structureboundingbox, entry.getPosition())) { ++ return; ++ } ++ final int tickState = entry.tickState; ++ if ((tickState & matchOne) == 0) { ++ return; ++ } ++ ++ ret.add(entry); ++ return; ++ }, TickListServerInterval.ENTRY_COMPARATOR, containingChunks); ++ ++ if (removeReturned) { ++ for (NextTickListEntry entry : ret) { ++ this.removeEntry(entry); ++ } ++ } ++ ++ return ret; ++ } ++ ++ @Override ++ public void copy(StructureBoundingBox structureboundingbox, BlockPosition blockposition) { ++ TickThread.softEnsureTickThread("async tick list copy"); ++ // start copy from TickListServer // TODO check on update ++ List> list = this.getEntriesInBoundingBox(structureboundingbox, false, false); ++ Iterator> iterator = list.iterator(); ++ ++ while (iterator.hasNext()) { ++ NextTickListEntry nextticklistentry = iterator.next(); ++ ++ if (structureboundingbox.hasPoint( nextticklistentry.getPosition())) { ++ BlockPosition blockposition1 = nextticklistentry.getPosition().add(blockposition); ++ T t0 = nextticklistentry.getData(); ++ ++ this.schedule(new NextTickListEntry<>(blockposition1, t0, nextticklistentry.getTargetTick(), nextticklistentry.getPriority())); ++ } ++ } ++ // end copy from TickListServer ++ } ++ ++ @Override ++ public List> getEntriesInChunk(ChunkCoordIntPair chunkPos, boolean removeReturned, boolean excludeTicked) { ++ TickThread.softEnsureTickThread("async tick list get"); ++ // Vanilla DOES get the entries 2 blocks out of the chunk too, but that doesn't matter since we ignore chunks ++ // not at ticking status, and ticking status requires neighbours loaded ++ // so with this method we will reduce scheduler churning ++ final int matchOne = (STATE_SCHEDULED | STATE_PENDING_TICK) | (excludeTicked ? 0 : (STATE_TICKING | STATE_TICKED)); ++ ++ final ObjectRBTreeSet> entries = this.entriesByChunk.get(Util.getCoordinateKey(chunkPos)); ++ ++ if (entries == null) { ++ return Collections.emptyList(); ++ } ++ ++ final List> ret = new ArrayList<>(entries.size()); ++ ++ for (NextTickListEntry entry : entries) { ++ if ((entry.tickState & matchOne) == 0) { ++ continue; ++ } ++ ret.add(entry); ++ } ++ ++ if (removeReturned) { ++ for (NextTickListEntry entry : ret) { ++ this.removeEntry(entry); ++ } ++ } ++ ++ return ret; ++ } ++ ++ @Override ++ public NBTTagList serialize(ChunkCoordIntPair chunkcoordintpair) { ++ TickThread.softEnsureTickThread("async tick list serialize"); ++ // start copy from TickListServer // TODO check on update ++ List> list = this.getEntriesInChunk(chunkcoordintpair, false, true); ++ ++ return TickListServer.serialize(this.getMinecraftKeyFrom, list, this.world.getTime()); ++ // end copy from TickListServer ++ } ++ ++ @Override ++ public int getTotalScheduledEntries() { ++ TickThread.softEnsureTickThread("async tick list get size"); ++ // good thing this is only used in debug reports // TODO check on update ++ int ret = 0; ++ ++ for (NextTickListEntry entry : this.longScheduled) { ++ if (entry.tickState == STATE_SCHEDULED) { ++ ++ret; ++ } ++ } ++ ++ for (Iterator>>> iterator = this.pendingChunkTickLoad.long2ObjectEntrySet().iterator(); iterator.hasNext();) { ++ ArrayList> list = iterator.next().getValue(); ++ ++ for (NextTickListEntry entry : list) { ++ if (entry.tickState == STATE_SCHEDULED) { ++ ++ret; ++ } ++ } ++ } ++ ++ for (TickListServerInterval interval : this.shortScheduled) { ++ for (Iterable> set : interval.byPriority) { ++ for (NextTickListEntry entry : set) { ++ if (entry.tickState == STATE_SCHEDULED) { ++ ++ret; ++ } ++ } ++ } ++ } ++ ++ return ret; ++ } ++} +diff --git a/src/main/java/com/tuinity/tuinity/util/ChunkList.java b/src/main/java/com/tuinity/tuinity/util/ChunkList.java +new file mode 100644 +index 000000000..66c64be8f +--- /dev/null ++++ b/src/main/java/com/tuinity/tuinity/util/ChunkList.java +@@ -0,0 +1,119 @@ ++package com.tuinity.tuinity.util; ++ ++import it.unimi.dsi.fastutil.longs.Long2IntOpenHashMap; ++import net.minecraft.server.Chunk; ++ ++import java.util.Arrays; ++import java.util.Iterator; ++import java.util.NoSuchElementException; ++ ++// list with O(1) remove & contains ++public final class ChunkList implements Iterable { ++ ++ protected final Long2IntOpenHashMap chunkToIndex = new Long2IntOpenHashMap(); ++ { ++ this.chunkToIndex.defaultReturnValue(Integer.MIN_VALUE); ++ } ++ ++ protected Chunk[] chunks = new Chunk[16]; ++ protected int count; ++ ++ public int size() { ++ return this.count; ++ } ++ ++ public boolean contains(final Chunk chunk) { ++ return this.chunkToIndex.containsKey(Util.getCoordinateKey(chunk.getPos())); ++ } ++ ++ public boolean remove(final Chunk chunk) { ++ final int index = this.chunkToIndex.remove(Util.getCoordinateKey(chunk.getPos())); ++ if (index == Integer.MIN_VALUE) { ++ return false; ++ } ++ ++ // move the entity at the end to this index ++ final int endIndex = --this.count; ++ final Chunk end = this.chunks[endIndex]; ++ if (index != endIndex) { ++ // not empty after this call ++ this.chunkToIndex.put(Util.getCoordinateKey(end.getPos()), index); // update index ++ } ++ this.chunks[index] = end; ++ this.chunks[endIndex] = null; ++ ++ return true; ++ } ++ ++ public boolean add(final Chunk chunk) { ++ final int count = this.count; ++ final int currIndex = this.chunkToIndex.putIfAbsent(Util.getCoordinateKey(chunk.getPos()), count); ++ ++ if (currIndex != Integer.MIN_VALUE) { ++ return false; // already in this list ++ } ++ ++ Chunk[] list = this.chunks; ++ ++ if (list.length == count) { ++ // resize required ++ list = this.chunks = Arrays.copyOf(list, count * 2); // overflow results in negative ++ } ++ ++ list[count] = chunk; ++ this.count = count + 1; ++ ++ return true; ++ } ++ ++ public Chunk getChecked(final int index) { ++ if (index < 0 || index >= this.count) { ++ throw new IndexOutOfBoundsException("Index: " + index + " is out of bounds, size: " + this.count); ++ } ++ return this.chunks[index]; ++ } ++ ++ public Chunk getUnchecked(final int index) { ++ return this.chunks[index]; ++ } ++ ++ public Chunk[] getRawData() { ++ return this.chunks; ++ } ++ ++ @Override ++ public Iterator iterator() { ++ return new Iterator<>() { ++ ++ Chunk lastRet; ++ int current; ++ ++ @Override ++ public boolean hasNext() { ++ return this.current < ChunkList.this.count; ++ } ++ ++ @Override ++ public Chunk next() { ++ if (this.current >= ChunkList.this.count) { ++ throw new NoSuchElementException(); ++ } ++ return this.lastRet = ChunkList.this.chunks[this.current++]; ++ } ++ ++ @Override ++ public void remove() { ++ final Chunk lastRet = this.lastRet; ++ ++ if (lastRet == null) { ++ throw new IllegalStateException(); ++ } ++ this.lastRet = null; ++ ++ ChunkList.this.remove(lastRet); ++ --this.current; ++ } ++ }; ++ } ++ ++} +diff --git a/src/main/java/com/tuinity/tuinity/util/EntityList.java b/src/main/java/com/tuinity/tuinity/util/EntityList.java +new file mode 100644 +index 000000000..570c44e26 +--- /dev/null ++++ b/src/main/java/com/tuinity/tuinity/util/EntityList.java +@@ -0,0 +1,124 @@ ++package com.tuinity.tuinity.util; ++ ++import it.unimi.dsi.fastutil.ints.Int2IntOpenHashMap; ++import net.minecraft.server.Entity; ++ ++import java.util.Arrays; ++import java.util.Iterator; ++import java.util.NoSuchElementException; ++ ++// list with O(1) remove & contains ++public final class EntityList implements Iterable { ++ ++ protected final Int2IntOpenHashMap entityToIndex = new Int2IntOpenHashMap(); ++ { ++ this.entityToIndex.defaultReturnValue(Integer.MIN_VALUE); ++ } ++ ++ protected Entity[] entities = new Entity[16]; ++ protected int count; ++ ++ public int size() { ++ return this.count; ++ } ++ ++ public boolean contains(final Entity entity) { ++ return this.entityToIndex.containsKey(entity.getId()); ++ } ++ ++ public boolean remove(final Entity entity) { ++ final int index = this.entityToIndex.remove(entity.getId()); ++ if (index == Integer.MIN_VALUE) { ++ return false; ++ } ++ ++ // move the entity at the end to this index ++ final int endIndex = --this.count; ++ final Entity end = this.entities[endIndex]; ++ if (index != endIndex) { ++ // not empty after this call ++ this.entityToIndex.put(end.getId(), index); // update index ++ } ++ this.entities[index] = end; ++ this.entities[endIndex] = null; ++ ++ return true; ++ } ++ ++ public boolean add(final Entity entity) { ++ final int count = this.count; ++ final int currIndex = this.entityToIndex.putIfAbsent(entity.getId(), count); ++ ++ if (currIndex != Integer.MIN_VALUE) { ++ return false; // already in this list ++ } ++ ++ Entity[] list = this.entities; ++ ++ if (list.length == count) { ++ // resize required ++ list = this.entities = Arrays.copyOf(list, count * 2); // overflow results in negative ++ } ++ ++ list[count] = entity; ++ this.count = count + 1; ++ ++ return true; ++ } ++ ++ public Entity getChecked(final int index) { ++ if (index < 0 || index >= this.count) { ++ throw new IndexOutOfBoundsException("Index: " + index + " is out of bounds, size: " + this.count); ++ } ++ return this.entities[index]; ++ } ++ ++ public Entity getUnchecked(final int index) { ++ return this.entities[index]; ++ } ++ ++ public Entity[] getRawData() { ++ return this.entities; ++ } ++ ++ public void clear() { ++ this.entityToIndex.clear(); ++ Arrays.fill(this.entities, 0, this.count, null); ++ this.count = 0; ++ } ++ ++ @Override ++ public Iterator iterator() { ++ return new Iterator<>() { ++ ++ Entity lastRet; ++ int current; ++ ++ @Override ++ public boolean hasNext() { ++ return this.current < EntityList.this.count; ++ } ++ ++ @Override ++ public Entity next() { ++ if (this.current >= EntityList.this.count) { ++ throw new NoSuchElementException(); ++ } ++ return this.lastRet = EntityList.this.entities[this.current++]; ++ } ++ ++ @Override ++ public void remove() { ++ final Entity lastRet = this.lastRet; ++ ++ if (lastRet == null) { ++ throw new IllegalStateException(); ++ } ++ this.lastRet = null; ++ ++ EntityList.this.remove(lastRet); ++ --this.current; ++ } ++ }; ++ } ++} +diff --git a/src/main/java/com/tuinity/tuinity/util/IBlockDataList.java b/src/main/java/com/tuinity/tuinity/util/IBlockDataList.java +new file mode 100644 +index 000000000..ce15ce532 +--- /dev/null ++++ b/src/main/java/com/tuinity/tuinity/util/IBlockDataList.java +@@ -0,0 +1,123 @@ ++package com.tuinity.tuinity.util; ++ ++import it.unimi.dsi.fastutil.longs.LongIterator; ++import it.unimi.dsi.fastutil.shorts.Short2LongOpenHashMap; ++import net.minecraft.server.ChunkSection; ++import net.minecraft.server.DataPaletteGlobal; ++import net.minecraft.server.IBlockData; ++import java.util.Arrays; ++ ++public final class IBlockDataList { ++ ++ static final DataPaletteGlobal GLOBAL_PALETTE = (DataPaletteGlobal)ChunkSection.GLOBAL_PALETTE; ++ ++ // map of location -> (index | (location << 16) | (palette id << 32)) ++ private final Short2LongOpenHashMap map = new Short2LongOpenHashMap(16, 0.7f); ++ { ++ this.map.defaultReturnValue(Long.MAX_VALUE); ++ } ++ ++ private long[] byIndex = new long[16]; ++ private int size; ++ ++ public static int getLocationKey(final int x, final int y, final int z) { ++ return (x & 15) | (((z & 15) << 4)) | ((y & 255) << (4 + 4)); ++ } ++ ++ public static IBlockData getBlockDataFromRaw(final long raw) { ++ return GLOBAL_PALETTE.getObject((int)(raw >>> 32)); ++ } ++ ++ public static int getIndexFromRaw(final long raw) { ++ return (int)(raw & 0xFFFF); ++ } ++ ++ public static int getLocationFromRaw(final long raw) { ++ return (int)((raw >>> 16) & 0xFFFF); ++ } ++ ++ public static long getRawFromValues(final int index, final int location, final IBlockData data) { ++ return (long)index | ((long)location << 16) | (((long)GLOBAL_PALETTE.getOrCreateIdFor(data)) << 32); ++ } ++ ++ public static long setIndexRawValues(final long value, final int index) { ++ return value & ~(0xFFFF) | (index); ++ } ++ ++ public long add(final int x, final int y, final int z, final IBlockData data) { ++ return this.add(getLocationKey(x, y, z), data); ++ } ++ ++ public long add(final int location, final IBlockData data) { ++ final long curr = this.map.get((short)location); ++ ++ if (curr == Long.MAX_VALUE) { ++ final int index = this.size++; ++ final long raw = getRawFromValues(index, location, data); ++ this.map.put((short)location, raw); ++ ++ if (index >= this.byIndex.length) { ++ this.byIndex = Arrays.copyOf(this.byIndex, this.byIndex.length * 2); ++ } ++ ++ this.byIndex[index] = raw; ++ return raw; ++ } else { ++ final int index = getIndexFromRaw(curr); ++ final long raw = this.byIndex[index] = getRawFromValues(index, location, data); ++ ++ this.map.put((short)location, raw); ++ ++ return raw; ++ } ++ } ++ ++ public long remove(final int x, final int y, final int z) { ++ return this.remove(getLocationKey(x, y, z)); ++ } ++ ++ public long remove(final int location) { ++ final long ret = this.map.remove((short)location); ++ final int index = getIndexFromRaw(ret); ++ if (ret == Long.MAX_VALUE) { ++ return ret; ++ } ++ ++ // move the entry at the end to this index ++ final int endIndex = --this.size; ++ final long end = this.byIndex[endIndex]; ++ if (index != endIndex) { ++ // not empty after this call ++ this.map.put((short)getLocationFromRaw(end), setIndexRawValues(end, index)); ++ } ++ this.byIndex[index] = end; ++ this.byIndex[endIndex] = 0L; ++ ++ return ret; ++ } ++ ++ public int size() { ++ return this.size; ++ } ++ ++ public long getRaw(final int index) { ++ return this.byIndex[index]; ++ } ++ ++ public int getLocation(final int index) { ++ return getLocationFromRaw(this.getRaw(index)); ++ } ++ ++ public IBlockData getData(final int index) { ++ return getBlockDataFromRaw(this.getRaw(index)); ++ } ++ ++ public void clear() { ++ this.size = 0; ++ this.map.clear(); ++ } ++ ++ public LongIterator getRawIterator() { ++ return this.map.values().iterator(); ++ } ++} +\ No newline at end of file +diff --git a/src/main/java/com/tuinity/tuinity/util/OptimizedSmallEnumSet.java b/src/main/java/com/tuinity/tuinity/util/OptimizedSmallEnumSet.java +new file mode 100644 +index 000000000..934792ad3 +--- /dev/null ++++ b/src/main/java/com/tuinity/tuinity/util/OptimizedSmallEnumSet.java +@@ -0,0 +1,65 @@ ++package com.tuinity.tuinity.util; ++ ++import java.util.Collection; ++ ++// containing utils to work on small numbers of enums ++public final class OptimizedSmallEnumSet { ++ ++ private final Class enumClass; ++ private long backingSet; ++ ++ public OptimizedSmallEnumSet(final Class clazz) { ++ if (clazz == null) { ++ throw new IllegalArgumentException("Null class"); ++ } ++ if (!clazz.isEnum()) { ++ throw new IllegalArgumentException("Class must be enum, not " + clazz.getCanonicalName()); ++ } ++ this.enumClass = clazz; ++ } ++ ++ public boolean addUnchecked(final E element) { ++ final int ordinal = element.ordinal(); ++ final long key = 1L << ordinal; ++ ++ final long prev = this.backingSet; ++ this.backingSet = prev | key; ++ ++ return (prev & key) == 0; ++ } ++ ++ public boolean removeUnchecked(final E element) { ++ final int ordinal = element.ordinal(); ++ final long key = 1L << ordinal; ++ ++ final long prev = this.backingSet; ++ this.backingSet = prev & ~key; ++ ++ return (prev & key) != 0; ++ } ++ ++ public void clear() { ++ this.backingSet = 0L; ++ } ++ ++ public int size() { ++ return Long.bitCount(this.backingSet); ++ } ++ ++ public void addAllUnchecked(final Collection enums) { ++ for (final E element : enums) { ++ if (element == null) { ++ throw new NullPointerException("Null element"); ++ } ++ this.backingSet |= (1L << element.ordinal()); ++ } ++ } ++ ++ public long getBackingSet() { ++ return this.backingSet; ++ } ++ ++ public boolean hasCommonElements(final OptimizedSmallEnumSet other) { ++ return (other.backingSet & this.backingSet) != 0; ++ } ++} +\ No newline at end of file +diff --git a/src/main/java/com/tuinity/tuinity/util/PrimaryThreadList.java b/src/main/java/com/tuinity/tuinity/util/PrimaryThreadList.java +new file mode 100644 +index 000000000..de930aef9 +--- /dev/null ++++ b/src/main/java/com/tuinity/tuinity/util/PrimaryThreadList.java +@@ -0,0 +1,241 @@ ++package com.tuinity.tuinity.util; ++ ++import org.spigotmc.AsyncCatcher; ++ ++import java.util.*; ++import java.util.function.Consumer; ++import java.util.function.IntFunction; ++import java.util.function.Predicate; ++import java.util.function.UnaryOperator; ++import java.util.stream.Stream; ++ ++public class PrimaryThreadList implements List { ++ ++ protected final List wrapped; ++ ++ public PrimaryThreadList(final List wrap) { ++ if (wrap == null) { ++ throw new NullPointerException("Wrapped list may not be null"); ++ } ++ ++ this.wrapped = wrap; ++ } ++ ++ protected void check() { ++ AsyncCatcher.catchOp("collection access"); ++ } ++ ++ @Override ++ public boolean add(final E element) { ++ this.check(); ++ return this.wrapped.add(element); ++ } ++ ++ @Override ++ public void add(final int index, final E element) { ++ this.check(); ++ this.wrapped.add(index, element); ++ } ++ ++ @Override ++ public boolean addAll(final Collection collection) { ++ this.check(); ++ return this.wrapped.addAll(collection); ++ } ++ ++ @Override ++ public boolean addAll(final int index, final Collection collection) { ++ this.check(); ++ return this.wrapped.addAll(index, collection); ++ } ++ ++ @Override ++ public E set(final int index, final E element) { ++ this.check(); ++ return this.wrapped.set(index, element); ++ } ++ ++ @Override ++ public boolean remove(final Object element) { ++ this.check(); ++ return this.wrapped.remove(element); ++ } ++ ++ @Override ++ public E remove(final int index) { ++ this.check(); ++ return this.wrapped.remove(index); ++ } ++ ++ @Override ++ public boolean removeIf(final Predicate filter) { ++ this.check(); ++ return this.wrapped.removeIf(filter); ++ } ++ ++ @Override ++ public boolean removeAll(final Collection collection) { ++ this.check(); ++ return this.wrapped.removeAll(collection); ++ } ++ ++ @Override ++ public boolean retainAll(final Collection collection) { ++ this.check(); ++ return this.wrapped.retainAll(collection); ++ } ++ ++ @Override ++ public void replaceAll(final UnaryOperator operator) { ++ this.check(); ++ this.wrapped.replaceAll(operator); ++ } ++ ++ @Override ++ public void sort(final Comparator comparator) { ++ this.check(); ++ this.wrapped.sort(comparator); ++ } ++ ++ @Override ++ public void clear() { ++ this.check(); ++ this.wrapped.clear(); ++ } ++ ++ @Override ++ public int size() { ++ this.check(); ++ return this.wrapped.size(); ++ } ++ ++ @Override ++ public boolean isEmpty() { ++ this.check(); ++ return this.wrapped.isEmpty(); ++ } ++ ++ @Override ++ public E get(final int index) { ++ this.check(); ++ return this.wrapped.get(index); ++ } ++ ++ @Override ++ public boolean containsAll(final Collection collection) { ++ this.check(); ++ return this.wrapped.containsAll(collection); ++ } ++ ++ @Override ++ public boolean contains(final Object object) { ++ this.check(); ++ return this.wrapped.contains(object); ++ } ++ ++ @Override ++ public int indexOf(final Object object) { ++ this.check(); ++ return this.wrapped.indexOf(object); ++ } ++ ++ @Override ++ public int lastIndexOf(final Object object) { ++ this.check(); ++ return this.wrapped.lastIndexOf(object); ++ } ++ ++ @Override ++ public void forEach(final Consumer action) { ++ this.check(); ++ this.wrapped.forEach(action); ++ } ++ ++ @Override ++ public T[] toArray(final T[] array) { ++ this.check(); ++ return this.wrapped.toArray(array); ++ } ++ ++ @Override ++ public T[] toArray(final IntFunction generator) { ++ this.check(); ++ return this.wrapped.toArray(generator); ++ } ++ ++ @Override ++ public Object[] toArray() { ++ this.check(); ++ return this.wrapped.toArray(); ++ } ++ ++ @Override ++ public Iterator iterator() { ++ this.check(); ++ return this.wrapped.iterator(); ++ } ++ ++ @Override ++ public ListIterator listIterator() { ++ this.check(); ++ return this.wrapped.listIterator(); ++ } ++ ++ @Override ++ public ListIterator listIterator(final int index) { ++ this.check(); ++ return this.wrapped.listIterator(index); ++ } ++ ++ @Override ++ public List subList(final int fromIndex, final int toIndex) { ++ this.check(); ++ return new PrimaryThreadList<>(this.wrapped.subList(fromIndex, toIndex)); ++ } ++ ++ @Override ++ public Stream stream() { ++ this.check(); ++ return this.wrapped.stream(); ++ } ++ ++ @Override ++ public Stream parallelStream() { ++ this.check(); ++ return this.wrapped.parallelStream(); ++ } ++ ++ @Override ++ public Spliterator spliterator() { ++ this.check(); ++ return this.wrapped.spliterator(); ++ } ++ ++ @Override ++ public String toString() { ++ this.check(); ++ return this.wrapped.toString(); ++ } ++ ++ @Override ++ public int hashCode() { ++ this.check(); ++ return this.wrapped.hashCode(); ++ } ++ ++ @Override ++ public boolean equals(final Object object) { ++ this.check(); ++ return this.wrapped.equals(object); ++ } ++ ++ public static class RandomAccessPrimaryThreadList extends PrimaryThreadList implements RandomAccess { ++ public RandomAccessPrimaryThreadList(final List wrap) { ++ super(wrap); ++ } ++ } ++ ++ public static PrimaryThreadList of(final List list) { ++ return list instanceof RandomAccess ? new RandomAccessPrimaryThreadList<>(list) : new PrimaryThreadList<>(list); ++ } ++} +\ No newline at end of file +diff --git a/src/main/java/com/tuinity/tuinity/util/PrimaryThreadSet.java b/src/main/java/com/tuinity/tuinity/util/PrimaryThreadSet.java +new file mode 100644 +index 000000000..0249c78c1 +--- /dev/null ++++ b/src/main/java/com/tuinity/tuinity/util/PrimaryThreadSet.java +@@ -0,0 +1,282 @@ ++package com.tuinity.tuinity.util; ++ ++import org.spigotmc.AsyncCatcher; ++ ++import java.util.*; ++import java.util.function.Consumer; ++import java.util.function.IntFunction; ++import java.util.function.Predicate; ++import java.util.stream.Stream; ++ ++public class PrimaryThreadSet implements Set { ++ ++ protected final Set wrapped; ++ ++ public PrimaryThreadSet(final Set wrap) { ++ if (wrap == null) { ++ throw new NullPointerException("Wrapped list may not be null"); ++ } ++ ++ this.wrapped = wrap; ++ } ++ ++ protected void check() { ++ AsyncCatcher.catchOp("collection access"); ++ } ++ ++ @Override ++ public boolean add(final E element) { ++ this.check(); ++ return this.wrapped.add(element); ++ } ++ ++ @Override ++ public boolean addAll(final Collection collection) { ++ this.check(); ++ return this.wrapped.addAll(collection); ++ } ++ ++ @Override ++ public boolean remove(final Object element) { ++ this.check(); ++ return this.wrapped.remove(element); ++ } ++ ++ @Override ++ public boolean removeIf(final Predicate filter) { ++ this.check(); ++ return this.wrapped.removeIf(filter); ++ } ++ ++ @Override ++ public boolean removeAll(final Collection collection) { ++ this.check(); ++ return this.wrapped.removeAll(collection); ++ } ++ ++ @Override ++ public boolean retainAll(final Collection collection) { ++ this.check(); ++ return this.wrapped.retainAll(collection); ++ } ++ ++ @Override ++ public void clear() { ++ this.check(); ++ this.wrapped.clear(); ++ } ++ ++ @Override ++ public int size() { ++ this.check(); ++ return this.wrapped.size(); ++ } ++ ++ @Override ++ public boolean isEmpty() { ++ this.check(); ++ return this.wrapped.isEmpty(); ++ } ++ ++ @Override ++ public boolean containsAll(final Collection collection) { ++ this.check(); ++ return this.wrapped.containsAll(collection); ++ } ++ ++ @Override ++ public boolean contains(final Object object) { ++ this.check(); ++ return this.wrapped.contains(object); ++ } ++ ++ @Override ++ public void forEach(final Consumer action) { ++ this.check(); ++ this.wrapped.forEach(action); ++ } ++ ++ @Override ++ public T[] toArray(final T[] array) { ++ this.check(); ++ return this.wrapped.toArray(array); ++ } ++ ++ @Override ++ public T[] toArray(final IntFunction generator) { ++ this.check(); ++ return this.wrapped.toArray(generator); ++ } ++ ++ @Override ++ public Object[] toArray() { ++ this.check(); ++ return this.wrapped.toArray(); ++ } ++ ++ @Override ++ public Iterator iterator() { ++ this.check(); ++ return this.wrapped.iterator(); ++ } ++ ++ @Override ++ public Stream stream() { ++ this.check(); ++ return this.wrapped.stream(); ++ } ++ ++ @Override ++ public Stream parallelStream() { ++ this.check(); ++ return this.wrapped.parallelStream(); ++ } ++ ++ @Override ++ public Spliterator spliterator() { ++ this.check(); ++ return this.wrapped.spliterator(); ++ } ++ ++ @Override ++ public String toString() { ++ this.check(); ++ return this.wrapped.toString(); ++ } ++ ++ @Override ++ public int hashCode() { ++ this.check(); ++ return this.wrapped.hashCode(); ++ } ++ ++ @Override ++ public boolean equals(final Object object) { ++ this.check(); ++ return this.wrapped.equals(object); ++ } ++ ++ public static class SortedPrimaryThreadSet extends PrimaryThreadSet implements SortedSet { ++ ++ public SortedPrimaryThreadSet(final SortedSet set) { ++ super(set); ++ } ++ ++ @Override ++ public Comparator comparator() { ++ return ((SortedSet)this.wrapped).comparator(); ++ } ++ ++ @Override ++ public E first() { ++ this.check(); ++ return ((SortedSet)this.wrapped).first(); ++ } ++ ++ @Override ++ public E last() { ++ this.check(); ++ return ((SortedSet)this.wrapped).last(); ++ } ++ ++ @Override ++ public SortedSet headSet(final E toElement) { ++ this.check(); ++ return ((SortedSet)this.wrapped).headSet(toElement); ++ } ++ ++ @Override ++ public SortedSet subSet(final E fromElement, final E toElement) { ++ this.check(); ++ return ((SortedSet)this.wrapped).subSet(fromElement, toElement); ++ } ++ ++ @Override ++ public SortedSet tailSet(final E fromElement) { ++ this.check(); ++ return ((SortedSet)this.wrapped).tailSet(fromElement); ++ } ++ } ++ ++ public static class NavigablePrimaryThreadSet extends SortedPrimaryThreadSet implements NavigableSet { ++ ++ public NavigablePrimaryThreadSet(final NavigableSet set) { ++ super(set); ++ } ++ ++ @Override ++ public E ceiling(final E element) { ++ this.check(); ++ return ((NavigableSet)this.wrapped).ceiling(element); ++ } ++ ++ @Override ++ public E floor(final E element) { ++ this.check(); ++ return ((NavigableSet)this.wrapped).floor(element); ++ } ++ ++ @Override ++ public E higher(final E element) { ++ this.check(); ++ return ((NavigableSet)this.wrapped).higher(element); ++ } ++ ++ @Override ++ public E lower(final E element) { ++ this.check(); ++ return ((NavigableSet)this.wrapped).lower(element); ++ } ++ ++ @Override ++ public E pollFirst() { ++ this.check(); ++ return ((NavigableSet)this.wrapped).pollFirst(); ++ } ++ ++ @Override ++ public E pollLast() { ++ this.check(); ++ return ((NavigableSet)this.wrapped).pollLast(); ++ } ++ ++ @Override ++ public Iterator descendingIterator() { ++ this.check(); ++ return ((NavigableSet)this.wrapped).descendingIterator(); ++ } ++ ++ @Override ++ public final NavigableSet descendingSet() { ++ this.check(); ++ return new NavigablePrimaryThreadSet<>(((NavigableSet)this.wrapped).descendingSet()); ++ } ++ ++ @Override ++ public NavigableSet headSet(final E toElement, final boolean inclusive) { ++ this.check(); ++ return new NavigablePrimaryThreadSet<>(((NavigableSet)this.wrapped).headSet(toElement, inclusive)); ++ } ++ ++ @Override ++ public NavigableSet subSet(final E fromElement, final boolean fromInclusive, final E toElement, final boolean toInclusive) { ++ this.check(); ++ return new NavigablePrimaryThreadSet<>(((NavigableSet)this.wrapped).subSet(fromElement, fromInclusive, toElement, toInclusive)); ++ } ++ ++ @Override ++ public NavigableSet tailSet(final E fromElement, final boolean inclusive) { ++ this.check(); ++ return new NavigablePrimaryThreadSet<>(((NavigableSet)this.wrapped).tailSet(fromElement, inclusive)); ++ } ++ } ++ ++ public static PrimaryThreadSet of(final Set set) { ++ if (set instanceof NavigableSet) { ++ return new NavigablePrimaryThreadSet<>((NavigableSet)set); ++ } else if (set instanceof SortedSet) { ++ return new SortedPrimaryThreadSet<>((SortedSet)set); ++ } ++ return new PrimaryThreadSet<>(set); ++ } ++} +diff --git a/src/main/java/com/tuinity/tuinity/util/TickSynchronizationPoint.java b/src/main/java/com/tuinity/tuinity/util/TickSynchronizationPoint.java +new file mode 100644 +index 000000000..37adae900 +--- /dev/null ++++ b/src/main/java/com/tuinity/tuinity/util/TickSynchronizationPoint.java +@@ -0,0 +1,40 @@ ++package com.tuinity.tuinity.util; ++ ++import ca.spottedleaf.concurrentutil.misc.SynchronizationPoint; ++ ++public final class TickSynchronizationPoint { ++ ++ private final SynchronizationPoint lock; ++ ++ public TickSynchronizationPoint(final TickThread[] threads) { ++ this.lock = new SynchronizationPoint(threads); ++ } ++ ++ private static int getIdForCurrentThread() { ++ return ((TickThread)Thread.currentThread()).id; ++ } ++ ++ public void start() { ++ this.lock.start(getIdForCurrentThread()); ++ } ++ ++ public void end() { ++ this.lock.end(getIdForCurrentThread()); ++ } ++ ++ public void enter() { ++ this.lock.enter(getIdForCurrentThread()); ++ } ++ ++ public void weakEnter() { ++ this.lock.weakEnter(getIdForCurrentThread()); ++ } ++ ++ public void enterAlone() { ++ this.lock.enterAlone(getIdForCurrentThread()); ++ } ++ ++ public void endAloneExecution() { ++ this.lock.endAloneExecution(getIdForCurrentThread()); ++ } ++} +\ No newline at end of file +diff --git a/src/main/java/com/tuinity/tuinity/util/TickThread.java b/src/main/java/com/tuinity/tuinity/util/TickThread.java +new file mode 100644 +index 000000000..d5688a734 +--- /dev/null ++++ b/src/main/java/com/tuinity/tuinity/util/TickThread.java +@@ -0,0 +1,40 @@ ++package com.tuinity.tuinity.util; ++ ++import net.minecraft.server.MinecraftServer; ++import org.bukkit.Bukkit; ++ ++public final class TickThread extends Thread { ++ ++ public static final boolean STRICT_THREAD_CHECKS = Boolean.getBoolean("tuinity.strict-thread-checks"); ++ ++ static { ++ if (STRICT_THREAD_CHECKS) { ++ MinecraftServer.LOGGER.warn("Strict thread checks enabled - performance may suffer"); ++ } ++ } ++ ++ public static void softEnsureTickThread(final String reason) { ++ if (!STRICT_THREAD_CHECKS) { ++ return; ++ } ++ ensureTickThread(reason); ++ } ++ ++ ++ public static void ensureTickThread(final String reason) { ++ if (!Bukkit.isPrimaryThread()) { ++ throw new IllegalStateException(reason); ++ } ++ } ++ ++ public final int id; /* We don't override getId as the spec requires that it be unique (with respect to all other threads) */ ++ ++ public TickThread(final Runnable run, final String name, final int id) { ++ super(run, name); ++ this.id = id; ++ } ++ ++ public static TickThread getCurrentTickThread() { ++ return (TickThread)Thread.currentThread(); ++ } ++} +\ No newline at end of file +diff --git a/src/main/java/com/tuinity/tuinity/util/Util.java b/src/main/java/com/tuinity/tuinity/util/Util.java +new file mode 100644 +index 000000000..a69fc1488 +--- /dev/null ++++ b/src/main/java/com/tuinity/tuinity/util/Util.java +@@ -0,0 +1,103 @@ ++package com.tuinity.tuinity.util; ++ ++import it.unimi.dsi.fastutil.objects.ObjectRBTreeSet; ++import net.minecraft.server.BlockPosition; ++import net.minecraft.server.ChunkCoordIntPair; ++import net.minecraft.server.Entity; ++import org.bukkit.Bukkit; ++import java.util.ArrayList; ++import java.util.Arrays; ++import java.util.Comparator; ++import java.util.Iterator; ++import java.util.List; ++import java.util.SortedSet; ++import java.util.function.BiPredicate; ++import java.util.function.Consumer; ++import java.util.function.Predicate; ++ ++public final class Util { ++ ++ public static final long INVALID_CHUNK_KEY = getCoordinateKey(Integer.MAX_VALUE, Integer.MAX_VALUE); ++ ++ public static void ensureTickThread(final String reason) { ++ if (!Bukkit.isPrimaryThread()) { ++ throw new IllegalStateException(reason); ++ } ++ } ++ ++ public static long getCoordinateKey(final BlockPosition blockPos) { ++ return getCoordinateKey(blockPos.getX() >> 4, blockPos.getZ() >> 4); ++ } ++ ++ public static long getCoordinateKey(final Entity entity) { ++ return getCoordinateKey(getChunkCoordinate(entity.locX()), getChunkCoordinate(entity.locZ())); ++ } ++ ++ public static int fastFloor(double x) { ++ int truncated = (int)x; ++ return x < (double)truncated ? truncated - 1 : truncated; ++ } ++ ++ public static int fastFloor(float x) { ++ int truncated = (int)x; ++ return x < (double)truncated ? truncated - 1 : truncated; ++ } ++ ++ public static long getCoordinateKey(final ChunkCoordIntPair pair) { ++ return getCoordinateKey(pair.x, pair.z); ++ } ++ ++ public static long getCoordinateKey(final int x, final int z) { ++ return ((long)z << 32) | (x & 0xFFFFFFFFL); ++ } ++ ++ public static int getCoordinateX(final long key) { ++ return (int)key; ++ } ++ ++ public static int getCoordinateZ(final long key) { ++ return (int)(key >>> 32); ++ } ++ ++ public static int getChunkCoordinate(final double coordinate) { ++ return Util.fastFloor(coordinate) >> 4; ++ } ++ ++ public static int getBlockCoordinate(final double coordinate) { ++ return Util.fastFloor(coordinate); ++ } ++ ++ public static long getBlockKey(final int x, final int y, final int z) { ++ return ((long)x & 0x7FFFFFF) | (((long)z & 0x7FFFFFF) << 27) | ((long)y << 54); ++ } ++ ++ public static long getBlockKey(final BlockPosition pos) { ++ return getBlockKey(pos.getX(), pos.getY(), pos.getZ()); ++ } ++ ++ public static long getBlockKey(final Entity entity) { ++ return getBlockKey(getBlockCoordinate(entity.locX()), getBlockCoordinate(entity.locY()), getBlockCoordinate(entity.locZ())); ++ } ++ ++ // assumes the sets have the same comparator, and if this comparator is null then assume T is Comparable ++ public static void mergeSortedSets(final Consumer consumer, final Comparator comparator, final SortedSet...sets) { ++ final ObjectRBTreeSet all = new ObjectRBTreeSet<>(comparator); ++ // note: this is done in log(n!) ~ nlogn time. It could be improved if it were to mimick what mergesort does. ++ for (SortedSet set : sets) { ++ if (set != null) { ++ all.addAll(set); ++ } ++ } ++ all.forEach(consumer); ++ } ++ ++ // Taken from ++ // https://lemire.me/blog/2016/06/27/a-fast-alternative-to-the-modulo-reduction/ ++ // https://github.com/lemire/Code-used-on-Daniel-Lemire-s-blog/blob/master/2016/06/25/fastrange.c ++ // Original license is public domain ++ public static int fastRandomBounded(final long randomInteger, final long limit) { ++ // randomInteger must be [0, pow(2, 32)) ++ // limit must be [0, pow(2, 32)) ++ return (int)((randomInteger * limit) >>> 32); ++ } ++} +diff --git a/src/main/java/com/tuinity/tuinity/util/fastutil/ExtendedAbstractDoubleList.java b/src/main/java/com/tuinity/tuinity/util/fastutil/ExtendedAbstractDoubleList.java +new file mode 100644 +index 000000000..88b198fd7 +--- /dev/null ++++ b/src/main/java/com/tuinity/tuinity/util/fastutil/ExtendedAbstractDoubleList.java +@@ -0,0 +1,39 @@ ++package com.tuinity.tuinity.util.fastutil; ++ ++import it.unimi.dsi.fastutil.doubles.AbstractDoubleList; ++import it.unimi.dsi.fastutil.doubles.DoubleList; ++ ++import java.util.List; ++ ++public abstract class ExtendedAbstractDoubleList extends AbstractDoubleList { ++ ++ @Override ++ public boolean equals(final Object other) { ++ if (other == this) { ++ return true; ++ } ++ if (!(other instanceof DoubleList)) { ++ if (other instanceof List) { ++ return super.equals(other); ++ } ++ return false; ++ } ++ ++ final DoubleList otherList = (DoubleList)other; ++ ++ final int otherSize = otherList.size(); ++ final int thisSize = this.size(); ++ ++ if (otherSize != thisSize) { ++ return false; ++ } ++ ++ for (int i = 0; i < thisSize; ++i) { ++ if (this.getDouble(i) != otherList.getDouble(i)) { ++ return false; ++ } ++ } ++ ++ return true; ++ } ++} +\ No newline at end of file +diff --git a/src/main/java/com/tuinity/tuinity/util/fastutil/ExtendedDoubleArrayList.java b/src/main/java/com/tuinity/tuinity/util/fastutil/ExtendedDoubleArrayList.java +new file mode 100644 +index 000000000..36457981e +--- /dev/null ++++ b/src/main/java/com/tuinity/tuinity/util/fastutil/ExtendedDoubleArrayList.java +@@ -0,0 +1,65 @@ ++package com.tuinity.tuinity.util.fastutil; ++ ++import it.unimi.dsi.fastutil.doubles.DoubleArrayList; ++import it.unimi.dsi.fastutil.doubles.DoubleList; ++ ++import java.util.Arrays; ++import java.util.List; ++ ++public class ExtendedDoubleArrayList extends DoubleArrayList { ++ ++ public ExtendedDoubleArrayList() { ++ super(); ++ } ++ ++ public ExtendedDoubleArrayList(final int capacity) { ++ super(capacity); ++ } ++ ++ public ExtendedDoubleArrayList(final double[] array) { ++ this(array, array.length, true); ++ } ++ ++ public ExtendedDoubleArrayList(final double[] array, final int size, final boolean copy) { ++ super(copy ? array.clone() : array, false); ++ this.size = size; ++ } ++ ++ public static ExtendedDoubleArrayList getList(final double[] list, final int requiredLength) { ++ if (list.length == requiredLength) { ++ return new ExtendedDoubleArrayList(list, requiredLength, false); ++ } else { ++ return new ExtendedDoubleArrayList(Arrays.copyOf(list, requiredLength), requiredLength, false); ++ } ++ } ++ ++ @Override ++ public boolean equals(final Object other) { ++ if (other == this) { ++ return true; ++ } ++ if (!(other instanceof DoubleList)) { ++ if (other instanceof List) { ++ return super.equals(other); ++ } ++ return false; ++ } ++ ++ final DoubleList otherList = (DoubleList)other; ++ ++ final int otherSize = otherList.size(); ++ final int thisSize = this.size(); ++ ++ if (otherSize != thisSize) { ++ return false; ++ } ++ ++ for (int i = 0; i < thisSize; ++i) { ++ if (this.getDouble(i) != otherList.getDouble(i)) { ++ return false; ++ } ++ } ++ ++ return true; ++ } ++} +diff --git a/src/main/java/com/tuinity/tuinity/util/fastutil/ExtendedObjectAVLTreeSet.java b/src/main/java/com/tuinity/tuinity/util/fastutil/ExtendedObjectAVLTreeSet.java +new file mode 100644 +index 000000000..1a3f59633 +--- /dev/null ++++ b/src/main/java/com/tuinity/tuinity/util/fastutil/ExtendedObjectAVLTreeSet.java +@@ -0,0 +1,90 @@ ++package com.tuinity.tuinity.util.fastutil; ++ ++import it.unimi.dsi.fastutil.objects.ObjectAVLTreeSet; ++import it.unimi.dsi.fastutil.objects.ObjectBidirectionalIterator; ++ ++import java.lang.reflect.Field; ++import java.util.function.Predicate; ++ ++public class ExtendedObjectAVLTreeSet extends ObjectAVLTreeSet { ++ ++ private static final Field PREV_FIELD; ++ private static final Field NEXT_FIELD; ++ private static final Field CURR_FIELD; ++ private static final Field INDEX_FIELD; ++ ++ private static final Integer ZERO = Integer.valueOf(0); ++ ++ static { ++ try { ++ final Class clazz = Class.forName(ObjectAVLTreeSet.class.getCanonicalName() + "$SetIterator"); ++ PREV_FIELD = clazz.getDeclaredField("prev"); ++ PREV_FIELD.setAccessible(true); ++ ++ NEXT_FIELD = clazz.getDeclaredField("next"); ++ NEXT_FIELD.setAccessible(true); ++ ++ CURR_FIELD = clazz.getDeclaredField("curr"); ++ CURR_FIELD.setAccessible(true); ++ ++ INDEX_FIELD = clazz.getDeclaredField("index"); ++ INDEX_FIELD.setAccessible(true); ++ } catch (final Throwable thr) { ++ throw new RuntimeException(thr); ++ } ++ } ++ ++ private ObjectBidirectionalIterator cachedIterator = this.iterator(); ++ ++ { ++ this.nullIterator(this.cachedIterator); ++ } ++ ++ @Override ++ public boolean removeIf(Predicate filter) { ++ if (this.isEmpty()) { ++ return false; ++ } ++ ++ if (this.cachedIterator == null) { ++ return super.removeIf(filter); // recursive...? ++ } ++ ++ final ObjectBidirectionalIterator iterator = this.cachedIterator; ++ this.cachedIterator = null; ++ this.startIterator(iterator); ++ ++ boolean ret = false; ++ ++ while (iterator.hasNext()) { ++ if (filter.test(iterator.next())) { ++ ret = true; ++ iterator.remove(); ++ } ++ } ++ ++ this.nullIterator(iterator); ++ this.cachedIterator = iterator; ++ return ret; ++ } ++ ++ private void startIterator(final ObjectBidirectionalIterator iterator) { ++ // assume iterator is null'd ++ try { ++ NEXT_FIELD.set(iterator, this.firstEntry); ++ } catch (final IllegalAccessException ex) { ++ throw new RuntimeException(ex); // not going to occur ++ } ++ } ++ ++ private void nullIterator(final ObjectBidirectionalIterator iterator) { ++ try { ++ PREV_FIELD.set(iterator, null); ++ NEXT_FIELD.set(iterator, null); ++ CURR_FIELD.set(iterator, null); ++ INDEX_FIELD.set(iterator, ZERO); ++ } catch (final IllegalAccessException ex) { ++ throw new RuntimeException(ex); // not going to occur ++ } ++ } ++} +diff --git a/src/main/java/com/tuinity/tuinity/util/map/AreaMap.java b/src/main/java/com/tuinity/tuinity/util/map/AreaMap.java +new file mode 100644 +index 000000000..dfb7a417e +--- /dev/null ++++ b/src/main/java/com/tuinity/tuinity/util/map/AreaMap.java +@@ -0,0 +1,388 @@ ++package com.tuinity.tuinity.util.map; ++ ++import com.tuinity.tuinity.util.Util; ++import it.unimi.dsi.fastutil.longs.Long2ObjectLinkedOpenHashMap; ++import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap; ++import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap; ++import it.unimi.dsi.fastutil.objects.Object2LongOpenHashMap; ++import net.minecraft.server.ChunkCoordIntPair; ++import net.minecraft.server.MinecraftServer; ++ ++import javax.annotation.Nullable; ++import java.util.Iterator; ++ ++/** @author Spottedleaf */ ++public abstract class AreaMap { ++ ++ /* Tested via https://gist.github.com/Spottedleaf/520419c6f41ef348fe9926ce674b7217 */ ++ ++ private final Object2LongOpenHashMap objectToLastCoordinate = new Object2LongOpenHashMap<>(); ++ private final Object2IntOpenHashMap objectToViewDistance = new Object2IntOpenHashMap<>(); ++ ++ { ++ this.objectToViewDistance.defaultReturnValue(-1); ++ this.objectToLastCoordinate.defaultReturnValue(Long.MIN_VALUE); ++ } ++ ++ // we use linked for better iteration. ++ // map of: coordinate to set of objects in coordinate ++ private final Long2ObjectOpenHashMap> areaMap = new Long2ObjectOpenHashMap<>(1024, 0.3f); ++ private final PooledLinkedHashSets pooledHashSets; ++ ++ private final ChangeCallback addCallback; ++ private final ChangeCallback removeCallback; ++ ++ public AreaMap() { ++ this(new PooledLinkedHashSets<>()); ++ } ++ ++ // let users define a "global" or "shared" pooled sets if they wish ++ public AreaMap(final PooledLinkedHashSets pooledHashSets) { ++ this(pooledHashSets, null, null); ++ } ++ ++ public AreaMap(final PooledLinkedHashSets pooledHashSets, final ChangeCallback addCallback, final ChangeCallback removeCallback) { ++ this.pooledHashSets = pooledHashSets; ++ this.addCallback = addCallback; ++ this.removeCallback = removeCallback; ++ } ++ ++ @Nullable ++ public PooledLinkedHashSets.PooledObjectLinkedOpenHashSet getObjectsInRange(final long key) { ++ return this.areaMap.get(key); ++ } ++ ++ @Nullable ++ public PooledLinkedHashSets.PooledObjectLinkedOpenHashSet getObjectsInRange(final ChunkCoordIntPair chunkPos) { ++ return this.getObjectsInRange(chunkPos.x, chunkPos.z); ++ } ++ ++ @Nullable ++ public PooledLinkedHashSets.PooledObjectLinkedOpenHashSet getObjectsInRange(final int chunkX, final int chunkZ) { ++ return this.getObjectsInRange(Util.getCoordinateKey(chunkX, chunkZ)); ++ } ++ ++ // Long.MIN_VALUE indicates the object is not mapped ++ public long getLastCoordinate(final E object) { ++ return this.objectToLastCoordinate.getOrDefault(object, Long.MIN_VALUE); ++ } ++ ++ // -1 indicates the object is not mapped ++ public int getLastViewDistance(final E object) { ++ return this.objectToViewDistance.getOrDefault(object, -1); ++ } ++ ++ // returns the total number of mapped chunks ++ public int size() { ++ return this.areaMap.size(); ++ } ++ ++ public void update(final E object, final int chunkX, final int chunkZ, final int viewDistance) { ++ final int oldDistance = this.objectToViewDistance.put(object, viewDistance); ++ final long newPos = Util.getCoordinateKey(chunkX, chunkZ); ++ if (oldDistance == -1) { ++ this.objectToLastCoordinate.put(object, newPos); ++ this.addObject(object, chunkX, chunkZ, Integer.MIN_VALUE, Integer.MIN_VALUE, viewDistance); ++ } else { ++ this.updateObject(object, this.objectToLastCoordinate.put(object, newPos), newPos, oldDistance, viewDistance); ++ } ++ //this.validate(object, viewDistance); ++ } ++ ++ public boolean remove(final E object) { ++ final long position = this.objectToLastCoordinate.removeLong(object); ++ final int viewDistance = this.objectToViewDistance.removeInt(object); ++ ++ if (viewDistance == -1) { ++ return false; ++ } ++ ++ final int currentX = Util.getCoordinateX(position); ++ final int currentZ = Util.getCoordinateZ(position); ++ ++ this.removeObject(object, currentX, currentZ, currentX, currentZ, viewDistance); ++ //this.validate(object, -1); ++ return true; ++ } ++ ++ protected abstract PooledLinkedHashSets.PooledObjectLinkedOpenHashSet getEmptySetFor(final E object); ++ ++ // expensive op, only for debug ++ private void validate(final E object, final int viewDistance) { ++ int entiesGot = 0; ++ int expectedEntries = (2 * viewDistance + 1); ++ expectedEntries *= expectedEntries; ++ if (viewDistance < 0) { ++ expectedEntries = 0; ++ } ++ ++ final long currPosition = this.objectToLastCoordinate.getLong(object); ++ ++ final int centerX = Util.getCoordinateX(currPosition); ++ final int centerZ = Util.getCoordinateZ(currPosition); ++ ++ for (Iterator>> iterator = this.areaMap.long2ObjectEntrySet().fastIterator(); ++ iterator.hasNext();) { ++ ++ final Long2ObjectLinkedOpenHashMap.Entry> entry = iterator.next(); ++ final long key = entry.getLongKey(); ++ final PooledLinkedHashSets.PooledObjectLinkedOpenHashSet map = entry.getValue(); ++ ++ if (map.referenceCount == 0) { ++ throw new IllegalStateException("Invalid map"); ++ } ++ ++ if (map.contains(object)) { ++ ++entiesGot; ++ ++ final int chunkX = Util.getCoordinateX(key); ++ final int chunkZ = Util.getCoordinateZ(key); ++ ++ final int dist = Math.max(Math.abs(chunkX - centerX), Math.abs(chunkZ - centerZ)); ++ ++ if (dist > viewDistance) { ++ throw new IllegalStateException("Expected view distance " + viewDistance + ", got " + dist); ++ } ++ } ++ } ++ ++ if (entiesGot != expectedEntries) { ++ throw new IllegalStateException("Expected " + expectedEntries + ", got " + entiesGot); ++ } ++ } ++ ++ protected final void addObjectTo(final E object, final int chunkX, final int chunkZ, final int currChunkX, ++ final int currChunkZ, final int prevChunkX, final int prevChunkZ) { ++ final long key = Util.getCoordinateKey(chunkX, chunkZ); ++ ++ PooledLinkedHashSets.PooledObjectLinkedOpenHashSet empty = this.getEmptySetFor(object); ++ PooledLinkedHashSets.PooledObjectLinkedOpenHashSet current = this.areaMap.putIfAbsent(key, empty); ++ ++ if (current != null) { ++ PooledLinkedHashSets.PooledObjectLinkedOpenHashSet next = this.pooledHashSets.findMapWith(current, object); ++ if (next == current) { ++ throw new IllegalStateException("Expected different map: got " + next.toString()); ++ } ++ this.areaMap.put(key, next); ++ ++ current = next; ++ // fall through to callback ++ } else { ++ current = empty; ++ } ++ ++ if (this.addCallback != null) { ++ try { ++ this.addCallback.accept(object, chunkX, chunkZ, currChunkX, currChunkZ, prevChunkX, prevChunkZ, current); ++ } catch (final Throwable ex) { ++ if (ex instanceof ThreadDeath) { ++ throw (ThreadDeath)ex; ++ } ++ MinecraftServer.LOGGER.error("Add callback for map threw exception ", ex); ++ } ++ } ++ } ++ ++ protected final void removeObjectFrom(final E object, final int chunkX, final int chunkZ, final int currChunkX, ++ final int currChunkZ, final int prevChunkX, final int prevChunkZ) { ++ final long key = Util.getCoordinateKey(chunkX, chunkZ); ++ ++ PooledLinkedHashSets.PooledObjectLinkedOpenHashSet current = this.areaMap.get(key); ++ ++ if (current == null) { ++ throw new IllegalStateException("Current map may not be null for " + object + ", (" + chunkX + "," + chunkZ + ")"); ++ } ++ ++ PooledLinkedHashSets.PooledObjectLinkedOpenHashSet next = this.pooledHashSets.findMapWithout(current, object); ++ ++ if (next == current) { ++ throw new IllegalStateException("Current map [" + next.toString() + "] should have contained " + object + ", (" + chunkX + "," + chunkZ + ")"); ++ } ++ ++ if (next != null) { ++ this.areaMap.put(key, next); ++ } else { ++ this.areaMap.remove(key); ++ } ++ ++ if (this.removeCallback != null) { ++ try { ++ this.removeCallback.accept(object, chunkX, chunkZ, currChunkX, currChunkZ, prevChunkX, prevChunkZ, next); ++ } catch (final Throwable ex) { ++ if (ex instanceof ThreadDeath) { ++ throw (ThreadDeath)ex; ++ } ++ MinecraftServer.LOGGER.error("Remove callback for map threw exception ", ex); ++ } ++ } ++ } ++ ++ private void addObject(final E object, final int chunkX, final int chunkZ, final int prevChunkX, final int prevChunkZ, final int viewDistance) { ++ final int maxX = chunkX + viewDistance; ++ final int maxZ = chunkZ + viewDistance; ++ for (int x = chunkX - viewDistance; x <= maxX; ++x) { ++ for (int z = chunkZ - viewDistance; z <= maxZ; ++z) { ++ this.addObjectTo(object, x, z, chunkX, chunkZ, prevChunkX, prevChunkZ); ++ } ++ } ++ } ++ ++ private void removeObject(final E object, final int chunkX, final int chunkZ, final int currentChunkX, final int currentChunkZ, final int viewDistance) { ++ final int maxX = chunkX + viewDistance; ++ final int maxZ = chunkZ + viewDistance; ++ for (int x = chunkX - viewDistance; x <= maxX; ++x) { ++ for (int z = chunkZ - viewDistance; z <= maxZ; ++z) { ++ this.removeObjectFrom(object, x, z, currentChunkX, currentChunkZ, chunkX, chunkZ); ++ } ++ } ++ } ++ ++ /* math sign function except 0 returns 1 */ ++ protected static int sign(int val) { ++ return 1 | (val >> (Integer.SIZE - 1)); ++ } ++ ++ protected final void updateObject(final E object, final long oldPosition, final long newPosition, final int oldViewDistance, final int newViewDistance) { ++ final int toX = Util.getCoordinateX(newPosition); ++ final int toZ = Util.getCoordinateZ(newPosition); ++ final int fromX = Util.getCoordinateX(oldPosition); ++ final int fromZ = Util.getCoordinateZ(oldPosition); ++ ++ final int dx = toX - fromX; ++ final int dz = toZ - fromZ; ++ ++ final int totalX = Math.abs(fromX - toX); ++ final int totalZ = Math.abs(fromZ - toZ); ++ ++ if (Math.max(totalX, totalZ) > (2 * Math.max(newViewDistance, oldViewDistance))) { ++ // teleported? ++ this.removeObject(object, fromX, fromZ, fromX, fromZ, oldViewDistance); ++ this.addObject(object, toX, toZ, fromX, fromZ, newViewDistance); ++ return; ++ } ++ ++ if (oldViewDistance != newViewDistance) { ++ // remove loop ++ ++ final int oldMaxX = fromX + oldViewDistance; ++ final int oldMaxZ = fromZ + oldViewDistance; ++ for (int currX = fromX - oldViewDistance; currX <= oldMaxX; ++currX) { ++ for (int currZ = fromZ - oldViewDistance; currZ <= oldMaxZ; ++currZ) { ++ ++ // only remove if we're outside the new view distance... ++ if (Math.max(Math.abs(currX - toX), Math.abs(currZ - toZ)) > newViewDistance) { ++ this.removeObjectFrom(object, currX, currZ, toX, toZ, fromX, fromZ); ++ } ++ } ++ } ++ ++ // add loop ++ ++ final int newMaxX = toX + newViewDistance; ++ final int newMaxZ = toZ + newViewDistance; ++ for (int currX = toX - newViewDistance; currX <= newMaxX; ++currX) { ++ for (int currZ = toZ - newViewDistance; currZ <= newMaxZ; ++currZ) { ++ ++ // only add if we're outside the old view distance... ++ if (Math.max(Math.abs(currX - fromX), Math.abs(currZ - fromZ)) > oldViewDistance) { ++ this.addObjectTo(object, currX, currZ, toX, toZ, fromX, fromZ); ++ } ++ } ++ } ++ ++ return; ++ } ++ ++ // x axis is width ++ // z axis is height ++ // right refers to the x axis of where we moved ++ // top refers to the z axis of where we moved ++ ++ // same view distance ++ ++ // used for relative positioning ++ final int up = sign(dz); // 1 if dz >= 0, -1 otherwise ++ final int right = sign(dx); // 1 if dx >= 0, -1 otherwise ++ ++ // The area excluded by overlapping the two view distance squares creates four rectangles: ++ // Two on the left, and two on the right. The ones on the left we consider the "removed" section ++ // and on the right the "added" section. ++ // https://i.imgur.com/MrnOBgI.png is a reference image. Note that the outside border is not actually ++ // exclusive to the regions they surround. ++ ++ // 4 points of the rectangle ++ int maxX; // exclusive ++ int minX; // inclusive ++ int maxZ; // exclusive ++ int minZ; // inclusive ++ ++ if (dx != 0) { ++ // handle right addition ++ ++ maxX = toX + (oldViewDistance * right) + right; // exclusive ++ minX = fromX + (oldViewDistance * right) + right; // inclusive ++ maxZ = fromZ + (oldViewDistance * up) + up; // exclusive ++ minZ = toZ - (oldViewDistance * up); // inclusive ++ ++ for (int currX = minX; currX != maxX; currX += right) { ++ for (int currZ = minZ; currZ != maxZ; currZ += up) { ++ this.addObjectTo(object, currX, currZ, toX, toZ, fromX, fromZ); ++ } ++ } ++ } ++ ++ if (dz != 0) { ++ // handle up addition ++ ++ maxX = toX + (oldViewDistance * right) + right; // exclusive ++ minX = toX - (oldViewDistance * right); // inclusive ++ maxZ = toZ + (oldViewDistance * up) + up; // exclusive ++ minZ = fromZ + (oldViewDistance * up) + up; // inclusive ++ ++ for (int currX = minX; currX != maxX; currX += right) { ++ for (int currZ = minZ; currZ != maxZ; currZ += up) { ++ this.addObjectTo(object, currX, currZ, toX, toZ, fromX, fromZ); ++ } ++ } ++ } ++ ++ if (dx != 0) { ++ // handle left removal ++ ++ maxX = toX - (oldViewDistance * right); // exclusive ++ minX = fromX - (oldViewDistance * right); // inclusive ++ maxZ = fromZ + (oldViewDistance * up) + up; // exclusive ++ minZ = toZ - (oldViewDistance * up); // inclusive ++ ++ for (int currX = minX; currX != maxX; currX += right) { ++ for (int currZ = minZ; currZ != maxZ; currZ += up) { ++ this.removeObjectFrom(object, currX, currZ, toX, toZ, fromX, fromZ); ++ } ++ } ++ } ++ ++ if (dz != 0) { ++ // handle down removal ++ ++ maxX = fromX + (oldViewDistance * right) + right; // exclusive ++ minX = fromX - (oldViewDistance * right); // inclusive ++ maxZ = toZ - (oldViewDistance * up); // exclusive ++ minZ = fromZ - (oldViewDistance * up); // inclusive ++ ++ for (int currX = minX; currX != maxX; currX += right) { ++ for (int currZ = minZ; currZ != maxZ; currZ += up) { ++ this.removeObjectFrom(object, currX, currZ, toX, toZ, fromX, fromZ); ++ } ++ } ++ } ++ } ++ ++ @FunctionalInterface ++ public static interface ChangeCallback { ++ ++ // if there is no previous position, then prevPos = Integer.MIN_VALUE ++ void accept(final E object, final int rangeX, final int rangeZ, final int currPosX, final int currPosZ, final int prevPosX, final int prevPosZ, ++ final PooledLinkedHashSets.PooledObjectLinkedOpenHashSet newState); ++ ++ } ++} +\ No newline at end of file +diff --git a/src/main/java/com/tuinity/tuinity/util/map/PlayerAreaMap.java b/src/main/java/com/tuinity/tuinity/util/map/PlayerAreaMap.java +new file mode 100644 +index 000000000..a29fdcbbc +--- /dev/null ++++ b/src/main/java/com/tuinity/tuinity/util/map/PlayerAreaMap.java +@@ -0,0 +1,25 @@ ++package com.tuinity.tuinity.util.map; ++ ++ ++import net.minecraft.server.EntityPlayer; ++ ++public final class PlayerAreaMap extends AreaMap { ++ ++ public PlayerAreaMap() { ++ super(); ++ } ++ ++ public PlayerAreaMap(final PooledLinkedHashSets pooledHashSets) { ++ super(pooledHashSets); ++ } ++ ++ public PlayerAreaMap(final PooledLinkedHashSets pooledHashSets, final ChangeCallback addCallback, ++ final ChangeCallback removeCallback) { ++ super(pooledHashSets, addCallback, removeCallback); ++ } ++ ++ @Override ++ protected PooledLinkedHashSets.PooledObjectLinkedOpenHashSet getEmptySetFor(final EntityPlayer player) { ++ return player.cachedSingleHashSetTuinity; ++ } ++} +\ No newline at end of file +diff --git a/src/main/java/com/tuinity/tuinity/util/map/PooledLinkedHashSets.java b/src/main/java/com/tuinity/tuinity/util/map/PooledLinkedHashSets.java +new file mode 100644 +index 000000000..cf888454c +--- /dev/null ++++ b/src/main/java/com/tuinity/tuinity/util/map/PooledLinkedHashSets.java +@@ -0,0 +1,287 @@ ++package com.tuinity.tuinity.util.map; ++ ++import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; ++import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet; ++import java.lang.ref.WeakReference; ++ ++/** @author Spottedleaf */ ++public class PooledLinkedHashSets { ++ ++ /* Tested via https://gist.github.com/Spottedleaf/a93bb7a8993d6ce142d3efc5932bf573 */ ++ ++ // we really want to avoid that equals() check as much as possible... ++ protected final Object2ObjectOpenHashMap, PooledObjectLinkedOpenHashSet> mapPool = new Object2ObjectOpenHashMap<>(128, 0.25f); ++ ++ protected void decrementReferenceCount(final PooledObjectLinkedOpenHashSet current) { ++ if (current.referenceCount == 0) { ++ throw new IllegalStateException("Cannot decrement reference count for " + current); ++ } ++ if (current.referenceCount == -1 || --current.referenceCount > 0) { ++ return; ++ } ++ ++ this.mapPool.remove(current); ++ return; ++ } ++ ++ public PooledObjectLinkedOpenHashSet findMapWith(final PooledObjectLinkedOpenHashSet current, final E object) { ++ final PooledObjectLinkedOpenHashSet cached = current.getAddCache(object); ++ ++ if (cached != null) { ++ decrementReferenceCount(current); ++ ++ if (cached.referenceCount == 0) { ++ // bring the map back from the dead ++ PooledObjectLinkedOpenHashSet contending = this.mapPool.putIfAbsent(cached, cached); ++ if (contending != null) { ++ // a map already exists with the elements we want ++ if (contending.referenceCount != -1) { ++ ++contending.referenceCount; ++ } ++ current.updateAddCache(object, contending); ++ return contending; ++ } ++ ++ cached.referenceCount = 1; ++ } else if (cached.referenceCount != -1) { ++ ++cached.referenceCount; ++ } ++ ++ return cached; ++ } ++ ++ if (!current.add(object)) { ++ return current; ++ } ++ ++ // we use get/put since we use a different key on put ++ PooledObjectLinkedOpenHashSet ret = this.mapPool.get(current); ++ ++ if (ret == null) { ++ ret = new PooledObjectLinkedOpenHashSet<>(current); ++ current.remove(object); ++ this.mapPool.put(ret, ret); ++ ret.referenceCount = 1; ++ } else { ++ if (ret.referenceCount != -1) { ++ ++ret.referenceCount; ++ } ++ current.remove(object); ++ } ++ ++ current.updateAddCache(object, ret); ++ ++ decrementReferenceCount(current); ++ return ret; ++ } ++ ++ // rets null if current.size() == 1 ++ public PooledObjectLinkedOpenHashSet findMapWithout(final PooledObjectLinkedOpenHashSet current, final E object) { ++ if (current.set.size() == 1) { ++ decrementReferenceCount(current); ++ return null; ++ } ++ ++ final PooledObjectLinkedOpenHashSet cached = current.getRemoveCache(object); ++ ++ if (cached != null) { ++ decrementReferenceCount(current); ++ ++ if (cached.referenceCount == 0) { ++ // bring the map back from the dead ++ PooledObjectLinkedOpenHashSet contending = this.mapPool.putIfAbsent(cached, cached); ++ if (contending != null) { ++ // a map already exists with the elements we want ++ if (contending.referenceCount != -1) { ++ ++contending.referenceCount; ++ } ++ current.updateRemoveCache(object, contending); ++ return contending; ++ } ++ ++ cached.referenceCount = 1; ++ } else if (cached.referenceCount != -1) { ++ ++cached.referenceCount; ++ } ++ ++ return cached; ++ } ++ ++ if (!current.remove(object)) { ++ return current; ++ } ++ ++ // we use get/put since we use a different key on put ++ PooledObjectLinkedOpenHashSet ret = this.mapPool.get(current); ++ ++ if (ret == null) { ++ ret = new PooledObjectLinkedOpenHashSet<>(current); ++ current.add(object); ++ this.mapPool.put(ret, ret); ++ ret.referenceCount = 1; ++ } else { ++ if (ret.referenceCount != -1) { ++ ++ret.referenceCount; ++ } ++ current.add(object); ++ } ++ ++ current.updateRemoveCache(object, ret); ++ ++ decrementReferenceCount(current); ++ return ret; ++ } ++ ++ static final class RawSetObjectLinkedOpenHashSet extends ObjectOpenHashSet { ++ ++ public RawSetObjectLinkedOpenHashSet() { ++ super(); ++ } ++ ++ public RawSetObjectLinkedOpenHashSet(final int capacity) { ++ super(capacity); ++ } ++ ++ public RawSetObjectLinkedOpenHashSet(final int capacity, final float loadFactor) { ++ super(capacity, loadFactor); ++ } ++ ++ @Override ++ public RawSetObjectLinkedOpenHashSet clone() { ++ return (RawSetObjectLinkedOpenHashSet)super.clone(); ++ } ++ ++ public E[] getRawSet() { ++ return this.key; ++ } ++ } ++ ++ public static final class PooledObjectLinkedOpenHashSet { ++ ++ private static final WeakReference NULL_REFERENCE = new WeakReference<>(null); ++ ++ final RawSetObjectLinkedOpenHashSet set; ++ int referenceCount; // -1 if special ++ int hash; // optimize hashcode ++ ++ // add cache ++ WeakReference lastAddObject = NULL_REFERENCE; ++ WeakReference> lastAddMap = NULL_REFERENCE; ++ ++ // remove cache ++ WeakReference lastRemoveObject = NULL_REFERENCE; ++ WeakReference> lastRemoveMap = NULL_REFERENCE; ++ ++ public PooledObjectLinkedOpenHashSet(final PooledLinkedHashSets pooledSets) { ++ this.set = new RawSetObjectLinkedOpenHashSet<>(2, 0.8f); ++ } ++ ++ public PooledObjectLinkedOpenHashSet(final E single) { ++ this((PooledLinkedHashSets)null); ++ this.referenceCount = -1; ++ this.add(single); ++ } ++ ++ public PooledObjectLinkedOpenHashSet(final PooledObjectLinkedOpenHashSet other) { ++ this.set = other.set.clone(); ++ this.hash = other.hash; ++ } ++ ++ // from https://github.com/Spottedleaf/ConcurrentUtil/blob/master/src/main/java/ca/spottedleaf/concurrentutil/util/IntegerUtil.java ++ // generated by https://github.com/skeeto/hash-prospector ++ private static int hash0(int x) { ++ x *= 0x36935555; ++ x ^= x >>> 16; ++ return x; ++ } ++ ++ PooledObjectLinkedOpenHashSet getAddCache(final E element) { ++ final E currentAdd = this.lastAddObject.get(); ++ ++ if (currentAdd == null || !(currentAdd == element || currentAdd.equals(element))) { ++ return null; ++ } ++ ++ return this.lastAddMap.get(); ++ } ++ ++ PooledObjectLinkedOpenHashSet getRemoveCache(final E element) { ++ final E currentRemove = this.lastRemoveObject.get(); ++ ++ if (currentRemove == null || !(currentRemove == element || currentRemove.equals(element))) { ++ return null; ++ } ++ ++ return this.lastRemoveMap.get(); ++ } ++ ++ void updateAddCache(final E element, final PooledObjectLinkedOpenHashSet map) { ++ this.lastAddObject = new WeakReference<>(element); ++ this.lastAddMap = new WeakReference<>(map); ++ } ++ ++ void updateRemoveCache(final E element, final PooledObjectLinkedOpenHashSet map) { ++ this.lastRemoveObject = new WeakReference<>(element); ++ this.lastRemoveMap = new WeakReference<>(map); ++ } ++ ++ boolean add(final E element) { ++ boolean added = this.set.add(element); ++ ++ if (added) { ++ this.hash += hash0(element.hashCode()); ++ } ++ ++ return added; ++ } ++ ++ boolean remove(Object element) { ++ boolean removed = this.set.remove(element); ++ ++ if (removed) { ++ this.hash -= hash0(element.hashCode()); ++ } ++ ++ return removed; ++ } ++ ++ public boolean contains(final Object element) { ++ return this.set.contains(element); ++ } ++ ++ public E[] getBackingSet() { ++ return this.set.getRawSet(); ++ } ++ ++ public int size() { ++ return this.set.size(); ++ } ++ ++ @Override ++ public int hashCode() { ++ return this.hash; ++ } ++ ++ @Override ++ public boolean equals(final Object other) { ++ if (!(other instanceof PooledObjectLinkedOpenHashSet)) { ++ return false; ++ } ++ if (this.referenceCount == 0) { ++ return other == this; ++ } else { ++ if (other == this) { ++ // Unfortunately we are never equal to our own instance while in use! ++ return false; ++ } ++ return this.hash == ((PooledObjectLinkedOpenHashSet)other).hash && this.set.equals(((PooledObjectLinkedOpenHashSet)other).set); ++ } ++ } ++ ++ @Override ++ public String toString() { ++ return "PooledHashSet: size: " + this.set.size() + ", reference count: " + this.referenceCount + ", hash: " + ++ this.hashCode() + ", identity: " + System.identityHashCode(this) + " map: " + this.set.toString(); ++ } ++ } ++} +\ No newline at end of file +diff --git a/src/main/java/com/tuinity/tuinity/util/pool/PooledBlockPositions.java b/src/main/java/com/tuinity/tuinity/util/pool/PooledBlockPositions.java +new file mode 100644 +index 000000000..815974682 +--- /dev/null ++++ b/src/main/java/com/tuinity/tuinity/util/pool/PooledBlockPositions.java +@@ -0,0 +1,40 @@ ++package com.tuinity.tuinity.util.pool; ++ ++import net.minecraft.server.BlockPosition; ++import net.minecraft.server.MinecraftServer; ++ ++public class PooledBlockPositions { ++ ++ private static final int BLOCK_POOL_SIZE = 8192; ++ ++ private static final BlockPosition.MutableBlockPosition[] POOL = new BlockPosition.MutableBlockPosition[BLOCK_POOL_SIZE]; ++ private static int used = 0; // exclusive index of used positions ++ ++ static { ++ for (int i = 0; i < BLOCK_POOL_SIZE; ++i) { ++ POOL[i] = new BlockPosition.MutableBlockPosition(); ++ } ++ } ++ ++ public static BlockPosition.MutableBlockPosition get(final int x, final int y, final int z) { ++ final int currentUsed = used; ++ if (Thread.currentThread() != MinecraftServer.getServer().serverThread || currentUsed >= POOL.length) { ++ return new BlockPosition.MutableBlockPosition(x, y, z); ++ } ++ used = currentUsed + 1; ++ ++ final BlockPosition.MutableBlockPosition ret = POOL[currentUsed]; ++ POOL[currentUsed] = null; ++ ++ return ret.setValues(x, y, z); ++ } ++ ++ public static void ret(final BlockPosition.MutableBlockPosition position) { ++ final int currentUsed = used; ++ if (Thread.currentThread() != MinecraftServer.getServer().serverThread || currentUsed == 0) { ++ return; ++ } ++ ++ POOL[used = currentUsed - 1] = position; ++ } ++} +diff --git a/src/main/java/com/tuinity/tuinity/util/set/LinkedSortedSet.java b/src/main/java/com/tuinity/tuinity/util/set/LinkedSortedSet.java +new file mode 100644 +index 000000000..c726ef3c2 +--- /dev/null ++++ b/src/main/java/com/tuinity/tuinity/util/set/LinkedSortedSet.java +@@ -0,0 +1,142 @@ ++package com.tuinity.tuinity.util.set; ++ ++import java.util.Comparator; ++import java.util.Iterator; ++import java.util.NoSuchElementException; ++ ++public final class LinkedSortedSet implements Iterable { ++ ++ public final Comparator comparator; ++ ++ protected Link head; ++ protected Link tail; ++ ++ public LinkedSortedSet() { ++ this((Comparator)Comparator.naturalOrder()); ++ } ++ ++ public LinkedSortedSet(final Comparator comparator) { ++ this.comparator = comparator; ++ } ++ ++ public void clear() { ++ this.head = this.tail = null; ++ } ++ ++ @Override ++ public Iterator iterator() { ++ return new Iterator() { ++ ++ Link next = LinkedSortedSet.this.head; ++ ++ @Override ++ public boolean hasNext() { ++ return this.next != null; ++ } ++ ++ @Override ++ public E next() { ++ final Link next = this.next; ++ if (next == null) { ++ throw new NoSuchElementException(); ++ } ++ this.next = next.next; ++ return next.element; ++ } ++ }; ++ } ++ ++ public boolean addLast(final E element) { ++ final Comparator comparator = this.comparator; ++ ++ Link curr = this.tail; ++ if (curr != null) { ++ int compare; ++ ++ while ((compare = comparator.compare(element, curr.element)) < 0) { ++ Link prev = curr; ++ curr = curr.prev; ++ if (curr != null) { ++ continue; ++ } ++ this.head = prev.prev = new Link<>(element, null, prev); ++ return true; ++ } ++ ++ if (compare != 0) { ++ // insert after curr ++ final Link next = curr.next; ++ final Link insert = new Link<>(element, curr, next); ++ curr.next = insert; ++ ++ if (next == null) { ++ this.tail = insert; ++ } else { ++ next.prev = insert; ++ } ++ return true; ++ } ++ ++ return false; ++ } else { ++ this.head = this.tail = new Link<>(element); ++ return true; ++ } ++ } ++ ++ public boolean addFirst(final E element) { ++ final Comparator comparator = this.comparator; ++ ++ Link curr = this.head; ++ if (curr != null) { ++ int compare; ++ ++ while ((compare = comparator.compare(element, curr.element)) > 0) { ++ Link prev = curr; ++ curr = curr.next; ++ if (curr != null) { ++ continue; ++ } ++ this.tail = prev.next = new Link<>(element, prev, null); ++ return true; ++ } ++ ++ if (compare != 0) { ++ // insert before curr ++ final Link prev = curr.prev; ++ final Link insert = new Link<>(element, prev, curr); ++ curr.prev = insert; ++ ++ if (prev == null) { ++ this.head = insert; ++ } else { ++ prev.next = insert; ++ } ++ return true; ++ } ++ ++ return false; ++ } else { ++ this.head = this.tail = new Link<>(element); ++ return true; ++ } ++ } ++ ++ protected static final class Link { ++ public E element; ++ public Link prev; ++ public Link next; ++ ++ public Link() {} ++ ++ public Link(final E element) { ++ this.element = element; ++ } ++ ++ public Link(final E element, final Link prev, final Link next) { ++ this.element = element; ++ this.prev = prev; ++ this.next = next; ++ } ++ } ++} +diff --git a/src/main/java/net/minecraft/server/ArraySetSorted.java b/src/main/java/net/minecraft/server/ArraySetSorted.java +index 85f799a71..5fa6f75e2 100644 +--- a/src/main/java/net/minecraft/server/ArraySetSorted.java ++++ b/src/main/java/net/minecraft/server/ArraySetSorted.java +@@ -6,12 +6,13 @@ import java.util.Arrays; + import java.util.Comparator; + import java.util.Iterator; + import java.util.NoSuchElementException; ++import java.util.function.Predicate; // Tuinity + + public class ArraySetSorted extends AbstractSet { + + private final Comparator a; +- private T[] b; +- private int c; ++ private T[] b; private final T[] getBackingArray() { return this.b; } // Tuinity - OBFHELPER ++ private int c; private final int getSize() { return this.c; } private final void setSize(int value) { this.c = value; } // Tuinity - OBFHELPER + + private ArraySetSorted(int i, Comparator comparator) { + this.a = comparator; +@@ -22,6 +23,42 @@ public class ArraySetSorted extends AbstractSet { + } + } + ++ // Tuinity start - optimise removeIf ++ @Override ++ public boolean removeIf(Predicate filter) { ++ // prev. impl used an iterator, which could be n^2 ++ int i = 0, len = this.getSize(); ++ T[] backingArray = this.getBackingArray(); ++ ++ for (;;) { ++ if (i >= len) { ++ return false; ++ } ++ if (!filter.test(backingArray[i])) { ++ ++i; ++ continue; ++ } ++ break; ++ } ++ ++ // we only want to write back to backingArray if we really need to ++ ++ int lastIndex = i; // this is where new elements are shifted to ++ ++ for (; i < len; ++i) { ++ T curr = backingArray[i]; ++ if (!filter.test(curr)) { // if test throws we're screwed ++ backingArray[lastIndex++] = curr; ++ } ++ } ++ ++ // cleanup end ++ Arrays.fill(backingArray, lastIndex, len, null); ++ this.setSize(lastIndex); ++ return true; ++ } ++ // Tuinity end - optimise removeIf ++ + public static > ArraySetSorted a(int i) { + return new ArraySetSorted<>(i, (Comparator)Comparator.naturalOrder()); // Paper - decompile fix + } +diff --git a/src/main/java/net/minecraft/server/AxisAlignedBB.java b/src/main/java/net/minecraft/server/AxisAlignedBB.java +index c950139c0..1a3234bb4 100644 +--- a/src/main/java/net/minecraft/server/AxisAlignedBB.java ++++ b/src/main/java/net/minecraft/server/AxisAlignedBB.java +@@ -193,6 +193,7 @@ public class AxisAlignedBB { + return this.d(vec3d.x, vec3d.y, vec3d.z); + } + ++ public final boolean intersects(AxisAlignedBB axisalignedbb) { return this.c(axisalignedbb); } // Paper - OBFHELPER + public boolean c(AxisAlignedBB axisalignedbb) { + return this.a(axisalignedbb.minX, axisalignedbb.minY, axisalignedbb.minZ, axisalignedbb.maxX, axisalignedbb.maxY, axisalignedbb.maxZ); + } +@@ -206,6 +207,7 @@ public class AxisAlignedBB { + return this.e(vec3d.x, vec3d.y, vec3d.z); + } + ++ public final boolean contains(double x, double y, double z) { return this.e(x, y, z); } // Tuinity - OBFHELPER + public boolean e(double d0, double d1, double d2) { + return d0 >= this.minX && d0 < this.maxX && d1 >= this.minY && d1 < this.maxY && d2 >= this.minZ && d2 < this.maxZ; + } +diff --git a/src/main/java/net/minecraft/server/BlockPosition.java b/src/main/java/net/minecraft/server/BlockPosition.java +index e650a2e48..83c5c8329 100644 +--- a/src/main/java/net/minecraft/server/BlockPosition.java ++++ b/src/main/java/net/minecraft/server/BlockPosition.java +@@ -125,6 +125,7 @@ public class BlockPosition extends BaseBlockPosition implements MinecraftSeriali + return i == 0 && j == 0 && k == 0 ? this : new BlockPosition(this.getX() + i, this.getY() + j, this.getZ() + k); + } + ++ public final BlockPosition add(BaseBlockPosition baseblockposition) { return this.a(baseblockposition); } // Tuinity - OBFHELPER + public BlockPosition a(BaseBlockPosition baseblockposition) { + return this.b(baseblockposition.getX(), baseblockposition.getY(), baseblockposition.getZ()); + } +diff --git a/src/main/java/net/minecraft/server/Chunk.java b/src/main/java/net/minecraft/server/Chunk.java +index 92065fe02..cd7ada615 100644 +--- a/src/main/java/net/minecraft/server/Chunk.java ++++ b/src/main/java/net/minecraft/server/Chunk.java +@@ -162,6 +162,94 @@ public class Chunk implements IChunkAccess { + public PlayerChunk playerChunk; + // Paper end + ++ // Tuinity start ++ public final void forEachEntity(final Consumer consumer) { ++ Entity[] entities = this.entities.getRawData(); ++ for (int i = 0, len = this.entities.size(); i < len; ++i) { ++ consumer.accept(entities[i]); ++ } ++ } ++ ++ public static final int NEIGHBOUR_CACHE_RADIUS = 3; ++ // note that it also includes this chunk, just in case we want to check from a getIfCached result... ++ boolean loadedTicketLevel; ++ ++ private long neighbourChunksLoadedBitset; ++ private final Chunk[] loadedNeighbourChunks = new Chunk[(NEIGHBOUR_CACHE_RADIUS * 2 + 1) * (NEIGHBOUR_CACHE_RADIUS * 2 + 1)]; ++ ++ private static int getNeighbourIndex(final int relativeX, final int relativeZ) { ++ // index = (relativeX + NEIGHBOUR_CACHE_RADIUS) + (relativeZ + NEIGHBOUR_CACHE_RADIUS) * (NEIGHBOUR_CACHE_RADIUS * 2 + 1) ++ // optimised variant of the above by moving some of the ops to compile time ++ return relativeX + (relativeZ * (NEIGHBOUR_CACHE_RADIUS * 2 + 1)) + (NEIGHBOUR_CACHE_RADIUS + NEIGHBOUR_CACHE_RADIUS * ((NEIGHBOUR_CACHE_RADIUS * 2 + 1))); ++ } ++ ++ public final Chunk getRelativeNeighbourIfLoaded(final int relativeX, final int relativeZ) { ++ return this.loadedNeighbourChunks[getNeighbourIndex(relativeX, relativeZ)]; ++ } ++ ++ public final boolean isNeighbourLoaded(final int relativeX, final int relativeZ) { ++ return (this.neighbourChunksLoadedBitset & (1L << getNeighbourIndex(relativeX, relativeZ))) != 0; ++ } ++ ++ public final void setNeighbourLoaded(final int relativeX, final int relativeZ, final Chunk chunk) { ++ if (chunk == null) { ++ throw new IllegalArgumentException("Chunk must be non-null, neighbour: (" + relativeX + "," + relativeZ + "), chunk: " + this.loc); ++ } ++ final int index = getNeighbourIndex(relativeX, relativeZ); ++ this.loadedNeighbourChunks[index] = chunk; ++ this.neighbourChunksLoadedBitset |= (1L << index); ++ } ++ ++ public final void setNeighbourUnloaded(final int relativeX, final int relativeZ) { ++ final int index = getNeighbourIndex(relativeX, relativeZ); ++ this.loadedNeighbourChunks[index] = null; ++ this.neighbourChunksLoadedBitset &= ~(1L << index); ++ } ++ ++ public final void resetNeighbours() { ++ this.neighbourChunksLoadedBitset = 0; ++ java.util.Arrays.fill(this.loadedNeighbourChunks, null); ++ } ++ ++ public final boolean areNeighboursLoaded(final int radius) { ++ // index = relativeX + (relativeZ * (NEIGHBOUR_CACHE_RADIUS * 2 + 1)) + (NEIGHBOUR_CACHE_RADIUS + NEIGHBOUR_CACHE_RADIUS * ((NEIGHBOUR_CACHE_RADIUS * 2 + 1))) ++ switch (radius) { ++ case 0: ++ return this.loadedTicketLevel; ++ case 1: { ++ long mask = 0; ++ for (int dx = -1; dx <= 1; ++dx) { ++ for (int dz = -1; dz <= 1; ++dz) { ++ mask |= getNeighbourIndex(dx, dz); ++ } ++ } ++ return (this.neighbourChunksLoadedBitset & mask) == mask; ++ } ++ case 2: { ++ long mask = 0; ++ for (int dx = -2; dx <= 2; ++dx) { ++ for (int dz = -2; dz <= 2; ++dz) { ++ mask |= getNeighbourIndex(dx, dz); ++ } ++ } ++ return (this.neighbourChunksLoadedBitset & mask) == mask; ++ } ++ case 3: { ++ long mask = 0; ++ for (int dx = -3; dx <= 3; ++dx) { ++ for (int dz = -3; dz <= 3; ++dz) { ++ mask |= getNeighbourIndex(dx, dz); ++ } ++ } ++ return (this.neighbourChunksLoadedBitset & mask) == mask; ++ } ++ ++ default: ++ throw new IllegalArgumentException("Radius not recognized: " + radius); ++ } ++ } ++ // Tuinity end ++ + public Chunk(World world, ProtoChunk protochunk) { + this(world, protochunk.getPos(), protochunk.getBiomeIndex(), protochunk.p(), protochunk.n(), protochunk.o(), protochunk.getInhabitedTime(), protochunk.getSections(), (Consumer) null); + Iterator iterator = protochunk.y().iterator(); +@@ -407,6 +495,7 @@ public class Chunk implements IChunkAccess { + + @Override + public void a(Entity entity) { ++ com.tuinity.tuinity.util.TickThread.softEnsureTickThread("Async addEntity call"); // Tuinity + this.q = true; + int i = MathHelper.floor(entity.locX() / 16.0D); + int j = MathHelper.floor(entity.locZ() / 16.0D); +@@ -476,6 +565,7 @@ public class Chunk implements IChunkAccess { + } + + public void a(Entity entity, int i) { ++ com.tuinity.tuinity.util.TickThread.softEnsureTickThread("Async removeEntity call"); // Tuinity + if (i < 0) { + i = 0; + } +@@ -508,6 +598,12 @@ public class Chunk implements IChunkAccess { + return ((HeightMap) this.heightMap.get(heightmap_type)).a(i & 15, j & 15) - 1; + } + ++ // Tuinity start ++ public final int getHighestBlockYAt(HeightMap.Type type, int x, int z) { ++ return this.heightMap.get(type).get(x & 15, z & 15); // TODO obfhelper ++ } ++ // Tuinity end ++ + @Nullable + private TileEntity j(BlockPosition blockposition) { + IBlockData iblockdata = this.getType(blockposition); +@@ -649,6 +745,24 @@ public class Chunk implements IChunkAccess { + + // CraftBukkit start + public void loadCallback() { ++ // Tuinity start - neighbour cache ++ int chunkX = this.loc.x; ++ int chunkZ = this.loc.z; ++ ChunkProviderServer chunkProvider = ((WorldServer)this.world).getChunkProvider(); ++ for (int dx = -NEIGHBOUR_CACHE_RADIUS; dx <= NEIGHBOUR_CACHE_RADIUS; ++dx) { ++ for (int dz = -NEIGHBOUR_CACHE_RADIUS; dz <= NEIGHBOUR_CACHE_RADIUS; ++dz) { ++ Chunk neighbour = chunkProvider.getChunkAtIfLoadedMainThreadNoCache(chunkX + dx, chunkZ + dz); ++ if (neighbour != null) { ++ neighbour.setNeighbourLoaded(-dx, -dz, this); ++ // should be in cached already ++ this.setNeighbourLoaded(dx, dz, neighbour); ++ } ++ } ++ } ++ this.loadedTicketLevel = true; ++ // Tuinity end - neighbour cache ++ ++ ((WorldServer)this.world).onChunkLoad(this); // Tuinity - optimise entity list iteration + org.bukkit.Server server = this.world.getServer(); + ((WorldServer)this.world).getChunkProvider().addLoadedChunk(this); // Paper + if (server != null) { +@@ -692,6 +806,23 @@ public class Chunk implements IChunkAccess { + // note: saving can be prevented, but not forced if no saving is actually required + this.mustNotSave = !unloadEvent.isSaveChunk(); + ((WorldServer)this.world).getChunkProvider().removeLoadedChunk(this); // Paper ++ // Tuinity start - neighbour cache ++ int chunkX = this.loc.x; ++ int chunkZ = this.loc.z; ++ ChunkProviderServer chunkProvider = ((WorldServer)this.world).getChunkProvider(); ++ for (int dx = -NEIGHBOUR_CACHE_RADIUS; dx <= NEIGHBOUR_CACHE_RADIUS; ++dx) { ++ for (int dz = -NEIGHBOUR_CACHE_RADIUS; dz <= NEIGHBOUR_CACHE_RADIUS; ++dz) { ++ Chunk neighbour = chunkProvider.getChunkAtIfLoadedMainThreadNoCache(chunkX + dx, chunkZ + dz); ++ if (neighbour != null) { ++ neighbour.setNeighbourUnloaded(-dx, -dz); ++ } ++ } ++ } ++ this.loadedTicketLevel = false; ++ this.resetNeighbours(); ++ // Tuinity end - neighbour cache ++ ++ ((WorldServer)this.world).onChunkUnload(this); // Tuinity - optimise entity list iteration + } + // CraftBukkit end + +@@ -700,6 +831,7 @@ public class Chunk implements IChunkAccess { + } + + public void a(@Nullable Entity entity, AxisAlignedBB axisalignedbb, List list, @Nullable Predicate predicate) { ++ com.tuinity.tuinity.util.TickThread.softEnsureTickThread("Async getEntities call"); // Tuinity + int i = MathHelper.floor((axisalignedbb.minY - 2.0D) / 16.0D); + int j = MathHelper.floor((axisalignedbb.maxY + 2.0D) / 16.0D); + +@@ -739,6 +871,7 @@ public class Chunk implements IChunkAccess { + } + + public void a(@Nullable EntityTypes entitytypes, AxisAlignedBB axisalignedbb, List list, Predicate predicate) { ++ com.tuinity.tuinity.util.TickThread.softEnsureTickThread("Async getEntities call"); // Tuinity + int i = MathHelper.floor((axisalignedbb.minY - 2.0D) / 16.0D); + int j = MathHelper.floor((axisalignedbb.maxY + 2.0D) / 16.0D); + +@@ -761,6 +894,7 @@ public class Chunk implements IChunkAccess { + } + + public void a(Class oclass, AxisAlignedBB axisalignedbb, List list, @Nullable Predicate predicate) { ++ com.tuinity.tuinity.util.TickThread.softEnsureTickThread("Async getEntities call"); // Tuinity + int i = MathHelper.floor((axisalignedbb.minY - 2.0D) / 16.0D); + int j = MathHelper.floor((axisalignedbb.maxY + 2.0D) / 16.0D); + +diff --git a/src/main/java/net/minecraft/server/ChunkMap.java b/src/main/java/net/minecraft/server/ChunkMap.java +index 55f9f4e6e..d3c616e72 100644 +--- a/src/main/java/net/minecraft/server/ChunkMap.java ++++ b/src/main/java/net/minecraft/server/ChunkMap.java +@@ -13,9 +13,10 @@ public abstract class ChunkMap extends LightEngineGraph { + + @Override + protected void a(long i, int j, boolean flag) { +- ChunkCoordIntPair chunkcoordintpair = new ChunkCoordIntPair(i); +- int k = chunkcoordintpair.x; +- int l = chunkcoordintpair.z; ++ // Tuinity start - remove allocation of ChunkCoordIntPair ++ int k = ChunkCoordIntPair.getX(i); ++ int l = ChunkCoordIntPair.getZ(i); ++ // Tuinity end + + for (int i1 = -1; i1 <= 1; ++i1) { + for (int j1 = -1; j1 <= 1; ++j1) { +@@ -32,9 +33,10 @@ public abstract class ChunkMap extends LightEngineGraph { + @Override + protected int a(long i, long j, int k) { + int l = k; +- ChunkCoordIntPair chunkcoordintpair = new ChunkCoordIntPair(i); +- int i1 = chunkcoordintpair.x; +- int j1 = chunkcoordintpair.z; ++ // Tuinity start - remove allocation of ChunkCoordIntPair ++ int i1 = ChunkCoordIntPair.getX(i); ++ int j1 = ChunkCoordIntPair.getZ(i); ++ // Tuinity end + + for (int k1 = -1; k1 <= 1; ++k1) { + for (int l1 = -1; l1 <= 1; ++l1) { +@@ -68,6 +70,7 @@ public abstract class ChunkMap extends LightEngineGraph { + + protected abstract int b(long i); + ++ public final void update(long coordinate, int level, boolean increaseInLevel) { this.b(coordinate, level, increaseInLevel); } // Tuinity - OBFHELPER + public void b(long i, int j, boolean flag) { + this.a(ChunkCoordIntPair.a, i, j, flag); + } +diff --git a/src/main/java/net/minecraft/server/ChunkMapDistance.java b/src/main/java/net/minecraft/server/ChunkMapDistance.java +index 73d157076..cb2e67d15 100644 +--- a/src/main/java/net/minecraft/server/ChunkMapDistance.java ++++ b/src/main/java/net/minecraft/server/ChunkMapDistance.java +@@ -1,5 +1,6 @@ + package net.minecraft.server; + ++import com.tuinity.tuinity.util.Util; // Tuinity + import com.google.common.collect.ImmutableList; + import com.google.common.collect.Sets; + import com.mojang.datafixers.util.Either; +@@ -27,13 +28,13 @@ import org.apache.logging.log4j.Logger; + public abstract class ChunkMapDistance { + + private static final Logger LOGGER = LogManager.getLogger(); +- private static final int b = 33 + ChunkStatus.a(ChunkStatus.FULL) - 2; ++ private static final int b = 33 + ChunkStatus.a(ChunkStatus.FULL) - 2; public static int getPlayerTicketLevel() { return ChunkMapDistance.b; } // Tuinity - OBFHELPER + private final Long2ObjectMap> c = new Long2ObjectOpenHashMap(); + public final Long2ObjectOpenHashMap>> tickets = new Long2ObjectOpenHashMap(); +- private final ChunkMapDistance.a e = new ChunkMapDistance.a(); +- private final ChunkMapDistance.b f = new ChunkMapDistance.b(8); +- private final ChunkMapDistance.c g = new ChunkMapDistance.c(33); +- private final java.util.Queue pendingChunkUpdates = new java.util.LinkedList<>(); // PAIL pendingChunkUpdates // Paper - use a queue ++ private final ChunkMapDistance.a e = new ChunkMapDistance.a(); final ChunkMapDistance.a getTicketTracker() { return this.e; } // Tuinity - OBFHELPER ++ public static final int MOB_SPAWN_RANGE = 8; //private final ChunkMapDistance.b f = new ChunkMapDistance.b(8); // Tuinity - no longer used ++ //private final ChunkMapDistance.c g = new ChunkMapDistance.c(33); // Tuinity - no longer used ++ private final java.util.Queue pendingChunkUpdates = new java.util.ArrayDeque<>(); // PAIL pendingChunkUpdates // Paper - use a queue // Tuinity - use a better queue + private final ChunkTaskQueueSorter i; + private final Mailbox> j; + private final Mailbox k; +@@ -41,6 +42,96 @@ public abstract class ChunkMapDistance { + private final Executor m; + private long currentTick; + ++ // Tuinity start ++ protected PlayerChunkMap chunkMap; ++ protected final ChunkMapDistance.TicketTracker playerTickViewDistanceHandler = new TicketTracker(ChunkMapDistance.getPlayerTicketLevel()) { ++ @Override ++ protected int tryQueueChunk(int chunkX, int chunkZ, EntityPlayer player) { ++ long coordinate = Util.getCoordinateKey(chunkX, chunkZ); ++ PlayerChunk currentChunk = ChunkMapDistance.this.chunkMap.chunkMap.getUpdating(coordinate); ++ if (currentChunk != null) { ++ Chunk fullChunk = currentChunk.getFullReadyChunk(); ++ if (fullChunk != null && fullChunk.areNeighboursLoaded(2)) { ++ this.chunkReferenceMap.putIfAbsent(coordinate, LOADED_PLAYER_REFERENCE); ++ ChunkMapDistance.this.addTicket(coordinate, new Ticket<>(TicketType.PLAYER, this.ticketLevel, new ChunkCoordIntPair(chunkX, chunkZ))); ++ return QUEUED; ++ } ++ } ++ ++ return FAILED; ++ } ++ ++ @Override ++ protected int getMaxChunkLoads(EntityPlayer player) { ++ return Integer.MAX_VALUE; ++ } ++ }; ++ ++ protected final ChunkMapDistance.TicketTracker playerNoTickViewDistanceHandler = new TicketTracker(33) { // loaded ticket level ++ @Override ++ protected int tryQueueChunk(int chunkX, int chunkZ, EntityPlayer player) { ++ long coordinate = Util.getCoordinateKey(chunkX, chunkZ); ++ PlayerChunk currentChunk = ChunkMapDistance.this.chunkMap.chunkMap.getUpdating(coordinate); ++ if (currentChunk != null && currentChunk.getTicketLevel() <= this.ticketLevel) { ++ this.chunkReferenceMap.putIfAbsent(coordinate, LOADED_PLAYER_REFERENCE); ++ ChunkMapDistance.this.addTicket(coordinate, new Ticket<>(TicketType.PLAYER, this.ticketLevel, new ChunkCoordIntPair(chunkX, chunkZ))); ++ return ALREADY_QUEUED; ++ } ++ if (this.chunkReferenceMap.putIfAbsent(coordinate, player.getId()) == -1) { ++ ChunkMapDistance.this.addTicket(coordinate, new Ticket<>(TicketType.PLAYER, this.ticketLevel, new ChunkCoordIntPair(chunkX, chunkZ))); ++ return QUEUED; ++ } ++ return ALREADY_QUEUED; ++ } ++ ++ @Override ++ protected int getMaxChunkLoads(EntityPlayer player) { ++ return com.tuinity.tuinity.config.TuinityConfig.maxChunkLoadsPerPlayer; // per-player limits instead of global? ++ } ++ }; ++ // Tuinity end ++ ++ // Tuinity start - delay chunk unloads ++ private long nextUnloadId; // delay chunk unloads ++ private final Long2ObjectOpenHashMap> delayedChunks = new Long2ObjectOpenHashMap<>(); ++ public final void removeTickets(long chunk, TicketType type) { ++ ArraySetSorted> tickets = this.tickets.get(chunk); ++ if (tickets == null) { ++ return; ++ } ++ if (type == TicketType.DELAYED_UNLOAD) { ++ this.delayedChunks.remove(chunk); ++ } ++ boolean changed = tickets.removeIf((Ticket ticket) -> { ++ return ticket.getTicketType() == type; ++ }); ++ if (changed) { ++ this.getTicketTracker().update(chunk, getLowestTicketLevel(tickets), false); ++ } ++ } ++ ++ private final java.util.function.LongFunction> computeFuntion = (long key) -> { ++ Ticket ret = new Ticket<>(TicketType.DELAYED_UNLOAD, -1, ++ChunkMapDistance.this.nextUnloadId); ++ ret.isCached = true; ++ return ret; ++ }; ++ ++ private void computeDelayedTicketFor(long chunk, int removedLevel, ArraySetSorted> tickets) { ++ int lowestLevel = getLowestTicketLevel(tickets); ++ if (removedLevel > lowestLevel) { ++ return; ++ } ++ final Ticket ticket = this.delayedChunks.computeIfAbsent(chunk, this.computeFuntion); ++ if (ticket.getTicketLevel() != -1) { ++ // since we modify data used in sorting, we need to remove before ++ tickets.remove(ticket); ++ } ++ ticket.setCreationTick(this.currentTick); ++ ticket.setTicketLevel(removedLevel); ++ tickets.add(ticket); // re-add with new expire time and ticket level ++ } ++ // Tuinity end - delay chunk unloads ++ + protected ChunkMapDistance(Executor executor, Executor executor1) { + executor1.getClass(); + Mailbox mailbox = Mailbox.a("player ticket throttler", executor1::execute); +@@ -53,15 +144,34 @@ public abstract class ChunkMapDistance { + } + + protected void purgeTickets() { ++ com.tuinity.tuinity.util.TickThread.softEnsureTickThread("Async purge tickets"); // Tuinity + ++this.currentTick; + ObjectIterator objectiterator = this.tickets.long2ObjectEntrySet().fastIterator(); + ++ int[] tempLevel = new int[] { PlayerChunkMap.GOLDEN_TICKET + 1 }; // Tuinity - delay chunk unloads + while (objectiterator.hasNext()) { + Entry>> entry = (Entry) objectiterator.next(); + + if ((entry.getValue()).removeIf((ticket) -> { // CraftBukkit - decompile error +- return ticket.b(this.currentTick); ++ // Tuinity start - delay chunk unloads ++ boolean ret = ticket.isExpired(this.currentTick); ++ if (com.tuinity.tuinity.config.TuinityConfig.delayChunkUnloadsBy <= 0) { ++ return ret; ++ } ++ if (ret && ticket.getTicketType() != TicketType.DELAYED_UNLOAD && ticket.getTicketLevel() < tempLevel[0]) { ++ tempLevel[0] = ticket.getTicketLevel(); ++ } ++ if (ticket.getTicketType() == TicketType.DELAYED_UNLOAD && ticket.isCached) { ++ this.delayedChunks.remove(entry.getLongKey(), ticket); // clean up ticket... ++ } ++ return ret; ++ // Tuinity end - delay chunk unloads + })) { ++ // Tuinity start - delay chunk unloads ++ if (tempLevel[0] < (PlayerChunkMap.GOLDEN_TICKET + 1)) { ++ this.computeDelayedTicketFor(entry.getLongKey(), tempLevel[0], entry.getValue()); ++ } ++ // Tuinity end - delay chunk unloads + this.e.b(entry.getLongKey(), a((ArraySetSorted) entry.getValue()), false); + } + +@@ -72,6 +182,7 @@ public abstract class ChunkMapDistance { + + } + ++ private static int getLowestTicketLevel(ArraySetSorted> arraysetsorted) { return a(arraysetsorted); } // Tuinity - OBFHELPER + private static int a(ArraySetSorted> arraysetsorted) { + return !arraysetsorted.isEmpty() ? ((Ticket) arraysetsorted.b()).b() : PlayerChunkMap.GOLDEN_TICKET + 1; + } +@@ -85,8 +196,8 @@ public abstract class ChunkMapDistance { + protected abstract PlayerChunk a(long i, int j, @Nullable PlayerChunk playerchunk, int k); + + public boolean a(PlayerChunkMap playerchunkmap) { +- this.f.a(); +- this.g.a(); ++ //this.f.a(); // Tuinity - no longer used ++ //this.g.a(); // Tuinity - no longer used + int i = Integer.MAX_VALUE - this.e.a(Integer.MAX_VALUE); + boolean flag = i != 0; + +@@ -136,6 +247,7 @@ public abstract class ChunkMapDistance { + } + + private boolean addTicket(long i, Ticket ticket) { // CraftBukkit - void -> boolean ++ com.tuinity.tuinity.util.TickThread.softEnsureTickThread("Async ticket add"); // Tuinity + ArraySetSorted> arraysetsorted = this.e(i); + int j = a(arraysetsorted); + Ticket ticket1 = (Ticket) arraysetsorted.a(ticket); // CraftBukkit - decompile error +@@ -149,11 +261,17 @@ public abstract class ChunkMapDistance { + } + + private boolean removeTicket(long i, Ticket ticket) { // CraftBukkit - void -> boolean ++ com.tuinity.tuinity.util.TickThread.softEnsureTickThread("Async ticket remove"); // Tuinity + ArraySetSorted> arraysetsorted = this.e(i); + + boolean removed = false; // CraftBukkit + if (arraysetsorted.remove(ticket)) { + removed = true; // CraftBukkit ++ // Tuinity start - delay chunk unloads ++ if (com.tuinity.tuinity.config.TuinityConfig.delayChunkUnloadsBy > 0 && ticket.getTicketType() != TicketType.DELAYED_UNLOAD) { ++ this.computeDelayedTicketFor(i, ticket.getTicketLevel(), arraysetsorted); ++ } ++ // Tuinity end - delay chunk unloads + } + + if (arraysetsorted.isEmpty()) { +@@ -197,6 +315,7 @@ public abstract class ChunkMapDistance { + } + + private ArraySetSorted> e(long i) { ++ com.tuinity.tuinity.util.TickThread.softEnsureTickThread("Async tickets compute"); // Tuinity + return (ArraySetSorted) this.tickets.computeIfAbsent(i, (j) -> { + return ArraySetSorted.a(4); + }); +@@ -214,24 +333,26 @@ public abstract class ChunkMapDistance { + } + + public void a(SectionPosition sectionposition, EntityPlayer entityplayer) { ++ com.tuinity.tuinity.util.TickThread.softEnsureTickThread("Async player add"); // Tuinity + long i = sectionposition.u().pair(); + + ((ObjectSet) this.c.computeIfAbsent(i, (j) -> { + return new ObjectOpenHashSet(); + })).add(entityplayer); +- this.f.b(i, 0, true); +- this.g.b(i, 0, true); ++ //this.f.b(i, 0, true); // Tuinity - no longer used ++ //this.g.b(i, 0, true); // Tuinity - no longer used + } + + public void b(SectionPosition sectionposition, EntityPlayer entityplayer) { ++ com.tuinity.tuinity.util.TickThread.softEnsureTickThread("Async player remove"); // Tuinity + long i = sectionposition.u().pair(); + ObjectSet objectset = (ObjectSet) this.c.get(i); + + objectset.remove(entityplayer); + if (objectset.isEmpty()) { + this.c.remove(i); +- this.f.b(i, Integer.MAX_VALUE, false); +- this.g.b(i, Integer.MAX_VALUE, false); ++ //this.f.b(i, Integer.MAX_VALUE, false); // Tuinity - no longer used ++ //this.g.b(i, Integer.MAX_VALUE, false); // Tuinity - no longer used + } + + } +@@ -249,18 +370,29 @@ public abstract class ChunkMapDistance { + return s; + } + ++ protected void setViewDistance(int viewDistance) { this.a(viewDistance); } // Tuinity - OBFHELPER + protected void a(int i) { +- this.g.a(i); ++ //this.g.a(i); // Tuinity - no longer used ++ } ++ // Tuinity start - per player view distance ++ protected void setGlobalViewDistance(int viewDistance, PlayerChunkMap chunkMap) { ++ this.chunkMap = chunkMap; ++ this.setViewDistance(viewDistance); + } ++ // Tuinity end + + public int b() { +- this.f.a(); +- return this.f.a.size(); ++ // Tuinity start - use distance map to implement ++ // note: this is the spawn chunk count ++ return this.chunkMap.playerChunkTickRangeMap.size(); ++ // Tuinity end - use distance map to implement + } + + public boolean d(long i) { +- this.f.a(); +- return this.f.a.containsKey(i); ++ // Tuinity start - use distance map to implement ++ // note: this is the is spawn chunk method ++ return this.chunkMap.playerChunkTickRangeMap.getObjectsInRange(i) != null; ++ // Tuinity end - use distance map to implement + } + + public String c() { +@@ -269,6 +401,7 @@ public abstract class ChunkMapDistance { + + // CraftBukkit start + public void removeAllTicketsFor(TicketType ticketType, int ticketLevel, T ticketIdentifier) { ++ com.tuinity.tuinity.util.TickThread.softEnsureTickThread("Async ticket remove"); // Tuinity + Ticket target = new Ticket<>(ticketType, ticketLevel, ticketIdentifier); + + for (java.util.Iterator>> iterator = this.tickets.values().iterator(); iterator.hasNext();) { +@@ -327,6 +460,222 @@ public abstract class ChunkMapDistance { + } + } + ++ // Tuinity start - Per player view distance ++ abstract class TicketTracker { ++ ++ static final int LOADED_PLAYER_REFERENCE = -2; ++ ++ protected final it.unimi.dsi.fastutil.longs.Long2IntOpenHashMap chunkReferenceMap = new it.unimi.dsi.fastutil.longs.Long2IntOpenHashMap(8192, 0.25f); ++ { ++ this.chunkReferenceMap.defaultReturnValue(-1); ++ } ++ protected final it.unimi.dsi.fastutil.ints.Int2IntOpenHashMap lastLoadedRadiusByPlayer = new it.unimi.dsi.fastutil.ints.Int2IntOpenHashMap(512, 0.5f); ++ { ++ this.lastLoadedRadiusByPlayer.defaultReturnValue(-1); ++ } ++ ++ protected final it.unimi.dsi.fastutil.ints.Int2IntOpenHashMap pendingChunkLoadsByPlayer = new it.unimi.dsi.fastutil.ints.Int2IntOpenHashMap(512, 0.5f); ++ protected final it.unimi.dsi.fastutil.ints.Int2LongOpenHashMap lastChunkPositionByPlayer = new it.unimi.dsi.fastutil.ints.Int2LongOpenHashMap(512, 0.5f); ++ { ++ this.lastChunkPositionByPlayer.defaultReturnValue(Long.MIN_VALUE); ++ } ++ ++ protected final int ticketLevel; ++ ++ public TicketTracker(int ticketLevel) { ++ this.ticketLevel = ticketLevel; ++ } ++ ++ protected final java.util.List players = new java.util.ArrayList<>(256); ++ ++ protected com.tuinity.tuinity.util.map.PlayerAreaMap areaMap; ++ ++ static final int ALREADY_QUEUED = 0; ++ static final int QUEUED = 1; ++ static final int FAILED = 2; ++ ++ protected abstract int tryQueueChunk(int chunkX, int chunkZ, EntityPlayer player); ++ ++ protected abstract int getMaxChunkLoads(EntityPlayer player); ++ ++ public void tick() { ++ for (EntityPlayer player : this.players) { ++ int playerId = player.getId(); ++ int lastLoadedRadius = this.lastLoadedRadiusByPlayer.get(playerId); ++ int pendingChunkLoads = this.pendingChunkLoadsByPlayer.get(playerId); ++ long lastChunkPos = this.lastChunkPositionByPlayer.get(playerId); ++ long currentChunkPos = this.areaMap.getLastCoordinate(player); ++ ++ if (currentChunkPos == Long.MIN_VALUE) { ++ // not tracking for whatever reason... ++ continue; ++ } ++ ++ int newX = Util.getCoordinateX(currentChunkPos); ++ int newZ = Util.getCoordinateZ(currentChunkPos); ++ ++ // handle movement ++ if (currentChunkPos != lastChunkPos) { ++ this.lastChunkPositionByPlayer.put(playerId, currentChunkPos); ++ if (lastChunkPos != Long.MIN_VALUE) { ++ int oldX = Util.getCoordinateX(lastChunkPos); ++ int oldZ = Util.getCoordinateZ(lastChunkPos); ++ ++ int radiusDiff = Math.max(Math.abs(newX - oldX), Math.abs(newZ - oldZ)); ++ lastLoadedRadius = Math.max(-1, lastLoadedRadius - radiusDiff); ++ this.lastLoadedRadiusByPlayer.put(playerId, lastLoadedRadius); ++ } ++ } ++ ++ int maxChunkLoads = this.getMaxChunkLoads(player); ++ ++ int radius = lastLoadedRadius + 1; ++ int viewDistance = this.areaMap.getLastViewDistance(player); ++ ++ if (radius > viewDistance) { ++ // distance map will unload our chunks ++ this.lastLoadedRadiusByPlayer.put(playerId, viewDistance); ++ continue; ++ } ++ ++ if (pendingChunkLoads >= maxChunkLoads) { ++ continue; ++ } ++ ++ radius_loop: ++ for (; radius <= viewDistance; ++radius) { ++ for (int offset = 0; offset <= radius; ++offset) { ++ // try to load the chunks closest to the player by distance ++ // so instead of going left->right on the x axis, we start at the center of the view distance square ++ // and go left and right at the same time ++ ++ // try top 2 chunks ++ // top left ++ int attempt = 0; ++ if ((attempt = this.tryQueueChunk(newX - offset, newZ + radius, player)) == QUEUED) { ++ if (++pendingChunkLoads >= maxChunkLoads) { ++ break radius_loop; ++ } ++ } else if (attempt == FAILED) { ++ break radius_loop; ++ } ++ ++ // top right ++ if ((attempt = this.tryQueueChunk(newX + offset, newZ + radius, player)) == QUEUED) { ++ if (++pendingChunkLoads >= maxChunkLoads) { ++ break radius_loop; ++ } ++ } else if (attempt == FAILED) { ++ break radius_loop; ++ } ++ ++ // try bottom 2 chunks ++ ++ // bottom left ++ if ((attempt = this.tryQueueChunk(newX - offset, newZ - radius, player)) == QUEUED) { ++ if (++pendingChunkLoads >= maxChunkLoads) { ++ break radius_loop; ++ } ++ } else if (attempt == FAILED) { ++ break radius_loop; ++ } ++ ++ // bottom right ++ if ((attempt = this.tryQueueChunk(newX + offset, newZ - radius, player)) == QUEUED) { ++ if (++pendingChunkLoads >= maxChunkLoads) { ++ break radius_loop; ++ } ++ } else if (attempt == FAILED) { ++ break radius_loop; ++ } ++ ++ // try left 2 chunks ++ ++ // left down ++ if ((attempt = this.tryQueueChunk(newX - radius, newZ - offset, player)) == QUEUED) { ++ if (++pendingChunkLoads >= maxChunkLoads) { ++ break radius_loop; ++ } ++ } else if (attempt == FAILED) { ++ break radius_loop; ++ } ++ ++ // left up ++ if ((attempt = this.tryQueueChunk(newX - radius, newZ + offset, player)) == QUEUED) { ++ if (++pendingChunkLoads >= maxChunkLoads) { ++ break radius_loop; ++ } ++ } else if (attempt == FAILED) { ++ break radius_loop; ++ } ++ ++ // try right 2 chunks ++ ++ // right down ++ if ((attempt = this.tryQueueChunk(newX + radius, newZ - offset, player)) == QUEUED) { ++ if (++pendingChunkLoads >= maxChunkLoads) { ++ break radius_loop; ++ } ++ } else if (attempt == FAILED) { ++ break radius_loop; ++ } ++ ++ // right up ++ if ((attempt = this.tryQueueChunk(newX + radius, newZ + offset, player)) == QUEUED) { ++ if (++pendingChunkLoads >= maxChunkLoads) { ++ break radius_loop; ++ } ++ } else if (attempt == FAILED) { ++ break radius_loop; ++ } ++ } ++ } ++ ++ int newLoadedRadius = radius - 1; ++ if (newLoadedRadius != lastLoadedRadius) { ++ this.lastLoadedRadiusByPlayer.put(playerId, newLoadedRadius); ++ } ++ this.pendingChunkLoadsByPlayer.put(playerId, pendingChunkLoads); ++ } ++ } ++ ++ public void addPlayer(EntityPlayer player) { ++ this.players.add(player); ++ } ++ ++ public void removePlayer(EntityPlayer player) { ++ this.players.remove(player); ++ this.lastLoadedRadiusByPlayer.remove(player.getId()); ++ this.pendingChunkLoadsByPlayer.remove(player.getId()); ++ this.lastChunkPositionByPlayer.remove(player.getId()); ++ } ++ ++ public void onChunkLoad(int chunkX, int chunkZ) { ++ long coordinate = Util.getCoordinateKey(chunkX, chunkZ); ++ int playerReference = this.chunkReferenceMap.replace(coordinate, LOADED_PLAYER_REFERENCE); ++ if (playerReference != -1) { ++ this.pendingChunkLoadsByPlayer.computeIfPresent(playerReference, (Integer keyInMap, Integer valueInMap) -> { ++ return valueInMap - 1; ++ }); ++ } ++ } ++ ++ // this is invoked if and only if there are no other players in range of the chunk. ++ public void playerMoveOutOfRange(int chunkX, int chunkZ) { ++ long coordinate = Util.getCoordinateKey(chunkX, chunkZ); ++ int playerReference = this.chunkReferenceMap.remove(coordinate); ++ if (playerReference != -1) { ++ if (playerReference != LOADED_PLAYER_REFERENCE) { ++ this.pendingChunkLoadsByPlayer.computeIfPresent(playerReference, (Integer keyInMap, Integer valueInMap) -> { ++ return valueInMap - 1; ++ }); ++ } ++ ChunkMapDistance.this.removeTicket(coordinate, new Ticket<>(TicketType.PLAYER, this.ticketLevel, new ChunkCoordIntPair(chunkX, chunkZ))); ++ } ++ } ++ } ++ // Tuinity end - per player view distance ++ + class c extends ChunkMapDistance.b { + + private int e = 0; +@@ -344,7 +693,7 @@ public abstract class ChunkMapDistance { + } + + public void a(int i) { +- ObjectIterator objectiterator = this.a.long2ByteEntrySet().iterator(); ++ ObjectIterator objectiterator = this.a.long2ByteEntrySet().fastIterator(); // Tuinity - use fast iterator (reduces entry creation) + + while (objectiterator.hasNext()) { + it.unimi.dsi.fastutil.longs.Long2ByteMap.Entry it_unimi_dsi_fastutil_longs_long2bytemap_entry = (it.unimi.dsi.fastutil.longs.Long2ByteMap.Entry) objectiterator.next(); +@@ -425,7 +774,7 @@ public abstract class ChunkMapDistance { + + class b extends ChunkMap { + +- protected final Long2ByteMap a = new Long2ByteOpenHashMap(); ++ protected final Long2ByteOpenHashMap a = new Long2ByteOpenHashMap(); // Tuinity - change type for fast iterator + protected final int b; + + protected b(int i) { +diff --git a/src/main/java/net/minecraft/server/ChunkProviderServer.java b/src/main/java/net/minecraft/server/ChunkProviderServer.java +index 76c7f4a50..516f27fd2 100644 +--- a/src/main/java/net/minecraft/server/ChunkProviderServer.java ++++ b/src/main/java/net/minecraft/server/ChunkProviderServer.java +@@ -119,6 +119,12 @@ public class ChunkProviderServer extends IChunkProvider { + } + // Paper + ++ // Tuinity start - rewrite ticklistserver ++ public final boolean isTickingReadyMainThread(BlockPosition pos) { ++ PlayerChunk chunk = this.playerChunkMap.chunkMap.getUpdating(com.tuinity.tuinity.util.Util.getCoordinateKey(pos)); ++ return chunk != null && chunk.isTickingReady(); ++ } ++ // Tuinity end - rewrite ticklistserver + + public ChunkProviderServer(WorldServer worldserver, File file, DataFixer datafixer, DefinedStructureManager definedstructuremanager, Executor executor, ChunkGenerator chunkgenerator, int i, WorldLoadListener worldloadlistener, Supplier supplier) { + this.world = worldserver; +@@ -308,7 +314,16 @@ public class ChunkProviderServer extends IChunkProvider { + } + + private void bringToStatusAsync(int x, int z, ChunkCoordIntPair chunkPos, ChunkStatus status, java.util.function.Consumer onComplete) { +- CompletableFuture> future = this.getChunkFutureMainThread(x, z, status, true); ++ // Tuinity start - add createFuture param ++ this.bringToStatusAsync(x, z, chunkPos, status, onComplete, true); ++ } ++ private void bringToStatusAsync(int x, int z, ChunkCoordIntPair chunkPos, ChunkStatus status, java.util.function.Consumer onComplete, boolean createFuture) { ++ CompletableFuture> future = this.getChunkFutureMainThread(x, z, status, createFuture); ++ ++ if (future.isDone() && future.getNow(null).right().isPresent() && !createFuture) { ++ return; ++ } ++ // Tuinity end + Long identifier = Long.valueOf(this.asyncLoadSeqCounter++); + int ticketLevel = MCUtil.getTicketLevelFor(status); + this.addTicketAtLevel(TicketType.ASYNC_LOAD, chunkPos, ticketLevel, identifier); +@@ -350,9 +365,18 @@ public class ChunkProviderServer extends IChunkProvider { + public IChunkAccess getChunkAt(int i, int j, ChunkStatus chunkstatus, boolean flag) { + final int x = i; final int z = j; // Paper - conflict on variable change + if (Thread.currentThread() != this.serverThread) { +- return (IChunkAccess) CompletableFuture.supplyAsync(() -> { +- return this.getChunkAt(i, j, chunkstatus, flag); +- }, this.serverThreadQueue).join(); ++ // Tuinity start - improve async access - prevents plugins from sync loading chunks ++ Chunk chunk = this.getChunkAtIfLoadedImmediately(x, z); ++ if (chunk != null) { ++ return chunk; ++ } ++ ++ CompletableFuture future = new CompletableFuture<>(); ++ this.serverThreadQueue.execute(() -> { ++ this.bringToStatusAsync(x, z, new ChunkCoordIntPair(x, z), chunkstatus, future::complete, flag); ++ }); ++ return future.join(); ++ // Tuinity end + } else { + // Paper start - optimise for loaded chunks + Chunk ifLoaded = this.getChunkAtIfLoadedMainThread(i, j); +@@ -384,6 +408,19 @@ public class ChunkProviderServer extends IChunkProvider { + this.world.asyncChunkTaskManager.raisePriority(x, z, com.destroystokyo.paper.io.PrioritizedTaskQueue.HIGHEST_PRIORITY); + com.destroystokyo.paper.io.chunk.ChunkTaskManager.pushChunkWait(this.world, x, z); + // Paper end ++ // Tuinity start - improve sync loading prioritisation ++ // lighting requires neighbours in a 1 radius to load ++ if (chunkstatus.isAtLeast(ChunkStatus.LIGHT)) { ++ for (int dx = -1; dx <= 1; ++dx) { ++ for (int dz = -1; dz <= 1; ++dz) { ++ int chunkLightX = dx + x; ++ int chunkLightZ = dz + z; ++ this.bringToStatusAsync(chunkLightX, chunkLightZ, new ChunkCoordIntPair(chunkLightX, chunkLightZ), ChunkStatus.LIGHT.getPreviousStatus(), (c) -> {}); ++ this.world.asyncChunkTaskManager.raisePriority(chunkLightX, chunkLightZ, com.destroystokyo.paper.io.PrioritizedTaskQueue.HIGHEST_PRIORITY); ++ } ++ } ++ } ++ // Tuinity end + com.destroystokyo.paper.io.SyncLoadFinder.logSyncLoad(this.world, x, z); // Paper - sync load info + this.world.timings.chunkAwait.startTiming(); // Paper + this.serverThreadQueue.awaitTasks(completablefuture::isDone); +@@ -513,27 +550,39 @@ public class ChunkProviderServer extends IChunkProvider { + + @Override + public boolean a(Entity entity) { +- long i = ChunkCoordIntPair.pair(MathHelper.floor(entity.locX()) >> 4, MathHelper.floor(entity.locZ()) >> 4); +- +- return this.a(i, PlayerChunk::b); ++ // Tuinity start - optimize is ticking ready type functions ++ // is entity ticking ready ++ PlayerChunk playerChunk = this.getChunk(com.tuinity.tuinity.util.Util.getCoordinateKey(entity)); ++ return playerChunk != null && playerChunk.isEntityTickingReady(); ++ // Tuinity end - optimize is ticking ready type functions + } + + @Override + public boolean a(ChunkCoordIntPair chunkcoordintpair) { +- return this.a(chunkcoordintpair.pair(), PlayerChunk::b); ++ // Tuinity start - optimize is ticking ready type functions ++ // is entity ticking ready ++ PlayerChunk playerChunk = this.getChunk(com.tuinity.tuinity.util.Util.getCoordinateKey(chunkcoordintpair)); ++ return playerChunk != null && playerChunk.isEntityTickingReady(); ++ // Tuinity end - optimize is ticking ready type functions + } + +- @Override +- public boolean a(BlockPosition blockposition) { +- long i = ChunkCoordIntPair.pair(blockposition.getX() >> 4, blockposition.getZ() >> 4); +- +- return this.a(i, PlayerChunk::a); ++ public final boolean isTickingReady(final BlockPosition pos) { return this.a(pos); } // Tuinity - OBFHELPER ++ @Override public boolean a(BlockPosition blockposition) { // Tuinity - OBFHELPER ++ // Tuinity start - optimize is ticking ready type functions ++ // is ticking ready ++ PlayerChunk playerChunk = this.getChunk(com.tuinity.tuinity.util.Util.getCoordinateKey(blockposition)); ++ return playerChunk != null && playerChunk.isTickingReady(); ++ // Tuinity end - optimize is ticking ready type functions + } + + public boolean b(Entity entity) { +- long i = ChunkCoordIntPair.pair(MathHelper.floor(entity.locX()) >> 4, MathHelper.floor(entity.locZ()) >> 4); +- +- return this.a(i, PlayerChunk::c); ++ // Tuinity start - optimize is ticking ready type functions ++ // is full chunk ready ++ if (Thread.currentThread() == this.serverThread) { ++ return this.getChunkAtIfLoadedMainThreadNoCache(com.tuinity.tuinity.util.Util.getChunkCoordinate(entity.locX()), com.tuinity.tuinity.util.Util.getChunkCoordinate(entity.locZ())) != null; ++ } ++ return this.getChunkAtIfLoadedImmediately(com.tuinity.tuinity.util.Util.getChunkCoordinate(entity.locX()), com.tuinity.tuinity.util.Util.getChunkCoordinate(entity.locZ())) != null; ++ // Tuinity end - optimize is ticking ready type functions + } + + private boolean a(long i, Function>> function) { +@@ -597,6 +646,10 @@ public class ChunkProviderServer extends IChunkProvider { + this.chunkMapDistance.purgeTickets(); + this.tickDistanceManager(); + this.world.timings.doChunkMap.stopTiming(); // Spigot ++ // Tuinity start ++ this.playerChunkMap.getChunkMapDistanceManager().playerNoTickViewDistanceHandler.tick(); ++ this.playerChunkMap.getChunkMapDistanceManager().playerTickViewDistanceHandler.tick(); ++ // Tuinity end + this.world.getMethodProfiler().exitEnter("chunks"); + this.world.timings.chunks.startTiming(); // Paper - timings + this.tickChunks(); +@@ -609,6 +662,12 @@ public class ChunkProviderServer extends IChunkProvider { + this.clearCache(); + } + ++ // Tuinity start ++ final com.tuinity.tuinity.util.ChunkList entityTickingChunks = new com.tuinity.tuinity.util.ChunkList(); ++ boolean isTickingChunks; ++ final it.unimi.dsi.fastutil.objects.Object2BooleanLinkedOpenHashMap pendingEntityTickingChunkChanges = new it.unimi.dsi.fastutil.objects.Object2BooleanLinkedOpenHashMap<>(16, 0.8f); ++ // Tuinity end ++ + private void tickChunks() { + long i = this.world.getTime(); + long j = i - this.lastTickTime; +@@ -619,6 +678,36 @@ public class ChunkProviderServer extends IChunkProvider { + boolean flag1 = this.world.getGameRules().getBoolean(GameRules.DO_MOB_SPAWNING) && !world.getPlayers().isEmpty(); // CraftBukkit + + if (!flag) { ++ // Tuinity start - optimize isOutisdeRange ++ PlayerChunkMap playerChunkMap = this.playerChunkMap; ++ for (EntityPlayer player : this.world.players) { ++ if (!player.affectsSpawning || player.isSpectator()) { ++ playerChunkMap.playerMobSpawnMap.remove(player); ++ continue; ++ } ++ ++ int viewDistance = player.getEffectiveViewDistance(playerChunkMap); ++ ++ // copied and modified from isOutisdeRange ++ int chunkRange = world.spigotConfig.mobSpawnRange; ++ chunkRange = (chunkRange > viewDistance) ? (byte)viewDistance : chunkRange; ++ chunkRange = (chunkRange > ChunkMapDistance.MOB_SPAWN_RANGE) ? ChunkMapDistance.MOB_SPAWN_RANGE : chunkRange; ++ ++ com.destroystokyo.paper.event.entity.PlayerNaturallySpawnCreaturesEvent event = new com.destroystokyo.paper.event.entity.PlayerNaturallySpawnCreaturesEvent(player.getBukkitEntity(), (byte)chunkRange); ++ event.callEvent(); ++ if (event.isCancelled() || event.getSpawnRadius() < 0) { ++ playerChunkMap.playerMobSpawnMap.remove(player); ++ continue; ++ } ++ ++ int range = Math.min(event.getSpawnRadius(), 32); // limit to max view distance ++ int chunkX = com.tuinity.tuinity.util.Util.getChunkCoordinate(player.locX()); ++ int chunkZ = com.tuinity.tuinity.util.Util.getChunkCoordinate(player.locZ()); ++ ++ playerChunkMap.playerMobSpawnMap.update(player, chunkX, chunkZ, range); ++ player.lastEntitySpawnRadiusSquared = (double)((range << 4) * (range << 4)); // used in isOutsideRange ++ } ++ // Tuinity end - optimize isOutisdeRange + this.world.getMethodProfiler().enter("pollingChunks"); + int k = this.world.getGameRules().getInt(GameRules.RANDOM_TICK_SPEED); + BlockPosition blockposition = this.world.getSpawn(); +@@ -630,11 +719,10 @@ public class ChunkProviderServer extends IChunkProvider { + EnumCreatureType[] aenumcreaturetype = EnumCreatureType.values(); + // Paper start - per player mob spawning + int[] worldMobCount; +- if (this.playerChunkMap.playerMobDistanceMap != null) { ++ // Tuinity start - use view distance map ++ if (this.world.paperConfig.perPlayerMobSpawns) { + // update distance map +- this.world.timings.playerMobDistanceMapUpdate.startTiming(); +- this.playerChunkMap.playerMobDistanceMap.update(this.world.players, this.playerChunkMap.viewDistance); +- this.world.timings.playerMobDistanceMapUpdate.stopTiming(); ++ // Tuinity end - use view distance map + // re-set mob counts + for (EntityPlayer player : this.world.players) { + Arrays.fill(player.mobCounts, 0); +@@ -647,20 +735,13 @@ public class ChunkProviderServer extends IChunkProvider { + + this.world.timings.countNaturalMobs.stopTiming(); // Paper - timings + this.world.getMethodProfiler().exit(); +- //Paper start - call player naturally spawn event +- int chunkRange = world.spigotConfig.mobSpawnRange; +- chunkRange = (chunkRange > world.spigotConfig.viewDistance) ? (byte) world.spigotConfig.viewDistance : chunkRange; +- chunkRange = Math.min(chunkRange, 8); +- for (EntityPlayer entityPlayer : this.world.players) { +- entityPlayer.playerNaturallySpawnedEvent = new com.destroystokyo.paper.event.entity.PlayerNaturallySpawnCreaturesEvent(entityPlayer.getBukkitEntity(), (byte) chunkRange); +- entityPlayer.playerNaturallySpawnedEvent.callEvent(); +- }; +- // Paper end +- this.playerChunkMap.f().forEach((playerchunk) -> { +- Optional optional = ((Either) playerchunk.b().getNow(PlayerChunk.UNLOADED_CHUNK)).left(); +- +- if (optional.isPresent()) { +- Chunk chunk = (Chunk) optional.get(); ++ // Tuinity - optimize isOutisdeRange - already done above ++ // Tuinity start - replace chunk map ++ this.isTickingChunks = true; ++ for (Chunk chunk : this.entityTickingChunks) { ++ PlayerChunk playerchunk = chunk.playerChunk; ++ if (playerchunk != null) { // make sure load event has been called along with the load logic we put there ++ // Tuinity end + + this.world.getMethodProfiler().enter("broadcast"); + this.world.timings.broadcastChunkUpdates.startTiming(); // Paper - timings +@@ -670,10 +751,10 @@ public class ChunkProviderServer extends IChunkProvider { + ChunkCoordIntPair chunkcoordintpair = playerchunk.i(); + + this.world.timings.chunkInhibitedRangeCheck.startTiming(); +- if (!this.playerChunkMap.isOutsideOfRange(chunkcoordintpair)) { ++ if (!this.playerChunkMap.isOutsideOfRange(playerchunk, chunkcoordintpair, false)) { // Tuinity - optimise isOutsideOfRange + // Paper end + chunk.setInhabitedTime(chunk.getInhabitedTime() + j); +- if (flag1 && (this.allowMonsters || this.allowAnimals) && this.world.getWorldBorder().isInBounds(chunk.getPos()) && !this.playerChunkMap.isOutsideOfRange(chunkcoordintpair, true)) { // Spigot ++ if (flag1 && (this.allowMonsters || this.allowAnimals) && this.world.getWorldBorder().isInBounds(chunk.getPos()) && !this.playerChunkMap.isOutsideOfRange(playerchunk, chunkcoordintpair, true)) { // Spigot // Tuinity - optimise isOutsideOfRange + this.world.getMethodProfiler().enter("spawner"); + this.world.timings.mobSpawn.startTiming(); // Spigot + EnumCreatureType[] aenumcreaturetype1 = aenumcreaturetype; +@@ -713,9 +794,23 @@ public class ChunkProviderServer extends IChunkProvider { + + if (this.world.paperConfig.perPlayerMobSpawns) { + int minDiff = Integer.MAX_VALUE; +- for (EntityPlayer entityplayer : this.playerChunkMap.playerMobDistanceMap.getPlayersInRange(chunk.getPos())) { ++ // Tuinity start - use view distance map ++ com.tuinity.tuinity.util.map.PooledLinkedHashSets.PooledObjectLinkedOpenHashSet players = this.playerChunkMap.playerViewDistanceMap.getObjectsInRange(chunk.getPos()); ++ if (players != null) { ++ Object[] backingSet = players.getBackingSet(); ++ for (int index = 0, len = backingSet.length; index < len; ++index) { ++ Object temp = backingSet[index]; ++ if (!(temp instanceof EntityPlayer)) { ++ continue; ++ } ++ EntityPlayer entityplayer = (EntityPlayer)temp; ++ if (entityplayer.isSpectator() || !entityplayer.affectsSpawning) { ++ continue; ++ } ++ // Tuinity end - use view distance map + minDiff = Math.min(limit - this.playerChunkMap.getMobCountNear(entityplayer, enumcreaturetype), minDiff); + } ++ } // Tuinity - use view distance map + difference = (minDiff == Integer.MAX_VALUE) ? 0 : minDiff; + } + +@@ -738,7 +833,22 @@ public class ChunkProviderServer extends IChunkProvider { + } + this.world.timings.chunkInhibitedRangeCheck.stopTiming(); // Paper + } +- }); ++ }; // Tuinity ++ // Tuinity start - replace chunk map ++ this.isTickingChunks = false; ++ if (!this.pendingEntityTickingChunkChanges.isEmpty()) { ++ for (it.unimi.dsi.fastutil.objects.ObjectBidirectionalIterator> iterator = this.pendingEntityTickingChunkChanges.object2BooleanEntrySet().fastIterator(this.pendingEntityTickingChunkChanges.object2BooleanEntrySet().last()); iterator.hasPrevious(); ) { ++ it.unimi.dsi.fastutil.objects.Object2BooleanMap.Entry entry = iterator.previous(); ++ ++ if (entry.getBooleanValue()) { ++ this.entityTickingChunks.add(entry.getKey()); ++ } else { ++ this.entityTickingChunks.remove(entry.getKey()); ++ } ++ iterator.remove(); ++ } ++ } ++ // Tuinity end - replace chunk map + this.world.getMethodProfiler().enter("customSpawners"); + if (flag1) { + try (co.aikar.timings.Timing ignored = this.world.timings.miscMobSpawning.startTiming()) { // Paper - timings +diff --git a/src/main/java/net/minecraft/server/ChunkRegionLoader.java b/src/main/java/net/minecraft/server/ChunkRegionLoader.java +index 4349d22cc..d529b795c 100644 +--- a/src/main/java/net/minecraft/server/ChunkRegionLoader.java ++++ b/src/main/java/net/minecraft/server/ChunkRegionLoader.java +@@ -23,6 +23,14 @@ public class ChunkRegionLoader { + + private static final Logger LOGGER = LogManager.getLogger(); + ++ // Tuinity start ++ // TODO: Check on update ++ public static long getLastWorldSaveTime(NBTTagCompound chunkData) { ++ NBTTagCompound levelData = chunkData.getCompound("Level"); ++ return levelData.getLong("LastUpdate"); ++ } ++ // Tuinity end ++ + // Paper start - guard against serializing mismatching coordinates + // TODO Note: This needs to be re-checked each update + public static ChunkCoordIntPair getChunkCoordinate(NBTTagCompound chunkData) { +@@ -344,10 +352,10 @@ public class ChunkRegionLoader { + NBTTagCompound nbttagcompound1 = new NBTTagCompound(); + + nbttagcompound.setInt("DataVersion", SharedConstants.getGameVersion().getWorldVersion()); +- nbttagcompound.set("Level", nbttagcompound1); ++ nbttagcompound.set("Level", nbttagcompound1); // Tuinity - diff on change + nbttagcompound1.setInt("xPos", chunkcoordintpair.x); + nbttagcompound1.setInt("zPos", chunkcoordintpair.z); +- nbttagcompound1.setLong("LastUpdate", asyncsavedata != null ? asyncsavedata.worldTime : worldserver.getTime()); // Paper - async chunk unloading ++ nbttagcompound1.setLong("LastUpdate", asyncsavedata != null ? asyncsavedata.worldTime : worldserver.getTime()); // Paper - async chunk unloading // Tuinity - diff on change + nbttagcompound1.setLong("InhabitedTime", ichunkaccess.getInhabitedTime()); + nbttagcompound1.setString("Status", ichunkaccess.getChunkStatus().d()); + ChunkConverter chunkconverter = ichunkaccess.p(); +diff --git a/src/main/java/net/minecraft/server/ChunkStatus.java b/src/main/java/net/minecraft/server/ChunkStatus.java +index 88f167461..fd7b10429 100644 +--- a/src/main/java/net/minecraft/server/ChunkStatus.java ++++ b/src/main/java/net/minecraft/server/ChunkStatus.java +@@ -103,7 +103,7 @@ public class ChunkStatus { + private final ChunkStatus.c w; + private final int x; + private final ChunkStatus.Type y; +- private final EnumSet z; ++ private final EnumSet z; public final HeightMap.Type[] heightMaps; // Tuinity + + private static CompletableFuture> a(ChunkStatus chunkstatus, LightEngineThreaded lightenginethreaded, IChunkAccess ichunkaccess) { + boolean flag = a(chunkstatus, ichunkaccess); +@@ -165,7 +165,7 @@ public class ChunkStatus { + this.w = chunkstatus_c; + this.x = i; + this.y = chunkstatus_type; +- this.z = enumset; ++ this.z = enumset; this.heightMaps = new java.util.ArrayList<>(this.z).toArray(new HeightMap.Type[0]); // Tuinity + this.t = chunkstatus == null ? 0 : chunkstatus.c() + 1; + } + +@@ -217,6 +217,7 @@ public class ChunkStatus { + return this.z; + } + ++ public final boolean isAtLeast(ChunkStatus status) { return this.b(status); } // Tuinity - OBFHELPER + public boolean b(ChunkStatus chunkstatus) { + return this.c() >= chunkstatus.c(); + } +diff --git a/src/main/java/net/minecraft/server/DedicatedServer.java b/src/main/java/net/minecraft/server/DedicatedServer.java +index 349a0ea21..ede436939 100644 +--- a/src/main/java/net/minecraft/server/DedicatedServer.java ++++ b/src/main/java/net/minecraft/server/DedicatedServer.java +@@ -44,7 +44,7 @@ public class DedicatedServer extends MinecraftServer implements IMinecraftServer + + private static final Logger LOGGER = LogManager.getLogger(); + private static final Pattern i = Pattern.compile("^[a-fA-F0-9]{40}$"); +- private final java.util.Queue serverCommandQueue = new java.util.concurrent.ConcurrentLinkedQueue(); // Paper - use a proper queue ++ private final java.util.Queue serverCommandQueue = new ca.spottedleaf.concurrentutil.queue.MultiThreadedQueue<>(); // Paper - use a proper queue // Tuinity - Use a better queue + private RemoteStatusListener remoteStatusListener; + public final RemoteControlCommandListener remoteControlCommandListener; + private RemoteControlListener remoteControlListener; +@@ -194,6 +194,7 @@ public class DedicatedServer extends MinecraftServer implements IMinecraftServer + com.destroystokyo.paper.PaperConfig.registerCommands(); + com.destroystokyo.paper.VersionHistoryManager.INSTANCE.getClass(); // load version history now + // Paper end ++ com.tuinity.tuinity.config.TuinityConfig.init((File) options.valueOf("tuinity-settings")); // Tuinity - Server Config + + this.setSpawnAnimals(dedicatedserverproperties.spawnAnimals); + this.setSpawnNPCs(dedicatedserverproperties.spawnNpcs); +diff --git a/src/main/java/net/minecraft/server/DoubleListOffset.java b/src/main/java/net/minecraft/server/DoubleListOffset.java +index 73657f740..9ff09b02d 100644 +--- a/src/main/java/net/minecraft/server/DoubleListOffset.java ++++ b/src/main/java/net/minecraft/server/DoubleListOffset.java +@@ -3,7 +3,7 @@ package net.minecraft.server; + import it.unimi.dsi.fastutil.doubles.AbstractDoubleList; + import it.unimi.dsi.fastutil.doubles.DoubleList; + +-public class DoubleListOffset extends AbstractDoubleList { ++public class DoubleListOffset extends com.tuinity.tuinity.util.fastutil.ExtendedAbstractDoubleList { // Tuinity - remove iterator allocation + + private final DoubleList a; + private final double b; +diff --git a/src/main/java/net/minecraft/server/Entity.java b/src/main/java/net/minecraft/server/Entity.java +index 8974c16bf..23e91183e 100644 +--- a/src/main/java/net/minecraft/server/Entity.java ++++ b/src/main/java/net/minecraft/server/Entity.java +@@ -208,6 +208,58 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke + } + // CraftBukkit end + ++ // Tuinity start ++ // ender dragon is special cased for its large range, player is special cased for spectator mode + npc plugins ++ // non-final, let plugins set at their discretion ++ protected boolean isLegacyTrackingEntity = this instanceof EntityEnderDragon || this instanceof EntityPlayer; ++ ++ // We queue changes to tracker here because when adding to a chunk we do not know if the entity is in a trackable state ++ public final it.unimi.dsi.fastutil.ints.IntLinkedOpenHashSet trackQueue = new it.unimi.dsi.fastutil.ints.IntLinkedOpenHashSet(8); ++ public final it.unimi.dsi.fastutil.ints.IntLinkedOpenHashSet unTrackQueue = new it.unimi.dsi.fastutil.ints.IntLinkedOpenHashSet(8); ++ ++ public final void addToTrackQueue(EntityPlayer player) { ++ if (player == this) { ++ return; ++ } ++ int id = player.getId(); ++ this.trackQueue.add(id); ++ this.unTrackQueue.remove(id); ++ ((WorldServer)this.world).trackingUpdateQueue.add(this); ++ } ++ ++ public final void addToUntrackQueue(EntityPlayer player) { ++ if (player == this) { ++ return; ++ } ++ int id = player.getId(); ++ this.trackQueue.remove(id); ++ this.unTrackQueue.add(id); ++ ((WorldServer)this.world).trackingUpdateQueue.add(this); ++ } ++ ++ public final void clearTrackingQueues(EntityPlayer player) { ++ if (player == this) { ++ return; ++ } ++ int id = player.getId(); ++ this.trackQueue.remove(id); ++ this.unTrackQueue.remove(id); ++ if (this.trackQueue.isEmpty() && this.unTrackQueue.isEmpty()) { ++ ((WorldServer)this.world).trackingUpdateQueue.remove(this); ++ } ++ } ++ ++ ++ // Tuinity end ++ // Tuinity start ++ public final double getDistanceXZSquared(double x, double z) { ++ double diffX = x - this.locX(); ++ double diffZ = z - this.locZ(); ++ ++ return (diffX * diffX) + (diffZ * diffZ); ++ } ++ // Tuinity end ++ + public Entity(EntityTypes entitytypes, World world) { + this.id = Entity.entityCount.incrementAndGet(); + this.passengers = Lists.newArrayList(); +@@ -1371,6 +1423,7 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke + return MathHelper.c(f * f + f1 * f1 + f2 * f2); + } + ++ public final double getDistanceSquared(double x, double y, double z) { return this.g(x, y, z); } // Tuinity - OBFHELPER + public double g(double d0, double d1, double d2) { + double d3 = this.locX() - d0; + double d4 = this.locY() - d1; +diff --git a/src/main/java/net/minecraft/server/EntityEnderDragon.java b/src/main/java/net/minecraft/server/EntityEnderDragon.java +index af10fc36e..bf14d33c0 100644 +--- a/src/main/java/net/minecraft/server/EntityEnderDragon.java ++++ b/src/main/java/net/minecraft/server/EntityEnderDragon.java +@@ -579,9 +579,9 @@ public class EntityEnderDragon extends EntityInsentient implements IMonster { + // CraftBukkit start - Use relative location for far away sounds + // this.world.b(1028, new BlockPosition(this), 0); + // Paper start +- int viewDistance = ((WorldServer) this.world).spigotConfig.viewDistance * 16; // Paper - updated to use worlds actual view distance incase we have to uncomment this due to removal of player view distance API ++ //int viewDistance = ((WorldServer) this.world).spigotConfig.viewDistance * 16; // Paper - updated to use worlds actual view distance incase we have to uncomment this due to removal of player view distance API // Tuinity - per player view distance + for (EntityPlayer player : ((WorldServer)world).getPlayers()) { +- //final int viewDistance = player.getViewDistance(); // TODO apply view distance api patch ++ final int viewDistance = player.getEffectiveViewDistance(player.getWorldServer().getChunkProvider().playerChunkMap) << 4; // Tuinity - per player view distance + // Paper end + double deltaX = this.locX() - player.locX(); + double deltaZ = this.locZ() - player.locZ(); +diff --git a/src/main/java/net/minecraft/server/EntityInsentient.java b/src/main/java/net/minecraft/server/EntityInsentient.java +index 1991cee43..27ef47600 100644 +--- a/src/main/java/net/minecraft/server/EntityInsentient.java ++++ b/src/main/java/net/minecraft/server/EntityInsentient.java +@@ -641,20 +641,27 @@ public abstract class EntityInsentient extends EntityLiving { + if (this.world.getDifficulty() == EnumDifficulty.PEACEFUL && this.J()) { + this.die(); + } else if (!this.isPersistent() && !this.I()) { +- EntityHuman entityhuman = this.world.findNearbyPlayer(this, -1.0D); ++ EntityHuman entityhuman = this.world.findClosestPlayer(this.locX(), this.locY(), this.locZ(), this.world.paperConfig.hardDespawnDistanceNotSquared, (Entity player) -> (((EntityHuman)player).affectsSpawning && !((EntityHuman)player).isSpectator())); // Tuinity - fix this function to properly handle spawning api + +- if (entityhuman != null && entityhuman.affectsSpawning) { // Paper - Affects Spawning API ++ if (entityhuman != null) { // Paper - Affects Spawning API // Tuinity - check not needed anymore + double d0 = entityhuman.h(this); + + if (d0 > world.paperConfig.hardDespawnDistance) { // CraftBukkit - remove isTypeNotPersistent() check // Paper - custom despawn distances + this.die(); +- } +- +- if (this.ticksFarFromPlayer > 600 && this.random.nextInt(800) == 0 && d0 > world.paperConfig.softDespawnDistance) { // CraftBukkit - remove isTypeNotPersistent() check // Paper - custom despawn distances ++ } else if (this.ticksFarFromPlayer > 600 && this.random.nextInt(800) == 0 && d0 > world.paperConfig.softDespawnDistance) { // CraftBukkit - remove isTypeNotPersistent() check // Paper - custom despawn distances // Tuinity + this.die(); +- } else if (d0 < 1024.0D) { ++ } else if (d0 < world.paperConfig.softDespawnDistance) { // Tuinity + this.ticksFarFromPlayer = 0; + } ++ } else { // Tuinity start ++ // no player in range, try all players ++ for (EntityHuman player : this.world.getPlayers()) { ++ if (player.affectsSpawning && !player.isSpectator()) { ++ this.die(); ++ break; ++ } ++ } ++ /* Concret eend */ + } + + } else { +diff --git a/src/main/java/net/minecraft/server/EntityPlayer.java b/src/main/java/net/minecraft/server/EntityPlayer.java +index e7bfbc330..937e513d8 100644 +--- a/src/main/java/net/minecraft/server/EntityPlayer.java ++++ b/src/main/java/net/minecraft/server/EntityPlayer.java +@@ -104,6 +104,37 @@ public class EntityPlayer extends EntityHuman implements ICrafting { + + public final com.destroystokyo.paper.util.misc.PooledLinkedHashSets.PooledObjectLinkedOpenHashSet cachedSingleHashSet; // Paper + ++ // Tuinity start ++ public final com.tuinity.tuinity.util.map.PooledLinkedHashSets.PooledObjectLinkedOpenHashSet cachedSingleHashSetTuinity; ++ // Tuinity end ++ ++ // Tuinity start - view distance api ++ public boolean needsChunkCenterUpdate; ++ int viewDistance = -1; ++ public final int getRawViewDistance() { ++ return this.viewDistance; ++ } ++ public final int getEffectiveViewDistance() { ++ return this.getEffectiveViewDistance(((WorldServer)this.world).getChunkProvider().playerChunkMap); ++ } ++ public final int getEffectiveViewDistance(PlayerChunkMap chunkMap) { ++ return this.viewDistance == -1 ? chunkMap.viewDistance : this.viewDistance; ++ } ++ ++ int noTickViewDistance = -1; ++ public final int getRawNoTickViewDistance() { ++ return this.noTickViewDistance; ++ } ++ public final int getEffectiveNoTickViewDistance() { ++ return this.getEffectiveNoTickViewDistance(((WorldServer)this.world).getChunkProvider().playerChunkMap); ++ } ++ public final int getEffectiveNoTickViewDistance(PlayerChunkMap chunkMap) { ++ return this.noTickViewDistance == -1 ? chunkMap.noTickViewDistance : this.noTickViewDistance; ++ } ++ // Tuinity end - view distance api ++ ++ double lastEntitySpawnRadiusSquared; // Tuinity - optimise isOutsideRange, this field is in blocks ++ + public EntityPlayer(MinecraftServer minecraftserver, WorldServer worldserver, GameProfile gameprofile, PlayerInteractManager playerinteractmanager) { + super((World) worldserver, gameprofile); + playerinteractmanager.player = this; +@@ -122,6 +153,9 @@ public class EntityPlayer extends EntityHuman implements ICrafting { + this.canPickUpLoot = true; + this.maxHealthCache = this.getMaxHealth(); + this.cachedSingleMobDistanceMap = new com.destroystokyo.paper.util.PooledHashSets.PooledObjectLinkedOpenHashSet<>(this); // Paper ++ // Tuinity start ++ this.cachedSingleHashSetTuinity = new com.tuinity.tuinity.util.map.PooledLinkedHashSets.PooledObjectLinkedOpenHashSet<>(this); ++ // Tuinity end + } + + // Yes, this doesn't match Vanilla, but it's the best we can do for now. +@@ -1773,8 +1807,13 @@ public class EntityPlayer extends EntityHuman implements ICrafting { + } + + public void a(ChunkCoordIntPair chunkcoordintpair) { ++ // Tuinity start - remove ChunkCoordIntPair allocation ++ this.sendChunkUnload(chunkcoordintpair.x, chunkcoordintpair.z); ++ } ++ public final void sendChunkUnload(int x, int z) { ++ // Tuinity end - remove ChunkCoordIntPair allocation + if (this.isAlive()) { +- this.playerConnection.sendPacket(new PacketPlayOutUnloadChunk(chunkcoordintpair.x, chunkcoordintpair.z)); ++ this.playerConnection.sendPacket(new PacketPlayOutUnloadChunk(x, z)); // Tuinity + } + + } +diff --git a/src/main/java/net/minecraft/server/EntityTrackerEntry.java b/src/main/java/net/minecraft/server/EntityTrackerEntry.java +index 3a88c9a67..b4d3c4a4f 100644 +--- a/src/main/java/net/minecraft/server/EntityTrackerEntry.java ++++ b/src/main/java/net/minecraft/server/EntityTrackerEntry.java +@@ -18,7 +18,7 @@ import org.bukkit.event.player.PlayerVelocityEvent; + public class EntityTrackerEntry { + + private static final Logger LOGGER = LogManager.getLogger(); +- private final WorldServer b; ++ private final WorldServer b; private WorldServer getWorld() { return this.b; } // Tuinity - OBFHELPER + private final Entity tracker; + private final int d; + private final boolean e; +@@ -70,7 +70,9 @@ public class EntityTrackerEntry { + this.r = entity.onGround; + } + ++ public final void tick() { this.a(); } // Tuinity - OBFHELPER + public void a() { ++ com.tuinity.tuinity.util.TickThread.softEnsureTickThread("Tracker update"); // Tuinity + List list = this.tracker.getPassengers(); + + if (!list.equals(this.p)) { +@@ -107,8 +109,8 @@ public class EntityTrackerEntry { + int j; + + if (this.tracker.isPassenger()) { +- i = MathHelper.d(this.tracker.yaw * 256.0F / 360.0F); +- j = MathHelper.d(this.tracker.pitch * 256.0F / 360.0F); ++ i = MathHelper.d(this.tracker.yaw * 256.0F / 360.0F); // Tuinity - diff on change, used in forceStaleMeta ++ j = MathHelper.d(this.tracker.pitch * 256.0F / 360.0F); // Tuinity - diff on change, used in forceStaleMeta + boolean flag = Math.abs(i - this.yRot) >= 1 || Math.abs(j - this.xRot) >= 1; + + if (flag) { +@@ -124,8 +126,10 @@ public class EntityTrackerEntry { + ++this.o; + i = MathHelper.d(this.tracker.yaw * 256.0F / 360.0F); + j = MathHelper.d(this.tracker.pitch * 256.0F / 360.0F); +- Vec3D vec3d = this.tracker.getPositionVector().d(PacketPlayOutEntity.a(this.xLoc, this.yLoc, this.zLoc)); +- boolean flag1 = vec3d.g() >= 7.62939453125E-6D; ++ double vec3d_dx = this.tracker.locX() - 2.44140625E-4D*(this.xLoc); ++ double vec3d_dy = this.tracker.locY() - 2.44140625E-4D*(this.yLoc); ++ double vec3d_dz = this.tracker.locZ() - 2.44140625E-4D*(this.zLoc); ++ boolean flag1 = (vec3d_dx * vec3d_dx + vec3d_dy * vec3d_dy + vec3d_dz * vec3d_dz) >= 7.62939453125E-6D; + Packet packet1 = null; + boolean flag2 = flag1 || this.tickCounter % 60 == 0; + boolean flag3 = Math.abs(i - this.yRot) >= 1 || Math.abs(j - this.xRot) >= 1; +@@ -142,9 +146,11 @@ public class EntityTrackerEntry { + // CraftBukkit end + + if (this.tickCounter > 0 || this.tracker instanceof EntityArrow) { +- long k = PacketPlayOutEntity.a(vec3d.x); +- long l = PacketPlayOutEntity.a(vec3d.y); +- long i1 = PacketPlayOutEntity.a(vec3d.z); ++ // Tuinity start - remove allocation of Vec3d here ++ long k = PacketPlayOutEntity.a(vec3d_dx); ++ long l = PacketPlayOutEntity.a(vec3d_dy); ++ long i1 = PacketPlayOutEntity.a(vec3d_dz); ++ // Tuinity end - remove allocation of Vec3d here + boolean flag4 = k < -32768L || k > 32767L || l < -32768L || l > 32767L || i1 < -32768L || i1 > 32767L; + + if (!flag4 && this.o <= 400 && !this.q && this.r == this.tracker.onGround) { +@@ -248,11 +254,28 @@ public class EntityTrackerEntry { + + } + ++ // Tuinity end - optimise entity tracking ++ // TODO make use of this in second pass rewrite ++ final void resetState() { ++ // required since we do not tick all tracker entries unless they have trackers - so data can and will get stale ++ if (this.trackedPlayers.size() != 0) { ++ return; ++ } ++ ++ this.synchronizeLocation(); ++ this.writeStaleData(); ++ this.xRot = MathHelper.d(this.tracker.yaw * 256.0F / 360.0F); // Tuinity - diff on change, used in forceStaleMeta ++ this.yRot = MathHelper.d(this.tracker.pitch * 256.0F / 360.0F); // Tuinity - diff on change, used in forceStaleMeta ++ } ++ // Tuinity end - optimise entity tracking ++ ++ public final void onUntrack(EntityPlayer player) { this.a(player); } // Tuinity - OBFHELPER + public void a(EntityPlayer entityplayer) { + this.tracker.c(entityplayer); + entityplayer.c(this.tracker); + } + ++ public final void onTrack(EntityPlayer player) { this.b(player); } // Tuinity - OBFHELPER + public void b(EntityPlayer entityplayer) { + PlayerConnection playerconnection = entityplayer.playerConnection; + +@@ -352,6 +375,7 @@ public class EntityTrackerEntry { + + } + ++ private final void writeStaleData() { this.c(); } // Tuinity - OBFHELPER + private void c() { + DataWatcher datawatcher = this.tracker.getDataWatcher(); + +@@ -377,6 +401,7 @@ public class EntityTrackerEntry { + + } + ++ private final void synchronizeLocation() { this.d(); } // Tuinity - OBFHELPER + private void d() { + this.xLoc = PacketPlayOutEntity.a(this.tracker.locX()); + this.yLoc = PacketPlayOutEntity.a(this.tracker.locY()); +diff --git a/src/main/java/net/minecraft/server/EntityWither.java b/src/main/java/net/minecraft/server/EntityWither.java +index 8977c3516..bace6cf36 100644 +--- a/src/main/java/net/minecraft/server/EntityWither.java ++++ b/src/main/java/net/minecraft/server/EntityWither.java +@@ -208,9 +208,9 @@ public class EntityWither extends EntityMonster implements IRangedEntity { + // CraftBukkit start - Use relative location for far away sounds + // this.world.b(1023, new BlockPosition(this), 0); + // Paper start +- int viewDistance = ((WorldServer) this.world).spigotConfig.viewDistance * 16; // Paper - updated to use worlds actual view distance incase we have to uncomment this due to removal of player view distance API ++ //int viewDistance = ((WorldServer) this.world).spigotConfig.viewDistance * 16; // Paper - updated to use worlds actual view distance incase we have to uncomment this due to removal of player view distance API // Tuinity - per player view distance + for (EntityPlayer player : ((WorldServer)world).getPlayers()) { +- //final int viewDistance = player.getViewDistance(); // TODO apply view distance api patch ++ final int viewDistance = player.getEffectiveViewDistance(player.getWorldServer().getChunkProvider().playerChunkMap) << 4; // Tuinity - per player view distance + // Paper end + double deltaX = this.locX() - player.locX(); + double deltaZ = this.locZ() - player.locZ(); +diff --git a/src/main/java/net/minecraft/server/HeightMap.java b/src/main/java/net/minecraft/server/HeightMap.java +index 29cb545a8..aa7339610 100644 +--- a/src/main/java/net/minecraft/server/HeightMap.java ++++ b/src/main/java/net/minecraft/server/HeightMap.java +@@ -119,6 +119,7 @@ public class HeightMap { + } + } + ++ public final int get(int x, int z) { return this.a(x, z); } // Tuinity - OBFHELPER + public int a(int i, int j) { + return this.a(c(i, j)); + } +@@ -154,7 +155,7 @@ public class HeightMap { + private final String g; + private final HeightMap.Use h; + private final Predicate i; +- private static final Map j = (Map) SystemUtils.a((Object) Maps.newHashMap(), (hashmap) -> { ++ private static final Map j = SystemUtils.a(Maps.newHashMap(), (hashmap) -> { // Tuinity - decompile fix + HeightMap.Type[] aheightmap_type = values(); + int i = aheightmap_type.length; + +@@ -166,7 +167,7 @@ public class HeightMap { + + }); + +- private Type(String s, HeightMap.Use heightmap_use, Predicate predicate) { ++ private Type(String s, HeightMap.Use heightmap_use, Predicate predicate) { // Tuinity - decompile fix + this.g = s; + this.h = heightmap_use; + this.i = predicate; +diff --git a/src/main/java/net/minecraft/server/IAsyncTaskHandler.java b/src/main/java/net/minecraft/server/IAsyncTaskHandler.java +index cfe43e882..e7a58989d 100644 +--- a/src/main/java/net/minecraft/server/IAsyncTaskHandler.java ++++ b/src/main/java/net/minecraft/server/IAsyncTaskHandler.java +@@ -13,7 +13,7 @@ public abstract class IAsyncTaskHandler implements Mailbox d = Queues.newConcurrentLinkedQueue(); ++ private final ca.spottedleaf.concurrentutil.queue.MultiThreadedQueue d = new ca.spottedleaf.concurrentutil.queue.MultiThreadedQueue<>(); // Tuinity - Use a better queue + private int e; + + protected IAsyncTaskHandler(String s) { +diff --git a/src/main/java/net/minecraft/server/IEntityAccess.java b/src/main/java/net/minecraft/server/IEntityAccess.java +index 4157e50e4..c522a7c2a 100644 +--- a/src/main/java/net/minecraft/server/IEntityAccess.java ++++ b/src/main/java/net/minecraft/server/IEntityAccess.java +@@ -59,8 +59,8 @@ public interface IEntityAccess { + } + } + +- @Nullable +- default EntityHuman a(double d0, double d1, double d2, double d3, @Nullable Predicate predicate) { ++ @Nullable default EntityHuman a(double d0, double d1, double d2, double d3, @Nullable Predicate predicate) { return this.findClosestPlayer(d0, d1, d2, d3, predicate); } // Tuinity - allow overriding with OBFHELPER ++ @Nullable default EntityHuman findClosestPlayer(double d0, double d1, double d2, double d3, @Nullable Predicate predicate) { // Tuinity - OBFHELPER + double d4 = -1.0D; + EntityHuman entityhuman = null; + Iterator iterator = this.getPlayers().iterator(); +@@ -95,6 +95,11 @@ public interface IEntityAccess { + + @Nullable + default EntityHuman a(double d0, double d1, double d2) { ++ // Tuinity start - add predicate parameter and allow for WorldServer to override ++ return this.findClosestPlayerXZ(d0, d1, d2, IEntitySelector.notSpectator()); ++ } ++ default EntityHuman findClosestPlayerXZ(double d0, double d1, double d2, @Nullable Predicate predicate) { ++ // Tuinity end - add predicate parameter and allow for WorldServer to override + double d3 = -1.0D; + EntityHuman entityhuman = null; + Iterator iterator = this.getPlayers().iterator(); +@@ -102,7 +107,7 @@ public interface IEntityAccess { + while (iterator.hasNext()) { + EntityHuman entityhuman1 = (EntityHuman) iterator.next(); + +- if (IEntitySelector.f.test(entityhuman1)) { ++ if ((predicate == null || predicate.test(entityhuman1))) { // Tuinity - add predicate parameter + double d4 = entityhuman1.g(d0, entityhuman1.locY(), d1); + + if ((d2 < 0.0D || d4 < d2 * d2) && (d3 == -1.0D || d4 < d3)) { +@@ -141,19 +146,26 @@ public interface IEntityAccess { + + @Nullable + default EntityHuman a(PathfinderTargetCondition pathfindertargetcondition, EntityLiving entityliving) { +- return (EntityHuman) this.a(this.getPlayers(), pathfindertargetcondition, entityliving, entityliving.locX(), entityliving.locY(), entityliving.locZ()); ++ return (EntityHuman) this.getNearestPlayerForPathFinding(pathfindertargetcondition, entityliving, entityliving.locX(), entityliving.locY(), entityliving.locZ()); // Tuinity - allow overriding in WorldServer for find nearest player optimisation + } + + @Nullable + default EntityHuman a(PathfinderTargetCondition pathfindertargetcondition, EntityLiving entityliving, double d0, double d1, double d2) { +- return (EntityHuman) this.a(this.getPlayers(), pathfindertargetcondition, entityliving, d0, d1, d2); ++ return (EntityHuman) this.getNearestPlayerForPathFinding(pathfindertargetcondition, entityliving, d0, d1, d2); // Tuinity - allow overriding in WorldServer for find nearest player optimisation + } + + @Nullable + default EntityHuman a(PathfinderTargetCondition pathfindertargetcondition, double d0, double d1, double d2) { +- return (EntityHuman) this.a(this.getPlayers(), pathfindertargetcondition, (EntityLiving) null, d0, d1, d2); ++ return (EntityHuman) this.getNearestPlayerForPathFinding(pathfindertargetcondition, (EntityLiving) null, d0, d1, d2); // Tuinity - allow overriding in WorldServer for find nearest player optimisation + } + ++ // Tuinity start - allow overriding in WorldServer for find nearest player optimisation ++ @Nullable ++ default EntityHuman getNearestPlayerForPathFinding(PathfinderTargetCondition pathfindertargetcondition, @Nullable EntityLiving entityliving, double d0, double d1, double d2) { ++ return this.getNearestEntityForPathFinding(this.getPlayers(), pathfindertargetcondition, entityliving, d0, d1, d2); ++ } ++ // Tuinity end - allow overriding in WorldServer ++ + @Nullable + default T a(Class oclass, PathfinderTargetCondition pathfindertargetcondition, @Nullable EntityLiving entityliving, double d0, double d1, double d2, AxisAlignedBB axisalignedbb) { + return this.a(this.a(oclass, axisalignedbb, null), pathfindertargetcondition, entityliving, d0, d1, d2); // Paper - decompile fix +@@ -164,8 +176,8 @@ public interface IEntityAccess { + return this.a(this.b(oclass, axisalignedbb, null), pathfindertargetcondition, entityliving, d0, d1, d2); // Paper - decompile fix + } + +- @Nullable +- default T a(List list, PathfinderTargetCondition pathfindertargetcondition, @Nullable EntityLiving entityliving, double d0, double d1, double d2) { ++ @Nullable default T getNearestEntityForPathFinding(List list, PathfinderTargetCondition pathfindertargetcondition, @Nullable EntityLiving entityliving, double d0, double d1, double d2) { return this.a(list, pathfindertargetcondition, entityliving, d0, d1, d2); } // Tuinity - OBFHELPER ++ @Nullable default T a(List list, PathfinderTargetCondition pathfindertargetcondition, @Nullable EntityLiving entityliving, double d0, double d1, double d2) { // Tuinity - OBFHELPER + double d3 = -1.0D; + T t0 = null; + Iterator iterator = list.iterator(); // Paper - decompile fix +@@ -187,6 +199,11 @@ public interface IEntityAccess { + } + + default List a(PathfinderTargetCondition pathfindertargetcondition, EntityLiving entityliving, AxisAlignedBB axisalignedbb) { ++ // Tuinity start - allow overriding in WorldServer ++ return this.getNearestPlayersForPathFinding(pathfindertargetcondition, entityliving, axisalignedbb); ++ } ++ default List getNearestPlayersForPathFinding(PathfinderTargetCondition pathfindertargetcondition, EntityLiving entityliving, AxisAlignedBB axisalignedbb) { ++ // Tuinity end - allow overriding in WorldServer + List list = Lists.newArrayList(); + Iterator iterator = this.getPlayers().iterator(); + +diff --git a/src/main/java/net/minecraft/server/LightEngineBlock.java b/src/main/java/net/minecraft/server/LightEngineBlock.java +index 93a972605..43424c88a 100644 +--- a/src/main/java/net/minecraft/server/LightEngineBlock.java ++++ b/src/main/java/net/minecraft/server/LightEngineBlock.java +@@ -37,7 +37,7 @@ public final class LightEngineBlock extends LightEngineLayer= 15) { +diff --git a/src/main/java/net/minecraft/server/LightEngineLayer.java b/src/main/java/net/minecraft/server/LightEngineLayer.java +index f72ff8495..f27a14873 100644 +--- a/src/main/java/net/minecraft/server/LightEngineLayer.java ++++ b/src/main/java/net/minecraft/server/LightEngineLayer.java +@@ -11,7 +11,7 @@ public abstract class LightEngineLayer, S e + protected final EnumSkyBlock b; + protected final S c; + private boolean f; +- protected final BlockPosition.MutableBlockPosition d = new BlockPosition.MutableBlockPosition(); ++ protected final BlockPosition.MutableBlockPosition d = new BlockPosition.MutableBlockPosition(); protected final MutableInt lastLevel = new MutableInt(); // Tuinity - avoid allocating MutableInt + private final long[] g = new long[2]; + private final IBlockAccess[] h = new IBlockAccess[2]; + +diff --git a/src/main/java/net/minecraft/server/LightEngineSky.java b/src/main/java/net/minecraft/server/LightEngineSky.java +index 2301a982e..488d4f289 100644 +--- a/src/main/java/net/minecraft/server/LightEngineSky.java ++++ b/src/main/java/net/minecraft/server/LightEngineSky.java +@@ -27,7 +27,7 @@ public final class LightEngineSky extends LightEngineLayer= 15) { + return k; + } else { +- MutableInt mutableint = new MutableInt(); ++ MutableInt mutableint = this.lastLevel; // Tuinity - avoid allocation of MutableInt + IBlockData iblockdata = this.a(j, mutableint); + + if (mutableint.getValue() >= 15) { +diff --git a/src/main/java/net/minecraft/server/LightEngineStorage.java b/src/main/java/net/minecraft/server/LightEngineStorage.java +index a3f919816..dacc96414 100644 +--- a/src/main/java/net/minecraft/server/LightEngineStorage.java ++++ b/src/main/java/net/minecraft/server/LightEngineStorage.java +@@ -19,11 +19,12 @@ public abstract class LightEngineStorage> e + protected final LongSet b = new LongOpenHashSet(); + protected final LongSet c = new LongOpenHashSet(); + protected final LongSet d = new LongOpenHashSet(); +- protected volatile M e; +- protected final M f; ++ protected volatile M e; // Tuinity - diff on change, should be "visible" ++ protected final M f; // Tuinity - diff on change, should be "updating" + protected final LongSet g = new LongOpenHashSet(); + protected final LongSet h = new LongOpenHashSet(); +- protected final Long2ObjectMap i = Long2ObjectMaps.synchronize(new Long2ObjectOpenHashMap()); ++ protected final Long2ObjectOpenHashMap synchronized_map_real = new Long2ObjectOpenHashMap<>(); // Tuinity - store wrapped map, we need fastIterator ++ protected final Long2ObjectMap i = Long2ObjectMaps.synchronize(this.synchronized_map_real); // Tuinity - store wrapped map, we need fastIterator + private final LongSet n = new LongOpenHashSet(); + private final LongSet o = new LongOpenHashSet(); + protected volatile boolean j; +@@ -178,7 +179,7 @@ public abstract class LightEngineStorage> e + NibbleArray nibblearray; + + while (longiterator.hasNext()) { +- i = (Long) longiterator.next(); ++ i = longiterator.nextLong(); // Tuinity - use nextLong + this.a(lightenginelayer, i); + NibbleArray nibblearray1 = (NibbleArray) this.i.remove(i); + +@@ -196,13 +197,13 @@ public abstract class LightEngineStorage> e + longiterator = this.o.iterator(); + + while (longiterator.hasNext()) { +- i = (Long) longiterator.next(); ++ i = longiterator.nextLong(); // Tuinity - use nextLong + this.l(i); + } + + this.o.clear(); + this.j = false; +- ObjectIterator objectiterator = this.i.long2ObjectEntrySet().iterator(); ++ ObjectIterator objectiterator = this.synchronized_map_real.long2ObjectEntrySet().fastIterator(); // Tuinity - use fast iterator to reduce entry creation + + Entry entry; + long j; +@@ -225,7 +226,7 @@ public abstract class LightEngineStorage> e + longiterator = this.i.keySet().iterator(); + + while (longiterator.hasNext()) { +- i = (Long) longiterator.next(); ++ i = longiterator.nextLong(); // Tuinity - use nextLong + if (this.g(i)) { + int k = SectionPosition.c(SectionPosition.b(i)); + int l = SectionPosition.c(SectionPosition.c(i)); +@@ -279,7 +280,7 @@ public abstract class LightEngineStorage> e + } + } + +- objectiterator = this.i.long2ObjectEntrySet().iterator(); ++ objectiterator = this.synchronized_map_real.long2ObjectEntrySet().fastIterator(); // Tuinity - use fast iterator to avoid entry creation + + while (objectiterator.hasNext()) { + entry = (Entry) objectiterator.next(); +diff --git a/src/main/java/net/minecraft/server/LightEngineStorageArray.java b/src/main/java/net/minecraft/server/LightEngineStorageArray.java +index b978723a6..5e2051ee1 100644 +--- a/src/main/java/net/minecraft/server/LightEngineStorageArray.java ++++ b/src/main/java/net/minecraft/server/LightEngineStorageArray.java +@@ -8,10 +8,17 @@ public abstract class LightEngineStorageArray a; ++ protected final com.tuinity.tuinity.chunk.QueuedChangesMapLong2Object data; // Tuinity - avoid copying light data ++ protected final boolean isVisible; // Tuinity - avoid copying light data + +- protected LightEngineStorageArray(Long2ObjectOpenHashMap long2objectopenhashmap) { +- this.a = long2objectopenhashmap; ++ // Tuinity start - avoid copying light data ++ protected LightEngineStorageArray(com.tuinity.tuinity.chunk.QueuedChangesMapLong2Object data, boolean isVisible) { ++ if (isVisible) { ++ data.performUpdatesLockMap(); ++ } ++ this.data = data; ++ this.isVisible = isVisible; ++ // Tuinity end - avoid copying light data + this.c(); + this.d = true; + } +@@ -19,12 +26,13 @@ public abstract class LightEngineStorageArray { + + protected LightEngineStorageBlock(ILightAccess ilightaccess) { +- super(EnumSkyBlock.BLOCK, ilightaccess, new LightEngineStorageBlock.a(new Long2ObjectOpenHashMap())); ++ super(EnumSkyBlock.BLOCK, ilightaccess, new LightEngineStorageBlock.a(new com.tuinity.tuinity.chunk.QueuedChangesMapLong2Object<>(), false)); // Tuinity - avoid copying light data + } + + @Override +@@ -18,13 +18,13 @@ public class LightEngineStorageBlock extends LightEngineStorage { + +- public a(Long2ObjectOpenHashMap long2objectopenhashmap) { +- super(long2objectopenhashmap); ++ public a(com.tuinity.tuinity.chunk.QueuedChangesMapLong2Object long2objectopenhashmap, boolean isVisible) { // Tuinity - avoid copying light data ++ super(long2objectopenhashmap, isVisible); // Tuinity - avoid copying light data + } + + @Override + public LightEngineStorageBlock.a b() { +- return new LightEngineStorageBlock.a(this.a.clone()); ++ return new a(this.data, true); // Tuinity - avoid copying light data + } + } + } +diff --git a/src/main/java/net/minecraft/server/LightEngineStorageSky.java b/src/main/java/net/minecraft/server/LightEngineStorageSky.java +index 75d9065b3..4669f31b0 100644 +--- a/src/main/java/net/minecraft/server/LightEngineStorageSky.java ++++ b/src/main/java/net/minecraft/server/LightEngineStorageSky.java +@@ -17,7 +17,7 @@ public class LightEngineStorageSky extends LightEngineStorage(), new com.tuinity.tuinity.chunk.QueuedChangesMapLong2Int(), Integer.MAX_VALUE, false)); // Tuinity - avoid copying light data + } + + @Override +@@ -25,7 +25,7 @@ public class LightEngineStorageSky extends LightEngineStorage j) { + ((LightEngineStorageSky.a) this.f).b = j; +- ((LightEngineStorageSky.a) this.f).c.defaultReturnValue(((LightEngineStorageSky.a) this.f).b); ++ ((LightEngineStorageSky.a) this.f).otherData.queueDefaultReturnValue(((LightEngineStorageSky.a) this.f).b); // Tuinity - avoid copying light data + } + + long k = SectionPosition.f(i); +- int l = ((LightEngineStorageSky.a) this.f).c.get(k); ++ int l = ((LightEngineStorageSky.a) this.f).otherData.getUpdating(k); // Tuinity - avoid copying light data + + if (l < j + 1) { +- ((LightEngineStorageSky.a) this.f).c.put(k, j + 1); ++ ((LightEngineStorageSky.a) this.f).otherData.queueUpdate(k, j + 1); // Tuinity - avoid copying light data + if (this.o.contains(k)) { + this.q(i); + if (l > ((LightEngineStorageSky.a) this.f).b) { +@@ -101,7 +101,7 @@ public class LightEngineStorageSky extends LightEngineStorage= k; + } +@@ -321,18 +321,20 @@ public class LightEngineStorageSky extends LightEngineStorage { + + private int b; +- private final Long2IntOpenHashMap c; ++ private final com.tuinity.tuinity.chunk.QueuedChangesMapLong2Int otherData; // Tuinity - avoid copying light data + +- public a(Long2ObjectOpenHashMap long2objectopenhashmap, Long2IntOpenHashMap long2intopenhashmap, int i) { +- super(long2objectopenhashmap); +- this.c = long2intopenhashmap; +- long2intopenhashmap.defaultReturnValue(i); ++ // Tuinity start - avoid copying light data ++ public a(com.tuinity.tuinity.chunk.QueuedChangesMapLong2Object data, com.tuinity.tuinity.chunk.QueuedChangesMapLong2Int otherData, int i, boolean isVisible) { ++ super(data, isVisible); ++ this.otherData = otherData; ++ // Tuinity end - avoid copying light data + this.b = i; + } + + @Override + public LightEngineStorageSky.a b() { +- return new LightEngineStorageSky.a(this.a.clone(), this.c.clone(), this.b); ++ this.otherData.performUpdatesLockMap(); // Tuinity - avoid copying light data ++ return new LightEngineStorageSky.a(this.data, this.otherData, this.b, true); // Tuinity - avoid copying light data + } + } + } +diff --git a/src/main/java/net/minecraft/server/MCUtil.java b/src/main/java/net/minecraft/server/MCUtil.java +index bcd5cc9f2..dd07c67bc 100644 +--- a/src/main/java/net/minecraft/server/MCUtil.java ++++ b/src/main/java/net/minecraft/server/MCUtil.java +@@ -502,9 +502,9 @@ public final class MCUtil { + + WorldServer world = ((org.bukkit.craftbukkit.CraftWorld)bukkitWorld).getHandle(); + PlayerChunkMap chunkMap = world.getChunkProvider().playerChunkMap; +- Long2ObjectLinkedOpenHashMap visibleChunks = chunkMap.visibleChunks; ++ // Tuinity - replace chunk map + ChunkMapDistance chunkMapDistance = chunkMap.getChunkMapDistanceManager(); +- List allChunks = new ArrayList<>(visibleChunks.values()); ++ List allChunks = chunkMap.chunkMap.getUpdatingValuesCopy(); // Tuinity - replace chunk map + List players = world.players; + + int fullLoadedChunks = 0; +@@ -527,7 +527,7 @@ public final class MCUtil { + worldData.addProperty("view-distance", world.spigotConfig.viewDistance); + worldData.addProperty("keep-spawn-loaded", world.keepSpawnInMemory); + worldData.addProperty("keep-spawn-loaded-range", world.paperConfig.keepLoadedRange); +- worldData.addProperty("visible-chunk-count", visibleChunks.size()); ++ worldData.addProperty("visible-chunk-count", allChunks.size()); // Tuinity - replace chunk map + worldData.addProperty("loaded-chunk-count", chunkMap.loadedChunks.size()); + worldData.addProperty("verified-fully-loaded-chunks", fullLoadedChunks); + +@@ -605,4 +605,28 @@ public final class MCUtil { + // TODO make sure the constant `33` is correct on future updates. See getChunkAt(int, int, ChunkStatus, boolean) + return 33 + ChunkStatus.getTicketLevelOffset(status); + } ++ ++ public static boolean hasCommonElement(Set set0, Set set1) { ++ java.util.Iterator iterator; ++ Set target; ++ ++ // optimize by iterating over fewest entries possible ++ if (set0.size() <= set1.size()) { ++ target = set1; ++ iterator = set0.iterator(); ++ } else { ++ target = set0; ++ iterator = set1.iterator(); ++ } ++ ++ while (iterator.hasNext()) { ++ E element = iterator.next(); ++ if (target.contains(element)) { ++ return true; ++ } ++ } ++ ++ return false; ++ ++ } + } +diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java +index b31a9ac78..af5dd9f2d 100644 +--- a/src/main/java/net/minecraft/server/MinecraftServer.java ++++ b/src/main/java/net/minecraft/server/MinecraftServer.java +@@ -166,7 +166,7 @@ public abstract class MinecraftServer extends IAsyncTaskHandlerReentrant processQueue = new java.util.concurrent.ConcurrentLinkedQueue(); ++ public final java.util.Queue processQueue = new ca.spottedleaf.concurrentutil.queue.MultiThreadedQueue<>(); // Tuinity - Use CLL + public int autosavePeriod; + public boolean serverAutoSave = false; // Paper + public File bukkitDataPackFolder; +@@ -1194,9 +1194,7 @@ public abstract class MinecraftServer extends IAsyncTaskHandlerReentrant)processQueue).drain(Runnable::run); // Tuinity - Use efficient drain method + MinecraftTimings.processQueueTimer.stopTiming(); // Spigot + + MinecraftTimings.timeUpdateTimer.startTiming(); // Spigot // Paper +diff --git a/src/main/java/net/minecraft/server/NBTTagCompound.java b/src/main/java/net/minecraft/server/NBTTagCompound.java +index 98deaba12..fcc3b7c36 100644 +--- a/src/main/java/net/minecraft/server/NBTTagCompound.java ++++ b/src/main/java/net/minecraft/server/NBTTagCompound.java +@@ -67,7 +67,7 @@ public class NBTTagCompound implements NBTBase { + } + + public NBTTagCompound() { +- this(Maps.newHashMap()); ++ this(new it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap<>(16, 0.8f)); // Tuinity - reduce memory footprint of NBTTagCompound + } + + @Override +diff --git a/src/main/java/net/minecraft/server/NavigationAbstract.java b/src/main/java/net/minecraft/server/NavigationAbstract.java +index f06764973..4393ea6dc 100644 +--- a/src/main/java/net/minecraft/server/NavigationAbstract.java ++++ b/src/main/java/net/minecraft/server/NavigationAbstract.java +@@ -11,7 +11,7 @@ public abstract class NavigationAbstract { + protected final EntityInsentient a; public Entity getEntity() { return a; } // Paper - OBFHELPER + protected final World b; + @Nullable +- protected PathEntity c; ++ protected PathEntity c; protected final PathEntity getCurrentPath() { return this.c; } // Tuinity - OBFHELPER + protected double d; + private final AttributeInstance p; + protected int e; +@@ -158,10 +158,30 @@ public abstract class NavigationAbstract { + return this.a(this.a(d0, d1, d2, 1), d3); + } + ++ // Tuinity start - optimise pathfinding ++ private int lastFailure = 0; ++ private int pathfindFailures = 0; ++ // Tuinity end ++ + public boolean a(Entity entity, double d0) { ++ // Tuinity start - Pathfinding optimizations ++ if (this.pathfindFailures > 10 && this.getCurrentPath() == null && MinecraftServer.currentTick < this.lastFailure + 40) { ++ return false; ++ } ++ // Tuinity end + PathEntity pathentity = this.a(entity, 1); + +- return pathentity != null && this.a(pathentity, d0); ++ // Tuinity start - Pathfinding optimizations ++ if (pathentity != null && this.a(pathentity, d0)) { ++ this.lastFailure = 0; ++ this.pathfindFailures = 0; ++ return true; ++ } else { ++ this.pathfindFailures++; ++ this.lastFailure = MinecraftServer.currentTick; ++ return false; ++ } ++ // Tuinity end + } + + public boolean setDestination(@Nullable PathEntity pathentity, double speed) { return a(pathentity, speed); } // Paper - OBFHELPER +diff --git a/src/main/java/net/minecraft/server/NetworkManager.java b/src/main/java/net/minecraft/server/NetworkManager.java +index 96a785af2..211a6d720 100644 +--- a/src/main/java/net/minecraft/server/NetworkManager.java ++++ b/src/main/java/net/minecraft/server/NetworkManager.java +@@ -42,7 +42,7 @@ public class NetworkManager extends SimpleChannelInboundHandler> { + return new DefaultEventLoopGroup(0, (new ThreadFactoryBuilder()).setNameFormat("Netty Local Client IO #%d").setDaemon(true).build()); + }); + private final EnumProtocolDirection h; +- private final Queue packetQueue = Queues.newConcurrentLinkedQueue(); private final Queue getPacketQueue() { return this.packetQueue; } // Paper - OBFHELPER ++ private final Queue packetQueue = new ca.spottedleaf.concurrentutil.queue.MultiThreadedQueue<>(); private final Queue getPacketQueue() { return this.packetQueue; } // Paper - OBFHELPER // Tuinity - Use CLL + public Channel channel; + public SocketAddress socketAddress; public void setSpoofedRemoteAddress(SocketAddress address) { this.socketAddress = address; } // Paper - OBFHELPER + // Spigot Start +diff --git a/src/main/java/net/minecraft/server/NextTickListEntry.java b/src/main/java/net/minecraft/server/NextTickListEntry.java +index 33cfeabde..11a4bb882 100644 +--- a/src/main/java/net/minecraft/server/NextTickListEntry.java ++++ b/src/main/java/net/minecraft/server/NextTickListEntry.java +@@ -5,11 +5,13 @@ import java.util.Comparator; + public class NextTickListEntry { + + private static final java.util.concurrent.atomic.AtomicLong COUNTER = new java.util.concurrent.atomic.AtomicLong(); // Paper - async chunk loading +- private final T e; +- public final BlockPosition a; +- public final long b; +- public final TickListPriority c; +- private final long f; ++ private final T e; public final T getData() { return this.e; } // Tuinity - OBFHELPER ++ public final BlockPosition a; public final BlockPosition getPosition() { return this.a; } // Tuinity - OBFHELPER ++ public final long b; public final long getTargetTick() { return this.b; } // Tuinity - OBFHELPER ++ public final TickListPriority c; public final TickListPriority getPriority() { return this.c; } // Tuinity - OBFHELPER ++ private final long f; public final long getId() { return this.f; } // Tuinity - OBFHELPER ++ private final int hash; // Tuinity ++ public int tickState; // Tuinity + + public NextTickListEntry(BlockPosition blockposition, T t0) { + this(blockposition, t0, 0L, TickListPriority.NORMAL); +@@ -21,6 +23,7 @@ public class NextTickListEntry { + this.e = t0; + this.b = i; + this.c = ticklistpriority; ++ this.hash = this.computeHash(); // Tuinity + } + + public boolean equals(Object object) { +@@ -33,19 +36,31 @@ public class NextTickListEntry { + } + } + ++ // Tuinity start - optimize hashcode ++ @Override + public int hashCode() { ++ return this.hash; ++ } ++ public final int computeHash() { ++ // Tuinity end - optimize hashcode + return this.a.hashCode(); + } + +- public static Comparator a() { // Paper - decompile fix +- return Comparator.comparingLong((nextticklistentry) -> { +- return ((NextTickListEntry) nextticklistentry).b; // Paper - decompile fix +- }).thenComparing((nextticklistentry) -> { +- return ((NextTickListEntry) nextticklistentry).c; // Paper - decompile fix +- }).thenComparingLong((nextticklistentry) -> { +- return ((NextTickListEntry) nextticklistentry).f; // Paper - decompile fix +- }); ++ // Tuinity start - let's not use more functional code for no reason. ++ public static Comparator comparator() { return NextTickListEntry.a(); } // Tuinity - OBFHELPER ++ public static Comparator a() { ++ return (Comparator)(Comparator)(NextTickListEntry nextticklistentry, NextTickListEntry nextticklistentry1) -> { ++ int i = Long.compare(nextticklistentry.getTargetTick(), nextticklistentry1.getTargetTick()); ++ ++ if (i != 0) { ++ return i; ++ } else { ++ i = nextticklistentry.getPriority().compareTo(nextticklistentry1.getPriority()); ++ return i != 0 ? i : Long.compare(nextticklistentry.getId(), nextticklistentry1.getId()); ++ } ++ }; + } ++ // Tuinity end - let's not use more functional code for no reason. + + public String toString() { + return this.e + ": " + this.a + ", " + this.b + ", " + this.c + ", " + this.f; +diff --git a/src/main/java/net/minecraft/server/PacketPlayOutMapChunk.java b/src/main/java/net/minecraft/server/PacketPlayOutMapChunk.java +index ef7ade797..185ed1db3 100644 +--- a/src/main/java/net/minecraft/server/PacketPlayOutMapChunk.java ++++ b/src/main/java/net/minecraft/server/PacketPlayOutMapChunk.java +@@ -29,7 +29,7 @@ public class PacketPlayOutMapChunk implements Packet { + + // Paper start + private final java.util.List extraPackets = new java.util.ArrayList<>(); +- private static final int SKIP_EXCESSIVE_SIGNS_LIMIT = Integer.getInteger("Paper.excessiveSignsLimit", 500); ++ private static final int TE_LIMIT = Integer.getInteger("tuinity.excessive-te-limit", 250); // Tuinity - handle oversized chunk data packets more robustly + + @Override + public java.util.List getExtraPackets() { +@@ -73,7 +73,7 @@ public class PacketPlayOutMapChunk implements Packet { + this.c = this.writeChunk(new PacketDataSerializer(this.j()), chunk, i, chunkPacketInfo); // Paper - Anti-Xray - Add chunk packet info + this.g = Lists.newArrayList(); + iterator = chunk.getTileEntities().entrySet().iterator(); +- int totalSigns = 0; // Paper ++ int totalTileEntities = 0; // Paper // Tuinity + + while (iterator.hasNext()) { + entry = (Entry) iterator.next(); +@@ -83,12 +83,15 @@ public class PacketPlayOutMapChunk implements Packet { + + if (this.f() || (i & 1 << j) != 0) { + // Paper start - send signs separately +- if (tileentity instanceof TileEntitySign) { +- if (SKIP_EXCESSIVE_SIGNS_LIMIT < 0 || ++totalSigns < SKIP_EXCESSIVE_SIGNS_LIMIT) { +- this.extraPackets.add(tileentity.getUpdatePacket()); ++ // Tuinity start - improve oversized chunk data packet handling ++ if (++totalTileEntities > TE_LIMIT) { ++ PacketPlayOutTileEntityData updatePacket = tileentity.getUpdatePacket(); ++ if (updatePacket != null) { ++ this.extraPackets.add(updatePacket); ++ continue; + } +- continue; + } ++ // Tuinity end + // Paper end + NBTTagCompound nbttagcompound = tileentity.b(); + if (tileentity instanceof TileEntitySkull) { TileEntitySkull.sanitizeTileEntityUUID(nbttagcompound); } // Paper +diff --git a/src/main/java/net/minecraft/server/PairedQueue.java b/src/main/java/net/minecraft/server/PairedQueue.java +index 85bb22e4b..1e618446a 100644 +--- a/src/main/java/net/minecraft/server/PairedQueue.java ++++ b/src/main/java/net/minecraft/server/PairedQueue.java +@@ -20,32 +20,30 @@ public interface PairedQueue { + + public static final class a implements PairedQueue { + +- private final List> a; ++ private final List> a; private final List> getQueues() { return this.a; } // Tuinity - OBFHELPER + + public a(int i) { +- this.a = (List) IntStream.range(0, i).mapToObj((j) -> { +- return Queues.newConcurrentLinkedQueue(); +- }).collect(Collectors.toList()); ++ // Tuinity start - reduce streams ++ this.a = new java.util.ArrayList<>(i); // queues ++ for (int j = 0; j < i; ++j) { ++ this.getQueues().add(new ca.spottedleaf.concurrentutil.queue.MultiThreadedQueue<>()); // use MT queue ++ } ++ // Tuinity end - reduce streams + } + + @Nullable + @Override + public Runnable a() { +- Iterator iterator = this.a.iterator(); +- +- Runnable runnable; +- +- do { +- if (!iterator.hasNext()) { +- return null; ++ // Tuinity start - reduce iterator creation ++ for (int i = 0, len = this.getQueues().size(); i < len; ++i) { ++ Queue queue = this.getQueues().get(i); ++ Runnable ret = queue.poll(); ++ if (ret != null) { ++ return ret; + } +- +- Queue queue = (Queue) iterator.next(); +- +- runnable = (Runnable) queue.poll(); +- } while (runnable == null); +- +- return runnable; ++ } ++ return null; ++ // Tuinity end - reduce iterator creation + } + + public boolean a(PairedQueue.b pairedqueue_b) { +@@ -57,7 +55,15 @@ public interface PairedQueue { + + @Override + public boolean b() { +- return this.a.stream().allMatch(Collection::isEmpty); ++ // Tuinity start - reduce streams ++ for (int i = 0, len = this.getQueues().size(); i < len; ++i) { ++ Queue queue = this.getQueues().get(i); ++ if (!queue.isEmpty()) { ++ return false; ++ } ++ } ++ return true; ++ // Tuinity end - reduce streams + } + } + +diff --git a/src/main/java/net/minecraft/server/PathfinderGoal.java b/src/main/java/net/minecraft/server/PathfinderGoal.java +index bdb90a346..738c51070 100644 +--- a/src/main/java/net/minecraft/server/PathfinderGoal.java ++++ b/src/main/java/net/minecraft/server/PathfinderGoal.java +@@ -1,10 +1,11 @@ + package net.minecraft.server; + ++import com.tuinity.tuinity.util.OptimizedSmallEnumSet; // Tuinity + import java.util.EnumSet; + + public abstract class PathfinderGoal { + +- private final EnumSet a = EnumSet.noneOf(PathfinderGoal.Type.class); ++ private final OptimizedSmallEnumSet goalTypes = new OptimizedSmallEnumSet<>(PathfinderGoal.Type.class); // Tuinity - reduce garbage on heap + + public PathfinderGoal() {} + +@@ -28,16 +29,20 @@ public abstract class PathfinderGoal { + public void e() {} + + public void a(EnumSet enumset) { +- this.a.clear(); +- this.a.addAll(enumset); ++ // Tuinity start - reduce garbage on heap ++ this.goalTypes.clear(); ++ this.goalTypes.addAllUnchecked(enumset); ++ // Tuinity end - reduce garbage on heap + } + + public String toString() { + return this.getClass().getSimpleName(); + } + +- public EnumSet i() { +- return this.a; ++ // Tuinity start - reduce garbage on heap ++ public com.tuinity.tuinity.util.OptimizedSmallEnumSet getGoalTypes() { ++ return this.goalTypes; ++ // Tuinity end - reduce garbage on heap + } + + public static enum Type { +diff --git a/src/main/java/net/minecraft/server/PathfinderGoalSelector.java b/src/main/java/net/minecraft/server/PathfinderGoalSelector.java +index 935136771..782edcb63 100644 +--- a/src/main/java/net/minecraft/server/PathfinderGoalSelector.java ++++ b/src/main/java/net/minecraft/server/PathfinderGoalSelector.java +@@ -1,8 +1,10 @@ + package net.minecraft.server; + ++import com.tuinity.tuinity.util.OptimizedSmallEnumSet; + import com.google.common.collect.Sets; + import java.util.EnumMap; + import java.util.EnumSet; ++import java.util.Iterator; // Tuinity + import java.util.Map; + import java.util.Set; + import java.util.stream.Stream; +@@ -26,7 +28,7 @@ public class PathfinderGoalSelector { + private final Map c = new EnumMap(PathfinderGoal.Type.class); + private final Set d = Sets.newLinkedHashSet();private Set getTasks() { return d; }// Paper - OBFHELPER + private final GameProfilerFiller e; +- private final EnumSet f = EnumSet.noneOf(PathfinderGoal.Type.class); ++ private final OptimizedSmallEnumSet goalTypes = new OptimizedSmallEnumSet<>(PathfinderGoal.Type.class); // Tuinity - reduce garbage on heap + private int g = 3;private int getTickRate() { return g; } // Paper - OBFHELPER + private int curRate;private int getCurRate() { return curRate; } private void incRate() { this.curRate++; } // Paper TODO + +@@ -58,33 +60,38 @@ public class PathfinderGoalSelector { + // Paper end + + public void a(PathfinderGoal pathfindergoal) { +- this.d.stream().filter((pathfindergoalwrapped) -> { +- return pathfindergoalwrapped.j() == pathfindergoal; +- }).filter(PathfinderGoalWrapped::g).forEach(PathfinderGoalWrapped::d); +- this.d.removeIf((pathfindergoalwrapped) -> { +- return pathfindergoalwrapped.j() == pathfindergoal; +- }); ++ // Tuinity start - remove streams ++ for (Iterator iterator = this.d.iterator(); iterator.hasNext();) { ++ PathfinderGoalWrapped goalWrapped = iterator.next(); ++ if (goalWrapped.j() != pathfindergoal) { ++ continue; ++ } ++ if (goalWrapped.g()) { ++ goalWrapped.d(); ++ } ++ iterator.remove(); ++ } ++ // Tuinity end + } + ++ private static final PathfinderGoal.Type[] PATHFINDER_GOAL_TYPES = PathfinderGoal.Type.values(); ++ + public void doTick() { + this.e.enter("goalCleanup"); +- this.c().filter((pathfindergoalwrapped) -> { +- boolean flag; +- +- if (pathfindergoalwrapped.g()) { +- Stream stream = pathfindergoalwrapped.i().stream(); +- EnumSet enumset = this.f; ++ // Tuinity start - remove streams ++ for (Iterator iterator = this.d.iterator(); iterator.hasNext();) { ++ PathfinderGoalWrapped wrappedGoal = iterator.next(); ++ if (!wrappedGoal.g()) { ++ continue; ++ } + +- this.f.getClass(); +- if (!stream.anyMatch(enumset::contains) && pathfindergoalwrapped.b()) { +- flag = false; +- return flag; +- } ++ if (!this.goalTypes.hasCommonElements(wrappedGoal.getGoalTypes()) && wrappedGoal.b()) { ++ continue; + } + +- flag = true; +- return flag; +- }).forEach(PathfinderGoal::d); ++ wrappedGoal.d(); ++ } ++ // Tuinity end + this.c.forEach((pathfindergoal_type, pathfindergoalwrapped) -> { + if (!pathfindergoalwrapped.g()) { + this.c.remove(pathfindergoal_type); +@@ -93,30 +100,58 @@ public class PathfinderGoalSelector { + }); + this.e.exit(); + this.e.enter("goalUpdate"); +- this.d.stream().filter((pathfindergoalwrapped) -> { +- return !pathfindergoalwrapped.g(); +- }).filter((pathfindergoalwrapped) -> { +- Stream stream = pathfindergoalwrapped.i().stream(); +- EnumSet enumset = this.f; +- +- this.f.getClass(); +- return stream.noneMatch(enumset::contains); +- }).filter((pathfindergoalwrapped) -> { +- return pathfindergoalwrapped.i().stream().allMatch((pathfindergoal_type) -> { +- return ((PathfinderGoalWrapped) this.c.getOrDefault(pathfindergoal_type, PathfinderGoalSelector.b)).a(pathfindergoalwrapped); +- }); +- }).filter(PathfinderGoalWrapped::a).forEach((pathfindergoalwrapped) -> { +- pathfindergoalwrapped.i().forEach((pathfindergoal_type) -> { +- PathfinderGoalWrapped pathfindergoalwrapped1 = (PathfinderGoalWrapped) this.c.getOrDefault(pathfindergoal_type, PathfinderGoalSelector.b); +- +- pathfindergoalwrapped1.d(); +- this.c.put(pathfindergoal_type, pathfindergoalwrapped); +- }); +- pathfindergoalwrapped.c(); +- }); ++ // Tuinity start - remove streams ++ goal_update_loop: for (Iterator iterator = this.d.iterator(); iterator.hasNext();) { ++ PathfinderGoalWrapped wrappedGoal = iterator.next(); ++ if (wrappedGoal.g()) { ++ continue; ++ } ++ ++ OptimizedSmallEnumSet wrappedGoalSet = wrappedGoal.getGoalTypes(); ++ ++ if (this.goalTypes.hasCommonElements(wrappedGoalSet)) { ++ continue; ++ } ++ ++ long iterator1 = wrappedGoalSet.getBackingSet(); ++ int wrappedGoalSize = wrappedGoalSet.size(); ++ for (int i = 0; i < wrappedGoalSize; ++i) { ++ PathfinderGoal.Type type = PATHFINDER_GOAL_TYPES[Long.numberOfTrailingZeros(iterator1)]; ++ iterator1 ^= ca.spottedleaf.concurrentutil.util.IntegerUtil.getTrailingBit(iterator1); ++ PathfinderGoalWrapped wrapped = this.c.getOrDefault(type, PathfinderGoalSelector.b); ++ if (!wrapped.a(wrappedGoal)) { ++ continue goal_update_loop; ++ } ++ } ++ ++ if (!wrappedGoal.a()) { ++ continue; ++ } ++ ++ iterator1 = wrappedGoalSet.getBackingSet(); ++ wrappedGoalSize = wrappedGoalSet.size(); ++ for (int i = 0; i < wrappedGoalSize; ++i) { ++ PathfinderGoal.Type type = PATHFINDER_GOAL_TYPES[Long.numberOfTrailingZeros(iterator1)]; ++ iterator1 ^= ca.spottedleaf.concurrentutil.util.IntegerUtil.getTrailingBit(iterator1); ++ PathfinderGoalWrapped wrapped = this.c.getOrDefault(type, PathfinderGoalSelector.b); ++ ++ wrapped.d(); ++ this.c.put(type, wrappedGoal); ++ } ++ ++ wrappedGoal.c(); ++ } ++ // Tuinity end + this.e.exit(); + this.e.enter("goalTick"); +- this.c().forEach(PathfinderGoalWrapped::e); ++ // Tuinity start - remove streams ++ for (Iterator iterator = this.d.iterator(); iterator.hasNext();) { ++ PathfinderGoalWrapped wrappedGoal = iterator.next(); ++ if (wrappedGoal.g()) { ++ wrappedGoal.e(); ++ } ++ } ++ // Tuinity end + this.e.exit(); + } + +@@ -125,11 +160,11 @@ public class PathfinderGoalSelector { + } + + public void a(PathfinderGoal.Type pathfindergoal_type) { +- this.f.add(pathfindergoal_type); ++ this.goalTypes.addUnchecked(pathfindergoal_type); // Tuinity - reduce streams + } + + public void b(PathfinderGoal.Type pathfindergoal_type) { +- this.f.remove(pathfindergoal_type); ++ this.goalTypes.removeUnchecked(pathfindergoal_type); // Tuinity - reduce streams + } + + public void a(PathfinderGoal.Type pathfindergoal_type, boolean flag) { +diff --git a/src/main/java/net/minecraft/server/PathfinderGoalWrapped.java b/src/main/java/net/minecraft/server/PathfinderGoalWrapped.java +index 29657fed7..71919adc0 100644 +--- a/src/main/java/net/minecraft/server/PathfinderGoalWrapped.java ++++ b/src/main/java/net/minecraft/server/PathfinderGoalWrapped.java +@@ -60,8 +60,10 @@ public class PathfinderGoalWrapped extends PathfinderGoal { + } + + @Override +- public EnumSet i() { +- return this.a.i(); ++ // Tuinity start - reduce garbage on heap ++ public com.tuinity.tuinity.util.OptimizedSmallEnumSet getGoalTypes() { ++ return this.a.getGoalTypes(); ++ // Tuinity end - reduce garbage on heap + } + + public boolean isRunning() { return this.g(); } // Paper - OBFHELPER +diff --git a/src/main/java/net/minecraft/server/PathfinderNormal.java b/src/main/java/net/minecraft/server/PathfinderNormal.java +index 4240ca81c..69fd3cc8e 100644 +--- a/src/main/java/net/minecraft/server/PathfinderNormal.java ++++ b/src/main/java/net/minecraft/server/PathfinderNormal.java +@@ -443,8 +443,10 @@ public class PathfinderNormal extends PathfinderAbstract { + return pathtype; + } + ++ private static final BlockPosition.MutableBlockPosition PATH_TYPE_BLOCKPOSITION = new BlockPosition.MutableBlockPosition(); // Tuinity - this shows to be a high allocator ++ + protected static PathType c(IBlockAccess iblockaccess, int i, int j, int k) { +- BlockPosition blockposition = new BlockPosition(i, j, k); ++ BlockPosition blockposition = PATH_TYPE_BLOCKPOSITION.setValues(i, j, k); // Tuinity - this shows to be a high allocator + IBlockData iblockdata = iblockaccess.getTypeIfLoaded(blockposition); // Paper + if (iblockdata == null) return PathType.BLOCKED; // Paper + Block block = iblockdata.getBlock(); +diff --git a/src/main/java/net/minecraft/server/PathfinderTargetCondition.java b/src/main/java/net/minecraft/server/PathfinderTargetCondition.java +index e35ec2db0..e7dfe22ac 100644 +--- a/src/main/java/net/minecraft/server/PathfinderTargetCondition.java ++++ b/src/main/java/net/minecraft/server/PathfinderTargetCondition.java +@@ -51,6 +51,7 @@ public class PathfinderTargetCondition { + return this; + } + ++ public final boolean test(@Nullable EntityLiving entityliving, EntityLiving entityliving1) { return this.a(entityliving, entityliving1); } // Tuinity - OBFHELPER + public boolean a(@Nullable EntityLiving entityliving, EntityLiving entityliving1) { + if (entityliving == entityliving1) { + return false; +diff --git a/src/main/java/net/minecraft/server/PlayerChunk.java b/src/main/java/net/minecraft/server/PlayerChunk.java +index b38bc6775..729795238 100644 +--- a/src/main/java/net/minecraft/server/PlayerChunk.java ++++ b/src/main/java/net/minecraft/server/PlayerChunk.java +@@ -43,6 +43,18 @@ public class PlayerChunk { + long lastAutoSaveTime; // Paper - incremental autosave + long inactiveTimeStart; // Paper - incremental autosave + ++ // Tuinity start - optimise isOutsideOfRange ++ // cached here to avoid a map lookup ++ com.tuinity.tuinity.util.map.PooledLinkedHashSets.PooledObjectLinkedOpenHashSet playersInMobSpawnRange; ++ com.tuinity.tuinity.util.map.PooledLinkedHashSets.PooledObjectLinkedOpenHashSet playersInChunkTickRange; ++ ++ void updateRanges() { ++ long key = com.tuinity.tuinity.util.Util.getCoordinateKey(this.location); ++ this.playersInMobSpawnRange = this.chunkMap.playerMobSpawnMap.getObjectsInRange(key); ++ this.playersInChunkTickRange = this.chunkMap.playerChunkTickRangeMap.getObjectsInRange(key); ++ } ++ // Tuinity end ++ + public PlayerChunk(ChunkCoordIntPair chunkcoordintpair, int i, LightEngine lightengine, PlayerChunk.c playerchunk_c, PlayerChunk.d playerchunk_d) { + this.statusFutures = new AtomicReferenceArray(PlayerChunk.CHUNK_STATUSES.size()); + this.fullChunkFuture = PlayerChunk.UNLOADED_CHUNK_FUTURE; +@@ -59,7 +71,30 @@ public class PlayerChunk { + this.n = this.oldTicketLevel; + this.a(i); + this.chunkMap = (PlayerChunkMap)playerchunk_d; // Paper ++ this.updateRanges(); // Tuinity - optimise isOutsideOfRange ++ } ++ ++ // Tuinity start - per player view distance ++ void broadcastChunk() { ++ Chunk chunk = this.getFullReadyChunk(); ++ Packet[] apacket = new Packet[2]; ++ ++ // there can be potential desync with player's last mapped section and the view distance map, so use the ++ // view distance map here. ++ com.tuinity.tuinity.util.map.PooledLinkedHashSets.PooledObjectLinkedOpenHashSet players = this.chunkMap.playerViewDistanceBroadcastMap.getObjectsInRange(chunk.getPos()); ++ if (players != null) { ++ Object[] backingSet = players.getBackingSet(); ++ for (int i = 0, len = backingSet.length; i < len; ++i) { ++ Object temp = backingSet[i]; ++ if (!(temp instanceof EntityPlayer)) { ++ continue; ++ } ++ EntityPlayer player = (EntityPlayer)temp; ++ this.chunkMap.sendChunk(player, apacket, chunk); ++ } ++ } + } ++ // Tuinity end + + // Paper start + @Nullable +@@ -194,7 +229,7 @@ public class PlayerChunk { + } + + public void a(int i, int j, int k) { +- Chunk chunk = this.getChunk(); ++ Chunk chunk = this.getFullReadyChunk(); // Tuinity - per player view distance - allow block updates in non-ticking chunks + + if (chunk != null) { + this.r |= 1 << (j >> 4); +@@ -214,7 +249,7 @@ public class PlayerChunk { + } + + public void a(EnumSkyBlock enumskyblock, int i) { +- Chunk chunk = this.getChunk(); ++ Chunk chunk = this.getFullReadyChunk(); // Tuinity - per player view distance - allow block updates in non-ticking chunks + + if (chunk != null) { + chunk.setNeedsSaving(true); +@@ -304,6 +339,50 @@ public class PlayerChunk { + } + + private void a(Packet packet, boolean flag) { ++ // Tuinity start - per player view distance ++ // there can be potential desync with player's last mapped section and the view distance map, so use the ++ // view distance map here. ++ if (this.players instanceof PlayerChunkMap) { ++ PlayerChunkMap chunkMap = ((PlayerChunkMap)this.players); ++ com.tuinity.tuinity.util.map.PlayerAreaMap viewDistanceMap = ((PlayerChunkMap)this.players).playerViewDistanceBroadcastMap; ++ com.tuinity.tuinity.util.map.PooledLinkedHashSets.PooledObjectLinkedOpenHashSet players = viewDistanceMap.getObjectsInRange(this.location); ++ if (players == null) { ++ return; ++ } ++ ++ if (flag) { // flag -> border only ++ Object[] backingSet = players.getBackingSet(); ++ for (int i = 0, len = backingSet.length; i < len; ++i) { ++ Object temp = backingSet[i]; ++ if (!(temp instanceof EntityPlayer)) { ++ continue; ++ } ++ EntityPlayer player = (EntityPlayer)temp; ++ int viewDistance = viewDistanceMap.getLastViewDistance(player); ++ long lastPosition = viewDistanceMap.getLastCoordinate(player); ++ ++ int distX = Math.abs(com.tuinity.tuinity.util.Util.getCoordinateX(lastPosition) - this.location.x); ++ int distZ = Math.abs(com.tuinity.tuinity.util.Util.getCoordinateZ(lastPosition) - this.location.z); ++ ++ if (Math.max(distX, distZ) == viewDistance) { ++ player.playerConnection.sendPacket(packet); ++ } ++ } ++ } else { ++ Object[] backingSet = players.getBackingSet(); ++ for (int i = 0, len = backingSet.length; i < len; ++i) { ++ Object temp = backingSet[i]; ++ if (!(temp instanceof EntityPlayer)) { ++ continue; ++ } ++ EntityPlayer player = (EntityPlayer)temp; ++ player.playerConnection.sendPacket(packet); ++ } ++ } ++ ++ return; ++ } ++ // Tuinity end - per player view distance + this.players.a(this.location, flag).forEach((entityplayer) -> { + entityplayer.playerConnection.sendPacket(packet); + }); +@@ -445,6 +524,10 @@ public class PlayerChunk { + fullChunk.playerChunk = PlayerChunk.this; + + ++ // Tuinity start - per player view distance implementation ++ PlayerChunk.this.broadcastChunk(); ++ PlayerChunk.this.chunkMap.getChunkMapDistanceManager().playerNoTickViewDistanceHandler.onChunkLoad(this.location.x, this.location.z); ++ // Tuinity end - per player view distance implementation + } + }); + // Paper end +@@ -473,7 +556,7 @@ public class PlayerChunk { + Chunk tickingChunk = either.left().get(); + PlayerChunk.this.isTickingReady = true; + +- ++ PlayerChunk.this.chunkMap.world.onChunkSetTicking(PlayerChunk.this.location.x, PlayerChunk.this.location.z); // Tuinity - rewrite ticklistserver + + + } +@@ -503,8 +586,19 @@ public class PlayerChunk { + PlayerChunk.this.isEntityTickingReady = true; + + ++ // Tuinity start - stop throwing garbage on the heap ++ ChunkProviderServer chunkProvider = PlayerChunk.this.chunkMap.world.getChunkProvider(); ++ if (chunkProvider.isTickingChunks) { ++ chunkProvider.pendingEntityTickingChunkChanges.put(entityTickingChunk, true); ++ } else { ++ chunkProvider.entityTickingChunks.add(entityTickingChunk); ++ } ++ // Tuinity end - stop throwing garbage on the heap + + ++ // Tuinity start - per player view distance implementation ++ PlayerChunk.this.chunkMap.getChunkMapDistanceManager().playerTickViewDistanceHandler.onChunkLoad(this.location.x, this.location.z); ++ // Tuinity end - per player view distance implementation + } + }); + // Paper end +@@ -513,6 +607,18 @@ public class PlayerChunk { + + if (flag6 && !flag7) { + this.entityTickingFuture.complete(PlayerChunk.UNLOADED_CHUNK); this.isEntityTickingReady = false; // Paper - cache chunk ticking stage ++ ++ // Tuinity start - stop throwing garbage on the heap ++ ChunkProviderServer chunkProvider = PlayerChunk.this.chunkMap.world.getChunkProvider(); ++ Chunk chunk = this.getFullChunkIfCached(); ++ if (chunk != null) { ++ if (chunkProvider.isTickingChunks) { ++ chunkProvider.pendingEntityTickingChunkChanges.put(chunk, false); ++ } else { ++ chunkProvider.entityTickingChunks.remove(chunk); ++ } ++ } ++ // Tuinity end - stop throwing garbage on the heap + this.entityTickingFuture = PlayerChunk.UNLOADED_CHUNK_FUTURE; + } + +diff --git a/src/main/java/net/minecraft/server/PlayerChunkMap.java b/src/main/java/net/minecraft/server/PlayerChunkMap.java +index 57bea926a..aa625ce2a 100644 +--- a/src/main/java/net/minecraft/server/PlayerChunkMap.java ++++ b/src/main/java/net/minecraft/server/PlayerChunkMap.java +@@ -55,8 +55,9 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d { + + private static final Logger LOGGER = LogManager.getLogger(); + public static final int GOLDEN_TICKET = 33 + ChunkStatus.b(); +- public final Long2ObjectLinkedOpenHashMap updatingChunks = new Long2ObjectLinkedOpenHashMap(); +- public volatile Long2ObjectLinkedOpenHashMap visibleChunks; ++ //public final Long2ObjectLinkedOpenHashMap updatingChunks = new Long2ObjectLinkedOpenHashMap(); // Tuinity - replace chunk map ++ //public volatile Long2ObjectLinkedOpenHashMap visibleChunks; // Tuinity - replace chunk map ++ public final com.tuinity.tuinity.chunk.QueuedChangesMapLong2Object chunkMap = new com.tuinity.tuinity.chunk.QueuedChangesMapLong2Object<>(8192, 0.7f); // Tuinity - replace chunk map + private final Long2ObjectLinkedOpenHashMap pendingUnload; + final LongSet loadedChunks; // Paper - private -> package + public final WorldServer world; +@@ -78,8 +79,8 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d { + private final PlayerMap playerMap; + public final Int2ObjectMap trackedEntities; + private final Queue z; +- int viewDistance; // Paper - private -> package private +- public final com.destroystokyo.paper.util.PlayerMobDistanceMap playerMobDistanceMap; // Paper ++ int viewDistance; public final int getViewDistance() { return this.viewDistance; } // Tuinity - OBFHELPER // Paper - private -> package private ++ //public final com.destroystokyo.paper.util.PlayerMobDistanceMap playerMobDistanceMap; // Paper // Tuinity - replaced by view distance map + + // CraftBukkit start - recursion-safe executor for Chunk loadCallback() and unloadCallback() + public final CallbackExecutor callbackExecutor = new CallbackExecutor(); +@@ -109,6 +110,93 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d { + // Paper start - distance maps + private final com.destroystokyo.paper.util.misc.PooledLinkedHashSets pooledLinkedPlayerHashSets = new com.destroystokyo.paper.util.misc.PooledLinkedHashSets<>(); + ++ // Tuinity start - per player view distance ++ int noTickViewDistance; ++ public final int getNoTickViewDistance() { ++ return this.noTickViewDistance; ++ } ++ // we use this map to broadcast chunks to clients ++ // they do not render chunks without having at least neighbours in a 1 chunk radius loaded ++ public final com.tuinity.tuinity.util.map.PlayerAreaMap playerViewDistanceBroadcastMap; ++ public final com.tuinity.tuinity.util.map.PlayerAreaMap playerViewDistanceTickMap; ++ public final com.tuinity.tuinity.util.map.PlayerAreaMap playerViewDistanceNoTickMap; ++ ++ public void updateViewDistance(EntityPlayer player, int viewDistance, int noTickViewDistance) { ++ player.viewDistance = viewDistance; ++ player.noTickViewDistance = noTickViewDistance; ++ ++ int chunkX = com.tuinity.tuinity.util.Util.getChunkCoordinate(player.locX()); ++ int chunkZ = com.tuinity.tuinity.util.Util.getChunkCoordinate(player.locZ()); ++ ++ int effectiveViewDistance = viewDistance == -1 ? this.viewDistance : viewDistance; ++ int effectiveNoTickViewDistance = Math.max(effectiveViewDistance, noTickViewDistance == -1 ? this.noTickViewDistance : noTickViewDistance); ++ ++ player.playerConnection.sendPacket(new PacketPlayOutViewDistance(effectiveNoTickViewDistance)); ++ ++ if (!this.cannotLoadChunks(player)) { ++ this.playerViewDistanceTickMap.update(player, chunkX, chunkZ, effectiveViewDistance); ++ this.playerViewDistanceNoTickMap.update(player, chunkX, chunkZ, effectiveNoTickViewDistance + 1); // clients need chunk neighbours ++ } ++ this.playerViewDistanceMap.update(player, chunkX, chunkZ, effectiveViewDistance); ++ player.needsChunkCenterUpdate = true; ++ this.playerViewDistanceBroadcastMap.update(player, chunkX, chunkZ, effectiveNoTickViewDistance + 1); // clients need chunk neighbours ++ player.needsChunkCenterUpdate = false; ++ // Tuinity start - optimise PlayerChunkMap#isOutsideRange ++ this.playerChunkTickRangeMap.update(player, chunkX, chunkZ, ChunkMapDistance.MOB_SPAWN_RANGE); ++ // Tuinity end - optimise PlayerChunkMap#isOutsideRange ++ ++ // Tuinity start - use distance map to optimise entity tracker ++ // force propagate tracker changes ++ if (this.playerEntityTrackerTrackMap != null) { ++ this.playerEntityTrackerTrackMap.update(player, chunkX, chunkZ, Math.min(this.entityTrackerTrackRange, effectiveViewDistance)); ++ this.playerEntityTrackerUntrackMap.update(player, chunkX, chunkZ, Math.min(this.entityTrackerUntrackRange, effectiveViewDistance)); ++ this.playerEntityTrackerLegacyMap.update(player, chunkX, chunkZ, this.entityTrackerLegacyMapRange); ++ } ++ // Tuinity end - use distance map to optimise entity tracker ++ } ++ // Tuinity end - per player view distance ++ ++ // Tuinity start - optimise PlayerChunkMap#isOutsideRange ++ // A note about the naming used here: ++ // Previously, mojang used a "spawn range" of 8 for controlling both ticking and ++ // mob spawn range. However, spigot makes the spawn range configurable by ++ // checking if the chunk is in the tick range (8) and the spawn range ++ // obviously this means a spawn range > 8 cannot be implemented ++ ++ // these maps are named after spigot's uses ++ public final com.tuinity.tuinity.util.map.PlayerAreaMap playerMobSpawnMap; // this map is absent from updateMaps since it's controlled at the start of a tick ++ public final com.tuinity.tuinity.util.map.PlayerAreaMap playerChunkTickRangeMap; ++ ++ // Tuinity end - optimise PlayerChunkMap#isOutsideRange ++ ++ // Tuinity start - use distance map to optimise entity tracker ++ public final com.tuinity.tuinity.util.map.PlayerAreaMap playerEntityTrackerTrackMap; ++ public final com.tuinity.tuinity.util.map.PlayerAreaMap playerEntityTrackerUntrackMap; ++ public final int entityTrackerTrackRange; ++ public final int entityTrackerUntrackRange; ++ ++ public final com.tuinity.tuinity.util.map.PlayerAreaMap playerEntityTrackerLegacyMap; ++ public final int entityTrackerLegacyMapRange; ++ ++ //public final com.tuinity.tuinity.util.EntityList activelyTrackedEntities; // TODO not yet ++ public final com.tuinity.tuinity.util.EntityList activelyTrackedEntitiesLegacy; ++ ++ public static boolean isLegacyTrackingEntity(Entity entity) { ++ return entity.isLegacyTrackingEntity; ++ } ++ ++ private static int getEntityTrackingChunkRange(int blockRange) { ++ int centerChunkRange = (blockRange - 8); // on average, players are in the middle of a chunk, so subtract 8 ++ return centerChunkRange >>> 4 + ((centerChunkRange & 15) != 0 ? 1 : 0); ++ } ++ // Tuinity end - use distance map to optimise entity tracker ++ ++ // Tuinity start - optimise getPlayersInRange type functions ++ public final com.tuinity.tuinity.util.map.PlayerAreaMap playerGeneralAreaMap; ++ public static final int PLAYER_GENERAL_AREA_MAP_DISTANCE = (32 + 3) + 1; ++ public static final int PLAYER_GENERAL_AREA_MAP_DISTANCE_SQUARED_BLOCKS = (16 * PLAYER_GENERAL_AREA_MAP_DISTANCE) * (16 * PLAYER_GENERAL_AREA_MAP_DISTANCE); ++ // Tuinity end - optimise getPlayersInRange type functions ++ + void addPlayerToDistanceMaps(EntityPlayer player) { + this.updateMaps(player); + +@@ -134,10 +222,91 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d { + + + // Paper end ++ // Tuinity start - distance maps ++ final com.tuinity.tuinity.util.map.PooledLinkedHashSets pooledEntityPlayerSets = new com.tuinity.tuinity.util.map.PooledLinkedHashSets<>(); ++ public final com.tuinity.tuinity.util.map.PlayerAreaMap playerViewDistanceMap; ++ ++ void addPlayerToDistanceMapsTuinity(EntityPlayer player) { ++ this.updateMapsTuinity(player); ++ ++ // Tuinity start - per player view distance ++ this.getChunkMapDistanceManager().playerTickViewDistanceHandler.addPlayer(player); ++ this.getChunkMapDistanceManager().playerNoTickViewDistanceHandler.addPlayer(player); ++ // Tuinity end - per player view distance ++ } ++ ++ void removePlayerFromDistanceMapsTuinity(EntityPlayer player) { ++ this.playerViewDistanceMap.remove(player); ++ // Tuinity start - per player view distance ++ this.playerViewDistanceBroadcastMap.remove(player); ++ this.playerViewDistanceTickMap.remove(player); ++ this.playerViewDistanceNoTickMap.remove(player); ++ this.getChunkMapDistanceManager().playerTickViewDistanceHandler.removePlayer(player); ++ this.getChunkMapDistanceManager().playerNoTickViewDistanceHandler.removePlayer(player); ++ // Tuinity end - per player view distance ++ ++ // Tuinity start - optimise PlayerChunkMap#isOutsideRange ++ this.playerMobSpawnMap.remove(player); ++ this.playerChunkTickRangeMap.remove(player); ++ // Tuinity end - optimise PlayerChunkMap#isOutsideRange ++ ++ // Tuinity start - use distance map to optimise entity tracker ++ if (this.playerEntityTrackerTrackMap != null) { ++ this.playerEntityTrackerTrackMap.remove(player); ++ this.playerEntityTrackerUntrackMap.remove(player); ++ this.playerEntityTrackerLegacyMap.remove(player); ++ } ++ // Tuinity end - use distance map to optimise entity tracker ++ ++ // Tuinity start - optimise getPlayersInRange type functions ++ this.playerGeneralAreaMap.remove(player); ++ // Tuinity end - optimise getPlayersInRange type functions ++ } ++ ++ void updateDistanceMapsTuinity(EntityPlayer player) { ++ this.updateMapsTuinity(player); ++ } ++ ++ private void updateMapsTuinity(EntityPlayer player) { ++ int chunkX = com.tuinity.tuinity.util.Util.getChunkCoordinate(player.locX()); ++ int chunkZ = com.tuinity.tuinity.util.Util.getChunkCoordinate(player.locZ()); ++ ++ this.playerViewDistanceMap.update(player, chunkX, chunkZ, player.getEffectiveViewDistance(this)); // Tuinity - per player view distance ++ ++ // Tuinity start - per player view distance ++ int effectiveViewDistance = player.getEffectiveViewDistance(this); ++ int effectiveNoTickViewDistance = Math.max(effectiveViewDistance, player.getEffectiveNoTickViewDistance(this)); ++ ++ if (!this.cannotLoadChunks(player)) { ++ this.playerViewDistanceTickMap.update(player, chunkX, chunkZ, effectiveViewDistance); ++ this.playerViewDistanceNoTickMap.update(player, chunkX, chunkZ, effectiveNoTickViewDistance + 1); // clients need chunk neighbours ++ } ++ player.needsChunkCenterUpdate = true; ++ this.playerViewDistanceBroadcastMap.update(player, chunkX, chunkZ, effectiveNoTickViewDistance + 1); // clients need chunk neighbours ++ player.needsChunkCenterUpdate = false; ++ // Tuinity end - per player view distance ++ ++ // Tuinity start - optimise PlayerChunkMap#isOutsideRange ++ this.playerChunkTickRangeMap.update(player, chunkX, chunkZ, ChunkMapDistance.MOB_SPAWN_RANGE); ++ // Tuinity end - optimise PlayerChunkMap#isOutsideRange ++ ++ // Tuinity start - use distance map to optimise entity tracker ++ if (this.playerEntityTrackerTrackMap != null) { ++ this.playerEntityTrackerTrackMap.update(player, chunkX, chunkZ, Math.min(this.entityTrackerTrackRange, effectiveViewDistance)); ++ this.playerEntityTrackerUntrackMap.update(player, chunkX, chunkZ, Math.min(this.entityTrackerUntrackRange, effectiveViewDistance)); ++ this.playerEntityTrackerLegacyMap.update(player, chunkX, chunkZ, this.entityTrackerLegacyMapRange); ++ } ++ // Tuinity end - use distance map to optimise entity tracker ++ ++ // Tuinity start - optimise getPlayersInRange type functions ++ this.playerGeneralAreaMap.update(player, chunkX, chunkZ, PLAYER_GENERAL_AREA_MAP_DISTANCE); ++ // Tuinity end - optimise getPlayersInRange type functions ++ } ++ // Tuinity end + + public PlayerChunkMap(WorldServer worldserver, File file, DataFixer datafixer, DefinedStructureManager definedstructuremanager, Executor executor, IAsyncTaskHandler iasynctaskhandler, ILightAccess ilightaccess, ChunkGenerator chunkgenerator, WorldLoadListener worldloadlistener, Supplier supplier, int i) { + super(new File(worldserver.getWorldProvider().getDimensionManager().a(file), "region"), datafixer); +- this.visibleChunks = this.updatingChunks.clone(); ++ //this.visibleChunks = this.updatingChunks.clone(); // Tuinity - replace chunk map + this.pendingUnload = new Long2ObjectLinkedOpenHashMap(); + this.loadedChunks = new LongOpenHashSet(); + this.unloadQueue = new LongOpenHashSet(); +@@ -166,7 +335,188 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d { + this.l = supplier; + this.m = new VillagePlace(new File(this.w, "poi"), datafixer, this.world); // Paper + this.setViewDistance(i); +- this.playerMobDistanceMap = this.world.paperConfig.perPlayerMobSpawns ? new com.destroystokyo.paper.util.PlayerMobDistanceMap() : null; // Paper ++ // Tuinity start - distance maps ++ //this.playerMobDistanceMap = this.world.paperConfig.perPlayerMobSpawns ? new com.destroystokyo.paper.util.PlayerMobDistanceMap() : null; // Paper ++ com.tuinity.tuinity.util.map.PooledLinkedHashSets sets = this.pooledEntityPlayerSets; ++ this.playerViewDistanceMap = new com.tuinity.tuinity.util.map.PlayerAreaMap(sets); ++ // Tuinity end - distance maps ++ // Tuinity start - per player view distance ++ this.setNoTickViewDistance(this.world.tuinityConfig.noTickViewDistance < 0 ? this.viewDistance : this.world.tuinityConfig.noTickViewDistance); ++ this.playerViewDistanceTickMap = new com.tuinity.tuinity.util.map.PlayerAreaMap(sets, ++ null, ++ (EntityPlayer player, int rangeX, int rangeZ, int currPosX, int currPosZ, int prevPosX, int prevPosZ, ++ com.tuinity.tuinity.util.map.PooledLinkedHashSets.PooledObjectLinkedOpenHashSet newState) -> { ++ if (newState != null) { ++ return; ++ } ++ PlayerChunkMap.this.chunkDistanceManager.playerTickViewDistanceHandler.playerMoveOutOfRange(rangeX, rangeZ); ++ }); ++ this.chunkDistanceManager.playerTickViewDistanceHandler.areaMap = this.playerViewDistanceTickMap; ++ this.playerViewDistanceNoTickMap = new com.tuinity.tuinity.util.map.PlayerAreaMap(sets, ++ null, ++ (EntityPlayer player, int rangeX, int rangeZ, int currPosX, int currPosZ, int prevPosX, int prevPosZ, ++ com.tuinity.tuinity.util.map.PooledLinkedHashSets.PooledObjectLinkedOpenHashSet newState) -> { ++ if (newState != null) { ++ return; ++ } ++ PlayerChunkMap.this.chunkDistanceManager.playerNoTickViewDistanceHandler.playerMoveOutOfRange(rangeX, rangeZ); ++ }); ++ this.chunkDistanceManager.playerNoTickViewDistanceHandler.areaMap = this.playerViewDistanceNoTickMap; ++ final Packet[] tempPacket = new Packet[2]; ++ this.playerViewDistanceBroadcastMap = new com.tuinity.tuinity.util.map.PlayerAreaMap(sets, ++ (EntityPlayer player, int rangeX, int rangeZ, int currPosX, int currPosZ, int prevPosX, int prevPosZ, ++ com.tuinity.tuinity.util.map.PooledLinkedHashSets.PooledObjectLinkedOpenHashSet newState) -> { ++ if (player.needsChunkCenterUpdate) { ++ player.needsChunkCenterUpdate = false; ++ player.playerConnection.sendPacket(new PacketPlayOutViewCentre(currPosX, currPosZ)); ++ } ++ PlayerChunkMap.this.sendChunk(player, rangeX, rangeZ, tempPacket, false, true); // unloaded, loaded ++ java.util.Arrays.fill(tempPacket, null); ++ }, ++ (EntityPlayer player, int rangeX, int rangeZ, int currPosX, int currPosZ, int prevPosX, int prevPosZ, ++ com.tuinity.tuinity.util.map.PooledLinkedHashSets.PooledObjectLinkedOpenHashSet newState) -> { ++ PlayerChunkMap.this.sendChunk(player, rangeX, rangeZ, tempPacket, true, false); // unloaded, loaded ++ java.util.Arrays.fill(tempPacket, null); ++ }); ++ // Tuinity end - per player view distance ++ ++ // Tuinity start - optimise PlayerChunkMap#isOutsideRange ++ this.playerChunkTickRangeMap = new com.tuinity.tuinity.util.map.PlayerAreaMap(sets, ++ (EntityPlayer player, int rangeX, int rangeZ, int currPosX, int currPosZ, int prevPosX, int prevPosZ, ++ com.tuinity.tuinity.util.map.PooledLinkedHashSets.PooledObjectLinkedOpenHashSet newState) -> { ++ PlayerChunk playerChunk = PlayerChunkMap.this.getUpdatingChunk(com.tuinity.tuinity.util.Util.getCoordinateKey(rangeX, rangeZ)); ++ if (playerChunk != null) { ++ playerChunk.playersInChunkTickRange = newState; ++ } ++ }, ++ (EntityPlayer player, int rangeX, int rangeZ, int currPosX, int currPosZ, int prevPosX, int prevPosZ, ++ com.tuinity.tuinity.util.map.PooledLinkedHashSets.PooledObjectLinkedOpenHashSet newState) -> { ++ PlayerChunk playerChunk = PlayerChunkMap.this.getUpdatingChunk(com.tuinity.tuinity.util.Util.getCoordinateKey(rangeX, rangeZ)); ++ if (playerChunk != null) { ++ playerChunk.playersInChunkTickRange = newState; ++ } ++ }); ++ this.playerMobSpawnMap = new com.tuinity.tuinity.util.map.PlayerAreaMap(sets, ++ (EntityPlayer player, int rangeX, int rangeZ, int currPosX, int currPosZ, int prevPosX, int prevPosZ, ++ com.tuinity.tuinity.util.map.PooledLinkedHashSets.PooledObjectLinkedOpenHashSet newState) -> { ++ PlayerChunk playerChunk = PlayerChunkMap.this.getUpdatingChunk(com.tuinity.tuinity.util.Util.getCoordinateKey(rangeX, rangeZ)); ++ if (playerChunk != null) { ++ playerChunk.playersInMobSpawnRange = newState; ++ } ++ }, ++ (EntityPlayer player, int rangeX, int rangeZ, int currPosX, int currPosZ, int prevPosX, int prevPosZ, ++ com.tuinity.tuinity.util.map.PooledLinkedHashSets.PooledObjectLinkedOpenHashSet newState) -> { ++ PlayerChunk playerChunk = PlayerChunkMap.this.getUpdatingChunk(com.tuinity.tuinity.util.Util.getCoordinateKey(rangeX, rangeZ)); ++ if (playerChunk != null) { ++ playerChunk.playersInMobSpawnRange = newState; ++ } ++ }); ++ // Tuinity end ++ ++ // Tuinity start - use distance map to optimise entity tracker ++ if (!this.world.tuinityConfig.useOptimizedTracker) { ++ this.playerEntityTrackerTrackMap = null; ++ this.playerEntityTrackerUntrackMap = null; ++ this.playerEntityTrackerLegacyMap = null; ++ this.entityTrackerTrackRange = -1; ++ this.entityTrackerUntrackRange = -1; ++ this.entityTrackerLegacyMapRange = -1; ++ ++ this.activelyTrackedEntitiesLegacy = null; ++ } else { ++ this.activelyTrackedEntitiesLegacy = new com.tuinity.tuinity.util.EntityList(); ++ ++ // avoid player range, that's special-cased ++ int maxEntityTrackRange = this.world.spigotConfig.animalTrackingRange; ++ if (this.world.spigotConfig.monsterTrackingRange > maxEntityTrackRange) { ++ maxEntityTrackRange = this.world.spigotConfig.monsterTrackingRange; ++ } ++ if (this.world.spigotConfig.miscTrackingRange > maxEntityTrackRange) { ++ maxEntityTrackRange = this.world.spigotConfig.miscTrackingRange; ++ } ++ if (this.world.spigotConfig.otherTrackingRange > maxEntityTrackRange) { ++ maxEntityTrackRange = this.world.spigotConfig.otherTrackingRange; ++ } ++ maxEntityTrackRange = (maxEntityTrackRange >> 4) + ((maxEntityTrackRange & 15) != 0 ? 2 : 1); ++ ++ if (this.world.tuinityConfig.optimizedTrackerTrackRange == -1) { ++ this.entityTrackerTrackRange = Math.max(1, maxEntityTrackRange - 2); ++ this.entityTrackerUntrackRange = Math.max(2, maxEntityTrackRange - 1); ++ } else { ++ this.entityTrackerTrackRange = this.world.tuinityConfig.optimizedTrackerTrackRange; ++ this.entityTrackerUntrackRange = this.world.tuinityConfig.optimizedTrackerUntrackRange; ++ } ++ ++ this.playerEntityTrackerTrackMap = new com.tuinity.tuinity.util.map.PlayerAreaMap(sets, ++ (EntityPlayer player, int rangeX, int rangeZ, int currPosX, int currPosZ, int prevPosX, int prevPosZ, ++ com.tuinity.tuinity.util.map.PooledLinkedHashSets.PooledObjectLinkedOpenHashSet newState) -> { ++ Chunk chunk = PlayerChunkMap.this.world.getChunkProvider().getChunkAtIfCachedImmediately(rangeX, rangeZ); ++ if (chunk == null) { ++ return; ++ } ++ Entity[] entities = chunk.entities.getRawData(); ++ for (int index = 0, len = chunk.entities.size(); index < len; ++index) { ++ Entity entity = entities[index]; ++ if (entity.tracker == null) { ++ entity.addToTrackQueue(player); ++ } else { ++ entity.tracker.updateTrackingPlayer(player); ++ entity.clearTrackingQueues(player); ++ } ++ } ++ }, ++ null); ++ this.playerEntityTrackerUntrackMap = new com.tuinity.tuinity.util.map.PlayerAreaMap(sets, ++ null, ++ (EntityPlayer player, int rangeX, int rangeZ, int currPosX, int currPosZ, int prevPosX, int prevPosZ, ++ com.tuinity.tuinity.util.map.PooledLinkedHashSets.PooledObjectLinkedOpenHashSet newState) -> { ++ Chunk chunk = PlayerChunkMap.this.world.getChunkProvider().getChunkAtIfCachedImmediately(rangeX, rangeZ); ++ if (chunk == null) { ++ return; ++ } ++ Entity[] entities = chunk.entities.getRawData(); ++ for (int index = 0, len = chunk.entities.size(); index < len; ++index) { ++ Entity entity = entities[index]; ++ if (entity.tracker == null) { ++ return; // not tracked by player for sure ++ } ++ entity.tracker.removeTrackingPlayer(player); ++ entity.clearTrackingQueues(player); ++ } ++ }); ++ ++ // legacy tracker ++ ++ // TODO check on update ++ int legacyTrackerRange = 10 * 16; // Ender dragon range ++ if (legacyTrackerRange < this.world.spigotConfig.playerTrackingRange) { ++ legacyTrackerRange = this.world.spigotConfig.playerTrackingRange; ++ } ++ ++ int legacyTrackerChunkRange = legacyTrackerRange >>> 4 + ((legacyTrackerRange & 15) != 0 ? 1 : 0); ++ this.entityTrackerLegacyMapRange = legacyTrackerChunkRange; ++ this.playerEntityTrackerLegacyMap = new com.tuinity.tuinity.util.map.PlayerAreaMap(sets, ++ (EntityPlayer player, int rangeX, int rangeZ, int currPosX, int currPosZ, int prevPosX, int prevPosZ, ++ com.tuinity.tuinity.util.map.PooledLinkedHashSets.PooledObjectLinkedOpenHashSet newState) -> { ++ Chunk chunk = PlayerChunkMap.this.world.getChunkProvider().getChunkAtIfLoadedMainThreadNoCache(rangeX, rangeZ); ++ if (chunk == null || newState.size() != 1) { ++ return; ++ } ++ Entity[] entities = chunk.entities.getRawData(); ++ for (int index = 0, len = chunk.entities.size(); index < len; ++index) { ++ Entity entity = entities[index]; ++ if (!PlayerChunkMap.isLegacyTrackingEntity(entity)) { ++ continue; ++ } ++ PlayerChunkMap.this.activelyTrackedEntitiesLegacy.add(entity); // tracker tick propagates entity ++ } ++ }, ++ null); // tracker tick handles entities moving out of range ++ } ++ // Tuinity end - use distance map to optimise entity tracker ++ // Tuinity start - optimise getPlayersInRange type functions ++ this.playerGeneralAreaMap = new com.tuinity.tuinity.util.map.PlayerAreaMap(sets); ++ // Tuinity end - optimise getPlayersInRange type functions + } + + public void updatePlayerMobTypeMap(Entity entity) { +@@ -177,15 +527,30 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d { + int chunkZ = (int)Math.floor(entity.locZ()) >> 4; + int index = entity.getEntityType().getEnumCreatureType().ordinal(); + +- for (EntityPlayer player : this.playerMobDistanceMap.getPlayersInRange(chunkX, chunkZ)) { ++ // Tuinity start - use view distance map ++ com.tuinity.tuinity.util.map.PooledLinkedHashSets.PooledObjectLinkedOpenHashSet players = this.playerViewDistanceMap.getObjectsInRange(chunkX, chunkZ); ++ if (players != null) { ++ Object[] backingSet = players.getBackingSet(); ++ for (int i = 0, len = backingSet.length; i < len; ++i) { ++ Object temp = backingSet[i]; ++ if (!(temp instanceof EntityPlayer)) { ++ continue; ++ } ++ EntityPlayer player = (EntityPlayer)temp; ++ if (player.isSpectator() || !player.affectsSpawning) { ++ continue; ++ } ++ // Tuinity end - use view distance map + ++player.mobCounts[index]; + } ++ } // Tuinity - use view distance map + } + + public int getMobCountNear(EntityPlayer entityPlayer, EnumCreatureType enumCreatureType) { + return entityPlayer.mobCounts[enumCreatureType.ordinal()]; + } + ++ private static double getDistanceSquaredFromChunk(ChunkCoordIntPair chunkPos, Entity entity) { return a(chunkPos, entity); } // Tuinity - OBFHELPER + private static double a(ChunkCoordIntPair chunkcoordintpair, Entity entity) { + double d0 = (double) (chunkcoordintpair.x * 16 + 8); + double d1 = (double) (chunkcoordintpair.z * 16 + 8); +@@ -213,8 +578,13 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d { + } + + private static int a(ChunkCoordIntPair chunkcoordintpair, int i, int j) { +- int k = chunkcoordintpair.x - i; +- int l = chunkcoordintpair.z - j; ++ // Tuinity start - remove ChunkCoordIntPair allocation ++ return getSquareRadiusDistance(chunkcoordintpair.x, chunkcoordintpair.z, i, j); ++ } ++ private static int getSquareRadiusDistance(int chunkX0, int chunkZ0, int i, int j) { ++ int k = chunkX0 - i; ++ int l = chunkZ0 - j; ++ // Tuinity end + + return Math.max(Math.abs(k), Math.abs(l)); + } +@@ -225,12 +595,17 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d { + + @Nullable + protected PlayerChunk getUpdatingChunk(long i) { +- return (PlayerChunk) this.updatingChunks.get(i); ++ return (PlayerChunk) this.chunkMap.getUpdating(i); // Tuinity - replace chunk map + } + + @Nullable + public PlayerChunk getVisibleChunk(long i) { // Paper - protected -> public +- return (PlayerChunk) this.visibleChunks.get(i); ++ // Tuinity start - replace chunk map ++ if (MinecraftServer.getServer().serverThread == Thread.currentThread()) { ++ return this.chunkMap.getVisible(i); ++ } ++ return (PlayerChunk) this.chunkMap.getVisibleAsync(i); ++ // Tuinity end - replace chunk map + } + + protected IntSupplier c(long i) { +@@ -308,6 +683,7 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d { + + @Nullable + private PlayerChunk a(long i, int j, @Nullable PlayerChunk playerchunk, int k) { ++ com.tuinity.tuinity.util.TickThread.softEnsureTickThread("Chunk holder update"); // Tuinity + if (k > PlayerChunkMap.GOLDEN_TICKET && j > PlayerChunkMap.GOLDEN_TICKET) { + return playerchunk; + } else { +@@ -327,11 +703,12 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d { + playerchunk = (PlayerChunk) this.pendingUnload.remove(i); + if (playerchunk != null) { + playerchunk.a(j); ++ playerchunk.updateRanges(); // Tuinity - optimise isOutsideOfRange + } else { + playerchunk = new PlayerChunk(new ChunkCoordIntPair(i), j, this.lightEngine, this.p, this); + } + +- this.updatingChunks.put(i, playerchunk); ++ this.chunkMap.queueUpdate(i, playerchunk); // Tuinity - replace chunk map + this.updatingChunksModified = true; + } + +@@ -411,7 +788,7 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d { + + protected void save(boolean flag) { + if (flag) { +- List list = (List) this.visibleChunks.values().stream().filter(PlayerChunk::hasBeenLoaded).peek(PlayerChunk::m).collect(Collectors.toList()); ++ List list = (List) this.chunkMap.getVisibleValues().stream().filter(PlayerChunk::hasBeenLoaded).peek(PlayerChunk::m).collect(Collectors.toList()); // Tuinity - replace chunk map + MutableBoolean mutableboolean = new MutableBoolean(); + + do { +@@ -439,7 +816,7 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d { + // this.i(); // Paper - nuke IOWorker + PlayerChunkMap.LOGGER.info("ThreadedAnvilChunkStorage ({}): All chunks are saved", this.w.getName()); + } else { +- this.visibleChunks.values().stream().filter(PlayerChunk::hasBeenLoaded).forEach((playerchunk) -> { ++ this.chunkMap.getVisibleValues().stream().filter(PlayerChunk::hasBeenLoaded).forEach((playerchunk) -> { // Tuinity - replace chunk map + IChunkAccess ichunkaccess = (IChunkAccess) playerchunk.getChunkSave().getNow(null); // CraftBukkit - decompile error + + if (ichunkaccess instanceof ProtoChunkExtension || ichunkaccess instanceof Chunk) { +@@ -482,7 +859,7 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d { + while (longiterator.hasNext()) { // Spigot + long j = longiterator.nextLong(); + longiterator.remove(); // Spigot +- PlayerChunk playerchunk = (PlayerChunk) this.updatingChunks.remove(j); ++ PlayerChunk playerchunk = (PlayerChunk) this.chunkMap.queueRemove(j); // Tuinity - replace chunk map + + if (playerchunk != null) { + this.pendingUnload.put(j, playerchunk); +@@ -610,7 +987,7 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d { + if (!this.updatingChunksModified) { + return false; + } else { +- this.visibleChunks = this.updatingChunks.clone(); ++ this.chunkMap.performUpdates(); // Tuinity - replace chunk map + this.updatingChunksModified = false; + return true; + } +@@ -903,11 +1280,7 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d { + completablefuture1.thenAcceptAsync((either) -> { + either.mapLeft((chunk) -> { + this.u.getAndIncrement(); +- Packet[] apacket = new Packet[2]; +- +- this.a(chunkcoordintpair, false).forEach((entityplayer) -> { +- this.a(entityplayer, apacket, chunk); +- }); ++ // Tuinity - per player view distance - moved to full chunk load, instead of ticking load + return Either.left(chunk); + }); + }, (runnable) -> { +@@ -1011,58 +1384,70 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d { + } // Paper + } + +- protected void setViewDistance(int i) { +- int j = MathHelper.clamp(i + 1, 3, 33); ++ public void setViewDistance(int i) { // Tuinity - make public ++ int j = MathHelper.clamp(i + 1, 3, 33) - 1; // Tuinity - we correctly handle view distance, no need to add 1 + + if (j != this.viewDistance) { + int k = this.viewDistance; + + this.viewDistance = j; +- this.chunkDistanceManager.a(this.viewDistance); +- ObjectIterator objectiterator = this.updatingChunks.values().iterator(); +- +- while (objectiterator.hasNext()) { +- PlayerChunk playerchunk = (PlayerChunk) objectiterator.next(); +- ChunkCoordIntPair chunkcoordintpair = playerchunk.i(); +- Packet[] apacket = new Packet[2]; ++ this.chunkDistanceManager.setGlobalViewDistance(this.viewDistance, this); // Tuinity - per player view distance ++ // Tuinity start - view distance map handles this ++ if (this.world != null && this.world.players != null) { // ... called inside constructor, where these may not be initialized ++ for (EntityPlayer player : this.world.players) { ++ this.updateViewDistance(player, player.getRawViewDistance(), player.getRawNoTickViewDistance()); ++ } ++ } ++ // Tuinity end - view distance map handles this ++ } + +- this.a(chunkcoordintpair, false).forEach((entityplayer) -> { +- int l = b(chunkcoordintpair, entityplayer, true); +- boolean flag = l <= k; +- boolean flag1 = l <= this.viewDistance; ++ } + +- this.sendChunk(entityplayer, chunkcoordintpair, apacket, flag, flag1); +- }); ++ // Tuinity start - no ticket view distance ++ public void setNoTickViewDistance(int noTickViewDistance) { ++ // modeled after the above ++ noTickViewDistance = MathHelper.clamp(noTickViewDistance, 2, 32); ++ if (this.noTickViewDistance != noTickViewDistance) { ++ this.noTickViewDistance = noTickViewDistance; ++ if (this.world != null && this.world.players != null) { // ... called inside constructor, where these may not be initialized ++ for (EntityPlayer player : this.world.players) { ++ this.updateViewDistance(player, player.getRawViewDistance(), player.getRawNoTickViewDistance()); ++ } + } + } +- + } ++ // Tuinity end + + protected void sendChunk(EntityPlayer entityplayer, ChunkCoordIntPair chunkcoordintpair, Packet[] apacket, boolean flag, boolean flag1) { ++ // Tuinity start - remove ChunkCoordIntPair allocation, use two ints instead of ChunkCoordIntPair ++ this.sendChunk(entityplayer, chunkcoordintpair.x, chunkcoordintpair.z, apacket, flag, flag1); ++ } ++ protected void sendChunk(EntityPlayer entityplayer, int chunkX, int chunkZ, Packet[] apacket, boolean flag, boolean flag1) { ++ // Tuinity end + if (entityplayer.world == this.world) { + if (flag1 && !flag) { +- PlayerChunk playerchunk = this.getVisibleChunk(chunkcoordintpair.pair()); ++ PlayerChunk playerchunk = this.getVisibleChunk(ChunkCoordIntPair.pair(chunkX, chunkZ)); // Tuinity - remove ChunkCoordIntPair allocation + + if (playerchunk != null) { +- Chunk chunk = playerchunk.getChunk(); ++ Chunk chunk = playerchunk.getFullReadyChunk(); // Tuinity - per player view distance + + if (chunk != null) { + this.a(entityplayer, apacket, chunk); + } + +- PacketDebug.a(this.world, chunkcoordintpair); ++ //PacketDebug.a(this.world, chunkcoordintpair); // Tuinity - remove ChunkCoordIntPair allocation (this function is a no-op) + } + } + + if (!flag1 && flag) { +- entityplayer.a(chunkcoordintpair); ++ entityplayer.sendChunkUnload(chunkX, chunkZ); // Tuinity - remove ChunkCoordIntPair allocation + } + + } + } + + public int d() { +- return this.visibleChunks.size(); ++ return this.chunkMap.getVisibleSizeAsync(); // Tuinity - replace chunk map + } + + protected PlayerChunkMap.a e() { +@@ -1070,12 +1455,12 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d { + } + + protected Iterable f() { +- return Iterables.unmodifiableIterable(this.visibleChunks.values()); ++ return Iterables.unmodifiableIterable(this.chunkMap.getUpdatingValuesCopy()); // Tuinity - replace chunk map + } + + void a(Writer writer) throws IOException { + CSVWriter csvwriter = CSVWriter.a().a("x").a("z").a("level").a("in_memory").a("status").a("full_status").a("accessible_ready").a("ticking_ready").a("entity_ticking_ready").a("ticket").a("spawning").a("entity_count").a("block_entity_count").a(writer); +- ObjectBidirectionalIterator objectbidirectionaliterator = this.visibleChunks.long2ObjectEntrySet().iterator(); ++ ObjectBidirectionalIterator objectbidirectionaliterator = this.chunkMap.getVisibleMap().long2ObjectEntrySet().iterator(); // Tuinity - replace chunk map + + while (objectbidirectionaliterator.hasNext()) { + Entry entry = (Entry) objectbidirectionaliterator.next(); +@@ -1265,31 +1650,53 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d { + return isOutsideOfRange(chunkcoordintpair, false); + } + +- boolean isOutsideOfRange(ChunkCoordIntPair chunkcoordintpair, boolean reducedRange) { +- int chunkRange = world.spigotConfig.mobSpawnRange; +- chunkRange = (chunkRange > world.spigotConfig.viewDistance) ? (byte) world.spigotConfig.viewDistance : chunkRange; +- chunkRange = (chunkRange > 8) ? 8 : chunkRange; ++ // Tuinity start ++ final boolean isOutsideOfRange(ChunkCoordIntPair chunkcoordintpair, boolean reducedRange) { ++ return this.isOutsideOfRange(this.getUpdatingChunk(chunkcoordintpair.pair()), chunkcoordintpair, reducedRange); ++ } + +- final int finalChunkRange = chunkRange; // Paper for lambda below +- //double blockRange = (reducedRange) ? Math.pow(chunkRange << 4, 2) : 16384.0D; // Paper - use from event +- // Spigot end +- long i = chunkcoordintpair.pair(); ++ final boolean isOutsideOfRange(PlayerChunk playerchunk, ChunkCoordIntPair chunkcoordintpair, boolean reducedRange) { ++ com.tuinity.tuinity.util.map.PooledLinkedHashSets.PooledObjectLinkedOpenHashSet playersInRange = reducedRange ? playerchunk.playersInMobSpawnRange : playerchunk.playersInChunkTickRange; + +- return !this.chunkDistanceManager.d(i) ? true : this.playerMap.a(i).noneMatch((entityplayer) -> { +- // Paper start - +- com.destroystokyo.paper.event.entity.PlayerNaturallySpawnCreaturesEvent event; +- double blockRange = 16384.0D; +- if (reducedRange) { +- event = entityplayer.playerNaturallySpawnedEvent; +- if (event == null || event.isCancelled()) return false; +- blockRange = (double) ((event.getSpawnRadius() << 4) * (event.getSpawnRadius() << 4)); +- } ++ if (playersInRange == null) { ++ return true; ++ } + +- return (!entityplayer.isSpectator() && a(chunkcoordintpair, (Entity) entityplayer) < blockRange); // Spigot +- // Paper end +- }); ++ Object[] backingSet = playersInRange.getBackingSet(); ++ ++ if (reducedRange) { ++ for (int i = 0, len = backingSet.length; i < len; ++i) { ++ Object raw = backingSet[i]; ++ if (!(raw instanceof EntityPlayer)) { ++ continue; ++ } ++ EntityPlayer player = (EntityPlayer) raw; ++ // don't check spectator and whatnot, already handled by mob spawn map update ++ if (player.lastEntitySpawnRadiusSquared > getDistanceSquaredFromChunk(chunkcoordintpair, player)) { ++ return false; // in range ++ } ++ } ++ } else { ++ final double range = (ChunkMapDistance.MOB_SPAWN_RANGE * 16) * (ChunkMapDistance.MOB_SPAWN_RANGE * 16); ++ // before spigot, mob spawn range was actually mob spawn range + tick range, but it was split ++ for (int i = 0, len = backingSet.length; i < len; ++i) { ++ Object raw = backingSet[i]; ++ if (!(raw instanceof EntityPlayer)) { ++ continue; ++ } ++ EntityPlayer player = (EntityPlayer) raw; ++ // don't check spectator and whatnot, already handled by mob spawn map update ++ if (range > getDistanceSquaredFromChunk(chunkcoordintpair, player)) { ++ return false; // in range ++ } ++ } ++ } ++ // no players in range ++ return true; + } ++ // Tuinity end + ++ private boolean cannotLoadChunks(EntityPlayer entityplayer) { return this.b(entityplayer); } // Tuinity - OBFHELPER + private boolean b(EntityPlayer entityplayer) { + return entityplayer.isSpectator() && !this.world.getGameRules().getBoolean(GameRules.SPECTATORS_GENERATE_CHUNKS); + } +@@ -1315,13 +1722,11 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d { + } + } + +- for (int k = i - this.viewDistance; k <= i + this.viewDistance; ++k) { +- for (int l = j - this.viewDistance; l <= j + this.viewDistance; ++l) { +- ChunkCoordIntPair chunkcoordintpair = new ChunkCoordIntPair(k, l); +- +- this.sendChunk(entityplayer, chunkcoordintpair, new Packet[2], !flag, flag); +- } ++ // Tuinity start - view distance map handles this ++ if (flag) { ++ this.updateMaps(entityplayer); + } ++ // Tuinity end - view distance map handles this + + } + +@@ -1329,11 +1734,12 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d { + SectionPosition sectionposition = SectionPosition.a((Entity) entityplayer); + + entityplayer.a(sectionposition); +- entityplayer.playerConnection.sendPacket(new PacketPlayOutViewCentre(sectionposition.a(), sectionposition.c())); ++ //entityplayer.playerConnection.sendPacket(new PacketPlayOutViewCentre(sectionposition.a(), sectionposition.c())); // Tuinity - distance map handles this now + return sectionposition; + } + + public void movePlayer(EntityPlayer entityplayer) { ++ if (this.playerEntityTrackerTrackMap == null) { // Tuinity - optimized tracker + ObjectIterator objectiterator = this.trackedEntities.values().iterator(); + + while (objectiterator.hasNext()) { +@@ -1345,6 +1751,7 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d { + playerchunkmap_entitytracker.updatePlayer(entityplayer); + } + } ++ } // Tuinity - optimized tracker + + int i = MathHelper.floor(entityplayer.locX()) >> 4; + int j = MathHelper.floor(entityplayer.locZ()) >> 4; +@@ -1384,56 +1791,53 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d { + int k1; + int l1; + +- if (Math.abs(i1 - i) <= this.viewDistance * 2 && Math.abs(j1 - j) <= this.viewDistance * 2) { +- k1 = Math.min(i, i1) - this.viewDistance; +- l1 = Math.min(j, j1) - this.viewDistance; +- int i2 = Math.max(i, i1) + this.viewDistance; +- int j2 = Math.max(j, j1) + this.viewDistance; ++ this.updateMaps(entityplayer); // Paper - distance maps ++ this.updateDistanceMapsTuinity(entityplayer); // Tuinity - distance maps ++ } + +- for (int k2 = k1; k2 <= i2; ++k2) { +- for (int l2 = l1; l2 <= j2; ++l2) { +- ChunkCoordIntPair chunkcoordintpair = new ChunkCoordIntPair(k2, l2); +- boolean flag3 = a(chunkcoordintpair, i1, j1) <= this.viewDistance; +- boolean flag4 = a(chunkcoordintpair, i, j) <= this.viewDistance; ++ @Override ++ public Stream a(ChunkCoordIntPair chunkcoordintpair, boolean flag) { ++ // Tuinity start - per player view distance ++ // there can be potential desync with player's last mapped section and the view distance map, so use the ++ // view distance map here. ++ com.tuinity.tuinity.util.map.PooledLinkedHashSets.PooledObjectLinkedOpenHashSet inRange = this.playerViewDistanceBroadcastMap.getObjectsInRange(chunkcoordintpair); ++ ++ if (inRange == null) { ++ return Stream.empty(); ++ } ++ // all current cases are inlined so we wont hit this code, it's just in case plugins or future updates use it ++ List players = new ArrayList<>(); ++ Object[] backingSet = inRange.getBackingSet(); ++ ++ if (flag) { // flag -> border only ++ for (int i = 0, len = backingSet.length; i < len; ++i) { ++ Object temp = backingSet[i]; ++ if (!(temp instanceof EntityPlayer)) { ++ continue; ++ } ++ EntityPlayer player = (EntityPlayer)temp; ++ int viewDistance = this.playerViewDistanceBroadcastMap.getLastViewDistance(player); ++ long lastPosition = this.playerViewDistanceBroadcastMap.getLastCoordinate(player); ++ ++ int distX = Math.abs(com.tuinity.tuinity.util.Util.getCoordinateX(lastPosition) - chunkcoordintpair.x); ++ int distZ = Math.abs(com.tuinity.tuinity.util.Util.getCoordinateZ(lastPosition) - chunkcoordintpair.z); + +- this.sendChunk(entityplayer, chunkcoordintpair, new Packet[2], flag3, flag4); ++ if (Math.max(distX, distZ) == viewDistance) { ++ players.add(player); + } + } + } else { +- ChunkCoordIntPair chunkcoordintpair1; +- boolean flag5; +- boolean flag6; +- +- for (k1 = i1 - this.viewDistance; k1 <= i1 + this.viewDistance; ++k1) { +- for (l1 = j1 - this.viewDistance; l1 <= j1 + this.viewDistance; ++l1) { +- chunkcoordintpair1 = new ChunkCoordIntPair(k1, l1); +- flag5 = true; +- flag6 = false; +- this.sendChunk(entityplayer, chunkcoordintpair1, new Packet[2], true, false); +- } +- } +- +- for (k1 = i - this.viewDistance; k1 <= i + this.viewDistance; ++k1) { +- for (l1 = j - this.viewDistance; l1 <= j + this.viewDistance; ++l1) { +- chunkcoordintpair1 = new ChunkCoordIntPair(k1, l1); +- flag5 = false; +- flag6 = true; +- this.sendChunk(entityplayer, chunkcoordintpair1, new Packet[2], false, true); ++ for (int i = 0, len = backingSet.length; i < len; ++i) { ++ Object temp = backingSet[i]; ++ if (!(temp instanceof EntityPlayer)) { ++ continue; + } ++ EntityPlayer player = (EntityPlayer)temp; ++ players.add(player); + } + } + +- this.updateMaps(entityplayer); // Paper - distance maps +- +- } +- +- @Override +- public Stream a(ChunkCoordIntPair chunkcoordintpair, boolean flag) { +- return this.playerMap.a(chunkcoordintpair.pair()).filter((entityplayer) -> { +- int i = b(chunkcoordintpair, entityplayer, true); +- +- return i > this.viewDistance ? false : !flag || i == this.viewDistance; +- }); ++ return players.stream(); + } + + protected void addEntity(Entity entity) { +@@ -1452,11 +1856,38 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d { + + entity.tracker = playerchunkmap_entitytracker; // Paper - Fast access to tracker + this.trackedEntities.put(entity.getId(), playerchunkmap_entitytracker); ++ if (this.playerEntityTrackerTrackMap == null) { // Tuinity - implement optimized tracker + playerchunkmap_entitytracker.track(this.world.getPlayers()); ++ // Tuinity start - implement optimized tracker ++ } else { ++ if (PlayerChunkMap.isLegacyTrackingEntity(entity)) { ++ if (this.playerEntityTrackerLegacyMap.getObjectsInRange(com.tuinity.tuinity.util.Util.getCoordinateKey(entity)) != null) { ++ this.activelyTrackedEntitiesLegacy.add(entity); ++ // tracker tick will propagate updates ++ } ++ } else { ++ int chunkX = com.tuinity.tuinity.util.Util.getChunkCoordinate(entity.locX()); ++ int chunkZ = com.tuinity.tuinity.util.Util.getChunkCoordinate(entity.locZ()); ++ com.tuinity.tuinity.util.map.PooledLinkedHashSets.PooledObjectLinkedOpenHashSet playersTracking = this.playerEntityTrackerTrackMap.getObjectsInRange(chunkX, chunkZ); ++ if (playersTracking != null) { ++ Object[] backingSet = playersTracking.getBackingSet(); ++ for (int index = 0, len = backingSet.length; index < len; ++index) { ++ Object temp = backingSet[index]; ++ if (!(temp instanceof EntityPlayer)) { ++ continue; ++ } ++ EntityPlayer trackingPlayer = (EntityPlayer) temp; ++ playerchunkmap_entitytracker.updateTrackingPlayer(trackingPlayer); ++ } ++ } ++ } ++ } ++ // Tuinity end - implement optimized tracker + if (entity instanceof EntityPlayer) { + EntityPlayer entityplayer = (EntityPlayer) entity; + + this.a(entityplayer, true); ++ if (this.playerEntityTrackerTrackMap == null) { // Tuinity - implement optimized tracker + ObjectIterator objectiterator = this.trackedEntities.values().iterator(); + + while (objectiterator.hasNext()) { +@@ -1466,6 +1897,7 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d { + playerchunkmap_entitytracker1.updatePlayer(entityplayer); + } + } ++ } // Tuinity - implement optimized tracker + } + + } +@@ -1494,9 +1926,112 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d { + playerchunkmap_entitytracker1.a(); + } + entity.tracker = null; // Paper - We're no longer tracked ++ // Tuinity start - optimise entity tracking - we're no longer tracked ++ if (this.activelyTrackedEntitiesLegacy != null) { ++ this.activelyTrackedEntitiesLegacy.remove(entity); ++ } ++ // Tuinity end - optimise entity tracking - we're no longer tracked + } + ++ // Tuinity start - optimized tracker ++ private void processTrackQueue() { ++ // handle queued changes ++ ++ this.world.timings.tracker1.startTiming(); ++ for (Entity tracked : this.world.trackingUpdateQueue) { ++ EntityTracker tracker = tracked.tracker; ++ if (tracker == null) { ++ continue; ++ } ++ // queued tracks ++ for (it.unimi.dsi.fastutil.ints.IntIterator iterator = tracked.trackQueue.iterator(); iterator.hasNext();) { ++ int id = iterator.nextInt(); ++ Entity player = this.world.entitiesById.get(id); ++ ++ if (!(player instanceof EntityPlayer)) { ++ continue; ++ } ++ ++ // double-check to make sure we're in range... ++ int chunkX = com.tuinity.tuinity.util.Util.getChunkCoordinate(player.locX()); ++ int chunkZ = com.tuinity.tuinity.util.Util.getChunkCoordinate(player.locZ()); ++ ++ com.tuinity.tuinity.util.map.PooledLinkedHashSets.PooledObjectLinkedOpenHashSet inRange = ++ this.playerEntityTrackerUntrackMap.getObjectsInRange(chunkX, chunkZ); ++ ++ if (inRange != null && inRange.contains(player)) { ++ tracker.updateTrackingPlayer((EntityPlayer)player); ++ } else { ++ tracker.removeTrackingPlayer((EntityPlayer)player); ++ } ++ } ++ tracked.trackQueue.clear(); ++ ++ // queued untracks ++ for (it.unimi.dsi.fastutil.ints.IntIterator iterator = tracked.unTrackQueue.iterator(); iterator.hasNext();) { ++ int id = iterator.nextInt(); ++ Entity player = this.world.entitiesById.get(id); ++ ++ if (!(player instanceof EntityPlayer)) { ++ continue; ++ } ++ ++ tracker.removeTrackingPlayer((EntityPlayer)player); ++ } ++ tracked.unTrackQueue.clear(); ++ } ++ this.world.trackingUpdateQueue.clear(); ++ this.world.timings.tracker1.stopTiming(); ++ ++ // broadcast updates ++ ++ this.world.timings.tracker2.startTiming(); ++ for (Entity tracked : this.world.loadedEntities) { ++ EntityTracker tracker = tracked.tracker; ++ if (tracker != null) { ++ tracker.trackerEntry.tick(); ++ } ++ } ++ this.world.timings.tracker2.stopTiming(); ++ ++ // legacy tracker ++ ++ Entity[] legacyEntities = this.activelyTrackedEntitiesLegacy.getRawData(); ++ for (int i = 0, size = this.activelyTrackedEntitiesLegacy.size(); i < size; ++i) { ++ Entity entity = legacyEntities[i]; ++ EntityTracker tracker = this.trackedEntities.get(entity.getId()); ++ if (tracker == null) { ++ MinecraftServer.LOGGER.error("Entity has no tracker!" + entity); ++ this.activelyTrackedEntitiesLegacy.remove(entity); ++ --i; ++ --size; ++ continue; ++ } ++ ++ EntityTrackerEntry entry = tracker.trackerEntry; ++ com.tuinity.tuinity.util.map.PooledLinkedHashSets.PooledObjectLinkedOpenHashSet players = this.playerEntityTrackerLegacyMap.getObjectsInRange(com.tuinity.tuinity.util.Util.getCoordinateKey(entity)); ++ if (players != null) { ++ tracker.updateTrackingPlayers(this, players); ++ } else { ++ // nothing is tracking it now, remove it ++ tracker.clearAll(); ++ this.activelyTrackedEntitiesLegacy.remove(entity); ++ --i; ++ --size; ++ continue; ++ } ++ entry.tick(); ++ } ++ } ++ // Tuinity end - optimized tracker ++ + protected void g() { ++ // Tuinity start - optimized tracker ++ if (this.playerEntityTrackerTrackMap != null) { ++ this.processTrackQueue(); ++ return; ++ } ++ // Tuinity end - optimized tracker + List list = Lists.newArrayList(); + List list1 = this.world.getPlayers(); + +@@ -1554,6 +2089,7 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d { + + } + ++ final void sendChunk(EntityPlayer entityplayer, Packet[] apacket, Chunk chunk) { this.a(entityplayer, apacket, chunk); } // Tuinity - OBFHELPER + private void a(EntityPlayer entityplayer, Packet[] apacket, Chunk chunk) { + if (apacket[0] == null) { + apacket[0] = new PacketPlayOutMapChunk(chunk, 65535, true); // Paper - Anti-Xray +@@ -1564,6 +2100,7 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d { + PacketDebug.a(this.world, chunk.getPos()); + List list = Lists.newArrayList(); + List list1 = Lists.newArrayList(); ++ if (this.playerEntityTrackerTrackMap == null) { // Tuinity - implement optimized tracker + ObjectIterator objectiterator = this.trackedEntities.values().iterator(); + + while (objectiterator.hasNext()) { +@@ -1581,6 +2118,32 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d { + } + } + } ++ // Tuinity start- implement optimized tracker ++ } else { ++ // Tuinity - implement optimized tracker ++ // Tuinity start - implement optimized tracker ++ // It's important to note that this is ONLY called when the chunk is at ticking level. ++ // At this point, the entities should be added in the chunk. ++ com.tuinity.tuinity.util.map.PooledLinkedHashSets.PooledObjectLinkedOpenHashSet playersInRange ++ = this.playerEntityTrackerTrackMap.getObjectsInRange(chunk.getPos()); ++ // only send entities when they're in tracking range... ++ if (playersInRange != null && playersInRange.contains(entityplayer)) { ++ chunk.forEachEntity((Entity entityInChunk) -> { ++ PlayerChunkMap.EntityTracker tracker = entityInChunk.tracker; ++ if (tracker == null) { ++ return; // when added to tracker, this entity will propagate to players ++ } ++ ++ if (entityInChunk == entityplayer) { ++ return; // can't track himself ++ } ++ ++ // Note: We don't add to the lists because the track logic will handle it ++ tracker.updateTrackingPlayer(entityplayer); ++ }); ++ } ++ } ++ // Tuinity end - implement optimized tracker + + Iterator iterator; + Entity entity1; +@@ -1618,7 +2181,7 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d { + + public class EntityTracker { + +- private final EntityTrackerEntry trackerEntry; ++ final EntityTrackerEntry trackerEntry; // Tuinity - private -> package private + private final Entity tracker; + private final int trackingDistance; + private SectionPosition e; +@@ -1635,6 +2198,36 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d { + this.e = SectionPosition.a(entity); + } + ++ // Tuinity start - optimise entity tracker tracking ++ public void clearAll() { ++ for (EntityPlayer player : this.trackedPlayers) { ++ this.trackerEntry.onUntrack(player); ++ } ++ this.trackedPlayers.clear(); ++ } ++ ++ void updateTrackingPlayers(PlayerChunkMap chunkMap, com.tuinity.tuinity.util.map.PooledLinkedHashSets.PooledObjectLinkedOpenHashSet fromPlayers) { ++ EntityTrackerEntry entry = this.trackerEntry; ++ for (Iterator iterator = this.trackedPlayers.iterator(); iterator.hasNext();) { ++ EntityPlayer tracker = iterator.next(); ++ if (!fromPlayers.contains(tracker)) { ++ // definitely out of range ++ iterator.remove(); ++ entry.onUntrack(tracker); ++ } ++ } ++ ++ Object[] backingArray = fromPlayers.getBackingSet(); ++ for (int i = 0, len = backingArray.length; i < len; ++i) { ++ if (backingArray[i] == null) { ++ continue; ++ } ++ EntityPlayer player = (EntityPlayer)backingArray[i]; ++ this.updatePlayer(player); ++ } ++ } ++ // Tuinity end - optimise entity tracker tracking ++ + public boolean equals(Object object) { + return object instanceof PlayerChunkMap.EntityTracker ? ((PlayerChunkMap.EntityTracker) object).tracker.getId() == this.tracker.getId() : false; + } +@@ -1684,10 +2277,13 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d { + public void updatePlayer(EntityPlayer entityplayer) { + org.spigotmc.AsyncCatcher.catchOp("player tracker update"); // Spigot + if (entityplayer != this.tracker) { +- Vec3D vec3d = entityplayer.getPositionVector().d(this.tracker.getPositionVector()); // MC-155077, SPIGOT-5113 +- int i = Math.min(this.b(), (PlayerChunkMap.this.viewDistance - 1) * 16); +- boolean flag = vec3d.x >= (double) (-i) && vec3d.x <= (double) i && vec3d.z >= (double) (-i) && vec3d.z <= (double) i && this.tracker.a(entityplayer); +- ++ // Tuinity start - remove allocation of Vec3d here ++ double vec3d_dx = entityplayer.locX() - this.tracker.locX(); ++ double vec3d_dy = entityplayer.locY() - this.tracker.locY(); ++ double vec3d_dz = entityplayer.locZ() - this.tracker.locZ(); ++ // Tuinity end - remove allocation of Vec3d here ++ int i = Math.min(this.b(), (entityplayer.getEffectiveViewDistance(PlayerChunkMap.this)) * 16); // Tuinity - per player view distance ++ boolean flag = vec3d_dx >= (double) (-i) && vec3d_dx <= (double) i && vec3d_dz >= (double) (-i) && vec3d_dz <= (double) i && this.tracker.a(entityplayer); // Tuinity start - remove allocation of Vec3d here + if (flag) { + boolean flag1 = this.tracker.attachedToPlayer; + +@@ -1696,7 +2292,7 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d { + PlayerChunk playerchunk = PlayerChunkMap.this.getVisibleChunk(chunkcoordintpair.pair()); + + if (playerchunk != null && playerchunk.getChunk() != null) { +- flag1 = PlayerChunkMap.b(chunkcoordintpair, entityplayer, false) <= PlayerChunkMap.this.viewDistance; ++ flag1 = PlayerChunkMap.b(chunkcoordintpair, entityplayer, false) <= PlayerChunkMap.this.playerViewDistanceBroadcastMap.getLastViewDistance(entityplayer); // Tuinity - per player view distance + } + } + +@@ -1738,6 +2334,44 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d { + return i; + } + ++ // Tuinity start - optimized tracker ++ public final void updateTrackingPlayer(EntityPlayer entityplayer) { ++ if (entityplayer == this.tracker) { ++ return; ++ } ++ com.tuinity.tuinity.util.TickThread.softEnsureTickThread("Tracker update"); // Tuinity ++ // the same as updatePlayer except without a distance check ++ // we also add a world check since we queue tracking changes ++ // TODO check on update ++ // CraftBukkit start - respect vanish API ++ boolean shouldTrack = entityplayer.world == tracker.world; ++ if (this.tracker instanceof EntityPlayer) { ++ Player player = ((EntityPlayer)this.tracker).getBukkitEntity(); ++ if (!entityplayer.getBukkitEntity().canSee(player)) { ++ shouldTrack = false; ++ } ++ } ++ ++ entityplayer.removeQueue.remove(Integer.valueOf(this.tracker.getId())); ++ // CraftBukkit end ++ ++ if (shouldTrack) { ++ if (this.trackedPlayerMap.putIfAbsent(entityplayer, true) == null) { // Paper ++ this.trackerEntry.onTrack(entityplayer); ++ } ++ } else { ++ this.removeTrackingPlayer(entityplayer); ++ } ++ } ++ ++ public final void removeTrackingPlayer(EntityPlayer player) { ++ com.tuinity.tuinity.util.TickThread.softEnsureTickThread("Tracker update"); // Tuinity ++ if (this.trackedPlayers.remove(player)) { ++ this.trackerEntry.onUntrack(player); ++ } ++ } ++ // Tuinity end - optimized tracker ++ + public void track(List list) { + Iterator iterator = list.iterator(); + +diff --git a/src/main/java/net/minecraft/server/PlayerInteractManager.java b/src/main/java/net/minecraft/server/PlayerInteractManager.java +index ce4340a47..1b60310bb 100644 +--- a/src/main/java/net/minecraft/server/PlayerInteractManager.java ++++ b/src/main/java/net/minecraft/server/PlayerInteractManager.java +@@ -20,14 +20,29 @@ public class PlayerInteractManager { + public EntityPlayer player; + private EnumGamemode gamemode; + private boolean e; +- private int lastDigTick; ++ private int lastDigTick; private long lastDigTime; // Tuinity - lag compensate block breaking + private BlockPosition g; + private int currentTick; +- private boolean i; ++ private boolean i; private final boolean hasDestroyedTooFast() { return this.i; } // Tuinity - OBFHELPER + private BlockPosition j; +- private int k; ++ private int k; private final int getHasDestroyedTooFastStartTick() { return this.k; } // Tuinity - OBFHELPER ++ private long hasDestroyedTooFastStartTime; // Tuinity - lag compensate block breaking + private int l; + ++ // Tuinity start - lag compensate block breaking ++ private int getTimeDiggingLagCompensate() { ++ int lagCompensated = (int)((System.nanoTime() - this.lastDigTime) / (50L * 1000L * 1000L)); ++ int tickDiff = this.currentTick - this.lastDigTick; ++ return lagCompensated > (tickDiff + 1) ? lagCompensated : tickDiff; // add one to ensure we don't lag compensate unless we need to ++ } ++ ++ private int getTimeDiggingTooFastLagCompensate() { ++ int lagCompensated = (int)((System.nanoTime() - this.hasDestroyedTooFastStartTime) / (50L * 1000L * 1000L)); ++ int tickDiff = this.currentTick - this.getHasDestroyedTooFastStartTick(); ++ return lagCompensated > (tickDiff + 1) ? lagCompensated : tickDiff; // add one to ensure we don't lag compensate unless we need to ++ } ++ // Tuinity end ++ + public PlayerInteractManager(WorldServer worldserver) { + this.gamemode = EnumGamemode.NOT_SET; + this.g = BlockPosition.ZERO; +@@ -73,7 +88,7 @@ public class PlayerInteractManager { + if (iblockdata.isAir()) { + this.i = false; + } else { +- float f = this.a(iblockdata, this.j, this.k); ++ float f = this.updateBlockBreakAnimation(iblockdata, this.j, this.getTimeDiggingTooFastLagCompensate()); // Tuinity - lag compensate destroying blocks + + if (f >= 1.0F) { + this.i = false; +@@ -87,7 +102,7 @@ public class PlayerInteractManager { + this.l = -1; + this.e = false; + } else { +- this.a(iblockdata, this.g, this.lastDigTick); ++ this.updateBlockBreakAnimation(iblockdata, this.g, this.getTimeDiggingLagCompensate()); // Tuinity - lag compensate destroying blocks + } + } + +@@ -95,6 +110,12 @@ public class PlayerInteractManager { + + private float a(IBlockData iblockdata, BlockPosition blockposition, int i) { + int j = this.currentTick - i; ++ // Tuinity start - change i (startTime) to totalTime ++ return this.updateBlockBreakAnimation(iblockdata, blockposition, j); ++ } ++ private float updateBlockBreakAnimation(IBlockData iblockdata, BlockPosition blockposition, int totalTime) { ++ int j = totalTime; ++ // Tuinity end + float f = iblockdata.getDamage(this.player, this.player.world, blockposition) * (float) (j + 1); + int k = (int) (f * 10.0F); + +@@ -168,7 +189,7 @@ public class PlayerInteractManager { + } + + // this.world.douseFire((EntityHuman) null, blockposition, enumdirection); // CraftBukkit - Moved down +- this.lastDigTick = this.currentTick; ++ this.lastDigTick = this.currentTick; this.lastDigTime = System.nanoTime(); // Tuinity - lag compensate block breaking + float f = 1.0F; + + iblockdata = this.world.getType(blockposition); +@@ -223,12 +244,12 @@ public class PlayerInteractManager { + int j = (int) (f * 10.0F); + + this.world.a(this.player.getId(), blockposition, j); +- this.player.playerConnection.sendPacket(new PacketPlayOutBlockBreak(blockposition, this.world.getType(blockposition), packetplayinblockdig_enumplayerdigtype, true, "actual start of destroying")); ++ //this.player.playerConnection.sendPacket(new PacketPlayOutBlockBreak(blockposition, this.world.getType(blockposition), packetplayinblockdig_enumplayerdigtype, true, "actual start of destroying")); // Tuinity - on lagging servers this can cause the client to think it's only just started to destroy a block when it already has/will + this.l = j; + } + } else if (packetplayinblockdig_enumplayerdigtype == PacketPlayInBlockDig.EnumPlayerDigType.STOP_DESTROY_BLOCK) { + if (blockposition.equals(this.g)) { +- int k = this.currentTick - this.lastDigTick; ++ int k = this.getTimeDiggingLagCompensate(); // Tuinity - lag compensate block breaking + + iblockdata = this.world.getType(blockposition); + if (!iblockdata.isAir()) { +@@ -245,12 +266,12 @@ public class PlayerInteractManager { + this.e = false; + this.i = true; + this.j = blockposition; +- this.k = this.lastDigTick; ++ this.k = this.lastDigTick; this.hasDestroyedTooFastStartTime = this.lastDigTime; // Tuinity - lag compensate block breaking + } + } + } + +- this.player.playerConnection.sendPacket(new PacketPlayOutBlockBreak(blockposition, this.world.getType(blockposition), packetplayinblockdig_enumplayerdigtype, true, "stopped destroying")); ++ this.player.playerConnection.sendPacket(new PacketPlayOutBlockChange(this.world, blockposition)); // Tuinity - this can cause clients on a lagging server to think they're not currently destroying a block + } else if (packetplayinblockdig_enumplayerdigtype == PacketPlayInBlockDig.EnumPlayerDigType.ABORT_DESTROY_BLOCK) { + this.e = false; + if (!Objects.equals(this.g, blockposition)) { +@@ -260,7 +281,7 @@ public class PlayerInteractManager { + } + + this.world.a(this.player.getId(), blockposition, -1); +- this.player.playerConnection.sendPacket(new PacketPlayOutBlockBreak(blockposition, this.world.getType(blockposition), packetplayinblockdig_enumplayerdigtype, true, "aborted destroying")); ++ //this.player.playerConnection.sendPacket(new PacketPlayOutBlockBreak(blockposition, this.world.getType(blockposition), packetplayinblockdig_enumplayerdigtype, true, "aborted destroying")); // Tuinity - this can cause clients on a lagging server to think they stopped destroying a block they're currently destroying + } + + } +@@ -270,7 +291,7 @@ public class PlayerInteractManager { + + public void a(BlockPosition blockposition, PacketPlayInBlockDig.EnumPlayerDigType packetplayinblockdig_enumplayerdigtype, String s) { + if (this.breakBlock(blockposition)) { +- this.player.playerConnection.sendPacket(new PacketPlayOutBlockBreak(blockposition, this.world.getType(blockposition), packetplayinblockdig_enumplayerdigtype, true, s)); ++ this.player.playerConnection.sendPacket(new PacketPlayOutBlockChange(this.world, blockposition)); // Tuinity - this can cause clients on a lagging server to think they're not currently destroying a block + } else { + this.player.playerConnection.sendPacket(new PacketPlayOutBlockChange(this.world, blockposition)); // CraftBukkit - SPIGOT-5196 + } +diff --git a/src/main/java/net/minecraft/server/PlayerInventory.java b/src/main/java/net/minecraft/server/PlayerInventory.java +index d103cfaac..1b8cb3fc6 100644 +--- a/src/main/java/net/minecraft/server/PlayerInventory.java ++++ b/src/main/java/net/minecraft/server/PlayerInventory.java +@@ -559,8 +559,10 @@ public class PlayerInventory implements IInventory, INamableTileEntity { + + NonNullList nonnulllist; + +- for (Iterator iterator = this.f.iterator(); iterator.hasNext(); i -= nonnulllist.size()) { +- nonnulllist = (NonNullList) iterator.next(); ++ // Tuinity start - reduce iterator creation ++ for (int index = 0, len = this.f.size(); index < len; ++index, i -= nonnulllist.size()) { ++ nonnulllist = this.f.get(index); ++ // Tuinity end - reduce iterator creation + if (i < nonnulllist.size()) { + list = nonnulllist; + break; +diff --git a/src/main/java/net/minecraft/server/PlayerList.java b/src/main/java/net/minecraft/server/PlayerList.java +index 7b79ee4fe..253ee52eb 100644 +--- a/src/main/java/net/minecraft/server/PlayerList.java ++++ b/src/main/java/net/minecraft/server/PlayerList.java +@@ -156,7 +156,7 @@ public abstract class PlayerList { + + // CraftBukkit - getType() + // Spigot - view distance +- playerconnection.sendPacket(new PacketPlayOutLogin(entityplayer.getId(), entityplayer.playerInteractManager.getGameMode(), WorldData.c(worlddata.getSeed()), worlddata.isHardcore(), worldserver.worldProvider.getDimensionManager().getType(), this.getMaxPlayers(), worlddata.getType(), worldserver.spigotConfig.viewDistance, flag1, !flag)); ++ playerconnection.sendPacket(new PacketPlayOutLogin(entityplayer.getId(), entityplayer.playerInteractManager.getGameMode(), WorldData.c(worlddata.getSeed()), worlddata.isHardcore(), worldserver.worldProvider.getDimensionManager().getType(), this.getMaxPlayers(), worlddata.getType(), Math.max(entityplayer.getEffectiveViewDistance(worldserver.getChunkProvider().playerChunkMap), entityplayer.getEffectiveNoTickViewDistance(worldserver.getChunkProvider().playerChunkMap)), flag1, !flag)); // Tuinity - per player view distance + entityplayer.getBukkitEntity().sendSupportedChannels(); // CraftBukkit + playerconnection.sendPacket(new PacketPlayOutCustomPayload(PacketPlayOutCustomPayload.a, (new PacketDataSerializer(Unpooled.buffer())).a(this.getServer().getServerModName()))); + playerconnection.sendPacket(new PacketPlayOutServerDifficulty(worlddata.getDifficulty(), worlddata.isDifficultyLocked())); +@@ -700,7 +700,7 @@ public abstract class PlayerList { + WorldData worlddata = worldserver.getWorldData(); + + entityplayer1.playerConnection.sendPacket(new PacketPlayOutRespawn(worldserver.worldProvider.getDimensionManager().getType(), WorldData.c(worldserver.getWorldData().getSeed()), worldserver.getWorldData().getType(), entityplayer1.playerInteractManager.getGameMode())); +- entityplayer1.playerConnection.sendPacket(new PacketPlayOutViewDistance(worldserver.spigotConfig.viewDistance)); // Spigot ++ entityplayer1.playerConnection.sendPacket(new PacketPlayOutViewDistance(Math.max(entityplayer1.getEffectiveViewDistance(worldserver.getChunkProvider().playerChunkMap), entityplayer1.getEffectiveNoTickViewDistance(worldserver.getChunkProvider().playerChunkMap)))); // Spigot // Tuinity - per player view distance + entityplayer1.spawnIn(worldserver); + entityplayer1.dead = false; + entityplayer1.playerConnection.teleport(new Location(worldserver.getWorld(), entityplayer1.locX(), entityplayer1.locY(), entityplayer1.locZ(), entityplayer1.yaw, entityplayer1.pitch)); +@@ -1178,7 +1178,7 @@ public abstract class PlayerList { + + public void a(int i) { + this.viewDistance = i; +- this.sendAll(new PacketPlayOutViewDistance(i)); ++ //this.sendAll(new PacketPlayOutViewDistance(i)); // Tuinity - move into setViewDistance + Iterator iterator = this.server.getWorlds().iterator(); + + while (iterator.hasNext()) { +diff --git a/src/main/java/net/minecraft/server/ProtoChunk.java b/src/main/java/net/minecraft/server/ProtoChunk.java +index f376e2106..5a883aac1 100644 +--- a/src/main/java/net/minecraft/server/ProtoChunk.java ++++ b/src/main/java/net/minecraft/server/ProtoChunk.java +@@ -180,14 +180,11 @@ public class ProtoChunk implements IChunkAccess { + lightengine.a(blockposition); + } + +- EnumSet enumset = this.getChunkStatus().h(); ++ HeightMap.Type[] enumset = this.getChunkStatus().heightMaps; // Tuinity - reduce iterator creation + EnumSet enumset1 = null; +- Iterator iterator = enumset.iterator(); ++ // Tuinity - reduce iterator creation + +- HeightMap.Type heightmap_type; +- +- while (iterator.hasNext()) { +- heightmap_type = (HeightMap.Type) iterator.next(); ++ for (HeightMap.Type heightmap_type : enumset) { // Tuinity - reduce iterator creation + HeightMap heightmap = (HeightMap) this.f.get(heightmap_type); + + if (heightmap == null) { +@@ -203,10 +200,9 @@ public class ProtoChunk implements IChunkAccess { + HeightMap.a(this, enumset1); + } + +- iterator = enumset.iterator(); +- +- while (iterator.hasNext()) { +- heightmap_type = (HeightMap.Type) iterator.next(); ++ // Tuinity start - reduce iterator creation ++ for (HeightMap.Type heightmap_type : enumset) { ++ // Tuinity end + ((HeightMap) this.f.get(heightmap_type)).a(i & 15, j, k & 15, iblockdata); + } + +diff --git a/src/main/java/net/minecraft/server/RegionFile.java b/src/main/java/net/minecraft/server/RegionFile.java +index df728e2c0..5bd7b8f55 100644 +--- a/src/main/java/net/minecraft/server/RegionFile.java ++++ b/src/main/java/net/minecraft/server/RegionFile.java +@@ -28,14 +28,342 @@ public class RegionFile implements AutoCloseable { + private static final Logger LOGGER = LogManager.getLogger(); + private static final ByteBuffer b = ByteBuffer.allocateDirect(1); + private final FileChannel dataFile; +- private final java.nio.file.Path d; +- private final RegionFileCompression e; ++ private final java.nio.file.Path d; private final java.nio.file.Path getContainingDataFolder() { return this.d; } // Tuinity - OBFHELPER ++ private final RegionFileCompression e; private final RegionFileCompression getRegionFileCompression() { return this.e; } // Tuinity - OBFHELPER + private final ByteBuffer f; +- private final IntBuffer g; +- private final IntBuffer h; ++ private final IntBuffer g; private final IntBuffer getOffsets() { return this.g; } // Tuinity - OBFHELPER ++ private final IntBuffer h; private final IntBuffer getTimestamps() { return this.h; } // Tuinity - OBFHELPER + private final RegionFileBitSet freeSectors; + public final File file; + ++ // Tuinity start - try to recover from RegionFile header corruption ++ private static long roundToSectors(long bytes) { ++ long sectors = bytes >>> 12; // 4096 = 2^12 ++ long remainingBytes = bytes & 4095; ++ long sign = -remainingBytes; // sign is 1 if nonzero ++ return sectors + (sign >>> 63); ++ } ++ ++ private static final NBTTagCompound OVERSIZED_COMPOUND = new NBTTagCompound(); ++ ++ private NBTTagCompound attemptRead(long sector, int chunkDataLength, long fileLength) throws IOException { ++ try { ++ if (chunkDataLength < 0) { ++ return null; ++ } ++ ++ long offset = sector * 4096L + 4L; // offset for chunk data ++ ++ if ((offset + chunkDataLength) > fileLength) { ++ return null; ++ } ++ ++ ByteBuffer chunkData = ByteBuffer.allocate(chunkDataLength); ++ if (chunkDataLength != this.dataFile.read(chunkData, offset)) { ++ return null; ++ } ++ ++ chunkData.flip(); ++ ++ byte compressionType = chunkData.get(); ++ if (compressionType < 0) { // compressionType & 128 != 0 ++ // oversized chunk ++ return OVERSIZED_COMPOUND; ++ } ++ ++ RegionFileCompression compression = RegionFileCompression.getByType(compressionType); ++ if (compression == null) { ++ return null; ++ } ++ ++ InputStream input = compression.wrap(new ByteArrayInputStream(chunkData.array(), chunkData.position(), chunkDataLength - chunkData.position())); ++ ++ return NBTCompressedStreamTools.readNBT(new DataInputStream(new BufferedInputStream(input))); ++ } catch (Exception ex) { ++ return null; ++ } ++ } ++ ++ private int getLength(long sector) throws IOException { ++ ByteBuffer length = ByteBuffer.allocate(4); ++ if (4 != this.dataFile.read(length, sector * 4096L)) { ++ return -1; ++ } ++ ++ return length.getInt(0); ++ } ++ ++ // note: only call for CHUNK regionfiles ++ void recalculateHeader() throws IOException { ++ if (!this.canRecalcHeader) { ++ return; ++ } ++ synchronized (this) { ++ MinecraftServer.LOGGER.warn("Corrupt regionfile header detected! Attempting to re-calculate header offsets for regionfile " + this.file.getAbsolutePath(), new Throwable()); ++ ++ // try to backup file so maybe it could be sent to us for further investigation ++ ++ File backup = new File(this.file.getParent(), this.file.getName() + "." + new java.util.Random().nextLong() + ".backup"); ++ try { ++ this.dataFile.force(true); ++ MinecraftServer.LOGGER.warn("Backing up to " + backup.getAbsolutePath()); ++ java.nio.file.Files.copy(this.file.toPath(), backup.toPath()); ++ MinecraftServer.LOGGER.warn("Backed up the regionfile " + backup.getAbsolutePath()); ++ } catch (IOException ex) { ++ MinecraftServer.LOGGER.error("Failed to backup to " + backup.getAbsolutePath(), ex); ++ } ++ ++ NBTTagCompound[] compounds = new NBTTagCompound[32 * 32]; // only in the regionfile (i.e exclude mojang/aikar oversized data) ++ int[] rawLengths = new int[32 * 32]; // length of chunk data including 4 byte length field, bytes ++ int[] sectorOffsets = new int[32 * 32]; // in sectors ++ boolean[] hasAikarOversized = new boolean[32 * 32]; ++ ++ long fileLength = this.dataFile.size(); ++ long totalSectors = roundToSectors(fileLength); ++ ++ // search the regionfile from start to finish for the most up-to-date chunk data ++ ++ for (long i = 2, maxSector = Math.min((long)(Integer.MAX_VALUE >>> 8), totalSectors); i < maxSector; ++i) { // first two sectors are header, skip ++ int chunkDataLength = this.getLength(i); ++ NBTTagCompound compound = this.attemptRead(i, chunkDataLength, fileLength); ++ if (compound == null || compound == OVERSIZED_COMPOUND) { ++ continue; ++ } ++ ++ ChunkCoordIntPair chunkPos = ChunkRegionLoader.getChunkCoordinate(compound); ++ int location = (chunkPos.x & 31) | ((chunkPos.z & 31) << 5); ++ ++ NBTTagCompound otherCompound = compounds[location]; ++ ++ if (otherCompound != null && ChunkRegionLoader.getLastWorldSaveTime(otherCompound) > ChunkRegionLoader.getLastWorldSaveTime(compound)) { ++ continue; // don't overwrite newer data. ++ } ++ ++ // aikar oversized? ++ File aikarOversizedFile = this.getOversizedFile(chunkPos.x, chunkPos.z); ++ boolean isAikarOversized = false; ++ if (aikarOversizedFile.exists()) { ++ try { ++ NBTTagCompound aikarOversizedCompound = this.getOversizedData(chunkPos.x, chunkPos.z); ++ if (ChunkRegionLoader.getLastWorldSaveTime(compound) == ChunkRegionLoader.getLastWorldSaveTime(aikarOversizedCompound)) { ++ // best we got for an id. hope it's good enough ++ isAikarOversized = true; ++ } ++ } catch (Exception ex) { ++ MinecraftServer.LOGGER.error("Failed to read aikar oversized data for absolute chunk (" + chunkPos.x + "," + chunkPos.z + ") in regionfile " + this.file.getAbsolutePath() + ", oversized data for this chunk will be lost", ex); ++ // fall through, if we can't read aikar oversized we can't risk corrupting chunk data ++ } ++ } ++ ++ hasAikarOversized[location] = isAikarOversized; ++ compounds[location] = compound; ++ rawLengths[location] = chunkDataLength + 4; ++ sectorOffsets[location] = (int)i; ++ ++ int chunkSectorLength = (int)roundToSectors(rawLengths[location]); ++ i += chunkSectorLength; ++ --i; // gets incremented next iteration ++ } ++ ++ // forge style oversized data is already handled by the local search, and aikar data we just hope ++ // we get it right as aikar data has no identifiers we could use to try and find its corresponding ++ // local data compound ++ ++ java.nio.file.Path containingFolder = this.getContainingDataFolder(); ++ File[] regionFiles = containingFolder.toFile().listFiles(); ++ boolean[] oversized = new boolean[32 * 32]; ++ RegionFileCompression[] oversizedCompressionTypes = new RegionFileCompression[32 * 32]; ++ ++ if (regionFiles != null) { ++ ChunkCoordIntPair ourLowerLeftPosition = RegionFileCache.getRegionFileCoordinates(this.file); ++ ++ if (ourLowerLeftPosition == null) { ++ MinecraftServer.LOGGER.fatal("Unable to get chunk location of regionfile " + this.file.getAbsolutePath() + ", cannot recover oversized chunks"); ++ } else { ++ int lowerXBound = ourLowerLeftPosition.x; // inclusive ++ int lowerZBound = ourLowerLeftPosition.z; // inclusive ++ int upperXBound = lowerXBound + 32 - 1; // inclusive ++ int upperZBound = lowerZBound + 32 - 1; // inclusive ++ ++ // read mojang oversized data ++ for (File regionFile : regionFiles) { ++ ChunkCoordIntPair oversizedCoords = getOversizedChunkPair(regionFile); ++ if (oversizedCoords == null) { ++ continue; ++ } ++ ++ if ((oversizedCoords.x < lowerXBound || oversizedCoords.x > upperXBound) || (oversizedCoords.z < lowerZBound || oversizedCoords.z > upperZBound)) { ++ continue; // not in our regionfile ++ } ++ ++ // ensure oversized data is valid & is newer than data in the regionfile ++ ++ int location = (oversizedCoords.x & 31) | ((oversizedCoords.z & 31) << 5); ++ ++ byte[] chunkData; ++ try { ++ chunkData = Files.readAllBytes(regionFile.toPath()); ++ } catch (Exception ex) { ++ MinecraftServer.LOGGER.error("Failed to read oversized chunk data in file " + regionFile.getAbsolutePath(), ex); ++ continue; ++ } ++ ++ NBTTagCompound compound = null; ++ ++ // We do not know the compression type, as it's stored in the regionfile. So we need to try all of them ++ RegionFileCompression compression = null; ++ for (RegionFileCompression compressionType : RegionFileCompression.getCompressionTypes().values()) { ++ try { ++ DataInputStream in = new DataInputStream(new BufferedInputStream(compressionType.wrap(new ByteArrayInputStream(chunkData)))); // typical java ++ compound = NBTCompressedStreamTools.readNBT(in); ++ compression = compressionType; ++ break; // reaches here iff readNBT does not throw ++ } catch (Exception ex) { ++ continue; ++ } ++ } ++ ++ if (compound == null) { ++ MinecraftServer.LOGGER.error("Failed to read oversized chunk data in file " + regionFile.getAbsolutePath() + ", it's corrupt. Its data will be lost"); ++ continue; ++ } ++ ++ if (compounds[location] != null && ChunkRegionLoader.getLastWorldSaveTime(compound) > ChunkRegionLoader.getLastWorldSaveTime(compounds[location])) { ++ oversized[location] = true; ++ oversizedCompressionTypes[location] = compression; ++ } ++ } ++ } ++ } ++ ++ // now we need to calculate a new offset header ++ ++ int[] calculatedOffsets = new int[32 * 32]; ++ RegionFileBitSet newSectorAllocations = new RegionFileBitSet(); ++ newSectorAllocations.allocate(0, 2); // make space for header ++ ++ // allocate sectors for normal chunks ++ ++ for (int chunkX = 0; chunkX < 32; ++chunkX) { ++ for (int chunkZ = 0; chunkZ < 32; ++chunkZ) { ++ int location = chunkX | (chunkZ << 5); ++ ++ if (oversized[location]) { ++ continue; ++ } ++ ++ int rawLength = rawLengths[location]; // bytes ++ int sectorOffset = sectorOffsets[location]; // sectors ++ int sectorLength = (int)roundToSectors(rawLength); ++ ++ if (newSectorAllocations.tryAllocate(sectorOffset, sectorLength)) { ++ calculatedOffsets[location] = sectorOffset << 8 | (sectorLength > 255 ? 255 : sectorLength); // support forge style oversized ++ } else { ++ MinecraftServer.LOGGER.error("Failed to allocate space for local chunk (overlapping data??) at (" + chunkX + "," + chunkZ + ") in regionfile " + this.file.getAbsolutePath() + ", chunk will be regenerated"); ++ } ++ } ++ } ++ ++ // allocate sectors for oversized chunks ++ ++ for (int chunkX = 0; chunkX < 32; ++chunkX) { ++ for (int chunkZ = 0; chunkZ < 32; ++chunkZ) { ++ int location = chunkX | (chunkZ << 5); ++ ++ if (!oversized[location]) { ++ continue; ++ } ++ ++ int sectorOffset = newSectorAllocations.allocateNewSpace(1); ++ int sectorLength = 1; ++ ++ try { ++ this.dataFile.write(this.getOversizedChunkHolderData(oversizedCompressionTypes[location]), sectorOffset * 4096); ++ // only allocate in the new offsets if the write succeeds ++ calculatedOffsets[location] = sectorOffset << 8 | (sectorLength > 255 ? 255 : sectorLength); // support forge style oversized ++ } catch (IOException ex) { ++ newSectorAllocations.free(sectorOffset, sectorLength); ++ MinecraftServer.LOGGER.error("Failed to write new oversized chunk data holder, local chunk at (" + chunkX + "," + chunkZ + ") in regionfile " + this.file.getAbsolutePath() + " will be regenerated"); ++ } ++ } ++ } ++ ++ // rewrite aikar oversized data ++ ++ this.oversizedCount = 0; ++ for (int chunkX = 0; chunkX < 32; ++chunkX) { ++ for (int chunkZ = 0; chunkZ < 32; ++chunkZ) { ++ int location = chunkX | (chunkZ << 5); ++ int isAikarOversized = hasAikarOversized[location] ? 1 : 0; ++ ++ this.oversizedCount += isAikarOversized; ++ this.oversized[location] = (byte)isAikarOversized; ++ } ++ } ++ ++ if (this.oversizedCount > 0) { ++ try { ++ this.writeOversizedMeta(); ++ } catch (Exception ex) { ++ MinecraftServer.LOGGER.error("Failed to write aikar oversized chunk meta, all aikar style oversized chunk data will be lost for regionfile " + this.file.getAbsolutePath(), ex); ++ this.getOversizedMetaFile().delete(); ++ } ++ } else { ++ this.getOversizedMetaFile().delete(); ++ } ++ ++ this.freeSectors.copyFrom(newSectorAllocations); ++ ++ // before we overwrite the old sectors, print a summary of the chunks that got changed. ++ ++ MinecraftServer.LOGGER.info("Starting summary of changes for regionfile " + this.file.getAbsolutePath()); ++ ++ for (int chunkX = 0; chunkX < 32; ++chunkX) { ++ for (int chunkZ = 0; chunkZ < 32; ++chunkZ) { ++ int location = chunkX | (chunkZ << 5); ++ ++ int oldOffset = this.getOffsets().get(location); ++ int newOffset = calculatedOffsets[location]; ++ ++ if (oldOffset == newOffset) { ++ continue; ++ } ++ ++ this.getOffsets().put(location, newOffset); // overwrite incorrect offset ++ ++ if (oldOffset == 0) { ++ // found lost data ++ MinecraftServer.LOGGER.info("Found missing data for local chunk (" + chunkX + "," + chunkZ + ") in regionfile " + this.file.getAbsolutePath()); ++ } else if (newOffset == 0) { ++ MinecraftServer.LOGGER.warn("Data for local chunk (" + chunkX + "," + chunkZ + ") could not be recovered in regionfile " + this.file.getAbsolutePath() + ", it will be regenerated"); ++ } else { ++ MinecraftServer.LOGGER.info("Local chunk (" + chunkX + "," + chunkZ + ") changed to point to newer data or correct chunk in regionfile " + this.file.getAbsolutePath()); ++ } ++ } ++ } ++ ++ MinecraftServer.LOGGER.info("End of change summary for regionfile " + this.file.getAbsolutePath()); ++ ++ // simply destroy the timestamp header, it's not used ++ ++ for (int i = 0; i < 32 * 32; ++i) { ++ this.getTimestamps().put(i, calculatedOffsets[i] != 0 ? (int)System.currentTimeMillis() : 0); // write a valid timestamp for valid chunks, I do not want to find out whatever dumb program actually checks this ++ } ++ ++ // write new header ++ try { ++ this.flushHeader(); ++ this.dataFile.force(true); // try to ensure it goes through... ++ MinecraftServer.LOGGER.info("Successfully wrote new header to disk for regionfile " + this.file.getAbsolutePath()); ++ } catch (IOException ex) { ++ MinecraftServer.LOGGER.fatal("Failed to write new header to disk for regionfile " + this.file.getAbsolutePath(), ex); ++ } ++ } ++ } ++ ++ final boolean canRecalcHeader; // final forces compile fail on new constructor ++ // Tuinity end ++ + public final java.util.concurrent.locks.ReentrantLock fileLock = new java.util.concurrent.locks.ReentrantLock(true); // Paper + + // Paper start - Cache chunk status +@@ -63,10 +391,21 @@ public class RegionFile implements AutoCloseable { + // Paper end + + public RegionFile(File file, File file1) throws IOException { +- this(file.toPath(), file1.toPath(), RegionFileCompression.b); ++ // Tuinity start - add header recalculation boolean ++ this(file, file1, false); ++ } ++ public RegionFile(File file, File file1, boolean canRecalcHeader) throws IOException { ++ this(file.toPath(), file1.toPath(), RegionFileCompression.b, canRecalcHeader); ++ // Tuinity end + } + + public RegionFile(java.nio.file.Path java_nio_file_path, java.nio.file.Path java_nio_file_path1, RegionFileCompression regionfilecompression) throws IOException { ++ // Tuinity start - add header recalculation boolean ++ this(java_nio_file_path, java_nio_file_path1, regionfilecompression, false); ++ } ++ public RegionFile(java.nio.file.Path java_nio_file_path, java.nio.file.Path java_nio_file_path1, RegionFileCompression regionfilecompression, boolean canRecalcHeader) throws IOException { ++ this.canRecalcHeader = canRecalcHeader; ++ // Tuinity end + this.file = java_nio_file_path.toFile(); // Paper + this.f = ByteBuffer.allocateDirect(8192); + initOversizedState(); +@@ -90,6 +429,8 @@ public class RegionFile implements AutoCloseable { + RegionFile.LOGGER.warn("Region file {} has truncated header: {}", java_nio_file_path, i); + } + ++ boolean needsHeaderRecalc = false; // Tuinity - recalculate header on header corruption ++ + for (int j = 0; j < 1024; ++j) { + int k = this.g.get(j); + +@@ -105,20 +446,53 @@ public class RegionFile implements AutoCloseable { + } + // Spigot end + +- this.freeSectors.a(l, i1); ++ needsHeaderRecalc |= !this.freeSectors.tryAllocate(l, i1); // Tuinity - recalculate header on header corruption + } + } ++ ++ // Tuinity start - recalculate header on header corruption ++ // we move the recalc here so comparison to old header is correct when logging to console ++ if (needsHeaderRecalc) { // true if header gave us overlapping allocations ++ this.recalculateHeader(); ++ } ++ // Tuinity end + } + + } + } + ++ private final java.nio.file.Path getOversizedChunkPath(ChunkCoordIntPair chunkcoordintpair) { return this.e(chunkcoordintpair); } // Tuinity - OBFHELPER + private java.nio.file.Path e(ChunkCoordIntPair chunkcoordintpair) { +- String s = "c." + chunkcoordintpair.x + "." + chunkcoordintpair.z + ".mcc"; ++ String s = "c." + chunkcoordintpair.x + "." + chunkcoordintpair.z + ".mcc"; // Tuinity - diff on change + + return this.d.resolve(s); + } + ++ // Tuinity start ++ private static ChunkCoordIntPair getOversizedChunkPair(File file) { ++ String fileName = file.getName(); ++ ++ if (!fileName.startsWith("c.") || !fileName.endsWith(".mcc")) { ++ return null; ++ } ++ ++ String[] split = fileName.split("\\."); ++ ++ if (split.length != 4) { ++ return null; ++ } ++ ++ try { ++ int x = Integer.parseInt(split[1]); ++ int z = Integer.parseInt(split[2]); ++ ++ return new ChunkCoordIntPair(x, z); ++ } catch (NumberFormatException ex) { ++ return null; ++ } ++ } ++ // Tuinity end ++ + @Nullable public synchronized DataInputStream getReadStream(ChunkCoordIntPair chunkCoordIntPair) throws IOException { return a(chunkCoordIntPair);} // Paper - OBFHELPER + @Nullable + public synchronized DataInputStream a(ChunkCoordIntPair chunkcoordintpair) throws IOException { +@@ -142,6 +516,12 @@ public class RegionFile implements AutoCloseable { + this.dataFile.read(bytebuffer, (long) (j * 4096)); + ((java.nio.Buffer) bytebuffer).flip(); + if (bytebuffer.remaining() < 5) { ++ // Tuinity start - recalculate header on regionfile corruption ++ if (this.canRecalcHeader) { ++ this.recalculateHeader(); ++ return this.getReadStream(chunkcoordintpair); ++ } ++ // Tuinity end + RegionFile.LOGGER.error("Chunk {} header is truncated: expected {} but read {}", chunkcoordintpair, l, bytebuffer.remaining()); + return null; + } else { +@@ -150,6 +530,12 @@ public class RegionFile implements AutoCloseable { + + if (i1 == 0) { + RegionFile.LOGGER.warn("Chunk {} is allocated, but stream is missing", chunkcoordintpair); ++ // Tuinity start - recalculate header on regionfile corruption ++ if (this.canRecalcHeader) { ++ this.recalculateHeader(); ++ return this.getReadStream(chunkcoordintpair); ++ } ++ // Tuinity end + return null; + } else { + int j1 = i1 - 1; +@@ -162,9 +548,21 @@ public class RegionFile implements AutoCloseable { + return this.a(chunkcoordintpair, b(b0)); + } else if (j1 > bytebuffer.remaining()) { + RegionFile.LOGGER.error("Chunk {} stream is truncated: expected {} but read {}", chunkcoordintpair, j1, bytebuffer.remaining()); ++ // Tuinity start - recalculate header on regionfile corruption ++ if (this.canRecalcHeader) { ++ this.recalculateHeader(); ++ return this.getReadStream(chunkcoordintpair); ++ } ++ // Tuinity end + return null; + } else if (j1 < 0) { + RegionFile.LOGGER.error("Declared size {} of chunk {} is negative", i1, chunkcoordintpair); ++ // Tuinity start - recalculate header on regionfile corruption ++ if (this.canRecalcHeader) { ++ this.recalculateHeader(); ++ return this.getReadStream(chunkcoordintpair); ++ } ++ // Tuinity end + return null; + } else { + return this.a(chunkcoordintpair, b0, a(bytebuffer, j1)); +@@ -323,10 +721,15 @@ public class RegionFile implements AutoCloseable { + } + + private ByteBuffer a() { ++ // Tuinity start - add compressionType param ++ return this.getOversizedChunkHolderData(this.getRegionFileCompression()); ++ } ++ private ByteBuffer getOversizedChunkHolderData(RegionFileCompression compressionType) { ++ // Tuinity end + ByteBuffer bytebuffer = ByteBuffer.allocate(5); + + bytebuffer.putInt(1); +- bytebuffer.put((byte) (this.e.a() | 128)); ++ bytebuffer.put((byte) (compressionType.a() | 128)); // Tuinity - replace with compressionType + ((java.nio.Buffer) bytebuffer).flip(); + return bytebuffer; + } +@@ -363,6 +766,7 @@ public class RegionFile implements AutoCloseable { + }; + } + ++ private final void flushHeader() throws IOException { this.b(); } // Tuinity - OBFHELPER + private void b() throws IOException { + ((java.nio.Buffer) this.f).position(0); + this.dataFile.write(this.f, 0L); +diff --git a/src/main/java/net/minecraft/server/RegionFileBitSet.java b/src/main/java/net/minecraft/server/RegionFileBitSet.java +index 1ebdf73cc..cfa3ecb03 100644 +--- a/src/main/java/net/minecraft/server/RegionFileBitSet.java ++++ b/src/main/java/net/minecraft/server/RegionFileBitSet.java +@@ -4,18 +4,42 @@ import java.util.BitSet; + + public class RegionFileBitSet { + +- private final BitSet a = new BitSet(); ++ private final BitSet a = new BitSet(); private final BitSet getBitset() { return this.a; } // Tuinity - OBFHELPER + + public RegionFileBitSet() {} + ++ public final void allocate(int from, int length) { this.a(from, length); } // Tuinity - OBFHELPER + public void a(int i, int j) { + this.a.set(i, i + j); + } + ++ public final void free(int from, int length) { this.b(from, length); } // Tuinity - OBFHELPER + public void b(int i, int j) { + this.a.clear(i, i + j); + } + ++ // Tuinity start ++ public final void copyFrom(RegionFileBitSet other) { ++ BitSet thisBitset = this.getBitset(); ++ BitSet otherBitset = other.getBitset(); ++ ++ for (int i = 0; i < Math.max(thisBitset.size(), otherBitset.size()); ++i) { ++ thisBitset.set(i, otherBitset.get(i)); ++ } ++ } ++ ++ public final boolean tryAllocate(int from, int length) { ++ BitSet bitset = this.getBitset(); ++ int firstSet = bitset.nextSetBit(from); ++ if (firstSet > 0 && firstSet < (from + length)) { ++ return false; ++ } ++ bitset.set(from, from + length); ++ return true; ++ } ++ // Tuinity end ++ ++ public final int allocateNewSpace(final int requiredLength) { return this.a(requiredLength); } // Tuinity - OBFHELPER + public int a(int i) { + int j = 0; + +diff --git a/src/main/java/net/minecraft/server/RegionFileCache.java b/src/main/java/net/minecraft/server/RegionFileCache.java +index 0f201000f..c88ad8de0 100644 +--- a/src/main/java/net/minecraft/server/RegionFileCache.java ++++ b/src/main/java/net/minecraft/server/RegionFileCache.java +@@ -18,6 +18,30 @@ public class RegionFileCache implements AutoCloseable { // Paper - no final + this.b = file; + } + ++ // Tuinity start ++ public static ChunkCoordIntPair getRegionFileCoordinates(File file) { ++ String fileName = file.getName(); ++ if (!fileName.startsWith("r.") || !fileName.endsWith(".mca")) { ++ return null; ++ } ++ ++ String[] split = fileName.split("\\."); ++ ++ if (split.length != 4) { ++ return null; ++ } ++ ++ try { ++ int x = Integer.parseInt(split[1]); ++ int z = Integer.parseInt(split[2]); ++ ++ return new ChunkCoordIntPair(x << 5, z << 5); ++ } catch (NumberFormatException ex) { ++ return null; ++ } ++ } ++ // Tuinity end ++ + + // Paper start + public synchronized RegionFile getRegionFileIfLoaded(ChunkCoordIntPair chunkcoordintpair) { // Paper - synchronize for async io +@@ -51,9 +75,9 @@ public class RegionFileCache implements AutoCloseable { // Paper - no final + this.b.mkdirs(); + } + +- File file = new File(this.b, "r." + chunkcoordintpair.getRegionX() + "." + chunkcoordintpair.getRegionZ() + ".mca"); ++ File file = new File(this.b, "r." + chunkcoordintpair.getRegionX() + "." + chunkcoordintpair.getRegionZ() + ".mca"); // Tuinity - diff on change + if (existingOnly && !file.exists()) return null; // CraftBukkit +- RegionFile regionfile1 = new RegionFile(file, this.b); ++ RegionFile regionfile1 = new RegionFile(file, this.b, this instanceof IChunkLoader); // Tuinity - allow for chunk regionfiles to regen header + + this.cache.putAndMoveToFirst(i, regionfile1); + // Paper start +@@ -137,6 +161,13 @@ public class RegionFileCache implements AutoCloseable { // Paper - no final + @Nullable + public NBTTagCompound read(ChunkCoordIntPair chunkcoordintpair) throws IOException { + RegionFile regionfile = this.getFile(chunkcoordintpair, false, true); // CraftBukkit // Paper ++ // Tuinity start - Add regionfile parameter ++ return this.readFromRegionFile(regionfile, chunkcoordintpair); ++ } ++ private NBTTagCompound readFromRegionFile(RegionFile regionfile, ChunkCoordIntPair chunkcoordintpair) throws IOException { ++ // We add the regionfile parameter to avoid the potential deadlock (on fileLock) if we went back to obtain a regionfile ++ // if we decide to re-read ++ // Tuinity end + try { // Paper + DataInputStream datainputstream = regionfile.a(chunkcoordintpair); + // Paper start +@@ -152,6 +183,16 @@ public class RegionFileCache implements AutoCloseable { // Paper - no final + try { + if (datainputstream != null) { + nbttagcompound = NBTCompressedStreamTools.a(datainputstream); ++ // Tuinity start - recover from corrupt regionfile header ++ if (this instanceof IChunkLoader) { ++ ChunkCoordIntPair chunkPos = ChunkRegionLoader.getChunkCoordinate(nbttagcompound); ++ if (!chunkPos.equals(chunkcoordintpair)) { ++ regionfile.recalculateHeader(); ++ regionfile.fileLock.lock(); // otherwise we will unlock twice and only lock once. ++ return this.readFromRegionFile(regionfile, chunkcoordintpair); ++ } ++ } ++ // Tuinity end + return nbttagcompound; + } + +diff --git a/src/main/java/net/minecraft/server/RegionFileCompression.java b/src/main/java/net/minecraft/server/RegionFileCompression.java +index 3382d678e..29137f495 100644 +--- a/src/main/java/net/minecraft/server/RegionFileCompression.java ++++ b/src/main/java/net/minecraft/server/RegionFileCompression.java +@@ -13,7 +13,7 @@ import javax.annotation.Nullable; + + public class RegionFileCompression { + +- private static final Int2ObjectMap d = new Int2ObjectOpenHashMap(); ++ private static final Int2ObjectMap d = new Int2ObjectOpenHashMap(); static final Int2ObjectMap getCompressionTypes() { return RegionFileCompression.d; } // Tuinity - OBFHELPER + public static final RegionFileCompression a = a(new RegionFileCompression(1, GZIPInputStream::new, GZIPOutputStream::new)); + public static final RegionFileCompression b = a(new RegionFileCompression(2, InflaterInputStream::new, DeflaterOutputStream::new)); + public static final RegionFileCompression c = a(new RegionFileCompression(3, (inputstream) -> { +@@ -36,8 +36,8 @@ public class RegionFileCompression { + return regionfilecompression; + } + +- @Nullable +- public static RegionFileCompression a(int i) { ++ @Nullable public static RegionFileCompression getByType(int type) { return RegionFileCompression.a(type); } // Tuinity - OBFHELPER ++ @Nullable public static RegionFileCompression a(int i) { // Tuinity - OBFHELPER + return (RegionFileCompression) RegionFileCompression.d.get(i); + } + +@@ -53,6 +53,7 @@ public class RegionFileCompression { + return (OutputStream) this.g.wrap(outputstream); + } + ++ public final InputStream wrap(InputStream inputstream) throws IOException { return this.a(inputstream); } // Tuinity - OBFHELPER + public InputStream a(InputStream inputstream) throws IOException { + return (InputStream) this.f.wrap(inputstream); + } +diff --git a/src/main/java/net/minecraft/server/StructureBoundingBox.java b/src/main/java/net/minecraft/server/StructureBoundingBox.java +index dbb565e74..118762778 100644 +--- a/src/main/java/net/minecraft/server/StructureBoundingBox.java ++++ b/src/main/java/net/minecraft/server/StructureBoundingBox.java +@@ -4,12 +4,12 @@ import com.google.common.base.MoreObjects; + + public class StructureBoundingBox { + +- public int a; +- public int b; +- public int c; +- public int d; +- public int e; +- public int f; ++ public int a; public final int getMinX() { return this.a; } // Tuinity - OBFHELPER ++ public int b; public final int getMinY() { return this.b; } // Tuinity - OBFHELPER ++ public int c; public final int getMinZ() { return this.c; } // Tuinity - OBFHELPER ++ public int d; public final int getMaxX() { return this.d; } // Tuinity - OBFHELPER ++ public int e; public final int getMaxY() { return this.e; } // Tuinity - OBFHELPER ++ public int f; public final int getMaxZ() { return this.f; } // Tuinity - OBFHELPER + + public StructureBoundingBox() {} + +@@ -84,6 +84,7 @@ public class StructureBoundingBox { + this.e = 512; + } + ++ public final boolean intersects(StructureBoundingBox boundingBox) { return this.b(boundingBox); } // Tuinity - OBFHELPER + public boolean b(StructureBoundingBox structureboundingbox) { + return this.d >= structureboundingbox.a && this.a <= structureboundingbox.d && this.f >= structureboundingbox.c && this.c <= structureboundingbox.f && this.e >= structureboundingbox.b && this.b <= structureboundingbox.e; + } +@@ -114,6 +115,7 @@ public class StructureBoundingBox { + return new StructureBoundingBox(this.a + i, this.b + j, this.c + k, this.d + i, this.e + j, this.f + k); + } + ++ public final boolean hasPoint(BaseBlockPosition baseblockposition) { return this.b(baseblockposition); } // Tuinity - OBFHELPER + public boolean b(BaseBlockPosition baseblockposition) { + return baseblockposition.getX() >= this.a && baseblockposition.getX() <= this.d && baseblockposition.getZ() >= this.c && baseblockposition.getZ() <= this.f && baseblockposition.getY() >= this.b && baseblockposition.getY() <= this.e; + } +diff --git a/src/main/java/net/minecraft/server/ThreadedMailbox.java b/src/main/java/net/minecraft/server/ThreadedMailbox.java +index 808256902..8b1a3f3f9 100644 +--- a/src/main/java/net/minecraft/server/ThreadedMailbox.java ++++ b/src/main/java/net/minecraft/server/ThreadedMailbox.java +@@ -17,7 +17,7 @@ public class ThreadedMailbox implements Mailbox, AutoCloseable, Runnable { + private final String e; + + public static ThreadedMailbox a(Executor executor, String s) { +- return new ThreadedMailbox<>(new PairedQueue.c<>(new ConcurrentLinkedQueue()), executor, s); ++ return new ThreadedMailbox<>(new PairedQueue.c<>(new ca.spottedleaf.concurrentutil.queue.MultiThreadedQueue<>()), executor, s); // Tuinity - use concurrentutil + } + + public ThreadedMailbox(PairedQueue pairedqueue, Executor executor, String s) { +diff --git a/src/main/java/net/minecraft/server/TickListServer.java b/src/main/java/net/minecraft/server/TickListServer.java +index f533860bb..a54d36d90 100644 +--- a/src/main/java/net/minecraft/server/TickListServer.java ++++ b/src/main/java/net/minecraft/server/TickListServer.java +@@ -42,6 +42,11 @@ public class TickListServer implements TickList { + // Paper end + + public void b() { ++ // Tuinity start - allow overriding ++ this.tick(); ++ } ++ public void tick() { ++ // Tuinity end + int i = this.nextTickList.size(); + + if (false) { // CraftBukkit +@@ -109,15 +114,30 @@ public class TickListServer implements TickList { + + @Override + public boolean b(BlockPosition blockposition, T t0) { ++ // Tuinity start - allow overriding ++ return this.isPendingTickThisTick(blockposition, t0); ++ } ++ public boolean isPendingTickThisTick(BlockPosition blockposition, T t0) { ++ // Tuinity end + return this.g.contains(new NextTickListEntry<>(blockposition, t0)); + } + + @Override + public void a(Stream> stream) { ++ // Tuinity start - allow overriding ++ this.scheduleAll(stream); ++ } ++ public void scheduleAll(Stream> stream) { ++ // Tuinity end + stream.forEach(this::a); + } + + public List> a(ChunkCoordIntPair chunkcoordintpair, boolean flag, boolean flag1) { ++ // Tuinity start - allow overriding ++ return this.getEntriesInChunk(chunkcoordintpair, flag, flag1); ++ } ++ public List> getEntriesInChunk(ChunkCoordIntPair chunkcoordintpair, boolean flag, boolean flag1) { ++ // Tuinity end + int i = (chunkcoordintpair.x << 4) - 2; + int j = i + 16 + 2; + int k = (chunkcoordintpair.z << 4) - 2; +@@ -127,6 +147,11 @@ public class TickListServer implements TickList { + } + + public List> a(StructureBoundingBox structureboundingbox, boolean flag, boolean flag1) { ++ // Tuinity start - allow overriding ++ return this.getEntriesInBoundingBox(structureboundingbox, flag, flag1); ++ } ++ public List> getEntriesInBoundingBox(StructureBoundingBox structureboundingbox, boolean flag, boolean flag1) { ++ // Tuinity end + List> list = this.a((List) null, this.nextTickList, structureboundingbox, flag); + + if (flag && list != null) { +@@ -166,6 +191,11 @@ public class TickListServer implements TickList { + } + + public void a(StructureBoundingBox structureboundingbox, BlockPosition blockposition) { ++ // Tuinity start - allow overriding ++ this.copy(structureboundingbox, blockposition); ++ } ++ public void copy(StructureBoundingBox structureboundingbox, BlockPosition blockposition) { ++ // Tuinity end + List> list = this.a(structureboundingbox, false, false); + Iterator iterator = list.iterator(); + +@@ -183,11 +213,17 @@ public class TickListServer implements TickList { + } + + public NBTTagList a(ChunkCoordIntPair chunkcoordintpair) { ++ // Tuinity start - allow overriding ++ return this.serialize(chunkcoordintpair); ++ } ++ public NBTTagList serialize(ChunkCoordIntPair chunkcoordintpair) { ++ // Tuinity end + List> list = this.a(chunkcoordintpair, false, true); + + return a(this.b, list, this.f.getTime()); + } + ++ public static NBTTagList serialize(Function function, Iterable> iterable, long i) { return TickListServer.a(function, iterable, i); } // Tuinity - OBFHELPER + public static NBTTagList a(Function function, Iterable> iterable, long i) { + NBTTagList nbttaglist = new NBTTagList(); + Iterator iterator = iterable.iterator(); +@@ -210,11 +246,21 @@ public class TickListServer implements TickList { + + @Override + public boolean a(BlockPosition blockposition, T t0) { ++ // Tuinity start - allow overriding ++ return this.isScheduledForTick(blockposition, t0); ++ } ++ public boolean isScheduledForTick(BlockPosition blockposition, T t0) { ++ // Tuinity end + return this.nextTickListHash.contains(new NextTickListEntry<>(blockposition, t0)); + } + + @Override + public void a(BlockPosition blockposition, T t0, int i, TickListPriority ticklistpriority) { ++ // Tuinity start - allow overriding ++ this.schedule(blockposition, t0, i, ticklistpriority); ++ } ++ public void schedule(BlockPosition blockposition, T t0, int i, TickListPriority ticklistpriority) { ++ // Tuinity end + if (!this.a.test(t0)) { + this.a(new NextTickListEntry<>(blockposition, t0, (long) i + this.f.getTime(), ticklistpriority)); + } +@@ -230,6 +276,11 @@ public class TickListServer implements TickList { + } + + public int a() { ++ // Tuinity start - allow overriding ++ return this.getTotalScheduledEntries(); ++ } ++ public int getTotalScheduledEntries() { ++ // Tuinity end + return this.nextTickListHash.size(); + } + } +diff --git a/src/main/java/net/minecraft/server/Ticket.java b/src/main/java/net/minecraft/server/Ticket.java +index 7a8397815..0d5b1a0b7 100644 +--- a/src/main/java/net/minecraft/server/Ticket.java ++++ b/src/main/java/net/minecraft/server/Ticket.java +@@ -5,9 +5,10 @@ import java.util.Objects; + public final class Ticket implements Comparable> { + + private final TicketType a; +- private final int b; ++ private int b; public final void setTicketLevel(final int value) { this.b = value; } // Tuinity - remove final, add set OBFHELPER + public final T identifier; public final T getObjectReason() { return this.identifier; } // Paper - OBFHELPER +- private long d; public final long getCreationTick() { return this.d; } // Paper - OBFHELPER ++ private long d; public final long getCreationTick() { return this.d; } public final void setCreationTick(final long value) { this.d = value; } // Paper - OBFHELPER // Tuinity - OBFHELPER ++ boolean isCached; // Tuinity - delay chunk unloads, this defends against really stupid plugins + + protected Ticket(TicketType tickettype, int i, T t0) { + this.a = tickettype; +@@ -60,6 +61,7 @@ public final class Ticket implements Comparable> { + this.d = i; + } + ++ protected final boolean isExpired(long time) { return this.b(time); } // Tuinity - OBFHELPER + protected boolean b(long i) { + long j = this.a.b(); + +diff --git a/src/main/java/net/minecraft/server/TicketType.java b/src/main/java/net/minecraft/server/TicketType.java +index 4b87ca2ec..141664b55 100644 +--- a/src/main/java/net/minecraft/server/TicketType.java ++++ b/src/main/java/net/minecraft/server/TicketType.java +@@ -23,6 +23,7 @@ public class TicketType { + public static final TicketType PLUGIN_TICKET = a("plugin_ticket", (plugin1, plugin2) -> plugin1.getClass().getName().compareTo(plugin2.getClass().getName())); // CraftBukkit + public static final TicketType ANTIXRAY = a("antixray", Integer::compareTo); // Paper - Anti-Xray + public static final TicketType ASYNC_LOAD = a("async_load", Long::compareTo); // Paper ++ public static final TicketType DELAYED_UNLOAD = a("delayed_unload", Long::compareTo); // Tuinity - delay chunk unloads by 30 seconds + + public static TicketType a(String s, Comparator comparator) { + return new TicketType<>(s, comparator, 0L); +diff --git a/src/main/java/net/minecraft/server/VoxelShapeArray.java b/src/main/java/net/minecraft/server/VoxelShapeArray.java +index caf297fe9..3161e3b97 100644 +--- a/src/main/java/net/minecraft/server/VoxelShapeArray.java ++++ b/src/main/java/net/minecraft/server/VoxelShapeArray.java +@@ -11,7 +11,7 @@ public final class VoxelShapeArray extends VoxelShape { + private final DoubleList d; + + protected VoxelShapeArray(VoxelShapeDiscrete voxelshapediscrete, double[] adouble, double[] adouble1, double[] adouble2) { +- this(voxelshapediscrete, (DoubleList) DoubleArrayList.wrap(Arrays.copyOf(adouble, voxelshapediscrete.b() + 1)), (DoubleList) DoubleArrayList.wrap(Arrays.copyOf(adouble1, voxelshapediscrete.c() + 1)), (DoubleList) DoubleArrayList.wrap(Arrays.copyOf(adouble2, voxelshapediscrete.d() + 1))); ++ this(voxelshapediscrete, com.tuinity.tuinity.util.fastutil.ExtendedDoubleArrayList.getList(adouble, voxelshapediscrete.b() + 1), com.tuinity.tuinity.util.fastutil.ExtendedDoubleArrayList.getList(adouble1, voxelshapediscrete.c() + 1), com.tuinity.tuinity.util.fastutil.ExtendedDoubleArrayList.getList(adouble2, voxelshapediscrete.d() + 1)); // Tuinity - remove iterator allocation + } + + VoxelShapeArray(VoxelShapeDiscrete voxelshapediscrete, DoubleList doublelist, DoubleList doublelist1, DoubleList doublelist2) { +diff --git a/src/main/java/net/minecraft/server/VoxelShapeCubePoint.java b/src/main/java/net/minecraft/server/VoxelShapeCubePoint.java +index 9e09671dc..b69a1ed46 100644 +--- a/src/main/java/net/minecraft/server/VoxelShapeCubePoint.java ++++ b/src/main/java/net/minecraft/server/VoxelShapeCubePoint.java +@@ -2,7 +2,7 @@ package net.minecraft.server; + + import it.unimi.dsi.fastutil.doubles.AbstractDoubleList; + +-public class VoxelShapeCubePoint extends AbstractDoubleList { ++public class VoxelShapeCubePoint extends com.tuinity.tuinity.util.fastutil.ExtendedAbstractDoubleList { // Tuinity - remove iterator allocation + + private final int a; + +diff --git a/src/main/java/net/minecraft/server/VoxelShapeMergerList.java b/src/main/java/net/minecraft/server/VoxelShapeMergerList.java +index 71d2ae2a9..9129eaa64 100644 +--- a/src/main/java/net/minecraft/server/VoxelShapeMergerList.java ++++ b/src/main/java/net/minecraft/server/VoxelShapeMergerList.java +@@ -18,7 +18,7 @@ public final class VoxelShapeMergerList implements VoxelShapeMerger { + int l = doublelist1.size(); + int i1 = k + l; + +- this.a = new DoubleArrayList(i1); ++ this.a = new com.tuinity.tuinity.util.fastutil.ExtendedDoubleArrayList(i1); // Tuinity - remove iterator creation + this.b = new IntArrayList(i1); + this.c = new IntArrayList(i1); + +diff --git a/src/main/java/net/minecraft/server/VoxelShapes.java b/src/main/java/net/minecraft/server/VoxelShapes.java +index 08c83c62d..d5da9f582 100644 +--- a/src/main/java/net/minecraft/server/VoxelShapes.java ++++ b/src/main/java/net/minecraft/server/VoxelShapes.java +@@ -19,7 +19,7 @@ public final class VoxelShapes { + return new VoxelShapeCube(voxelshapebitset); + }); + public static final VoxelShape a = create(Double.NEGATIVE_INFINITY, Double.NEGATIVE_INFINITY, Double.NEGATIVE_INFINITY, Double.POSITIVE_INFINITY, Double.POSITIVE_INFINITY, Double.POSITIVE_INFINITY); +- private static final VoxelShape c = new VoxelShapeArray(new VoxelShapeBitSet(0, 0, 0), new DoubleArrayList(new double[]{0.0D}), new DoubleArrayList(new double[]{0.0D}), new DoubleArrayList(new double[]{0.0D})); ++ private static final VoxelShape c = new VoxelShapeArray(new VoxelShapeBitSet(0, 0, 0), new com.tuinity.tuinity.util.fastutil.ExtendedDoubleArrayList(new double[]{0.0D}), new com.tuinity.tuinity.util.fastutil.ExtendedDoubleArrayList(new double[]{0.0D}), new com.tuinity.tuinity.util.fastutil.ExtendedDoubleArrayList(new double[]{0.0D})); // Tuinity - remove iterator allocation + + public static VoxelShape a() { + return VoxelShapes.c; +diff --git a/src/main/java/net/minecraft/server/World.java b/src/main/java/net/minecraft/server/World.java +index baad98517..c0c83d433 100644 +--- a/src/main/java/net/minecraft/server/World.java ++++ b/src/main/java/net/minecraft/server/World.java +@@ -80,6 +80,8 @@ public abstract class World implements GeneratorAccess, AutoCloseable { + public final com.destroystokyo.paper.PaperWorldConfig paperConfig; // Paper + public final ChunkPacketBlockController chunkPacketBlockController; // Paper - Anti-Xray + ++ public final com.tuinity.tuinity.config.TuinityConfig.WorldConnfig tuinityConfig; // Tuinity - Server Config ++ + public final co.aikar.timings.WorldTimingsHandler timings; // Paper + public static BlockPosition lastPhysicsProblem; // Spigot + private org.spigotmc.TickLimiter entityLimiter; +@@ -129,6 +131,7 @@ public abstract class World implements GeneratorAccess, AutoCloseable { + this.spigotConfig = new org.spigotmc.SpigotWorldConfig( worlddata.getName() ); // Spigot + this.paperConfig = new com.destroystokyo.paper.PaperWorldConfig(worlddata.getName(), this.spigotConfig); // Paper + this.chunkPacketBlockController = this.paperConfig.antiXray ? new ChunkPacketBlockControllerAntiXray(this.paperConfig) : ChunkPacketBlockController.NO_OPERATION_INSTANCE; // Paper - Anti-Xray ++ this.tuinityConfig = new com.tuinity.tuinity.config.TuinityConfig.WorldConnfig(worlddata.getName()); // Tuinity - Server Config + this.generator = gen; + this.world = new CraftWorld((WorldServer) this, gen, env); + this.ticksPerAnimalSpawns = this.getServer().getTicksPerAnimalSpawns(); // CraftBukkit +@@ -329,6 +332,7 @@ public abstract class World implements GeneratorAccess, AutoCloseable { + + @Override + public boolean setTypeAndData(BlockPosition blockposition, IBlockData iblockdata, int i) { ++ com.tuinity.tuinity.util.TickThread.softEnsureTickThread("Async set type call"); // Tuinity + // CraftBukkit start - tree generation + if (this.captureTreeGeneration) { + CraftBlockState blockstate = capturedBlockStates.get(blockposition); +@@ -425,6 +429,7 @@ public abstract class World implements GeneratorAccess, AutoCloseable { + + // CraftBukkit start - Split off from above in order to directly send client and physic updates + public void notifyAndUpdatePhysics(BlockPosition blockposition, Chunk chunk, IBlockData oldBlock, IBlockData newBlock, IBlockData actualBlock, int i) { ++ com.tuinity.tuinity.util.TickThread.softEnsureTickThread("Async notify and update"); // Tuinity + IBlockData iblockdata = newBlock; + IBlockData iblockdata1 = oldBlock; + IBlockData iblockdata2 = actualBlock; +@@ -433,8 +438,13 @@ public abstract class World implements GeneratorAccess, AutoCloseable { + this.b(blockposition, iblockdata1, iblockdata2); + } + +- if ((i & 2) != 0 && (!this.isClientSide || (i & 4) == 0) && (this.isClientSide || chunk == null || (chunk.getState() != null && chunk.getState().isAtLeast(PlayerChunk.State.TICKING)))) { // allow chunk to be null here as chunk.isReady() is false when we send our notification during block placement ++ if ((i & 2) != 0 && (!this.isClientSide || (i & 4) == 0) && (this.isClientSide || chunk == null || (chunk.getState() != null && chunk.getState().isAtLeast(PlayerChunk.State.TICKING)))) { // allow chunk to be null here as chunk.isReady() is false when we send our notification during block placement // Tuinity - diff on change, see below + this.notify(blockposition, iblockdata1, iblockdata, i); ++ // Tuinity start - per player view distance - allow block updates for non-ticking chunks in player view distance ++ // if copied from above ++ } else if ((i & 2) != 0 && (!this.isClientSide || (i & 4) == 0) && (this.isClientSide || chunk == null || ((WorldServer)this).getChunkProvider().playerChunkMap.playerViewDistanceBroadcastMap.getObjectsInRange(com.tuinity.tuinity.util.Util.getCoordinateKey(blockposition)) != null)) { ++ ((WorldServer)this).getChunkProvider().flagDirty(blockposition); ++ // Tuinity end - per player view distance + } + + if (!this.isClientSide && (i & 1) != 0) { +@@ -1175,9 +1185,11 @@ public abstract class World implements GeneratorAccess, AutoCloseable { + int k = MathHelper.floor((axisalignedbb.minZ - 2.0D) / 16.0D); + int l = MathHelper.floor((axisalignedbb.maxZ + 2.0D) / 16.0D); + ++ ChunkProviderServer chunkProvider = ((ChunkProviderServer)this.chunkProvider); // Tuinity - optimize for loaded chunks ++ + for (int i1 = i; i1 <= j; ++i1) { + for (int j1 = k; j1 <= l; ++j1) { +- Chunk chunk = (Chunk)this.getChunkIfLoadedImmediately(i1, j1); // Paper ++ Chunk chunk = chunkProvider.getChunkAtIfLoadedMainThread(i1, j1); // Paper // Tuinity - optimize for loaded chunks + + if (chunk != null) { + chunk.a(entity, axisalignedbb, list, predicate); +@@ -1196,9 +1208,11 @@ public abstract class World implements GeneratorAccess, AutoCloseable { + int l = MathHelper.f((axisalignedbb.maxZ + 2.0D) / 16.0D); + List list = Lists.newArrayList(); + ++ ChunkProviderServer chunkProvider = ((ChunkProviderServer)this.chunkProvider); // Tuinity - optimize for loaded chunks ++ + for (int i1 = i; i1 < j; ++i1) { + for (int j1 = k; j1 < l; ++j1) { +- Chunk chunk = (Chunk)this.getChunkIfLoadedImmediately(i1, j1); // Paper ++ Chunk chunk = chunkProvider.getChunkAtIfLoadedMainThread(i1, j1); // Paper // Tuinity - optimize for loaded chunks + + if (chunk != null) { + chunk.a(entitytypes, axisalignedbb, list, predicate); +@@ -1218,10 +1232,11 @@ public abstract class World implements GeneratorAccess, AutoCloseable { + int l = MathHelper.f((axisalignedbb.maxZ + 2.0D) / 16.0D); + List list = Lists.newArrayList(); + IChunkProvider ichunkprovider = this.getChunkProvider(); ++ ChunkProviderServer chunkProvider = ((ChunkProviderServer)this.chunkProvider); // Tuinity - optimize for loaded chunks + + for (int i1 = i; i1 < j; ++i1) { + for (int j1 = k; j1 < l; ++j1) { +- Chunk chunk = (Chunk)this.getChunkIfLoadedImmediately(i1, j1); // Paper ++ Chunk chunk = chunkProvider.getChunkAtIfLoadedMainThread(i1, j1); // Paper // Tuinity - optimize for loaded chunks + + if (chunk != null) { + chunk.a(oclass, axisalignedbb, list, predicate); +diff --git a/src/main/java/net/minecraft/server/WorldServer.java b/src/main/java/net/minecraft/server/WorldServer.java +index c74b85917..214b555e7 100644 +--- a/src/main/java/net/minecraft/server/WorldServer.java ++++ b/src/main/java/net/minecraft/server/WorldServer.java +@@ -55,7 +55,7 @@ public class WorldServer extends World { + + private static final Logger LOGGER = LogManager.getLogger(); + private final List globalEntityList = Lists.newArrayList(); +- public final Int2ObjectMap entitiesById = new Int2ObjectLinkedOpenHashMap(); ++ public final Int2ObjectLinkedOpenHashMap entitiesById = new Int2ObjectLinkedOpenHashMap(); // Tuinity - change type for fast iterator + private final Map entitiesByUUID = Maps.newHashMap(); + private final Queue entitiesToAdd = Queues.newArrayDeque(); + public final List players = Lists.newArrayList(); // Paper - private -> public +@@ -82,6 +82,8 @@ public class WorldServer extends World { + return new Throwable(entity + " Added to world at " + new java.util.Date()); + } + ++ final com.tuinity.tuinity.util.EntityList trackingUpdateQueue = new com.tuinity.tuinity.util.EntityList(); // Tuinity - optimise tracker ++ + // Paper start - optimise getPlayerByUUID + @Nullable + @Override +@@ -170,6 +172,373 @@ public class WorldServer extends World { + } + // Paper end + ++ ++ // Tuinity start ++ public final com.tuinity.tuinity.util.EntityList loadedEntities = new com.tuinity.tuinity.util.EntityList(); ++ void onChunkLoad(final Chunk chunk) { ++ final com.destroystokyo.paper.util.maplist.EntityList list = chunk.entities; ++ final Entity[] entities = list.getRawData(); ++ for (int i = 0, size = list.size(); i < size; ++i) { ++ this.loadedEntities.add(entities[i]); ++ } ++ } ++ ++ void onChunkUnload(final Chunk chunk) { ++ final com.destroystokyo.paper.util.maplist.EntityList list = chunk.entities; ++ final Entity[] entities = list.getRawData(); ++ for (int i = 0, size = list.size(); i < size; ++i) { ++ this.loadedEntities.remove(entities[i]); ++ } ++ } ++ ++ void onChunkSetTicking(int chunkX, int chunkZ) { ++ ((com.tuinity.tuinity.server.TuinityTickList)this.nextTickListBlock).onChunkSetTicking(chunkX, chunkZ); ++ ((com.tuinity.tuinity.server.TuinityTickList)this.nextTickListFluid).onChunkSetTicking(chunkX, chunkZ); ++ } ++ // Tuinity end ++ ++ // Tuinity start ++ // TODO the general area map is too large, use a smaller one depending on distance ++ @Nullable ++ public EntityPlayer findClosestPlayer(double fromX, double fromY, double fromZ, double distance) { ++ double maximumDistanceSquared; ++ if (distance < 0) { ++ maximumDistanceSquared = Double.MAX_VALUE; ++ } else { ++ maximumDistanceSquared = distance * distance; ++ } ++ ++ EntityPlayer closestPlayer = null; ++ double closestDistanceSquared = maximumDistanceSquared; ++ ++ com.tuinity.tuinity.util.map.PooledLinkedHashSets.PooledObjectLinkedOpenHashSet nearestPlayers = ++ this.getChunkProvider().playerChunkMap.playerGeneralAreaMap ++ .getObjectsInRange(com.tuinity.tuinity.util.Util.getCoordinateKey(com.tuinity.tuinity.util.Util.getChunkCoordinate(fromX), com.tuinity.tuinity.util.Util.getChunkCoordinate(fromZ))); ++ ++ if (nearestPlayers != null) { ++ Object[] backingSet = nearestPlayers.getBackingSet(); ++ ++ for (int i = 0, len = backingSet.length; i < len; ++i) { ++ Object raw = backingSet[i]; ++ if (!(raw instanceof EntityPlayer)) { ++ continue; ++ } ++ EntityPlayer currPlayer = (EntityPlayer)raw; ++ double currDistanceSquared = currPlayer.getDistanceSquared(fromX, fromY, fromZ); ++ ++ if (currDistanceSquared <= closestDistanceSquared && currDistanceSquared <= PlayerChunkMap.PLAYER_GENERAL_AREA_MAP_DISTANCE_SQUARED_BLOCKS) { ++ closestPlayer = currPlayer; ++ closestDistanceSquared = currDistanceSquared; ++ } ++ } ++ } ++ ++ if (closestPlayer != null) { ++ return closestPlayer; ++ } else if (maximumDistanceSquared <= PlayerChunkMap.PLAYER_GENERAL_AREA_MAP_DISTANCE_SQUARED_BLOCKS) { ++ return null; ++ } ++ ++ // fall back to iteration over the world players ++ ++ for (int i = 0, len = this.players.size(); i < len; ++i) { ++ EntityPlayer currPlayer = this.players.get(i); ++ double currDistanceSquared = currPlayer.getDistanceSquared(fromX, fromY, fromZ); ++ ++ if (currDistanceSquared <= closestDistanceSquared) { ++ closestPlayer = currPlayer; ++ closestDistanceSquared = currDistanceSquared; ++ } ++ } ++ ++ return closestPlayer; ++ } ++ ++ @Nullable ++ public EntityPlayer findClosestPlayer(double fromX, double fromY, double fromZ, double distance, @Nullable Predicate predicate) { ++ if (predicate == null) { ++ return this.findClosestPlayer(fromX, fromY, fromZ, distance); ++ } ++ ++ double maximumDistanceSquared; ++ if (distance < 0) { ++ maximumDistanceSquared = Double.MAX_VALUE; ++ } else { ++ maximumDistanceSquared = distance * distance; ++ } ++ ++ EntityPlayer closestPlayer = null; ++ double closestDistanceSquared = maximumDistanceSquared; ++ ++ com.tuinity.tuinity.util.map.PooledLinkedHashSets.PooledObjectLinkedOpenHashSet nearestPlayers = ++ this.getChunkProvider().playerChunkMap.playerGeneralAreaMap ++ .getObjectsInRange(com.tuinity.tuinity.util.Util.getCoordinateKey(com.tuinity.tuinity.util.Util.getChunkCoordinate(fromX), com.tuinity.tuinity.util.Util.getChunkCoordinate(fromZ))); ++ ++ if (nearestPlayers != null) { ++ Object[] backingSet = nearestPlayers.getBackingSet(); ++ ++ for (int i = 0, len = backingSet.length; i < len; ++i) { ++ Object raw = backingSet[i]; ++ if (!(raw instanceof EntityPlayer)) { ++ continue; ++ } ++ EntityPlayer currPlayer = (EntityPlayer)raw; ++ double currDistanceSquared = currPlayer.getDistanceSquared(fromX, fromY, fromZ); ++ ++ if (predicate.test(currPlayer) && currDistanceSquared <= closestDistanceSquared && currDistanceSquared <= PlayerChunkMap.PLAYER_GENERAL_AREA_MAP_DISTANCE_SQUARED_BLOCKS) { ++ closestPlayer = currPlayer; ++ closestDistanceSquared = currDistanceSquared; ++ } ++ } ++ } ++ ++ if (closestPlayer != null) { ++ return closestPlayer; ++ } else if (maximumDistanceSquared <= PlayerChunkMap.PLAYER_GENERAL_AREA_MAP_DISTANCE_SQUARED_BLOCKS) { ++ return null; ++ } ++ ++ // fall back to iteration over the world players ++ ++ for (int i = 0, len = this.players.size(); i < len; ++i) { ++ EntityPlayer currPlayer = this.players.get(i); ++ double currDistanceSquared = currPlayer.getDistanceSquared(fromX, fromY, fromZ); ++ ++ if (predicate.test(currPlayer) && currDistanceSquared <= closestDistanceSquared) { ++ closestPlayer = currPlayer; ++ closestDistanceSquared = currDistanceSquared; ++ } ++ } ++ ++ return closestPlayer; ++ } ++ ++ @Nullable ++ public List findPlayersInRange(double fromX, double fromY, double fromZ, double distance) { ++ return this.findPlayersInRange(fromX, fromY, fromZ, distance, new java.util.ArrayList<>(), null); ++ } ++ ++ @Nullable ++ public List findPlayersInRange(double fromX, double fromY, double fromZ, double distance, @Nonnull List players, @Nullable Predicate predicate) { ++ double maximumDistanceSquared; ++ if (distance < 0) { ++ maximumDistanceSquared = Double.MAX_VALUE; ++ } else { ++ maximumDistanceSquared = distance * distance; ++ } ++ ++ com.tuinity.tuinity.util.map.PooledLinkedHashSets.PooledObjectLinkedOpenHashSet nearestPlayers = ++ this.getChunkProvider().playerChunkMap.playerGeneralAreaMap ++ .getObjectsInRange(com.tuinity.tuinity.util.Util.getCoordinateKey(com.tuinity.tuinity.util.Util.getChunkCoordinate(fromX), com.tuinity.tuinity.util.Util.getChunkCoordinate(fromZ))); ++ ++ if (nearestPlayers != null) { ++ Object[] backingSet = nearestPlayers.getBackingSet(); ++ ++ for (int i = 0, len = backingSet.length; i < len; ++i) { ++ Object raw = backingSet[i]; ++ if (!(raw instanceof EntityPlayer)) { ++ continue; ++ } ++ EntityPlayer currPlayer = (EntityPlayer)raw; ++ double currDistanceSquared = currPlayer.getDistanceSquared(fromX, fromY, fromZ); ++ ++ if ((predicate == null || predicate.test(currPlayer)) && currDistanceSquared <= maximumDistanceSquared && currDistanceSquared <= PlayerChunkMap.PLAYER_GENERAL_AREA_MAP_DISTANCE_SQUARED_BLOCKS) { ++ players.add(currPlayer); ++ } ++ } ++ } ++ ++ if (maximumDistanceSquared <= PlayerChunkMap.PLAYER_GENERAL_AREA_MAP_DISTANCE_SQUARED_BLOCKS) { ++ return players; ++ } ++ ++ // fall back to iteration over the world players ++ ++ for (int i = 0, len = this.players.size(); i < len; ++i) { ++ EntityPlayer currPlayer = this.players.get(i); ++ double currDistanceSquared = currPlayer.getDistanceSquared(fromX, fromY, fromZ); ++ ++ if ((predicate == null || predicate.test(currPlayer)) && currDistanceSquared <= maximumDistanceSquared) { ++ players.add(currPlayer); ++ } ++ } ++ ++ return players; ++ } ++ ++ @Override ++ public boolean isPlayerNearby(double fromX, double fromY, double fromZ, double distance) { ++ double maximumDistanceSquared; ++ if (distance < 0) { ++ maximumDistanceSquared = Double.MAX_VALUE; ++ } else { ++ maximumDistanceSquared = distance * distance; ++ } ++ ++ com.tuinity.tuinity.util.map.PooledLinkedHashSets.PooledObjectLinkedOpenHashSet nearestPlayers = ++ this.getChunkProvider().playerChunkMap.playerGeneralAreaMap ++ .getObjectsInRange(com.tuinity.tuinity.util.Util.getCoordinateKey(com.tuinity.tuinity.util.Util.getChunkCoordinate(fromX), com.tuinity.tuinity.util.Util.getChunkCoordinate(fromZ))); ++ ++ if (nearestPlayers != null) { ++ Object[] backingSet = nearestPlayers.getBackingSet(); ++ ++ for (int i = 0, len = backingSet.length; i < len; ++i) { ++ Object raw = backingSet[i]; ++ if (!(raw instanceof EntityPlayer)) { ++ continue; ++ } ++ EntityPlayer currPlayer = (EntityPlayer)raw; ++ double currDistanceSquared = currPlayer.getDistanceSquared(fromX, fromY, fromZ); ++ ++ // TODO check on update ++ if ((currPlayer.isAlive() && !currPlayer.isSpectator()) && currDistanceSquared <= maximumDistanceSquared && currDistanceSquared <= PlayerChunkMap.PLAYER_GENERAL_AREA_MAP_DISTANCE_SQUARED_BLOCKS) { ++ return true; ++ } ++ } ++ } ++ ++ if (maximumDistanceSquared <= PlayerChunkMap.PLAYER_GENERAL_AREA_MAP_DISTANCE_SQUARED_BLOCKS) { ++ return false; ++ } ++ ++ // fall back to iteration over the world players ++ ++ for (int i = 0, len = this.players.size(); i < len; ++i) { ++ EntityPlayer currPlayer = this.players.get(i); ++ double currDistanceSquared = currPlayer.getDistanceSquared(fromX, fromY, fromZ); ++ ++ // TODO check on update ++ if ((currPlayer.isAlive() && !currPlayer.isSpectator()) && currDistanceSquared <= maximumDistanceSquared) { ++ return true; ++ } ++ } ++ ++ return false; ++ } ++ ++ @Override ++ public EntityPlayer findClosestPlayerXZ(double fromX, double fromZ, double distanceXZ, @Nullable Predicate predicate) { ++ double maximumDistanceSquared; ++ if (distanceXZ < 0) { ++ maximumDistanceSquared = Double.MAX_VALUE; ++ } else { ++ maximumDistanceSquared = distanceXZ * distanceXZ; ++ } ++ ++ EntityPlayer closestPlayer = null; ++ double closestDistanceSquared = maximumDistanceSquared; ++ ++ com.tuinity.tuinity.util.map.PooledLinkedHashSets.PooledObjectLinkedOpenHashSet nearestPlayers = ++ this.getChunkProvider().playerChunkMap.playerGeneralAreaMap ++ .getObjectsInRange(com.tuinity.tuinity.util.Util.getCoordinateKey(com.tuinity.tuinity.util.Util.getChunkCoordinate(fromX), com.tuinity.tuinity.util.Util.getChunkCoordinate(fromZ))); ++ ++ if (nearestPlayers != null) { ++ Object[] backingSet = nearestPlayers.getBackingSet(); ++ ++ for (int i = 0, len = backingSet.length; i < len; ++i) { ++ Object raw = backingSet[i]; ++ if (!(raw instanceof EntityPlayer)) { ++ continue; ++ } ++ EntityPlayer currPlayer = (EntityPlayer)raw; ++ double currDistanceSquared = currPlayer.getDistanceXZSquared(fromX, fromZ); ++ ++ if ((predicate == null || predicate.test(currPlayer)) && currDistanceSquared <= closestDistanceSquared && currDistanceSquared <= PlayerChunkMap.PLAYER_GENERAL_AREA_MAP_DISTANCE_SQUARED_BLOCKS) { ++ closestPlayer = currPlayer; ++ closestDistanceSquared = currDistanceSquared; ++ } ++ } ++ } ++ ++ if (closestPlayer != null) { ++ return closestPlayer; ++ } else if (maximumDistanceSquared <= PlayerChunkMap.PLAYER_GENERAL_AREA_MAP_DISTANCE_SQUARED_BLOCKS) { ++ return null; ++ } ++ ++ // fall back to iteration over the world players ++ ++ for (int i = 0, len = this.players.size(); i < len; ++i) { ++ EntityPlayer currPlayer = this.players.get(i); ++ double currDistanceSquared = currPlayer.getDistanceXZSquared(fromX, fromZ); ++ ++ if ((predicate == null || predicate.test(currPlayer)) && currDistanceSquared <= closestDistanceSquared) { ++ closestPlayer = currPlayer; ++ closestDistanceSquared = currDistanceSquared; ++ } ++ } ++ ++ return closestPlayer; ++ } ++ ++ @Nullable ++ @Override ++ public EntityPlayer getNearestPlayerForPathFinding(PathfinderTargetCondition pathfindertargetcondition, @Nullable EntityLiving entityliving, double fromX, double fromY, double fromZ) { ++ double maximumDistanceSquared = PlayerChunkMap.PLAYER_GENERAL_AREA_MAP_DISTANCE_SQUARED_BLOCKS; ++ // it isn't mojang behaviour to straight up limit to 576 blocks or less, but there should be nothing ++ // that tracks outside that range. Besides, not hard limiting at some point is really stupid. ++ ++ EntityPlayer closestPlayer = null; ++ double closestDistanceSquared = maximumDistanceSquared; ++ ++ com.tuinity.tuinity.util.map.PooledLinkedHashSets.PooledObjectLinkedOpenHashSet nearestPlayers = ++ this.getChunkProvider().playerChunkMap.playerGeneralAreaMap ++ .getObjectsInRange(com.tuinity.tuinity.util.Util.getCoordinateKey(com.tuinity.tuinity.util.Util.getChunkCoordinate(fromX), com.tuinity.tuinity.util.Util.getChunkCoordinate(fromZ))); ++ ++ if (nearestPlayers != null) { ++ Object[] backingSet = nearestPlayers.getBackingSet(); ++ ++ for (int i = 0, len = backingSet.length; i < len; ++i) { ++ Object raw = backingSet[i]; ++ if (!(raw instanceof EntityPlayer)) { ++ continue; ++ } ++ EntityPlayer currPlayer = (EntityPlayer)raw; ++ double currDistanceSquared = currPlayer.getDistanceSquared(fromX, fromY, fromZ); ++ ++ if (pathfindertargetcondition.test(entityliving, currPlayer) && currDistanceSquared <= closestDistanceSquared && currDistanceSquared <= PlayerChunkMap.PLAYER_GENERAL_AREA_MAP_DISTANCE_SQUARED_BLOCKS) { ++ closestPlayer = currPlayer; ++ closestDistanceSquared = currDistanceSquared; ++ } ++ } ++ } ++ ++ return closestPlayer; ++ } ++ ++ @Override ++ public List getNearestPlayersForPathFinding(PathfinderTargetCondition pathfindertargetcondition, EntityLiving entityliving, AxisAlignedBB axisalignedbb) { ++ List ret = new java.util.ArrayList<>(); ++ ++ double centerX = (axisalignedbb.minX + axisalignedbb.maxX) / 2.0; ++ double centerZ = (axisalignedbb.minZ + axisalignedbb.maxZ) / 2.0; ++ ++ // we make the assumption that the bounding box isn't greater-than the general area map's chunk radius (~576 blocks) ++ ++ com.tuinity.tuinity.util.map.PooledLinkedHashSets.PooledObjectLinkedOpenHashSet nearestPlayers = ++ this.getChunkProvider().playerChunkMap.playerGeneralAreaMap ++ .getObjectsInRange(com.tuinity.tuinity.util.Util.getCoordinateKey(com.tuinity.tuinity.util.Util.getChunkCoordinate(centerX), com.tuinity.tuinity.util.Util.getChunkCoordinate(centerZ))); ++ ++ if (nearestPlayers != null) { ++ Object[] backingSet = nearestPlayers.getBackingSet(); ++ ++ for (int i = 0, len = backingSet.length; i < len; ++i) { ++ Object raw = backingSet[i]; ++ if (!(raw instanceof EntityPlayer)) { ++ continue; ++ } ++ EntityPlayer currPlayer = (EntityPlayer)raw; ++ ++ if (axisalignedbb.contains(currPlayer.locX(), currPlayer.locY(), currPlayer.locZ()) && pathfindertargetcondition.test(entityliving, currPlayer)) { ++ ret.add(currPlayer); ++ } ++ } ++ } ++ ++ return ret; ++ } ++ // Tuinity end ++ + // Add env and gen to constructor + public WorldServer(MinecraftServer minecraftserver, Executor executor, WorldNBTStorage worldnbtstorage, WorldData worlddata, DimensionManager dimensionmanager, GameProfilerFiller gameprofilerfiller, WorldLoadListener worldloadlistener, org.bukkit.World.Environment env, org.bukkit.generator.ChunkGenerator gen) { + super(worlddata, dimensionmanager, (world, worldprovider) -> { +@@ -190,10 +559,10 @@ public class WorldServer extends World { + this.pvpMode = minecraftserver.getPVP(); + worlddata.world = this; + // CraftBukkit end +- this.nextTickListBlock = new TickListServer<>(this, (block) -> { ++ this.nextTickListBlock = new com.tuinity.tuinity.server.TuinityTickList<>(this, (block) -> { // Tuinity - optimise TickListServer + return block == null || block.getBlockData().isAir(); + }, IRegistry.BLOCK::getKey, IRegistry.BLOCK::get, this::b, "Blocks"); // Paper - Timings +- this.nextTickListFluid = new TickListServer<>(this, (fluidtype) -> { ++ this.nextTickListFluid = new com.tuinity.tuinity.server.TuinityTickList<>(this, (fluidtype) -> { // Tuinity - optimise TickListServer + return fluidtype == null || fluidtype == FluidTypes.EMPTY; + }, IRegistry.FLUID::getKey, IRegistry.FLUID::get, this::a, "Fluids"); // Paper - Timings + this.navigators = Sets.newHashSet(); +@@ -458,14 +827,13 @@ public class WorldServer extends World { + + gameprofilerfiller.exitEnter("regular"); + this.tickingEntities = true; +- ObjectIterator objectiterator = this.entitiesById.int2ObjectEntrySet().iterator(); ++ Iterator objectiterator = this.loadedEntities.iterator(); // Tuinity - use fast iterator to reduce entry creation // Tuinity - use loaded entity list + + org.spigotmc.ActivationRange.activateEntities(this); // Spigot + timings.entityTick.startTiming(); // Spigot + TimingHistory.entityTicks += this.globalEntityList.size(); // Paper + while (objectiterator.hasNext()) { +- Entry entry = (Entry) objectiterator.next(); +- Entity entity1 = (Entity) entry.getValue(); ++ Entity entity1 = (Entity) objectiterator.next(); // Tuinity - use loaded entity list + Entity entity2 = entity1.getVehicle(); + + /* CraftBukkit start - We prevent spawning in general, so this butchering is not needed +@@ -502,7 +870,7 @@ public class WorldServer extends World { + gameprofilerfiller.enter("remove"); + if (entity1.dead) { + this.removeEntityFromChunk(entity1); +- objectiterator.remove(); ++ objectiterator.remove(); this.entitiesById.remove(entity1.getId()); // Tuinity - use loaded entity list + this.unregisterEntity(entity1); + } + +@@ -818,6 +1186,10 @@ public class WorldServer extends World { + int k = MathHelper.floor(entity.locZ() / 16.0D); + + if (!entity.inChunk || entity.chunkX != i || entity.chunkY != j || entity.chunkZ != k) { ++ // Tuinity start - optimized tracker ++ int prevChunkX = entity.chunkX; ++ int prevChunkZ = entity.chunkZ; ++ // Tuinity end - optimized tracker + if (entity.inChunk && this.isChunkLoaded(entity.chunkX, entity.chunkZ)) { + this.getChunkAt(entity.chunkX, entity.chunkZ).a(entity, entity.chunkY); + } +@@ -827,6 +1199,90 @@ public class WorldServer extends World { + } else { + this.getChunkAt(i, k).a(entity); + } ++ // Tuinity start - optimized tracker ++ int newChunkX = entity.chunkX; ++ int newChunkZ = entity.chunkZ; ++ if (entity.valid && (prevChunkX != newChunkX || prevChunkZ != newChunkZ)) { ++ PlayerChunkMap chunkMap = this.getChunkProvider().playerChunkMap; ++ if (chunkMap.playerEntityTrackerTrackMap != null) { ++ if (PlayerChunkMap.isLegacyTrackingEntity(entity)) { ++ if (chunkMap.playerEntityTrackerLegacyMap != null) { ++ if (chunkMap.playerEntityTrackerLegacyMap.getObjectsInRange(newChunkX, newChunkZ) != null) { ++ chunkMap.activelyTrackedEntitiesLegacy.add(entity); // ensure tracked ++ // untracking is handled in tracker tick ++ } ++ } ++ } else { ++ // handle tracking ++ com.tuinity.tuinity.util.map.PooledLinkedHashSets.PooledObjectLinkedOpenHashSet oldRange = ++ chunkMap.playerEntityTrackerTrackMap.getObjectsInRange(prevChunkX, prevChunkZ); ++ com.tuinity.tuinity.util.map.PooledLinkedHashSets.PooledObjectLinkedOpenHashSet newRange = ++ chunkMap.playerEntityTrackerTrackMap.getObjectsInRange(newChunkX, newChunkZ); ++ ++ if (oldRange != newRange) { // optimization: equal pooled sets are identity equal ++ if (newRange != null) { ++ if (oldRange == null) { ++ Object[] backingSet = newRange.getBackingSet(); ++ for (int index = 0, len = backingSet.length; index < len; ++index) { ++ Object temp = backingSet[index]; ++ if (!(temp instanceof EntityPlayer)) { ++ continue; ++ } ++ EntityPlayer player = (EntityPlayer) temp; ++ entity.addToTrackQueue(player); ++ } ++ } else { ++ Object[] backingSet = newRange.getBackingSet(); ++ for (int index = 0, len = backingSet.length; index < len; ++index) { ++ Object temp = backingSet[index]; ++ if (!(temp instanceof EntityPlayer)) { ++ continue; ++ } ++ EntityPlayer player = (EntityPlayer) temp; ++ if (oldRange.contains(player)) { ++ continue; ++ } ++ entity.addToTrackQueue(player); ++ } ++ } ++ } ++ } ++ ++ // handle untracking ++ oldRange = chunkMap.playerEntityTrackerUntrackMap.getObjectsInRange(prevChunkX, prevChunkZ); ++ newRange = chunkMap.playerEntityTrackerUntrackMap.getObjectsInRange(newChunkX, newChunkZ); ++ if (oldRange != newRange) { // optimization: equal pooled sets are identity equal ++ if (oldRange != null) { ++ if (newRange == null) { ++ Object[] backingSet = oldRange.getBackingSet(); ++ for (int index = 0, len = backingSet.length; index < len; ++index) { ++ Object temp = backingSet[index]; ++ if (!(temp instanceof EntityPlayer)) { ++ continue; ++ } ++ EntityPlayer player = (EntityPlayer) temp; ++ entity.addToUntrackQueue(player); ++ } ++ } else { ++ Object[] backingSet = oldRange.getBackingSet(); ++ for (int index = 0, len = backingSet.length; index < len; ++index) { ++ Object temp = backingSet[index]; ++ if (!(temp instanceof EntityPlayer)) { ++ continue; ++ } ++ EntityPlayer player = (EntityPlayer) temp; ++ if (newRange.contains(player)) { ++ continue; ++ } ++ entity.addToUntrackQueue(player); ++ } ++ } ++ } ++ } ++ } ++ } ++ } ++ // Tuinity end - optimized tracker + } + + this.getMethodProfiler().exit(); +@@ -1178,6 +1634,7 @@ public class WorldServer extends World { + + this.registerEntity(entityplayer); + this.getChunkProvider().playerChunkMap.addPlayerToDistanceMaps(entityplayer); // Paper - distance maps ++ this.getChunkProvider().playerChunkMap.addPlayerToDistanceMapsTuinity(entityplayer); // Tuinity - distance maps + } + + // CraftBukkit start +@@ -1360,6 +1817,7 @@ public class WorldServer extends World { + + this.players.remove(entityplayer); + this.getChunkProvider().playerChunkMap.removePlayerFromDistanceMaps(entityplayer); // Paper - distance maps ++ this.getChunkProvider().playerChunkMap.removePlayerFromDistanceMapsTuinity(entityplayer); // Tuinity - distance maps + } + + this.getScoreboard().a(entity); +@@ -1372,6 +1830,7 @@ public class WorldServer extends World { + if (entity instanceof EntityInsentient) { + this.navigators.remove(((EntityInsentient) entity).getNavigation()); + } ++ this.loadedEntities.remove(entity); // Tuinity - loaded entity list + new com.destroystokyo.paper.event.entity.EntityRemoveFromWorldEvent(entity.getBukkitEntity()).callEvent(); // Paper - fire while valid + entity.valid = false; // CraftBukkit + } +@@ -1428,6 +1887,11 @@ public class WorldServer extends World { + } + // Paper end + entity.shouldBeRemoved = false; // Paper - shouldn't be removed after being re-added ++ // Tuinity start - loaded entity list ++ if (this.isChunkLoaded(com.tuinity.tuinity.util.Util.getChunkCoordinate(entity.locX()), com.tuinity.tuinity.util.Util.getChunkCoordinate(entity.locZ()))) { ++ this.loadedEntities.add(entity); ++ } ++ // Tuinity end - loaded entity list + new com.destroystokyo.paper.event.entity.EntityAddToWorldEvent(entity.getBukkitEntity()).callEvent(); // Paper - fire while valid + } + +diff --git a/src/main/java/net/minecraft/server/WorldUpgrader.java b/src/main/java/net/minecraft/server/WorldUpgrader.java +index 3030c347e..76f0f258e 100644 +--- a/src/main/java/net/minecraft/server/WorldUpgrader.java ++++ b/src/main/java/net/minecraft/server/WorldUpgrader.java +@@ -220,7 +220,7 @@ public class WorldUpgrader { + int l = Integer.parseInt(matcher.group(2)) << 5; + + try { +- RegionFile regionfile = new RegionFile(file2, file1); ++ RegionFile regionfile = new RegionFile(file2, file1, true); // Tuinity - allow for chunk regionfiles to regen header + Throwable throwable = null; + + try { +diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java +index fc074a66c..23c3a69fa 100644 +--- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java ++++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java +@@ -796,6 +796,7 @@ public final class CraftServer implements Server { + + org.spigotmc.SpigotConfig.init((File) console.options.valueOf("spigot-settings")); // Spigot + com.destroystokyo.paper.PaperConfig.init((File) console.options.valueOf("paper-settings")); // Paper ++ com.tuinity.tuinity.config.TuinityConfig.init((File) console.options.valueOf("tuinity-settings")); // Tuinity - Server Config + for (WorldServer world : console.getWorlds()) { + world.worldData.setDifficulty(config.difficulty); + world.setSpawnFlags(config.spawnMonsters, config.spawnAnimals); +@@ -812,6 +813,7 @@ public final class CraftServer implements Server { + } + world.spigotConfig.init(); // Spigot + world.paperConfig.init(); // Paper ++ world.tuinityConfig.init(); // Tuinity - Server Config + } + + Plugin[] pluginClone = pluginManager.getPlugins().clone(); // Paper +@@ -1683,7 +1685,10 @@ public final class CraftServer implements Server { + + @Override + public boolean isPrimaryThread() { +- return Thread.currentThread().equals(console.serverThread); // Paper - Fix issues with detecting main thread properly ++ // Tuinity start ++ final Thread currThread = Thread.currentThread(); ++ return currThread == console.serverThread || currThread instanceof com.tuinity.tuinity.util.TickThread; ++ // Tuinity End + } + + @Override +diff --git a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java +index a14b8cb98..7aed24c8f 100644 +--- a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java ++++ b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java +@@ -3,6 +3,7 @@ package org.bukkit.craftbukkit; + import com.google.common.base.Preconditions; + import com.google.common.collect.ImmutableList; + import com.google.common.collect.ImmutableMap; ++import com.tuinity.tuinity.util.TickThread; + import it.unimi.dsi.fastutil.longs.Long2ObjectLinkedOpenHashMap; + import java.io.File; + import java.io.IOException; +@@ -287,9 +288,9 @@ public class CraftWorld implements World { + } + public int getTileEntityCount() { + // We don't use the full world tile entity list, so we must iterate chunks +- Long2ObjectLinkedOpenHashMap chunks = world.getChunkProvider().playerChunkMap.visibleChunks; ++ Iterable chunks = world.getChunkProvider().playerChunkMap.chunkMap.getVisibleValues(); // Tuinity - replace chunk map + int size = 0; +- for (net.minecraft.server.PlayerChunk playerchunk : chunks.values()) { ++ for (net.minecraft.server.PlayerChunk playerchunk : chunks) { // Tuinity - replace chunk map + net.minecraft.server.Chunk chunk = playerchunk.getChunk(); + if (chunk == null) { + continue; +@@ -304,7 +305,7 @@ public class CraftWorld implements World { + public int getChunkCount() { + int ret = 0; + +- for (PlayerChunk chunkHolder : world.getChunkProvider().playerChunkMap.visibleChunks.values()) { ++ for (PlayerChunk chunkHolder : world.getChunkProvider().playerChunkMap.chunkMap.getVisibleValues()) { // Tuinity - replace chunk map + if (chunkHolder.getChunk() != null) { + ++ret; + } +@@ -428,8 +429,8 @@ public class CraftWorld implements World { + + @Override + public Chunk[] getLoadedChunks() { +- Long2ObjectLinkedOpenHashMap chunks = world.getChunkProvider().playerChunkMap.visibleChunks; +- return chunks.values().stream().map(PlayerChunk::getFullChunk).filter(Objects::nonNull).map(net.minecraft.server.Chunk::getBukkitChunk).toArray(Chunk[]::new); ++ Collection chunks = world.getChunkProvider().playerChunkMap.chunkMap.getVisibleValues(); // Tuinity - replace chunk map ++ return chunks.stream().map(PlayerChunk::getFullChunk).filter(Objects::nonNull).map(net.minecraft.server.Chunk::getBukkitChunk).toArray(Chunk[]::new); // Tuinity - replace chunk map + } + + @Override +@@ -458,6 +459,7 @@ public class CraftWorld implements World { + net.minecraft.server.IChunkAccess chunk = world.getChunkProvider().getChunkAt(x, z, ChunkStatus.FULL, false); + if (chunk != null) { + world.getChunkProvider().removeTicket(TicketType.PLUGIN, chunk.getPos(), 1, Unit.INSTANCE); ++ ((ChunkMapDistance)world.getChunkProvider().playerChunkMap.getChunkMapDistanceManager()).removeTickets(ChunkCoordIntPair.pair(x, z), TicketType.DELAYED_UNLOAD); // Tuinity - delay chunk unloads - let plugins override + } + + return true; +@@ -1090,16 +1092,16 @@ public class CraftWorld implements World { + + @Override + public List getEntities() { +- List list = new ArrayList(); ++ List list = new ArrayList(world.loadedEntities.size()); // Tuinity - optimize this call + +- for (Object o : world.entitiesById.values()) { ++ for (Object o : world.loadedEntities) { // Tuinity - optimize this call + if (o instanceof net.minecraft.server.Entity) { + net.minecraft.server.Entity mcEnt = (net.minecraft.server.Entity) o; + if (mcEnt.shouldBeRemoved) continue; // Paper + Entity bukkitEntity = mcEnt.getBukkitEntity(); + + // Assuming that bukkitEntity isn't null +- if (bukkitEntity != null && bukkitEntity.isValid()) { ++ if (bukkitEntity != null && CraftEntity.canBeSeenByPlugins(bukkitEntity)) { // Tuinity - optimize this call + list.add(bukkitEntity); + } + } +@@ -1110,16 +1112,16 @@ public class CraftWorld implements World { + + @Override + public List getLivingEntities() { +- List list = new ArrayList(); ++ List list = new ArrayList(world.loadedEntities.size()); // Tuinity - optimize this call + +- for (Object o : world.entitiesById.values()) { ++ for (Object o : world.loadedEntities) { // Tuinity - optimize this call + if (o instanceof net.minecraft.server.Entity) { + net.minecraft.server.Entity mcEnt = (net.minecraft.server.Entity) o; + if (mcEnt.shouldBeRemoved) continue; // Paper + Entity bukkitEntity = mcEnt.getBukkitEntity(); + + // Assuming that bukkitEntity isn't null +- if (bukkitEntity != null && bukkitEntity instanceof LivingEntity && bukkitEntity.isValid()) { ++ if (bukkitEntity != null && bukkitEntity instanceof LivingEntity && CraftEntity.canBeSeenByPlugins(bukkitEntity)) { // Tuinity - optimize this call + list.add((LivingEntity) bukkitEntity); + } + } +@@ -1140,7 +1142,7 @@ public class CraftWorld implements World { + public Collection getEntitiesByClass(Class clazz) { + Collection list = new ArrayList(); + +- for (Object entity: world.entitiesById.values()) { ++ for (Object entity: world.loadedEntities) { // Tuinity - optimize this call + if (entity instanceof net.minecraft.server.Entity) { + if (((net.minecraft.server.Entity) entity).shouldBeRemoved) continue; // Paper + Entity bukkitEntity = ((net.minecraft.server.Entity) entity).getBukkitEntity(); +@@ -1151,7 +1153,7 @@ public class CraftWorld implements World { + + Class bukkitClass = bukkitEntity.getClass(); + +- if (clazz.isAssignableFrom(bukkitClass) && bukkitEntity.isValid()) { ++ if (clazz.isAssignableFrom(bukkitClass) && CraftEntity.canBeSeenByPlugins(bukkitEntity)) { // Tuinity - optimize this call + list.add((T) bukkitEntity); + } + } +@@ -1164,7 +1166,7 @@ public class CraftWorld implements World { + public Collection getEntitiesByClasses(Class... classes) { + Collection list = new ArrayList(); + +- for (Object entity: world.entitiesById.values()) { ++ for (Object entity: world.loadedEntities) { // Tuinity - optimize this call + if (entity instanceof net.minecraft.server.Entity) { + if (((net.minecraft.server.Entity) entity).shouldBeRemoved) continue; // Paper + Entity bukkitEntity = ((net.minecraft.server.Entity) entity).getBukkitEntity(); +@@ -1177,7 +1179,7 @@ public class CraftWorld implements World { + + for (Class clazz : classes) { + if (clazz.isAssignableFrom(bukkitClass)) { +- if (bukkitEntity.isValid()) { ++ if (CraftEntity.canBeSeenByPlugins(bukkitEntity)) { // Tuinity - optimize this call + list.add(bukkitEntity); + } + break; +@@ -2434,10 +2436,43 @@ public class CraftWorld implements World { + // Spigot start + @Override + public int getViewDistance() { +- return world.spigotConfig.viewDistance; ++ return getHandle().getChunkProvider().playerChunkMap.getViewDistance(); // Tuinity start - per player view distance + } + // Spigot end + ++ // Tuinity start - per player view distance ++ ++ ++ @Override ++ public void setViewDistance(int viewDistance) { ++ TickThread.ensureTickThread("Cannot update view distance safely off of the main thread"); ++ if (viewDistance < 2 || viewDistance > 32) { ++ throw new IllegalArgumentException("View distance " + viewDistance + " is out of range of [2, 32]"); ++ } ++ net.minecraft.server.PlayerChunkMap chunkMap = getHandle().getChunkProvider().playerChunkMap; ++ if (viewDistance != chunkMap.getViewDistance()) { ++ chunkMap.setViewDistance(viewDistance); ++ } ++ } ++ ++ @Override ++ public int getNoTickViewDistance() { ++ return getHandle().getChunkProvider().playerChunkMap.getNoTickViewDistance(); ++ } ++ ++ @Override ++ public void setNoTickViewDistance(int viewDistance) { ++ TickThread.ensureTickThread("Cannot update view distance safely off of the main thread"); ++ if (viewDistance < 2 || viewDistance > 32) { ++ throw new IllegalArgumentException("View distance " + viewDistance + " is out of range of [2, 32]"); ++ } ++ net.minecraft.server.PlayerChunkMap chunkMap = getHandle().getChunkProvider().playerChunkMap; ++ if (viewDistance != chunkMap.getNoTickViewDistance()) { ++ chunkMap.setNoTickViewDistance(viewDistance); ++ } ++ } ++ // Tuinity end - per player view distance ++ + // Spigot start + private final Spigot spigot = new Spigot() + { +diff --git a/src/main/java/org/bukkit/craftbukkit/Main.java b/src/main/java/org/bukkit/craftbukkit/Main.java +index cb60310e6..2666940e8 100644 +--- a/src/main/java/org/bukkit/craftbukkit/Main.java ++++ b/src/main/java/org/bukkit/craftbukkit/Main.java +@@ -137,6 +137,13 @@ public class Main { + .defaultsTo(new File("paper.yml")) + .describedAs("Yml file"); + // Paper end ++ // Tuinity Start - Server Config ++ acceptsAll(asList("tuinity", "tuinity-settings"), "File for tuinity settings") ++ .withRequiredArg() ++ .ofType(File.class) ++ .defaultsTo(new File("tuinity.yml")) ++ .describedAs("Yml file"); ++ /* Conctete End - Server Config */ + + // Paper start + acceptsAll(asList("server-name"), "Name of the server") +diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java +index dfa15372b..949acb1d3 100644 +--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java ++++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java +@@ -180,6 +180,18 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity { + this.entity = entity; + } + ++ // Tuinity start ++ // note: this does not check isChunkLoaded, use Entity#isValid to do that ++ public static boolean canBeSeenByPlugins(org.bukkit.entity.Entity entity) { ++ Entity handle = ((CraftEntity)entity).getHandle(); ++ // TODO ++ // isAlive is a dumb choice, given living entities aren't alive (but are in the world) if health < 0 ++ // this needs to be brought up to spigot to fix though, we are NOT breaking api implementation, especially ++ // if no-one's complained. ++ return !handle.shouldBeRemoved && handle.isAlive() && handle.valid; ++ } ++ // Tuinity end ++ + @Override + public Chunk getChunk() { + net.minecraft.server.Chunk currentChunk = entity.getCurrentChunk(); +diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +index 60f62f19c..516a01648 100644 +--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java ++++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +@@ -1,5 +1,6 @@ + package org.bukkit.craftbukkit.entity; + ++import com.tuinity.tuinity.util.TickThread; // Tuinity + import com.destroystokyo.paper.Title; + import com.destroystokyo.paper.profile.CraftPlayerProfile; + import com.destroystokyo.paper.profile.PlayerProfile; +@@ -1274,7 +1275,13 @@ public class CraftPlayer extends CraftHumanEntity implements Player { + + PlayerChunkMap.EntityTracker entry = tracker.trackedEntities.get(other.getId()); + if (entry != null && !entry.trackedPlayers.contains(getHandle())) { ++ if (getHandle().getWorldServer().getChunkProvider().playerChunkMap.playerEntityTrackerTrackMap == null) { // Tuinity - optimized tracker + entry.updatePlayer(getHandle()); ++ // Tuinity start - optimized tracker ++ } else { ++ other.addToTrackQueue(other); ++ } ++ // Tuinity end - optimized tracker + } + } + // Paper start +@@ -1997,13 +2004,39 @@ public class CraftPlayer extends CraftHumanEntity implements Player { + + @Override + public int getViewDistance() { +- throw new NotImplementedException("Per-Player View Distance APIs need further understanding to properly implement"); // TODO ++ return getHandle().getEffectiveViewDistance(); // Tuinity - per player view distance + } + + @Override + public void setViewDistance(int viewDistance) { +- throw new NotImplementedException("Per-Player View Distance APIs need further understanding to properly implement"); // TODO ++ // Tuinity start - per player view distance ++ TickThread.ensureTickThread("Cannot update view distance safely off of the main thread"); ++ if ((viewDistance < 2 || viewDistance > 32) && viewDistance != -1) { ++ throw new IllegalArgumentException("View distance " + viewDistance + " is out of range of [2, 32]"); ++ } ++ if (viewDistance != getHandle().getRawViewDistance()) { ++ ((WorldServer)getHandle().world).getChunkProvider().playerChunkMap.updateViewDistance(getHandle(), viewDistance, getHandle().getRawNoTickViewDistance()); ++ } ++ // Tuinity end - per player view distance ++ } ++ ++ // Tuinity start - per player view distance ++ @Override ++ public int getNoTickViewDistance() { ++ return getHandle().getEffectiveNoTickViewDistance(); ++ } ++ ++ @Override ++ public void setNoTickViewDistance(int viewDistance) { ++ TickThread.ensureTickThread("Cannot update view distance safely off of the main thread"); ++ if ((viewDistance < 2 || viewDistance > 32) && viewDistance != -1) { ++ throw new IllegalArgumentException("View distance " + viewDistance + " is out of range of [2, 32]"); ++ } ++ if (viewDistance != getHandle().getRawNoTickViewDistance()) { ++ ((WorldServer)getHandle().world).getChunkProvider().playerChunkMap.updateViewDistance(getHandle(), getHandle().getRawViewDistance(), viewDistance); ++ } + } ++ // Tuinity end - per player view distance + // Paper end + + // Spigot start +diff --git a/src/main/java/org/spigotmc/ActivationRange.java b/src/main/java/org/spigotmc/ActivationRange.java +index 6e165a164..e160f03c1 100644 +--- a/src/main/java/org/spigotmc/ActivationRange.java ++++ b/src/main/java/org/spigotmc/ActivationRange.java +@@ -4,6 +4,7 @@ import java.util.Collection; + import java.util.List; + import net.minecraft.server.AxisAlignedBB; + import net.minecraft.server.Chunk; ++import net.minecraft.server.ChunkProviderServer; // Tuinity + import net.minecraft.server.Entity; + import net.minecraft.server.EntityAmbient; + import net.minecraft.server.EntityAnimal; +@@ -38,6 +39,7 @@ import net.minecraft.server.EntityInsentient; + import net.minecraft.server.EntityLlama; + import net.minecraft.server.EntityWaterAnimal; + // Paper end ++import net.minecraft.server.WorldServer; // Tuinity + + public class ActivationRange + { +@@ -128,14 +130,17 @@ public class ActivationRange + final int monsterActivationRange = world.spigotConfig.monsterActivationRange; + final int waterActivationRange = world.spigotConfig.waterActivationRange; // Paper + +- int maxRange = Math.max( monsterActivationRange, animalActivationRange ); +- maxRange = Math.max( maxRange, raiderActivationRange ); +- maxRange = Math.max( maxRange, miscActivationRange ); +- maxRange = Math.min( ( world.spigotConfig.viewDistance << 4 ) - 8, maxRange ); ++ // Tuinity start - per player view distance ++ int maxRangeTemp = Math.max( monsterActivationRange, animalActivationRange ); ++ maxRangeTemp = Math.max( maxRangeTemp, raiderActivationRange ); ++ maxRangeTemp = Math.max( maxRangeTemp, miscActivationRange ); ++ ++ ChunkProviderServer chunkProviderServer = (ChunkProviderServer)world.getChunkProvider(); + + for ( EntityHuman player : world.getPlayers() ) + { +- ++ final int maxRange = Math.min( ( ( player instanceof net.minecraft.server.EntityPlayer ? ((net.minecraft.server.EntityPlayer)player).getEffectiveViewDistance(((WorldServer)world).getChunkProvider().playerChunkMap) : world.spigotConfig.viewDistance ) << 4 ) - 8, maxRangeTemp ); ++ // Tuinity end - per player view distance + player.activatedTick = MinecraftServer.currentTick; + maxBB = player.getBoundingBox().grow( maxRange, 256, maxRange ); + ActivationType.MISC.boundingBox = player.getBoundingBox().grow( miscActivationRange, 256, miscActivationRange ); +@@ -154,7 +159,7 @@ public class ActivationRange + { + for ( int j1 = k; j1 <= l; ++j1 ) + { +- Chunk chunk = (Chunk) world.getChunkIfLoadedImmediately( i1, j1 ); ++ Chunk chunk = chunkProviderServer.getChunkAtIfLoadedMainThreadNoCache( i1, j1 ); // Tuinity + if ( chunk != null ) + { + activateChunkEntities( chunk ); +@@ -172,24 +177,20 @@ public class ActivationRange + */ + private static void activateChunkEntities(Chunk chunk) + { +- for ( List slice : chunk.entitySlices ) +- { +- for ( Entity entity : (Collection) slice ) ++ // Tuinity start - optimise this call ++ com.destroystokyo.paper.util.maplist.EntityList entityList = chunk.entities; ++ Entity[] rawData = entityList.getRawData(); ++ for (int i = 0, len = entityList.size(); i < len; ++i) { ++ Entity entity = rawData[i]; ++ if ( MinecraftServer.currentTick > entity.activatedTick ) + { +- if ( MinecraftServer.currentTick > entity.activatedTick ) ++ if ( entity.defaultActivationState || entity.activationType.boundingBox.intersects(entity.getBoundingBox())) // Tuinity - optimise this call + { +- if ( entity.defaultActivationState ) +- { +- entity.activatedTick = MinecraftServer.currentTick; +- continue; +- } +- if ( entity.activationType.boundingBox.c( entity.getBoundingBox() ) ) +- { +- entity.activatedTick = MinecraftServer.currentTick; +- } +- } ++ entity.activatedTick = MinecraftServer.currentTick; ++ } // Tuinity - optimise this call + } + } ++ // Tuinity end - optimise this call + } + + /** +diff --git a/src/main/java/org/spigotmc/AsyncCatcher.java b/src/main/java/org/spigotmc/AsyncCatcher.java +index 9f7d2ef93..c3ac1a46c 100644 +--- a/src/main/java/org/spigotmc/AsyncCatcher.java ++++ b/src/main/java/org/spigotmc/AsyncCatcher.java +@@ -10,7 +10,7 @@ public class AsyncCatcher + + public static void catchOp(String reason) + { +- if ( enabled && Thread.currentThread() != MinecraftServer.getServer().serverThread ) ++ if ( ( enabled || com.tuinity.tuinity.util.TickThread.STRICT_THREAD_CHECKS ) && !org.bukkit.Bukkit.isPrimaryThread() ) // Tuinity + { + throw new IllegalStateException( "Asynchronous " + reason + "!" ); + } +-- +2.24.0 + 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 2ff55fbdd..9bce81d4f 100644 --- a/patches/server/0002-Purpur-config-files.patch +++ b/patches/server/0003-Purpur-config-files.patch @@ -1,4 +1,4 @@ -From e99b757757c6fa75be9da4b9cf7c66deeaf13b7a Mon Sep 17 00:00:00 2001 +From c9be48cc2164c8c8aa6d1e8c0003c48dcc2b5f0e Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Thu, 9 May 2019 18:09:43 -0500 Subject: [PATCH] Purpur config files @@ -6,21 +6,21 @@ Subject: [PATCH] Purpur config files --- .../com/destroystokyo/paper/PaperConfig.java | 2 + .../net/minecraft/server/DedicatedServer.java | 9 + - src/main/java/net/minecraft/server/World.java | 3 + + src/main/java/net/minecraft/server/World.java | 2 + src/main/java/net/pl3x/purpur/Metrics.java | 598 ++++++++++++++++++ .../java/net/pl3x/purpur/PurpurCommand.java | 66 ++ .../java/net/pl3x/purpur/PurpurConfig.java | 135 ++++ .../net/pl3x/purpur/PurpurWorldConfig.java | 67 ++ .../org/bukkit/craftbukkit/CraftServer.java | 11 + .../java/org/bukkit/craftbukkit/Main.java | 8 + - 9 files changed, 899 insertions(+) + 9 files changed, 898 insertions(+) create mode 100644 src/main/java/net/pl3x/purpur/Metrics.java create mode 100644 src/main/java/net/pl3x/purpur/PurpurCommand.java create mode 100644 src/main/java/net/pl3x/purpur/PurpurConfig.java create mode 100644 src/main/java/net/pl3x/purpur/PurpurWorldConfig.java diff --git a/src/main/java/com/destroystokyo/paper/PaperConfig.java b/src/main/java/com/destroystokyo/paper/PaperConfig.java -index 1d7d1ffbf7..d886f1d145 100644 +index 1d7d1ffbf..d886f1d14 100644 --- a/src/main/java/com/destroystokyo/paper/PaperConfig.java +++ b/src/main/java/com/destroystokyo/paper/PaperConfig.java @@ -96,10 +96,12 @@ public class PaperConfig { @@ -37,7 +37,7 @@ index 1d7d1ffbf7..d886f1d145 100644 static void readConfig(Class clazz, Object instance) { diff --git a/src/main/java/net/minecraft/server/DedicatedServer.java b/src/main/java/net/minecraft/server/DedicatedServer.java -index 349a0ea213..d70c8cab2b 100644 +index ede436939..8c7156bb5 100644 --- a/src/main/java/net/minecraft/server/DedicatedServer.java +++ b/src/main/java/net/minecraft/server/DedicatedServer.java @@ -192,6 +192,15 @@ public class DedicatedServer extends MinecraftServer implements IMinecraftServer @@ -55,31 +55,30 @@ index 349a0ea213..d70c8cab2b 100644 + // Purpur end com.destroystokyo.paper.VersionHistoryManager.INSTANCE.getClass(); // load version history now // Paper end - + com.tuinity.tuinity.config.TuinityConfig.init((File) options.valueOf("tuinity-settings")); // Tuinity - Server Config diff --git a/src/main/java/net/minecraft/server/World.java b/src/main/java/net/minecraft/server/World.java -index baad985178..89090b12d2 100644 +index c0c83d433..ba1dab794 100644 --- a/src/main/java/net/minecraft/server/World.java +++ b/src/main/java/net/minecraft/server/World.java -@@ -80,6 +80,8 @@ public abstract class World implements GeneratorAccess, AutoCloseable { - public final com.destroystokyo.paper.PaperWorldConfig paperConfig; // Paper +@@ -81,6 +81,7 @@ public abstract class World implements GeneratorAccess, AutoCloseable { public final ChunkPacketBlockController chunkPacketBlockController; // Paper - Anti-Xray + public final com.tuinity.tuinity.config.TuinityConfig.WorldConnfig tuinityConfig; // Tuinity - Server Config + public final net.pl3x.purpur.PurpurWorldConfig purpurConfig; // Purpur -+ + public final co.aikar.timings.WorldTimingsHandler timings; // Paper public static BlockPosition lastPhysicsProblem; // Spigot - private org.spigotmc.TickLimiter entityLimiter; -@@ -129,6 +131,7 @@ public abstract class World implements GeneratorAccess, AutoCloseable { - this.spigotConfig = new org.spigotmc.SpigotWorldConfig( worlddata.getName() ); // Spigot +@@ -132,6 +133,7 @@ public abstract class World implements GeneratorAccess, AutoCloseable { this.paperConfig = new com.destroystokyo.paper.PaperWorldConfig(worlddata.getName(), this.spigotConfig); // Paper this.chunkPacketBlockController = this.paperConfig.antiXray ? new ChunkPacketBlockControllerAntiXray(this.paperConfig) : ChunkPacketBlockController.NO_OPERATION_INSTANCE; // Paper - Anti-Xray + this.tuinityConfig = new com.tuinity.tuinity.config.TuinityConfig.WorldConnfig(worlddata.getName()); // Tuinity - Server Config + this.purpurConfig = new net.pl3x.purpur.PurpurWorldConfig(worlddata.getName(), this.paperConfig, this.spigotConfig); // Purpur this.generator = gen; this.world = new CraftWorld((WorldServer) this, gen, env); this.ticksPerAnimalSpawns = this.getServer().getTicksPerAnimalSpawns(); // CraftBukkit diff --git a/src/main/java/net/pl3x/purpur/Metrics.java b/src/main/java/net/pl3x/purpur/Metrics.java new file mode 100644 -index 0000000000..246eb8140f +index 000000000..246eb8140 --- /dev/null +++ b/src/main/java/net/pl3x/purpur/Metrics.java @@ -0,0 +1,598 @@ @@ -683,7 +682,7 @@ index 0000000000..246eb8140f +} diff --git a/src/main/java/net/pl3x/purpur/PurpurCommand.java b/src/main/java/net/pl3x/purpur/PurpurCommand.java new file mode 100644 -index 0000000000..f8cf4ad234 +index 000000000..f8cf4ad23 --- /dev/null +++ b/src/main/java/net/pl3x/purpur/PurpurCommand.java @@ -0,0 +1,66 @@ @@ -755,7 +754,7 @@ index 0000000000..f8cf4ad234 +} diff --git a/src/main/java/net/pl3x/purpur/PurpurConfig.java b/src/main/java/net/pl3x/purpur/PurpurConfig.java new file mode 100644 -index 0000000000..706d787579 +index 000000000..706d78757 --- /dev/null +++ b/src/main/java/net/pl3x/purpur/PurpurConfig.java @@ -0,0 +1,135 @@ @@ -896,7 +895,7 @@ index 0000000000..706d787579 +} diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java new file mode 100644 -index 0000000000..eda37fa43f +index 000000000..eda37fa43 --- /dev/null +++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java @@ -0,0 +1,67 @@ @@ -968,26 +967,26 @@ index 0000000000..eda37fa43f + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -index fc074a66c9..df4fb5947a 100644 +index 23c3a69fa..b64413084 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -@@ -796,6 +796,7 @@ public final class CraftServer implements Server { - +@@ -797,6 +797,7 @@ public final class CraftServer implements Server { org.spigotmc.SpigotConfig.init((File) console.options.valueOf("spigot-settings")); // Spigot com.destroystokyo.paper.PaperConfig.init((File) console.options.valueOf("paper-settings")); // Paper + com.tuinity.tuinity.config.TuinityConfig.init((File) console.options.valueOf("tuinity-settings")); // Tuinity - Server Config + net.pl3x.purpur.PurpurConfig.init((File) console.options.valueOf("purpur-settings")); // Purpur for (WorldServer world : console.getWorlds()) { world.worldData.setDifficulty(config.difficulty); world.setSpawnFlags(config.spawnMonsters, config.spawnAnimals); -@@ -812,6 +813,7 @@ public final class CraftServer implements Server { - } +@@ -814,6 +815,7 @@ public final class CraftServer implements Server { world.spigotConfig.init(); // Spigot world.paperConfig.init(); // Paper + world.tuinityConfig.init(); // Tuinity - Server Config + world.purpurConfig.init(); // Purpur } Plugin[] pluginClone = pluginManager.getPlugins().clone(); // Paper -@@ -830,6 +832,7 @@ public final class CraftServer implements Server { +@@ -832,6 +834,7 @@ public final class CraftServer implements Server { reloadData(); org.spigotmc.SpigotConfig.registerCommands(); // Spigot com.destroystokyo.paper.PaperConfig.registerCommands(); // Paper @@ -995,7 +994,7 @@ index fc074a66c9..df4fb5947a 100644 overrideAllCommandBlockCommands = commandsConfiguration.getStringList("command-block-overrides").contains("*"); ignoreVanillaPermissions = commandsConfiguration.getBoolean("ignore-vanilla-permissions"); -@@ -2060,6 +2063,14 @@ public final class CraftServer implements Server { +@@ -2065,6 +2068,14 @@ public final class CraftServer implements Server { return com.destroystokyo.paper.PaperConfig.config; } @@ -1011,12 +1010,12 @@ index fc074a66c9..df4fb5947a 100644 public void restart() { org.spigotmc.RestartCommand.restart(); diff --git a/src/main/java/org/bukkit/craftbukkit/Main.java b/src/main/java/org/bukkit/craftbukkit/Main.java -index 374e0450a2..b5bc4e2097 100644 +index 2666940e8..7fc56f67f 100644 --- a/src/main/java/org/bukkit/craftbukkit/Main.java +++ b/src/main/java/org/bukkit/craftbukkit/Main.java -@@ -138,6 +138,14 @@ public class Main { +@@ -145,6 +145,14 @@ public class Main { .describedAs("Yml file"); - // Paper end + /* Conctete End - Server Config */ + // Purpur Start + acceptsAll(asList("purpur", "purpur-settings"), "File for purpur settings") diff --git a/patches/server/0003-decompile-fixes.patch b/patches/server/0004-decompile-fixes.patch similarity index 97% rename from patches/server/0003-decompile-fixes.patch rename to patches/server/0004-decompile-fixes.patch index 395d7c867..45807740d 100644 --- a/patches/server/0003-decompile-fixes.patch +++ b/patches/server/0004-decompile-fixes.patch @@ -1,4 +1,4 @@ -From a8c2e4c0b159d27d014a1b64ce56f11e3b184014 Mon Sep 17 00:00:00 2001 +From b5058389746648812a8af122af30dae32048f40f Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Thu, 27 Feb 2020 13:39:06 -0600 Subject: [PATCH] decompile-fixes @@ -90,7 +90,7 @@ Subject: [PATCH] decompile-fixes 83 files changed, 222 insertions(+), 228 deletions(-) diff --git a/src/main/java/net/minecraft/server/BiomeBambooJungle.java b/src/main/java/net/minecraft/server/BiomeBambooJungle.java -index de831ed87e..9c38f8907a 100644 +index de831ed87..9c38f8907 100644 --- a/src/main/java/net/minecraft/server/BiomeBambooJungle.java +++ b/src/main/java/net/minecraft/server/BiomeBambooJungle.java @@ -4,9 +4,9 @@ public class BiomeBambooJungle extends BiomeBase { @@ -107,7 +107,7 @@ index de831ed87e..9c38f8907a 100644 BiomeDecoratorGroups.c(this); BiomeDecoratorGroups.d(this); diff --git a/src/main/java/net/minecraft/server/BiomeBambooJungleHills.java b/src/main/java/net/minecraft/server/BiomeBambooJungleHills.java -index 5ae19373d6..2a6dafccdd 100644 +index 5ae19373d..2a6dafccd 100644 --- a/src/main/java/net/minecraft/server/BiomeBambooJungleHills.java +++ b/src/main/java/net/minecraft/server/BiomeBambooJungleHills.java @@ -4,9 +4,9 @@ public final class BiomeBambooJungleHills extends BiomeBase { @@ -124,7 +124,7 @@ index 5ae19373d6..2a6dafccdd 100644 BiomeDecoratorGroups.c(this); BiomeDecoratorGroups.d(this); diff --git a/src/main/java/net/minecraft/server/BiomeBeach.java b/src/main/java/net/minecraft/server/BiomeBeach.java -index 2627404141..f4e9345aeb 100644 +index 262740414..f4e9345ae 100644 --- a/src/main/java/net/minecraft/server/BiomeBeach.java +++ b/src/main/java/net/minecraft/server/BiomeBeach.java @@ -4,9 +4,9 @@ public final class BiomeBeach extends BiomeBase { @@ -141,7 +141,7 @@ index 2627404141..f4e9345aeb 100644 BiomeDecoratorGroups.c(this); BiomeDecoratorGroups.d(this); diff --git a/src/main/java/net/minecraft/server/BiomeBigHills.java b/src/main/java/net/minecraft/server/BiomeBigHills.java -index a42098da5c..58c30f6523 100644 +index a42098da5..58c30f652 100644 --- a/src/main/java/net/minecraft/server/BiomeBigHills.java +++ b/src/main/java/net/minecraft/server/BiomeBigHills.java @@ -4,8 +4,8 @@ public final class BiomeBigHills extends BiomeBase { @@ -156,7 +156,7 @@ index a42098da5c..58c30f6523 100644 BiomeDecoratorGroups.c(this); BiomeDecoratorGroups.d(this); diff --git a/src/main/java/net/minecraft/server/BiomeBirchForest.java b/src/main/java/net/minecraft/server/BiomeBirchForest.java -index 27fa238013..9437438c82 100644 +index 27fa23801..9437438c8 100644 --- a/src/main/java/net/minecraft/server/BiomeBirchForest.java +++ b/src/main/java/net/minecraft/server/BiomeBirchForest.java @@ -4,8 +4,8 @@ public final class BiomeBirchForest extends BiomeBase { @@ -171,7 +171,7 @@ index 27fa238013..9437438c82 100644 BiomeDecoratorGroups.c(this); BiomeDecoratorGroups.d(this); diff --git a/src/main/java/net/minecraft/server/BiomeBirchForestHills.java b/src/main/java/net/minecraft/server/BiomeBirchForestHills.java -index 51b1d39f53..3e5c23d31e 100644 +index 51b1d39f5..3e5c23d31 100644 --- a/src/main/java/net/minecraft/server/BiomeBirchForestHills.java +++ b/src/main/java/net/minecraft/server/BiomeBirchForestHills.java @@ -4,8 +4,8 @@ public final class BiomeBirchForestHills extends BiomeBase { @@ -186,7 +186,7 @@ index 51b1d39f53..3e5c23d31e 100644 BiomeDecoratorGroups.c(this); BiomeDecoratorGroups.d(this); diff --git a/src/main/java/net/minecraft/server/BiomeBirchForestHillsMutated.java b/src/main/java/net/minecraft/server/BiomeBirchForestHillsMutated.java -index b74f23cff6..d5eb5c91c4 100644 +index b74f23cff..d5eb5c91c 100644 --- a/src/main/java/net/minecraft/server/BiomeBirchForestHillsMutated.java +++ b/src/main/java/net/minecraft/server/BiomeBirchForestHillsMutated.java @@ -4,8 +4,8 @@ public final class BiomeBirchForestHillsMutated extends BiomeBase { @@ -201,7 +201,7 @@ index b74f23cff6..d5eb5c91c4 100644 BiomeDecoratorGroups.c(this); BiomeDecoratorGroups.d(this); diff --git a/src/main/java/net/minecraft/server/BiomeBirchForestMutated.java b/src/main/java/net/minecraft/server/BiomeBirchForestMutated.java -index 17fe3818dd..e805f9568e 100644 +index 17fe3818d..e805f9568 100644 --- a/src/main/java/net/minecraft/server/BiomeBirchForestMutated.java +++ b/src/main/java/net/minecraft/server/BiomeBirchForestMutated.java @@ -4,8 +4,8 @@ public final class BiomeBirchForestMutated extends BiomeBase { @@ -216,7 +216,7 @@ index 17fe3818dd..e805f9568e 100644 BiomeDecoratorGroups.c(this); BiomeDecoratorGroups.d(this); diff --git a/src/main/java/net/minecraft/server/BiomeColdBeach.java b/src/main/java/net/minecraft/server/BiomeColdBeach.java -index 2c230be98f..1b92f4567d 100644 +index 2c230be98..1b92f4567 100644 --- a/src/main/java/net/minecraft/server/BiomeColdBeach.java +++ b/src/main/java/net/minecraft/server/BiomeColdBeach.java @@ -4,9 +4,9 @@ public final class BiomeColdBeach extends BiomeBase { @@ -233,7 +233,7 @@ index 2c230be98f..1b92f4567d 100644 BiomeDecoratorGroups.c(this); BiomeDecoratorGroups.d(this); diff --git a/src/main/java/net/minecraft/server/BiomeColdDeepOcean.java b/src/main/java/net/minecraft/server/BiomeColdDeepOcean.java -index d96e820e07..b9a5cb63a4 100644 +index d96e820e0..b9a5cb63a 100644 --- a/src/main/java/net/minecraft/server/BiomeColdDeepOcean.java +++ b/src/main/java/net/minecraft/server/BiomeColdDeepOcean.java @@ -4,10 +4,10 @@ public class BiomeColdDeepOcean extends BiomeBase { @@ -261,7 +261,7 @@ index d96e820e07..b9a5cb63a4 100644 BiomeDecoratorGroups.ah(this); BiomeDecoratorGroups.ap(this); diff --git a/src/main/java/net/minecraft/server/BiomeColdOcean.java b/src/main/java/net/minecraft/server/BiomeColdOcean.java -index c7ed2e134a..571c3d139d 100644 +index c7ed2e134..571c3d139 100644 --- a/src/main/java/net/minecraft/server/BiomeColdOcean.java +++ b/src/main/java/net/minecraft/server/BiomeColdOcean.java @@ -4,9 +4,9 @@ public class BiomeColdOcean extends BiomeBase { @@ -287,7 +287,7 @@ index c7ed2e134a..571c3d139d 100644 BiomeDecoratorGroups.ah(this); BiomeDecoratorGroups.ap(this); diff --git a/src/main/java/net/minecraft/server/BiomeColdTaiga.java b/src/main/java/net/minecraft/server/BiomeColdTaiga.java -index c766dedfa9..88400e77bf 100644 +index c766dedfa..88400e77b 100644 --- a/src/main/java/net/minecraft/server/BiomeColdTaiga.java +++ b/src/main/java/net/minecraft/server/BiomeColdTaiga.java @@ -4,9 +4,9 @@ public final class BiomeColdTaiga extends BiomeBase { @@ -304,7 +304,7 @@ index c766dedfa9..88400e77bf 100644 BiomeDecoratorGroups.c(this); BiomeDecoratorGroups.d(this); diff --git a/src/main/java/net/minecraft/server/BiomeColdTaigaHills.java b/src/main/java/net/minecraft/server/BiomeColdTaigaHills.java -index 187f11f584..8a8fc7dbd2 100644 +index 187f11f58..8a8fc7dbd 100644 --- a/src/main/java/net/minecraft/server/BiomeColdTaigaHills.java +++ b/src/main/java/net/minecraft/server/BiomeColdTaigaHills.java @@ -4,8 +4,8 @@ public final class BiomeColdTaigaHills extends BiomeBase { @@ -319,7 +319,7 @@ index 187f11f584..8a8fc7dbd2 100644 BiomeDecoratorGroups.c(this); BiomeDecoratorGroups.d(this); diff --git a/src/main/java/net/minecraft/server/BiomeColdTaigaMutated.java b/src/main/java/net/minecraft/server/BiomeColdTaigaMutated.java -index 97c56fb803..327e6847f0 100644 +index 97c56fb80..327e6847f 100644 --- a/src/main/java/net/minecraft/server/BiomeColdTaigaMutated.java +++ b/src/main/java/net/minecraft/server/BiomeColdTaigaMutated.java @@ -4,8 +4,8 @@ public final class BiomeColdTaigaMutated extends BiomeBase { @@ -334,7 +334,7 @@ index 97c56fb803..327e6847f0 100644 BiomeDecoratorGroups.c(this); BiomeDecoratorGroups.d(this); diff --git a/src/main/java/net/minecraft/server/BiomeDeepOcean.java b/src/main/java/net/minecraft/server/BiomeDeepOcean.java -index bea1293144..651d44cb37 100644 +index bea129314..651d44cb3 100644 --- a/src/main/java/net/minecraft/server/BiomeDeepOcean.java +++ b/src/main/java/net/minecraft/server/BiomeDeepOcean.java @@ -4,10 +4,10 @@ public final class BiomeDeepOcean extends BiomeBase { @@ -362,7 +362,7 @@ index bea1293144..651d44cb37 100644 BiomeDecoratorGroups.ah(this); BiomeDecoratorGroups.ap(this); diff --git a/src/main/java/net/minecraft/server/BiomeDesert.java b/src/main/java/net/minecraft/server/BiomeDesert.java -index 7a8784f18a..257732dad7 100644 +index 7a8784f18..257732dad 100644 --- a/src/main/java/net/minecraft/server/BiomeDesert.java +++ b/src/main/java/net/minecraft/server/BiomeDesert.java @@ -4,11 +4,11 @@ public final class BiomeDesert extends BiomeBase { @@ -383,7 +383,7 @@ index 7a8784f18a..257732dad7 100644 BiomeDecoratorGroups.c(this); BiomeDecoratorGroups.e(this); diff --git a/src/main/java/net/minecraft/server/BiomeDesertHills.java b/src/main/java/net/minecraft/server/BiomeDesertHills.java -index 9f5e9abc41..3752fc4509 100644 +index 9f5e9abc4..3752fc450 100644 --- a/src/main/java/net/minecraft/server/BiomeDesertHills.java +++ b/src/main/java/net/minecraft/server/BiomeDesertHills.java @@ -4,9 +4,9 @@ public final class BiomeDesertHills extends BiomeBase { @@ -400,7 +400,7 @@ index 9f5e9abc41..3752fc4509 100644 BiomeDecoratorGroups.c(this); BiomeDecoratorGroups.e(this); diff --git a/src/main/java/net/minecraft/server/BiomeDesertMutated.java b/src/main/java/net/minecraft/server/BiomeDesertMutated.java -index f79e438dc4..1a0b569322 100644 +index f79e438dc..1a0b56932 100644 --- a/src/main/java/net/minecraft/server/BiomeDesertMutated.java +++ b/src/main/java/net/minecraft/server/BiomeDesertMutated.java @@ -4,8 +4,8 @@ public final class BiomeDesertMutated extends BiomeBase { @@ -415,7 +415,7 @@ index f79e438dc4..1a0b569322 100644 BiomeDecoratorGroups.c(this); BiomeDecoratorGroups.e(this); diff --git a/src/main/java/net/minecraft/server/BiomeExtremeHillsEdge.java b/src/main/java/net/minecraft/server/BiomeExtremeHillsEdge.java -index 58a6125289..8e19e06889 100644 +index 58a612528..8e19e0688 100644 --- a/src/main/java/net/minecraft/server/BiomeExtremeHillsEdge.java +++ b/src/main/java/net/minecraft/server/BiomeExtremeHillsEdge.java @@ -4,8 +4,8 @@ public final class BiomeExtremeHillsEdge extends BiomeBase { @@ -430,7 +430,7 @@ index 58a6125289..8e19e06889 100644 BiomeDecoratorGroups.c(this); BiomeDecoratorGroups.d(this); diff --git a/src/main/java/net/minecraft/server/BiomeExtremeHillsMutated.java b/src/main/java/net/minecraft/server/BiomeExtremeHillsMutated.java -index cd18533bb0..69d4880c74 100644 +index cd18533bb..69d4880c7 100644 --- a/src/main/java/net/minecraft/server/BiomeExtremeHillsMutated.java +++ b/src/main/java/net/minecraft/server/BiomeExtremeHillsMutated.java @@ -4,8 +4,8 @@ public final class BiomeExtremeHillsMutated extends BiomeBase { @@ -445,7 +445,7 @@ index cd18533bb0..69d4880c74 100644 BiomeDecoratorGroups.c(this); BiomeDecoratorGroups.d(this); diff --git a/src/main/java/net/minecraft/server/BiomeExtremeHillsWithTrees.java b/src/main/java/net/minecraft/server/BiomeExtremeHillsWithTrees.java -index 2c7f5940a4..7661d53161 100644 +index 2c7f5940a..7661d5316 100644 --- a/src/main/java/net/minecraft/server/BiomeExtremeHillsWithTrees.java +++ b/src/main/java/net/minecraft/server/BiomeExtremeHillsWithTrees.java @@ -4,8 +4,8 @@ public final class BiomeExtremeHillsWithTrees extends BiomeBase { @@ -460,7 +460,7 @@ index 2c7f5940a4..7661d53161 100644 BiomeDecoratorGroups.c(this); BiomeDecoratorGroups.d(this); diff --git a/src/main/java/net/minecraft/server/BiomeExtremeHillsWithTreesMutated.java b/src/main/java/net/minecraft/server/BiomeExtremeHillsWithTreesMutated.java -index 6e33c23632..05418f8fa1 100644 +index 6e33c2363..05418f8fa 100644 --- a/src/main/java/net/minecraft/server/BiomeExtremeHillsWithTreesMutated.java +++ b/src/main/java/net/minecraft/server/BiomeExtremeHillsWithTreesMutated.java @@ -4,8 +4,8 @@ public final class BiomeExtremeHillsWithTreesMutated extends BiomeBase { @@ -475,7 +475,7 @@ index 6e33c23632..05418f8fa1 100644 BiomeDecoratorGroups.c(this); BiomeDecoratorGroups.d(this); diff --git a/src/main/java/net/minecraft/server/BiomeFlowerForest.java b/src/main/java/net/minecraft/server/BiomeFlowerForest.java -index c6ac9506a7..1d3f624323 100644 +index c6ac9506a..1d3f62432 100644 --- a/src/main/java/net/minecraft/server/BiomeFlowerForest.java +++ b/src/main/java/net/minecraft/server/BiomeFlowerForest.java @@ -6,18 +6,18 @@ public final class BiomeFlowerForest extends BiomeBase { @@ -503,7 +503,7 @@ index c6ac9506a7..1d3f624323 100644 BiomeDecoratorGroups.Z(this); BiomeDecoratorGroups.aa(this); diff --git a/src/main/java/net/minecraft/server/BiomeForest.java b/src/main/java/net/minecraft/server/BiomeForest.java -index 570a1f66f3..e849b411c6 100644 +index 570a1f66f..e849b411c 100644 --- a/src/main/java/net/minecraft/server/BiomeForest.java +++ b/src/main/java/net/minecraft/server/BiomeForest.java @@ -4,9 +4,9 @@ public final class BiomeForest extends BiomeBase { @@ -520,7 +520,7 @@ index 570a1f66f3..e849b411c6 100644 BiomeDecoratorGroups.c(this); BiomeDecoratorGroups.d(this); diff --git a/src/main/java/net/minecraft/server/BiomeForestHills.java b/src/main/java/net/minecraft/server/BiomeForestHills.java -index 8179e1c603..f7dea38eb3 100644 +index 8179e1c60..f7dea38eb 100644 --- a/src/main/java/net/minecraft/server/BiomeForestHills.java +++ b/src/main/java/net/minecraft/server/BiomeForestHills.java @@ -4,9 +4,9 @@ public final class BiomeForestHills extends BiomeBase { @@ -537,7 +537,7 @@ index 8179e1c603..f7dea38eb3 100644 BiomeDecoratorGroups.c(this); BiomeDecoratorGroups.d(this); diff --git a/src/main/java/net/minecraft/server/BiomeFrozenDeepOcean.java b/src/main/java/net/minecraft/server/BiomeFrozenDeepOcean.java -index 852c4bd9ab..67d120bef2 100644 +index 852c4bd9a..67d120bef 100644 --- a/src/main/java/net/minecraft/server/BiomeFrozenDeepOcean.java +++ b/src/main/java/net/minecraft/server/BiomeFrozenDeepOcean.java @@ -6,10 +6,10 @@ public class BiomeFrozenDeepOcean extends BiomeBase { @@ -556,7 +556,7 @@ index 852c4bd9ab..67d120bef2 100644 BiomeDecoratorGroups.c(this); BiomeDecoratorGroups.d(this); diff --git a/src/main/java/net/minecraft/server/BiomeFrozenOcean.java b/src/main/java/net/minecraft/server/BiomeFrozenOcean.java -index 3d649c6004..2772bc6dac 100644 +index 3d649c600..2772bc6da 100644 --- a/src/main/java/net/minecraft/server/BiomeFrozenOcean.java +++ b/src/main/java/net/minecraft/server/BiomeFrozenOcean.java @@ -6,9 +6,9 @@ public final class BiomeFrozenOcean extends BiomeBase { @@ -573,7 +573,7 @@ index 3d649c6004..2772bc6dac 100644 BiomeDecoratorGroups.c(this); BiomeDecoratorGroups.d(this); diff --git a/src/main/java/net/minecraft/server/BiomeFrozenRiver.java b/src/main/java/net/minecraft/server/BiomeFrozenRiver.java -index 915f20042b..4be53fc0f6 100644 +index 915f20042..4be53fc0f 100644 --- a/src/main/java/net/minecraft/server/BiomeFrozenRiver.java +++ b/src/main/java/net/minecraft/server/BiomeFrozenRiver.java @@ -4,7 +4,7 @@ public final class BiomeFrozenRiver extends BiomeBase { @@ -586,7 +586,7 @@ index 915f20042b..4be53fc0f6 100644 BiomeDecoratorGroups.c(this); BiomeDecoratorGroups.d(this); diff --git a/src/main/java/net/minecraft/server/BiomeHell.java b/src/main/java/net/minecraft/server/BiomeHell.java -index f9ca6b889a..888dfcd8d4 100644 +index f9ca6b889..888dfcd8d 100644 --- a/src/main/java/net/minecraft/server/BiomeHell.java +++ b/src/main/java/net/minecraft/server/BiomeHell.java @@ -4,20 +4,20 @@ public final class BiomeHell extends BiomeBase { @@ -624,7 +624,7 @@ index f9ca6b889a..888dfcd8d4 100644 this.a(EnumCreatureType.MONSTER, new BiomeBase.BiomeMeta(EntityTypes.ZOMBIE_PIGMAN, 100, 4, 4)); this.a(EnumCreatureType.MONSTER, new BiomeBase.BiomeMeta(EntityTypes.MAGMA_CUBE, 2, 4, 4)); diff --git a/src/main/java/net/minecraft/server/BiomeIceMountains.java b/src/main/java/net/minecraft/server/BiomeIceMountains.java -index d5033de8aa..ad9b4efe09 100644 +index d5033de8a..ad9b4efe0 100644 --- a/src/main/java/net/minecraft/server/BiomeIceMountains.java +++ b/src/main/java/net/minecraft/server/BiomeIceMountains.java @@ -4,8 +4,8 @@ public final class BiomeIceMountains extends BiomeBase { @@ -639,7 +639,7 @@ index d5033de8aa..ad9b4efe09 100644 BiomeDecoratorGroups.c(this); BiomeDecoratorGroups.d(this); diff --git a/src/main/java/net/minecraft/server/BiomeIcePlains.java b/src/main/java/net/minecraft/server/BiomeIcePlains.java -index 054b0e0ab1..71606b0a71 100644 +index 054b0e0ab..71606b0a7 100644 --- a/src/main/java/net/minecraft/server/BiomeIcePlains.java +++ b/src/main/java/net/minecraft/server/BiomeIcePlains.java @@ -4,11 +4,11 @@ public final class BiomeIcePlains extends BiomeBase { @@ -660,7 +660,7 @@ index 054b0e0ab1..71606b0a71 100644 BiomeDecoratorGroups.c(this); BiomeDecoratorGroups.d(this); diff --git a/src/main/java/net/minecraft/server/BiomeIcePlainsSpikes.java b/src/main/java/net/minecraft/server/BiomeIcePlainsSpikes.java -index 44c410f75c..984f94bb59 100644 +index 44c410f75..984f94bb5 100644 --- a/src/main/java/net/minecraft/server/BiomeIcePlainsSpikes.java +++ b/src/main/java/net/minecraft/server/BiomeIcePlainsSpikes.java @@ -4,14 +4,14 @@ public final class BiomeIcePlainsSpikes extends BiomeBase { @@ -683,7 +683,7 @@ index 44c410f75c..984f94bb59 100644 BiomeDecoratorGroups.h(this); BiomeDecoratorGroups.l(this); diff --git a/src/main/java/net/minecraft/server/BiomeJungle.java b/src/main/java/net/minecraft/server/BiomeJungle.java -index 2f893ce918..95e5019968 100644 +index 2f893ce91..95e501996 100644 --- a/src/main/java/net/minecraft/server/BiomeJungle.java +++ b/src/main/java/net/minecraft/server/BiomeJungle.java @@ -4,9 +4,9 @@ public final class BiomeJungle extends BiomeBase { @@ -700,7 +700,7 @@ index 2f893ce918..95e5019968 100644 BiomeDecoratorGroups.c(this); BiomeDecoratorGroups.d(this); diff --git a/src/main/java/net/minecraft/server/BiomeJungleEdge.java b/src/main/java/net/minecraft/server/BiomeJungleEdge.java -index 4858617859..e624f9764f 100644 +index 485861785..e624f9764 100644 --- a/src/main/java/net/minecraft/server/BiomeJungleEdge.java +++ b/src/main/java/net/minecraft/server/BiomeJungleEdge.java @@ -4,8 +4,8 @@ public final class BiomeJungleEdge extends BiomeBase { @@ -715,7 +715,7 @@ index 4858617859..e624f9764f 100644 BiomeDecoratorGroups.c(this); BiomeDecoratorGroups.d(this); diff --git a/src/main/java/net/minecraft/server/BiomeJungleEdgeMutated.java b/src/main/java/net/minecraft/server/BiomeJungleEdgeMutated.java -index a957f6124b..1fe9c840a7 100644 +index a957f6124..1fe9c840a 100644 --- a/src/main/java/net/minecraft/server/BiomeJungleEdgeMutated.java +++ b/src/main/java/net/minecraft/server/BiomeJungleEdgeMutated.java @@ -4,8 +4,8 @@ public final class BiomeJungleEdgeMutated extends BiomeBase { @@ -730,7 +730,7 @@ index a957f6124b..1fe9c840a7 100644 BiomeDecoratorGroups.c(this); BiomeDecoratorGroups.d(this); diff --git a/src/main/java/net/minecraft/server/BiomeJungleHills.java b/src/main/java/net/minecraft/server/BiomeJungleHills.java -index 7b9bc967a9..e2970ab00e 100644 +index 7b9bc967a..e2970ab00 100644 --- a/src/main/java/net/minecraft/server/BiomeJungleHills.java +++ b/src/main/java/net/minecraft/server/BiomeJungleHills.java @@ -4,9 +4,9 @@ public final class BiomeJungleHills extends BiomeBase { @@ -747,7 +747,7 @@ index 7b9bc967a9..e2970ab00e 100644 BiomeDecoratorGroups.c(this); BiomeDecoratorGroups.d(this); diff --git a/src/main/java/net/minecraft/server/BiomeJungleMutated.java b/src/main/java/net/minecraft/server/BiomeJungleMutated.java -index 02246950d0..ffe6b4344e 100644 +index 02246950d..ffe6b4344 100644 --- a/src/main/java/net/minecraft/server/BiomeJungleMutated.java +++ b/src/main/java/net/minecraft/server/BiomeJungleMutated.java @@ -4,8 +4,8 @@ public final class BiomeJungleMutated extends BiomeBase { @@ -762,7 +762,7 @@ index 02246950d0..ffe6b4344e 100644 BiomeDecoratorGroups.c(this); BiomeDecoratorGroups.d(this); diff --git a/src/main/java/net/minecraft/server/BiomeLukewarmDeepOcean.java b/src/main/java/net/minecraft/server/BiomeLukewarmDeepOcean.java -index e6d4a2c397..b23c43305b 100644 +index e6d4a2c39..b23c43305 100644 --- a/src/main/java/net/minecraft/server/BiomeLukewarmDeepOcean.java +++ b/src/main/java/net/minecraft/server/BiomeLukewarmDeepOcean.java @@ -4,10 +4,10 @@ public class BiomeLukewarmDeepOcean extends BiomeBase { @@ -781,7 +781,7 @@ index e6d4a2c397..b23c43305b 100644 BiomeDecoratorGroups.c(this); BiomeDecoratorGroups.d(this); diff --git a/src/main/java/net/minecraft/server/BiomeLukewarmOcean.java b/src/main/java/net/minecraft/server/BiomeLukewarmOcean.java -index f2dc5d1b5c..efcb11bbe8 100644 +index f2dc5d1b5..efcb11bbe 100644 --- a/src/main/java/net/minecraft/server/BiomeLukewarmOcean.java +++ b/src/main/java/net/minecraft/server/BiomeLukewarmOcean.java @@ -4,9 +4,9 @@ public class BiomeLukewarmOcean extends BiomeBase { @@ -798,7 +798,7 @@ index f2dc5d1b5c..efcb11bbe8 100644 BiomeDecoratorGroups.c(this); BiomeDecoratorGroups.d(this); diff --git a/src/main/java/net/minecraft/server/BiomeMegaSpruceTaiga.java b/src/main/java/net/minecraft/server/BiomeMegaSpruceTaiga.java -index f6ec90c2d0..328e939a6f 100644 +index f6ec90c2d..328e939a6 100644 --- a/src/main/java/net/minecraft/server/BiomeMegaSpruceTaiga.java +++ b/src/main/java/net/minecraft/server/BiomeMegaSpruceTaiga.java @@ -4,8 +4,8 @@ public final class BiomeMegaSpruceTaiga extends BiomeBase { @@ -813,7 +813,7 @@ index f6ec90c2d0..328e939a6f 100644 BiomeDecoratorGroups.c(this); BiomeDecoratorGroups.d(this); diff --git a/src/main/java/net/minecraft/server/BiomeMegaTaiga.java b/src/main/java/net/minecraft/server/BiomeMegaTaiga.java -index e9ad930d88..36bea710a0 100644 +index e9ad930d8..36bea710a 100644 --- a/src/main/java/net/minecraft/server/BiomeMegaTaiga.java +++ b/src/main/java/net/minecraft/server/BiomeMegaTaiga.java @@ -4,8 +4,8 @@ public final class BiomeMegaTaiga extends BiomeBase { @@ -828,7 +828,7 @@ index e9ad930d88..36bea710a0 100644 BiomeDecoratorGroups.c(this); BiomeDecoratorGroups.d(this); diff --git a/src/main/java/net/minecraft/server/BiomeMegaTaigaHills.java b/src/main/java/net/minecraft/server/BiomeMegaTaigaHills.java -index cdc182c229..22474d682a 100644 +index cdc182c22..22474d682 100644 --- a/src/main/java/net/minecraft/server/BiomeMegaTaigaHills.java +++ b/src/main/java/net/minecraft/server/BiomeMegaTaigaHills.java @@ -4,8 +4,8 @@ public final class BiomeMegaTaigaHills extends BiomeBase { @@ -843,7 +843,7 @@ index cdc182c229..22474d682a 100644 BiomeDecoratorGroups.c(this); BiomeDecoratorGroups.d(this); diff --git a/src/main/java/net/minecraft/server/BiomeMesa.java b/src/main/java/net/minecraft/server/BiomeMesa.java -index 95e602a95f..65d606d51c 100644 +index 95e602a95..65d606d51 100644 --- a/src/main/java/net/minecraft/server/BiomeMesa.java +++ b/src/main/java/net/minecraft/server/BiomeMesa.java @@ -4,8 +4,8 @@ public final class BiomeMesa extends BiomeBase { @@ -858,7 +858,7 @@ index 95e602a95f..65d606d51c 100644 BiomeDecoratorGroups.c(this); BiomeDecoratorGroups.d(this); diff --git a/src/main/java/net/minecraft/server/BiomeMesaBryce.java b/src/main/java/net/minecraft/server/BiomeMesaBryce.java -index 57ef10afb0..5ecec62f18 100644 +index 57ef10afb..5ecec62f1 100644 --- a/src/main/java/net/minecraft/server/BiomeMesaBryce.java +++ b/src/main/java/net/minecraft/server/BiomeMesaBryce.java @@ -4,8 +4,8 @@ public final class BiomeMesaBryce extends BiomeBase { @@ -873,7 +873,7 @@ index 57ef10afb0..5ecec62f18 100644 BiomeDecoratorGroups.c(this); BiomeDecoratorGroups.d(this); diff --git a/src/main/java/net/minecraft/server/BiomeMesaPlataeu.java b/src/main/java/net/minecraft/server/BiomeMesaPlataeu.java -index b9f81a044f..14d4bd312e 100644 +index b9f81a044..14d4bd312 100644 --- a/src/main/java/net/minecraft/server/BiomeMesaPlataeu.java +++ b/src/main/java/net/minecraft/server/BiomeMesaPlataeu.java @@ -4,8 +4,8 @@ public final class BiomeMesaPlataeu extends BiomeBase { @@ -888,7 +888,7 @@ index b9f81a044f..14d4bd312e 100644 BiomeDecoratorGroups.c(this); BiomeDecoratorGroups.d(this); diff --git a/src/main/java/net/minecraft/server/BiomeMesaPlataeuClear.java b/src/main/java/net/minecraft/server/BiomeMesaPlataeuClear.java -index 3ce8d3cef5..b5dab9d2aa 100644 +index 3ce8d3cef..b5dab9d2a 100644 --- a/src/main/java/net/minecraft/server/BiomeMesaPlataeuClear.java +++ b/src/main/java/net/minecraft/server/BiomeMesaPlataeuClear.java @@ -4,8 +4,8 @@ public final class BiomeMesaPlataeuClear extends BiomeBase { @@ -903,7 +903,7 @@ index 3ce8d3cef5..b5dab9d2aa 100644 BiomeDecoratorGroups.c(this); BiomeDecoratorGroups.d(this); diff --git a/src/main/java/net/minecraft/server/BiomeMesaPlateauClearMutated.java b/src/main/java/net/minecraft/server/BiomeMesaPlateauClearMutated.java -index 88b7b37467..d05cc38b5e 100644 +index 88b7b3746..d05cc38b5 100644 --- a/src/main/java/net/minecraft/server/BiomeMesaPlateauClearMutated.java +++ b/src/main/java/net/minecraft/server/BiomeMesaPlateauClearMutated.java @@ -4,8 +4,8 @@ public final class BiomeMesaPlateauClearMutated extends BiomeBase { @@ -918,7 +918,7 @@ index 88b7b37467..d05cc38b5e 100644 BiomeDecoratorGroups.c(this); BiomeDecoratorGroups.d(this); diff --git a/src/main/java/net/minecraft/server/BiomeMesaPlateauMutated.java b/src/main/java/net/minecraft/server/BiomeMesaPlateauMutated.java -index 7254bcf3e5..21a77ee812 100644 +index 7254bcf3e..21a77ee81 100644 --- a/src/main/java/net/minecraft/server/BiomeMesaPlateauMutated.java +++ b/src/main/java/net/minecraft/server/BiomeMesaPlateauMutated.java @@ -4,8 +4,8 @@ public final class BiomeMesaPlateauMutated extends BiomeBase { @@ -933,7 +933,7 @@ index 7254bcf3e5..21a77ee812 100644 BiomeDecoratorGroups.c(this); BiomeDecoratorGroups.d(this); diff --git a/src/main/java/net/minecraft/server/BiomeMushroomIslandShore.java b/src/main/java/net/minecraft/server/BiomeMushroomIslandShore.java -index 58bc1f2343..0302efbdc7 100644 +index 58bc1f234..0302efbdc 100644 --- a/src/main/java/net/minecraft/server/BiomeMushroomIslandShore.java +++ b/src/main/java/net/minecraft/server/BiomeMushroomIslandShore.java @@ -4,8 +4,8 @@ public final class BiomeMushroomIslandShore extends BiomeBase { @@ -948,7 +948,7 @@ index 58bc1f2343..0302efbdc7 100644 BiomeDecoratorGroups.c(this); BiomeDecoratorGroups.d(this); diff --git a/src/main/java/net/minecraft/server/BiomeMushrooms.java b/src/main/java/net/minecraft/server/BiomeMushrooms.java -index cb620014b7..51f92584b8 100644 +index cb620014b..51f92584b 100644 --- a/src/main/java/net/minecraft/server/BiomeMushrooms.java +++ b/src/main/java/net/minecraft/server/BiomeMushrooms.java @@ -4,8 +4,8 @@ public final class BiomeMushrooms extends BiomeBase { @@ -963,7 +963,7 @@ index cb620014b7..51f92584b8 100644 BiomeDecoratorGroups.c(this); BiomeDecoratorGroups.d(this); diff --git a/src/main/java/net/minecraft/server/BiomeOcean.java b/src/main/java/net/minecraft/server/BiomeOcean.java -index fd7e991062..ad9628b2aa 100644 +index fd7e99106..ad9628b2a 100644 --- a/src/main/java/net/minecraft/server/BiomeOcean.java +++ b/src/main/java/net/minecraft/server/BiomeOcean.java @@ -4,9 +4,9 @@ public final class BiomeOcean extends BiomeBase { @@ -989,7 +989,7 @@ index fd7e991062..ad9628b2aa 100644 BiomeDecoratorGroups.ah(this); BiomeDecoratorGroups.ap(this); diff --git a/src/main/java/net/minecraft/server/BiomePlains.java b/src/main/java/net/minecraft/server/BiomePlains.java -index efbb36d016..ff6090e3c1 100644 +index efbb36d01..ff6090e3c 100644 --- a/src/main/java/net/minecraft/server/BiomePlains.java +++ b/src/main/java/net/minecraft/server/BiomePlains.java @@ -4,10 +4,10 @@ public final class BiomePlains extends BiomeBase { @@ -1008,7 +1008,7 @@ index efbb36d016..ff6090e3c1 100644 BiomeDecoratorGroups.c(this); BiomeDecoratorGroups.d(this); diff --git a/src/main/java/net/minecraft/server/BiomeRedwoodTaigaHillsMutated.java b/src/main/java/net/minecraft/server/BiomeRedwoodTaigaHillsMutated.java -index 7804a4e329..a28222eb1d 100644 +index 7804a4e32..a28222eb1 100644 --- a/src/main/java/net/minecraft/server/BiomeRedwoodTaigaHillsMutated.java +++ b/src/main/java/net/minecraft/server/BiomeRedwoodTaigaHillsMutated.java @@ -4,8 +4,8 @@ public final class BiomeRedwoodTaigaHillsMutated extends BiomeBase { @@ -1023,7 +1023,7 @@ index 7804a4e329..a28222eb1d 100644 BiomeDecoratorGroups.c(this); BiomeDecoratorGroups.d(this); diff --git a/src/main/java/net/minecraft/server/BiomeRiver.java b/src/main/java/net/minecraft/server/BiomeRiver.java -index 6522c80214..b84b868b1a 100644 +index 6522c8021..b84b868b1 100644 --- a/src/main/java/net/minecraft/server/BiomeRiver.java +++ b/src/main/java/net/minecraft/server/BiomeRiver.java @@ -4,7 +4,7 @@ public final class BiomeRiver extends BiomeBase { @@ -1045,7 +1045,7 @@ index 6522c80214..b84b868b1a 100644 this.a(EnumCreatureType.WATER_CREATURE, new BiomeBase.BiomeMeta(EntityTypes.SQUID, 2, 1, 4)); this.a(EnumCreatureType.WATER_CREATURE, new BiomeBase.BiomeMeta(EntityTypes.SALMON, 5, 1, 5)); diff --git a/src/main/java/net/minecraft/server/BiomeRoofedForest.java b/src/main/java/net/minecraft/server/BiomeRoofedForest.java -index 30d6802242..16bcf9bff0 100644 +index 30d680224..16bcf9bff 100644 --- a/src/main/java/net/minecraft/server/BiomeRoofedForest.java +++ b/src/main/java/net/minecraft/server/BiomeRoofedForest.java @@ -6,14 +6,14 @@ public final class BiomeRoofedForest extends BiomeBase { @@ -1068,7 +1068,7 @@ index 30d6802242..16bcf9bff0 100644 BiomeDecoratorGroups.g(this); BiomeDecoratorGroups.h(this); diff --git a/src/main/java/net/minecraft/server/BiomeRoofedForestMutated.java b/src/main/java/net/minecraft/server/BiomeRoofedForestMutated.java -index 5c9ab0864e..9fa84c87fa 100644 +index 5c9ab0864..9fa84c87f 100644 --- a/src/main/java/net/minecraft/server/BiomeRoofedForestMutated.java +++ b/src/main/java/net/minecraft/server/BiomeRoofedForestMutated.java @@ -6,14 +6,14 @@ public final class BiomeRoofedForestMutated extends BiomeBase { @@ -1091,7 +1091,7 @@ index 5c9ab0864e..9fa84c87fa 100644 BiomeDecoratorGroups.g(this); BiomeDecoratorGroups.h(this); diff --git a/src/main/java/net/minecraft/server/BiomeSavanna.java b/src/main/java/net/minecraft/server/BiomeSavanna.java -index e023898b38..c12a890165 100644 +index e023898b3..c12a89016 100644 --- a/src/main/java/net/minecraft/server/BiomeSavanna.java +++ b/src/main/java/net/minecraft/server/BiomeSavanna.java @@ -4,10 +4,10 @@ public final class BiomeSavanna extends BiomeBase { @@ -1110,7 +1110,7 @@ index e023898b38..c12a890165 100644 BiomeDecoratorGroups.c(this); BiomeDecoratorGroups.d(this); diff --git a/src/main/java/net/minecraft/server/BiomeSavannaMutated.java b/src/main/java/net/minecraft/server/BiomeSavannaMutated.java -index 8a0da661fb..db8b20a6c7 100644 +index 8a0da661f..db8b20a6c 100644 --- a/src/main/java/net/minecraft/server/BiomeSavannaMutated.java +++ b/src/main/java/net/minecraft/server/BiomeSavannaMutated.java @@ -4,8 +4,8 @@ public final class BiomeSavannaMutated extends BiomeBase { @@ -1125,7 +1125,7 @@ index 8a0da661fb..db8b20a6c7 100644 BiomeDecoratorGroups.c(this); BiomeDecoratorGroups.d(this); diff --git a/src/main/java/net/minecraft/server/BiomeSavannaPlateau.java b/src/main/java/net/minecraft/server/BiomeSavannaPlateau.java -index 1d2a37a41e..2826c510d8 100644 +index 1d2a37a41..2826c510d 100644 --- a/src/main/java/net/minecraft/server/BiomeSavannaPlateau.java +++ b/src/main/java/net/minecraft/server/BiomeSavannaPlateau.java @@ -4,8 +4,8 @@ public final class BiomeSavannaPlateau extends BiomeBase { @@ -1140,7 +1140,7 @@ index 1d2a37a41e..2826c510d8 100644 BiomeDecoratorGroups.c(this); BiomeDecoratorGroups.d(this); diff --git a/src/main/java/net/minecraft/server/BiomeSavannaPlateauMutated.java b/src/main/java/net/minecraft/server/BiomeSavannaPlateauMutated.java -index 91e2b59037..e544a8f6b9 100644 +index 91e2b5903..e544a8f6b 100644 --- a/src/main/java/net/minecraft/server/BiomeSavannaPlateauMutated.java +++ b/src/main/java/net/minecraft/server/BiomeSavannaPlateauMutated.java @@ -4,8 +4,8 @@ public final class BiomeSavannaPlateauMutated extends BiomeBase { @@ -1155,7 +1155,7 @@ index 91e2b59037..e544a8f6b9 100644 BiomeDecoratorGroups.c(this); BiomeDecoratorGroups.d(this); diff --git a/src/main/java/net/minecraft/server/BiomeStoneBeach.java b/src/main/java/net/minecraft/server/BiomeStoneBeach.java -index 501c36649e..34660f9f84 100644 +index 501c36649..34660f9f8 100644 --- a/src/main/java/net/minecraft/server/BiomeStoneBeach.java +++ b/src/main/java/net/minecraft/server/BiomeStoneBeach.java @@ -4,8 +4,8 @@ public final class BiomeStoneBeach extends BiomeBase { @@ -1170,7 +1170,7 @@ index 501c36649e..34660f9f84 100644 BiomeDecoratorGroups.c(this); BiomeDecoratorGroups.d(this); diff --git a/src/main/java/net/minecraft/server/BiomeSunflowerPlains.java b/src/main/java/net/minecraft/server/BiomeSunflowerPlains.java -index 62c1cfaef9..8815c95900 100644 +index 62c1cfaef..8815c9590 100644 --- a/src/main/java/net/minecraft/server/BiomeSunflowerPlains.java +++ b/src/main/java/net/minecraft/server/BiomeSunflowerPlains.java @@ -4,21 +4,21 @@ public final class BiomeSunflowerPlains extends BiomeBase { @@ -1201,7 +1201,7 @@ index 62c1cfaef9..8815c95900 100644 BiomeDecoratorGroups.ap(this); this.a(EnumCreatureType.CREATURE, new BiomeBase.BiomeMeta(EntityTypes.SHEEP, 12, 4, 4)); diff --git a/src/main/java/net/minecraft/server/BiomeSwamp.java b/src/main/java/net/minecraft/server/BiomeSwamp.java -index 29e448f5ad..02584897e9 100644 +index 29e448f5a..02584897e 100644 --- a/src/main/java/net/minecraft/server/BiomeSwamp.java +++ b/src/main/java/net/minecraft/server/BiomeSwamp.java @@ -4,8 +4,8 @@ public final class BiomeSwamp extends BiomeBase { @@ -1225,7 +1225,7 @@ index 29e448f5ad..02584897e9 100644 BiomeDecoratorGroups.ap(this); this.a(EnumCreatureType.CREATURE, new BiomeBase.BiomeMeta(EntityTypes.SHEEP, 12, 4, 4)); diff --git a/src/main/java/net/minecraft/server/BiomeSwamplandMutated.java b/src/main/java/net/minecraft/server/BiomeSwamplandMutated.java -index 1352daa258..d85b01b956 100644 +index 1352daa25..d85b01b95 100644 --- a/src/main/java/net/minecraft/server/BiomeSwamplandMutated.java +++ b/src/main/java/net/minecraft/server/BiomeSwamplandMutated.java @@ -4,7 +4,7 @@ public final class BiomeSwamplandMutated extends BiomeBase { @@ -1238,7 +1238,7 @@ index 1352daa258..d85b01b956 100644 BiomeDecoratorGroups.c(this); BiomeDecoratorGroups.d(this); diff --git a/src/main/java/net/minecraft/server/BiomeTaiga.java b/src/main/java/net/minecraft/server/BiomeTaiga.java -index 5cd569dcdd..ae6e6ca896 100644 +index 5cd569dcd..ae6e6ca89 100644 --- a/src/main/java/net/minecraft/server/BiomeTaiga.java +++ b/src/main/java/net/minecraft/server/BiomeTaiga.java @@ -4,10 +4,10 @@ public final class BiomeTaiga extends BiomeBase { @@ -1257,7 +1257,7 @@ index 5cd569dcdd..ae6e6ca896 100644 BiomeDecoratorGroups.c(this); BiomeDecoratorGroups.d(this); diff --git a/src/main/java/net/minecraft/server/BiomeTaigaHills.java b/src/main/java/net/minecraft/server/BiomeTaigaHills.java -index e182f04008..4e19fe5ae9 100644 +index e182f0400..4e19fe5ae 100644 --- a/src/main/java/net/minecraft/server/BiomeTaigaHills.java +++ b/src/main/java/net/minecraft/server/BiomeTaigaHills.java @@ -4,8 +4,8 @@ public final class BiomeTaigaHills extends BiomeBase { @@ -1272,7 +1272,7 @@ index e182f04008..4e19fe5ae9 100644 BiomeDecoratorGroups.c(this); BiomeDecoratorGroups.d(this); diff --git a/src/main/java/net/minecraft/server/BiomeTaigaMutated.java b/src/main/java/net/minecraft/server/BiomeTaigaMutated.java -index 75d46c61dc..05e833ffed 100644 +index 75d46c61d..05e833ffe 100644 --- a/src/main/java/net/minecraft/server/BiomeTaigaMutated.java +++ b/src/main/java/net/minecraft/server/BiomeTaigaMutated.java @@ -4,8 +4,8 @@ public final class BiomeTaigaMutated extends BiomeBase { @@ -1287,7 +1287,7 @@ index 75d46c61dc..05e833ffed 100644 BiomeDecoratorGroups.c(this); BiomeDecoratorGroups.d(this); diff --git a/src/main/java/net/minecraft/server/BiomeTheEnd.java b/src/main/java/net/minecraft/server/BiomeTheEnd.java -index 26fda2cf69..22e9789a36 100644 +index 26fda2cf6..22e9789a3 100644 --- a/src/main/java/net/minecraft/server/BiomeTheEnd.java +++ b/src/main/java/net/minecraft/server/BiomeTheEnd.java @@ -6,7 +6,7 @@ public final class BiomeTheEnd extends BiomeBase { @@ -1300,7 +1300,7 @@ index 26fda2cf69..22e9789a36 100644 this.a(EnumCreatureType.MONSTER, new BiomeBase.BiomeMeta(EntityTypes.ENDERMAN, 10, 4, 4)); } diff --git a/src/main/java/net/minecraft/server/BiomeTheEndFloatingIslands.java b/src/main/java/net/minecraft/server/BiomeTheEndFloatingIslands.java -index c065128649..a26d56aa45 100644 +index c06512864..a26d56aa4 100644 --- a/src/main/java/net/minecraft/server/BiomeTheEndFloatingIslands.java +++ b/src/main/java/net/minecraft/server/BiomeTheEndFloatingIslands.java @@ -4,7 +4,7 @@ public class BiomeTheEndFloatingIslands extends BiomeBase { @@ -1313,7 +1313,7 @@ index c065128649..a26d56aa45 100644 this.a(EnumCreatureType.MONSTER, new BiomeBase.BiomeMeta(EntityTypes.ENDERMAN, 10, 4, 4)); } diff --git a/src/main/java/net/minecraft/server/BiomeTheEndHighIsland.java b/src/main/java/net/minecraft/server/BiomeTheEndHighIsland.java -index 90e79b2918..e47add3e43 100644 +index 90e79b291..e47add3e4 100644 --- a/src/main/java/net/minecraft/server/BiomeTheEndHighIsland.java +++ b/src/main/java/net/minecraft/server/BiomeTheEndHighIsland.java @@ -4,10 +4,10 @@ public class BiomeTheEndHighIsland extends BiomeBase { @@ -1331,7 +1331,7 @@ index 90e79b2918..e47add3e43 100644 } } diff --git a/src/main/java/net/minecraft/server/BiomeTheEndMediumIsland.java b/src/main/java/net/minecraft/server/BiomeTheEndMediumIsland.java -index c7d5317cc0..ec92a84579 100644 +index c7d5317cc..ec92a8457 100644 --- a/src/main/java/net/minecraft/server/BiomeTheEndMediumIsland.java +++ b/src/main/java/net/minecraft/server/BiomeTheEndMediumIsland.java @@ -4,7 +4,7 @@ public class BiomeTheEndMediumIsland extends BiomeBase { @@ -1344,7 +1344,7 @@ index c7d5317cc0..ec92a84579 100644 this.a(EnumCreatureType.MONSTER, new BiomeBase.BiomeMeta(EntityTypes.ENDERMAN, 10, 4, 4)); } diff --git a/src/main/java/net/minecraft/server/BiomeVoid.java b/src/main/java/net/minecraft/server/BiomeVoid.java -index 87fd7e1467..c9ba334535 100644 +index 87fd7e146..c9ba33453 100644 --- a/src/main/java/net/minecraft/server/BiomeVoid.java +++ b/src/main/java/net/minecraft/server/BiomeVoid.java @@ -4,6 +4,6 @@ public final class BiomeVoid extends BiomeBase { @@ -1356,7 +1356,7 @@ index 87fd7e1467..c9ba334535 100644 } } diff --git a/src/main/java/net/minecraft/server/BiomeWarmDeepOcean.java b/src/main/java/net/minecraft/server/BiomeWarmDeepOcean.java -index 3f8e18a2c7..11dc5f6374 100644 +index 3f8e18a2c..11dc5f637 100644 --- a/src/main/java/net/minecraft/server/BiomeWarmDeepOcean.java +++ b/src/main/java/net/minecraft/server/BiomeWarmDeepOcean.java @@ -4,10 +4,10 @@ public class BiomeWarmDeepOcean extends BiomeBase { @@ -1375,7 +1375,7 @@ index 3f8e18a2c7..11dc5f6374 100644 BiomeDecoratorGroups.c(this); BiomeDecoratorGroups.d(this); diff --git a/src/main/java/net/minecraft/server/BiomeWarmOcean.java b/src/main/java/net/minecraft/server/BiomeWarmOcean.java -index dd7916c090..e4dc7d198c 100644 +index dd7916c09..e4dc7d198 100644 --- a/src/main/java/net/minecraft/server/BiomeWarmOcean.java +++ b/src/main/java/net/minecraft/server/BiomeWarmOcean.java @@ -6,9 +6,9 @@ public class BiomeWarmOcean extends BiomeBase { @@ -1404,7 +1404,7 @@ index dd7916c090..e4dc7d198c 100644 this.a(EnumCreatureType.WATER_CREATURE, new BiomeBase.BiomeMeta(EntityTypes.SQUID, 10, 4, 4)); this.a(EnumCreatureType.WATER_CREATURE, new BiomeBase.BiomeMeta(EntityTypes.PUFFERFISH, 15, 1, 3)); diff --git a/src/main/java/net/minecraft/server/EntityBlaze.java b/src/main/java/net/minecraft/server/EntityBlaze.java -index 5b1d2c7f50..da6a3fa2c8 100644 +index 5b1d2c7f5..da6a3fa2c 100644 --- a/src/main/java/net/minecraft/server/EntityBlaze.java +++ b/src/main/java/net/minecraft/server/EntityBlaze.java @@ -24,7 +24,7 @@ public class EntityBlaze extends EntityMonster { @@ -1417,7 +1417,7 @@ index 5b1d2c7f50..da6a3fa2c8 100644 } diff --git a/src/main/java/net/minecraft/server/EntityCat.java b/src/main/java/net/minecraft/server/EntityCat.java -index 57af3835ee..b3bdc194ab 100644 +index 57af3835e..b3bdc194a 100644 --- a/src/main/java/net/minecraft/server/EntityCat.java +++ b/src/main/java/net/minecraft/server/EntityCat.java @@ -16,7 +16,7 @@ public class EntityCat extends EntityTameableAnimal { @@ -1430,7 +1430,7 @@ index 57af3835ee..b3bdc194ab 100644 hashmap.put(1, new MinecraftKey("textures/entity/cat/black.png")); hashmap.put(2, new MinecraftKey("textures/entity/cat/red.png")); diff --git a/src/main/java/net/minecraft/server/EntityEndermite.java b/src/main/java/net/minecraft/server/EntityEndermite.java -index b34695f2d0..e4bd2796a4 100644 +index b34695f2d..e4bd2796a 100644 --- a/src/main/java/net/minecraft/server/EntityEndermite.java +++ b/src/main/java/net/minecraft/server/EntityEndermite.java @@ -19,7 +19,7 @@ public class EntityEndermite extends EntityMonster { @@ -1443,7 +1443,7 @@ index b34695f2d0..e4bd2796a4 100644 } diff --git a/src/main/java/net/minecraft/server/EntityEvoker.java b/src/main/java/net/minecraft/server/EntityEvoker.java -index 886268b09e..b030fe9577 100644 +index 886268b09..b030fe957 100644 --- a/src/main/java/net/minecraft/server/EntityEvoker.java +++ b/src/main/java/net/minecraft/server/EntityEvoker.java @@ -24,7 +24,7 @@ public class EntityEvoker extends EntityIllagerWizard { @@ -1456,7 +1456,7 @@ index 886268b09e..b030fe9577 100644 this.targetSelector.a(3, (new PathfinderGoalNearestAttackableTarget<>(this, EntityVillagerAbstract.class, false)).a(300)); this.targetSelector.a(3, new PathfinderGoalNearestAttackableTarget<>(this, EntityIronGolem.class, false)); diff --git a/src/main/java/net/minecraft/server/EntityFish.java b/src/main/java/net/minecraft/server/EntityFish.java -index d332907b3b..b853fd0d9b 100644 +index d332907b3..b853fd0d9 100644 --- a/src/main/java/net/minecraft/server/EntityFish.java +++ b/src/main/java/net/minecraft/server/EntityFish.java @@ -73,11 +73,7 @@ public abstract class EntityFish extends EntityWaterAnimal { @@ -1473,7 +1473,7 @@ index d332907b3b..b853fd0d9b 100644 } diff --git a/src/main/java/net/minecraft/server/EntityParrot.java b/src/main/java/net/minecraft/server/EntityParrot.java -index 1402087612..94e57a2d85 100644 +index 140208761..94e57a2d8 100644 --- a/src/main/java/net/minecraft/server/EntityParrot.java +++ b/src/main/java/net/minecraft/server/EntityParrot.java @@ -20,8 +20,8 @@ public class EntityParrot extends EntityPerchable implements EntityBird { @@ -1488,7 +1488,7 @@ index 1402087612..94e57a2d85 100644 hashmap.put(EntityTypes.CAVE_SPIDER, SoundEffects.ENTITY_PARROT_IMITATE_SPIDER); hashmap.put(EntityTypes.CREEPER, SoundEffects.ENTITY_PARROT_IMITATE_CREEPER); diff --git a/src/main/java/net/minecraft/server/EntitySheep.java b/src/main/java/net/minecraft/server/EntitySheep.java -index a8ef98981d..d5ffdc110d 100644 +index a8ef98981..d5ffdc110 100644 --- a/src/main/java/net/minecraft/server/EntitySheep.java +++ b/src/main/java/net/minecraft/server/EntitySheep.java @@ -18,7 +18,7 @@ import org.bukkit.inventory.InventoryView; @@ -1512,7 +1512,7 @@ index a8ef98981d..d5ffdc110d 100644 private PathfinderGoalEatTile bA; diff --git a/src/main/java/net/minecraft/server/EntityWitch.java b/src/main/java/net/minecraft/server/EntityWitch.java -index 7b6b1ad17b..1432d3f6bf 100644 +index 7b6b1ad17..1432d3f6b 100644 --- a/src/main/java/net/minecraft/server/EntityWitch.java +++ b/src/main/java/net/minecraft/server/EntityWitch.java @@ -30,13 +30,13 @@ public class EntityWitch extends EntityRaider implements IRangedEntity { @@ -1532,7 +1532,7 @@ index 7b6b1ad17b..1432d3f6bf 100644 this.targetSelector.a(3, this.bA); } diff --git a/src/main/java/net/minecraft/server/WorldGenFeatureConfigured.java b/src/main/java/net/minecraft/server/WorldGenFeatureConfigured.java -index de8f1874af..73402f2b5a 100644 +index de8f1874a..73402f2b5 100644 --- a/src/main/java/net/minecraft/server/WorldGenFeatureConfigured.java +++ b/src/main/java/net/minecraft/server/WorldGenFeatureConfigured.java @@ -25,7 +25,7 @@ public class WorldGenFeatureConfigured Date: Tue, 18 Feb 2020 20:38:34 -0600 Subject: [PATCH] Host our own timings @@ -8,7 +8,7 @@ Subject: [PATCH] Host our own timings 1 file changed, 4 insertions(+) diff --git a/src/main/java/net/pl3x/purpur/PurpurConfig.java b/src/main/java/net/pl3x/purpur/PurpurConfig.java -index 706d787579..f234832e6f 100644 +index 706d78757..f234832e6 100644 --- a/src/main/java/net/pl3x/purpur/PurpurConfig.java +++ b/src/main/java/net/pl3x/purpur/PurpurConfig.java @@ -132,4 +132,8 @@ public class PurpurConfig { 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 1681d7d3f..a2c16e49e 100644 --- a/patches/server/0005-Ridables.patch +++ b/patches/server/0006-Ridables.patch @@ -1,4 +1,4 @@ -From 0b558dadf8a216b1eea6c4835b85634df09d6c63 Mon Sep 17 00:00:00 2001 +From 8db2c188c7732d45bad5b3613d00e978cb08a634 Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Thu, 6 Feb 2020 19:53:59 -0600 Subject: [PATCH] Ridables @@ -105,7 +105,7 @@ Subject: [PATCH] Ridables create mode 100644 src/main/java/net/pl3x/purpur/pathfinder/PathfinderGoalHasRider.java diff --git a/src/main/java/net/minecraft/server/ControllerLookDolphin.java b/src/main/java/net/minecraft/server/ControllerLookDolphin.java -index 1d9ba04daa..2bade947ee 100644 +index 1d9ba04da..2bade947e 100644 --- a/src/main/java/net/minecraft/server/ControllerLookDolphin.java +++ b/src/main/java/net/minecraft/server/ControllerLookDolphin.java @@ -1,6 +1,6 @@ @@ -126,7 +126,7 @@ index 1d9ba04daa..2bade947ee 100644 this.d = false; this.a.aK = this.a(this.a.aK, this.h() + 20.0F, this.b); diff --git a/src/main/java/net/minecraft/server/ControllerMove.java b/src/main/java/net/minecraft/server/ControllerMove.java -index a5c4cbb67f..efe6afde9b 100644 +index a5c4cbb67..efe6afde9 100644 --- a/src/main/java/net/minecraft/server/ControllerMove.java +++ b/src/main/java/net/minecraft/server/ControllerMove.java @@ -6,9 +6,9 @@ public class ControllerMove { @@ -143,7 +143,7 @@ index a5c4cbb67f..efe6afde9b 100644 public ControllerMove(EntityInsentient entityinsentient) { diff --git a/src/main/java/net/minecraft/server/Entity.java b/src/main/java/net/minecraft/server/Entity.java -index 8974c16bf9..1d5cbbf97d 100644 +index 23e91183e..d87bfc98e 100644 --- a/src/main/java/net/minecraft/server/Entity.java +++ b/src/main/java/net/minecraft/server/Entity.java @@ -78,7 +78,7 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke @@ -182,7 +182,7 @@ index 8974c16bf9..1d5cbbf97d 100644 private float headHeight; // CraftBukkit start public boolean persist = true; -@@ -1285,6 +1285,7 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke +@@ -1337,6 +1337,7 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke return this.inLava; } @@ -190,7 +190,7 @@ index 8974c16bf9..1d5cbbf97d 100644 public void a(float f, Vec3D vec3d) { Vec3D vec3d1 = a(vec3d, f, this.yaw); -@@ -2112,7 +2113,13 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke +@@ -2165,7 +2166,13 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke } else { this.passengers.add(entity); } @@ -205,7 +205,7 @@ index 8974c16bf9..1d5cbbf97d 100644 } return true; // CraftBukkit } -@@ -2147,6 +2154,12 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke +@@ -2200,6 +2207,12 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke return false; } // Spigot end @@ -218,7 +218,7 @@ index 8974c16bf9..1d5cbbf97d 100644 this.passengers.remove(entity); entity.j = 60; } -@@ -2533,6 +2546,7 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke +@@ -2586,6 +2599,7 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke public void setHeadRotation(float f) {} @@ -226,7 +226,7 @@ index 8974c16bf9..1d5cbbf97d 100644 public void l(float f) {} public boolean bA() { -@@ -3378,4 +3392,43 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke +@@ -3431,4 +3445,43 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke void accept(Entity entity, double d0, double d1, double d2); } @@ -271,7 +271,7 @@ index 8974c16bf9..1d5cbbf97d 100644 + // Purpur end } diff --git a/src/main/java/net/minecraft/server/EntityAgeable.java b/src/main/java/net/minecraft/server/EntityAgeable.java -index 3d27f0964a..822316a65f 100644 +index 3d27f0964..822316a65 100644 --- a/src/main/java/net/minecraft/server/EntityAgeable.java +++ b/src/main/java/net/minecraft/server/EntityAgeable.java @@ -86,7 +86,7 @@ public abstract class EntityAgeable extends EntityCreature { @@ -284,7 +284,7 @@ index 3d27f0964a..822316a65f 100644 } diff --git a/src/main/java/net/minecraft/server/EntityBat.java b/src/main/java/net/minecraft/server/EntityBat.java -index 34239160be..dfc2ce9729 100644 +index 34239160b..dfc2ce972 100644 --- a/src/main/java/net/minecraft/server/EntityBat.java +++ b/src/main/java/net/minecraft/server/EntityBat.java @@ -14,9 +14,44 @@ public class EntityBat extends EntityAmbient { @@ -371,7 +371,7 @@ index 34239160be..dfc2ce9729 100644 + // Purpur end } diff --git a/src/main/java/net/minecraft/server/EntityBee.java b/src/main/java/net/minecraft/server/EntityBee.java -index c7d79efdf6..7e4aad7716 100644 +index c7d79efdf..7e4aad771 100644 --- a/src/main/java/net/minecraft/server/EntityBee.java +++ b/src/main/java/net/minecraft/server/EntityBee.java @@ -36,9 +36,7 @@ public class EntityBee extends EntityAnimal implements EntityBird { @@ -552,7 +552,7 @@ index c7d79efdf6..7e4aad7716 100644 + // Purpur end } diff --git a/src/main/java/net/minecraft/server/EntityBlaze.java b/src/main/java/net/minecraft/server/EntityBlaze.java -index da6a3fa2c8..1e220131ca 100644 +index da6a3fa2c..1e220131c 100644 --- a/src/main/java/net/minecraft/server/EntityBlaze.java +++ b/src/main/java/net/minecraft/server/EntityBlaze.java @@ -10,6 +10,7 @@ public class EntityBlaze extends EntityMonster { @@ -638,7 +638,7 @@ index da6a3fa2c8..1e220131ca 100644 if (this.c <= 0) { this.c = 100; diff --git a/src/main/java/net/minecraft/server/EntityCat.java b/src/main/java/net/minecraft/server/EntityCat.java -index b3bdc194ab..8b9222d778 100644 +index b3bdc194a..8b9222d77 100644 --- a/src/main/java/net/minecraft/server/EntityCat.java +++ b/src/main/java/net/minecraft/server/EntityCat.java @@ -42,6 +42,23 @@ public class EntityCat extends EntityTameableAnimal { @@ -732,7 +732,7 @@ index b3bdc194ab..8b9222d778 100644 @Override diff --git a/src/main/java/net/minecraft/server/EntityCaveSpider.java b/src/main/java/net/minecraft/server/EntityCaveSpider.java -index 23ced2c7bb..5b86b36f6a 100644 +index 23ced2c7b..5b86b36f6 100644 --- a/src/main/java/net/minecraft/server/EntityCaveSpider.java +++ b/src/main/java/net/minecraft/server/EntityCaveSpider.java @@ -8,6 +8,23 @@ public class EntityCaveSpider extends EntitySpider { @@ -760,7 +760,7 @@ index 23ced2c7bb..5b86b36f6a 100644 protected void initAttributes() { super.initAttributes(); diff --git a/src/main/java/net/minecraft/server/EntityChicken.java b/src/main/java/net/minecraft/server/EntityChicken.java -index 65795fc896..5505b7ee94 100644 +index 65795fc89..5505b7ee9 100644 --- a/src/main/java/net/minecraft/server/EntityChicken.java +++ b/src/main/java/net/minecraft/server/EntityChicken.java @@ -17,9 +17,27 @@ public class EntityChicken extends EntityAnimal { @@ -800,7 +800,7 @@ index 65795fc896..5505b7ee94 100644 this.forceDrops = true; // CraftBukkit this.a((IMaterial) Items.EGG); diff --git a/src/main/java/net/minecraft/server/EntityCod.java b/src/main/java/net/minecraft/server/EntityCod.java -index 1e3782122a..0153a821ee 100644 +index 1e3782122..0153a821e 100644 --- a/src/main/java/net/minecraft/server/EntityCod.java +++ b/src/main/java/net/minecraft/server/EntityCod.java @@ -6,6 +6,23 @@ public class EntityCod extends EntityFishSchool { @@ -828,7 +828,7 @@ index 1e3782122a..0153a821ee 100644 protected ItemStack l() { return new ItemStack(Items.COD_BUCKET); diff --git a/src/main/java/net/minecraft/server/EntityComplexPart.java b/src/main/java/net/minecraft/server/EntityComplexPart.java -index a0b35c8699..144e89f224 100644 +index a0b35c869..144e89f22 100644 --- a/src/main/java/net/minecraft/server/EntityComplexPart.java +++ b/src/main/java/net/minecraft/server/EntityComplexPart.java @@ -47,4 +47,11 @@ public class EntityComplexPart extends Entity { @@ -844,7 +844,7 @@ index a0b35c8699..144e89f224 100644 + // Purpur end } diff --git a/src/main/java/net/minecraft/server/EntityCow.java b/src/main/java/net/minecraft/server/EntityCow.java -index 2c8bbf20ae..723a9fa1ee 100644 +index 2c8bbf20a..723a9fa1e 100644 --- a/src/main/java/net/minecraft/server/EntityCow.java +++ b/src/main/java/net/minecraft/server/EntityCow.java @@ -11,9 +11,27 @@ public class EntityCow extends EntityAnimal { @@ -876,7 +876,7 @@ index 2c8bbf20ae..723a9fa1ee 100644 this.goalSelector.a(2, new PathfinderGoalBreed(this, 1.0D)); this.goalSelector.a(3, new PathfinderGoalTempt(this, 1.25D, RecipeItemStack.a(Items.WHEAT), false)); diff --git a/src/main/java/net/minecraft/server/EntityCreeper.java b/src/main/java/net/minecraft/server/EntityCreeper.java -index 45dfc8104a..48fd8e716b 100644 +index 45dfc8104..48fd8e716 100644 --- a/src/main/java/net/minecraft/server/EntityCreeper.java +++ b/src/main/java/net/minecraft/server/EntityCreeper.java @@ -23,16 +23,35 @@ public class EntityCreeper extends EntityMonster { @@ -992,7 +992,7 @@ index 45dfc8104a..48fd8e716b 100644 + // Purpur end } diff --git a/src/main/java/net/minecraft/server/EntityDolphin.java b/src/main/java/net/minecraft/server/EntityDolphin.java -index ce78586ea0..e5c914eb14 100644 +index ce78586ea..e5c914eb1 100644 --- a/src/main/java/net/minecraft/server/EntityDolphin.java +++ b/src/main/java/net/minecraft/server/EntityDolphin.java @@ -23,6 +23,23 @@ public class EntityDolphin extends EntityWaterAnimal { @@ -1085,7 +1085,7 @@ index ce78586ea0..e5c914eb14 100644 this.i.setMot(this.i.getMot().add(0.0D, 0.005D, 0.0D)); } diff --git a/src/main/java/net/minecraft/server/EntityDrowned.java b/src/main/java/net/minecraft/server/EntityDrowned.java -index 77885f67ff..63f5969b10 100644 +index 77885f67f..63f5969b1 100644 --- a/src/main/java/net/minecraft/server/EntityDrowned.java +++ b/src/main/java/net/minecraft/server/EntityDrowned.java @@ -19,6 +19,23 @@ public class EntityDrowned extends EntityZombie implements IRangedEntity { @@ -1148,7 +1148,7 @@ index 77885f67ff..63f5969b10 100644 @Override diff --git a/src/main/java/net/minecraft/server/EntityEnderDragon.java b/src/main/java/net/minecraft/server/EntityEnderDragon.java -index af10fc36e0..e08b731d2c 100644 +index bf14d33c0..1b523b0da 100644 --- a/src/main/java/net/minecraft/server/EntityEnderDragon.java +++ b/src/main/java/net/minecraft/server/EntityEnderDragon.java @@ -46,6 +46,7 @@ public class EntityEnderDragon extends EntityInsentient implements IMonster { @@ -1305,7 +1305,7 @@ index af10fc36e0..e08b731d2c 100644 @Override diff --git a/src/main/java/net/minecraft/server/EntityEnderman.java b/src/main/java/net/minecraft/server/EntityEnderman.java -index 212636dcb2..de30ce483f 100644 +index 212636dcb..de30ce483 100644 --- a/src/main/java/net/minecraft/server/EntityEnderman.java +++ b/src/main/java/net/minecraft/server/EntityEnderman.java @@ -27,9 +27,27 @@ public class EntityEnderman extends EntityMonster { @@ -1404,7 +1404,7 @@ index 212636dcb2..de30ce483f 100644 if (iblockdata2 != null && this.a(world, blockposition, iblockdata2, iblockdata, iblockdata1, blockposition1)) { // CraftBukkit start - Place event diff --git a/src/main/java/net/minecraft/server/EntityEndermite.java b/src/main/java/net/minecraft/server/EntityEndermite.java -index e4bd2796a4..5eaf1920b2 100644 +index e4bd2796a..5eaf1920b 100644 --- a/src/main/java/net/minecraft/server/EntityEndermite.java +++ b/src/main/java/net/minecraft/server/EntityEndermite.java @@ -12,13 +12,32 @@ public class EntityEndermite extends EntityMonster { @@ -1441,7 +1441,7 @@ index e4bd2796a4..5eaf1920b2 100644 this.targetSelector.a(2, new PathfinderGoalNearestAttackableTarget<>(this, EntityHuman.class, true)); } diff --git a/src/main/java/net/minecraft/server/EntityEvoker.java b/src/main/java/net/minecraft/server/EntityEvoker.java -index b030fe9577..179a261296 100644 +index b030fe957..179a26129 100644 --- a/src/main/java/net/minecraft/server/EntityEvoker.java +++ b/src/main/java/net/minecraft/server/EntityEvoker.java @@ -12,10 +12,28 @@ public class EntityEvoker extends EntityIllagerWizard { @@ -1506,7 +1506,7 @@ index b030fe9577..179a261296 100644 @Override diff --git a/src/main/java/net/minecraft/server/EntityFish.java b/src/main/java/net/minecraft/server/EntityFish.java -index b853fd0d9b..b8d786fad5 100644 +index b853fd0d9..b8d786fad 100644 --- a/src/main/java/net/minecraft/server/EntityFish.java +++ b/src/main/java/net/minecraft/server/EntityFish.java @@ -72,9 +72,10 @@ public abstract class EntityFish extends EntityWaterAnimal { @@ -1560,7 +1560,7 @@ index b853fd0d9b..b8d786fad5 100644 this.i.setMot(this.i.getMot().add(0.0D, 0.005D, 0.0D)); } diff --git a/src/main/java/net/minecraft/server/EntityFox.java b/src/main/java/net/minecraft/server/EntityFox.java -index 82a32d5dbf..4f53090d3d 100644 +index 82a32d5db..4f53090d3 100644 --- a/src/main/java/net/minecraft/server/EntityFox.java +++ b/src/main/java/net/minecraft/server/EntityFox.java @@ -55,6 +55,23 @@ public class EntityFox extends EntityAnimal { @@ -1698,7 +1698,7 @@ index 82a32d5dbf..4f53090d3d 100644 } diff --git a/src/main/java/net/minecraft/server/EntityGhast.java b/src/main/java/net/minecraft/server/EntityGhast.java -index e1c2540d14..85e6c195f3 100644 +index e1c2540d1..85e6c195f 100644 --- a/src/main/java/net/minecraft/server/EntityGhast.java +++ b/src/main/java/net/minecraft/server/EntityGhast.java @@ -14,11 +14,47 @@ public class EntityGhast extends EntityFlying implements IMonster { @@ -1777,7 +1777,7 @@ index e1c2540d14..85e6c195f3 100644 if (this.j-- <= 0) { this.j += this.i.getRandom().nextInt(5) + 2; diff --git a/src/main/java/net/minecraft/server/EntityGiantZombie.java b/src/main/java/net/minecraft/server/EntityGiantZombie.java -index d9e5eaad12..ff8a41a539 100644 +index d9e5eaad1..ff8a41a53 100644 --- a/src/main/java/net/minecraft/server/EntityGiantZombie.java +++ b/src/main/java/net/minecraft/server/EntityGiantZombie.java @@ -4,8 +4,33 @@ public class EntityGiantZombie extends EntityMonster { @@ -1815,7 +1815,7 @@ index d9e5eaad12..ff8a41a539 100644 protected float b(EntityPose entitypose, EntitySize entitysize) { return 10.440001F; diff --git a/src/main/java/net/minecraft/server/EntityGuardian.java b/src/main/java/net/minecraft/server/EntityGuardian.java -index e69cb334fb..97040872bc 100644 +index e69cb334f..97040872b 100644 --- a/src/main/java/net/minecraft/server/EntityGuardian.java +++ b/src/main/java/net/minecraft/server/EntityGuardian.java @@ -24,15 +24,39 @@ public class EntityGuardian extends EntityMonster { @@ -1916,7 +1916,7 @@ index e69cb334fb..97040872bc 100644 Vec3D vec3d = new Vec3D(this.b - this.i.locX(), this.c - this.i.locY(), this.d - this.i.locZ()); double d0 = vec3d.f(); diff --git a/src/main/java/net/minecraft/server/EntityGuardianElder.java b/src/main/java/net/minecraft/server/EntityGuardianElder.java -index 7484bfeea0..f231340d90 100644 +index 7484bfeea..f231340d9 100644 --- a/src/main/java/net/minecraft/server/EntityGuardianElder.java +++ b/src/main/java/net/minecraft/server/EntityGuardianElder.java @@ -16,6 +16,23 @@ public class EntityGuardianElder extends EntityGuardian { @@ -1944,7 +1944,7 @@ index 7484bfeea0..f231340d90 100644 public void initAttributes() { super.initAttributes(); diff --git a/src/main/java/net/minecraft/server/EntityHorse.java b/src/main/java/net/minecraft/server/EntityHorse.java -index a6fb4ba5b9..98b1e93759 100644 +index a6fb4ba5b..98b1e9375 100644 --- a/src/main/java/net/minecraft/server/EntityHorse.java +++ b/src/main/java/net/minecraft/server/EntityHorse.java @@ -19,6 +19,13 @@ public class EntityHorse extends EntityHorseAbstract { @@ -1962,7 +1962,7 @@ index a6fb4ba5b9..98b1e93759 100644 protected void initDatawatcher() { super.initDatawatcher(); diff --git a/src/main/java/net/minecraft/server/EntityHorseAbstract.java b/src/main/java/net/minecraft/server/EntityHorseAbstract.java -index c56efe035a..e7ba83f32a 100644 +index c56efe035..e7ba83f32 100644 --- a/src/main/java/net/minecraft/server/EntityHorseAbstract.java +++ b/src/main/java/net/minecraft/server/EntityHorseAbstract.java @@ -38,12 +38,39 @@ public abstract class EntityHorseAbstract extends EntityAnimal implements IInven @@ -2015,7 +2015,7 @@ index c56efe035a..e7ba83f32a 100644 } diff --git a/src/main/java/net/minecraft/server/EntityHorseDonkey.java b/src/main/java/net/minecraft/server/EntityHorseDonkey.java -index 9a52decdca..64d80081f7 100644 +index 9a52decdc..64d80081f 100644 --- a/src/main/java/net/minecraft/server/EntityHorseDonkey.java +++ b/src/main/java/net/minecraft/server/EntityHorseDonkey.java @@ -6,6 +6,13 @@ public class EntityHorseDonkey extends EntityHorseChestedAbstract { @@ -2033,7 +2033,7 @@ index 9a52decdca..64d80081f7 100644 protected SoundEffect getSoundAmbient() { super.getSoundAmbient(); diff --git a/src/main/java/net/minecraft/server/EntityHorseMule.java b/src/main/java/net/minecraft/server/EntityHorseMule.java -index 4dd4d91eba..a9f26efe66 100644 +index 4dd4d91eb..a9f26efe6 100644 --- a/src/main/java/net/minecraft/server/EntityHorseMule.java +++ b/src/main/java/net/minecraft/server/EntityHorseMule.java @@ -6,6 +6,13 @@ public class EntityHorseMule extends EntityHorseChestedAbstract { @@ -2051,7 +2051,7 @@ index 4dd4d91eba..a9f26efe66 100644 protected SoundEffect getSoundAmbient() { super.getSoundAmbient(); diff --git a/src/main/java/net/minecraft/server/EntityHorseSkeleton.java b/src/main/java/net/minecraft/server/EntityHorseSkeleton.java -index 290cb9337c..7bf76e5a0b 100644 +index 290cb9337..7bf76e5a0 100644 --- a/src/main/java/net/minecraft/server/EntityHorseSkeleton.java +++ b/src/main/java/net/minecraft/server/EntityHorseSkeleton.java @@ -12,6 +12,18 @@ public class EntityHorseSkeleton extends EntityHorseAbstract { @@ -2092,7 +2092,7 @@ index 290cb9337c..7bf76e5a0b 100644 @Override diff --git a/src/main/java/net/minecraft/server/EntityHorseZombie.java b/src/main/java/net/minecraft/server/EntityHorseZombie.java -index 5782a25ecd..c87fc523f1 100644 +index 5782a25ec..c87fc523f 100644 --- a/src/main/java/net/minecraft/server/EntityHorseZombie.java +++ b/src/main/java/net/minecraft/server/EntityHorseZombie.java @@ -8,6 +8,18 @@ public class EntityHorseZombie extends EntityHorseAbstract { @@ -2122,7 +2122,7 @@ index 5782a25ecd..c87fc523f1 100644 + protected void ez() { if (world.purpurConfig.zombieHorseCanSwim) goalSelector.a(0, new PathfinderGoalFloat(this)); } // Purpur } diff --git a/src/main/java/net/minecraft/server/EntityHuman.java b/src/main/java/net/minecraft/server/EntityHuman.java -index 584166f225..de22cad764 100644 +index 584166f22..de22cad76 100644 --- a/src/main/java/net/minecraft/server/EntityHuman.java +++ b/src/main/java/net/minecraft/server/EntityHuman.java @@ -374,9 +374,21 @@ public abstract class EntityHuman extends EntityLiving { @@ -2149,7 +2149,7 @@ index 584166f225..de22cad764 100644 this.setSneaking(false); } else { diff --git a/src/main/java/net/minecraft/server/EntityIllagerIllusioner.java b/src/main/java/net/minecraft/server/EntityIllagerIllusioner.java -index 81b7cd06f2..3e6722cfce 100644 +index 81b7cd06f..3e6722cfc 100644 --- a/src/main/java/net/minecraft/server/EntityIllagerIllusioner.java +++ b/src/main/java/net/minecraft/server/EntityIllagerIllusioner.java @@ -19,10 +19,28 @@ public class EntityIllagerIllusioner extends EntityIllagerWizard implements IRan @@ -2190,7 +2190,7 @@ index 81b7cd06f2..3e6722cfce 100644 this.targetSelector.a(2, (new PathfinderGoalNearestAttackableTarget<>(this, EntityHuman.class, true)).a(300)); this.targetSelector.a(3, (new PathfinderGoalNearestAttackableTarget<>(this, EntityVillagerAbstract.class, false)).a(300)); diff --git a/src/main/java/net/minecraft/server/EntityInsentient.java b/src/main/java/net/minecraft/server/EntityInsentient.java -index 1991cee43d..28218f048d 100644 +index 27ef47600..240bbee36 100644 --- a/src/main/java/net/minecraft/server/EntityInsentient.java +++ b/src/main/java/net/minecraft/server/EntityInsentient.java @@ -28,7 +28,7 @@ public abstract class EntityInsentient extends EntityLiving { @@ -2232,7 +2232,7 @@ index 1991cee43d..28218f048d 100644 super.o(f); this.r(f); } -@@ -1082,7 +1081,7 @@ public abstract class EntityInsentient extends EntityLiving { +@@ -1089,7 +1088,7 @@ public abstract class EntityInsentient extends EntityLiving { } protected boolean a(EntityHuman entityhuman, EnumHand enumhand) { @@ -2241,7 +2241,7 @@ index 1991cee43d..28218f048d 100644 } public boolean ec() { -@@ -1381,4 +1380,39 @@ public abstract class EntityInsentient extends EntityLiving { +@@ -1388,4 +1387,39 @@ public abstract class EntityInsentient extends EntityLiving { public boolean a(Item item) { return this.getItemInMainHand().getItem() == item || this.getItemInOffHand().getItem() == item; } @@ -2282,7 +2282,7 @@ index 1991cee43d..28218f048d 100644 + // Purpur end } diff --git a/src/main/java/net/minecraft/server/EntityIronGolem.java b/src/main/java/net/minecraft/server/EntityIronGolem.java -index 2f764776b2..46e4574e55 100644 +index 2f764776b..46e4574e5 100644 --- a/src/main/java/net/minecraft/server/EntityIronGolem.java +++ b/src/main/java/net/minecraft/server/EntityIronGolem.java @@ -17,8 +17,26 @@ public class EntityIronGolem extends EntityGolem { @@ -2337,7 +2337,7 @@ index 2f764776b2..46e4574e55 100644 float f1 = 1.0F + (this.random.nextFloat() - this.random.nextFloat()) * 0.2F; diff --git a/src/main/java/net/minecraft/server/EntityLiving.java b/src/main/java/net/minecraft/server/EntityLiving.java -index ad474500e2..17ff8a9fc3 100644 +index ad474500e..17ff8a9fc 100644 --- a/src/main/java/net/minecraft/server/EntityLiving.java +++ b/src/main/java/net/minecraft/server/EntityLiving.java @@ -92,9 +92,9 @@ public abstract class EntityLiving extends Entity { @@ -2401,7 +2401,7 @@ index ad474500e2..17ff8a9fc3 100644 } diff --git a/src/main/java/net/minecraft/server/EntityLlama.java b/src/main/java/net/minecraft/server/EntityLlama.java -index 193dbfc5f6..5b87b245f7 100644 +index 193dbfc5f..5b87b245f 100644 --- a/src/main/java/net/minecraft/server/EntityLlama.java +++ b/src/main/java/net/minecraft/server/EntityLlama.java @@ -16,7 +16,36 @@ public class EntityLlama extends EntityHorseChestedAbstract implements IRangedEn @@ -2495,7 +2495,7 @@ index 193dbfc5f6..5b87b245f7 100644 return i == -1 ? null : EnumColor.fromColorIndex(i); diff --git a/src/main/java/net/minecraft/server/EntityLlamaTrader.java b/src/main/java/net/minecraft/server/EntityLlamaTrader.java -index 4cebd67e85..283c1ac946 100644 +index 4cebd67e8..283c1ac94 100644 --- a/src/main/java/net/minecraft/server/EntityLlamaTrader.java +++ b/src/main/java/net/minecraft/server/EntityLlamaTrader.java @@ -11,6 +11,13 @@ public class EntityLlamaTrader extends EntityLlama { @@ -2526,7 +2526,7 @@ index 4cebd67e85..283c1ac946 100644 @Override public GroupDataEntity prepare(GeneratorAccess generatoraccess, DifficultyDamageScaler difficultydamagescaler, EnumMobSpawn enummobspawn, @Nullable GroupDataEntity groupdataentity, @Nullable NBTTagCompound nbttagcompound) { diff --git a/src/main/java/net/minecraft/server/EntityMagmaCube.java b/src/main/java/net/minecraft/server/EntityMagmaCube.java -index 1fdc248ba8..a5a36af217 100644 +index 1fdc248ba..a5a36af21 100644 --- a/src/main/java/net/minecraft/server/EntityMagmaCube.java +++ b/src/main/java/net/minecraft/server/EntityMagmaCube.java @@ -8,6 +8,23 @@ public class EntityMagmaCube extends EntitySlime { @@ -2554,7 +2554,7 @@ index 1fdc248ba8..a5a36af217 100644 protected void initAttributes() { super.initAttributes(); diff --git a/src/main/java/net/minecraft/server/EntityMushroomCow.java b/src/main/java/net/minecraft/server/EntityMushroomCow.java -index 3706c31aad..b20f4afd3f 100644 +index 3706c31aa..b20f4afd3 100644 --- a/src/main/java/net/minecraft/server/EntityMushroomCow.java +++ b/src/main/java/net/minecraft/server/EntityMushroomCow.java @@ -20,6 +20,23 @@ public class EntityMushroomCow extends EntityCow { @@ -2582,7 +2582,7 @@ index 3706c31aad..b20f4afd3f 100644 public float a(BlockPosition blockposition, IWorldReader iworldreader) { return iworldreader.getType(blockposition.down()).getBlock() == Blocks.MYCELIUM ? 10.0F : iworldreader.w(blockposition) - 0.5F; diff --git a/src/main/java/net/minecraft/server/EntityOcelot.java b/src/main/java/net/minecraft/server/EntityOcelot.java -index d9a7b8ac1e..8fdf348573 100644 +index d9a7b8ac1..8fdf34857 100644 --- a/src/main/java/net/minecraft/server/EntityOcelot.java +++ b/src/main/java/net/minecraft/server/EntityOcelot.java @@ -16,6 +16,23 @@ public class EntityOcelot extends EntityAnimal { @@ -2625,7 +2625,7 @@ index d9a7b8ac1e..8fdf348573 100644 this.targetSelector.a(1, new PathfinderGoalNearestAttackableTarget<>(this, EntityTurtle.class, 10, false, false, EntityTurtle.bw)); } diff --git a/src/main/java/net/minecraft/server/EntityPanda.java b/src/main/java/net/minecraft/server/EntityPanda.java -index f50ed19080..87ed9a8ca0 100644 +index f50ed1908..87ed9a8ca 100644 --- a/src/main/java/net/minecraft/server/EntityPanda.java +++ b/src/main/java/net/minecraft/server/EntityPanda.java @@ -46,6 +46,23 @@ public class EntityPanda extends EntityAnimal { @@ -2771,7 +2771,7 @@ index f50ed19080..87ed9a8ca0 100644 } } diff --git a/src/main/java/net/minecraft/server/EntityParrot.java b/src/main/java/net/minecraft/server/EntityParrot.java -index 94e57a2d85..7ba2f3a351 100644 +index 94e57a2d8..7ba2f3a35 100644 --- a/src/main/java/net/minecraft/server/EntityParrot.java +++ b/src/main/java/net/minecraft/server/EntityParrot.java @@ -62,12 +62,83 @@ public class EntityParrot extends EntityPerchable implements EntityBird { @@ -2872,7 +2872,7 @@ index 94e57a2d85..7ba2f3a351 100644 this.goalSelector.a(2, this.goalSit); this.goalSelector.a(2, new PathfinderGoalFollowOwner(this, 1.0D, 5.0F, 1.0F, true)); diff --git a/src/main/java/net/minecraft/server/EntityPhantom.java b/src/main/java/net/minecraft/server/EntityPhantom.java -index 90eeddb1af..c3a5e24617 100644 +index 90eeddb1a..c3a5e2461 100644 --- a/src/main/java/net/minecraft/server/EntityPhantom.java +++ b/src/main/java/net/minecraft/server/EntityPhantom.java @@ -22,6 +22,40 @@ public class EntityPhantom extends EntityFlying implements IMonster { @@ -3028,7 +3028,7 @@ index 90eeddb1af..c3a5e24617 100644 EntityPhantom.this.yaw += 180.0F; this.j = 0.1F; diff --git a/src/main/java/net/minecraft/server/EntityPig.java b/src/main/java/net/minecraft/server/EntityPig.java -index 8d277566e9..e6a7f8ef37 100644 +index 8d277566e..e6a7f8ef3 100644 --- a/src/main/java/net/minecraft/server/EntityPig.java +++ b/src/main/java/net/minecraft/server/EntityPig.java @@ -19,9 +19,27 @@ public class EntityPig extends EntityAnimal { @@ -3099,7 +3099,7 @@ index 8d277566e9..e6a7f8ef37 100644 @Override diff --git a/src/main/java/net/minecraft/server/EntityPigZombie.java b/src/main/java/net/minecraft/server/EntityPigZombie.java -index 9dd028b558..fb9ef88ea3 100644 +index 9dd028b55..fb9ef88ea 100644 --- a/src/main/java/net/minecraft/server/EntityPigZombie.java +++ b/src/main/java/net/minecraft/server/EntityPigZombie.java @@ -17,6 +17,23 @@ public class EntityPigZombie extends EntityZombie { @@ -3127,7 +3127,7 @@ index 9dd028b558..fb9ef88ea3 100644 public void setLastDamager(@Nullable EntityLiving entityliving) { super.setLastDamager(entityliving); diff --git a/src/main/java/net/minecraft/server/EntityPillager.java b/src/main/java/net/minecraft/server/EntityPillager.java -index 0357c9da93..98a657cece 100644 +index 0357c9da9..98a657cec 100644 --- a/src/main/java/net/minecraft/server/EntityPillager.java +++ b/src/main/java/net/minecraft/server/EntityPillager.java @@ -13,15 +13,34 @@ public class EntityPillager extends EntityIllagerAbstract implements ICrossbow, @@ -3166,7 +3166,7 @@ index 0357c9da93..98a657cece 100644 this.targetSelector.a(2, new PathfinderGoalNearestAttackableTarget<>(this, EntityHuman.class, true)); this.targetSelector.a(3, new PathfinderGoalNearestAttackableTarget<>(this, EntityVillagerAbstract.class, false)); diff --git a/src/main/java/net/minecraft/server/EntityPolarBear.java b/src/main/java/net/minecraft/server/EntityPolarBear.java -index f8e29a02d3..0a3906bde0 100644 +index f8e29a02d..0a3906bde 100644 --- a/src/main/java/net/minecraft/server/EntityPolarBear.java +++ b/src/main/java/net/minecraft/server/EntityPolarBear.java @@ -17,6 +17,23 @@ public class EntityPolarBear extends EntityAnimal { @@ -3258,7 +3258,7 @@ index f8e29a02d3..0a3906bde0 100644 public d() { diff --git a/src/main/java/net/minecraft/server/EntityPufferFish.java b/src/main/java/net/minecraft/server/EntityPufferFish.java -index 98af9a2235..d0e3e251e1 100644 +index 98af9a223..d0e3e251e 100644 --- a/src/main/java/net/minecraft/server/EntityPufferFish.java +++ b/src/main/java/net/minecraft/server/EntityPufferFish.java @@ -17,6 +17,23 @@ public class EntityPufferFish extends EntityFish { @@ -3295,7 +3295,7 @@ index 98af9a2235..d0e3e251e1 100644 @Override diff --git a/src/main/java/net/minecraft/server/EntityRabbit.java b/src/main/java/net/minecraft/server/EntityRabbit.java -index 2ed2d0b6bb..9040ab1c54 100644 +index 2ed2d0b6b..9040ab1c5 100644 --- a/src/main/java/net/minecraft/server/EntityRabbit.java +++ b/src/main/java/net/minecraft/server/EntityRabbit.java @@ -26,9 +26,27 @@ public class EntityRabbit extends EntityAnimal { @@ -3450,7 +3450,7 @@ index 2ed2d0b6bb..9040ab1c54 100644 this.d = flag; } diff --git a/src/main/java/net/minecraft/server/EntityRavager.java b/src/main/java/net/minecraft/server/EntityRavager.java -index fd25ce1026..98d182a4ce 100644 +index fd25ce102..98d182a4c 100644 --- a/src/main/java/net/minecraft/server/EntityRavager.java +++ b/src/main/java/net/minecraft/server/EntityRavager.java @@ -20,14 +20,33 @@ public class EntityRavager extends EntityRaider { @@ -3488,7 +3488,7 @@ index fd25ce1026..98d182a4ce 100644 this.targetSelector.a(3, new PathfinderGoalNearestAttackableTarget<>(this, EntityHuman.class, true)); this.targetSelector.a(4, new PathfinderGoalNearestAttackableTarget<>(this, EntityVillagerAbstract.class, true)); diff --git a/src/main/java/net/minecraft/server/EntitySalmon.java b/src/main/java/net/minecraft/server/EntitySalmon.java -index 6be29f3078..189515b0ff 100644 +index 6be29f307..189515b0f 100644 --- a/src/main/java/net/minecraft/server/EntitySalmon.java +++ b/src/main/java/net/minecraft/server/EntitySalmon.java @@ -6,6 +6,23 @@ public class EntitySalmon extends EntityFishSchool { @@ -3516,7 +3516,7 @@ index 6be29f3078..189515b0ff 100644 public int es() { return 5; diff --git a/src/main/java/net/minecraft/server/EntitySheep.java b/src/main/java/net/minecraft/server/EntitySheep.java -index d5ffdc110d..d4f2642d3d 100644 +index d5ffdc110..d4f2642d3 100644 --- a/src/main/java/net/minecraft/server/EntitySheep.java +++ b/src/main/java/net/minecraft/server/EntitySheep.java @@ -55,10 +55,28 @@ public class EntitySheep extends EntityAnimal { @@ -3549,7 +3549,7 @@ index d5ffdc110d..d4f2642d3d 100644 this.goalSelector.a(2, new PathfinderGoalBreed(this, 1.0D)); this.goalSelector.a(3, new PathfinderGoalTempt(this, 1.1D, RecipeItemStack.a(Items.WHEAT), false)); diff --git a/src/main/java/net/minecraft/server/EntityShulker.java b/src/main/java/net/minecraft/server/EntityShulker.java -index 0d2ceff6f2..46379588c1 100644 +index 0d2ceff6f..46379588c 100644 --- a/src/main/java/net/minecraft/server/EntityShulker.java +++ b/src/main/java/net/minecraft/server/EntityShulker.java @@ -32,6 +32,23 @@ public class EntityShulker extends EntityGolem implements IMonster { @@ -3599,7 +3599,7 @@ index 0d2ceff6f2..46379588c1 100644 @Override public boolean a() { diff --git a/src/main/java/net/minecraft/server/EntitySilverfish.java b/src/main/java/net/minecraft/server/EntitySilverfish.java -index 08c2a22f7a..dff20567b3 100644 +index 08c2a22f7..dff20567b 100644 --- a/src/main/java/net/minecraft/server/EntitySilverfish.java +++ b/src/main/java/net/minecraft/server/EntitySilverfish.java @@ -11,13 +11,32 @@ public class EntitySilverfish extends EntityMonster { @@ -3644,7 +3644,7 @@ index 08c2a22f7a..dff20567b3 100644 public void g() { diff --git a/src/main/java/net/minecraft/server/EntitySkeleton.java b/src/main/java/net/minecraft/server/EntitySkeleton.java -index 0e78d5c62c..8e6efeb7b7 100644 +index 0e78d5c62..8e6efeb7b 100644 --- a/src/main/java/net/minecraft/server/EntitySkeleton.java +++ b/src/main/java/net/minecraft/server/EntitySkeleton.java @@ -6,6 +6,23 @@ public class EntitySkeleton extends EntitySkeletonAbstract { @@ -3672,7 +3672,7 @@ index 0e78d5c62c..8e6efeb7b7 100644 protected SoundEffect getSoundAmbient() { return SoundEffects.ENTITY_SKELETON_AMBIENT; diff --git a/src/main/java/net/minecraft/server/EntitySkeletonAbstract.java b/src/main/java/net/minecraft/server/EntitySkeletonAbstract.java -index 3c95c0428b..8bc4e85156 100644 +index 3c95c0428..8bc4e8515 100644 --- a/src/main/java/net/minecraft/server/EntitySkeletonAbstract.java +++ b/src/main/java/net/minecraft/server/EntitySkeletonAbstract.java @@ -28,12 +28,14 @@ public abstract class EntitySkeletonAbstract extends EntityMonster implements IR @@ -3691,7 +3691,7 @@ index 3c95c0428b..8bc4e85156 100644 this.targetSelector.a(2, new PathfinderGoalNearestAttackableTarget<>(this, EntityHuman.class, true)); this.targetSelector.a(3, new PathfinderGoalNearestAttackableTarget<>(this, EntityIronGolem.class, true)); diff --git a/src/main/java/net/minecraft/server/EntitySkeletonStray.java b/src/main/java/net/minecraft/server/EntitySkeletonStray.java -index 2eb53864f2..a930fb8401 100644 +index 2eb53864f..a930fb840 100644 --- a/src/main/java/net/minecraft/server/EntitySkeletonStray.java +++ b/src/main/java/net/minecraft/server/EntitySkeletonStray.java @@ -8,6 +8,23 @@ public class EntitySkeletonStray extends EntitySkeletonAbstract { @@ -3719,7 +3719,7 @@ index 2eb53864f2..a930fb8401 100644 return c(entitytypes, generatoraccess, enummobspawn, blockposition, random) && (enummobspawn == EnumMobSpawn.SPAWNER || generatoraccess.f(blockposition)); } diff --git a/src/main/java/net/minecraft/server/EntitySkeletonWither.java b/src/main/java/net/minecraft/server/EntitySkeletonWither.java -index 98e042424c..8aa0a6699f 100644 +index 98e042424..8aa0a6699 100644 --- a/src/main/java/net/minecraft/server/EntitySkeletonWither.java +++ b/src/main/java/net/minecraft/server/EntitySkeletonWither.java @@ -9,6 +9,23 @@ public class EntitySkeletonWither extends EntitySkeletonAbstract { @@ -3747,7 +3747,7 @@ index 98e042424c..8aa0a6699f 100644 protected SoundEffect getSoundAmbient() { return SoundEffects.ENTITY_WITHER_SKELETON_AMBIENT; diff --git a/src/main/java/net/minecraft/server/EntitySlime.java b/src/main/java/net/minecraft/server/EntitySlime.java -index 2efc18df94..c15f7d9b24 100644 +index 2efc18df9..c15f7d9b2 100644 --- a/src/main/java/net/minecraft/server/EntitySlime.java +++ b/src/main/java/net/minecraft/server/EntitySlime.java @@ -32,12 +32,31 @@ public class EntitySlime extends EntityInsentient implements IMonster { @@ -3783,7 +3783,7 @@ index 2efc18df94..c15f7d9b24 100644 return Math.abs(entityliving.locY() - this.locY()) <= 4.0D; })); diff --git a/src/main/java/net/minecraft/server/EntitySnowman.java b/src/main/java/net/minecraft/server/EntitySnowman.java -index 07ca1a4987..941873513f 100644 +index 07ca1a498..941873513 100644 --- a/src/main/java/net/minecraft/server/EntitySnowman.java +++ b/src/main/java/net/minecraft/server/EntitySnowman.java @@ -14,12 +14,31 @@ public class EntitySnowman extends EntityGolem implements IRangedEntity { @@ -3845,7 +3845,7 @@ index 07ca1a4987..941873513f 100644 } diff --git a/src/main/java/net/minecraft/server/EntitySpider.java b/src/main/java/net/minecraft/server/EntitySpider.java -index d02db56595..d3708a7b0e 100644 +index d02db5659..d3708a7b0 100644 --- a/src/main/java/net/minecraft/server/EntitySpider.java +++ b/src/main/java/net/minecraft/server/EntitySpider.java @@ -11,14 +11,33 @@ public class EntitySpider extends EntityMonster { @@ -3883,7 +3883,7 @@ index d02db56595..d3708a7b0e 100644 this.targetSelector.a(2, new EntitySpider.PathfinderGoalSpiderNearestAttackableTarget<>(this, EntityHuman.class)); this.targetSelector.a(3, new EntitySpider.PathfinderGoalSpiderNearestAttackableTarget<>(this, EntityIronGolem.class)); diff --git a/src/main/java/net/minecraft/server/EntitySquid.java b/src/main/java/net/minecraft/server/EntitySquid.java -index 92efe4e7f5..b967135ac3 100644 +index 92efe4e7f..b967135ac 100644 --- a/src/main/java/net/minecraft/server/EntitySquid.java +++ b/src/main/java/net/minecraft/server/EntitySquid.java @@ -25,10 +25,28 @@ public class EntitySquid extends EntityWaterAnimal { @@ -3992,7 +3992,7 @@ index 92efe4e7f5..b967135ac3 100644 } } diff --git a/src/main/java/net/minecraft/server/EntityTameableAnimal.java b/src/main/java/net/minecraft/server/EntityTameableAnimal.java -index 9b2eea71cc..d55c6cb339 100644 +index 9b2eea71c..d55c6cb33 100644 --- a/src/main/java/net/minecraft/server/EntityTameableAnimal.java +++ b/src/main/java/net/minecraft/server/EntityTameableAnimal.java @@ -135,6 +135,7 @@ public abstract class EntityTameableAnimal extends EntityAnimal { @@ -4004,7 +4004,7 @@ index 9b2eea71cc..d55c6cb339 100644 return entityliving == this.getOwner(); } diff --git a/src/main/java/net/minecraft/server/EntityTropicalFish.java b/src/main/java/net/minecraft/server/EntityTropicalFish.java -index ef8f373bea..992978463d 100644 +index ef8f373be..992978463 100644 --- a/src/main/java/net/minecraft/server/EntityTropicalFish.java +++ b/src/main/java/net/minecraft/server/EntityTropicalFish.java @@ -19,6 +19,23 @@ public class EntityTropicalFish extends EntityFishSchool { @@ -4032,7 +4032,7 @@ index ef8f373bea..992978463d 100644 protected void initDatawatcher() { super.initDatawatcher(); diff --git a/src/main/java/net/minecraft/server/EntityTurtle.java b/src/main/java/net/minecraft/server/EntityTurtle.java -index b24a5100b4..4695492068 100644 +index b24a5100b..469549206 100644 --- a/src/main/java/net/minecraft/server/EntityTurtle.java +++ b/src/main/java/net/minecraft/server/EntityTurtle.java @@ -27,6 +27,23 @@ public class EntityTurtle extends EntityAnimal { @@ -4180,7 +4180,7 @@ index b24a5100b4..4695492068 100644 if (this.h == ControllerMove.Operation.MOVE_TO && !this.i.getNavigation().m()) { double d0 = this.b - this.i.locX(); diff --git a/src/main/java/net/minecraft/server/EntityTypes.java b/src/main/java/net/minecraft/server/EntityTypes.java -index 4100e367a4..a0d932c403 100644 +index 4100e367a..a0d932c40 100644 --- a/src/main/java/net/minecraft/server/EntityTypes.java +++ b/src/main/java/net/minecraft/server/EntityTypes.java @@ -259,6 +259,12 @@ public class EntityTypes { @@ -4197,7 +4197,7 @@ index 4100e367a4..a0d932c403 100644 if (this.bg == null) { this.bg = SystemUtils.a("entity", IRegistry.ENTITY_TYPE.getKey(this)); diff --git a/src/main/java/net/minecraft/server/EntityVex.java b/src/main/java/net/minecraft/server/EntityVex.java -index cf274666c7..d890f7bdfa 100644 +index cf274666c..d890f7bdf 100644 --- a/src/main/java/net/minecraft/server/EntityVex.java +++ b/src/main/java/net/minecraft/server/EntityVex.java @@ -19,6 +19,50 @@ public class EntityVex extends EntityMonster { @@ -4307,7 +4307,7 @@ index cf274666c7..d890f7bdfa 100644 Vec3D vec3d = new Vec3D(this.b - EntityVex.this.locX(), this.c - EntityVex.this.locY(), this.d - EntityVex.this.locZ()); double d0 = vec3d.f(); diff --git a/src/main/java/net/minecraft/server/EntityVillager.java b/src/main/java/net/minecraft/server/EntityVillager.java -index 6e0020ae0b..3eaac031fb 100644 +index 6e0020ae0..3eaac031f 100644 --- a/src/main/java/net/minecraft/server/EntityVillager.java +++ b/src/main/java/net/minecraft/server/EntityVillager.java @@ -68,6 +68,28 @@ public class EntityVillager extends EntityVillagerAbstract implements Reputation @@ -4340,7 +4340,7 @@ index 6e0020ae0b..3eaac031fb 100644 public BehaviorController getBehaviorController() { return (BehaviorController) super.getBehaviorController(); // CraftBukkit - decompile error diff --git a/src/main/java/net/minecraft/server/EntityVillagerTrader.java b/src/main/java/net/minecraft/server/EntityVillagerTrader.java -index 2ad8dba5c0..4e9c5e84a9 100644 +index 2ad8dba5c..4e9c5e84a 100644 --- a/src/main/java/net/minecraft/server/EntityVillagerTrader.java +++ b/src/main/java/net/minecraft/server/EntityVillagerTrader.java @@ -20,6 +20,23 @@ public class EntityVillagerTrader extends EntityVillagerAbstract { @@ -4376,7 +4376,7 @@ index 2ad8dba5c0..4e9c5e84a9 100644 this.goalSelector.a(1, new PathfinderGoalAvoidTarget<>(this, EntityZombie.class, 8.0F, 0.5D, 0.5D)); this.goalSelector.a(1, new PathfinderGoalAvoidTarget<>(this, EntityEvoker.class, 12.0F, 0.5D, 0.5D)); diff --git a/src/main/java/net/minecraft/server/EntityVindicator.java b/src/main/java/net/minecraft/server/EntityVindicator.java -index c974c02e92..6ba920134a 100644 +index c974c02e9..6ba920134 100644 --- a/src/main/java/net/minecraft/server/EntityVindicator.java +++ b/src/main/java/net/minecraft/server/EntityVindicator.java @@ -17,14 +17,33 @@ public class EntityVindicator extends EntityIllagerAbstract { @@ -4414,7 +4414,7 @@ index c974c02e92..6ba920134a 100644 this.targetSelector.a(2, new PathfinderGoalNearestAttackableTarget<>(this, EntityHuman.class, true)); this.targetSelector.a(3, new PathfinderGoalNearestAttackableTarget<>(this, EntityVillagerAbstract.class, true)); diff --git a/src/main/java/net/minecraft/server/EntityWitch.java b/src/main/java/net/minecraft/server/EntityWitch.java -index 1432d3f6bf..447387bd78 100644 +index 1432d3f6b..447387bd7 100644 --- a/src/main/java/net/minecraft/server/EntityWitch.java +++ b/src/main/java/net/minecraft/server/EntityWitch.java @@ -24,6 +24,23 @@ public class EntityWitch extends EntityRaider implements IRangedEntity { @@ -4457,7 +4457,7 @@ index 1432d3f6bf..447387bd78 100644 this.targetSelector.a(2, this.bz); this.targetSelector.a(3, this.bA); diff --git a/src/main/java/net/minecraft/server/EntityWither.java b/src/main/java/net/minecraft/server/EntityWither.java -index 8977c3516b..293afeb23b 100644 +index bace6cf36..cb83130bf 100644 --- a/src/main/java/net/minecraft/server/EntityWither.java +++ b/src/main/java/net/minecraft/server/EntityWither.java @@ -18,7 +18,7 @@ public class EntityWither extends EntityMonster implements IRangedEntity { @@ -4586,7 +4586,7 @@ index 8977c3516b..293afeb23b 100644 @Override diff --git a/src/main/java/net/minecraft/server/EntityWolf.java b/src/main/java/net/minecraft/server/EntityWolf.java -index eec1e26b6e..47f0b2df6c 100644 +index eec1e26b6..47f0b2df6 100644 --- a/src/main/java/net/minecraft/server/EntityWolf.java +++ b/src/main/java/net/minecraft/server/EntityWolf.java @@ -30,10 +30,28 @@ public class EntityWolf extends EntityTameableAnimal { @@ -4760,7 +4760,7 @@ index eec1e26b6e..47f0b2df6c 100644 private final EntityWolf j; diff --git a/src/main/java/net/minecraft/server/EntityZombie.java b/src/main/java/net/minecraft/server/EntityZombie.java -index 8635d4f40c..e9e2be88e3 100644 +index 8635d4f40..e9e2be88e 100644 --- a/src/main/java/net/minecraft/server/EntityZombie.java +++ b/src/main/java/net/minecraft/server/EntityZombie.java @@ -44,11 +44,30 @@ public class EntityZombie extends EntityMonster { @@ -4795,7 +4795,7 @@ index 8635d4f40c..e9e2be88e3 100644 } diff --git a/src/main/java/net/minecraft/server/EntityZombieHusk.java b/src/main/java/net/minecraft/server/EntityZombieHusk.java -index da8446d05d..db252ba4e0 100644 +index da8446d05..db252ba4e 100644 --- a/src/main/java/net/minecraft/server/EntityZombieHusk.java +++ b/src/main/java/net/minecraft/server/EntityZombieHusk.java @@ -8,6 +8,23 @@ public class EntityZombieHusk extends EntityZombie { @@ -4823,7 +4823,7 @@ index da8446d05d..db252ba4e0 100644 return c(entitytypes, generatoraccess, enummobspawn, blockposition, random) && (enummobspawn == EnumMobSpawn.SPAWNER || generatoraccess.f(blockposition)); } diff --git a/src/main/java/net/minecraft/server/EntityZombieVillager.java b/src/main/java/net/minecraft/server/EntityZombieVillager.java -index 8082fa617a..ebbfcb75a4 100644 +index 8082fa617..ebbfcb75a 100644 --- a/src/main/java/net/minecraft/server/EntityZombieVillager.java +++ b/src/main/java/net/minecraft/server/EntityZombieVillager.java @@ -25,6 +25,23 @@ public class EntityZombieVillager extends EntityZombie implements VillagerDataHo @@ -4851,7 +4851,7 @@ index 8082fa617a..ebbfcb75a4 100644 protected void initDatawatcher() { super.initDatawatcher(); diff --git a/src/main/java/net/minecraft/server/FoodInfo.java b/src/main/java/net/minecraft/server/FoodInfo.java -index b35fe21a6d..5b0f35c730 100644 +index b35fe21a6..5b0f35c73 100644 --- a/src/main/java/net/minecraft/server/FoodInfo.java +++ b/src/main/java/net/minecraft/server/FoodInfo.java @@ -30,6 +30,7 @@ public class FoodInfo { @@ -4863,7 +4863,7 @@ index b35fe21a6d..5b0f35c730 100644 return this.c; } diff --git a/src/main/java/net/minecraft/server/ItemDye.java b/src/main/java/net/minecraft/server/ItemDye.java -index da49f6e5ae..7b5d602649 100644 +index da49f6e5a..7b5d60264 100644 --- a/src/main/java/net/minecraft/server/ItemDye.java +++ b/src/main/java/net/minecraft/server/ItemDye.java @@ -42,6 +42,7 @@ public class ItemDye extends Item { @@ -4875,19 +4875,19 @@ index da49f6e5ae..7b5d602649 100644 return this.b; } diff --git a/src/main/java/net/minecraft/server/PathfinderGoal.java b/src/main/java/net/minecraft/server/PathfinderGoal.java -index bdb90a3466..e059930ba7 100644 +index 738c51070..2fddbb3ef 100644 --- a/src/main/java/net/minecraft/server/PathfinderGoal.java +++ b/src/main/java/net/minecraft/server/PathfinderGoal.java -@@ -27,6 +27,7 @@ public abstract class PathfinderGoal { +@@ -28,6 +28,7 @@ public abstract class PathfinderGoal { public void e() {} + public void setTypes(EnumSet types) { this.a(types); } // Purpur - OBFHELPER public void a(EnumSet enumset) { - this.a.clear(); - this.a.addAll(enumset); + // Tuinity start - reduce garbage on heap + this.goalTypes.clear(); diff --git a/src/main/java/net/minecraft/server/PathfinderGoalSwell.java b/src/main/java/net/minecraft/server/PathfinderGoalSwell.java -index e07c7674a5..3c077b6870 100644 +index e07c7674a..3c077b687 100644 --- a/src/main/java/net/minecraft/server/PathfinderGoalSwell.java +++ b/src/main/java/net/minecraft/server/PathfinderGoalSwell.java @@ -4,8 +4,8 @@ import java.util.EnumSet; @@ -4910,7 +4910,7 @@ index e07c7674a5..3c077b6870 100644 this.a.a(-1); } else if (this.a.h((Entity) this.b) > 49.0D) { diff --git a/src/main/java/net/minecraft/server/Vec3D.java b/src/main/java/net/minecraft/server/Vec3D.java -index 0c7f094e54..212af252be 100644 +index 0c7f094e5..212af252b 100644 --- a/src/main/java/net/minecraft/server/Vec3D.java +++ b/src/main/java/net/minecraft/server/Vec3D.java @@ -89,6 +89,7 @@ public class Vec3D implements IPosition { @@ -4922,10 +4922,10 @@ index 0c7f094e54..212af252be 100644 return new Vec3D(this.x * d0, this.y * d1, this.z * d2); } diff --git a/src/main/java/net/minecraft/server/World.java b/src/main/java/net/minecraft/server/World.java -index 89090b12d2..7db28d954f 100644 +index ba1dab794..47a8e1ed7 100644 --- a/src/main/java/net/minecraft/server/World.java +++ b/src/main/java/net/minecraft/server/World.java -@@ -1583,4 +1583,10 @@ public abstract class World implements GeneratorAccess, AutoCloseable { +@@ -1597,4 +1597,10 @@ public abstract class World implements GeneratorAccess, AutoCloseable { @Override public BiomeManager d() { return this.biomeManager; } @@ -4937,7 +4937,7 @@ index 89090b12d2..7db28d954f 100644 + // Purpur end } diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -index eda37fa43f..ad96353afd 100644 +index eda37fa43..ad96353af 100644 --- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java +++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java @@ -64,4 +64,589 @@ public class PurpurWorldConfig { @@ -5532,7 +5532,7 @@ index eda37fa43f..ad96353afd 100644 } diff --git a/src/main/java/net/pl3x/purpur/controller/ControllerLookWASD.java b/src/main/java/net/pl3x/purpur/controller/ControllerLookWASD.java new file mode 100644 -index 0000000000..828e1b8730 +index 000000000..828e1b873 --- /dev/null +++ b/src/main/java/net/pl3x/purpur/controller/ControllerLookWASD.java @@ -0,0 +1,75 @@ @@ -5613,7 +5613,7 @@ index 0000000000..828e1b8730 +} diff --git a/src/main/java/net/pl3x/purpur/controller/ControllerMoveWASD.java b/src/main/java/net/pl3x/purpur/controller/ControllerMoveWASD.java new file mode 100644 -index 0000000000..0a5d6d46c2 +index 000000000..0a5d6d46c --- /dev/null +++ b/src/main/java/net/pl3x/purpur/controller/ControllerMoveWASD.java @@ -0,0 +1,86 @@ @@ -5705,7 +5705,7 @@ index 0000000000..0a5d6d46c2 +} diff --git a/src/main/java/net/pl3x/purpur/controller/ControllerMoveWASDFlying.java b/src/main/java/net/pl3x/purpur/controller/ControllerMoveWASDFlying.java new file mode 100644 -index 0000000000..3491250704 +index 000000000..349125070 --- /dev/null +++ b/src/main/java/net/pl3x/purpur/controller/ControllerMoveWASDFlying.java @@ -0,0 +1,53 @@ @@ -5764,7 +5764,7 @@ index 0000000000..3491250704 +} diff --git a/src/main/java/net/pl3x/purpur/controller/ControllerMoveWASDFlyingWithSpacebar.java b/src/main/java/net/pl3x/purpur/controller/ControllerMoveWASDFlyingWithSpacebar.java new file mode 100644 -index 0000000000..f753759361 +index 000000000..f75375936 --- /dev/null +++ b/src/main/java/net/pl3x/purpur/controller/ControllerMoveWASDFlyingWithSpacebar.java @@ -0,0 +1,61 @@ @@ -5831,7 +5831,7 @@ index 0000000000..f753759361 +} diff --git a/src/main/java/net/pl3x/purpur/controller/ControllerMoveWASDWater.java b/src/main/java/net/pl3x/purpur/controller/ControllerMoveWASDWater.java new file mode 100644 -index 0000000000..e75e580670 +index 000000000..e75e58067 --- /dev/null +++ b/src/main/java/net/pl3x/purpur/controller/ControllerMoveWASDWater.java @@ -0,0 +1,43 @@ @@ -5880,7 +5880,7 @@ index 0000000000..e75e580670 +} diff --git a/src/main/java/net/pl3x/purpur/pathfinder/PathfinderGoalHasRider.java b/src/main/java/net/pl3x/purpur/pathfinder/PathfinderGoalHasRider.java new file mode 100644 -index 0000000000..6e50344c07 +index 000000000..6e50344c0 --- /dev/null +++ b/src/main/java/net/pl3x/purpur/pathfinder/PathfinderGoalHasRider.java @@ -0,0 +1,21 @@ @@ -5906,10 +5906,10 @@ index 0000000000..6e50344c07 + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java -index dfa15372b8..350aa67549 100644 +index 949acb1d3..a85ad3c51 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java -@@ -1057,4 +1057,31 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity { +@@ -1069,4 +1069,31 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity { return getHandle().spawnReason; } // Paper end diff --git a/patches/server/0006-Logger-settings-suppressing-pointless-logs.patch b/patches/server/0007-Logger-settings-suppressing-pointless-logs.patch similarity index 95% rename from patches/server/0006-Logger-settings-suppressing-pointless-logs.patch rename to patches/server/0007-Logger-settings-suppressing-pointless-logs.patch index 4afde1347..1e20b72a8 100644 --- a/patches/server/0006-Logger-settings-suppressing-pointless-logs.patch +++ b/patches/server/0007-Logger-settings-suppressing-pointless-logs.patch @@ -1,4 +1,4 @@ -From 66c0fc05bde3188495b1ace6d9a2199a0e826a78 Mon Sep 17 00:00:00 2001 +From ed5d2229897c2b4516f626848f7fcc51512a2d01 Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Sat, 19 Oct 2019 00:52:12 -0500 Subject: [PATCH] Logger settings (suppressing pointless logs) @@ -11,7 +11,7 @@ Subject: [PATCH] Logger settings (suppressing pointless logs) 4 files changed, 12 insertions(+) diff --git a/src/main/java/net/minecraft/server/GenericAttributes.java b/src/main/java/net/minecraft/server/GenericAttributes.java -index 469e293c25..ca58302cf7 100644 +index 469e293c2..ca58302cf 100644 --- a/src/main/java/net/minecraft/server/GenericAttributes.java +++ b/src/main/java/net/minecraft/server/GenericAttributes.java @@ -79,6 +79,7 @@ public class GenericAttributes { @@ -23,7 +23,7 @@ index 469e293c25..ca58302cf7 100644 } else { a(attributeinstance, nbttagcompound); diff --git a/src/main/java/net/minecraft/server/WorldGenFeatureConfigured.java b/src/main/java/net/minecraft/server/WorldGenFeatureConfigured.java -index 73402f2b5a..1c2320cc54 100644 +index 73402f2b5..1c2320cc5 100644 --- a/src/main/java/net/minecraft/server/WorldGenFeatureConfigured.java +++ b/src/main/java/net/minecraft/server/WorldGenFeatureConfigured.java @@ -47,6 +47,7 @@ public class WorldGenFeatureConfigured(WorldGenerator.NO_OP, WorldGenFeatureEmptyConfiguration.e); } diff --git a/src/main/java/net/pl3x/purpur/PurpurConfig.java b/src/main/java/net/pl3x/purpur/PurpurConfig.java -index f234832e6f..345404c3a1 100644 +index f234832e6..345404c3a 100644 --- a/src/main/java/net/pl3x/purpur/PurpurConfig.java +++ b/src/main/java/net/pl3x/purpur/PurpurConfig.java @@ -133,6 +133,15 @@ public class PurpurConfig { @@ -55,7 +55,7 @@ index f234832e6f..345404c3a1 100644 getString("settings.timings.url", "https://timings.pl3x.net"); } diff --git a/src/main/java/org/bukkit/craftbukkit/legacy/CraftLegacy.java b/src/main/java/org/bukkit/craftbukkit/legacy/CraftLegacy.java -index 049e9f98de..1d179cd5bc 100644 +index 049e9f98d..1d179cd5b 100644 --- a/src/main/java/org/bukkit/craftbukkit/legacy/CraftLegacy.java +++ b/src/main/java/org/bukkit/craftbukkit/legacy/CraftLegacy.java @@ -254,6 +254,7 @@ public final class CraftLegacy { diff --git a/patches/server/0007-Disable-outdated-build-check.patch b/patches/server/0008-Disable-outdated-build-check.patch similarity index 88% rename from patches/server/0007-Disable-outdated-build-check.patch rename to patches/server/0008-Disable-outdated-build-check.patch index f767d31a3..35d629f8c 100644 --- a/patches/server/0007-Disable-outdated-build-check.patch +++ b/patches/server/0008-Disable-outdated-build-check.patch @@ -1,4 +1,4 @@ -From 848c48d41b15400434c52100ba4131958c492fd8 Mon Sep 17 00:00:00 2001 +From a1854a2210b80a98f0d1102c468cae4b067077bc Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Sun, 15 Dec 2019 12:53:59 -0600 Subject: [PATCH] Disable outdated build check @@ -8,10 +8,10 @@ Subject: [PATCH] Disable outdated build check 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/bukkit/craftbukkit/Main.java b/src/main/java/org/bukkit/craftbukkit/Main.java -index b5bc4e2097..97b2482b1c 100644 +index 7fc56f67f..d1af8e9a9 100644 --- a/src/main/java/org/bukkit/craftbukkit/Main.java +++ b/src/main/java/org/bukkit/craftbukkit/Main.java -@@ -220,7 +220,7 @@ public class Main { +@@ -227,7 +227,7 @@ public class Main { System.setProperty(TerminalConsoleAppender.JLINE_OVERRIDE_PROPERTY, "false"); // Paper } diff --git a/patches/server/0008-Add-obfhelpers-for-plugin-use.patch b/patches/server/0009-Add-obfhelpers-for-plugin-use.patch similarity index 93% rename from patches/server/0008-Add-obfhelpers-for-plugin-use.patch rename to patches/server/0009-Add-obfhelpers-for-plugin-use.patch index aed9f187b..a7638e3e0 100644 --- a/patches/server/0008-Add-obfhelpers-for-plugin-use.patch +++ b/patches/server/0009-Add-obfhelpers-for-plugin-use.patch @@ -1,4 +1,4 @@ -From 139a881b8386dec67899350ed0292331af74cff1 Mon Sep 17 00:00:00 2001 +From 8177a50b1227b0115e62de1caa68cbcd7d8ff643 Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Wed, 1 Jan 2020 20:12:39 -0600 Subject: [PATCH] Add obfhelpers for plugin use @@ -10,7 +10,7 @@ Subject: [PATCH] Add obfhelpers for plugin use 3 files changed, 4 insertions(+) diff --git a/src/main/java/net/minecraft/server/IChatBaseComponent.java b/src/main/java/net/minecraft/server/IChatBaseComponent.java -index fb97c51bb1..50ed4001d1 100644 +index fb97c51bb..50ed4001d 100644 --- a/src/main/java/net/minecraft/server/IChatBaseComponent.java +++ b/src/main/java/net/minecraft/server/IChatBaseComponent.java @@ -145,6 +145,7 @@ public interface IChatBaseComponent extends Message, Iterable Date: Thu, 9 May 2019 14:27:37 -0500 Subject: [PATCH] Silk touch spawners @@ -10,7 +10,7 @@ Subject: [PATCH] Silk touch spawners 3 files changed, 47 insertions(+) diff --git a/src/main/java/net/minecraft/server/Block.java b/src/main/java/net/minecraft/server/Block.java -index e40375b67a..b29ed1cfa7 100644 +index e40375b67..b29ed1cfa 100644 --- a/src/main/java/net/minecraft/server/Block.java +++ b/src/main/java/net/minecraft/server/Block.java @@ -494,6 +494,7 @@ public class Block implements IMaterial { @@ -22,7 +22,7 @@ index e40375b67a..b29ed1cfa7 100644 if (!world.isClientSide && !itemstack.isEmpty() && world.getGameRules().getBoolean(GameRules.DO_TILE_DROPS)) { float f = 0.5F; diff --git a/src/main/java/net/minecraft/server/BlockMobSpawner.java b/src/main/java/net/minecraft/server/BlockMobSpawner.java -index 5296fdf168..69d04f6cbf 100644 +index 5296fdf16..69d04f6cb 100644 --- a/src/main/java/net/minecraft/server/BlockMobSpawner.java +++ b/src/main/java/net/minecraft/server/BlockMobSpawner.java @@ -11,6 +11,40 @@ public class BlockMobSpawner extends BlockTileEntity { @@ -67,7 +67,7 @@ index 5296fdf168..69d04f6cbf 100644 public void dropNaturally(IBlockData iblockdata, World world, BlockPosition blockposition, ItemStack itemstack) { super.dropNaturally(iblockdata, world, blockposition, itemstack); diff --git a/src/main/java/net/minecraft/server/EntityTypes.java b/src/main/java/net/minecraft/server/EntityTypes.java -index a0d932c403..0dd9897b99 100644 +index a0d932c40..0dd9897b9 100644 --- a/src/main/java/net/minecraft/server/EntityTypes.java +++ b/src/main/java/net/minecraft/server/EntityTypes.java @@ -136,10 +136,17 @@ public class EntityTypes { diff --git a/patches/server/0010-Give-giants-AI.patch b/patches/server/0011-Give-giants-AI.patch similarity index 95% rename from patches/server/0010-Give-giants-AI.patch rename to patches/server/0011-Give-giants-AI.patch index 368052ac5..623f9f915 100644 --- a/patches/server/0010-Give-giants-AI.patch +++ b/patches/server/0011-Give-giants-AI.patch @@ -1,4 +1,4 @@ -From 48932d2775e583fbe530c08caa92140790663005 Mon Sep 17 00:00:00 2001 +From dace65f4318c5f01cbec9bedb20ff439dd433269 Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Sun, 12 May 2019 00:43:12 -0500 Subject: [PATCH] Give giants AI @@ -10,7 +10,7 @@ Subject: [PATCH] Give giants AI 3 files changed, 55 insertions(+), 4 deletions(-) diff --git a/src/main/java/net/minecraft/server/EntityGiantZombie.java b/src/main/java/net/minecraft/server/EntityGiantZombie.java -index ff8a41a539..4296aaa074 100644 +index ff8a41a53..4296aaa07 100644 --- a/src/main/java/net/minecraft/server/EntityGiantZombie.java +++ b/src/main/java/net/minecraft/server/EntityGiantZombie.java @@ -23,6 +23,45 @@ public class EntityGiantZombie extends EntityMonster { @@ -78,10 +78,10 @@ index ff8a41a539..4296aaa074 100644 } } diff --git a/src/main/java/net/minecraft/server/EntityInsentient.java b/src/main/java/net/minecraft/server/EntityInsentient.java -index 28218f048d..00cbd99914 100644 +index 240bbee36..3ef4f8db4 100644 --- a/src/main/java/net/minecraft/server/EntityInsentient.java +++ b/src/main/java/net/minecraft/server/EntityInsentient.java -@@ -867,6 +867,7 @@ public abstract class EntityInsentient extends EntityLiving { +@@ -874,6 +874,7 @@ public abstract class EntityInsentient extends EntityLiving { return f; } @@ -89,7 +89,7 @@ index 28218f048d..00cbd99914 100644 protected void a(DifficultyDamageScaler difficultydamagescaler) { if (this.random.nextFloat() < 0.15F * difficultydamagescaler.d()) { int i = this.random.nextInt(2); -@@ -974,6 +975,7 @@ public abstract class EntityInsentient extends EntityLiving { +@@ -981,6 +982,7 @@ public abstract class EntityInsentient extends EntityLiving { } } @@ -98,7 +98,7 @@ index 28218f048d..00cbd99914 100644 float f = difficultydamagescaler.d(); diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -index ad96353afd..22a8f2da3f 100644 +index ad96353af..22a8f2da3 100644 --- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java +++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java @@ -249,12 +249,22 @@ public class PurpurWorldConfig { diff --git a/patches/server/0011-Illusioners-AI-settings.patch b/patches/server/0012-Illusioners-AI-settings.patch similarity index 95% rename from patches/server/0011-Illusioners-AI-settings.patch rename to patches/server/0012-Illusioners-AI-settings.patch index 85d35cb27..0f872df8d 100644 --- a/patches/server/0011-Illusioners-AI-settings.patch +++ b/patches/server/0012-Illusioners-AI-settings.patch @@ -1,4 +1,4 @@ -From 23698d7f8263ffaa041bb09ec3b4f05492b73ac8 Mon Sep 17 00:00:00 2001 +From 486038e64497bd1f139a23d2bdc0bc2145bdcb0e Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Fri, 5 Jul 2019 11:09:25 -0500 Subject: [PATCH] Illusioners AI settings @@ -9,7 +9,7 @@ Subject: [PATCH] Illusioners AI settings 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/main/java/net/minecraft/server/EntityIllagerIllusioner.java b/src/main/java/net/minecraft/server/EntityIllagerIllusioner.java -index 3e6722cfce..13545a8efe 100644 +index 3e6722cfc..13545a8ef 100644 --- a/src/main/java/net/minecraft/server/EntityIllagerIllusioner.java +++ b/src/main/java/net/minecraft/server/EntityIllagerIllusioner.java @@ -58,9 +58,9 @@ public class EntityIllagerIllusioner extends EntityIllagerWizard implements IRan @@ -26,7 +26,7 @@ index 3e6722cfce..13545a8efe 100644 @Override diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -index 22a8f2da3f..ce17384c1d 100644 +index 22a8f2da3..ce17384c1 100644 --- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java +++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java @@ -293,10 +293,16 @@ public class PurpurWorldConfig { diff --git a/patches/server/0012-Zombie-horse-naturally-spawn.patch b/patches/server/0013-Zombie-horse-naturally-spawn.patch similarity index 94% rename from patches/server/0012-Zombie-horse-naturally-spawn.patch rename to patches/server/0013-Zombie-horse-naturally-spawn.patch index d9c6b4f10..11daf403b 100644 --- a/patches/server/0012-Zombie-horse-naturally-spawn.patch +++ b/patches/server/0013-Zombie-horse-naturally-spawn.patch @@ -1,4 +1,4 @@ -From bab70b8e1d50854da7fceb4680e07f77abc33957 Mon Sep 17 00:00:00 2001 +From 94274740a40d6930ee04f196419209289e18992c Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Sun, 7 Jul 2019 19:52:16 -0500 Subject: [PATCH] Zombie horse naturally spawn @@ -9,10 +9,10 @@ Subject: [PATCH] Zombie horse naturally spawn 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/src/main/java/net/minecraft/server/WorldServer.java b/src/main/java/net/minecraft/server/WorldServer.java -index c74b85917a..874b8c1292 100644 +index 214b555e7..633d67b66 100644 --- a/src/main/java/net/minecraft/server/WorldServer.java +++ b/src/main/java/net/minecraft/server/WorldServer.java -@@ -554,12 +554,18 @@ public class WorldServer extends World { +@@ -922,12 +922,18 @@ public class WorldServer extends World { boolean flag1 = this.getGameRules().getBoolean(GameRules.DO_MOB_SPAWNING) && this.random.nextDouble() < (double) difficultydamagescaler.b() * paperConfig.skeleHorseSpawnChance; // Paper if (flag1) { @@ -38,7 +38,7 @@ index c74b85917a..874b8c1292 100644 this.strikeLightning(new EntityLightning(this, (double) blockposition.getX() + 0.5D, (double) blockposition.getY(), (double) blockposition.getZ() + 0.5D, flag1), org.bukkit.event.weather.LightningStrikeEvent.Cause.WEATHER); // CraftBukkit diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -index ce17384c1d..300622e50d 100644 +index ce17384c1..300622e50 100644 --- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java +++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java @@ -643,9 +643,11 @@ public class PurpurWorldConfig { diff --git a/patches/server/0013-Charged-creeper-naturally-spawn.patch b/patches/server/0014-Charged-creeper-naturally-spawn.patch similarity index 94% rename from patches/server/0013-Charged-creeper-naturally-spawn.patch rename to patches/server/0014-Charged-creeper-naturally-spawn.patch index 873e73ab7..6f114545c 100644 --- a/patches/server/0013-Charged-creeper-naturally-spawn.patch +++ b/patches/server/0014-Charged-creeper-naturally-spawn.patch @@ -1,4 +1,4 @@ -From 1601399a690a0b237de4a0b0b30053b20071ff24 Mon Sep 17 00:00:00 2001 +From 72722ee8720eb09f4d504a8f360350406c0f0314 Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Fri, 29 Nov 2019 22:37:44 -0600 Subject: [PATCH] Charged creeper naturally spawn @@ -9,7 +9,7 @@ Subject: [PATCH] Charged creeper naturally spawn 2 files changed, 13 insertions(+) diff --git a/src/main/java/net/minecraft/server/EntityCreeper.java b/src/main/java/net/minecraft/server/EntityCreeper.java -index 48fd8e716b..ce366f401f 100644 +index 48fd8e716..ce366f401 100644 --- a/src/main/java/net/minecraft/server/EntityCreeper.java +++ b/src/main/java/net/minecraft/server/EntityCreeper.java @@ -87,6 +87,17 @@ public class EntityCreeper extends EntityMonster { @@ -31,7 +31,7 @@ index 48fd8e716b..ce366f401f 100644 public void b(NBTTagCompound nbttagcompound) { super.b(nbttagcompound); diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -index bf43a2d0dd..30b36d06b4 100644 +index 300622e50..cc2bddd94 100644 --- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java +++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java @@ -148,10 +148,12 @@ public class PurpurWorldConfig { diff --git a/patches/server/0014-Rabbit-naturally-spawn-toast-and-killer.patch b/patches/server/0015-Rabbit-naturally-spawn-toast-and-killer.patch similarity index 95% rename from patches/server/0014-Rabbit-naturally-spawn-toast-and-killer.patch rename to patches/server/0015-Rabbit-naturally-spawn-toast-and-killer.patch index fbd8df4ad..325dc1a23 100644 --- a/patches/server/0014-Rabbit-naturally-spawn-toast-and-killer.patch +++ b/patches/server/0015-Rabbit-naturally-spawn-toast-and-killer.patch @@ -1,4 +1,4 @@ -From cd5f56e7f811705eda41cfa9418075fbef81f6b9 Mon Sep 17 00:00:00 2001 +From e87ff84c6adb7dab20e66a16de4ff8bea997c582 Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Sat, 31 Aug 2019 17:47:11 -0500 Subject: [PATCH] Rabbit naturally spawn toast and killer @@ -9,7 +9,7 @@ Subject: [PATCH] Rabbit naturally spawn toast and killer 2 files changed, 18 insertions(+) diff --git a/src/main/java/net/minecraft/server/EntityRabbit.java b/src/main/java/net/minecraft/server/EntityRabbit.java -index 9040ab1c54..0232226f06 100644 +index 9040ab1c5..0232226f0 100644 --- a/src/main/java/net/minecraft/server/EntityRabbit.java +++ b/src/main/java/net/minecraft/server/EntityRabbit.java @@ -364,6 +364,10 @@ public class EntityRabbit extends EntityAnimal { @@ -41,7 +41,7 @@ index 9040ab1c54..0232226f06 100644 int i = this.random.nextInt(100); diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -index cc2bddd94c..ce677915ca 100644 +index cc2bddd94..ce677915c 100644 --- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java +++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java @@ -426,10 +426,14 @@ public class PurpurWorldConfig { diff --git a/patches/server/0015-Cat-spawning-options.patch b/patches/server/0016-Cat-spawning-options.patch similarity index 96% rename from patches/server/0015-Cat-spawning-options.patch rename to patches/server/0016-Cat-spawning-options.patch index 2e00c2a00..35e886ab1 100644 --- a/patches/server/0015-Cat-spawning-options.patch +++ b/patches/server/0016-Cat-spawning-options.patch @@ -1,4 +1,4 @@ -From 6e41fe963253b6d045654567fcce31494f2f2c5b Mon Sep 17 00:00:00 2001 +From 44037b56639b1700d3743cab9f1d0e3e1f2b54b4 Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Thu, 26 Dec 2019 18:52:55 -0600 Subject: [PATCH] Cat spawning options @@ -9,7 +9,7 @@ Subject: [PATCH] Cat spawning options 2 files changed, 22 insertions(+), 7 deletions(-) diff --git a/src/main/java/net/minecraft/server/MobSpawnerCat.java b/src/main/java/net/minecraft/server/MobSpawnerCat.java -index 6024478dc0..4b55c07d41 100644 +index 6024478dc..4b55c07d4 100644 --- a/src/main/java/net/minecraft/server/MobSpawnerCat.java +++ b/src/main/java/net/minecraft/server/MobSpawnerCat.java @@ -15,7 +15,7 @@ public class MobSpawnerCat { @@ -57,7 +57,7 @@ index 6024478dc0..4b55c07d41 100644 return list.size() < 1 ? this.a(blockposition, world) : 0; } diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -index 9d7b25dd95..a1f0e659c2 100644 +index ce677915c..9b60d17bd 100644 --- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java +++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java @@ -101,10 +101,16 @@ public class PurpurWorldConfig { diff --git a/patches/server/0016-Fix-non-black-cat-types-spawning-in-swamp-huts.patch b/patches/server/0017-Fix-non-black-cat-types-spawning-in-swamp-huts.patch similarity index 92% rename from patches/server/0016-Fix-non-black-cat-types-spawning-in-swamp-huts.patch rename to patches/server/0017-Fix-non-black-cat-types-spawning-in-swamp-huts.patch index f34f2570c..3cbe9ff15 100644 --- a/patches/server/0016-Fix-non-black-cat-types-spawning-in-swamp-huts.patch +++ b/patches/server/0017-Fix-non-black-cat-types-spawning-in-swamp-huts.patch @@ -1,4 +1,4 @@ -From abcff4bf9521d3fbfbf2964ce7525e24867455d0 Mon Sep 17 00:00:00 2001 +From 7467fdc9633183e91a0df264025d83bb8904ad7a Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Thu, 2 Jan 2020 01:23:22 -0600 Subject: [PATCH] Fix non black cat types spawning in swamp huts @@ -8,7 +8,7 @@ Subject: [PATCH] Fix non black cat types spawning in swamp huts 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/net/minecraft/server/MobSpawnerCat.java b/src/main/java/net/minecraft/server/MobSpawnerCat.java -index 4b55c07d41..fa2222355f 100644 +index 4b55c07d4..fa2222355 100644 --- a/src/main/java/net/minecraft/server/MobSpawnerCat.java +++ b/src/main/java/net/minecraft/server/MobSpawnerCat.java @@ -84,8 +84,9 @@ public class MobSpawnerCat { diff --git a/patches/server/0017-Cows-eat-mushrooms.patch b/patches/server/0018-Cows-eat-mushrooms.patch similarity index 95% rename from patches/server/0017-Cows-eat-mushrooms.patch rename to patches/server/0018-Cows-eat-mushrooms.patch index c72b59e29..46be8acd4 100644 --- a/patches/server/0017-Cows-eat-mushrooms.patch +++ b/patches/server/0018-Cows-eat-mushrooms.patch @@ -1,4 +1,4 @@ -From dcbc6628adfb40507e4ab140b0884d24fc5929d7 Mon Sep 17 00:00:00 2001 +From 88b381b673aaea1833e1ee600fe714d168aff42d Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Sat, 4 May 2019 01:10:30 -0500 Subject: [PATCH] Cows eat mushrooms @@ -11,10 +11,10 @@ Subject: [PATCH] Cows eat mushrooms 4 files changed, 77 insertions(+), 2 deletions(-) diff --git a/src/main/java/net/minecraft/server/Entity.java b/src/main/java/net/minecraft/server/Entity.java -index 1d5cbbf97d..9e985e278d 100644 +index d87bfc98e..3d03e199c 100644 --- a/src/main/java/net/minecraft/server/Entity.java +++ b/src/main/java/net/minecraft/server/Entity.java -@@ -1037,6 +1037,7 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke +@@ -1089,6 +1089,7 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke return false; } @@ -22,7 +22,7 @@ index 1d5cbbf97d..9e985e278d 100644 public void a(SoundEffect soundeffect, float f, float f1) { if (!this.isSilent()) { this.world.playSound((EntityHuman) null, this.locX(), this.locY(), this.locZ(), soundeffect, this.getSoundCategory(), f, f1); -@@ -2573,6 +2574,7 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke +@@ -2626,6 +2627,7 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke this.invulnerable = flag; } @@ -31,7 +31,7 @@ index 1d5cbbf97d..9e985e278d 100644 this.setPositionRotation(entity.locX(), entity.locY(), entity.locZ(), entity.yaw, entity.pitch); } diff --git a/src/main/java/net/minecraft/server/EntityCow.java b/src/main/java/net/minecraft/server/EntityCow.java -index 723a9fa1ee..f56fd7c012 100644 +index 723a9fa1e..f56fd7c01 100644 --- a/src/main/java/net/minecraft/server/EntityCow.java +++ b/src/main/java/net/minecraft/server/EntityCow.java @@ -34,6 +34,7 @@ public class EntityCow extends EntityAnimal { @@ -124,7 +124,7 @@ index 723a9fa1ee..f56fd7c012 100644 public EntityCow createChild(EntityAgeable entityageable) { return (EntityCow) EntityTypes.COW.a(this.world); diff --git a/src/main/java/net/minecraft/server/EntityLiving.java b/src/main/java/net/minecraft/server/EntityLiving.java -index 17ff8a9fc3..6ca11091c9 100644 +index 17ff8a9fc..6ca11091c 100644 --- a/src/main/java/net/minecraft/server/EntityLiving.java +++ b/src/main/java/net/minecraft/server/EntityLiving.java @@ -2812,8 +2812,9 @@ public abstract class EntityLiving extends Entity { @@ -140,7 +140,7 @@ index 17ff8a9fc3..6ca11091c9 100644 } diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -index 9b60d17bdf..661dcce493 100644 +index 9b60d17bd..661dcce49 100644 --- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java +++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java @@ -145,10 +145,12 @@ public class PurpurWorldConfig { diff --git a/patches/server/0018-Fix-cow-rotation-when-shearing-mooshroom.patch b/patches/server/0019-Fix-cow-rotation-when-shearing-mooshroom.patch similarity index 93% rename from patches/server/0018-Fix-cow-rotation-when-shearing-mooshroom.patch rename to patches/server/0019-Fix-cow-rotation-when-shearing-mooshroom.patch index 1e4a5687a..df72b3e46 100644 --- a/patches/server/0018-Fix-cow-rotation-when-shearing-mooshroom.patch +++ b/patches/server/0019-Fix-cow-rotation-when-shearing-mooshroom.patch @@ -1,4 +1,4 @@ -From f1ca8988de7da56abd872768dc43c0bc1ebdd69c Mon Sep 17 00:00:00 2001 +From e9387426755d77b81b56818592f53b00c01e3a31 Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Fri, 3 May 2019 23:53:16 -0500 Subject: [PATCH] Fix cow rotation when shearing mooshroom @@ -8,7 +8,7 @@ Subject: [PATCH] Fix cow rotation when shearing mooshroom 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/main/java/net/minecraft/server/EntityMushroomCow.java b/src/main/java/net/minecraft/server/EntityMushroomCow.java -index b20f4afd3f..02d76a6c61 100644 +index b20f4afd3..02d76a6c6 100644 --- a/src/main/java/net/minecraft/server/EntityMushroomCow.java +++ b/src/main/java/net/minecraft/server/EntityMushroomCow.java @@ -118,7 +118,13 @@ public class EntityMushroomCow extends EntityCow { diff --git a/patches/server/0019-Pigs-give-saddle-back.patch b/patches/server/0020-Pigs-give-saddle-back.patch similarity index 93% rename from patches/server/0019-Pigs-give-saddle-back.patch rename to patches/server/0020-Pigs-give-saddle-back.patch index 1f03bf396..65c27b6c6 100644 --- a/patches/server/0019-Pigs-give-saddle-back.patch +++ b/patches/server/0020-Pigs-give-saddle-back.patch @@ -1,4 +1,4 @@ -From c5a46d69b1c6920226e6902b42d811ef21b7e00e Mon Sep 17 00:00:00 2001 +From d8620f5ada8be71628b2ef0398d06e5c220ef425 Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Sun, 12 May 2019 01:14:46 -0500 Subject: [PATCH] Pigs give saddle back @@ -9,7 +9,7 @@ Subject: [PATCH] Pigs give saddle back 2 files changed, 14 insertions(+) diff --git a/src/main/java/net/minecraft/server/EntityPig.java b/src/main/java/net/minecraft/server/EntityPig.java -index e6a7f8ef37..d78666dbb2 100644 +index e6a7f8ef3..d78666dbb 100644 --- a/src/main/java/net/minecraft/server/EntityPig.java +++ b/src/main/java/net/minecraft/server/EntityPig.java @@ -135,6 +135,18 @@ public class EntityPig extends EntityAnimal { @@ -32,7 +32,7 @@ index e6a7f8ef37..d78666dbb2 100644 return true; } diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -index 661dcce493..cc8e832b33 100644 +index 661dcce49..cc8e832b3 100644 --- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java +++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java @@ -399,9 +399,11 @@ public class PurpurWorldConfig { diff --git a/patches/server/0020-Phantoms-do-not-spawn-on-creative-players.patch b/patches/server/0021-Phantoms-do-not-spawn-on-creative-players.patch similarity index 94% rename from patches/server/0020-Phantoms-do-not-spawn-on-creative-players.patch rename to patches/server/0021-Phantoms-do-not-spawn-on-creative-players.patch index 066816467..21e39dc06 100644 --- a/patches/server/0020-Phantoms-do-not-spawn-on-creative-players.patch +++ b/patches/server/0021-Phantoms-do-not-spawn-on-creative-players.patch @@ -1,4 +1,4 @@ -From b60dd5ad200ff38a8d11ff37c44983d4d1712ec4 Mon Sep 17 00:00:00 2001 +From fc44f4c1004b78d3af6a818a523426bd38d64386 Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Sat, 18 May 2019 16:59:52 -0500 Subject: [PATCH] Phantoms do not spawn on creative players @@ -9,7 +9,7 @@ Subject: [PATCH] Phantoms do not spawn on creative players 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/net/minecraft/server/MobSpawnerPhantom.java b/src/main/java/net/minecraft/server/MobSpawnerPhantom.java -index f488c22ed6..748983da29 100644 +index f488c22ed..748983da2 100644 --- a/src/main/java/net/minecraft/server/MobSpawnerPhantom.java +++ b/src/main/java/net/minecraft/server/MobSpawnerPhantom.java @@ -31,7 +31,7 @@ public class MobSpawnerPhantom { @@ -22,7 +22,7 @@ index f488c22ed6..748983da29 100644 if (!worldserver.worldProvider.f() || blockposition.getY() >= worldserver.getSeaLevel() && worldserver.f(blockposition)) { diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -index cc8e832b33..392936c34d 100644 +index cc8e832b3..392936c34 100644 --- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java +++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java @@ -390,11 +390,13 @@ public class PurpurWorldConfig { diff --git a/patches/server/0021-Phantoms-only-attack-insomniacs.patch b/patches/server/0022-Phantoms-only-attack-insomniacs.patch similarity index 95% rename from patches/server/0021-Phantoms-only-attack-insomniacs.patch rename to patches/server/0022-Phantoms-only-attack-insomniacs.patch index fd8e1d605..5e0e29cdf 100644 --- a/patches/server/0021-Phantoms-only-attack-insomniacs.patch +++ b/patches/server/0022-Phantoms-only-attack-insomniacs.patch @@ -1,4 +1,4 @@ -From 87ed6c2409996ba8b536d52939672bcfb819c025 Mon Sep 17 00:00:00 2001 +From 1d5f101cc9db5a5e9a9d67499ec03bbe1f5fd783 Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Fri, 29 Nov 2019 20:33:41 -0600 Subject: [PATCH] Phantoms only attack insomniacs @@ -10,7 +10,7 @@ Subject: [PATCH] Phantoms only attack insomniacs 3 files changed, 4 insertions(+) diff --git a/src/main/java/net/minecraft/server/EntityPhantom.java b/src/main/java/net/minecraft/server/EntityPhantom.java -index c3a5e24617..6d2984c8d5 100644 +index c3a5e2461..6d2984c8d 100644 --- a/src/main/java/net/minecraft/server/EntityPhantom.java +++ b/src/main/java/net/minecraft/server/EntityPhantom.java @@ -272,6 +272,7 @@ public class EntityPhantom extends EntityFlying implements IMonster { @@ -22,7 +22,7 @@ index c3a5e24617..6d2984c8d5 100644 return true; } diff --git a/src/main/java/net/minecraft/server/IEntitySelector.java b/src/main/java/net/minecraft/server/IEntitySelector.java -index a2d1ef3602..e1fdee2794 100644 +index a2d1ef360..e1fdee279 100644 --- a/src/main/java/net/minecraft/server/IEntitySelector.java +++ b/src/main/java/net/minecraft/server/IEntitySelector.java @@ -23,6 +23,7 @@ public final class IEntitySelector { @@ -34,7 +34,7 @@ index a2d1ef3602..e1fdee2794 100644 public static Predicate a(double d0, double d1, double d2, double d3) { double d4 = d3 * d3; diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -index 392936c34d..5bb1b90b31 100644 +index 392936c34..5bb1b90b3 100644 --- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java +++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java @@ -391,12 +391,14 @@ public class PurpurWorldConfig { diff --git a/patches/server/0022-Phantoms-attracted-to-crystals-and-crystals-shoot-ph.patch b/patches/server/0023-Phantoms-attracted-to-crystals-and-crystals-shoot-ph.patch similarity index 97% rename from patches/server/0022-Phantoms-attracted-to-crystals-and-crystals-shoot-ph.patch rename to patches/server/0023-Phantoms-attracted-to-crystals-and-crystals-shoot-ph.patch index f03477d7b..cdceee08f 100644 --- a/patches/server/0022-Phantoms-attracted-to-crystals-and-crystals-shoot-ph.patch +++ b/patches/server/0023-Phantoms-attracted-to-crystals-and-crystals-shoot-ph.patch @@ -1,4 +1,4 @@ -From 7783da8e5a5043d63dcee189634cf6c6d7b67ad2 Mon Sep 17 00:00:00 2001 +From 170c795de8b12a2cbd865b3b82ac17c5e6757d2c Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Thu, 9 May 2019 18:26:06 -0500 Subject: [PATCH] Phantoms attracted to crystals and crystals shoot phantoms @@ -13,7 +13,7 @@ Subject: [PATCH] Phantoms attracted to crystals and crystals shoot phantoms 6 files changed, 228 insertions(+), 11 deletions(-) diff --git a/src/main/java/net/minecraft/server/DamageSource.java b/src/main/java/net/minecraft/server/DamageSource.java -index 816d301f1c..0971f25b56 100644 +index 816d301f1..0971f25b5 100644 --- a/src/main/java/net/minecraft/server/DamageSource.java +++ b/src/main/java/net/minecraft/server/DamageSource.java @@ -81,6 +81,7 @@ public class DamageSource { @@ -25,10 +25,10 @@ index 816d301f1c..0971f25b56 100644 return (new EntityDamageSourceIndirect("indirectMagic", entity, entity1)).setIgnoreArmor().setMagic(); } diff --git a/src/main/java/net/minecraft/server/Entity.java b/src/main/java/net/minecraft/server/Entity.java -index 9e985e278d..4400aa5066 100644 +index 3d03e199c..43d73385e 100644 --- a/src/main/java/net/minecraft/server/Entity.java +++ b/src/main/java/net/minecraft/server/Entity.java -@@ -1381,6 +1381,7 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke +@@ -1434,6 +1434,7 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke return d3 * d3 + d4 * d4 + d5 * d5; } @@ -36,7 +36,7 @@ index 9e985e278d..4400aa5066 100644 public double h(Entity entity) { return this.c(entity.getPositionVector()); } -@@ -1904,14 +1905,13 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke +@@ -1957,14 +1958,13 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke return this.a(new ItemStack(imaterial), (float) i); } @@ -55,7 +55,7 @@ index 9e985e278d..4400aa5066 100644 return null; } else if (this.world.isClientSide) { diff --git a/src/main/java/net/minecraft/server/EntityEnderCrystal.java b/src/main/java/net/minecraft/server/EntityEnderCrystal.java -index a57d0089d8..02952c3af8 100644 +index a57d0089d..02952c3af 100644 --- a/src/main/java/net/minecraft/server/EntityEnderCrystal.java +++ b/src/main/java/net/minecraft/server/EntityEnderCrystal.java @@ -13,6 +13,12 @@ public class EntityEnderCrystal extends Entity { @@ -123,7 +123,7 @@ index a57d0089d8..02952c3af8 100644 @Override protected void b(NBTTagCompound nbttagcompound) { diff --git a/src/main/java/net/minecraft/server/EntityPhantom.java b/src/main/java/net/minecraft/server/EntityPhantom.java -index 6d2984c8d5..3b9cd169bd 100644 +index 6d2984c8d..3b9cd169b 100644 --- a/src/main/java/net/minecraft/server/EntityPhantom.java +++ b/src/main/java/net/minecraft/server/EntityPhantom.java @@ -8,9 +8,10 @@ import javax.annotation.Nullable; @@ -352,7 +352,7 @@ index 6d2984c8d5..3b9cd169bd 100644 return entityliving != null ? EntityPhantom.this.a(EntityPhantom.this.getGoalTarget(), PathfinderTargetCondition.a) : false; diff --git a/src/main/java/net/minecraft/server/IEntityAccess.java b/src/main/java/net/minecraft/server/IEntityAccess.java -index 4157e50e4d..774ec96f0a 100644 +index c522a7c2a..9622615b5 100644 --- a/src/main/java/net/minecraft/server/IEntityAccess.java +++ b/src/main/java/net/minecraft/server/IEntityAccess.java @@ -34,6 +34,7 @@ public interface IEntityAccess { @@ -364,7 +364,7 @@ index 4157e50e4d..774ec96f0a 100644 return this.a(oclass, axisalignedbb, IEntitySelector.f); } diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -index 5bb1b90b31..076e747c5b 100644 +index 5bb1b90b3..076e747c5 100644 --- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java +++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java @@ -392,6 +392,9 @@ public class PurpurWorldConfig { diff --git a/patches/server/0023-Snowman-drop-and-put-back-pumpkin.patch b/patches/server/0024-Snowman-drop-and-put-back-pumpkin.patch similarity index 96% rename from patches/server/0023-Snowman-drop-and-put-back-pumpkin.patch rename to patches/server/0024-Snowman-drop-and-put-back-pumpkin.patch index a56b261c2..5e625f17c 100644 --- a/patches/server/0023-Snowman-drop-and-put-back-pumpkin.patch +++ b/patches/server/0024-Snowman-drop-and-put-back-pumpkin.patch @@ -1,4 +1,4 @@ -From 446282b053ebf574679f4b024aa6584e56c11366 Mon Sep 17 00:00:00 2001 +From b67ac6a5408ded34e7f49be34a3424a7f6db0331 Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Fri, 3 May 2019 23:58:44 -0500 Subject: [PATCH] Snowman drop and put back pumpkin @@ -9,7 +9,7 @@ Subject: [PATCH] Snowman drop and put back pumpkin 2 files changed, 21 insertions(+) diff --git a/src/main/java/net/minecraft/server/EntitySnowman.java b/src/main/java/net/minecraft/server/EntitySnowman.java -index 941873513f..efc2205f7c 100644 +index 941873513..efc2205f7 100644 --- a/src/main/java/net/minecraft/server/EntitySnowman.java +++ b/src/main/java/net/minecraft/server/EntitySnowman.java @@ -8,6 +8,7 @@ import org.bukkit.event.player.PlayerShearEntityEvent; @@ -47,7 +47,7 @@ index 941873513f..efc2205f7c 100644 return tryRide(entityhuman, enumhand); // Purpur } diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -index 076e747c5b..18a5127441 100644 +index 076e747c5..18a512744 100644 --- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java +++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java @@ -530,11 +530,15 @@ public class PurpurWorldConfig { diff --git a/patches/server/0024-Ender-dragon-always-drop-egg.patch b/patches/server/0025-Ender-dragon-always-drop-egg.patch similarity index 95% rename from patches/server/0024-Ender-dragon-always-drop-egg.patch rename to patches/server/0025-Ender-dragon-always-drop-egg.patch index 012417435..dc078acd8 100644 --- a/patches/server/0024-Ender-dragon-always-drop-egg.patch +++ b/patches/server/0025-Ender-dragon-always-drop-egg.patch @@ -1,4 +1,4 @@ -From 2bc7821475b7bc3712e0fbbf8c1990563f76ce76 Mon Sep 17 00:00:00 2001 +From 399f1b7da931b2870effe967a6e5af6a450a5461 Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Fri, 7 Feb 2020 04:42:57 -0600 Subject: [PATCH] Ender dragon always drop egg @@ -9,7 +9,7 @@ Subject: [PATCH] Ender dragon always drop egg 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/main/java/net/minecraft/server/EnderDragonBattle.java b/src/main/java/net/minecraft/server/EnderDragonBattle.java -index 218c04245b..48398aa9f0 100644 +index 218c04245..48398aa9f 100644 --- a/src/main/java/net/minecraft/server/EnderDragonBattle.java +++ b/src/main/java/net/minecraft/server/EnderDragonBattle.java @@ -21,7 +21,7 @@ public class EnderDragonBattle { @@ -39,7 +39,7 @@ index 218c04245b..48398aa9f0 100644 return this.l; } diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -index f0d14d34ed..d69baa858c 100644 +index 18a512744..77070e618 100644 --- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java +++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java @@ -200,11 +200,13 @@ public class PurpurWorldConfig { diff --git a/patches/server/0025-Ender-dragon-always-drop-full-exp.patch b/patches/server/0026-Ender-dragon-always-drop-full-exp.patch similarity index 94% rename from patches/server/0025-Ender-dragon-always-drop-full-exp.patch rename to patches/server/0026-Ender-dragon-always-drop-full-exp.patch index 7235fe823..038d57b2f 100644 --- a/patches/server/0025-Ender-dragon-always-drop-full-exp.patch +++ b/patches/server/0026-Ender-dragon-always-drop-full-exp.patch @@ -1,4 +1,4 @@ -From e28713985f2973e247ecd50ed0b4579cd377be50 Mon Sep 17 00:00:00 2001 +From 06178ee91b82fc4d0c96ce70a40fbddb9f644608 Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Sat, 24 Aug 2019 14:42:54 -0500 Subject: [PATCH] Ender dragon always drop full exp @@ -9,7 +9,7 @@ Subject: [PATCH] Ender dragon always drop full exp 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/net/minecraft/server/EntityEnderDragon.java b/src/main/java/net/minecraft/server/EntityEnderDragon.java -index e08b731d2c..baab056eff 100644 +index 1b523b0da..fcfa4715c 100644 --- a/src/main/java/net/minecraft/server/EntityEnderDragon.java +++ b/src/main/java/net/minecraft/server/EntityEnderDragon.java @@ -641,7 +641,7 @@ public class EntityEnderDragon extends EntityInsentient implements IMonster { @@ -22,7 +22,7 @@ index e08b731d2c..baab056eff 100644 } diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -index 77070e618a..cd4b4ee293 100644 +index 77070e618..cd4b4ee29 100644 --- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java +++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java @@ -201,12 +201,14 @@ public class PurpurWorldConfig { diff --git a/patches/server/0026-Signs-editable-on-right-click.patch b/patches/server/0027-Signs-editable-on-right-click.patch similarity index 94% rename from patches/server/0026-Signs-editable-on-right-click.patch rename to patches/server/0027-Signs-editable-on-right-click.patch index f0d77f576..dc11b61a3 100644 --- a/patches/server/0026-Signs-editable-on-right-click.patch +++ b/patches/server/0027-Signs-editable-on-right-click.patch @@ -1,4 +1,4 @@ -From 5845b735be637122e2230d0bfb4c74face2313e9 Mon Sep 17 00:00:00 2001 +From b430451cc77cb298176ce6b63bbb1c952b6af4e7 Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Fri, 24 May 2019 02:39:25 -0500 Subject: [PATCH] Signs editable on right click @@ -10,7 +10,7 @@ Subject: [PATCH] Signs editable on right click 3 files changed, 17 insertions(+) diff --git a/src/main/java/net/minecraft/server/BlockSign.java b/src/main/java/net/minecraft/server/BlockSign.java -index 8a31054a1d..d20849ce2b 100644 +index 8a31054a1..d20849ce2 100644 --- a/src/main/java/net/minecraft/server/BlockSign.java +++ b/src/main/java/net/minecraft/server/BlockSign.java @@ -56,6 +56,17 @@ public abstract class BlockSign extends BlockTileEntity implements IBlockWaterlo @@ -32,7 +32,7 @@ index 8a31054a1d..d20849ce2b 100644 } else { return EnumInteractionResult.PASS; diff --git a/src/main/java/net/minecraft/server/TileEntitySign.java b/src/main/java/net/minecraft/server/TileEntitySign.java -index 0e9a90b70f..099d98e04c 100644 +index 0e9a90b70..099d98e04 100644 --- a/src/main/java/net/minecraft/server/TileEntitySign.java +++ b/src/main/java/net/minecraft/server/TileEntitySign.java @@ -109,6 +109,7 @@ public class TileEntitySign extends TileEntity implements ICommandListener { // @@ -44,7 +44,7 @@ index 0e9a90b70f..099d98e04c 100644 // Paper start //this.c = entityhuman; diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -index 5ed5276348..79398d8326 100644 +index cd4b4ee29..4609c3c8b 100644 --- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java +++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java @@ -65,6 +65,11 @@ public class PurpurWorldConfig { diff --git a/patches/server/0027-Fix-outdated-server-showing-in-ping-before-server-fu.patch b/patches/server/0028-Fix-outdated-server-showing-in-ping-before-server-fu.patch similarity index 91% rename from patches/server/0027-Fix-outdated-server-showing-in-ping-before-server-fu.patch rename to patches/server/0028-Fix-outdated-server-showing-in-ping-before-server-fu.patch index cbf1e44c5..87dc6a706 100644 --- a/patches/server/0027-Fix-outdated-server-showing-in-ping-before-server-fu.patch +++ b/patches/server/0028-Fix-outdated-server-showing-in-ping-before-server-fu.patch @@ -1,4 +1,4 @@ -From 4030a6afc57c458c5e3a9e39113be15932c0095c Mon Sep 17 00:00:00 2001 +From c5acbc2e14ec1b99970f9787658a08c88bb11aaf Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Tue, 4 Jun 2019 15:50:08 -0500 Subject: [PATCH] Fix 'outdated server' showing in ping before server fully @@ -9,7 +9,7 @@ Subject: [PATCH] Fix 'outdated server' showing in ping before server fully 1 file changed, 1 insertion(+) diff --git a/src/main/java/net/minecraft/server/PacketStatusListener.java b/src/main/java/net/minecraft/server/PacketStatusListener.java -index 4bb21c48bd..30f16db02c 100644 +index 4bb21c48b..30f16db02 100644 --- a/src/main/java/net/minecraft/server/PacketStatusListener.java +++ b/src/main/java/net/minecraft/server/PacketStatusListener.java @@ -135,6 +135,7 @@ public class PacketStatusListener implements PacketStatusInListener { diff --git a/patches/server/0028-Add-turtle-egg-block-options-fixes-MC-168772.patch b/patches/server/0029-Add-turtle-egg-block-options-fixes-MC-168772.patch similarity index 95% rename from patches/server/0028-Add-turtle-egg-block-options-fixes-MC-168772.patch rename to patches/server/0029-Add-turtle-egg-block-options-fixes-MC-168772.patch index 1c238358c..a4e29e0a5 100644 --- a/patches/server/0028-Add-turtle-egg-block-options-fixes-MC-168772.patch +++ b/patches/server/0029-Add-turtle-egg-block-options-fixes-MC-168772.patch @@ -1,4 +1,4 @@ -From 34e5e0a8a1d20e4564e2e8c7000628d780e476fc Mon Sep 17 00:00:00 2001 +From cfa9bf07f2f960838299f5ea9db29fa3e397430f Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Thu, 6 Jun 2019 22:15:46 -0500 Subject: [PATCH] Add turtle egg block options - fixes MC-168772 @@ -9,7 +9,7 @@ Subject: [PATCH] Add turtle egg block options - fixes MC-168772 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/src/main/java/net/minecraft/server/BlockTurtleEgg.java b/src/main/java/net/minecraft/server/BlockTurtleEgg.java -index cb36334e41..aa83ef1699 100644 +index cb36334e4..aa83ef169 100644 --- a/src/main/java/net/minecraft/server/BlockTurtleEgg.java +++ b/src/main/java/net/minecraft/server/BlockTurtleEgg.java @@ -157,6 +157,23 @@ public class BlockTurtleEgg extends Block { @@ -38,7 +38,7 @@ index cb36334e41..aa83ef1699 100644 } } diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -index 79398d8326..ef94b84233 100644 +index 4609c3c8b..e2604d54b 100644 --- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java +++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java @@ -70,6 +70,15 @@ public class PurpurWorldConfig { diff --git a/patches/server/0029-Make-Iron-Golems-Swim.patch b/patches/server/0030-Make-Iron-Golems-Swim.patch similarity index 93% rename from patches/server/0029-Make-Iron-Golems-Swim.patch rename to patches/server/0030-Make-Iron-Golems-Swim.patch index a78bad5d7..c67a9070d 100644 --- a/patches/server/0029-Make-Iron-Golems-Swim.patch +++ b/patches/server/0030-Make-Iron-Golems-Swim.patch @@ -1,4 +1,4 @@ -From 66cfde050669201c4f05b1779f259e8cec8cf3c3 Mon Sep 17 00:00:00 2001 +From 389fb5986fcd93d1b4ffca65e00d40379d6a7402 Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Sat, 15 Jun 2019 03:12:15 -0500 Subject: [PATCH] Make Iron Golems Swim @@ -9,7 +9,7 @@ Subject: [PATCH] Make Iron Golems Swim 2 files changed, 3 insertions(+) diff --git a/src/main/java/net/minecraft/server/EntityIronGolem.java b/src/main/java/net/minecraft/server/EntityIronGolem.java -index 46e4574e55..5414d6975f 100644 +index 46e4574e5..5414d6975 100644 --- a/src/main/java/net/minecraft/server/EntityIronGolem.java +++ b/src/main/java/net/minecraft/server/EntityIronGolem.java @@ -36,6 +36,7 @@ public class EntityIronGolem extends EntityGolem { @@ -21,7 +21,7 @@ index 46e4574e55..5414d6975f 100644 this.goalSelector.a(1, new PathfinderGoalMeleeAttack(this, 1.0D, true)); this.goalSelector.a(2, new PathfinderGoalMoveTowardsTarget(this, 0.9D, 32.0F)); diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -index e2604d54bd..55c026d730 100644 +index e2604d54b..55c026d73 100644 --- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java +++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java @@ -336,10 +336,12 @@ public class PurpurWorldConfig { diff --git a/patches/server/0030-Allow-soil-to-moisten-from-water-directly-under-it.patch b/patches/server/0031-Allow-soil-to-moisten-from-water-directly-under-it.patch similarity index 95% rename from patches/server/0030-Allow-soil-to-moisten-from-water-directly-under-it.patch rename to patches/server/0031-Allow-soil-to-moisten-from-water-directly-under-it.patch index cf0d45a20..606489d86 100644 --- a/patches/server/0030-Allow-soil-to-moisten-from-water-directly-under-it.patch +++ b/patches/server/0031-Allow-soil-to-moisten-from-water-directly-under-it.patch @@ -1,4 +1,4 @@ -From fa2c330c03e96fa2d1e05a054d5c08870c5a616c Mon Sep 17 00:00:00 2001 +From 382783f9a102182aa6b090afe57b5d09e3e63415 Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Fri, 21 Jun 2019 14:37:10 -0500 Subject: [PATCH] Allow soil to moisten from water directly under it @@ -9,7 +9,7 @@ Subject: [PATCH] Allow soil to moisten from water directly under it 2 files changed, 12 insertions(+), 13 deletions(-) diff --git a/src/main/java/net/minecraft/server/BlockSoil.java b/src/main/java/net/minecraft/server/BlockSoil.java -index b6561f2c79..f2ab3ee011 100644 +index b6561f2c7..f2ab3ee01 100644 --- a/src/main/java/net/minecraft/server/BlockSoil.java +++ b/src/main/java/net/minecraft/server/BlockSoil.java @@ -1,6 +1,5 @@ @@ -47,7 +47,7 @@ index b6561f2c79..f2ab3ee011 100644 @Override diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -index 0191015b99..346ab82e62 100644 +index 55c026d73..85eaf1a7a 100644 --- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java +++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java @@ -65,6 +65,11 @@ public class PurpurWorldConfig { diff --git a/patches/server/0031-Controllable-Minecarts.patch b/patches/server/0032-Controllable-Minecarts.patch similarity index 96% rename from patches/server/0031-Controllable-Minecarts.patch rename to patches/server/0032-Controllable-Minecarts.patch index a13a82d18..ec0b9b39a 100644 --- a/patches/server/0031-Controllable-Minecarts.patch +++ b/patches/server/0032-Controllable-Minecarts.patch @@ -1,4 +1,4 @@ -From a802cc61ded1e0c5ff014385d480e53eae832b46 Mon Sep 17 00:00:00 2001 +From 930e24e2321f18937f9b6fe97d2bfec91a26bc96 Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Sat, 29 Jun 2019 02:32:40 -0500 Subject: [PATCH] Controllable Minecarts @@ -11,10 +11,10 @@ Subject: [PATCH] Controllable Minecarts 4 files changed, 76 insertions(+), 3 deletions(-) diff --git a/src/main/java/net/minecraft/server/Entity.java b/src/main/java/net/minecraft/server/Entity.java -index a9b1ce4165..44ae05b8a2 100644 +index 43d73385e..4333ca032 100644 --- a/src/main/java/net/minecraft/server/Entity.java +++ b/src/main/java/net/minecraft/server/Entity.java -@@ -1282,6 +1282,7 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke +@@ -1334,6 +1334,7 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke this.inLava = true; } @@ -23,7 +23,7 @@ index a9b1ce4165..44ae05b8a2 100644 return this.inLava; } diff --git a/src/main/java/net/minecraft/server/EntityMinecartAbstract.java b/src/main/java/net/minecraft/server/EntityMinecartAbstract.java -index 665bbe07fa..1f3e5bd288 100644 +index 665bbe07f..1f3e5bd28 100644 --- a/src/main/java/net/minecraft/server/EntityMinecartAbstract.java +++ b/src/main/java/net/minecraft/server/EntityMinecartAbstract.java @@ -357,12 +357,50 @@ public abstract class EntityMinecartAbstract extends Entity { @@ -78,7 +78,7 @@ index 665bbe07fa..1f3e5bd288 100644 this.setMot(new Vec3D(this.getMot().x * this.derailedX, this.getMot().y * this.derailedY, this.getMot().z * this.derailedZ)); // CraftBukkit end diff --git a/src/main/java/net/minecraft/server/ItemMinecart.java b/src/main/java/net/minecraft/server/ItemMinecart.java -index b73e317fbb..e1337a9c04 100644 +index b73e317fb..e1337a9c0 100644 --- a/src/main/java/net/minecraft/server/ItemMinecart.java +++ b/src/main/java/net/minecraft/server/ItemMinecart.java @@ -103,8 +103,10 @@ public class ItemMinecart extends Item { @@ -103,7 +103,7 @@ index b73e317fbb..e1337a9c04 100644 } } diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -index 346ab82e62..63afc5d98e 100644 +index 85eaf1a7a..dfa631803 100644 --- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java +++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java @@ -1,10 +1,16 @@ diff --git a/patches/server/0032-Signs-allow-color-codes.patch b/patches/server/0033-Signs-allow-color-codes.patch similarity index 94% rename from patches/server/0032-Signs-allow-color-codes.patch rename to patches/server/0033-Signs-allow-color-codes.patch index 0a7c3ea5e..dbe428cf0 100644 --- a/patches/server/0032-Signs-allow-color-codes.patch +++ b/patches/server/0033-Signs-allow-color-codes.patch @@ -1,4 +1,4 @@ -From 0573f00a8deb9cfa86e7829724a934c87be06f53 Mon Sep 17 00:00:00 2001 +From b887b068bf905cd438ade68ed492bc960ab9cc65 Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Thu, 6 Jun 2019 17:40:30 -0500 Subject: [PATCH] Signs allow color codes @@ -11,10 +11,10 @@ Subject: [PATCH] Signs allow color codes 4 files changed, 25 insertions(+) diff --git a/src/main/java/net/minecraft/server/EntityPlayer.java b/src/main/java/net/minecraft/server/EntityPlayer.java -index e7bfbc3307..a2f239b49e 100644 +index 937e513d8..ef26e66d7 100644 --- a/src/main/java/net/minecraft/server/EntityPlayer.java +++ b/src/main/java/net/minecraft/server/EntityPlayer.java -@@ -1126,6 +1126,7 @@ public class EntityPlayer extends EntityHuman implements ICrafting { +@@ -1160,6 +1160,7 @@ public class EntityPlayer extends EntityHuman implements ICrafting { @Override public void openSign(TileEntitySign tileentitysign) { tileentitysign.a((EntityHuman) this); @@ -23,7 +23,7 @@ index e7bfbc3307..a2f239b49e 100644 } diff --git a/src/main/java/net/minecraft/server/PlayerConnection.java b/src/main/java/net/minecraft/server/PlayerConnection.java -index c6bd623921..5aada89c24 100644 +index 7929fcc80..895e34ed3 100644 --- a/src/main/java/net/minecraft/server/PlayerConnection.java +++ b/src/main/java/net/minecraft/server/PlayerConnection.java @@ -2580,6 +2580,14 @@ public class PlayerConnection implements PacketListenerPlayIn { @@ -42,7 +42,7 @@ index c6bd623921..5aada89c24 100644 } SignChangeEvent event = new SignChangeEvent((org.bukkit.craftbukkit.block.CraftBlock) player.getWorld().getBlockAt(x, y, z), this.server.getPlayer(this.player), lines); diff --git a/src/main/java/net/minecraft/server/TileEntitySign.java b/src/main/java/net/minecraft/server/TileEntitySign.java -index 099d98e04c..19d76c8cce 100644 +index 099d98e04..19d76c8cc 100644 --- a/src/main/java/net/minecraft/server/TileEntitySign.java +++ b/src/main/java/net/minecraft/server/TileEntitySign.java @@ -89,6 +89,20 @@ public class TileEntitySign extends TileEntity implements ICommandListener { // @@ -67,7 +67,7 @@ index 099d98e04c..19d76c8cce 100644 @Override public PacketPlayOutTileEntityData getUpdatePacket() { diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -index dfa6318039..7395abfb6f 100644 +index dfa631803..7395abfb6 100644 --- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java +++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java @@ -76,8 +76,10 @@ public class PurpurWorldConfig { diff --git a/patches/server/0033-Campfires-have-regen-effect.patch b/patches/server/0034-Campfires-have-regen-effect.patch similarity index 97% rename from patches/server/0033-Campfires-have-regen-effect.patch rename to patches/server/0034-Campfires-have-regen-effect.patch index bf83ff1c2..d73c33607 100644 --- a/patches/server/0033-Campfires-have-regen-effect.patch +++ b/patches/server/0034-Campfires-have-regen-effect.patch @@ -1,4 +1,4 @@ -From 6a80be34ff831aa6b1be2bcd36c04db2de5612eb Mon Sep 17 00:00:00 2001 +From 4e45ec9fa8ffe2a833f7fd36ecb85a06c8e1d3c4 Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Sun, 19 May 2019 18:11:53 -0500 Subject: [PATCH] Campfires have regen effect @@ -12,7 +12,7 @@ Subject: [PATCH] Campfires have regen effect 5 files changed, 92 insertions(+), 4 deletions(-) diff --git a/src/main/java/net/minecraft/server/BlockCampfire.java b/src/main/java/net/minecraft/server/BlockCampfire.java -index 6303be944c..65f8d803b8 100644 +index 6303be944..65f8d803b 100644 --- a/src/main/java/net/minecraft/server/BlockCampfire.java +++ b/src/main/java/net/minecraft/server/BlockCampfire.java @@ -8,7 +8,7 @@ public class BlockCampfire extends BlockTileEntity implements IBlockWaterlogged @@ -25,7 +25,7 @@ index 6303be944c..65f8d803b8 100644 public static final BlockStateDirection e = BlockProperties.N; private static final VoxelShape f = Block.a(6.0D, 0.0D, 6.0D, 10.0D, 16.0D, 10.0D); diff --git a/src/main/java/net/minecraft/server/EntityLiving.java b/src/main/java/net/minecraft/server/EntityLiving.java -index 6ca11091c9..2128e968ae 100644 +index 6ca11091c..2128e968a 100644 --- a/src/main/java/net/minecraft/server/EntityLiving.java +++ b/src/main/java/net/minecraft/server/EntityLiving.java @@ -2772,10 +2772,19 @@ public abstract class EntityLiving extends Entity { @@ -52,7 +52,7 @@ index 6ca11091c9..2128e968ae 100644 @Override diff --git a/src/main/java/net/minecraft/server/EntityPotion.java b/src/main/java/net/minecraft/server/EntityPotion.java -index 2f9a73ea33..2398499bcb 100644 +index 2f9a73ea3..2398499bc 100644 --- a/src/main/java/net/minecraft/server/EntityPotion.java +++ b/src/main/java/net/minecraft/server/EntityPotion.java @@ -91,6 +91,7 @@ public class EntityPotion extends EntityProjectile { @@ -96,7 +96,7 @@ index 2f9a73ea33..2398499bcb 100644 AxisAlignedBB axisalignedbb = this.getBoundingBox().grow(4.0D, 2.0D, 4.0D); List list = this.world.a(EntityLiving.class, axisalignedbb, EntityPotion.e); diff --git a/src/main/java/net/minecraft/server/TileEntityCampfire.java b/src/main/java/net/minecraft/server/TileEntityCampfire.java -index a1580b8c6d..618ca2d763 100644 +index a1580b8c6..618ca2d76 100644 --- a/src/main/java/net/minecraft/server/TileEntityCampfire.java +++ b/src/main/java/net/minecraft/server/TileEntityCampfire.java @@ -14,6 +14,7 @@ public class TileEntityCampfire extends TileEntity implements Clearable, ITickab @@ -165,7 +165,7 @@ index a1580b8c6d..618ca2d763 100644 } diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -index 7891812a87..6797fb54c6 100644 +index 7395abfb6..fc98e8249 100644 --- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java +++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java @@ -71,6 +71,29 @@ public class PurpurWorldConfig { diff --git a/patches/server/0034-Disable-loot-drops-on-death-by-cramming.patch b/patches/server/0035-Disable-loot-drops-on-death-by-cramming.patch similarity index 95% rename from patches/server/0034-Disable-loot-drops-on-death-by-cramming.patch rename to patches/server/0035-Disable-loot-drops-on-death-by-cramming.patch index 0792a9803..216ccf746 100644 --- a/patches/server/0034-Disable-loot-drops-on-death-by-cramming.patch +++ b/patches/server/0035-Disable-loot-drops-on-death-by-cramming.patch @@ -1,4 +1,4 @@ -From 11226b90ae4e81d1f27689e2bf39d0926ff114f6 Mon Sep 17 00:00:00 2001 +From 006310f268f3ecf5e62facd7dbb39244c08be5c3 Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Wed, 3 Jul 2019 23:58:31 -0500 Subject: [PATCH] Disable loot drops on death by cramming @@ -9,7 +9,7 @@ Subject: [PATCH] Disable loot drops on death by cramming 2 files changed, 4 insertions(+) diff --git a/src/main/java/net/minecraft/server/EntityLiving.java b/src/main/java/net/minecraft/server/EntityLiving.java -index 2128e968ae..76a925f7aa 100644 +index 2128e968a..76a925f7a 100644 --- a/src/main/java/net/minecraft/server/EntityLiving.java +++ b/src/main/java/net/minecraft/server/EntityLiving.java @@ -1374,8 +1374,10 @@ public abstract class EntityLiving extends Entity { @@ -24,7 +24,7 @@ index 2128e968ae..76a925f7aa 100644 deathEvent = CraftEventFactory.callEntityDeathEvent(this, this.drops); // Paper } else { diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -index 6797fb54c6..25c9706d1a 100644 +index fc98e8249..7cd02e6b2 100644 --- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java +++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java @@ -121,6 +121,7 @@ public class PurpurWorldConfig { diff --git a/patches/server/0035-Campfires-burn-out-in-rain.patch b/patches/server/0036-Campfires-burn-out-in-rain.patch similarity index 96% rename from patches/server/0035-Campfires-burn-out-in-rain.patch rename to patches/server/0036-Campfires-burn-out-in-rain.patch index 5e9aace49..748844f79 100644 --- a/patches/server/0035-Campfires-burn-out-in-rain.patch +++ b/patches/server/0036-Campfires-burn-out-in-rain.patch @@ -1,4 +1,4 @@ -From b0c6a40063636aff9d0deb18cf4142727ac5ebd2 Mon Sep 17 00:00:00 2001 +From c15b54306d8910756947ed6fa737338b3796ce6d Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Thu, 6 Jun 2019 21:30:49 -0500 Subject: [PATCH] Campfires burn out in rain @@ -10,7 +10,7 @@ Subject: [PATCH] Campfires burn out in rain 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/src/main/java/net/minecraft/server/Block.java b/src/main/java/net/minecraft/server/Block.java -index b29ed1cfa7..d7911c3421 100644 +index b29ed1cfa..d7911c342 100644 --- a/src/main/java/net/minecraft/server/Block.java +++ b/src/main/java/net/minecraft/server/Block.java @@ -387,7 +387,7 @@ public class Block implements IMaterial { @@ -23,7 +23,7 @@ index b29ed1cfa7..d7911c3421 100644 } diff --git a/src/main/java/net/minecraft/server/BlockCampfire.java b/src/main/java/net/minecraft/server/BlockCampfire.java -index 65f8d803b8..3b95dfaaae 100644 +index 65f8d803b..3b95dfaaa 100644 --- a/src/main/java/net/minecraft/server/BlockCampfire.java +++ b/src/main/java/net/minecraft/server/BlockCampfire.java @@ -7,7 +7,7 @@ import javax.annotation.Nullable; @@ -58,7 +58,7 @@ index 65f8d803b8..3b95dfaaae 100644 public IBlockData updateState(IBlockData iblockdata, EnumDirection enumdirection, IBlockData iblockdata1, GeneratorAccess generatoraccess, BlockPosition blockposition, BlockPosition blockposition1) { if ((Boolean) iblockdata.get(BlockCampfire.d)) { diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -index 25c9706d1a..470f398478 100644 +index 7cd02e6b2..bfd9babf2 100644 --- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java +++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java @@ -81,6 +81,7 @@ public class PurpurWorldConfig { diff --git a/patches/server/0036-Campfires-should-fall-with-gravity.patch b/patches/server/0037-Campfires-should-fall-with-gravity.patch similarity index 97% rename from patches/server/0036-Campfires-should-fall-with-gravity.patch rename to patches/server/0037-Campfires-should-fall-with-gravity.patch index 7a89f82dc..463cb4d41 100644 --- a/patches/server/0036-Campfires-should-fall-with-gravity.patch +++ b/patches/server/0037-Campfires-should-fall-with-gravity.patch @@ -1,4 +1,4 @@ -From 51d55e9350762ab11070979a556eefbfcf94f46a Mon Sep 17 00:00:00 2001 +From d29c8ceeb26584c7f0b072ddf4ece5eb62c3b79f Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Thu, 23 May 2019 16:20:21 -0500 Subject: [PATCH] Campfires should fall with gravity @@ -9,7 +9,7 @@ Subject: [PATCH] Campfires should fall with gravity 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/main/java/net/minecraft/server/BlockCampfire.java b/src/main/java/net/minecraft/server/BlockCampfire.java -index 3b95dfaaae..418fa6d1fe 100644 +index 3b95dfaaa..418fa6d1f 100644 --- a/src/main/java/net/minecraft/server/BlockCampfire.java +++ b/src/main/java/net/minecraft/server/BlockCampfire.java @@ -9,7 +9,7 @@ public class BlockCampfire extends BlockTileEntity implements IBlockWaterlogged @@ -59,7 +59,7 @@ index 3b95dfaaae..418fa6d1fe 100644 if (flag) { diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -index 470f398478..dbc73dd078 100644 +index bfd9babf2..5e57646ce 100644 --- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java +++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java @@ -82,6 +82,7 @@ public class PurpurWorldConfig { diff --git a/patches/server/0037-Dont-send-useless-entity-packets.patch b/patches/server/0038-Dont-send-useless-entity-packets.patch similarity index 90% rename from patches/server/0037-Dont-send-useless-entity-packets.patch rename to patches/server/0038-Dont-send-useless-entity-packets.patch index 6619e8e00..3c55c08b7 100644 --- a/patches/server/0037-Dont-send-useless-entity-packets.patch +++ b/patches/server/0038-Dont-send-useless-entity-packets.patch @@ -1,4 +1,4 @@ -From baa43955c1ca2d1a5addc5a7f38bac2cb049d4aa Mon Sep 17 00:00:00 2001 +From 04d58cc1908e9823eba1e48bfa52683d9e650a02 Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Sat, 6 Jul 2019 17:00:04 -0500 Subject: [PATCH] Dont send useless entity packets @@ -10,10 +10,10 @@ Subject: [PATCH] Dont send useless entity packets 3 files changed, 27 insertions(+), 5 deletions(-) diff --git a/src/main/java/net/minecraft/server/EntityTrackerEntry.java b/src/main/java/net/minecraft/server/EntityTrackerEntry.java -index 3a88c9a670..1f7c8f7da0 100644 +index b4d3c4a4f..1dc29d7cd 100644 --- a/src/main/java/net/minecraft/server/EntityTrackerEntry.java +++ b/src/main/java/net/minecraft/server/EntityTrackerEntry.java -@@ -162,6 +162,7 @@ public class EntityTrackerEntry { +@@ -168,6 +168,7 @@ public class EntityTrackerEntry { this.o = 0; packet1 = new PacketPlayOutEntityTeleport(this.tracker); } @@ -21,7 +21,7 @@ index 3a88c9a670..1f7c8f7da0 100644 } if ((this.e || this.tracker.impulse || this.tracker instanceof EntityLiving && ((EntityLiving) this.tracker).isGliding()) && this.tickCounter > 0) { -@@ -248,6 +249,22 @@ public class EntityTrackerEntry { +@@ -254,6 +255,22 @@ public class EntityTrackerEntry { } @@ -41,11 +41,11 @@ index 3a88c9a670..1f7c8f7da0 100644 + } + // Purpur end + - public void a(EntityPlayer entityplayer) { - this.tracker.c(entityplayer); - entityplayer.c(this.tracker); + // Tuinity end - optimise entity tracking + // TODO make use of this in second pass rewrite + final void resetState() { diff --git a/src/main/java/net/minecraft/server/PacketPlayOutEntity.java b/src/main/java/net/minecraft/server/PacketPlayOutEntity.java -index e5da2b19c1..5b1d959354 100644 +index e5da2b19c..5b1d95935 100644 --- a/src/main/java/net/minecraft/server/PacketPlayOutEntity.java +++ b/src/main/java/net/minecraft/server/PacketPlayOutEntity.java @@ -5,11 +5,11 @@ import java.io.IOException; @@ -66,7 +66,7 @@ index e5da2b19c1..5b1d959354 100644 protected boolean h; protected boolean i; diff --git a/src/main/java/net/pl3x/purpur/PurpurConfig.java b/src/main/java/net/pl3x/purpur/PurpurConfig.java -index 345404c3a1..e219312168 100644 +index 345404c3a..e21931216 100644 --- a/src/main/java/net/pl3x/purpur/PurpurConfig.java +++ b/src/main/java/net/pl3x/purpur/PurpurConfig.java @@ -142,6 +142,11 @@ public class PurpurConfig { diff --git a/patches/server/0038-Fix-item-position-desync-MC-4.patch b/patches/server/0039-Fix-item-position-desync-MC-4.patch similarity index 80% rename from patches/server/0038-Fix-item-position-desync-MC-4.patch rename to patches/server/0039-Fix-item-position-desync-MC-4.patch index 982f4930f..523119845 100644 --- a/patches/server/0038-Fix-item-position-desync-MC-4.patch +++ b/patches/server/0039-Fix-item-position-desync-MC-4.patch @@ -1,4 +1,4 @@ -From 16b5c15553521b079de24a9baa3f093582c145e1 Mon Sep 17 00:00:00 2001 +From a0d90424c8242684df2b1754d0b3708a5ef20115 Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Sat, 6 Jul 2019 21:12:58 -0500 Subject: [PATCH] Fix item position desync (MC-4) @@ -10,24 +10,24 @@ Subject: [PATCH] Fix item position desync (MC-4) 3 files changed, 10 insertions(+) diff --git a/src/main/java/net/minecraft/server/EntityTrackerEntry.java b/src/main/java/net/minecraft/server/EntityTrackerEntry.java -index 1f7c8f7da0..5dd4d392a6 100644 +index 1dc29d7cd..bb0b7b98e 100644 --- a/src/main/java/net/minecraft/server/EntityTrackerEntry.java +++ b/src/main/java/net/minecraft/server/EntityTrackerEntry.java -@@ -124,6 +124,12 @@ public class EntityTrackerEntry { - ++this.o; - i = MathHelper.d(this.tracker.yaw * 256.0F / 360.0F); - j = MathHelper.d(this.tracker.pitch * 256.0F / 360.0F); +@@ -130,6 +130,12 @@ public class EntityTrackerEntry { + double vec3d_dy = this.tracker.locY() - 2.44140625E-4D*(this.yLoc); + double vec3d_dz = this.tracker.locZ() - 2.44140625E-4D*(this.zLoc); + boolean flag1 = (vec3d_dx * vec3d_dx + vec3d_dy * vec3d_dy + vec3d_dz * vec3d_dz) >= 7.62939453125E-6D; + // Purpur start - fixes MC-4 + if (net.pl3x.purpur.PurpurConfig.fixItemPositionDesync && this.tracker instanceof EntityItem) { + Vec3D loc = PacketPlayOutEntity.decrypt(PacketPlayOutEntity.encrypt(tracker.locX()), PacketPlayOutEntity.encrypt(tracker.locY()), PacketPlayOutEntity.encrypt(tracker.locZ())); + tracker.setPosition(loc.getX(), loc.getY(), loc.getZ()); + } + // Purpur end - Vec3D vec3d = this.tracker.getPositionVector().d(PacketPlayOutEntity.a(this.xLoc, this.yLoc, this.zLoc)); - boolean flag1 = vec3d.g() >= 7.62939453125E-6D; Packet packet1 = null; + boolean flag2 = flag1 || this.tickCounter % 60 == 0; + boolean flag3 = Math.abs(i - this.yRot) >= 1 || Math.abs(j - this.xRot) >= 1; diff --git a/src/main/java/net/minecraft/server/PacketPlayOutEntity.java b/src/main/java/net/minecraft/server/PacketPlayOutEntity.java -index 5b1d959354..0010448e3a 100644 +index 5b1d95935..0010448e3 100644 --- a/src/main/java/net/minecraft/server/PacketPlayOutEntity.java +++ b/src/main/java/net/minecraft/server/PacketPlayOutEntity.java @@ -14,10 +14,12 @@ public class PacketPlayOutEntity implements Packet { @@ -44,7 +44,7 @@ index 5b1d959354..0010448e3a 100644 return (new Vec3D((double) i, (double) j, (double) k)).a(2.44140625E-4D); } diff --git a/src/main/java/net/pl3x/purpur/PurpurConfig.java b/src/main/java/net/pl3x/purpur/PurpurConfig.java -index e219312168..3670b4d48d 100644 +index e21931216..3670b4d48 100644 --- a/src/main/java/net/pl3x/purpur/PurpurConfig.java +++ b/src/main/java/net/pl3x/purpur/PurpurConfig.java @@ -143,8 +143,10 @@ public class PurpurConfig { diff --git a/patches/server/0039-Rate-limit-incoming-packets-from-players.patch b/patches/server/0040-Rate-limit-incoming-packets-from-players.patch similarity index 98% rename from patches/server/0039-Rate-limit-incoming-packets-from-players.patch rename to patches/server/0040-Rate-limit-incoming-packets-from-players.patch index a75cc8728..aab0f092f 100644 --- a/patches/server/0039-Rate-limit-incoming-packets-from-players.patch +++ b/patches/server/0040-Rate-limit-incoming-packets-from-players.patch @@ -1,4 +1,4 @@ -From 215d2fce2b35b309e539bae93e9604d8611e91df Mon Sep 17 00:00:00 2001 +From 1fa6081a9f5c7bf0fc63a0530d266b7783e53727 Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Fri, 7 Feb 2020 09:45:09 -0600 Subject: [PATCH] Rate limit incoming packets from players @@ -12,7 +12,7 @@ Subject: [PATCH] Rate limit incoming packets from players create mode 100644 src/main/java/net/pl3x/purpur/network/PacketLimiter.java diff --git a/src/main/java/net/minecraft/server/NetworkManager.java b/src/main/java/net/minecraft/server/NetworkManager.java -index 96a785af27..803ede8e33 100644 +index 211a6d720..a1304240d 100644 --- a/src/main/java/net/minecraft/server/NetworkManager.java +++ b/src/main/java/net/minecraft/server/NetworkManager.java @@ -150,6 +150,13 @@ public class NetworkManager extends SimpleChannelInboundHandler> { @@ -30,7 +30,7 @@ index 96a785af27..803ede8e33 100644 } diff --git a/src/main/java/net/minecraft/server/PlayerConnection.java b/src/main/java/net/minecraft/server/PlayerConnection.java -index fee512a479..e8851ffde6 100644 +index 895e34ed3..67afa457e 100644 --- a/src/main/java/net/minecraft/server/PlayerConnection.java +++ b/src/main/java/net/minecraft/server/PlayerConnection.java @@ -140,6 +140,62 @@ public class PlayerConnection implements PacketListenerPlayIn { @@ -97,7 +97,7 @@ index fee512a479..e8851ffde6 100644 public void tick() { this.syncPosition(); diff --git a/src/main/java/net/pl3x/purpur/PurpurConfig.java b/src/main/java/net/pl3x/purpur/PurpurConfig.java -index 3670b4d48d..e1a1ef860a 100644 +index 3670b4d48..e1a1ef860 100644 --- a/src/main/java/net/pl3x/purpur/PurpurConfig.java +++ b/src/main/java/net/pl3x/purpur/PurpurConfig.java @@ -142,6 +142,18 @@ public class PurpurConfig { @@ -121,7 +121,7 @@ index 3670b4d48d..e1a1ef860a 100644 private static void dontSendUselessEntityPackets() { diff --git a/src/main/java/net/pl3x/purpur/network/PacketLimiter.java b/src/main/java/net/pl3x/purpur/network/PacketLimiter.java new file mode 100644 -index 0000000000..e51e7eb9d0 +index 000000000..e51e7eb9d --- /dev/null +++ b/src/main/java/net/pl3x/purpur/network/PacketLimiter.java @@ -0,0 +1,147 @@ diff --git a/patches/server/0040-Fix-pig-zombies-MC-56653.patch b/patches/server/0041-Fix-pig-zombies-MC-56653.patch similarity index 95% rename from patches/server/0040-Fix-pig-zombies-MC-56653.patch rename to patches/server/0041-Fix-pig-zombies-MC-56653.patch index 34a8b1007..07a4e5668 100644 --- a/patches/server/0040-Fix-pig-zombies-MC-56653.patch +++ b/patches/server/0041-Fix-pig-zombies-MC-56653.patch @@ -1,4 +1,4 @@ -From a4092de3ceeea3058b6eda5812b86ccec2944ab1 Mon Sep 17 00:00:00 2001 +From 88f641f1609d6a628ae49a40cbdc250ff5c4c500 Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Tue, 9 Jul 2019 20:56:47 -0500 Subject: [PATCH] Fix pig zombies (MC-56653) @@ -9,7 +9,7 @@ Subject: [PATCH] Fix pig zombies (MC-56653) 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/main/java/net/minecraft/server/EntityPigZombie.java b/src/main/java/net/minecraft/server/EntityPigZombie.java -index fb9ef88ea3..227fff3f1d 100644 +index fb9ef88ea..227fff3f1 100644 --- a/src/main/java/net/minecraft/server/EntityPigZombie.java +++ b/src/main/java/net/minecraft/server/EntityPigZombie.java @@ -155,6 +155,7 @@ public class EntityPigZombie extends EntityZombie { @@ -43,7 +43,7 @@ index fb9ef88ea3..227fff3f1d 100644 public PathfinderGoalAnger(EntityPigZombie entitypigzombie) { diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -index 5e57646ce9..2bbbf30c0d 100644 +index 5e57646ce..2bbbf30c0 100644 --- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java +++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java @@ -771,10 +771,12 @@ public class PurpurWorldConfig { diff --git a/patches/server/0041-Implement-AFK-API.patch b/patches/server/0042-Implement-AFK-API.patch similarity index 88% rename from patches/server/0041-Implement-AFK-API.patch rename to patches/server/0042-Implement-AFK-API.patch index 757c3d04d..4ea9ba712 100644 --- a/patches/server/0041-Implement-AFK-API.patch +++ b/patches/server/0042-Implement-AFK-API.patch @@ -1,10 +1,9 @@ -From 08797ff8d48c0268a102240df3ca28ca6a631741 Mon Sep 17 00:00:00 2001 +From 5dafe5578138aec3c228bcf45894de8c01ba1518 Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Thu, 8 Aug 2019 15:29:15 -0500 Subject: [PATCH] Implement AFK API --- - .../java/net/minecraft/server/Entity.java | 1 + .../net/minecraft/server/EntityHuman.java | 9 ++++ .../net/minecraft/server/EntityPlayer.java | 43 +++++++++++++++++++ .../net/minecraft/server/IEntityAccess.java | 34 ++++++--------- @@ -14,22 +13,10 @@ Subject: [PATCH] Implement AFK API .../net/pl3x/purpur/PurpurWorldConfig.java | 15 +++++++ .../craftbukkit/entity/CraftPlayer.java | 17 ++++++++ .../java/org/spigotmc/ActivationRange.java | 1 + - 10 files changed, 112 insertions(+), 24 deletions(-) + 9 files changed, 111 insertions(+), 24 deletions(-) -diff --git a/src/main/java/net/minecraft/server/Entity.java b/src/main/java/net/minecraft/server/Entity.java -index b8959e005f..d38bbf6a4e 100644 ---- a/src/main/java/net/minecraft/server/Entity.java -+++ b/src/main/java/net/minecraft/server/Entity.java -@@ -1374,6 +1374,7 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke - return MathHelper.c(f * f + f1 * f1 + f2 * f2); - } - -+ public double getDistanceSq(double x, double y, double z) { return g(x, y, z); } // Purpur - OBFHELPER - public double g(double d0, double d1, double d2) { - double d3 = this.locX() - d0; - double d4 = this.locY() - d1; diff --git a/src/main/java/net/minecraft/server/EntityHuman.java b/src/main/java/net/minecraft/server/EntityHuman.java -index de22cad764..9d26bd1e4c 100644 +index de22cad76..9d26bd1e4 100644 --- a/src/main/java/net/minecraft/server/EntityHuman.java +++ b/src/main/java/net/minecraft/server/EntityHuman.java @@ -86,6 +86,15 @@ public abstract class EntityHuman extends EntityLiving { @@ -49,10 +36,10 @@ index de22cad764..9d26bd1e4c 100644 super(EntityTypes.PLAYER, world); this.bV = ItemStack.a; diff --git a/src/main/java/net/minecraft/server/EntityPlayer.java b/src/main/java/net/minecraft/server/EntityPlayer.java -index a2f239b49e..1b5140a357 100644 +index ef26e66d7..bc1d429b1 100644 --- a/src/main/java/net/minecraft/server/EntityPlayer.java +++ b/src/main/java/net/minecraft/server/EntityPlayer.java -@@ -1617,8 +1617,51 @@ public class EntityPlayer extends EntityHuman implements ICrafting { +@@ -1651,8 +1651,51 @@ public class EntityPlayer extends EntityHuman implements ICrafting { public void resetIdleTimer() { this.cj = SystemUtils.getMonotonicMillis(); @@ -105,10 +92,10 @@ index a2f239b49e..1b5140a357 100644 return this.serverStatisticManager; } diff --git a/src/main/java/net/minecraft/server/IEntityAccess.java b/src/main/java/net/minecraft/server/IEntityAccess.java -index 774ec96f0a..5ef8816340 100644 +index 9622615b5..e0d011a2d 100644 --- a/src/main/java/net/minecraft/server/IEntityAccess.java +++ b/src/main/java/net/minecraft/server/IEntityAccess.java -@@ -116,28 +116,18 @@ public interface IEntityAccess { +@@ -121,28 +121,18 @@ public interface IEntityAccess { return entityhuman; } @@ -139,7 +126,7 @@ index 774ec96f0a..5ef8816340 100644 + double distanceSq = distance * distance; + for (EntityHuman player : getPlayers()) { + if (IEntitySelector.notSpectator().test(player) && IEntitySelector.isLivingAlive().test(player) && IEntitySelector.notAfk.test(player)) { -+ if (distance < 0.0D || player.getDistanceSq(x, y, z) < distanceSq) { ++ if (distance < 0.0D || player.getDistanceSquared(x, y, z) < distanceSq) { + return true; + } + } @@ -150,7 +137,7 @@ index 774ec96f0a..5ef8816340 100644 @Nullable diff --git a/src/main/java/net/minecraft/server/IEntitySelector.java b/src/main/java/net/minecraft/server/IEntitySelector.java -index e1fdee2794..4665671ef6 100644 +index e1fdee279..4665671ef 100644 --- a/src/main/java/net/minecraft/server/IEntitySelector.java +++ b/src/main/java/net/minecraft/server/IEntitySelector.java @@ -7,6 +7,7 @@ import javax.annotation.Nullable; @@ -170,7 +157,7 @@ index e1fdee2794..4665671ef6 100644 public static Predicate a(double d0, double d1, double d2, double d3) { double d4 = d3 * d3; diff --git a/src/main/java/net/minecraft/server/PlayerConnection.java b/src/main/java/net/minecraft/server/PlayerConnection.java -index e8851ffde6..d897c7fd41 100644 +index 67afa457e..2659da188 100644 --- a/src/main/java/net/minecraft/server/PlayerConnection.java +++ b/src/main/java/net/minecraft/server/PlayerConnection.java @@ -279,6 +279,12 @@ public class PlayerConnection implements PacketListenerPlayIn { @@ -205,10 +192,10 @@ index e8851ffde6..d897c7fd41 100644 if (from.getX() != Double.MAX_VALUE) { Location oldTo = to.clone(); diff --git a/src/main/java/net/minecraft/server/WorldServer.java b/src/main/java/net/minecraft/server/WorldServer.java -index 874b8c1292..567b297e05 100644 +index 633d67b66..37b5a1193 100644 --- a/src/main/java/net/minecraft/server/WorldServer.java +++ b/src/main/java/net/minecraft/server/WorldServer.java -@@ -376,7 +376,7 @@ public class WorldServer extends World { +@@ -745,7 +745,7 @@ public class WorldServer extends World { } if (this.everyoneSleeping && this.players.stream().noneMatch((entityplayer) -> { @@ -217,7 +204,7 @@ index 874b8c1292..567b297e05 100644 })) { // CraftBukkit start long l = this.worldData.getDayTime() + 24000L; -@@ -682,7 +682,7 @@ public class WorldServer extends World { +@@ -1050,7 +1050,7 @@ public class WorldServer extends World { while (iterator.hasNext()) { EntityPlayer entityplayer = (EntityPlayer) iterator.next(); @@ -227,7 +214,7 @@ index 874b8c1292..567b297e05 100644 } else if (entityplayer.isSleeping()) { ++j; diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -index 2bbbf30c0d..95f1dcf0d7 100644 +index 2bbbf30c0..95f1dcf0d 100644 --- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java +++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java @@ -147,6 +147,21 @@ public class PurpurWorldConfig { @@ -253,10 +240,10 @@ index 2bbbf30c0d..95f1dcf0d7 100644 public boolean batRidableInWater = false; public boolean batRequireShiftToMount = true; diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -index 60f62f19cb..fa9fc940a2 100644 +index 516a01648..7451e120c 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -@@ -2092,4 +2092,21 @@ public class CraftPlayer extends CraftHumanEntity implements Player { +@@ -2125,4 +2125,21 @@ public class CraftPlayer extends CraftHumanEntity implements Player { return spigot; } // Spigot end @@ -279,12 +266,12 @@ index 60f62f19cb..fa9fc940a2 100644 + // Purpur end } diff --git a/src/main/java/org/spigotmc/ActivationRange.java b/src/main/java/org/spigotmc/ActivationRange.java -index 6e165a1649..da5fef091a 100644 +index e160f03c1..11fb14612 100644 --- a/src/main/java/org/spigotmc/ActivationRange.java +++ b/src/main/java/org/spigotmc/ActivationRange.java -@@ -137,6 +137,7 @@ public class ActivationRange - { - +@@ -142,6 +142,7 @@ public class ActivationRange + final int maxRange = Math.min( ( ( player instanceof net.minecraft.server.EntityPlayer ? ((net.minecraft.server.EntityPlayer)player).getEffectiveViewDistance(((WorldServer)world).getChunkProvider().playerChunkMap) : world.spigotConfig.viewDistance ) << 4 ) - 8, maxRangeTemp ); + // Tuinity end - per player view distance player.activatedTick = MinecraftServer.currentTick; + if (!player.world.purpurConfig.idleTimeoutTickNearbyEntities && player.isAfk()) continue; // Purpur maxBB = player.getBoundingBox().grow( maxRange, 256, maxRange ); diff --git a/patches/server/0042-Option-to-toggle-milk-curing-bad-omen.patch b/patches/server/0043-Option-to-toggle-milk-curing-bad-omen.patch similarity index 94% rename from patches/server/0042-Option-to-toggle-milk-curing-bad-omen.patch rename to patches/server/0043-Option-to-toggle-milk-curing-bad-omen.patch index 05ce69f48..5e92b0cb8 100644 --- a/patches/server/0042-Option-to-toggle-milk-curing-bad-omen.patch +++ b/patches/server/0043-Option-to-toggle-milk-curing-bad-omen.patch @@ -1,4 +1,4 @@ -From 75163c84fc9ebd175e40ca3db216df6451337c6d Mon Sep 17 00:00:00 2001 +From 44821e8ea31928825b1838dbaea68402eadeb72c Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Wed, 10 Jul 2019 20:43:05 -0500 Subject: [PATCH] Option to toggle milk curing bad omen @@ -9,7 +9,7 @@ Subject: [PATCH] Option to toggle milk curing bad omen 2 files changed, 5 insertions(+) diff --git a/src/main/java/net/minecraft/server/ItemMilkBucket.java b/src/main/java/net/minecraft/server/ItemMilkBucket.java -index 6b255e09ac..e1d3894ab7 100644 +index 6b255e09a..e1d3894ab 100644 --- a/src/main/java/net/minecraft/server/ItemMilkBucket.java +++ b/src/main/java/net/minecraft/server/ItemMilkBucket.java @@ -20,7 +20,10 @@ public class ItemMilkBucket extends Item { @@ -24,7 +24,7 @@ index 6b255e09ac..e1d3894ab7 100644 return itemstack.isEmpty() ? new ItemStack(Items.BUCKET) : itemstack; diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -index c53b07adf6..a723f12a5e 100644 +index 95f1dcf0d..3dbcd3f0e 100644 --- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java +++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java @@ -126,6 +126,7 @@ public class PurpurWorldConfig { diff --git a/patches/server/0043-Mending-mends-most-damages-equipment-first.patch b/patches/server/0044-Mending-mends-most-damages-equipment-first.patch similarity index 96% rename from patches/server/0043-Mending-mends-most-damages-equipment-first.patch rename to patches/server/0044-Mending-mends-most-damages-equipment-first.patch index 3e0536665..709fc7a0f 100644 --- a/patches/server/0043-Mending-mends-most-damages-equipment-first.patch +++ b/patches/server/0044-Mending-mends-most-damages-equipment-first.patch @@ -1,4 +1,4 @@ -From 5d3d733f0fdc2047aa72a6db54db409ffa78b134 Mon Sep 17 00:00:00 2001 +From d57dfeff220bc423b561e2a9f988d93a720422ff Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Sun, 14 Jul 2019 19:52:47 -0500 Subject: [PATCH] Mending mends most damages equipment first @@ -11,7 +11,7 @@ Subject: [PATCH] Mending mends most damages equipment first 4 files changed, 36 insertions(+), 2 deletions(-) diff --git a/src/main/java/net/minecraft/server/EnchantmentManager.java b/src/main/java/net/minecraft/server/EnchantmentManager.java -index d96c03a1a1..da1cfc1d3f 100644 +index d96c03a1a..da1cfc1d3 100644 --- a/src/main/java/net/minecraft/server/EnchantmentManager.java +++ b/src/main/java/net/minecraft/server/EnchantmentManager.java @@ -246,9 +246,32 @@ public class EnchantmentManager { @@ -49,7 +49,7 @@ index d96c03a1a1..da1cfc1d3f 100644 } @Nullable diff --git a/src/main/java/net/minecraft/server/EntityExperienceOrb.java b/src/main/java/net/minecraft/server/EntityExperienceOrb.java -index 53c6c33892..0fae3693c9 100644 +index 53c6c3389..0fae3693c 100644 --- a/src/main/java/net/minecraft/server/EntityExperienceOrb.java +++ b/src/main/java/net/minecraft/server/EntityExperienceOrb.java @@ -225,7 +225,7 @@ public class EntityExperienceOrb extends Entity { @@ -62,7 +62,7 @@ index 53c6c33892..0fae3693c9 100644 if (entry != null) { ItemStack itemstack = (ItemStack) entry.getValue(); diff --git a/src/main/java/net/minecraft/server/ItemStack.java b/src/main/java/net/minecraft/server/ItemStack.java -index 4730c2beb7..4fe5038083 100644 +index 4730c2beb..4fe503808 100644 --- a/src/main/java/net/minecraft/server/ItemStack.java +++ b/src/main/java/net/minecraft/server/ItemStack.java @@ -369,10 +369,19 @@ public final class ItemStack { @@ -86,7 +86,7 @@ index 4730c2beb7..4fe5038083 100644 return this.tag == null ? 0 : this.tag.getInt("Damage"); } diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -index a723f12a5e..128eaa4acf 100644 +index 3dbcd3f0e..8e6e141dc 100644 --- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java +++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java @@ -127,6 +127,7 @@ public class PurpurWorldConfig { diff --git a/patches/server/0044-Tulips-change-fox-type.patch b/patches/server/0045-Tulips-change-fox-type.patch similarity index 96% rename from patches/server/0044-Tulips-change-fox-type.patch rename to patches/server/0045-Tulips-change-fox-type.patch index e885ba622..13ba36a64 100644 --- a/patches/server/0044-Tulips-change-fox-type.patch +++ b/patches/server/0045-Tulips-change-fox-type.patch @@ -1,4 +1,4 @@ -From f49c1a0afc7778f660356433f1d890396bddb1ce Mon Sep 17 00:00:00 2001 +From dcc9885517dca7260166f656eca7af48df798a95 Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Sat, 13 Jul 2019 15:56:22 -0500 Subject: [PATCH] Tulips change fox type @@ -10,7 +10,7 @@ Subject: [PATCH] Tulips change fox type 3 files changed, 34 insertions(+), 5 deletions(-) diff --git a/src/main/java/net/minecraft/server/EntityFox.java b/src/main/java/net/minecraft/server/EntityFox.java -index 4f53090d3d..13afd7bcde 100644 +index 4f53090d3..13afd7bcd 100644 --- a/src/main/java/net/minecraft/server/EntityFox.java +++ b/src/main/java/net/minecraft/server/EntityFox.java @@ -37,9 +37,9 @@ public class EntityFox extends EntityAnimal { @@ -75,7 +75,7 @@ index 4f53090d3d..13afd7bcde 100644 public void onMount(EntityHuman entityhuman) { super.onMount(entityhuman); diff --git a/src/main/java/net/minecraft/server/Items.java b/src/main/java/net/minecraft/server/Items.java -index 54670f64cf..9c9b93f280 100644 +index 54670f64c..9c9b93f28 100644 --- a/src/main/java/net/minecraft/server/Items.java +++ b/src/main/java/net/minecraft/server/Items.java @@ -106,8 +106,8 @@ public class Items { @@ -90,7 +90,7 @@ index 54670f64cf..9c9b93f280 100644 public static final Item bd = a(Blocks.OXEYE_DAISY, CreativeModeTab.c); public static final Item be = a(Blocks.CORNFLOWER, CreativeModeTab.c); diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -index 128eaa4acf..4685b6a2a3 100644 +index 8e6e141dc..fd3e92560 100644 --- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java +++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java @@ -342,10 +342,12 @@ public class PurpurWorldConfig { diff --git a/patches/server/0045-Implement-a-hard-limit-for-pillager-outpost-spawns.patch b/patches/server/0046-Implement-a-hard-limit-for-pillager-outpost-spawns.patch similarity index 94% rename from patches/server/0045-Implement-a-hard-limit-for-pillager-outpost-spawns.patch rename to patches/server/0046-Implement-a-hard-limit-for-pillager-outpost-spawns.patch index e663f64bc..2779dc94e 100644 --- a/patches/server/0045-Implement-a-hard-limit-for-pillager-outpost-spawns.patch +++ b/patches/server/0046-Implement-a-hard-limit-for-pillager-outpost-spawns.patch @@ -1,4 +1,4 @@ -From 267577cd6fc0399ed8ddaafc5718594c7f32d5a5 Mon Sep 17 00:00:00 2001 +From 1fae90679d926875eeb625ac04e4eb7375b79906 Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Mon, 22 Jul 2019 14:24:26 -0500 Subject: [PATCH] Implement a hard limit for pillager outpost spawns @@ -9,7 +9,7 @@ Subject: [PATCH] Implement a hard limit for pillager outpost spawns 2 files changed, 3 insertions(+) diff --git a/src/main/java/net/minecraft/server/ChunkProviderGenerate.java b/src/main/java/net/minecraft/server/ChunkProviderGenerate.java -index 70f43c5159..baca8f7054 100644 +index 70f43c515..baca8f705 100644 --- a/src/main/java/net/minecraft/server/ChunkProviderGenerate.java +++ b/src/main/java/net/minecraft/server/ChunkProviderGenerate.java @@ -143,6 +143,7 @@ public class ChunkProviderGenerate extends ChunkGeneratorAbstract Date: Thu, 16 Jan 2020 14:59:16 -0600 Subject: [PATCH] Make the GUI better @@ -40,7 +40,7 @@ Subject: [PATCH] Make the GUI better create mode 100644 src/main/java/net/pl3x/purpur/util/HighlightErrorConverter.java diff --git a/src/main/java/net/minecraft/server/DedicatedServer.java b/src/main/java/net/minecraft/server/DedicatedServer.java -index d70c8cab2b..61ccb6079e 100644 +index 8c7156bb5..5337c0be0 100644 --- a/src/main/java/net/minecraft/server/DedicatedServer.java +++ b/src/main/java/net/minecraft/server/DedicatedServer.java @@ -51,7 +51,7 @@ public class DedicatedServer extends MinecraftServer implements IMinecraftServer @@ -52,7 +52,7 @@ index d70c8cab2b..61ccb6079e 100644 // CraftBukkit start - Signature changed public DedicatedServer(joptsimple.OptionSet options, DedicatedServerSettings dedicatedserversettings, DataFixer datafixer, YggdrasilAuthenticationService yggdrasilauthenticationservice, MinecraftSessionService minecraftsessionservice, GameProfileRepository gameprofilerepository, UserCache usercache, WorldLoadListenerFactory worldloadlistenerfactory, String s) { -@@ -420,7 +420,7 @@ public class DedicatedServer extends MinecraftServer implements IMinecraftServer +@@ -421,7 +421,7 @@ public class DedicatedServer extends MinecraftServer implements IMinecraftServer @Override public void exit() { if (this.p != null) { @@ -61,7 +61,7 @@ index d70c8cab2b..61ccb6079e 100644 } if (this.remoteControlListener != null) { -@@ -519,7 +519,7 @@ public class DedicatedServer extends MinecraftServer implements IMinecraftServer +@@ -520,7 +520,7 @@ public class DedicatedServer extends MinecraftServer implements IMinecraftServer public void bc() { if (this.p == null) { @@ -71,10 +71,10 @@ index d70c8cab2b..61ccb6079e 100644 } diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java -index b31a9ac78c..f939f56d96 100644 +index af5dd9f2d..f2a8af48d 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java -@@ -1291,6 +1291,7 @@ public abstract class MinecraftServer extends IAsyncTaskHandlerReentrant Date: Sun, 21 Jul 2019 18:01:46 -0500 Subject: [PATCH] Players should not cram to death @@ -8,10 +8,10 @@ Subject: [PATCH] Players should not cram to death 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/net/minecraft/server/EntityPlayer.java b/src/main/java/net/minecraft/server/EntityPlayer.java -index 1b5140a357..66ac64d1fc 100644 +index bc1d429b1..cbc6f7d58 100644 --- a/src/main/java/net/minecraft/server/EntityPlayer.java +++ b/src/main/java/net/minecraft/server/EntityPlayer.java -@@ -1100,7 +1100,7 @@ public class EntityPlayer extends EntityHuman implements ICrafting { +@@ -1134,7 +1134,7 @@ public class EntityPlayer extends EntityHuman implements ICrafting { @Override public boolean isInvulnerable(DamageSource damagesource) { diff --git a/patches/server/0048-Add-EntityPortalReadyEvent.patch b/patches/server/0049-Add-EntityPortalReadyEvent.patch similarity index 96% rename from patches/server/0048-Add-EntityPortalReadyEvent.patch rename to patches/server/0049-Add-EntityPortalReadyEvent.patch index dc27c9bdb..d6caba81e 100644 --- a/patches/server/0048-Add-EntityPortalReadyEvent.patch +++ b/patches/server/0049-Add-EntityPortalReadyEvent.patch @@ -1,4 +1,4 @@ -From 30f6de2f967a3536824c0ea811a24b3bc0cd22f9 Mon Sep 17 00:00:00 2001 +From e3cc214fd4a87ff6ad0d69f3e6a34ac6bcdec07b Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Sat, 11 Jan 2020 23:12:52 -0600 Subject: [PATCH] Add EntityPortalReadyEvent @@ -11,7 +11,7 @@ Subject: [PATCH] Add EntityPortalReadyEvent 4 files changed, 17 insertions(+), 13 deletions(-) diff --git a/src/main/java/net/minecraft/server/BlockPortal.java b/src/main/java/net/minecraft/server/BlockPortal.java -index 09c7c13183..6880cdd7f9 100644 +index 09c7c1318..6880cdd7f 100644 --- a/src/main/java/net/minecraft/server/BlockPortal.java +++ b/src/main/java/net/minecraft/server/BlockPortal.java @@ -54,6 +54,7 @@ public class BlockPortal extends Block { @@ -86,7 +86,7 @@ index 09c7c13183..6880cdd7f9 100644 break; // CraftBukkit start - add the block to our list diff --git a/src/main/java/net/minecraft/server/Entity.java b/src/main/java/net/minecraft/server/Entity.java -index d38bbf6a4e..3ba936b101 100644 +index 4333ca032..0c0af2dd3 100644 --- a/src/main/java/net/minecraft/server/Entity.java +++ b/src/main/java/net/minecraft/server/Entity.java @@ -168,9 +168,9 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke @@ -102,7 +102,7 @@ index d38bbf6a4e..3ba936b101 100644 private boolean invulnerable; protected UUID uniqueID; protected String am; -@@ -2215,6 +2215,7 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke +@@ -2267,6 +2267,7 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke this.world.getMethodProfiler().enter("portal"); this.ag = i; this.portalCooldown = this.ba(); @@ -111,7 +111,7 @@ index d38bbf6a4e..3ba936b101 100644 if (this instanceof EntityPlayer) { ((EntityPlayer) this).a(this.world.worldProvider.getDimensionManager().getType() == DimensionManager.NETHER ? DimensionManager.OVERWORLD : DimensionManager.NETHER, PlayerTeleportEvent.TeleportCause.NETHER_PORTAL); diff --git a/src/main/java/net/minecraft/server/PortalTravelAgent.java b/src/main/java/net/minecraft/server/PortalTravelAgent.java -index f84dd6d9be..f50e9670bc 100644 +index f84dd6d9b..f50e9670b 100644 --- a/src/main/java/net/minecraft/server/PortalTravelAgent.java +++ b/src/main/java/net/minecraft/server/PortalTravelAgent.java @@ -11,6 +11,7 @@ public class PortalTravelAgent { @@ -141,7 +141,7 @@ index f84dd6d9be..f50e9670bc 100644 } } diff --git a/src/main/java/net/minecraft/server/WorldServer.java b/src/main/java/net/minecraft/server/WorldServer.java -index 567b297e05..456c835c87 100644 +index 37b5a1193..2b4f2fbae 100644 --- a/src/main/java/net/minecraft/server/WorldServer.java +++ b/src/main/java/net/minecraft/server/WorldServer.java @@ -65,7 +65,7 @@ public class WorldServer extends World { diff --git a/patches/server/0049-Implement-elytra-settings.patch b/patches/server/0050-Implement-elytra-settings.patch similarity index 96% rename from patches/server/0049-Implement-elytra-settings.patch rename to patches/server/0050-Implement-elytra-settings.patch index 864d4af7f..3687307c6 100644 --- a/patches/server/0049-Implement-elytra-settings.patch +++ b/patches/server/0050-Implement-elytra-settings.patch @@ -1,4 +1,4 @@ -From 00bdc0552b6bf5cdeb9b8f5a215c231b9807b701 Mon Sep 17 00:00:00 2001 +From 68290a5eb64583ce63b208aa47e55f044b6a2c00 Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Thu, 25 Jul 2019 18:07:37 -0500 Subject: [PATCH] Implement elytra settings @@ -13,7 +13,7 @@ Subject: [PATCH] Implement elytra settings 6 files changed, 49 insertions(+), 4 deletions(-) diff --git a/src/main/java/net/minecraft/server/EntityLiving.java b/src/main/java/net/minecraft/server/EntityLiving.java -index 76a925f7aa..d64e026288 100644 +index 76a925f7a..d64e02628 100644 --- a/src/main/java/net/minecraft/server/EntityLiving.java +++ b/src/main/java/net/minecraft/server/EntityLiving.java @@ -2645,9 +2645,16 @@ public abstract class EntityLiving extends Entity { @@ -37,7 +37,7 @@ index 76a925f7aa..d64e026288 100644 } else { flag = false; diff --git a/src/main/java/net/minecraft/server/ItemFireworks.java b/src/main/java/net/minecraft/server/ItemFireworks.java -index bd524a35bb..c0e8cd0cdc 100644 +index bd524a35b..c0e8cd0cd 100644 --- a/src/main/java/net/minecraft/server/ItemFireworks.java +++ b/src/main/java/net/minecraft/server/ItemFireworks.java @@ -39,6 +39,14 @@ public class ItemFireworks extends Item { @@ -56,7 +56,7 @@ index bd524a35bb..c0e8cd0cdc 100644 itemstack.subtract(1); } else ((EntityPlayer) entityhuman).getBukkitEntity().updateInventory(); diff --git a/src/main/java/net/minecraft/server/ItemStack.java b/src/main/java/net/minecraft/server/ItemStack.java -index 4fe5038083..7b7a0a7cb1 100644 +index 4fe503808..7b7a0a7cb 100644 --- a/src/main/java/net/minecraft/server/ItemStack.java +++ b/src/main/java/net/minecraft/server/ItemStack.java @@ -401,7 +401,7 @@ public final class ItemStack { @@ -82,7 +82,7 @@ index 4fe5038083..7b7a0a7cb1 100644 if (this.count == 1 && t0 instanceof EntityHuman) { org.bukkit.craftbukkit.event.CraftEventFactory.callPlayerItemBreakEvent((EntityHuman) t0, this); diff --git a/src/main/java/net/minecraft/server/ItemTrident.java b/src/main/java/net/minecraft/server/ItemTrident.java -index f571a1586d..c26300eacd 100644 +index f571a1586..c26300eac 100644 --- a/src/main/java/net/minecraft/server/ItemTrident.java +++ b/src/main/java/net/minecraft/server/ItemTrident.java @@ -100,6 +100,16 @@ public class ItemTrident extends Item { @@ -103,7 +103,7 @@ index f571a1586d..c26300eacd 100644 entityhuman.r(20); if (entityhuman.onGround) { diff --git a/src/main/java/net/minecraft/server/Vec3D.java b/src/main/java/net/minecraft/server/Vec3D.java -index 212af252be..fbc30e6ece 100644 +index 212af252b..fbc30e6ec 100644 --- a/src/main/java/net/minecraft/server/Vec3D.java +++ b/src/main/java/net/minecraft/server/Vec3D.java @@ -98,6 +98,7 @@ public class Vec3D implements IPosition { @@ -115,7 +115,7 @@ index 212af252be..fbc30e6ece 100644 return this.x * this.x + this.y * this.y + this.z * this.z; } diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -index c957c1cca9..ee60773313 100644 +index 3a44e6e44..7cfc757db 100644 --- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java +++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java @@ -151,6 +151,19 @@ public class PurpurWorldConfig { diff --git a/patches/server/0050-Add-tick-times-API.patch b/patches/server/0051-Add-tick-times-API.patch similarity index 92% rename from patches/server/0050-Add-tick-times-API.patch rename to patches/server/0051-Add-tick-times-API.patch index e18de650f..ad2d51276 100644 --- a/patches/server/0050-Add-tick-times-API.patch +++ b/patches/server/0051-Add-tick-times-API.patch @@ -1,4 +1,4 @@ -From 908ee9bfb75cd649b85e73df73211c38a4d86265 Mon Sep 17 00:00:00 2001 +From 004331f50a3cc77a2d50470add031656636aa32b Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Thu, 30 Jan 2020 00:41:24 -0600 Subject: [PATCH] Add tick times API @@ -9,10 +9,10 @@ Subject: [PATCH] Add tick times API 2 files changed, 28 insertions(+) diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -index df4fb5947a..206fd848ad 100644 +index b64413084..85c7fc177 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -@@ -2197,4 +2197,21 @@ public final class CraftServer implements Server { +@@ -2202,4 +2202,21 @@ public final class CraftServer implements Server { return net.minecraft.server.MinecraftServer.currentTick; } // Paper end @@ -35,7 +35,7 @@ index df4fb5947a..206fd848ad 100644 + // Purpur end } diff --git a/src/main/java/org/spigotmc/TicksPerSecondCommand.java b/src/main/java/org/spigotmc/TicksPerSecondCommand.java -index 6d21c32692..b889c32a1a 100644 +index 6d21c3269..b889c32a1 100644 --- a/src/main/java/org/spigotmc/TicksPerSecondCommand.java +++ b/src/main/java/org/spigotmc/TicksPerSecondCommand.java @@ -6,6 +6,7 @@ import org.bukkit.command.CommandSender; diff --git a/patches/server/0051-Add-blacklist-option-for-grindstone.patch b/patches/server/0052-Add-blacklist-option-for-grindstone.patch similarity index 96% rename from patches/server/0051-Add-blacklist-option-for-grindstone.patch rename to patches/server/0052-Add-blacklist-option-for-grindstone.patch index a2d972f48..b844d844d 100644 --- a/patches/server/0051-Add-blacklist-option-for-grindstone.patch +++ b/patches/server/0052-Add-blacklist-option-for-grindstone.patch @@ -1,4 +1,4 @@ -From 40a523b50e42446858954931c6dadf1e4067931e Mon Sep 17 00:00:00 2001 +From 95d6bded04a9fdf673641171cccb6fd814628094 Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Thu, 1 Aug 2019 19:15:12 -0500 Subject: [PATCH] Add blacklist option for grindstone @@ -10,7 +10,7 @@ Subject: [PATCH] Add blacklist option for grindstone 3 files changed, 35 insertions(+) diff --git a/src/main/java/net/minecraft/server/ContainerGrindstone.java b/src/main/java/net/minecraft/server/ContainerGrindstone.java -index ed88e208d0..fcfb4abdc2 100644 +index ed88e208d..fcfb4abdc 100644 --- a/src/main/java/net/minecraft/server/ContainerGrindstone.java +++ b/src/main/java/net/minecraft/server/ContainerGrindstone.java @@ -57,12 +57,24 @@ public class ContainerGrindstone extends Container { @@ -51,7 +51,7 @@ index ed88e208d0..fcfb4abdc2 100644 Map map = EnchantmentManager.a(itemstack); Iterator iterator = map.entrySet().iterator(); diff --git a/src/main/java/net/minecraft/server/ItemStack.java b/src/main/java/net/minecraft/server/ItemStack.java -index 7b7a0a7cb1..6b45bc17cf 100644 +index 7b7a0a7cb..6b45bc17c 100644 --- a/src/main/java/net/minecraft/server/ItemStack.java +++ b/src/main/java/net/minecraft/server/ItemStack.java @@ -541,6 +541,12 @@ public final class ItemStack { @@ -68,7 +68,7 @@ index 7b7a0a7cb1..6b45bc17cf 100644 return this.getItem().f(this); } diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -index ee60773313..424e48110c 100644 +index 7cfc757db..2795957dc 100644 --- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java +++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java @@ -8,6 +8,7 @@ import net.minecraft.server.MinecraftKey; diff --git a/patches/server/0052-Implement-lagging-threshold.patch b/patches/server/0053-Implement-lagging-threshold.patch similarity index 92% rename from patches/server/0052-Implement-lagging-threshold.patch rename to patches/server/0053-Implement-lagging-threshold.patch index 30611b874..f591c4453 100644 --- a/patches/server/0052-Implement-lagging-threshold.patch +++ b/patches/server/0053-Implement-lagging-threshold.patch @@ -1,4 +1,4 @@ -From 74c2f29ddf70e71277aa95135e589402b348c8f8 Mon Sep 17 00:00:00 2001 +From 0233b14a5cb692e047870000eaba4701e309d311 Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Tue, 23 Jul 2019 10:07:16 -0500 Subject: [PATCH] Implement lagging threshold @@ -10,7 +10,7 @@ Subject: [PATCH] Implement lagging threshold 3 files changed, 12 insertions(+) diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java -index f939f56d96..c16e1ae9d8 100644 +index f2a8af48d..625227f07 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java @@ -178,6 +178,7 @@ public abstract class MinecraftServer extends IAsyncTaskHandlerReentrant Date: Tue, 23 Jul 2019 08:28:21 -0500 Subject: [PATCH] Implement configurable villager brain ticks @@ -9,7 +9,7 @@ Subject: [PATCH] Implement configurable villager brain ticks 2 files changed, 10 insertions(+) diff --git a/src/main/java/net/minecraft/server/EntityVillager.java b/src/main/java/net/minecraft/server/EntityVillager.java -index 3eaac031fb..65cd5f53c1 100644 +index 3eaac031f..65cd5f53c 100644 --- a/src/main/java/net/minecraft/server/EntityVillager.java +++ b/src/main/java/net/minecraft/server/EntityVillager.java @@ -53,6 +53,7 @@ public class EntityVillager extends EntityVillagerAbstract implements Reputation @@ -40,7 +40,7 @@ index 3eaac031fb..65cd5f53c1 100644 this.world.getMethodProfiler().exit(); if (!this.et() && this.bB > 0) { diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -index 2795957dce..28dfefc0e1 100644 +index 2795957dc..28dfefc0e 100644 --- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java +++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java @@ -736,10 +736,14 @@ public class PurpurWorldConfig { diff --git a/patches/server/0054-Add-option-for-zombies-targetting-turtle-eggs.patch b/patches/server/0055-Add-option-for-zombies-targetting-turtle-eggs.patch similarity index 94% rename from patches/server/0054-Add-option-for-zombies-targetting-turtle-eggs.patch rename to patches/server/0055-Add-option-for-zombies-targetting-turtle-eggs.patch index 313c6407d..9441ec44d 100644 --- a/patches/server/0054-Add-option-for-zombies-targetting-turtle-eggs.patch +++ b/patches/server/0055-Add-option-for-zombies-targetting-turtle-eggs.patch @@ -1,4 +1,4 @@ -From 7891bd01bbfcefa04cabdbb1ccde85a889dc510e Mon Sep 17 00:00:00 2001 +From b107a2d8a0ff726f04d303e60fd8349fe9764c3d Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Sat, 17 Aug 2019 15:27:09 -0500 Subject: [PATCH] Add option for zombies targetting turtle eggs @@ -9,7 +9,7 @@ Subject: [PATCH] Add option for zombies targetting turtle eggs 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/net/minecraft/server/EntityZombie.java b/src/main/java/net/minecraft/server/EntityZombie.java -index e9e2be88e3..1e60cc399b 100644 +index e9e2be88e..1e60cc399 100644 --- a/src/main/java/net/minecraft/server/EntityZombie.java +++ b/src/main/java/net/minecraft/server/EntityZombie.java @@ -64,7 +64,7 @@ public class EntityZombie extends EntityMonster { @@ -22,7 +22,7 @@ index e9e2be88e3..1e60cc399b 100644 this.goalSelector.a(8, new PathfinderGoalRandomLookaround(this)); this.targetSelector.a(0, new net.pl3x.purpur.pathfinder.PathfinderGoalHasRider(this)); // Purpur diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -index 28dfefc0e1..666de04a8f 100644 +index 28dfefc0e..666de04a8 100644 --- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java +++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java @@ -805,10 +805,12 @@ public class PurpurWorldConfig { diff --git a/patches/server/0055-Implement-bamboo-growth-settings.patch b/patches/server/0056-Implement-bamboo-growth-settings.patch similarity index 97% rename from patches/server/0055-Implement-bamboo-growth-settings.patch rename to patches/server/0056-Implement-bamboo-growth-settings.patch index a5b52744d..34daa357e 100644 --- a/patches/server/0055-Implement-bamboo-growth-settings.patch +++ b/patches/server/0056-Implement-bamboo-growth-settings.patch @@ -1,4 +1,4 @@ -From 08b73e31c94a441370f090bf3c6c9269147ef8fd Mon Sep 17 00:00:00 2001 +From bd8c20ce4a44d00b799343ec8485e487536f8978 Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Fri, 23 Aug 2019 20:57:29 -0500 Subject: [PATCH] Implement bamboo growth settings @@ -9,7 +9,7 @@ Subject: [PATCH] Implement bamboo growth settings 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/src/main/java/net/minecraft/server/BlockBamboo.java b/src/main/java/net/minecraft/server/BlockBamboo.java -index 02c548dd9c..016ceebb9d 100644 +index 02c548dd9..016ceebb9 100644 --- a/src/main/java/net/minecraft/server/BlockBamboo.java +++ b/src/main/java/net/minecraft/server/BlockBamboo.java @@ -10,7 +10,7 @@ public class BlockBamboo extends Block implements IBlockFragilePlantElement { @@ -76,7 +76,7 @@ index 02c548dd9c..016ceebb9d 100644 } diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -index 21f5ecd31c..d39fc8d5d6 100644 +index 666de04a8..814ff5935 100644 --- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java +++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java @@ -72,6 +72,13 @@ public class PurpurWorldConfig { diff --git a/patches/server/0056-Ladders-should-not-bypass-cramming-gamerule.patch b/patches/server/0057-Ladders-should-not-bypass-cramming-gamerule.patch similarity index 94% rename from patches/server/0056-Ladders-should-not-bypass-cramming-gamerule.patch rename to patches/server/0057-Ladders-should-not-bypass-cramming-gamerule.patch index 6d8858c10..255e774d7 100644 --- a/patches/server/0056-Ladders-should-not-bypass-cramming-gamerule.patch +++ b/patches/server/0057-Ladders-should-not-bypass-cramming-gamerule.patch @@ -1,4 +1,4 @@ -From b5d7052ab123bc6abae003ba91ccced2db9cdf8d Mon Sep 17 00:00:00 2001 +From 0b1c3f64cab2b1d30e0413e92d74ab61fde82074 Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Sun, 21 Jul 2019 18:06:20 -0500 Subject: [PATCH] Ladders should not bypass cramming gamerule @@ -17,10 +17,10 @@ Subject: [PATCH] Ladders should not bypass cramming gamerule 10 files changed, 25 insertions(+), 9 deletions(-) diff --git a/src/main/java/net/minecraft/server/Entity.java b/src/main/java/net/minecraft/server/Entity.java -index 3ba936b101..e6575076dd 100644 +index 0c0af2dd3..147e30aa2 100644 --- a/src/main/java/net/minecraft/server/Entity.java +++ b/src/main/java/net/minecraft/server/Entity.java -@@ -1509,6 +1509,12 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke +@@ -1561,6 +1561,12 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke } public boolean isCollidable() { @@ -34,7 +34,7 @@ index 3ba936b101..e6575076dd 100644 } diff --git a/src/main/java/net/minecraft/server/EntityArmorStand.java b/src/main/java/net/minecraft/server/EntityArmorStand.java -index 8ad131e4fc..dfe8c57cef 100644 +index 8ad131e4f..dfe8c57ce 100644 --- a/src/main/java/net/minecraft/server/EntityArmorStand.java +++ b/src/main/java/net/minecraft/server/EntityArmorStand.java @@ -318,7 +318,7 @@ public class EntityArmorStand extends EntityLiving { @@ -47,7 +47,7 @@ index 8ad131e4fc..dfe8c57cef 100644 } diff --git a/src/main/java/net/minecraft/server/EntityBat.java b/src/main/java/net/minecraft/server/EntityBat.java -index dfc2ce9729..440c21355c 100644 +index dfc2ce972..440c21355 100644 --- a/src/main/java/net/minecraft/server/EntityBat.java +++ b/src/main/java/net/minecraft/server/EntityBat.java @@ -85,7 +85,7 @@ public class EntityBat extends EntityAmbient { @@ -60,7 +60,7 @@ index dfc2ce9729..440c21355c 100644 } diff --git a/src/main/java/net/minecraft/server/EntityBoat.java b/src/main/java/net/minecraft/server/EntityBoat.java -index fdf306e80a..563fc8ced0 100644 +index fdf306e80..563fc8ced 100644 --- a/src/main/java/net/minecraft/server/EntityBoat.java +++ b/src/main/java/net/minecraft/server/EntityBoat.java @@ -98,7 +98,7 @@ public class EntityBoat extends Entity { @@ -73,7 +73,7 @@ index fdf306e80a..563fc8ced0 100644 } diff --git a/src/main/java/net/minecraft/server/EntityHorseAbstract.java b/src/main/java/net/minecraft/server/EntityHorseAbstract.java -index e7ba83f32a..55e18e4c7a 100644 +index e7ba83f32..55e18e4c7 100644 --- a/src/main/java/net/minecraft/server/EntityHorseAbstract.java +++ b/src/main/java/net/minecraft/server/EntityHorseAbstract.java @@ -188,7 +188,7 @@ public abstract class EntityHorseAbstract extends EntityAnimal implements IInven @@ -86,7 +86,7 @@ index e7ba83f32a..55e18e4c7a 100644 } diff --git a/src/main/java/net/minecraft/server/EntityLiving.java b/src/main/java/net/minecraft/server/EntityLiving.java -index d64e026288..cd45260396 100644 +index d64e02628..cd4526039 100644 --- a/src/main/java/net/minecraft/server/EntityLiving.java +++ b/src/main/java/net/minecraft/server/EntityLiving.java @@ -2673,7 +2673,7 @@ public abstract class EntityLiving extends Entity { @@ -112,7 +112,7 @@ index d64e026288..cd45260396 100644 @Override diff --git a/src/main/java/net/minecraft/server/EntityMinecartAbstract.java b/src/main/java/net/minecraft/server/EntityMinecartAbstract.java -index 1f3e5bd288..ae4758f251 100644 +index 1f3e5bd28..ae4758f25 100644 --- a/src/main/java/net/minecraft/server/EntityMinecartAbstract.java +++ b/src/main/java/net/minecraft/server/EntityMinecartAbstract.java @@ -105,7 +105,7 @@ public abstract class EntityMinecartAbstract extends Entity { @@ -125,7 +125,7 @@ index 1f3e5bd288..ae4758f251 100644 } diff --git a/src/main/java/net/minecraft/server/EntityParrot.java b/src/main/java/net/minecraft/server/EntityParrot.java -index 7ba2f3a351..dd2cd7b219 100644 +index 7ba2f3a35..dd2cd7b21 100644 --- a/src/main/java/net/minecraft/server/EntityParrot.java +++ b/src/main/java/net/minecraft/server/EntityParrot.java @@ -392,7 +392,7 @@ public class EntityParrot extends EntityPerchable implements EntityBird { @@ -138,7 +138,7 @@ index 7ba2f3a351..dd2cd7b219 100644 } diff --git a/src/main/java/net/minecraft/server/IEntitySelector.java b/src/main/java/net/minecraft/server/IEntitySelector.java -index 4665671ef6..037f14e010 100644 +index 4665671ef..037f14e01 100644 --- a/src/main/java/net/minecraft/server/IEntitySelector.java +++ b/src/main/java/net/minecraft/server/IEntitySelector.java @@ -36,6 +36,12 @@ public final class IEntitySelector { @@ -155,7 +155,7 @@ index 4665671ef6..037f14e010 100644 ScoreboardTeamBase.EnumTeamPush scoreboardteambase_enumteampush = scoreboardteambase == null ? ScoreboardTeamBase.EnumTeamPush.ALWAYS : scoreboardteambase.getCollisionRule(); diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -index 814ff59352..9319c3b74b 100644 +index 814ff5935..9319c3b74 100644 --- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java +++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java @@ -145,6 +145,7 @@ public class PurpurWorldConfig { diff --git a/patches/server/0057-Option-for-slimes-not-pushable.patch b/patches/server/0058-Option-for-slimes-not-pushable.patch similarity index 94% rename from patches/server/0057-Option-for-slimes-not-pushable.patch rename to patches/server/0058-Option-for-slimes-not-pushable.patch index adcc7f2e7..304a5895d 100644 --- a/patches/server/0057-Option-for-slimes-not-pushable.patch +++ b/patches/server/0058-Option-for-slimes-not-pushable.patch @@ -1,4 +1,4 @@ -From e03f5100d573368bdeba6c40edb2d7fad720aba8 Mon Sep 17 00:00:00 2001 +From 894c6ad002780f2aff249b709dccbdd389d528c4 Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Fri, 23 Aug 2019 21:56:31 -0500 Subject: [PATCH] Option for slimes not pushable @@ -10,7 +10,7 @@ Subject: [PATCH] Option for slimes not pushable 3 files changed, 22 insertions(+) diff --git a/src/main/java/net/minecraft/server/BlockPiston.java b/src/main/java/net/minecraft/server/BlockPiston.java -index b29525c40d..1e72b3bbc5 100644 +index b29525c40..1e72b3bbc 100644 --- a/src/main/java/net/minecraft/server/BlockPiston.java +++ b/src/main/java/net/minecraft/server/BlockPiston.java @@ -332,6 +332,16 @@ public class BlockPiston extends BlockDirectional { @@ -31,7 +31,7 @@ index b29525c40d..1e72b3bbc5 100644 if (event.isCancelled()) { diff --git a/src/main/java/net/minecraft/server/BlockSlime.java b/src/main/java/net/minecraft/server/BlockSlime.java -index 01f32659d9..52ab86f0b1 100644 +index 01f32659d..52ab86f0b 100644 --- a/src/main/java/net/minecraft/server/BlockSlime.java +++ b/src/main/java/net/minecraft/server/BlockSlime.java @@ -49,4 +49,11 @@ public class BlockSlime extends BlockHalfTransparent { @@ -47,7 +47,7 @@ index 01f32659d9..52ab86f0b1 100644 + // Purpur end } diff --git a/src/main/java/net/pl3x/purpur/PurpurConfig.java b/src/main/java/net/pl3x/purpur/PurpurConfig.java -index 2537a5add3..7be2e01814 100644 +index 2537a5add..7be2e0181 100644 --- a/src/main/java/net/pl3x/purpur/PurpurConfig.java +++ b/src/main/java/net/pl3x/purpur/PurpurConfig.java @@ -166,6 +166,11 @@ public class PurpurConfig { diff --git a/patches/server/0058-Bring-back-server-name.patch b/patches/server/0059-Bring-back-server-name.patch similarity index 89% rename from patches/server/0058-Bring-back-server-name.patch rename to patches/server/0059-Bring-back-server-name.patch index 9cafc8c24..283cfde0f 100644 --- a/patches/server/0058-Bring-back-server-name.patch +++ b/patches/server/0059-Bring-back-server-name.patch @@ -1,4 +1,4 @@ -From 38b419067964c8cb3dfe698e5ad0d863db601e2b Mon Sep 17 00:00:00 2001 +From e8b75fc5bfd3619380d62b876fc5c8da828f37ba Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Sun, 26 May 2019 15:19:14 -0500 Subject: [PATCH] Bring back server name @@ -9,7 +9,7 @@ Subject: [PATCH] Bring back server name 2 files changed, 6 insertions(+) diff --git a/src/main/java/net/minecraft/server/DedicatedServerProperties.java b/src/main/java/net/minecraft/server/DedicatedServerProperties.java -index 0c3ec83570..309f5562b8 100644 +index 0c3ec8357..309f5562b 100644 --- a/src/main/java/net/minecraft/server/DedicatedServerProperties.java +++ b/src/main/java/net/minecraft/server/DedicatedServerProperties.java @@ -10,6 +10,7 @@ public class DedicatedServerProperties extends PropertyManager Date: Sun, 25 Aug 2019 00:09:52 -0500 Subject: [PATCH] Dispenser curse of binding protection @@ -10,10 +10,10 @@ Subject: [PATCH] Dispenser curse of binding protection 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/src/main/java/net/minecraft/server/EntityInsentient.java b/src/main/java/net/minecraft/server/EntityInsentient.java -index 00cbd99914..66b4831949 100644 +index 3ef4f8db4..742745cb4 100644 --- a/src/main/java/net/minecraft/server/EntityInsentient.java +++ b/src/main/java/net/minecraft/server/EntityInsentient.java -@@ -913,6 +913,13 @@ public abstract class EntityInsentient extends EntityLiving { +@@ -920,6 +920,13 @@ public abstract class EntityInsentient extends EntityLiving { } @@ -28,7 +28,7 @@ index 00cbd99914..66b4831949 100644 Item item = itemstack.getItem(); diff --git a/src/main/java/net/minecraft/server/ItemArmor.java b/src/main/java/net/minecraft/server/ItemArmor.java -index df8c42bfbd..a4b3d0c298 100644 +index df8c42bfb..a4b3d0c29 100644 --- a/src/main/java/net/minecraft/server/ItemArmor.java +++ b/src/main/java/net/minecraft/server/ItemArmor.java @@ -31,7 +31,7 @@ public class ItemArmor extends Item { @@ -49,7 +49,7 @@ index df8c42bfbd..a4b3d0c298 100644 return this.b; } diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -index cfe3db96c1..4c74b6c3fd 100644 +index 9319c3b74..1637f66ae 100644 --- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java +++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java @@ -106,6 +106,11 @@ public class PurpurWorldConfig { diff --git a/patches/server/0060-Implement-LivingEntity-safeFallDistance.patch b/patches/server/0061-Implement-LivingEntity-safeFallDistance.patch similarity index 94% rename from patches/server/0060-Implement-LivingEntity-safeFallDistance.patch rename to patches/server/0061-Implement-LivingEntity-safeFallDistance.patch index e8440238c..0e91d79f7 100644 --- a/patches/server/0060-Implement-LivingEntity-safeFallDistance.patch +++ b/patches/server/0061-Implement-LivingEntity-safeFallDistance.patch @@ -1,4 +1,4 @@ -From f265f5fcbd3be4d54f36a83d6dee335b46c00eab Mon Sep 17 00:00:00 2001 +From 562293d312599c5bbfd434145d14f3059b8ded9e Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Sun, 5 May 2019 12:58:45 -0500 Subject: [PATCH] Implement LivingEntity safeFallDistance @@ -11,7 +11,7 @@ Subject: [PATCH] Implement LivingEntity safeFallDistance 4 files changed, 18 insertions(+), 2 deletions(-) diff --git a/src/main/java/net/minecraft/server/EntityGiantZombie.java b/src/main/java/net/minecraft/server/EntityGiantZombie.java -index d132a6105f..0b200c7253 100644 +index 4296aaa07..a2e3e6001 100644 --- a/src/main/java/net/minecraft/server/EntityGiantZombie.java +++ b/src/main/java/net/minecraft/server/EntityGiantZombie.java @@ -5,6 +5,9 @@ public class EntityGiantZombie extends EntityMonster { @@ -25,7 +25,7 @@ index d132a6105f..0b200c7253 100644 // Purpur start diff --git a/src/main/java/net/minecraft/server/EntityHorseAbstract.java b/src/main/java/net/minecraft/server/EntityHorseAbstract.java -index 55e18e4c7a..b14f67b3a3 100644 +index 55e18e4c7..b14f67b3a 100644 --- a/src/main/java/net/minecraft/server/EntityHorseAbstract.java +++ b/src/main/java/net/minecraft/server/EntityHorseAbstract.java @@ -229,7 +229,7 @@ public abstract class EntityHorseAbstract extends EntityAnimal implements IInven @@ -38,7 +38,7 @@ index 55e18e4c7a..b14f67b3a3 100644 protected int getChestSlots() { diff --git a/src/main/java/net/minecraft/server/EntityLiving.java b/src/main/java/net/minecraft/server/EntityLiving.java -index cd45260396..60e2b4268c 100644 +index cd4526039..60e2b4268 100644 --- a/src/main/java/net/minecraft/server/EntityLiving.java +++ b/src/main/java/net/minecraft/server/EntityLiving.java @@ -125,6 +125,7 @@ public abstract class EntityLiving extends Entity { @@ -59,7 +59,7 @@ index cd45260396..60e2b4268c 100644 protected void cZ() { diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java -index 8ffa3cb059..3dd0faea79 100644 +index 8ffa3cb05..3dd0faea7 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java @@ -739,4 +739,16 @@ public class CraftLivingEntity extends CraftEntity implements LivingEntity { diff --git a/patches/server/0061-Add-option-for-boats-to-eject-players-on-land.patch b/patches/server/0062-Add-option-for-boats-to-eject-players-on-land.patch similarity index 94% rename from patches/server/0061-Add-option-for-boats-to-eject-players-on-land.patch rename to patches/server/0062-Add-option-for-boats-to-eject-players-on-land.patch index 079294994..22cec634f 100644 --- a/patches/server/0061-Add-option-for-boats-to-eject-players-on-land.patch +++ b/patches/server/0062-Add-option-for-boats-to-eject-players-on-land.patch @@ -1,4 +1,4 @@ -From 4fca9e137ea82930246d81634213f0e00c208986 Mon Sep 17 00:00:00 2001 +From 44b0e303a2e619c3302ecc4b39bfb40982b5b678 Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Sat, 7 Sep 2019 22:47:59 -0500 Subject: [PATCH] Add option for boats to eject players on land @@ -9,7 +9,7 @@ Subject: [PATCH] Add option for boats to eject players on land 2 files changed, 3 insertions(+) diff --git a/src/main/java/net/minecraft/server/EntityBoat.java b/src/main/java/net/minecraft/server/EntityBoat.java -index 563fc8ced0..479ed7c7bc 100644 +index 563fc8ced..479ed7c7b 100644 --- a/src/main/java/net/minecraft/server/EntityBoat.java +++ b/src/main/java/net/minecraft/server/EntityBoat.java @@ -431,6 +431,7 @@ public class EntityBoat extends Entity { @@ -21,7 +21,7 @@ index 563fc8ced0..479ed7c7bc 100644 } else { return EntityBoat.EnumStatus.IN_AIR; diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -index 4c74b6c3fd..43591dfe34 100644 +index 1637f66ae..028a169cb 100644 --- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java +++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java @@ -143,6 +143,7 @@ public class PurpurWorldConfig { diff --git a/patches/server/0062-Advancement-API-Additions.patch b/patches/server/0063-Advancement-API-Additions.patch similarity index 96% rename from patches/server/0062-Advancement-API-Additions.patch rename to patches/server/0063-Advancement-API-Additions.patch index 67609b5f4..bcf7ea033 100644 --- a/patches/server/0062-Advancement-API-Additions.patch +++ b/patches/server/0063-Advancement-API-Additions.patch @@ -1,4 +1,4 @@ -From a397b58fa02a7d6e42dd83a330361c130dec1acd Mon Sep 17 00:00:00 2001 +From bd3f839e3d15c467397c5cf3e4ae3eecee89b9ed Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Fri, 31 May 2019 21:24:33 -0500 Subject: [PATCH] Advancement API Additions @@ -14,7 +14,7 @@ Subject: [PATCH] Advancement API Additions create mode 100644 src/main/java/org/bukkit/craftbukkit/advancement/CraftAdvancementDisplay.java diff --git a/src/main/java/net/minecraft/server/Advancement.java b/src/main/java/net/minecraft/server/Advancement.java -index 4b85551faf..4cba4187a0 100644 +index 4b85551fa..4cba4187a 100644 --- a/src/main/java/net/minecraft/server/Advancement.java +++ b/src/main/java/net/minecraft/server/Advancement.java @@ -65,7 +65,7 @@ public class Advancement { @@ -27,7 +27,7 @@ index 4b85551faf..4cba4187a0 100644 } diff --git a/src/main/java/net/minecraft/server/AdvancementDisplay.java b/src/main/java/net/minecraft/server/AdvancementDisplay.java -index e8172d56fe..976c85ef1b 100644 +index e8172d56f..976c85ef1 100644 --- a/src/main/java/net/minecraft/server/AdvancementDisplay.java +++ b/src/main/java/net/minecraft/server/AdvancementDisplay.java @@ -16,10 +16,11 @@ public class AdvancementDisplay { @@ -75,7 +75,7 @@ index e8172d56fe..976c85ef1b 100644 return this.h; } diff --git a/src/main/java/net/minecraft/server/AdvancementFrameType.java b/src/main/java/net/minecraft/server/AdvancementFrameType.java -index a9c49a4348..551a845476 100644 +index a9c49a434..551a84547 100644 --- a/src/main/java/net/minecraft/server/AdvancementFrameType.java +++ b/src/main/java/net/minecraft/server/AdvancementFrameType.java @@ -1,14 +1,25 @@ @@ -107,7 +107,7 @@ index a9c49a4348..551a845476 100644 this.e = i; this.f = enumchatformat; diff --git a/src/main/java/net/minecraft/server/CriterionTrigger.java b/src/main/java/net/minecraft/server/CriterionTrigger.java -index 4fe7324475..6e5d81daf1 100644 +index 4fe732447..6e5d81daf 100644 --- a/src/main/java/net/minecraft/server/CriterionTrigger.java +++ b/src/main/java/net/minecraft/server/CriterionTrigger.java @@ -27,6 +27,7 @@ public interface CriterionTrigger { @@ -119,7 +119,7 @@ index 4fe7324475..6e5d81daf1 100644 return this.a; } diff --git a/src/main/java/org/bukkit/craftbukkit/advancement/CraftAdvancement.java b/src/main/java/org/bukkit/craftbukkit/advancement/CraftAdvancement.java -index a5aadf2850..b0a7092d62 100644 +index a5aadf285..b0a7092d6 100644 --- a/src/main/java/org/bukkit/craftbukkit/advancement/CraftAdvancement.java +++ b/src/main/java/org/bukkit/craftbukkit/advancement/CraftAdvancement.java @@ -27,4 +27,11 @@ public class CraftAdvancement implements org.bukkit.advancement.Advancement { @@ -136,7 +136,7 @@ index a5aadf2850..b0a7092d62 100644 } diff --git a/src/main/java/org/bukkit/craftbukkit/advancement/CraftAdvancementDisplay.java b/src/main/java/org/bukkit/craftbukkit/advancement/CraftAdvancementDisplay.java new file mode 100644 -index 0000000000..1cbb1e67b6 +index 000000000..1cbb1e67b --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/advancement/CraftAdvancementDisplay.java @@ -0,0 +1,47 @@ diff --git a/patches/server/0063-Add-option-to-set-armorstand-step-height.patch b/patches/server/0064-Add-option-to-set-armorstand-step-height.patch similarity index 95% rename from patches/server/0063-Add-option-to-set-armorstand-step-height.patch rename to patches/server/0064-Add-option-to-set-armorstand-step-height.patch index b23a75c7c..7d330215e 100644 --- a/patches/server/0063-Add-option-to-set-armorstand-step-height.patch +++ b/patches/server/0064-Add-option-to-set-armorstand-step-height.patch @@ -1,4 +1,4 @@ -From fc311d45a83de90aeded3dd043860a677587538a Mon Sep 17 00:00:00 2001 +From ba6ccc8a8825ea4bdf169eb9ec8ff4d0a8b372a5 Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Sun, 6 Oct 2019 12:46:35 -0500 Subject: [PATCH] Add option to set armorstand step height @@ -9,7 +9,7 @@ Subject: [PATCH] Add option to set armorstand step height 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/net/minecraft/server/EntityArmorStand.java b/src/main/java/net/minecraft/server/EntityArmorStand.java -index dfe8c57cef..0f6870a45c 100644 +index dfe8c57ce..0f6870a45 100644 --- a/src/main/java/net/minecraft/server/EntityArmorStand.java +++ b/src/main/java/net/minecraft/server/EntityArmorStand.java @@ -62,7 +62,6 @@ public class EntityArmorStand extends EntityLiving { @@ -29,7 +29,7 @@ index dfe8c57cef..0f6870a45c 100644 if (!this.canTick) { if (this.noTickPoseDirty) { diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -index 43591dfe34..a8e59d3372 100644 +index 028a169cb..9c21d196e 100644 --- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java +++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java @@ -143,6 +143,7 @@ public class PurpurWorldConfig { diff --git a/patches/server/0064-Implement-ItemFactory-getMonsterEgg.patch b/patches/server/0065-Implement-ItemFactory-getMonsterEgg.patch similarity index 94% rename from patches/server/0064-Implement-ItemFactory-getMonsterEgg.patch rename to patches/server/0065-Implement-ItemFactory-getMonsterEgg.patch index 8991e5b88..595b45d77 100644 --- a/patches/server/0064-Implement-ItemFactory-getMonsterEgg.patch +++ b/patches/server/0065-Implement-ItemFactory-getMonsterEgg.patch @@ -1,4 +1,4 @@ -From d7ae72310a8542289a170ae214d41863de44145e Mon Sep 17 00:00:00 2001 +From a715a9f0efee8196461f2e6ff34fc6cc75cdacb0 Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Fri, 5 Jul 2019 16:36:55 -0500 Subject: [PATCH] Implement ItemFactory#getMonsterEgg @@ -9,7 +9,7 @@ Subject: [PATCH] Implement ItemFactory#getMonsterEgg 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/main/java/net/minecraft/server/ItemMonsterEgg.java b/src/main/java/net/minecraft/server/ItemMonsterEgg.java -index 24af4c11d6..8ef2c32236 100644 +index 24af4c11d..8ef2c3223 100644 --- a/src/main/java/net/minecraft/server/ItemMonsterEgg.java +++ b/src/main/java/net/minecraft/server/ItemMonsterEgg.java @@ -8,7 +8,7 @@ import javax.annotation.Nullable; @@ -22,7 +22,7 @@ index 24af4c11d6..8ef2c32236 100644 private final int c; private final EntityTypes d; diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemFactory.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemFactory.java -index 23d7756456..29161032c3 100644 +index 23d775645..29161032c 100644 --- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemFactory.java +++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemFactory.java @@ -354,4 +354,18 @@ public final class CraftItemFactory implements ItemFactory { diff --git a/patches/server/0065-Alternative-Keepalive-Handling.patch b/patches/server/0066-Alternative-Keepalive-Handling.patch similarity index 96% rename from patches/server/0065-Alternative-Keepalive-Handling.patch rename to patches/server/0066-Alternative-Keepalive-Handling.patch index d337f2c78..be72b275e 100644 --- a/patches/server/0065-Alternative-Keepalive-Handling.patch +++ b/patches/server/0066-Alternative-Keepalive-Handling.patch @@ -1,4 +1,4 @@ -From 54394aaf6481dad9ccbb1b5453a436a1c1897a3c Mon Sep 17 00:00:00 2001 +From 76726919a5d08da468c119b8fbd7d57d3594aaed Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Fri, 11 Oct 2019 00:17:39 -0500 Subject: [PATCH] Alternative Keepalive Handling @@ -10,7 +10,7 @@ Subject: [PATCH] Alternative Keepalive Handling 3 files changed, 33 insertions(+) diff --git a/src/main/java/net/minecraft/server/PacketPlayInKeepAlive.java b/src/main/java/net/minecraft/server/PacketPlayInKeepAlive.java -index 8e93f1540b..470f92c4fb 100644 +index 8e93f1540..470f92c4f 100644 --- a/src/main/java/net/minecraft/server/PacketPlayInKeepAlive.java +++ b/src/main/java/net/minecraft/server/PacketPlayInKeepAlive.java @@ -22,6 +22,7 @@ public class PacketPlayInKeepAlive implements Packet { @@ -22,7 +22,7 @@ index 8e93f1540b..470f92c4fb 100644 return this.a; } diff --git a/src/main/java/net/minecraft/server/PlayerConnection.java b/src/main/java/net/minecraft/server/PlayerConnection.java -index 2f2e248c02..20cdd09f19 100644 +index 2659da188..65b9b93a6 100644 --- a/src/main/java/net/minecraft/server/PlayerConnection.java +++ b/src/main/java/net/minecraft/server/PlayerConnection.java @@ -74,6 +74,7 @@ public class PlayerConnection implements PacketListenerPlayIn { @@ -74,7 +74,7 @@ index 2f2e248c02..20cdd09f19 100644 if (this.awaitingKeepAlive && packetplayinkeepalive.b() == this.h) { int i = (int) (SystemUtils.getMonotonicMillis() - this.lastKeepAlive); diff --git a/src/main/java/net/pl3x/purpur/PurpurConfig.java b/src/main/java/net/pl3x/purpur/PurpurConfig.java -index 7be2e01814..3cd53cc3aa 100644 +index 7be2e0181..3cd53cc3a 100644 --- a/src/main/java/net/pl3x/purpur/PurpurConfig.java +++ b/src/main/java/net/pl3x/purpur/PurpurConfig.java @@ -159,6 +159,11 @@ public class PurpurConfig { diff --git a/patches/server/0066-Implement-PlayerSetSpawnerTypeWithEggEvent.patch b/patches/server/0067-Implement-PlayerSetSpawnerTypeWithEggEvent.patch similarity index 95% rename from patches/server/0066-Implement-PlayerSetSpawnerTypeWithEggEvent.patch rename to patches/server/0067-Implement-PlayerSetSpawnerTypeWithEggEvent.patch index 9719b2600..ecc1ca8f4 100644 --- a/patches/server/0066-Implement-PlayerSetSpawnerTypeWithEggEvent.patch +++ b/patches/server/0067-Implement-PlayerSetSpawnerTypeWithEggEvent.patch @@ -1,4 +1,4 @@ -From d44791bc613fb816e7281679baa1b8212ddb2633 Mon Sep 17 00:00:00 2001 +From f579c8d8dda326df2e0322499c7c9b666c6330b0 Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Fri, 5 Jul 2019 18:21:00 -0500 Subject: [PATCH] Implement PlayerSetSpawnerTypeWithEggEvent @@ -8,7 +8,7 @@ Subject: [PATCH] Implement PlayerSetSpawnerTypeWithEggEvent 1 file changed, 14 insertions(+) diff --git a/src/main/java/net/minecraft/server/ItemMonsterEgg.java b/src/main/java/net/minecraft/server/ItemMonsterEgg.java -index 8ef2c32236..237fdeda5c 100644 +index 8ef2c3223..237fdeda5 100644 --- a/src/main/java/net/minecraft/server/ItemMonsterEgg.java +++ b/src/main/java/net/minecraft/server/ItemMonsterEgg.java @@ -2,6 +2,11 @@ package net.minecraft.server; diff --git a/patches/server/0067-Add-MonsterEggSpawnEvent.patch b/patches/server/0068-Add-MonsterEggSpawnEvent.patch similarity index 97% rename from patches/server/0067-Add-MonsterEggSpawnEvent.patch rename to patches/server/0068-Add-MonsterEggSpawnEvent.patch index 977aebafc..57cc8ace1 100644 --- a/patches/server/0067-Add-MonsterEggSpawnEvent.patch +++ b/patches/server/0068-Add-MonsterEggSpawnEvent.patch @@ -1,4 +1,4 @@ -From d430fd17c8c4bae401dcf65bab6489dbdeadc00c Mon Sep 17 00:00:00 2001 +From d3d17b117f62a2d8cbdae963403702d0767f1372 Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Sat, 19 Oct 2019 03:20:59 -0500 Subject: [PATCH] Add MonsterEggSpawnEvent @@ -8,7 +8,7 @@ Subject: [PATCH] Add MonsterEggSpawnEvent 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/src/main/java/net/minecraft/server/EntityTypes.java b/src/main/java/net/minecraft/server/EntityTypes.java -index 0dd9897b99..149e253360 100644 +index 0dd9897b9..149e25336 100644 --- a/src/main/java/net/minecraft/server/EntityTypes.java +++ b/src/main/java/net/minecraft/server/EntityTypes.java @@ -163,19 +163,45 @@ public class EntityTypes { diff --git a/patches/server/0068-Add-moon-phase-API.patch b/patches/server/0069-Add-moon-phase-API.patch similarity index 84% rename from patches/server/0068-Add-moon-phase-API.patch rename to patches/server/0069-Add-moon-phase-API.patch index 33bf2a53d..3bf90a88f 100644 --- a/patches/server/0068-Add-moon-phase-API.patch +++ b/patches/server/0069-Add-moon-phase-API.patch @@ -1,4 +1,4 @@ -From ecd4e43ed26b46d3e5ad0d0f8440448ade679178 Mon Sep 17 00:00:00 2001 +From 706905bb67539f5dc51111a9688c60a90e97244e Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Sat, 1 Feb 2020 22:22:16 -0600 Subject: [PATCH] Add moon phase API @@ -8,10 +8,10 @@ Subject: [PATCH] Add moon phase API 1 file changed, 7 insertions(+) diff --git a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java -index a14b8cb988..4ee61f33f1 100644 +index 7aed24c8f..a1df723f5 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java -@@ -2412,6 +2412,13 @@ public class CraftWorld implements World { +@@ -2414,6 +2414,13 @@ public class CraftWorld implements World { return persistentRaid.raids.values().stream().map(CraftRaid::new).collect(Collectors.toList()); } diff --git a/patches/server/0069-Add-getPlacementBlockData-to-World.patch b/patches/server/0070-Add-getPlacementBlockData-to-World.patch similarity index 93% rename from patches/server/0069-Add-getPlacementBlockData-to-World.patch rename to patches/server/0070-Add-getPlacementBlockData-to-World.patch index d3a366692..eab766502 100644 --- a/patches/server/0069-Add-getPlacementBlockData-to-World.patch +++ b/patches/server/0070-Add-getPlacementBlockData-to-World.patch @@ -1,4 +1,4 @@ -From bf226ca766f2c2fb37346ed08b02b7ab67493d0a Mon Sep 17 00:00:00 2001 +From c9babcc04ee6caa1219d17d434dbf7a50fed5047 Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Sat, 8 Feb 2020 23:30:17 -0600 Subject: [PATCH] Add getPlacementBlockData to World @@ -12,7 +12,7 @@ Subject: [PATCH] Add getPlacementBlockData to World create mode 100644 src/main/java/net/minecraft/server/ItemSpawner.java diff --git a/src/main/java/net/minecraft/server/BlockMobSpawner.java b/src/main/java/net/minecraft/server/BlockMobSpawner.java -index 69d04f6cbf..901d45f284 100644 +index 69d04f6cb..901d45f28 100644 --- a/src/main/java/net/minecraft/server/BlockMobSpawner.java +++ b/src/main/java/net/minecraft/server/BlockMobSpawner.java @@ -57,6 +57,7 @@ public class BlockMobSpawner extends BlockTileEntity { @@ -25,7 +25,7 @@ index 69d04f6cbf..901d45f284 100644 return i; diff --git a/src/main/java/net/minecraft/server/ItemSpawner.java b/src/main/java/net/minecraft/server/ItemSpawner.java new file mode 100644 -index 0000000000..7dc68ffe92 +index 000000000..7dc68ffe9 --- /dev/null +++ b/src/main/java/net/minecraft/server/ItemSpawner.java @@ -0,0 +1,23 @@ @@ -53,7 +53,7 @@ index 0000000000..7dc68ffe92 + } +} diff --git a/src/main/java/net/minecraft/server/Items.java b/src/main/java/net/minecraft/server/Items.java -index 9c9b93f280..74a722cce5 100644 +index 9c9b93f28..74a722cce 100644 --- a/src/main/java/net/minecraft/server/Items.java +++ b/src/main/java/net/minecraft/server/Items.java @@ -155,7 +155,7 @@ public class Items { @@ -66,10 +66,10 @@ index 9c9b93f280..74a722cce5 100644 public static final Item bZ = a(Blocks.CHEST, CreativeModeTab.c); public static final Item ca = a(Blocks.DIAMOND_ORE, CreativeModeTab.b); diff --git a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java -index 4ee61f33f1..ec552adfdd 100644 +index a1df723f5..5eb805837 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java -@@ -2417,6 +2417,11 @@ public class CraftWorld implements World { +@@ -2419,6 +2419,11 @@ public class CraftWorld implements World { public net.pl3x.purpur.MoonPhase getMoonPhase() { return net.pl3x.purpur.MoonPhase.getPhase(getFullTime() / 24000L); } diff --git a/patches/server/0070-Barrels-have-6-rows.patch b/patches/server/0071-Barrels-have-6-rows.patch similarity index 96% rename from patches/server/0070-Barrels-have-6-rows.patch rename to patches/server/0071-Barrels-have-6-rows.patch index e660582f7..db6d6ade1 100644 --- a/patches/server/0070-Barrels-have-6-rows.patch +++ b/patches/server/0071-Barrels-have-6-rows.patch @@ -1,4 +1,4 @@ -From 2c7cde84e329f5d01cc2be125ac0e71296c06505 Mon Sep 17 00:00:00 2001 +From 1600fc7ea2c8b4df257c12d795fe01445f00c6a6 Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Thu, 23 May 2019 21:50:37 -0500 Subject: [PATCH] Barrels have 6 rows @@ -11,7 +11,7 @@ Subject: [PATCH] Barrels have 6 rows 4 files changed, 17 insertions(+), 3 deletions(-) diff --git a/src/main/java/net/minecraft/server/ContainerChest.java b/src/main/java/net/minecraft/server/ContainerChest.java -index 0ee6524b89..7d8567b4b8 100644 +index 0ee6524b8..7d8567b4b 100644 --- a/src/main/java/net/minecraft/server/ContainerChest.java +++ b/src/main/java/net/minecraft/server/ContainerChest.java @@ -65,6 +65,7 @@ public class ContainerChest extends Container { @@ -23,7 +23,7 @@ index 0ee6524b89..7d8567b4b8 100644 return new ContainerChest(Containers.GENERIC_9X6, i, playerinventory, iinventory, 6); } diff --git a/src/main/java/net/minecraft/server/TileEntityBarrel.java b/src/main/java/net/minecraft/server/TileEntityBarrel.java -index 1e27abbea0..d1a3aae91f 100644 +index 1e27abbea..d1a3aae91 100644 --- a/src/main/java/net/minecraft/server/TileEntityBarrel.java +++ b/src/main/java/net/minecraft/server/TileEntityBarrel.java @@ -54,7 +54,7 @@ public class TileEntityBarrel extends TileEntityLootable { @@ -53,7 +53,7 @@ index 1e27abbea0..d1a3aae91f 100644 } diff --git a/src/main/java/net/pl3x/purpur/PurpurConfig.java b/src/main/java/net/pl3x/purpur/PurpurConfig.java -index 3cd53cc3aa..f9e989d7c6 100644 +index 3cd53cc3a..f9e989d7c 100644 --- a/src/main/java/net/pl3x/purpur/PurpurConfig.java +++ b/src/main/java/net/pl3x/purpur/PurpurConfig.java @@ -6,6 +6,7 @@ import org.bukkit.Bukkit; @@ -82,7 +82,7 @@ index 3cd53cc3aa..f9e989d7c6 100644 } diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftContainer.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftContainer.java -index b4a7d982eb..afb40a7523 100644 +index b4a7d982e..afb40a752 100644 --- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftContainer.java +++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftContainer.java @@ -155,6 +155,7 @@ public class CraftContainer extends Container { diff --git a/patches/server/0071-Ender-chests-have-6-rows.patch b/patches/server/0072-Ender-chests-have-6-rows.patch similarity index 95% rename from patches/server/0071-Ender-chests-have-6-rows.patch rename to patches/server/0072-Ender-chests-have-6-rows.patch index ba267f2e7..d0c615b6f 100644 --- a/patches/server/0071-Ender-chests-have-6-rows.patch +++ b/patches/server/0072-Ender-chests-have-6-rows.patch @@ -1,4 +1,4 @@ -From 82827fcfa71ef9d80688cbe2cda14ff6a57a88f3 Mon Sep 17 00:00:00 2001 +From 5f4ecdd4733c2e1d442684f0ffe913ef2f530db4 Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Sun, 23 Jun 2019 17:01:26 -0500 Subject: [PATCH] Ender chests have 6 rows @@ -12,7 +12,7 @@ Subject: [PATCH] Ender chests have 6 rows 5 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/main/java/net/minecraft/server/BlockEnderChest.java b/src/main/java/net/minecraft/server/BlockEnderChest.java -index 0a892a5f1a..0aede130bd 100644 +index 0a892a5f1..0aede130b 100644 --- a/src/main/java/net/minecraft/server/BlockEnderChest.java +++ b/src/main/java/net/minecraft/server/BlockEnderChest.java @@ -48,6 +48,7 @@ public class BlockEnderChest extends BlockChestAbstract im @@ -24,7 +24,7 @@ index 0a892a5f1a..0aede130bd 100644 }, BlockEnderChest.e)); entityhuman.a(StatisticList.OPEN_ENDERCHEST); diff --git a/src/main/java/net/minecraft/server/InventoryEnderChest.java b/src/main/java/net/minecraft/server/InventoryEnderChest.java -index fd31b9a6dc..903c02e9ef 100644 +index fd31b9a6d..903c02e9e 100644 --- a/src/main/java/net/minecraft/server/InventoryEnderChest.java +++ b/src/main/java/net/minecraft/server/InventoryEnderChest.java @@ -20,7 +20,7 @@ public class InventoryEnderChest extends InventorySubcontainer { @@ -37,7 +37,7 @@ index fd31b9a6dc..903c02e9ef 100644 // CraftBukkit end } diff --git a/src/main/java/net/pl3x/purpur/PurpurConfig.java b/src/main/java/net/pl3x/purpur/PurpurConfig.java -index f9e989d7c6..b40dcbe94f 100644 +index f9e989d7c..b40dcbe94 100644 --- a/src/main/java/net/pl3x/purpur/PurpurConfig.java +++ b/src/main/java/net/pl3x/purpur/PurpurConfig.java @@ -174,14 +174,20 @@ public class PurpurConfig { @@ -62,7 +62,7 @@ index f9e989d7c6..b40dcbe94f 100644 } diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftContainer.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftContainer.java -index afb40a7523..7bf1e224a6 100644 +index afb40a752..7bf1e224a 100644 --- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftContainer.java +++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftContainer.java @@ -156,6 +156,7 @@ public class CraftContainer extends Container { @@ -83,7 +83,7 @@ index afb40a7523..7bf1e224a6 100644 case BARREL: delegate = new ContainerChest(net.pl3x.purpur.PurpurConfig.barrelSixRows ? Containers.GENERIC_9X6 : Containers.GENERIC_9X3, windowId, bottom, top, top.getSize() / 9); // Purpur diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventory.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventory.java -index 026a0c3995..d2c06cff2c 100644 +index 026a0c399..d2c06cff2 100644 --- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventory.java +++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventory.java @@ -81,7 +81,7 @@ public class CraftInventory implements Inventory { diff --git a/patches/server/0072-Add-5-second-tps-average-in-tps.patch b/patches/server/0073-Add-5-second-tps-average-in-tps.patch similarity index 95% rename from patches/server/0072-Add-5-second-tps-average-in-tps.patch rename to patches/server/0073-Add-5-second-tps-average-in-tps.patch index 177849852..554532f22 100644 --- a/patches/server/0072-Add-5-second-tps-average-in-tps.patch +++ b/patches/server/0073-Add-5-second-tps-average-in-tps.patch @@ -1,4 +1,4 @@ -From 892a30d3f60ab07f3401d04306bba70762430a40 Mon Sep 17 00:00:00 2001 +From b6a6c54f490db24f7f9119a72758f86b2ef44b5e Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Sun, 28 Jul 2019 01:27:37 -0500 Subject: [PATCH] Add 5 second tps average in /tps @@ -10,7 +10,7 @@ Subject: [PATCH] Add 5 second tps average in /tps 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java -index c16e1ae9d8..e11b94e154 100644 +index 625227f07..b98efe326 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java @@ -177,7 +177,7 @@ public abstract class MinecraftServer extends IAsyncTaskHandlerReentrant Date: Sat, 19 Oct 2019 02:20:45 -0500 Subject: [PATCH] Add option to allow iron golems to spawn in air @@ -9,7 +9,7 @@ Subject: [PATCH] Add option to allow iron golems to spawn in air 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/net/minecraft/server/EntityIronGolem.java b/src/main/java/net/minecraft/server/EntityIronGolem.java -index 5414d6975f..91011dd0aa 100644 +index 5414d6975..91011dd0a 100644 --- a/src/main/java/net/minecraft/server/EntityIronGolem.java +++ b/src/main/java/net/minecraft/server/EntityIronGolem.java @@ -241,7 +241,7 @@ public class EntityIronGolem extends EntityGolem { @@ -22,7 +22,7 @@ index 5414d6975f..91011dd0aa 100644 } else { for (int i = 1; i < 3; ++i) { diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -index 9c21d196ea..c594cf1f5b 100644 +index 9c21d196e..c594cf1f5 100644 --- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java +++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java @@ -468,11 +468,13 @@ public class PurpurWorldConfig { diff --git a/patches/server/0074-Don-t-recalculate-permissions-for-players-on-world-c.patch b/patches/server/0075-Don-t-recalculate-permissions-for-players-on-world-c.patch similarity index 96% rename from patches/server/0074-Don-t-recalculate-permissions-for-players-on-world-c.patch rename to patches/server/0075-Don-t-recalculate-permissions-for-players-on-world-c.patch index d0a09879b..b8ae307ad 100644 --- a/patches/server/0074-Don-t-recalculate-permissions-for-players-on-world-c.patch +++ b/patches/server/0075-Don-t-recalculate-permissions-for-players-on-world-c.patch @@ -1,4 +1,4 @@ -From 2cf4577b2f461e92f94de6d6ff187572a3ec1142 Mon Sep 17 00:00:00 2001 +From 35b2b24188eaa1bf0e5a113373275761cc95e9c9 Mon Sep 17 00:00:00 2001 From: Tom Date: Fri, 12 Jul 2019 07:59:35 -0500 Subject: [PATCH] Don't recalculate permissions for players on world change @@ -9,7 +9,7 @@ Subject: [PATCH] Don't recalculate permissions for players on world change 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/main/java/net/minecraft/server/PlayerList.java b/src/main/java/net/minecraft/server/PlayerList.java -index 7b79ee4fe5..3975312394 100644 +index 253ee52eb..cf8f24b31 100644 --- a/src/main/java/net/minecraft/server/PlayerList.java +++ b/src/main/java/net/minecraft/server/PlayerList.java @@ -32,13 +32,10 @@ import org.bukkit.Location; @@ -51,7 +51,7 @@ index 7b79ee4fe5..3975312394 100644 public boolean isWhitelisted(GameProfile gameprofile) { return isWhitelisted(gameprofile, null); diff --git a/src/main/java/net/pl3x/purpur/PurpurConfig.java b/src/main/java/net/pl3x/purpur/PurpurConfig.java -index b40dcbe94f..17694bb5fd 100644 +index b40dcbe94..17694bb5f 100644 --- a/src/main/java/net/pl3x/purpur/PurpurConfig.java +++ b/src/main/java/net/pl3x/purpur/PurpurConfig.java @@ -191,6 +191,11 @@ public class PurpurConfig { diff --git a/patches/server/0075-Add-playPickupItemAnimation-to-LivingEntity.patch b/patches/server/0076-Add-playPickupItemAnimation-to-LivingEntity.patch similarity index 90% rename from patches/server/0075-Add-playPickupItemAnimation-to-LivingEntity.patch rename to patches/server/0076-Add-playPickupItemAnimation-to-LivingEntity.patch index 5795ef86c..75f1f72c7 100644 --- a/patches/server/0075-Add-playPickupItemAnimation-to-LivingEntity.patch +++ b/patches/server/0076-Add-playPickupItemAnimation-to-LivingEntity.patch @@ -1,4 +1,4 @@ -From 621ffeabfb1674e963c067dc048fe07724fc02f7 Mon Sep 17 00:00:00 2001 +From 9adc0638a8e93f8f9466d2465c208d57d9c7cf97 Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Sat, 19 Oct 2019 02:25:16 -0500 Subject: [PATCH] Add playPickupItemAnimation to LivingEntity @@ -8,7 +8,7 @@ Subject: [PATCH] Add playPickupItemAnimation to LivingEntity 1 file changed, 5 insertions(+) diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java -index 3dd0faea79..48f66b0c1b 100644 +index 3dd0faea7..48f66b0c1 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java @@ -750,5 +750,10 @@ public class CraftLivingEntity extends CraftEntity implements LivingEntity { diff --git a/patches/server/0076-Add-more-evoker-API.patch b/patches/server/0077-Add-more-evoker-API.patch similarity index 94% rename from patches/server/0076-Add-more-evoker-API.patch rename to patches/server/0077-Add-more-evoker-API.patch index 7baf1c116..8fc346e65 100644 --- a/patches/server/0076-Add-more-evoker-API.patch +++ b/patches/server/0077-Add-more-evoker-API.patch @@ -1,4 +1,4 @@ -From 4852f859c3632fff129fe27bf0e38a7ca3d1701c Mon Sep 17 00:00:00 2001 +From 37ebc369f99093b8afb6fce38d6d4e7d635ae674 Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Sat, 19 Oct 2019 00:29:02 -0500 Subject: [PATCH] Add more evoker API @@ -9,7 +9,7 @@ Subject: [PATCH] Add more evoker API 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/src/main/java/net/minecraft/server/EntityEvoker.java b/src/main/java/net/minecraft/server/EntityEvoker.java -index a3d8b99742..53a3829ac7 100644 +index 179a26129..e7d0d0f5e 100644 --- a/src/main/java/net/minecraft/server/EntityEvoker.java +++ b/src/main/java/net/minecraft/server/EntityEvoker.java @@ -102,12 +102,14 @@ public class EntityEvoker extends EntityIllagerWizard { @@ -30,7 +30,7 @@ index a3d8b99742..53a3829ac7 100644 } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftEvoker.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftEvoker.java -index 0636d26473..4ccb938909 100644 +index 0636d2647..4ccb93890 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftEvoker.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftEvoker.java @@ -36,4 +36,17 @@ public class CraftEvoker extends CraftSpellcaster implements Evoker { diff --git a/patches/server/0077-Add-API-for-Villager-resetOffers.patch b/patches/server/0078-Add-API-for-Villager-resetOffers.patch similarity index 93% rename from patches/server/0077-Add-API-for-Villager-resetOffers.patch rename to patches/server/0078-Add-API-for-Villager-resetOffers.patch index c23fde7d9..fa80389b7 100644 --- a/patches/server/0077-Add-API-for-Villager-resetOffers.patch +++ b/patches/server/0078-Add-API-for-Villager-resetOffers.patch @@ -1,4 +1,4 @@ -From f60834bafd01ec2b7169ce370eb8780d9176163c Mon Sep 17 00:00:00 2001 +From c721996d7f9aa700f2779533e88973a8949669a3 Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Mon, 7 Oct 2019 00:15:37 -0500 Subject: [PATCH] Add API for Villager#resetOffers() @@ -9,7 +9,7 @@ Subject: [PATCH] Add API for Villager#resetOffers() 2 files changed, 15 insertions(+) diff --git a/src/main/java/net/minecraft/server/EntityVillagerAbstract.java b/src/main/java/net/minecraft/server/EntityVillagerAbstract.java -index 9b75c67c72..ddd19aa2f9 100644 +index 9b75c67c7..ddd19aa2f 100644 --- a/src/main/java/net/minecraft/server/EntityVillagerAbstract.java +++ b/src/main/java/net/minecraft/server/EntityVillagerAbstract.java @@ -82,6 +82,13 @@ public abstract class EntityVillagerAbstract extends EntityAgeable implements NP @@ -35,7 +35,7 @@ index 9b75c67c72..ddd19aa2f9 100644 protected void a(MerchantRecipeList merchantrecipelist, VillagerTrades.IMerchantRecipeOption[] avillagertrades_imerchantrecipeoption, int i) { diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftVillager.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftVillager.java -index a73ebaa75f..ac89ed9377 100644 +index a73ebaa75..ac89ed937 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftVillager.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftVillager.java @@ -112,4 +112,11 @@ public class CraftVillager extends CraftAbstractVillager implements Villager { diff --git a/patches/server/0078-Add-more-llama-API.patch b/patches/server/0079-Add-more-llama-API.patch similarity index 97% rename from patches/server/0078-Add-more-llama-API.patch rename to patches/server/0079-Add-more-llama-API.patch index 565b94479..6fc8ff4f9 100644 --- a/patches/server/0078-Add-more-llama-API.patch +++ b/patches/server/0079-Add-more-llama-API.patch @@ -1,4 +1,4 @@ -From 4c63124a19e62592cacb728c055e0d317f0afb44 Mon Sep 17 00:00:00 2001 +From 60827d47afdc407c4e63cea155a0ea0924caf9d2 Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Fri, 18 Oct 2019 22:50:12 -0500 Subject: [PATCH] Add more llama API @@ -10,7 +10,7 @@ Subject: [PATCH] Add more llama API 3 files changed, 61 insertions(+), 5 deletions(-) diff --git a/src/main/java/net/minecraft/server/EntityLlama.java b/src/main/java/net/minecraft/server/EntityLlama.java -index 5b87b245f7..00334993fe 100644 +index 5b87b245f..00334993f 100644 --- a/src/main/java/net/minecraft/server/EntityLlama.java +++ b/src/main/java/net/minecraft/server/EntityLlama.java @@ -12,7 +12,8 @@ public class EntityLlama extends EntityHorseChestedAbstract implements IRangedEn @@ -80,7 +80,7 @@ index 5b87b245f7..00334993fe 100644 } diff --git a/src/main/java/net/minecraft/server/PathfinderGoalLlamaFollow.java b/src/main/java/net/minecraft/server/PathfinderGoalLlamaFollow.java -index e181d83505..8376f1dc4e 100644 +index e181d8350..8376f1dc4 100644 --- a/src/main/java/net/minecraft/server/PathfinderGoalLlamaFollow.java +++ b/src/main/java/net/minecraft/server/PathfinderGoalLlamaFollow.java @@ -6,7 +6,7 @@ import java.util.List; @@ -109,7 +109,7 @@ index e181d83505..8376f1dc4e 100644 double d0 = this.a.h((Entity) this.a.fe()); diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftLlama.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftLlama.java -index 3f94c5a920..a027634801 100644 +index 3f94c5a92..a02763480 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftLlama.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftLlama.java @@ -65,4 +65,48 @@ public class CraftLlama extends CraftChestedHorse implements Llama, CraftRangedE diff --git a/patches/server/0079-Fix-furnace-cook-speed-multiplier-using-values-betwe.patch b/patches/server/0080-Fix-furnace-cook-speed-multiplier-using-values-betwe.patch similarity index 93% rename from patches/server/0079-Fix-furnace-cook-speed-multiplier-using-values-betwe.patch rename to patches/server/0080-Fix-furnace-cook-speed-multiplier-using-values-betwe.patch index 6a832f7d7..1ebfbe3a9 100644 --- a/patches/server/0079-Fix-furnace-cook-speed-multiplier-using-values-betwe.patch +++ b/patches/server/0080-Fix-furnace-cook-speed-multiplier-using-values-betwe.patch @@ -1,4 +1,4 @@ -From 0b79a4f3661172cbe3092be87e035bd7a43ff22a Mon Sep 17 00:00:00 2001 +From 7c6d9c39c30bf2c05dc2070ee5472a7f288e8a89 Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Sat, 19 Oct 2019 03:36:52 -0500 Subject: [PATCH] Fix furnace cook speed multiplier using values between 0 and @@ -9,7 +9,7 @@ Subject: [PATCH] Fix furnace cook speed multiplier using values between 0 and 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/net/minecraft/server/TileEntityFurnace.java b/src/main/java/net/minecraft/server/TileEntityFurnace.java -index d5432bfeb7..91ef7ac60f 100644 +index d5432bfeb..91ef7ac60 100644 --- a/src/main/java/net/minecraft/server/TileEntityFurnace.java +++ b/src/main/java/net/minecraft/server/TileEntityFurnace.java @@ -291,8 +291,10 @@ public abstract class TileEntityFurnace extends TileEntityContainer implements I diff --git a/patches/server/0080-Implement-infinite-lava.patch b/patches/server/0081-Implement-infinite-lava.patch similarity index 94% rename from patches/server/0080-Implement-infinite-lava.patch rename to patches/server/0081-Implement-infinite-lava.patch index 24106f0d1..48057ab6a 100644 --- a/patches/server/0080-Implement-infinite-lava.patch +++ b/patches/server/0081-Implement-infinite-lava.patch @@ -1,4 +1,4 @@ -From f9ba2eb41e2cd221f4c103814086506e6deebf13 Mon Sep 17 00:00:00 2001 +From 90016743c9af9cdabf561a1f47fb533d6b889bd0 Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Sat, 23 Nov 2019 17:55:42 -0600 Subject: [PATCH] Implement infinite lava @@ -11,7 +11,7 @@ Subject: [PATCH] Implement infinite lava 4 files changed, 22 insertions(+), 2 deletions(-) diff --git a/src/main/java/net/minecraft/server/FluidTypeFlowing.java b/src/main/java/net/minecraft/server/FluidTypeFlowing.java -index 376dca1889..1a14fe4a24 100644 +index 376dca188..1a14fe4a2 100644 --- a/src/main/java/net/minecraft/server/FluidTypeFlowing.java +++ b/src/main/java/net/minecraft/server/FluidTypeFlowing.java @@ -219,7 +219,7 @@ public abstract class FluidTypeFlowing extends FluidType { @@ -39,7 +39,7 @@ index 376dca1889..1a14fe4a24 100644 protected void a(GeneratorAccess generatoraccess, BlockPosition blockposition, IBlockData iblockdata, EnumDirection enumdirection, Fluid fluid) { diff --git a/src/main/java/net/minecraft/server/FluidTypeLava.java b/src/main/java/net/minecraft/server/FluidTypeLava.java -index d25368d032..09f82c2d92 100644 +index d25368d03..09f82c2d9 100644 --- a/src/main/java/net/minecraft/server/FluidTypeLava.java +++ b/src/main/java/net/minecraft/server/FluidTypeLava.java @@ -147,6 +147,13 @@ public abstract class FluidTypeLava extends FluidTypeFlowing { @@ -57,7 +57,7 @@ index d25368d032..09f82c2d92 100644 protected boolean f() { return false; diff --git a/src/main/java/net/minecraft/server/WorldProvider.java b/src/main/java/net/minecraft/server/WorldProvider.java -index 9eba9a12c0..39252e6873 100644 +index 9eba9a12c..39252e687 100644 --- a/src/main/java/net/minecraft/server/WorldProvider.java +++ b/src/main/java/net/minecraft/server/WorldProvider.java @@ -5,7 +5,7 @@ import javax.annotation.Nullable; @@ -70,7 +70,7 @@ index 9eba9a12c0..39252e6873 100644 protected boolean c; protected boolean d; diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -index 1a43f84bfa..f1a6524aa1 100644 +index c594cf1f5..7f8905faf 100644 --- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java +++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java @@ -127,6 +127,11 @@ public class PurpurWorldConfig { diff --git a/patches/server/0081-Expose-getItemStack-for-Trident.patch b/patches/server/0082-Expose-getItemStack-for-Trident.patch similarity index 91% rename from patches/server/0081-Expose-getItemStack-for-Trident.patch rename to patches/server/0082-Expose-getItemStack-for-Trident.patch index 563817e77..16500eb37 100644 --- a/patches/server/0081-Expose-getItemStack-for-Trident.patch +++ b/patches/server/0082-Expose-getItemStack-for-Trident.patch @@ -1,4 +1,4 @@ -From b61e67596ed8bdce79c5b727d0caefae91909c33 Mon Sep 17 00:00:00 2001 +From 12117c208b9ec2c41ac6d51f00e5d74bd2ad94a8 Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Fri, 18 Oct 2019 22:19:40 -0500 Subject: [PATCH] Expose getItemStack for Trident @@ -9,7 +9,7 @@ Subject: [PATCH] Expose getItemStack for Trident 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/main/java/net/minecraft/server/EntityThrownTrident.java b/src/main/java/net/minecraft/server/EntityThrownTrident.java -index 59bb039ad7..ed8e26aa45 100644 +index 59bb039ad..ed8e26aa4 100644 --- a/src/main/java/net/minecraft/server/EntityThrownTrident.java +++ b/src/main/java/net/minecraft/server/EntityThrownTrident.java @@ -77,7 +77,7 @@ public class EntityThrownTrident extends EntityArrow { @@ -22,7 +22,7 @@ index 59bb039ad7..ed8e26aa45 100644 } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftTrident.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftTrident.java -index 0518e6c683..63287a9b65 100644 +index 0518e6c68..63287a9b6 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftTrident.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftTrident.java @@ -25,4 +25,11 @@ public class CraftTrident extends CraftArrow implements Trident { diff --git a/patches/server/0082-Despawn-egg-hatches-chicken.patch b/patches/server/0083-Despawn-egg-hatches-chicken.patch similarity index 95% rename from patches/server/0082-Despawn-egg-hatches-chicken.patch rename to patches/server/0083-Despawn-egg-hatches-chicken.patch index d5bfb7bc6..ff33284b1 100644 --- a/patches/server/0082-Despawn-egg-hatches-chicken.patch +++ b/patches/server/0083-Despawn-egg-hatches-chicken.patch @@ -1,4 +1,4 @@ -From dfbc90710195aa366b15b4d855c7c70b393a8e29 Mon Sep 17 00:00:00 2001 +From 11441313eb4f959a518c7988f3a88f7daba2ad2a Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Fri, 29 Nov 2019 23:47:42 -0600 Subject: [PATCH] Despawn egg hatches chicken @@ -9,7 +9,7 @@ Subject: [PATCH] Despawn egg hatches chicken 2 files changed, 25 insertions(+) diff --git a/src/main/java/net/minecraft/server/EntityItem.java b/src/main/java/net/minecraft/server/EntityItem.java -index 2926fbb957..bbb9ca1efc 100644 +index 2926fbb95..bbb9ca1ef 100644 --- a/src/main/java/net/minecraft/server/EntityItem.java +++ b/src/main/java/net/minecraft/server/EntityItem.java @@ -165,6 +165,27 @@ public class EntityItem extends Entity { @@ -41,7 +41,7 @@ index 2926fbb957..bbb9ca1efc 100644 Vec3D vec3d = this.getMot(); diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -index f1a6524aa1..ded5e9fbb6 100644 +index 7f8905faf..0b8b2a4e9 100644 --- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java +++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java @@ -275,11 +275,15 @@ public class PurpurWorldConfig { diff --git a/patches/server/0083-Fix-SpawnChangeEvent-not-firing-for-all-use-cases.patch b/patches/server/0084-Fix-SpawnChangeEvent-not-firing-for-all-use-cases.patch similarity index 89% rename from patches/server/0083-Fix-SpawnChangeEvent-not-firing-for-all-use-cases.patch rename to patches/server/0084-Fix-SpawnChangeEvent-not-firing-for-all-use-cases.patch index 33c917665..80cf2f930 100644 --- a/patches/server/0083-Fix-SpawnChangeEvent-not-firing-for-all-use-cases.patch +++ b/patches/server/0084-Fix-SpawnChangeEvent-not-firing-for-all-use-cases.patch @@ -1,4 +1,4 @@ -From 6710a3952a1749af97066f8f0bb949c3f8f357f2 Mon Sep 17 00:00:00 2001 +From 5bac7b4414881bb1c46b820ca3d0c339de8bc185 Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Sat, 19 Oct 2019 01:42:50 -0500 Subject: [PATCH] Fix SpawnChangeEvent not firing for all use-cases @@ -9,10 +9,10 @@ Subject: [PATCH] Fix SpawnChangeEvent not firing for all use-cases 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/src/main/java/net/minecraft/server/World.java b/src/main/java/net/minecraft/server/World.java -index 7db28d954f..989e68fa1c 100644 +index 47a8e1ed7..cda91df40 100644 --- a/src/main/java/net/minecraft/server/World.java +++ b/src/main/java/net/minecraft/server/World.java -@@ -1389,8 +1389,11 @@ public abstract class World implements GeneratorAccess, AutoCloseable { +@@ -1403,8 +1403,11 @@ public abstract class World implements GeneratorAccess, AutoCloseable { return blockposition; } @@ -25,10 +25,10 @@ index 7db28d954f..989e68fa1c 100644 public boolean a(EntityHuman entityhuman, BlockPosition blockposition) { diff --git a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java -index ec552adfdd..5e4ff5a7ab 100644 +index 5eb805837..836324a37 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java -@@ -375,12 +375,16 @@ public class CraftWorld implements World { +@@ -376,12 +376,16 @@ public class CraftWorld implements World { @Override public boolean setSpawnLocation(int x, int y, int z) { try { diff --git a/patches/server/0084-Add-sleep-options.patch b/patches/server/0085-Add-sleep-options.patch similarity index 96% rename from patches/server/0084-Add-sleep-options.patch rename to patches/server/0085-Add-sleep-options.patch index 43c51ed67..2ad7a237c 100644 --- a/patches/server/0084-Add-sleep-options.patch +++ b/patches/server/0085-Add-sleep-options.patch @@ -1,4 +1,4 @@ -From 920b79a97b853e9fecf62995d03b7c1c07506cc0 Mon Sep 17 00:00:00 2001 +From 1ce8e618932c3becd040859c128a23d86eb73124 Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Sat, 30 Nov 2019 03:30:17 -0600 Subject: [PATCH] Add sleep options @@ -9,7 +9,7 @@ Subject: [PATCH] Add sleep options 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/src/main/java/net/minecraft/server/EntityHuman.java b/src/main/java/net/minecraft/server/EntityHuman.java -index 9d26bd1e4c..36582a80af 100644 +index 9d26bd1e4..36582a80a 100644 --- a/src/main/java/net/minecraft/server/EntityHuman.java +++ b/src/main/java/net/minecraft/server/EntityHuman.java @@ -143,6 +143,21 @@ public abstract class EntityHuman extends EntityLiving { @@ -53,7 +53,7 @@ index 9d26bd1e4c..36582a80af 100644 return Either.left(EntityHuman.EnumBedResult.NOT_POSSIBLE_NOW); } diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -index ded5e9fbb6..0ca7b9a1fb 100644 +index 0b8b2a4e9..ae402ff52 100644 --- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java +++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java @@ -159,6 +159,8 @@ public class PurpurWorldConfig { diff --git a/patches/server/0085-Option-for-hay-block-fall-damage.patch b/patches/server/0086-Option-for-hay-block-fall-damage.patch similarity index 91% rename from patches/server/0085-Option-for-hay-block-fall-damage.patch rename to patches/server/0086-Option-for-hay-block-fall-damage.patch index dad12383c..6fe70e963 100644 --- a/patches/server/0085-Option-for-hay-block-fall-damage.patch +++ b/patches/server/0086-Option-for-hay-block-fall-damage.patch @@ -1,4 +1,4 @@ -From ace2bd7881eeaa98dfd90b67d1d434eb40de1300 Mon Sep 17 00:00:00 2001 +From d4f7108c9a78737c07805a4e89b949e4aaf3b21e Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Sat, 30 Nov 2019 01:31:09 -0600 Subject: [PATCH] Option for hay block fall damage @@ -9,7 +9,7 @@ Subject: [PATCH] Option for hay block fall damage 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/main/java/net/minecraft/server/BlockHay.java b/src/main/java/net/minecraft/server/BlockHay.java -index ca81c49f0a..1f8f60542f 100644 +index ca81c49f0..1f8f60542 100644 --- a/src/main/java/net/minecraft/server/BlockHay.java +++ b/src/main/java/net/minecraft/server/BlockHay.java @@ -9,6 +9,6 @@ public class BlockHay extends BlockRotatable { @@ -21,7 +21,7 @@ index ca81c49f0a..1f8f60542f 100644 } } diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -index 0ca7b9a1fb..5a15980009 100644 +index ae402ff52..98dc35fc8 100644 --- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java +++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java @@ -127,6 +127,11 @@ public class PurpurWorldConfig { diff --git a/patches/server/0086-Add-getPlayer-to-SkeletonHorseTrapEvent.patch b/patches/server/0087-Add-getPlayer-to-SkeletonHorseTrapEvent.patch similarity index 95% rename from patches/server/0086-Add-getPlayer-to-SkeletonHorseTrapEvent.patch rename to patches/server/0087-Add-getPlayer-to-SkeletonHorseTrapEvent.patch index 540f24a87..54a7551e8 100644 --- a/patches/server/0086-Add-getPlayer-to-SkeletonHorseTrapEvent.patch +++ b/patches/server/0087-Add-getPlayer-to-SkeletonHorseTrapEvent.patch @@ -1,4 +1,4 @@ -From 65a050af2f6af908c3e0e11cafc58ea2d695119d Mon Sep 17 00:00:00 2001 +From a680a42a47a4eadb9abef776a61d66cc946a0037 Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Sat, 19 Oct 2019 02:35:35 -0500 Subject: [PATCH] Add getPlayer to SkeletonHorseTrapEvent @@ -8,7 +8,7 @@ Subject: [PATCH] Add getPlayer to SkeletonHorseTrapEvent 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/main/java/net/minecraft/server/PathfinderGoalHorseTrap.java b/src/main/java/net/minecraft/server/PathfinderGoalHorseTrap.java -index 37626f925f..f8fd2d99cc 100644 +index 37626f925..f8fd2d99c 100644 --- a/src/main/java/net/minecraft/server/PathfinderGoalHorseTrap.java +++ b/src/main/java/net/minecraft/server/PathfinderGoalHorseTrap.java @@ -2,7 +2,8 @@ package net.minecraft.server; diff --git a/patches/server/0087-Add-LootableInventoryFirstFillEvent.patch b/patches/server/0088-Add-LootableInventoryFirstFillEvent.patch similarity index 94% rename from patches/server/0087-Add-LootableInventoryFirstFillEvent.patch rename to patches/server/0088-Add-LootableInventoryFirstFillEvent.patch index a6c8fc203..a6f08759c 100644 --- a/patches/server/0087-Add-LootableInventoryFirstFillEvent.patch +++ b/patches/server/0088-Add-LootableInventoryFirstFillEvent.patch @@ -1,4 +1,4 @@ -From 6db35bedb6ee3942abbbb3fd5d00fc6049d85510 Mon Sep 17 00:00:00 2001 +From f315a2722004716a90ae3e269ee1814d858d49ac Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Sat, 19 Oct 2019 02:43:17 -0500 Subject: [PATCH] Add LootableInventoryFirstFillEvent @@ -9,7 +9,7 @@ Subject: [PATCH] Add LootableInventoryFirstFillEvent 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/destroystokyo/paper/loottable/PaperLootableInventoryData.java b/src/main/java/com/destroystokyo/paper/loottable/PaperLootableInventoryData.java -index b5401eaf97..1decf0e895 100644 +index b5401eaf9..1decf0e89 100644 --- a/src/main/java/com/destroystokyo/paper/loottable/PaperLootableInventoryData.java +++ b/src/main/java/com/destroystokyo/paper/loottable/PaperLootableInventoryData.java @@ -49,6 +49,10 @@ public class PaperLootableInventoryData { @@ -24,7 +24,7 @@ index b5401eaf97..1decf0e895 100644 } diff --git a/src/main/java/com/destroystokyo/paper/loottable/PaperTileEntityLootableInventory.java b/src/main/java/com/destroystokyo/paper/loottable/PaperTileEntityLootableInventory.java -index d50410532c..2f24e5a702 100644 +index d50410532..2f24e5a70 100644 --- a/src/main/java/com/destroystokyo/paper/loottable/PaperTileEntityLootableInventory.java +++ b/src/main/java/com/destroystokyo/paper/loottable/PaperTileEntityLootableInventory.java @@ -57,7 +57,10 @@ public class PaperTileEntityLootableInventory implements PaperLootableBlockInven diff --git a/patches/server/0088-Villagers-follow-emerald-blocks.patch b/patches/server/0089-Villagers-follow-emerald-blocks.patch similarity index 95% rename from patches/server/0088-Villagers-follow-emerald-blocks.patch rename to patches/server/0089-Villagers-follow-emerald-blocks.patch index bd9830ec1..7f58d5ce3 100644 --- a/patches/server/0088-Villagers-follow-emerald-blocks.patch +++ b/patches/server/0089-Villagers-follow-emerald-blocks.patch @@ -1,4 +1,4 @@ -From dab726dcc50ce0b012d95738f2a52da68863399d Mon Sep 17 00:00:00 2001 +From 4cdbeb69f1ddf8a47a788e96fcc3d11a86c4bf08 Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Fri, 29 Nov 2019 22:10:12 -0600 Subject: [PATCH] Villagers follow emerald blocks @@ -11,7 +11,7 @@ Subject: [PATCH] Villagers follow emerald blocks 4 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/main/java/net/minecraft/server/EntityVillager.java b/src/main/java/net/minecraft/server/EntityVillager.java -index 65cd5f53c1..b31f614e6b 100644 +index 65cd5f53c..b31f614e6 100644 --- a/src/main/java/net/minecraft/server/EntityVillager.java +++ b/src/main/java/net/minecraft/server/EntityVillager.java @@ -89,6 +89,7 @@ public class EntityVillager extends EntityVillagerAbstract implements Reputation @@ -23,7 +23,7 @@ index 65cd5f53c1..b31f614e6b 100644 // Purpur end diff --git a/src/main/java/net/minecraft/server/EntityVillagerAbstract.java b/src/main/java/net/minecraft/server/EntityVillagerAbstract.java -index ddd19aa2f9..44947be833 100644 +index ddd19aa2f..44947be83 100644 --- a/src/main/java/net/minecraft/server/EntityVillagerAbstract.java +++ b/src/main/java/net/minecraft/server/EntityVillagerAbstract.java @@ -13,7 +13,7 @@ import org.bukkit.event.entity.VillagerAcquireTradeEvent; @@ -36,7 +36,7 @@ index ddd19aa2f9..44947be833 100644 private CraftMerchant craftMerchant; diff --git a/src/main/java/net/minecraft/server/EntityVillagerTrader.java b/src/main/java/net/minecraft/server/EntityVillagerTrader.java -index 4e9c5e84a9..14ca5fc367 100644 +index 4e9c5e84a..14ca5fc36 100644 --- a/src/main/java/net/minecraft/server/EntityVillagerTrader.java +++ b/src/main/java/net/minecraft/server/EntityVillagerTrader.java @@ -57,6 +57,7 @@ public class EntityVillagerTrader extends EntityVillagerAbstract { @@ -48,7 +48,7 @@ index 4e9c5e84a9..14ca5fc367 100644 this.goalSelector.a(8, new PathfinderGoalRandomStrollLand(this, 0.35D)); this.goalSelector.a(9, new PathfinderGoalInteract(this, EntityHuman.class, 3.0F, 1.0F)); diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -index 98dc35fc80..2dfbae959f 100644 +index 98dc35fc8..2dfbae959 100644 --- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java +++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java @@ -776,21 +776,25 @@ public class PurpurWorldConfig { diff --git a/patches/server/0089-Add-player-death-exp-control-options.patch b/patches/server/0090-Add-player-death-exp-control-options.patch similarity index 96% rename from patches/server/0089-Add-player-death-exp-control-options.patch rename to patches/server/0090-Add-player-death-exp-control-options.patch index c71a0e2c3..d29d24433 100644 --- a/patches/server/0089-Add-player-death-exp-control-options.patch +++ b/patches/server/0090-Add-player-death-exp-control-options.patch @@ -1,4 +1,4 @@ -From ceb124e478c28f8e68939467a2b0879a63bdc457 Mon Sep 17 00:00:00 2001 +From b6323fd72ac5f115e111a57e0cb5ac9344d751d3 Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Thu, 26 Dec 2019 22:08:37 -0600 Subject: [PATCH] Add player death exp control options @@ -9,7 +9,7 @@ Subject: [PATCH] Add player death exp control options 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/src/main/java/net/minecraft/server/EntityHuman.java b/src/main/java/net/minecraft/server/EntityHuman.java -index 36582a80af..d7e00b06b8 100644 +index 36582a80a..d7e00b06b 100644 --- a/src/main/java/net/minecraft/server/EntityHuman.java +++ b/src/main/java/net/minecraft/server/EntityHuman.java @@ -1862,9 +1862,18 @@ public abstract class EntityHuman extends EntityLiving { @@ -35,7 +35,7 @@ index 36582a80af..d7e00b06b8 100644 return 0; } diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -index 23bf936e99..f1c094327d 100644 +index 2dfbae959..a229c1a2e 100644 --- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java +++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java @@ -164,6 +164,8 @@ public class PurpurWorldConfig { diff --git a/patches/server/0090-Add-permission-for-F3-N-debug.patch b/patches/server/0091-Add-permission-for-F3-N-debug.patch similarity index 89% rename from patches/server/0090-Add-permission-for-F3-N-debug.patch rename to patches/server/0091-Add-permission-for-F3-N-debug.patch index 31a7bb3bf..af701706e 100644 --- a/patches/server/0090-Add-permission-for-F3-N-debug.patch +++ b/patches/server/0091-Add-permission-for-F3-N-debug.patch @@ -1,4 +1,4 @@ -From bf6cab6fc33d6aaedea9b3e037f45072c725d076 Mon Sep 17 00:00:00 2001 +From 751e0f52ac4348f126a627dd8434da5c9467458a Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Sat, 28 Dec 2019 04:21:54 -0600 Subject: [PATCH] Add permission for F3+N debug @@ -8,7 +8,7 @@ Subject: [PATCH] Add permission for F3+N debug 1 file changed, 1 insertion(+) diff --git a/src/main/java/net/minecraft/server/PlayerList.java b/src/main/java/net/minecraft/server/PlayerList.java -index 3975312394..39b33d9d72 100644 +index cf8f24b31..e770fd6e4 100644 --- a/src/main/java/net/minecraft/server/PlayerList.java +++ b/src/main/java/net/minecraft/server/PlayerList.java @@ -902,6 +902,7 @@ public abstract class PlayerList { diff --git a/patches/server/0091-Allow-leashing-villagers.patch b/patches/server/0092-Allow-leashing-villagers.patch similarity index 94% rename from patches/server/0091-Allow-leashing-villagers.patch rename to patches/server/0092-Allow-leashing-villagers.patch index 9dec62c55..b57c19352 100644 --- a/patches/server/0091-Allow-leashing-villagers.patch +++ b/patches/server/0092-Allow-leashing-villagers.patch @@ -1,4 +1,4 @@ -From 3912267bb767de057f23391a132baa64c3a8ac82 Mon Sep 17 00:00:00 2001 +From 80e462d15868475827d4031ad2ebf3003f249633 Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Thu, 3 Oct 2019 18:08:03 -0500 Subject: [PATCH] Allow leashing villagers @@ -11,10 +11,10 @@ Subject: [PATCH] Allow leashing villagers 4 files changed, 19 insertions(+) diff --git a/src/main/java/net/minecraft/server/EntityInsentient.java b/src/main/java/net/minecraft/server/EntityInsentient.java -index 66b4831949..bac6cea1ff 100644 +index 742745cb4..22fa51cba 100644 --- a/src/main/java/net/minecraft/server/EntityInsentient.java +++ b/src/main/java/net/minecraft/server/EntityInsentient.java -@@ -1062,6 +1062,7 @@ public abstract class EntityInsentient extends EntityLiving { +@@ -1069,6 +1069,7 @@ public abstract class EntityInsentient extends EntityLiving { if (!this.isAlive()) { return false; } else if (this.getLeashHolder() == entityhuman) { @@ -23,7 +23,7 @@ index 66b4831949..bac6cea1ff 100644 if (CraftEventFactory.callPlayerUnleashEntityEvent(this, entityhuman).isCancelled()) { ((EntityPlayer) entityhuman).playerConnection.sendPacket(new PacketPlayOutAttachEntity(this, this.getLeashHolder())); diff --git a/src/main/java/net/minecraft/server/EntityVillager.java b/src/main/java/net/minecraft/server/EntityVillager.java -index b31f614e6b..315440b3fb 100644 +index b31f614e6..315440b3f 100644 --- a/src/main/java/net/minecraft/server/EntityVillager.java +++ b/src/main/java/net/minecraft/server/EntityVillager.java @@ -1006,4 +1006,11 @@ public class EntityVillager extends EntityVillagerAbstract implements Reputation @@ -39,7 +39,7 @@ index b31f614e6b..315440b3fb 100644 + // Purpur - end } diff --git a/src/main/java/net/minecraft/server/EntityVillagerTrader.java b/src/main/java/net/minecraft/server/EntityVillagerTrader.java -index 14ca5fc367..427c589075 100644 +index 14ca5fc36..427c58907 100644 --- a/src/main/java/net/minecraft/server/EntityVillagerTrader.java +++ b/src/main/java/net/minecraft/server/EntityVillagerTrader.java @@ -283,4 +283,11 @@ public class EntityVillagerTrader extends EntityVillagerAbstract { @@ -55,7 +55,7 @@ index 14ca5fc367..427c589075 100644 + // Purpur - end } diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -index a229c1a2ea..dd281fb64e 100644 +index a229c1a2e..dd281fb64 100644 --- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java +++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java @@ -781,6 +781,7 @@ public class PurpurWorldConfig { diff --git a/patches/server/0092-Implement-configurable-search-radius-for-villagers-t.patch b/patches/server/0093-Implement-configurable-search-radius-for-villagers-t.patch similarity index 95% rename from patches/server/0092-Implement-configurable-search-radius-for-villagers-t.patch rename to patches/server/0093-Implement-configurable-search-radius-for-villagers-t.patch index e43538a84..c2fe1a4c6 100644 --- a/patches/server/0092-Implement-configurable-search-radius-for-villagers-t.patch +++ b/patches/server/0093-Implement-configurable-search-radius-for-villagers-t.patch @@ -1,4 +1,4 @@ -From 9aaa4f3198815f3eed97639747faf5ef01424ad3 Mon Sep 17 00:00:00 2001 +From bf7a6d722114c91a824c26745140476f73ffefe7 Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Mon, 22 Jul 2019 17:32:17 -0500 Subject: [PATCH] Implement configurable search radius for villagers to spawn @@ -10,7 +10,7 @@ Subject: [PATCH] Implement configurable search radius for villagers to spawn 2 files changed, 5 insertions(+) diff --git a/src/main/java/net/minecraft/server/EntityVillager.java b/src/main/java/net/minecraft/server/EntityVillager.java -index 315440b3fb..fe0e646ea6 100644 +index 315440b3f..fe0e646ea 100644 --- a/src/main/java/net/minecraft/server/EntityVillager.java +++ b/src/main/java/net/minecraft/server/EntityVillager.java @@ -903,6 +903,7 @@ public class EntityVillager extends EntityVillagerAbstract implements Reputation @@ -22,7 +22,7 @@ index 315440b3fb..fe0e646ea6 100644 int i = 0; diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -index dd281fb64e..39db32950b 100644 +index dd281fb64..39db32950 100644 --- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java +++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java @@ -782,6 +782,8 @@ public class PurpurWorldConfig { diff --git a/patches/server/0093-Add-option-for-zombie-villager-transformation-chance.patch b/patches/server/0094-Add-option-for-zombie-villager-transformation-chance.patch similarity index 95% rename from patches/server/0093-Add-option-for-zombie-villager-transformation-chance.patch rename to patches/server/0094-Add-option-for-zombie-villager-transformation-chance.patch index 35c07147a..ab238518a 100644 --- a/patches/server/0093-Add-option-for-zombie-villager-transformation-chance.patch +++ b/patches/server/0094-Add-option-for-zombie-villager-transformation-chance.patch @@ -1,4 +1,4 @@ -From 515e6f02a0b5bb78cc80d12835d34cd1506f35e0 Mon Sep 17 00:00:00 2001 +From b6568489240e7e223b2bb7a44f77d014f7e0c0d2 Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Thu, 19 Dec 2019 16:59:46 -0600 Subject: [PATCH] Add option for zombie villager transformation chance @@ -9,7 +9,7 @@ Subject: [PATCH] Add option for zombie villager transformation chance 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/main/java/net/minecraft/server/EntityZombie.java b/src/main/java/net/minecraft/server/EntityZombie.java -index 1e60cc399b..8938dc50fe 100644 +index 1e60cc399..8938dc50f 100644 --- a/src/main/java/net/minecraft/server/EntityZombie.java +++ b/src/main/java/net/minecraft/server/EntityZombie.java @@ -474,10 +474,17 @@ public class EntityZombie extends EntityMonster { @@ -33,7 +33,7 @@ index 1e60cc399b..8938dc50fe 100644 EntityVillager entityvillager = (EntityVillager) entityliving; EntityZombieVillager entityzombievillager = (EntityZombieVillager) EntityTypes.ZOMBIE_VILLAGER.a(this.world); diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -index 39db32950b..e8608a39c8 100644 +index 39db32950..e8608a39c 100644 --- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java +++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java @@ -860,11 +860,13 @@ public class PurpurWorldConfig { diff --git a/patches/server/0094-Make-lava-flow-speed-configurable.patch b/patches/server/0095-Make-lava-flow-speed-configurable.patch similarity index 93% rename from patches/server/0094-Make-lava-flow-speed-configurable.patch rename to patches/server/0095-Make-lava-flow-speed-configurable.patch index a5d186df0..85487d50a 100644 --- a/patches/server/0094-Make-lava-flow-speed-configurable.patch +++ b/patches/server/0095-Make-lava-flow-speed-configurable.patch @@ -1,4 +1,4 @@ -From 9f46957296944f91781fc171795fbd0694836d83 Mon Sep 17 00:00:00 2001 +From 6dfcd7a525e95d9be587f5015c40e8d33eb65bc4 Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Thu, 2 Jan 2020 11:31:36 -0600 Subject: [PATCH] Make lava flow speed configurable @@ -10,7 +10,7 @@ Subject: [PATCH] Make lava flow speed configurable 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/main/java/net/minecraft/server/FluidTypeLava.java b/src/main/java/net/minecraft/server/FluidTypeLava.java -index 09f82c2d92..470e9bfd01 100644 +index 09f82c2d9..470e9bfd0 100644 --- a/src/main/java/net/minecraft/server/FluidTypeLava.java +++ b/src/main/java/net/minecraft/server/FluidTypeLava.java @@ -129,7 +129,7 @@ public abstract class FluidTypeLava extends FluidTypeFlowing { @@ -23,7 +23,7 @@ index 09f82c2d92..470e9bfd01 100644 @Override diff --git a/src/main/java/net/minecraft/server/WorldProvider.java b/src/main/java/net/minecraft/server/WorldProvider.java -index 39252e6873..75f8441ab6 100644 +index 39252e687..75f8441ab 100644 --- a/src/main/java/net/minecraft/server/WorldProvider.java +++ b/src/main/java/net/minecraft/server/WorldProvider.java @@ -42,6 +42,7 @@ public abstract class WorldProvider { @@ -35,7 +35,7 @@ index 39252e6873..75f8441ab6 100644 return this.d; } diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -index e79b4df1a7..ff3424efdc 100644 +index e8608a39c..a74acfbca 100644 --- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java +++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java @@ -133,8 +133,12 @@ public class PurpurWorldConfig { diff --git a/patches/server/0095-Add-wither-skeleton-takes-wither-damage-option.patch b/patches/server/0096-Add-wither-skeleton-takes-wither-damage-option.patch similarity index 94% rename from patches/server/0095-Add-wither-skeleton-takes-wither-damage-option.patch rename to patches/server/0096-Add-wither-skeleton-takes-wither-damage-option.patch index 614612027..0249ba967 100644 --- a/patches/server/0095-Add-wither-skeleton-takes-wither-damage-option.patch +++ b/patches/server/0096-Add-wither-skeleton-takes-wither-damage-option.patch @@ -1,4 +1,4 @@ -From 7dc4d5f22d9fd7cb5b93cd75edddffaf6d8af6f7 Mon Sep 17 00:00:00 2001 +From 1959e9a893248dcf0ab0c5cc0e610dffe7d5376e Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Tue, 14 Jan 2020 19:43:40 -0600 Subject: [PATCH] Add wither skeleton takes wither damage option @@ -9,7 +9,7 @@ Subject: [PATCH] Add wither skeleton takes wither damage option 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/net/minecraft/server/EntitySkeletonWither.java b/src/main/java/net/minecraft/server/EntitySkeletonWither.java -index 8aa0a6699f..0fd740e717 100644 +index 8aa0a6699..0fd740e71 100644 --- a/src/main/java/net/minecraft/server/EntitySkeletonWither.java +++ b/src/main/java/net/minecraft/server/EntitySkeletonWither.java @@ -108,6 +108,6 @@ public class EntitySkeletonWither extends EntitySkeletonAbstract { @@ -21,7 +21,7 @@ index 8aa0a6699f..0fd740e717 100644 } } diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -index a74acfbca8..dde0a94313 100644 +index a74acfbca..dde0a9431 100644 --- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java +++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java @@ -845,10 +845,12 @@ public class PurpurWorldConfig { diff --git a/patches/server/0096-UPnP-Port-Forwarding-Service.patch b/patches/server/0097-UPnP-Port-Forwarding-Service.patch similarity index 95% rename from patches/server/0096-UPnP-Port-Forwarding-Service.patch rename to patches/server/0097-UPnP-Port-Forwarding-Service.patch index a08045a7e..8bd8f5433 100644 --- a/patches/server/0096-UPnP-Port-Forwarding-Service.patch +++ b/patches/server/0097-UPnP-Port-Forwarding-Service.patch @@ -1,4 +1,4 @@ -From 45d66e6a83319a95d84b9715a08da08799f4ea6d Mon Sep 17 00:00:00 2001 +From 870451c27735d64f846c2a62c6c78e6735cd0f30 Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Wed, 22 Jan 2020 20:13:40 -0600 Subject: [PATCH] UPnP Port Forwarding Service @@ -14,7 +14,7 @@ Subject: [PATCH] UPnP Port Forwarding Service create mode 100644 src/main/java/net/pl3x/purpur/gui/info/UPnPComponent.java diff --git a/pom.xml b/pom.xml -index e6fc4d014e..02fe29cb6c 100644 +index ffac75de2..a4c2765aa 100644 --- a/pom.xml +++ b/pom.xml @@ -94,6 +94,12 @@ @@ -30,7 +30,7 @@ index e6fc4d014e..02fe29cb6c 100644 org.xerial sqlite-jdbc -@@ -132,6 +138,10 @@ +@@ -138,6 +144,10 @@ spigotmc-public https://hub.spigotmc.org/nexus/content/groups/public/ @@ -42,10 +42,10 @@ index e6fc4d014e..02fe29cb6c 100644 diff --git a/src/main/java/net/minecraft/server/DedicatedServer.java b/src/main/java/net/minecraft/server/DedicatedServer.java -index 61ccb6079e..a85df1ff49 100644 +index 5337c0be0..757f892e8 100644 --- a/src/main/java/net/minecraft/server/DedicatedServer.java +++ b/src/main/java/net/minecraft/server/DedicatedServer.java -@@ -238,6 +238,31 @@ public class DedicatedServer extends MinecraftServer implements IMinecraftServer +@@ -239,6 +239,31 @@ public class DedicatedServer extends MinecraftServer implements IMinecraftServer return false; } @@ -78,7 +78,7 @@ index 61ccb6079e..a85df1ff49 100644 // this.a((PlayerList) (new DedicatedPlayerList(this))); // Spigot - moved up server.loadPlugins(); diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java -index e11b94e154..3cd0c48e81 100644 +index b98efe326..9af75a8ae 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java @@ -181,6 +181,7 @@ public abstract class MinecraftServer extends IAsyncTaskHandlerReentrant Date: Tue, 11 Feb 2020 21:56:48 -0600 Subject: [PATCH] Implement EntityMoveEvent @@ -8,7 +8,7 @@ Subject: [PATCH] Implement EntityMoveEvent 1 file changed, 15 insertions(+) diff --git a/src/main/java/net/minecraft/server/EntityLiving.java b/src/main/java/net/minecraft/server/EntityLiving.java -index 60e2b4268c..e3dc406da5 100644 +index 60e2b4268..e3dc406da 100644 --- a/src/main/java/net/minecraft/server/EntityLiving.java +++ b/src/main/java/net/minecraft/server/EntityLiving.java @@ -17,6 +17,7 @@ import java.util.Random; diff --git a/patches/server/0098-Add-option-to-disable-saving-projectiles-to-disk.patch b/patches/server/0099-Add-option-to-disable-saving-projectiles-to-disk.patch similarity index 94% rename from patches/server/0098-Add-option-to-disable-saving-projectiles-to-disk.patch rename to patches/server/0099-Add-option-to-disable-saving-projectiles-to-disk.patch index e75a6d394..3da24d8f3 100644 --- a/patches/server/0098-Add-option-to-disable-saving-projectiles-to-disk.patch +++ b/patches/server/0099-Add-option-to-disable-saving-projectiles-to-disk.patch @@ -1,4 +1,4 @@ -From 9199ab8c562c7628df3a8eca6c20eb5ffffb10f7 Mon Sep 17 00:00:00 2001 +From a93589339238a1fe52ec303429291d8bfa1f92e4 Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Tue, 18 Feb 2020 20:07:08 -0600 Subject: [PATCH] Add option to disable saving projectiles to disk @@ -9,10 +9,10 @@ Subject: [PATCH] Add option to disable saving projectiles to disk 2 files changed, 17 insertions(+) diff --git a/src/main/java/net/minecraft/server/ChunkRegionLoader.java b/src/main/java/net/minecraft/server/ChunkRegionLoader.java -index 4349d22cc8..a7fe7722af 100644 +index d529b795c..c6ea18ad7 100644 --- a/src/main/java/net/minecraft/server/ChunkRegionLoader.java +++ b/src/main/java/net/minecraft/server/ChunkRegionLoader.java -@@ -437,6 +437,7 @@ public class ChunkRegionLoader { +@@ -445,6 +445,7 @@ public class ChunkRegionLoader { while (iterator1.hasNext()) { Entity entity = (Entity) iterator1.next(); @@ -21,7 +21,7 @@ index 4349d22cc8..a7fe7722af 100644 // Paper start if ((int) Math.floor(entity.locX()) >> 4 != chunk.getPos().x || (int) Math.floor(entity.locZ()) >> 4 != chunk.getPos().z) { diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -index 60407b2a02..be85d454b2 100644 +index dde0a9431..f856758a0 100644 --- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java +++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java @@ -173,6 +173,7 @@ public class PurpurWorldConfig { diff --git a/patches/server/0099-Always-increment-arrow-despawn-counter-fixes-MC-1257.patch b/patches/server/0100-Always-increment-arrow-despawn-counter-fixes-MC-1257.patch similarity index 95% rename from patches/server/0099-Always-increment-arrow-despawn-counter-fixes-MC-1257.patch rename to patches/server/0100-Always-increment-arrow-despawn-counter-fixes-MC-1257.patch index 1616483fe..b19b9c7aa 100644 --- a/patches/server/0099-Always-increment-arrow-despawn-counter-fixes-MC-1257.patch +++ b/patches/server/0100-Always-increment-arrow-despawn-counter-fixes-MC-1257.patch @@ -1,4 +1,4 @@ -From 2233b872c0256efa6c1b5f23f60dc4d6647ab471 Mon Sep 17 00:00:00 2001 +From 14607b077ba334ef76fe9075cc6eadd30e74efdc Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Fri, 21 Feb 2020 17:04:51 -0600 Subject: [PATCH] Always increment arrow despawn counter (fixes MC-125757) @@ -8,7 +8,7 @@ Subject: [PATCH] Always increment arrow despawn counter (fixes MC-125757) 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/java/net/minecraft/server/EntityArrow.java b/src/main/java/net/minecraft/server/EntityArrow.java -index 9c97edf9c9..2dae2c1c89 100644 +index 9c97edf9c..2dae2c1c8 100644 --- a/src/main/java/net/minecraft/server/EntityArrow.java +++ b/src/main/java/net/minecraft/server/EntityArrow.java @@ -147,6 +147,8 @@ public abstract class EntityArrow extends Entity implements IProjectile { diff --git a/patches/server/0100-Implement-bed-explosion-options.patch b/patches/server/0101-Implement-bed-explosion-options.patch similarity index 96% rename from patches/server/0100-Implement-bed-explosion-options.patch rename to patches/server/0101-Implement-bed-explosion-options.patch index aea9d079f..22fe48882 100644 --- a/patches/server/0100-Implement-bed-explosion-options.patch +++ b/patches/server/0101-Implement-bed-explosion-options.patch @@ -1,4 +1,4 @@ -From 6941ab17b247e48c0b56e7134789bfb08e1fcbc1 Mon Sep 17 00:00:00 2001 +From f63a8e8488b2fc9ce4f7e053acc7dfea01878c82 Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Sat, 22 Feb 2020 15:04:29 -0600 Subject: [PATCH] Implement bed explosion options @@ -9,7 +9,7 @@ Subject: [PATCH] Implement bed explosion options 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/src/main/java/net/minecraft/server/BlockBed.java b/src/main/java/net/minecraft/server/BlockBed.java -index 06a35629ab..df41a7dfcd 100644 +index 06a35629a..df41a7dfc 100644 --- a/src/main/java/net/minecraft/server/BlockBed.java +++ b/src/main/java/net/minecraft/server/BlockBed.java @@ -84,7 +84,7 @@ public class BlockBed extends BlockFacingHorizontal implements ITileEntity { @@ -22,7 +22,7 @@ index 06a35629ab..df41a7dfcd 100644 // CraftBukkit end } diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -index be85d454b2..5054f7b6a3 100644 +index f856758a0..4d32706fa 100644 --- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java +++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java @@ -3,6 +3,7 @@ package net.pl3x.purpur; diff --git a/patches/server/0101-Add-item-entity-options.patch b/patches/server/0102-Add-item-entity-options.patch similarity index 96% rename from patches/server/0101-Add-item-entity-options.patch rename to patches/server/0102-Add-item-entity-options.patch index 954277c82..00182bbd7 100644 --- a/patches/server/0101-Add-item-entity-options.patch +++ b/patches/server/0102-Add-item-entity-options.patch @@ -1,4 +1,4 @@ -From 54581abda4cb33151ebaec820b689496a60ae84c Mon Sep 17 00:00:00 2001 +From c533b0e8405aa25042e50a41b885da429de7f326 Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Sat, 22 Feb 2020 15:54:08 -0600 Subject: [PATCH] Add item entity options @@ -10,10 +10,10 @@ Subject: [PATCH] Add item entity options 3 files changed, 28 insertions(+), 1 deletion(-) diff --git a/src/main/java/net/minecraft/server/Entity.java b/src/main/java/net/minecraft/server/Entity.java -index f1c749c38f..98aef47056 100644 +index 147e30aa2..0d509e841 100644 --- a/src/main/java/net/minecraft/server/Entity.java +++ b/src/main/java/net/minecraft/server/Entity.java -@@ -1257,6 +1257,7 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke +@@ -1309,6 +1309,7 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke } @@ -22,7 +22,7 @@ index f1c749c38f..98aef47056 100644 return this.a(tag, false); } diff --git a/src/main/java/net/minecraft/server/EntityItem.java b/src/main/java/net/minecraft/server/EntityItem.java -index bbb9ca1efc..262a7935e7 100644 +index bbb9ca1ef..262a7935e 100644 --- a/src/main/java/net/minecraft/server/EntityItem.java +++ b/src/main/java/net/minecraft/server/EntityItem.java @@ -71,7 +71,7 @@ public class EntityItem extends Entity { @@ -56,7 +56,7 @@ index bbb9ca1efc..262a7935e7 100644 if (org.bukkit.craftbukkit.event.CraftEventFactory.handleNonLivingEntityDamageEvent(this, damagesource, f)) { return false; diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -index 4d32706fa1..7aed41f0f9 100644 +index 4d32706fa..7aed41f0f 100644 --- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java +++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java @@ -5,6 +5,8 @@ import net.minecraft.server.Block; diff --git a/patches/server/0102-Make-natural-spawns-per-biome-configurable.patch b/patches/server/0103-Make-natural-spawns-per-biome-configurable.patch similarity index 98% rename from patches/server/0102-Make-natural-spawns-per-biome-configurable.patch rename to patches/server/0103-Make-natural-spawns-per-biome-configurable.patch index c1887aa21..17bbcb9df 100644 --- a/patches/server/0102-Make-natural-spawns-per-biome-configurable.patch +++ b/patches/server/0103-Make-natural-spawns-per-biome-configurable.patch @@ -1,4 +1,4 @@ -From 16367235204424d27caa39c93d855efe48a85462 Mon Sep 17 00:00:00 2001 +From 8032b58cfb1c781e1a7bc68936414b99f6c56af2 Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Thu, 27 Feb 2020 13:39:06 -0600 Subject: [PATCH] Make natural spawns per biome configurable @@ -86,7 +86,7 @@ Subject: [PATCH] Make natural spawns per biome configurable create mode 100644 src/main/resources/biomes.yml diff --git a/src/main/java/net/minecraft/server/BiomeBambooJungle.java b/src/main/java/net/minecraft/server/BiomeBambooJungle.java -index 9c38f8907a..3980504d9c 100644 +index 9c38f8907..3980504d9 100644 --- a/src/main/java/net/minecraft/server/BiomeBambooJungle.java +++ b/src/main/java/net/minecraft/server/BiomeBambooJungle.java @@ -22,22 +22,6 @@ public class BiomeBambooJungle extends BiomeBase { @@ -114,7 +114,7 @@ index 9c38f8907a..3980504d9c 100644 } } diff --git a/src/main/java/net/minecraft/server/BiomeBambooJungleHills.java b/src/main/java/net/minecraft/server/BiomeBambooJungleHills.java -index 2a6dafccdd..501314da9a 100644 +index 2a6dafccd..501314da9 100644 --- a/src/main/java/net/minecraft/server/BiomeBambooJungleHills.java +++ b/src/main/java/net/minecraft/server/BiomeBambooJungleHills.java @@ -22,22 +22,6 @@ public final class BiomeBambooJungleHills extends BiomeBase { @@ -142,7 +142,7 @@ index 2a6dafccdd..501314da9a 100644 } } diff --git a/src/main/java/net/minecraft/server/BiomeBase.java b/src/main/java/net/minecraft/server/BiomeBase.java -index 0102a170dc..6e0627fdca 100644 +index 0102a170d..6e0627fdc 100644 --- a/src/main/java/net/minecraft/server/BiomeBase.java +++ b/src/main/java/net/minecraft/server/BiomeBase.java @@ -17,8 +17,25 @@ import org.apache.logging.log4j.Logger; @@ -199,7 +199,7 @@ index 0102a170dc..6e0627fdca 100644 ((List) this.v.get(enumcreaturetype)).add(biomebase_biomemeta); } diff --git a/src/main/java/net/minecraft/server/BiomeBeach.java b/src/main/java/net/minecraft/server/BiomeBeach.java -index f4e9345aeb..d8ff2c9a21 100644 +index f4e9345ae..d8ff2c9a2 100644 --- a/src/main/java/net/minecraft/server/BiomeBeach.java +++ b/src/main/java/net/minecraft/server/BiomeBeach.java @@ -20,15 +20,6 @@ public final class BiomeBeach extends BiomeBase { @@ -220,7 +220,7 @@ index f4e9345aeb..d8ff2c9a21 100644 } } diff --git a/src/main/java/net/minecraft/server/BiomeBigHills.java b/src/main/java/net/minecraft/server/BiomeBigHills.java -index 58c30f6523..7107267421 100644 +index 58c30f652..710726742 100644 --- a/src/main/java/net/minecraft/server/BiomeBigHills.java +++ b/src/main/java/net/minecraft/server/BiomeBigHills.java @@ -22,19 +22,6 @@ public final class BiomeBigHills extends BiomeBase { @@ -245,7 +245,7 @@ index 58c30f6523..7107267421 100644 } } diff --git a/src/main/java/net/minecraft/server/BiomeBirchForest.java b/src/main/java/net/minecraft/server/BiomeBirchForest.java -index 9437438c82..1749c258b9 100644 +index 9437438c8..1749c258b 100644 --- a/src/main/java/net/minecraft/server/BiomeBirchForest.java +++ b/src/main/java/net/minecraft/server/BiomeBirchForest.java @@ -21,18 +21,6 @@ public final class BiomeBirchForest extends BiomeBase { @@ -269,7 +269,7 @@ index 9437438c82..1749c258b9 100644 } } diff --git a/src/main/java/net/minecraft/server/BiomeBirchForestHills.java b/src/main/java/net/minecraft/server/BiomeBirchForestHills.java -index 3e5c23d31e..5d262c9712 100644 +index 3e5c23d31..5d262c971 100644 --- a/src/main/java/net/minecraft/server/BiomeBirchForestHills.java +++ b/src/main/java/net/minecraft/server/BiomeBirchForestHills.java @@ -21,18 +21,6 @@ public final class BiomeBirchForestHills extends BiomeBase { @@ -293,7 +293,7 @@ index 3e5c23d31e..5d262c9712 100644 } } diff --git a/src/main/java/net/minecraft/server/BiomeBirchForestHillsMutated.java b/src/main/java/net/minecraft/server/BiomeBirchForestHillsMutated.java -index d5eb5c91c4..de048fb480 100644 +index d5eb5c91c..de048fb48 100644 --- a/src/main/java/net/minecraft/server/BiomeBirchForestHillsMutated.java +++ b/src/main/java/net/minecraft/server/BiomeBirchForestHillsMutated.java @@ -21,18 +21,6 @@ public final class BiomeBirchForestHillsMutated extends BiomeBase { @@ -317,7 +317,7 @@ index d5eb5c91c4..de048fb480 100644 } } diff --git a/src/main/java/net/minecraft/server/BiomeBirchForestMutated.java b/src/main/java/net/minecraft/server/BiomeBirchForestMutated.java -index e805f9568e..2115b05caa 100644 +index e805f9568..2115b05ca 100644 --- a/src/main/java/net/minecraft/server/BiomeBirchForestMutated.java +++ b/src/main/java/net/minecraft/server/BiomeBirchForestMutated.java @@ -21,18 +21,6 @@ public final class BiomeBirchForestMutated extends BiomeBase { @@ -341,7 +341,7 @@ index e805f9568e..2115b05caa 100644 } } diff --git a/src/main/java/net/minecraft/server/BiomeColdBeach.java b/src/main/java/net/minecraft/server/BiomeColdBeach.java -index 1b92f4567d..210226e19f 100644 +index 1b92f4567..210226e19 100644 --- a/src/main/java/net/minecraft/server/BiomeColdBeach.java +++ b/src/main/java/net/minecraft/server/BiomeColdBeach.java @@ -20,14 +20,6 @@ public final class BiomeColdBeach extends BiomeBase { @@ -361,7 +361,7 @@ index 1b92f4567d..210226e19f 100644 } } diff --git a/src/main/java/net/minecraft/server/BiomeColdDeepOcean.java b/src/main/java/net/minecraft/server/BiomeColdDeepOcean.java -index b9a5cb63a4..3622ef6690 100644 +index b9a5cb63a..3622ef669 100644 --- a/src/main/java/net/minecraft/server/BiomeColdDeepOcean.java +++ b/src/main/java/net/minecraft/server/BiomeColdDeepOcean.java @@ -25,18 +25,6 @@ public class BiomeColdDeepOcean extends BiomeBase { @@ -385,7 +385,7 @@ index b9a5cb63a4..3622ef6690 100644 } } diff --git a/src/main/java/net/minecraft/server/BiomeColdOcean.java b/src/main/java/net/minecraft/server/BiomeColdOcean.java -index 571c3d139d..c640aa9eeb 100644 +index 571c3d139..c640aa9ee 100644 --- a/src/main/java/net/minecraft/server/BiomeColdOcean.java +++ b/src/main/java/net/minecraft/server/BiomeColdOcean.java @@ -24,18 +24,6 @@ public class BiomeColdOcean extends BiomeBase { @@ -409,7 +409,7 @@ index 571c3d139d..c640aa9eeb 100644 } } diff --git a/src/main/java/net/minecraft/server/BiomeColdTaiga.java b/src/main/java/net/minecraft/server/BiomeColdTaiga.java -index 88400e77bf..caaa8ec999 100644 +index 88400e77b..caaa8ec99 100644 --- a/src/main/java/net/minecraft/server/BiomeColdTaiga.java +++ b/src/main/java/net/minecraft/server/BiomeColdTaiga.java @@ -23,21 +23,6 @@ public final class BiomeColdTaiga extends BiomeBase { @@ -436,7 +436,7 @@ index 88400e77bf..caaa8ec999 100644 } } diff --git a/src/main/java/net/minecraft/server/BiomeColdTaigaHills.java b/src/main/java/net/minecraft/server/BiomeColdTaigaHills.java -index 8a8fc7dbd2..323f20452d 100644 +index 8a8fc7dbd..323f20452 100644 --- a/src/main/java/net/minecraft/server/BiomeColdTaigaHills.java +++ b/src/main/java/net/minecraft/server/BiomeColdTaigaHills.java @@ -22,21 +22,6 @@ public final class BiomeColdTaigaHills extends BiomeBase { @@ -463,7 +463,7 @@ index 8a8fc7dbd2..323f20452d 100644 } } diff --git a/src/main/java/net/minecraft/server/BiomeColdTaigaMutated.java b/src/main/java/net/minecraft/server/BiomeColdTaigaMutated.java -index 327e6847f0..973eb8eeb6 100644 +index 327e6847f..973eb8eeb 100644 --- a/src/main/java/net/minecraft/server/BiomeColdTaigaMutated.java +++ b/src/main/java/net/minecraft/server/BiomeColdTaigaMutated.java @@ -22,21 +22,6 @@ public final class BiomeColdTaigaMutated extends BiomeBase { @@ -490,7 +490,7 @@ index 327e6847f0..973eb8eeb6 100644 } } diff --git a/src/main/java/net/minecraft/server/BiomeDeepOcean.java b/src/main/java/net/minecraft/server/BiomeDeepOcean.java -index 651d44cb37..7088603b15 100644 +index 651d44cb3..7088603b1 100644 --- a/src/main/java/net/minecraft/server/BiomeDeepOcean.java +++ b/src/main/java/net/minecraft/server/BiomeDeepOcean.java @@ -25,18 +25,6 @@ public final class BiomeDeepOcean extends BiomeBase { @@ -514,7 +514,7 @@ index 651d44cb37..7088603b15 100644 } } diff --git a/src/main/java/net/minecraft/server/BiomeDesert.java b/src/main/java/net/minecraft/server/BiomeDesert.java -index 257732dad7..168614fe59 100644 +index 257732dad..168614fe5 100644 --- a/src/main/java/net/minecraft/server/BiomeDesert.java +++ b/src/main/java/net/minecraft/server/BiomeDesert.java @@ -24,16 +24,6 @@ public final class BiomeDesert extends BiomeBase { @@ -536,7 +536,7 @@ index 257732dad7..168614fe59 100644 } } diff --git a/src/main/java/net/minecraft/server/BiomeDesertHills.java b/src/main/java/net/minecraft/server/BiomeDesertHills.java -index 3752fc4509..4df4437013 100644 +index 3752fc450..4df443701 100644 --- a/src/main/java/net/minecraft/server/BiomeDesertHills.java +++ b/src/main/java/net/minecraft/server/BiomeDesertHills.java @@ -22,16 +22,6 @@ public final class BiomeDesertHills extends BiomeBase { @@ -558,7 +558,7 @@ index 3752fc4509..4df4437013 100644 } } diff --git a/src/main/java/net/minecraft/server/BiomeDesertMutated.java b/src/main/java/net/minecraft/server/BiomeDesertMutated.java -index 1a0b569322..ac565c3822 100644 +index 1a0b56932..ac565c382 100644 --- a/src/main/java/net/minecraft/server/BiomeDesertMutated.java +++ b/src/main/java/net/minecraft/server/BiomeDesertMutated.java @@ -21,16 +21,6 @@ public final class BiomeDesertMutated extends BiomeBase { @@ -580,7 +580,7 @@ index 1a0b569322..ac565c3822 100644 } } diff --git a/src/main/java/net/minecraft/server/BiomeExtremeHillsEdge.java b/src/main/java/net/minecraft/server/BiomeExtremeHillsEdge.java -index 8e19e06889..93f9c55bb2 100644 +index 8e19e0688..93f9c55bb 100644 --- a/src/main/java/net/minecraft/server/BiomeExtremeHillsEdge.java +++ b/src/main/java/net/minecraft/server/BiomeExtremeHillsEdge.java @@ -22,19 +22,6 @@ public final class BiomeExtremeHillsEdge extends BiomeBase { @@ -605,7 +605,7 @@ index 8e19e06889..93f9c55bb2 100644 } } diff --git a/src/main/java/net/minecraft/server/BiomeExtremeHillsMutated.java b/src/main/java/net/minecraft/server/BiomeExtremeHillsMutated.java -index 69d4880c74..5c73ee4fb8 100644 +index 69d4880c7..5c73ee4fb 100644 --- a/src/main/java/net/minecraft/server/BiomeExtremeHillsMutated.java +++ b/src/main/java/net/minecraft/server/BiomeExtremeHillsMutated.java @@ -22,19 +22,6 @@ public final class BiomeExtremeHillsMutated extends BiomeBase { @@ -630,7 +630,7 @@ index 69d4880c74..5c73ee4fb8 100644 } } diff --git a/src/main/java/net/minecraft/server/BiomeExtremeHillsWithTrees.java b/src/main/java/net/minecraft/server/BiomeExtremeHillsWithTrees.java -index 7661d53161..7bc4631db0 100644 +index 7661d5316..7bc4631db 100644 --- a/src/main/java/net/minecraft/server/BiomeExtremeHillsWithTrees.java +++ b/src/main/java/net/minecraft/server/BiomeExtremeHillsWithTrees.java @@ -22,19 +22,6 @@ public final class BiomeExtremeHillsWithTrees extends BiomeBase { @@ -655,7 +655,7 @@ index 7661d53161..7bc4631db0 100644 } } diff --git a/src/main/java/net/minecraft/server/BiomeExtremeHillsWithTreesMutated.java b/src/main/java/net/minecraft/server/BiomeExtremeHillsWithTreesMutated.java -index 05418f8fa1..b618c7e336 100644 +index 05418f8fa..b618c7e33 100644 --- a/src/main/java/net/minecraft/server/BiomeExtremeHillsWithTreesMutated.java +++ b/src/main/java/net/minecraft/server/BiomeExtremeHillsWithTreesMutated.java @@ -22,19 +22,6 @@ public final class BiomeExtremeHillsWithTreesMutated extends BiomeBase { @@ -680,7 +680,7 @@ index 05418f8fa1..b618c7e336 100644 } } diff --git a/src/main/java/net/minecraft/server/BiomeFlowerForest.java b/src/main/java/net/minecraft/server/BiomeFlowerForest.java -index 1d3f624323..1d0809c2cc 100644 +index 1d3f62432..1d0809c2c 100644 --- a/src/main/java/net/minecraft/server/BiomeFlowerForest.java +++ b/src/main/java/net/minecraft/server/BiomeFlowerForest.java @@ -23,19 +23,6 @@ public final class BiomeFlowerForest extends BiomeBase { @@ -705,7 +705,7 @@ index 1d3f624323..1d0809c2cc 100644 } } diff --git a/src/main/java/net/minecraft/server/BiomeForest.java b/src/main/java/net/minecraft/server/BiomeForest.java -index e849b411c6..2b69a128a6 100644 +index e849b411c..2b69a128a 100644 --- a/src/main/java/net/minecraft/server/BiomeForest.java +++ b/src/main/java/net/minecraft/server/BiomeForest.java @@ -22,19 +22,6 @@ public final class BiomeForest extends BiomeBase { @@ -730,7 +730,7 @@ index e849b411c6..2b69a128a6 100644 } } diff --git a/src/main/java/net/minecraft/server/BiomeForestHills.java b/src/main/java/net/minecraft/server/BiomeForestHills.java -index f7dea38eb3..57c7091816 100644 +index f7dea38eb..57c709181 100644 --- a/src/main/java/net/minecraft/server/BiomeForestHills.java +++ b/src/main/java/net/minecraft/server/BiomeForestHills.java @@ -22,19 +22,6 @@ public final class BiomeForestHills extends BiomeBase { @@ -755,7 +755,7 @@ index f7dea38eb3..57c7091816 100644 } } diff --git a/src/main/java/net/minecraft/server/BiomeFrozenDeepOcean.java b/src/main/java/net/minecraft/server/BiomeFrozenDeepOcean.java -index 67d120bef2..f1ab35f2fa 100644 +index 67d120bef..f1ab35f2f 100644 --- a/src/main/java/net/minecraft/server/BiomeFrozenDeepOcean.java +++ b/src/main/java/net/minecraft/server/BiomeFrozenDeepOcean.java @@ -26,19 +26,7 @@ public class BiomeFrozenDeepOcean extends BiomeBase { @@ -780,7 +780,7 @@ index 67d120bef2..f1ab35f2fa 100644 @Override diff --git a/src/main/java/net/minecraft/server/BiomeFrozenOcean.java b/src/main/java/net/minecraft/server/BiomeFrozenOcean.java -index 2772bc6dac..3941438d92 100644 +index 2772bc6da..3941438d9 100644 --- a/src/main/java/net/minecraft/server/BiomeFrozenOcean.java +++ b/src/main/java/net/minecraft/server/BiomeFrozenOcean.java @@ -25,19 +25,7 @@ public final class BiomeFrozenOcean extends BiomeBase { @@ -805,7 +805,7 @@ index 2772bc6dac..3941438d92 100644 @Override diff --git a/src/main/java/net/minecraft/server/BiomeFrozenRiver.java b/src/main/java/net/minecraft/server/BiomeFrozenRiver.java -index 4be53fc0f6..f5d98bcac9 100644 +index 4be53fc0f..f5d98bcac 100644 --- a/src/main/java/net/minecraft/server/BiomeFrozenRiver.java +++ b/src/main/java/net/minecraft/server/BiomeFrozenRiver.java @@ -19,17 +19,6 @@ public final class BiomeFrozenRiver extends BiomeBase { @@ -828,7 +828,7 @@ index 4be53fc0f6..f5d98bcac9 100644 } } diff --git a/src/main/java/net/minecraft/server/BiomeHell.java b/src/main/java/net/minecraft/server/BiomeHell.java -index 888dfcd8d4..dd3375ef84 100644 +index 888dfcd8d..dd3375ef8 100644 --- a/src/main/java/net/minecraft/server/BiomeHell.java +++ b/src/main/java/net/minecraft/server/BiomeHell.java @@ -18,9 +18,6 @@ public final class BiomeHell extends BiomeBase { @@ -843,7 +843,7 @@ index 888dfcd8d4..dd3375ef84 100644 } } diff --git a/src/main/java/net/minecraft/server/BiomeIceMountains.java b/src/main/java/net/minecraft/server/BiomeIceMountains.java -index ad9b4efe09..0e98efb9e9 100644 +index ad9b4efe0..0e98efb9e 100644 --- a/src/main/java/net/minecraft/server/BiomeIceMountains.java +++ b/src/main/java/net/minecraft/server/BiomeIceMountains.java @@ -20,18 +20,7 @@ public final class BiomeIceMountains extends BiomeBase { @@ -867,7 +867,7 @@ index ad9b4efe09..0e98efb9e9 100644 @Override diff --git a/src/main/java/net/minecraft/server/BiomeIcePlains.java b/src/main/java/net/minecraft/server/BiomeIcePlains.java -index 71606b0a71..ba0a16faa6 100644 +index 71606b0a7..ba0a16faa 100644 --- a/src/main/java/net/minecraft/server/BiomeIcePlains.java +++ b/src/main/java/net/minecraft/server/BiomeIcePlains.java @@ -23,18 +23,7 @@ public final class BiomeIcePlains extends BiomeBase { @@ -891,7 +891,7 @@ index 71606b0a71..ba0a16faa6 100644 @Override diff --git a/src/main/java/net/minecraft/server/BiomeIcePlainsSpikes.java b/src/main/java/net/minecraft/server/BiomeIcePlainsSpikes.java -index 984f94bb59..375ccf9c45 100644 +index 984f94bb5..375ccf9c4 100644 --- a/src/main/java/net/minecraft/server/BiomeIcePlainsSpikes.java +++ b/src/main/java/net/minecraft/server/BiomeIcePlainsSpikes.java @@ -22,18 +22,7 @@ public final class BiomeIcePlainsSpikes extends BiomeBase { @@ -915,7 +915,7 @@ index 984f94bb59..375ccf9c45 100644 @Override diff --git a/src/main/java/net/minecraft/server/BiomeJungle.java b/src/main/java/net/minecraft/server/BiomeJungle.java -index 95e5019968..2b154a2761 100644 +index 95e501996..2b154a276 100644 --- a/src/main/java/net/minecraft/server/BiomeJungle.java +++ b/src/main/java/net/minecraft/server/BiomeJungle.java @@ -23,22 +23,6 @@ public final class BiomeJungle extends BiomeBase { @@ -943,7 +943,7 @@ index 95e5019968..2b154a2761 100644 } } diff --git a/src/main/java/net/minecraft/server/BiomeJungleEdge.java b/src/main/java/net/minecraft/server/BiomeJungleEdge.java -index e624f9764f..e6cf5d8539 100644 +index e624f9764..e6cf5d853 100644 --- a/src/main/java/net/minecraft/server/BiomeJungleEdge.java +++ b/src/main/java/net/minecraft/server/BiomeJungleEdge.java @@ -21,19 +21,6 @@ public final class BiomeJungleEdge extends BiomeBase { @@ -968,7 +968,7 @@ index e624f9764f..e6cf5d8539 100644 } } diff --git a/src/main/java/net/minecraft/server/BiomeJungleEdgeMutated.java b/src/main/java/net/minecraft/server/BiomeJungleEdgeMutated.java -index 1fe9c840a7..d4c9907b28 100644 +index 1fe9c840a..d4c9907b2 100644 --- a/src/main/java/net/minecraft/server/BiomeJungleEdgeMutated.java +++ b/src/main/java/net/minecraft/server/BiomeJungleEdgeMutated.java @@ -21,19 +21,6 @@ public final class BiomeJungleEdgeMutated extends BiomeBase { @@ -993,7 +993,7 @@ index 1fe9c840a7..d4c9907b28 100644 } } diff --git a/src/main/java/net/minecraft/server/BiomeJungleHills.java b/src/main/java/net/minecraft/server/BiomeJungleHills.java -index e2970ab00e..9e7b702c8a 100644 +index e2970ab00..9e7b702c8 100644 --- a/src/main/java/net/minecraft/server/BiomeJungleHills.java +++ b/src/main/java/net/minecraft/server/BiomeJungleHills.java @@ -23,22 +23,6 @@ public final class BiomeJungleHills extends BiomeBase { @@ -1021,7 +1021,7 @@ index e2970ab00e..9e7b702c8a 100644 } } diff --git a/src/main/java/net/minecraft/server/BiomeJungleMutated.java b/src/main/java/net/minecraft/server/BiomeJungleMutated.java -index ffe6b4344e..f308e0dd45 100644 +index ffe6b4344..f308e0dd4 100644 --- a/src/main/java/net/minecraft/server/BiomeJungleMutated.java +++ b/src/main/java/net/minecraft/server/BiomeJungleMutated.java @@ -21,21 +21,6 @@ public final class BiomeJungleMutated extends BiomeBase { @@ -1048,7 +1048,7 @@ index ffe6b4344e..f308e0dd45 100644 } } diff --git a/src/main/java/net/minecraft/server/BiomeLukewarmDeepOcean.java b/src/main/java/net/minecraft/server/BiomeLukewarmDeepOcean.java -index b23c43305b..092233c50c 100644 +index b23c43305..092233c50 100644 --- a/src/main/java/net/minecraft/server/BiomeLukewarmDeepOcean.java +++ b/src/main/java/net/minecraft/server/BiomeLukewarmDeepOcean.java @@ -25,20 +25,6 @@ public class BiomeLukewarmDeepOcean extends BiomeBase { @@ -1074,7 +1074,7 @@ index b23c43305b..092233c50c 100644 } } diff --git a/src/main/java/net/minecraft/server/BiomeLukewarmOcean.java b/src/main/java/net/minecraft/server/BiomeLukewarmOcean.java -index efcb11bbe8..1cebd5ce74 100644 +index efcb11bbe..1cebd5ce7 100644 --- a/src/main/java/net/minecraft/server/BiomeLukewarmOcean.java +++ b/src/main/java/net/minecraft/server/BiomeLukewarmOcean.java @@ -23,20 +23,6 @@ public class BiomeLukewarmOcean extends BiomeBase { @@ -1100,7 +1100,7 @@ index efcb11bbe8..1cebd5ce74 100644 } } diff --git a/src/main/java/net/minecraft/server/BiomeMegaSpruceTaiga.java b/src/main/java/net/minecraft/server/BiomeMegaSpruceTaiga.java -index 328e939a6f..d0fe6c4493 100644 +index 328e939a6..d0fe6c449 100644 --- a/src/main/java/net/minecraft/server/BiomeMegaSpruceTaiga.java +++ b/src/main/java/net/minecraft/server/BiomeMegaSpruceTaiga.java @@ -23,21 +23,6 @@ public final class BiomeMegaSpruceTaiga extends BiomeBase { @@ -1127,7 +1127,7 @@ index 328e939a6f..d0fe6c4493 100644 } } diff --git a/src/main/java/net/minecraft/server/BiomeMegaTaiga.java b/src/main/java/net/minecraft/server/BiomeMegaTaiga.java -index 36bea710a0..e3aad431e2 100644 +index 36bea710a..e3aad431e 100644 --- a/src/main/java/net/minecraft/server/BiomeMegaTaiga.java +++ b/src/main/java/net/minecraft/server/BiomeMegaTaiga.java @@ -23,21 +23,6 @@ public final class BiomeMegaTaiga extends BiomeBase { @@ -1154,7 +1154,7 @@ index 36bea710a0..e3aad431e2 100644 } } diff --git a/src/main/java/net/minecraft/server/BiomeMegaTaigaHills.java b/src/main/java/net/minecraft/server/BiomeMegaTaigaHills.java -index 22474d682a..2ef445ce64 100644 +index 22474d682..2ef445ce6 100644 --- a/src/main/java/net/minecraft/server/BiomeMegaTaigaHills.java +++ b/src/main/java/net/minecraft/server/BiomeMegaTaigaHills.java @@ -23,21 +23,6 @@ public final class BiomeMegaTaigaHills extends BiomeBase { @@ -1181,7 +1181,7 @@ index 22474d682a..2ef445ce64 100644 } } diff --git a/src/main/java/net/minecraft/server/BiomeMesa.java b/src/main/java/net/minecraft/server/BiomeMesa.java -index 65d606d51c..8906115d47 100644 +index 65d606d51..8906115d4 100644 --- a/src/main/java/net/minecraft/server/BiomeMesa.java +++ b/src/main/java/net/minecraft/server/BiomeMesa.java @@ -19,14 +19,6 @@ public final class BiomeMesa extends BiomeBase { @@ -1201,7 +1201,7 @@ index 65d606d51c..8906115d47 100644 } } diff --git a/src/main/java/net/minecraft/server/BiomeMesaBryce.java b/src/main/java/net/minecraft/server/BiomeMesaBryce.java -index 5ecec62f18..401fbd2d16 100644 +index 5ecec62f1..401fbd2d1 100644 --- a/src/main/java/net/minecraft/server/BiomeMesaBryce.java +++ b/src/main/java/net/minecraft/server/BiomeMesaBryce.java @@ -19,14 +19,6 @@ public final class BiomeMesaBryce extends BiomeBase { @@ -1221,7 +1221,7 @@ index 5ecec62f18..401fbd2d16 100644 } } diff --git a/src/main/java/net/minecraft/server/BiomeMesaPlataeu.java b/src/main/java/net/minecraft/server/BiomeMesaPlataeu.java -index 14d4bd312e..77a5828f07 100644 +index 14d4bd312..77a5828f0 100644 --- a/src/main/java/net/minecraft/server/BiomeMesaPlataeu.java +++ b/src/main/java/net/minecraft/server/BiomeMesaPlataeu.java @@ -20,14 +20,6 @@ public final class BiomeMesaPlataeu extends BiomeBase { @@ -1241,7 +1241,7 @@ index 14d4bd312e..77a5828f07 100644 } } diff --git a/src/main/java/net/minecraft/server/BiomeMesaPlataeuClear.java b/src/main/java/net/minecraft/server/BiomeMesaPlataeuClear.java -index b5dab9d2aa..a888312556 100644 +index b5dab9d2a..a88831255 100644 --- a/src/main/java/net/minecraft/server/BiomeMesaPlataeuClear.java +++ b/src/main/java/net/minecraft/server/BiomeMesaPlataeuClear.java @@ -19,14 +19,6 @@ public final class BiomeMesaPlataeuClear extends BiomeBase { @@ -1261,7 +1261,7 @@ index b5dab9d2aa..a888312556 100644 } } diff --git a/src/main/java/net/minecraft/server/BiomeMesaPlateauClearMutated.java b/src/main/java/net/minecraft/server/BiomeMesaPlateauClearMutated.java -index d05cc38b5e..be07387135 100644 +index d05cc38b5..be0738713 100644 --- a/src/main/java/net/minecraft/server/BiomeMesaPlateauClearMutated.java +++ b/src/main/java/net/minecraft/server/BiomeMesaPlateauClearMutated.java @@ -19,14 +19,6 @@ public final class BiomeMesaPlateauClearMutated extends BiomeBase { @@ -1281,7 +1281,7 @@ index d05cc38b5e..be07387135 100644 } } diff --git a/src/main/java/net/minecraft/server/BiomeMesaPlateauMutated.java b/src/main/java/net/minecraft/server/BiomeMesaPlateauMutated.java -index 21a77ee812..2a213025b9 100644 +index 21a77ee81..2a213025b 100644 --- a/src/main/java/net/minecraft/server/BiomeMesaPlateauMutated.java +++ b/src/main/java/net/minecraft/server/BiomeMesaPlateauMutated.java @@ -20,14 +20,6 @@ public final class BiomeMesaPlateauMutated extends BiomeBase { @@ -1301,7 +1301,7 @@ index 21a77ee812..2a213025b9 100644 } } diff --git a/src/main/java/net/minecraft/server/BiomeMushroomIslandShore.java b/src/main/java/net/minecraft/server/BiomeMushroomIslandShore.java -index 0302efbdc7..f0be681aaf 100644 +index 0302efbdc..f0be681aa 100644 --- a/src/main/java/net/minecraft/server/BiomeMushroomIslandShore.java +++ b/src/main/java/net/minecraft/server/BiomeMushroomIslandShore.java @@ -18,7 +18,6 @@ public final class BiomeMushroomIslandShore extends BiomeBase { @@ -1314,7 +1314,7 @@ index 0302efbdc7..f0be681aaf 100644 } } diff --git a/src/main/java/net/minecraft/server/BiomeMushrooms.java b/src/main/java/net/minecraft/server/BiomeMushrooms.java -index 51f92584b8..0118df023f 100644 +index 51f92584b..0118df023 100644 --- a/src/main/java/net/minecraft/server/BiomeMushrooms.java +++ b/src/main/java/net/minecraft/server/BiomeMushrooms.java @@ -18,7 +18,6 @@ public final class BiomeMushrooms extends BiomeBase { @@ -1327,7 +1327,7 @@ index 51f92584b8..0118df023f 100644 } } diff --git a/src/main/java/net/minecraft/server/BiomeOcean.java b/src/main/java/net/minecraft/server/BiomeOcean.java -index ad9628b2aa..5f4617c0a6 100644 +index ad9628b2a..5f4617c0a 100644 --- a/src/main/java/net/minecraft/server/BiomeOcean.java +++ b/src/main/java/net/minecraft/server/BiomeOcean.java @@ -24,18 +24,6 @@ public final class BiomeOcean extends BiomeBase { @@ -1351,7 +1351,7 @@ index ad9628b2aa..5f4617c0a6 100644 } } diff --git a/src/main/java/net/minecraft/server/BiomePlains.java b/src/main/java/net/minecraft/server/BiomePlains.java -index ff6090e3c1..266f4165a4 100644 +index ff6090e3c..266f4165a 100644 --- a/src/main/java/net/minecraft/server/BiomePlains.java +++ b/src/main/java/net/minecraft/server/BiomePlains.java @@ -21,20 +21,6 @@ public final class BiomePlains extends BiomeBase { @@ -1377,7 +1377,7 @@ index ff6090e3c1..266f4165a4 100644 } } diff --git a/src/main/java/net/minecraft/server/BiomeRedwoodTaigaHillsMutated.java b/src/main/java/net/minecraft/server/BiomeRedwoodTaigaHillsMutated.java -index a28222eb1d..f35557dfdf 100644 +index a28222eb1..f35557dfd 100644 --- a/src/main/java/net/minecraft/server/BiomeRedwoodTaigaHillsMutated.java +++ b/src/main/java/net/minecraft/server/BiomeRedwoodTaigaHillsMutated.java @@ -23,21 +23,6 @@ public final class BiomeRedwoodTaigaHillsMutated extends BiomeBase { @@ -1404,7 +1404,7 @@ index a28222eb1d..f35557dfdf 100644 } } diff --git a/src/main/java/net/minecraft/server/BiomeRiver.java b/src/main/java/net/minecraft/server/BiomeRiver.java -index b84b868b1a..405cc2bff4 100644 +index b84b868b1..405cc2bff 100644 --- a/src/main/java/net/minecraft/server/BiomeRiver.java +++ b/src/main/java/net/minecraft/server/BiomeRiver.java @@ -20,17 +20,6 @@ public final class BiomeRiver extends BiomeBase { @@ -1427,7 +1427,7 @@ index b84b868b1a..405cc2bff4 100644 } } diff --git a/src/main/java/net/minecraft/server/BiomeRoofedForest.java b/src/main/java/net/minecraft/server/BiomeRoofedForest.java -index 16bcf9bff0..f02a8a03c7 100644 +index 16bcf9bff..f02a8a03c 100644 --- a/src/main/java/net/minecraft/server/BiomeRoofedForest.java +++ b/src/main/java/net/minecraft/server/BiomeRoofedForest.java @@ -24,18 +24,6 @@ public final class BiomeRoofedForest extends BiomeBase { @@ -1451,7 +1451,7 @@ index 16bcf9bff0..f02a8a03c7 100644 } } diff --git a/src/main/java/net/minecraft/server/BiomeRoofedForestMutated.java b/src/main/java/net/minecraft/server/BiomeRoofedForestMutated.java -index 9fa84c87fa..9ee0fc6a43 100644 +index 9fa84c87f..9ee0fc6a4 100644 --- a/src/main/java/net/minecraft/server/BiomeRoofedForestMutated.java +++ b/src/main/java/net/minecraft/server/BiomeRoofedForestMutated.java @@ -24,18 +24,6 @@ public final class BiomeRoofedForestMutated extends BiomeBase { @@ -1475,7 +1475,7 @@ index 9fa84c87fa..9ee0fc6a43 100644 } } diff --git a/src/main/java/net/minecraft/server/BiomeSavanna.java b/src/main/java/net/minecraft/server/BiomeSavanna.java -index c12a890165..a539fc362d 100644 +index c12a89016..a539fc362 100644 --- a/src/main/java/net/minecraft/server/BiomeSavanna.java +++ b/src/main/java/net/minecraft/server/BiomeSavanna.java @@ -23,20 +23,6 @@ public final class BiomeSavanna extends BiomeBase { @@ -1501,7 +1501,7 @@ index c12a890165..a539fc362d 100644 } } diff --git a/src/main/java/net/minecraft/server/BiomeSavannaMutated.java b/src/main/java/net/minecraft/server/BiomeSavannaMutated.java -index db8b20a6c7..e041fcd412 100644 +index db8b20a6c..e041fcd41 100644 --- a/src/main/java/net/minecraft/server/BiomeSavannaMutated.java +++ b/src/main/java/net/minecraft/server/BiomeSavannaMutated.java @@ -20,20 +20,6 @@ public final class BiomeSavannaMutated extends BiomeBase { @@ -1527,7 +1527,7 @@ index db8b20a6c7..e041fcd412 100644 } } diff --git a/src/main/java/net/minecraft/server/BiomeSavannaPlateau.java b/src/main/java/net/minecraft/server/BiomeSavannaPlateau.java -index 2826c510d8..08407ea3e0 100644 +index 2826c510d..08407ea3e 100644 --- a/src/main/java/net/minecraft/server/BiomeSavannaPlateau.java +++ b/src/main/java/net/minecraft/server/BiomeSavannaPlateau.java @@ -21,21 +21,6 @@ public final class BiomeSavannaPlateau extends BiomeBase { @@ -1554,7 +1554,7 @@ index 2826c510d8..08407ea3e0 100644 } } diff --git a/src/main/java/net/minecraft/server/BiomeSavannaPlateauMutated.java b/src/main/java/net/minecraft/server/BiomeSavannaPlateauMutated.java -index e544a8f6b9..337310263c 100644 +index e544a8f6b..337310263 100644 --- a/src/main/java/net/minecraft/server/BiomeSavannaPlateauMutated.java +++ b/src/main/java/net/minecraft/server/BiomeSavannaPlateauMutated.java @@ -20,20 +20,6 @@ public final class BiomeSavannaPlateauMutated extends BiomeBase { @@ -1580,7 +1580,7 @@ index e544a8f6b9..337310263c 100644 } } diff --git a/src/main/java/net/minecraft/server/BiomeStoneBeach.java b/src/main/java/net/minecraft/server/BiomeStoneBeach.java -index 34660f9f84..3a96c2aeba 100644 +index 34660f9f8..3a96c2aeb 100644 --- a/src/main/java/net/minecraft/server/BiomeStoneBeach.java +++ b/src/main/java/net/minecraft/server/BiomeStoneBeach.java @@ -19,14 +19,6 @@ public final class BiomeStoneBeach extends BiomeBase { @@ -1600,7 +1600,7 @@ index 34660f9f84..3a96c2aeba 100644 } } diff --git a/src/main/java/net/minecraft/server/BiomeSunflowerPlains.java b/src/main/java/net/minecraft/server/BiomeSunflowerPlains.java -index 8815c95900..f971bc4bcb 100644 +index 8815c9590..f971bc4bc 100644 --- a/src/main/java/net/minecraft/server/BiomeSunflowerPlains.java +++ b/src/main/java/net/minecraft/server/BiomeSunflowerPlains.java @@ -21,20 +21,6 @@ public final class BiomeSunflowerPlains extends BiomeBase { @@ -1626,7 +1626,7 @@ index 8815c95900..f971bc4bcb 100644 } } diff --git a/src/main/java/net/minecraft/server/BiomeSwamp.java b/src/main/java/net/minecraft/server/BiomeSwamp.java -index 02584897e9..011628fff2 100644 +index 02584897e..011628fff 100644 --- a/src/main/java/net/minecraft/server/BiomeSwamp.java +++ b/src/main/java/net/minecraft/server/BiomeSwamp.java @@ -20,19 +20,6 @@ public final class BiomeSwamp extends BiomeBase { @@ -1651,7 +1651,7 @@ index 02584897e9..011628fff2 100644 } } diff --git a/src/main/java/net/minecraft/server/BiomeSwamplandMutated.java b/src/main/java/net/minecraft/server/BiomeSwamplandMutated.java -index d85b01b956..10c6b4eb39 100644 +index d85b01b95..10c6b4eb3 100644 --- a/src/main/java/net/minecraft/server/BiomeSwamplandMutated.java +++ b/src/main/java/net/minecraft/server/BiomeSwamplandMutated.java @@ -18,19 +18,6 @@ public final class BiomeSwamplandMutated extends BiomeBase { @@ -1676,7 +1676,7 @@ index d85b01b956..10c6b4eb39 100644 } } diff --git a/src/main/java/net/minecraft/server/BiomeTaiga.java b/src/main/java/net/minecraft/server/BiomeTaiga.java -index ae6e6ca896..456b6b1747 100644 +index ae6e6ca89..456b6b174 100644 --- a/src/main/java/net/minecraft/server/BiomeTaiga.java +++ b/src/main/java/net/minecraft/server/BiomeTaiga.java @@ -24,21 +24,6 @@ public final class BiomeTaiga extends BiomeBase { @@ -1703,7 +1703,7 @@ index ae6e6ca896..456b6b1747 100644 } } diff --git a/src/main/java/net/minecraft/server/BiomeTaigaHills.java b/src/main/java/net/minecraft/server/BiomeTaigaHills.java -index 4e19fe5ae9..cc699e354d 100644 +index 4e19fe5ae..cc699e354 100644 --- a/src/main/java/net/minecraft/server/BiomeTaigaHills.java +++ b/src/main/java/net/minecraft/server/BiomeTaigaHills.java @@ -22,21 +22,6 @@ public final class BiomeTaigaHills extends BiomeBase { @@ -1730,7 +1730,7 @@ index 4e19fe5ae9..cc699e354d 100644 } } diff --git a/src/main/java/net/minecraft/server/BiomeTaigaMutated.java b/src/main/java/net/minecraft/server/BiomeTaigaMutated.java -index 05e833ffed..3c722f50a9 100644 +index 05e833ffe..3c722f50a 100644 --- a/src/main/java/net/minecraft/server/BiomeTaigaMutated.java +++ b/src/main/java/net/minecraft/server/BiomeTaigaMutated.java @@ -22,21 +22,6 @@ public final class BiomeTaigaMutated extends BiomeBase { @@ -1757,7 +1757,7 @@ index 05e833ffed..3c722f50a9 100644 } } diff --git a/src/main/java/net/minecraft/server/BiomeTheEnd.java b/src/main/java/net/minecraft/server/BiomeTheEnd.java -index 22e9789a36..6a5a8a991a 100644 +index 22e9789a3..6a5a8a991 100644 --- a/src/main/java/net/minecraft/server/BiomeTheEnd.java +++ b/src/main/java/net/minecraft/server/BiomeTheEnd.java @@ -8,6 +8,6 @@ public final class BiomeTheEnd extends BiomeBase { @@ -1769,7 +1769,7 @@ index 22e9789a36..6a5a8a991a 100644 } } diff --git a/src/main/java/net/minecraft/server/BiomeTheEndBarrenIsland.java b/src/main/java/net/minecraft/server/BiomeTheEndBarrenIsland.java -index 5b068299c8..07d72737b5 100644 +index 5b068299c..07d72737b 100644 --- a/src/main/java/net/minecraft/server/BiomeTheEndBarrenIsland.java +++ b/src/main/java/net/minecraft/server/BiomeTheEndBarrenIsland.java @@ -5,6 +5,6 @@ public class BiomeTheEndBarrenIsland extends BiomeBase { @@ -1781,7 +1781,7 @@ index 5b068299c8..07d72737b5 100644 } } diff --git a/src/main/java/net/minecraft/server/BiomeTheEndFloatingIslands.java b/src/main/java/net/minecraft/server/BiomeTheEndFloatingIslands.java -index a26d56aa45..839d3e616a 100644 +index a26d56aa4..839d3e616 100644 --- a/src/main/java/net/minecraft/server/BiomeTheEndFloatingIslands.java +++ b/src/main/java/net/minecraft/server/BiomeTheEndFloatingIslands.java @@ -6,6 +6,6 @@ public class BiomeTheEndFloatingIslands extends BiomeBase { @@ -1793,7 +1793,7 @@ index a26d56aa45..839d3e616a 100644 } } diff --git a/src/main/java/net/minecraft/server/BiomeTheEndHighIsland.java b/src/main/java/net/minecraft/server/BiomeTheEndHighIsland.java -index e47add3e43..53aa6243de 100644 +index e47add3e4..53aa6243d 100644 --- a/src/main/java/net/minecraft/server/BiomeTheEndHighIsland.java +++ b/src/main/java/net/minecraft/server/BiomeTheEndHighIsland.java @@ -8,6 +8,6 @@ public class BiomeTheEndHighIsland extends BiomeBase { @@ -1805,7 +1805,7 @@ index e47add3e43..53aa6243de 100644 } } diff --git a/src/main/java/net/minecraft/server/BiomeTheEndMediumIsland.java b/src/main/java/net/minecraft/server/BiomeTheEndMediumIsland.java -index ec92a84579..2452f18013 100644 +index ec92a8457..2452f1801 100644 --- a/src/main/java/net/minecraft/server/BiomeTheEndMediumIsland.java +++ b/src/main/java/net/minecraft/server/BiomeTheEndMediumIsland.java @@ -6,6 +6,6 @@ public class BiomeTheEndMediumIsland extends BiomeBase { @@ -1817,7 +1817,7 @@ index ec92a84579..2452f18013 100644 } } diff --git a/src/main/java/net/minecraft/server/BiomeVoid.java b/src/main/java/net/minecraft/server/BiomeVoid.java -index c9ba334535..5549d61421 100644 +index c9ba33453..5549d6142 100644 --- a/src/main/java/net/minecraft/server/BiomeVoid.java +++ b/src/main/java/net/minecraft/server/BiomeVoid.java @@ -5,5 +5,6 @@ public final class BiomeVoid extends BiomeBase { @@ -1828,7 +1828,7 @@ index c9ba334535..5549d61421 100644 } } diff --git a/src/main/java/net/minecraft/server/BiomeWarmDeepOcean.java b/src/main/java/net/minecraft/server/BiomeWarmDeepOcean.java -index 11dc5f6374..c3fc79fb31 100644 +index 11dc5f637..c3fc79fb3 100644 --- a/src/main/java/net/minecraft/server/BiomeWarmDeepOcean.java +++ b/src/main/java/net/minecraft/server/BiomeWarmDeepOcean.java @@ -24,18 +24,6 @@ public class BiomeWarmDeepOcean extends BiomeBase { @@ -1852,7 +1852,7 @@ index 11dc5f6374..c3fc79fb31 100644 } } diff --git a/src/main/java/net/minecraft/server/BiomeWarmOcean.java b/src/main/java/net/minecraft/server/BiomeWarmOcean.java -index e4dc7d198c..00f94b906b 100644 +index e4dc7d198..00f94b906 100644 --- a/src/main/java/net/minecraft/server/BiomeWarmOcean.java +++ b/src/main/java/net/minecraft/server/BiomeWarmOcean.java @@ -26,18 +26,6 @@ public class BiomeWarmOcean extends BiomeBase { @@ -1876,7 +1876,7 @@ index e4dc7d198c..00f94b906b 100644 } } diff --git a/src/main/java/net/minecraft/server/Biomes.java b/src/main/java/net/minecraft/server/Biomes.java -index 12742870ca..a448c77264 100644 +index 12742870c..a448c7726 100644 --- a/src/main/java/net/minecraft/server/Biomes.java +++ b/src/main/java/net/minecraft/server/Biomes.java @@ -87,6 +87,34 @@ public abstract class Biomes { @@ -1916,7 +1916,7 @@ index 12742870ca..a448c77264 100644 diff --git a/src/main/resources/biomes.yml b/src/main/resources/biomes.yml new file mode 100644 -index 0000000000..f0ea65299f +index 000000000..f0ea65299 --- /dev/null +++ b/src/main/resources/biomes.yml @@ -0,0 +1,1042 @@ diff --git a/patches/server/0103-Configurable-void-damage-height.patch b/patches/server/0104-Configurable-void-damage-height.patch similarity index 91% rename from patches/server/0103-Configurable-void-damage-height.patch rename to patches/server/0104-Configurable-void-damage-height.patch index 8869ab8a8..4471a8fa7 100644 --- a/patches/server/0103-Configurable-void-damage-height.patch +++ b/patches/server/0104-Configurable-void-damage-height.patch @@ -1,4 +1,4 @@ -From a47c3e1dd8f770cd3fc64916bb9d6962dd0067c5 Mon Sep 17 00:00:00 2001 +From c9d375ca07697b7855f02493e85a67e6b3522a61 Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Thu, 27 Feb 2020 21:42:19 -0600 Subject: [PATCH] Configurable void damage height @@ -9,10 +9,10 @@ Subject: [PATCH] Configurable void damage height 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/net/minecraft/server/Entity.java b/src/main/java/net/minecraft/server/Entity.java -index 98aef47056..576742ddfc 100644 +index 0d509e841..c85e79494 100644 --- a/src/main/java/net/minecraft/server/Entity.java +++ b/src/main/java/net/minecraft/server/Entity.java -@@ -451,7 +451,7 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke +@@ -503,7 +503,7 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke // Paper start protected void performVoidDamage() { @@ -22,7 +22,7 @@ index 98aef47056..576742ddfc 100644 && this.locY >= world.paperConfig.netherVoidTopDamageHeight)) { diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -index 7aed41f0f9..c7a7c8636c 100644 +index 7aed41f0f..c7a7c8636 100644 --- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java +++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java @@ -198,6 +198,7 @@ public class PurpurWorldConfig { diff --git a/patches/server/0104-Optimize-Chunk-Ticks.patch b/patches/server/0104-Optimize-Chunk-Ticks.patch deleted file mode 100644 index a18f3ec0f..000000000 --- a/patches/server/0104-Optimize-Chunk-Ticks.patch +++ /dev/null @@ -1,546 +0,0 @@ -From 214748ba37598d708dfcb8df57e7f5ea0a20ab1a Mon Sep 17 00:00:00 2001 -From: William Blake Galbreath -Date: Sun, 1 Mar 2020 20:07:54 -0600 -Subject: [PATCH] Optimize Chunk Ticks - ---- - .../co/aikar/timings/WorldTimingsHandler.java | 6 +- - .../minecraft/server/ChunkMapDistance.java | 19 +- - .../minecraft/server/ChunkProviderServer.java | 254 +++++++++--------- - .../minecraft/server/EnumCreatureType.java | 26 +- - .../net/minecraft/server/PlayerChunk.java | 3 + - .../net/minecraft/server/PlayerChunkMap.java | 19 +- - .../net/minecraft/server/WorldServer.java | 1 + - 7 files changed, 183 insertions(+), 145 deletions(-) - -diff --git a/src/main/java/co/aikar/timings/WorldTimingsHandler.java b/src/main/java/co/aikar/timings/WorldTimingsHandler.java -index 51281cfa2..37702cd51 100644 ---- a/src/main/java/co/aikar/timings/WorldTimingsHandler.java -+++ b/src/main/java/co/aikar/timings/WorldTimingsHandler.java -@@ -60,7 +60,8 @@ public class WorldTimingsHandler { - - - public final Timing miscMobSpawning; -- public final Timing chunkInhibitedRangeCheck; -+ public final Timing bigRangeCheck; // Purpur -+ public final Timing smallRangeCheck; // Purpur - public final Timing playerMobDistanceMapUpdate; - - public final Timing poiUnload; -@@ -130,7 +131,8 @@ public class WorldTimingsHandler { - countNaturalMobs = Timings.ofSafe(name + "Count natural mobs"); - - -- chunkInhibitedRangeCheck = Timings.ofSafe(name + "Chunks - Inhibited Range Check"); -+ bigRangeCheck = Timings.ofSafe(name + "Chunks - Big Range Check"); // Purpur -+ smallRangeCheck = Timings.ofSafe(name + "Chunks - Small Range Check"); // Purpur - miscMobSpawning = Timings.ofSafe(name + "Mob spawning - Misc"); - playerMobDistanceMapUpdate = Timings.ofSafe(name + "Per Player Mob Spawning - Distance Map Update"); - -diff --git a/src/main/java/net/minecraft/server/ChunkMapDistance.java b/src/main/java/net/minecraft/server/ChunkMapDistance.java -index 73d157076..1c72ec1c7 100644 ---- a/src/main/java/net/minecraft/server/ChunkMapDistance.java -+++ b/src/main/java/net/minecraft/server/ChunkMapDistance.java -@@ -31,7 +31,7 @@ public abstract class ChunkMapDistance { - private final Long2ObjectMap> c = new Long2ObjectOpenHashMap(); - public final Long2ObjectOpenHashMap>> tickets = new Long2ObjectOpenHashMap(); - private final ChunkMapDistance.a e = new ChunkMapDistance.a(); -- private final ChunkMapDistance.b f = new ChunkMapDistance.b(8); -+ private final ChunkMapDistance.b f = new ChunkMapDistance.b(8); private ChunkMapDistance.b getPlayerDistanceChunkMap() { return f; } // Purpur - OBFHELPER - private final ChunkMapDistance.c g = new ChunkMapDistance.c(33); - private final java.util.Queue pendingChunkUpdates = new java.util.LinkedList<>(); // PAIL pendingChunkUpdates // Paper - use a queue - private final ChunkTaskQueueSorter i; -@@ -258,6 +258,20 @@ public abstract class ChunkMapDistance { - return this.f.a.size(); - } - -+ // Purpur start -+ public void updatePlayerDistanceChunkMap() { -+ getPlayerDistanceChunkMap().update(); -+ } -+ -+ public int getPlayerDistanceChunkMapSize() { -+ return getPlayerDistanceChunkMap().getChunks().size(); -+ } -+ -+ public boolean hasPlayersNearby(long chunk) { -+ return getPlayerDistanceChunkMap().getChunks().containsKey(chunk); -+ } -+ // Purpur end -+ - public boolean d(long i) { - this.f.a(); - return this.f.a.containsKey(i); -@@ -425,7 +439,7 @@ public abstract class ChunkMapDistance { - - class b extends ChunkMap { - -- protected final Long2ByteMap a = new Long2ByteOpenHashMap(); -+ protected final Long2ByteMap a = new Long2ByteOpenHashMap(); protected Long2ByteMap getChunks() { return a; } // Purpur - OBFHELPER - protected final int b; - - protected b(int i) { -@@ -465,6 +479,7 @@ public abstract class ChunkMapDistance { - return objectset != null && !objectset.isEmpty(); - } - -+ public void update() { a(); } // Purpur - OBFHELPER - public void a() { - this.b(Integer.MAX_VALUE); - } -diff --git a/src/main/java/net/minecraft/server/ChunkProviderServer.java b/src/main/java/net/minecraft/server/ChunkProviderServer.java -index 76c7f4a50..f01abf574 100644 ---- a/src/main/java/net/minecraft/server/ChunkProviderServer.java -+++ b/src/main/java/net/minecraft/server/ChunkProviderServer.java -@@ -3,7 +3,7 @@ package net.minecraft.server; - import com.google.common.annotations.VisibleForTesting; - import com.mojang.datafixers.DataFixer; - import com.mojang.datafixers.util.Either; --import it.unimi.dsi.fastutil.objects.Object2IntMap; -+ - import java.io.File; - import java.io.IOException; - import java.util.Arrays; -@@ -15,13 +15,10 @@ import java.util.function.BooleanSupplier; - import java.util.function.Function; - import java.util.function.Supplier; - import javax.annotation.Nullable; --import com.destroystokyo.paper.exception.ServerInternalException; --import org.apache.logging.log4j.LogManager; --import org.apache.logging.log4j.Logger; - - public class ChunkProviderServer extends IChunkProvider { - -- private static final int b = (int) Math.pow(17.0D, 2.0D); -+ private static final int b = (int) Math.pow(17.0D, 2.0D); private static int chunksEligibleForSpawning() { return b; } // Purpur - OBFHELPER - private static final List c = ChunkStatus.a(); static final List getPossibleChunkStatuses() { return ChunkProviderServer.c; } // Paper - OBFHELPER - private final ChunkMapDistance chunkMapDistance; - public final ChunkGenerator chunkGenerator; -@@ -610,147 +607,152 @@ public class ChunkProviderServer extends IChunkProvider { - } - - private void tickChunks() { -- long i = this.world.getTime(); -- long j = i - this.lastTickTime; -- -- this.lastTickTime = i; -- WorldData worlddata = this.world.getWorldData(); -- boolean flag = worlddata.getType() == WorldType.DEBUG_ALL_BLOCK_STATES; -- boolean flag1 = this.world.getGameRules().getBoolean(GameRules.DO_MOB_SPAWNING) && !world.getPlayers().isEmpty(); // CraftBukkit -- -- if (!flag) { -- this.world.getMethodProfiler().enter("pollingChunks"); -- int k = this.world.getGameRules().getInt(GameRules.RANDOM_TICK_SPEED); -- BlockPosition blockposition = this.world.getSpawn(); -- boolean flag2 = world.ticksPerAnimalSpawns != 0L && worlddata.getTime() % world.ticksPerAnimalSpawns == 0L; // CraftBukkit // PAIL: TODO monster ticks -- -- this.world.getMethodProfiler().enter("naturalSpawnCount"); -- this.world.timings.countNaturalMobs.startTiming(); // Paper - timings -- int l = this.chunkMapDistance.b(); -- EnumCreatureType[] aenumcreaturetype = EnumCreatureType.values(); -- // Paper start - per player mob spawning -+ // Purpur start -+ long tickTime = world.getTime(); -+ long tickTimeDiff = tickTime - lastTickTime; -+ lastTickTime = tickTime; -+ -+ if (world.getWorldData().getType() != WorldType.DEBUG_ALL_BLOCK_STATES) { -+ world.getMethodProfiler().enter("pollingChunks"); -+ -+ int randomTickSpeed = world.getGameRules().getInt(GameRules.RANDOM_TICK_SPEED); -+ BlockPosition worldSpawn = world.getSpawn(); -+ -+ boolean doMobSpawning = world.getGameRules().getBoolean(GameRules.DO_MOB_SPAWNING) && !world.getPlayers().isEmpty(); -+ boolean canSpawn = (world.ticksPerAnimalSpawns != 0L && tickTime % world.ticksPerAnimalSpawns == 0L) -+ || (world.ticksPerMonsterSpawns != 0L && tickTime % world.ticksPerMonsterSpawns == 0L); -+ -+ world.getMethodProfiler().enter("naturalSpawnCount"); -+ world.timings.countNaturalMobs.startTiming(); -+ -+ chunkMapDistance.updatePlayerDistanceChunkMap(); -+ int chunksCount = chunkMapDistance.getPlayerDistanceChunkMapSize(); -+ - int[] worldMobCount; -- if (this.playerChunkMap.playerMobDistanceMap != null) { -+ if (playerChunkMap.playerMobDistanceMap != null) { - // update distance map -- this.world.timings.playerMobDistanceMapUpdate.startTiming(); -- this.playerChunkMap.playerMobDistanceMap.update(this.world.players, this.playerChunkMap.viewDistance); -- this.world.timings.playerMobDistanceMapUpdate.stopTiming(); -+ world.timings.playerMobDistanceMapUpdate.startTiming(); -+ playerChunkMap.playerMobDistanceMap.update(world.players, playerChunkMap.viewDistance); -+ world.timings.playerMobDistanceMapUpdate.stopTiming(); - // re-set mob counts -- for (EntityPlayer player : this.world.players) { -+ for (EntityPlayer player : world.players) { - Arrays.fill(player.mobCounts, 0); - } -- worldMobCount = this.world.countMobs(true); -+ worldMobCount = world.countMobs(true); - } else { -- worldMobCount = this.world.countMobs(false); -+ worldMobCount = world.countMobs(false); - } -- // Paper end - -- this.world.timings.countNaturalMobs.stopTiming(); // Paper - timings -- this.world.getMethodProfiler().exit(); -- //Paper start - call player naturally spawn event -- int chunkRange = world.spigotConfig.mobSpawnRange; -- chunkRange = (chunkRange > world.spigotConfig.viewDistance) ? (byte) world.spigotConfig.viewDistance : chunkRange; -- chunkRange = Math.min(chunkRange, 8); -- for (EntityPlayer entityPlayer : this.world.players) { -- entityPlayer.playerNaturallySpawnedEvent = new com.destroystokyo.paper.event.entity.PlayerNaturallySpawnCreaturesEvent(entityPlayer.getBukkitEntity(), (byte) chunkRange); -- entityPlayer.playerNaturallySpawnedEvent.callEvent(); -- }; -- // Paper end -- this.playerChunkMap.f().forEach((playerchunk) -> { -- Optional optional = ((Either) playerchunk.b().getNow(PlayerChunk.UNLOADED_CHUNK)).left(); -+ world.timings.countNaturalMobs.stopTiming(); -+ world.getMethodProfiler().exit(); // naturalSpawnCount - -- if (optional.isPresent()) { -- Chunk chunk = (Chunk) optional.get(); -- -- this.world.getMethodProfiler().enter("broadcast"); -- this.world.timings.broadcastChunkUpdates.startTiming(); // Paper - timings -- playerchunk.a(chunk); -- this.world.timings.broadcastChunkUpdates.stopTiming(); // Paper - timings -- this.world.getMethodProfiler().exit(); -- ChunkCoordIntPair chunkcoordintpair = playerchunk.i(); -- -- this.world.timings.chunkInhibitedRangeCheck.startTiming(); -- if (!this.playerChunkMap.isOutsideOfRange(chunkcoordintpair)) { -- // Paper end -- chunk.setInhabitedTime(chunk.getInhabitedTime() + j); -- if (flag1 && (this.allowMonsters || this.allowAnimals) && this.world.getWorldBorder().isInBounds(chunk.getPos()) && !this.playerChunkMap.isOutsideOfRange(chunkcoordintpair, true)) { // Spigot -- this.world.getMethodProfiler().enter("spawner"); -- this.world.timings.mobSpawn.startTiming(); // Spigot -- EnumCreatureType[] aenumcreaturetype1 = aenumcreaturetype; -- int i1 = aenumcreaturetype.length; -- -- for (int j1 = 0; j1 < i1; ++j1) { -- EnumCreatureType enumcreaturetype = aenumcreaturetype1[j1]; -- -- // CraftBukkit start - Use per-world spawn limits -- int limit = enumcreaturetype.b(); -- switch (enumcreaturetype) { -- case MONSTER: -- limit = world.getWorld().getMonsterSpawnLimit(); -- break; -- case CREATURE: -- limit = world.getWorld().getAnimalSpawnLimit(); -- break; -- case WATER_CREATURE: -- limit = world.getWorld().getWaterAnimalSpawnLimit(); -- break; -- case AMBIENT: -- limit = world.getWorld().getAmbientSpawnLimit(); -- break; -- } -- -- if (limit == 0) { -- continue; -- } -- // CraftBukkit end -- -- if (enumcreaturetype != EnumCreatureType.MISC && (!enumcreaturetype.c() || this.allowAnimals) && (enumcreaturetype.c() || this.allowMonsters) && (!enumcreaturetype.d() || flag2)) { -- int k1 = limit * l / ChunkProviderServer.b; // CraftBukkit - use per-world limits -- -- // Paper start - only allow spawns upto the limit per chunk and update count afterwards -- int currEntityCount = worldMobCount[enumcreaturetype.ordinal()]; -- int difference = k1 - currEntityCount; -- -- if (this.world.paperConfig.perPlayerMobSpawns) { -- int minDiff = Integer.MAX_VALUE; -- for (EntityPlayer entityplayer : this.playerChunkMap.playerMobDistanceMap.getPlayersInRange(chunk.getPos())) { -- minDiff = Math.min(limit - this.playerChunkMap.getMobCountNear(entityplayer, enumcreaturetype), minDiff); -- } -- difference = (minDiff == Integer.MAX_VALUE) ? 0 : minDiff; -- } -- -- if (difference > 0) { -- int spawnCount = SpawnerCreature.spawnMobs(enumcreaturetype, this.world, chunk, blockposition, difference, -- this.world.paperConfig.perPlayerMobSpawns ? this.playerChunkMap::updatePlayerMobTypeMap : null); -- worldMobCount[enumcreaturetype.ordinal()] += spawnCount; -- // Paper end -- } -- } -+ byte chunkRange = (byte) Math.min(Math.min(world.spigotConfig.mobSpawnRange, world.spigotConfig.viewDistance), 8); -+ for (EntityPlayer player : world.players) { -+ player.playerNaturallySpawnedEvent = new com.destroystokyo.paper.event.entity.PlayerNaturallySpawnCreaturesEvent(player.getBukkitEntity(), chunkRange); -+ player.playerNaturallySpawnedEvent.callEvent(); -+ } -+ -+ EnumCreatureType[] creatureTypes = EnumCreatureType.values(); -+ EnumCreatureType.MONSTER.setSpigotCap(world.getWorld().getMonsterSpawnLimit()); -+ EnumCreatureType.CREATURE.setSpigotCap(world.getWorld().getAnimalSpawnLimit()); -+ EnumCreatureType.WATER_CREATURE.setSpigotCap(world.getWorld().getWaterAnimalSpawnLimit()); -+ EnumCreatureType.AMBIENT.setSpigotCap(world.getWorld().getAmbientSpawnLimit()); -+ -+ for (PlayerChunk playerchunk : playerChunkMap.getChunks()) { -+ Chunk chunk = playerchunk.getEntityTickingFuture().getNow(PlayerChunk.UNLOADED_CHUNK).left().orElse(null); -+ if (chunk == null) { -+ continue; -+ } -+ -+ world.getMethodProfiler().enter("broadcast"); -+ world.timings.broadcastChunkUpdates.startTiming(); -+ playerchunk.broadcast(chunk); -+ world.timings.broadcastChunkUpdates.stopTiming(); -+ world.getMethodProfiler().exit(); // broadcast -+ -+ ChunkCoordIntPair playerChunkPos = playerchunk.getPos(); -+ ChunkCoordIntPair chunkPos = chunk.getPos(); -+ -+ world.timings.bigRangeCheck.startTiming(); -+ boolean outsideBigRange = playerChunkMap.isOutsideOfRange(playerChunkPos); -+ world.timings.bigRangeCheck.stopTiming(); -+ if (outsideBigRange) { -+ continue; -+ } -+ -+ chunk.setInhabitedTime(chunk.getInhabitedTime() + tickTimeDiff); -+ -+ world.timings.smallRangeCheck.startTiming(); -+ boolean outsideSmallRange = playerChunkMap.isOutsideOfRange(playerChunkPos, true); -+ world.timings.smallRangeCheck.stopTiming(); -+ -+ if (!outsideSmallRange && doMobSpawning && (allowMonsters || allowAnimals) && world.getWorldBorder().isInBounds(chunkPos)) { -+ world.getMethodProfiler().enter("spawner"); -+ world.timings.mobSpawn.startTiming(); -+ for (EnumCreatureType creatureType : creatureTypes) { -+ if (creatureType == EnumCreatureType.MISC) { -+ continue; // do not spawn misc entities -+ } -+ -+ if (creatureType.isFriendly() && !allowAnimals) { -+ continue; // not allowed to spawn animals -+ } -+ -+ if (!creatureType.isFriendly() && !allowMonsters) { -+ continue; // not allowed to spawn monsters -+ } -+ -+ if (creatureType.isPersistent() && !canSpawn) { -+ continue; // skip this entity this tick -+ } -+ -+ int limit = creatureType.getSpigotCap(); -+ if (limit <= 0) { -+ continue; // entity is disabled -+ } -+ -+ int worldLimit = limit * chunksCount / chunksEligibleForSpawning(); -+ -+ int currEntityCount = worldMobCount[creatureType.ordinal()]; -+ int openSlots = worldLimit - currEntityCount; -+ -+ if (world.paperConfig.perPlayerMobSpawns) { -+ int minDiff = Integer.MAX_VALUE; -+ for (EntityPlayer player : playerChunkMap.playerMobDistanceMap.getPlayersInRange(chunkPos)) { -+ minDiff = Math.min(limit - playerChunkMap.getMobCountNear(player, creatureType), minDiff); - } -+ openSlots = (minDiff == Integer.MAX_VALUE) ? 0 : minDiff; -+ } - -- this.world.timings.mobSpawn.stopTiming(); // Spigot -- this.world.getMethodProfiler().exit(); -+ if (openSlots <= 0) { -+ continue; // mob cap reached - } - -- this.world.timings.chunkTicks.startTiming(); // Spigot // Paper -- this.world.a(chunk, k); -- this.world.timings.chunkTicks.stopTiming(); // Spigot // Paper -+ worldMobCount[creatureType.ordinal()] += SpawnerCreature.spawnMobs(creatureType, world, chunk, worldSpawn, openSlots, world.paperConfig.perPlayerMobSpawns ? playerChunkMap::updatePlayerMobTypeMap : null); - } -- this.world.timings.chunkInhibitedRangeCheck.stopTiming(); // Paper -+ -+ world.timings.mobSpawn.stopTiming(); -+ world.getMethodProfiler().exit(); // spawner - } -- }); -- this.world.getMethodProfiler().enter("customSpawners"); -- if (flag1) { -- try (co.aikar.timings.Timing ignored = this.world.timings.miscMobSpawning.startTiming()) { // Paper - timings -- this.chunkGenerator.doMobSpawning(this.world, this.allowMonsters, this.allowAnimals); -+ -+ world.timings.chunkTicks.startTiming(); -+ world.tickChunk(chunk, randomTickSpeed); -+ world.timings.chunkTicks.stopTiming(); -+ } -+ -+ world.getMethodProfiler().enter("customSpawners"); -+ if (doMobSpawning) { -+ try (co.aikar.timings.Timing ignored = world.timings.miscMobSpawning.startTiming()) { // Paper - timings -+ chunkGenerator.doMobSpawning(world, allowMonsters, allowAnimals); - } // Paper - timings - } -+ world.getMethodProfiler().exit(); // customSpawners - -- this.world.getMethodProfiler().exit(); -- this.world.getMethodProfiler().exit(); -+ world.getMethodProfiler().exit(); // pollingChunks - } - -- this.playerChunkMap.g(); -+ playerChunkMap.tick(); -+ // Purpur end - } - - @Override -diff --git a/src/main/java/net/minecraft/server/EnumCreatureType.java b/src/main/java/net/minecraft/server/EnumCreatureType.java -index 3ed7fa324..d22d70bb4 100644 ---- a/src/main/java/net/minecraft/server/EnumCreatureType.java -+++ b/src/main/java/net/minecraft/server/EnumCreatureType.java -@@ -6,11 +6,13 @@ import java.util.stream.Collectors; - - public enum EnumCreatureType { - -- MONSTER("monster", 70, false, false), CREATURE("creature", 10, true, true), AMBIENT("ambient", 15, true, false), WATER_CREATURE("water_creature", 15, true, false), MISC("misc", 15, true, false); -+ MONSTER("monster", 70, false, false), -+ CREATURE("creature", 10, true, true), -+ AMBIENT("ambient", 15, true, false), -+ WATER_CREATURE("water_creature", 15, true, false), -+ MISC("misc", 15, true, false); - -- private static final Map f = (Map) Arrays.stream(values()).collect(Collectors.toMap(EnumCreatureType::a, (enumcreaturetype) -> { -- return enumcreaturetype; -- })); -+ private static final Map f = Arrays.stream(values()).collect(Collectors.toMap(EnumCreatureType::a, (enumcreaturetype) -> enumcreaturetype)); // Purpur - decompile error - private final int g; - private final boolean h; - private final boolean i; -@@ -23,19 +25,35 @@ public enum EnumCreatureType { - this.i = flag1; - } - -+ public String getName() { return a(); } // Purpur - OBFHELPER - public String a() { - return this.j; - } - -+ public int getSpawnCap() { return b(); } // Purpur - OBFHELPER - public int b() { - return this.g; - } - -+ public boolean isFriendly() { return c(); } // Purpur - OBFHELPER - public boolean c() { - return this.h; - } - -+ public boolean isPersistent() { return d(); } // Purpur - OBFHELPER - public boolean d() { - return this.i; - } -+ -+ // Purpur start -+ private int spigotCap = -1; -+ -+ void setSpigotCap(int cap) { -+ this.spigotCap = cap; -+ } -+ -+ int getSpigotCap() { -+ return this.spigotCap; -+ } -+ // Purpur end - } -diff --git a/src/main/java/net/minecraft/server/PlayerChunk.java b/src/main/java/net/minecraft/server/PlayerChunk.java -index b82ea26eb..1fc8f4b08 100644 ---- a/src/main/java/net/minecraft/server/PlayerChunk.java -+++ b/src/main/java/net/minecraft/server/PlayerChunk.java -@@ -155,6 +155,7 @@ public class PlayerChunk { - return this.tickingFuture; - } - -+ public CompletableFuture> getEntityTickingFuture() { return b(); } // Purpur - OBFHELPER - public CompletableFuture> b() { - return this.entityTickingFuture; - } -@@ -227,6 +228,7 @@ public class PlayerChunk { - } - } - -+ public void broadcast(Chunk chunk) { a(chunk); } // Purpur - OBFHELPER - public void a(Chunk chunk) { - if (this.dirtyCount != 0 || this.u != 0 || this.t != 0) { - World world = chunk.getWorld(); -@@ -342,6 +344,7 @@ public class PlayerChunk { - }); - } - -+ public ChunkCoordIntPair getPos() { return i(); } // Purpur - OBFHELPER - public ChunkCoordIntPair i() { - return this.location; - } -diff --git a/src/main/java/net/minecraft/server/PlayerChunkMap.java b/src/main/java/net/minecraft/server/PlayerChunkMap.java -index 57bea926a..ffcdc0b4a 100644 ---- a/src/main/java/net/minecraft/server/PlayerChunkMap.java -+++ b/src/main/java/net/minecraft/server/PlayerChunkMap.java -@@ -1069,6 +1069,7 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d { - return this.chunkDistanceManager; - } - -+ protected Iterable getChunks() { return f(); } // Purpur - OBFHELPER - protected Iterable f() { - return Iterables.unmodifiableIterable(this.visibleChunks.values()); - } -@@ -1266,26 +1267,21 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d { - } - - boolean isOutsideOfRange(ChunkCoordIntPair chunkcoordintpair, boolean reducedRange) { -- int chunkRange = world.spigotConfig.mobSpawnRange; -- chunkRange = (chunkRange > world.spigotConfig.viewDistance) ? (byte) world.spigotConfig.viewDistance : chunkRange; -- chunkRange = (chunkRange > 8) ? 8 : chunkRange; -- -- final int finalChunkRange = chunkRange; // Paper for lambda below -- //double blockRange = (reducedRange) ? Math.pow(chunkRange << 4, 2) : 16384.0D; // Paper - use from event -+ // Purpur - removed a bunch of crap not used anymore - // Spigot end - long i = chunkcoordintpair.pair(); - -- return !this.chunkDistanceManager.d(i) ? true : this.playerMap.a(i).noneMatch((entityplayer) -> { -+ return !this.chunkDistanceManager.hasPlayersNearby(i) || this.playerMap.a(i).noneMatch((entityplayer) -> { // Purpur - // Paper start - -- com.destroystokyo.paper.event.entity.PlayerNaturallySpawnCreaturesEvent event; -+ // com.destroystokyo.paper.event.entity.PlayerNaturallySpawnCreaturesEvent event // Purpur - moved down - double blockRange = 16384.0D; - if (reducedRange) { -- event = entityplayer.playerNaturallySpawnedEvent; -+ com.destroystokyo.paper.event.entity.PlayerNaturallySpawnCreaturesEvent event = entityplayer.playerNaturallySpawnedEvent; // Purpur - if (event == null || event.isCancelled()) return false; -- blockRange = (double) ((event.getSpawnRadius() << 4) * (event.getSpawnRadius() << 4)); -+ blockRange = (event.getSpawnRadius() << 4) * (event.getSpawnRadius() << 4); // Purpur - removed pointless cast - } - -- return (!entityplayer.isSpectator() && a(chunkcoordintpair, (Entity) entityplayer) < blockRange); // Spigot -+ return !entityplayer.isSpectator() && a(chunkcoordintpair, entityplayer) < blockRange; // Spigot // Purpur - remove pointless cast - // Paper end - }); - } -@@ -1496,6 +1492,7 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d { - entity.tracker = null; // Paper - We're no longer tracked - } - -+ protected void tick() { g(); } // Purpur - OBFHELPER - protected void g() { - List list = Lists.newArrayList(); - List list1 = this.world.getPlayers(); -diff --git a/src/main/java/net/minecraft/server/WorldServer.java b/src/main/java/net/minecraft/server/WorldServer.java -index 456c835c8..ccb6372ab 100644 ---- a/src/main/java/net/minecraft/server/WorldServer.java -+++ b/src/main/java/net/minecraft/server/WorldServer.java -@@ -537,6 +537,7 @@ public class WorldServer extends World { - private final com.destroystokyo.paper.util.math.ThreadUnsafeRandom randomTickRandom = new com.destroystokyo.paper.util.math.ThreadUnsafeRandom(); - // Paper end - -+ public void tickChunk(Chunk chunk, int randomTickSpeed) { a(chunk, randomTickSpeed); } // Purpur - OBFHELPER - public void a(Chunk chunk, int i) { - ChunkCoordIntPair chunkcoordintpair = chunk.getPos(); - boolean flag = this.isRaining(); --- -2.24.0 - diff --git a/patches/server/0106-Optimise-Chunk-getFluid.patch b/patches/server/0105-Optimise-Chunk-getFluid.patch similarity index 92% rename from patches/server/0106-Optimise-Chunk-getFluid.patch rename to patches/server/0105-Optimise-Chunk-getFluid.patch index 8ecab9728..ebd57c347 100644 --- a/patches/server/0106-Optimise-Chunk-getFluid.patch +++ b/patches/server/0105-Optimise-Chunk-getFluid.patch @@ -1,4 +1,4 @@ -From e2c2cf4f6ab14470a9360b63143fb84cbe0803e4 Mon Sep 17 00:00:00 2001 +From 41fedcda2798c6d693e4089a3f14787de92ffb4d Mon Sep 17 00:00:00 2001 From: Spottedleaf Date: Tue, 14 Jan 2020 14:59:08 -0800 Subject: [PATCH] Optimise Chunk#getFluid @@ -12,10 +12,10 @@ easier to inline due to code size 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/src/main/java/net/minecraft/server/Chunk.java b/src/main/java/net/minecraft/server/Chunk.java -index 92065fe02..07073af99 100644 +index cd7ada615..15d66edad 100644 --- a/src/main/java/net/minecraft/server/Chunk.java +++ b/src/main/java/net/minecraft/server/Chunk.java -@@ -297,17 +297,20 @@ public class Chunk implements IChunkAccess { +@@ -385,17 +385,20 @@ public class Chunk implements IChunkAccess { } public Fluid a(int i, int j, int k) { @@ -43,7 +43,7 @@ index 92065fe02..07073af99 100644 CrashReport crashreport = CrashReport.a(throwable, "Getting fluid state"); CrashReportSystemDetails crashreportsystemdetails = crashreport.a("Block being got"); -@@ -316,6 +319,7 @@ public class Chunk implements IChunkAccess { +@@ -404,6 +407,7 @@ public class Chunk implements IChunkAccess { }); throw new ReportedException(crashreport); } diff --git a/patches/server/0105-Reduce-entity-tracker-updates-on-move.patch b/patches/server/0105-Reduce-entity-tracker-updates-on-move.patch deleted file mode 100644 index 11c87b1b1..000000000 --- a/patches/server/0105-Reduce-entity-tracker-updates-on-move.patch +++ /dev/null @@ -1,218 +0,0 @@ -From f012440a6b278465d655b99bbb74c41ca72dec83 Mon Sep 17 00:00:00 2001 -From: froobynooby -Date: Thu, 20 Feb 2020 15:50:49 +0930 -Subject: [PATCH] Reduce entity tracker updates on move - -With this patch, for each player we keep track of a set of -entities that the player is tracking. This is used to split -the entity tracker update logic in the movePlayer method in -PlayerChunkMap in to two parts: -* Full update: Run through all entity trackers and update them -* Partial update: Run through all entity trackers for entities -the player is already tracking and update them - -Partial updates will always take less time than full updates, -usually by a considerable amount if players and entities are -spread out over the map. Assuming they are evenly spread, -and given there are x many players, it would be expected to -take 1/x the time of a full update. - -Full updates are only run if the following conditions are met: -* It has been 20 ticks since the last full update -* The player has moved over set distance since the last full -update (distance is configurable) - -The motivation for the first condition is that the client -sends the server its position once a second, which calls -movePlayer, so at a minimum we want to be sending the player -an updated set of entities it can see every second. - -The motivation for the second condition is that looping -through every entity in world to check if it is now within -the tracking range after the player has moved 0.1 blocks is -largely unnecessary. Checking only after the player has moved -1 or 2 blocks is far better for performance, and very unlikely -to give any noticeable side effects. - -In testing, this has reduced the time taken for movement -packet processing by up to 4x. Packet processing for movement -packets often show up as a major contributor to TPS loss in -servers with large player counts ---- - .../destroystokyo/paper/PaperWorldConfig.java | 5 ++ - .../net/minecraft/server/EntityPlayer.java | 4 ++ - .../net/minecraft/server/PlayerChunkMap.java | 63 ++++++++++++++++++- - 3 files changed, 70 insertions(+), 2 deletions(-) - -diff --git a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java -index 7d408542e..2ae44b230 100644 ---- a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java -+++ b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java -@@ -658,4 +658,9 @@ public class PaperWorldConfig { - private void nerfNetherPortalPigmen() { - nerfNetherPortalPigmen = getBoolean("game-mechanics.nerf-pigmen-from-nether-portals", nerfNetherPortalPigmen); - } -+ -+ public double trackerUpdateDistance = 1; -+ private void trackeruUpdateDistance() { -+ trackerUpdateDistance = getDouble("tracker-update-distance", trackerUpdateDistance); -+ } - } -diff --git a/src/main/java/net/minecraft/server/EntityPlayer.java b/src/main/java/net/minecraft/server/EntityPlayer.java -index 66ac64d1f..90ca5f38f 100644 ---- a/src/main/java/net/minecraft/server/EntityPlayer.java -+++ b/src/main/java/net/minecraft/server/EntityPlayer.java -@@ -86,6 +86,10 @@ public class EntityPlayer extends EntityHuman implements ICrafting { - public final int[] mobCounts = new int[ENUMCREATURETYPE_TOTAL_ENUMS]; // Paper - public final com.destroystokyo.paper.util.PooledHashSets.PooledObjectLinkedOpenHashSet cachedSingleMobDistanceMap; - // Paper end -+ // Paper start - Reduce entity tracker updates on move -+ public Vec3D lastTrackedPosition = new Vec3D(0, 0, 0); -+ public long lastTrackedTick; -+ // Paper end - - // CraftBukkit start - public String displayName; -diff --git a/src/main/java/net/minecraft/server/PlayerChunkMap.java b/src/main/java/net/minecraft/server/PlayerChunkMap.java -index ffcdc0b4a..8144e669c 100644 ---- a/src/main/java/net/minecraft/server/PlayerChunkMap.java -+++ b/src/main/java/net/minecraft/server/PlayerChunkMap.java -@@ -133,6 +133,39 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d { - } - - -+ // Paper end -+ -+ // Paper start - Reduce entity tracker updates on move -+ private double trackerUpdateDistanceSquared; -+ private final Int2ObjectMap> playerTrackedEntities = new Int2ObjectOpenHashMap(); -+ private final Int2ObjectMap> playerTrackedEntitiesRemoveQueue = new Int2ObjectOpenHashMap(); -+ -+ void flushRemoveQueue(EntityPlayer entityplayer) { -+ Queue removeQueue = getPlayerTrackedEntityMapRemoveQueue(entityplayer.getId()); -+ Int2ObjectMap entityMap = getPlayerTrackedEntityMap(entityplayer.getId()); -+ for (Integer id = removeQueue.poll(); id != null; id = removeQueue.poll()) { -+ entityMap.remove(id); -+ } -+ } -+ -+ void flushRemoveQueues() { -+ for (Int2ObjectMap.Entry> entry : playerTrackedEntitiesRemoveQueue.int2ObjectEntrySet()) { -+ Int2ObjectMap entityMap = getPlayerTrackedEntityMap(entry.getKey()); -+ Queue removeQueue = entry.getValue(); -+ for (Integer id = removeQueue.poll(); id != null; id = removeQueue.poll()) { -+ entityMap.remove(id); -+ } -+ } -+ } -+ -+ Int2ObjectMap getPlayerTrackedEntityMap(int id) { -+ return playerTrackedEntities.computeIfAbsent(id, i -> new Int2ObjectOpenHashMap()); -+ } -+ -+ Queue getPlayerTrackedEntityMapRemoveQueue(int id) { -+ return playerTrackedEntitiesRemoveQueue.computeIfAbsent(id, i -> new java.util.ArrayDeque<>()); -+ } -+ - // Paper end - - public PlayerChunkMap(WorldServer worldserver, File file, DataFixer datafixer, DefinedStructureManager definedstructuremanager, Executor executor, IAsyncTaskHandler iasynctaskhandler, ILightAccess ilightaccess, ChunkGenerator chunkgenerator, WorldLoadListener worldloadlistener, Supplier supplier, int i) { -@@ -167,6 +200,7 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d { - this.m = new VillagePlace(new File(this.w, "poi"), datafixer, this.world); // Paper - this.setViewDistance(i); - this.playerMobDistanceMap = this.world.paperConfig.perPlayerMobSpawns ? new com.destroystokyo.paper.util.PlayerMobDistanceMap() : null; // Paper -+ this.trackerUpdateDistanceSquared = Math.pow(this.world.paperConfig.trackerUpdateDistance, 2); // Paper - } - - public void updatePlayerMobTypeMap(Entity entity) { -@@ -1330,8 +1364,19 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d { - } - - public void movePlayer(EntityPlayer entityplayer) { -- ObjectIterator objectiterator = this.trackedEntities.values().iterator(); -+ // Paper start -+ // ObjectIterator objectiterator = this.trackedEntities.values().iterator(); -+ ObjectIterator objectiterator; - -+ if (MinecraftServer.currentTick - entityplayer.lastTrackedTick >= 20 -+ || entityplayer.lastTrackedPosition.distanceSquared(entityplayer.getPositionVector()) >= trackerUpdateDistanceSquared) { -+ entityplayer.lastTrackedPosition = entityplayer.getPositionVector(); -+ entityplayer.lastTrackedTick = MinecraftServer.currentTick; -+ objectiterator = this.trackedEntities.values().iterator(); // Update all entity trackers -+ } else { -+ objectiterator = getPlayerTrackedEntityMap(entityplayer.getId()).values().iterator(); // Only update entity trackers for already tracked entities -+ } -+ // Paper end - while (objectiterator.hasNext()) { - PlayerChunkMap.EntityTracker playerchunkmap_entitytracker = (PlayerChunkMap.EntityTracker) objectiterator.next(); - -@@ -1341,6 +1386,7 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d { - playerchunkmap_entitytracker.updatePlayer(entityplayer); - } - } -+ flushRemoveQueues(); // Paper - - int i = MathHelper.floor(entityplayer.locX()) >> 4; - int j = MathHelper.floor(entityplayer.locZ()) >> 4; -@@ -1482,12 +1528,21 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d { - - playerchunkmap_entitytracker.clear(entityplayer); - } -+ // Paper start -+ playerTrackedEntities.remove(entityplayer.getId()); -+ playerTrackedEntitiesRemoveQueue.remove(entityplayer.getId()); -+ // Paper end - } - - PlayerChunkMap.EntityTracker playerchunkmap_entitytracker1 = (PlayerChunkMap.EntityTracker) this.trackedEntities.remove(entity.getId()); - - if (playerchunkmap_entitytracker1 != null) { - playerchunkmap_entitytracker1.a(); -+ // Paper start -+ for (EntityPlayer player : playerchunkmap_entitytracker1.trackedPlayers) { -+ getPlayerTrackedEntityMap(player.getId()).remove(playerchunkmap_entitytracker1.tracker.getId()); -+ } -+ // Paper end - } - entity.tracker = null; // Paper - We're no longer tracked - } -@@ -1529,7 +1584,7 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d { - } - world.timings.tracker2.stopTiming(); // Paper - } -- -+ flushRemoveQueues(); // Paper - - } - -@@ -1578,6 +1633,7 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d { - } - } - } -+ flushRemoveQueue(entityplayer); // Paper - - Iterator iterator; - Entity entity1; -@@ -1674,6 +1730,7 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d { - org.spigotmc.AsyncCatcher.catchOp("player tracker clear"); // Spigot - if (this.trackedPlayers.remove(entityplayer)) { - this.trackerEntry.a(entityplayer); -+ getPlayerTrackedEntityMap(entityplayer.getId()).remove(this.tracker.getId()); // Paper - } - - } -@@ -1710,9 +1767,11 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d { - - if (flag1 && this.trackedPlayerMap.putIfAbsent(entityplayer, true) == null) { // Paper - this.trackerEntry.b(entityplayer); -+ getPlayerTrackedEntityMap(entityplayer.getId()).put(this.tracker.getId(), this); // Paper - } - } else if (this.trackedPlayers.remove(entityplayer)) { - this.trackerEntry.a(entityplayer); -+ getPlayerTrackedEntityMapRemoveQueue(entityplayer.getId()).add(this.tracker.getId()); // Paper - } - - } --- -2.24.0 - diff --git a/patches/server/0107-Fix-the-dead-lagging-the-server.patch b/patches/server/0106-Fix-the-dead-lagging-the-server.patch similarity index 91% rename from patches/server/0107-Fix-the-dead-lagging-the-server.patch rename to patches/server/0106-Fix-the-dead-lagging-the-server.patch index a7c23a57b..46aebd327 100644 --- a/patches/server/0107-Fix-the-dead-lagging-the-server.patch +++ b/patches/server/0106-Fix-the-dead-lagging-the-server.patch @@ -1,4 +1,4 @@ -From aff40f64adfb63132461e3793b998b0af84baeab Mon Sep 17 00:00:00 2001 +From f819a0338b65e24c99f756ad4ad48760a8e78bff Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Fri, 6 Mar 2020 13:37:26 -0600 Subject: [PATCH] Fix the dead lagging the server @@ -9,10 +9,10 @@ Subject: [PATCH] Fix the dead lagging the server 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/net/minecraft/server/Entity.java b/src/main/java/net/minecraft/server/Entity.java -index 697c1d562..bb9ef77a2 100644 +index c85e79494..7cc0354d5 100644 --- a/src/main/java/net/minecraft/server/Entity.java +++ b/src/main/java/net/minecraft/server/Entity.java -@@ -1343,7 +1343,7 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke +@@ -1395,7 +1395,7 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke this.pitch = MathHelper.a(f1, -90.0F, 90.0F) % 360.0F; this.lastYaw = this.yaw; this.lastPitch = this.pitch; diff --git a/patches/server/0108-Optimize-entity-pathfinder-selector.patch b/patches/server/0108-Optimize-entity-pathfinder-selector.patch deleted file mode 100644 index 3acc4b0ef..000000000 --- a/patches/server/0108-Optimize-entity-pathfinder-selector.patch +++ /dev/null @@ -1,344 +0,0 @@ -From 1dd35988e94f4edc0fb1eb34cf4adc444621deb7 Mon Sep 17 00:00:00 2001 -From: William Blake Galbreath -Date: Fri, 6 Mar 2020 16:33:58 -0600 -Subject: [PATCH] Optimize entity pathfinder selector - ---- - .../co/aikar/timings/MinecraftTimings.java | 4 + - .../tuinity/util/OptimizedSmallEnumSet.java | 65 +++++++++ - .../net/minecraft/server/PathfinderGoal.java | 6 +- - .../server/PathfinderGoalSelector.java | 132 +++++++++++------- - .../server/PathfinderGoalWrapped.java | 6 +- - 5 files changed, 159 insertions(+), 54 deletions(-) - create mode 100644 src/main/java/com/tuinity/tuinity/util/OptimizedSmallEnumSet.java - -diff --git a/src/main/java/co/aikar/timings/MinecraftTimings.java b/src/main/java/co/aikar/timings/MinecraftTimings.java -index 69e26a826..11b62a2e0 100644 ---- a/src/main/java/co/aikar/timings/MinecraftTimings.java -+++ b/src/main/java/co/aikar/timings/MinecraftTimings.java -@@ -42,6 +42,10 @@ public final class MinecraftTimings { - public static final Timing antiXrayUpdateTimer = Timings.ofSafe("anti-xray - update"); - public static final Timing antiXrayObfuscateTimer = Timings.ofSafe("anti-xray - obfuscate"); - -+ public static final Timing goalCleanup = Timings.ofSafe("PathfinderGoal - Cleanup"); -+ public static final Timing goalUpdate = Timings.ofSafe("PathfinderGoal - Update"); -+ public static final Timing goalTick = Timings.ofSafe("PathfinderGoal - Tick"); -+ - private static final Map, String> taskNameCache = new MapMaker().weakKeys().makeMap(); - - private MinecraftTimings() {} -diff --git a/src/main/java/com/tuinity/tuinity/util/OptimizedSmallEnumSet.java b/src/main/java/com/tuinity/tuinity/util/OptimizedSmallEnumSet.java -new file mode 100644 -index 000000000..68db85888 ---- /dev/null -+++ b/src/main/java/com/tuinity/tuinity/util/OptimizedSmallEnumSet.java -@@ -0,0 +1,65 @@ -+package com.tuinity.tuinity.util; -+ -+import java.util.Collection; -+ -+// containing utils to work on small numbers of enums -+public final class OptimizedSmallEnumSet { -+ -+ private final Class enumClass; -+ private long backingSet; -+ -+ public OptimizedSmallEnumSet(final Class clazz) { -+ if (clazz == null) { -+ throw new IllegalArgumentException("Null class"); -+ } -+ if (!clazz.isEnum()) { -+ throw new IllegalArgumentException("Class must be enum, not " + clazz.getCanonicalName()); -+ } -+ this.enumClass = clazz; -+ } -+ -+ public boolean addUnchecked(final E element) { -+ final int ordinal = element.ordinal(); -+ final long key = 1L << ordinal; -+ -+ final long prev = this.backingSet; -+ this.backingSet = prev | key; -+ -+ return (prev & key) == 0; -+ } -+ -+ public boolean removeUnchecked(final E element) { -+ final int ordinal = element.ordinal(); -+ final long key = 1L << ordinal; -+ -+ final long prev = this.backingSet; -+ this.backingSet = prev & ~key; -+ -+ return (prev & key) != 0; -+ } -+ -+ public void clear() { -+ this.backingSet = 0L; -+ } -+ -+ public int size() { -+ return Long.bitCount(this.backingSet); -+ } -+ -+ public void addAllUnchecked(final Collection enums) { -+ for (final E element : enums) { -+ if (element == null) { -+ throw new NullPointerException("Null element"); -+ } -+ this.backingSet |= (1L << element.ordinal()); -+ } -+ } -+ -+ public long getBackingSet() { -+ return this.backingSet; -+ } -+ -+ public boolean hasCommonElements(final OptimizedSmallEnumSet other) { -+ return (other.backingSet & this.backingSet) != 0; -+ } -+} -diff --git a/src/main/java/net/minecraft/server/PathfinderGoal.java b/src/main/java/net/minecraft/server/PathfinderGoal.java -index e059930ba..6c307a909 100644 ---- a/src/main/java/net/minecraft/server/PathfinderGoal.java -+++ b/src/main/java/net/minecraft/server/PathfinderGoal.java -@@ -4,7 +4,7 @@ import java.util.EnumSet; - - public abstract class PathfinderGoal { - -- private final EnumSet a = EnumSet.noneOf(PathfinderGoal.Type.class); -+ private final com.tuinity.tuinity.util.OptimizedSmallEnumSet a = new com.tuinity.tuinity.util.OptimizedSmallEnumSet<>(PathfinderGoal.Type.class); // Purpur - - public PathfinderGoal() {} - -@@ -30,14 +30,14 @@ public abstract class PathfinderGoal { - public void setTypes(EnumSet types) { this.a(types); } // Purpur - OBFHELPER - public void a(EnumSet enumset) { - this.a.clear(); -- this.a.addAll(enumset); -+ this.a.addAllUnchecked(enumset); // Purpur - } - - public String toString() { - return this.getClass().getSimpleName(); - } - -- public EnumSet i() { -+ public com.tuinity.tuinity.util.OptimizedSmallEnumSet i() { // Purpur - return this.a; - } - -diff --git a/src/main/java/net/minecraft/server/PathfinderGoalSelector.java b/src/main/java/net/minecraft/server/PathfinderGoalSelector.java -index 935136771..b2bea3e24 100644 ---- a/src/main/java/net/minecraft/server/PathfinderGoalSelector.java -+++ b/src/main/java/net/minecraft/server/PathfinderGoalSelector.java -@@ -12,6 +12,7 @@ import org.apache.logging.log4j.Logger; - public class PathfinderGoalSelector { - - private static final Logger LOGGER = LogManager.getLogger(); -+ private static PathfinderGoalWrapped EMPTY_GOAL() { return b; }; // Purpur - OBFHELPER - private static final PathfinderGoalWrapped b = new PathfinderGoalWrapped(Integer.MAX_VALUE, new PathfinderGoal() { - @Override - public boolean a() { -@@ -26,7 +27,7 @@ public class PathfinderGoalSelector { - private final Map c = new EnumMap(PathfinderGoal.Type.class); - private final Set d = Sets.newLinkedHashSet();private Set getTasks() { return d; }// Paper - OBFHELPER - private final GameProfilerFiller e; -- private final EnumSet f = EnumSet.noneOf(PathfinderGoal.Type.class); -+ private final com.tuinity.tuinity.util.OptimizedSmallEnumSet disabledTypes = new com.tuinity.tuinity.util.OptimizedSmallEnumSet<>(PathfinderGoal.Type.class); // Purpur - private int g = 3;private int getTickRate() { return g; } // Paper - OBFHELPER - private int curRate;private int getCurRate() { return curRate; } private void incRate() { this.curRate++; } // Paper TODO - -@@ -58,65 +59,98 @@ public class PathfinderGoalSelector { - // Paper end - - public void a(PathfinderGoal pathfindergoal) { -- this.d.stream().filter((pathfindergoalwrapped) -> { -- return pathfindergoalwrapped.j() == pathfindergoal; -- }).filter(PathfinderGoalWrapped::g).forEach(PathfinderGoalWrapped::d); -- this.d.removeIf((pathfindergoalwrapped) -> { -- return pathfindergoalwrapped.j() == pathfindergoal; -- }); -+ // Purpur start -+ for (java.util.Iterator iterator = getTasks().iterator(); iterator.hasNext();) { -+ PathfinderGoalWrapped wrappedGoal = iterator.next(); -+ if (wrappedGoal.getGoal() != pathfindergoal) { -+ continue; -+ } -+ if (wrappedGoal.isRunning()) { -+ wrappedGoal.d(); // reset goal -+ } -+ iterator.remove(); -+ } -+ // Purpur end - } - -+ private static final PathfinderGoal.Type[] PATHFINDER_GOAL_TYPES = PathfinderGoal.Type.values(); // Purpur -+ - public void doTick() { - this.e.enter("goalCleanup"); -- this.c().filter((pathfindergoalwrapped) -> { -- boolean flag; -+ // Purpur start -+ co.aikar.timings.MinecraftTimings.goalCleanup.startTiming(); -+ for (java.util.Iterator iter = getTasks().iterator(); iter.hasNext();) { -+ PathfinderGoalWrapped wrappedGoal = iter.next(); -+ if (!wrappedGoal.isRunning()) { -+ continue; // goal is not running -+ } -+ if (!this.disabledTypes.hasCommonElements(wrappedGoal.getTypes()) && wrappedGoal.b()) { -+ continue; // goal type is not disabled and should continue running -+ } -+ wrappedGoal.d(); // reset goal -+ } -+ this.c.forEach((type, goal) -> { -+ if (!goal.isRunning()) { -+ this.c.remove(type); // remove locked goal types if goal no longer running -+ } -+ }); -+ co.aikar.timings.MinecraftTimings.goalCleanup.stopTiming(); -+ // Purpur end -+ this.e.exit(); -+ this.e.enter("goalUpdate"); -+ // Purpur start -+ co.aikar.timings.MinecraftTimings.goalUpdate.startTiming(); -+ goal_update_loop: -+ for (java.util.Iterator iterator = getTasks().iterator(); iterator.hasNext();) { -+ PathfinderGoalWrapped wrappedGoal = iterator.next(); -+ if (wrappedGoal.isRunning()) { -+ continue; // goal is already running -+ } -+ -+ com.tuinity.tuinity.util.OptimizedSmallEnumSet wrappedGoalSet = wrappedGoal.getTypes(); - -- if (pathfindergoalwrapped.g()) { -- Stream stream = pathfindergoalwrapped.i().stream(); -- EnumSet enumset = this.f; -+ if (disabledTypes.hasCommonElements(wrappedGoalSet)) { -+ continue; // goal type is disabled -+ } - -- this.f.getClass(); -- if (!stream.anyMatch(enumset::contains) && pathfindergoalwrapped.b()) { -- flag = false; -- return flag; -+ long k = wrappedGoalSet.getBackingSet(); -+ int wrappedGoalSize = wrappedGoalSet.size(); -+ for (int i = 0; i < wrappedGoalSize; ++i) { -+ PathfinderGoal.Type type = PATHFINDER_GOAL_TYPES[Long.numberOfTrailingZeros(k)]; -+ k ^= -k & k; // Tuinity's ca.spottedleaf.concurrentutil.util.IntegerUtil.getTrailingBit -+ if (!c.getOrDefault(type, EMPTY_GOAL()).canBeReplacedBy(wrappedGoal)) { -+ continue goal_update_loop; // goal type(s) is locked by another running goal with same type(s) - } - } - -- flag = true; -- return flag; -- }).forEach(PathfinderGoal::d); -- this.c.forEach((pathfindergoal_type, pathfindergoalwrapped) -> { -- if (!pathfindergoalwrapped.g()) { -- this.c.remove(pathfindergoal_type); -+ if (!wrappedGoal.a()) { -+ continue; // goal failed to run - } - -- }); -- this.e.exit(); -- this.e.enter("goalUpdate"); -- this.d.stream().filter((pathfindergoalwrapped) -> { -- return !pathfindergoalwrapped.g(); -- }).filter((pathfindergoalwrapped) -> { -- Stream stream = pathfindergoalwrapped.i().stream(); -- EnumSet enumset = this.f; -- -- this.f.getClass(); -- return stream.noneMatch(enumset::contains); -- }).filter((pathfindergoalwrapped) -> { -- return pathfindergoalwrapped.i().stream().allMatch((pathfindergoal_type) -> { -- return ((PathfinderGoalWrapped) this.c.getOrDefault(pathfindergoal_type, PathfinderGoalSelector.b)).a(pathfindergoalwrapped); -- }); -- }).filter(PathfinderGoalWrapped::a).forEach((pathfindergoalwrapped) -> { -- pathfindergoalwrapped.i().forEach((pathfindergoal_type) -> { -- PathfinderGoalWrapped pathfindergoalwrapped1 = (PathfinderGoalWrapped) this.c.getOrDefault(pathfindergoal_type, PathfinderGoalSelector.b); -- -- pathfindergoalwrapped1.d(); -- this.c.put(pathfindergoal_type, pathfindergoalwrapped); -- }); -- pathfindergoalwrapped.c(); -- }); -+ k = wrappedGoalSet.getBackingSet(); -+ wrappedGoalSize = wrappedGoalSet.size(); -+ for (int i = 0; i < wrappedGoalSize; ++i) { -+ PathfinderGoal.Type type = PATHFINDER_GOAL_TYPES[Long.numberOfTrailingZeros(k)]; -+ k ^= -k & k; // Tuinity's ca.spottedleaf.concurrentutil.util.IntegerUtil.getTrailingBit -+ c.getOrDefault(type, EMPTY_GOAL()).d(); // reset goal -+ c.put(type, wrappedGoal); -+ } -+ -+ wrappedGoal.c(); // start goal -+ } -+ co.aikar.timings.MinecraftTimings.goalUpdate.stopTiming(); -+ // Purpur end - this.e.exit(); - this.e.enter("goalTick"); -- this.c().forEach(PathfinderGoalWrapped::e); -+ // Purpur start -+ co.aikar.timings.MinecraftTimings.goalTick.startTiming(); -+ for (PathfinderGoalWrapped wrappedGoal : getTasks()) { -+ if (wrappedGoal.isRunning()) { -+ wrappedGoal.e(); // goal tick -+ } -+ } -+ co.aikar.timings.MinecraftTimings.goalTick.stopTiming(); -+ // Purpur end - this.e.exit(); - } - -@@ -125,11 +159,11 @@ public class PathfinderGoalSelector { - } - - public void a(PathfinderGoal.Type pathfindergoal_type) { -- this.f.add(pathfindergoal_type); -+ this.disabledTypes.addUnchecked(pathfindergoal_type); // Purpur - } - - public void b(PathfinderGoal.Type pathfindergoal_type) { -- this.f.remove(pathfindergoal_type); -+ this.disabledTypes.removeUnchecked(pathfindergoal_type); // Purpur - } - - public void a(PathfinderGoal.Type pathfindergoal_type, boolean flag) { -diff --git a/src/main/java/net/minecraft/server/PathfinderGoalWrapped.java b/src/main/java/net/minecraft/server/PathfinderGoalWrapped.java -index 29657fed7..172e74b96 100644 ---- a/src/main/java/net/minecraft/server/PathfinderGoalWrapped.java -+++ b/src/main/java/net/minecraft/server/PathfinderGoalWrapped.java -@@ -14,6 +14,7 @@ public class PathfinderGoalWrapped extends PathfinderGoal { - this.a = pathfindergoal; - } - -+ public boolean canBeReplacedBy(PathfinderGoalWrapped pathfindergoalwrapped) { return a(pathfindergoalwrapped); } // Purpur - OBFHELPER - public boolean a(PathfinderGoalWrapped pathfindergoalwrapped) { - return this.E_() && pathfindergoalwrapped.h() < this.h(); - } -@@ -59,8 +60,8 @@ public class PathfinderGoalWrapped extends PathfinderGoal { - this.a.a(enumset); - } - -- @Override -- public EnumSet i() { -+ public com.tuinity.tuinity.util.OptimizedSmallEnumSet getTypes() { return i(); } // Purpur - OBFHELPER -+ @Override public com.tuinity.tuinity.util.OptimizedSmallEnumSet i() { // Purpur - return this.a.i(); - } - -@@ -73,6 +74,7 @@ public class PathfinderGoalWrapped extends PathfinderGoal { - return this.b; - } - -+ public PathfinderGoal getGoal() { return j(); } // Purpur - OBFHELPER - public PathfinderGoal j() { - return this.a; - } --- -2.24.0 - diff --git a/patches/server/0109-Optimize-Pathfinding.patch b/patches/server/0109-Optimize-Pathfinding.patch deleted file mode 100644 index d65964269..000000000 --- a/patches/server/0109-Optimize-Pathfinding.patch +++ /dev/null @@ -1,59 +0,0 @@ -From e4c0dca628bd0a486acff7b5f2a396c0ee59510c Mon Sep 17 00:00:00 2001 -From: Aikar -Date: Thu, 3 Mar 2016 02:02:07 -0600 -Subject: [PATCH] Optimize Pathfinding - -Prevents pathfinding from spamming failures for things such as -arrow attacks. ---- - .../minecraft/server/NavigationAbstract.java | 24 +++++++++++++++++-- - 1 file changed, 22 insertions(+), 2 deletions(-) - -diff --git a/src/main/java/net/minecraft/server/NavigationAbstract.java b/src/main/java/net/minecraft/server/NavigationAbstract.java -index f06764973..ac29f8937 100644 ---- a/src/main/java/net/minecraft/server/NavigationAbstract.java -+++ b/src/main/java/net/minecraft/server/NavigationAbstract.java -@@ -11,7 +11,7 @@ public abstract class NavigationAbstract { - protected final EntityInsentient a; public Entity getEntity() { return a; } // Paper - OBFHELPER - protected final World b; - @Nullable -- protected PathEntity c; -+ protected PathEntity c; protected final PathEntity getCurrentPath() { return this.c; } // Purpur - OBFHELPER - protected double d; - private final AttributeInstance p; - protected int e; -@@ -158,10 +158,30 @@ public abstract class NavigationAbstract { - return this.a(this.a(d0, d1, d2, 1), d3); - } - -+ // Purpur start - optimise pathfinding -+ private int lastFailure = 0; -+ private int pathfindFailures = 0; -+ // Purpur end -+ - public boolean a(Entity entity, double d0) { -+ // Purpur start - Pathfinding optimizations -+ if (this.pathfindFailures > 10 && this.getCurrentPath() == null && MinecraftServer.currentTick < this.lastFailure + 40) { -+ return false; -+ } -+ // Purpur end - PathEntity pathentity = this.a(entity, 1); - -- return pathentity != null && this.a(pathentity, d0); -+ // Purpur start - Pathfinding optimizations -+ if (pathentity != null && this.a(pathentity, d0)) { -+ this.lastFailure = 0; -+ this.pathfindFailures = 0; -+ return true; -+ } else { -+ this.pathfindFailures++; -+ this.lastFailure = MinecraftServer.currentTick; -+ return false; -+ } -+ // Purpur end - } - - public boolean setDestination(@Nullable PathEntity pathentity, double speed) { return a(pathentity, speed); } // Paper - OBFHELPER --- -2.24.0 -