From 73f443461b5c9c806cf423e87eccb54fee4b12e1 Mon Sep 17 00:00:00 2001 From: granny Date: Mon, 31 Mar 2025 23:15:31 -0700 Subject: [PATCH] =?UTF-8?q?hardfork=20from=20paper=20=F0=9F=98=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CONTRIBUTING.md | 27 ++-- README.md | 6 +- build.gradle.kts | 20 +-- purpur-api/build.gradle.kts.patch | 36 +---- .../paper-patches/features/0001-Rebrand.patch | 23 ---- .../paper/entity/ai/VanillaGoal.java.patch | 29 ---- .../paper/util/VersionFetcher.java.patch | 15 --- .../defaults/VersionCommand.java.patch | 26 ---- .../features/0002-Purpur-config-files.patch | 2 +- .../timings/TimedEventExecutor.java.patch | 0 .../java/co/aikar/timings/Timing.java.patch | 12 +- .../java/co/aikar/timings/Timings.java.patch | 0 .../aikar/timings/TimingsCommand.java.patch | 0 .../main/java/org/bukkit/Bukkit.java.patch | 0 .../main/java/org/bukkit/ChatColor.java.patch | 0 .../main/java/org/bukkit/Material.java.patch | 3 - .../java/org/bukkit/OfflinePlayer.java.patch | 3 - .../main/java/org/bukkit/Server.java.patch | 3 - .../src/main/java/org/bukkit/World.java.patch | 0 .../block/EntityBlockStorage.java.patch | 0 .../command/SimpleCommandMap.java.patch | 16 +-- .../enchantments/EnchantmentTarget.java.patch | 0 .../org/bukkit/entity/Endermite.java.patch | 1 - .../java/org/bukkit/entity/Entity.java.patch | 3 - .../org/bukkit/entity/IronGolem.java.patch | 0 .../java/org/bukkit/entity/Item.java.patch | 2 - .../org/bukkit/entity/LivingEntity.java.patch | 2 - .../java/org/bukkit/entity/Llama.java.patch | 3 - .../java/org/bukkit/entity/Player.java.patch | 0 .../java/org/bukkit/entity/Snowman.java.patch | 0 .../org/bukkit/entity/Villager.java.patch | 0 .../java/org/bukkit/entity/Wither.java.patch | 0 .../java/org/bukkit/entity/Wolf.java.patch | 0 .../event/entity/EntityDamageEvent.java.patch | 0 .../entity/EntityPotionEffectEvent.java.patch | 0 .../event/inventory/InventoryType.java.patch | 0 .../inventory/AnvilInventory.java.patch | 4 +- .../org/bukkit/inventory/ItemStack.java.patch | 3 - .../bukkit/inventory/RecipeChoice.java.patch | 0 .../inventory/view/AnvilView.java.patch | 4 +- .../org/bukkit/map/MapRenderer.java.patch | 0 .../permissions/PermissibleBase.java.patch | 0 .../plugin/java/JavaPluginLoader.java.patch | 0 .../plugin/java/LibraryLoader.java.patch | 3 - .../permissions/CommandPermissions.java.patch | 0 .../permissions/DefaultPermissions.java.patch | 0 .../spigotmc/CustomTimingsHandler.java.patch | 0 purpur-server/build.gradle.kts.patch | 41 +++--- .../features/0001-Ridables.patch | 28 +--- .../0003-Barrels-and-enderchests-6-rows.patch | 3 - ...-Minecart-settings-and-WASD-controls.patch | 1 - ...urable-void-damage-height-and-damage.patch | 49 ------- .../0009-Implement-elytra-settings.patch | 2 - ...ed-to-crystals-and-crystals-shoot-ph.patch | 3 - .../0012-Phantoms-burn-in-light.patch | 3 - ...e-entity-breeding-times-configurable.patch | 1 - ...mes-from-item-forms-of-entities-to-e.patch | 3 - ...Villager-Clerics-to-farm-Nether-Wart.patch | 1 - ...iefing-bypass-to-everything-affected.patch | 15 +-- ...0017-Add-EntityTeleportHinderedEvent.patch | 10 +- ...oggle-for-water-sensitive-mob-damage.patch | 1 - ...019-API-for-any-mob-to-burn-daylight.patch | 46 ------- .../activation/ActivationRange.java.patch | 19 --- .../net/minecraft/CrashReport.java.patch | 3 +- .../commands/CommandSourceStack.java.patch | 4 +- .../minecraft/commands/Commands.java.patch | 2 - .../net/minecraft/core/BlockPos.java.patch | 2 - .../EquipmentDispenseItemBehavior.java.patch | 1 - .../minecraft/network/Connection.java.patch | 23 ---- .../chat/SignedMessageChain.java.patch | 1 - .../net/minecraft/server/Main.java.patch | 5 +- .../server/MinecraftServer.java.patch | 19 +-- .../server/PlayerAdvancements.java.patch | 8 -- .../dedicated/DedicatedServer.java.patch | 7 - .../server/gui/MinecraftServerGui.java.patch | 3 - .../server/gui/StatsComponent.java.patch | 1 - .../server/level/ServerLevel.java.patch | 13 +- .../server/level/ServerPlayer.java.patch | 13 +- .../server/level/WorldGenRegion.java.patch | 1 - .../ServerCommonPacketListenerImpl.java.patch | 4 - .../ServerGamePacketListenerImpl.java.patch | 19 +-- .../ServerLoginPacketListenerImpl.java.patch | 3 +- .../ServerStatusPacketListenerImpl.java.patch | 2 - .../server/players/PlayerList.java.patch | 7 +- .../net/minecraft/util/StringUtil.java.patch | 1 - .../damagesource/DamageSource.java.patch | 6 +- .../minecraft/world/entity/Entity.java.patch | 13 +- .../world/entity/EntitySelector.java.patch | 2 - .../world/entity/EntityType.java.patch | 1 - .../world/entity/ExperienceOrb.java.patch | 1 - .../world/entity/LivingEntity.java.patch | 4 - .../world/entity/animal/Animal.java.patch | 2 - .../world/entity/animal/Bee.java.patch | 1 - .../world/entity/animal/Fox.java.patch | 2 - .../entity/animal/MushroomCow.java.patch | 1 - .../world/entity/animal/Squid.java.patch | 2 - .../entity/animal/WaterAnimal.java.patch | 3 - .../world/entity/animal/goat/Goat.java.patch | 1 - .../entity/animal/horse/Llama.java.patch | 1 - .../boss/enderdragon/EndCrystal.java.patch | 3 - .../entity/decoration/ArmorStand.java.patch | 4 - .../world/entity/item/ItemEntity.java.patch | 4 - .../world/entity/item/PrimedTnt.java.patch | 2 - .../monster/AbstractSkeleton.java.patch | 1 - .../world/entity/monster/Creeper.java.patch | 2 - .../world/entity/monster/Drowned.java.patch | 2 - .../world/entity/monster/EnderMan.java.patch | 3 - .../world/entity/monster/Ravager.java.patch | 1 - .../world/entity/npc/Villager.java.patch | 4 - .../entity/npc/WanderingTrader.java.patch | 2 - .../world/entity/player/Player.java.patch | 4 - .../projectile/ThrownEnderpearl.java.patch | 2 - .../world/inventory/AnvilMenu.java.patch | 6 +- .../inventory/EnchantmentMenu.java.patch | 1 - .../world/inventory/GrindstoneMenu.java.patch | 2 - .../minecraft/world/item/AxeItem.java.patch | 2 - .../minecraft/world/item/EggItem.java.patch | 2 - .../world/item/EndCrystalItem.java.patch | 1 - .../world/item/EnderpearlItem.java.patch | 2 - .../world/item/NameTagItem.java.patch | 4 +- .../world/item/ShovelItem.java.patch | 4 - .../world/item/SnowballItem.java.patch | 2 - .../world/item/SpawnEggItem.java.patch | 1 - .../world/item/ThrowablePotionItem.java.patch | 2 - .../world/item/TridentItem.java.patch | 6 - .../enchantment/ItemEnchantments.java.patch | 2 - .../item/trading/MerchantOffer.java.patch | 2 - .../world/level/BaseSpawner.java.patch | 1 - .../minecraft/world/level/Level.java.patch | 4 - .../world/level/NaturalSpawner.java.patch | 1 - .../world/level/block/BedBlock.java.patch | 1 - .../world/level/block/Block.java.patch | 9 +- .../world/level/block/CactusBlock.java.patch | 2 - .../level/block/CarvedPumpkinBlock.java.patch | 2 - .../level/block/ComposterBlock.java.patch | 4 - .../world/level/block/CropBlock.java.patch | 3 +- .../world/level/block/FarmBlock.java.patch | 1 - .../world/level/block/IceBlock.java.patch | 1 - .../world/level/block/LiquidBlock.java.patch | 2 - .../world/level/block/SpawnerBlock.java.patch | 9 +- .../level/block/SugarCaneBlock.java.patch | 2 - .../block/entity/BeaconBlockEntity.java.patch | 1 - .../entity/BeehiveBlockEntity.java.patch | 2 - .../level/block/entity/BlockEntity.java.patch | 1 - .../block/entity/SignBlockEntity.java.patch | 11 +- .../storage/RegionFileStorage.java.patch | 3 +- .../level/levelgen/PhantomSpawner.java.patch | 4 - .../level/material/WaterFluid.java.patch | 1 - ...urable-void-damage-height-and-damage.patch | 115 ---------------- .../destroystokyo/paper/Metrics.java.patch | 30 ----- .../paper/PaperVersionFetcher.java.patch | 78 ----------- .../paper/console/PaperConsole.java.patch | 11 -- .../paper/entity/ai/MobGoalHelper.java.patch | 13 -- .../paper/gui/RAMDetails.java.patch | 19 --- .../paper/ServerBuildInfoImpl.java.patch | 31 ----- .../command/PaperPluginsCommand.java.patch | 125 ------------------ .../paper/logging/SysoutCatcher.java.patch | 14 -- .../util/CraftMagicNumbers.java.patch | 11 -- ...MinecraftCommandPermissionsTest.java.patch | 36 ----- .../features/0001-Rebrand.patch | 0 .../features/0002-Ridables.patch | 0 .../0003-Barrels-and-enderchests-6-rows.patch | 0 ...0005-Add-EntityTeleportHinderedEvent.patch | 8 +- ...006-API-for-any-mob-to-burn-daylight.patch | 0 .../craftbukkit/CraftOfflinePlayer.java.patch | 0 .../bukkit/craftbukkit/CraftServer.java.patch | 11 +- .../bukkit/craftbukkit/CraftWorld.java.patch | 0 .../org/bukkit/craftbukkit/Main.java.patch | 2 - .../block/state/CraftBeehive.java.patch | 1 - .../block/state/CraftConduit.java.patch | 0 .../CraftConsoleCommandSender.java.patch | 0 .../entity/CraftEndermite.java.patch | 0 .../craftbukkit/entity/CraftEntity.java.patch | 0 .../entity/CraftHumanEntity.java.patch | 0 .../entity/CraftIronGolem.java.patch | 0 .../craftbukkit/entity/CraftItem.java.patch | 0 .../entity/CraftLivingEntity.java.patch | 0 .../craftbukkit/entity/CraftLlama.java.patch | 4 - .../craftbukkit/entity/CraftPlayer.java.patch | 6 +- .../entity/CraftSnowman.java.patch | 0 .../entity/CraftVillager.java.patch | 4 - .../craftbukkit/entity/CraftWither.java.patch | 4 - .../craftbukkit/entity/CraftWolf.java.patch | 0 .../inventory/CraftInventoryAnvil.java.patch | 0 .../inventory/CraftItemStack.java.patch | 3 - .../inventory/CraftRecipe.java.patch | 3 - .../inventory/view/CraftAnvilView.java.patch | 0 .../craftbukkit/legacy/CraftLegacy.java.patch | 1 - .../legacy/MaterialRerouting.java.patch | 3 - .../map/CraftMapRenderer.java.patch | 0 .../scheduler/CraftScheduler.java.patch | 6 +- .../craftbukkit/util/Versioning.java.patch | 3 +- .../permissions/CommandPermissions.java.patch | 2 +- .../spigotmc/TicksPerSecondCommand.java.patch | 0 .../org/spigotmc/WatchdogThread.java.patch | 17 +-- .../files/src/main/resources/log4j2.xml.patch | 0 .../purpur/util/MinecraftInternalPlugin.java | 11 -- 197 files changed, 108 insertions(+), 1256 deletions(-) delete mode 100644 purpur-api/paper-patches/features/0001-Rebrand.patch delete mode 100644 purpur-api/paper-patches/files/src/generated/java/com/destroystokyo/paper/entity/ai/VanillaGoal.java.patch delete mode 100644 purpur-api/paper-patches/files/src/main/java/com/destroystokyo/paper/util/VersionFetcher.java.patch delete mode 100644 purpur-api/paper-patches/files/src/main/java/org/bukkit/command/defaults/VersionCommand.java.patch rename purpur-api/{paper-patches => spigot-patches}/features/0002-Purpur-config-files.patch (93%) rename purpur-api/{paper-patches => spigot-patches}/files/src/main/java/co/aikar/timings/TimedEventExecutor.java.patch (100%) rename purpur-api/{paper-patches => spigot-patches}/files/src/main/java/co/aikar/timings/Timing.java.patch (64%) rename purpur-api/{paper-patches => spigot-patches}/files/src/main/java/co/aikar/timings/Timings.java.patch (100%) rename purpur-api/{paper-patches => spigot-patches}/files/src/main/java/co/aikar/timings/TimingsCommand.java.patch (100%) rename purpur-api/{paper-patches => spigot-patches}/files/src/main/java/org/bukkit/Bukkit.java.patch (100%) rename purpur-api/{paper-patches => spigot-patches}/files/src/main/java/org/bukkit/ChatColor.java.patch (100%) rename purpur-api/{paper-patches => spigot-patches}/files/src/main/java/org/bukkit/Material.java.patch (92%) rename purpur-api/{paper-patches => spigot-patches}/files/src/main/java/org/bukkit/OfflinePlayer.java.patch (95%) rename purpur-api/{paper-patches => spigot-patches}/files/src/main/java/org/bukkit/Server.java.patch (96%) rename purpur-api/{paper-patches => spigot-patches}/files/src/main/java/org/bukkit/World.java.patch (100%) rename purpur-api/{paper-patches => spigot-patches}/files/src/main/java/org/bukkit/block/EntityBlockStorage.java.patch (100%) rename purpur-api/{paper-patches => spigot-patches}/files/src/main/java/org/bukkit/command/SimpleCommandMap.java.patch (61%) rename purpur-api/{paper-patches => spigot-patches}/files/src/main/java/org/bukkit/enchantments/EnchantmentTarget.java.patch (100%) rename purpur-api/{paper-patches => spigot-patches}/files/src/main/java/org/bukkit/entity/Endermite.java.patch (98%) rename purpur-api/{paper-patches => spigot-patches}/files/src/main/java/org/bukkit/entity/Entity.java.patch (90%) rename purpur-api/{paper-patches => spigot-patches}/files/src/main/java/org/bukkit/entity/IronGolem.java.patch (100%) rename purpur-api/{paper-patches => spigot-patches}/files/src/main/java/org/bukkit/entity/Item.java.patch (96%) rename purpur-api/{paper-patches => spigot-patches}/files/src/main/java/org/bukkit/entity/LivingEntity.java.patch (83%) rename purpur-api/{paper-patches => spigot-patches}/files/src/main/java/org/bukkit/entity/Llama.java.patch (86%) rename purpur-api/{paper-patches => spigot-patches}/files/src/main/java/org/bukkit/entity/Player.java.patch (100%) rename purpur-api/{paper-patches => spigot-patches}/files/src/main/java/org/bukkit/entity/Snowman.java.patch (100%) rename purpur-api/{paper-patches => spigot-patches}/files/src/main/java/org/bukkit/entity/Villager.java.patch (100%) rename purpur-api/{paper-patches => spigot-patches}/files/src/main/java/org/bukkit/entity/Wither.java.patch (100%) rename purpur-api/{paper-patches => spigot-patches}/files/src/main/java/org/bukkit/entity/Wolf.java.patch (100%) rename purpur-api/{paper-patches => spigot-patches}/files/src/main/java/org/bukkit/event/entity/EntityDamageEvent.java.patch (100%) rename purpur-api/{paper-patches => spigot-patches}/files/src/main/java/org/bukkit/event/entity/EntityPotionEffectEvent.java.patch (100%) rename purpur-api/{paper-patches => spigot-patches}/files/src/main/java/org/bukkit/event/inventory/InventoryType.java.patch (100%) rename purpur-api/{paper-patches => spigot-patches}/files/src/main/java/org/bukkit/inventory/AnvilInventory.java.patch (96%) rename purpur-api/{paper-patches => spigot-patches}/files/src/main/java/org/bukkit/inventory/ItemStack.java.patch (99%) rename purpur-api/{paper-patches => spigot-patches}/files/src/main/java/org/bukkit/inventory/RecipeChoice.java.patch (100%) rename purpur-api/{paper-patches => spigot-patches}/files/src/main/java/org/bukkit/inventory/view/AnvilView.java.patch (88%) rename purpur-api/{paper-patches => spigot-patches}/files/src/main/java/org/bukkit/map/MapRenderer.java.patch (100%) rename purpur-api/{paper-patches => spigot-patches}/files/src/main/java/org/bukkit/permissions/PermissibleBase.java.patch (100%) rename purpur-api/{paper-patches => spigot-patches}/files/src/main/java/org/bukkit/plugin/java/JavaPluginLoader.java.patch (100%) rename purpur-api/{paper-patches => spigot-patches}/files/src/main/java/org/bukkit/plugin/java/LibraryLoader.java.patch (77%) rename purpur-api/{paper-patches => spigot-patches}/files/src/main/java/org/bukkit/util/permissions/CommandPermissions.java.patch (100%) rename purpur-api/{paper-patches => spigot-patches}/files/src/main/java/org/bukkit/util/permissions/DefaultPermissions.java.patch (100%) rename purpur-api/{paper-patches => spigot-patches}/files/src/main/java/org/spigotmc/CustomTimingsHandler.java.patch (100%) delete mode 100644 purpur-server/minecraft-patches/features/0008-Configurable-void-damage-height-and-damage.patch delete mode 100644 purpur-server/minecraft-patches/sources/io/papermc/paper/entity/activation/ActivationRange.java.patch delete mode 100644 purpur-server/minecraft-patches/sources/net/minecraft/network/Connection.java.patch delete mode 100644 purpur-server/paper-patches/features/0004-Configurable-void-damage-height-and-damage.patch delete mode 100644 purpur-server/paper-patches/files/src/main/java/com/destroystokyo/paper/Metrics.java.patch delete mode 100644 purpur-server/paper-patches/files/src/main/java/com/destroystokyo/paper/PaperVersionFetcher.java.patch delete mode 100644 purpur-server/paper-patches/files/src/main/java/com/destroystokyo/paper/console/PaperConsole.java.patch delete mode 100644 purpur-server/paper-patches/files/src/main/java/com/destroystokyo/paper/entity/ai/MobGoalHelper.java.patch delete mode 100644 purpur-server/paper-patches/files/src/main/java/com/destroystokyo/paper/gui/RAMDetails.java.patch delete mode 100644 purpur-server/paper-patches/files/src/main/java/io/papermc/paper/ServerBuildInfoImpl.java.patch delete mode 100644 purpur-server/paper-patches/files/src/main/java/io/papermc/paper/command/PaperPluginsCommand.java.patch delete mode 100644 purpur-server/paper-patches/files/src/main/java/io/papermc/paper/logging/SysoutCatcher.java.patch delete mode 100644 purpur-server/paper-patches/files/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java.patch delete mode 100644 purpur-server/paper-patches/files/src/test/java/io/papermc/paper/permissions/MinecraftCommandPermissionsTest.java.patch rename purpur-server/{paper-patches => spigot-patches}/features/0001-Rebrand.patch (100%) rename purpur-server/{paper-patches => spigot-patches}/features/0002-Ridables.patch (100%) rename purpur-server/{paper-patches => spigot-patches}/features/0003-Barrels-and-enderchests-6-rows.patch (100%) rename purpur-server/{paper-patches => spigot-patches}/features/0005-Add-EntityTeleportHinderedEvent.patch (77%) rename purpur-server/{paper-patches => spigot-patches}/features/0006-API-for-any-mob-to-burn-daylight.patch (100%) rename purpur-server/{paper-patches => spigot-patches}/files/src/main/java/org/bukkit/craftbukkit/CraftOfflinePlayer.java.patch (100%) rename purpur-server/{paper-patches => spigot-patches}/files/src/main/java/org/bukkit/craftbukkit/CraftServer.java.patch (85%) rename purpur-server/{paper-patches => spigot-patches}/files/src/main/java/org/bukkit/craftbukkit/CraftWorld.java.patch (100%) rename purpur-server/{paper-patches => spigot-patches}/files/src/main/java/org/bukkit/craftbukkit/Main.java.patch (80%) rename purpur-server/{paper-patches => spigot-patches}/files/src/main/java/org/bukkit/craftbukkit/block/state/CraftBeehive.java.patch (99%) rename purpur-server/{paper-patches => spigot-patches}/files/src/main/java/org/bukkit/craftbukkit/block/state/CraftConduit.java.patch (100%) rename purpur-server/{paper-patches => spigot-patches}/files/src/main/java/org/bukkit/craftbukkit/command/CraftConsoleCommandSender.java.patch (100%) rename purpur-server/{paper-patches => spigot-patches}/files/src/main/java/org/bukkit/craftbukkit/entity/CraftEndermite.java.patch (100%) rename purpur-server/{paper-patches => spigot-patches}/files/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java.patch (100%) rename purpur-server/{paper-patches => spigot-patches}/files/src/main/java/org/bukkit/craftbukkit/entity/CraftHumanEntity.java.patch (100%) rename purpur-server/{paper-patches => spigot-patches}/files/src/main/java/org/bukkit/craftbukkit/entity/CraftIronGolem.java.patch (100%) rename purpur-server/{paper-patches => spigot-patches}/files/src/main/java/org/bukkit/craftbukkit/entity/CraftItem.java.patch (100%) rename purpur-server/{paper-patches => spigot-patches}/files/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java.patch (100%) rename purpur-server/{paper-patches => spigot-patches}/files/src/main/java/org/bukkit/craftbukkit/entity/CraftLlama.java.patch (72%) rename purpur-server/{paper-patches => spigot-patches}/files/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java.patch (89%) rename purpur-server/{paper-patches => spigot-patches}/files/src/main/java/org/bukkit/craftbukkit/entity/CraftSnowman.java.patch (100%) rename purpur-server/{paper-patches => spigot-patches}/files/src/main/java/org/bukkit/craftbukkit/entity/CraftVillager.java.patch (76%) rename purpur-server/{paper-patches => spigot-patches}/files/src/main/java/org/bukkit/craftbukkit/entity/CraftWither.java.patch (81%) rename purpur-server/{paper-patches => spigot-patches}/files/src/main/java/org/bukkit/craftbukkit/entity/CraftWolf.java.patch (100%) rename purpur-server/{paper-patches => spigot-patches}/files/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventoryAnvil.java.patch (100%) rename purpur-server/{paper-patches => spigot-patches}/files/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemStack.java.patch (99%) rename purpur-server/{paper-patches => spigot-patches}/files/src/main/java/org/bukkit/craftbukkit/inventory/CraftRecipe.java.patch (67%) rename purpur-server/{paper-patches => spigot-patches}/files/src/main/java/org/bukkit/craftbukkit/inventory/view/CraftAnvilView.java.patch (100%) rename purpur-server/{paper-patches => spigot-patches}/files/src/main/java/org/bukkit/craftbukkit/legacy/CraftLegacy.java.patch (71%) rename purpur-server/{paper-patches => spigot-patches}/files/src/main/java/org/bukkit/craftbukkit/legacy/MaterialRerouting.java.patch (95%) rename purpur-server/{paper-patches => spigot-patches}/files/src/main/java/org/bukkit/craftbukkit/map/CraftMapRenderer.java.patch (100%) rename purpur-server/{paper-patches => spigot-patches}/files/src/main/java/org/bukkit/craftbukkit/scheduler/CraftScheduler.java.patch (67%) rename purpur-server/{paper-patches => spigot-patches}/files/src/main/java/org/bukkit/craftbukkit/util/Versioning.java.patch (60%) rename purpur-server/{paper-patches => spigot-patches}/files/src/main/java/org/bukkit/craftbukkit/util/permissions/CommandPermissions.java.patch (89%) rename purpur-server/{paper-patches => spigot-patches}/files/src/main/java/org/spigotmc/TicksPerSecondCommand.java.patch (100%) rename purpur-server/{paper-patches => spigot-patches}/files/src/main/java/org/spigotmc/WatchdogThread.java.patch (72%) rename purpur-server/{paper-patches => spigot-patches}/files/src/main/resources/log4j2.xml.patch (100%) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index a64260d7b..47877b940 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -45,25 +45,16 @@ javac 21.0.5 ## Understanding Patches -Unlike the Purpur API and its implementation, modifications to Paper and Minecraft source files +Unlike the Purpur API and its implementation, modifications to the Minecraft source files are done through patches. These patches/extensions are split into three different sets of two categories, which are formatted like so: -Under `purpur-api`: - -- `paper-patches` (applies to the `paper-server/` git repo) - - `sources`: Per-file patches to Paper API classes; - - `features`: Larger feature patches that modify multiple Paper API classes. - Under `purpur-server`: - `minecraft-patches` (applies to the `purpur-server//` git repo) - `sources`: Per-file patches to Minecraft classes; - `resources`: Per-file patches to Minecraft data files; - `features`: Larger feature patches that modify multiple classes. -- `paper-patches` - - `sources`: Per-file patches to Paper Server classes; - - `features`: Larger feature patches that modify multiple Paper Server classes. Because this entire structure is based on patches and git, a basic understanding of how to use git is required. A basic tutorial can be found here: @@ -72,16 +63,14 @@ of how to use git is required. A basic tutorial can be found here: Assuming you have already forked the repository: 1. Clone your fork to your local machine; -2. Type `./gradlew applyAllPatches` in a terminal to apply the patches to both paper and minecraft classes. +2. Type `./gradlew applyPatches` in a terminal to apply the patches to minecraft classes. On Windows, remove `./` from the beginning of `gradlew` commands; -3. cd into `purpur-server` for server changes, `purpur-api` for API changes, - `paper-api` for Paper API changes, and `paper-server` for Paper Server changes. +3. cd into `purpur-server` for server changes, `purpur-api` for API changes. `purpur-server/src/minecraft/java` and `purpur-server/src/minecraft/java/resources` are not git repositories in the traditional sense. Its initial commits are the decompiled and deobfuscated Minecraft source and resource files. The per-file patches are applied on top of these files as a single, large commit, which is then followed -by the individual feature-patch commits. `paper-api/` and `paper-server/` -follow the same concept; each paper "project" has its own git repository that also includes it's own feature and per-file patches. +by the individual feature-patch commits. ## Understanding the Gradle Tasks @@ -98,12 +87,12 @@ Each "project" that includes a local git repository has the following available Some additional useful tasks are listed below: -- `./gradlew applyAllPatches` - Applies all patches defined in the paperweight-patcher project and the server project. (equivalent to running `applyPaperPatches` and then `applyAllServerPatches` in a second Gradle invocation) +- `./gradlew applyAllPatches` - Applies all patches defined in the paperweight-patcher project and the server project. (equivalent to running `applyPatches` and then `applyAllServerPatches` in a second Gradle invocation) - `./gradlew applyAllServerFeaturePatches` - Applies all Minecraft and upstream server feature patches (equivalent to `applyMinecraftFeaturePatches applyServerFeaturePatches`) - `./gradlew applyAllServerFilePatches` - Applies all Minecraft and upstream server file patches (equivalent to `applyMinecraftFilePatches applyServerFilePatches`) - `./gradlew applyAllServerPatches` - Applies all Minecraft and upstream server patches (equivalent to `applyMinecraftPatches applyServerPatches`) -- `./gradlew rebuildPaperSingleFilePatches` - Fixups and rebuilds all paper single-file patches. This is how you'd make changes to the `build.gradle.kts` files located under `purpur-api` and `purpur-server` +- `./gradlew rebuildSingleFilePatches` - Fixups and rebuilds all single-file patches. This is how you'd make changes to the `build.gradle.kts` files located under `purpur-api` and `purpur-server` ## Modifying (per-file) patches @@ -229,7 +218,7 @@ when making and submitting changes. ## Formatting -All modifications to Minecraft files and Paper files should be marked. For historical reasons, +All modifications to Minecraft files should be marked. For historical reasons, API and API-implementation contain a lot of these too, but they are no longer required. @@ -273,7 +262,7 @@ into most IDEs and formatters by default. There are a few notes, however: hard to parse generics in a case where the base type itself is already obvious. ### Imports -When adding new imports to a Minecraft or Paper class, use the fully qualified class name +When adding new imports to a Minecraft class, use the fully qualified class name instead of adding a new import to the top of the file. If you are using a type a significant number of times, you can add an import with a comment. However, if it's only used a couple of times, the FQN is preferred to prevent future patch conflicts in the import section of the file. diff --git a/README.md b/README.md index 75cf3f07f..1a8bf09a0 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ [![Forks](https://img.shields.io/github/forks/PurpurMC/Purpur?label=forks&logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABhWlDQ1BJQ0MgcHJvZmlsZQAAKJF9kT1Iw0AcxV9bxSIVh1YQcYhQnSyIiuimVShChVArtOpgcukXNGlIUlwcBdeCgx+LVQcXZ10dXAVB8APE0clJ0UVK/F9SaBHjwXE/3t173L0D/PUyU82OMUDVLCOViAuZ7KrQ9YogwujDEGYkZupzopiE5/i6h4+vdzGe5X3uz9Gj5EwG+ATiWaYbFvEG8dSmpXPeJ46woqQQnxOPGnRB4keuyy6/cS447OeZESOdmieOEAuFNpbbmBUNlXiSOKqoGuX7My4rnLc4q+Uqa96TvzCU01aWuU5zEAksYgkiBMioooQyLMRo1UgxkaL9uId/wPGL5JLJVQIjxwIqUCE5fvA/+N2tmZ8Yd5NCcaDzxbY/hoGuXaBRs+3vY9tunACBZ+BKa/krdWD6k/RaS4seAb3bwMV1S5P3gMsdoP9JlwzJkQI0/fk88H5G35QFwrdA95rbW3Mfpw9AmrpK3gAHh8BIgbLXPd4dbO/t3zPN/n4Ax9dyyerighsAAAAGYktHRAAAAAAAAPlDu38AAAAJcEhZcwAADdcAAA3XAUIom3gAAAAHdElNRQfmCBMVNCYN3/YeAAAA/UlEQVQ4y7WTQUoDQRBFf01czlJcxUyOINGjjAvFHMFzZGdygOwDwTtk6UZcqLlAxCAuMigug89FamIzdAIN+qGhq/6v6qrqbumvAJwBj8AHMAQs4DJgBHy65jSW4Bl4AaZsUAbcufumrnmquSzIcSzpTtLA7XbA1fuBa9qxCob8YgUUAdcFqoC/iSXIgLELOhG+49w4nM+2BTP7ljR3M4/MufbNzYxdN1E0Sm2ialZnsVIllZKOJF24eyLpXdKtmS1S3sYMmO3THOwJziUdbrbkZvaVcnILeAh6vweylAQ9D7z2BXCS0sJS0lrSpdtrSW+pn6sPLIFX4Er/hR9C0wl1FTBzNwAAAABJRU5ErkJggg==)](https://github.com/PurpurMC/Purpur/network/members) [![Watchers](https://img.shields.io/github/watchers/PurpurMC/Purpur?label=watchers&logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABhWlDQ1BJQ0MgcHJvZmlsZQAAKJF9kT1Iw0AcxV9bxSIVh1YQcYhQnSyIiuimVShChVArtOpgcukXNGlIUlwcBdeCgx+LVQcXZ10dXAVB8APE0clJ0UVK/F9SaBHjwXE/3t173L0D/PUyU82OMUDVLCOViAuZ7KrQ9YogwujDEGYkZupzopiE5/i6h4+vdzGe5X3uz9Gj5EwG+ATiWaYbFvEG8dSmpXPeJ46woqQQnxOPGnRB4keuyy6/cS447OeZESOdmieOEAuFNpbbmBUNlXiSOKqoGuX7My4rnLc4q+Uqa96TvzCU01aWuU5zEAksYgkiBMioooQyLMRo1UgxkaL9uId/wPGL5JLJVQIjxwIqUCE5fvA/+N2tmZ8Yd5NCcaDzxbY/hoGuXaBRs+3vY9tunACBZ+BKa/krdWD6k/RaS4seAb3bwMV1S5P3gMsdoP9JlwzJkQI0/fk88H5G35QFwrdA95rbW3Mfpw9AmrpK3gAHh8BIgbLXPd4dbO/t3zPN/n4Ax9dyyerighsAAAAGYktHRAAAAAAAAPlDu38AAAAJcEhZcwAADdcAAA3XAUIom3gAAAAHdElNRQfmCBMVNw4TRw0nAAAA3UlEQVQ4y83SP04CURAG8I0lewHOwAFUaiwkdmAlp8CL4FHopfIvtOIJWE3opIBK489mQPKy6xYWOskkL9/MN/PNzMuyf2fIcYkZVuGzwPI68gle8Yl7jMIfAntBp4o8wAeecFgSP8I8cgZp8DwC12j8oLCBCd7R34ItbHCzT8ZZSC7QTYrcYo1WhjGWaCbdCt+2SGLN4IwPfnu07QjrkhG6oWKB0+TMd7sRAuzHYuqWmO8tsVd1xjmOS8htPEfORVWHTmweHnEVPg2sqPxIicxhFFjhLd7D2q/8J/YFHSJt9VSqQ08AAAAASUVORK5CYII=)](https://github.com/PurpurMC/Purpur/watchers) -Purpur is a drop-in replacement for [Paper](https://github.com/PaperMC/Paper) servers designed for configurability, new fun and exciting gameplay features, and performance built on top of [Paper](https://github.com/PaperMC/Paper/). +Purpur is a drop-in replacement for [Spigot](https://github.com/SpigotMC/Spigot) servers designed for configurability, new fun and exciting gameplay features, and performance built on top of [Spigot](https://github.com/SpigotMC/Spigot). @@ -44,7 +44,7 @@ All patches are licensed under the MIT license, unless otherwise noted in the pa [![MIT License](https://img.shields.io/github/license/PurpurMC/Purpur?&logo=github)](LICENSE) -See [PaperMC/Paper](https://github.com/PaperMC/Paper), and [PaperMC/Paperweight](https://github.com/PaperMC/paperweight) for the license of material used by this project. +See [SpigotMC/Spigot](https://github.com/SpigotMC/Spigot), and [PaperMC/Paperweight](https://github.com/PaperMC/paperweight) for the license of material used by this project. ## bStats @@ -84,7 +84,7 @@ dependencies { } ``` -Yes, this also includes all API provided by Paper, Spigot, and Bukkit. +Yes, this also includes all API provided by Spigot and Bukkit. ## Building and setting up diff --git a/build.gradle.kts b/build.gradle.kts index 63881e1bc..893d6218b 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -6,27 +6,27 @@ plugins { id("io.papermc.paperweight.patcher") version "2.0.0-beta.16" } -val paperMavenPublicUrl = "https://repo.papermc.io/repository/maven-public/" +val spigotMavenPublicUrl = "https://hub.spigotmc.org/nexus/content/repositories/snapshots/" paperweight { - upstreams.paper { - ref = providers.gradleProperty("paperCommit") + upstreams.spigot { + ref = providers.gradleProperty("spigotCommit") patchFile { - path = "paper-server/build.gradle.kts" + path = "spigot-server/build.gradle.kts" outputFile = file("purpur-server/build.gradle.kts") patchFile = file("purpur-server/build.gradle.kts.patch") } patchFile { - path = "paper-api/build.gradle.kts" + path = "spigot-api/build.gradle.kts" outputFile = file("purpur-api/build.gradle.kts") patchFile = file("purpur-api/build.gradle.kts.patch") } - patchDir("paperApi") { - upstreamPath = "paper-api" + patchDir("spigotApi") { + upstreamPath = "spigot-api" excludes = setOf("build.gradle.kts") - patchesDir = file("purpur-api/paper-patches") - outputDir = file("paper-api") + patchesDir = file("purpur-api/spigot-patches") + outputDir = file("spigot-api") } } } @@ -66,7 +66,7 @@ subprojects { repositories { mavenCentral() - maven(paperMavenPublicUrl) + maven(spigotMavenPublicUrl) maven("https://jitpack.io") } diff --git a/purpur-api/build.gradle.kts.patch b/purpur-api/build.gradle.kts.patch index d09f1f271..4e7500ebf 100644 --- a/purpur-api/build.gradle.kts.patch +++ b/purpur-api/build.gradle.kts.patch @@ -1,42 +1,18 @@ ---- a/paper-api/build.gradle.kts -+++ b/paper-api/build.gradle.kts +--- a/spigot-api/build.gradle.kts ++++ b/spigot-api/build.gradle.kts @@ -93,7 +_,7 @@ testRuntimeOnly("org.junit.platform:junit-platform-launcher") } --val generatedDir: java.nio.file.Path = layout.projectDirectory.dir("src/generated/java").asFile.toPath() -+val generatedDir: java.nio.file.Path = rootProject.layout.projectDirectory.dir("paper-api/src/generated/java").asFile.toPath() - idea { - module { - generatedSourceDirs.add(generatedDir.toFile()) -@@ -103,6 +_,18 @@ - main { - java { - srcDir(generatedDir) -+ srcDir(file("../paper-api/src/main/java")) -+ } -+ resources { -+ srcDir(file("../paper-api/src/main/resources")) -+ } -+ } -+ test { -+ java { -+ srcDir(file("../paper-api/src/test/java")) -+ } -+ resources { -+ srcDir(file("../paper-api/src/test/resources")) - } - } - } @@ -168,8 +_,10 @@ val services = objects.newInstance() tasks.withType { + //(options as StandardJavadocDocletOptions).addStringOption("-add-modules", "jdk.incubator.vector") // Purpur - our javadocs need this for pufferfish's SIMD patch -+ (options as StandardJavadocDocletOptions).addStringOption("Xdoclint:none", "-quiet") // Purpur - silence Paper's bajillion javadoc warnings ++ (options as StandardJavadocDocletOptions).addStringOption("Xdoclint:none", "-quiet") // Purpur - silence Spigot's bajillion javadoc warnings val options = options as StandardJavadocDocletOptions - options.overview = "src/main/javadoc/overview.html" -+ options.overview = "../paper-api/src/main/javadoc/overview.html" ++ options.overview = "../spigot-api/src/main/javadoc/overview.html" options.use() options.isDocFilesSubDirs = true options.links( @@ -45,12 +21,12 @@ // workaround for https://github.com/gradle/gradle/issues/4046 - inputs.dir("src/main/javadoc").withPropertyName("javadoc-sourceset") -+ inputs.dir("../paper-api/src/main/javadoc").withPropertyName("javadoc-sourceset") ++ inputs.dir("../spigot-api/src/main/javadoc").withPropertyName("javadoc-sourceset") val fsOps = services.fileSystemOperations doLast { fsOps.copy { - from("src/main/javadoc") { -+ from("../paper-api/src/main/javadoc") { ++ from("../spigot-api/src/main/javadoc") { include("**/doc-files/**") } into("build/docs/javadoc") diff --git a/purpur-api/paper-patches/features/0001-Rebrand.patch b/purpur-api/paper-patches/features/0001-Rebrand.patch deleted file mode 100644 index 9153a5d0c..000000000 --- a/purpur-api/paper-patches/features/0001-Rebrand.patch +++ /dev/null @@ -1,23 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: granny -Date: Thu, 16 May 2024 19:11:29 -0700 -Subject: [PATCH] Rebrand - - -diff --git a/src/main/java/io/papermc/paper/ServerBuildInfo.java b/src/main/java/io/papermc/paper/ServerBuildInfo.java -index 652ff54e7c50412503725d628bfe72ed03059790..fb1fe2651e53a9bf46b3632c638e13eea9dcda93 100644 ---- a/src/main/java/io/papermc/paper/ServerBuildInfo.java -+++ b/src/main/java/io/papermc/paper/ServerBuildInfo.java -@@ -19,6 +19,12 @@ public interface ServerBuildInfo { - */ - Key BRAND_PAPER_ID = Key.key("papermc", "paper"); - -+ // Purpur start -+ /** -+ * The brand id for Purpur. -+ */ -+ Key BRAND_PURPUR_ID = Key.key("purpurmc", "purpur"); -+ // Purpur end - /** - * Gets the {@code ServerBuildInfo}. - * diff --git a/purpur-api/paper-patches/files/src/generated/java/com/destroystokyo/paper/entity/ai/VanillaGoal.java.patch b/purpur-api/paper-patches/files/src/generated/java/com/destroystokyo/paper/entity/ai/VanillaGoal.java.patch deleted file mode 100644 index b21f25fa2..000000000 --- a/purpur-api/paper-patches/files/src/generated/java/com/destroystokyo/paper/entity/ai/VanillaGoal.java.patch +++ /dev/null @@ -1,29 +0,0 @@ ---- a/src/generated/java/com/destroystokyo/paper/entity/ai/VanillaGoal.java -+++ b/src/generated/java/com/destroystokyo/paper/entity/ai/VanillaGoal.java -@@ -441,6 +_,26 @@ - - GoalKey ZOMBIE_ATTACK_TURTLE_EGG = create("zombie_attack_turtle_egg", Zombie.class); - -+ // Purpur start - Ridables -+ GoalKey MOB_HAS_RIDER = GoalKey.of(Mob.class, NamespacedKey.minecraft("has_rider")); -+ GoalKey HORSE_HAS_RIDER = GoalKey.of(AbstractHorse.class, NamespacedKey.minecraft("horse_has_rider")); -+ GoalKey LLAMA_HAS_RIDER = GoalKey.of(Llama.class, NamespacedKey.minecraft("llama_has_rider")); -+ // Purpur end - Ridables -+ // Purpur start - Phantoms attracted to crystals and crystals shoot phantoms -+ GoalKey FIND_CRYSTAL = GoalKey.of(Phantom.class, NamespacedKey.minecraft("find_crystal")); -+ GoalKey ORBIT_CRYSTAL = GoalKey.of(Phantom.class, NamespacedKey.minecraft("orbit_crystal")); -+ // Purpur end - Phantoms attracted to crystals and crystals shoot phantoms -+ // Purpur start - Add option to disable zombie aggressiveness towards villagers when lagging -+ GoalKey DROWNED_ATTACK_VILLAGER = GoalKey.of(Drowned.class, NamespacedKey.minecraft("drowned_attack_villager")); -+ GoalKey ZOMBIE_ATTACK_VILLAGER = GoalKey.of(Zombie.class, NamespacedKey.minecraft("zombie_attack_villager")); -+ // Purpur end - Add option to disable zombie aggressiveness towards villagers when lagging -+ // Purpur start - Configurable chance for wolves to spawn rabid -+ GoalKey AVOID_RABID_WOLF = GoalKey.of(Wolf.class, NamespacedKey.minecraft("avoid_rabid_wolf")); -+ // Purpur end - Configurable chance for wolves to spawn rabid -+ // Purpur start - Iron golem poppy calms anger -+ GoalKey RECEIVE_FLOWER = GoalKey.of(IronGolem.class, NamespacedKey.minecraft("receive_flower")); -+ // Purpur end - Iron golem poppy calms anger -+ - private static GoalKey create(final String key, final Class type) { - return GoalKey.of(type, NamespacedKey.minecraft(key)); - } diff --git a/purpur-api/paper-patches/files/src/main/java/com/destroystokyo/paper/util/VersionFetcher.java.patch b/purpur-api/paper-patches/files/src/main/java/com/destroystokyo/paper/util/VersionFetcher.java.patch deleted file mode 100644 index 4264eea11..000000000 --- a/purpur-api/paper-patches/files/src/main/java/com/destroystokyo/paper/util/VersionFetcher.java.patch +++ /dev/null @@ -1,15 +0,0 @@ ---- a/src/main/java/com/destroystokyo/paper/util/VersionFetcher.java -+++ b/src/main/java/com/destroystokyo/paper/util/VersionFetcher.java -@@ -28,6 +_,12 @@ - */ - Component getVersionMessage(String serverVersion); - -+ // Purpur start -+ default int distance() { -+ return 0; -+ } -+ // Purpur end -+ - @ApiStatus.Internal - class DummyVersionFetcher implements VersionFetcher { - diff --git a/purpur-api/paper-patches/files/src/main/java/org/bukkit/command/defaults/VersionCommand.java.patch b/purpur-api/paper-patches/files/src/main/java/org/bukkit/command/defaults/VersionCommand.java.patch deleted file mode 100644 index b781c954e..000000000 --- a/purpur-api/paper-patches/files/src/main/java/org/bukkit/command/defaults/VersionCommand.java.patch +++ /dev/null @@ -1,26 +0,0 @@ ---- a/src/main/java/org/bukkit/command/defaults/VersionCommand.java -+++ b/src/main/java/org/bukkit/command/defaults/VersionCommand.java -@@ -213,7 +_,7 @@ - String version = Bukkit.getVersion(); - // Paper start - if (version.startsWith("null")) { // running from ide? -- setVersionMessage(Component.text("Unknown version, custom build?", NamedTextColor.YELLOW)); -+ setVersionMessage(Component.text("* Unknown version, custom build?", NamedTextColor.RED)); // Purpur - return; - } - setVersionMessage(getVersionFetcher().getVersionMessage(version)); -@@ -254,9 +_,11 @@ - // Paper start - private void setVersionMessage(final @NotNull Component msg) { - lastCheck = System.currentTimeMillis(); -- final Component message = Component.textOfChildren( -- Component.text(Bukkit.getVersionMessage(), NamedTextColor.WHITE), -- Component.newline(), -+ // Purpur start -+ int distance = getVersionFetcher().distance(); -+ final Component message = Component.join(net.kyori.adventure.text.JoinConfiguration.separator(Component.newline()), -+ ChatColor.parseMM("Current Purpur Version: %s%s*", distance == 0 ? "" : distance > 0 ? "" : "", Bukkit.getVersion()), -+ // Purpur end - msg - ); - this.versionMessage = Component.text() diff --git a/purpur-api/paper-patches/features/0002-Purpur-config-files.patch b/purpur-api/spigot-patches/features/0002-Purpur-config-files.patch similarity index 93% rename from purpur-api/paper-patches/features/0002-Purpur-config-files.patch rename to purpur-api/spigot-patches/features/0002-Purpur-config-files.patch index eb88bb178..3753908d4 100644 --- a/purpur-api/paper-patches/features/0002-Purpur-config-files.patch +++ b/purpur-api/spigot-patches/features/0002-Purpur-config-files.patch @@ -9,8 +9,8 @@ index 53ad1696d02afbebf27663dd753fa93e41cfeb4e..cec387842895d617b0dcf9158f080fe0 --- a/src/main/java/org/bukkit/Server.java +++ b/src/main/java/org/bukkit/Server.java @@ -2369,6 +2369,18 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi + throw new UnsupportedOperationException("Not supported yet."); } - // Paper end + // Purpur start + @NotNull diff --git a/purpur-api/paper-patches/files/src/main/java/co/aikar/timings/TimedEventExecutor.java.patch b/purpur-api/spigot-patches/files/src/main/java/co/aikar/timings/TimedEventExecutor.java.patch similarity index 100% rename from purpur-api/paper-patches/files/src/main/java/co/aikar/timings/TimedEventExecutor.java.patch rename to purpur-api/spigot-patches/files/src/main/java/co/aikar/timings/TimedEventExecutor.java.patch diff --git a/purpur-api/paper-patches/files/src/main/java/co/aikar/timings/Timing.java.patch b/purpur-api/spigot-patches/files/src/main/java/co/aikar/timings/Timing.java.patch similarity index 64% rename from purpur-api/paper-patches/files/src/main/java/co/aikar/timings/Timing.java.patch rename to purpur-api/spigot-patches/files/src/main/java/co/aikar/timings/Timing.java.patch index d971ba0c2..56a035cd9 100644 --- a/purpur-api/paper-patches/files/src/main/java/co/aikar/timings/Timing.java.patch +++ b/purpur-api/spigot-patches/files/src/main/java/co/aikar/timings/Timing.java.patch @@ -4,7 +4,7 @@ * @return Timing */ @NotNull -+ @io.papermc.paper.annotation.DoNotUse // Purpur - Remove Timings ++ @org.purpurmc.purpur.annotation.DoNotUse // Purpur - Remove Timings Timing startTiming(); /** @@ -12,7 +12,7 @@ * * Will automatically be called when this Timing is used with try-with-resources */ -+ @io.papermc.paper.annotation.DoNotUse // Purpur - Remove Timings ++ @org.purpurmc.purpur.annotation.DoNotUse // Purpur - Remove Timings void stopTiming(); /** @@ -20,7 +20,7 @@ * @return Timing */ @NotNull -+ @io.papermc.paper.annotation.DoNotUse // Purpur - Remove Timings ++ @org.purpurmc.purpur.annotation.DoNotUse // Purpur - Remove Timings Timing startTimingIfSync(); /** @@ -28,14 +28,14 @@ * * But only if we are on the primary thread. */ -+ @io.papermc.paper.annotation.DoNotUse // Purpur - Remove Timings ++ @org.purpurmc.purpur.annotation.DoNotUse // Purpur - Remove Timings void stopTimingIfSync(); /** * @deprecated Doesn't do anything - Removed */ @Deprecated -+ @io.papermc.paper.annotation.DoNotUse // Purpur - Remove Timings ++ @org.purpurmc.purpur.annotation.DoNotUse // Purpur - Remove Timings void abort(); /** @@ -43,6 +43,6 @@ TimingHandler getTimingHandler(); @Override -+ @io.papermc.paper.annotation.DoNotUse // Purpur - Remove Timings ++ @org.purpurmc.purpur.annotation.DoNotUse // Purpur - Remove Timings void close(); } diff --git a/purpur-api/paper-patches/files/src/main/java/co/aikar/timings/Timings.java.patch b/purpur-api/spigot-patches/files/src/main/java/co/aikar/timings/Timings.java.patch similarity index 100% rename from purpur-api/paper-patches/files/src/main/java/co/aikar/timings/Timings.java.patch rename to purpur-api/spigot-patches/files/src/main/java/co/aikar/timings/Timings.java.patch diff --git a/purpur-api/paper-patches/files/src/main/java/co/aikar/timings/TimingsCommand.java.patch b/purpur-api/spigot-patches/files/src/main/java/co/aikar/timings/TimingsCommand.java.patch similarity index 100% rename from purpur-api/paper-patches/files/src/main/java/co/aikar/timings/TimingsCommand.java.patch rename to purpur-api/spigot-patches/files/src/main/java/co/aikar/timings/TimingsCommand.java.patch diff --git a/purpur-api/paper-patches/files/src/main/java/org/bukkit/Bukkit.java.patch b/purpur-api/spigot-patches/files/src/main/java/org/bukkit/Bukkit.java.patch similarity index 100% rename from purpur-api/paper-patches/files/src/main/java/org/bukkit/Bukkit.java.patch rename to purpur-api/spigot-patches/files/src/main/java/org/bukkit/Bukkit.java.patch diff --git a/purpur-api/paper-patches/files/src/main/java/org/bukkit/ChatColor.java.patch b/purpur-api/spigot-patches/files/src/main/java/org/bukkit/ChatColor.java.patch similarity index 100% rename from purpur-api/paper-patches/files/src/main/java/org/bukkit/ChatColor.java.patch rename to purpur-api/spigot-patches/files/src/main/java/org/bukkit/ChatColor.java.patch diff --git a/purpur-api/paper-patches/files/src/main/java/org/bukkit/Material.java.patch b/purpur-api/spigot-patches/files/src/main/java/org/bukkit/Material.java.patch similarity index 92% rename from purpur-api/paper-patches/files/src/main/java/org/bukkit/Material.java.patch rename to purpur-api/spigot-patches/files/src/main/java/org/bukkit/Material.java.patch index 4e068e234..668741f79 100644 --- a/purpur-api/paper-patches/files/src/main/java/org/bukkit/Material.java.patch +++ b/purpur-api/spigot-patches/files/src/main/java/org/bukkit/Material.java.patch @@ -1,9 +1,6 @@ --- a/src/main/java/org/bukkit/Material.java +++ b/src/main/java/org/bukkit/Material.java @@ -3616,4 +_,40 @@ - return this.asItemType().getDefaultDataTypes(); - } - // Paper end - data component API + + // Purpur start - ItemStack convenience methods + public boolean isArmor() { diff --git a/purpur-api/paper-patches/files/src/main/java/org/bukkit/OfflinePlayer.java.patch b/purpur-api/spigot-patches/files/src/main/java/org/bukkit/OfflinePlayer.java.patch similarity index 95% rename from purpur-api/paper-patches/files/src/main/java/org/bukkit/OfflinePlayer.java.patch rename to purpur-api/spigot-patches/files/src/main/java/org/bukkit/OfflinePlayer.java.patch index 0f821e6ad..c32224773 100644 --- a/purpur-api/paper-patches/files/src/main/java/org/bukkit/OfflinePlayer.java.patch +++ b/purpur-api/spigot-patches/files/src/main/java/org/bukkit/OfflinePlayer.java.patch @@ -1,9 +1,6 @@ --- a/src/main/java/org/bukkit/OfflinePlayer.java +++ b/src/main/java/org/bukkit/OfflinePlayer.java @@ -570,4 +_,104 @@ - @Override - io.papermc.paper.persistence.PersistentDataContainerView getPersistentDataContainer(); - // Paper end - add pdc to offline player + + // Purpur start - OfflinePlayer API + /** diff --git a/purpur-api/paper-patches/files/src/main/java/org/bukkit/Server.java.patch b/purpur-api/spigot-patches/files/src/main/java/org/bukkit/Server.java.patch similarity index 96% rename from purpur-api/paper-patches/files/src/main/java/org/bukkit/Server.java.patch rename to purpur-api/spigot-patches/files/src/main/java/org/bukkit/Server.java.patch index 5b53e005a..af8c250c7 100644 --- a/purpur-api/paper-patches/files/src/main/java/org/bukkit/Server.java.patch +++ b/purpur-api/spigot-patches/files/src/main/java/org/bukkit/Server.java.patch @@ -1,9 +1,6 @@ --- a/src/main/java/org/bukkit/Server.java +++ b/src/main/java/org/bukkit/Server.java @@ -2705,4 +_,111 @@ - */ - void allowPausing(@NotNull org.bukkit.plugin.Plugin plugin, boolean value); - // Paper end - API to check if the server is sleeping + + // Purpur start - Bring back server name + /** diff --git a/purpur-api/paper-patches/files/src/main/java/org/bukkit/World.java.patch b/purpur-api/spigot-patches/files/src/main/java/org/bukkit/World.java.patch similarity index 100% rename from purpur-api/paper-patches/files/src/main/java/org/bukkit/World.java.patch rename to purpur-api/spigot-patches/files/src/main/java/org/bukkit/World.java.patch diff --git a/purpur-api/paper-patches/files/src/main/java/org/bukkit/block/EntityBlockStorage.java.patch b/purpur-api/spigot-patches/files/src/main/java/org/bukkit/block/EntityBlockStorage.java.patch similarity index 100% rename from purpur-api/paper-patches/files/src/main/java/org/bukkit/block/EntityBlockStorage.java.patch rename to purpur-api/spigot-patches/files/src/main/java/org/bukkit/block/EntityBlockStorage.java.patch diff --git a/purpur-api/paper-patches/files/src/main/java/org/bukkit/command/SimpleCommandMap.java.patch b/purpur-api/spigot-patches/files/src/main/java/org/bukkit/command/SimpleCommandMap.java.patch similarity index 61% rename from purpur-api/paper-patches/files/src/main/java/org/bukkit/command/SimpleCommandMap.java.patch rename to purpur-api/spigot-patches/files/src/main/java/org/bukkit/command/SimpleCommandMap.java.patch index 83f75df21..56ad90e72 100644 --- a/purpur-api/paper-patches/files/src/main/java/org/bukkit/command/SimpleCommandMap.java.patch +++ b/purpur-api/spigot-patches/files/src/main/java/org/bukkit/command/SimpleCommandMap.java.patch @@ -17,20 +17,16 @@ + parsedArgs = event.getArgs(); + // Purpur end - ExecuteCommandEvent + - // Paper start - Plugins do weird things to workaround normal registration - if (target.timings == null) { - target.timings = co.aikar.timings.TimingsManager.getCommandTiming(null, target); + @@ -160,10 +_,10 @@ - // Paper end try { -- try (co.aikar.timings.Timing ignored = target.timings.startTiming()) { // Paper - use try with resources -+ //try (co.aikar.timings.Timing ignored = target.timings.startTiming()) { // Paper - use try with resources // Purpur - Remove Timings +- try (co.aikar.timings.Timing ignored = target.timings.startTiming()) { ++ //try (co.aikar.timings.Timing ignored = target.timings.startTiming()) { // Purpur - Remove Timings // Note: we don't return the result of target.execute as thats success / failure, we return handled (true) or not handled (false) - target.execute(sender, sentCommandLabel, Arrays.copyOfRange(args, 1, args.length)); -- } // target.timings.stopTiming(); // Spigot // Paper +- } // target.timings.stopTiming(); // Spigot + target.execute(sender, sentCommandLabel, parsedArgs); // Purpur - ExecuteCommandEvent -+ //} // target.timings.stopTiming(); // Spigot // Paper // Purpur - Remove Timings ++ //} // target.timings.stopTiming(); // Spigot // Purpur - Remove Timings } catch (CommandException ex) { - server.getPluginManager().callEvent(new com.destroystokyo.paper.event.server.ServerExceptionEvent(new com.destroystokyo.paper.exception.ServerCommandException(ex, target, sender, args))); // Paper - //target.timings.stopTiming(); // Spigot // Paper + target.timings.stopTiming(); // Spigot diff --git a/purpur-api/paper-patches/files/src/main/java/org/bukkit/enchantments/EnchantmentTarget.java.patch b/purpur-api/spigot-patches/files/src/main/java/org/bukkit/enchantments/EnchantmentTarget.java.patch similarity index 100% rename from purpur-api/paper-patches/files/src/main/java/org/bukkit/enchantments/EnchantmentTarget.java.patch rename to purpur-api/spigot-patches/files/src/main/java/org/bukkit/enchantments/EnchantmentTarget.java.patch diff --git a/purpur-api/paper-patches/files/src/main/java/org/bukkit/entity/Endermite.java.patch b/purpur-api/spigot-patches/files/src/main/java/org/bukkit/entity/Endermite.java.patch similarity index 98% rename from purpur-api/paper-patches/files/src/main/java/org/bukkit/entity/Endermite.java.patch rename to purpur-api/spigot-patches/files/src/main/java/org/bukkit/entity/Endermite.java.patch index b2f7a4584..e835bbeca 100644 --- a/purpur-api/paper-patches/files/src/main/java/org/bukkit/entity/Endermite.java.patch +++ b/purpur-api/spigot-patches/files/src/main/java/org/bukkit/entity/Endermite.java.patch @@ -28,5 +28,4 @@ */ - @Deprecated(since = "1.17", forRemoval = true) void setPlayerSpawned(boolean playerSpawned); - // Paper start /** diff --git a/purpur-api/paper-patches/files/src/main/java/org/bukkit/entity/Entity.java.patch b/purpur-api/spigot-patches/files/src/main/java/org/bukkit/entity/Entity.java.patch similarity index 90% rename from purpur-api/paper-patches/files/src/main/java/org/bukkit/entity/Entity.java.patch rename to purpur-api/spigot-patches/files/src/main/java/org/bukkit/entity/Entity.java.patch index 9f2167d47..de93bc160 100644 --- a/purpur-api/paper-patches/files/src/main/java/org/bukkit/entity/Entity.java.patch +++ b/purpur-api/spigot-patches/files/src/main/java/org/bukkit/entity/Entity.java.patch @@ -1,9 +1,6 @@ --- a/src/main/java/org/bukkit/entity/Entity.java +++ b/src/main/java/org/bukkit/entity/Entity.java @@ -1214,4 +_,59 @@ - */ - void broadcastHurtAnimation(@NotNull java.util.Collection players); - // Paper end - broadcast hurt animation + + // Purpur start - Ridables + /** diff --git a/purpur-api/paper-patches/files/src/main/java/org/bukkit/entity/IronGolem.java.patch b/purpur-api/spigot-patches/files/src/main/java/org/bukkit/entity/IronGolem.java.patch similarity index 100% rename from purpur-api/paper-patches/files/src/main/java/org/bukkit/entity/IronGolem.java.patch rename to purpur-api/spigot-patches/files/src/main/java/org/bukkit/entity/IronGolem.java.patch diff --git a/purpur-api/paper-patches/files/src/main/java/org/bukkit/entity/Item.java.patch b/purpur-api/spigot-patches/files/src/main/java/org/bukkit/entity/Item.java.patch similarity index 96% rename from purpur-api/paper-patches/files/src/main/java/org/bukkit/entity/Item.java.patch rename to purpur-api/spigot-patches/files/src/main/java/org/bukkit/entity/Item.java.patch index 294924ed9..f8bad94a9 100644 --- a/purpur-api/paper-patches/files/src/main/java/org/bukkit/entity/Item.java.patch +++ b/purpur-api/spigot-patches/files/src/main/java/org/bukkit/entity/Item.java.patch @@ -2,8 +2,6 @@ +++ b/src/main/java/org/bukkit/entity/Item.java @@ -153,4 +_,62 @@ */ - public void setHealth(int health); - // Paper end + + // Purpur start + /** diff --git a/purpur-api/paper-patches/files/src/main/java/org/bukkit/entity/LivingEntity.java.patch b/purpur-api/spigot-patches/files/src/main/java/org/bukkit/entity/LivingEntity.java.patch similarity index 83% rename from purpur-api/paper-patches/files/src/main/java/org/bukkit/entity/LivingEntity.java.patch rename to purpur-api/spigot-patches/files/src/main/java/org/bukkit/entity/LivingEntity.java.patch index 62363164e..30e0b77ea 100644 --- a/purpur-api/paper-patches/files/src/main/java/org/bukkit/entity/LivingEntity.java.patch +++ b/purpur-api/spigot-patches/files/src/main/java/org/bukkit/entity/LivingEntity.java.patch @@ -2,8 +2,6 @@ +++ b/src/main/java/org/bukkit/entity/LivingEntity.java @@ -1452,4 +_,20 @@ */ - boolean canUseEquipmentSlot(org.bukkit.inventory.@NotNull EquipmentSlot slot); - // Paper end - Expose canUseSlot + + // Purpur start - API for any mob to burn daylight + /** diff --git a/purpur-api/paper-patches/files/src/main/java/org/bukkit/entity/Llama.java.patch b/purpur-api/spigot-patches/files/src/main/java/org/bukkit/entity/Llama.java.patch similarity index 86% rename from purpur-api/paper-patches/files/src/main/java/org/bukkit/entity/Llama.java.patch rename to purpur-api/spigot-patches/files/src/main/java/org/bukkit/entity/Llama.java.patch index 43e170b4b..5037e8e33 100644 --- a/purpur-api/paper-patches/files/src/main/java/org/bukkit/entity/Llama.java.patch +++ b/purpur-api/spigot-patches/files/src/main/java/org/bukkit/entity/Llama.java.patch @@ -1,9 +1,6 @@ --- a/src/main/java/org/bukkit/entity/Llama.java +++ b/src/main/java/org/bukkit/entity/Llama.java @@ -119,4 +_,20 @@ - @org.jetbrains.annotations.Nullable - Llama getCaravanTail(); - // Paper end + + // Purpur start + /** diff --git a/purpur-api/paper-patches/files/src/main/java/org/bukkit/entity/Player.java.patch b/purpur-api/spigot-patches/files/src/main/java/org/bukkit/entity/Player.java.patch similarity index 100% rename from purpur-api/paper-patches/files/src/main/java/org/bukkit/entity/Player.java.patch rename to purpur-api/spigot-patches/files/src/main/java/org/bukkit/entity/Player.java.patch diff --git a/purpur-api/paper-patches/files/src/main/java/org/bukkit/entity/Snowman.java.patch b/purpur-api/spigot-patches/files/src/main/java/org/bukkit/entity/Snowman.java.patch similarity index 100% rename from purpur-api/paper-patches/files/src/main/java/org/bukkit/entity/Snowman.java.patch rename to purpur-api/spigot-patches/files/src/main/java/org/bukkit/entity/Snowman.java.patch diff --git a/purpur-api/paper-patches/files/src/main/java/org/bukkit/entity/Villager.java.patch b/purpur-api/spigot-patches/files/src/main/java/org/bukkit/entity/Villager.java.patch similarity index 100% rename from purpur-api/paper-patches/files/src/main/java/org/bukkit/entity/Villager.java.patch rename to purpur-api/spigot-patches/files/src/main/java/org/bukkit/entity/Villager.java.patch diff --git a/purpur-api/paper-patches/files/src/main/java/org/bukkit/entity/Wither.java.patch b/purpur-api/spigot-patches/files/src/main/java/org/bukkit/entity/Wither.java.patch similarity index 100% rename from purpur-api/paper-patches/files/src/main/java/org/bukkit/entity/Wither.java.patch rename to purpur-api/spigot-patches/files/src/main/java/org/bukkit/entity/Wither.java.patch diff --git a/purpur-api/paper-patches/files/src/main/java/org/bukkit/entity/Wolf.java.patch b/purpur-api/spigot-patches/files/src/main/java/org/bukkit/entity/Wolf.java.patch similarity index 100% rename from purpur-api/paper-patches/files/src/main/java/org/bukkit/entity/Wolf.java.patch rename to purpur-api/spigot-patches/files/src/main/java/org/bukkit/entity/Wolf.java.patch diff --git a/purpur-api/paper-patches/files/src/main/java/org/bukkit/event/entity/EntityDamageEvent.java.patch b/purpur-api/spigot-patches/files/src/main/java/org/bukkit/event/entity/EntityDamageEvent.java.patch similarity index 100% rename from purpur-api/paper-patches/files/src/main/java/org/bukkit/event/entity/EntityDamageEvent.java.patch rename to purpur-api/spigot-patches/files/src/main/java/org/bukkit/event/entity/EntityDamageEvent.java.patch diff --git a/purpur-api/paper-patches/files/src/main/java/org/bukkit/event/entity/EntityPotionEffectEvent.java.patch b/purpur-api/spigot-patches/files/src/main/java/org/bukkit/event/entity/EntityPotionEffectEvent.java.patch similarity index 100% rename from purpur-api/paper-patches/files/src/main/java/org/bukkit/event/entity/EntityPotionEffectEvent.java.patch rename to purpur-api/spigot-patches/files/src/main/java/org/bukkit/event/entity/EntityPotionEffectEvent.java.patch diff --git a/purpur-api/paper-patches/files/src/main/java/org/bukkit/event/inventory/InventoryType.java.patch b/purpur-api/spigot-patches/files/src/main/java/org/bukkit/event/inventory/InventoryType.java.patch similarity index 100% rename from purpur-api/paper-patches/files/src/main/java/org/bukkit/event/inventory/InventoryType.java.patch rename to purpur-api/spigot-patches/files/src/main/java/org/bukkit/event/inventory/InventoryType.java.patch diff --git a/purpur-api/paper-patches/files/src/main/java/org/bukkit/inventory/AnvilInventory.java.patch b/purpur-api/spigot-patches/files/src/main/java/org/bukkit/inventory/AnvilInventory.java.patch similarity index 96% rename from purpur-api/paper-patches/files/src/main/java/org/bukkit/inventory/AnvilInventory.java.patch rename to purpur-api/spigot-patches/files/src/main/java/org/bukkit/inventory/AnvilInventory.java.patch index 34a114418..4e3415343 100644 --- a/purpur-api/paper-patches/files/src/main/java/org/bukkit/inventory/AnvilInventory.java.patch +++ b/purpur-api/spigot-patches/files/src/main/java/org/bukkit/inventory/AnvilInventory.java.patch @@ -1,9 +1,7 @@ --- a/src/main/java/org/bukkit/inventory/AnvilInventory.java +++ b/src/main/java/org/bukkit/inventory/AnvilInventory.java @@ -138,4 +_,42 @@ - setItem(2, result); - } - // Paper end + + + // Purpur start + /** diff --git a/purpur-api/paper-patches/files/src/main/java/org/bukkit/inventory/ItemStack.java.patch b/purpur-api/spigot-patches/files/src/main/java/org/bukkit/inventory/ItemStack.java.patch similarity index 99% rename from purpur-api/paper-patches/files/src/main/java/org/bukkit/inventory/ItemStack.java.patch rename to purpur-api/spigot-patches/files/src/main/java/org/bukkit/inventory/ItemStack.java.patch index 24a90431c..4e1fb5671 100644 --- a/purpur-api/paper-patches/files/src/main/java/org/bukkit/inventory/ItemStack.java.patch +++ b/purpur-api/spigot-patches/files/src/main/java/org/bukkit/inventory/ItemStack.java.patch @@ -15,9 +15,6 @@ /** * Represents a stack of items. @@ -1371,4 +_,482 @@ - return this.craftDelegate.matchesWithoutData(item, excludeTypes, ignoreCount); - } - // Paper end - data component API + + // Purpur start - ItemStack convenience methods + /** diff --git a/purpur-api/paper-patches/files/src/main/java/org/bukkit/inventory/RecipeChoice.java.patch b/purpur-api/spigot-patches/files/src/main/java/org/bukkit/inventory/RecipeChoice.java.patch similarity index 100% rename from purpur-api/paper-patches/files/src/main/java/org/bukkit/inventory/RecipeChoice.java.patch rename to purpur-api/spigot-patches/files/src/main/java/org/bukkit/inventory/RecipeChoice.java.patch diff --git a/purpur-api/paper-patches/files/src/main/java/org/bukkit/inventory/view/AnvilView.java.patch b/purpur-api/spigot-patches/files/src/main/java/org/bukkit/inventory/view/AnvilView.java.patch similarity index 88% rename from purpur-api/paper-patches/files/src/main/java/org/bukkit/inventory/view/AnvilView.java.patch rename to purpur-api/spigot-patches/files/src/main/java/org/bukkit/inventory/view/AnvilView.java.patch index 3a63aa786..63f6c0186 100644 --- a/purpur-api/paper-patches/files/src/main/java/org/bukkit/inventory/view/AnvilView.java.patch +++ b/purpur-api/spigot-patches/files/src/main/java/org/bukkit/inventory/view/AnvilView.java.patch @@ -1,9 +1,7 @@ --- a/src/main/java/org/bukkit/inventory/view/AnvilView.java +++ b/src/main/java/org/bukkit/inventory/view/AnvilView.java @@ -89,4 +_,34 @@ - */ - void bypassEnchantmentLevelRestriction(boolean bypassEnchantmentLevelRestriction); - // Paper end - bypass anvil level restrictions + + + // Purpur start - Anvil API + /** diff --git a/purpur-api/paper-patches/files/src/main/java/org/bukkit/map/MapRenderer.java.patch b/purpur-api/spigot-patches/files/src/main/java/org/bukkit/map/MapRenderer.java.patch similarity index 100% rename from purpur-api/paper-patches/files/src/main/java/org/bukkit/map/MapRenderer.java.patch rename to purpur-api/spigot-patches/files/src/main/java/org/bukkit/map/MapRenderer.java.patch diff --git a/purpur-api/paper-patches/files/src/main/java/org/bukkit/permissions/PermissibleBase.java.patch b/purpur-api/spigot-patches/files/src/main/java/org/bukkit/permissions/PermissibleBase.java.patch similarity index 100% rename from purpur-api/paper-patches/files/src/main/java/org/bukkit/permissions/PermissibleBase.java.patch rename to purpur-api/spigot-patches/files/src/main/java/org/bukkit/permissions/PermissibleBase.java.patch diff --git a/purpur-api/paper-patches/files/src/main/java/org/bukkit/plugin/java/JavaPluginLoader.java.patch b/purpur-api/spigot-patches/files/src/main/java/org/bukkit/plugin/java/JavaPluginLoader.java.patch similarity index 100% rename from purpur-api/paper-patches/files/src/main/java/org/bukkit/plugin/java/JavaPluginLoader.java.patch rename to purpur-api/spigot-patches/files/src/main/java/org/bukkit/plugin/java/JavaPluginLoader.java.patch diff --git a/purpur-api/paper-patches/files/src/main/java/org/bukkit/plugin/java/LibraryLoader.java.patch b/purpur-api/spigot-patches/files/src/main/java/org/bukkit/plugin/java/LibraryLoader.java.patch similarity index 77% rename from purpur-api/paper-patches/files/src/main/java/org/bukkit/plugin/java/LibraryLoader.java.patch rename to purpur-api/spigot-patches/files/src/main/java/org/bukkit/plugin/java/LibraryLoader.java.patch index f9c0e19bb..aa413d6f6 100644 --- a/purpur-api/paper-patches/files/src/main/java/org/bukkit/plugin/java/LibraryLoader.java.patch +++ b/purpur-api/spigot-patches/files/src/main/java/org/bukkit/plugin/java/LibraryLoader.java.patch @@ -9,13 +9,11 @@ } }); @@ -88,6 +_,7 @@ - // Paper end - plugin loader api return null; } + if (!JavaPluginLoader.SuppressLibraryLoaderLogger) // Purpur - Add log suppression for LibraryLoader logger.log(Level.INFO, "[{0}] Loading {1} libraries... please wait", new Object[] { - java.util.Objects.requireNonNullElseGet(desc.getPrefix(), desc::getName), desc.getLibraries().size() // Paper - use configured log prefix @@ -140,6 +_,7 @@ } @@ -23,4 +21,3 @@ + if (!JavaPluginLoader.SuppressLibraryLoaderLogger) // Purpur - Add log suppression for LibraryLoader logger.log(Level.INFO, "[{0}] Loaded library {1}", new Object[] { - java.util.Objects.requireNonNullElseGet(desc.getPrefix(), desc::getName), file // Paper - use configured log prefix diff --git a/purpur-api/paper-patches/files/src/main/java/org/bukkit/util/permissions/CommandPermissions.java.patch b/purpur-api/spigot-patches/files/src/main/java/org/bukkit/util/permissions/CommandPermissions.java.patch similarity index 100% rename from purpur-api/paper-patches/files/src/main/java/org/bukkit/util/permissions/CommandPermissions.java.patch rename to purpur-api/spigot-patches/files/src/main/java/org/bukkit/util/permissions/CommandPermissions.java.patch diff --git a/purpur-api/paper-patches/files/src/main/java/org/bukkit/util/permissions/DefaultPermissions.java.patch b/purpur-api/spigot-patches/files/src/main/java/org/bukkit/util/permissions/DefaultPermissions.java.patch similarity index 100% rename from purpur-api/paper-patches/files/src/main/java/org/bukkit/util/permissions/DefaultPermissions.java.patch rename to purpur-api/spigot-patches/files/src/main/java/org/bukkit/util/permissions/DefaultPermissions.java.patch diff --git a/purpur-api/paper-patches/files/src/main/java/org/spigotmc/CustomTimingsHandler.java.patch b/purpur-api/spigot-patches/files/src/main/java/org/spigotmc/CustomTimingsHandler.java.patch similarity index 100% rename from purpur-api/paper-patches/files/src/main/java/org/spigotmc/CustomTimingsHandler.java.patch rename to purpur-api/spigot-patches/files/src/main/java/org/spigotmc/CustomTimingsHandler.java.patch diff --git a/purpur-server/build.gradle.kts.patch b/purpur-server/build.gradle.kts.patch index 7cefdc9cd..e67439c65 100644 --- a/purpur-server/build.gradle.kts.patch +++ b/purpur-server/build.gradle.kts.patch @@ -1,16 +1,14 @@ ---- a/paper-server/build.gradle.kts -+++ b/paper-server/build.gradle.kts +--- a/spigot-server/build.gradle.kts ++++ b/spigot-server/build.gradle.kts @@ -28,6 +_,18 @@ - // oldPaperCommit = "f4f275519f7c1fbe9db173b7144a4fe81440e365" - //} + // Purpur start - Rebrand + val purpur = forks.register("purpur") { -+ upstream.patchDir("paperServer") { -+ upstreamPath = "paper-server" ++ upstream.patchDir("spigotServer") { ++ upstreamPath = "spigot-server" + excludes = setOf("src/minecraft", "patches", "build.gradle.kts") -+ patchesDir = rootDirectory.dir("purpur-server/paper-patches") -+ outputDir = rootDirectory.dir("paper-server") ++ patchesDir = rootDirectory.dir("purpur-server/spigot-patches") ++ outputDir = rootDirectory.dir("spigot-server") + } + } + activeFork = purpur @@ -27,16 +25,16 @@ +// Purpur start - Rebrand +sourceSets { + main { -+ java { srcDir("../paper-server/src/main/java") } -+ resources { srcDir("../paper-server/src/main/resources") } ++ java { srcDir("../spigot-server/src/main/java") } ++ resources { srcDir("../spigot-server/src/main/resources") } + } + test { -+ java { srcDir("../paper-server/src/test/java") } -+ resources { srcDir("../paper-server/src/test/resources") } ++ java { srcDir("../spigot-server/src/test/java") } ++ resources { srcDir("../spigot-server/src/test/resources") } + } +} +val log4jPlugins = sourceSets.create("log4jPlugins") { -+ java { srcDir("../paper-server/src/log4jPlugins/java") } ++ java { srcDir("../spigot-server/src/log4jPlugins/java") } +} +// Purpur end - Rebrand configurations.named(log4jPlugins.compileClasspathConfigurationName) { @@ -46,7 +44,7 @@ } dependencies { -- implementation(project(":paper-api")) +- implementation(project(":spigot-api")) + implementation(project(":purpur-api")) // Purpur implementation("ca.spottedleaf:concurrentutil:0.0.3") implementation("org.jline:jline-terminal-ffm:3.27.1") // use ffm on java 22+ @@ -66,16 +64,16 @@ val gitBranch = git.exec(providers, "rev-parse", "--abbrev-ref", "HEAD").get().trim() attributes( "Main-Class" to "org.bukkit.craftbukkit.Main", -- "Implementation-Title" to "Paper", +- "Implementation-Title" to "Spigot", + "Implementation-Title" to "Purpur", // Purpur "Implementation-Version" to implementationVersion, "Implementation-Vendor" to date, -- "Specification-Title" to "Paper", +- "Specification-Title" to "Spigot", + "Specification-Title" to "Purpur", // Purpur "Specification-Version" to project.version, -- "Specification-Vendor" to "Paper Team", -- "Brand-Id" to "papermc:paper", -- "Brand-Name" to "Paper", +- "Specification-Vendor" to "Spigot Team", +- "Brand-Id" to "spigotmc:spigot", +- "Brand-Name" to "Spigot", + "Specification-Vendor" to "Purpur Team", // Purpur + "Brand-Id" to "purpurmc:purpur", // Purpur + "Brand-Name" to "Purpur", // Purpur @@ -86,8 +84,3 @@ jvmArgumentProviders.add(provider) } --val generatedDir: java.nio.file.Path = layout.projectDirectory.dir("src/generated/java").asFile.toPath() -+val generatedDir: java.nio.file.Path = layout.projectDirectory.dir("../paper-server/src/generated/java").asFile.toPath() - idea { - module { - generatedSourceDirs.add(generatedDir.toFile()) diff --git a/purpur-server/minecraft-patches/features/0001-Ridables.patch b/purpur-server/minecraft-patches/features/0001-Ridables.patch index 42ca26732..0a5ef81e9 100644 --- a/purpur-server/minecraft-patches/features/0001-Ridables.patch +++ b/purpur-server/minecraft-patches/features/0001-Ridables.patch @@ -22,9 +22,6 @@ index f34bc75f324454bf48f0ebf79111706bb027a54b..6ad266592c16bdeccfb689fb2ef2ee37 --- a/net/minecraft/server/MinecraftServer.java +++ b/net/minecraft/server/MinecraftServer.java @@ -1634,6 +1634,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop 0; // Paper - BlockPhysicsEvent - serverLevel.hasEntityMoveEvent = io.papermc.paper.event.entity.EntityMoveEvent.getHandlerList().getRegisteredListeners().length > 0; // Paper - Add EntityMoveEvent - serverLevel.updateLagCompensationTick(); // Paper - lag compensation + serverLevel.hasRidableMoveEvent = org.purpurmc.purpur.event.entity.RidableMoveEvent.getHandlerList().getRegisteredListeners().length > 0; // Purpur - Ridables profilerFiller.push(() -> serverLevel + " " + serverLevel.dimension().location()); /* Drop global time updates @@ -35,8 +32,6 @@ index 0e7405a480bffa81493ef2f2078c36ccda542cde..bc5c30430e79e2feb69c165d9e3e9b6a +++ b/net/minecraft/server/level/ServerLevel.java @@ -212,6 +212,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe public final java.util.UUID uuid; - public boolean hasPhysicsEvent = true; // Paper - BlockPhysicsEvent - public boolean hasEntityMoveEvent; // Paper - Add EntityMoveEvent + public boolean hasRidableMoveEvent = false; // Purpur - Ridables @Override @@ -73,7 +68,6 @@ index 63e01ec7e4ab04bb7d389bff485dfedca344bfa2..84b1570d0d88f57f33ff8179f0a78d37 + // Entity in bucket - SPIGOT-4048 and SPIGOT-6859a if ((target instanceof net.minecraft.world.entity.animal.Bucketable && target instanceof LivingEntity && origItem != null && origItem == Items.WATER_BUCKET) && (event.isCancelled() || ServerGamePacketListenerImpl.this.player.getInventory().getSelectedItem().isEmpty() || !ServerGamePacketListenerImpl.this.player.getInventory().getSelectedItem().is(origItem))) { - target.resendPossiblyDesyncedEntityData(ServerGamePacketListenerImpl.this.player); // Paper - The entire mob gets deleted, so resend it diff --git a/net/minecraft/world/entity/Entity.java b/net/minecraft/world/entity/Entity.java index d1899b2411e90b4641dcbc58760e4a19b62846c5..1335a04edd053c06e290c070e3c03d02598d97e7 100644 --- a/net/minecraft/world/entity/Entity.java @@ -110,7 +104,6 @@ index d1899b2411e90b4641dcbc58760e4a19b62846c5..1335a04edd053c06e290c070e3c03d02 @@ -4823,4 +4838,44 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess return ((ServerLevel) this.level()).isPositionEntityTicking(this.blockPosition()); } - // Paper end - Expose entity id counter + // Purpur start - Ridables + @Nullable + private Player rider = null; @@ -213,7 +206,6 @@ index a077e2f518be39bbdba4919ed7161bb28547e56b..a4a19d962bc4665e9368b97cae4b2534 @@ -3577,8 +3578,10 @@ public abstract class LivingEntity extends Entity implements Attackable { this.pushEntities(); profilerFiller.pop(); - // Paper start - Add EntityMoveEvent - if (((ServerLevel) this.level()).hasEntityMoveEvent && !(this instanceof Player)) { - if (this.xo != this.getX() || this.yo != this.getY() || this.zo != this.getZ() || this.yRotO != this.getYRot() || this.xRotO != this.getXRot()) { + // Purpur start - Ridables @@ -222,8 +214,7 @@ index a077e2f518be39bbdba4919ed7161bb28547e56b..a4a19d962bc4665e9368b97cae4b2534 + // Purpur end - Ridables Location from = new Location(this.level().getWorld(), this.xo, this.yo, this.zo, this.yRotO, this.xRotO); Location to = new Location(this.level().getWorld(), this.getX(), this.getY(), this.getZ(), this.getYRot(), this.getXRot()); - io.papermc.paper.event.entity.EntityMoveEvent event = new io.papermc.paper.event.entity.EntityMoveEvent(this.getBukkitLivingEntity(), from, to.clone()); -@@ -3588,6 +3591,21 @@ public abstract class LivingEntity extends Entity implements Attackable { + @@ -3588,6 +3591,21 @@ public abstract class LivingEntity extends Entity implements Attackable { this.absSnapTo(event.getTo().getX(), event.getTo().getY(), event.getTo().getZ(), event.getTo().getYaw(), event.getTo().getPitch()); } } @@ -243,7 +234,6 @@ index a077e2f518be39bbdba4919ed7161bb28547e56b..a4a19d962bc4665e9368b97cae4b2534 + } + // Purpur end - Ridables } - // Paper end - Add EntityMoveEvent if (this.level() instanceof ServerLevel serverLevel && this.isSensitiveToWater() && this.isInWaterOrRain()) { diff --git a/net/minecraft/world/entity/Mob.java b/net/minecraft/world/entity/Mob.java index e3b804f2d612ed7971db450aeea6768109b63470..ca1d0164c90e695731f05de39c1d2fff947ecfc1 100644 @@ -534,7 +524,6 @@ index 4e81bc7215c845b316bcd46ce29f49af7f986088..61e7300bbf272398b2faebf5e537d9c2 // CraftBukkit start - Got milk? org.bukkit.event.player.PlayerBucketFillEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callPlayerBucketFillEvent(player.level(), player, this.blockPosition(), this.blockPosition(), null, itemInHand, Items.MILK_BUCKET, hand); if (event.isCancelled()) { - player.containerMenu.sendAllDataToRemote(); // Paper - Fix inventory desync - return InteractionResult.PASS; + return tryRide(player, hand); // Purpur - Ridables } @@ -604,7 +593,6 @@ index 585131365c40136cf8a8a715b077982091ee38d5..65ee07e09bb9bafb60abeec4916fdbb0 public Bee(EntityType entityType, Level level) { super(entityType, level); + final org.purpurmc.purpur.controller.FlyingMoveControllerWASD flyingController = new org.purpurmc.purpur.controller.FlyingMoveControllerWASD(this, 0.25F, 1.0F, false); // Purpur - Ridables - // Paper start - Fix MC-167279 class BeeFlyingMoveControl extends FlyingMoveControl { public BeeFlyingMoveControl(final Mob entity, final int maxPitchChange, final boolean noGravity) { @@ -157,11 +158,24 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { @@ -631,7 +619,6 @@ index 585131365c40136cf8a8a715b077982091ee38d5..65ee07e09bb9bafb60abeec4916fdbb0 + // Purpur end - Ridables } this.moveControl = new BeeFlyingMoveControl(this, 20, true); - // Paper end - Fix MC-167279 @@ -173,6 +187,40 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { this.setPathfindingMalus(PathType.FENCE, -1.0F); } @@ -1167,7 +1154,6 @@ index 0931bab3f52ccc4e405be22559323df90bcc065e..f04342dd4addb2be47533f12a2a475f1 - if (event.isCancelled()) return InteractionResult.PASS; + if (event.isCancelled()) return tryRide(player, hand); // Purpur - Ridables drops = org.bukkit.craftbukkit.inventory.CraftItemStack.asNMSCopy(event.getDrops()); - // Paper end - custom shear drops } diff --git a/net/minecraft/world/entity/animal/Ocelot.java b/net/minecraft/world/entity/animal/Ocelot.java index 48c8fdfea8687f37187b6092c285275c12963ea0..b8780911350ac5f4f10acdbed2b13523c8692344 100644 @@ -1727,7 +1713,6 @@ index 67c8f1e82c775818f906eeaa639e55d7c02834c6..aca62391131333d604d21c9aaf2bcea6 + return tryRide(player, hand); // Purpur - Ridables } drops = org.bukkit.craftbukkit.inventory.CraftItemStack.asNMSCopy(event.getDrops()); - // Paper end - custom shear drops @@ -175,7 +195,7 @@ public class SnowGolem extends AbstractGolem implements Shearable, RangedAttackM return InteractionResult.SUCCESS; // Purpur end - Snowman drop and put back pumpkin @@ -2180,7 +2165,6 @@ index ebdfd3fb6c0de48982d392bb2aa415f3676c6056..4db2d63fbc021f28b8ad8d20cc1cc1bb @@ -64,13 +64,50 @@ public class Tadpole extends AbstractFish { MemoryModuleType.IS_PANICKING ); - public boolean ageLocked; // Paper + private org.purpurmc.purpur.controller.WaterMoveControllerWASD purpurController; // Purpur - Ridables public Tadpole(EntityType entityType, Level level) { @@ -2350,7 +2334,6 @@ index d4467235e8dc9d10c61dfb6fd9dc32386903dd09..b60fa4cb07d8dc6b52e76b5e9f596baf @@ -83,7 +83,51 @@ public class Llama extends AbstractChestedHorse implements RangedAttackMob { super(entityType, level); this.getNavigation().setRequiredPathLength(40.0F); - this.maxDomestication = 30; // Paper - Missing entity API; configure max temper instead of a hardcoded value + // Purpur start - Ridables + this.moveControl = new org.purpurmc.purpur.controller.MoveControllerWASD(this) { + @Override @@ -2652,9 +2635,7 @@ index ea9d27a3205b3699b9577f42bb04254bd76e700e..a414934ae4332cc6cf622d4bb19c5937 --- a/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java +++ b/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java @@ -91,6 +91,7 @@ public class EnderDragon extends Mob implements Enemy { - private final net.minecraft.world.level.Explosion explosionSource; // Paper - reusable source for CraftTNTPrimed.getSource() @Nullable private BlockPos podium; - // Paper end + private boolean hadRider; // Purpur - Ridables public EnderDragon(EntityType entityType, Level level) { @@ -2662,7 +2643,6 @@ index ea9d27a3205b3699b9577f42bb04254bd76e700e..a414934ae4332cc6cf622d4bb19c5937 @@ -107,6 +108,37 @@ public class EnderDragon extends Mob implements Enemy { this.noPhysics = true; this.phaseManager = new EnderDragonPhaseManager(this); - this.explosionSource = new net.minecraft.world.level.ServerExplosion(level.getMinecraftWorld(), this, null, null, new Vec3(Double.NaN, Double.NaN, Double.NaN), Float.NaN, true, net.minecraft.world.level.Explosion.BlockInteraction.DESTROY); // Paper + + // Purpur start - Ridables + this.moveControl = new org.purpurmc.purpur.controller.FlyingMoveControllerWASD(this) { @@ -2813,7 +2793,6 @@ index 2f7da367b58fd9c06c4e012e8eb7f59e5a7f9b6d..15e2c0d566256c4ba175e991d6d7fd4f private final int[] idleHeadUpdates = new int[2]; private int destroyBlocksTick; + private int shootCooldown = 0; // Purpur - Ridables - private boolean canPortal = false; // Paper public final ServerBossEvent bossEvent = (ServerBossEvent)new ServerBossEvent( this.getDisplayName(), BossEvent.BossBarColor.PURPLE, BossEvent.BossBarOverlay.PROGRESS @@ -79,9 +80,23 @@ public class WitherBoss extends Monster implements RangedAttackMob { @@ -3252,7 +3231,6 @@ index c2327306f093c834da9574f9466236fbec572aec..562641cdb76e7a50706459bee8a2dcdf this.targetSelector.addGoal(2, new HurtByTargetGoal(this)); } @@ -310,6 +387,7 @@ public class Creeper extends Monster { - com.destroystokyo.paper.event.entity.CreeperIgniteEvent event = new com.destroystokyo.paper.event.entity.CreeperIgniteEvent((org.bukkit.entity.Creeper) getBukkitEntity(), ignited); if (event.callEvent()) { this.entityData.set(DATA_IS_IGNITED, event.isIgnited()); + if (!event.isIgnited()) setSwellDir(-1); // Purpur - Ridables @@ -3891,7 +3869,6 @@ index 73edb1a4e5daee16fa518c05de24e413847ab65d..2653cf2c353d7ae360201e74c4860a47 @@ -148,6 +209,7 @@ public class Phantom extends FlyingMob implements Enemy { @Override public void aiStep() { - if (this.isAlive() && this.shouldBurnInDay && this.isSunBurnTick()) { // Paper - shouldBurnInDay API + if (getRider() == null || !this.isControllable()) // Purpur - Ridables this.igniteForSeconds(8.0F); } @@ -4155,7 +4132,6 @@ index 6a8a5a76400beeaf69a17d53105a7a522ec5791e..9127e99d632bcd01c2f042c33dc87dd4 @@ -58,6 +58,7 @@ public class Slime extends Mob implements Enemy { public float oSquish; private boolean wasOnGround = false; - private boolean canWander = true; // Paper - Slime pathfinder events + protected boolean actualJump; // Purpur - Ridables public Slime(EntityType entityType, Level level) { @@ -4666,7 +4642,6 @@ index e15df574282e0f5ba5791435020bc6ac96860d15..f9233f0689b26a8c65d60ab9421c1216 @Override protected void registerGoals() { + this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur - Ridables - if (this.level().paperConfig().entities.behavior.zombiesTargetTurtleEggs) this.goalSelector.addGoal(4, new Zombie.ZombieAttackTurtleEggGoal(this, 1.0, 3)); // Paper - Add zombie targets turtle egg config this.goalSelector.addGoal(8, new LookAtPlayerGoal(this, Player.class, 8.0F)); this.goalSelector.addGoal(8, new RandomLookAroundGoal(this)); + this.targetSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur - Ridables @@ -4990,7 +4965,6 @@ index 49d43837b88d8f278baa5062aed83a297fe20ed8..15669f9157dc3d3d5e3fb76a668c7e3b // Pufferfish start - if (!inactive /*&& this.behaviorTick++ % this.activatedPriority == 0*/) { + if (!inactive && (getRider() == null || !this.isControllable()) /*&& this.behaviorTick++ % this.activatedPriority == 0*/) { // Purpur - Ridables - this.getBrain().tick(level, this); // Paper - EAR 2 } else if (this.isLobotomized && shouldRestock()) restock(); // Purpur - Lobotomize stuck villagers @@ -418,7 +440,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler diff --git a/purpur-server/minecraft-patches/features/0003-Barrels-and-enderchests-6-rows.patch b/purpur-server/minecraft-patches/features/0003-Barrels-and-enderchests-6-rows.patch index 3650fe2a9..37bbac8c3 100644 --- a/purpur-server/minecraft-patches/features/0003-Barrels-and-enderchests-6-rows.patch +++ b/purpur-server/minecraft-patches/features/0003-Barrels-and-enderchests-6-rows.patch @@ -11,7 +11,6 @@ index ccea424d813a4c137fa15612b7bcf4fdb5c9a811..a1304bc3b1ebb9fa246004ae418481d4 @@ -1029,6 +1029,27 @@ public abstract class PlayerList { player.getBukkitEntity().recalculatePermissions(); // CraftBukkit this.server.getCommands().sendCommands(player); - } // Paper - Add sendOpLevel API + + // Purpur start - Barrels and enderchests 6 rows + if (org.purpurmc.purpur.PurpurConfig.enderChestSixRows && org.purpurmc.purpur.PurpurConfig.enderChestPermissionRows) { @@ -41,7 +40,6 @@ index 2417c26a03decf756ad93cd54265277c95c653ca..87c8bc6f9128d2fcb19628bc3ef354e5 --- a/net/minecraft/world/entity/player/Player.java +++ b/net/minecraft/world/entity/player/Player.java @@ -212,6 +212,7 @@ public abstract class Player extends LivingEntity { - public net.kyori.adventure.util.TriState flyingFallDamage = net.kyori.adventure.util.TriState.NOT_SET; // Paper - flying fall damage public int burpDelay = 0; // Purpur - Burp delay public boolean canPortalInstant = false; // Purpur - Add portal permission bypass + public int sixRowEnderchestSlotCount = -1; // Purpur - Barrels and enderchests 6 rows @@ -120,7 +118,6 @@ index 5077a9ff7b78801bdc53536a37aee07b8d86ee4d..72794e204f7fcc31ece94913b7fd9f36 + (containerId, playerInventory, player1) -> org.purpurmc.purpur.PurpurConfig.enderChestSixRows ? getEnderChestSixRows(containerId, playerInventory, player, enderChestInventory) : ChestMenu.threeRows(containerId, playerInventory, enderChestInventory), CONTAINER_TITLE + ) // Purpur - Barrels and enderchests 6 rows ).isPresent()) { - // Paper end - Fix InventoryOpenEvent cancellation - moved up; player.awardStat(Stats.OPEN_ENDERCHEST); @@ -100,6 +100,35 @@ public class EnderChestBlock extends AbstractChestBlock i } diff --git a/purpur-server/minecraft-patches/features/0006-Minecart-settings-and-WASD-controls.patch b/purpur-server/minecraft-patches/features/0006-Minecart-settings-and-WASD-controls.patch index 0a4a90726..3daed1f82 100644 --- a/purpur-server/minecraft-patches/features/0006-Minecart-settings-and-WASD-controls.patch +++ b/purpur-server/minecraft-patches/features/0006-Minecart-settings-and-WASD-controls.patch @@ -32,7 +32,6 @@ index 99617c08cbd989092ba357d8df928786fd04c89a..9d88b260528c3cea2c5fe8e2760094b0 + public double storedMaxSpeed; + public boolean isNewBehavior; + // Purpur end - Minecart settings and WASD controls - public net.kyori.adventure.util.TriState frictionState = net.kyori.adventure.util.TriState.NOT_SET; // Paper - Friction API // CraftBukkit end @@ -111,8 +115,13 @@ public abstract class AbstractMinecart extends VehicleEntity { diff --git a/purpur-server/minecraft-patches/features/0008-Configurable-void-damage-height-and-damage.patch b/purpur-server/minecraft-patches/features/0008-Configurable-void-damage-height-and-damage.patch deleted file mode 100644 index a4f3ae80d..000000000 --- a/purpur-server/minecraft-patches/features/0008-Configurable-void-damage-height-and-damage.patch +++ /dev/null @@ -1,49 +0,0 @@ -From 0000000000000000000000000000000000000000 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 and damage - -temporarily migrate to paper's config -drop patch on the next minecraft release - -diff --git a/net/minecraft/server/MinecraftServer.java b/net/minecraft/server/MinecraftServer.java -index 6ad266592c16bdeccfb689fb2ef2ee37e79a7b41..e950e74d7c14d2e180e5ca879eb1048866d85051 100644 ---- a/net/minecraft/server/MinecraftServer.java -+++ b/net/minecraft/server/MinecraftServer.java -@@ -1140,6 +1140,16 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop entityType, Level level) { super(entityType, level); @@ -94,6 +100,49 @@ public class EndCrystal extends Entity { - // Paper end - Fix invulnerable end crystals if (this.level().purpurConfig.endCrystalCramming > 0 && this.level().getEntitiesOfClass(EndCrystal.class, getBoundingBox()).size() > this.level().purpurConfig.endCrystalCramming) this.hurt(this.damageSources().cramming(), 6.0F); // Purpur - End Crystal Cramming + // Purpur start - Phantoms attracted to crystals and crystals shoot phantoms @@ -80,7 +78,6 @@ index 2f14561a3722f8175a234ad656ef64d4c58e3b96..6c41a2cc9a772c216abfc2b241429ec7 public BlockPos anchorPoint; Phantom.AttackPhase attackPhase = Phantom.AttackPhase.CIRCLE; + Vec3 crystalPosition; // Purpur - Phantoms attracted to crystals and crystals shoot phantoms - // Paper start @Nullable public java.util.UUID spawningEntity; @@ -119,6 +120,25 @@ public class Phantom extends FlyingMob implements Enemy { diff --git a/purpur-server/minecraft-patches/features/0012-Phantoms-burn-in-light.patch b/purpur-server/minecraft-patches/features/0012-Phantoms-burn-in-light.patch index 2b429096d..5b38821f4 100644 --- a/purpur-server/minecraft-patches/features/0012-Phantoms-burn-in-light.patch +++ b/purpur-server/minecraft-patches/features/0012-Phantoms-burn-in-light.patch @@ -11,7 +11,6 @@ index 6c41a2cc9a772c216abfc2b241429ec712119bb4..eaa5f2db1bc6b01ef6a508cc5a60ff1e @@ -54,6 +54,7 @@ public class Phantom extends FlyingMob implements Enemy { public java.util.UUID spawningEntity; public boolean shouldBurnInDay = true; - // Paper end + private static final net.minecraft.world.item.crafting.Ingredient TORCH = net.minecraft.world.item.crafting.Ingredient.of(net.minecraft.world.item.Items.TORCH, net.minecraft.world.item.Items.SOUL_TORCH); // Purpur - Phantoms burn in light public Phantom(EntityType entityType, Level level) { @@ -20,11 +19,9 @@ index 6c41a2cc9a772c216abfc2b241429ec712119bb4..eaa5f2db1bc6b01ef6a508cc5a60ff1e @Override public void aiStep() { -- if (this.isAlive() && this.shouldBurnInDay && this.isSunBurnTick()) { // Paper - shouldBurnInDay API + // Purpur start - Phantoms burn in light + boolean burnFromDaylight = this.shouldBurnInDay && this.isSunBurnTick() && this.level().purpurConfig.phantomBurnInDaylight; + boolean burnFromLightSource = this.level().purpurConfig.phantomBurnInLight > 0 && this.level().getMaxLocalRawBrightness(blockPosition()) >= this.level().purpurConfig.phantomBurnInLight; -+ if (this.isAlive() && (burnFromDaylight || burnFromLightSource)) { // Paper - shouldBurnInDay API + // Purpur end - Phantoms burn in light if (getRider() == null || !this.isControllable()) // Purpur - Ridables this.igniteForSeconds(8.0F); diff --git a/purpur-server/minecraft-patches/features/0013-Make-entity-breeding-times-configurable.patch b/purpur-server/minecraft-patches/features/0013-Make-entity-breeding-times-configurable.patch index 234b1ac10..359d1ddb3 100644 --- a/purpur-server/minecraft-patches/features/0013-Make-entity-breeding-times-configurable.patch +++ b/purpur-server/minecraft-patches/features/0013-Make-entity-breeding-times-configurable.patch @@ -36,7 +36,6 @@ index 2ce0099460c14a6dd8b128f268ee915ea4be5183..1cae770340e969ec4f037b9121142878 @@ -283,8 +284,10 @@ public abstract class Animal extends AgeableMob { player.awardStat(Stats.ANIMALS_BRED); CriteriaTriggers.BRED_ANIMALS.trigger(player, this, animal, baby); - } // Paper - Call EntityBreedEvent - this.setAge(6000); - animal.setAge(6000); + // Purpur start - Make entity breeding times configurable diff --git a/purpur-server/minecraft-patches/features/0014-Apply-display-names-from-item-forms-of-entities-to-e.patch b/purpur-server/minecraft-patches/features/0014-Apply-display-names-from-item-forms-of-entities-to-e.patch index 8b4a0c168..8e2645181 100644 --- a/purpur-server/minecraft-patches/features/0014-Apply-display-names-from-item-forms-of-entities-to-e.patch +++ b/purpur-server/minecraft-patches/features/0014-Apply-display-names-from-item-forms-of-entities-to-e.patch @@ -11,12 +11,9 @@ index fb3b4e57e98b45adb3a908ddbc2d4ac066e22034..e0489ff30373c214927f34d78787fb85 +++ b/net/minecraft/world/entity/decoration/ArmorStand.java @@ -492,6 +492,7 @@ public class ArmorStand extends LivingEntity { - private org.bukkit.event.entity.EntityDeathEvent brokenByPlayer(ServerLevel level, DamageSource damageSource) { // Paper ItemStack itemStack = new ItemStack(Items.ARMOR_STAND); + if (level.purpurConfig.persistentDroppableEntityDisplayNames) // Purpur - Apply display names from item forms of entities to entities and vice versa itemStack.set(DataComponents.CUSTOM_NAME, this.getCustomName()); - this.drops.add(new DefaultDrop(itemStack, stack -> Block.popResource(this.level(), this.blockPosition(), stack))); // CraftBukkit - add to drops // Paper - Restore vanilla drops behavior - return this.brokenByAnything(level, damageSource); // Paper diff --git a/net/minecraft/world/entity/decoration/ItemFrame.java b/net/minecraft/world/entity/decoration/ItemFrame.java index f9a97000b75db7999b1cbe1f72d680d4d7b803b7..9dfadb5639e840e69274b35f3366322141527104 100644 --- a/net/minecraft/world/entity/decoration/ItemFrame.java diff --git a/purpur-server/minecraft-patches/features/0015-Option-for-Villager-Clerics-to-farm-Nether-Wart.patch b/purpur-server/minecraft-patches/features/0015-Option-for-Villager-Clerics-to-farm-Nether-Wart.patch index fc69100b5..9851d38ba 100644 --- a/purpur-server/minecraft-patches/features/0015-Option-for-Villager-Clerics-to-farm-Nether-Wart.patch +++ b/purpur-server/minecraft-patches/features/0015-Option-for-Villager-Clerics-to-farm-Nether-Wart.patch @@ -45,7 +45,6 @@ index de89e45ecd4ac4c6db8b74bbe3dd6b4a7cf21671..f15e4cfd8c0ac5e08779dbe6b9aa40bf Block block1 = level.getBlockState(this.aboveFarmlandPos.below()).getBlock(); - if (block instanceof CropBlock && ((CropBlock)block).isMaxAge(blockState)) { + if (block instanceof CropBlock && ((CropBlock)block).isMaxAge(blockState) && !this.clericWartFarmer || this.clericWartFarmer && block == net.minecraft.world.level.block.Blocks.NETHER_WART && blockState.getValue(net.minecraft.world.level.block.NetherWartBlock.AGE) == 3) { // Purpur - Option for Villager Clerics to farm Nether Wart - if (org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(owner, this.aboveFarmlandPos, blockState.getFluidState().createLegacyBlock())) { // CraftBukkit // Paper - fix wrong block state level.destroyBlock(this.aboveFarmlandPos, true, owner); } // CraftBukkit } diff --git a/purpur-server/minecraft-patches/features/0016-Add-mobGriefing-bypass-to-everything-affected.patch b/purpur-server/minecraft-patches/features/0016-Add-mobGriefing-bypass-to-everything-affected.patch index fde7ac81b..9d389680c 100644 --- a/purpur-server/minecraft-patches/features/0016-Add-mobGriefing-bypass-to-everything-affected.patch +++ b/purpur-server/minecraft-patches/features/0016-Add-mobGriefing-bypass-to-everything-affected.patch @@ -11,7 +11,6 @@ index bdae20191d2e5765761442eb06924968e710b189..476b570ffe9d2df173bd57b57fe65372 @@ -1904,7 +1904,7 @@ public abstract class LivingEntity extends Entity implements Attackable { if (this.level() instanceof ServerLevel serverLevel) { boolean var6 = false; - if (this.dead && entitySource instanceof WitherBoss) { // Paper - if (serverLevel.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) { + if (serverLevel.purpurConfig.witherBypassMobGriefing ^ serverLevel.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) { // Purpur - Add mobGriefing bypass to everything affected BlockPos blockPos = this.blockPosition(); @@ -62,10 +61,6 @@ index 7a75415a469bc99f45a5cfaab038181717903f1d..fc244a1fbd401f6ea92e7428b9738939 +++ b/net/minecraft/world/entity/ai/goal/EatBlockGoal.java @@ -67,7 +67,7 @@ public class EatBlockGoal extends Goal { BlockPos blockPos = this.mob.blockPosition(); - final BlockState blockState = this.level.getBlockState(blockPos); // Paper - fix wrong block state - if (IS_EDIBLE.test(blockState)) { // Paper - fix wrong block state -- if (org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(this.mob, blockPos, blockState.getFluidState().createLegacyBlock(), !getServerLevel(this.level).getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING))) { // CraftBukkit // Paper - fix wrong block state -+ if (org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(this.mob, blockPos, blockState.getFluidState().createLegacyBlock(), !getServerLevel(this.level).purpurConfig.sheepBypassMobGriefing == !getServerLevel(this.level).getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING))) { // CraftBukkit // Paper - fix wrong block state // Purpur - Add mobGriefing bypass to everything affected this.level.destroyBlock(blockPos, false); } @@ -73,8 +68,6 @@ index 7a75415a469bc99f45a5cfaab038181717903f1d..fc244a1fbd401f6ea92e7428b9738939 } else { BlockPos blockPos1 = blockPos.below(); if (this.level.getBlockState(blockPos1).is(Blocks.GRASS_BLOCK)) { -- if (org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(this.mob, blockPos1, Blocks.DIRT.defaultBlockState(), !getServerLevel(this.level).getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING))) { // CraftBukkit // Paper - Fix wrong block state -+ if (org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(this.mob, blockPos1, Blocks.DIRT.defaultBlockState(), !getServerLevel(this.level).purpurConfig.sheepBypassMobGriefing == !getServerLevel(this.level).getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING))) { // CraftBukkit // Paper - Fix wrong block state // Purpur - Add mobGriefing bypass to everything affected this.level.levelEvent(2001, blockPos1, Block.getId(Blocks.GRASS_BLOCK.defaultBlockState())); this.level.setBlock(blockPos1, Blocks.DIRT.defaultBlockState(), 2); } @@ -221,9 +214,6 @@ index c200d57841304ba0d7a76fdd9a440fe9f2b25136..ff3761507f2025fd1e652afee03a18de Block block = blockState.getBlock(); if (block instanceof InfestedBlock) { // CraftBukkit start -- BlockState afterState = getServerLevel(level).getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING) ? blockState.getFluidState().createLegacyBlock() : ((InfestedBlock) block).hostStateByInfested(level.getBlockState(blockPos1)); // Paper - fix wrong block state -+ BlockState afterState = getServerLevel(level).purpurConfig.silverfishBypassMobGriefing ^ getServerLevel(level).getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING) ? blockState.getFluidState().createLegacyBlock() : ((InfestedBlock) block).hostStateByInfested(level.getBlockState(blockPos1)); // Paper - fix wrong block state // Purpur - Add mobGriefing bypass to everything affected - if (!org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(this.silverfish, blockPos1, afterState)) { // Paper - fix wrong block state continue; } diff --git a/net/minecraft/world/entity/monster/piglin/Piglin.java b/net/minecraft/world/entity/monster/piglin/Piglin.java @@ -301,8 +291,6 @@ index e81ae747fe95c22321fc69791a6509d601826fd6..77bb3aa7ff042aab6464aac55c846cb9 } private boolean cannotPickUpBanner() { -- if (!getServerLevel(this.mob).getGameRules().getBoolean(net.minecraft.world.level.GameRules.RULE_MOBGRIEFING) || !this.mob.canPickUpLoot()) return false; // Paper - respect game and entity rules for picking up items -+ if (!this.mob.level().purpurConfig.pillagerBypassMobGriefing == !getServerLevel(this.mob).getGameRules().getBoolean(net.minecraft.world.level.GameRules.RULE_MOBGRIEFING) || !this.mob.canPickUpLoot()) return false; // Paper - respect game and entity rules for picking up items // Purpur - Add mobGriefing bypass to everything affected if (!this.mob.hasActiveRaid()) { return true; } else if (this.mob.getCurrentRaid().isOver()) { @@ -313,8 +301,7 @@ index b370b955ac8636275dfada4f38a7ca10297f7dac..275eabf64977cdf262de55124c3e5f88 @@ -169,7 +169,7 @@ public class CropBlock extends VegetationBlock implements BonemealableBlock { @Override protected void entityInside(BlockState state, Level level, BlockPos pos, Entity entity, InsideBlockEffectApplier effectApplier) { - if (!new io.papermc.paper.event.entity.EntityInsideBlockEvent(entity.getBukkitEntity(), org.bukkit.craftbukkit.block.CraftBlock.at(level, pos)).callEvent()) { return; } // Paper - Add EntityInsideBlockEvent -- if (level instanceof ServerLevel serverLevel && entity instanceof Ravager && serverLevel.purpurConfig.ravagerGriefableBlocks.contains(serverLevel.getBlockState(pos).getBlock()) && org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(entity, pos, Blocks.AIR.defaultBlockState(), !serverLevel.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING))) { // CraftBukkit // Purpur - Configurable ravager griefable blocks list + if (!new - if (level instanceof ServerLevel serverLevel && entity instanceof Ravager && serverLevel.purpurConfig.ravagerGriefableBlocks.contains(serverLevel.getBlockState(pos).getBlock()) && org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(entity, pos, Blocks.AIR.defaultBlockState(), !serverLevel.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING))) { // CraftBukkit // Purpur - Configurable ravager griefable blocks list + if (level instanceof ServerLevel serverLevel && entity instanceof Ravager && serverLevel.purpurConfig.ravagerGriefableBlocks.contains(serverLevel.getBlockState(pos).getBlock()) && org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(entity, pos, Blocks.AIR.defaultBlockState(), !serverLevel.purpurConfig.ravagerBypassMobGriefing == !serverLevel.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING))) { // CraftBukkit // Purpur - Configurable ravager griefable blocks list // Purpur - Add mobGriefing bypass to everything affected serverLevel.destroyBlock(pos, true, entity); } diff --git a/purpur-server/minecraft-patches/features/0017-Add-EntityTeleportHinderedEvent.patch b/purpur-server/minecraft-patches/features/0017-Add-EntityTeleportHinderedEvent.patch index b550e197f..9511cf127 100644 --- a/purpur-server/minecraft-patches/features/0017-Add-EntityTeleportHinderedEvent.patch +++ b/purpur-server/minecraft-patches/features/0017-Add-EntityTeleportHinderedEvent.patch @@ -21,9 +21,7 @@ index 68914268ca9350a6c1d794e011e1f9a8aecd609c..8e53b45dbf740de6c6fe499ef424d11b --- a/net/minecraft/world/level/block/EndGatewayBlock.java +++ b/net/minecraft/world/level/block/EndGatewayBlock.java @@ -99,6 +99,13 @@ public class EndGatewayBlock extends BaseEntityBlock implements Portal { - org.bukkit.event.entity.EntityPortalEnterEvent event = new org.bukkit.event.entity.EntityPortalEnterEvent(entity.getBukkitEntity(), org.bukkit.craftbukkit.util.CraftLocation.toBukkit(pos, level), org.bukkit.PortalType.END_GATEWAY); // Paper - add portal type if (!event.callEvent()) return; - // Paper end - call EntityPortalEnterEvent + // Purpur start - Add EntityTeleportHinderedEvent + if (level.purpurConfig.imposeTeleportRestrictionsOnGateways && (entity.isVehicle() || entity.isPassenger())) { + if (!new org.purpurmc.purpur.event.entity.EntityTeleportHinderedEvent(entity.getBukkitEntity(), entity.isPassenger() ? org.purpurmc.purpur.event.entity.EntityTeleportHinderedEvent.Reason.IS_PASSENGER : org.purpurmc.purpur.event.entity.EntityTeleportHinderedEvent.Reason.IS_VEHICLE, org.bukkit.event.player.PlayerTeleportEvent.TeleportCause.END_GATEWAY).callEvent()) { @@ -40,8 +38,7 @@ index cf2b105c98a3b22b9bea59cbafcd598657dc92b5..65d3477ed32c3f0db58aab6ab87d8f17 +++ b/net/minecraft/world/level/block/EndPortalBlock.java @@ -59,6 +59,13 @@ public class EndPortalBlock extends BaseEntityBlock implements Portal { protected void entityInside(BlockState state, Level level, BlockPos pos, Entity entity, InsideBlockEffectApplier effectApplier) { - if (!new io.papermc.paper.event.entity.EntityInsideBlockEvent(entity.getBukkitEntity(), org.bukkit.craftbukkit.block.CraftBlock.at(level, pos)).callEvent()) { return; } // Paper - Add EntityInsideBlockEvent - if (entity.canUsePortal(false)) { + if (!new if (entity.canUsePortal(false)) { + // Purpur start - Add EntityTeleportHinderedEvent + if (level.purpurConfig.imposeTeleportRestrictionsOnEndPortals && (entity.isVehicle() || entity.isPassenger())) { + if (!new org.purpurmc.purpur.event.entity.EntityTeleportHinderedEvent(entity.getBukkitEntity(), entity.isPassenger() ? org.purpurmc.purpur.event.entity.EntityTeleportHinderedEvent.Reason.IS_PASSENGER : org.purpurmc.purpur.event.entity.EntityTeleportHinderedEvent.Reason.IS_VEHICLE, org.bukkit.event.player.PlayerTeleportEvent.TeleportCause.END_PORTAL).callEvent()) { @@ -50,7 +47,6 @@ index cf2b105c98a3b22b9bea59cbafcd598657dc92b5..65d3477ed32c3f0db58aab6ab87d8f17 + } + // Purpur end - Add EntityTeleportHinderedEvent // CraftBukkit start - Entity in portal - org.bukkit.event.entity.EntityPortalEnterEvent event = new org.bukkit.event.entity.EntityPortalEnterEvent(entity.getBukkitEntity(), org.bukkit.craftbukkit.util.CraftLocation.toBukkit(pos, level), org.bukkit.PortalType.ENDER); // Paper - add portal type level.getCraftServer().getPluginManager().callEvent(event); diff --git a/net/minecraft/world/level/block/NetherPortalBlock.java b/net/minecraft/world/level/block/NetherPortalBlock.java index fa0d6baa40c6052c993d870d124af911e8621f0a..1c58af94050b75cd8f405a201448c822792e594a 100644 @@ -58,8 +54,7 @@ index fa0d6baa40c6052c993d870d124af911e8621f0a..1c58af94050b75cd8f405a201448c822 +++ b/net/minecraft/world/level/block/NetherPortalBlock.java @@ -118,6 +118,13 @@ public class NetherPortalBlock extends Block implements Portal { protected void entityInside(BlockState state, Level level, BlockPos pos, Entity entity, InsideBlockEffectApplier effectApplier) { - if (!new io.papermc.paper.event.entity.EntityInsideBlockEvent(entity.getBukkitEntity(), org.bukkit.craftbukkit.block.CraftBlock.at(level, pos)).callEvent()) { return; } // Paper - Add EntityInsideBlockEvent - if (entity.canUsePortal(false)) { + if (!new if (entity.canUsePortal(false)) { + // Purpur start - Add EntityTeleportHinderedEvent + if (level.purpurConfig.imposeTeleportRestrictionsOnNetherPortals && (entity.isVehicle() || entity.isPassenger())) { + if (!new org.purpurmc.purpur.event.entity.EntityTeleportHinderedEvent(entity.getBukkitEntity(), entity.isPassenger() ? org.purpurmc.purpur.event.entity.EntityTeleportHinderedEvent.Reason.IS_PASSENGER : org.purpurmc.purpur.event.entity.EntityTeleportHinderedEvent.Reason.IS_VEHICLE, org.bukkit.event.player.PlayerTeleportEvent.TeleportCause.NETHER_PORTAL).callEvent()) { @@ -68,5 +63,4 @@ index fa0d6baa40c6052c993d870d124af911e8621f0a..1c58af94050b75cd8f405a201448c822 + } + // Purpur end - Add EntityTeleportHinderedEvent // CraftBukkit start - Entity in portal - org.bukkit.event.entity.EntityPortalEnterEvent event = new org.bukkit.event.entity.EntityPortalEnterEvent(entity.getBukkitEntity(), org.bukkit.craftbukkit.util.CraftLocation.toBukkit(pos, level), org.bukkit.PortalType.NETHER); // Paper - add portal type level.getCraftServer().getPluginManager().callEvent(event); diff --git a/purpur-server/minecraft-patches/features/0018-Toggle-for-water-sensitive-mob-damage.patch b/purpur-server/minecraft-patches/features/0018-Toggle-for-water-sensitive-mob-damage.patch index 8abe2c0c0..95203d883 100644 --- a/purpur-server/minecraft-patches/features/0018-Toggle-for-water-sensitive-mob-damage.patch +++ b/purpur-server/minecraft-patches/features/0018-Toggle-for-water-sensitive-mob-damage.patch @@ -45,7 +45,6 @@ index afe7fd92348e6a2a26f8f258373b0c57bb5f4f3f..8da974e98f2207d76e8962eda54c75d0 --- a/net/minecraft/world/entity/animal/Bee.java +++ b/net/minecraft/world/entity/animal/Bee.java @@ -181,7 +181,7 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { - // Paper end - Fix MC-167279 this.lookControl = new Bee.BeeLookControl(this); this.setPathfindingMalus(PathType.DANGER_FIRE, -1.0F); - if (this.level().purpurConfig.beeCanInstantlyStartDrowning) this.setPathfindingMalus(PathType.WATER, -1.0F); // Purpur - bee can instantly start drowning in water option diff --git a/purpur-server/minecraft-patches/features/0019-API-for-any-mob-to-burn-daylight.patch b/purpur-server/minecraft-patches/features/0019-API-for-any-mob-to-burn-daylight.patch index fb40c66db..1500c32f8 100644 --- a/purpur-server/minecraft-patches/features/0019-API-for-any-mob-to-burn-daylight.patch +++ b/purpur-server/minecraft-patches/features/0019-API-for-any-mob-to-burn-daylight.patch @@ -39,9 +39,6 @@ index 476b570ffe9d2df173bd57b57fe65372cb35fa1d..4586d7afb4f0a27c7d61abb80af24205 --- a/net/minecraft/world/entity/LivingEntity.java +++ b/net/minecraft/world/entity/LivingEntity.java @@ -273,6 +273,7 @@ public abstract class LivingEntity extends Entity implements Attackable { - public boolean silentDeath = false; // Paper - mark entity as dying silently for cancellable death event - public net.kyori.adventure.util.TriState frictionState = net.kyori.adventure.util.TriState.NOT_SET; // Paper - Friction API - public int shieldBlockingDelay = this.level().paperConfig().misc.shieldBlockingDelay; // Paper - Make shield blocking delay configurable + protected boolean shouldBurnInDay = false; public boolean shouldBurnInDay() { return this.shouldBurnInDay; } public void setShouldBurnInDay(boolean shouldBurnInDay) { this.shouldBurnInDay = shouldBurnInDay; } // Purpur - API for any mob to burn daylight // CraftBukkit end @@ -55,7 +52,6 @@ index 476b570ffe9d2df173bd57b57fe65372cb35fa1d..4586d7afb4f0a27c7d61abb80af24205 this.lastHurtByPlayer.store(compound, "last_hurt_by_player"); compound.putInt("last_hurt_by_player_memory_time", this.lastHurtByPlayerMemoryTime); @@ -891,6 +893,7 @@ public abstract class LivingEntity extends Entity implements Attackable { - } // Paper - The sleeping pos will always also set the actual pos, so a desync suggests something is wrong }, this::clearSleepingPos); compound.getCompound("Brain").ifPresent(compoundTag -> this.brain = this.makeBrain(new Dynamic<>(NbtOps.INSTANCE, compoundTag))); + this.shouldBurnInDay = compound.getBooleanOr("Purpur.ShouldBurnInDay", false); // Purpur - API for any mob to burn daylight @@ -69,7 +65,6 @@ index 476b570ffe9d2df173bd57b57fe65372cb35fa1d..4586d7afb4f0a27c7d61abb80af24205 + + // Purpur start - copied from Zombie - API for any mob to burn daylight + if (this.isAlive()) { -+ boolean flag = this.shouldBurnInDay() && this.isSunBurnTick(); // Paper - shouldBurnInDay API // Purpur - use shouldBurnInDay() method to handle Phantoms properly - API for any mob to burn daylight + if (flag) { + ItemStack itemBySlot = this.getItemBySlot(EquipmentSlot.HEAD); + if (!itemBySlot.isEmpty()) { @@ -129,8 +124,6 @@ index 0a5de00d41c59528e9f85a7cf82363c45e24d2bc..185edd9878f5193c44b75a126e8182ca AbstractSkeleton.this.setAggressive(true); } }; -- private boolean shouldBurnInDay = true; // Paper - shouldBurnInDay API -+ //private boolean shouldBurnInDay = true; // Paper - shouldBurnInDay API // Purpur - moved to LivingEntity; keep methods for ABI compatibility - API for any mob to burn daylight protected AbstractSkeleton(EntityType entityType, Level level) { super(entityType, level); @@ -143,7 +136,6 @@ index 0a5de00d41c59528e9f85a7cf82363c45e24d2bc..185edd9878f5193c44b75a126e8182ca @Override public void aiStep() { -- boolean isSunBurnTick = this.shouldBurnInDay && this.isSunBurnTick(); // Paper - shouldBurnInDay API - if (isSunBurnTick) { - ItemStack itemBySlot = this.getItemBySlot(EquipmentSlot.HEAD); - if (!itemBySlot.isEmpty()) { @@ -172,19 +164,8 @@ index 0a5de00d41c59528e9f85a7cf82363c45e24d2bc..185edd9878f5193c44b75a126e8182ca public void readAdditionalSaveData(CompoundTag compound) { super.readAdditionalSaveData(compound); this.reassessWeaponGoal(); -- this.shouldBurnInDay = compound.getBooleanOr("Paper.ShouldBurnInDay", true); // Paper - shouldBurnInDay API -+ //this.shouldBurnInDay = compound.getBooleanOr("Paper.ShouldBurnInDay", true); // Paper - shouldBurnInDay API // Purpur - implemented in LivingEntity - API for any mob to burn daylight } - // Paper start - shouldBurnInDay API - @Override - public void addAdditionalSaveData(final net.minecraft.nbt.CompoundTag nbt) { - super.addAdditionalSaveData(nbt); -- nbt.putBoolean("Paper.ShouldBurnInDay", this.shouldBurnInDay); -+ //nbt.putBoolean("Paper.ShouldBurnInDay", this.shouldBurnInDay); // Purpur - implemented in LivingEntity - API for any mob to burn daylight - } - // Paper end - shouldBurnInDay API - diff --git a/net/minecraft/world/entity/monster/Husk.java b/net/minecraft/world/entity/monster/Husk.java index 9baec22561093d64157d93449e84c23b3f238b39..3f331215ef49c52fa3a53bcf744159d2221111f5 100644 --- a/net/minecraft/world/entity/monster/Husk.java @@ -242,7 +223,6 @@ index 409e98d0981aa8be0d35bc5c93f7130a9ce16860..c2bc638b0029ac46cf388187ca745450 - // Purpur start - Phantoms burn in light - boolean burnFromDaylight = this.shouldBurnInDay && this.isSunBurnTick() && this.level().purpurConfig.phantomBurnInDaylight; - boolean burnFromLightSource = this.level().purpurConfig.phantomBurnInLight > 0 && this.level().getMaxLocalRawBrightness(blockPosition()) >= this.level().purpurConfig.phantomBurnInLight; -- if (this.isAlive() && (burnFromDaylight || burnFromLightSource)) { // Paper - shouldBurnInDay API - // Purpur end - Phantoms burn in light - if (getRider() == null || !this.isControllable()) // Purpur - Ridables - this.igniteForSeconds(8.0F); @@ -252,24 +232,6 @@ index 409e98d0981aa8be0d35bc5c93f7130a9ce16860..c2bc638b0029ac46cf388187ca745450 super.aiStep(); } -@@ -294,7 +297,7 @@ public class Phantom extends FlyingMob implements Enemy { - this.setPhantomSize(compound.getIntOr("size", 0)); - // Paper start - this.spawningEntity = compound.read("Paper.SpawningEntity", net.minecraft.core.UUIDUtil.CODEC).orElse(null); -- this.shouldBurnInDay = compound.getBooleanOr("Paper.ShouldBurnInDay", true); -+ //this.shouldBurnInDay = compound.getBooleanOr("Paper.ShouldBurnInDay", true); // Purpur - implemented in LivingEntity - API for any mob to burn daylight - // Paper end - } - -@@ -305,7 +308,7 @@ public class Phantom extends FlyingMob implements Enemy { - compound.putInt("size", this.getPhantomSize()); - // Paper start - compound.storeNullable("Paper.SpawningEntity", net.minecraft.core.UUIDUtil.CODEC, this.spawningEntity); -- compound.putBoolean("Paper.ShouldBurnInDay", this.shouldBurnInDay); -+ //compound.putBoolean("Paper.ShouldBurnInDay", this.shouldBurnInDay); // Purpur - implemented in LivingEntity - API for any mob to burn daylight - // Paper end - } - diff --git a/net/minecraft/world/entity/monster/Zombie.java b/net/minecraft/world/entity/monster/Zombie.java index 7f9ee637f443f55ae901d1a0aebedd8f7411996d..aed6db357f5b4550407a424a5b83c590044568ee 100644 --- a/net/minecraft/world/entity/monster/Zombie.java @@ -278,12 +240,9 @@ index 7f9ee637f443f55ae901d1a0aebedd8f7411996d..aed6db357f5b4550407a424a5b83c590 private boolean canBreakDoors = false; private int inWaterTime = 0; public int conversionTime; -- private boolean shouldBurnInDay = true; // Paper - Add more Zombie API -+ //private boolean shouldBurnInDay = true; // Paper - Add more Zombie API // Purpur - implemented in LivingEntity - API for any mob to burn daylight public Zombie(EntityType entityType, Level level) { super(entityType, level); - this.breakDoorGoal = new BreakDoorGoal(this, com.google.common.base.Predicates.in(level.paperConfig().entities.behavior.doorBreakingDifficulty.getOrDefault(entityType, level.paperConfig().entities.behavior.doorBreakingDifficulty.get(EntityType.ZOMBIE)))); // Paper - Configurable door breaking difficulty + this.setShouldBurnInDay(true); // Purpur - API for any mob to burn daylight } @@ -325,14 +284,11 @@ index 7f9ee637f443f55ae901d1a0aebedd8f7411996d..aed6db357f5b4550407a424a5b83c590 + public boolean shouldBurnInDay() { return this.isSunSensitive(); } // Purpur - for ABI compatibility - API for any mob to burn daylight public boolean isSunSensitive() { - return this.shouldBurnInDay; // Paper - Add more Zombie API } @@ -512,7 +492,7 @@ public class Zombie extends Monster { compound.putBoolean("CanBreakDoors", this.canBreakDoors()); compound.putInt("InWaterTime", this.isInWater() ? this.inWaterTime : -1); compound.putInt("DrownedConversionTime", this.isUnderWaterConverting() ? this.conversionTime : -1); -- compound.putBoolean("Paper.ShouldBurnInDay", this.shouldBurnInDay); // Paper - Add more Zombie API -+ //compound.putBoolean("Paper.ShouldBurnInDay", this.shouldBurnInDay); // Paper - Add more Zombie API // Purpur - implemented in LivingEntity - API for any mob to burn daylight } @Override @@ -340,8 +296,6 @@ index 7f9ee637f443f55ae901d1a0aebedd8f7411996d..aed6db357f5b4550407a424a5b83c590 } else { this.getEntityData().set(DATA_DROWNED_CONVERSION_ID, false); } -- this.shouldBurnInDay = compound.getBooleanOr("Paper.ShouldBurnInDay", true); // Paper - Add more Zombie API -+ //this.shouldBurnInDay = compound.getBooleanOr("Paper.ShouldBurnInDay", true); // Paper - Add more Zombie API // Purpur - implemented in LivingEntity - API for any mob to burn daylight } @Override diff --git a/purpur-server/minecraft-patches/sources/io/papermc/paper/entity/activation/ActivationRange.java.patch b/purpur-server/minecraft-patches/sources/io/papermc/paper/entity/activation/ActivationRange.java.patch deleted file mode 100644 index cca45cce0..000000000 --- a/purpur-server/minecraft-patches/sources/io/papermc/paper/entity/activation/ActivationRange.java.patch +++ /dev/null @@ -1,19 +0,0 @@ ---- a/io/papermc/paper/entity/activation/ActivationRange.java -+++ b/io/papermc/paper/entity/activation/ActivationRange.java -@@ -141,6 +_,8 @@ - continue; - } - -+ if (!player.level().purpurConfig.idleTimeoutTickNearbyEntities && player.isAfk()) continue; // Purpur - AFK API -+ - final int worldHeight = world.getHeight(); - ActivationRange.maxBB = player.getBoundingBox().inflate(maxRange, worldHeight, maxRange); - ActivationType.MISC.boundingBox = player.getBoundingBox().inflate(miscActivationRange, worldHeight, miscActivationRange); -@@ -282,6 +_,7 @@ - * @return - */ - public static boolean checkIfActive(final Entity entity) { -+ if (entity.level().purpurConfig.squidImmuneToEAR && entity instanceof net.minecraft.world.entity.animal.Squid) return true; // Purpur - Squid EAR immunity - // Never safe to skip fireworks or item gravity - if (entity instanceof FireworkRocketEntity || (entity instanceof ItemEntity && (entity.tickCount + entity.getId()) % 4 == 0)) { // Needed for item gravity, see ItemEntity tick - return true; diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/CrashReport.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/CrashReport.java.patch index 52cafd0d1..4f0e90bf6 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/CrashReport.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/CrashReport.java.patch @@ -4,10 +4,9 @@ private boolean trackingStackTrace = true; private StackTraceElement[] uncategorizedStackTrace = new StackTraceElement[0]; private final SystemReport systemReport = new SystemReport(); -+ private List extraInfo = List.of("", "DO NOT REPORT THIS TO PAPER! REPORT TO PURPUR INSTEAD!", ""); // Purpur - Rebrand ++ private List extraInfo = List.of("", "DO NOT REPORT THIS TO SPIGOT! REPORT TO PURPUR INSTEAD!", ""); // Purpur - Rebrand public CrashReport(String title, Throwable exception) { - io.papermc.paper.util.StacktraceDeobfuscator.INSTANCE.deobfuscateThrowable(exception); // Paper @@ -130,7 +_,7 @@ } diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/commands/CommandSourceStack.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/commands/CommandSourceStack.java.patch index cfbdec120..0403bd15c 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/commands/CommandSourceStack.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/commands/CommandSourceStack.java.patch @@ -11,7 +11,7 @@ + } + net.kyori.adventure.text.Component permissionMessage = getLevel().getServer().server.permissionMessage(); + if (!permissionMessage.equals(net.kyori.adventure.text.Component.empty())) { -+ sendFailure(io.papermc.paper.adventure.PaperAdventure.asVanilla(permissionMessage.replaceText(net.kyori.adventure.text.TextReplacementConfig.builder().matchLiteral("").replacement(bukkitPermission).build()))); ++ sendFailure(org.purpurmc.purpur.adventure.PurpurAdventure.asVanilla(permissionMessage.replaceText(net.kyori.adventure.text.TextReplacementConfig.builder().matchLiteral("").replacement(bukkitPermission).build()))); + } + return false; + } @@ -45,7 +45,7 @@ + if (message == null) { + return; + } -+ sendSuccess(() -> io.papermc.paper.adventure.PaperAdventure.asVanilla(message), broadcastToOps); ++ sendSuccess(() -> org.purpurmc.purpur.adventure.PurpurAdventure.asVanilla(message), broadcastToOps); + } + // Purpur end - Purpur config files diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/commands/Commands.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/commands/Commands.java.patch index bcd3caac9..378210cc6 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/commands/Commands.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/commands/Commands.java.patch @@ -26,8 +26,6 @@ if (selection.includeIntegrated) { @@ -502,6 +_,7 @@ private void runSync(ServerPlayer player, java.util.Collection bukkit, RootCommandNode rootCommandNode) { - // Paper end - Perf: Async command map building - new com.destroystokyo.paper.event.brigadier.AsyncPlayerSendCommandsEvent(player.getBukkitEntity(), (RootCommandNode) rootCommandNode, true).callEvent(); // Paper - Brigadier API + if (org.bukkit.event.player.PlayerCommandSendEvent.getHandlerList().getRegisteredListeners().length > 0) { // Purpur - Skip events if there's no listeners org.bukkit.event.player.PlayerCommandSendEvent event = new org.bukkit.event.player.PlayerCommandSendEvent(player.getBukkitEntity(), new java.util.LinkedHashSet<>(bukkit)); event.getPlayer().getServer().getPluginManager().callEvent(event); diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/core/BlockPos.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/core/BlockPos.java.patch index 8b669b1d6..ebe5a6261 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/core/BlockPos.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/core/BlockPos.java.patch @@ -1,8 +1,6 @@ --- a/net/minecraft/core/BlockPos.java +++ b/net/minecraft/core/BlockPos.java @@ -63,6 +_,12 @@ - public static final int MAX_HORIZONTAL_COORDINATE = 33554431; - // Paper end - Optimize Bit Operations by inlining + // Purpur start - Ridables + public BlockPos(net.minecraft.world.entity.Entity entity) { diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/core/dispenser/EquipmentDispenseItemBehavior.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/core/dispenser/EquipmentDispenseItemBehavior.java.patch index 9a2c1e083..f01dc5d3c 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/core/dispenser/EquipmentDispenseItemBehavior.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/core/dispenser/EquipmentDispenseItemBehavior.java.patch @@ -6,6 +6,5 @@ LivingEntity livingEntity = entitiesOfClass.getFirst(); - EquipmentSlot equipmentSlotForItem = livingEntity.getEquipmentSlotForItem(item); + EquipmentSlot equipmentSlotForItem = blockSource.level().purpurConfig.dispenserApplyCursedArmor ? livingEntity.getEquipmentSlotForItem(item) : livingEntity.getEquipmentSlotForDispenserItem(item); if (equipmentSlotForItem == null) return false; // Purpur - Dispenser curse of binding protection - ItemStack itemStack = item.copyWithCount(1); // Paper - shrink below and single item in event // CraftBukkit start net.minecraft.world.level.Level world = blockSource.level(); diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/network/Connection.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/network/Connection.java.patch deleted file mode 100644 index ac6b9a64d..000000000 --- a/purpur-server/minecraft-patches/sources/net/minecraft/network/Connection.java.patch +++ /dev/null @@ -1,23 +0,0 @@ ---- a/net/minecraft/network/Connection.java -+++ b/net/minecraft/network/Connection.java -@@ -588,11 +_,20 @@ - private static final int MAX_PER_TICK = io.papermc.paper.configuration.GlobalConfiguration.get().misc.maxJoinsPerTick; // Paper - Buffer joins to world - private static int joinAttemptsThisTick; // Paper - Buffer joins to world - private static int currTick; // Paper - Buffer joins to world -+ private static int tickSecond; // Purpur - Max joins per second - public void tick() { - this.flushQueue(); - // Paper start - Buffer joins to world - if (Connection.currTick != net.minecraft.server.MinecraftServer.currentTick) { - Connection.currTick = net.minecraft.server.MinecraftServer.currentTick; -+ // Purpur start - Max joins per second -+ if (org.purpurmc.purpur.PurpurConfig.maxJoinsPerSecond) { -+ if (++Connection.tickSecond > 20) { -+ Connection.tickSecond = 0; -+ Connection.joinAttemptsThisTick = 0; -+ } -+ } else -+ // Purpur end - Max joins per second - Connection.joinAttemptsThisTick = 0; - } - // Paper end - Buffer joins to world diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/network/chat/SignedMessageChain.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/network/chat/SignedMessageChain.java.patch index 60c29bda0..3d88a2c96 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/network/chat/SignedMessageChain.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/network/chat/SignedMessageChain.java.patch @@ -7,5 +7,4 @@ - } else if (body.timeStamp().isBefore(SignedMessageChain.this.lastTimeStamp)) { + } else if (org.purpurmc.purpur.PurpurConfig.kickForOutOfOrderChat && body.timeStamp().isBefore(SignedMessageChain.this.lastTimeStamp)) { // Purpur - Option to disable kick for out of order chat this.setChainBroken(); - throw new SignedMessageChain.DecodeException(SignedMessageChain.DecodeException.OUT_OF_ORDER_CHAT, org.bukkit.event.player.PlayerKickEvent.Cause.OUT_OF_ORDER_CHAT); // Paper - kick event causes } else { diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/server/Main.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/server/Main.java.patch index 16550b7e6..02d0315b8 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/server/Main.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/server/Main.java.patch @@ -5,11 +5,10 @@ } + // Purpur start - Add toggle for enchant level clamping - load config files early -+ org.bukkit.configuration.file.YamlConfiguration purpurConfiguration = io.papermc.paper.configuration.PaperConfigurations.loadLegacyConfigFile((File) optionSet.valueOf("purpur-settings")); ++ org.bukkit.configuration.file.YamlConfiguration purpurConfiguration = org.purpurmc.purpur.configuration.PurpurConfigurations.loadLegacyConfigFile((File) optionSet.valueOf("purpur-settings")); + org.purpurmc.purpur.PurpurConfig.clampEnchantLevels = purpurConfiguration.getBoolean("settings.enchantment.clamp-levels", true); + org.purpurmc.purpur.PurpurConfig.registerMinecraftDebugCommands = purpurConfiguration.getBoolean("settings.register-minecraft-debug-commands"); // Purpur - register minecraft debug commands + // Purpur end - Add toggle for enchant level clamping - load config files early + - io.papermc.paper.plugin.PluginInitializerManager.load(optionSet); // Paper - Bootstrap.bootStrap(); + Bootstrap.bootStrap(); Bootstrap.validate(); diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/server/MinecraftServer.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/server/MinecraftServer.java.patch index d8bcaa293..d53cff733 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/server/MinecraftServer.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/server/MinecraftServer.java.patch @@ -3,24 +3,15 @@ @@ -283,6 +_,7 @@ public joptsimple.OptionSet options; public org.bukkit.command.ConsoleCommandSender console; - public static int currentTick; // Paper - improve tick loop + public static final long startTimeMillis = System.currentTimeMillis(); // Purpur - Add uptime command public java.util.Queue processQueue = new java.util.concurrent.ConcurrentLinkedQueue(); public int autosavePeriod; - // Paper - don't store the vanilla dispatcher @@ -293,7 +_,7 @@ public static final int TICK_TIME = 1000000000 / MinecraftServer.TPS; - private static final int SAMPLE_INTERVAL = 20; // Paper - improve server tick loop - @Deprecated(forRemoval = true) // Paper - public final double[] recentTps = new double[3]; + public final double[] recentTps = new double[4]; // Purpur - Add 5 second tps average in /tps // Spigot end - public volatile boolean hasFullyShutdown; // Paper - Improved watchdog support - public volatile boolean abnormalExit; // Paper - Improved watchdog support @@ -302,6 +_,8 @@ - public boolean isIteratingOverLevels = false; // Paper - Throw exception on world create while being ticked - private final Set pluginsBlockingSleep = new java.util.HashSet<>(); // Paper - API to allow/disallow tick sleeping - public static final long SERVER_INIT = System.nanoTime(); // Paper - Lag compensation + public boolean lagging = false; // Purpur - Lagging threshold + protected boolean upnp = false; // Purpur - UPnP Port Forwarding @@ -29,7 +20,6 @@ @@ -917,6 +_,15 @@ LOGGER.info("Stopping server"); - Commands.COMMAND_SENDING_POOL.shutdownNow(); // Paper - Perf: Async command map building; Shutdown and don't bother finishing + // Purpur start - UPnP Port Forwarding + if (upnp) { + if (dev.omega24.upnp4j.UPnP4J.close(this.getPort(), dev.omega24.upnp4j.util.Protocol.TCP)) { @@ -41,7 +31,6 @@ + // Purpur end - UPnP Port Forwarding // CraftBukkit start if (this.server != null) { - this.server.spark.disable(); // Paper - spark @@ -1011,6 +_,8 @@ this.safeShutdown(waitForServer, false); } @@ -49,9 +38,7 @@ + org.purpurmc.purpur.task.BossBarTask.stopAll(); // Purpur - Implement TPSBar + org.purpurmc.purpur.task.BeehiveTask.instance().unregister(); // Purpur - Give bee counts in beehives to Purpur clients this.isRestarting = isRestarting; - this.hasLoggedStop = true; // Paper - Debugging - if (isDebugging()) io.papermc.paper.util.TraceUtil.dumpTraceForThread("Server stopped"); // Paper - Debugging -@@ -1030,6 +_,7 @@ + if (isDebugging()) @@ -1030,6 +_,7 @@ private static final long MAX_CATCHUP_BUFFER = TICK_TIME * TPS * 60L; private long lastTick = 0; private long catchupTime = 0; @@ -61,7 +48,6 @@ public final RollingAverage tps15 = new RollingAverage(60 * 15); @@ -1115,6 +_,16 @@ } - // Paper end - Add onboarding message for initial server start + // Purpur start - config for startup commands + if (!Boolean.getBoolean("Purpur.IReallyDontWantStartupCommands") && !org.purpurmc.purpur.PurpurConfig.startupCommands.isEmpty()) { @@ -98,7 +84,6 @@ + lagging = recentTps[0] < org.purpurmc.purpur.PurpurConfig.laggingThreshold; // Purpur - Lagging threshold tickSection = currentTime; } - // Paper end - further improve server tick loop @@ -1171,6 +_,12 @@ profilerFiller.popPush("nextTickWait"); this.mayHaveDelayedTasks = true; @@ -125,8 +110,6 @@ @DontObfuscate public String getServerModName() { -- return io.papermc.paper.ServerBuildInfo.buildInfo().brandName(); // Paper -+ return org.purpurmc.purpur.PurpurConfig.serverModName; // Paper // Purpur - Configurable server mod name } public SystemReport fillSystemReport(SystemReport systemReport) { diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/server/PlayerAdvancements.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/server/PlayerAdvancements.java.patch index 423015dc4..64b5e3960 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/server/PlayerAdvancements.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/server/PlayerAdvancements.java.patch @@ -8,11 +8,3 @@ LOGGER.warn("Ignored advancement '{}' in progress file {} - it doesn't exist anymore?", path, this.playerSavePath); } else { this.startProgress(advancementHolder, progress); -@@ -195,6 +_,7 @@ - advancement.value().display().ifPresent(displayInfo -> { - // Paper start - Add Adventure message to PlayerAdvancementDoneEvent - if (event.message() != null && this.player.serverLevel().getGameRules().getBoolean(GameRules.RULE_ANNOUNCE_ADVANCEMENTS)) { -+ if (org.purpurmc.purpur.PurpurConfig.advancementOnlyBroadcastToAffectedPlayer) this.player.sendMessage(message); else // Purpur - Configurable broadcast settings - this.playerList.broadcastSystemMessage(io.papermc.paper.adventure.PaperAdventure.asVanilla(event.message()), false); - // Paper end - } diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/server/dedicated/DedicatedServer.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/server/dedicated/DedicatedServer.java.patch index 696d6b2f1..47d74f0fa 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/server/dedicated/DedicatedServer.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/server/dedicated/DedicatedServer.java.patch @@ -3,15 +3,10 @@ @@ -105,6 +_,7 @@ public void run() { if (!org.bukkit.craftbukkit.Main.useConsole) return; // CraftBukkit - // Paper start - Use TerminalConsoleAppender + if (DedicatedServer.this.gui == null || System.console() != null) // Purpur - GUI Improvements - has no GUI or has console (did not double-click) - new com.destroystokyo.paper.console.PaperConsole(DedicatedServer.this).start(); /* BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in, StandardCharsets.UTF_8)); @@ -183,6 +_,15 @@ - io.papermc.paper.command.PaperCommands.registerCommands(this); // Paper - setup /paper command - this.server.spark.registerCommandBeforePlugins(this.server); // Paper - spark - com.destroystokyo.paper.Metrics.PaperMetrics.startMetrics(); // Paper - start metrics + /*// Purpur start - Purpur config files // Purpur - Configurable void damage height and damage + try { + org.purpurmc.purpur.PurpurConfig.init((java.io.File) options.valueOf("purpur-settings")); @@ -21,11 +16,9 @@ + } + org.purpurmc.purpur.PurpurConfig.registerCommands(); + */// Purpur end - Purpur config files // Purpur - Configurable void damage height and damage - com.destroystokyo.paper.VersionHistoryManager.INSTANCE.getClass(); // Paper - load version history now this.setPvpAllowed(properties.pvp); @@ -230,6 +_,30 @@ - if (true) throw new IllegalStateException("Failed to bind to port", var10); // Paper - Propagate failed to bind to port error return false; } + // Purpur start - UPnP Port Forwarding diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/server/gui/MinecraftServerGui.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/server/gui/MinecraftServerGui.java.patch index 910e0b882..520e16073 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/server/gui/MinecraftServerGui.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/server/gui/MinecraftServerGui.java.patch @@ -24,7 +24,6 @@ @@ -54,7 +_,7 @@ jFrame.setLocationRelativeTo(null); jFrame.setVisible(true); - // Paper start - Improve ServerGUI - jFrame.setName("Minecraft server"); + jFrame.setName("Purpur Minecraft server"); // Purpur - Improve GUI try { @@ -95,7 +94,6 @@ @@ -159,7 +_,7 @@ } - private static final java.util.regex.Pattern ANSI = java.util.regex.Pattern.compile("\\e\\[[\\d;]*[^\\d;]"); // CraftBukkit // Paper - public void print(JTextArea textArea, JScrollPane scrollPane, String line) { + public void print(org.purpurmc.purpur.gui.JColorTextPane textArea, JScrollPane scrollPane, String line) { // Purpur - GUI Improvements if (!SwingUtilities.isEventDispatchThread()) { @@ -131,5 +129,4 @@ + } + // Purpur end - GUI Improvements - // Paper start - Add onboarding message for initial server start private JComponent buildOnboardingPanel() { diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/server/gui/StatsComponent.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/server/gui/StatsComponent.java.patch index a082bca56..b3deeba30 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/server/gui/StatsComponent.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/server/gui/StatsComponent.java.patch @@ -6,6 +6,5 @@ this.msgs[1] = "Avg tick: " + DECIMAL_FORMAT.format((double)this.server.getAverageTickTimeNanos() / TimeUtil.NANOSECONDS_PER_MILLISECOND) + " ms"; - this.msgs[2] = "TPS from last 1m, 5m, 15m: " + String.join(", ", tpsAvg); + this.msgs[2] = "TPS from last 5s, 1m, 5m, 15m: " + String.join(", ", tpsAvg); // Purpur - Add 5 second tps average in /tps - // Paper end - Improve ServerGUI this.values[this.vp++ & 0xFF] = (int)(l * 100L / Runtime.getRuntime().maxMemory()); this.repaint(); diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/server/level/ServerLevel.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/server/level/ServerLevel.java.patch index 3cbe73dea..70708dffd 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/server/level/ServerLevel.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/server/level/ServerLevel.java.patch @@ -42,14 +42,12 @@ + this.preciseTime = this.serverLevelData.getDayTime(); // Purpur - Configurable daylight cycle } - // Paper start @@ -477,7 +_,7 @@ } int _int = this.getGameRules().getInt(GameRules.RULE_PLAYERS_SLEEPING_PERCENTAGE); - if (this.sleepStatus.areEnoughSleeping(_int) && this.sleepStatus.areEnoughDeepSleeping(_int, this.players)) { + if (this.purpurConfig.playersSkipNight && this.sleepStatus.areEnoughSleeping(_int) && this.sleepStatus.areEnoughDeepSleeping(_int, this.players)) { // Purpur - Config for skipping night - // Paper start - create time skip event - move up calculations final long newDayTime = this.levelData.getDayTime() + 24000L; org.bukkit.event.world.TimeSkipEvent event = new org.bukkit.event.world.TimeSkipEvent( @@ -594,6 +_,13 @@ @@ -90,7 +88,6 @@ public void tickCustomSpawners(boolean spawnEnemies, boolean spawnFriendlies) { for (CustomSpawner customSpawner : this.customSpawners) { @@ -678,9 +_,17 @@ - && this.random.nextDouble() < currentDifficultyAt.getEffectiveDifficulty() * this.paperConfig().entities.spawning.skeletonHorseThunderSpawnChance.or(0.01) // Paper - Configurable spawn chances for skeleton horses && !this.getBlockState(blockPos.below()).is(Blocks.LIGHTNING_ROD); if (flag) { - SkeletonHorse skeletonHorse = EntityType.SKELETON_HORSE.create(this, EntitySpawnReason.EVENT); @@ -127,8 +124,7 @@ + return; + } + if (!org.purpurmc.purpur.PurpurConfig.sleepSkippingNight.equalsIgnoreCase("default")) { -+ component = io.papermc.paper.adventure.PaperAdventure.asVanilla(net.kyori.adventure.text.minimessage.MiniMessage.miniMessage().deserialize(org.purpurmc.purpur.PurpurConfig.sleepSkippingNight)); -+ } else ++ component = + } else + // Purpur end - Customizable sleeping actionbar messages component = Component.translatable("sleep.skipping_night"); } else { @@ -137,8 +133,7 @@ + return; + } + if (!org.purpurmc.purpur.PurpurConfig.sleepingPlayersPercent.equalsIgnoreCase("default")) { -+ component = io.papermc.paper.adventure.PaperAdventure.asVanilla(net.kyori.adventure.text.minimessage.MiniMessage.miniMessage().deserialize(org.purpurmc.purpur.PurpurConfig.sleepingPlayersPercent, -+ net.kyori.adventure.text.minimessage.tag.resolver.Placeholder.parsed("count", Integer.toString(this.sleepStatus.amountSleeping())), ++ component = + net.kyori.adventure.text.minimessage.tag.resolver.Placeholder.parsed("count", Integer.toString(this.sleepStatus.amountSleeping())), + net.kyori.adventure.text.minimessage.tag.resolver.Placeholder.parsed("total", Integer.toString(this.sleepStatus.sleepersNeeded(_int))))); + } else + // Purpur end - Customizable sleeping actionbar messages @@ -150,7 +145,6 @@ public void resetWeatherCycle() { // CraftBukkit start + if (this.purpurConfig.rainStopsAfterSleep) // Purpur - Option for if rain and thunder should stop on sleep - this.serverLevelData.setRaining(false, org.bukkit.event.weather.WeatherChangeEvent.Cause.SLEEP); // Paper - Add cause to Weather/ThunderChangeEvents // If we stop due to everyone sleeping we should reset the weather duration to some other random value. // Not that everyone ever manages to get the whole server to sleep at the same time.... @@ -928,6 +_,7 @@ @@ -158,15 +152,12 @@ } // CraftBukkit end + if (this.purpurConfig.thunderStopsAfterSleep) // Purpur - Option for if rain and thunder should stop on sleep - this.serverLevelData.setThundering(false, org.bukkit.event.weather.ThunderChangeEvent.Cause.SLEEP); // Paper - Add cause to Weather/ThunderChangeEvents // CraftBukkit start // If we stop due to everyone sleeping we should reset the weather duration to some other random value. @@ -2331,7 +_,7 @@ // Spigot start if (entity.getBukkitEntity() instanceof org.bukkit.inventory.InventoryHolder && (!(entity instanceof ServerPlayer) || entity.getRemovalReason() != Entity.RemovalReason.KILLED)) { // SPIGOT-6876: closeInventory clears death message - // Paper start - Fix merchant inventory not closing on entity removal - if (entity.getBukkitEntity() instanceof org.bukkit.inventory.Merchant merchant && merchant.getTrader() != null) { + if (!entity.level().purpurConfig.playerVoidTrading && entity.getBukkitEntity() instanceof org.bukkit.inventory.Merchant merchant && merchant.getTrader() != null) { // Purpur - Allow void trading merchant.getTrader().closeInventory(org.bukkit.event.inventory.InventoryCloseEvent.Reason.UNLOADED); } - // Paper end - Fix merchant inventory not closing on entity removal diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/server/level/ServerPlayer.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/server/level/ServerPlayer.java.patch index aa58ba378..a6137d0a3 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/server/level/ServerPlayer.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/server/level/ServerPlayer.java.patch @@ -1,9 +1,6 @@ --- a/net/minecraft/server/level/ServerPlayer.java +++ b/net/minecraft/server/level/ServerPlayer.java @@ -422,6 +_,10 @@ - public @Nullable com.destroystokyo.paper.event.entity.PlayerNaturallySpawnCreaturesEvent playerNaturallySpawnedEvent; // Paper - PlayerNaturallySpawnCreaturesEvent - public @Nullable String clientBrandName = null; // Paper - Brand support - public @Nullable org.bukkit.event.player.PlayerQuitEvent.QuitReason quitReason = null; // Paper - Add API for quit reason; there are a lot of changes to do if we change all methods leading to the event + public boolean purpurClient = false; // Purpur - Purpur client support + private boolean tpsBar = false; // Purpur - Implement TPSBar + private boolean compassBar = false; // Purpur - Add compass command @@ -52,7 +49,6 @@ + } + // Purpur end - Add boat fall damage config Entity entity = damageSource.getEntity(); - if (!( // Paper - split the if statement. If below statement is false, hurtServer would not have been evaluated. Return false. !(entity instanceof Player player && !this.canHarmPlayer(player)) @@ -1360,6 +_,7 @@ serverLevel.removePlayerImmediately(this, Entity.RemovalReason.CHANGED_DIMENSION); @@ -81,8 +77,7 @@ + if (org.purpurmc.purpur.PurpurConfig.sleepNotPossible.isBlank()) { + clientMessage = null; + } else if (!org.purpurmc.purpur.PurpurConfig.sleepNotPossible.equalsIgnoreCase("default")) { -+ clientMessage = io.papermc.paper.adventure.PaperAdventure.asVanilla(net.kyori.adventure.text.minimessage.MiniMessage.miniMessage().deserialize(org.purpurmc.purpur.PurpurConfig.sleepNotPossible)); -+ } else { ++ clientMessage = + } else { + clientMessage = Component.translatable("sleep.not_possible"); + } + if (clientMessage != null) { @@ -113,8 +108,7 @@ + + public void sendActionBarMessage(@Nullable net.kyori.adventure.text.Component message) { + if (message != null) { -+ sendActionBarMessage(io.papermc.paper.adventure.PaperAdventure.asVanilla(message)); -+ } ++ sendActionBarMessage(+ } + } + + public void sendActionBarMessage(@Nullable Component message) { @@ -140,8 +134,7 @@ + + public void sendMessage(@Nullable net.kyori.adventure.text.Component message) { + if (message != null) { -+ this.sendSystemMessage(io.papermc.paper.adventure.PaperAdventure.asVanilla(message)); -+ } ++ this.sendSystemMessage(+ } + } + // Purpur end - Component related conveniences + diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/server/level/WorldGenRegion.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/server/level/WorldGenRegion.java.patch index fb3d981ba..8bf498380 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/server/level/WorldGenRegion.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/server/level/WorldGenRegion.java.patch @@ -3,7 +3,6 @@ @@ -284,6 +_,7 @@ return true; } else { - // Paper start - Buffer OOB setBlock calls + if (!org.purpurmc.purpur.PurpurConfig.loggerSuppressSetBlockFarChunk) // Purpur - Logger settings (suppressing pointless logs) if (!hasSetFarWarned) { Util.logAndPauseIfInIde( diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/server/network/ServerCommonPacketListenerImpl.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/server/network/ServerCommonPacketListenerImpl.java.patch index 274dd957b..eda086153 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/server/network/ServerCommonPacketListenerImpl.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/server/network/ServerCommonPacketListenerImpl.java.patch @@ -9,9 +9,6 @@ private volatile boolean suspendFlushingOnServerThread = false; // CraftBukkit start @@ -51,6 +_,7 @@ - public final java.util.Map packCallbacks = new java.util.concurrent.ConcurrentHashMap<>(); // Paper - adventure resource pack callbacks - private static final long KEEPALIVE_LIMIT = Long.getLong("paper.playerconnection.keepalive", 30) * 1000; // Paper - provide property to set keepalive limit - protected static final net.minecraft.resources.ResourceLocation MINECRAFT_BRAND = net.minecraft.resources.ResourceLocation.withDefaultNamespace("brand"); // Paper - Brand support + protected static final net.minecraft.resources.ResourceLocation PURPUR_CLIENT = net.minecraft.resources.ResourceLocation.fromNamespaceAndPath("purpur", "client"); // Purpur - Purpur client support public ServerCommonPacketListenerImpl(MinecraftServer server, Connection connection, CommonListenerCookie cookie, net.minecraft.server.level.ServerPlayer player) { // CraftBukkit @@ -47,7 +44,6 @@ this.player.clientBrandName = new net.minecraft.network.FriendlyByteBuf(io.netty.buffer.Unpooled.wrappedBuffer(data)).readUtf(256); } @@ -242,6 +_,22 @@ - // Paper start - give clients a longer time to respond to pings as per pre 1.12.2 timings // This should effectively place the keepalive handling back to "as it was" before 1.12.2 final long elapsedTime = millis - this.keepAliveTime; + diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/server/network/ServerGamePacketListenerImpl.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/server/network/ServerGamePacketListenerImpl.java.patch index d47e5e7b1..b9adb5e4e 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/server/network/ServerGamePacketListenerImpl.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/server/network/ServerGamePacketListenerImpl.java.patch @@ -1,8 +1,7 @@ --- a/net/minecraft/server/network/ServerGamePacketListenerImpl.java +++ b/net/minecraft/server/network/ServerGamePacketListenerImpl.java @@ -321,6 +_,20 @@ - this.tickEndEvent = new io.papermc.paper.event.packet.ClientTickEndEvent(player.getBukkitEntity()); // Paper - add client tick end event - } + this.tickEndEvent = new } + // Purpur start - AFK API + private final com.google.common.cache.LoadingCache kickPermissionCache = com.google.common.cache.CacheBuilder.newBuilder() @@ -24,7 +23,6 @@ @@ -379,6 +_,12 @@ if (this.player.getLastActionTime() > 0L && this.server.getPlayerIdleTimeout() > 0 - && Util.getMillis() - this.player.getLastActionTime() > this.server.getPlayerIdleTimeout() * 1000L * 60L && !this.player.wonGame) { // Paper - Prevent AFK kick while watching end credits + // Purpur start - AFK API + this.player.setAfk(true); + if (!this.player.level().purpurConfig.idleTimeoutKick || (!Boolean.parseBoolean(System.getenv("PURPUR_FORCE_IDLE_KICK")) && kickPermissionCache.getUnchecked(this.player.getBukkitEntity()))) { @@ -32,7 +30,6 @@ + } + // Purpur end - AFK API this.player.resetLastActionTime(); // CraftBukkit - SPIGOT-854 - this.disconnect(Component.translatable("multiplayer.disconnect.idling"), org.bukkit.event.player.PlayerKickEvent.Cause.IDLING); // Paper - kick event cause } @@ -615,6 +_,8 @@ this.lastYaw = to.getYaw(); @@ -48,13 +45,11 @@ if (packet.getId() == this.awaitingTeleport) { if (this.awaitingPositionFromClient == null) { + ServerGamePacketListenerImpl.LOGGER.warn("Disconnected on accept teleport packet. Was not expecting position data from client at this time"); // Purpur - Add more logger output for invalid movement kicks - this.disconnect(Component.translatable("multiplayer.disconnect.invalid_player_movement"), org.bukkit.event.player.PlayerKickEvent.Cause.INVALID_PLAYER_MOVEMENT); // Paper - kick event cause return; } @@ -1199,6 +_,10 @@ final int maxBookPageSize = pageMax.intValue(); - final double multiplier = Math.clamp(io.papermc.paper.configuration.GlobalConfiguration.get().itemValidation.bookSize.totalMultiplier, 0.3D, 1D); - long byteAllowed = maxBookPageSize; + final double multiplier = Math.clamp( long byteAllowed = maxBookPageSize; + // Purpur start - PlayerBookTooLargeEvent + int slot = packet.slot(); + ItemStack itemstack = Inventory.isHotbarSlot(slot) || slot == Inventory.SLOT_OFFHAND ? this.player.getInventory().getItem(slot) : ItemStack.EMPTY; @@ -69,7 +64,6 @@ - ServerGamePacketListenerImpl.LOGGER.warn("{} tried to send a book too large. Book size: {} - Allowed: {} - Pages: {}", this.player.getScoreboardName(), byteTotal, byteAllowed, pageList.size()); + ServerGamePacketListenerImpl.LOGGER.warn("{} tried to send too large of a book. Book size: {} - Allowed: {} - Pages: {}", this.player.getScoreboardName(), byteTotal, byteAllowed, pageList.size()); + org.purpurmc.purpur.event.player.PlayerBookTooLargeEvent event = new org.purpurmc.purpur.event.player.PlayerBookTooLargeEvent(player.getBukkitEntity(), itemstack.asBukkitCopy()); if (event.shouldKickPlayer()) // Purpur - PlayerBookTooLargeEvent - this.disconnectAsync(Component.literal("Book too large!"), org.bukkit.event.player.PlayerKickEvent.Cause.ILLEGAL_ACTION); // Paper - kick event cause // Paper - add proper async disconnect return; } @@ -1242,31 +_,45 @@ @@ -103,7 +97,6 @@ - List> list = pages.stream().map(this::filterableFromOutgoing).toList(); + List> list = pages.stream().map(filteredText -> filterableFromOutgoing(filteredText).map(s -> color(s, hasPerm))).toList(); // Purpur - Allow color codes in books item.set(DataComponents.WRITABLE_BOOK_CONTENT, new WritableBookContent(list)); - this.player.getInventory().setItem(index, CraftEventFactory.handleEditBookEvent(this.player, index, handItem, item)); // CraftBukkit // Paper - Don't ignore result (see other callsite for handleEditBookEvent) } } @@ -128,7 +121,7 @@ + // Purpur start - Allow color codes in books + private Component hexColor(String str, boolean hasPerm) { -+ return hasPerm ? PaperAdventure.asVanilla(net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer.legacyAmpersand().deserialize(str)) : Component.literal(str); ++ return hasPerm ? PurpurAdventure.asVanilla(net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer.legacyAmpersand().deserialize(str)) : Component.literal(str); + } + + private String color(String str, boolean hasPerm) { @@ -153,16 +146,13 @@ + if (invalidX || invalidY || invalidZ || invalidYaw || invalidPitch) { + ServerGamePacketListenerImpl.LOGGER.warn(String.format("Disconnected on move player packet. Invalid data: x=%b, y=%b, z=%b, yaw=%b, pitch=%b", invalidX, invalidY, invalidZ, invalidYaw, invalidPitch)); + // Purpur end - Add more logger output for invalid movement kicks - this.disconnect(Component.translatable("multiplayer.disconnect.invalid_player_movement"), org.bukkit.event.player.PlayerKickEvent.Cause.INVALID_PLAYER_MOVEMENT); // Paper - kick event cause } else { ServerLevel serverLevel = this.player.serverLevel(); @@ -1496,7 +_,7 @@ movedWrongly = true; if (event.getLogWarning()) - // Paper end - LOGGER.warn("{} moved wrongly!", this.player.getName().getString()); + LOGGER.warn("{} moved wrongly!, ({})", this.player.getName().getString(), verticalDelta); // Purpur - AFK API - } // Paper } @@ -1552,6 +_,8 @@ @@ -217,8 +207,7 @@ @@ -2672,6 +_,7 @@ AABB boundingBox = target.getBoundingBox(); - if (this.player.canInteractWithEntity(boundingBox, io.papermc.paper.configuration.GlobalConfiguration.get().misc.clientInteractionLeniencyDistance.or(3.0))) { // Paper - configurable lenience value for interact range -+ if (target instanceof net.minecraft.world.entity.Mob mob) mob.ticksSinceLastInteraction = 0; // Purpur - Entity lifespan + if (this.player.canInteractWithEntity(boundingBox, + if (target instanceof net.minecraft.world.entity.Mob mob) mob.ticksSinceLastInteraction = 0; // Purpur - Entity lifespan packet.dispatch( new ServerboundInteractPacket.Handler() { private void performInteraction(InteractionHand hand, ServerGamePacketListenerImpl.EntityInteraction entityInteraction, PlayerInteractEntityEvent event) { // CraftBukkit diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/server/network/ServerLoginPacketListenerImpl.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/server/network/ServerLoginPacketListenerImpl.java.patch index dfa6db0dc..5cc899da9 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/server/network/ServerLoginPacketListenerImpl.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/server/network/ServerLoginPacketListenerImpl.java.patch @@ -5,7 +5,6 @@ ServerLoginPacketListenerImpl.this.startClientVerification(ServerLoginPacketListenerImpl.this.createOfflineProfile(string1)); // Spigot } else { - ServerLoginPacketListenerImpl.this.disconnect(Component.translatable("multiplayer.disconnect.unverified_username")); -+ ServerLoginPacketListenerImpl.this.disconnect(org.purpurmc.purpur.PurpurConfig.unverifiedUsername.equals("default") ? Component.translatable("multiplayer.disconnect.unverified_username") : io.papermc.paper.adventure.PaperAdventure.asVanilla(net.kyori.adventure.text.minimessage.MiniMessage.miniMessage().deserialize(org.purpurmc.purpur.PurpurConfig.unverifiedUsername))); // Purpur - Config for unverified username message - ServerLoginPacketListenerImpl.LOGGER.error("Username '{}' tried to join with an invalid session", string1); ++ ServerLoginPacketListenerImpl.this.disconnect(org.purpurmc.purpur.PurpurConfig.unverifiedUsername.equals("default") ? Component.translatable("multiplayer.disconnect.unverified_username") : ServerLoginPacketListenerImpl.LOGGER.error("Username '{}' tried to join with an invalid session", string1); } } catch (AuthenticationUnavailableException var4) { diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/server/network/ServerStatusPacketListenerImpl.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/server/network/ServerStatusPacketListenerImpl.java.patch index 3fc9d014a..2288570ee 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/server/network/ServerStatusPacketListenerImpl.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/server/network/ServerStatusPacketListenerImpl.java.patch @@ -3,8 +3,6 @@ @@ -37,6 +_,7 @@ } else { this.hasRequestedStatus = true; - // this.connection.send(new ClientboundStatusResponsePacket(this.status)); // Paper + if (net.minecraft.server.MinecraftServer.getServer().getStatus().version().isEmpty()) return; // Purpur - Fix 'outdated server' showing in ping before server fully boots - do not respond to pings before we know the protocol version - com.destroystokyo.paper.network.StandardPaperServerListPingEventImpl.processRequest(net.minecraft.server.MinecraftServer.getServer(), this.connection); // Paper - handle status request } } diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/server/players/PlayerList.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/server/players/PlayerList.java.patch index 4617cc721..70a21bc14 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/server/players/PlayerList.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/server/players/PlayerList.java.patch @@ -3,15 +3,12 @@ @@ -400,6 +_,7 @@ scoreboard.addPlayerToTeam(player.getScoreboardName(), collideRuleTeam); } - // Paper end - Configurable player collision + org.purpurmc.purpur.task.BossBarTask.addToAll(player); // Purpur - Implement TPSBar PlayerList.LOGGER.info("{}[{}] logged in with entity id {} at ([{}]{}, {}, {})", player.getName().getString(), loggableAddress, player.getId(), serverLevel.serverLevelData.getLevelName(), player.getX(), player.getY(), player.getZ()); - // Paper start - Send empty chunk, so players aren't stuck in the world loading screen with our chunk system not sending chunks when dead if (player.isDeadOrDying()) { @@ -504,6 +_,7 @@ } public @Nullable net.kyori.adventure.text.Component remove(ServerPlayer player, net.kyori.adventure.text.Component leaveMessage) { - // Paper end - Fix kick event leave message not being sent + org.purpurmc.purpur.task.BossBarTask.removeFromAll(player.getBukkitEntity()); // Purpur - Implement TPSBar ServerLevel serverLevel = player.serverLevel(); player.awardStat(Stats.LEAVE_GAME); @@ -22,7 +19,6 @@ // : null; - if (this.players.size() >= this.maxPlayers && !this.canBypassPlayerLimit(gameProfile)) { + if (this.players.size() >= this.maxPlayers && !(player.hasPermission("purpur.joinfullserver") || this.canBypassPlayerLimit(gameProfile))) { // Purpur - Allow player join full server by permission - event.disallow(org.bukkit.event.player.PlayerLoginEvent.Result.KICK_FULL, net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer.legacySection().deserialize(org.spigotmc.SpigotConfig.serverFullMessage)); // Spigot // Paper - Adventure } } @@ -920,6 +_,20 @@ @@ -38,8 +34,7 @@ + + public void broadcastMessage(@Nullable net.kyori.adventure.text.Component message, boolean overlay) { + if (message != null) { -+ this.broadcastSystemMessage(io.papermc.paper.adventure.PaperAdventure.asVanilla(message), overlay); -+ } ++ this.broadcastSystemMessage(+ } + } + // Purpur end - Component related conveniences + diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/util/StringUtil.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/util/StringUtil.java.patch index b8d231182..41b4df891 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/util/StringUtil.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/util/StringUtil.java.patch @@ -2,7 +2,6 @@ +++ b/net/minecraft/util/StringUtil.java @@ -87,6 +_,7 @@ - // Paper start - Username validation public static boolean isReasonablePlayerName(final String name) { + if (true) return org.purpurmc.purpur.PurpurConfig.usernameValidCharactersPattern.matcher(name).matches(); // Purpur - Configurable valid characters for usernames if (name.isEmpty() || name.length() > 16) { diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/damagesource/DamageSource.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/damagesource/DamageSource.java.patch index 581f8d027..9f91524dc 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/damagesource/DamageSource.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/damagesource/DamageSource.java.patch @@ -62,11 +62,9 @@ + + // Purpur start - Component related conveniences + public Component getLocalizedDeathMessage(String str, LivingEntity entity) { -+ net.kyori.adventure.text.Component name = io.papermc.paper.adventure.PaperAdventure.asAdventure(entity.getDisplayName()); -+ net.kyori.adventure.text.minimessage.tag.resolver.TagResolver template = net.kyori.adventure.text.minimessage.tag.resolver.Placeholder.component("player", name); ++ net.kyori.adventure.text.Component name = + net.kyori.adventure.text.minimessage.tag.resolver.TagResolver template = net.kyori.adventure.text.minimessage.tag.resolver.Placeholder.component("player", name); + net.kyori.adventure.text.Component component = net.kyori.adventure.text.minimessage.MiniMessage.miniMessage().deserialize(str, template); -+ return io.papermc.paper.adventure.PaperAdventure.asVanilla(component); -+ } ++ return + } + // Purpur end - Component related conveniences public String getMsgId() { diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/Entity.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/Entity.java.patch index 5e0bd604b..4c5745097 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/Entity.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/Entity.java.patch @@ -14,8 +14,6 @@ public double zOld; + public float maxUpStep; // Purpur - Add option to set armorstand step height public boolean noPhysics; -- public final RandomSource random = SHARED_RANDOM; // Paper - Share random for entities to make them more random -+ public final RandomSource random; // Paper - Share random for entities to make them more random // Add toggle for RNG manipulation public int tickCount; private int remainingFireTicks = -this.getFireImmuneTicks(); public boolean wasTouchingWater; @@ -28,8 +26,7 @@ + protected UUID uuid; // Purpur - Add toggle for RNG manipulation + protected String stringUUID; // Purpur - Add toggle for RNG manipulation private boolean hasGlowingTag; - private final Set tags = new io.papermc.paper.util.SizeLimitedSet<>(new it.unimi.dsi.fastutil.objects.ObjectOpenHashSet<>(), MAX_ENTITY_TAG_COUNT); // Paper - fully limit tag size - replace set impl - private final double[] pistonDeltas = new double[]{0.0, 0.0, 0.0}; + private final Set tags = new private final double[] pistonDeltas = new double[]{0.0, 0.0, 0.0}; @@ -394,6 +_,7 @@ public long activatedTick = Integer.MIN_VALUE; public boolean isTemporarilyActive; @@ -40,7 +37,6 @@ } @@ -406,10 +_,21 @@ } - // Paper end + // Purpur start - Add canSaveToDisk to Entity + public boolean canSaveToDisk() { @@ -61,9 +57,7 @@ this.blockPosition = BlockPos.ZERO; this.chunkPosition = ChunkPos.ZERO; @@ -779,6 +_,7 @@ - && this.level.paperConfig().environment.netherCeilingVoidDamageHeight.test(v -> this.getY() >= v) && (!(this instanceof Player player) || !player.getAbilities().invulnerable))) { - // Paper end - Configurable nether ceiling damage + if (this.level.purpurConfig.teleportOnNetherCeilingDamage && this.level.getWorld().getEnvironment() == org.bukkit.World.Environment.NETHER && this instanceof ServerPlayer player) player.teleport(org.bukkit.craftbukkit.util.CraftLocation.toBukkit(this.level.getSharedSpawnPos(), this.level)); else // Purpur - Add option to teleport to spawn on nether ceiling damage this.onBelowWorld(); } @@ -87,9 +81,7 @@ this.wasTouchingWater = false; } else if (this.updateFluidHeightAndDoFluidPushing(FluidTags.WATER, 0.014)) { @@ -2364,6 +_,13 @@ - compound.putBoolean("Paper.FreezeLock", true); } - // Paper end + + // Purpur start - Fire immune API + if (immuneToFire != null) { @@ -101,9 +93,7 @@ } catch (Throwable var8) { CrashReport crashReport = CrashReport.forThrowable(var8, "Saving entity NBT"); @@ -2481,6 +_,13 @@ - freezeLocked = compound.getBooleanOr("Paper.FreezeLock", false); } - // Paper end + + // Purpur start - Fire immune API + if (compound.contains("Purpur.FireImmune")) { @@ -120,7 +110,6 @@ if (!this.level().isClientSide()) { + if (hand == InteractionHand.OFF_HAND && (level().purpurConfig.villagerCanBeLeashed || level().purpurConfig.wanderingTraderCanBeLeashed) && this instanceof net.minecraft.world.entity.npc.AbstractVillager) return InteractionResult.CONSUME; // Purpur - Allow leashing villagers // CraftBukkit start - fire PlayerUnleashEntityEvent - // Paper start - Expand EntityUnleashEvent org.bukkit.event.player.PlayerUnleashEntityEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callPlayerUnleashEntityEvent(this, player, hand, !player.hasInfiniteMaterials()); @@ -2936,15 +_,18 @@ return Vec3.directionFromRotation(this.getRotationVector()); diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/EntitySelector.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/EntitySelector.java.patch index ff1e039a1..55ad3f020 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/EntitySelector.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/EntitySelector.java.patch @@ -3,9 +3,7 @@ @@ -28,6 +_,8 @@ return net.minecraft.util.Mth.clamp(serverPlayer.getStats().getValue(net.minecraft.stats.Stats.CUSTOM.get(net.minecraft.stats.Stats.TIME_SINCE_REST)), 1, Integer.MAX_VALUE) >= playerInsomniaTicks; }; - // Paper end - Ability to control player's insomnia and phantoms + public static Predicate notAfk = (player) -> !player.isAfk(); // Purpur - AFK API + - // Paper start - Affects Spawning API public static final Predicate PLAYER_AFFECTS_SPAWNING = (entity) -> { return !entity.isSpectator() && entity.isAlive() && entity instanceof Player player && player.affectsSpawning; diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/EntityType.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/EntityType.java.patch index 5fb68cfd6..a6723ebfb 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/EntityType.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/EntityType.java.patch @@ -37,7 +37,6 @@ @@ -1384,7 +_,11 @@ entity.load(tag); }, - // Paper end - Don't fire sync event during generation - () -> LOGGER.warn("Skipping Entity with id {}", tag.getStringOr("id", "[invalid]")) + // Purpur start - log skipped entity's position + () -> {LOGGER.warn("Skipping Entity with id {}", tag.getStringOr("id", "[invalid]")); diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/ExperienceOrb.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/ExperienceOrb.java.patch index f77455e12..5033e8608 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/ExperienceOrb.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/ExperienceOrb.java.patch @@ -3,7 +3,6 @@ @@ -328,7 +_,7 @@ public void playerTouch(Player entity) { if (entity instanceof ServerPlayer serverPlayer) { - if (entity.takeXpDelay == 0 && new com.destroystokyo.paper.event.player.PlayerPickupExperienceEvent(serverPlayer.getBukkitEntity(), (org.bukkit.entity.ExperienceOrb) this.getBukkitEntity()).callEvent()) { // Paper - PlayerPickupExperienceEvent - entity.takeXpDelay = org.bukkit.craftbukkit.event.CraftEventFactory.callPlayerXpCooldownEvent(entity, 2, org.bukkit.event.player.PlayerExpCooldownChangeEvent.ChangeReason.PICKUP_ORB).getNewCooldown(); // CraftBukkit - entityhuman.takeXpDelay = 2; + entity.takeXpDelay = org.bukkit.craftbukkit.event.CraftEventFactory.callPlayerXpCooldownEvent(entity, this.level().purpurConfig.playerExpPickupDelay, org.bukkit.event.player.PlayerExpCooldownChangeEvent.ChangeReason.PICKUP_ORB).getNewCooldown(); // CraftBukkit - entityhuman.takeXpDelay = 2; // Purpur - Configurable player pickup exp delay entity.take(this, 1); diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/LivingEntity.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/LivingEntity.java.patch index 18edfcd80..ef9643d4c 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/LivingEntity.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/LivingEntity.java.patch @@ -138,16 +138,12 @@ if (this.shouldDropLoot() && level.getGameRules().getBoolean(GameRules.RULE_DOMOBLOOT)) { + if (!(damageSource.is(net.minecraft.world.damagesource.DamageTypes.CRAMMING) && level().purpurConfig.disableDropsOnCrammingDeath)) { // Purpur - Disable loot drops on death by cramming this.dropFromLootTable(level, damageSource, flag); - // Paper start final boolean prev = this.clearEquipmentSlots; @@ -1883,6 +_,7 @@ - // Paper end this.dropCustomDeathLoot(level, damageSource, flag); - this.clearEquipmentSlots = prev; // Paper + } // Purpur - Disable loot drops on death by cramming } - // CraftBukkit start - Call death event // Paper start - call advancement triggers with correct entity equipment @@ -3057,6 +_,7 @@ float f = (float)(d * 10.0 - 3.0); if (f > 0.0F) { diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/animal/Animal.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/animal/Animal.java.patch index 0f2339b09..783739d8c 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/animal/Animal.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/animal/Animal.java.patch @@ -6,9 +6,7 @@ int age = this.getAge(); - if (!this.level().isClientSide && age == 0 && this.canFallInLove()) { + if (!this.level().isClientSide && age == 0 && this.canFallInLove() && (this.level().purpurConfig.animalBreedingCooldownSeconds <= 0 || !this.level().hasBreedingCooldown(player.getUUID(), this.getClass()))) { // Purpur - Add adjustable breeding cooldown to config - final ItemStack breedCopy = itemInHand.copy(); // Paper - Fix EntityBreedEvent copying this.usePlayerItem(player, hand, itemInHand); - this.setInLove(player, breedCopy); // Paper - Fix EntityBreedEvent copying @@ -239,10 +_,20 @@ public void spawnChildFromBreeding(ServerLevel level, Animal mate) { AgeableMob breedOffspring = this.getBreedOffspring(level, mate); diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/animal/Bee.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/animal/Bee.java.patch index dc2f1ba02..c91cb2f70 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/animal/Bee.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/animal/Bee.java.patch @@ -1,7 +1,6 @@ --- a/net/minecraft/world/entity/animal/Bee.java +++ b/net/minecraft/world/entity/animal/Bee.java @@ -167,7 +_,7 @@ - // Paper end - Fix MC-167279 this.lookControl = new Bee.BeeLookControl(this); this.setPathfindingMalus(PathType.DANGER_FIRE, -1.0F); - this.setPathfindingMalus(PathType.WATER, -1.0F); diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/animal/Fox.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/animal/Fox.java.patch index 283e94dc0..ec8f5b9a1 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/animal/Fox.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/animal/Fox.java.patch @@ -23,7 +23,6 @@ @@ -705,6 +_,29 @@ return slot == EquipmentSlot.MAINHAND; } - // Paper end + + // Purpur start - Tulips change fox type + @Override @@ -49,4 +48,3 @@ + // Purpur end - Tulips change fox type @Override - // Paper start - Cancellable death event diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/animal/MushroomCow.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/animal/MushroomCow.java.patch index 48673480a..d9434b89b 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/animal/MushroomCow.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/animal/MushroomCow.java.patch @@ -11,6 +11,5 @@ + cow.yRotO = this.yRotO; + cow.xRotO = this.xRotO; + // Purpur end - Fix cow rotation when shearing mooshroom - // Paper start - custom shear drops; moved drop generation to separate method drops.forEach(drop -> { this.spawnAtLocation(level, new ItemEntity(this.level(), this.getX(), this.getY(1.0), this.getZ(), drop)); diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/animal/Squid.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/animal/Squid.java.patch index 83c0aed86..866c8a245 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/animal/Squid.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/animal/Squid.java.patch @@ -4,8 +4,6 @@ public Squid(EntityType entityType, Level level) { super(entityType, level); -- //this.random.setSeed(this.getId()); // Paper - Share random for entities to make them more random -+ if (!level.purpurConfig.entitySharedRandom) this.random.setSeed(this.getId()); // Paper - Share random for entities to make them more random // Purpur - Add toggle for RNG manipulation this.tentacleSpeed = 1.0F / (this.random.nextFloat() + 1.0F) * 0.2F; } diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/animal/WaterAnimal.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/animal/WaterAnimal.java.patch index 3552d2bfc..ca9986c00 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/animal/WaterAnimal.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/animal/WaterAnimal.java.patch @@ -1,9 +1,6 @@ --- a/net/minecraft/world/entity/animal/WaterAnimal.java +++ b/net/minecraft/world/entity/animal/WaterAnimal.java @@ -76,8 +_,7 @@ - seaLevel = level.getMinecraftWorld().paperConfig().entities.spawning.wateranimalSpawnHeight.maximum.or(seaLevel); - i = level.getMinecraftWorld().paperConfig().entities.spawning.wateranimalSpawnHeight.minimum.or(i); - // Paper end - Make water animal spawn height configurable - return pos.getY() >= i - && pos.getY() <= seaLevel + return ((spawnReason == EntitySpawnReason.SPAWNER && level.getMinecraftWorld().purpurConfig.spawnerFixMC238526) || (pos.getY() >= i && pos.getY() <= seaLevel)) // Purpur - MC-238526 - Fix spawner not spawning water animals correctly diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/animal/goat/Goat.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/animal/goat/Goat.java.patch index 4cd0aeca3..f0f69a2d4 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/animal/goat/Goat.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/animal/goat/Goat.java.patch @@ -2,7 +2,6 @@ +++ b/net/minecraft/world/entity/animal/goat/Goat.java @@ -395,6 +_,7 @@ - // Paper start - Goat ram API public void ram(net.minecraft.world.entity.LivingEntity entity) { + if(!new org.purpurmc.purpur.event.entity.GoatRamEntityEvent((org.bukkit.entity.Goat) getBukkitEntity(), entity.getBukkitLivingEntity()).callEvent()) return; // Purpur - Added goat ram event Brain brain = this.getBrain(); diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/animal/horse/Llama.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/animal/horse/Llama.java.patch index ccbc13a99..7c65c2b90 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/animal/horse/Llama.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/animal/horse/Llama.java.patch @@ -3,7 +3,6 @@ @@ -77,6 +_,7 @@ private Llama caravanHead; @Nullable - public Llama caravanTail; // Paper + public boolean shouldJoinCaravan = true; // Purpur - Llama API public Llama(EntityType entityType, Level level) { diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/boss/enderdragon/EndCrystal.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/boss/enderdragon/EndCrystal.java.patch index 607381a02..32a7be376 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/boss/enderdragon/EndCrystal.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/boss/enderdragon/EndCrystal.java.patch @@ -28,7 +28,6 @@ @@ -74,6 +_,8 @@ } } - // Paper end - Fix invulnerable end crystals + if (this.level().purpurConfig.endCrystalCramming > 0 && this.level().getEntitiesOfClass(EndCrystal.class, getBoundingBox()).size() > this.level().purpurConfig.endCrystalCramming) this.hurt(this.damageSources().cramming(), 6.0F); // Purpur - End Crystal Cramming + } @@ -47,10 +46,8 @@ return false; } - this.remove(Entity.RemovalReason.KILLED, org.bukkit.event.entity.EntityRemoveEvent.Cause.EXPLODE); // Paper - add Bukkit remove cause - level.explode(this, damageSource1, null, this.getX(), this.getY(), this.getZ(), event.getRadius(), event.getFire(), Level.ExplosionInteraction.BLOCK); + level.explode(this, damageSource1, null, this.getX(), this.getY(), this.getZ(), event.getRadius(), event.getFire(), getExplosionEffect()); // Purpur - End crystal explosion options + } else this.unsetRemoved(); // Purpur - End crystal explosion options } else { - this.remove(Entity.RemovalReason.KILLED, org.bukkit.event.entity.EntityRemoveEvent.Cause.DEATH); // Paper - add Bukkit remove cause // CraftBukkit end diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/decoration/ArmorStand.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/decoration/ArmorStand.java.patch index 4690f775c..ca38ae41b 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/decoration/ArmorStand.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/decoration/ArmorStand.java.patch @@ -3,12 +3,10 @@ @@ -95,10 +_,13 @@ private boolean noTickPoseDirty = false; private boolean noTickEquipmentDirty = false; - // Paper end - Allow ArmorStands not to tick + public boolean canMovementTick = true; // Purpur - Movement options for armor stands public ArmorStand(EntityType entityType, Level level) { super(entityType, level); - if (level != null) this.canTick = level.paperConfig().entities.armorStands.tick; // Paper - Allow ArmorStands not to tick + if (level != null) this.canMovementTick = level.purpurConfig.armorstandMovement; // Purpur - Movement options for armor stands + this.setShowArms(level != null && level.purpurConfig.armorstandPlaceWithArms); // Purpur - Config to show Armor Stand arms on spawn } @@ -19,13 +17,11 @@ @Override public void tick() { + maxUpStep = level().purpurConfig.armorstandStepHeight; // Purpur - Add option to set armorstand step height - // Paper start - Allow ArmorStands not to tick if (!this.canTick) { if (this.noTickPoseDirty) { @@ -867,4 +_,18 @@ } } - // Paper end + + // Purpur start - Movement options for armor stands + @Override diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/item/ItemEntity.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/item/ItemEntity.java.patch index 5f326c938..294f53927 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/item/ItemEntity.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/item/ItemEntity.java.patch @@ -1,9 +1,6 @@ --- a/net/minecraft/world/entity/item/ItemEntity.java +++ b/net/minecraft/world/entity/item/ItemEntity.java @@ -59,6 +_,12 @@ - public boolean canMobPickup = true; // Paper - Item#canEntityPickup - private int despawnRate = -1; // Paper - Alternative item-despawn-rate - public net.kyori.adventure.util.TriState frictionState = net.kyori.adventure.util.TriState.NOT_SET; // Paper - Friction API + // Purpur start - Item entity immunities + public boolean immuneToCactus = false; + public boolean immuneToExplosion = false; @@ -34,7 +31,6 @@ @@ -528,6 +_,12 @@ public void setItem(ItemStack stack) { this.getEntityData().set(DATA_ITEM, stack); - this.despawnRate = this.level().paperConfig().entities.spawning.altItemDespawnRate.enabled ? this.level().paperConfig().entities.spawning.altItemDespawnRate.items.getOrDefault(stack.getItem(), this.level().spigotConfig.itemDespawnRate) : this.level().spigotConfig.itemDespawnRate; // Paper - Alternative item-despawn-rate + // Purpur start - Item entity immunities + if (level().purpurConfig.itemImmuneToCactus.contains(stack.getItem())) immuneToCactus = true; + if (level().purpurConfig.itemImmuneToExplosion.contains(stack.getItem())) immuneToExplosion = true; diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/item/PrimedTnt.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/item/PrimedTnt.java.patch index 052ef78b6..745ad1013 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/item/PrimedTnt.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/item/PrimedTnt.java.patch @@ -1,9 +1,7 @@ --- a/net/minecraft/world/entity/item/PrimedTnt.java +++ b/net/minecraft/world/entity/item/PrimedTnt.java @@ -253,4 +_,32 @@ - return !this.level().paperConfig().fixes.preventTntFromMovingInWater && super.isPushedByFluid(); } - // Paper end - Option to prevent TNT from moving in water + + // Purpur start - Shears can defuse TNT + @Override diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/monster/AbstractSkeleton.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/monster/AbstractSkeleton.java.patch index af806331a..72dac9418 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/monster/AbstractSkeleton.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/monster/AbstractSkeleton.java.patch @@ -2,7 +2,6 @@ +++ b/net/minecraft/world/entity/monster/AbstractSkeleton.java @@ -158,10 +_,7 @@ this.reassessWeaponGoal(); - this.setCanPickUpLoot(this.level().paperConfig().entities.behavior.mobsCanAlwaysPickUpLoot.skeletons || random.nextFloat() < 0.55F * difficulty.getSpecialMultiplier()); // Paper - Add world settings for mobs picking up loot if (this.getItemBySlot(EquipmentSlot.HEAD).isEmpty()) { - LocalDate localDate = LocalDate.now(); - int i = localDate.get(ChronoField.DAY_OF_MONTH); diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/monster/Creeper.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/monster/Creeper.java.patch index 803176349..821d20ed9 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/monster/Creeper.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/monster/Creeper.java.patch @@ -50,8 +50,6 @@ if (!event.isCancelled()) { // CraftBukkit end this.dead = true; -- serverLevel.explode(this, this.getX(), this.getY(), this.getZ(), event.getRadius(), event.getFire(), Level.ExplosionInteraction.MOB); // CraftBukkit // Paper - fix DamageSource API (revert to vanilla, no, just no, don't change this) -+ serverLevel.explode(this, this.getX(), this.getY(), this.getZ(), event.getRadius(), event.getFire(), serverLevel.getGameRules().getBoolean(net.minecraft.world.level.GameRules.RULE_MOBGRIEFING) && level().purpurConfig.creeperAllowGriefing ? Level.ExplosionInteraction.MOB : Level.ExplosionInteraction.NONE); // CraftBukkit // Paper - fix DamageSource API (revert to vanilla, no, just no, don't change this) // Purpur - Add enderman and creeper griefing controls this.spawnLingeringCloud(); this.triggerOnDeathMobEffects(serverLevel, Entity.RemovalReason.KILLED); this.discard(org.bukkit.event.entity.EntityRemoveEvent.Cause.EXPLODE); // CraftBukkit - add Bukkit remove cause diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/monster/Drowned.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/monster/Drowned.java.patch index 3d8569ee4..f8dc25344 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/monster/Drowned.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/monster/Drowned.java.patch @@ -8,9 +8,7 @@ this.goalSelector.addGoal(7, new RandomStrollGoal(this, 1.0)); this.targetSelector.addGoal(1, new HurtByTargetGoal(this, Drowned.class).setAlertOthers(ZombifiedPiglin.class)); this.targetSelector.addGoal(2, new NearestAttackableTargetGoal<>(this, Player.class, 10, true, false, (entity, level) -> this.okTarget(entity))); -- if (this.level().spigotConfig.zombieAggressiveTowardsVillager) this.targetSelector.addGoal(3, new NearestAttackableTargetGoal<>(this, AbstractVillager.class, false)); // Paper - Check drowned for villager aggression config + // Purpur start - Add option to disable zombie aggressiveness towards villagers -+ if (this.level().spigotConfig.zombieAggressiveTowardsVillager) this.targetSelector.addGoal(3, new NearestAttackableTargetGoal<>(this, AbstractVillager.class, false) { // Paper - Check drowned for villager aggression config + @Override + public boolean canUse() { + return (level().purpurConfig.zombieAggressiveTowardsVillagerWhenLagging || !level().getServer().server.isLagging()) && super.canUse(); diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/monster/EnderMan.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/monster/EnderMan.java.patch index 4ae69d3a7..7d9f5db6b 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/monster/EnderMan.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/monster/EnderMan.java.patch @@ -12,10 +12,8 @@ @@ -220,7 +_,7 @@ boolean isBeingStaredBy(Player player) { - // Paper start - EndermanAttackPlayerEvent - final boolean shouldAttack = this.isBeingStaredBy0(player); + final boolean shouldAttack = !this.level().purpurConfig.endermanDisableStareAggro && this.isBeingStaredBy0(player); // Purpur - Config to ignore Dragon Head wearers and stare aggro - final com.destroystokyo.paper.event.entity.EndermanAttackPlayerEvent event = new com.destroystokyo.paper.event.entity.EndermanAttackPlayerEvent((org.bukkit.entity.Enderman) getBukkitEntity(), (org.bukkit.entity.Player) player.getBukkitEntity()); event.setCancelled(!shouldAttack); return event.callEvent(); @@ -376,6 +_,7 @@ @@ -31,7 +29,6 @@ boolean flag = abstractThrownPotion1 != null && this.hurtWithCleanWater(level, damageSource, abstractThrownPotion1, amount); + if (!flag && level.purpurConfig.endermanIgnoreProjectiles) return super.hurtServer(level, damageSource, amount); // Purpur - Config to disable Enderman teleport on projectile hit - if (this.tryEscape(com.destroystokyo.paper.event.entity.EndermanEscapeEvent.Reason.INDIRECT)) { // Paper - EndermanEscapeEvent for (int i = 0; i < 64; i++) { if (this.teleport()) { @@ -433,7 +_,7 @@ diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/monster/Ravager.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/monster/Ravager.java.patch index f593040b8..a57fda883 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/monster/Ravager.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/monster/Ravager.java.patch @@ -15,5 +15,4 @@ - if (block instanceof LeavesBlock) { + if (this.level().purpurConfig.ravagerGriefableBlocks.contains(block)) { // Purpur - Configurable ravager griefable blocks list // CraftBukkit start - if (!org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(this, blockPos, blockState.getFluidState().createLegacyBlock())) { // Paper - fix wrong block state continue; diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/npc/Villager.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/npc/Villager.java.patch index 71cb36d56..358a3fdef 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/npc/Villager.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/npc/Villager.java.patch @@ -68,15 +68,12 @@ public Brain getBrain() { return (Brain)super.getBrain(); @@ -292,11 +_,24 @@ - // Paper start - EAR 2 this.customServerAiStep(level, false); } - protected void customServerAiStep(ServerLevel level, final boolean inactive) { + protected void customServerAiStep(ServerLevel level, boolean inactive) { // Purpur - Lobotomize stuck villagers - not final - // Paper end - EAR 2 ProfilerFiller profilerFiller = Profiler.get(); profilerFiller.push("villagerBrain"); -- if (!inactive) this.getBrain().tick(level, this); // Paper - EAR 2 + // Purpur start - Lobotomize stuck villagers + if (this.level().purpurConfig.villagerLobotomizeEnabled) { + // treat as inactive if lobotomized @@ -87,7 +84,6 @@ + // Purpur end - Lobotomize stuck villagers + // Pufferfish start + if (!inactive /*&& this.behaviorTick++ % this.activatedPriority == 0*/) { -+ this.getBrain().tick(level, this); // Paper - EAR 2 + } + else if (this.isLobotomized && shouldRestock()) restock(); // Purpur - Lobotomize stuck villagers + // Pufferfish end diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/npc/WanderingTrader.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/npc/WanderingTrader.java.patch index 29f09b163..c74844353 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/npc/WanderingTrader.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/npc/WanderingTrader.java.patch @@ -18,8 +18,6 @@ this, new ItemStack(Items.MILK_BUCKET), SoundEvents.WANDERING_TRADER_REAPPEARED, -- wanderingTrader -> this.canDrinkMilk && this.level().isBrightOutside() && wanderingTrader.isInvisible() // Paper - Add more WanderingTrader API -+ wanderingTrader -> level().purpurConfig.milkClearsBeneficialEffects && this.canDrinkMilk && this.level().isBrightOutside() && wanderingTrader.isInvisible() // Paper - Add more WanderingTrader API // // Purpur - Milk Keeps Beneficial Effects ) ); this.goalSelector.addGoal(1, new TradeWithPlayerGoal(this)); diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/player/Player.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/player/Player.java.patch index fc57c7949..50a3f2884 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/player/Player.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/player/Player.java.patch @@ -2,8 +2,6 @@ +++ b/net/minecraft/world/entity/player/Player.java @@ -210,11 +_,20 @@ private int currentImpulseContextResetGraceTime = 0; - public boolean affectsSpawning = true; // Paper - Affects Spawning API - public net.kyori.adventure.util.TriState flyingFallDamage = net.kyori.adventure.util.TriState.NOT_SET; // Paper - flying fall damage + public int burpDelay = 0; // Purpur - Burp delay + public boolean canPortalInstant = false; // Purpur - Add portal permission bypass @@ -62,9 +60,7 @@ } else if (!entity.isRemoved()) { this.touch(entity); @@ -1214,7 +_,7 @@ - flag2 = flag2 && !this.level().paperConfig().entities.behavior.disablePlayerCrits; // Paper - Toggleable player crits if (flag2) { - damageSource = damageSource.critical(); // Paper - critical damage API - f *= 1.5F; + f *= (float) this.level().purpurConfig.playerCriticalDamageMultiplier; // Purpur - Add config change multiplier critical damage value } diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/projectile/ThrownEnderpearl.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/projectile/ThrownEnderpearl.java.patch index 8efc70f2a..b8e66d61f 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/projectile/ThrownEnderpearl.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/projectile/ThrownEnderpearl.java.patch @@ -16,8 +16,6 @@ if (serverPlayer1 != null) { serverPlayer1.resetFallDistance(); serverPlayer1.resetCurrentImpulseContext(); -- serverPlayer1.hurtServer(serverPlayer.serverLevel(), this.damageSources().enderPearl().eventEntityDamager(this), 5.0F); // CraftBukkit // Paper - fix DamageSource API -+ serverPlayer1.hurtServer(serverPlayer.serverLevel(), this.damageSources().enderPearl().eventEntityDamager(this), this.level().purpurConfig.enderPearlDamage); // CraftBukkit // Paper - fix DamageSource API // Purpur - Configurable Ender Pearl damage } this.playSound(serverLevel, vec3); diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/inventory/AnvilMenu.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/inventory/AnvilMenu.java.patch index 910986692..223f79412 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/inventory/AnvilMenu.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/inventory/AnvilMenu.java.patch @@ -16,7 +16,6 @@ @@ -49,6 +_,10 @@ private org.bukkit.craftbukkit.inventory.view.CraftAnvilView bukkitEntity; // CraftBukkit end - public boolean bypassEnchantmentLevelRestriction = false; // Paper - bypass anvil level restrictions + // Purpur start - Anvil API + public boolean bypassCost = false; + public boolean canDoUnsafeEnchants = false; @@ -98,8 +97,6 @@ flag1 = true; } else { flag = true; -- if (intValue > enchantment.getMaxLevel() && !this.bypassEnchantmentLevelRestriction) { // Paper - bypass anvil level restrictions -+ if (!org.purpurmc.purpur.PurpurConfig.allowHigherEnchantsLevels && intValue > enchantment.getMaxLevel() && !this.bypassEnchantmentLevelRestriction) { // Paper - bypass anvil level restrictions // Purpur - Config to allow unsafe enchants intValue = enchantment.getMaxLevel(); } @@ -151,8 +148,7 @@ + if (removeItalics) { + component = component.decoration(net.kyori.adventure.text.format.TextDecoration.ITALIC, false); + } -+ itemStack.set(DataComponents.CUSTOM_NAME, io.papermc.paper.adventure.PaperAdventure.asVanilla(component)); -+ } ++ itemStack.set(DataComponents.CUSTOM_NAME, + } + else + // Purpur end - Allow anvil colors itemStack.set(DataComponents.CUSTOM_NAME, Component.literal(this.itemName)); diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/inventory/EnchantmentMenu.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/inventory/EnchantmentMenu.java.patch index b6a6515d1..edfa9feff 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/inventory/EnchantmentMenu.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/inventory/EnchantmentMenu.java.patch @@ -21,7 +21,6 @@ + } + // Purpur end - Enchantment Table Persists Lapis }; - // Paper end - Add missing InventoryHolders this.access = access; @@ -83,6 +_,16 @@ return EnchantmentMenu.EMPTY_SLOT_LAPIS_LAZULI; diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/inventory/GrindstoneMenu.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/inventory/GrindstoneMenu.java.patch index 1af1db846..28bdd9bd0 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/inventory/GrindstoneMenu.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/inventory/GrindstoneMenu.java.patch @@ -6,13 +6,11 @@ access.execute((level, blockPos) -> { + ItemStack itemstack = activeQuickItem == null ? stack : activeQuickItem; // Purpur - Grindstone API if (level instanceof ServerLevel) { - // Paper start - Fire BlockExpEvent on grindstone use org.bukkit.event.block.BlockExpEvent event = new org.bukkit.event.block.BlockExpEvent(org.bukkit.craftbukkit.block.CraftBlock.at(level, blockPos), this.getExperienceAmount(level)); event.callEvent(); - ExperienceOrb.award((ServerLevel) level, Vec3.atCenterOf(blockPos), event.getExpToDrop(), org.bukkit.entity.ExperienceOrb.SpawnReason.GRINDSTONE, player); + org.purpurmc.purpur.event.inventory.GrindstoneTakeResultEvent grindstoneTakeResultEvent = new org.purpurmc.purpur.event.inventory.GrindstoneTakeResultEvent(player.getBukkitEntity(), getBukkitView(), org.bukkit.craftbukkit.inventory.CraftItemStack.asCraftMirror(itemstack), event.getExpToDrop()); grindstoneTakeResultEvent.callEvent(); // Purpur - Grindstone API + ExperienceOrb.award((ServerLevel) level, Vec3.atCenterOf(blockPos), grindstoneTakeResultEvent.getExperienceAmount(), org.bukkit.entity.ExperienceOrb.SpawnReason.GRINDSTONE, player); // Purpur - Grindstone API - // Paper end - Fire BlockExpEvent on grindstone use } @@ -124,7 +_,7 @@ diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/item/AxeItem.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/item/AxeItem.java.patch index c87b129e2..59ae643a8 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/item/AxeItem.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/item/AxeItem.java.patch @@ -12,12 +12,10 @@ + org.purpurmc.purpur.tool.Actionable actionable = optional.get(); // Purpur - Tool actionable options + BlockState state = actionable.into().withPropertiesOf(level.getBlockState(clickedPos)); // Purpur - Tool actionable options ItemStack itemInHand = context.getItemInHand(); - // Paper start - EntityChangeBlockEvent - if (!org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(player, clickedPos, optional.get())) { + if (!org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(player, clickedPos, state)) { // Purpur - Tool actionable options return InteractionResult.PASS; } - // Paper end @@ -76,8 +_,15 @@ CriteriaTriggers.ITEM_USED_ON_BLOCK.trigger((ServerPlayer)player, clickedPos, itemInHand); } diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/item/EggItem.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/item/EggItem.java.patch index 7bd1d11bf..a2af9874a 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/item/EggItem.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/item/EggItem.java.patch @@ -3,9 +3,7 @@ @@ -24,7 +_,7 @@ public InteractionResult use(Level level, Player player, InteractionHand hand) { ItemStack itemInHand = player.getItemInHand(hand); - // Paper start - final Projectile.Delayed thrownEgg = Projectile.spawnProjectileFromRotationDelayed(ThrownEgg::new, (ServerLevel) level, itemInHand, player, 0.0F, EggItem.PROJECTILE_SHOOT_POWER, 1.0F); + final Projectile.Delayed thrownEgg = Projectile.spawnProjectileFromRotationDelayed(ThrownEgg::new, (ServerLevel) level, itemInHand, player, 0.0F, EggItem.PROJECTILE_SHOOT_POWER, (float) level.purpurConfig.eggProjectileOffset); // Purpur - Projectile offset config - com.destroystokyo.paper.event.player.PlayerLaunchProjectileEvent event = new com.destroystokyo.paper.event.player.PlayerLaunchProjectileEvent((org.bukkit.entity.Player) player.getBukkitEntity(), org.bukkit.craftbukkit.inventory.CraftItemStack.asCraftMirror(itemInHand), (org.bukkit.entity.Projectile) thrownEgg.projectile().getBukkitEntity()); if (event.callEvent() && thrownEgg.attemptSpawn()) { if (event.shouldConsume()) { diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/item/EndCrystalItem.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/item/EndCrystalItem.java.patch index baee5e0ab..314dafae6 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/item/EndCrystalItem.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/item/EndCrystalItem.java.patch @@ -8,4 +8,3 @@ + if (!level.purpurConfig.endCrystalPlaceAnywhere && !blockState.is(Blocks.OBSIDIAN) && !blockState.is(Blocks.BEDROCK)) { // Purpur - place end crystal on any block return InteractionResult.FAIL; } else { - BlockPos blockPos = clickedPos.above(); final BlockPos aboveBlockPos = blockPos; // Paper - OBFHELPER diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/item/EnderpearlItem.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/item/EnderpearlItem.java.patch index de340dafe..e2bf42a73 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/item/EnderpearlItem.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/item/EnderpearlItem.java.patch @@ -3,10 +3,8 @@ @@ -24,7 +_,7 @@ if (level instanceof ServerLevel serverLevel) { // CraftBukkit start - // Paper start - PlayerLaunchProjectileEvent - final Projectile.Delayed thrownEnderpearl = Projectile.spawnProjectileFromRotationDelayed(ThrownEnderpearl::new, serverLevel, itemInHand, player, 0.0F, EnderpearlItem.PROJECTILE_SHOOT_POWER, 1.0F); + final Projectile.Delayed thrownEnderpearl = Projectile.spawnProjectileFromRotationDelayed(ThrownEnderpearl::new, serverLevel, itemInHand, player, 0.0F, EnderpearlItem.PROJECTILE_SHOOT_POWER, (float) serverLevel.purpurConfig.enderPearlProjectileOffset); // Purpur - Projectile offset config - com.destroystokyo.paper.event.player.PlayerLaunchProjectileEvent event = new com.destroystokyo.paper.event.player.PlayerLaunchProjectileEvent((org.bukkit.entity.Player) player.getBukkitEntity(), org.bukkit.craftbukkit.inventory.CraftItemStack.asCraftMirror(itemInHand), (org.bukkit.entity.Projectile) thrownEnderpearl.projectile().getBukkitEntity()); if (event.callEvent() && thrownEnderpearl.attemptSpawn()) { if (event.shouldConsume()) { @@ -44,6 +_,7 @@ diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/item/NameTagItem.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/item/NameTagItem.java.patch index 2a8639361..19a302f45 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/item/NameTagItem.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/item/NameTagItem.java.patch @@ -3,8 +3,6 @@ @@ -24,6 +_,7 @@ LivingEntity newEntity = ((org.bukkit.craftbukkit.entity.CraftLivingEntity) event.getEntity()).getHandle(); - newEntity.setCustomName(event.getName() != null ? io.papermc.paper.adventure.PaperAdventure.asVanilla(event.getName()) : null); -+ if (player.level().purpurConfig.armorstandFixNametags && target instanceof net.minecraft.world.entity.decoration.ArmorStand) target.setCustomNameVisible(true); // Purpur - Set name visible when using a Name Tag on an Armor Stand + newEntity.setCustomName(event.getName() != null ? + if (player.level().purpurConfig.armorstandFixNametags && target instanceof net.minecraft.world.entity.decoration.ArmorStand) target.setCustomNameVisible(true); // Purpur - Set name visible when using a Name Tag on an Armor Stand if (event.isPersistent() && newEntity instanceof Mob mob) { - // Paper end - Add PlayerNameEntityEvent mob.setPersistenceRequired(); diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/item/ShovelItem.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/item/ShovelItem.java.patch index c583f3853..8b08b68f3 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/item/ShovelItem.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/item/ShovelItem.java.patch @@ -3,15 +3,11 @@ @@ -46,9 +_,12 @@ BlockState blockState1 = FLATTENABLES.get(blockState.getBlock()); BlockState blockState2 = null; - Runnable afterAction = null; // Paper + org.purpurmc.purpur.tool.Flattenable flattenable = level.purpurConfig.shovelFlattenables.get(blockState.getBlock()); // Purpur - Tool actionable options if (blockState1 != null && level.getBlockState(clickedPos.above()).isAir()) { -- afterAction = () -> level.playSound(player, clickedPos, SoundEvents.SHOVEL_FLATTEN, SoundSource.BLOCKS, 1.0F, 1.0F); // Paper - blockState2 = blockState1; + // Purpur start - Tool actionable options -+ afterAction = () -> {if (!FLATTENABLES.containsKey(blockState.getBlock())) level.playSound(player, clickedPos, SoundEvents.SHOVEL_FLATTEN, SoundSource.BLOCKS, 1.0F, 1.0F);}; // Paper + blockState2 = flattenable.into().defaultBlockState(); + // Purpur end - Tool actionable options } else if (blockState.getBlock() instanceof CampfireBlock && blockState.getValue(CampfireBlock.LIT)) { - afterAction = () -> { // Paper if (!level.isClientSide()) { diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/item/SnowballItem.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/item/SnowballItem.java.patch index 9c09ecb72..464fce6be 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/item/SnowballItem.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/item/SnowballItem.java.patch @@ -3,9 +3,7 @@ @@ -26,7 +_,7 @@ // CraftBukkit start - moved down if (level instanceof ServerLevel serverLevel) { - // Paper start - PlayerLaunchProjectileEvent - final Projectile.Delayed snowball = Projectile.spawnProjectileFromRotationDelayed(Snowball::new, serverLevel, itemInHand, player, 0.0F, SnowballItem.PROJECTILE_SHOOT_POWER, 1.0F); + final Projectile.Delayed snowball = Projectile.spawnProjectileFromRotationDelayed(Snowball::new, serverLevel, itemInHand, player, 0.0F, SnowballItem.PROJECTILE_SHOOT_POWER, (float) serverLevel.purpurConfig.snowballProjectileOffset); // Purpur - Projectile offset config - com.destroystokyo.paper.event.player.PlayerLaunchProjectileEvent event = new com.destroystokyo.paper.event.player.PlayerLaunchProjectileEvent((org.bukkit.entity.Player) player.getBukkitEntity(), org.bukkit.craftbukkit.inventory.CraftItemStack.asCraftMirror(itemInHand), (org.bukkit.entity.Projectile) snowball.projectile().getBukkitEntity()); if (event.callEvent() && snowball.attemptSpawn()) { player.awardStat(Stats.ITEM_USED.get(this)); diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/item/SpawnEggItem.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/item/SpawnEggItem.java.patch index 7a0553a75..3c8ebd8ec 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/item/SpawnEggItem.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/item/SpawnEggItem.java.patch @@ -2,7 +2,6 @@ +++ b/net/minecraft/world/item/SpawnEggItem.java @@ -57,6 +_,23 @@ if (level.getBlockEntity(clickedPos) instanceof Spawner spawner) { - if (level.paperConfig().entities.spawning.disableMobSpawnerSpawnEggTransformation) return InteractionResult.FAIL; // Paper - Allow disabling mob spawner spawn egg transformation EntityType type = this.getType(level.registryAccess(), itemInHand); + // Purpur start - PlayerSetSpawnerTypeWithEggEvent + if (spawner instanceof net.minecraft.world.level.block.entity.SpawnerBlockEntity) { diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/item/ThrowablePotionItem.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/item/ThrowablePotionItem.java.patch index 5cf5ead6e..0b61e0ac7 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/item/ThrowablePotionItem.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/item/ThrowablePotionItem.java.patch @@ -3,9 +3,7 @@ @@ -24,7 +_,7 @@ ItemStack itemInHand = player.getItemInHand(hand); if (level instanceof ServerLevel serverLevel) { - // Paper start - PlayerLaunchProjectileEvent - final Projectile.Delayed thrownPotion = Projectile.spawnProjectileFromRotationDelayed(this::createPotion, serverLevel, itemInHand, player, -20.0F, PROJECTILE_SHOOT_POWER, 1.0F); + final Projectile.Delayed thrownPotion = Projectile.spawnProjectileFromRotationDelayed(this::createPotion, serverLevel, itemInHand, player, -20.0F, PROJECTILE_SHOOT_POWER, (float) serverLevel.purpurConfig.throwablePotionProjectileOffset); // Purpur - Projectile offset config - com.destroystokyo.paper.event.player.PlayerLaunchProjectileEvent event = new com.destroystokyo.paper.event.player.PlayerLaunchProjectileEvent((org.bukkit.entity.Player) player.getBukkitEntity(), org.bukkit.craftbukkit.inventory.CraftItemStack.asCraftMirror(itemInHand), (org.bukkit.entity.Projectile) thrownPotion.projectile().getBukkitEntity()); if (event.callEvent() && thrownPotion.attemptSpawn()) { if (event.shouldConsume()) { diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/item/TridentItem.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/item/TridentItem.java.patch index dccf0bfa8..7aad16073 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/item/TridentItem.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/item/TridentItem.java.patch @@ -2,18 +2,12 @@ +++ b/net/minecraft/world/item/TridentItem.java @@ -83,7 +_,7 @@ if (tridentSpinAttackStrength == 0.0F) { - ItemStack itemStack = stack.copyWithCount(1); // Paper - Projectile.Delayed tridentDelayed = Projectile.spawnProjectileFromRotationDelayed( // Paper - PlayerLaunchProjectileEvent( - ThrownTrident::new, serverLevel, itemStack, player, 0.0F, 2.5F, 1.0F + ThrownTrident::new, serverLevel, itemStack, player, 0.0F, 2.5F, (float) serverLevel.purpurConfig.tridentProjectileOffset // Purpur - Projectile offset config ); - // Paper start - PlayerLaunchProjectileEvent - com.destroystokyo.paper.event.player.PlayerLaunchProjectileEvent event = new com.destroystokyo.paper.event.player.PlayerLaunchProjectileEvent((org.bukkit.entity.Player) player.getBukkitEntity(), org.bukkit.craftbukkit.inventory.CraftItemStack.asCraftMirror(stack), (org.bukkit.entity.Projectile) tridentDelayed.projectile().getBukkitEntity()); @@ -94,6 +_,7 @@ return false; } - ThrownTrident thrownTrident = tridentDelayed.projectile(); // Paper - PlayerLaunchProjectileEvent + thrownTrident.setActualEnchantments(stack.getEnchantments()); // Purpur - Add an option to fix MC-3304 projectile looting if (event.shouldConsume()) { - stack.hurtWithoutBreaking(1, player); // Paper - PlayerLaunchProjectileEvent } diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/item/enchantment/ItemEnchantments.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/item/enchantment/ItemEnchantments.java.patch index 9671562b1..41046ed8c 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/item/enchantment/ItemEnchantments.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/item/enchantment/ItemEnchantments.java.patch @@ -3,12 +3,10 @@ @@ -32,7 +_,7 @@ private static final java.util.Comparator> ENCHANTMENT_ORDER = java.util.Comparator.comparing(Holder::getRegisteredName); public static final ItemEnchantments EMPTY = new ItemEnchantments(new it.unimi.dsi.fastutil.objects.Object2IntAVLTreeMap<>(ENCHANTMENT_ORDER)); - // Paper end - sort enchantments - private static final Codec LEVEL_CODEC = Codec.intRange(1, 255); + private static final Codec LEVEL_CODEC = Codec.intRange(1, (org.purpurmc.purpur.PurpurConfig.clampEnchantLevels ? 255 : 32767)); // Purpur - Add toggle for enchant level clamping public static final Codec CODEC = Codec.unboundedMap(Enchantment.CODEC, LEVEL_CODEC) .xmap( - map -> new net.minecraft.world.item.enchantment.ItemEnchantments(net.minecraft.Util.make(new it.unimi.dsi.fastutil.objects.Object2IntAVLTreeMap<>(ENCHANTMENT_ORDER), m -> m.putAll(map))), // Paper - sort enchantments @@ -50,7 +_,7 @@ for (Entry> entry : enchantments.object2IntEntrySet()) { diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/item/trading/MerchantOffer.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/item/trading/MerchantOffer.java.patch index 6a3b114a8..1d3b3c2a4 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/item/trading/MerchantOffer.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/item/trading/MerchantOffer.java.patch @@ -4,12 +4,10 @@ } public void updateDemand() { -- this.demand = Math.max(0, this.demand + this.uses - (this.maxUses - this.uses)); // Paper - Fix MC-163962 + // Purpur start - Configurable minimum demand for trades + this.updateDemand(0); + } + public void updateDemand(int minimumDemand) { -+ this.demand = Math.max(minimumDemand, this.demand + this.uses - (this.maxUses - this.uses)); // Paper - Fix MC-163962 + // Purpur end - Configurable minimum demand for trades } diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/level/BaseSpawner.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/level/BaseSpawner.java.patch index ad89287e0..de4ad9844 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/level/BaseSpawner.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/level/BaseSpawner.java.patch @@ -5,6 +5,5 @@ public boolean isNearPlayer(Level level, BlockPos pos) { + if (level.purpurConfig.spawnerDeactivateByRedstone && level.hasNeighborSignal(pos)) return false; // Purpur - Redstone deactivates spawners - return level.hasNearbyAlivePlayerThatAffectsSpawning(pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, this.requiredPlayerRange); // Paper - Affects Spawning API } diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/level/Level.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/level/Level.java.patch index 73f664b3b..acd6e7413 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/level/Level.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/level/Level.java.patch @@ -2,13 +2,10 @@ +++ b/net/minecraft/world/level/Level.java @@ -158,11 +_,55 @@ } - // Paper end - add paper world config + public final org.purpurmc.purpur.PurpurWorldConfig purpurConfig; // Purpur - Purpur config files public static @Nullable BlockPos lastPhysicsProblem; // Spigot private int tileTickPosition; - public final Map explosionDensityCache = new java.util.HashMap<>(); // Paper - Optimize explosions - public java.util.ArrayDeque redstoneUpdateInfos; // Paper - Faster redstone torch rapid clock removal; Move from Map in BlockRedstoneTorch to here + // Purpur start - Add adjustable breeding cooldown to config + private com.google.common.cache.Cache playerBreedingCooldowns; @@ -59,7 +56,6 @@ @@ -206,6 +_,8 @@ ) { this.spigotConfig = new org.spigotmc.SpigotWorldConfig(((net.minecraft.world.level.storage.PrimaryLevelData) levelData).getLevelName()); // Spigot - this.paperConfig = paperWorldConfigCreator.apply(this.spigotConfig); // Paper - create paper world config + this.purpurConfig = new org.purpurmc.purpur.PurpurWorldConfig(((net.minecraft.world.level.storage.PrimaryLevelData) levelData).getLevelName(), env); // Purpur - Purpur config files + this.playerBreedingCooldowns = this.getNewBreedingCooldownCache(); // Purpur - Add adjustable breeding cooldown to config this.generator = gen; diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/level/NaturalSpawner.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/level/NaturalSpawner.java.patch index 67708c82c..a2236d048 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/level/NaturalSpawner.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/level/NaturalSpawner.java.patch @@ -8,4 +8,3 @@ + Player nearestPlayer = level.getNearestPlayer(d, y, d1, -1.0, level.purpurConfig.mobSpawningIgnoreCreativePlayers); // Purpur - mob spawning option to ignore creative players if (nearestPlayer != null) { double d2 = nearestPlayer.distanceToSqr(d, y, d1); - if (level.isLoadedAndInBounds(mutableBlockPos) && isRightDistanceToPlayerAndSpawnPoint(level, chunk, mutableBlockPos, d2)) { // Paper - don't load chunks for mob spawn diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/BedBlock.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/BedBlock.java.patch index e0980cdaf..618b0cb18 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/BedBlock.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/BedBlock.java.patch @@ -8,7 +8,6 @@ + if (level.purpurConfig.bedExplode) level.explode(null, level.damageSources().badRespawnPointExplosion(center), null, center, (float) level.purpurConfig.bedExplosionPower, level.purpurConfig.bedExplosionFire, level.purpurConfig.bedExplosionEffect); // Purpur - Implement bed explosion options return InteractionResult.SUCCESS_SERVER; } else if (state.getValue(OCCUPIED)) { - if (!BedBlock.canSetSpawn(level)) return this.explodeBed(state, level, pos); // Paper - check explode first @@ -146,7 +_,7 @@ } diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/Block.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/Block.java.patch index aee7753ae..6b6f79e68 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/Block.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/Block.java.patch @@ -8,18 +8,13 @@ + public float fallDamageMultiplier = 1.0F; + public float fallDistanceMultiplier = 1.0F; + // Purpur end - Configurable block fall damage modifiers - // Paper start - Protect Bedrock and End Portal/Frames from being destroyed public final boolean isDestroyable() { - return io.papermc.paper.configuration.GlobalConfiguration.get().unsupportedSettings.allowPermanentBlockBreakExploits || -@@ -345,7 +_,7 @@ - event.setExpToDrop(block.getExpDrop(state, serverLevel, pos, net.minecraft.world.item.ItemStack.EMPTY, true)); // Paper - Properly handle xp dropping + return @@ -345,7 +_,7 @@ event.callEvent(); for (org.bukkit.inventory.ItemStack drop : event.getDrops()) { - popResource(serverLevel, pos, org.bukkit.craftbukkit.inventory.CraftItemStack.asNMSCopy(drop)); + popResource(serverLevel, pos, applyLoreFromTile(org.bukkit.craftbukkit.inventory.CraftItemStack.asNMSCopy(drop), blockEntity)); // Purpur - Persistent BlockEntity Lore and DisplayName } - state.spawnAfterBreak(serverLevel, pos, ItemStack.EMPTY, false); // Paper - Properly handle xp dropping - block.popExperience(serverLevel, pos, event.getExpToDrop()); // Paper - Properly handle xp dropping @@ -363,7 +_,7 @@ public static void dropResources(BlockState state, LevelAccessor level, BlockPos pos, @Nullable BlockEntity blockEntity) { @@ -31,11 +26,9 @@ } @@ -375,11 +_,30 @@ public static void dropResources(BlockState state, Level level, BlockPos pos, @Nullable BlockEntity blockEntity, @Nullable Entity entity, ItemStack tool, boolean dropExperience) { - // Paper end - Properly handle xp dropping if (level instanceof ServerLevel) { - getDrops(state, (ServerLevel)level, pos, blockEntity, entity, tool).forEach(stack -> popResource(level, pos, stack)); + getDrops(state, (ServerLevel)level, pos, blockEntity, entity, tool).forEach(stack -> popResource(level, pos, applyLoreFromTile(stack, blockEntity))); // Purpur - Persistent BlockEntity Lore and DisplayName - state.spawnAfterBreak((ServerLevel)level, pos, tool, dropExperience); // Paper - Properly handle xp dropping } } diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/CactusBlock.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/CactusBlock.java.patch index 4fec7e3b9..855907ca5 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/CactusBlock.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/CactusBlock.java.patch @@ -33,7 +33,6 @@ + cactusHeight++; + } + -+ return cactusHeight < ((Level) world).paperConfig().maxGrowthHeight.cactus; + } + + @Override @@ -47,7 +46,6 @@ + while (world.getBlockState(pos.below(cactusHeight)).is(this)) { + cactusHeight++; + } -+ for (int i = 0; i <= world.paperConfig().maxGrowthHeight.cactus - cactusHeight; i++) { + world.setBlockAndUpdate(pos.above(i), state.setValue(CactusBlock.AGE, 0)); + } + } diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/CarvedPumpkinBlock.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/CarvedPumpkinBlock.java.patch index 3ab8cbc0e..b1c6cfc46 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/CarvedPumpkinBlock.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/CarvedPumpkinBlock.java.patch @@ -31,6 +31,4 @@ + ironGolem.setSummoner(placer == null ? null : placer.getUUID()); + } + // Purpur end - Summoner API - // clearPatternBlocks(level, patternMatch); // Paper - moved down golem.snapTo(pos.getX() + 0.5, pos.getY() + 0.05, pos.getZ() + 0.5, 0.0F, 0.0F); - // Paper start diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/ComposterBlock.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/ComposterBlock.java.patch index 8ee18624a..c55d6fc38 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/ComposterBlock.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/ComposterBlock.java.patch @@ -6,11 +6,9 @@ if (levelValue < 8 && COMPOSTABLES.containsKey(stack.getItem())) { - if (levelValue < 7 && !level.isClientSide) { - BlockState blockState = addItem(player, state, level, pos, stack); -- // Paper start - handle cancelled events - if (blockState == null) { - return InteractionResult.PASS; - } -- // Paper end - level.levelEvent(1500, pos, state != blockState ? 1 : 0); - player.awardStat(Stats.ITEM_USED.get(stack.getItem())); - stack.consume(1, player); @@ -47,11 +45,9 @@ + private static @Nullable BlockState process(int levelValue, Player player, BlockState state, Level level, BlockPos pos, ItemStack stack) { + if (levelValue < 7 && !level.isClientSide) { + BlockState iblockdata1 = ComposterBlock.addItem(player, state, level, pos, stack); -+ // Paper start - handle cancelled events + if (iblockdata1 == null) { + return null; + } -+ // Paper end + + level.levelEvent(1500, pos, state != iblockdata1 ? 1 : 0); + player.awardStat(Stats.ITEM_USED.get(stack.getItem())); diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/CropBlock.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/CropBlock.java.patch index 667d7f96f..bbd5462ae 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/CropBlock.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/CropBlock.java.patch @@ -3,8 +3,7 @@ @@ -169,7 +_,7 @@ @Override protected void entityInside(BlockState state, Level level, BlockPos pos, Entity entity, InsideBlockEffectApplier effectApplier) { - if (!new io.papermc.paper.event.entity.EntityInsideBlockEvent(entity.getBukkitEntity(), org.bukkit.craftbukkit.block.CraftBlock.at(level, pos)).callEvent()) { return; } // Paper - Add EntityInsideBlockEvent -- if (level instanceof ServerLevel serverLevel && entity instanceof Ravager && org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(entity, pos, Blocks.AIR.defaultBlockState(), !serverLevel.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING))) { // CraftBukkit + if (!new - if (level instanceof ServerLevel serverLevel && entity instanceof Ravager && org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(entity, pos, Blocks.AIR.defaultBlockState(), !serverLevel.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING))) { // CraftBukkit + if (level instanceof ServerLevel serverLevel && entity instanceof Ravager && serverLevel.purpurConfig.ravagerGriefableBlocks.contains(serverLevel.getBlockState(pos).getBlock()) && org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(entity, pos, Blocks.AIR.defaultBlockState(), !serverLevel.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING))) { // CraftBukkit // Purpur - Configurable ravager griefable blocks list serverLevel.destroyBlock(pos, true, entity); } diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/FarmBlock.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/FarmBlock.java.patch index c04018815..42a65bd5e 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/FarmBlock.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/FarmBlock.java.patch @@ -44,6 +44,5 @@ - return false; + return ((ServerLevel) level).purpurConfig.farmlandGetsMoistFromBelow && level.getFluidState(pos.relative(Direction.DOWN)).is(FluidTags.WATER); // Purpur - Allow soil to moisten from water directly under it - // Paper end - Perf: remove abstract block iteration } diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/IceBlock.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/IceBlock.java.patch index 0f5251d57..376e36279 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/IceBlock.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/IceBlock.java.patch @@ -2,7 +2,6 @@ +++ b/net/minecraft/world/level/block/IceBlock.java @@ -40,7 +_,7 @@ public void afterDestroy(Level level, BlockPos pos, ItemStack stack) { - // Paper end - Improve Block#breakNaturally API if (!EnchantmentHelper.hasTag(stack, EnchantmentTags.PREVENTS_ICE_MELTING)) { - if (level.dimensionType().ultraWarm()) { + if (level.isNether() || (level.isTheEnd() && !org.purpurmc.purpur.PurpurConfig.allowWaterPlacementInTheEnd)) { // Purpur - Add allow water in end world option diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/LiquidBlock.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/LiquidBlock.java.patch index ef0559942..9497468bb 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/LiquidBlock.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/LiquidBlock.java.patch @@ -6,7 +6,6 @@ protected void onPlace(BlockState state, Level level, BlockPos pos, BlockState oldState, boolean isMoving) { - if (this.shouldSpreadLiquid(level, pos, state)) { + if (level.purpurConfig.tickFluids && this.shouldSpreadLiquid(level, pos, state)) { // Purpur - Tick fluids config - level.scheduleTick(pos, state.getFluidState().getType(), this.getFlowSpeed(level, pos)); // Paper - Configurable speed for water flowing over lava } } @@ -169,7 +_,7 @@ @@ -24,6 +23,5 @@ protected void neighborChanged(BlockState state, Level level, BlockPos pos, Block neighborBlock, @Nullable Orientation orientation, boolean movedByPiston) { - if (this.shouldSpreadLiquid(level, pos, state)) { + if (level.purpurConfig.tickFluids && this.shouldSpreadLiquid(level, pos, state)) { // Purpur - Tick fluids config - level.scheduleTick(pos, state.getFluidState().getType(), this.getFlowSpeed(level, pos)); // Paper - Configurable speed for water flowing over lava } } diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/SpawnerBlock.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/SpawnerBlock.java.patch index 9dfdef79a..0f370cdd0 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/SpawnerBlock.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/SpawnerBlock.java.patch @@ -18,16 +18,14 @@ + } + + if (type.isPresent()) { -+ final net.kyori.adventure.text.Component mobName = io.papermc.paper.adventure.PaperAdventure.asAdventure(type.get().getDescription()); -+ ++ final net.kyori.adventure.text.Component mobName = + + String name = level.purpurConfig.silkTouchSpawnerName; + if (name != null && !name.isEmpty() && !name.equals("Monster Spawner")) { + net.kyori.adventure.text.Component displayName = net.kyori.adventure.text.minimessage.MiniMessage.miniMessage().deserialize(name, net.kyori.adventure.text.minimessage.tag.resolver.Placeholder.component("mob", mobName)); + if (name.startsWith("")) { + displayName = displayName.decoration(net.kyori.adventure.text.format.TextDecoration.ITALIC, false); + } -+ item.set(net.minecraft.core.component.DataComponents.CUSTOM_NAME, io.papermc.paper.adventure.PaperAdventure.asVanilla(displayName)); -+ } ++ item.set(net.minecraft.core.component.DataComponents.CUSTOM_NAME, + } + + java.util.List lore = level.purpurConfig.silkTouchSpawnerLore; + if (lore != null && !lore.isEmpty()) { @@ -38,8 +36,7 @@ + if (line.startsWith("")) { + lineComponent = lineComponent.decoration(net.kyori.adventure.text.format.TextDecoration.ITALIC, false); + } -+ loreComponentList.add(io.papermc.paper.adventure.PaperAdventure.asVanilla(lineComponent)); -+ } ++ loreComponentList.add(+ } + + item.set(net.minecraft.core.component.DataComponents.LORE, new net.minecraft.world.item.component.ItemLore(loreComponentList, loreComponentList)); + } diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/SugarCaneBlock.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/SugarCaneBlock.java.patch index f388f13ce..856aa6cbb 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/SugarCaneBlock.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/SugarCaneBlock.java.patch @@ -24,7 +24,6 @@ + reedHeight++; + } + -+ return reedHeight < ((net.minecraft.world.level.Level) world).paperConfig().maxGrowthHeight.reeds; + } + + @Override @@ -38,7 +37,6 @@ + while (world.getBlockState(pos.below(reedHeight)).is(this)) { + reedHeight++; + } -+ for (int i = 0; i <= world.paperConfig().maxGrowthHeight.reeds - reedHeight; i++) { + world.setBlockAndUpdate(pos.above(i), state.setValue(SugarCaneBlock.AGE, 0)); + } + } diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/entity/BeaconBlockEntity.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/entity/BeaconBlockEntity.java.patch index 8de0db582..803456ae3 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/entity/BeaconBlockEntity.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/entity/BeaconBlockEntity.java.patch @@ -39,6 +39,5 @@ - if (blockEntity.levels > 0 && !blockEntity.beamSections.isEmpty()) { + if (blockEntity.levels > 0 && (!blockEntity.beamSections.isEmpty() || (level.purpurConfig.beaconAllowEffectsWithTintedGlass && isTintedGlass))) { // Purpur - allow beacon effects when covered by tinted glass - applyEffects(level, pos, blockEntity.levels, blockEntity.primaryPower, blockEntity.secondaryPower, blockEntity); // Paper - Custom beacon ranges playSound(level, pos, SoundEvents.BEACON_AMBIENT); } diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/entity/BeehiveBlockEntity.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/entity/BeehiveBlockEntity.java.patch index c78bf7ee8..9bf2cf6db 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/entity/BeehiveBlockEntity.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/entity/BeehiveBlockEntity.java.patch @@ -40,7 +40,6 @@ + } + // Purpur end - Stored Bee API + - // Paper start - Add EntityBlockStorage clearEntities public void clearBees() { this.stored.clear(); @@ -389,8 +_,8 @@ @@ -51,6 +50,5 @@ - private final BeehiveBlockEntity.Occupant occupant; + public static class BeeData { // Purpur - make public - Stored Bee API + public final BeehiveBlockEntity.Occupant occupant; // Purpur - make public - Stored Bee API - private int exitTickCounter; // Paper - Fix bees aging inside hives; separate counter for checking if bee should exit to reduce exit attempts private int ticksInHive; diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/entity/BlockEntity.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/entity/BlockEntity.java.patch index 29f2e15d3..7ad159417 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/entity/BlockEntity.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/entity/BlockEntity.java.patch @@ -3,7 +3,6 @@ @@ -104,6 +_,10 @@ this.persistentDataContainer.putAll((CompoundTag) persistentDataTag); } - // Paper end - read persistent data container + + + this.persistentLore = tag.read("Purpur.persistentLore", net.minecraft.world.item.component.ItemLore.CODEC).orElse(null); // Purpur - Persistent BlockEntity Lore and DisplayName diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/entity/SignBlockEntity.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/entity/SignBlockEntity.java.patch index 07f5fcf82..a0601ea6b 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/entity/SignBlockEntity.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/entity/SignBlockEntity.java.patch @@ -11,8 +11,7 @@ + if (player.hasPermission("purpur.sign.style")) line = line.replaceAll("(?i)&([l-or])", "\u00a7$1"); + if (player.hasPermission("purpur.sign.magic")) line = line.replaceAll("(?i)&([kr])", "\u00a7$1"); + -+ return io.papermc.paper.adventure.PaperAdventure.asVanilla(net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer.legacySection().deserialize(line)); -+ } else { ++ return + } else { + return Component.literal(line).setStyle(style); + } + } @@ -26,18 +25,13 @@ + + org.bukkit.entity.Player craftPlayer = (org.bukkit.craftbukkit.entity.CraftPlayer) player.getBukkitEntity(); // Purpur - Signs allow color codes if (player.isTextFilteringEnabled()) { -- text = text.setMessage(i, Component.literal(net.minecraft.util.StringUtil.filterText(filteredText1.filteredOrEmpty())).setStyle(style)); // Paper - filter sign text to chat only -+ text = text.setMessage(i, translateColors(craftPlayer, net.minecraft.util.StringUtil.filterText(filteredText1.filteredOrEmpty()), style)); // Paper - filter sign text to chat only // Purpur - Signs allow color codes } else { text = text.setMessage( -- i, Component.literal(filteredText1.raw()).setStyle(style), Component.literal(net.minecraft.util.StringUtil.filterText(filteredText1.filteredOrEmpty())).setStyle(style) // Paper - filter sign text to chat only -+ i, translateColors(craftPlayer, net.minecraft.util.StringUtil.filterText(filteredText1.raw()), style), translateColors(craftPlayer, net.minecraft.util.StringUtil.filterText(filteredText1.filteredOrEmpty()), style) // Paper - filter sign text to chat only // Purpur - Signs allow color codes ); } } @@ -297,6 +_,26 @@ // CraftBukkit - this - return new CommandSourceStack(commandSource, Vec3.atCenterOf(pos), Vec2.ZERO, (ServerLevel)level, 2, string, component, level.getServer(), player); // Paper - Fix commands from signs not firing command events } + + // Purpur start - Signs allow color codes @@ -47,8 +41,7 @@ + final Component[] lines = front ? frontText.getMessages(filtered) : backText.getMessages(filtered); + final String side = front ? "front_text" : "back_text"; + for (int i = 0; i < 4; i++) { -+ final var component = io.papermc.paper.adventure.PaperAdventure.asAdventure(lines[i]); -+ final String line = net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer.legacyAmpersand().serialize(component); ++ final var component = + final String line = net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer.legacyAmpersand().serialize(component); + final var text = net.kyori.adventure.text.Component.text(line); + final String json = net.kyori.adventure.text.serializer.gson.GsonComponentSerializer.gson().serialize(text); + final CompoundTag sideNbt = nbt.getCompoundOrEmpty(side); diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/level/chunk/storage/RegionFileStorage.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/level/chunk/storage/RegionFileStorage.java.patch index f9e571450..e2ed8e52a 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/level/chunk/storage/RegionFileStorage.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/level/chunk/storage/RegionFileStorage.java.patch @@ -2,9 +2,8 @@ +++ b/net/minecraft/world/level/chunk/storage/RegionFileStorage.java @@ -49,7 +_,7 @@ - // Paper start private static void printOversizedLog(String msg, Path file, int x, int z) { -- org.apache.logging.log4j.LogManager.getLogger().fatal(msg + " (" + file.toString().replaceAll(".+[\\\\/]", "") + " - " + x + "," + z + ") Go clean it up to remove this message. /minecraft:tp " + (x<<4)+" 128 "+(z<<4) + " - DO NOT REPORT THIS TO PAPER - You may ask for help on Discord, but do not file an issue. These error messages can not be removed."); +- org.apache.logging.log4j.LogManager.getLogger().fatal(msg + " (" + file.toString().replaceAll(".+[\\\\/]", "") + " - " + x + "," + z + ") Go clean it up to remove this message. /minecraft:tp " + (x<<4)+" 128 "+(z<<4) + " - DO NOT REPORT THIS TO SPIGOT - You may ask for help on Discord, but do not file an issue. These error messages can not be removed."); + org.apache.logging.log4j.LogManager.getLogger().fatal(msg + " (" + file.toString().replaceAll(".+[\\\\/]", "") + " - " + x + "," + z + ") Go clean it up to remove this message. /minecraft:tp " + (x<<4)+" 128 "+(z<<4) + " - DO NOT REPORT THIS TO PURPUR - You may ask for help on Discord, but do not file an issue. These error messages can not be removed."); // Purpur - Rebrand } diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/level/levelgen/PhantomSpawner.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/level/levelgen/PhantomSpawner.java.patch index 5652d79c6..b0e66831b 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/level/levelgen/PhantomSpawner.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/level/levelgen/PhantomSpawner.java.patch @@ -1,13 +1,10 @@ --- a/net/minecraft/world/level/levelgen/PhantomSpawner.java +++ b/net/minecraft/world/level/levelgen/PhantomSpawner.java @@ -38,13 +_,13 @@ - int spawnAttemptMaxSeconds = level.paperConfig().entities.behavior.phantomsSpawnAttemptMaxSeconds; this.nextTick += (spawnAttemptMinSeconds + randomSource.nextInt(spawnAttemptMaxSeconds - spawnAttemptMinSeconds + 1)) * 20; - // Paper end - Ability to control player's insomnia and phantoms - if (level.getSkyDarken() >= 5 || !level.dimensionType().hasSkyLight()) { + if (level.getSkyDarken() >= level.purpurConfig.phantomSpawnMinSkyDarkness || !level.dimensionType().hasSkyLight()) { // Purpur - Add phantom spawning options for (ServerPlayer serverPlayer : level.players()) { - if (!serverPlayer.isSpectator() && (!level.paperConfig().entities.behavior.phantomsDoNotSpawnOnCreativePlayers || !serverPlayer.isCreative())) { // Paper - Add phantom creative and insomniac controls BlockPos blockPos = serverPlayer.blockPosition(); - if (!level.dimensionType().hasSkyLight() || blockPos.getY() >= level.getSeaLevel() && level.canSeeSky(blockPos)) { + if (!level.dimensionType().hasSkyLight() || (!level.purpurConfig.phantomSpawnOnlyAboveSeaLevel || blockPos.getY() >= level.getSeaLevel()) && (!level.purpurConfig.phantomSpawnOnlyWithVisibleSky || level.canSeeSky(blockPos))) { // Purpur - Add phantom spawning options @@ -25,4 +22,3 @@ + int i2 = level.purpurConfig.phantomSpawnMinPerAttempt + randomSource.nextInt((level.purpurConfig.phantomSpawnMaxPerAttempt < 0 ? currentDifficultyAt.getDifficulty().getId() : level.purpurConfig.phantomSpawnMaxPerAttempt - level.purpurConfig.phantomSpawnMinPerAttempt) + 1); // Purpur - Add phantom spawning options for (int i3 = 0; i3 < i2; i3++) { - // Paper start - PhantomPreSpawnEvent diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/level/material/WaterFluid.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/level/material/WaterFluid.java.patch index 3bc14791b..2073fbbd2 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/level/material/WaterFluid.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/level/material/WaterFluid.java.patch @@ -11,6 +11,5 @@ + } + // Purpur end - Implement infinite liquids + - // Paper start - Add BlockBreakBlockEvent @Override protected void beforeDestroyingBlock(LevelAccessor level, BlockPos pos, BlockState state, BlockPos source) { diff --git a/purpur-server/paper-patches/features/0004-Configurable-void-damage-height-and-damage.patch b/purpur-server/paper-patches/features/0004-Configurable-void-damage-height-and-damage.patch deleted file mode 100644 index 01ab6babe..000000000 --- a/purpur-server/paper-patches/features/0004-Configurable-void-damage-height-and-damage.patch +++ /dev/null @@ -1,115 +0,0 @@ -From 0000000000000000000000000000000000000000 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 and damage - -temporarily migrate to paper's config -drop patch on the next minecraft release - -diff --git a/src/main/java/io/papermc/paper/configuration/PaperConfigurations.java b/src/main/java/io/papermc/paper/configuration/PaperConfigurations.java -index e48fa405d92fab221fa8331b65c8f324e801d439..e319d6337811051de478d584a37015c450960701 100644 ---- a/src/main/java/io/papermc/paper/configuration/PaperConfigurations.java -+++ b/src/main/java/io/papermc/paper/configuration/PaperConfigurations.java -@@ -267,6 +267,7 @@ public class PaperConfigurations extends Configurations { - String minecraftVersion = Bukkit.getVersion(); -@@ -602,16 +_,8 @@ - })); - - metrics.addCustomChart(new Metrics.SingleLineChart("players", () -> Bukkit.getOnlinePlayers().size())); -- metrics.addCustomChart(new Metrics.SimplePie("online_mode", () -> Bukkit.getOnlineMode() ? "online" : "offline")); -- final String paperVersion; -- final String implVersion = org.bukkit.craftbukkit.Main.class.getPackage().getImplementationVersion(); -- if (implVersion != null) { -- final String buildOrHash = implVersion.substring(implVersion.lastIndexOf('-') + 1); -- paperVersion = "git-Paper-%s-%s".formatted(Bukkit.getServer().getMinecraftVersion(), buildOrHash); -- } else { -- paperVersion = "unknown"; -- } -- metrics.addCustomChart(new Metrics.SimplePie("paper_version", () -> paperVersion)); -+ metrics.addCustomChart(new Metrics.SimplePie("online_mode", () -> Bukkit.getOnlineMode() ? "online" : (io.papermc.paper.configuration.GlobalConfiguration.get().proxies.isProxyOnlineMode() ? "bungee" : "offline"))); // Purpur - Purpur config files -+ metrics.addCustomChart(new Metrics.SimplePie("purpur_version", () -> (org.bukkit.craftbukkit.Main.class.getPackage().getImplementationVersion() != null) ? org.bukkit.craftbukkit.Main.class.getPackage().getImplementationVersion() : "unknown")); // Purpur - Purpur config files - - metrics.addCustomChart(new Metrics.DrilldownPie("java_version", () -> { - Map> map = new HashMap<>(); diff --git a/purpur-server/paper-patches/files/src/main/java/com/destroystokyo/paper/PaperVersionFetcher.java.patch b/purpur-server/paper-patches/files/src/main/java/com/destroystokyo/paper/PaperVersionFetcher.java.patch deleted file mode 100644 index 8440b425a..000000000 --- a/purpur-server/paper-patches/files/src/main/java/com/destroystokyo/paper/PaperVersionFetcher.java.patch +++ /dev/null @@ -1,78 +0,0 @@ ---- a/src/main/java/com/destroystokyo/paper/PaperVersionFetcher.java -+++ b/src/main/java/com/destroystokyo/paper/PaperVersionFetcher.java -@@ -35,7 +_,10 @@ - private static final Logger LOGGER = LogUtils.getClassLogger(); - private static final int DISTANCE_ERROR = -1; - private static final int DISTANCE_UNKNOWN = -2; -- private static final String DOWNLOAD_PAGE = "https://papermc.io/downloads/paper"; -+ // Purpur start - Rebrand -+ private static final String DOWNLOAD_PAGE = "https://purpurmc.org/downloads"; -+ private static int distance = DISTANCE_UNKNOWN; public int distance() { return distance; } -+ // Purpur end - Rebrand - - @Override - public long getCacheTime() { -@@ -49,7 +_,7 @@ - if (build.buildNumber().isEmpty() && build.gitCommit().isEmpty()) { - updateMessage = text("You are running a development version without access to version information", color(0xFF5300)); - } else { -- updateMessage = getUpdateStatusMessage("PaperMC/Paper", build); -+ updateMessage = getUpdateStatusMessage("PurpurMC/Purpur", build); // Purpur - Rebrand - } - final @Nullable Component history = this.getHistory(); - -@@ -57,7 +_,7 @@ - } - - private static Component getUpdateStatusMessage(final String repo, final ServerBuildInfo build) { -- int distance = DISTANCE_ERROR; -+ //int distance = DISTANCE_ERROR; // Purpur - use field - Rebrand - - final OptionalInt buildNumber = build.buildNumber(); - if (buildNumber.isPresent()) { -@@ -71,10 +_,10 @@ - } - - return switch (distance) { -- case DISTANCE_ERROR -> text("Error obtaining version information", NamedTextColor.YELLOW); -- case 0 -> text("You are running the latest version", NamedTextColor.GREEN); -- case DISTANCE_UNKNOWN -> text("Unknown version", NamedTextColor.YELLOW); -- default -> text("You are " + distance + " version(s) behind", NamedTextColor.YELLOW) -+ case DISTANCE_ERROR -> text("* Error obtaining version information", NamedTextColor.RED); // Purpur - Rebrand -+ case 0 -> text("* You are running the latest version", NamedTextColor.GREEN); // Purpur - Rebrand -+ case DISTANCE_UNKNOWN -> text("* Unknown version", NamedTextColor.YELLOW); // Purpur - Rebrand -+ default -> text("* You are " + distance + " version(s) behind", NamedTextColor.YELLOW) // Purpur - Rebrand - .append(Component.newline()) - .append(text("Download the new version at: ") - .append(text(DOWNLOAD_PAGE, NamedTextColor.GOLD) -@@ -86,18 +_,15 @@ - private static int fetchDistanceFromSiteApi(final ServerBuildInfo build, final int jenkinsBuild) { - try { - try (final BufferedReader reader = Resources.asCharSource( -- URI.create("https://api.papermc.io/v2/projects/paper/versions/" + build.minecraftVersionId()).toURL(), -+ URI.create("https://api.purpurmc.org/v2/purpur/" + build.minecraftVersionId()).toURL(), // Purpur - Rebrand - StandardCharsets.UTF_8 - ).openBufferedStream()) { - final JsonObject json = new Gson().fromJson(reader, JsonObject.class); -- final JsonArray builds = json.getAsJsonArray("builds"); -- final int latest = StreamSupport.stream(builds.spliterator(), false) -- .mapToInt(JsonElement::getAsInt) -- .max() -- .orElseThrow(); -+ //final JsonArray builds = json.getAsJsonArray("builds"); // Purpur - Rebrand -+ final int latest = json.getAsJsonObject("builds").getAsJsonPrimitive("latest").getAsInt(); // Purpur - Rebrand - return latest - jenkinsBuild; - } catch (final JsonSyntaxException ex) { -- LOGGER.error("Error parsing json from Paper's downloads API", ex); -+ LOGGER.error("Error parsing json from Purpur's downloads API", ex); // Purpur - Rebrand - return DISTANCE_ERROR; - } - } catch (final IOException e) { -@@ -141,6 +_,6 @@ - return null; - } - -- return text("Previous version: " + oldVersion, NamedTextColor.GRAY, TextDecoration.ITALIC); -+ return text("Previous: " + oldVersion, NamedTextColor.GRAY); // Purpur - Rebrand - } - } diff --git a/purpur-server/paper-patches/files/src/main/java/com/destroystokyo/paper/console/PaperConsole.java.patch b/purpur-server/paper-patches/files/src/main/java/com/destroystokyo/paper/console/PaperConsole.java.patch deleted file mode 100644 index 43b5c7a41..000000000 --- a/purpur-server/paper-patches/files/src/main/java/com/destroystokyo/paper/console/PaperConsole.java.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- a/src/main/java/com/destroystokyo/paper/console/PaperConsole.java -+++ b/src/main/java/com/destroystokyo/paper/console/PaperConsole.java -@@ -20,7 +_,7 @@ - @Override - protected LineReader buildReader(LineReaderBuilder builder) { - builder -- .appName("Paper") -+ .appName("Purpur") // Purpur - Rebrand - .variable(LineReader.HISTORY_FILE, java.nio.file.Paths.get(".console_history")) - .completer(new ConsoleCommandCompleter(this.server)) - .option(LineReader.Option.COMPLETE_IN_WORD, true); diff --git a/purpur-server/paper-patches/files/src/main/java/com/destroystokyo/paper/entity/ai/MobGoalHelper.java.patch b/purpur-server/paper-patches/files/src/main/java/com/destroystokyo/paper/entity/ai/MobGoalHelper.java.patch deleted file mode 100644 index 68250b56b..000000000 --- a/purpur-server/paper-patches/files/src/main/java/com/destroystokyo/paper/entity/ai/MobGoalHelper.java.patch +++ /dev/null @@ -1,13 +0,0 @@ ---- a/src/main/java/com/destroystokyo/paper/entity/ai/MobGoalHelper.java -+++ b/src/main/java/com/destroystokyo/paper/entity/ai/MobGoalHelper.java -@@ -27,6 +_,10 @@ - static { - // TODO these kinda should be checked on each release, in case obfuscation changes - deobfuscationMap.put("abstract_skeleton_1", "abstract_skeleton_melee"); -+ // Purpur start - Add option to disable zombie aggressiveness towards villagers -+ deobfuscationMap.put("zombie_1", "zombie_attack_villager"); -+ deobfuscationMap.put("drowned_1", "drowned_attack_villager"); -+ // Purpur end - Add option to disable zombie aggressiveness towards villagers - - ignored.add("goal_selector_1"); - ignored.add("goal_selector_2"); diff --git a/purpur-server/paper-patches/files/src/main/java/com/destroystokyo/paper/gui/RAMDetails.java.patch b/purpur-server/paper-patches/files/src/main/java/com/destroystokyo/paper/gui/RAMDetails.java.patch deleted file mode 100644 index e567d82a1..000000000 --- a/purpur-server/paper-patches/files/src/main/java/com/destroystokyo/paper/gui/RAMDetails.java.patch +++ /dev/null @@ -1,19 +0,0 @@ ---- a/src/main/java/com/destroystokyo/paper/gui/RAMDetails.java -+++ b/src/main/java/com/destroystokyo/paper/gui/RAMDetails.java -@@ -61,6 +_,7 @@ - - // Follows CraftServer#getTPS - double[] tps = new double[] { -+ server.tps5s.getAverage(), // Purpur - Add 5 second tps average in /tps - server.tps1.getAverage(), - server.tps5.getAverage(), - server.tps15.getAverage() -@@ -73,7 +_,7 @@ - vector.add("Memory use: " + (data.getUsedMem() / 1024L / 1024L) + " mb (" + (data.getFree() * 100L / data.getMax()) + "% free)"); - vector.add("Heap: " + (data.getTotal() / 1024L / 1024L) + " / " + (data.getMax() / 1024L / 1024L) + " mb"); - vector.add("Avg tick: " + DECIMAL_FORMAT.format((double)this.server.getAverageTickTimeNanos() / (double) TimeUtil.NANOSECONDS_PER_MILLISECOND) + " ms"); -- vector.add("TPS from last 1m, 5m, 15m: " + String.join(", ", tpsAvg)); -+ vector.add("TPS from last 5s, 1m, 5m, 15m: " + String.join(", ", tpsAvg)); // Purpur - Add 5 second tps average in /tps - setListData(vector); - } - diff --git a/purpur-server/paper-patches/files/src/main/java/io/papermc/paper/ServerBuildInfoImpl.java.patch b/purpur-server/paper-patches/files/src/main/java/io/papermc/paper/ServerBuildInfoImpl.java.patch deleted file mode 100644 index fd95c8364..000000000 --- a/purpur-server/paper-patches/files/src/main/java/io/papermc/paper/ServerBuildInfoImpl.java.patch +++ /dev/null @@ -1,31 +0,0 @@ ---- a/src/main/java/io/papermc/paper/ServerBuildInfoImpl.java -+++ b/src/main/java/io/papermc/paper/ServerBuildInfoImpl.java -@@ -31,6 +_,7 @@ - private static final String ATTRIBUTE_GIT_COMMIT = "Git-Commit"; - - private static final String BRAND_PAPER_NAME = "Paper"; -+ private static final String BRAND_PURPUR_NAME = "Purpur"; // Purpur - Rebrand - - private static final String BUILD_DEV = "DEV"; - -@@ -42,9 +_,9 @@ - this( - getManifestAttribute(manifest, ATTRIBUTE_BRAND_ID) - .map(Key::key) -- .orElse(BRAND_PAPER_ID), -+ .orElse(BRAND_PURPUR_ID), // Purpur - Fix pufferfish issues // Purpur - Rebrand - getManifestAttribute(manifest, ATTRIBUTE_BRAND_NAME) -- .orElse(BRAND_PAPER_NAME), -+ .orElse(BRAND_PURPUR_NAME), // Purpur - Fix pufferfish issues // Purpur - Rebrand - SharedConstants.getCurrentVersion().getId(), - SharedConstants.getCurrentVersion().getName(), - getManifestAttribute(manifest, ATTRIBUTE_BUILD_NUMBER) -@@ -61,7 +_,7 @@ - - @Override - public boolean isBrandCompatible(final @NotNull Key brandId) { -- return brandId.equals(this.brandId); -+ return brandId.equals(this.brandId) || brandId.equals(BRAND_PAPER_ID); // Purpur - Fix pufferfish issues // Purpur - Rebrand - } - - @Override diff --git a/purpur-server/paper-patches/files/src/main/java/io/papermc/paper/command/PaperPluginsCommand.java.patch b/purpur-server/paper-patches/files/src/main/java/io/papermc/paper/command/PaperPluginsCommand.java.patch deleted file mode 100644 index 8992c7e12..000000000 --- a/purpur-server/paper-patches/files/src/main/java/io/papermc/paper/command/PaperPluginsCommand.java.patch +++ /dev/null @@ -1,125 +0,0 @@ ---- a/src/main/java/io/papermc/paper/command/PaperPluginsCommand.java -+++ b/src/main/java/io/papermc/paper/command/PaperPluginsCommand.java -@@ -70,10 +_,10 @@ - this.setAliases(List.of("pl")); - } - -- private static List formatProviders(final TreeMap> plugins) { -+ private static List formatProviders(final TreeMap> plugins, CommandSender sender) { // Purpur - Improve output of plugins command - final List components = new ArrayList<>(plugins.size()); - for (final PluginProvider entry : plugins.values()) { -- components.add(formatProvider(entry)); -+ components.add(formatProvider(entry, sender)); // Purpur - Improve output of plugins command - } - - boolean isFirst = true; -@@ -100,15 +_,49 @@ - return formattedSubLists; - } - -- private static Component formatProvider(final PluginProvider provider) { -+ private static Component formatProvider(final PluginProvider provider, CommandSender sender) { // Purpur - Improve output of plugins command - final TextComponent.Builder builder = Component.text(); - if (provider instanceof final SpigotPluginProvider spigotPluginProvider && CraftMagicNumbers.isLegacy(spigotPluginProvider.getMeta())) { - builder.append(LEGACY_PLUGIN_STAR); - } - - final String name = provider.getMeta().getName(); -- final Component pluginName = Component.text(name, fromStatus(provider)) -- .clickEvent(ClickEvent.runCommand("/version " + name)); -+ // Purpur start - Improve output of plugins command -+ Component pluginName = Component.text(name, fromStatus(provider)) -+ .clickEvent(ClickEvent.suggestCommand("/version " + name)); -+ -+ if (sender instanceof org.bukkit.entity.Player && sender.hasPermission("bukkit.command.version")) { -+ // Event components -+ String description = provider.getMeta().getDescription(); -+ TextComponent.Builder hover = Component.text(); -+ hover.append(Component.text("Version: ", NamedTextColor.WHITE)).append(Component.text(provider.getMeta().getVersion(), NamedTextColor.GREEN)); -+ -+ if (description != null) { -+ hover.append(Component.newline()) -+ .append(Component.text("Description: ", NamedTextColor.WHITE)) -+ .append(Component.text(description, NamedTextColor.GREEN)); -+ } -+ -+ if (provider.getMeta().getWebsite() != null) { -+ hover.append(Component.newline()) -+ .append(Component.text("Website: ", NamedTextColor.WHITE)) -+ .append(Component.text(provider.getMeta().getWebsite(), NamedTextColor.GREEN)); -+ } -+ -+ if (!provider.getMeta().getAuthors().isEmpty()) { -+ hover.append(Component.newline()); -+ if (provider.getMeta().getAuthors().size() == 1) { -+ hover.append(Component.text("Author: ")); -+ } else { -+ hover.append(Component.text("Authors: ")); -+ } -+ -+ hover.append(getAuthors(provider.getMeta())); -+ } -+ -+ pluginName = pluginName.hoverEvent(hover.build()); -+ } -+ // Purpur end - Improve output of plugins command - - builder.append(pluginName); - -@@ -126,6 +_,23 @@ - return componentHeader.append(Component.text(":")).build(); - } - -+ // Purpur start - Improve output of plugins command -+ private static TextComponent getAuthors(final PluginMeta pluginMeta) { -+ TextComponent.Builder builder = Component.text(); -+ List authors = pluginMeta.getAuthors(); -+ -+ for (int i = 0; i < authors.size(); i++) { -+ if (i > 0) { -+ builder.append(Component.text(i < authors.size() - 1 ? ", " : " and ", NamedTextColor.WHITE)); -+ } -+ -+ builder.append(Component.text(authors.get(i), NamedTextColor.GREEN)); -+ } -+ -+ return builder.build(); -+ } -+ // Purpur end - Improve output of plugins command -+ - private static Component asPlainComponents(final String strings) { - final net.kyori.adventure.text.TextComponent.Builder builder = Component.text(); - for (final String string : strings.split("\n")) { -@@ -186,25 +_,25 @@ - final int sizePaperPlugins = paperPlugins.size(); - final int sizeSpigotPlugins = spigotPlugins.size(); - final int sizePlugins = sizePaperPlugins + sizeSpigotPlugins; -- final boolean hasAllPluginTypes = (sizePaperPlugins > 0 && sizeSpigotPlugins > 0); -+ final boolean hasAllPluginTypes = true; // Purpur - Improve output of plugins command - - final Component infoMessage = Component.text().append(INFO_ICON_SERVER_PLUGIN).append(Component.text("Server Plugins (%s):".formatted(sizePlugins), NamedTextColor.WHITE)).build(); - - sender.sendMessage(infoMessage); - -- if (!paperPlugins.isEmpty()) { -+ //if (!paperPlugins.isEmpty()) { // Purpur - Improve output of plugins command - sender.sendMessage(header("Paper Plugins", 0x0288D1, sizePaperPlugins, hasAllPluginTypes)); -- } -+ //} // Purpur - Improve output of plugins command - -- for (final Component component : formatProviders(paperPlugins)) { -+ for (final Component component : formatProviders(paperPlugins, sender)) { // Purpur - Improve output of plugins command - sender.sendMessage(component); - } - -- if (!spigotPlugins.isEmpty()) { -+ //if (!spigotPlugins.isEmpty()) { // Purpur - Improve output of plugins command - sender.sendMessage(header("Bukkit Plugins", 0xED8106, sizeSpigotPlugins, hasAllPluginTypes)); -- } -+ //} // Purpur - Improve output of plugins command - -- for (final Component component : formatProviders(spigotPlugins)) { -+ for (final Component component : formatProviders(spigotPlugins, sender)) { // Purpur - Improve output of plugins command - sender.sendMessage(component); - } - diff --git a/purpur-server/paper-patches/files/src/main/java/io/papermc/paper/logging/SysoutCatcher.java.patch b/purpur-server/paper-patches/files/src/main/java/io/papermc/paper/logging/SysoutCatcher.java.patch deleted file mode 100644 index d8d9954f6..000000000 --- a/purpur-server/paper-patches/files/src/main/java/io/papermc/paper/logging/SysoutCatcher.java.patch +++ /dev/null @@ -1,14 +0,0 @@ ---- a/src/main/java/io/papermc/paper/logging/SysoutCatcher.java -+++ b/src/main/java/io/papermc/paper/logging/SysoutCatcher.java -@@ -54,9 +_,9 @@ - final JavaPlugin plugin = JavaPlugin.getProvidingPlugin(clazz); - - // Instead of just printing the message, send it to the plugin's logger -- plugin.getLogger().log(this.level, this.prefix + line); -+ plugin.getLogger().log(this.level, /*this.prefix +*/ line); // Purpur - Enhance SysoutCatcher - prefix not needed - -- if (SysoutCatcher.SUPPRESS_NAGS) { -+ if (true || SysoutCatcher.SUPPRESS_NAGS) { // Purpur - Enhance SysoutCatcher - nagging is annoying - return; - } - if (SysoutCatcher.NAG_INTERVAL > 0 || SysoutCatcher.NAG_TIMEOUT > 0) { diff --git a/purpur-server/paper-patches/files/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java.patch b/purpur-server/paper-patches/files/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java.patch deleted file mode 100644 index 2a910b78f..000000000 --- a/purpur-server/paper-patches/files/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- a/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java -+++ b/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java -@@ -479,7 +_,7 @@ - - @Override - public com.destroystokyo.paper.util.VersionFetcher getVersionFetcher() { -- return new com.destroystokyo.paper.PaperVersionFetcher(); -+ return new com.destroystokyo.paper.PaperVersionFetcher(); // Pufferfish // Purpur - Rebrand - } - - @Override diff --git a/purpur-server/paper-patches/files/src/test/java/io/papermc/paper/permissions/MinecraftCommandPermissionsTest.java.patch b/purpur-server/paper-patches/files/src/test/java/io/papermc/paper/permissions/MinecraftCommandPermissionsTest.java.patch deleted file mode 100644 index 6fb471079..000000000 --- a/purpur-server/paper-patches/files/src/test/java/io/papermc/paper/permissions/MinecraftCommandPermissionsTest.java.patch +++ /dev/null @@ -1,36 +0,0 @@ ---- a/src/test/java/io/papermc/paper/permissions/MinecraftCommandPermissionsTest.java -+++ b/src/test/java/io/papermc/paper/permissions/MinecraftCommandPermissionsTest.java -@@ -46,6 +_,7 @@ - Set foundPerms = new HashSet<>(); - for (CommandNode child : root.getChildren()) { - final String vanillaPerm = VanillaCommandWrapper.getPermission(child); -+ if (TO_SKIP.contains(vanillaPerm)) continue; // Purpur - Skip junit tests for purpur commands - if (!perms.contains(vanillaPerm)) { - missing.add("Missing permission for " + child.getName() + " (" + vanillaPerm + ") command"); - } else { -@@ -58,6 +_,25 @@ - } - - private static final List TO_SKIP = List.of( -+ // Purpur start - Skip junit tests for purpur commands -+ "minecraft.command.compass", -+ "minecraft.command.credits", -+ "minecraft.command.demo", -+ "minecraft.command.ping", -+ "minecraft.command.ram", -+ "minecraft.command.rambar", -+ "minecraft.command.tpsbar", -+ "minecraft.command.uptime", -+ "minecraft.command.debug", -+ "minecraft.command.gamemode.adventure", -+ "minecraft.command.gamemode.adventure.other", -+ "minecraft.command.gamemode.creative", -+ "minecraft.command.gamemode.creative.other", -+ "minecraft.command.gamemode.spectator", -+ "minecraft.command.gamemode.spectator.other", -+ "minecraft.command.gamemode.survival", -+ "minecraft.command.gamemode.survival.other", -+ // Purpur end - Skip junit tests for purpur commands - "minecraft.command.selector" - ); - diff --git a/purpur-server/paper-patches/features/0001-Rebrand.patch b/purpur-server/spigot-patches/features/0001-Rebrand.patch similarity index 100% rename from purpur-server/paper-patches/features/0001-Rebrand.patch rename to purpur-server/spigot-patches/features/0001-Rebrand.patch diff --git a/purpur-server/paper-patches/features/0002-Ridables.patch b/purpur-server/spigot-patches/features/0002-Ridables.patch similarity index 100% rename from purpur-server/paper-patches/features/0002-Ridables.patch rename to purpur-server/spigot-patches/features/0002-Ridables.patch diff --git a/purpur-server/paper-patches/features/0003-Barrels-and-enderchests-6-rows.patch b/purpur-server/spigot-patches/features/0003-Barrels-and-enderchests-6-rows.patch similarity index 100% rename from purpur-server/paper-patches/features/0003-Barrels-and-enderchests-6-rows.patch rename to purpur-server/spigot-patches/features/0003-Barrels-and-enderchests-6-rows.patch diff --git a/purpur-server/paper-patches/features/0005-Add-EntityTeleportHinderedEvent.patch b/purpur-server/spigot-patches/features/0005-Add-EntityTeleportHinderedEvent.patch similarity index 77% rename from purpur-server/paper-patches/features/0005-Add-EntityTeleportHinderedEvent.patch rename to purpur-server/spigot-patches/features/0005-Add-EntityTeleportHinderedEvent.patch index f8f50cfdd..385f800a6 100644 --- a/purpur-server/paper-patches/features/0005-Add-EntityTeleportHinderedEvent.patch +++ b/purpur-server/spigot-patches/features/0005-Add-EntityTeleportHinderedEvent.patch @@ -21,10 +21,8 @@ index 67b9963afd91af84459d439697f6230fd67722b4..d8ed459b49624180e6939d9c5eefb453 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java @@ -264,6 +264,7 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity { - boolean retainPassengers = flagSet.contains(io.papermc.paper.entity.TeleportFlag.EntityState.RETAIN_PASSENGERS); - // Don't allow teleporting between worlds while keeping passengers - if (flagSet.contains(io.papermc.paper.entity.TeleportFlag.EntityState.RETAIN_PASSENGERS) && this.entity.isVehicle() && location.getWorld() != this.getWorld()) { -+ if (!new org.purpurmc.purpur.event.entity.EntityTeleportHinderedEvent(entity.getBukkitEntity(), org.purpurmc.purpur.event.entity.EntityTeleportHinderedEvent.Reason.IS_VEHICLE, cause).callEvent()) // Purpur - Add EntityTeleportHinderedEvent + boolean retainPassengers = flagSet.contains( // Don't allow teleporting between worlds while keeping passengers + if (flagSet.contains(+ if (!new org.purpurmc.purpur.event.entity.EntityTeleportHinderedEvent(entity.getBukkitEntity(), org.purpurmc.purpur.event.entity.EntityTeleportHinderedEvent.Reason.IS_VEHICLE, cause).callEvent()) // Purpur - Add EntityTeleportHinderedEvent return false; } @@ -33,7 +31,6 @@ index caa156cd56605f74888df6f64d7be310fd384f09..f4676ec9ab14d748c820169467a03fc5 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java @@ -1421,6 +1421,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { - // Paper start - Teleport passenger API // Don't allow teleporting between worlds while keeping passengers if (ignorePassengers && entity.isVehicle() && location.getWorld() != this.getWorld()) { + if (!new org.purpurmc.purpur.event.entity.EntityTeleportHinderedEvent(entity.getBukkitEntity(), org.purpurmc.purpur.event.entity.EntityTeleportHinderedEvent.Reason.IS_VEHICLE, cause).callEvent()) // Purpur - Add EntityTeleportHinderedEvent @@ -43,7 +40,6 @@ index caa156cd56605f74888df6f64d7be310fd384f09..f4676ec9ab14d748c820169467a03fc5 @@ -1442,6 +1443,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { } - if (entity.isVehicle() && !ignorePassengers) { // Paper - Teleport API + if (!new org.purpurmc.purpur.event.entity.EntityTeleportHinderedEvent(entity.getBukkitEntity(), org.purpurmc.purpur.event.entity.EntityTeleportHinderedEvent.Reason.IS_VEHICLE, cause).callEvent()) // Purpur - Add EntityTeleportHinderedEvent return false; } diff --git a/purpur-server/paper-patches/features/0006-API-for-any-mob-to-burn-daylight.patch b/purpur-server/spigot-patches/features/0006-API-for-any-mob-to-burn-daylight.patch similarity index 100% rename from purpur-server/paper-patches/features/0006-API-for-any-mob-to-burn-daylight.patch rename to purpur-server/spigot-patches/features/0006-API-for-any-mob-to-burn-daylight.patch diff --git a/purpur-server/paper-patches/files/src/main/java/org/bukkit/craftbukkit/CraftOfflinePlayer.java.patch b/purpur-server/spigot-patches/files/src/main/java/org/bukkit/craftbukkit/CraftOfflinePlayer.java.patch similarity index 100% rename from purpur-server/paper-patches/files/src/main/java/org/bukkit/craftbukkit/CraftOfflinePlayer.java.patch rename to purpur-server/spigot-patches/files/src/main/java/org/bukkit/craftbukkit/CraftOfflinePlayer.java.patch diff --git a/purpur-server/paper-patches/files/src/main/java/org/bukkit/craftbukkit/CraftServer.java.patch b/purpur-server/spigot-patches/files/src/main/java/org/bukkit/craftbukkit/CraftServer.java.patch similarity index 85% rename from purpur-server/paper-patches/files/src/main/java/org/bukkit/craftbukkit/CraftServer.java.patch rename to purpur-server/spigot-patches/files/src/main/java/org/bukkit/craftbukkit/CraftServer.java.patch index 0879a87b6..1b208ca3c 100644 --- a/purpur-server/paper-patches/files/src/main/java/org/bukkit/craftbukkit/CraftServer.java.patch +++ b/purpur-server/spigot-patches/files/src/main/java/org/bukkit/craftbukkit/CraftServer.java.patch @@ -1,9 +1,6 @@ --- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java @@ -423,6 +_,20 @@ - this.paperPluginManager = new io.papermc.paper.plugin.manager.PaperPluginManagerImpl(this, this.commandMap, pluginManager); - this.pluginManager.paperPluginManager = this.paperPluginManager; - // Paper end + // Purpur start - Language API + org.purpurmc.purpur.language.Language.setLanguage(new org.purpurmc.purpur.language.Language() { + private net.minecraft.locale.Language language = net.minecraft.locale.Language.getInstance(); @@ -24,11 +21,9 @@ @@ -1064,6 +_,7 @@ org.spigotmc.SpigotConfig.init((File) this.console.options.valueOf("spigot-settings")); // Spigot - this.console.paperConfigurations.reloadConfigs(this.console); + org.purpurmc.purpur.PurpurConfig.init((File) console.options.valueOf("purpur-settings")); // Purpur - Purpur config files for (ServerLevel world : this.console.getAllLevels()) { - // world.serverLevelData.setDifficulty(config.difficulty); // Paper - per level difficulty - world.setSpawnSettings(world.serverLevelData.getDifficulty() != Difficulty.PEACEFUL && config.spawnMonsters); // Paper - per level difficulty (from MinecraftServer#setDifficulty(ServerLevel, Difficulty, boolean)) + world.serverLevelData.setDifficulty(config.difficulty); @@ -1079,6 +_,7 @@ } } @@ -36,11 +31,8 @@ + world.purpurConfig.init(); // Purpur - Purpur config files } - Plugin[] pluginClone = pluginManager.getPlugins().clone(); // Paper @@ -1096,6 +_,7 @@ org.spigotmc.SpigotConfig.registerCommands(); // Spigot - io.papermc.paper.command.PaperCommands.registerCommands(this.console); // Paper - this.spark.registerCommandBeforePlugins(this); // Paper - spark + org.purpurmc.purpur.PurpurConfig.registerCommands(); // Purpur - Purpur config files this.overrideAllCommandBlockCommands = this.commandsConfiguration.getStringList("command-block-overrides").contains("*"); this.ignoreVanillaPermissions = this.commandsConfiguration.getBoolean("ignore-vanilla-permissions"); @@ -107,7 +99,6 @@ public List getRecipesFor(ItemStack result) { Preconditions.checkArgument(result != null, "ItemStack cannot be null"); @@ -2942,6 +_,18 @@ - return CraftServer.this.console.paperConfigurations.createLegacyObject(CraftServer.this.console); } + // Purpur start - Purpur config files diff --git a/purpur-server/paper-patches/files/src/main/java/org/bukkit/craftbukkit/CraftWorld.java.patch b/purpur-server/spigot-patches/files/src/main/java/org/bukkit/craftbukkit/CraftWorld.java.patch similarity index 100% rename from purpur-server/paper-patches/files/src/main/java/org/bukkit/craftbukkit/CraftWorld.java.patch rename to purpur-server/spigot-patches/files/src/main/java/org/bukkit/craftbukkit/CraftWorld.java.patch diff --git a/purpur-server/paper-patches/files/src/main/java/org/bukkit/craftbukkit/Main.java.patch b/purpur-server/spigot-patches/files/src/main/java/org/bukkit/craftbukkit/Main.java.patch similarity index 80% rename from purpur-server/paper-patches/files/src/main/java/org/bukkit/craftbukkit/Main.java.patch rename to purpur-server/spigot-patches/files/src/main/java/org/bukkit/craftbukkit/Main.java.patch index ed8da8e31..bd6434ca1 100644 --- a/purpur-server/paper-patches/files/src/main/java/org/bukkit/craftbukkit/Main.java.patch +++ b/purpur-server/spigot-patches/files/src/main/java/org/bukkit/craftbukkit/Main.java.patch @@ -16,11 +16,9 @@ .withRequiredArg() .ofType(String.class) @@ -224,7 +_,7 @@ - System.setProperty(net.minecrell.terminalconsole.TerminalConsoleAppender.JLINE_OVERRIDE_PROPERTY, "false"); // Paper } - if (Main.class.getPackage().getImplementationVendor() != null && System.getProperty("IReallyKnowWhatIAmDoingISwear") == null) { + if (false && Main.class.getPackage().getImplementationVendor() != null && System.getProperty("IReallyKnowWhatIAmDoingISwear") == null) { // Purpur - Disable outdated build check - Date buildDate = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss Z").parse(Main.class.getPackage().getImplementationVendor()); // Paper Calendar deadline = Calendar.getInstance(); diff --git a/purpur-server/paper-patches/files/src/main/java/org/bukkit/craftbukkit/block/state/CraftBeehive.java.patch b/purpur-server/spigot-patches/files/src/main/java/org/bukkit/craftbukkit/block/state/CraftBeehive.java.patch similarity index 99% rename from purpur-server/paper-patches/files/src/main/java/org/bukkit/craftbukkit/block/state/CraftBeehive.java.patch rename to purpur-server/spigot-patches/files/src/main/java/org/bukkit/craftbukkit/block/state/CraftBeehive.java.patch index a589b7608..738a5141f 100644 --- a/purpur-server/paper-patches/files/src/main/java/org/bukkit/craftbukkit/block/state/CraftBeehive.java.patch +++ b/purpur-server/spigot-patches/files/src/main/java/org/bukkit/craftbukkit/block/state/CraftBeehive.java.patch @@ -77,5 +77,4 @@ getSnapshot().clearBees(); + storage.clear(); // Purpur - Stored Bee API } - // Paper end } diff --git a/purpur-server/paper-patches/files/src/main/java/org/bukkit/craftbukkit/block/state/CraftConduit.java.patch b/purpur-server/spigot-patches/files/src/main/java/org/bukkit/craftbukkit/block/state/CraftConduit.java.patch similarity index 100% rename from purpur-server/paper-patches/files/src/main/java/org/bukkit/craftbukkit/block/state/CraftConduit.java.patch rename to purpur-server/spigot-patches/files/src/main/java/org/bukkit/craftbukkit/block/state/CraftConduit.java.patch diff --git a/purpur-server/paper-patches/files/src/main/java/org/bukkit/craftbukkit/command/CraftConsoleCommandSender.java.patch b/purpur-server/spigot-patches/files/src/main/java/org/bukkit/craftbukkit/command/CraftConsoleCommandSender.java.patch similarity index 100% rename from purpur-server/paper-patches/files/src/main/java/org/bukkit/craftbukkit/command/CraftConsoleCommandSender.java.patch rename to purpur-server/spigot-patches/files/src/main/java/org/bukkit/craftbukkit/command/CraftConsoleCommandSender.java.patch diff --git a/purpur-server/paper-patches/files/src/main/java/org/bukkit/craftbukkit/entity/CraftEndermite.java.patch b/purpur-server/spigot-patches/files/src/main/java/org/bukkit/craftbukkit/entity/CraftEndermite.java.patch similarity index 100% rename from purpur-server/paper-patches/files/src/main/java/org/bukkit/craftbukkit/entity/CraftEndermite.java.patch rename to purpur-server/spigot-patches/files/src/main/java/org/bukkit/craftbukkit/entity/CraftEndermite.java.patch diff --git a/purpur-server/paper-patches/files/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java.patch b/purpur-server/spigot-patches/files/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java.patch similarity index 100% rename from purpur-server/paper-patches/files/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java.patch rename to purpur-server/spigot-patches/files/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java.patch diff --git a/purpur-server/paper-patches/files/src/main/java/org/bukkit/craftbukkit/entity/CraftHumanEntity.java.patch b/purpur-server/spigot-patches/files/src/main/java/org/bukkit/craftbukkit/entity/CraftHumanEntity.java.patch similarity index 100% rename from purpur-server/paper-patches/files/src/main/java/org/bukkit/craftbukkit/entity/CraftHumanEntity.java.patch rename to purpur-server/spigot-patches/files/src/main/java/org/bukkit/craftbukkit/entity/CraftHumanEntity.java.patch diff --git a/purpur-server/paper-patches/files/src/main/java/org/bukkit/craftbukkit/entity/CraftIronGolem.java.patch b/purpur-server/spigot-patches/files/src/main/java/org/bukkit/craftbukkit/entity/CraftIronGolem.java.patch similarity index 100% rename from purpur-server/paper-patches/files/src/main/java/org/bukkit/craftbukkit/entity/CraftIronGolem.java.patch rename to purpur-server/spigot-patches/files/src/main/java/org/bukkit/craftbukkit/entity/CraftIronGolem.java.patch diff --git a/purpur-server/paper-patches/files/src/main/java/org/bukkit/craftbukkit/entity/CraftItem.java.patch b/purpur-server/spigot-patches/files/src/main/java/org/bukkit/craftbukkit/entity/CraftItem.java.patch similarity index 100% rename from purpur-server/paper-patches/files/src/main/java/org/bukkit/craftbukkit/entity/CraftItem.java.patch rename to purpur-server/spigot-patches/files/src/main/java/org/bukkit/craftbukkit/entity/CraftItem.java.patch diff --git a/purpur-server/paper-patches/files/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java.patch b/purpur-server/spigot-patches/files/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java.patch similarity index 100% rename from purpur-server/paper-patches/files/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java.patch rename to purpur-server/spigot-patches/files/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java.patch diff --git a/purpur-server/paper-patches/files/src/main/java/org/bukkit/craftbukkit/entity/CraftLlama.java.patch b/purpur-server/spigot-patches/files/src/main/java/org/bukkit/craftbukkit/entity/CraftLlama.java.patch similarity index 72% rename from purpur-server/paper-patches/files/src/main/java/org/bukkit/craftbukkit/entity/CraftLlama.java.patch rename to purpur-server/spigot-patches/files/src/main/java/org/bukkit/craftbukkit/entity/CraftLlama.java.patch index c5db6e7ee..93d0b7d64 100644 --- a/purpur-server/paper-patches/files/src/main/java/org/bukkit/craftbukkit/entity/CraftLlama.java.patch +++ b/purpur-server/spigot-patches/files/src/main/java/org/bukkit/craftbukkit/entity/CraftLlama.java.patch @@ -1,10 +1,6 @@ --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftLlama.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftLlama.java @@ -89,4 +_,17 @@ - public Llama getCaravanTail() { - return this.getHandle().caravanTail == null ? null : (Llama) this.getHandle().caravanTail.getBukkitEntity(); - } -+ // Paper end + + // Purpur start - Llama API + @Override diff --git a/purpur-server/paper-patches/files/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java.patch b/purpur-server/spigot-patches/files/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java.patch similarity index 89% rename from purpur-server/paper-patches/files/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java.patch rename to purpur-server/spigot-patches/files/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java.patch index 9d0b268b4..6c020f5a8 100644 --- a/purpur-server/paper-patches/files/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java.patch +++ b/purpur-server/spigot-patches/files/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java.patch @@ -12,9 +12,7 @@ if (name == null) { name = this.getName(); } -- this.getHandle().listName = name.equals(this.getName()) ? null : CraftChatMessage.fromStringOrNull(name); -+ this.getHandle().listName = name.equals(this.getName()) ? null : useMM ? io.papermc.paper.adventure.PaperAdventure.asVanilla(net.kyori.adventure.text.minimessage.MiniMessage.miniMessage().deserialize(name)) : CraftChatMessage.fromStringOrNull(name); // Purpur - AFK API - if (this.getHandle().connection == null) return; // Paper - Updates are possible before the player has fully joined + this.getHandle().listName = name.equals(this.getName()) ? null : CraftChatMessage.fromStringOrNull(name); for (ServerPlayer player : (List) this.server.getHandle().players) { if (player.getBukkitEntity().canSee(this)) { @@ -2731,6 +_,28 @@ @@ -119,7 +117,7 @@ + @Override + public void sendDeathScreen(net.kyori.adventure.text.Component message) { + if (this.getHandle().connection == null) return; -+ this.getHandle().connection.send(new net.minecraft.network.protocol.game.ClientboundPlayerCombatKillPacket(getEntityId(), io.papermc.paper.adventure.PaperAdventure.asVanilla(message))); ++ this.getHandle().connection.send(new net.minecraft.network.protocol.game.ClientboundPlayerCombatKillPacket(getEntityId(), org.purpurmc.purpur.adventure.PurpurAdventure.asVanilla(message))); + } + // Purpur end - Death screen API } diff --git a/purpur-server/paper-patches/files/src/main/java/org/bukkit/craftbukkit/entity/CraftSnowman.java.patch b/purpur-server/spigot-patches/files/src/main/java/org/bukkit/craftbukkit/entity/CraftSnowman.java.patch similarity index 100% rename from purpur-server/paper-patches/files/src/main/java/org/bukkit/craftbukkit/entity/CraftSnowman.java.patch rename to purpur-server/spigot-patches/files/src/main/java/org/bukkit/craftbukkit/entity/CraftSnowman.java.patch diff --git a/purpur-server/paper-patches/files/src/main/java/org/bukkit/craftbukkit/entity/CraftVillager.java.patch b/purpur-server/spigot-patches/files/src/main/java/org/bukkit/craftbukkit/entity/CraftVillager.java.patch similarity index 76% rename from purpur-server/paper-patches/files/src/main/java/org/bukkit/craftbukkit/entity/CraftVillager.java.patch rename to purpur-server/spigot-patches/files/src/main/java/org/bukkit/craftbukkit/entity/CraftVillager.java.patch index 320d8f394..0ca2dbd29 100644 --- a/purpur-server/paper-patches/files/src/main/java/org/bukkit/craftbukkit/entity/CraftVillager.java.patch +++ b/purpur-server/spigot-patches/files/src/main/java/org/bukkit/craftbukkit/entity/CraftVillager.java.patch @@ -1,10 +1,6 @@ --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftVillager.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftVillager.java @@ -385,4 +_,12 @@ - public void clearReputations() { - getHandle().getGossips().gossips.clear(); - } -+ // Paper end + + // Purpur start - Lobotomize stuck villagers + @Override diff --git a/purpur-server/paper-patches/files/src/main/java/org/bukkit/craftbukkit/entity/CraftWither.java.patch b/purpur-server/spigot-patches/files/src/main/java/org/bukkit/craftbukkit/entity/CraftWither.java.patch similarity index 81% rename from purpur-server/paper-patches/files/src/main/java/org/bukkit/craftbukkit/entity/CraftWither.java.patch rename to purpur-server/spigot-patches/files/src/main/java/org/bukkit/craftbukkit/entity/CraftWither.java.patch index d7e9425f1..8b0578d9d 100644 --- a/purpur-server/paper-patches/files/src/main/java/org/bukkit/craftbukkit/entity/CraftWither.java.patch +++ b/purpur-server/spigot-patches/files/src/main/java/org/bukkit/craftbukkit/entity/CraftWither.java.patch @@ -1,10 +1,6 @@ --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftWither.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftWither.java @@ -97,4 +_,18 @@ - public void enterInvulnerabilityPhase() { - this.getHandle().makeInvulnerable(); - } -+ // Paper end + + // Purpur start - Summoner API + @Override diff --git a/purpur-server/paper-patches/files/src/main/java/org/bukkit/craftbukkit/entity/CraftWolf.java.patch b/purpur-server/spigot-patches/files/src/main/java/org/bukkit/craftbukkit/entity/CraftWolf.java.patch similarity index 100% rename from purpur-server/paper-patches/files/src/main/java/org/bukkit/craftbukkit/entity/CraftWolf.java.patch rename to purpur-server/spigot-patches/files/src/main/java/org/bukkit/craftbukkit/entity/CraftWolf.java.patch diff --git a/purpur-server/paper-patches/files/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventoryAnvil.java.patch b/purpur-server/spigot-patches/files/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventoryAnvil.java.patch similarity index 100% rename from purpur-server/paper-patches/files/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventoryAnvil.java.patch rename to purpur-server/spigot-patches/files/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventoryAnvil.java.patch diff --git a/purpur-server/paper-patches/files/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemStack.java.patch b/purpur-server/spigot-patches/files/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemStack.java.patch similarity index 99% rename from purpur-server/paper-patches/files/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemStack.java.patch rename to purpur-server/spigot-patches/files/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemStack.java.patch index a7623accc..d638fe7e4 100644 --- a/purpur-server/paper-patches/files/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemStack.java.patch +++ b/purpur-server/spigot-patches/files/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemStack.java.patch @@ -1,9 +1,6 @@ --- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemStack.java +++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemStack.java @@ -669,4 +_,285 @@ - } - - // Paper end - data component API + + // Purpur start - ItemStack convenience methods + @Override diff --git a/purpur-server/paper-patches/files/src/main/java/org/bukkit/craftbukkit/inventory/CraftRecipe.java.patch b/purpur-server/spigot-patches/files/src/main/java/org/bukkit/craftbukkit/inventory/CraftRecipe.java.patch similarity index 67% rename from purpur-server/paper-patches/files/src/main/java/org/bukkit/craftbukkit/inventory/CraftRecipe.java.patch rename to purpur-server/spigot-patches/files/src/main/java/org/bukkit/craftbukkit/inventory/CraftRecipe.java.patch index b3042e1f5..b347bee25 100644 --- a/purpur-server/paper-patches/files/src/main/java/org/bukkit/craftbukkit/inventory/CraftRecipe.java.patch +++ b/purpur-server/spigot-patches/files/src/main/java/org/bukkit/craftbukkit/inventory/CraftRecipe.java.patch @@ -5,6 +5,3 @@ } else if (bukkit instanceof RecipeChoice.ExactChoice) { stack = Ingredient.ofStacks(((RecipeChoice.ExactChoice) bukkit).getChoices().stream().map((mat) -> CraftItemStack.asNMSCopy(mat)).toList()); + stack.predicate = ((RecipeChoice.ExactChoice) bukkit).getPredicate(); // Purpur - Add predicate to recipe's ExactChoice ingredient - // Paper start - support "empty" choices - legacy method that spigot might incorrectly call - // Their impl of Ingredient.of() will error, ingredients need at least one entry. - // Callers running into this exception may have passed an incorrect empty() recipe choice to a non-empty slot or diff --git a/purpur-server/paper-patches/files/src/main/java/org/bukkit/craftbukkit/inventory/view/CraftAnvilView.java.patch b/purpur-server/spigot-patches/files/src/main/java/org/bukkit/craftbukkit/inventory/view/CraftAnvilView.java.patch similarity index 100% rename from purpur-server/paper-patches/files/src/main/java/org/bukkit/craftbukkit/inventory/view/CraftAnvilView.java.patch rename to purpur-server/spigot-patches/files/src/main/java/org/bukkit/craftbukkit/inventory/view/CraftAnvilView.java.patch diff --git a/purpur-server/paper-patches/files/src/main/java/org/bukkit/craftbukkit/legacy/CraftLegacy.java.patch b/purpur-server/spigot-patches/files/src/main/java/org/bukkit/craftbukkit/legacy/CraftLegacy.java.patch similarity index 71% rename from purpur-server/paper-patches/files/src/main/java/org/bukkit/craftbukkit/legacy/CraftLegacy.java.patch rename to purpur-server/spigot-patches/files/src/main/java/org/bukkit/craftbukkit/legacy/CraftLegacy.java.patch index beea25a6b..4ab344edd 100644 --- a/purpur-server/paper-patches/files/src/main/java/org/bukkit/craftbukkit/legacy/CraftLegacy.java.patch +++ b/purpur-server/spigot-patches/files/src/main/java/org/bukkit/craftbukkit/legacy/CraftLegacy.java.patch @@ -5,6 +5,5 @@ static { + if (!org.purpurmc.purpur.PurpurConfig.loggerSuppressInitLegacyMaterialError) // Purpur - Logger settings (suppressing pointless logs) - LOGGER.warn("Initializing Legacy Material Support. Unless you have legacy plugins and/or data this is a bug!"); // Paper - Improve logging and errors; doesn't need to be an error if (MinecraftServer.getServer() != null && MinecraftServer.getServer().isDebugging()) { new Exception().printStackTrace(); diff --git a/purpur-server/paper-patches/files/src/main/java/org/bukkit/craftbukkit/legacy/MaterialRerouting.java.patch b/purpur-server/spigot-patches/files/src/main/java/org/bukkit/craftbukkit/legacy/MaterialRerouting.java.patch similarity index 95% rename from purpur-server/paper-patches/files/src/main/java/org/bukkit/craftbukkit/legacy/MaterialRerouting.java.patch rename to purpur-server/spigot-patches/files/src/main/java/org/bukkit/craftbukkit/legacy/MaterialRerouting.java.patch index 74a359244..27f914ab9 100644 --- a/purpur-server/paper-patches/files/src/main/java/org/bukkit/craftbukkit/legacy/MaterialRerouting.java.patch +++ b/purpur-server/spigot-patches/files/src/main/java/org/bukkit/craftbukkit/legacy/MaterialRerouting.java.patch @@ -1,9 +1,6 @@ --- a/src/main/java/org/bukkit/craftbukkit/legacy/MaterialRerouting.java +++ b/src/main/java/org/bukkit/craftbukkit/legacy/MaterialRerouting.java @@ -708,4 +_,32 @@ - meta.setCanPlaceOn(materials); - } - // Paper end + // Purpur start - Adopt MaterialRerouting + // Method added post 1.13, no-op (https://github.com/PurpurMC/Purpur/pull/570) + public static void addFuel(Server server, Material material, int burnTime) { diff --git a/purpur-server/paper-patches/files/src/main/java/org/bukkit/craftbukkit/map/CraftMapRenderer.java.patch b/purpur-server/spigot-patches/files/src/main/java/org/bukkit/craftbukkit/map/CraftMapRenderer.java.patch similarity index 100% rename from purpur-server/paper-patches/files/src/main/java/org/bukkit/craftbukkit/map/CraftMapRenderer.java.patch rename to purpur-server/spigot-patches/files/src/main/java/org/bukkit/craftbukkit/map/CraftMapRenderer.java.patch diff --git a/purpur-server/paper-patches/files/src/main/java/org/bukkit/craftbukkit/scheduler/CraftScheduler.java.patch b/purpur-server/spigot-patches/files/src/main/java/org/bukkit/craftbukkit/scheduler/CraftScheduler.java.patch similarity index 67% rename from purpur-server/paper-patches/files/src/main/java/org/bukkit/craftbukkit/scheduler/CraftScheduler.java.patch rename to purpur-server/spigot-patches/files/src/main/java/org/bukkit/craftbukkit/scheduler/CraftScheduler.java.patch index 46d23c417..60d50142e 100644 --- a/purpur-server/paper-patches/files/src/main/java/org/bukkit/craftbukkit/scheduler/CraftScheduler.java.patch +++ b/purpur-server/spigot-patches/files/src/main/java/org/bukkit/craftbukkit/scheduler/CraftScheduler.java.patch @@ -3,9 +3,9 @@ @@ -491,7 +_,7 @@ this.parsePending(); } else { - // this.debugTail = this.debugTail.setNext(new CraftAsyncDebugger(this.currentTick + CraftScheduler.RECENT_TICKS, task.getOwner(), task.getTaskClass())); // Paper -- task.getOwner().getLogger().log(Level.SEVERE, "Unexpected Async Task in the Sync Scheduler. Report this to Paper"); // Paper -+ task.getOwner().getLogger().log(Level.SEVERE, "Unexpected Async Task in the Sync Scheduler. Report this to Purpur"); // Paper // Purpur - Rebrand + this.debugTail = this.debugTail.setNext(new CraftAsyncDebugger(this.currentTick + CraftScheduler.RECENT_TICKS, task.getOwner(), task.getTaskClass())); +- task.getOwner().getLogger().log(Level.SEVERE, "Unexpected Async Task in the Sync Scheduler. Report this to Spigot"); // Spigot ++ task.getOwner().getLogger().log(Level.SEVERE, "Unexpected Async Task in the Sync Scheduler. Report this to Purpur"); // Spigot // Purpur - Rebrand // We don't need to parse pending // (async tasks must live with race-conditions if they attempt to cancel between these few lines of code) } diff --git a/purpur-server/paper-patches/files/src/main/java/org/bukkit/craftbukkit/util/Versioning.java.patch b/purpur-server/spigot-patches/files/src/main/java/org/bukkit/craftbukkit/util/Versioning.java.patch similarity index 60% rename from purpur-server/paper-patches/files/src/main/java/org/bukkit/craftbukkit/util/Versioning.java.patch rename to purpur-server/spigot-patches/files/src/main/java/org/bukkit/craftbukkit/util/Versioning.java.patch index a560ff72a..2686d02b1 100644 --- a/purpur-server/paper-patches/files/src/main/java/org/bukkit/craftbukkit/util/Versioning.java.patch +++ b/purpur-server/spigot-patches/files/src/main/java/org/bukkit/craftbukkit/util/Versioning.java.patch @@ -4,8 +4,7 @@ public static String getBukkitVersion() { String result = "Unknown-Version"; -- InputStream stream = Bukkit.class.getClassLoader().getResourceAsStream("META-INF/maven/io.papermc.paper/paper-api/pom.properties"); -+ InputStream stream = Bukkit.class.getClassLoader().getResourceAsStream("META-INF/maven/org.purpurmc.purpur/purpur-api/pom.properties"); // Pufferfish // Purpur - Rebrand +- InputStream stream = Bukkit.class.getClassLoader().getResourceAsStream("META-INF/maven/+ InputStream stream = Bukkit.class.getClassLoader().getResourceAsStream("META-INF/maven/org.purpurmc.purpur/purpur-api/pom.properties"); // Pufferfish // Purpur - Rebrand Properties properties = new Properties(); if (stream != null) { diff --git a/purpur-server/paper-patches/files/src/main/java/org/bukkit/craftbukkit/util/permissions/CommandPermissions.java.patch b/purpur-server/spigot-patches/files/src/main/java/org/bukkit/craftbukkit/util/permissions/CommandPermissions.java.patch similarity index 89% rename from purpur-server/paper-patches/files/src/main/java/org/bukkit/craftbukkit/util/permissions/CommandPermissions.java.patch rename to purpur-server/spigot-patches/files/src/main/java/org/bukkit/craftbukkit/util/permissions/CommandPermissions.java.patch index 6106785b3..56082d5e2 100644 --- a/purpur-server/paper-patches/files/src/main/java/org/bukkit/craftbukkit/util/permissions/CommandPermissions.java.patch +++ b/purpur-server/spigot-patches/files/src/main/java/org/bukkit/craftbukkit/util/permissions/CommandPermissions.java.patch @@ -14,6 +14,6 @@ + gamemodeVanilla.addParent(gamemodeSelf, true); + } + // Purpur end - Gamemode extra permissions - DefaultPermissions.registerPermission(CommandPermissions.PREFIX + "experience", "Allows the user to give themselves or others arbitrary values of experience", PermissionDefault.OP, commands); // Paper - wrong permission; redirects are de-redirected and the root literal name is used, so xp -> experience + DefaultPermissions.registerPermission(CommandPermissions.PREFIX + "xp", "Allows the user to give themselves or others arbitrary values of experience", PermissionDefault.OP, commands); DefaultPermissions.registerPermission(CommandPermissions.PREFIX + "defaultgamemode", "Allows the user to change the default gamemode of the server", PermissionDefault.OP, commands); DefaultPermissions.registerPermission(CommandPermissions.PREFIX + "seed", "Allows the user to view the seed of the world", PermissionDefault.OP, commands); diff --git a/purpur-server/paper-patches/files/src/main/java/org/spigotmc/TicksPerSecondCommand.java.patch b/purpur-server/spigot-patches/files/src/main/java/org/spigotmc/TicksPerSecondCommand.java.patch similarity index 100% rename from purpur-server/paper-patches/files/src/main/java/org/spigotmc/TicksPerSecondCommand.java.patch rename to purpur-server/spigot-patches/files/src/main/java/org/spigotmc/TicksPerSecondCommand.java.patch diff --git a/purpur-server/paper-patches/files/src/main/java/org/spigotmc/WatchdogThread.java.patch b/purpur-server/spigot-patches/files/src/main/java/org/spigotmc/WatchdogThread.java.patch similarity index 72% rename from purpur-server/paper-patches/files/src/main/java/org/spigotmc/WatchdogThread.java.patch rename to purpur-server/spigot-patches/files/src/main/java/org/spigotmc/WatchdogThread.java.patch index 1d6ab6004..1225ebec4 100644 --- a/purpur-server/paper-patches/files/src/main/java/org/spigotmc/WatchdogThread.java.patch +++ b/purpur-server/spigot-patches/files/src/main/java/org/spigotmc/WatchdogThread.java.patch @@ -4,7 +4,7 @@ private volatile boolean stopping; private WatchdogThread(long timeoutTime, boolean restart) { -- super("Paper Watchdog Thread"); +- super("Spigot Watchdog Thread"); + super("Watchdog Thread"); // Purpur - use a generic name - Rebrand this.timeoutTime = timeoutTime; this.restart = restart; @@ -13,40 +13,33 @@ this.lastEarlyWarning = currentTime; if (isLongTimeout) { logger.log(Level.SEVERE, "------------------------------"); -- logger.log(Level.SEVERE, "The server has stopped responding! This is (probably) not a Paper bug."); // Paper -+ logger.log(Level.SEVERE, "The server has stopped responding! This is (probably) not a Purpur bug."); // Paper // Purpur - Rebrand logger.log(Level.SEVERE, "If you see a plugin in the Server thread dump below, then please report it to that author"); logger.log(Level.SEVERE, "\t *Especially* if it looks like HTTP or MySQL operations are occurring"); logger.log(Level.SEVERE, "If you see a world save or edit, then it means you did far more than your server can handle at once"); logger.log(Level.SEVERE, "\t If this is the case, consider increasing timeout-time in spigot.yml but note that this will replace the crash with LARGE lag spikes"); -- logger.log(Level.SEVERE, "If you are unsure or still think this is a Paper bug, please report this to https://github.com/PaperMC/Paper/issues"); +- logger.log(Level.SEVERE, "If you are unsure or still think this is a Spigot bug, please report this to https://github.com/SpigotMC/Spigot/issues"); + logger.log(Level.SEVERE, "If you are unsure or still think this is a Purpur bug, please report this to https://github.com/PurpurMC/Purpur/issues"); // Purpur - Rebrand logger.log(Level.SEVERE, "Be sure to include ALL relevant console errors and Minecraft crash reports"); -- logger.log(Level.SEVERE, "Paper version: " + Bukkit.getServer().getVersion()); +- logger.log(Level.SEVERE, "Spigot version: " + Bukkit.getServer().getVersion()); + logger.log(Level.SEVERE, "Purpur version: " + Bukkit.getServer().getVersion()); // Purpur - Rebrand if (net.minecraft.world.level.Level.lastPhysicsProblem != null) { logger.log(Level.SEVERE, "------------------------------"); @@ -102,12 +_,12 @@ } - // Paper end } else { -- logger.log(Level.SEVERE, "--- DO NOT REPORT THIS TO PAPER - THIS IS NOT A BUG OR A CRASH - " + Bukkit.getServer().getVersion() + " ---"); +- logger.log(Level.SEVERE, "--- DO NOT REPORT THIS TO SPIGOT - THIS IS NOT A BUG OR A CRASH - " + Bukkit.getServer().getVersion() + " ---"); + logger.log(Level.SEVERE, "--- DO NOT REPORT THIS TO PURPUR - THIS IS NOT A BUG OR A CRASH - " + Bukkit.getServer().getVersion() + " ---"); // Purpur - Rebrand logger.log(Level.SEVERE, "The server has not responded for " + (currentTime - lastTick) / 1000 + " seconds! Creating thread dump"); } - // Paper end - Different message for short timeout logger.log(Level.SEVERE, "------------------------------"); -- logger.log(Level.SEVERE, "Server thread dump (Look for plugins here before reporting to Paper!):"); // Paper -+ logger.log(Level.SEVERE, "Server thread dump (Look for plugins here before reporting to Purpur!):" ); // Paper // Purpur - Rebrand - FeatureHooks.dumpAllChunkLoadInfo(MinecraftServer.getServer(), isLongTimeout); // Paper - log detailed tick information WatchdogThread.dumpThread(ManagementFactory.getThreadMXBean().getThreadInfo(MinecraftServer.getServer().serverThread.getId(), Integer.MAX_VALUE), logger); logger.log(Level.SEVERE, "------------------------------"); @@ -120,7 +_,7 @@ WatchdogThread.dumpThread(thread, logger); } } else { -- logger.log(Level.SEVERE, "--- DO NOT REPORT THIS TO PAPER - THIS IS NOT A BUG OR A CRASH ---"); +- logger.log(Level.SEVERE, "--- DO NOT REPORT THIS TO SPIGOT - THIS IS NOT A BUG OR A CRASH ---"); + logger.log(Level.SEVERE, "--- DO NOT REPORT THIS TO PURPUR - THIS IS NOT A BUG OR A CRASH ---"); // Purpur - Rebrand } diff --git a/purpur-server/paper-patches/files/src/main/resources/log4j2.xml.patch b/purpur-server/spigot-patches/files/src/main/resources/log4j2.xml.patch similarity index 100% rename from purpur-server/paper-patches/files/src/main/resources/log4j2.xml.patch rename to purpur-server/spigot-patches/files/src/main/resources/log4j2.xml.patch diff --git a/purpur-server/src/main/java/org/purpurmc/purpur/util/MinecraftInternalPlugin.java b/purpur-server/src/main/java/org/purpurmc/purpur/util/MinecraftInternalPlugin.java index 77a18f304..d24ddbd00 100644 --- a/purpur-server/src/main/java/org/purpurmc/purpur/util/MinecraftInternalPlugin.java +++ b/purpur-server/src/main/java/org/purpurmc/purpur/util/MinecraftInternalPlugin.java @@ -1,6 +1,5 @@ package org.purpurmc.purpur.util; -import io.papermc.paper.plugin.lifecycle.event.LifecycleEventManager; import org.bukkit.Server; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; @@ -42,11 +41,6 @@ public class MinecraftInternalPlugin extends PluginBase { return pdf; } - @Override - public io.papermc.paper.plugin.configuration.PluginMeta getPluginMeta() { - return pdf; - } - @Override public FileConfiguration getConfig() { throw new UnsupportedOperationException("Not supported."); @@ -141,9 +135,4 @@ public class MinecraftInternalPlugin extends PluginBase { public List onTabComplete(CommandSender sender, Command command, String alias, String[] args) { throw new UnsupportedOperationException("Not supported."); } - - @Override - public @NotNull LifecycleEventManager getLifecycleManager() { - throw new UnsupportedOperationException("Not supported."); - } }