diff --git a/patches/api/0352-Add-new-overload-to-PersistentDataContainer-has.patch b/patches/api/0351-Add-new-overload-to-PersistentDataContainer-has.patch similarity index 100% rename from patches/api/0352-Add-new-overload-to-PersistentDataContainer-has.patch rename to patches/api/0351-Add-new-overload-to-PersistentDataContainer-has.patch diff --git a/patches/api/0351-Remove-upstream-snakeyaml-fix.patch b/patches/api/0351-Remove-upstream-snakeyaml-fix.patch deleted file mode 100644 index d64efcbe9d..0000000000 --- a/patches/api/0351-Remove-upstream-snakeyaml-fix.patch +++ /dev/null @@ -1,32 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Jake Potrebic -Date: Wed, 5 Jan 2022 12:12:58 -0800 -Subject: [PATCH] Remove upstream snakeyaml fix - -See Server Patch: Fix saving configs with more long comments - -diff --git a/src/main/java/org/bukkit/configuration/file/YamlConfiguration.java b/src/main/java/org/bukkit/configuration/file/YamlConfiguration.java -index 21d73587e535c43e13473e441dea6fe86c3bf266..0a03cefda788b1dc57ddd61914492a15788aa3d5 100644 ---- a/src/main/java/org/bukkit/configuration/file/YamlConfiguration.java -+++ b/src/main/java/org/bukkit/configuration/file/YamlConfiguration.java -@@ -65,7 +65,7 @@ public class YamlConfiguration extends FileConfiguration { - yamlLoaderOptions = new LoaderOptions(); - yamlLoaderOptions.setMaxAliasesForCollections(Integer.MAX_VALUE); // SPIGOT-5881: Not ideal, but was default pre SnakeYAML 1.26 - -- yaml = new BukkitYaml(constructor, representer, yamlDumperOptions, yamlLoaderOptions); -+ yaml = new /*BukkitYaml*/Yaml(constructor, representer, yamlDumperOptions, yamlLoaderOptions); // Paper - don't use upstream BukkitYaml fix, add the whole snakeyaml Emitter class itself with the fix - } - - @NotNull -diff --git a/src/test/java/org/bukkit/configuration/file/YamlConfigurationTest.java b/src/test/java/org/bukkit/configuration/file/YamlConfigurationTest.java -index 194949d74a3f1c69f7869a826ee3a011a6c26786..9f83d16341b4efd5c7150d2ab9abd579f373fa95 100644 ---- a/src/test/java/org/bukkit/configuration/file/YamlConfigurationTest.java -+++ b/src/test/java/org/bukkit/configuration/file/YamlConfigurationTest.java -@@ -152,6 +152,7 @@ public class YamlConfigurationTest extends FileConfigurationTest { - } - - @Test -+ @org.junit.Ignore // Paper - ignore test because our fix doesn't work in testing environment - public void test100Comments() throws InvalidConfigurationException { - StringBuilder commentBuilder = new StringBuilder(); - for (int i = 0; i < 100; i++) { diff --git a/patches/api/0353-Multiple-Entries-with-Scoreboards.patch b/patches/api/0352-Multiple-Entries-with-Scoreboards.patch similarity index 100% rename from patches/api/0353-Multiple-Entries-with-Scoreboards.patch rename to patches/api/0352-Multiple-Entries-with-Scoreboards.patch diff --git a/patches/api/0354-Added-getHostname-to-AsyncPlayerPreLoginEvent.patch b/patches/api/0353-Added-getHostname-to-AsyncPlayerPreLoginEvent.patch similarity index 100% rename from patches/api/0354-Added-getHostname-to-AsyncPlayerPreLoginEvent.patch rename to patches/api/0353-Added-getHostname-to-AsyncPlayerPreLoginEvent.patch diff --git a/patches/api/0355-Warn-on-strange-EventHandler-return-types.patch b/patches/api/0354-Warn-on-strange-EventHandler-return-types.patch similarity index 100% rename from patches/api/0355-Warn-on-strange-EventHandler-return-types.patch rename to patches/api/0354-Warn-on-strange-EventHandler-return-types.patch diff --git a/patches/api/0356-Multi-Block-Change-API.patch b/patches/api/0355-Multi-Block-Change-API.patch similarity index 100% rename from patches/api/0356-Multi-Block-Change-API.patch rename to patches/api/0355-Multi-Block-Change-API.patch diff --git a/patches/api/0357-Fix-NotePlayEvent.patch b/patches/api/0356-Fix-NotePlayEvent.patch similarity index 100% rename from patches/api/0357-Fix-NotePlayEvent.patch rename to patches/api/0356-Fix-NotePlayEvent.patch diff --git a/patches/api/0358-Freeze-Tick-Lock-API.patch b/patches/api/0357-Freeze-Tick-Lock-API.patch similarity index 100% rename from patches/api/0358-Freeze-Tick-Lock-API.patch rename to patches/api/0357-Freeze-Tick-Lock-API.patch diff --git a/patches/api/0359-Dolphin-API.patch b/patches/api/0358-Dolphin-API.patch similarity index 100% rename from patches/api/0359-Dolphin-API.patch rename to patches/api/0358-Dolphin-API.patch diff --git a/patches/api/0360-More-PotionEffectType-API.patch b/patches/api/0359-More-PotionEffectType-API.patch similarity index 100% rename from patches/api/0360-More-PotionEffectType-API.patch rename to patches/api/0359-More-PotionEffectType-API.patch diff --git a/patches/api/0361-API-for-creating-command-sender-which-forwards-feedb.patch b/patches/api/0360-API-for-creating-command-sender-which-forwards-feedb.patch similarity index 100% rename from patches/api/0361-API-for-creating-command-sender-which-forwards-feedb.patch rename to patches/api/0360-API-for-creating-command-sender-which-forwards-feedb.patch diff --git a/patches/api/0362-Implement-regenerateChunk.patch b/patches/api/0361-Implement-regenerateChunk.patch similarity index 100% rename from patches/api/0362-Implement-regenerateChunk.patch rename to patches/api/0361-Implement-regenerateChunk.patch diff --git a/patches/api/0363-Don-t-load-plugins-prefixed-with-a-dot.patch b/patches/api/0362-Don-t-load-plugins-prefixed-with-a-dot.patch similarity index 100% rename from patches/api/0363-Don-t-load-plugins-prefixed-with-a-dot.patch rename to patches/api/0362-Don-t-load-plugins-prefixed-with-a-dot.patch diff --git a/patches/api/0364-Add-GameEvent-tags.patch b/patches/api/0363-Add-GameEvent-tags.patch similarity index 100% rename from patches/api/0364-Add-GameEvent-tags.patch rename to patches/api/0363-Add-GameEvent-tags.patch diff --git a/patches/api/0365-Furnace-RecipesUsed-API.patch b/patches/api/0364-Furnace-RecipesUsed-API.patch similarity index 100% rename from patches/api/0365-Furnace-RecipesUsed-API.patch rename to patches/api/0364-Furnace-RecipesUsed-API.patch diff --git a/patches/api/0366-Configurable-sculk-sensor-listener-range.patch b/patches/api/0365-Configurable-sculk-sensor-listener-range.patch similarity index 100% rename from patches/api/0366-Configurable-sculk-sensor-listener-range.patch rename to patches/api/0365-Configurable-sculk-sensor-listener-range.patch diff --git a/patches/api/0367-Add-missing-block-data-mins-and-maxes.patch b/patches/api/0366-Add-missing-block-data-mins-and-maxes.patch similarity index 100% rename from patches/api/0367-Add-missing-block-data-mins-and-maxes.patch rename to patches/api/0366-Add-missing-block-data-mins-and-maxes.patch diff --git a/patches/api/0368-Custom-Potion-Mixes.patch b/patches/api/0367-Custom-Potion-Mixes.patch similarity index 100% rename from patches/api/0368-Custom-Potion-Mixes.patch rename to patches/api/0367-Custom-Potion-Mixes.patch diff --git a/patches/api/0369-Expose-furnace-minecart-push-values.patch b/patches/api/0368-Expose-furnace-minecart-push-values.patch similarity index 100% rename from patches/api/0369-Expose-furnace-minecart-push-values.patch rename to patches/api/0368-Expose-furnace-minecart-push-values.patch diff --git a/patches/api/0370-More-Projectile-API.patch b/patches/api/0369-More-Projectile-API.patch similarity index 100% rename from patches/api/0370-More-Projectile-API.patch rename to patches/api/0369-More-Projectile-API.patch diff --git a/patches/api/0371-Add-getComputedBiome-API.patch b/patches/api/0370-Add-getComputedBiome-API.patch similarity index 100% rename from patches/api/0371-Add-getComputedBiome-API.patch rename to patches/api/0370-Add-getComputedBiome-API.patch diff --git a/patches/api/0372-Add-enchantWithLevels-API.patch b/patches/api/0371-Add-enchantWithLevels-API.patch similarity index 100% rename from patches/api/0372-Add-enchantWithLevels-API.patch rename to patches/api/0371-Add-enchantWithLevels-API.patch diff --git a/patches/api/0373-Add-TameableDeathMessageEvent.patch b/patches/api/0372-Add-TameableDeathMessageEvent.patch similarity index 100% rename from patches/api/0373-Add-TameableDeathMessageEvent.patch rename to patches/api/0372-Add-TameableDeathMessageEvent.patch diff --git a/patches/api/0374-Allow-to-change-the-podium-of-the-EnderDragon.patch b/patches/api/0373-Allow-to-change-the-podium-of-the-EnderDragon.patch similarity index 100% rename from patches/api/0374-Allow-to-change-the-podium-of-the-EnderDragon.patch rename to patches/api/0373-Allow-to-change-the-podium-of-the-EnderDragon.patch diff --git a/patches/api/0375-Add-pre-unbreaking-amount-to-PlayerItemDamageEvent.patch b/patches/api/0374-Add-pre-unbreaking-amount-to-PlayerItemDamageEvent.patch similarity index 100% rename from patches/api/0375-Add-pre-unbreaking-amount-to-PlayerItemDamageEvent.patch rename to patches/api/0374-Add-pre-unbreaking-amount-to-PlayerItemDamageEvent.patch diff --git a/patches/api/0376-Update-Folder-Uses-Plugin-Name.patch b/patches/api/0375-Update-Folder-Uses-Plugin-Name.patch similarity index 100% rename from patches/api/0376-Update-Folder-Uses-Plugin-Name.patch rename to patches/api/0375-Update-Folder-Uses-Plugin-Name.patch diff --git a/patches/api/0377-WorldCreator-keepSpawnLoaded.patch b/patches/api/0376-WorldCreator-keepSpawnLoaded.patch similarity index 100% rename from patches/api/0377-WorldCreator-keepSpawnLoaded.patch rename to patches/api/0376-WorldCreator-keepSpawnLoaded.patch diff --git a/patches/api/0378-Add-EntityDyeEvent-and-CollarColorable-interface.patch b/patches/api/0377-Add-EntityDyeEvent-and-CollarColorable-interface.patch similarity index 100% rename from patches/api/0378-Add-EntityDyeEvent-and-CollarColorable-interface.patch rename to patches/api/0377-Add-EntityDyeEvent-and-CollarColorable-interface.patch diff --git a/patches/api/0379-Add-PlayerStopUsingItemEvent.patch b/patches/api/0378-Add-PlayerStopUsingItemEvent.patch similarity index 100% rename from patches/api/0379-Add-PlayerStopUsingItemEvent.patch rename to patches/api/0378-Add-PlayerStopUsingItemEvent.patch diff --git a/patches/api/0380-FallingBlock-auto-expire-setting.patch b/patches/api/0379-FallingBlock-auto-expire-setting.patch similarity index 100% rename from patches/api/0380-FallingBlock-auto-expire-setting.patch rename to patches/api/0379-FallingBlock-auto-expire-setting.patch diff --git a/patches/api/0381-Keyed-Cat-Type.patch b/patches/api/0380-Keyed-Cat-Type.patch similarity index 100% rename from patches/api/0381-Keyed-Cat-Type.patch rename to patches/api/0380-Keyed-Cat-Type.patch diff --git a/patches/api/0382-Add-method-isTickingWorlds-to-Bukkit.patch b/patches/api/0381-Add-method-isTickingWorlds-to-Bukkit.patch similarity index 100% rename from patches/api/0382-Add-method-isTickingWorlds-to-Bukkit.patch rename to patches/api/0381-Add-method-isTickingWorlds-to-Bukkit.patch diff --git a/patches/api/0383-Add-WardenAngerChangeEvent.patch b/patches/api/0382-Add-WardenAngerChangeEvent.patch similarity index 100% rename from patches/api/0383-Add-WardenAngerChangeEvent.patch rename to patches/api/0382-Add-WardenAngerChangeEvent.patch diff --git a/patches/api/0384-Nameable-Banner-API.patch b/patches/api/0383-Nameable-Banner-API.patch similarity index 100% rename from patches/api/0384-Nameable-Banner-API.patch rename to patches/api/0383-Nameable-Banner-API.patch diff --git a/patches/api/0385-Add-Player-getFishHook.patch b/patches/api/0384-Add-Player-getFishHook.patch similarity index 100% rename from patches/api/0385-Add-Player-getFishHook.patch rename to patches/api/0384-Add-Player-getFishHook.patch diff --git a/patches/api/0386-More-Teleport-API.patch b/patches/api/0385-More-Teleport-API.patch similarity index 100% rename from patches/api/0386-More-Teleport-API.patch rename to patches/api/0385-More-Teleport-API.patch diff --git a/patches/api/0387-Add-EntityPortalReadyEvent.patch b/patches/api/0386-Add-EntityPortalReadyEvent.patch similarity index 100% rename from patches/api/0387-Add-EntityPortalReadyEvent.patch rename to patches/api/0386-Add-EntityPortalReadyEvent.patch diff --git a/patches/api/0388-Custom-Chat-Completion-Suggestions-API.patch b/patches/api/0387-Custom-Chat-Completion-Suggestions-API.patch similarity index 100% rename from patches/api/0388-Custom-Chat-Completion-Suggestions-API.patch rename to patches/api/0387-Custom-Chat-Completion-Suggestions-API.patch diff --git a/patches/api/0389-Collision-API.patch b/patches/api/0388-Collision-API.patch similarity index 100% rename from patches/api/0389-Collision-API.patch rename to patches/api/0388-Collision-API.patch diff --git a/patches/api/0390-Block-Ticking-API.patch b/patches/api/0389-Block-Ticking-API.patch similarity index 100% rename from patches/api/0390-Block-Ticking-API.patch rename to patches/api/0389-Block-Ticking-API.patch diff --git a/patches/api/0391-Add-NamespacedKey-biome-methods.patch b/patches/api/0390-Add-NamespacedKey-biome-methods.patch similarity index 100% rename from patches/api/0391-Add-NamespacedKey-biome-methods.patch rename to patches/api/0390-Add-NamespacedKey-biome-methods.patch diff --git a/patches/api/0392-Add-custom-destroyerIdentity-to-sendBlockDamage.patch b/patches/api/0391-Add-custom-destroyerIdentity-to-sendBlockDamage.patch similarity index 100% rename from patches/api/0392-Add-custom-destroyerIdentity-to-sendBlockDamage.patch rename to patches/api/0391-Add-custom-destroyerIdentity-to-sendBlockDamage.patch diff --git a/patches/api/0393-Also-load-resources-from-LibraryLoader.patch b/patches/api/0392-Also-load-resources-from-LibraryLoader.patch similarity index 100% rename from patches/api/0393-Also-load-resources-from-LibraryLoader.patch rename to patches/api/0392-Also-load-resources-from-LibraryLoader.patch diff --git a/patches/api/0394-Added-byte-array-serialization-deserialization-for-P.patch b/patches/api/0393-Added-byte-array-serialization-deserialization-for-P.patch similarity index 100% rename from patches/api/0394-Added-byte-array-serialization-deserialization-for-P.patch rename to patches/api/0393-Added-byte-array-serialization-deserialization-for-P.patch diff --git a/patches/api/0395-Add-a-consumer-parameter-to-ProjectileSource-launchP.patch b/patches/api/0394-Add-a-consumer-parameter-to-ProjectileSource-launchP.patch similarity index 100% rename from patches/api/0395-Add-a-consumer-parameter-to-ProjectileSource-launchP.patch rename to patches/api/0394-Add-a-consumer-parameter-to-ProjectileSource-launchP.patch diff --git a/patches/api/0396-Expose-codepoint-limit-in-YamlConfigOptions-and-incr.patch b/patches/api/0395-Expose-codepoint-limit-in-YamlConfigOptions-and-incr.patch similarity index 87% rename from patches/api/0396-Expose-codepoint-limit-in-YamlConfigOptions-and-incr.patch rename to patches/api/0395-Expose-codepoint-limit-in-YamlConfigOptions-and-incr.patch index 7fe0223346..92a4ba129e 100644 --- a/patches/api/0396-Expose-codepoint-limit-in-YamlConfigOptions-and-incr.patch +++ b/patches/api/0395-Expose-codepoint-limit-in-YamlConfigOptions-and-incr.patch @@ -6,10 +6,10 @@ Subject: [PATCH] Expose codepoint limit in YamlConfigOptions, and increase diff --git a/src/main/java/org/bukkit/configuration/file/YamlConfiguration.java b/src/main/java/org/bukkit/configuration/file/YamlConfiguration.java -index 0a03cefda788b1dc57ddd61914492a15788aa3d5..df98d2c12ef4867118aba3452c3aba1175faab4e 100644 +index 559b876d1156c04e4e417fb07439bbbc78bea065..9903be1739a5f8657f182b641e93d8b3480f3d57 100644 --- a/src/main/java/org/bukkit/configuration/file/YamlConfiguration.java +++ b/src/main/java/org/bukkit/configuration/file/YamlConfiguration.java -@@ -96,6 +96,7 @@ public class YamlConfiguration extends FileConfiguration { +@@ -97,6 +97,7 @@ public class YamlConfiguration extends FileConfiguration { public void loadFromString(@NotNull String contents) throws InvalidConfigurationException { Preconditions.checkArgument(contents != null, "Contents cannot be null"); yamlLoaderOptions.setProcessComments(options().parseComments()); @@ -18,14 +18,14 @@ index 0a03cefda788b1dc57ddd61914492a15788aa3d5..df98d2c12ef4867118aba3452c3aba11 MappingNode node; try (Reader reader = new UnicodeReader(new ByteArrayInputStream(contents.getBytes(StandardCharsets.UTF_8)))) { diff --git a/src/main/java/org/bukkit/configuration/file/YamlConfigurationOptions.java b/src/main/java/org/bukkit/configuration/file/YamlConfigurationOptions.java -index 3f7f6caf5fcf38b65c282cd83b93e45a272b138f..2a64bc9ab9ae4a7931ebce238cdab7a37e5f85b2 100644 +index 3f7f6caf5fcf38b65c282cd83b93e45a272b138f..5d0ec7436f4487c686473248f332689224156fd5 100644 --- a/src/main/java/org/bukkit/configuration/file/YamlConfigurationOptions.java +++ b/src/main/java/org/bukkit/configuration/file/YamlConfigurationOptions.java @@ -12,6 +12,7 @@ import org.jetbrains.annotations.Nullable; public class YamlConfigurationOptions extends FileConfigurationOptions { private int indent = 2; private int width = 80; -+ private int codePointLimit = 64 * 1024 * 1024; // 64 MB // Paper ++ private int codePointLimit = Integer.MAX_VALUE; // Paper - use upstream's default from YamlConfiguration protected YamlConfigurationOptions(@NotNull YamlConfiguration configuration) { super(configuration); diff --git a/patches/api/0397-Add-system-property-to-print-stacktrace-on-bad-plugi.patch b/patches/api/0396-Add-system-property-to-print-stacktrace-on-bad-plugi.patch similarity index 100% rename from patches/api/0397-Add-system-property-to-print-stacktrace-on-bad-plugi.patch rename to patches/api/0396-Add-system-property-to-print-stacktrace-on-bad-plugi.patch diff --git a/patches/api/0398-Add-getDrops-to-BlockState-and-isPreferredTool-to-Bl.patch b/patches/api/0397-Add-getDrops-to-BlockState-and-isPreferredTool-to-Bl.patch similarity index 100% rename from patches/api/0398-Add-getDrops-to-BlockState-and-isPreferredTool-to-Bl.patch rename to patches/api/0397-Add-getDrops-to-BlockState-and-isPreferredTool-to-Bl.patch diff --git a/patches/api/0399-Add-PlayerInventorySlotChangeEvent.patch b/patches/api/0398-Add-PlayerInventorySlotChangeEvent.patch similarity index 100% rename from patches/api/0399-Add-PlayerInventorySlotChangeEvent.patch rename to patches/api/0398-Add-PlayerInventorySlotChangeEvent.patch diff --git a/patches/api/0400-Elder-Guardian-appearance-API.patch b/patches/api/0399-Elder-Guardian-appearance-API.patch similarity index 100% rename from patches/api/0400-Elder-Guardian-appearance-API.patch rename to patches/api/0399-Elder-Guardian-appearance-API.patch diff --git a/patches/api/0401-Allow-changing-bed-s-occupied-property.patch b/patches/api/0400-Allow-changing-bed-s-occupied-property.patch similarity index 100% rename from patches/api/0401-Allow-changing-bed-s-occupied-property.patch rename to patches/api/0400-Allow-changing-bed-s-occupied-property.patch diff --git a/patches/api/0402-Add-EquipmentSlot-convenience-methods.patch b/patches/api/0401-Add-EquipmentSlot-convenience-methods.patch similarity index 100% rename from patches/api/0402-Add-EquipmentSlot-convenience-methods.patch rename to patches/api/0401-Add-EquipmentSlot-convenience-methods.patch diff --git a/patches/api/0403-Add-LivingEntity-swingHand-EquipmentSlot-convenience.patch b/patches/api/0402-Add-LivingEntity-swingHand-EquipmentSlot-convenience.patch similarity index 100% rename from patches/api/0403-Add-LivingEntity-swingHand-EquipmentSlot-convenience.patch rename to patches/api/0402-Add-LivingEntity-swingHand-EquipmentSlot-convenience.patch diff --git a/patches/api/0404-Add-entity-knockback-API.patch b/patches/api/0403-Add-entity-knockback-API.patch similarity index 100% rename from patches/api/0404-Add-entity-knockback-API.patch rename to patches/api/0403-Add-entity-knockback-API.patch diff --git a/patches/api/0405-Added-EntityToggleSitEvent.patch b/patches/api/0404-Added-EntityToggleSitEvent.patch similarity index 100% rename from patches/api/0405-Added-EntityToggleSitEvent.patch rename to patches/api/0404-Added-EntityToggleSitEvent.patch diff --git a/patches/api/0406-Add-Moving-Piston-API.patch b/patches/api/0405-Add-Moving-Piston-API.patch similarity index 100% rename from patches/api/0406-Add-Moving-Piston-API.patch rename to patches/api/0405-Add-Moving-Piston-API.patch diff --git a/patches/server/0018-Configurable-cactus-bamboo-and-reed-growth-heights.patch b/patches/server/0018-Configurable-cactus-bamboo-and-reed-growth-heights.patch index e794b359ef..7d405a11d6 100644 --- a/patches/server/0018-Configurable-cactus-bamboo-and-reed-growth-heights.patch +++ b/patches/server/0018-Configurable-cactus-bamboo-and-reed-growth-heights.patch @@ -7,11 +7,11 @@ Bamboo - Both the minimum fully-grown heights and the maximum are configurable - Machine_Maker diff --git a/src/main/java/net/minecraft/world/level/block/BambooBlock.java b/src/main/java/net/minecraft/world/level/block/BambooBlock.java -index 4d9c6b462101dd533b0d08c40e0257e39ccbead3..4eaf778f43b67210321ffafa3da622cb4262d57b 100644 +index 3a6894c3cdee0d55f0546cda50c824ea5e95bfe0..2db8fd4fb03642fce2c7eca9c6b189f38d5cbf4a 100644 --- a/src/main/java/net/minecraft/world/level/block/BambooBlock.java +++ b/src/main/java/net/minecraft/world/level/block/BambooBlock.java @@ -130,7 +130,7 @@ public class BambooBlock extends Block implements BonemealableBlock { - if (random.nextInt(Math.max(1, (int) (100.0F / world.spigotConfig.bambooModifier) * 3)) == 0 && world.isEmptyBlock(pos.above()) && world.getRawBrightness(pos.above(), 0) >= 9) { // Spigot + if (random.nextFloat() < (world.spigotConfig.bambooModifier / (100.0f * 3)) && world.isEmptyBlock(pos.above()) && world.getRawBrightness(pos.above(), 0) >= 9) { // Spigot - SPIGOT-7159: Better modifier resolution int i = this.getHeightBelowUpToMax(world, pos) + 1; - if (i < 16) { @@ -65,7 +65,7 @@ index 4d9c6b462101dd533b0d08c40e0257e39ccbead3..4eaf778f43b67210321ffafa3da622cb } diff --git a/src/main/java/net/minecraft/world/level/block/CactusBlock.java b/src/main/java/net/minecraft/world/level/block/CactusBlock.java -index 3b4be44e4204435a360bc224a9b2651952dedf02..cb3d26af146859b87fc471174f8f63dfe7caa5fd 100644 +index ea052e4a5e5cb23609129fd08869bcd38f675cd0..7f137f43f725cd2866e10f0ade40d4906b64fac1 100644 --- a/src/main/java/net/minecraft/world/level/block/CactusBlock.java +++ b/src/main/java/net/minecraft/world/level/block/CactusBlock.java @@ -55,7 +55,7 @@ public class CactusBlock extends Block { @@ -76,9 +76,9 @@ index 3b4be44e4204435a360bc224a9b2651952dedf02..cb3d26af146859b87fc471174f8f63df + if (i < world.paperConfig().maxGrowthHeight.cactus) { // Paper - Configurable growth height int j = (Integer) state.getValue(CactusBlock.AGE); - if (j >= (byte) range(3, ((100.0F / world.spigotConfig.cactusModifier) * 15) + 0.5F, 15)) { // Spigot + int modifier = world.spigotConfig.cactusModifier; // Spigot - SPIGOT-7159: Better modifier resolution diff --git a/src/main/java/net/minecraft/world/level/block/SugarCaneBlock.java b/src/main/java/net/minecraft/world/level/block/SugarCaneBlock.java -index e5956a2a68f168a4c08c6c409ae7b288eb792660..5554889adbade3af627b11348e9cc04191bfea36 100644 +index 2aa81f93a2e1e94d0788b4d7b67f94494101c397..6b400a4759c8c8612a3b5c96ca0d87ef9dc71435 100644 --- a/src/main/java/net/minecraft/world/level/block/SugarCaneBlock.java +++ b/src/main/java/net/minecraft/world/level/block/SugarCaneBlock.java @@ -52,7 +52,7 @@ public class SugarCaneBlock extends Block { @@ -89,4 +89,4 @@ index e5956a2a68f168a4c08c6c409ae7b288eb792660..5554889adbade3af627b11348e9cc041 + if (i < world.paperConfig().maxGrowthHeight.reeds) { // Paper - Configurable growth height int j = (Integer) state.getValue(SugarCaneBlock.AGE); - if (j >= (byte) range(3, ((100.0F / world.spigotConfig.caneModifier) * 15) + 0.5F, 15)) { // Spigot + int modifier = world.spigotConfig.caneModifier; // Spigot - SPIGOT-7159: Better modifier resolution diff --git a/patches/server/0244-Restore-vanilla-default-mob-spawn-range-and-water-an.patch b/patches/server/0244-Restore-vanilla-default-mob-spawn-range-and-water-an.patch index e10d949eea..765c83db85 100644 --- a/patches/server/0244-Restore-vanilla-default-mob-spawn-range-and-water-an.patch +++ b/patches/server/0244-Restore-vanilla-default-mob-spawn-range-and-water-an.patch @@ -6,10 +6,10 @@ Subject: [PATCH] Restore vanilla default mob-spawn-range and water animals diff --git a/src/main/java/org/spigotmc/SpigotWorldConfig.java b/src/main/java/org/spigotmc/SpigotWorldConfig.java -index d139cbcf0b159372f229bef6ae49b45a74c163ad..d4d2d11cf19167410ec6ad3417495e7130330d11 100644 +index 3b7724a8ad8b9df0bbbca7fd2f8328e9885c5a73..70b3ff4a6a9aea24e28d99997a936e850d46b05e 100644 --- a/src/main/java/org/spigotmc/SpigotWorldConfig.java +++ b/src/main/java/org/spigotmc/SpigotWorldConfig.java -@@ -184,7 +184,7 @@ public class SpigotWorldConfig +@@ -190,7 +190,7 @@ public class SpigotWorldConfig public byte mobSpawnRange; private void mobSpawnRange() { diff --git a/patches/server/0345-Entity-Activation-Range-2.0.patch b/patches/server/0345-Entity-Activation-Range-2.0.patch index 75756d5de2..d6938aae98 100644 --- a/patches/server/0345-Entity-Activation-Range-2.0.patch +++ b/patches/server/0345-Entity-Activation-Range-2.0.patch @@ -303,7 +303,7 @@ index f957c0aca36b7228ac3a33ca04c948b1d10642d1..39fc94b1e1555fd6706391223dd27831 super.customServerAiStep(); } diff --git a/src/main/java/net/minecraft/world/entity/vehicle/MinecartHopper.java b/src/main/java/net/minecraft/world/entity/vehicle/MinecartHopper.java -index 540c23f6297c34cf8e7bf8312ceaa5fc868f414c..2866385a64b22b7dc82b6122c62bcea6b0908a60 100644 +index 3f8990d15bd6815db0ccb924e621dfcc3220e0e0..70f1916185b79bbb9f033f4ef8119d7b17a13ef8 100644 --- a/src/main/java/net/minecraft/world/entity/vehicle/MinecartHopper.java +++ b/src/main/java/net/minecraft/world/entity/vehicle/MinecartHopper.java @@ -57,6 +57,7 @@ public class MinecartHopper extends AbstractMinecartContainer implements Hopper @@ -742,10 +742,10 @@ index 2861c585710eaa00541ff417a29f1f6a2fb5b46a..b1ed97618d08d7691d24f89e9e9b0ed0 isActive = false; } diff --git a/src/main/java/org/spigotmc/SpigotWorldConfig.java b/src/main/java/org/spigotmc/SpigotWorldConfig.java -index d4d2d11cf19167410ec6ad3417495e7130330d11..9c9723e13b5440d4803a7268057d63cbdc973b77 100644 +index 70b3ff4a6a9aea24e28d99997a936e850d46b05e..a345befaee2e4703294c3941f4060c496838c496 100644 --- a/src/main/java/org/spigotmc/SpigotWorldConfig.java +++ b/src/main/java/org/spigotmc/SpigotWorldConfig.java -@@ -199,14 +199,60 @@ public class SpigotWorldConfig +@@ -205,14 +205,60 @@ public class SpigotWorldConfig public int monsterActivationRange = 32; public int raiderActivationRange = 48; public int miscActivationRange = 16; diff --git a/patches/server/0636-Add-EntityInsideBlockEvent.patch b/patches/server/0636-Add-EntityInsideBlockEvent.patch index e9906dfffc..712e15581a 100644 --- a/patches/server/0636-Add-EntityInsideBlockEvent.patch +++ b/patches/server/0636-Add-EntityInsideBlockEvent.patch @@ -65,10 +65,10 @@ index c187e9df237ee71562343bbb4b577b2dcd9b4f1c..a0194e78913017693df7d92516dfbacb this.checkPressed(state, world, pos); } diff --git a/src/main/java/net/minecraft/world/level/block/CactusBlock.java b/src/main/java/net/minecraft/world/level/block/CactusBlock.java -index cb3d26af146859b87fc471174f8f63dfe7caa5fd..0fbabb84ef13e68b12212d9bfeb885c78893c116 100644 +index 7f137f43f725cd2866e10f0ade40d4906b64fac1..1ec242205b82a5a1f10deb2312795cc5dc157a76 100644 --- a/src/main/java/net/minecraft/world/level/block/CactusBlock.java +++ b/src/main/java/net/minecraft/world/level/block/CactusBlock.java -@@ -116,6 +116,7 @@ public class CactusBlock extends Block { +@@ -117,6 +117,7 @@ public class CactusBlock extends Block { @Override public void entityInside(BlockState state, Level world, BlockPos pos, Entity entity) { @@ -89,7 +89,7 @@ index 930421c72326fabfa3f2e3ab37c4dd6f416d6d44..a4c44cb59dee29cf227dbb51bfc1576d org.bukkit.craftbukkit.event.CraftEventFactory.blockDamage = CraftBlock.at(world, pos); // CraftBukkit entity.hurt(DamageSource.IN_FIRE, (float) this.fireDamage); diff --git a/src/main/java/net/minecraft/world/level/block/CropBlock.java b/src/main/java/net/minecraft/world/level/block/CropBlock.java -index 76fc886013b6c53f7888292f8fda50abe72e43bf..275e5334b1206a2dcafc3772c7e2ad0ebe3693f9 100644 +index 26b4a4d8784923cb2caea3c20a180a9fe7bb4d8b..7d8394d09ec11c96b9329857a0d347565dd07b32 100644 --- a/src/main/java/net/minecraft/world/level/block/CropBlock.java +++ b/src/main/java/net/minecraft/world/level/block/CropBlock.java @@ -163,6 +163,7 @@ public class CropBlock extends BushBlock implements BonemealableBlock { @@ -197,7 +197,7 @@ index 47f54002654d198a56a85884de34e305e545eb4b..518d3832c36c9ecf1ed9267ffc1f926d entity.makeStuckInBlock(state, new Vec3(0.8999999761581421D, 1.5D, 0.8999999761581421D)); if (world.isClientSide) { diff --git a/src/main/java/net/minecraft/world/level/block/SweetBerryBushBlock.java b/src/main/java/net/minecraft/world/level/block/SweetBerryBushBlock.java -index 1eddae82b9a438eefa49add5e3706aba755ccf45..1561be49f3a2761ce48bb16ea2dffbf1c37d0536 100644 +index 3eba9715601fcd1e86cb50bdef2434b404009caf..9871249335b67cfcfc17e7a1d504da1bc9b08c8a 100644 --- a/src/main/java/net/minecraft/world/level/block/SweetBerryBushBlock.java +++ b/src/main/java/net/minecraft/world/level/block/SweetBerryBushBlock.java @@ -77,6 +77,7 @@ public class SweetBerryBushBlock extends BushBlock implements BonemealableBlock diff --git a/patches/server/0765-Fix-kelp-modifier-changing-growth-for-other-crops.patch b/patches/server/0765-Fix-kelp-modifier-changing-growth-for-other-crops.patch index 60f87f5973..7447d00874 100644 --- a/patches/server/0765-Fix-kelp-modifier-changing-growth-for-other-crops.patch +++ b/patches/server/0765-Fix-kelp-modifier-changing-growth-for-other-crops.patch @@ -34,29 +34,10 @@ index 7d9056f9d841fbbdeaf1e323d818f2f1267b47e8..4940e101250874111e9c55aeb5b87b28 public ItemStack getCloneItemStack(BlockGetter world, BlockPos pos, BlockState state) { return new ItemStack(Items.GLOW_BERRIES); diff --git a/src/main/java/net/minecraft/world/level/block/GrowingPlantHeadBlock.java b/src/main/java/net/minecraft/world/level/block/GrowingPlantHeadBlock.java -index ae9052efc48dc05c7b41cb18c4330d7e62839a07..4d1e1cf4c541793492a02681087a6242e7977acd 100644 +index 4e30917fbc5c539fefc8dc391b902241f7c5ad35..b7517d1e8a5d5eb719de5eda424b7dd2449f1182 100644 --- a/src/main/java/net/minecraft/world/level/block/GrowingPlantHeadBlock.java +++ b/src/main/java/net/minecraft/world/level/block/GrowingPlantHeadBlock.java -@@ -40,16 +40,36 @@ public abstract class GrowingPlantHeadBlock extends GrowingPlantBlock implements - - @Override - public void randomTick(BlockState state, ServerLevel world, BlockPos pos, RandomSource random) { -- if ((Integer) state.getValue(GrowingPlantHeadBlock.AGE) < 25 && random.nextDouble() < (100.0D / world.spigotConfig.kelpModifier) * this.growPerTickProbability) { // Spigot -+ // Paper start -+ final int modifier; -+ if (state.is(Blocks.TWISTING_VINES) || state.is(Blocks.TWISTING_VINES_PLANT)) { -+ modifier = world.spigotConfig.twistingVinesModifier; -+ } else if (state.is(Blocks.WEEPING_VINES) || state.is(Blocks.WEEPING_VINES_PLANT)) { -+ modifier = world.spigotConfig.weepingVinesModifier; -+ } else if (state.is(Blocks.CAVE_VINES) || state.is(Blocks.CAVE_VINES_PLANT)) { -+ modifier = world.spigotConfig.caveVinesModifier; -+ } else if (state.is(Blocks.KELP) || state.is(Blocks.KELP_PLANT)) { -+ modifier = world.spigotConfig.kelpModifier; -+ } else { -+ modifier = 100; // Above cases are exhaustive as of 1.18 -+ } -+ if ((Integer) state.getValue(GrowingPlantHeadBlock.AGE) < 25 && random.nextDouble() < (modifier / 100.0D) * this.growPerTickProbability) { // Spigot // Paper - fix growth modifier having the reverse effect -+ // Paper end +@@ -56,12 +56,18 @@ public abstract class GrowingPlantHeadBlock extends GrowingPlantBlock implements BlockPos blockposition1 = pos.relative(this.growthDirection); if (this.canGrowInto(world.getBlockState(blockposition1))) { @@ -77,32 +58,22 @@ index ae9052efc48dc05c7b41cb18c4330d7e62839a07..4d1e1cf4c541793492a02681087a6242 return (BlockState) state.cycle(GrowingPlantHeadBlock.AGE); } diff --git a/src/main/java/org/spigotmc/SpigotWorldConfig.java b/src/main/java/org/spigotmc/SpigotWorldConfig.java -index 40984144a062230fd45cc6c707b03e5cd7d89efc..cf96f9fdc4ae561f01d44503b9851c60140e4ea7 100644 +index 102b038e2566cba4f259a61e502ff0808c47234c..6bcc46795d1f78746192cc107c4a1f61580ec3c5 100644 --- a/src/main/java/org/spigotmc/SpigotWorldConfig.java +++ b/src/main/java/org/spigotmc/SpigotWorldConfig.java -@@ -103,6 +103,12 @@ public class SpigotWorldConfig - public int bambooModifier; - public int sweetBerryModifier; - public int kelpModifier; -+ // Paper start -+ public int twistingVinesModifier; -+ public int weepingVinesModifier; -+ public int caveVinesModifier; -+ public int glowBerryModifier; -+ // Paper end +@@ -106,6 +106,7 @@ public class SpigotWorldConfig + public int twistingVinesModifier; + public int weepingVinesModifier; + public int caveVinesModifier; ++ public int glowBerryModifier; // Paper private int getAndValidateGrowth(String crop) { int modifier = this.getInt( "growth." + crop.toLowerCase(java.util.Locale.ENGLISH) + "-modifier", 100 ); -@@ -133,6 +139,12 @@ public class SpigotWorldConfig - this.bambooModifier = this.getAndValidateGrowth( "Bamboo" ); - this.sweetBerryModifier = this.getAndValidateGrowth( "SweetBerry" ); - this.kelpModifier = this.getAndValidateGrowth( "Kelp" ); -+ // Paper start -+ this.twistingVinesModifier = this.getAndValidateGrowth("TwistingVines"); -+ this.weepingVinesModifier = this.getAndValidateGrowth("WeepingVines"); -+ this.caveVinesModifier = this.getAndValidateGrowth("CaveVines"); -+ this.glowBerryModifier = this.getAndValidateGrowth("GlowBerry"); -+ // Paper end +@@ -139,6 +140,7 @@ public class SpigotWorldConfig + this.twistingVinesModifier = this.getAndValidateGrowth( "TwistingVines" ); + this.weepingVinesModifier = this.getAndValidateGrowth( "WeepingVines" ); + this.caveVinesModifier = this.getAndValidateGrowth( "CaveVines" ); ++ this.glowBerryModifier = this.getAndValidateGrowth("GlowBerry"); // Paper } public double itemMerge; diff --git a/patches/server/0792-Fix-saving-configs-with-more-long-comments.patch b/patches/server/0792-Fix-saving-configs-with-more-long-comments.patch deleted file mode 100644 index 7d52b01085..0000000000 --- a/patches/server/0792-Fix-saving-configs-with-more-long-comments.patch +++ /dev/null @@ -1,1702 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Jake Potrebic -Date: Sat, 1 Jan 2022 21:24:50 -0800 -Subject: [PATCH] Fix saving configs with more long comments - -This is a bug with snakeyaml -PR: https://bitbucket.org/snakeyaml/snakeyaml/pull-requests/3 -Issue: https://bitbucket.org/snakeyaml/snakeyaml/issues/518/comments-could-cause-queue-full - -Added the entire Emitter class from snakeyaml because -dev-imports doesn't work with non-mojang-added dependencies - -Replacement for upstream: https://hub.spigotmc.org/stash/projects/SPIGOT/repos/bukkit/commits/a7505b3cd0498baca152777767f0e4ddebbe4d1a - -diff --git a/src/main/java/org/yaml/snakeyaml/emitter/Emitter.java b/src/main/java/org/yaml/snakeyaml/emitter/Emitter.java -new file mode 100644 -index 0000000000000000000000000000000000000000..ca32c00775f3d98abea39bbfeb0268bb9efbc12b ---- /dev/null -+++ b/src/main/java/org/yaml/snakeyaml/emitter/Emitter.java -@@ -0,0 +1,1682 @@ -+/** -+ * Copyright (c) 2008, SnakeYAML -+ * -+ * Licensed under the Apache License, Version 2.0 (the "License"); -+ * you may not use this file except in compliance with the License. -+ * You may obtain a copy of the License at -+ * -+ * http://www.apache.org/licenses/LICENSE-2.0 -+ * -+ * Unless required by applicable law or agreed to in writing, software -+ * distributed under the License is distributed on an "AS IS" BASIS, -+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -+ * See the License for the specific language governing permissions and -+ * limitations under the License. -+ */ -+package org.yaml.snakeyaml.emitter; -+ -+import org.yaml.snakeyaml.DumperOptions; -+import org.yaml.snakeyaml.DumperOptions.ScalarStyle; -+import org.yaml.snakeyaml.DumperOptions.Version; -+import org.yaml.snakeyaml.comments.CommentEventsCollector; -+import org.yaml.snakeyaml.comments.CommentLine; -+import org.yaml.snakeyaml.comments.CommentType; -+import org.yaml.snakeyaml.error.YAMLException; -+import org.yaml.snakeyaml.events.AliasEvent; -+import org.yaml.snakeyaml.events.CollectionEndEvent; -+import org.yaml.snakeyaml.events.CollectionStartEvent; -+import org.yaml.snakeyaml.events.CommentEvent; -+import org.yaml.snakeyaml.events.DocumentEndEvent; -+import org.yaml.snakeyaml.events.DocumentStartEvent; -+import org.yaml.snakeyaml.events.Event; -+import org.yaml.snakeyaml.events.Event.ID; -+import org.yaml.snakeyaml.events.MappingEndEvent; -+import org.yaml.snakeyaml.events.MappingStartEvent; -+import org.yaml.snakeyaml.events.NodeEvent; -+import org.yaml.snakeyaml.events.ScalarEvent; -+import org.yaml.snakeyaml.events.SequenceEndEvent; -+import org.yaml.snakeyaml.events.SequenceStartEvent; -+import org.yaml.snakeyaml.events.StreamEndEvent; -+import org.yaml.snakeyaml.events.StreamStartEvent; -+import org.yaml.snakeyaml.nodes.Tag; -+import org.yaml.snakeyaml.reader.StreamReader; -+import org.yaml.snakeyaml.scanner.Constant; -+import org.yaml.snakeyaml.util.ArrayStack; -+ -+import java.io.IOException; -+import java.io.Writer; -+import java.util.ArrayDeque; -+import java.util.HashMap; -+import java.util.HashSet; -+import java.util.Iterator; -+import java.util.LinkedHashMap; -+import java.util.List; -+import java.util.Map; -+import java.util.Queue; -+import java.util.Set; -+import java.util.TreeSet; -+import java.util.concurrent.ArrayBlockingQueue; -+import java.util.regex.Matcher; -+import java.util.regex.Pattern; -+ -+/** -+ *
-+ * Emitter expects events obeying the following grammar:
-+ * stream ::= STREAM-START document* STREAM-END
-+ * document ::= DOCUMENT-START node DOCUMENT-END
-+ * node ::= SCALAR | sequence | mapping
-+ * sequence ::= SEQUENCE-START node* SEQUENCE-END
-+ * mapping ::= MAPPING-START (node node)* MAPPING-END
-+ * 
-+ */ -+public final class Emitter implements Emitable { -+ public static final int MIN_INDENT = 1; -+ public static final int MAX_INDENT = 10; -+ private static final char[] SPACE = {' '}; -+ -+ private static final Pattern SPACES_PATTERN = Pattern.compile("\\s"); -+ private static final Set INVALID_ANCHOR = new HashSet(); -+ static { -+ INVALID_ANCHOR.add('['); -+ INVALID_ANCHOR.add(']'); -+ INVALID_ANCHOR.add('{'); -+ INVALID_ANCHOR.add('}'); -+ INVALID_ANCHOR.add(','); -+ INVALID_ANCHOR.add('*'); -+ INVALID_ANCHOR.add('&'); -+ } -+ -+ private static final Map ESCAPE_REPLACEMENTS = new HashMap(); -+ static { -+ ESCAPE_REPLACEMENTS.put('\0', "0"); -+ ESCAPE_REPLACEMENTS.put('\u0007', "a"); -+ ESCAPE_REPLACEMENTS.put('\u0008', "b"); -+ ESCAPE_REPLACEMENTS.put('\u0009', "t"); -+ ESCAPE_REPLACEMENTS.put('\n', "n"); -+ ESCAPE_REPLACEMENTS.put('\u000B', "v"); -+ ESCAPE_REPLACEMENTS.put('\u000C', "f"); -+ ESCAPE_REPLACEMENTS.put('\r', "r"); -+ ESCAPE_REPLACEMENTS.put('\u001B', "e"); -+ ESCAPE_REPLACEMENTS.put('"', "\""); -+ ESCAPE_REPLACEMENTS.put('\\', "\\"); -+ ESCAPE_REPLACEMENTS.put('\u0085', "N"); -+ ESCAPE_REPLACEMENTS.put('\u00A0', "_"); -+ ESCAPE_REPLACEMENTS.put('\u2028', "L"); -+ ESCAPE_REPLACEMENTS.put('\u2029', "P"); -+ } -+ -+ private final static Map DEFAULT_TAG_PREFIXES = new LinkedHashMap(); -+ static { -+ DEFAULT_TAG_PREFIXES.put("!", "!"); -+ DEFAULT_TAG_PREFIXES.put(Tag.PREFIX, "!!"); -+ } -+ // The stream should have the methods `write` and possibly `flush`. -+ private final Writer stream; -+ -+ // Encoding is defined by Writer (cannot be overridden by STREAM-START.) -+ // private Charset encoding; -+ -+ // Emitter is a state machine with a stack of states to handle nested -+ // structures. -+ private final ArrayStack states; -+ private EmitterState state; -+ -+ // Current event and the event queue. -+ private final Queue events; -+ private Event event; -+ -+ // The current indentation level and the stack of previous indents. -+ private final ArrayStack indents; -+ private Integer indent; -+ -+ // Flow level. -+ private int flowLevel; -+ -+ // Contexts. -+ private boolean rootContext; -+ private boolean mappingContext; -+ private boolean simpleKeyContext; -+ -+ // -+ // Characteristics of the last emitted character: -+ // - current position. -+ // - is it a whitespace? -+ // - is it an indention character -+ // (indentation space, '-', '?', or ':')? -+ // private int line; this variable is not used -+ private int column; -+ private boolean whitespace; -+ private boolean indention; -+ private boolean openEnded; -+ -+ // Formatting details. -+ private final Boolean canonical; -+ // pretty print flow by adding extra line breaks -+ private final Boolean prettyFlow; -+ -+ private final boolean allowUnicode; -+ private int bestIndent; -+ private final int indicatorIndent; -+ private final boolean indentWithIndicator; -+ private int bestWidth; -+ private final char[] bestLineBreak; -+ private final boolean splitLines; -+ private final int maxSimpleKeyLength; -+ private final boolean emitComments; -+ -+ // Tag prefixes. -+ private Map tagPrefixes; -+ -+ // Prepared anchor and tag. -+ private String preparedAnchor; -+ private String preparedTag; -+ -+ // Scalar analysis and style. -+ private ScalarAnalysis analysis; -+ private DumperOptions.ScalarStyle style; -+ -+ // Comment processing -+ private final CommentEventsCollector blockCommentsCollector; -+ private final CommentEventsCollector inlineCommentsCollector; -+ -+ -+ public Emitter(Writer stream, DumperOptions opts) { -+ // The stream should have the methods `write` and possibly `flush`. -+ this.stream = stream; -+ // Emitter is a state machine with a stack of states to handle nested -+ // structures. -+ this.states = new ArrayStack(100); -+ this.state = new ExpectStreamStart(); -+ // Current event and the event queue. -+ this.events = new ArrayDeque<>(100); // Paper - allow more than 100 events (or comments) -+ // this.events = new ArrayBlockingQueue<>(100); -+ this.event = null; -+ // The current indentation level and the stack of previous indents. -+ this.indents = new ArrayStack(10); -+ this.indent = null; -+ // Flow level. -+ this.flowLevel = 0; -+ // Contexts. -+ mappingContext = false; -+ simpleKeyContext = false; -+ -+ // -+ // Characteristics of the last emitted character: -+ // - current position. -+ // - is it a whitespace? -+ // - is it an indention character -+ // (indentation space, '-', '?', or ':')? -+ column = 0; -+ whitespace = true; -+ indention = true; -+ -+ // Whether the document requires an explicit document indicator -+ openEnded = false; -+ -+ // Formatting details. -+ this.canonical = opts.isCanonical(); -+ this.prettyFlow = opts.isPrettyFlow(); -+ this.allowUnicode = opts.isAllowUnicode(); -+ this.bestIndent = 2; -+ if ((opts.getIndent() > MIN_INDENT) && (opts.getIndent() < MAX_INDENT)) { -+ this.bestIndent = opts.getIndent(); -+ } -+ this.indicatorIndent = opts.getIndicatorIndent(); -+ this.indentWithIndicator = opts.getIndentWithIndicator(); -+ this.bestWidth = 80; -+ if (opts.getWidth() > this.bestIndent * 2) { -+ this.bestWidth = opts.getWidth(); -+ } -+ this.bestLineBreak = opts.getLineBreak().getString().toCharArray(); -+ this.splitLines = opts.getSplitLines(); -+ this.maxSimpleKeyLength = opts.getMaxSimpleKeyLength(); -+ this.emitComments = opts.isProcessComments(); -+ -+ // Tag prefixes. -+ this.tagPrefixes = new LinkedHashMap(); -+ -+ // Prepared anchor and tag. -+ this.preparedAnchor = null; -+ this.preparedTag = null; -+ -+ // Scalar analysis and style. -+ this.analysis = null; -+ this.style = null; -+ -+ // Comment processing -+ this.blockCommentsCollector = new CommentEventsCollector(events, -+ CommentType.BLANK_LINE, CommentType.BLOCK); -+ this.inlineCommentsCollector = new CommentEventsCollector(events, -+ CommentType.IN_LINE); -+ } -+ -+ public void emit(Event event) throws IOException { -+ this.events.add(event); -+ while (!needMoreEvents()) { -+ this.event = this.events.poll(); -+ this.state.expect(); -+ this.event = null; -+ } -+ } -+ -+ // In some cases, we wait for a few next events before emitting. -+ -+ private boolean needMoreEvents() { -+ if (events.isEmpty()) { -+ return true; -+ } -+ -+ Iterator iter = events.iterator(); -+ Event event = iter.next(); // FIXME why without check ??? -+ while(event instanceof CommentEvent) { -+ if (!iter.hasNext()) { -+ return true; -+ } -+ event = iter.next(); -+ } -+ -+ if (event instanceof DocumentStartEvent) { -+ return needEvents(iter, 1); -+ } else if (event instanceof SequenceStartEvent) { -+ return needEvents(iter, 2); -+ } else if (event instanceof MappingStartEvent) { -+ return needEvents(iter, 3); -+ } else if (event instanceof StreamStartEvent) { -+ return needEvents(iter, 2); -+ } else if (event instanceof StreamEndEvent) { -+ return false; -+ } else if (emitComments) { -+ return needEvents(iter, 1); -+ } -+ return false; -+ } -+ -+ private boolean needEvents(Iterator iter, int count) { -+ int level = 0; -+ int actualCount = 0; -+ while (iter.hasNext()) { -+ Event event = iter.next(); -+ if (event instanceof CommentEvent) { -+ continue; -+ } -+ actualCount++; -+ if (event instanceof DocumentStartEvent || event instanceof CollectionStartEvent) { -+ level++; -+ } else if (event instanceof DocumentEndEvent || event instanceof CollectionEndEvent) { -+ level--; -+ } else if (event instanceof StreamEndEvent) { -+ level = -1; -+ } -+ if (level < 0) { -+ return false; -+ } -+ } -+ return actualCount < count; -+ } -+ -+ private void increaseIndent(boolean flow, boolean indentless) { -+ indents.push(indent); -+ if (indent == null) { -+ if (flow) { -+ indent = bestIndent; -+ } else { -+ indent = 0; -+ } -+ } else if (!indentless) { -+ this.indent += bestIndent; -+ } -+ } -+ -+ // States -+ -+ // Stream handlers. -+ -+ private class ExpectStreamStart implements EmitterState { -+ public void expect() throws IOException { -+ if (event instanceof StreamStartEvent) { -+ writeStreamStart(); -+ state = new ExpectFirstDocumentStart(); -+ } else { -+ throw new EmitterException("expected StreamStartEvent, but got " + event); -+ } -+ } -+ } -+ -+ private class ExpectNothing implements EmitterState { -+ public void expect() throws IOException { -+ throw new EmitterException("expecting nothing, but got " + event); -+ } -+ } -+ -+ // Document handlers. -+ -+ private class ExpectFirstDocumentStart implements EmitterState { -+ public void expect() throws IOException { -+ new ExpectDocumentStart(true).expect(); -+ } -+ } -+ -+ private class ExpectDocumentStart implements EmitterState { -+ private final boolean first; -+ -+ public ExpectDocumentStart(boolean first) { -+ this.first = first; -+ } -+ -+ public void expect() throws IOException { -+ if (event instanceof DocumentStartEvent) { -+ DocumentStartEvent ev = (DocumentStartEvent) event; -+ if ((ev.getVersion() != null || ev.getTags() != null) && openEnded) { -+ writeIndicator("...", true, false, false); -+ writeIndent(); -+ } -+ if (ev.getVersion() != null) { -+ String versionText = prepareVersion(ev.getVersion()); -+ writeVersionDirective(versionText); -+ } -+ tagPrefixes = new LinkedHashMap(DEFAULT_TAG_PREFIXES); -+ if (ev.getTags() != null) { -+ Set handles = new TreeSet(ev.getTags().keySet()); -+ for (String handle : handles) { -+ String prefix = ev.getTags().get(handle); -+ tagPrefixes.put(prefix, handle); -+ String handleText = prepareTagHandle(handle); -+ String prefixText = prepareTagPrefix(prefix); -+ writeTagDirective(handleText, prefixText); -+ } -+ } -+ boolean implicit = first && !ev.getExplicit() && !canonical -+ && ev.getVersion() == null -+ && (ev.getTags() == null || ev.getTags().isEmpty()) -+ && !checkEmptyDocument(); -+ if (!implicit) { -+ writeIndent(); -+ writeIndicator("---", true, false, false); -+ if (canonical) { -+ writeIndent(); -+ } -+ } -+ state = new ExpectDocumentRoot(); -+ } else if (event instanceof StreamEndEvent) { -+ writeStreamEnd(); -+ state = new ExpectNothing(); -+ } else if (event instanceof CommentEvent) { -+ blockCommentsCollector.collectEvents(event); -+ writeBlockComment(); -+ // state = state; remains unchanged -+ } else { -+ throw new EmitterException("expected DocumentStartEvent, but got " + event); -+ } -+ } -+ } -+ -+ private class ExpectDocumentEnd implements EmitterState { -+ public void expect() throws IOException { -+ event = blockCommentsCollector.collectEventsAndPoll(event); -+ writeBlockComment(); -+ if (event instanceof DocumentEndEvent) { -+ writeIndent(); -+ if (((DocumentEndEvent) event).getExplicit()) { -+ writeIndicator("...", true, false, false); -+ writeIndent(); -+ } -+ flushStream(); -+ state = new ExpectDocumentStart(false); -+ } else { -+ throw new EmitterException("expected DocumentEndEvent, but got " + event); -+ } -+ } -+ } -+ -+ private class ExpectDocumentRoot implements EmitterState { -+ public void expect() throws IOException { -+ event = blockCommentsCollector.collectEventsAndPoll(event); -+ if (!blockCommentsCollector.isEmpty()) { -+ writeBlockComment(); -+ if (event instanceof DocumentEndEvent) { -+ new ExpectDocumentEnd().expect(); -+ return; -+ } -+ } -+ states.push(new ExpectDocumentEnd()); -+ expectNode(true, false, false); -+ } -+ } -+ -+ // Node handlers. -+ -+ private void expectNode(boolean root, boolean mapping, boolean simpleKey) throws IOException { -+ rootContext = root; -+ mappingContext = mapping; -+ simpleKeyContext = simpleKey; -+ if (event instanceof AliasEvent) { -+ expectAlias(); -+ } else if (event instanceof ScalarEvent || event instanceof CollectionStartEvent) { -+ processAnchor("&"); -+ processTag(); -+ if (event instanceof ScalarEvent) { -+ expectScalar(); -+ } else if (event instanceof SequenceStartEvent) { -+ if (flowLevel != 0 || canonical || ((SequenceStartEvent) event).isFlow() -+ || checkEmptySequence()) { -+ expectFlowSequence(); -+ } else { -+ expectBlockSequence(); -+ } -+ } else {// MappingStartEvent -+ if (flowLevel != 0 || canonical || ((MappingStartEvent) event).isFlow() -+ || checkEmptyMapping()) { -+ expectFlowMapping(); -+ } else { -+ expectBlockMapping(); -+ } -+ } -+ } else { -+ throw new EmitterException("expected NodeEvent, but got " + event); -+ } -+ } -+ -+ private void expectAlias() throws IOException { -+ if (!(event instanceof AliasEvent)) { -+ throw new EmitterException("Alias must be provided"); -+ } -+ processAnchor("*"); -+ state = states.pop(); -+ } -+ -+ private void expectScalar() throws IOException { -+ increaseIndent(true, false); -+ processScalar(); -+ indent = indents.pop(); -+ state = states.pop(); -+ } -+ -+ // Flow sequence handlers. -+ -+ private void expectFlowSequence() throws IOException { -+ writeIndicator("[", true, true, false); -+ flowLevel++; -+ increaseIndent(true, false); -+ if (prettyFlow) { -+ writeIndent(); -+ } -+ state = new ExpectFirstFlowSequenceItem(); -+ } -+ -+ private class ExpectFirstFlowSequenceItem implements EmitterState { -+ public void expect() throws IOException { -+ if (event instanceof SequenceEndEvent) { -+ indent = indents.pop(); -+ flowLevel--; -+ writeIndicator("]", false, false, false); -+ inlineCommentsCollector.collectEvents(); -+ writeInlineComments(); -+ state = states.pop(); -+ } else if (event instanceof CommentEvent) { -+ blockCommentsCollector.collectEvents(event); -+ writeBlockComment(); -+ } else { -+ if (canonical || (column > bestWidth && splitLines) || prettyFlow) { -+ writeIndent(); -+ } -+ states.push(new ExpectFlowSequenceItem()); -+ expectNode(false, false, false); -+ event = inlineCommentsCollector.collectEvents(event); -+ writeInlineComments(); -+ } -+ } -+ } -+ -+ private class ExpectFlowSequenceItem implements EmitterState { -+ public void expect() throws IOException { -+ if (event instanceof SequenceEndEvent) { -+ indent = indents.pop(); -+ flowLevel--; -+ if (canonical) { -+ writeIndicator(",", false, false, false); -+ writeIndent(); -+ } else if (prettyFlow) { -+ writeIndent(); -+ } -+ writeIndicator("]", false, false, false); -+ inlineCommentsCollector.collectEvents(); -+ writeInlineComments(); -+ if (prettyFlow) { -+ writeIndent(); -+ } -+ state = states.pop(); -+ } else if (event instanceof CommentEvent) { -+ event = blockCommentsCollector.collectEvents(event); -+ } else { -+ writeIndicator(",", false, false, false); -+ writeBlockComment(); -+ if (canonical || (column > bestWidth && splitLines) || prettyFlow) { -+ writeIndent(); -+ } -+ states.push(new ExpectFlowSequenceItem()); -+ expectNode(false, false, false); -+ event = inlineCommentsCollector.collectEvents(event); -+ writeInlineComments(); -+ } -+ } -+ } -+ -+ // Flow mapping handlers. -+ -+ private void expectFlowMapping() throws IOException { -+ writeIndicator("{", true, true, false); -+ flowLevel++; -+ increaseIndent(true, false); -+ if (prettyFlow) { -+ writeIndent(); -+ } -+ state = new ExpectFirstFlowMappingKey(); -+ } -+ -+ private class ExpectFirstFlowMappingKey implements EmitterState { -+ public void expect() throws IOException { -+ event = blockCommentsCollector.collectEventsAndPoll(event); -+ writeBlockComment(); -+ if (event instanceof MappingEndEvent) { -+ indent = indents.pop(); -+ flowLevel--; -+ writeIndicator("}", false, false, false); -+ inlineCommentsCollector.collectEvents(); -+ writeInlineComments(); -+ state = states.pop(); -+ } else { -+ if (canonical || (column > bestWidth && splitLines) || prettyFlow) { -+ writeIndent(); -+ } -+ if (!canonical && checkSimpleKey()) { -+ states.push(new ExpectFlowMappingSimpleValue()); -+ expectNode(false, true, true); -+ } else { -+ writeIndicator("?", true, false, false); -+ states.push(new ExpectFlowMappingValue()); -+ expectNode(false, true, false); -+ } -+ } -+ } -+ } -+ -+ private class ExpectFlowMappingKey implements EmitterState { -+ public void expect() throws IOException { -+ if (event instanceof MappingEndEvent) { -+ indent = indents.pop(); -+ flowLevel--; -+ if (canonical) { -+ writeIndicator(",", false, false, false); -+ writeIndent(); -+ } -+ if (prettyFlow) { -+ writeIndent(); -+ } -+ writeIndicator("}", false, false, false); -+ inlineCommentsCollector.collectEvents(); -+ writeInlineComments(); -+ state = states.pop(); -+ } else { -+ writeIndicator(",", false, false, false); -+ event = blockCommentsCollector.collectEventsAndPoll(event); -+ writeBlockComment(); -+ if (canonical || (column > bestWidth && splitLines) || prettyFlow) { -+ writeIndent(); -+ } -+ if (!canonical && checkSimpleKey()) { -+ states.push(new ExpectFlowMappingSimpleValue()); -+ expectNode(false, true, true); -+ } else { -+ writeIndicator("?", true, false, false); -+ states.push(new ExpectFlowMappingValue()); -+ expectNode(false, true, false); -+ } -+ } -+ } -+ } -+ -+ private class ExpectFlowMappingSimpleValue implements EmitterState { -+ public void expect() throws IOException { -+ writeIndicator(":", false, false, false); -+ event = inlineCommentsCollector.collectEventsAndPoll(event); -+ writeInlineComments(); -+ states.push(new ExpectFlowMappingKey()); -+ expectNode(false, true, false); -+ inlineCommentsCollector.collectEvents(event); -+ writeInlineComments(); -+ } -+ } -+ -+ private class ExpectFlowMappingValue implements EmitterState { -+ public void expect() throws IOException { -+ if (canonical || (column > bestWidth) || prettyFlow) { -+ writeIndent(); -+ } -+ writeIndicator(":", true, false, false); -+ event = inlineCommentsCollector.collectEventsAndPoll(event); -+ writeInlineComments(); -+ states.push(new ExpectFlowMappingKey()); -+ expectNode(false, true, false); -+ inlineCommentsCollector.collectEvents(event); -+ writeInlineComments(); -+ } -+ } -+ -+ // Block sequence handlers. -+ -+ private void expectBlockSequence() throws IOException { -+ boolean indentless = mappingContext && !indention; -+ increaseIndent(false, indentless); -+ state = new ExpectFirstBlockSequenceItem(); -+ } -+ -+ private class ExpectFirstBlockSequenceItem implements EmitterState { -+ public void expect() throws IOException { -+ new ExpectBlockSequenceItem(true).expect(); -+ } -+ } -+ -+ private class ExpectBlockSequenceItem implements EmitterState { -+ private final boolean first; -+ -+ public ExpectBlockSequenceItem(boolean first) { -+ this.first = first; -+ } -+ -+ public void expect() throws IOException { -+ if (!this.first && event instanceof SequenceEndEvent) { -+ indent = indents.pop(); -+ state = states.pop(); -+ } else if( event instanceof CommentEvent) { -+ blockCommentsCollector.collectEvents(event); -+ } else { -+ writeIndent(); -+ if (!indentWithIndicator || this.first) { -+ writeWhitespace(indicatorIndent); -+ } -+ writeIndicator("-", true, false, true); -+ if (indentWithIndicator && this.first) { -+ indent += indicatorIndent; -+ } -+ if (!blockCommentsCollector.isEmpty()) { -+ increaseIndent(false, false); -+ writeBlockComment(); -+ if(event instanceof ScalarEvent) { -+ analysis = analyzeScalar(((ScalarEvent)event).getValue()); -+ if (!analysis.isEmpty()) { -+ writeIndent(); -+ } -+ } -+ indent = indents.pop(); -+ } -+ states.push(new ExpectBlockSequenceItem(false)); -+ expectNode(false, false, false); -+ inlineCommentsCollector.collectEvents(); -+ writeInlineComments(); -+ } -+ } -+ } -+ -+ // Block mapping handlers. -+ private void expectBlockMapping() throws IOException { -+ increaseIndent(false, false); -+ state = new ExpectFirstBlockMappingKey(); -+ } -+ -+ private class ExpectFirstBlockMappingKey implements EmitterState { -+ public void expect() throws IOException { -+ new ExpectBlockMappingKey(true).expect(); -+ } -+ } -+ -+ private class ExpectBlockMappingKey implements EmitterState { -+ private final boolean first; -+ -+ public ExpectBlockMappingKey(boolean first) { -+ this.first = first; -+ } -+ -+ public void expect() throws IOException { -+ event = blockCommentsCollector.collectEventsAndPoll(event); -+ writeBlockComment(); -+ if (!this.first && event instanceof MappingEndEvent) { -+ indent = indents.pop(); -+ state = states.pop(); -+ } else { -+ writeIndent(); -+ if (checkSimpleKey()) { -+ states.push(new ExpectBlockMappingSimpleValue()); -+ expectNode(false, true, true); -+ } else { -+ writeIndicator("?", true, false, true); -+ states.push(new ExpectBlockMappingValue()); -+ expectNode(false, true, false); -+ } -+ } -+ } -+ } -+ -+ private boolean isFoldedOrLiteral(Event event) { -+ if(!event.is(ID.Scalar)) { -+ return false; -+ } -+ ScalarEvent scalarEvent = (ScalarEvent) event; -+ ScalarStyle style = scalarEvent.getScalarStyle(); -+ return style == ScalarStyle.FOLDED || style == ScalarStyle.LITERAL; -+ } -+ -+ private class ExpectBlockMappingSimpleValue implements EmitterState { -+ public void expect() throws IOException { -+ writeIndicator(":", false, false, false); -+ event = inlineCommentsCollector.collectEventsAndPoll(event); -+ if(!isFoldedOrLiteral(event)) { -+ if(writeInlineComments()) { -+ increaseIndent(true, false); -+ writeIndent(); -+ indent = indents.pop(); -+ } -+ } -+ event = blockCommentsCollector.collectEventsAndPoll(event); -+ if(!blockCommentsCollector.isEmpty()) { -+ increaseIndent(true, false); -+ writeBlockComment(); -+ writeIndent(); -+ indent = indents.pop(); -+ } -+ states.push(new ExpectBlockMappingKey(false)); -+ expectNode(false, true, false); -+ inlineCommentsCollector.collectEvents(); -+ writeInlineComments(); -+ } -+ } -+ -+ private class ExpectBlockMappingValue implements EmitterState { -+ public void expect() throws IOException { -+ writeIndent(); -+ writeIndicator(":", true, false, true); -+ event = inlineCommentsCollector.collectEventsAndPoll(event); -+ writeInlineComments(); -+ event = blockCommentsCollector.collectEventsAndPoll(event); -+ writeBlockComment(); -+ states.push(new ExpectBlockMappingKey(false)); -+ expectNode(false, true, false); -+ inlineCommentsCollector.collectEvents(event); -+ writeInlineComments(); -+ } -+ } -+ -+ // Checkers. -+ -+ private boolean checkEmptySequence() { -+ return event instanceof SequenceStartEvent && !events.isEmpty() && events.peek() instanceof SequenceEndEvent; -+ } -+ -+ private boolean checkEmptyMapping() { -+ return event instanceof MappingStartEvent && !events.isEmpty() && events.peek() instanceof MappingEndEvent; -+ } -+ -+ private boolean checkEmptyDocument() { -+ if (!(event instanceof DocumentStartEvent) || events.isEmpty()) { -+ return false; -+ } -+ Event event = events.peek(); -+ if (event instanceof ScalarEvent) { -+ ScalarEvent e = (ScalarEvent) event; -+ return e.getAnchor() == null && e.getTag() == null && e.getImplicit() != null && e -+ .getValue().length() == 0; -+ } -+ return false; -+ } -+ -+ private boolean checkSimpleKey() { -+ int length = 0; -+ if (event instanceof NodeEvent && ((NodeEvent) event).getAnchor() != null) { -+ if (preparedAnchor == null) { -+ preparedAnchor = prepareAnchor(((NodeEvent) event).getAnchor()); -+ } -+ length += preparedAnchor.length(); -+ } -+ String tag = null; -+ if (event instanceof ScalarEvent) { -+ tag = ((ScalarEvent) event).getTag(); -+ } else if (event instanceof CollectionStartEvent) { -+ tag = ((CollectionStartEvent) event).getTag(); -+ } -+ if (tag != null) { -+ if (preparedTag == null) { -+ preparedTag = prepareTag(tag); -+ } -+ length += preparedTag.length(); -+ } -+ if (event instanceof ScalarEvent) { -+ if (analysis == null) { -+ analysis = analyzeScalar(((ScalarEvent) event).getValue()); -+ } -+ length += analysis.getScalar().length(); -+ } -+ return length < maxSimpleKeyLength && (event instanceof AliasEvent -+ || (event instanceof ScalarEvent && !analysis.isEmpty() && !analysis.isMultiline()) -+ || checkEmptySequence() || checkEmptyMapping()); -+ } -+ -+ // Anchor, Tag, and Scalar processors. -+ -+ private void processAnchor(String indicator) throws IOException { -+ NodeEvent ev = (NodeEvent) event; -+ if (ev.getAnchor() == null) { -+ preparedAnchor = null; -+ return; -+ } -+ if (preparedAnchor == null) { -+ preparedAnchor = prepareAnchor(ev.getAnchor()); -+ } -+ writeIndicator(indicator + preparedAnchor, true, false, false); -+ preparedAnchor = null; -+ } -+ -+ private void processTag() throws IOException { -+ String tag = null; -+ if (event instanceof ScalarEvent) { -+ ScalarEvent ev = (ScalarEvent) event; -+ tag = ev.getTag(); -+ if (style == null) { -+ style = chooseScalarStyle(); -+ } -+ if ((!canonical || tag == null) && ((style == null && ev.getImplicit() -+ .canOmitTagInPlainScalar()) || (style != null && ev.getImplicit() -+ .canOmitTagInNonPlainScalar()))) { -+ preparedTag = null; -+ return; -+ } -+ if (ev.getImplicit().canOmitTagInPlainScalar() && tag == null) { -+ tag = "!"; -+ preparedTag = null; -+ } -+ } else { -+ CollectionStartEvent ev = (CollectionStartEvent) event; -+ tag = ev.getTag(); -+ if ((!canonical || tag == null) && ev.getImplicit()) { -+ preparedTag = null; -+ return; -+ } -+ } -+ if (tag == null) { -+ throw new EmitterException("tag is not specified"); -+ } -+ if (preparedTag == null) { -+ preparedTag = prepareTag(tag); -+ } -+ writeIndicator(preparedTag, true, false, false); -+ preparedTag = null; -+ } -+ -+ private DumperOptions.ScalarStyle chooseScalarStyle() { -+ ScalarEvent ev = (ScalarEvent) event; -+ if (analysis == null) { -+ analysis = analyzeScalar(ev.getValue()); -+ } -+ if (!ev.isPlain() && ev.getScalarStyle() == DumperOptions.ScalarStyle.DOUBLE_QUOTED || this.canonical) { -+ return DumperOptions.ScalarStyle.DOUBLE_QUOTED; -+ } -+ if (ev.isPlain() && ev.getImplicit().canOmitTagInPlainScalar()) { -+ if (!(simpleKeyContext && (analysis.isEmpty() || analysis.isMultiline())) -+ && ((flowLevel != 0 && analysis.isAllowFlowPlain()) || (flowLevel == 0 && analysis.isAllowBlockPlain()))) { -+ return null; -+ } -+ } -+ if (!ev.isPlain() && (ev.getScalarStyle() == DumperOptions.ScalarStyle.LITERAL || ev.getScalarStyle() == DumperOptions.ScalarStyle.FOLDED)) { -+ if (flowLevel == 0 && !simpleKeyContext && analysis.isAllowBlock()) { -+ return ev.getScalarStyle(); -+ } -+ } -+ if (ev.isPlain() || ev.getScalarStyle() == DumperOptions.ScalarStyle.SINGLE_QUOTED) { -+ if (analysis.isAllowSingleQuoted() && !(simpleKeyContext && analysis.isMultiline())) { -+ return DumperOptions.ScalarStyle.SINGLE_QUOTED; -+ } -+ } -+ return DumperOptions.ScalarStyle.DOUBLE_QUOTED; -+ } -+ -+ private void processScalar() throws IOException { -+ ScalarEvent ev = (ScalarEvent) event; -+ if (analysis == null) { -+ analysis = analyzeScalar(ev.getValue()); -+ } -+ if (style == null) { -+ style = chooseScalarStyle(); -+ } -+ boolean split = !simpleKeyContext && splitLines; -+ if (style == null) { -+ writePlain(analysis.getScalar(), split); -+ } else { -+ switch (style) { -+ case DOUBLE_QUOTED: -+ writeDoubleQuoted(analysis.getScalar(), split); -+ break; -+ case SINGLE_QUOTED: -+ writeSingleQuoted(analysis.getScalar(), split); -+ break; -+ case FOLDED: -+ writeFolded(analysis.getScalar(), split); -+ break; -+ case LITERAL: -+ writeLiteral(analysis.getScalar()); -+ break; -+ default: -+ throw new YAMLException("Unexpected style: " + style); -+ } -+ } -+ analysis = null; -+ style = null; -+ } -+ -+ // Analyzers. -+ -+ private String prepareVersion(Version version) { -+ if (version.major() != 1) { -+ throw new EmitterException("unsupported YAML version: " + version); -+ } -+ return version.getRepresentation(); -+ } -+ -+ private final static Pattern HANDLE_FORMAT = Pattern.compile("^![-_\\w]*!$"); -+ -+ private String prepareTagHandle(String handle) { -+ if (handle.length() == 0) { -+ throw new EmitterException("tag handle must not be empty"); -+ } else if (handle.charAt(0) != '!' || handle.charAt(handle.length() - 1) != '!') { -+ throw new EmitterException("tag handle must start and end with '!': " + handle); -+ } else if (!"!".equals(handle) && !HANDLE_FORMAT.matcher(handle).matches()) { -+ throw new EmitterException("invalid character in the tag handle: " + handle); -+ } -+ return handle; -+ } -+ -+ private String prepareTagPrefix(String prefix) { -+ if (prefix.length() == 0) { -+ throw new EmitterException("tag prefix must not be empty"); -+ } -+ StringBuilder chunks = new StringBuilder(); -+ int start = 0; -+ int end = 0; -+ if (prefix.charAt(0) == '!') { -+ end = 1; -+ } -+ while (end < prefix.length()) { -+ end++; -+ } -+ if (start < end) { -+ chunks.append(prefix, start, end); -+ } -+ return chunks.toString(); -+ } -+ -+ private String prepareTag(String tag) { -+ if (tag.length() == 0) { -+ throw new EmitterException("tag must not be empty"); -+ } -+ if ("!".equals(tag)) { -+ return tag; -+ } -+ String handle = null; -+ String suffix = tag; -+ // shall the tag prefixes be sorted as in PyYAML? -+ for (String prefix : tagPrefixes.keySet()) { -+ if (tag.startsWith(prefix) && ("!".equals(prefix) || prefix.length() < tag.length())) { -+ handle = prefix; -+ } -+ } -+ if (handle != null) { -+ suffix = tag.substring(handle.length()); -+ handle = tagPrefixes.get(handle); -+ } -+ -+ int end = suffix.length(); -+ String suffixText = end > 0 ? suffix.substring(0, end) : ""; -+ -+ if (handle != null) { -+ return handle + suffixText; -+ } -+ return "!<" + suffixText + ">"; -+ } -+ -+ static String prepareAnchor(String anchor) { -+ if (anchor.length() == 0) { -+ throw new EmitterException("anchor must not be empty"); -+ } -+ for (Character invalid : INVALID_ANCHOR) { -+ if (anchor.indexOf(invalid) > -1) { -+ throw new EmitterException("Invalid character '" + invalid + "' in the anchor: " + anchor); -+ } -+ } -+ Matcher matcher = SPACES_PATTERN.matcher(anchor); -+ if (matcher.find()) { -+ throw new EmitterException("Anchor may not contain spaces: " + anchor); -+ } -+ return anchor; -+ } -+ -+ private ScalarAnalysis analyzeScalar(String scalar) { -+ // Empty scalar is a special case. -+ if (scalar.length() == 0) { -+ return new ScalarAnalysis(scalar, true, false, false, true, true, false); -+ } -+ // Indicators and special characters. -+ boolean blockIndicators = false; -+ boolean flowIndicators = false; -+ boolean lineBreaks = false; -+ boolean specialCharacters = false; -+ -+ // Important whitespace combinations. -+ boolean leadingSpace = false; -+ boolean leadingBreak = false; -+ boolean trailingSpace = false; -+ boolean trailingBreak = false; -+ boolean breakSpace = false; -+ boolean spaceBreak = false; -+ -+ // Check document indicators. -+ if (scalar.startsWith("---") || scalar.startsWith("...")) { -+ blockIndicators = true; -+ flowIndicators = true; -+ } -+ // First character or preceded by a whitespace. -+ boolean preceededByWhitespace = true; -+ boolean followedByWhitespace = scalar.length() == 1 || Constant.NULL_BL_T_LINEBR.has(scalar.codePointAt(1)); -+ // The previous character is a space. -+ boolean previousSpace = false; -+ -+ // The previous character is a break. -+ boolean previousBreak = false; -+ -+ int index = 0; -+ -+ while (index < scalar.length()) { -+ int c = scalar.codePointAt(index); -+ // Check for indicators. -+ if (index == 0) { -+ // Leading indicators are special characters. -+ if ("#,[]{}&*!|>'\"%@`".indexOf(c) != -1) { -+ flowIndicators = true; -+ blockIndicators = true; -+ } -+ if (c == '?' || c == ':') { -+ flowIndicators = true; -+ if (followedByWhitespace) { -+ blockIndicators = true; -+ } -+ } -+ if (c == '-' && followedByWhitespace) { -+ flowIndicators = true; -+ blockIndicators = true; -+ } -+ } else { -+ // Some indicators cannot appear within a scalar as well. -+ if (",?[]{}".indexOf(c) != -1) { -+ flowIndicators = true; -+ } -+ if (c == ':') { -+ flowIndicators = true; -+ if (followedByWhitespace) { -+ blockIndicators = true; -+ } -+ } -+ if (c == '#' && preceededByWhitespace) { -+ flowIndicators = true; -+ blockIndicators = true; -+ } -+ } -+ // Check for line breaks, special, and unicode characters. -+ boolean isLineBreak = Constant.LINEBR.has(c); -+ if (isLineBreak) { -+ lineBreaks = true; -+ } -+ if (!(c == '\n' || (0x20 <= c && c <= 0x7E))) { -+ if (c == 0x85 || (c >= 0xA0 && c <= 0xD7FF) -+ || (c >= 0xE000 && c <= 0xFFFD) -+ || (c >= 0x10000 && c <= 0x10FFFF)) { -+ // unicode is used -+ if (!this.allowUnicode) { -+ specialCharacters = true; -+ } -+ } else { -+ specialCharacters = true; -+ } -+ } -+ // Detect important whitespace combinations. -+ if (c == ' ') { -+ if (index == 0) { -+ leadingSpace = true; -+ } -+ if (index == scalar.length() - 1) { -+ trailingSpace = true; -+ } -+ if (previousBreak) { -+ breakSpace = true; -+ } -+ previousSpace = true; -+ previousBreak = false; -+ } else if (isLineBreak) { -+ if (index == 0) { -+ leadingBreak = true; -+ } -+ if (index == scalar.length() - 1) { -+ trailingBreak = true; -+ } -+ if (previousSpace) { -+ spaceBreak = true; -+ } -+ previousSpace = false; -+ previousBreak = true; -+ } else { -+ previousSpace = false; -+ previousBreak = false; -+ } -+ -+ // Prepare for the next character. -+ index += Character.charCount(c); -+ preceededByWhitespace = Constant.NULL_BL_T.has(c) || isLineBreak; -+ followedByWhitespace = true; -+ if (index + 1 < scalar.length()) { -+ int nextIndex = index + Character.charCount(scalar.codePointAt(index)); -+ if (nextIndex < scalar.length()) { -+ followedByWhitespace = (Constant.NULL_BL_T.has(scalar.codePointAt(nextIndex))) || isLineBreak; -+ } -+ } -+ } -+ // Let's decide what styles are allowed. -+ boolean allowFlowPlain = true; -+ boolean allowBlockPlain = true; -+ boolean allowSingleQuoted = true; -+ boolean allowBlock = true; -+ // Leading and trailing whitespaces are bad for plain scalars. -+ if (leadingSpace || leadingBreak || trailingSpace || trailingBreak) { -+ allowFlowPlain = allowBlockPlain = false; -+ } -+ // We do not permit trailing spaces for block scalars. -+ if (trailingSpace) { -+ allowBlock = false; -+ } -+ // Spaces at the beginning of a new line are only acceptable for block -+ // scalars. -+ if (breakSpace) { -+ allowFlowPlain = allowBlockPlain = allowSingleQuoted = false; -+ } -+ // Spaces followed by breaks, as well as special character are only -+ // allowed for double quoted scalars. -+ if (spaceBreak || specialCharacters) { -+ allowFlowPlain = allowBlockPlain = allowSingleQuoted = allowBlock = false; -+ } -+ // Although the plain scalar writer supports breaks, we never emit -+ // multiline plain scalars in the flow context. -+ if (lineBreaks) { -+ allowFlowPlain = false; -+ } -+ // Flow indicators are forbidden for flow plain scalars. -+ if (flowIndicators) { -+ allowFlowPlain = false; -+ } -+ // Block indicators are forbidden for block plain scalars. -+ if (blockIndicators) { -+ allowBlockPlain = false; -+ } -+ -+ return new ScalarAnalysis(scalar, false, lineBreaks, allowFlowPlain, allowBlockPlain, -+ allowSingleQuoted, allowBlock); -+ } -+ -+ // Writers. -+ -+ void flushStream() throws IOException { -+ stream.flush(); -+ } -+ -+ void writeStreamStart() { -+ // BOM is written by Writer. -+ } -+ -+ void writeStreamEnd() throws IOException { -+ flushStream(); -+ } -+ -+ void writeIndicator(String indicator, boolean needWhitespace, boolean whitespace, -+ boolean indentation) throws IOException { -+ if (!this.whitespace && needWhitespace) { -+ this.column++; -+ stream.write(SPACE); -+ } -+ this.whitespace = whitespace; -+ this.indention = this.indention && indentation; -+ this.column += indicator.length(); -+ openEnded = false; -+ stream.write(indicator); -+ } -+ -+ void writeIndent() throws IOException { -+ int indent; -+ if (this.indent != null) { -+ indent = this.indent; -+ } else { -+ indent = 0; -+ } -+ -+ if (!this.indention || this.column > indent || (this.column == indent && !this.whitespace)) { -+ writeLineBreak(null); -+ } -+ -+ writeWhitespace(indent - this.column); -+ } -+ -+ private void writeWhitespace(int length) throws IOException { -+ if (length <= 0) { -+ return; -+ } -+ this.whitespace = true; -+ char[] data = new char[length]; -+ for (int i = 0; i < data.length; i++) { -+ data[i] = ' '; -+ } -+ this.column += length; -+ stream.write(data); -+ } -+ -+ private void writeLineBreak(String data) throws IOException { -+ this.whitespace = true; -+ this.indention = true; -+ this.column = 0; -+ if (data == null) { -+ stream.write(this.bestLineBreak); -+ } else { -+ stream.write(data); -+ } -+ } -+ -+ void writeVersionDirective(String versionText) throws IOException { -+ stream.write("%YAML "); -+ stream.write(versionText); -+ writeLineBreak(null); -+ } -+ -+ void writeTagDirective(String handleText, String prefixText) throws IOException { -+ // XXX: not sure 4 invocations better then StringBuilders created by str -+ // + str -+ stream.write("%TAG "); -+ stream.write(handleText); -+ stream.write(SPACE); -+ stream.write(prefixText); -+ writeLineBreak(null); -+ } -+ -+ // Scalar streams. -+ private void writeSingleQuoted(String text, boolean split) throws IOException { -+ writeIndicator("'", true, false, false); -+ boolean spaces = false; -+ boolean breaks = false; -+ int start = 0, end = 0; -+ char ch; -+ while (end <= text.length()) { -+ ch = 0; -+ if (end < text.length()) { -+ ch = text.charAt(end); -+ } -+ if (spaces) { -+ if (ch == 0 || ch != ' ') { -+ if (start + 1 == end && this.column > this.bestWidth && split && start != 0 -+ && end != text.length()) { -+ writeIndent(); -+ } else { -+ int len = end - start; -+ this.column += len; -+ stream.write(text, start, len); -+ } -+ start = end; -+ } -+ } else if (breaks) { -+ if (ch == 0 || Constant.LINEBR.hasNo(ch)) { -+ if (text.charAt(start) == '\n') { -+ writeLineBreak(null); -+ } -+ String data = text.substring(start, end); -+ for (char br : data.toCharArray()) { -+ if (br == '\n') { -+ writeLineBreak(null); -+ } else { -+ writeLineBreak(String.valueOf(br)); -+ } -+ } -+ writeIndent(); -+ start = end; -+ } -+ } else { -+ if (Constant.LINEBR.has(ch, "\0 '")) { -+ if (start < end) { -+ int len = end - start; -+ this.column += len; -+ stream.write(text, start, len); -+ start = end; -+ } -+ } -+ } -+ if (ch == '\'') { -+ this.column += 2; -+ stream.write("''"); -+ start = end + 1; -+ } -+ if (ch != 0) { -+ spaces = ch == ' '; -+ breaks = Constant.LINEBR.has(ch); -+ } -+ end++; -+ } -+ writeIndicator("'", false, false, false); -+ } -+ -+ private void writeDoubleQuoted(String text, boolean split) throws IOException { -+ writeIndicator("\"", true, false, false); -+ int start = 0; -+ int end = 0; -+ while (end <= text.length()) { -+ Character ch = null; -+ if (end < text.length()) { -+ ch = text.charAt(end); -+ } -+ if (ch == null || "\"\\\u0085\u2028\u2029\uFEFF".indexOf(ch) != -1 -+ || !('\u0020' <= ch && ch <= '\u007E')) { -+ if (start < end) { -+ int len = end - start; -+ this.column += len; -+ stream.write(text, start, len); -+ start = end; -+ } -+ if (ch != null) { -+ String data; -+ if (ESCAPE_REPLACEMENTS.containsKey(ch)) { -+ data = "\\" + ESCAPE_REPLACEMENTS.get(ch); -+ } else if (!this.allowUnicode || !StreamReader.isPrintable(ch)) { -+ // if !allowUnicode or the character is not printable, -+ // we must encode it -+ if (ch <= '\u00FF') { -+ String s = "0" + Integer.toString(ch, 16); -+ data = "\\x" + s.substring(s.length() - 2); -+ } else if (ch >= '\uD800' && ch <= '\uDBFF') { -+ if (end + 1 < text.length()) { -+ Character ch2 = text.charAt(++end); -+ String s = "000" + Long.toHexString(Character.toCodePoint(ch, ch2)); -+ data = "\\U" + s.substring(s.length() - 8); -+ } else { -+ String s = "000" + Integer.toString(ch, 16); -+ data = "\\u" + s.substring(s.length() - 4); -+ } -+ } else { -+ String s = "000" + Integer.toString(ch, 16); -+ data = "\\u" + s.substring(s.length() - 4); -+ } -+ } else { -+ data = String.valueOf(ch); -+ } -+ this.column += data.length(); -+ stream.write(data); -+ start = end + 1; -+ } -+ } -+ if ((0 < end && end < (text.length() - 1)) && (ch == ' ' || start >= end) -+ && (this.column + (end - start)) > this.bestWidth && split) { -+ String data; -+ if (start >= end) { -+ data = "\\"; -+ } else { -+ data = text.substring(start, end) + "\\"; -+ } -+ if (start < end) { -+ start = end; -+ } -+ this.column += data.length(); -+ stream.write(data); -+ writeIndent(); -+ this.whitespace = false; -+ this.indention = false; -+ if (text.charAt(start) == ' ') { -+ data = "\\"; -+ this.column += data.length(); -+ stream.write(data); -+ } -+ } -+ end += 1; -+ } -+ writeIndicator("\"", false, false, false); -+ } -+ -+ private boolean writeCommentLines(List commentLines) throws IOException { -+ boolean wroteComment = false; -+ if(emitComments) { -+ int indentColumns = 0; -+ boolean firstComment = true; -+ for (CommentLine commentLine : commentLines) { -+ if (commentLine.getCommentType() != CommentType.BLANK_LINE) { -+ if (firstComment) { -+ firstComment = false; -+ writeIndicator("#", commentLine.getCommentType() == CommentType.IN_LINE, false, false); -+ indentColumns = this.column > 0 ? this.column - 1 : 0; -+ } else { -+ writeWhitespace(indentColumns); -+ writeIndicator("#", false, false, false); -+ } -+ stream.write(commentLine.getValue()); -+ writeLineBreak(null); -+ } else { -+ writeLineBreak(null); -+ writeIndent(); -+ } -+ wroteComment = true; -+ } -+ } -+ return wroteComment; -+ } -+ -+ private void writeBlockComment() throws IOException { -+ if(!blockCommentsCollector.isEmpty()) { -+ writeIndent(); -+ writeCommentLines(blockCommentsCollector.consume()); -+ } -+ } -+ -+ private boolean writeInlineComments() throws IOException { -+ return writeCommentLines(inlineCommentsCollector.consume()); -+ } -+ -+ private String determineBlockHints(String text) { -+ StringBuilder hints = new StringBuilder(); -+ if (Constant.LINEBR.has(text.charAt(0), " ")) { -+ hints.append(bestIndent); -+ } -+ char ch1 = text.charAt(text.length() - 1); -+ if (Constant.LINEBR.hasNo(ch1)) { -+ hints.append("-"); -+ } else if (text.length() == 1 || Constant.LINEBR.has(text.charAt(text.length() - 2))) { -+ hints.append("+"); -+ } -+ return hints.toString(); -+ } -+ -+ void writeFolded(String text, boolean split) throws IOException { -+ String hints = determineBlockHints(text); -+ writeIndicator(">" + hints, true, false, false); -+ if (hints.length() > 0 && (hints.charAt(hints.length() - 1) == '+')) { -+ openEnded = true; -+ } -+ if(!writeInlineComments()) { -+ writeLineBreak(null); -+ } -+ boolean leadingSpace = true; -+ boolean spaces = false; -+ boolean breaks = true; -+ int start = 0, end = 0; -+ while (end <= text.length()) { -+ char ch = 0; -+ if (end < text.length()) { -+ ch = text.charAt(end); -+ } -+ if (breaks) { -+ if (ch == 0 || Constant.LINEBR.hasNo(ch)) { -+ if (!leadingSpace && ch != 0 && ch != ' ' && text.charAt(start) == '\n') { -+ writeLineBreak(null); -+ } -+ leadingSpace = ch == ' '; -+ String data = text.substring(start, end); -+ for (char br : data.toCharArray()) { -+ if (br == '\n') { -+ writeLineBreak(null); -+ } else { -+ writeLineBreak(String.valueOf(br)); -+ } -+ } -+ if (ch != 0) { -+ writeIndent(); -+ } -+ start = end; -+ } -+ } else if (spaces) { -+ if (ch != ' ') { -+ if (start + 1 == end && this.column > this.bestWidth && split) { -+ writeIndent(); -+ } else { -+ int len = end - start; -+ this.column += len; -+ stream.write(text, start, len); -+ } -+ start = end; -+ } -+ } else { -+ if (Constant.LINEBR.has(ch, "\0 ")) { -+ int len = end - start; -+ this.column += len; -+ stream.write(text, start, len); -+ if (ch == 0) { -+ writeLineBreak(null); -+ } -+ start = end; -+ } -+ } -+ if (ch != 0) { -+ breaks = Constant.LINEBR.has(ch); -+ spaces = ch == ' '; -+ } -+ end++; -+ } -+ } -+ -+ void writeLiteral(String text) throws IOException { -+ String hints = determineBlockHints(text); -+ writeIndicator("|" + hints, true, false, false); -+ if (hints.length() > 0 && (hints.charAt(hints.length() - 1)) == '+') { -+ openEnded = true; -+ } -+ if(!writeInlineComments()) { -+ writeLineBreak(null); -+ } -+ boolean breaks = true; -+ int start = 0, end = 0; -+ while (end <= text.length()) { -+ char ch = 0; -+ if (end < text.length()) { -+ ch = text.charAt(end); -+ } -+ if (breaks) { -+ if (ch == 0 || Constant.LINEBR.hasNo(ch)) { -+ String data = text.substring(start, end); -+ for (char br : data.toCharArray()) { -+ if (br == '\n') { -+ writeLineBreak(null); -+ } else { -+ writeLineBreak(String.valueOf(br)); -+ } -+ } -+ if (ch != 0) { -+ writeIndent(); -+ } -+ start = end; -+ } -+ } else { -+ if (ch == 0 || Constant.LINEBR.has(ch)) { -+ stream.write(text, start, end - start); -+ if (ch == 0) { -+ writeLineBreak(null); -+ } -+ start = end; -+ } -+ } -+ if (ch != 0) { -+ breaks = Constant.LINEBR.has(ch); -+ } -+ end++; -+ } -+ } -+ -+ void writePlain(String text, boolean split) throws IOException { -+ if (rootContext) { -+ openEnded = true; -+ } -+ if (text.length() == 0) { -+ return; -+ } -+ if (!this.whitespace) { -+ this.column++; -+ stream.write(SPACE); -+ } -+ this.whitespace = false; -+ this.indention = false; -+ boolean spaces = false; -+ boolean breaks = false; -+ int start = 0, end = 0; -+ while (end <= text.length()) { -+ char ch = 0; -+ if (end < text.length()) { -+ ch = text.charAt(end); -+ } -+ if (spaces) { -+ if (ch != ' ') { -+ if (start + 1 == end && this.column > this.bestWidth && split) { -+ writeIndent(); -+ this.whitespace = false; -+ this.indention = false; -+ } else { -+ int len = end - start; -+ this.column += len; -+ stream.write(text, start, len); -+ } -+ start = end; -+ } -+ } else if (breaks) { -+ if (Constant.LINEBR.hasNo(ch)) { -+ if (text.charAt(start) == '\n') { -+ writeLineBreak(null); -+ } -+ String data = text.substring(start, end); -+ for (char br : data.toCharArray()) { -+ if (br == '\n') { -+ writeLineBreak(null); -+ } else { -+ writeLineBreak(String.valueOf(br)); -+ } -+ } -+ writeIndent(); -+ this.whitespace = false; -+ this.indention = false; -+ start = end; -+ } -+ } else { -+ if (Constant.LINEBR.has(ch, "\0 ")) { -+ int len = end - start; -+ this.column += len; -+ stream.write(text, start, len); -+ start = end; -+ } -+ } -+ if (ch != 0) { -+ spaces = ch == ' '; -+ breaks = Constant.LINEBR.has(ch); -+ } -+ end++; -+ } -+ } -+} diff --git a/patches/server/0793-Make-water-animal-spawn-height-configurable.patch b/patches/server/0792-Make-water-animal-spawn-height-configurable.patch similarity index 100% rename from patches/server/0793-Make-water-animal-spawn-height-configurable.patch rename to patches/server/0792-Make-water-animal-spawn-height-configurable.patch diff --git a/patches/server/0794-Expose-vanilla-BiomeProvider-from-WorldInfo.patch b/patches/server/0793-Expose-vanilla-BiomeProvider-from-WorldInfo.patch similarity index 100% rename from patches/server/0794-Expose-vanilla-BiomeProvider-from-WorldInfo.patch rename to patches/server/0793-Expose-vanilla-BiomeProvider-from-WorldInfo.patch diff --git a/patches/server/0795-Add-config-option-for-worlds-affected-by-time-cmd.patch b/patches/server/0794-Add-config-option-for-worlds-affected-by-time-cmd.patch similarity index 100% rename from patches/server/0795-Add-config-option-for-worlds-affected-by-time-cmd.patch rename to patches/server/0794-Add-config-option-for-worlds-affected-by-time-cmd.patch diff --git a/patches/server/0796-Add-new-overload-to-PersistentDataContainer-has.patch b/patches/server/0795-Add-new-overload-to-PersistentDataContainer-has.patch similarity index 100% rename from patches/server/0796-Add-new-overload-to-PersistentDataContainer-has.patch rename to patches/server/0795-Add-new-overload-to-PersistentDataContainer-has.patch diff --git a/patches/server/0797-Multiple-Entries-with-Scoreboards.patch b/patches/server/0796-Multiple-Entries-with-Scoreboards.patch similarity index 100% rename from patches/server/0797-Multiple-Entries-with-Scoreboards.patch rename to patches/server/0796-Multiple-Entries-with-Scoreboards.patch diff --git a/patches/server/0798-Reset-placed-block-on-exception.patch b/patches/server/0797-Reset-placed-block-on-exception.patch similarity index 100% rename from patches/server/0798-Reset-placed-block-on-exception.patch rename to patches/server/0797-Reset-placed-block-on-exception.patch diff --git a/patches/server/0799-Add-configurable-height-for-slime-spawn.patch b/patches/server/0798-Add-configurable-height-for-slime-spawn.patch similarity index 100% rename from patches/server/0799-Add-configurable-height-for-slime-spawn.patch rename to patches/server/0798-Add-configurable-height-for-slime-spawn.patch diff --git a/patches/server/0800-Added-getHostname-to-AsyncPlayerPreLoginEvent.patch b/patches/server/0799-Added-getHostname-to-AsyncPlayerPreLoginEvent.patch similarity index 100% rename from patches/server/0800-Added-getHostname-to-AsyncPlayerPreLoginEvent.patch rename to patches/server/0799-Added-getHostname-to-AsyncPlayerPreLoginEvent.patch diff --git a/patches/server/0801-Fix-xp-reward-for-baby-zombies.patch b/patches/server/0800-Fix-xp-reward-for-baby-zombies.patch similarity index 100% rename from patches/server/0801-Fix-xp-reward-for-baby-zombies.patch rename to patches/server/0800-Fix-xp-reward-for-baby-zombies.patch diff --git a/patches/server/0802-Kick-on-main-for-illegal-chat.patch b/patches/server/0801-Kick-on-main-for-illegal-chat.patch similarity index 100% rename from patches/server/0802-Kick-on-main-for-illegal-chat.patch rename to patches/server/0801-Kick-on-main-for-illegal-chat.patch diff --git a/patches/server/0803-Multi-Block-Change-API-Implementation.patch b/patches/server/0802-Multi-Block-Change-API-Implementation.patch similarity index 100% rename from patches/server/0803-Multi-Block-Change-API-Implementation.patch rename to patches/server/0802-Multi-Block-Change-API-Implementation.patch diff --git a/patches/server/0804-Fix-NotePlayEvent.patch b/patches/server/0803-Fix-NotePlayEvent.patch similarity index 100% rename from patches/server/0804-Fix-NotePlayEvent.patch rename to patches/server/0803-Fix-NotePlayEvent.patch diff --git a/patches/server/0805-Freeze-Tick-Lock-API.patch b/patches/server/0804-Freeze-Tick-Lock-API.patch similarity index 100% rename from patches/server/0805-Freeze-Tick-Lock-API.patch rename to patches/server/0804-Freeze-Tick-Lock-API.patch diff --git a/patches/server/0806-Dolphin-API.patch b/patches/server/0805-Dolphin-API.patch similarity index 100% rename from patches/server/0806-Dolphin-API.patch rename to patches/server/0805-Dolphin-API.patch diff --git a/patches/server/0807-More-PotionEffectType-API.patch b/patches/server/0806-More-PotionEffectType-API.patch similarity index 100% rename from patches/server/0807-More-PotionEffectType-API.patch rename to patches/server/0806-More-PotionEffectType-API.patch diff --git a/patches/server/0808-Use-a-CHM-for-StructureTemplate.Pallete-cache.patch b/patches/server/0807-Use-a-CHM-for-StructureTemplate.Pallete-cache.patch similarity index 100% rename from patches/server/0808-Use-a-CHM-for-StructureTemplate.Pallete-cache.patch rename to patches/server/0807-Use-a-CHM-for-StructureTemplate.Pallete-cache.patch diff --git a/patches/server/0809-API-for-creating-command-sender-which-forwards-feedb.patch b/patches/server/0808-API-for-creating-command-sender-which-forwards-feedb.patch similarity index 100% rename from patches/server/0809-API-for-creating-command-sender-which-forwards-feedb.patch rename to patches/server/0808-API-for-creating-command-sender-which-forwards-feedb.patch diff --git a/patches/server/0810-Add-missing-structure-set-seed-configs.patch b/patches/server/0809-Add-missing-structure-set-seed-configs.patch similarity index 98% rename from patches/server/0810-Add-missing-structure-set-seed-configs.patch rename to patches/server/0809-Add-missing-structure-set-seed-configs.patch index 4053a482eb..3e8dff27d6 100644 --- a/patches/server/0810-Add-missing-structure-set-seed-configs.patch +++ b/patches/server/0809-Add-missing-structure-set-seed-configs.patch @@ -162,10 +162,10 @@ index 2fd1284c7f0d8e2cf35d03072089256d990b06eb..8ef0e9fa126cd96289bab48eaa06c2a1 @Override diff --git a/src/main/java/org/spigotmc/SpigotWorldConfig.java b/src/main/java/org/spigotmc/SpigotWorldConfig.java -index cf96f9fdc4ae561f01d44503b9851c60140e4ea7..46ef3400605cc420bd88f13838df7d1f1106235e 100644 +index 6bcc46795d1f78746192cc107c4a1f61580ec3c5..5503ad6a93d331771a0e92c0da6adedf2ac81aff 100644 --- a/src/main/java/org/spigotmc/SpigotWorldConfig.java +++ b/src/main/java/org/spigotmc/SpigotWorldConfig.java -@@ -366,6 +366,16 @@ public class SpigotWorldConfig +@@ -362,6 +362,16 @@ public class SpigotWorldConfig public int mansionSeed; public int fossilSeed; public int portalSeed; @@ -182,7 +182,7 @@ index cf96f9fdc4ae561f01d44503b9851c60140e4ea7..46ef3400605cc420bd88f13838df7d1f private void initWorldGenSeeds() { this.villageSeed = this.getInt( "seed-village", 10387312 ); -@@ -383,6 +393,12 @@ public class SpigotWorldConfig +@@ -379,6 +389,12 @@ public class SpigotWorldConfig this.mansionSeed = this.getInt( "seed-mansion", 10387319 ); this.fossilSeed = this.getInt( "seed-fossil", 14357921 ); this.portalSeed = this.getInt( "seed-portal", 34222645 ); diff --git a/patches/server/0811-Implement-regenerateChunk.patch b/patches/server/0810-Implement-regenerateChunk.patch similarity index 100% rename from patches/server/0811-Implement-regenerateChunk.patch rename to patches/server/0810-Implement-regenerateChunk.patch diff --git a/patches/server/0812-Fix-cancelled-powdered-snow-bucket-placement.patch b/patches/server/0811-Fix-cancelled-powdered-snow-bucket-placement.patch similarity index 100% rename from patches/server/0812-Fix-cancelled-powdered-snow-bucket-placement.patch rename to patches/server/0811-Fix-cancelled-powdered-snow-bucket-placement.patch diff --git a/patches/server/0813-Add-missing-Validate-calls-to-CraftServer-getSpawnLi.patch b/patches/server/0812-Add-missing-Validate-calls-to-CraftServer-getSpawnLi.patch similarity index 100% rename from patches/server/0813-Add-missing-Validate-calls-to-CraftServer-getSpawnLi.patch rename to patches/server/0812-Add-missing-Validate-calls-to-CraftServer-getSpawnLi.patch diff --git a/patches/server/0814-Add-GameEvent-tags.patch b/patches/server/0813-Add-GameEvent-tags.patch similarity index 100% rename from patches/server/0814-Add-GameEvent-tags.patch rename to patches/server/0813-Add-GameEvent-tags.patch diff --git a/patches/server/0815-Execute-chunk-tasks-fairly-for-worlds-while-waiting-.patch b/patches/server/0814-Execute-chunk-tasks-fairly-for-worlds-while-waiting-.patch similarity index 100% rename from patches/server/0815-Execute-chunk-tasks-fairly-for-worlds-while-waiting-.patch rename to patches/server/0814-Execute-chunk-tasks-fairly-for-worlds-while-waiting-.patch diff --git a/patches/server/0816-Furnace-RecipesUsed-API.patch b/patches/server/0815-Furnace-RecipesUsed-API.patch similarity index 100% rename from patches/server/0816-Furnace-RecipesUsed-API.patch rename to patches/server/0815-Furnace-RecipesUsed-API.patch diff --git a/patches/server/0817-Configurable-sculk-sensor-listener-range.patch b/patches/server/0816-Configurable-sculk-sensor-listener-range.patch similarity index 100% rename from patches/server/0817-Configurable-sculk-sensor-listener-range.patch rename to patches/server/0816-Configurable-sculk-sensor-listener-range.patch diff --git a/patches/server/0818-Add-missing-block-data-mins-and-maxes.patch b/patches/server/0817-Add-missing-block-data-mins-and-maxes.patch similarity index 100% rename from patches/server/0818-Add-missing-block-data-mins-and-maxes.patch rename to patches/server/0817-Add-missing-block-data-mins-and-maxes.patch diff --git a/patches/server/0819-Option-to-have-default-CustomSpawners-in-custom-worl.patch b/patches/server/0818-Option-to-have-default-CustomSpawners-in-custom-worl.patch similarity index 100% rename from patches/server/0819-Option-to-have-default-CustomSpawners-in-custom-worl.patch rename to patches/server/0818-Option-to-have-default-CustomSpawners-in-custom-worl.patch diff --git a/patches/server/0820-Put-world-into-worldlist-before-initing-the-world.patch b/patches/server/0819-Put-world-into-worldlist-before-initing-the-world.patch similarity index 100% rename from patches/server/0820-Put-world-into-worldlist-before-initing-the-world.patch rename to patches/server/0819-Put-world-into-worldlist-before-initing-the-world.patch diff --git a/patches/server/0821-Fix-Entity-Position-Desync.patch b/patches/server/0820-Fix-Entity-Position-Desync.patch similarity index 100% rename from patches/server/0821-Fix-Entity-Position-Desync.patch rename to patches/server/0820-Fix-Entity-Position-Desync.patch diff --git a/patches/server/0822-Custom-Potion-Mixes.patch b/patches/server/0821-Custom-Potion-Mixes.patch similarity index 100% rename from patches/server/0822-Custom-Potion-Mixes.patch rename to patches/server/0821-Custom-Potion-Mixes.patch diff --git a/patches/server/0823-Fix-Fluid-tags-isTagged-method.patch b/patches/server/0822-Fix-Fluid-tags-isTagged-method.patch similarity index 100% rename from patches/server/0823-Fix-Fluid-tags-isTagged-method.patch rename to patches/server/0822-Fix-Fluid-tags-isTagged-method.patch diff --git a/patches/server/0824-Force-close-world-loading-screen.patch b/patches/server/0823-Force-close-world-loading-screen.patch similarity index 100% rename from patches/server/0824-Force-close-world-loading-screen.patch rename to patches/server/0823-Force-close-world-loading-screen.patch diff --git a/patches/server/0825-Fix-falling-block-spawn-methods.patch b/patches/server/0824-Fix-falling-block-spawn-methods.patch similarity index 100% rename from patches/server/0825-Fix-falling-block-spawn-methods.patch rename to patches/server/0824-Fix-falling-block-spawn-methods.patch diff --git a/patches/server/0826-Expose-furnace-minecart-push-values.patch b/patches/server/0825-Expose-furnace-minecart-push-values.patch similarity index 100% rename from patches/server/0826-Expose-furnace-minecart-push-values.patch rename to patches/server/0825-Expose-furnace-minecart-push-values.patch diff --git a/patches/server/0827-Fix-cancelling-ProjectileHitEvent-for-piercing-arrow.patch b/patches/server/0826-Fix-cancelling-ProjectileHitEvent-for-piercing-arrow.patch similarity index 100% rename from patches/server/0827-Fix-cancelling-ProjectileHitEvent-for-piercing-arrow.patch rename to patches/server/0826-Fix-cancelling-ProjectileHitEvent-for-piercing-arrow.patch diff --git a/patches/server/0828-More-Projectile-API.patch b/patches/server/0827-More-Projectile-API.patch similarity index 100% rename from patches/server/0828-More-Projectile-API.patch rename to patches/server/0827-More-Projectile-API.patch diff --git a/patches/server/0829-Fix-swamp-hut-cat-generation-deadlock.patch b/patches/server/0828-Fix-swamp-hut-cat-generation-deadlock.patch similarity index 100% rename from patches/server/0829-Fix-swamp-hut-cat-generation-deadlock.patch rename to patches/server/0828-Fix-swamp-hut-cat-generation-deadlock.patch diff --git a/patches/server/0830-Don-t-allow-vehicle-movement-from-players-while-tele.patch b/patches/server/0829-Don-t-allow-vehicle-movement-from-players-while-tele.patch similarity index 100% rename from patches/server/0830-Don-t-allow-vehicle-movement-from-players-while-tele.patch rename to patches/server/0829-Don-t-allow-vehicle-movement-from-players-while-tele.patch diff --git a/patches/server/0831-Implement-getComputedBiome-API.patch b/patches/server/0830-Implement-getComputedBiome-API.patch similarity index 100% rename from patches/server/0831-Implement-getComputedBiome-API.patch rename to patches/server/0830-Implement-getComputedBiome-API.patch diff --git a/patches/server/0832-Make-some-itemstacks-nonnull.patch b/patches/server/0831-Make-some-itemstacks-nonnull.patch similarity index 100% rename from patches/server/0832-Make-some-itemstacks-nonnull.patch rename to patches/server/0831-Make-some-itemstacks-nonnull.patch diff --git a/patches/server/0833-Add-debug-for-invalid-GameProfiles-on-skull-blocks-i.patch b/patches/server/0832-Add-debug-for-invalid-GameProfiles-on-skull-blocks-i.patch similarity index 100% rename from patches/server/0833-Add-debug-for-invalid-GameProfiles-on-skull-blocks-i.patch rename to patches/server/0832-Add-debug-for-invalid-GameProfiles-on-skull-blocks-i.patch diff --git a/patches/server/0834-Implement-enchantWithLevels-API.patch b/patches/server/0833-Implement-enchantWithLevels-API.patch similarity index 100% rename from patches/server/0834-Implement-enchantWithLevels-API.patch rename to patches/server/0833-Implement-enchantWithLevels-API.patch diff --git a/patches/server/0835-Fix-saving-in-unloadWorld.patch b/patches/server/0834-Fix-saving-in-unloadWorld.patch similarity index 100% rename from patches/server/0835-Fix-saving-in-unloadWorld.patch rename to patches/server/0834-Fix-saving-in-unloadWorld.patch diff --git a/patches/server/0836-Buffer-OOB-setBlock-calls.patch b/patches/server/0835-Buffer-OOB-setBlock-calls.patch similarity index 100% rename from patches/server/0836-Buffer-OOB-setBlock-calls.patch rename to patches/server/0835-Buffer-OOB-setBlock-calls.patch diff --git a/patches/server/0837-Add-TameableDeathMessageEvent.patch b/patches/server/0836-Add-TameableDeathMessageEvent.patch similarity index 100% rename from patches/server/0837-Add-TameableDeathMessageEvent.patch rename to patches/server/0836-Add-TameableDeathMessageEvent.patch diff --git a/patches/server/0838-Fix-new-block-data-for-EntityChangeBlockEvent-when-s.patch b/patches/server/0837-Fix-new-block-data-for-EntityChangeBlockEvent-when-s.patch similarity index 100% rename from patches/server/0838-Fix-new-block-data-for-EntityChangeBlockEvent-when-s.patch rename to patches/server/0837-Fix-new-block-data-for-EntityChangeBlockEvent-when-s.patch diff --git a/patches/server/0839-fix-player-loottables-running-when-mob-loot-gamerule.patch b/patches/server/0838-fix-player-loottables-running-when-mob-loot-gamerule.patch similarity index 100% rename from patches/server/0839-fix-player-loottables-running-when-mob-loot-gamerule.patch rename to patches/server/0838-fix-player-loottables-running-when-mob-loot-gamerule.patch diff --git a/patches/server/0840-Ensure-entity-passenger-world-matches-ridden-entity.patch b/patches/server/0839-Ensure-entity-passenger-world-matches-ridden-entity.patch similarity index 100% rename from patches/server/0840-Ensure-entity-passenger-world-matches-ridden-entity.patch rename to patches/server/0839-Ensure-entity-passenger-world-matches-ridden-entity.patch diff --git a/patches/server/0841-Guard-against-invalid-entity-positions.patch b/patches/server/0840-Guard-against-invalid-entity-positions.patch similarity index 100% rename from patches/server/0841-Guard-against-invalid-entity-positions.patch rename to patches/server/0840-Guard-against-invalid-entity-positions.patch diff --git a/patches/server/0842-cache-resource-keys.patch b/patches/server/0841-cache-resource-keys.patch similarity index 100% rename from patches/server/0842-cache-resource-keys.patch rename to patches/server/0841-cache-resource-keys.patch diff --git a/patches/server/0843-Allow-to-change-the-podium-for-the-EnderDragon.patch b/patches/server/0842-Allow-to-change-the-podium-for-the-EnderDragon.patch similarity index 100% rename from patches/server/0843-Allow-to-change-the-podium-for-the-EnderDragon.patch rename to patches/server/0842-Allow-to-change-the-podium-for-the-EnderDragon.patch diff --git a/patches/server/0844-Fix-NBT-pieces-overriding-a-block-entity-during-worl.patch b/patches/server/0843-Fix-NBT-pieces-overriding-a-block-entity-during-worl.patch similarity index 100% rename from patches/server/0844-Fix-NBT-pieces-overriding-a-block-entity-during-worl.patch rename to patches/server/0843-Fix-NBT-pieces-overriding-a-block-entity-during-worl.patch diff --git a/patches/server/0845-Fix-StructureGrowEvent-species-for-RED_MUSHROOM.patch b/patches/server/0844-Fix-StructureGrowEvent-species-for-RED_MUSHROOM.patch similarity index 100% rename from patches/server/0845-Fix-StructureGrowEvent-species-for-RED_MUSHROOM.patch rename to patches/server/0844-Fix-StructureGrowEvent-species-for-RED_MUSHROOM.patch diff --git a/patches/server/0846-Prevent-tile-entity-copies-loading-chunks.patch b/patches/server/0845-Prevent-tile-entity-copies-loading-chunks.patch similarity index 100% rename from patches/server/0846-Prevent-tile-entity-copies-loading-chunks.patch rename to patches/server/0845-Prevent-tile-entity-copies-loading-chunks.patch diff --git a/patches/server/0847-Use-username-instead-of-display-name-in-PlayerList-g.patch b/patches/server/0846-Use-username-instead-of-display-name-in-PlayerList-g.patch similarity index 100% rename from patches/server/0847-Use-username-instead-of-display-name-in-PlayerList-g.patch rename to patches/server/0846-Use-username-instead-of-display-name-in-PlayerList-g.patch diff --git a/patches/server/0848-Fix-slime-spawners-not-spawning-outside-slime-chunks.patch b/patches/server/0847-Fix-slime-spawners-not-spawning-outside-slime-chunks.patch similarity index 100% rename from patches/server/0848-Fix-slime-spawners-not-spawning-outside-slime-chunks.patch rename to patches/server/0847-Fix-slime-spawners-not-spawning-outside-slime-chunks.patch diff --git a/patches/server/0849-Pass-ServerLevel-for-gamerule-callbacks.patch b/patches/server/0848-Pass-ServerLevel-for-gamerule-callbacks.patch similarity index 100% rename from patches/server/0849-Pass-ServerLevel-for-gamerule-callbacks.patch rename to patches/server/0848-Pass-ServerLevel-for-gamerule-callbacks.patch diff --git a/patches/server/0850-Add-pre-unbreaking-amount-to-PlayerItemDamageEvent.patch b/patches/server/0849-Add-pre-unbreaking-amount-to-PlayerItemDamageEvent.patch similarity index 100% rename from patches/server/0850-Add-pre-unbreaking-amount-to-PlayerItemDamageEvent.patch rename to patches/server/0849-Add-pre-unbreaking-amount-to-PlayerItemDamageEvent.patch diff --git a/patches/server/0851-WorldCreator-keepSpawnLoaded.patch b/patches/server/0850-WorldCreator-keepSpawnLoaded.patch similarity index 100% rename from patches/server/0851-WorldCreator-keepSpawnLoaded.patch rename to patches/server/0850-WorldCreator-keepSpawnLoaded.patch diff --git a/patches/server/0852-Fix-NPE-for-BlockDataMeta-getBlockData.patch b/patches/server/0851-Fix-NPE-for-BlockDataMeta-getBlockData.patch similarity index 100% rename from patches/server/0852-Fix-NPE-for-BlockDataMeta-getBlockData.patch rename to patches/server/0851-Fix-NPE-for-BlockDataMeta-getBlockData.patch diff --git a/patches/server/0853-Trigger-bee_nest_destroyed-trigger-in-the-correct-pl.patch b/patches/server/0852-Trigger-bee_nest_destroyed-trigger-in-the-correct-pl.patch similarity index 100% rename from patches/server/0853-Trigger-bee_nest_destroyed-trigger-in-the-correct-pl.patch rename to patches/server/0852-Trigger-bee_nest_destroyed-trigger-in-the-correct-pl.patch diff --git a/patches/server/0854-Add-EntityDyeEvent-and-CollarColorable-interface.patch b/patches/server/0853-Add-EntityDyeEvent-and-CollarColorable-interface.patch similarity index 100% rename from patches/server/0854-Add-EntityDyeEvent-and-CollarColorable-interface.patch rename to patches/server/0853-Add-EntityDyeEvent-and-CollarColorable-interface.patch diff --git a/patches/server/0855-Fire-CauldronLevelChange-on-initial-fill.patch b/patches/server/0854-Fire-CauldronLevelChange-on-initial-fill.patch similarity index 100% rename from patches/server/0855-Fire-CauldronLevelChange-on-initial-fill.patch rename to patches/server/0854-Fire-CauldronLevelChange-on-initial-fill.patch diff --git a/patches/server/0856-fix-powder-snow-cauldrons-not-turning-to-water.patch b/patches/server/0855-fix-powder-snow-cauldrons-not-turning-to-water.patch similarity index 100% rename from patches/server/0856-fix-powder-snow-cauldrons-not-turning-to-water.patch rename to patches/server/0855-fix-powder-snow-cauldrons-not-turning-to-water.patch diff --git a/patches/server/0857-Add-PlayerStopUsingItemEvent.patch b/patches/server/0856-Add-PlayerStopUsingItemEvent.patch similarity index 100% rename from patches/server/0857-Add-PlayerStopUsingItemEvent.patch rename to patches/server/0856-Add-PlayerStopUsingItemEvent.patch diff --git a/patches/server/0858-FallingBlock-auto-expire-setting.patch b/patches/server/0857-FallingBlock-auto-expire-setting.patch similarity index 100% rename from patches/server/0858-FallingBlock-auto-expire-setting.patch rename to patches/server/0857-FallingBlock-auto-expire-setting.patch diff --git a/patches/server/0859-Don-t-tick-markers.patch b/patches/server/0858-Don-t-tick-markers.patch similarity index 100% rename from patches/server/0859-Don-t-tick-markers.patch rename to patches/server/0858-Don-t-tick-markers.patch diff --git a/patches/server/0860-Do-not-accept-invalid-client-settings.patch b/patches/server/0859-Do-not-accept-invalid-client-settings.patch similarity index 100% rename from patches/server/0860-Do-not-accept-invalid-client-settings.patch rename to patches/server/0859-Do-not-accept-invalid-client-settings.patch diff --git a/patches/server/0861-Add-support-for-Proxy-Protocol.patch b/patches/server/0860-Add-support-for-Proxy-Protocol.patch similarity index 100% rename from patches/server/0861-Add-support-for-Proxy-Protocol.patch rename to patches/server/0860-Add-support-for-Proxy-Protocol.patch diff --git a/patches/server/0862-Fix-OfflinePlayer-getBedSpawnLocation.patch b/patches/server/0861-Fix-OfflinePlayer-getBedSpawnLocation.patch similarity index 100% rename from patches/server/0862-Fix-OfflinePlayer-getBedSpawnLocation.patch rename to patches/server/0861-Fix-OfflinePlayer-getBedSpawnLocation.patch diff --git a/patches/server/0863-Fix-FurnaceInventory-for-smokers-and-blast-furnaces.patch b/patches/server/0862-Fix-FurnaceInventory-for-smokers-and-blast-furnaces.patch similarity index 100% rename from patches/server/0863-Fix-FurnaceInventory-for-smokers-and-blast-furnaces.patch rename to patches/server/0862-Fix-FurnaceInventory-for-smokers-and-blast-furnaces.patch diff --git a/patches/server/0864-Sanitize-Sent-BlockEntity-NBT.patch b/patches/server/0863-Sanitize-Sent-BlockEntity-NBT.patch similarity index 100% rename from patches/server/0864-Sanitize-Sent-BlockEntity-NBT.patch rename to patches/server/0863-Sanitize-Sent-BlockEntity-NBT.patch diff --git a/patches/server/0865-Prevent-entity-loading-causing-async-lookups.patch b/patches/server/0864-Prevent-entity-loading-causing-async-lookups.patch similarity index 100% rename from patches/server/0865-Prevent-entity-loading-causing-async-lookups.patch rename to patches/server/0864-Prevent-entity-loading-causing-async-lookups.patch diff --git a/patches/server/0866-Disable-component-selector-resolving-in-books-by-def.patch b/patches/server/0865-Disable-component-selector-resolving-in-books-by-def.patch similarity index 100% rename from patches/server/0866-Disable-component-selector-resolving-in-books-by-def.patch rename to patches/server/0865-Disable-component-selector-resolving-in-books-by-def.patch diff --git a/patches/server/0867-Throw-exception-on-world-create-while-being-ticked.patch b/patches/server/0866-Throw-exception-on-world-create-while-being-ticked.patch similarity index 100% rename from patches/server/0867-Throw-exception-on-world-create-while-being-ticked.patch rename to patches/server/0866-Throw-exception-on-world-create-while-being-ticked.patch diff --git a/patches/server/0868-Add-Alternate-Current-redstone-implementation.patch b/patches/server/0867-Add-Alternate-Current-redstone-implementation.patch similarity index 100% rename from patches/server/0868-Add-Alternate-Current-redstone-implementation.patch rename to patches/server/0867-Add-Alternate-Current-redstone-implementation.patch diff --git a/patches/server/0869-Dont-resent-entity-on-art-update.patch b/patches/server/0868-Dont-resent-entity-on-art-update.patch similarity index 100% rename from patches/server/0869-Dont-resent-entity-on-art-update.patch rename to patches/server/0868-Dont-resent-entity-on-art-update.patch diff --git a/patches/server/0870-Add-missing-spawn-eggs.patch b/patches/server/0869-Add-missing-spawn-eggs.patch similarity index 100% rename from patches/server/0870-Add-missing-spawn-eggs.patch rename to patches/server/0869-Add-missing-spawn-eggs.patch diff --git a/patches/server/0871-Add-WardenAngerChangeEvent.patch b/patches/server/0870-Add-WardenAngerChangeEvent.patch similarity index 100% rename from patches/server/0871-Add-WardenAngerChangeEvent.patch rename to patches/server/0870-Add-WardenAngerChangeEvent.patch diff --git a/patches/server/0872-Add-option-for-strict-advancement-dimension-checks.patch b/patches/server/0871-Add-option-for-strict-advancement-dimension-checks.patch similarity index 100% rename from patches/server/0872-Add-option-for-strict-advancement-dimension-checks.patch rename to patches/server/0871-Add-option-for-strict-advancement-dimension-checks.patch diff --git a/patches/server/0873-Add-missing-important-BlockStateListPopulator-method.patch b/patches/server/0872-Add-missing-important-BlockStateListPopulator-method.patch similarity index 100% rename from patches/server/0873-Add-missing-important-BlockStateListPopulator-method.patch rename to patches/server/0872-Add-missing-important-BlockStateListPopulator-method.patch diff --git a/patches/server/0874-Nameable-Banner-API.patch b/patches/server/0873-Nameable-Banner-API.patch similarity index 100% rename from patches/server/0874-Nameable-Banner-API.patch rename to patches/server/0873-Nameable-Banner-API.patch diff --git a/patches/server/0875-Don-t-broadcast-messages-to-command-blocks.patch b/patches/server/0874-Don-t-broadcast-messages-to-command-blocks.patch similarity index 100% rename from patches/server/0875-Don-t-broadcast-messages-to-command-blocks.patch rename to patches/server/0874-Don-t-broadcast-messages-to-command-blocks.patch diff --git a/patches/server/0876-Prevent-empty-items-from-being-added-to-world.patch b/patches/server/0875-Prevent-empty-items-from-being-added-to-world.patch similarity index 100% rename from patches/server/0876-Prevent-empty-items-from-being-added-to-world.patch rename to patches/server/0875-Prevent-empty-items-from-being-added-to-world.patch diff --git a/patches/server/0877-Fix-CCE-for-SplashPotion-and-LingeringPotion-spawnin.patch b/patches/server/0876-Fix-CCE-for-SplashPotion-and-LingeringPotion-spawnin.patch similarity index 100% rename from patches/server/0877-Fix-CCE-for-SplashPotion-and-LingeringPotion-spawnin.patch rename to patches/server/0876-Fix-CCE-for-SplashPotion-and-LingeringPotion-spawnin.patch diff --git a/patches/server/0878-Don-t-print-component-in-resource-pack-rejection-mes.patch b/patches/server/0877-Don-t-print-component-in-resource-pack-rejection-mes.patch similarity index 100% rename from patches/server/0878-Don-t-print-component-in-resource-pack-rejection-mes.patch rename to patches/server/0877-Don-t-print-component-in-resource-pack-rejection-mes.patch diff --git a/patches/server/0879-Add-Player-getFishHook.patch b/patches/server/0878-Add-Player-getFishHook.patch similarity index 100% rename from patches/server/0879-Add-Player-getFishHook.patch rename to patches/server/0878-Add-Player-getFishHook.patch diff --git a/patches/server/0880-Do-not-sync-load-chunk-for-dynamic-game-event-listen.patch b/patches/server/0879-Do-not-sync-load-chunk-for-dynamic-game-event-listen.patch similarity index 100% rename from patches/server/0880-Do-not-sync-load-chunk-for-dynamic-game-event-listen.patch rename to patches/server/0879-Do-not-sync-load-chunk-for-dynamic-game-event-listen.patch diff --git a/patches/server/0881-Add-various-missing-EntityDropItemEvent-calls.patch b/patches/server/0880-Add-various-missing-EntityDropItemEvent-calls.patch similarity index 100% rename from patches/server/0881-Add-various-missing-EntityDropItemEvent-calls.patch rename to patches/server/0880-Add-various-missing-EntityDropItemEvent-calls.patch diff --git a/patches/server/0882-Add-some-minimal-debug-information-to-chat-packet-er.patch b/patches/server/0881-Add-some-minimal-debug-information-to-chat-packet-er.patch similarity index 100% rename from patches/server/0882-Add-some-minimal-debug-information-to-chat-packet-er.patch rename to patches/server/0881-Add-some-minimal-debug-information-to-chat-packet-er.patch diff --git a/patches/server/0883-Fix-Bee-flower-NPE.patch b/patches/server/0882-Fix-Bee-flower-NPE.patch similarity index 100% rename from patches/server/0883-Fix-Bee-flower-NPE.patch rename to patches/server/0882-Fix-Bee-flower-NPE.patch diff --git a/patches/server/0884-Fix-Spigot-Config-not-using-commands.spam-exclusions.patch b/patches/server/0883-Fix-Spigot-Config-not-using-commands.spam-exclusions.patch similarity index 100% rename from patches/server/0884-Fix-Spigot-Config-not-using-commands.spam-exclusions.patch rename to patches/server/0883-Fix-Spigot-Config-not-using-commands.spam-exclusions.patch diff --git a/patches/server/0885-Fixes-and-additions-to-the-SpawnReason-API.patch b/patches/server/0884-Fixes-and-additions-to-the-SpawnReason-API.patch similarity index 100% rename from patches/server/0885-Fixes-and-additions-to-the-SpawnReason-API.patch rename to patches/server/0884-Fixes-and-additions-to-the-SpawnReason-API.patch diff --git a/patches/server/0886-More-Teleport-API.patch b/patches/server/0885-More-Teleport-API.patch similarity index 100% rename from patches/server/0886-More-Teleport-API.patch rename to patches/server/0885-More-Teleport-API.patch diff --git a/patches/server/0887-Add-EntityPortalReadyEvent.patch b/patches/server/0886-Add-EntityPortalReadyEvent.patch similarity index 100% rename from patches/server/0887-Add-EntityPortalReadyEvent.patch rename to patches/server/0886-Add-EntityPortalReadyEvent.patch diff --git a/patches/server/0888-Don-t-use-level-random-in-entity-constructors.patch b/patches/server/0887-Don-t-use-level-random-in-entity-constructors.patch similarity index 100% rename from patches/server/0888-Don-t-use-level-random-in-entity-constructors.patch rename to patches/server/0887-Don-t-use-level-random-in-entity-constructors.patch diff --git a/patches/server/0889-Send-block-entities-after-destroy-prediction.patch b/patches/server/0888-Send-block-entities-after-destroy-prediction.patch similarity index 100% rename from patches/server/0889-Send-block-entities-after-destroy-prediction.patch rename to patches/server/0888-Send-block-entities-after-destroy-prediction.patch diff --git a/patches/server/0890-Warn-on-plugins-accessing-faraway-chunks.patch b/patches/server/0889-Warn-on-plugins-accessing-faraway-chunks.patch similarity index 100% rename from patches/server/0890-Warn-on-plugins-accessing-faraway-chunks.patch rename to patches/server/0889-Warn-on-plugins-accessing-faraway-chunks.patch diff --git a/patches/server/0891-Custom-Chat-Completion-Suggestions-API.patch b/patches/server/0890-Custom-Chat-Completion-Suggestions-API.patch similarity index 100% rename from patches/server/0891-Custom-Chat-Completion-Suggestions-API.patch rename to patches/server/0890-Custom-Chat-Completion-Suggestions-API.patch diff --git a/patches/server/0892-Add-missing-BlockFadeEvents.patch b/patches/server/0891-Add-missing-BlockFadeEvents.patch similarity index 100% rename from patches/server/0892-Add-missing-BlockFadeEvents.patch rename to patches/server/0891-Add-missing-BlockFadeEvents.patch diff --git a/patches/server/0893-Collision-API.patch b/patches/server/0892-Collision-API.patch similarity index 100% rename from patches/server/0893-Collision-API.patch rename to patches/server/0892-Collision-API.patch diff --git a/patches/server/0894-Fix-suggest-command-message-for-brigadier-syntax-exc.patch b/patches/server/0893-Fix-suggest-command-message-for-brigadier-syntax-exc.patch similarity index 100% rename from patches/server/0894-Fix-suggest-command-message-for-brigadier-syntax-exc.patch rename to patches/server/0893-Fix-suggest-command-message-for-brigadier-syntax-exc.patch diff --git a/patches/server/0895-Fix-command-preprocess-cancelling-and-command-changi.patch b/patches/server/0894-Fix-command-preprocess-cancelling-and-command-changi.patch similarity index 100% rename from patches/server/0895-Fix-command-preprocess-cancelling-and-command-changi.patch rename to patches/server/0894-Fix-command-preprocess-cancelling-and-command-changi.patch diff --git a/patches/server/0896-Remove-invalid-signature-login-stacktrace.patch b/patches/server/0895-Remove-invalid-signature-login-stacktrace.patch similarity index 100% rename from patches/server/0896-Remove-invalid-signature-login-stacktrace.patch rename to patches/server/0895-Remove-invalid-signature-login-stacktrace.patch diff --git a/patches/server/0897-Add-async-catcher-to-PlayerConnection-internalTelepo.patch b/patches/server/0896-Add-async-catcher-to-PlayerConnection-internalTelepo.patch similarity index 100% rename from patches/server/0897-Add-async-catcher-to-PlayerConnection-internalTelepo.patch rename to patches/server/0896-Add-async-catcher-to-PlayerConnection-internalTelepo.patch diff --git a/patches/server/0898-Block-Ticking-API.patch b/patches/server/0897-Block-Ticking-API.patch similarity index 100% rename from patches/server/0898-Block-Ticking-API.patch rename to patches/server/0897-Block-Ticking-API.patch diff --git a/patches/server/0899-Add-Velocity-IP-Forwarding-Support.patch b/patches/server/0898-Add-Velocity-IP-Forwarding-Support.patch similarity index 100% rename from patches/server/0899-Add-Velocity-IP-Forwarding-Support.patch rename to patches/server/0898-Add-Velocity-IP-Forwarding-Support.patch diff --git a/patches/server/0900-Use-thread-safe-random-in-ServerLoginPacketListenerI.patch b/patches/server/0899-Use-thread-safe-random-in-ServerLoginPacketListenerI.patch similarity index 100% rename from patches/server/0900-Use-thread-safe-random-in-ServerLoginPacketListenerI.patch rename to patches/server/0899-Use-thread-safe-random-in-ServerLoginPacketListenerI.patch diff --git a/patches/server/0901-Add-NamespacedKey-biome-methods.patch b/patches/server/0900-Add-NamespacedKey-biome-methods.patch similarity index 100% rename from patches/server/0901-Add-NamespacedKey-biome-methods.patch rename to patches/server/0900-Add-NamespacedKey-biome-methods.patch diff --git a/patches/server/0902-Fix-plugin-loggers-on-server-shutdown.patch b/patches/server/0901-Fix-plugin-loggers-on-server-shutdown.patch similarity index 100% rename from patches/server/0902-Fix-plugin-loggers-on-server-shutdown.patch rename to patches/server/0901-Fix-plugin-loggers-on-server-shutdown.patch diff --git a/patches/server/0903-Workaround-for-client-lag-spikes-MC-162253.patch b/patches/server/0902-Workaround-for-client-lag-spikes-MC-162253.patch similarity index 100% rename from patches/server/0903-Workaround-for-client-lag-spikes-MC-162253.patch rename to patches/server/0902-Workaround-for-client-lag-spikes-MC-162253.patch diff --git a/patches/server/0904-Stop-large-look-changes-from-crashing-the-server.patch b/patches/server/0903-Stop-large-look-changes-from-crashing-the-server.patch similarity index 100% rename from patches/server/0904-Stop-large-look-changes-from-crashing-the-server.patch rename to patches/server/0903-Stop-large-look-changes-from-crashing-the-server.patch diff --git a/patches/server/0905-Add-custom-destroyerIdentity-to-sendBlockDamage.patch b/patches/server/0904-Add-custom-destroyerIdentity-to-sendBlockDamage.patch similarity index 100% rename from patches/server/0905-Add-custom-destroyerIdentity-to-sendBlockDamage.patch rename to patches/server/0904-Add-custom-destroyerIdentity-to-sendBlockDamage.patch diff --git a/patches/server/0906-Fix-EndDragonFight-killed-statuses-should-be-false-f.patch b/patches/server/0905-Fix-EndDragonFight-killed-statuses-should-be-false-f.patch similarity index 100% rename from patches/server/0906-Fix-EndDragonFight-killed-statuses-should-be-false-f.patch rename to patches/server/0905-Fix-EndDragonFight-killed-statuses-should-be-false-f.patch diff --git a/patches/server/0907-Fire-EntityChangeBlockEvent-in-more-places.patch b/patches/server/0906-Fire-EntityChangeBlockEvent-in-more-places.patch similarity index 100% rename from patches/server/0907-Fire-EntityChangeBlockEvent-in-more-places.patch rename to patches/server/0906-Fire-EntityChangeBlockEvent-in-more-places.patch diff --git a/patches/server/0908-Missing-eating-regain-reason.patch b/patches/server/0907-Missing-eating-regain-reason.patch similarity index 100% rename from patches/server/0908-Missing-eating-regain-reason.patch rename to patches/server/0907-Missing-eating-regain-reason.patch diff --git a/patches/server/0909-Missing-effect-cause.patch b/patches/server/0908-Missing-effect-cause.patch similarity index 100% rename from patches/server/0909-Missing-effect-cause.patch rename to patches/server/0908-Missing-effect-cause.patch diff --git a/patches/server/0910-Added-byte-array-serialization-deserialization-for-P.patch b/patches/server/0909-Added-byte-array-serialization-deserialization-for-P.patch similarity index 100% rename from patches/server/0910-Added-byte-array-serialization-deserialization-for-P.patch rename to patches/server/0909-Added-byte-array-serialization-deserialization-for-P.patch diff --git a/patches/server/0911-Add-a-consumer-parameter-to-ProjectileSource-launchP.patch b/patches/server/0910-Add-a-consumer-parameter-to-ProjectileSource-launchP.patch similarity index 100% rename from patches/server/0911-Add-a-consumer-parameter-to-ProjectileSource-launchP.patch rename to patches/server/0910-Add-a-consumer-parameter-to-ProjectileSource-launchP.patch diff --git a/patches/server/0912-Call-BlockPhysicsEvent-more-often.patch b/patches/server/0911-Call-BlockPhysicsEvent-more-often.patch similarity index 100% rename from patches/server/0912-Call-BlockPhysicsEvent-more-often.patch rename to patches/server/0911-Call-BlockPhysicsEvent-more-often.patch diff --git a/patches/server/0913-Configurable-chat-thread-limit.patch b/patches/server/0912-Configurable-chat-thread-limit.patch similarity index 100% rename from patches/server/0913-Configurable-chat-thread-limit.patch rename to patches/server/0912-Configurable-chat-thread-limit.patch diff --git a/patches/server/0914-Mitigate-effects-of-WorldCreator-keepSpawnLoaded-ret.patch b/patches/server/0913-Mitigate-effects-of-WorldCreator-keepSpawnLoaded-ret.patch similarity index 100% rename from patches/server/0914-Mitigate-effects-of-WorldCreator-keepSpawnLoaded-ret.patch rename to patches/server/0913-Mitigate-effects-of-WorldCreator-keepSpawnLoaded-ret.patch diff --git a/patches/server/0915-Set-position-before-player-sending-on-dimension-chan.patch b/patches/server/0914-Set-position-before-player-sending-on-dimension-chan.patch similarity index 100% rename from patches/server/0915-Set-position-before-player-sending-on-dimension-chan.patch rename to patches/server/0914-Set-position-before-player-sending-on-dimension-chan.patch diff --git a/patches/server/0916-fix-Jigsaw-block-kicking-user.patch b/patches/server/0915-fix-Jigsaw-block-kicking-user.patch similarity index 100% rename from patches/server/0916-fix-Jigsaw-block-kicking-user.patch rename to patches/server/0915-fix-Jigsaw-block-kicking-user.patch diff --git a/patches/server/0917-use-BlockFormEvent-for-mud-converting-into-clay.patch b/patches/server/0916-use-BlockFormEvent-for-mud-converting-into-clay.patch similarity index 100% rename from patches/server/0917-use-BlockFormEvent-for-mud-converting-into-clay.patch rename to patches/server/0916-use-BlockFormEvent-for-mud-converting-into-clay.patch diff --git a/patches/server/0918-Add-getDrops-to-BlockState-and-isPreferredTool-to-Bl.patch b/patches/server/0917-Add-getDrops-to-BlockState-and-isPreferredTool-to-Bl.patch similarity index 100% rename from patches/server/0918-Add-getDrops-to-BlockState-and-isPreferredTool-to-Bl.patch rename to patches/server/0917-Add-getDrops-to-BlockState-and-isPreferredTool-to-Bl.patch diff --git a/patches/server/0919-Fix-a-bunch-of-vanilla-bugs.patch b/patches/server/0918-Fix-a-bunch-of-vanilla-bugs.patch similarity index 100% rename from patches/server/0919-Fix-a-bunch-of-vanilla-bugs.patch rename to patches/server/0918-Fix-a-bunch-of-vanilla-bugs.patch diff --git a/patches/server/0920-Fix-nothing-mlg.patch b/patches/server/0919-Fix-nothing-mlg.patch similarity index 100% rename from patches/server/0920-Fix-nothing-mlg.patch rename to patches/server/0919-Fix-nothing-mlg.patch diff --git a/patches/server/0921-Remove-unnecessary-onTrackingStart-during-navigation.patch b/patches/server/0920-Remove-unnecessary-onTrackingStart-during-navigation.patch similarity index 100% rename from patches/server/0921-Remove-unnecessary-onTrackingStart-during-navigation.patch rename to patches/server/0920-Remove-unnecessary-onTrackingStart-during-navigation.patch diff --git a/patches/server/0922-Fix-custom-piglin-loved-items.patch b/patches/server/0921-Fix-custom-piglin-loved-items.patch similarity index 100% rename from patches/server/0922-Fix-custom-piglin-loved-items.patch rename to patches/server/0921-Fix-custom-piglin-loved-items.patch diff --git a/patches/server/0923-EntityPickupItemEvent-fixes.patch b/patches/server/0922-EntityPickupItemEvent-fixes.patch similarity index 100% rename from patches/server/0923-EntityPickupItemEvent-fixes.patch rename to patches/server/0922-EntityPickupItemEvent-fixes.patch diff --git a/patches/server/0924-Correctly-handle-interactions-with-items-on-cooldown.patch b/patches/server/0923-Correctly-handle-interactions-with-items-on-cooldown.patch similarity index 100% rename from patches/server/0924-Correctly-handle-interactions-with-items-on-cooldown.patch rename to patches/server/0923-Correctly-handle-interactions-with-items-on-cooldown.patch diff --git a/patches/server/0925-Add-PlayerInventorySlotChangeEvent.patch b/patches/server/0924-Add-PlayerInventorySlotChangeEvent.patch similarity index 100% rename from patches/server/0925-Add-PlayerInventorySlotChangeEvent.patch rename to patches/server/0924-Add-PlayerInventorySlotChangeEvent.patch diff --git a/patches/server/0926-Elder-Guardian-appearance-API.patch b/patches/server/0925-Elder-Guardian-appearance-API.patch similarity index 100% rename from patches/server/0926-Elder-Guardian-appearance-API.patch rename to patches/server/0925-Elder-Guardian-appearance-API.patch diff --git a/patches/server/0927-Allow-changing-bed-s-occupied-property.patch b/patches/server/0926-Allow-changing-bed-s-occupied-property.patch similarity index 100% rename from patches/server/0927-Allow-changing-bed-s-occupied-property.patch rename to patches/server/0926-Allow-changing-bed-s-occupied-property.patch diff --git a/patches/server/0928-Add-entity-knockback-API.patch b/patches/server/0927-Add-entity-knockback-API.patch similarity index 100% rename from patches/server/0928-Add-entity-knockback-API.patch rename to patches/server/0927-Add-entity-knockback-API.patch diff --git a/patches/server/0929-Detect-headless-JREs.patch b/patches/server/0928-Detect-headless-JREs.patch similarity index 100% rename from patches/server/0929-Detect-headless-JREs.patch rename to patches/server/0928-Detect-headless-JREs.patch diff --git a/patches/server/0930-fixed-entity-vehicle-collision-event-not-called.patch b/patches/server/0929-fixed-entity-vehicle-collision-event-not-called.patch similarity index 100% rename from patches/server/0930-fixed-entity-vehicle-collision-event-not-called.patch rename to patches/server/0929-fixed-entity-vehicle-collision-event-not-called.patch diff --git a/patches/server/0931-optimized-dirt-and-snow-spreading.patch b/patches/server/0930-optimized-dirt-and-snow-spreading.patch similarity index 100% rename from patches/server/0931-optimized-dirt-and-snow-spreading.patch rename to patches/server/0930-optimized-dirt-and-snow-spreading.patch diff --git a/patches/server/0932-Added-EntityToggleSitEvent.patch b/patches/server/0931-Added-EntityToggleSitEvent.patch similarity index 100% rename from patches/server/0932-Added-EntityToggleSitEvent.patch rename to patches/server/0931-Added-EntityToggleSitEvent.patch diff --git a/patches/server/0933-Add-fire-tick-delay-option.patch b/patches/server/0932-Add-fire-tick-delay-option.patch similarity index 100% rename from patches/server/0933-Add-fire-tick-delay-option.patch rename to patches/server/0932-Add-fire-tick-delay-option.patch diff --git a/patches/server/0934-Add-Moving-Piston-API.patch b/patches/server/0933-Add-Moving-Piston-API.patch similarity index 100% rename from patches/server/0934-Add-Moving-Piston-API.patch rename to patches/server/0933-Add-Moving-Piston-API.patch diff --git a/patches/server/0935-Ignore-impossible-spawn-tick.patch b/patches/server/0934-Ignore-impossible-spawn-tick.patch similarity index 100% rename from patches/server/0935-Ignore-impossible-spawn-tick.patch rename to patches/server/0934-Ignore-impossible-spawn-tick.patch diff --git a/work/Bukkit b/work/Bukkit index 0994345029..006049902d 160000 --- a/work/Bukkit +++ b/work/Bukkit @@ -1 +1 @@ -Subproject commit 0994345029c4d127696616de3bab3e8044b03749 +Subproject commit 006049902d41e91d01844126dd968ca92fb99c8a diff --git a/work/Spigot b/work/Spigot index 4aa5ead237..89741d3e9f 160000 --- a/work/Spigot +++ b/work/Spigot @@ -1 +1 @@ -Subproject commit 4aa5ead2377692b934a84b6853d188e2d9cbd53a +Subproject commit 89741d3e9ff89cb2aa3b2e34a714a3a073b60d95