diff --git a/.github/workflows/pull_request.yml b/.github/workflows/pull_request.yml
index c25a16f6f2..680537ef9f 100644
--- a/.github/workflows/pull_request.yml
+++ b/.github/workflows/pull_request.yml
@@ -5,6 +5,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
+ - uses: gradle/wrapper-validation-action@v1
- name: Set up JDK
uses: actions/setup-java@v2
with:
diff --git a/Paper b/Paper
index ef60c01c4d..453c7f05c7 160000
--- a/Paper
+++ b/Paper
@@ -1 +1 @@
-Subproject commit ef60c01c4da777f07b72668a103c95e06730f259
+Subproject commit 453c7f05c7ee48aa2252a1e882fd3422297de26e
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index 442d9132ea..e5338d370b 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -1,5 +1,5 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-6.8.3-bin.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-7.0.1-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
diff --git a/patches/api/0001-Tuinity-API-Changes.patch b/patches/api/0001-Tuinity-API-Changes.patch
index 06755eb1b9..6eaa6ee77d 100644
--- a/patches/api/0001-Tuinity-API-Changes.patch
+++ b/patches/api/0001-Tuinity-API-Changes.patch
@@ -248,10 +248,10 @@ index a1496fe00a2d5ba6c1af054d4327f868b2cd7344..6ca9aa2c438810b5537dc196b3fd89b0
// Spigot start
diff --git a/src/main/java/org/bukkit/entity/Player.java b/src/main/java/org/bukkit/entity/Player.java
-index 2ea531eaef8c455fdd503f0c0258813fe9136085..a84ea92d02d34cd48174152e0391f1af6c6b5def 100644
+index 34b51466ffb281b05f531b3f7deda245ae7fd96a..4a4f041c6acfd335871fa67d6d1c7f723229c8a7 100644
--- a/src/main/java/org/bukkit/entity/Player.java
+++ b/src/main/java/org/bukkit/entity/Player.java
-@@ -1768,23 +1768,63 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
+@@ -1783,23 +1783,63 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
* Gets the view distance for this player
*
* @return the player's view distance
diff --git a/patches/api/0008-AFK-API.patch b/patches/api/0008-AFK-API.patch
index 4bca6d769d..8e684afca1 100644
--- a/patches/api/0008-AFK-API.patch
+++ b/patches/api/0008-AFK-API.patch
@@ -81,10 +81,10 @@ index 0000000000000000000000000000000000000000..0c8b3e5e4ba412624357ea5662a78862
+ }
+}
diff --git a/src/main/java/org/bukkit/entity/Player.java b/src/main/java/org/bukkit/entity/Player.java
-index a84ea92d02d34cd48174152e0391f1af6c6b5def..023ca23e8c91a6525cc31d483d873dfe14e97da3 100644
+index 4a4f041c6acfd335871fa67d6d1c7f723229c8a7..2ab8d8f3439ee2571df5df385f8874909605ff5c 100644
--- a/src/main/java/org/bukkit/entity/Player.java
+++ b/src/main/java/org/bukkit/entity/Player.java
-@@ -2116,4 +2116,25 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
+@@ -2131,4 +2131,25 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
@Override
Spigot spigot();
// Spigot end
diff --git a/patches/api/0013-ItemFactory-getMonsterEgg.patch b/patches/api/0013-ItemFactory-getMonsterEgg.patch
index 4701a2509e..eda7fa85aa 100644
--- a/patches/api/0013-ItemFactory-getMonsterEgg.patch
+++ b/patches/api/0013-ItemFactory-getMonsterEgg.patch
@@ -5,10 +5,10 @@ Subject: [PATCH] ItemFactory#getMonsterEgg
diff --git a/src/main/java/org/bukkit/inventory/ItemFactory.java b/src/main/java/org/bukkit/inventory/ItemFactory.java
-index eab52f8615b329a795b3fe3a3719e5687e105061..0c5e488fca4370a18fede705f58bff25f3a7b4cb 100644
+index 673477470d110c53922e9e774158d4dc58f1bba0..4b37b6108dd40c6d091a0e5e6b2188ff60567492 100644
--- a/src/main/java/org/bukkit/inventory/ItemFactory.java
+++ b/src/main/java/org/bukkit/inventory/ItemFactory.java
-@@ -233,4 +233,15 @@ public interface ItemFactory {
+@@ -242,4 +242,15 @@ public interface ItemFactory {
@Deprecated
net.md_5.bungee.api.chat.hover.content.Content hoverContentOf(@NotNull org.bukkit.entity.Entity entity, @NotNull net.md_5.bungee.api.chat.BaseComponent[] customName);
// Paper end
diff --git a/patches/api/0017-Player-invulnerabilities.patch b/patches/api/0017-Player-invulnerabilities.patch
index f47925a571..399d2c4366 100644
--- a/patches/api/0017-Player-invulnerabilities.patch
+++ b/patches/api/0017-Player-invulnerabilities.patch
@@ -5,10 +5,10 @@ Subject: [PATCH] Player invulnerabilities
diff --git a/src/main/java/org/bukkit/entity/Player.java b/src/main/java/org/bukkit/entity/Player.java
-index 023ca23e8c91a6525cc31d483d873dfe14e97da3..3dd208c763a71f4211b89a32a936a2317555f265 100644
+index 2ab8d8f3439ee2571df5df385f8874909605ff5c..24408c9bac75182d3cb6146aa25c51a45b53a3af 100644
--- a/src/main/java/org/bukkit/entity/Player.java
+++ b/src/main/java/org/bukkit/entity/Player.java
-@@ -2136,5 +2136,26 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
+@@ -2151,5 +2151,26 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
* Reset the idle timer back to 0
*/
void resetIdleTimer();
diff --git a/patches/api/0019-ItemStack-convenience-methods.patch b/patches/api/0019-ItemStack-convenience-methods.patch
index c29a2c3609..e5f9e1fa68 100644
--- a/patches/api/0019-ItemStack-convenience-methods.patch
+++ b/patches/api/0019-ItemStack-convenience-methods.patch
@@ -5,10 +5,10 @@ Subject: [PATCH] ItemStack convenience methods
diff --git a/src/main/java/org/bukkit/Material.java b/src/main/java/org/bukkit/Material.java
-index 9b1c9e60dba9ea3ef8d8e164f13dd76daf57db8e..5b41f1016ed2d5ace2b47d3dd398314230af84b7 100644
+index 9b1c9e60dba9ea3ef8d8e164f13dd76daf57db8e..b04e9de7183f00a9a47c1fce26895c83c8c0cfd8 100644
--- a/src/main/java/org/bukkit/Material.java
+++ b/src/main/java/org/bukkit/Material.java
-@@ -8718,4 +8718,36 @@ public enum Material implements Keyed {
+@@ -8718,4 +8718,40 @@ public enum Material implements Keyed {
//
}
}
@@ -37,6 +37,10 @@ index 9b1c9e60dba9ea3ef8d8e164f13dd76daf57db8e..5b41f1016ed2d5ace2b47d3dd3983142
+ case DIAMOND_CHESTPLATE:
+ case DIAMOND_HELMET:
+ case DIAMOND_LEGGINGS:
++ case NETHERITE_BOOTS:
++ case NETHERITE_CHESTPLATE:
++ case NETHERITE_HELMET:
++ case NETHERITE_LEGGINGS:
+ case TURTLE_HELMET:
+ return true;
+ default:
@@ -46,7 +50,7 @@ index 9b1c9e60dba9ea3ef8d8e164f13dd76daf57db8e..5b41f1016ed2d5ace2b47d3dd3983142
+ // Purpur end
}
diff --git a/src/main/java/org/bukkit/inventory/ItemStack.java b/src/main/java/org/bukkit/inventory/ItemStack.java
-index 58f99e3ebac9a01ebffe4d208e16cbee474d4aa3..314658c7dac1b1fbb440ec85133e6670e52ba684 100644
+index fccfae41f53a175e1a6a670c793e464456de6b60..54af7fb0b5eaeffc7ec05dd58028bf927f71bb9e 100644
--- a/src/main/java/org/bukkit/inventory/ItemStack.java
+++ b/src/main/java/org/bukkit/inventory/ItemStack.java
@@ -17,6 +17,18 @@ import org.bukkit.inventory.meta.ItemMeta;
@@ -68,8 +72,8 @@ index 58f99e3ebac9a01ebffe4d208e16cbee474d4aa3..314658c7dac1b1fbb440ec85133e6670
/**
* Represents a stack of items.
-@@ -843,4 +855,627 @@ public class ItemStack implements Cloneable, ConfigurationSerializable, net.kyor
- return itemMeta != null && itemMeta.hasItemFlag(flag);
+@@ -874,4 +886,626 @@ public class ItemStack implements Cloneable, ConfigurationSerializable, net.kyor
+ return Bukkit.getUnsafe().getItemStackRarity(this);
}
// Paper end
+
@@ -104,7 +108,7 @@ index 58f99e3ebac9a01ebffe4d208e16cbee474d4aa3..314658c7dac1b1fbb440ec85133e6670
+ * @return true if this has a display name
+ */
+ public boolean hasDisplayName() {
-+ return getItemMeta().hasDisplayName();
++ return hasItemMeta() && getItemMeta().hasDisplayName();
+ }
+
+ /**
@@ -137,7 +141,7 @@ index 58f99e3ebac9a01ebffe4d208e16cbee474d4aa3..314658c7dac1b1fbb440ec85133e6670
+ * @return true if this has a localized name
+ */
+ public boolean hasLocalizedName() {
-+ return getItemMeta().hasLocalizedName();
++ return hasItemMeta() && getItemMeta().hasLocalizedName();
+ }
+
+ /**
@@ -146,7 +150,7 @@ index 58f99e3ebac9a01ebffe4d208e16cbee474d4aa3..314658c7dac1b1fbb440ec85133e6670
+ * @return true if this has lore
+ */
+ public boolean hasLore() {
-+ return getItemMeta().hasLore();
++ return hasItemMeta() && getItemMeta().hasLore();
+ }
+
+ /**
@@ -156,7 +160,7 @@ index 58f99e3ebac9a01ebffe4d208e16cbee474d4aa3..314658c7dac1b1fbb440ec85133e6670
+ * @return true if this enchantment exists for this meta
+ */
+ public boolean hasEnchant(@NotNull Enchantment ench) {
-+ return getItemMeta().hasEnchant(ench);
++ return hasItemMeta() && getItemMeta().hasEnchant(ench);
+ }
+
+ /**
@@ -217,7 +221,7 @@ index 58f99e3ebac9a01ebffe4d208e16cbee474d4aa3..314658c7dac1b1fbb440ec85133e6670
+ * @return true if an enchantment exists on this meta
+ */
+ public boolean hasEnchants() {
-+ return getItemMeta().hasEnchants();
++ return hasItemMeta() && getItemMeta().hasEnchants();
+ }
+
+ /**
@@ -228,7 +232,7 @@ index 58f99e3ebac9a01ebffe4d208e16cbee474d4aa3..314658c7dac1b1fbb440ec85133e6670
+ * @return true if the enchantment conflicts, false otherwise
+ */
+ public boolean hasConflictingEnchant(@NotNull Enchantment ench) {
-+ return getItemMeta().hasConflictingEnchant(ench);
++ return hasItemMeta() && getItemMeta().hasConflictingEnchant(ench);
+ }
+
+ /**
@@ -269,7 +273,7 @@ index 58f99e3ebac9a01ebffe4d208e16cbee474d4aa3..314658c7dac1b1fbb440ec85133e6670
+ * @return true if this has custom model data
+ */
+ public boolean hasCustomModelData() {
-+ return getItemMeta().hasCustomModelData();
++ return hasItemMeta() && getItemMeta().hasCustomModelData();
+ }
+
+ /**
@@ -278,7 +282,7 @@ index 58f99e3ebac9a01ebffe4d208e16cbee474d4aa3..314658c7dac1b1fbb440ec85133e6670
+ * @return whether block data is already attached
+ */
+ public boolean hasBlockData() {
-+ return ((BlockDataMeta) getItemMeta()).hasBlockData();
++ return hasItemMeta() && ((BlockDataMeta) getItemMeta()).hasBlockData();
+ }
+
+ /**
@@ -335,7 +339,7 @@ index 58f99e3ebac9a01ebffe4d208e16cbee474d4aa3..314658c7dac1b1fbb440ec85133e6670
+ * @return true if this has a repair penalty
+ */
+ public boolean hasRepairCost() {
-+ return ((Repairable) getItemMeta()).hasRepairCost();
++ return hasItemMeta() && ((Repairable) getItemMeta()).hasRepairCost();
+ }
+
+ /**
@@ -345,7 +349,7 @@ index 58f99e3ebac9a01ebffe4d208e16cbee474d4aa3..314658c7dac1b1fbb440ec85133e6670
+ * @return true if the unbreakable tag is true
+ */
+ public boolean isUnbreakable() {
-+ return getItemMeta().isUnbreakable();
++ return hasItemMeta() && getItemMeta().isUnbreakable();
+ }
+
+ /**
@@ -365,7 +369,7 @@ index 58f99e3ebac9a01ebffe4d208e16cbee474d4aa3..314658c7dac1b1fbb440ec85133e6670
+ * @return true if any AttributeModifiers exist
+ */
+ public boolean hasAttributeModifiers() {
-+ return getItemMeta().hasAttributeModifiers();
++ return hasItemMeta() && getItemMeta().hasAttributeModifiers();
+ }
+
+ /**
@@ -529,7 +533,7 @@ index 58f99e3ebac9a01ebffe4d208e16cbee474d4aa3..314658c7dac1b1fbb440ec85133e6670
+ * @return true if this has damage
+ */
+ public boolean hasDamage() {
-+ return ((Damageable) getItemMeta()).hasDamage();
++ return hasItemMeta() && ((Damageable) getItemMeta()).hasDamage();
+ }
+
+ /**
@@ -601,7 +605,7 @@ index 58f99e3ebac9a01ebffe4d208e16cbee474d4aa3..314658c7dac1b1fbb440ec85133e6670
+ * @return true if this item has placeable keys
+ */
+ public boolean hasPlaceableKeys() {
-+ return getItemMeta().hasPlaceableKeys();
++ return hasItemMeta() && getItemMeta().hasPlaceableKeys();
+ }
+
+ /**
@@ -610,7 +614,7 @@ index 58f99e3ebac9a01ebffe4d208e16cbee474d4aa3..314658c7dac1b1fbb440ec85133e6670
+ * @return true if this item has destroyable keys
+ */
+ public boolean hasDestroyableKeys() {
-+ return getItemMeta().hasDestroyableKeys();
++ return hasItemMeta() && getItemMeta().hasDestroyableKeys();
+ }
+
+ /**
@@ -693,6 +697,5 @@ index 58f99e3ebac9a01ebffe4d208e16cbee474d4aa3..314658c7dac1b1fbb440ec85133e6670
+ }
+ return random.nextInt(unbreaking + 1) > 0;
+ }
-+
+ // Purpur end
}
diff --git a/patches/api/0025-Item-entity-immunities.patch b/patches/api/0025-Item-entity-immunities.patch
index 7356fb0bc1..0d320bc5f8 100644
--- a/patches/api/0025-Item-entity-immunities.patch
+++ b/patches/api/0025-Item-entity-immunities.patch
@@ -5,10 +5,10 @@ Subject: [PATCH] Item entity immunities
diff --git a/src/main/java/org/bukkit/entity/Item.java b/src/main/java/org/bukkit/entity/Item.java
-index 0ee072645ecf1bf5feb74de6960947ef76db366e..69dae9157053c521a9e2bbdd7f89c17fc8d24840 100644
+index 0ee072645ecf1bf5feb74de6960947ef76db366e..5b9a20e0695218f1239d2bf1d0368291e2a10c06 100644
--- a/src/main/java/org/bukkit/entity/Item.java
+++ b/src/main/java/org/bukkit/entity/Item.java
-@@ -120,4 +120,48 @@ public interface Item extends Entity {
+@@ -120,4 +120,62 @@ public interface Item extends Entity {
*/
public void setWillAge(boolean willAge);
// Paper end
@@ -55,5 +55,19 @@ index 0ee072645ecf1bf5feb74de6960947ef76db366e..69dae9157053c521a9e2bbdd7f89c17f
+ * @return True if immune to fire
+ */
+ boolean isImmuneToFire();
++
++ /**
++ * Set whether or not this item is immune to lightning
++ *
++ * @param immuneToLightning True to make immune to lightning
++ */
++ void setImmuneToLightning(boolean immuneToLightning);
++
++ /**
++ * Check if item is immune to lightning
++ *
++ * @return True if immune to lightning
++ */
++ boolean isImmuneToLightning();
+ // Purpur end
}
diff --git a/patches/api/0033-Fix-javadoc-warnings-missing-param-and-return.patch b/patches/api/0033-Fix-javadoc-warnings-missing-param-and-return.patch
index 888478589a..ac8774b674 100644
--- a/patches/api/0033-Fix-javadoc-warnings-missing-param-and-return.patch
+++ b/patches/api/0033-Fix-javadoc-warnings-missing-param-and-return.patch
@@ -534,7 +534,7 @@ index 28a1fe3af1546daa779df46468e0ff8ad823f9ca..7a3be414ef9d54d7a852ba92d704011f
@NotNull
diff --git a/src/main/java/org/bukkit/UnsafeValues.java b/src/main/java/org/bukkit/UnsafeValues.java
-index 3bf6e58b2351cee935e23abec1cea289e31943dc..5f2d5e12f11b471662943680b2012c99a8466306 100644
+index 6dbd520182b1e7713a68baad09b7f613424ef619..14244cc7f11035c4da4613bbdf49dac51f0da3cf 100644
--- a/src/main/java/org/bukkit/UnsafeValues.java
+++ b/src/main/java/org/bukkit/UnsafeValues.java
@@ -87,6 +87,8 @@ public interface UnsafeValues {
@@ -549,7 +549,7 @@ index 3bf6e58b2351cee935e23abec1cea289e31943dc..5f2d5e12f11b471662943680b2012c99
@@ -105,6 +107,8 @@ public interface UnsafeValues {
/**
* Return the translation key for the Material, so the client can translate it into the active
- * locale when using a TranslatableComponent.
+ * locale when using a {@link net.kyori.adventure.text.TranslatableComponent}.
+ *
+ * @param mat Material to check
* @return the translation key
@@ -558,7 +558,7 @@ index 3bf6e58b2351cee935e23abec1cea289e31943dc..5f2d5e12f11b471662943680b2012c99
@@ -112,6 +116,8 @@ public interface UnsafeValues {
/**
* Return the translation key for the Block, so the client can translate it into the active
- * locale when using a TranslatableComponent.
+ * locale when using a {@link net.kyori.adventure.text.TranslatableComponent}.
+ *
+ * @param block Block to check
* @return the translation key
@@ -566,14 +566,14 @@ index 3bf6e58b2351cee935e23abec1cea289e31943dc..5f2d5e12f11b471662943680b2012c99
String getTranslationKey(org.bukkit.block.Block block);
@@ -120,6 +126,8 @@ public interface UnsafeValues {
* Return the translation key for the EntityType, so the client can translate it into the active
- * locale when using a TranslatableComponent.
+ * locale when using a {@link net.kyori.adventure.text.TranslatableComponent}.
* This is null, when the EntityType isn't known to NMS (custom entities)
+ *
+ * @param type EntityType to check
* @return the translation key
*/
String getTranslationKey(org.bukkit.entity.EntityType type);
-@@ -128,6 +136,8 @@ public interface UnsafeValues {
+@@ -135,6 +143,8 @@ public interface UnsafeValues {
* Creates and returns the next EntityId available.
*
* Use this when sending custom packets, so that there are no collisions on the client or server.
@@ -994,10 +994,10 @@ index a6a7429ed2e1eefb2b12b7480ed74fcc3963a864..e8027e1d505dda6effbb1698550016e8
NORMAL(false),
diff --git a/src/main/java/org/bukkit/entity/Player.java b/src/main/java/org/bukkit/entity/Player.java
-index 3dd208c763a71f4211b89a32a936a2317555f265..2ed61f79fc7a625d00b86ee434d591232518ca3c 100644
+index 24408c9bac75182d3cb6146aa25c51a45b53a3af..24059b686cca36f594b2efb18666c646f391cea7 100644
--- a/src/main/java/org/bukkit/entity/Player.java
+++ b/src/main/java/org/bukkit/entity/Player.java
-@@ -1938,6 +1938,8 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
+@@ -1953,6 +1953,8 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
void resetCooldown();
/**
@@ -1006,7 +1006,7 @@ index 3dd208c763a71f4211b89a32a936a2317555f265..2ed61f79fc7a625d00b86ee434d59123
* @return the client option value of the player
*/
@NotNull
-@@ -1977,6 +1979,9 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
+@@ -1992,6 +1994,9 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
// Paper end
// Spigot start
@@ -1416,7 +1416,7 @@ index c7b17eabf07b829a02afe7c1f27a5127b6bfea70..d4e2bcf8ce8fc2af851b471490147f00
/**
diff --git a/src/main/java/org/bukkit/inventory/ItemFactory.java b/src/main/java/org/bukkit/inventory/ItemFactory.java
-index 0c5e488fca4370a18fede705f58bff25f3a7b4cb..551bed4f91fe23d36f3299b1b1576546722eb799 100644
+index 4b37b6108dd40c6d091a0e5e6b2188ff60567492..0c4aa68f47f6ccab578dc1593cf6de5eea0e17d4 100644
--- a/src/main/java/org/bukkit/inventory/ItemFactory.java
+++ b/src/main/java/org/bukkit/inventory/ItemFactory.java
@@ -148,6 +148,7 @@ public interface ItemFactory {
@@ -1427,7 +1427,7 @@ index 0c5e488fca4370a18fede705f58bff25f3a7b4cb..551bed4f91fe23d36f3299b1b1576546
* @return A hover event
*/
@NotNull
-@@ -179,7 +180,7 @@ public interface ItemFactory {
+@@ -188,7 +189,7 @@ public interface ItemFactory {
/**
* Creates a {@link net.md_5.bungee.api.chat.hover.content.Content} of that ItemStack for displaying.
*
@@ -1490,10 +1490,10 @@ index e7d905b1146b2bdd2da5bdeb6bf3541fb181d59e..1fab68c9de96b0d362ebf85fd675cc19
/**
diff --git a/src/main/java/org/bukkit/inventory/meta/BookMeta.java b/src/main/java/org/bukkit/inventory/meta/BookMeta.java
-index 0cfd4b02cc2095da56b4dc8d4ea4e9b4a95f513c..1378c8fc2fd187035fc159c8d025d58b5a61f535 100644
+index fdbd32c4bb6428f2dde484ecb53acdaaba2a0d18..7357c166115f346a1efebd0f0f2d5491de6a9a39 100644
--- a/src/main/java/org/bukkit/inventory/meta/BookMeta.java
+++ b/src/main/java/org/bukkit/inventory/meta/BookMeta.java
-@@ -305,6 +305,9 @@ public interface BookMeta extends ItemMeta, net.kyori.adventure.inventory.Book {
+@@ -313,6 +313,9 @@ public interface BookMeta extends ItemMeta, net.kyori.adventure.inventory.Book {
BookMeta clone();
// Spigot start
diff --git a/patches/api/0038-Add-unsafe-Entity-serialization-API.patch b/patches/api/0038-Add-unsafe-Entity-serialization-API.patch
index 4c53312361..b52163d449 100644
--- a/patches/api/0038-Add-unsafe-Entity-serialization-API.patch
+++ b/patches/api/0038-Add-unsafe-Entity-serialization-API.patch
@@ -17,10 +17,10 @@ You should have received a copy of the GNU General Public License
along with this program. If not, see .
diff --git a/src/main/java/org/bukkit/UnsafeValues.java b/src/main/java/org/bukkit/UnsafeValues.java
-index 5f2d5e12f11b471662943680b2012c99a8466306..7395fe0261da696d1b16c845d244ad5d6957d92a 100644
+index 14244cc7f11035c4da4613bbdf49dac51f0da3cf..7899609b7a3041477d5240deaeee9b80159c2db3 100644
--- a/src/main/java/org/bukkit/UnsafeValues.java
+++ b/src/main/java/org/bukkit/UnsafeValues.java
-@@ -165,4 +165,28 @@ public interface UnsafeValues {
+@@ -172,4 +172,28 @@ public interface UnsafeValues {
*/
int getProtocolVersion();
// Paper end
diff --git a/patches/api/0039-Conflict-on-change-for-adventure-deprecations.patch b/patches/api/0039-Conflict-on-change-for-adventure-deprecations.patch
index 81563c3e9a..1d6144537b 100644
--- a/patches/api/0039-Conflict-on-change-for-adventure-deprecations.patch
+++ b/patches/api/0039-Conflict-on-change-for-adventure-deprecations.patch
@@ -170,7 +170,7 @@ index 6ea9b54d95d80070c01a612c0ce2ab37f0b4ad41..fe9ec9cb7875df4a40d1c4155e13cca9
/**
diff --git a/src/main/java/org/bukkit/entity/Player.java b/src/main/java/org/bukkit/entity/Player.java
-index 2ed61f79fc7a625d00b86ee434d591232518ca3c..c0b75477ab8af71e73b37a66568693a84c5bce74 100644
+index 24059b686cca36f594b2efb18666c646f391cea7..cf1c631b80b5573a2a8b57e774f4faf57f98235b 100644
--- a/src/main/java/org/bukkit/entity/Player.java
+++ b/src/main/java/org/bukkit/entity/Player.java
@@ -72,7 +72,7 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
@@ -281,7 +281,7 @@ index 2ed61f79fc7a625d00b86ee434d591232518ca3c..c0b75477ab8af71e73b37a66568693a8
public void sendSignChange(@NotNull Location loc, @Nullable String[] lines, @NotNull DyeColor dyeColor) throws IllegalArgumentException;
/**
-@@ -1746,7 +1746,7 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
+@@ -1761,7 +1761,7 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
* @deprecated in favour of {@link #locale()}
*/
@NotNull
@@ -370,10 +370,10 @@ index 129eac25da4f27489038fb15ab1aeecb172b60cc..670aca11bbaa2d155cd9d2105ac94c9d
return title;
}
diff --git a/src/main/java/org/bukkit/event/player/AsyncPlayerPreLoginEvent.java b/src/main/java/org/bukkit/event/player/AsyncPlayerPreLoginEvent.java
-index c9af02b0f62b3d18da1e91d1ea02ce0864fc60b9..5e4ade542c79b87a5174e7affb649d818d546362 100644
+index 77aefda5aac4602bf5bf71c29600e7450defdd4e..240552d61ae12fbec826f771f0f366500e72d941 100644
--- a/src/main/java/org/bukkit/event/player/AsyncPlayerPreLoginEvent.java
+++ b/src/main/java/org/bukkit/event/player/AsyncPlayerPreLoginEvent.java
-@@ -161,7 +161,7 @@ public class AsyncPlayerPreLoginEvent extends Event {
+@@ -179,7 +179,7 @@ public class AsyncPlayerPreLoginEvent extends Event {
* @deprecated in favour of {@link #kickMessage()}
*/
@NotNull
@@ -382,7 +382,7 @@ index c9af02b0f62b3d18da1e91d1ea02ce0864fc60b9..5e4ade542c79b87a5174e7affb649d81
public String getKickMessage() {
return org.bukkit.Bukkit.getUnsafe().legacyComponentSerializer().serialize(this.message); // Paper
}
-@@ -172,7 +172,7 @@ public class AsyncPlayerPreLoginEvent extends Event {
+@@ -190,7 +190,7 @@ public class AsyncPlayerPreLoginEvent extends Event {
* @param message New kick message
* @deprecated in favour of {@link #kickMessage(net.kyori.adventure.text.Component)}
*/
@@ -391,7 +391,7 @@ index c9af02b0f62b3d18da1e91d1ea02ce0864fc60b9..5e4ade542c79b87a5174e7affb649d81
public void setKickMessage(@NotNull final String message) {
this.message = org.bukkit.Bukkit.getUnsafe().legacyComponentSerializer().deserialize(message); // Paper
}
-@@ -192,7 +192,7 @@ public class AsyncPlayerPreLoginEvent extends Event {
+@@ -210,7 +210,7 @@ public class AsyncPlayerPreLoginEvent extends Event {
* @param message Kick message to display to the user
* @deprecated in favour of {@link #disallow(org.bukkit.event.player.AsyncPlayerPreLoginEvent.Result, net.kyori.adventure.text.Component)}
*/
@@ -626,10 +626,10 @@ index b06995aa57aa9cba0bb59f1d26d81015619a08e6..5e33fe46ab9bb034acc6a38a3c00c33c
public abstract String getTitle();
}
diff --git a/src/main/java/org/bukkit/inventory/meta/BookMeta.java b/src/main/java/org/bukkit/inventory/meta/BookMeta.java
-index 1378c8fc2fd187035fc159c8d025d58b5a61f535..2cbeb4ced49cab055e96268077df2ee2e445c980 100644
+index 7357c166115f346a1efebd0f0f2d5491de6a9a39..b90cb7aa98ea40573557a80ca5c7be7c5c494956 100644
--- a/src/main/java/org/bukkit/inventory/meta/BookMeta.java
+++ b/src/main/java/org/bukkit/inventory/meta/BookMeta.java
-@@ -234,7 +234,7 @@ public interface BookMeta extends ItemMeta, net.kyori.adventure.inventory.Book {
+@@ -242,7 +242,7 @@ public interface BookMeta extends ItemMeta, net.kyori.adventure.inventory.Book {
* @deprecated in favour of {@link #page(int)}
*/
@NotNull
@@ -638,7 +638,7 @@ index 1378c8fc2fd187035fc159c8d025d58b5a61f535..2cbeb4ced49cab055e96268077df2ee2
String getPage(int page);
/**
-@@ -250,7 +250,7 @@ public interface BookMeta extends ItemMeta, net.kyori.adventure.inventory.Book {
+@@ -258,7 +258,7 @@ public interface BookMeta extends ItemMeta, net.kyori.adventure.inventory.Book {
* @param data the data to set for that page
* @deprecated in favour of {@link #page(int, net.kyori.adventure.text.Component)}
*/
@@ -647,7 +647,7 @@ index 1378c8fc2fd187035fc159c8d025d58b5a61f535..2cbeb4ced49cab055e96268077df2ee2
void setPage(int page, @NotNull String data);
/**
-@@ -260,7 +260,7 @@ public interface BookMeta extends ItemMeta, net.kyori.adventure.inventory.Book {
+@@ -268,7 +268,7 @@ public interface BookMeta extends ItemMeta, net.kyori.adventure.inventory.Book {
* @deprecated in favour of {@link #pages()}
*/
@NotNull
@@ -656,7 +656,7 @@ index 1378c8fc2fd187035fc159c8d025d58b5a61f535..2cbeb4ced49cab055e96268077df2ee2
List getPages();
/**
-@@ -270,7 +270,7 @@ public interface BookMeta extends ItemMeta, net.kyori.adventure.inventory.Book {
+@@ -278,7 +278,7 @@ public interface BookMeta extends ItemMeta, net.kyori.adventure.inventory.Book {
* @param pages A list of pages to set the book to use
* @deprecated in favour of {@link #pages(List)}
*/
@@ -665,7 +665,7 @@ index 1378c8fc2fd187035fc159c8d025d58b5a61f535..2cbeb4ced49cab055e96268077df2ee2
void setPages(@NotNull List pages);
/**
-@@ -280,7 +280,7 @@ public interface BookMeta extends ItemMeta, net.kyori.adventure.inventory.Book {
+@@ -288,7 +288,7 @@ public interface BookMeta extends ItemMeta, net.kyori.adventure.inventory.Book {
* @param pages A list of strings, each being a page
* @deprecated in favour of {@link #pages(net.kyori.adventure.text.Component...)}
*/
@@ -674,7 +674,7 @@ index 1378c8fc2fd187035fc159c8d025d58b5a61f535..2cbeb4ced49cab055e96268077df2ee2
void setPages(@NotNull String... pages);
/**
-@@ -290,7 +290,7 @@ public interface BookMeta extends ItemMeta, net.kyori.adventure.inventory.Book {
+@@ -298,7 +298,7 @@ public interface BookMeta extends ItemMeta, net.kyori.adventure.inventory.Book {
* @param pages A list of strings, each being a page
* @deprecated in favour of {@link #addPages(net.kyori.adventure.text.Component...)}
*/
diff --git a/patches/server/0001-Tuinity-Server-Changes.patch b/patches/server/0001-Tuinity-Server-Changes.patch
index 897342fcab..8ff7342da2 100644
--- a/patches/server/0001-Tuinity-Server-Changes.patch
+++ b/patches/server/0001-Tuinity-Server-Changes.patch
@@ -2059,7 +2059,7 @@ index 0000000000000000000000000000000000000000..5ea5b3933725d80dd193e815ac507ee5
\ No newline at end of file
diff --git a/src/main/java/com/tuinity/tuinity/chunk/light/BlockStarLightEngine.java b/src/main/java/com/tuinity/tuinity/chunk/light/BlockStarLightEngine.java
new file mode 100644
-index 0000000000000000000000000000000000000000..331f0ae05384b29ceb59f2846c52a2194658bb39
+index 0000000000000000000000000000000000000000..f722f9838424f345b69aef11510c194c6629e439
--- /dev/null
+++ b/src/main/java/com/tuinity/tuinity/chunk/light/BlockStarLightEngine.java
@@ -0,0 +1,289 @@
@@ -2298,16 +2298,16 @@ index 0000000000000000000000000000000000000000..331f0ae05384b29ceb59f2846c52a219
+
+ return ret.iterator();
+ } else {
-+ if (chunk instanceof ProtoChunk) {
-+ ProtoChunk protoChunk = (ProtoChunk)chunk;
-+ protoChunk.lockLightSources();
++ // world gen and lighting run in parallel, and if lighting keeps up it can be lighting chunks that are
++ // being generated. In the nether, lava will add a lot of sources. This resulted in quite a few CME crashes.
++ // So all we do spinloop until we can collect a list of sources, and even if it is out of date we will pick up
++ // the missing sources from checkBlock.
++ for (;;) {
+ try {
-+ return new ArrayList<>(chunk.getLightSources().collect(Collectors.toList())).iterator();
-+ } finally {
-+ protoChunk.releaseLightSources();
++ return chunk.getLightSources().collect(Collectors.toList()).iterator();
++ } catch (final Exception cme) {
++ continue;
+ }
-+ } else {
-+ return new ArrayList<>(chunk.getLightSources().collect(Collectors.toList())).iterator();
+ }
+ }
+ }
@@ -3397,10 +3397,10 @@ index 0000000000000000000000000000000000000000..86a880d0f13f0fee70b09626c394c9e2
+}
diff --git a/src/main/java/com/tuinity/tuinity/chunk/light/StarLightEngine.java b/src/main/java/com/tuinity/tuinity/chunk/light/StarLightEngine.java
new file mode 100644
-index 0000000000000000000000000000000000000000..e40cf190c945754bd8b5342f76cd7fe2efd127cb
+index 0000000000000000000000000000000000000000..2b0455b7475a75bba010fd71798eaa204bcf9562
--- /dev/null
+++ b/src/main/java/com/tuinity/tuinity/chunk/light/StarLightEngine.java
-@@ -0,0 +1,1615 @@
+@@ -0,0 +1,1603 @@
+package com.tuinity.tuinity.chunk.light;
+
+import com.tuinity.tuinity.util.CoordinateUtils;
@@ -3847,7 +3847,7 @@ index 0000000000000000000000000000000000000000..e40cf190c945754bd8b5342f76cd7fe2
+ try {
+ this.changedBlocksSet = positions;
+ final IChunkAccess chunk = this.getChunkInCache(chunkX, chunkZ);
-+ if (this.isClientSide && chunk == null) {
++ if (chunk == null) {
+ return;
+ }
+ if (changedSections != null) {
@@ -4146,18 +4146,6 @@ index 0000000000000000000000000000000000000000..e40cf190c945754bd8b5342f76cd7fe2
+ final Boolean[] emptinessChanges) {
+ this.setupCaches(lightAccess, chunkX * 16 + 7, 128, chunkZ * 16 + 7, true, true);
+ try {
-+ if (this.isClientSide) {
-+ // force current chunk into cache
-+ final IChunkAccess chunk = (IChunkAccess)lightAccess.getFeaturesReadyChunk(chunkX, chunkZ);
-+ if (chunk == null) {
-+ // unloaded this frame (or last), and we were still queued
-+ return;
-+ }
-+ this.setChunkInCache(chunkX, chunkZ, chunk);
-+ this.setBlocksForChunkInCache(chunkX, chunkZ, chunk.getSections());
-+ this.setNibblesForChunkInCache(chunkX, chunkZ, this.getNibblesOnChunk(chunk));
-+ this.setEmptinessMapCache(chunkX, chunkZ, this.getEmptinessMap(chunk));
-+ }
+ final IChunkAccess chunk = this.getChunkInCache(chunkX, chunkZ);
+ if (chunk == null) {
+ return;
@@ -5514,10 +5502,10 @@ index 0000000000000000000000000000000000000000..df686b97460796004cad1477760647a9
+}
diff --git a/src/main/java/com/tuinity/tuinity/chunk/light/VariableBlockLightHandler.java b/src/main/java/com/tuinity/tuinity/chunk/light/VariableBlockLightHandler.java
new file mode 100644
-index 0000000000000000000000000000000000000000..b8df658c09a6dc739ff3f4d6e18c9cef7caea6c9
+index 0000000000000000000000000000000000000000..20309334d81011f18fbb67be209a1eec25447b5c
--- /dev/null
+++ b/src/main/java/com/tuinity/tuinity/chunk/light/VariableBlockLightHandler.java
-@@ -0,0 +1,30 @@
+@@ -0,0 +1,33 @@
+package com.tuinity.tuinity.chunk.light;
+
+import net.minecraft.core.BlockPosition;
@@ -5526,7 +5514,10 @@ index 0000000000000000000000000000000000000000..b8df658c09a6dc739ff3f4d6e18c9cef
+/**
+ * Recommended implementation is {@link VariableBlockLightHandlerImpl}, but you can implement this interface yourself
+ * if you want.
++ *
++ * @deprecated To be removed in 1.17 due to Mojang adding a custom light block.
+ */
++@Deprecated
+public interface VariableBlockLightHandler {
+
+ /**
@@ -10944,10 +10935,10 @@ index 1d72af9cace7aa8f1d20c7c1c5be621f533e2dad..b7399d17dd64ca8b1f1fab405cb0ac91
worldData.addProperty("keep-spawn-loaded-range", world.paperConfig.keepLoadedRange);
worldData.addProperty("visible-chunk-count", visibleChunks.size());
diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java
-index 61712ae515b329a6b85dbe2e5960e4e864dc7731..2767a9369ddc922f1d9c7cb6c7acc8270545535a 100644
+index 35bb4d0b9ed131e6570cce0b43ae78c5557a0bff..8adbb9a77ff304f14ad3defa0f4f7ec25b0d2a2a 100644
--- a/src/main/java/net/minecraft/server/MinecraftServer.java
+++ b/src/main/java/net/minecraft/server/MinecraftServer.java
-@@ -267,6 +267,7 @@ public abstract class MinecraftServer extends IAsyncTaskHandlerReentrant processQueue = new java.util.concurrent.ConcurrentLinkedQueue();
public int autosavePeriod;
public boolean serverAutoSave = false; // Paper
-@@ -877,10 +878,11 @@ public abstract class MinecraftServer extends IAsyncTaskHandlerReentrant {
@@ -11111,7 +11102,7 @@ index 61712ae515b329a6b85dbe2e5960e4e864dc7731..2767a9369ddc922f1d9c7cb6c7acc827
return !this.canOversleep();
});
isOversleep = false;MinecraftTimings.serverOversleep.stopTiming();
-@@ -1392,6 +1452,8 @@ public abstract class MinecraftServer extends IAsyncTaskHandlerReentrant iterator = this.ticketLevelUpdates.long2IntEntrySet().fastIterator(); iterator.hasNext(); ) {
++ for (java.util.Iterator iterator = this.ticketLevelUpdates.long2IntEntrySet().fastIterator(); iterator.hasNext();) {
+ Long2IntMap.Entry entry = iterator.next();
+ long key = entry.getLongKey();
+ int newLevel = entry.getIntValue();
+ PlayerChunk chunk = this.getUpdatingChunk(key);
-
-- while (longiterator.hasNext()) {
-- long j = longiterator.nextLong();
++
+ if (chunk == null && newLevel > PlayerChunkMap.GOLDEN_TICKET) {
+ // not loaded and it shouldn't be loaded!
+ continue;
+ }
++
++ int currentLevel = chunk == null ? PlayerChunkMap.GOLDEN_TICKET + 1 : chunk.getTicketLevel();
- if (this.e(j).stream().anyMatch((ticket) -> {
- return ticket.getTicketType() == TicketType.PLAYER;
- })) {
- PlayerChunk playerchunk = playerchunkmap.getUpdatingChunk(j);
-+ int currentLevel = chunk == null ? PlayerChunkMap.GOLDEN_TICKET + 1 : chunk.getTicketLevel();
-
-- if (playerchunk == null) {
-- throw new IllegalStateException();
+ if (currentLevel == newLevel) {
+ // nothing to do
+ continue;
@@ -11433,7 +11425,9 @@ index 3644e8b24b082e17752ef52934625416130aaa08..a5fc023312c99e591fc269999c28a766
+
+ this.updateTicketLevel(key, newLevel, chunk, currentLevel);
+ }
-+
+
+- if (playerchunk == null) {
+- throw new IllegalStateException();
+ long recursiveCheck = ++this.ticketLevelUpdateCount;
+ while (!this.ticketLevelUpdates.isEmpty()) {
+ long key = this.ticketLevelUpdates.firstLongKey();
@@ -11464,31 +11458,29 @@ index 3644e8b24b082e17752ef52934625416130aaa08..a5fc023312c99e591fc269999c28a766
+
+ chunk.handleLevelUpdate(playerchunkmap);
+ if (recursiveCheck != this.ticketLevelUpdateCount) {
-+ if (!this.ticketLevelUpdates.isEmpty()) {
-+ throw new IllegalStateException("Recursive call should have processed updates");
-+ }
-+ break;
++ // back to the start, we must create player chunks and update the ticket level fields before
++ // processing the actual level updates
++ continue ticket_update_loop;
}
}
- this.l.clear();
+- }
+ for (;;) {
+ if (recursiveCheck != this.ticketLevelUpdateCount) {
-+ break;
++ continue ticket_update_loop;
+ }
+ PlayerChunk pendingUpdate = this.pendingChunkUpdates.poll();
+ if (pendingUpdate == null) {
+ break;
+ }
-+
+
+- return flag;
+ pendingUpdate.handleLevelUpdate(playerchunkmap);
+ }
+ } finally {
+ this.pollingPendingChunkUpdates = oldPolling;
- }
-
-- return flag;
-+ return true;
++ }
}
+
+ return flag;
@@ -12351,7 +12343,7 @@ index 4ee7070364a8989eece4fa4237b529926821f9c9..f22ab98d2e250081df8949be8a997370
this.a(Long.MAX_VALUE, i, j, flag);
}
diff --git a/src/main/java/net/minecraft/server/level/LightEngineThreaded.java b/src/main/java/net/minecraft/server/level/LightEngineThreaded.java
-index 0b80569648c1df01aab52d0b8d47028cda925d86..ad584ba21c6e201b778f32cea6d7cc5bf67f9746 100644
+index 0b80569648c1df01aab52d0b8d47028cda925d86..76ac408021c5124fd634682cba97dc63392642f5 100644
--- a/src/main/java/net/minecraft/server/level/LightEngineThreaded.java
+++ b/src/main/java/net/minecraft/server/level/LightEngineThreaded.java
@@ -2,6 +2,11 @@ package net.minecraft.server.level;
@@ -12380,7 +12372,7 @@ index 0b80569648c1df01aab52d0b8d47028cda925d86..ad584ba21c6e201b778f32cea6d7cc5b
PlayerChunk playerChunk = playerChunkMap.getVisibleChunk(pair);
if (playerChunk == null) {
return false;
-@@ -169,13 +175,184 @@ public class LightEngineThreaded extends LightEngine implements AutoCloseable {
+@@ -169,13 +175,191 @@ public class LightEngineThreaded extends LightEngine implements AutoCloseable {
private volatile int f = 5;
private final AtomicBoolean g = new AtomicBoolean();
@@ -12451,8 +12443,8 @@ index 0b80569648c1df01aab52d0b8d47028cda925d86..ad584ba21c6e201b778f32cea6d7cc5b
+ this.queueUpdate();
+
+ return totalChunks;
- }
-
++ }
++
+ protected final Long2IntOpenHashMap holdingChunks = new Long2IntOpenHashMap();
+ protected final LongArrayList postWorkTicketRelease = new LongArrayList();
+
@@ -12499,20 +12491,27 @@ index 0b80569648c1df01aab52d0b8d47028cda925d86..ad584ba21c6e201b778f32cea6d7cc5b
+ }
+
+ return CompletableFuture.completedFuture(playerChunk.getAvailableChunkNow());
-+ }
-+
+ }
+
+ // note: task is discarded if the chunk is not at light status or if the chunk is not lit
+ protected final void scheduleLightWorkTask(int chunkX, int chunkZ, LightEngineThreaded.Update type, Runnable task) {
-+ if (!org.bukkit.Bukkit.isPrimaryThread()) {
-+ this.playerChunkMap.mainInvokingExecutor.execute(() -> {
-+ this.scheduleLightWorkTask(chunkX, chunkZ, type, task);
-+ });
++ IChunkAccess current = this.getChunk(chunkX, chunkZ);
++
++ if (current == null || !current.getChunkStatus().isAtLeastStatus(ChunkStatus.LIGHT)) {
+ return;
+ }
+
-+ IChunkAccess current = this.getChunk(chunkX, chunkZ);
++ if (current.getChunkStatus() != ChunkStatus.FULL) {
++ // do not keep chunk loaded, we are probably in a gen thread
++ // if we proceed to add a ticket the chunk will be loaded, which is not what we want (avoid cascading gen)
++ this.scheduleTask(chunkX, chunkZ, type, task);
++ return;
++ }
+
-+ if (current == null || !current.isLit() || !current.getChunkStatus().isAtLeastStatus(ChunkStatus.LIGHT)) {
++ if (!org.bukkit.Bukkit.isPrimaryThread()) {
++ this.playerChunkMap.mainInvokingExecutor.execute(() -> {
++ this.scheduleLightWorkTask(chunkX, chunkZ, type, task);
++ });
+ return;
+ }
+
@@ -12565,7 +12564,7 @@ index 0b80569648c1df01aab52d0b8d47028cda925d86..ad584ba21c6e201b778f32cea6d7cc5b
public void close() {}
@Override
-@@ -192,6 +369,15 @@ public class LightEngineThreaded extends LightEngine implements AutoCloseable {
+@@ -192,6 +376,15 @@ public class LightEngineThreaded extends LightEngine implements AutoCloseable {
public void a(BlockPosition blockposition) {
BlockPosition blockposition1 = blockposition.immutableCopy();
@@ -12581,7 +12580,7 @@ index 0b80569648c1df01aab52d0b8d47028cda925d86..ad584ba21c6e201b778f32cea6d7cc5b
this.a(blockposition.getX() >> 4, blockposition.getZ() >> 4, LightEngineThreaded.Update.POST_UPDATE, SystemUtils.a(() -> {
super.a(blockposition1);
}, () -> {
-@@ -200,6 +386,11 @@ public class LightEngineThreaded extends LightEngine implements AutoCloseable {
+@@ -200,6 +393,11 @@ public class LightEngineThreaded extends LightEngine implements AutoCloseable {
}
protected void a(ChunkCoordIntPair chunkcoordintpair) {
@@ -12593,7 +12592,7 @@ index 0b80569648c1df01aab52d0b8d47028cda925d86..ad584ba21c6e201b778f32cea6d7cc5b
this.a(chunkcoordintpair.x, chunkcoordintpair.z, () -> {
return 0;
}, LightEngineThreaded.Update.PRE_UPDATE, SystemUtils.a(() -> {
-@@ -224,6 +415,14 @@ public class LightEngineThreaded extends LightEngine implements AutoCloseable {
+@@ -224,6 +422,14 @@ public class LightEngineThreaded extends LightEngine implements AutoCloseable {
@Override
public void a(SectionPosition sectionposition, boolean flag) {
@@ -12608,7 +12607,7 @@ index 0b80569648c1df01aab52d0b8d47028cda925d86..ad584ba21c6e201b778f32cea6d7cc5b
this.a(sectionposition.a(), sectionposition.c(), () -> {
return 0;
}, LightEngineThreaded.Update.PRE_UPDATE, SystemUtils.a(() -> {
-@@ -235,6 +434,11 @@ public class LightEngineThreaded extends LightEngine implements AutoCloseable {
+@@ -235,6 +441,11 @@ public class LightEngineThreaded extends LightEngine implements AutoCloseable {
@Override
public void a(ChunkCoordIntPair chunkcoordintpair, boolean flag) {
@@ -12620,7 +12619,7 @@ index 0b80569648c1df01aab52d0b8d47028cda925d86..ad584ba21c6e201b778f32cea6d7cc5b
this.a(chunkcoordintpair.x, chunkcoordintpair.z, LightEngineThreaded.Update.PRE_UPDATE, SystemUtils.a(() -> {
super.a(chunkcoordintpair, flag);
}, () -> {
-@@ -244,6 +448,11 @@ public class LightEngineThreaded extends LightEngine implements AutoCloseable {
+@@ -244,6 +455,11 @@ public class LightEngineThreaded extends LightEngine implements AutoCloseable {
@Override
public void a(EnumSkyBlock enumskyblock, SectionPosition sectionposition, @Nullable NibbleArray nibblearray, boolean flag) {
@@ -12632,7 +12631,7 @@ index 0b80569648c1df01aab52d0b8d47028cda925d86..ad584ba21c6e201b778f32cea6d7cc5b
this.a(sectionposition.a(), sectionposition.c(), () -> {
return 0;
}, LightEngineThreaded.Update.PRE_UPDATE, SystemUtils.a(() -> {
-@@ -253,6 +462,7 @@ public class LightEngineThreaded extends LightEngine implements AutoCloseable {
+@@ -253,6 +469,7 @@ public class LightEngineThreaded extends LightEngine implements AutoCloseable {
}));
}
@@ -12640,7 +12639,7 @@ index 0b80569648c1df01aab52d0b8d47028cda925d86..ad584ba21c6e201b778f32cea6d7cc5b
private void a(int i, int j, LightEngineThreaded.Update lightenginethreaded_update, Runnable runnable) {
this.a(i, j, this.d.c(ChunkCoordIntPair.pair(i, j)), lightenginethreaded_update, runnable);
}
-@@ -265,6 +475,11 @@ public class LightEngineThreaded extends LightEngine implements AutoCloseable {
+@@ -265,6 +482,11 @@ public class LightEngineThreaded extends LightEngine implements AutoCloseable {
@Override
public void b(ChunkCoordIntPair chunkcoordintpair, boolean flag) {
@@ -12652,7 +12651,7 @@ index 0b80569648c1df01aab52d0b8d47028cda925d86..ad584ba21c6e201b778f32cea6d7cc5b
this.a(chunkcoordintpair.x, chunkcoordintpair.z, () -> {
return 0;
}, LightEngineThreaded.Update.PRE_UPDATE, SystemUtils.a(() -> {
-@@ -277,6 +492,35 @@ public class LightEngineThreaded extends LightEngine implements AutoCloseable {
+@@ -277,6 +499,35 @@ public class LightEngineThreaded extends LightEngine implements AutoCloseable {
public CompletableFuture a(IChunkAccess ichunkaccess, boolean flag) {
ChunkCoordIntPair chunkcoordintpair = ichunkaccess.getPos();
@@ -12688,7 +12687,7 @@ index 0b80569648c1df01aab52d0b8d47028cda925d86..ad584ba21c6e201b778f32cea6d7cc5b
// Paper start
//ichunkaccess.b(false); // Don't need to disable this
long pair = chunkcoordintpair.pair();
-@@ -324,7 +568,7 @@ public class LightEngineThreaded extends LightEngine implements AutoCloseable {
+@@ -324,7 +575,7 @@ public class LightEngineThreaded extends LightEngine implements AutoCloseable {
}
public void queueUpdate() {
@@ -12697,7 +12696,7 @@ index 0b80569648c1df01aab52d0b8d47028cda925d86..ad584ba21c6e201b778f32cea6d7cc5b
this.b.a((() -> { // Paper - decompile error
this.b();
this.g.set(false);
-@@ -338,17 +582,36 @@ public class LightEngineThreaded extends LightEngine implements AutoCloseable {
+@@ -338,17 +589,36 @@ public class LightEngineThreaded extends LightEngine implements AutoCloseable {
private final java.util.List pre = new java.util.ArrayList<>();
private final java.util.List post = new java.util.ArrayList<>();
private void b() {
@@ -12966,7 +12965,7 @@ index a323b76f68c273a73cb3f20167a668b2100f4944..86f156587a0939b28c5cf6f64907255c
if (chunk != null) {
playerchunkmap.callbackExecutor.execute(() -> {
diff --git a/src/main/java/net/minecraft/server/level/PlayerChunkMap.java b/src/main/java/net/minecraft/server/level/PlayerChunkMap.java
-index 300884804bf9ac3fba7c30a04d8adf52e3dd2e3e..b28995ecfd7f45e6b6197be96c418aa0d05d3383 100644
+index 6835401bd7863bbd655502547a9fd4ae0f298da1..33429be7da4d4c2b2469b8140e46e66d9921652c 100644
--- a/src/main/java/net/minecraft/server/level/PlayerChunkMap.java
+++ b/src/main/java/net/minecraft/server/level/PlayerChunkMap.java
@@ -103,6 +103,7 @@ import net.minecraft.world.level.storage.WorldDataServer;
@@ -13613,7 +13612,7 @@ index 300884804bf9ac3fba7c30a04d8adf52e3dd2e3e..b28995ecfd7f45e6b6197be96c418aa0
protected void c(ChunkCoordIntPair chunkcoordintpair) {
this.executor.a(SystemUtils.a(() -> {
this.chunkDistanceManager.b(TicketType.LIGHT, chunkcoordintpair, 33 + ChunkStatus.a(ChunkStatus.FEATURES), chunkcoordintpair);
-@@ -1470,9 +1546,7 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d {
+@@ -1478,9 +1554,7 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d {
chunk.B();
return chunk;
});
@@ -13624,7 +13623,7 @@ index 300884804bf9ac3fba7c30a04d8adf52e3dd2e3e..b28995ecfd7f45e6b6197be96c418aa0
}
public int c() {
-@@ -1553,39 +1627,27 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d {
+@@ -1561,39 +1635,27 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d {
}
public void setViewDistance(int i) { // Paper - public
@@ -13669,7 +13668,7 @@ index 300884804bf9ac3fba7c30a04d8adf52e3dd2e3e..b28995ecfd7f45e6b6197be96c418aa0
if (entityplayer.world == this.world) {
if (flag1 && !flag) {
PlayerChunk playerchunk = this.getVisibleChunk(chunkcoordintpair.pair());
-@@ -1609,7 +1671,7 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d {
+@@ -1617,7 +1679,7 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d {
}
public int d() {
@@ -13678,7 +13677,7 @@ index 300884804bf9ac3fba7c30a04d8adf52e3dd2e3e..b28995ecfd7f45e6b6197be96c418aa0
}
protected PlayerChunkMap.a e() {
-@@ -1681,7 +1743,7 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d {
+@@ -1689,7 +1751,7 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d {
if (Thread.currentThread() != com.destroystokyo.paper.io.PaperFileIOThread.Holder.INSTANCE) {
com.destroystokyo.paper.io.PaperFileIOThread.Holder.INSTANCE.scheduleSave(
this.world, chunkcoordintpair.x, chunkcoordintpair.z, null, nbttagcompound,
@@ -13687,7 +13686,7 @@ index 300884804bf9ac3fba7c30a04d8adf52e3dd2e3e..b28995ecfd7f45e6b6197be96c418aa0
return;
}
super.write(chunkcoordintpair, nbttagcompound);
-@@ -1765,6 +1827,11 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d {
+@@ -1773,6 +1835,11 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d {
return chunkHolder == null ? null : chunkHolder.getAvailableChunkNow();
}
// Paper end
@@ -13699,7 +13698,7 @@ index 300884804bf9ac3fba7c30a04d8adf52e3dd2e3e..b28995ecfd7f45e6b6197be96c418aa0
// Paper start - async io
-@@ -1974,6 +2041,7 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d {
+@@ -1982,6 +2049,7 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d {
}*/ // Paper end - replaced by distance map
this.updateMaps(entityplayer); // Paper - distance maps
@@ -13707,7 +13706,7 @@ index 300884804bf9ac3fba7c30a04d8adf52e3dd2e3e..b28995ecfd7f45e6b6197be96c418aa0
}
-@@ -1982,7 +2050,7 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d {
+@@ -1990,7 +2058,7 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d {
// Paper start - per player view distance
// there can be potential desync with player's last mapped section and the view distance map, so use the
// view distance map here.
@@ -13716,7 +13715,7 @@ index 300884804bf9ac3fba7c30a04d8adf52e3dd2e3e..b28995ecfd7f45e6b6197be96c418aa0
if (inRange == null) {
return Stream.empty();
-@@ -1998,8 +2066,9 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d {
+@@ -2006,8 +2074,9 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d {
continue;
}
EntityPlayer player = (EntityPlayer)temp;
@@ -13728,7 +13727,7 @@ index 300884804bf9ac3fba7c30a04d8adf52e3dd2e3e..b28995ecfd7f45e6b6197be96c418aa0
int distX = Math.abs(MCUtil.getCoordinateX(lastPosition) - chunkcoordintpair.x);
int distZ = Math.abs(MCUtil.getCoordinateZ(lastPosition) - chunkcoordintpair.z);
-@@ -2014,6 +2083,7 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d {
+@@ -2022,6 +2091,7 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d {
continue;
}
EntityPlayer player = (EntityPlayer)temp;
@@ -13736,7 +13735,7 @@ index 300884804bf9ac3fba7c30a04d8adf52e3dd2e3e..b28995ecfd7f45e6b6197be96c418aa0
players.add(player);
}
}
-@@ -2092,22 +2162,25 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d {
+@@ -2100,22 +2170,25 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d {
private final void processTrackQueue() {
this.world.timings.tracker1.startTiming();
try {
@@ -13775,7 +13774,7 @@ index 300884804bf9ac3fba7c30a04d8adf52e3dd2e3e..b28995ecfd7f45e6b6197be96c418aa0
}
}
// Paper end - optimised tracker
-@@ -2229,6 +2302,7 @@ Sections go from 0..16. Now whenever a section is not empty, it can potentially
+@@ -2237,6 +2310,7 @@ Sections go from 0..16. Now whenever a section is not empty, it can potentially
apacket[1] = new PacketPlayOutLightUpdate(chunk.getPos(), this.lightEngine, true);
// Paper start - Fix MC-162253
@@ -13783,7 +13782,7 @@ index 300884804bf9ac3fba7c30a04d8adf52e3dd2e3e..b28995ecfd7f45e6b6197be96c418aa0
final int lightMask = getLightMask(chunk);
int i = 1;
for (int x = -1; x <= 1; x++) {
-@@ -2253,10 +2327,12 @@ Sections go from 0..16. Now whenever a section is not empty, it can potentially
+@@ -2261,10 +2335,12 @@ Sections go from 0..16. Now whenever a section is not empty, it can potentially
apacket[i] = new PacketPlayOutLightUpdate(new ChunkCoordIntPair(chunk.getPos().x + x, chunk.getPos().z + z), lightEngine, updateLightMask, 0, true);
}
}
@@ -13798,7 +13797,7 @@ index 300884804bf9ac3fba7c30a04d8adf52e3dd2e3e..b28995ecfd7f45e6b6197be96c418aa0
int j = 1;
for (int x = -1; x <= 1; x++) {
-@@ -2281,6 +2357,7 @@ Sections go from 0..16. Now whenever a section is not empty, it can potentially
+@@ -2289,6 +2365,7 @@ Sections go from 0..16. Now whenever a section is not empty, it can potentially
entityplayer.playerConnection.sendPacket(packet);
}
}
@@ -13806,7 +13805,7 @@ index 300884804bf9ac3fba7c30a04d8adf52e3dd2e3e..b28995ecfd7f45e6b6197be96c418aa0
// Paper end - Fix MC-162253
entityplayer.a(chunk.getPos(), apacket[0], apacket[1]);
-@@ -2356,7 +2433,7 @@ Sections go from 0..16. Now whenever a section is not empty, it can potentially
+@@ -2364,7 +2441,7 @@ Sections go from 0..16. Now whenever a section is not empty, it can potentially
// Paper start
// Replace trackedPlayers Set with a Map. The value is true until the player receives
// their first update (which is forced to have absolute coordinates), false afterward.
@@ -13815,7 +13814,7 @@ index 300884804bf9ac3fba7c30a04d8adf52e3dd2e3e..b28995ecfd7f45e6b6197be96c418aa0
public Set trackedPlayers = trackedPlayerMap.keySet();
public EntityTracker(Entity entity, int i, int j, boolean flag) {
-@@ -2457,7 +2534,7 @@ Sections go from 0..16. Now whenever a section is not empty, it can potentially
+@@ -2465,7 +2542,7 @@ Sections go from 0..16. Now whenever a section is not empty, it can potentially
double vec3d_dy = entityplayer.locY() - this.tracker.locY();
double vec3d_dz = entityplayer.locZ() - this.tracker.locZ();
// Paper end - remove allocation of Vec3D here
@@ -13824,7 +13823,7 @@ index 300884804bf9ac3fba7c30a04d8adf52e3dd2e3e..b28995ecfd7f45e6b6197be96c418aa0
boolean flag = vec3d_dx >= (double) (-i) && vec3d_dx <= (double) i && vec3d_dz >= (double) (-i) && vec3d_dz <= (double) i && this.tracker.a(entityplayer); // Paper - remove allocation of Vec3D here
if (flag) {
-@@ -2467,7 +2544,7 @@ Sections go from 0..16. Now whenever a section is not empty, it can potentially
+@@ -2475,7 +2552,7 @@ Sections go from 0..16. Now whenever a section is not empty, it can potentially
ChunkCoordIntPair chunkcoordintpair = new ChunkCoordIntPair(this.tracker.chunkX, this.tracker.chunkZ);
PlayerChunk playerchunk = PlayerChunkMap.this.getVisibleChunk(chunkcoordintpair.pair());
@@ -13833,7 +13832,7 @@ index 300884804bf9ac3fba7c30a04d8adf52e3dd2e3e..b28995ecfd7f45e6b6197be96c418aa0
flag1 = PlayerChunkMap.b(chunkcoordintpair, entityplayer, false) <= PlayerChunkMap.this.viewDistance;
}
}
-@@ -2507,7 +2584,7 @@ Sections go from 0..16. Now whenever a section is not empty, it can potentially
+@@ -2515,7 +2592,7 @@ Sections go from 0..16. Now whenever a section is not empty, it can potentially
int j = entity.getEntityType().getChunkRange() * 16;
j = org.spigotmc.TrackingRange.getEntityTrackingRange(entity, j); // Paper
@@ -14043,7 +14042,7 @@ index 3c804c7b20a14ea6e510810e2be10c1cc89ff5c1..3738c51b5e673c439d88a7ef7f4614f3
return new TicketType<>(s, comparator, 0L);
}
diff --git a/src/main/java/net/minecraft/server/level/WorldServer.java b/src/main/java/net/minecraft/server/level/WorldServer.java
-index 47fbb8df04b2b77e10314666e87eaef621cffb3b..58e61aa19d71011c40c69a691f5644b3e823ad68 100644
+index 7e032845fe9a46d33236444d62405a41e29daa17..a8a2c29874e95dc08b85eb41882fc947108fbe5b 100644
--- a/src/main/java/net/minecraft/server/level/WorldServer.java
+++ b/src/main/java/net/minecraft/server/level/WorldServer.java
@@ -168,12 +168,13 @@ import org.bukkit.event.server.MapInitializeEvent;
@@ -14786,11 +14785,11 @@ index 47fbb8df04b2b77e10314666e87eaef621cffb3b..58e61aa19d71011c40c69a691f5644b3
+ }
+ chunk.a(entity);
+ // Tuinity end - gotta be careful here, sync load can teleport entity.
- }
++ }
+ // Tuinity start
+ if (entity.inChunk && (oldRegionX != newRegionX || oldRegionZ != newRegionZ)) {
+ this.addNavigatorsIfPathingToRegion(entity);
-+ }
+ }
+ // Tuinity end
}
@@ -14962,7 +14961,7 @@ index 47fbb8df04b2b77e10314666e87eaef621cffb3b..58e61aa19d71011c40c69a691f5644b3
throw (IllegalStateException) SystemUtils.c((Throwable) (new IllegalStateException("Removing entity while ticking!")));
} else {
this.removeEntityFromChunk(entity);
-@@ -1684,20 +2304,33 @@ public class WorldServer extends World implements GeneratorAccessSeed {
+@@ -1683,20 +2303,33 @@ public class WorldServer extends World implements GeneratorAccessSeed {
@Override
public void notify(BlockPosition blockposition, IBlockData iblockdata, IBlockData iblockdata1, int i) {
@@ -14998,7 +14997,7 @@ index 47fbb8df04b2b77e10314666e87eaef621cffb3b..58e61aa19d71011c40c69a691f5644b3
} catch (java.util.ConcurrentModificationException ex) {
// This can happen because the pathfinder update below may trigger a chunk load, which in turn may cause more navigators to register
// In this case we just run the update again across all the iterators as the chunk will then be loaded
-@@ -1711,6 +2344,9 @@ public class WorldServer extends World implements GeneratorAccessSeed {
+@@ -1710,6 +2343,9 @@ public class WorldServer extends World implements GeneratorAccessSeed {
navigationabstract.b(blockposition);
}
}
@@ -15008,21 +15007,8 @@ index 47fbb8df04b2b77e10314666e87eaef621cffb3b..58e61aa19d71011c40c69a691f5644b3
this.tickingEntities = wasTicking; // Paper
}
-@@ -2072,8 +2708,11 @@ public class WorldServer extends World implements GeneratorAccessSeed {
- Optional optional = VillagePlaceType.b(iblockdata);
- Optional optional1 = VillagePlaceType.b(iblockdata1);
-
-+ // Paper start
-+ // Tuinity - oh god not for each block set
- if (!Objects.equals(optional, optional1)) {
-- BlockPosition blockposition1 = blockposition.immutableCopy();
-+ BlockPosition blockposition1 = blockposition.immutableCopy(); // Tuinity - oh god not for each block set
-+ // Paper end
-
- optional.ifPresent((villageplacetype) -> {
- this.getMinecraftServer().execute(() -> {
diff --git a/src/main/java/net/minecraft/server/network/LoginListener.java b/src/main/java/net/minecraft/server/network/LoginListener.java
-index c67b94840e4c967baebf6eb351df15f0e4ead4be..ed836462123efc6903e406fa926e55e1cedddb95 100644
+index f54af7cabc6b4e062948dc97e577e7fe04b5add4..4e28b58731c7e76a727ed8f0967150f8fe22ab66 100644
--- a/src/main/java/net/minecraft/server/network/LoginListener.java
+++ b/src/main/java/net/minecraft/server/network/LoginListener.java
@@ -256,7 +256,7 @@ public class LoginListener implements PacketLoginInListener {
@@ -15035,7 +15021,7 @@ index c67b94840e4c967baebf6eb351df15f0e4ead4be..ed836462123efc6903e406fa926e55e1
throw new IllegalStateException("Protocol error", cryptographyexception);
}
diff --git a/src/main/java/net/minecraft/server/network/PlayerConnection.java b/src/main/java/net/minecraft/server/network/PlayerConnection.java
-index b543776da3b799643893984a8c6f29477ed78d4a..159c38618d7745ea513ad179b1217d76c2c4897a 100644
+index 8c9e97bb093c0e6297397edc71d72deebbcfbed9..e0c606bb6ecf23f2118a65775c05b437a09826d3 100644
--- a/src/main/java/net/minecraft/server/network/PlayerConnection.java
+++ b/src/main/java/net/minecraft/server/network/PlayerConnection.java
@@ -542,6 +542,12 @@ public class PlayerConnection implements PacketListenerPlayIn {
@@ -15145,7 +15131,7 @@ index b543776da3b799643893984a8c6f29477ed78d4a..159c38618d7745ea513ad179b1217d76
}
@Override
-@@ -1219,7 +1263,7 @@ public class PlayerConnection implements PacketListenerPlayIn {
+@@ -1224,7 +1268,7 @@ public class PlayerConnection implements PacketListenerPlayIn {
}
if (this.teleportPos != null) {
@@ -15154,7 +15140,7 @@ index b543776da3b799643893984a8c6f29477ed78d4a..159c38618d7745ea513ad179b1217d76
this.A = this.e;
this.a(this.teleportPos.x, this.teleportPos.y, this.teleportPos.z, this.player.yaw, this.player.pitch);
}
-@@ -1257,6 +1301,12 @@ public class PlayerConnection implements PacketListenerPlayIn {
+@@ -1262,6 +1306,12 @@ public class PlayerConnection implements PacketListenerPlayIn {
double currDeltaZ = toZ - prevZ;
double d11 = Math.max(d7 * d7 + d8 * d8 + d9 * d9, (currDeltaX * currDeltaX + currDeltaY * currDeltaY + currDeltaZ * currDeltaZ) - 1);
// Paper end - fix large move vectors killing the server
@@ -15167,7 +15153,7 @@ index b543776da3b799643893984a8c6f29477ed78d4a..159c38618d7745ea513ad179b1217d76
if (this.player.isSleeping()) {
if (d11 > 1.0D) {
-@@ -1289,7 +1339,7 @@ public class PlayerConnection implements PacketListenerPlayIn {
+@@ -1294,7 +1344,7 @@ public class PlayerConnection implements PacketListenerPlayIn {
speed = player.abilities.walkSpeed * 10f;
}
// Paper start - Prevent moving into unloaded chunks
@@ -15176,7 +15162,7 @@ index b543776da3b799643893984a8c6f29477ed78d4a..159c38618d7745ea513ad179b1217d76
this.internalTeleport(this.player.locX(), this.player.locY(), this.player.locZ(), this.player.yaw, this.player.pitch, Collections.emptySet());
return;
}
-@@ -1306,11 +1356,11 @@ public class PlayerConnection implements PacketListenerPlayIn {
+@@ -1311,11 +1361,11 @@ public class PlayerConnection implements PacketListenerPlayIn {
}
}
@@ -15192,7 +15178,7 @@ index b543776da3b799643893984a8c6f29477ed78d4a..159c38618d7745ea513ad179b1217d76
boolean flag = d8 > 0.0D;
if (this.player.isOnGround() && !packetplayinflying.b() && flag) {
-@@ -1345,6 +1395,7 @@ public class PlayerConnection implements PacketListenerPlayIn {
+@@ -1350,6 +1400,7 @@ public class PlayerConnection implements PacketListenerPlayIn {
}
this.player.move(EnumMoveType.PLAYER, new Vec3D(d7, d8, d9));
@@ -15200,7 +15186,7 @@ index b543776da3b799643893984a8c6f29477ed78d4a..159c38618d7745ea513ad179b1217d76
this.player.setOnGround(packetplayinflying.b()); // CraftBukkit - SPIGOT-5810, SPIGOT-5835: reset by this.player.move
// Paper start - prevent position desync
if (this.teleportPos != null) {
-@@ -1364,12 +1415,23 @@ public class PlayerConnection implements PacketListenerPlayIn {
+@@ -1369,12 +1420,23 @@ public class PlayerConnection implements PacketListenerPlayIn {
boolean flag1 = false;
if (!this.player.H() && d11 > org.spigotmc.SpigotConfig.movedWronglyThreshold && !this.player.isSleeping() && !this.player.playerInteractManager.isCreative() && this.player.playerInteractManager.getGameMode() != EnumGamemode.SPECTATOR) { // Spigot
@@ -15226,7 +15212,7 @@ index b543776da3b799643893984a8c6f29477ed78d4a..159c38618d7745ea513ad179b1217d76
this.a(d0, d1, d2, f, f1);
} else {
// CraftBukkit start - fire PlayerMoveEvent
-@@ -1456,6 +1518,26 @@ public class PlayerConnection implements PacketListenerPlayIn {
+@@ -1461,6 +1523,26 @@ public class PlayerConnection implements PacketListenerPlayIn {
}
}
@@ -15254,7 +15240,7 @@ index b543776da3b799643893984a8c6f29477ed78d4a..159c38618d7745ea513ad179b1217d76
Stream stream = iworldreader.d(this.player, this.player.getBoundingBox().shrink(9.999999747378752E-6D), (entity) -> {
return true;
diff --git a/src/main/java/net/minecraft/server/network/ServerConnection.java b/src/main/java/net/minecraft/server/network/ServerConnection.java
-index dc362724ea0cc1b2f9d9ceffff483217b4356c40..70fde7bad2e0a6d7432d8509fdb7c46d9f020d4c 100644
+index 69fc2789df88344587b6052f93661ed38f24a503..92836f1200461ba7fff2f8bcb5e1755ec9a0c9ce 100644
--- a/src/main/java/net/minecraft/server/network/ServerConnection.java
+++ b/src/main/java/net/minecraft/server/network/ServerConnection.java
@@ -87,6 +87,11 @@ public class ServerConnection {
@@ -15270,7 +15256,7 @@ index dc362724ea0cc1b2f9d9ceffff483217b4356c40..70fde7bad2e0a6d7432d8509fdb7c46d
protected void initChannel(Channel channel) throws Exception {
try {
diff --git a/src/main/java/net/minecraft/server/players/PlayerList.java b/src/main/java/net/minecraft/server/players/PlayerList.java
-index f8f0212497ad4fbb1273820a06a4ae6721053b8e..c705bf1e651a764d56b87ebc5a86a938d8bd34bb 100644
+index aaa6f3aeaf1b47275a1c8fc22ee99475e62c32a0..76ba1e038fb68eafa2c2039fa1cdd74d060dcf9f 100644
--- a/src/main/java/net/minecraft/server/players/PlayerList.java
+++ b/src/main/java/net/minecraft/server/players/PlayerList.java
@@ -179,6 +179,7 @@ public abstract class PlayerList {
@@ -15299,7 +15285,7 @@ index f8f0212497ad4fbb1273820a06a4ae6721053b8e..c705bf1e651a764d56b87ebc5a86a938
Player player = entity.getBukkitEntity();
PlayerLoginEvent event = new PlayerLoginEvent(player, hostname, ((java.net.InetSocketAddress) socketaddress).getAddress(), ((java.net.InetSocketAddress) loginlistener.networkManager.getRawAddress()).getAddress());
-@@ -945,13 +946,13 @@ public abstract class PlayerList {
+@@ -951,13 +952,13 @@ public abstract class PlayerList {
worldserver1.getChunkProvider().addTicket(TicketType.POST_TELEPORT, new ChunkCoordIntPair(location.getBlockX() >> 4, location.getBlockZ() >> 4), 1, entityplayer.getId()); // Paper
entityplayer1.forceCheckHighPriority(); // Player
@@ -15315,7 +15301,7 @@ index f8f0212497ad4fbb1273820a06a4ae6721053b8e..c705bf1e651a764d56b87ebc5a86a938
entityplayer1.spawnIn(worldserver1);
entityplayer1.dead = false;
entityplayer1.playerConnection.teleport(new Location(worldserver1.getWorld(), entityplayer1.locX(), entityplayer1.locY(), entityplayer1.locZ(), entityplayer1.yaw, entityplayer1.pitch));
-@@ -1220,7 +1221,7 @@ public abstract class PlayerList {
+@@ -1226,7 +1227,7 @@ public abstract class PlayerList {
// Really shouldn't happen...
backingSet = world != null ? world.players.toArray() : players.toArray();
} else {
@@ -15325,7 +15311,7 @@ index f8f0212497ad4fbb1273820a06a4ae6721053b8e..c705bf1e651a764d56b87ebc5a86a938
return;
}
diff --git a/src/main/java/net/minecraft/server/players/UserCache.java b/src/main/java/net/minecraft/server/players/UserCache.java
-index e813d4dd1a46734d16b42905808caa889811afcc..ee5c038c4ede294ec5b9b9b9f705ba46b6c7ac8c 100644
+index c617b7dd5a992770fc87113987807947ae68be81..7ce5bd130441a3bc32ee5fa3630edce23dadd0b8 100644
--- a/src/main/java/net/minecraft/server/players/UserCache.java
+++ b/src/main/java/net/minecraft/server/players/UserCache.java
@@ -52,6 +52,11 @@ public class UserCache {
@@ -15356,7 +15342,7 @@ index e813d4dd1a46734d16b42905808caa889811afcc..ee5c038c4ede294ec5b9b9b9f705ba46
}
-@@ -110,7 +117,7 @@ public class UserCache {
+@@ -111,7 +118,7 @@ public class UserCache {
}
public void saveProfile(GameProfile gameprofile) { a(gameprofile); } // Paper - OBFHELPER
@@ -15365,7 +15351,7 @@ index e813d4dd1a46734d16b42905808caa889811afcc..ee5c038c4ede294ec5b9b9b9f705ba46
Calendar calendar = Calendar.getInstance();
calendar.setTime(new Date());
-@@ -127,8 +134,9 @@ public class UserCache {
+@@ -128,8 +135,9 @@ public class UserCache {
}
@Nullable
@@ -15376,7 +15362,7 @@ index e813d4dd1a46734d16b42905808caa889811afcc..ee5c038c4ede294ec5b9b9b9f705ba46
UserCache.UserCacheEntry usercache_usercacheentry = (UserCache.UserCacheEntry) this.c.get(s1);
boolean flag = false;
-@@ -142,10 +150,14 @@ public class UserCache {
+@@ -143,10 +151,14 @@ public class UserCache {
GameProfile gameprofile;
if (usercache_usercacheentry != null) {
@@ -15391,7 +15377,7 @@ index e813d4dd1a46734d16b42905808caa889811afcc..ee5c038c4ede294ec5b9b9b9f705ba46
if (gameprofile != null) {
this.a(gameprofile);
flag = false;
-@@ -157,6 +169,7 @@ public class UserCache {
+@@ -158,6 +170,7 @@ public class UserCache {
}
return gameprofile;
@@ -15399,7 +15385,7 @@ index e813d4dd1a46734d16b42905808caa889811afcc..ee5c038c4ede294ec5b9b9b9f705ba46
}
// Paper start
-@@ -291,7 +304,9 @@ public class UserCache {
+@@ -292,7 +305,9 @@ public class UserCache {
}
private Stream a(int i) {
@@ -16822,20 +16808,10 @@ index c39c50e53549e9cb9d3520bc7e8b7e89cfa20163..5bce47fa8f191bc1d33c04c9865cb0ef
public void closeInventory() {
this.activeContainer = this.defaultContainer;
diff --git a/src/main/java/net/minecraft/world/entity/projectile/EntityArrow.java b/src/main/java/net/minecraft/world/entity/projectile/EntityArrow.java
-index 2f8b3587f527620152609d5be342b328a7621e0f..e440d26c920c4efddf958c61bfdfa508273062cc 100644
+index b0e8e9934edbb0cf7ac063e4903452be526afbc7..42c1a7e8d51868c74e92d97f1df8d36fcaab6252 100644
--- a/src/main/java/net/minecraft/world/entity/projectile/EntityArrow.java
+++ b/src/main/java/net/minecraft/world/entity/projectile/EntityArrow.java
-@@ -211,7 +211,9 @@ public abstract class EntityArrow extends IProjectile {
- // Paper end
-
- if (object != null && !flag) {
-+ if (org.bukkit.craftbukkit.event.CraftEventFactory.callProjectileHitEvent(this, (MovingObjectPosition) object)) { // CraftBukkit - Call event // Paper - make cancellable // Tuinity - implement cancellation properly
- this.a((MovingObjectPosition) object);
-+ } // Tuinity - implement cancellation properly
- this.impulse = true;
- }
-
-@@ -545,7 +547,8 @@ public abstract class EntityArrow extends IProjectile {
+@@ -545,7 +545,8 @@ public abstract class EntityArrow extends IProjectile {
}
itemstack = item.getItemStack();
}
@@ -16845,101 +16821,6 @@ index 2f8b3587f527620152609d5be342b328a7621e0f..e440d26c920c4efddf958c61bfdfa508
if (this.fromPlayer == EntityArrow.PickupStatus.ALLOWED && !entityhuman.inventory.pickup(itemstack)) {
// CraftBukkit end
-diff --git a/src/main/java/net/minecraft/world/entity/projectile/EntityFireball.java b/src/main/java/net/minecraft/world/entity/projectile/EntityFireball.java
-index b9680f6f2e30ec9397d6a9c83e79563d9253aff6..546de0ec2b624a781480ac95f65b2cbfbb5dcf2e 100644
---- a/src/main/java/net/minecraft/world/entity/projectile/EntityFireball.java
-+++ b/src/main/java/net/minecraft/world/entity/projectile/EntityFireball.java
-@@ -83,7 +83,9 @@ public abstract class EntityFireball extends IProjectile {
- // Paper end
-
- if (movingobjectposition != null && movingobjectposition.getType() != MovingObjectPosition.EnumMovingObjectType.MISS) { // Paper - add null check in case cancelled
-+ if (org.bukkit.craftbukkit.event.CraftEventFactory.callProjectileHitEvent(this, movingobjectposition)) { // CraftBukkit - Call event // Paper - make cancellable // Tuinity - implement cancellation properly
- this.a(movingobjectposition);
-+ } // Tuinity - implement cancellation properly
-
- // CraftBukkit start - Fire ProjectileHitEvent
- if (this.dead) {
-diff --git a/src/main/java/net/minecraft/world/entity/projectile/EntityFireworks.java b/src/main/java/net/minecraft/world/entity/projectile/EntityFireworks.java
-index 9cc59439ae2c4e758c44b2a92b78bc328efdfa1b..f9a355c847d778a9aad1987882fc816af92450ba 100644
---- a/src/main/java/net/minecraft/world/entity/projectile/EntityFireworks.java
-+++ b/src/main/java/net/minecraft/world/entity/projectile/EntityFireworks.java
-@@ -149,7 +149,9 @@ public class EntityFireworks extends IProjectile {
- MovingObjectPosition movingobjectposition = ProjectileHelper.a((Entity) this, this::a);
-
- if (!this.noclip) {
-+ if (org.bukkit.craftbukkit.event.CraftEventFactory.callProjectileHitEvent(this, movingobjectposition)) { // CraftBukkit - Call event // Paper - make cancellable // Tuinity - implement cancellation properly
- this.a(movingobjectposition);
-+ } // Tuinity - implement cancellation properly
- this.impulse = true;
- }
-
-diff --git a/src/main/java/net/minecraft/world/entity/projectile/EntityFishingHook.java b/src/main/java/net/minecraft/world/entity/projectile/EntityFishingHook.java
-index addea9c1309a308b76c93ee71e839c915bc773e8..dc6d279766ccc83a8f450028a09491b1c88f524c 100644
---- a/src/main/java/net/minecraft/world/entity/projectile/EntityFishingHook.java
-+++ b/src/main/java/net/minecraft/world/entity/projectile/EntityFishingHook.java
-@@ -265,7 +265,9 @@ public class EntityFishingHook extends IProjectile {
- private void m() {
- MovingObjectPosition movingobjectposition = ProjectileHelper.a((Entity) this, this::a);
-
-+ if (org.bukkit.craftbukkit.event.CraftEventFactory.callProjectileHitEvent(this, movingobjectposition)) { // CraftBukkit - Call event // Paper - make cancellable // Tuinity - implement cancellation properly
- this.a(movingobjectposition);
-+ } // Tuinity - implement cancellation properly
- }
-
- @Override
-diff --git a/src/main/java/net/minecraft/world/entity/projectile/EntityLlamaSpit.java b/src/main/java/net/minecraft/world/entity/projectile/EntityLlamaSpit.java
-index 39b34e619cf7ac3ad308f98551c796ac47073484..8aef834a6e8fcf5d44986745affb8f27bc3dfd6b 100644
---- a/src/main/java/net/minecraft/world/entity/projectile/EntityLlamaSpit.java
-+++ b/src/main/java/net/minecraft/world/entity/projectile/EntityLlamaSpit.java
-@@ -34,7 +34,9 @@ public class EntityLlamaSpit extends IProjectile {
- MovingObjectPosition movingobjectposition = ProjectileHelper.a((Entity) this, this::a);
-
- if (movingobjectposition != null) {
-+ if (org.bukkit.craftbukkit.event.CraftEventFactory.callProjectileHitEvent(this, movingobjectposition)) { // CraftBukkit - Call event // Paper - make cancellable // Tuinity - implement cancellation properly
- this.a(movingobjectposition);
-+ } // Tuinity - implement cancellation properly
- }
-
- double d0 = this.locX() + vec3d.x;
-diff --git a/src/main/java/net/minecraft/world/entity/projectile/EntityProjectile.java b/src/main/java/net/minecraft/world/entity/projectile/EntityProjectile.java
-index 3b379e83b79bd9b46dbdd4a48ac3842abc4dfbb8..e55061b6c04b4bde92404a6ef58ba9a52cd99c1d 100644
---- a/src/main/java/net/minecraft/world/entity/projectile/EntityProjectile.java
-+++ b/src/main/java/net/minecraft/world/entity/projectile/EntityProjectile.java
-@@ -65,7 +65,7 @@ public abstract class EntityProjectile extends IProjectile {
- movingobjectposition = null;
- }
- }
-- if (movingobjectposition != null) {
-+ if (movingobjectposition != null && org.bukkit.craftbukkit.event.CraftEventFactory.callProjectileHitEvent(this, movingobjectposition)) { // Tuinity - implement cancellation properly
- // Paper end
- this.a(movingobjectposition);
- } // Paper
-diff --git a/src/main/java/net/minecraft/world/entity/projectile/EntityShulkerBullet.java b/src/main/java/net/minecraft/world/entity/projectile/EntityShulkerBullet.java
-index c3dcebad0706386e52ef2d28f2074cb6aed9f9e4..1ae528ccd09a6536b3aac320e6218f03c274d6a9 100644
---- a/src/main/java/net/minecraft/world/entity/projectile/EntityShulkerBullet.java
-+++ b/src/main/java/net/minecraft/world/entity/projectile/EntityShulkerBullet.java
-@@ -230,7 +230,7 @@ public class EntityShulkerBullet extends IProjectile {
-
- MovingObjectPosition movingobjectposition = ProjectileHelper.a((Entity) this, this::a);
-
-- if (movingobjectposition.getType() != MovingObjectPosition.EnumMovingObjectType.MISS) {
-+ if (movingobjectposition.getType() != MovingObjectPosition.EnumMovingObjectType.MISS && org.bukkit.craftbukkit.event.CraftEventFactory.callProjectileHitEvent(this, movingobjectposition)) { // Tuinity - implement cancellation properly
- this.a(movingobjectposition);
- }
- }
-diff --git a/src/main/java/net/minecraft/world/entity/projectile/IProjectile.java b/src/main/java/net/minecraft/world/entity/projectile/IProjectile.java
-index 9f2e7d345d98f50e6d47cbf4bb35714852fa42da..2e2e4ee98619cfbeaecffa1ebae78ccc1d7666ca 100644
---- a/src/main/java/net/minecraft/world/entity/projectile/IProjectile.java
-+++ b/src/main/java/net/minecraft/world/entity/projectile/IProjectile.java
-@@ -130,7 +130,7 @@ public abstract class IProjectile extends Entity {
- }
-
- protected void a(MovingObjectPosition movingobjectposition) {
-- if (!org.bukkit.craftbukkit.event.CraftEventFactory.callProjectileHitEvent(this, movingobjectposition)) return; // CraftBukkit - Call event // Paper - make cancellable
-+ // Tuinity - proper cancellation requires moving this into the caller (see method overrides) - TODO this unfortunately means we need to manually inspect each call on update
- MovingObjectPosition.EnumMovingObjectType movingobjectposition_enummovingobjecttype = movingobjectposition.getType();
-
- if (movingobjectposition_enummovingobjecttype == MovingObjectPosition.EnumMovingObjectType.ENTITY) {
diff --git a/src/main/java/net/minecraft/world/item/ItemEnderEye.java b/src/main/java/net/minecraft/world/item/ItemEnderEye.java
index f74685a7cdb905af8e9712ca8597e7ed3dc8b120..feedbd8c97c1b1c56eaff359e6a940696d416906 100644
--- a/src/main/java/net/minecraft/world/item/ItemEnderEye.java
@@ -17750,7 +17631,7 @@ index 15096a9c2719b8b4c099f62d0a1c808e56b63a8e..9bbd175f7e20591bbefdbddcb5e998e7
}
}
diff --git a/src/main/java/net/minecraft/world/level/block/state/BlockBase.java b/src/main/java/net/minecraft/world/level/block/state/BlockBase.java
-index 3fdafc0ff0c4148ec844dbdc1455d17cdcb4a75a..6124b56d935386784371422960a07d518f848cf3 100644
+index 0d26250887f80d0c250bcd6bc7de303362427d3e..1d82f719440c95765c01a588f4785d630b8b527a 100644
--- a/src/main/java/net/minecraft/world/level/block/state/BlockBase.java
+++ b/src/main/java/net/minecraft/world/level/block/state/BlockBase.java
@@ -348,21 +348,23 @@ public abstract class BlockBase {
@@ -17875,7 +17756,7 @@ index 3fdafc0ff0c4148ec844dbdc1455d17cdcb4a75a..6124b56d935386784371422960a07d51
}
public final boolean e() { // Paper
-@@ -728,9 +784,9 @@ public abstract class BlockBase {
+@@ -729,9 +785,9 @@ public abstract class BlockBase {
private static final int f = EnumBlockSupport.values().length;
protected final boolean a;
private final boolean g;
@@ -18727,7 +18608,7 @@ index 0fec15e141051863dbf51a2b3e1ace5028cd2fc1..d7757e60402be9939fc2d90ad79b2bb7
public String toString() {
diff --git a/src/main/java/net/minecraft/world/level/chunk/ProtoChunk.java b/src/main/java/net/minecraft/world/level/chunk/ProtoChunk.java
-index 7bfac4e852c4a6697435647dab173913df6034e9..c90f530b9cf556da950d8f61156159941815bd99 100644
+index 7bfac4e852c4a6697435647dab173913df6034e9..1658f0bb379653c205d08c771a7c23242d50f66d 100644
--- a/src/main/java/net/minecraft/world/level/chunk/ProtoChunk.java
+++ b/src/main/java/net/minecraft/world/level/chunk/ProtoChunk.java
@@ -54,7 +54,7 @@ public class ProtoChunk implements IChunkAccess {
@@ -18739,7 +18620,7 @@ index 7bfac4e852c4a6697435647dab173913df6034e9..c90f530b9cf556da950d8f6115615994
private final ShortList[] m;
private final Map, StructureStart>> n;
private final Map, LongSet> o;
-@@ -66,6 +66,73 @@ public class ProtoChunk implements IChunkAccess {
+@@ -66,6 +66,53 @@ public class ProtoChunk implements IChunkAccess {
private volatile boolean u;
final World world; // Paper - Anti-Xray - Add world // Paper - private -> default
@@ -18788,55 +18669,17 @@ index 7bfac4e852c4a6697435647dab173913df6034e9..c90f530b9cf556da950d8f6115615994
+ public void setBlockEmptinessMap(boolean[] emptinessMap) {
+ this.blockEmptinessMap = emptinessMap;
+ }
-+
-+ private void checkLightSourceLock() {
-+ if (!this.lightSourcesLocked.get()) {
-+ return;
-+ }
-+
-+ IllegalStateException thr = new IllegalStateException("Concurrent access of light sources by thread '" + Thread.currentThread().getName() + "'");
-+ LOGGER.fatal(thr.getMessage(), thr);
-+ throw thr;
-+ }
-+
-+ public void lockLightSources() {
-+ if (this.lightSourcesLocked.getAndSet(true)) {
-+ throw new IllegalStateException("Light sources is already locked!");
-+ }
-+ }
-+
-+ public void releaseLightSources() {
-+ this.lightSourcesLocked.set(false);
-+ }
+ // Tuinity end - rewrite light engine
+
// Paper start - Anti-Xray - Add world
@Deprecated public ProtoChunk(ChunkCoordIntPair chunkcoordintpair, ChunkConverter chunkconverter) { this(chunkcoordintpair, chunkconverter, null); } // Notice for updates: Please make sure this constructor isn't used anywhere
public ProtoChunk(ChunkCoordIntPair chunkcoordintpair, ChunkConverter chunkconverter, World world) {
-@@ -170,7 +237,9 @@ public class ProtoChunk implements IChunkAccess {
- }
-
- public void k(BlockPosition blockposition) {
-+ this.checkLightSourceLock(); // Tuinity - make sure we don't access this concurrently
- this.l.add(blockposition.immutableCopy());
-+ this.checkLightSourceLock(); // Tuinity - make sure we don't access this concurrently
- }
-
- @Nullable
-@@ -185,26 +254,25 @@ public class ProtoChunk implements IChunkAccess {
- return iblockdata;
- } else {
- if (iblockdata.f() > 0) {
-+ this.checkLightSourceLock(); // Tuinity - make sure we don't access this concurrently
- this.l.add(new BlockPosition((i & 15) + this.getPos().d(), j, (k & 15) + this.getPos().e()));
-+ this.checkLightSourceLock(); // Tuinity - make sure we don't access this concurrently
- }
-
+@@ -191,20 +238,17 @@ public class ProtoChunk implements IChunkAccess {
ChunkSection chunksection = this.a(j >> 4);
IBlockData iblockdata1 = chunksection.setType(i & 15, j & 15, k & 15, iblockdata);
- if (this.g.b(ChunkStatus.FEATURES) && iblockdata != iblockdata1 && (iblockdata.b((IBlockAccess) this, blockposition) != iblockdata1.b((IBlockAccess) this, blockposition) || iblockdata.f() != iblockdata1.f() || iblockdata.e() || iblockdata1.e())) {
-+ if ((com.tuinity.tuinity.config.TuinityConfig.useNewLightEngine ? (this.g.b(ChunkStatus.LIGHT) && this.isLit()) : (this.g.b(ChunkStatus.FEATURES))) && iblockdata != iblockdata1 && (iblockdata.b((IBlockAccess) this, blockposition) != iblockdata1.b((IBlockAccess) this, blockposition) || iblockdata.f() != iblockdata1.f() || iblockdata.e() || iblockdata1.e())) { // Tuinity - move block updates to only happen after lighting occurs
++ if ((com.tuinity.tuinity.config.TuinityConfig.useNewLightEngine ? (this.g.b(ChunkStatus.LIGHT)) : (this.g.b(ChunkStatus.FEATURES))) && iblockdata != iblockdata1 && (iblockdata.b((IBlockAccess) this, blockposition) != iblockdata1.b((IBlockAccess) this, blockposition) || iblockdata.f() != iblockdata1.f() || iblockdata.e() || iblockdata1.e())) { // Tuinity - move block updates to only happen after lighting occurs (or during, thanks chunk system)
LightEngine lightengine = this.e();
lightengine.a(blockposition);
@@ -18846,17 +18689,17 @@ index 7bfac4e852c4a6697435647dab173913df6034e9..c90f530b9cf556da950d8f6115615994
+ HeightMap.Type[] enumset = this.getChunkStatus().heightMaps; // Tuinity - reduce iterator creation
EnumSet enumset1 = null;
- Iterator iterator = enumset.iterator();
+-
+- HeightMap.Type heightmap_type;
+ // Tuinity - reduce iterator creation
-- HeightMap.Type heightmap_type;
--
- while (iterator.hasNext()) {
- heightmap_type = (HeightMap.Type) iterator.next();
+ for (HeightMap.Type heightmap_type : enumset) { // Tuinity - reduce iterator creation
HeightMap heightmap = (HeightMap) this.f.get(heightmap_type);
if (heightmap == null) {
-@@ -220,10 +288,9 @@ public class ProtoChunk implements IChunkAccess {
+@@ -220,10 +264,9 @@ public class ProtoChunk implements IChunkAccess {
HeightMap.a(this, enumset1);
}
@@ -20820,7 +20663,7 @@ index e50731723d266ba65b2163df2e935afb8b013a93..a6736d15282715d920bab85eb92074cd
}
value.append("},");
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
-index 03b8d67a5f0088c0254b2099f27e8dcae32a6221..fd3333fef4112e6469ccd316ba2c82926c04e5db 100644
+index 6cc8eb04f42592aa12f76bb4a0a863ea509741b2..55f2834373ccc7362836b4fab4ae2f069f31fd63 100644
--- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java
+++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
@@ -232,7 +232,7 @@ import javax.annotation.Nullable; // Paper
@@ -20848,7 +20691,7 @@ index 03b8d67a5f0088c0254b2099f27e8dcae32a6221..fd3333fef4112e6469ccd316ba2c8292
}
Plugin[] pluginClone = pluginManager.getPlugins().clone(); // Paper
-@@ -1910,7 +1912,10 @@ public final class CraftServer implements Server {
+@@ -1917,7 +1919,10 @@ public final class CraftServer implements Server {
@Override
public boolean isPrimaryThread() {
@@ -20860,7 +20703,7 @@ index 03b8d67a5f0088c0254b2099f27e8dcae32a6221..fd3333fef4112e6469ccd316ba2c8292
}
// Paper start
-@@ -2344,6 +2349,14 @@ public final class CraftServer implements Server {
+@@ -2351,6 +2356,14 @@ public final class CraftServer implements Server {
return com.destroystokyo.paper.PaperConfig.config;
}
@@ -21125,10 +20968,10 @@ index 295ffab08672d77d88aca368cb5b56f80bc4f1b5..dee4d12a49468d38f077784b219199f0
@Override
public boolean teleport(Location location) {
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
-index e5549439b3d4d608cf37dd33b6c8c9e10dfe9328..45e786565ac988abadffda2e7ba3ff1e2880b786 100644
+index f150ba393bc62e52840e6ebbf3d7696b670ff7e4..51d68fc13fcb8c30c10e21063f4d658f403df8ce 100644
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
-@@ -2257,15 +2257,70 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
+@@ -2262,15 +2262,70 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
}
}
diff --git a/patches/server/0002-Airplane-Server-Changes.patch b/patches/server/0002-Airplane-Server-Changes.patch
index d08455cb93..388ffa7a54 100644
--- a/patches/server/0002-Airplane-Server-Changes.patch
+++ b/patches/server/0002-Airplane-Server-Changes.patch
@@ -1613,10 +1613,10 @@ index 7918d830a4aef09c9f517284e83a9376299116ad..0a40df2151bd388b6633a6f50b14f1f4
return enumdirection;
}));
diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java
-index 2767a9369ddc922f1d9c7cb6c7acc8270545535a..2bb00a42492b08036e984d3e1d9a564d4b4226c2 100644
+index 8adbb9a77ff304f14ad3defa0f4f7ec25b0d2a2a..dd0daf3138a38d0c8a399e6cb54bbc58af47f710 100644
--- a/src/main/java/net/minecraft/server/MinecraftServer.java
+++ b/src/main/java/net/minecraft/server/MinecraftServer.java
-@@ -1646,7 +1646,7 @@ public abstract class MinecraftServer extends IAsyncTaskHandlerReentrant
-Date: Fri, 12 Feb 2021 16:29:41 -0600
-Subject: [PATCH] Multithreaded entity tracking
-
-Adds a configuration option to run the tracker on multiple threads.
-This will generally be faster than the single threaded approach,
-unless you don't have a lot of entities/players.
-
-Airplane
-Copyright (C) 2020 Technove LLC
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program. If not, see .
-
-diff --git a/src/main/java/com/tuinity/tuinity/util/maplist/IteratorSafeOrderedReferenceSet.java b/src/main/java/com/tuinity/tuinity/util/maplist/IteratorSafeOrderedReferenceSet.java
-index be408aebbccbda46e8aa82ef337574137cfa0096..739839314fd8a88b5fca8b9678e1df07a166c35d 100644
---- a/src/main/java/com/tuinity/tuinity/util/maplist/IteratorSafeOrderedReferenceSet.java
-+++ b/src/main/java/com/tuinity/tuinity/util/maplist/IteratorSafeOrderedReferenceSet.java
-@@ -16,11 +16,11 @@ public final class IteratorSafeOrderedReferenceSet {
-
- /* list impl */
- protected E[] listElements;
-- protected int listSize;
-+ protected int listSize; public int getListSize() { return this.listSize; } // Airplane - getter
-
- protected final double maxFragFactor;
-
-- protected int iteratorCount;
-+ public int iteratorCount; // Airplane - public for debug
-
- private final boolean threadRestricted;
-
-diff --git a/src/main/java/gg/airplane/AirplaneConfig.java b/src/main/java/gg/airplane/AirplaneConfig.java
-index 65adf3ceda012c8cfdea675c40e2bb27d34ebac7..bb87d8792fa6f4b888dd562d63353fe90d2bc588 100644
---- a/src/main/java/gg/airplane/AirplaneConfig.java
-+++ b/src/main/java/gg/airplane/AirplaneConfig.java
-@@ -120,4 +120,17 @@ public class AirplaneConfig {
- }
-
-
-+ public static boolean multithreadedEntityTracker = false;
-+ public static boolean entityTrackerAsyncPackets = false;
-+
-+ private static void entityTracker() {
-+ config.setComment("tracker", "Options to improve the performance of the entity tracker");
-+
-+ multithreadedEntityTracker = config.getBoolean("tracker.multithreaded", multithreadedEntityTracker,
-+ "This enables the multithreading of the tracker.");
-+ entityTrackerAsyncPackets = config.getBoolean("tracker.unsafe-async-packets", entityTrackerAsyncPackets,
-+ "This option can break plugins that assume packets from the",
-+ "entity tracker will be sent sync.");
-+ }
-+
- }
-diff --git a/src/main/java/gg/airplane/commands/AirplaneCommands.java b/src/main/java/gg/airplane/commands/AirplaneCommands.java
-index 66b20250a26d005427601b1cdee43bdd9eba70cc..f84e26b2d8ab9a9b2d9e92e18002483127121135 100644
---- a/src/main/java/gg/airplane/commands/AirplaneCommands.java
-+++ b/src/main/java/gg/airplane/commands/AirplaneCommands.java
-@@ -2,11 +2,13 @@ package gg.airplane.commands;
-
- import gg.airplane.AirplaneCommand;
- import gg.airplane.flare.FlareCommand;
-+import gg.airplane.structs.TrackQueue;
- import net.minecraft.server.MinecraftServer;
-
- public class AirplaneCommands {
- public static void init() {
- MinecraftServer.getServer().server.getCommandMap().register("airplane", "Airplane", new AirplaneCommand());
- MinecraftServer.getServer().server.getCommandMap().register("flare", "Airplane", new FlareCommand());
-+ TrackQueue.TrackQueueDebugCommand.register();
- }
- }
-diff --git a/src/main/java/gg/airplane/structs/TrackQueue.java b/src/main/java/gg/airplane/structs/TrackQueue.java
-new file mode 100644
-index 0000000000000000000000000000000000000000..4419fbe94041f4b8a0ea848880798289d063b8e2
---- /dev/null
-+++ b/src/main/java/gg/airplane/structs/TrackQueue.java
-@@ -0,0 +1,109 @@
-+package gg.airplane.structs;
-+
-+import com.tuinity.tuinity.util.maplist.IteratorSafeOrderedReferenceSet;
-+import net.minecraft.server.level.WorldServer;
-+import net.minecraft.world.level.chunk.Chunk;
-+import net.minecraft.server.MinecraftServer;
-+import org.apache.logging.log4j.Level;
-+import org.bukkit.command.Command;
-+import org.bukkit.command.CommandSender;
-+
-+import java.util.concurrent.ConcurrentLinkedQueue;
-+import java.util.concurrent.ForkJoinPool;
-+import java.util.concurrent.atomic.AtomicInteger;
-+
-+/**
-+ * Helper class to handle processing a track queue.
-+ */
-+public class TrackQueue {
-+
-+ public static class TrackQueueDebugCommand extends Command {
-+ protected TrackQueueDebugCommand() {
-+ super("trackqueuedebug");
-+ }
-+
-+ public static void register() {
-+ MinecraftServer.getServer().server.getCommandMap().register("trackqueuedebug", "Airplane", new TrackQueueDebugCommand());
-+ }
-+
-+ @Override
-+ public boolean execute(CommandSender sender, String commandLabel, String[] args) {
-+ if (!sender.isOp()) {
-+ return false;
-+ }
-+ for (WorldServer world : MinecraftServer.getServer().getWorlds()) {
-+ IteratorSafeOrderedReferenceSet chunks = world.getChunkProvider().entityTickingChunks;
-+ sender.sendMessage(world.getWorld().getName() + ": " + chunks.size() + " / " + chunks.getListSize() + " (iterators: " + chunks.iteratorCount + ")");
-+ }
-+ return true;
-+ }
-+ }
-+
-+ private final IteratorSafeOrderedReferenceSet chunks;
-+ private final ForkJoinPool pool = new ForkJoinPool(Math.max(4, Runtime.getRuntime().availableProcessors() >> 2));
-+ private final AtomicInteger taskIndex = new AtomicInteger();
-+
-+ private final ConcurrentLinkedQueue mainThreadTasks;
-+
-+ public TrackQueue(IteratorSafeOrderedReferenceSet chunks, ConcurrentLinkedQueue mainThreadTasks) {
-+ this.chunks = chunks;
-+ this.mainThreadTasks = mainThreadTasks;
-+ }
-+
-+ public void start() {
-+ int iterator = this.chunks.createRawIterator();
-+ if (iterator == -1) {
-+ return;
-+ }
-+ try {
-+ this.taskIndex.set(iterator);
-+
-+ for (int i = 0; i < this.pool.getParallelism(); i++) {
-+ this.pool.execute(this::run);
-+ }
-+
-+ while (this.taskIndex.get() < this.chunks.getListSize()) {
-+ this.runMainThreadTasks();
-+ this.handleTask(); // assist
-+ }
-+ this.runMainThreadTasks(); // finish tasks
-+ } finally {
-+ this.chunks.finishRawIterator();
-+ }
-+ }
-+
-+ private void runMainThreadTasks() {
-+ Runnable task;
-+ while ((task = this.mainThreadTasks.poll()) != null) {
-+ try {
-+ task.run();
-+ } catch (Throwable t) {
-+ MinecraftServer.LOGGER.log(Level.WARN, "Tasks failed while ticking track queue", t);
-+ }
-+ }
-+
-+ }
-+
-+ private void run() {
-+ while (handleTask());
-+ }
-+
-+ private boolean handleTask() {
-+ int index;
-+ while ((index = this.taskIndex.getAndIncrement()) < this.chunks.getListSize()) {
-+ Chunk chunk = this.chunks.rawGet(index);
-+ if (chunk != null) {
-+ try {
-+ chunk.entityTracker.run();
-+ } catch (Throwable t) {
-+ MinecraftServer.LOGGER.log(Level.WARN, "Ticking tracker failed", t);
-+ }
-+
-+ return true;
-+ }
-+ }
-+
-+ return false;
-+ }
-+
-+}
-diff --git a/src/main/java/net/minecraft/server/level/ChunkProviderServer.java b/src/main/java/net/minecraft/server/level/ChunkProviderServer.java
-index 207a9c3928aad7c6e89a120b54d87e003ebd232c..424cd048f905cd0ed3f7a4545a26ffde8da1f91f 100644
---- a/src/main/java/net/minecraft/server/level/ChunkProviderServer.java
-+++ b/src/main/java/net/minecraft/server/level/ChunkProviderServer.java
-@@ -388,7 +388,7 @@ public class ChunkProviderServer extends IChunkProvider {
- }
-
- final com.tuinity.tuinity.util.maplist.IteratorSafeOrderedReferenceSet tickingChunks = new com.tuinity.tuinity.util.maplist.IteratorSafeOrderedReferenceSet<>(4096, 0.75f, 4096, 0.15, true);
-- final com.tuinity.tuinity.util.maplist.IteratorSafeOrderedReferenceSet entityTickingChunks = new com.tuinity.tuinity.util.maplist.IteratorSafeOrderedReferenceSet<>(4096, 0.75f, 4096, 0.15, true);
-+ public final com.tuinity.tuinity.util.maplist.IteratorSafeOrderedReferenceSet entityTickingChunks = new com.tuinity.tuinity.util.maplist.IteratorSafeOrderedReferenceSet<>(4096, 0.75f, 4096, 0.15, true); // Airplane - public for debug
- // Tuinity end
-
- public ChunkProviderServer(WorldServer worldserver, Convertable.ConversionSession convertable_conversionsession, DataFixer datafixer, DefinedStructureManager definedstructuremanager, Executor executor, ChunkGenerator chunkgenerator, int i, boolean flag, WorldLoadListener worldloadlistener, Supplier supplier) {
-diff --git a/src/main/java/net/minecraft/server/level/EntityPlayer.java b/src/main/java/net/minecraft/server/level/EntityPlayer.java
-index fb61b6ac167b34486282a24e598020fb96081f28..b2e21e7034ad83a4ba1c99f860be5a0f5ee6a75f 100644
---- a/src/main/java/net/minecraft/server/level/EntityPlayer.java
-+++ b/src/main/java/net/minecraft/server/level/EntityPlayer.java
-@@ -182,7 +182,7 @@ public class EntityPlayer extends EntityHuman implements ICrafting {
- public NetworkManager networkManager; // Paper
- public final MinecraftServer server;
- public final PlayerInteractManager playerInteractManager;
-- public final Deque removeQueue = new ArrayDeque<>(); // Paper
-+ public final Deque removeQueue = new java.util.concurrent.ConcurrentLinkedDeque<>(); // Paper // Airplane concurrent deque
- private final AdvancementDataPlayer advancementDataPlayer;
- private final ServerStatisticManager serverStatisticManager;
- private float lastHealthScored = Float.MIN_VALUE;
-diff --git a/src/main/java/net/minecraft/server/level/EntityTrackerEntry.java b/src/main/java/net/minecraft/server/level/EntityTrackerEntry.java
-index 67ca28463f5add7c18f7f16b918c3f36f8feeeda..37e64e24ca3a90370cdf12e5ff9cd1fceede796b 100644
---- a/src/main/java/net/minecraft/server/level/EntityTrackerEntry.java
-+++ b/src/main/java/net/minecraft/server/level/EntityTrackerEntry.java
-@@ -75,6 +75,10 @@ public class EntityTrackerEntry {
- * Requested in https://github.com/PaperMC/Paper/issues/1537 to allow intercepting packets
- */
- public void sendPlayerPacket(EntityPlayer player, Packet packet) {
-+ if (!gg.airplane.AirplaneConfig.entityTrackerAsyncPackets && !org.bukkit.Bukkit.isPrimaryThread()) {
-+ this.b.chunkProvider.playerChunkMap.trackerEnsureMain(() -> sendPlayerPacket(player, packet));
-+ return;
-+ }
- player.playerConnection.sendPacket(packet);
- }
-
-@@ -103,7 +107,7 @@ public class EntityTrackerEntry {
-
- public final void tick() { this.a(); } // Paper - OBFHELPER
- public void a() {
-- com.tuinity.tuinity.util.TickThread.softEnsureTickThread("Tracker update"); // Tuinity
-+ //com.tuinity.tuinity.util.TickThread.softEnsureTickThread("Tracker update"); // Tuinity // Airplane - allow multithreaded
- List list = this.tracker.passengers; // Paper - do not copy list
-
- if (!list.equals(this.p)) {
-@@ -116,6 +120,8 @@ public class EntityTrackerEntry {
- ItemStack itemstack = entityitemframe.getItem();
-
- if (this.tickCounter % 10 == 0 && itemstack.getItem() instanceof ItemWorldMap) { // CraftBukkit - Moved this.tickCounter % 10 logic here so item frames do not enter the other blocks
-+ // Airplane start - process maps on main
-+ this.b.chunkProvider.playerChunkMap.trackerEnsureMain(() -> {
- WorldMap worldmap = ItemWorldMap.getSavedMap(itemstack, this.b);
- Iterator iterator = this.trackedPlayers.iterator(); // CraftBukkit
-
-@@ -129,6 +135,8 @@ public class EntityTrackerEntry {
- entityplayer.playerConnection.sendPacket(packet);
- }
- }
-+ });
-+ // Airplane end
- }
-
- this.c();
-@@ -263,18 +271,25 @@ public class EntityTrackerEntry {
- // CraftBukkit start - Create PlayerVelocity event
- boolean cancelled = false;
-
-- if (this.tracker instanceof EntityPlayer) {
-+ if (this.tracker instanceof EntityPlayer && PlayerVelocityEvent.getHandlerList().getRegisteredListeners().length > 0) { // Airplane - ensure there's listeners
-+ // Airplane start - run on main thread
-+ this.b.chunkProvider.playerChunkMap.trackerEnsureMain(() -> {
- Player player = (Player) this.tracker.getBukkitEntity();
- org.bukkit.util.Vector velocity = player.getVelocity();
-
- PlayerVelocityEvent event = new PlayerVelocityEvent(player, velocity.clone());
- this.tracker.world.getServer().getPluginManager().callEvent(event);
-
-- if (event.isCancelled()) {
-- cancelled = true;
-- } else if (!velocity.equals(event.getVelocity())) {
-+ if (!event.isCancelled() && !velocity.equals(event.getVelocity())) {
- player.setVelocity(event.getVelocity());
- }
-+ if (!event.isCancelled()) {
-+ this.broadcastIncludingSelf(new PacketPlayOutEntityVelocity(this.tracker)); // duplicate from !cancelled below
-+ }
-+
-+ });
-+ cancelled = true; // don't broadcast until the event has finished
-+ // Airplane end
- }
-
- if (!cancelled) {
-@@ -358,7 +373,9 @@ public class EntityTrackerEntry {
- if (!list.isEmpty()) {
- consumer.accept(new PacketPlayOutEntityEquipment(this.tracker.getId(), list));
- }
-+ this.b.chunkProvider.playerChunkMap.trackerEnsureMain(() -> { // Airplane
- ((EntityLiving) this.tracker).updateEquipment(); // CraftBukkit - SPIGOT-3789: sync again immediately after sending
-+ }); // Airplane
- }
-
- // CraftBukkit start - Fix for nonsensical head yaw
-@@ -436,6 +453,10 @@ public class EntityTrackerEntry {
- // Paper end
-
- private void broadcastIncludingSelf(Packet> packet) {
-+ if (!gg.airplane.AirplaneConfig.entityTrackerAsyncPackets && !org.bukkit.Bukkit.isPrimaryThread()) {
-+ this.b.chunkProvider.playerChunkMap.trackerEnsureMain(() -> broadcastIncludingSelf(packet));
-+ return;
-+ }
- this.f.accept(packet);
- if (this.tracker instanceof EntityPlayer) {
- ((EntityPlayer) this.tracker).playerConnection.sendPacket(packet);
-diff --git a/src/main/java/net/minecraft/server/level/PlayerChunkMap.java b/src/main/java/net/minecraft/server/level/PlayerChunkMap.java
-index 914c7a1b18151f29183cfe9474313ce18e7c4ae2..737851cde7752e7cccf226f1868a38d6411bfb31 100644
---- a/src/main/java/net/minecraft/server/level/PlayerChunkMap.java
-+++ b/src/main/java/net/minecraft/server/level/PlayerChunkMap.java
-@@ -769,6 +769,11 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d {
- return this.updatingChunks.getVisibleAsync(i);
- // Tuinity end - Don't copy
- }
-+ // Airplane start - since neither map can be updated during tracker tick, it's safe to allow direct retrieval here
-+ private PlayerChunk trackerGetVisibleChunk(long i) {
-+ return this.updatingChunks.getVisibleAsync(i);
-+ }
-+ // Airplane end
-
- protected final IntSupplier getPrioritySupplier(long i) { return c(i); } // Paper - OBFHELPER
- protected IntSupplier c(long i) {
-@@ -2164,10 +2169,30 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d {
- entity.tracker = null; // Paper - We're no longer tracked
- }
-
-+ // Airplane start - tools to ensure main thread
-+ private final java.util.concurrent.ConcurrentLinkedQueue trackerMainQueue = new java.util.concurrent.ConcurrentLinkedQueue<>();
-+ private gg.airplane.structs.TrackQueue trackQueue;
-+
-+ void trackerEnsureMain(Runnable runnable) {
-+ if (this.world.serverThread == Thread.currentThread()) {
-+ runnable.run();
-+ } else {
-+ this.trackerMainQueue.add(runnable);
-+ }
-+ }
-+ // Airplane end
-+
- // Paper start - optimised tracker
- private final void processTrackQueue() {
- this.world.timings.tracker1.startTiming();
- try {
-+ // Airplane start - multithreaded tracker
-+ if (this.trackQueue == null) this.trackQueue = new gg.airplane.structs.TrackQueue(this.world.getChunkProvider().entityTickingChunks, trackerMainQueue);
-+ if (gg.airplane.AirplaneConfig.multithreadedEntityTracker) {
-+ this.trackQueue.start();
-+ return;
-+ }
-+ // Airplane end
- com.tuinity.tuinity.util.maplist.IteratorSafeOrderedReferenceSet.Iterator iterator = this.world.getChunkProvider().entityTickingChunks.iterator();
- try {
- while (iterator.hasNext()) {
-@@ -2433,7 +2458,7 @@ Sections go from 0..16. Now whenever a section is not empty, it can potentially
- public class EntityTracker {
-
- final EntityTrackerEntry trackerEntry; // Paper - private -> package private
-- private final Entity tracker;
-+ public final Entity tracker; // Airplane - public for chunk
- private final int trackingDistance;
- private SectionPosition e;
- // Paper start
-@@ -2452,7 +2477,9 @@ Sections go from 0..16. Now whenever a section is not empty, it can potentially
- // Paper start - use distance map to optimise tracker
- com.destroystokyo.paper.util.misc.PooledLinkedHashSets.PooledObjectLinkedOpenHashSet lastTrackerCandidates;
-
-- final void updatePlayers(com.destroystokyo.paper.util.misc.PooledLinkedHashSets.PooledObjectLinkedOpenHashSet newTrackerCandidates) {
-+ public synchronized final void tickEntry() { this.trackerEntry.tick(); } // Airplane - move entry tick into sync block
-+
-+ public synchronized final void updatePlayers(com.destroystokyo.paper.util.misc.PooledLinkedHashSets.PooledObjectLinkedOpenHashSet newTrackerCandidates) { // Airplane
- com.destroystokyo.paper.util.misc.PooledLinkedHashSets.PooledObjectLinkedOpenHashSet oldTrackerCandidates = this.lastTrackerCandidates;
- this.lastTrackerCandidates = newTrackerCandidates;
-
-@@ -2493,7 +2520,13 @@ Sections go from 0..16. Now whenever a section is not empty, it can potentially
- return this.tracker.getId();
- }
-
-- public void broadcast(Packet> packet) {
-+ public synchronized void broadcast(Packet> packet) { // Airplane - synchronized for tracked player
-+ // Airplane start
-+ if (!gg.airplane.AirplaneConfig.entityTrackerAsyncPackets && !org.bukkit.Bukkit.isPrimaryThread()) {
-+ trackerEnsureMain(() -> broadcast(packet));
-+ return;
-+ }
-+ // Airplane end
- Iterator iterator = this.trackedPlayers.iterator();
-
- while (iterator.hasNext()) {
-@@ -2505,6 +2538,12 @@ Sections go from 0..16. Now whenever a section is not empty, it can potentially
- }
-
- public void broadcastIncludingSelf(Packet> packet) {
-+ // Airplane start
-+ if (!gg.airplane.AirplaneConfig.entityTrackerAsyncPackets && !org.bukkit.Bukkit.isPrimaryThread()) {
-+ trackerEnsureMain(() -> broadcastIncludingSelf(packet));
-+ return;
-+ }
-+ // Airplane end
- this.broadcast(packet);
- if (this.tracker instanceof EntityPlayer) {
- ((EntityPlayer) this.tracker).playerConnection.sendPacket(packet);
-@@ -2531,8 +2570,8 @@ Sections go from 0..16. Now whenever a section is not empty, it can potentially
-
- }
-
-- public void updatePlayer(EntityPlayer entityplayer) {
-- org.spigotmc.AsyncCatcher.catchOp("player tracker update"); // Spigot
-+ public synchronized void updatePlayer(EntityPlayer entityplayer) { // Airplane - sync for access to map
-+ //org.spigotmc.AsyncCatcher.catchOp("player tracker update"); // Spigot // Airplane - allow sync for tracker
- if (entityplayer != this.tracker) {
- // Paper start - remove allocation of Vec3D here
- //Vec3D vec3d = entityplayer.getPositionVector().d(this.tracker.getPositionVector()); // MC-155077, SPIGOT-5113
-@@ -2553,7 +2592,7 @@ Sections go from 0..16. Now whenever a section is not empty, it can potentially
- */
- int x = this.tracker.chunkX, z = this.tracker.chunkZ;
- long chunkcoordintpair = ChunkCoordIntPair.pair(x, z);
-- PlayerChunk playerchunk = PlayerChunkMap.this.getVisibleChunk(chunkcoordintpair);
-+ PlayerChunk playerchunk = PlayerChunkMap.this.trackerGetVisibleChunk(chunkcoordintpair); // Airplane
-
- if (playerchunk != null && playerchunk.getSendingChunk() != null && PlayerChunkMap.this.playerChunkManager.isChunkSent(entityplayer, MathHelper.floor(this.tracker.locX()) >> 4, MathHelper.floor(this.tracker.locZ()) >> 4)) { // Paper - no-tick view distance // Tuinity - don't broadcast in chunks the player hasn't received
- flag1 = PlayerChunkMap.someDistanceCalculation(x, z, entityplayer, false) <= PlayerChunkMap.this.viewDistance;
-diff --git a/src/main/java/net/minecraft/world/level/chunk/Chunk.java b/src/main/java/net/minecraft/world/level/chunk/Chunk.java
-index 8f5809756b4fb358f1207c1d61c5cbe6df3fff00..2e8eb0bb8fb4f7ce6b92fe01a81327da30e614ae 100644
---- a/src/main/java/net/minecraft/world/level/chunk/Chunk.java
-+++ b/src/main/java/net/minecraft/world/level/chunk/Chunk.java
-@@ -111,6 +111,26 @@ public class Chunk implements IChunkAccess {
- }
- // Airplane end
-
-+ // Airplane start - entity tracker runnable
-+ // prevents needing to allocate new lambda in processTrackQueue
-+ public final Runnable entityTracker = new Runnable() {
-+ @Override
-+ public void run() {
-+ Entity[] entities = Chunk.this.entities.getRawData();
-+ for (int i = 0, len = Chunk.this.entities.size(); i < len; ++i) {
-+ Entity entity = entities[i];
-+ if (entity != null) {
-+ PlayerChunkMap.EntityTracker tracker = ((WorldServer) Chunk.this.getWorld()).getChunkProvider().playerChunkMap.trackedEntities.get(entity.getId());
-+ if (tracker != null) {
-+ tracker.updatePlayers(tracker.tracker.getPlayersInTrackRange());
-+ tracker.tickEntry();
-+ }
-+ }
-+ }
-+ }
-+ };
-+ // Airplane end
-+
- public Chunk(World world, ChunkCoordIntPair chunkcoordintpair, BiomeStorage biomestorage) {
- this(world, chunkcoordintpair, biomestorage, ChunkConverter.a, TickListEmpty.b(), TickListEmpty.b(), 0L, (ChunkSection[]) null, (Consumer) null);
- }
diff --git a/patches/server/0004-Rebrand.patch b/patches/server/0003-Rebrand.patch
similarity index 96%
rename from patches/server/0004-Rebrand.patch
rename to patches/server/0003-Rebrand.patch
index 73b576e1f0..9c23a2a0b4 100644
--- a/patches/server/0004-Rebrand.patch
+++ b/patches/server/0003-Rebrand.patch
@@ -92,10 +92,10 @@ index 3bc5cd1e53dd7c94b948e7f57f0dc8e073e349b0..87891161f5b06bb8be0e2016b490484e
throwable = throwable1;
throw throwable1;
diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java
-index 2bb00a42492b08036e984d3e1d9a564d4b4226c2..42c24781d058cee94db8f0fa1a6849b41a0394ff 100644
+index dd0daf3138a38d0c8a399e6cb54bbc58af47f710..53d847b863a957639ff2e58280861316838c0bec 100644
--- a/src/main/java/net/minecraft/server/MinecraftServer.java
+++ b/src/main/java/net/minecraft/server/MinecraftServer.java
-@@ -1646,7 +1646,7 @@ public abstract class MinecraftServer extends IAsyncTaskHandlerReentrant org.spigotmc.SpigotConfig.movedWronglyThreshold && !this.player.isSleeping() && !this.player.playerInteractManager.isCreative() && this.player.playerInteractManager.getGameMode() != EnumGamemode.SPECTATOR) { // Spigot
flag1 = true; // Tuinity - diff on change, this should be moved wrongly
@@ -120,7 +120,7 @@ index 159c38618d7745ea513ad179b1217d76c2c4897a..15349a7bddcad5a4a6db07a8aa6ae8d0
}
this.player.setLocation(d4, d5, d6, f, f1);
-@@ -1466,6 +1474,8 @@ public class PlayerConnection implements PacketListenerPlayIn {
+@@ -1471,6 +1479,8 @@ public class PlayerConnection implements PacketListenerPlayIn {
this.lastYaw = to.getYaw();
this.lastPitch = to.getPitch();
@@ -263,10 +263,10 @@ index 361f7857e461578e90cb71e15027dadaf794cb69..2578a4677d1ee060f687be531e696b7c
+ }
}
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
-index 45e786565ac988abadffda2e7ba3ff1e2880b786..f4052aaa2235894b996d65c569a083f1a09b59a3 100644
+index 51d68fc13fcb8c30c10e21063f4d658f403df8ce..9e07a1e59bf756101a0aaff9891361cc7486854d 100644
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
-@@ -2491,4 +2491,21 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
+@@ -2496,4 +2496,21 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
return spigot;
}
// Spigot end
diff --git a/patches/server/0011-Bring-back-server-name.patch b/patches/server/0010-Bring-back-server-name.patch
similarity index 91%
rename from patches/server/0011-Bring-back-server-name.patch
rename to patches/server/0010-Bring-back-server-name.patch
index d68487a2c4..6d195f551b 100644
--- a/patches/server/0011-Bring-back-server-name.patch
+++ b/patches/server/0010-Bring-back-server-name.patch
@@ -17,10 +17,10 @@ index 1fab9b9c7d41a0d2a551096c2c15f741a887fa2d..f33309f4c1ad92960d0634f3f5b8105c
public final boolean spawnNpcs = this.getBoolean("spawn-npcs", true);
public final boolean pvp = this.getBoolean("pvp", true);
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
-index 3e0b92259ad00541a8da595a918275c1a5b2bc39..f200827a22acc6f6dd454b4c309a5b1e149f9c46 100644
+index de05b0abd9fcd1de0955b493ba0a684d9a3dbc6c..bfc575546f166e5d94859eb859ecb92c695acc1d 100644
--- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java
+++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
-@@ -2525,4 +2525,11 @@ public final class CraftServer implements Server {
+@@ -2532,4 +2532,11 @@ public final class CraftServer implements Server {
return mobGoals;
}
// Paper end
diff --git a/patches/server/0012-Configurable-server-mod-name.patch b/patches/server/0011-Configurable-server-mod-name.patch
similarity index 91%
rename from patches/server/0012-Configurable-server-mod-name.patch
rename to patches/server/0011-Configurable-server-mod-name.patch
index 753eaf6953..10b916754d 100644
--- a/patches/server/0012-Configurable-server-mod-name.patch
+++ b/patches/server/0011-Configurable-server-mod-name.patch
@@ -5,10 +5,10 @@ Subject: [PATCH] Configurable server mod name
diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java
-index 42c24781d058cee94db8f0fa1a6849b41a0394ff..6121ef7fcbadb50d05fad4270556e825f636f4d8 100644
+index 53d847b863a957639ff2e58280861316838c0bec..4abb1d1dcbcc8351a52641eee2629335c3978551 100644
--- a/src/main/java/net/minecraft/server/MinecraftServer.java
+++ b/src/main/java/net/minecraft/server/MinecraftServer.java
-@@ -1646,7 +1646,7 @@ public abstract class MinecraftServer extends IAsyncTaskHandlerReentrant d;
diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemFactory.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemFactory.java
-index 6966b9d1ce674232d3f867798fa58bd0933ff69e..1cc473eb4d346b1b498a7b170973fb44d8b8aea6 100644
+index 347c23d4b7d47198f214c3f95354e8abb660b191..4ec0e93d93936080d876ffa017ebe181d2896b22 100644
--- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemFactory.java
+++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemFactory.java
-@@ -396,4 +396,18 @@ public final class CraftItemFactory implements ItemFactory {
+@@ -401,4 +401,18 @@ public final class CraftItemFactory implements ItemFactory {
new net.md_5.bungee.api.chat.TextComponent(customName));
}
// Paper end
diff --git a/patches/server/0016-PlayerSetSpawnerTypeWithEggEvent.patch b/patches/server/0015-PlayerSetSpawnerTypeWithEggEvent.patch
similarity index 100%
rename from patches/server/0016-PlayerSetSpawnerTypeWithEggEvent.patch
rename to patches/server/0015-PlayerSetSpawnerTypeWithEggEvent.patch
diff --git a/patches/server/0017-EMC-MonsterEggSpawnEvent.patch b/patches/server/0016-EMC-MonsterEggSpawnEvent.patch
similarity index 100%
rename from patches/server/0017-EMC-MonsterEggSpawnEvent.patch
rename to patches/server/0016-EMC-MonsterEggSpawnEvent.patch
diff --git a/patches/server/0018-Player-invulnerabilities.patch b/patches/server/0017-Player-invulnerabilities.patch
similarity index 91%
rename from patches/server/0018-Player-invulnerabilities.patch
rename to patches/server/0017-Player-invulnerabilities.patch
index 7f93ac5338..27e0f97c9a 100644
--- a/patches/server/0018-Player-invulnerabilities.patch
+++ b/patches/server/0017-Player-invulnerabilities.patch
@@ -5,7 +5,7 @@ Subject: [PATCH] Player invulnerabilities
diff --git a/src/main/java/net/minecraft/server/level/EntityPlayer.java b/src/main/java/net/minecraft/server/level/EntityPlayer.java
-index 598b30244e74a56d62dc4ace5362225447860a0a..f59d7e245aa3768004c7f82837a7482260a53406 100644
+index c42a2813b40152079786dde33231d945f3144580..6e3a3a50e01c41b40451bce05015714b5a7fe1e3 100644
--- a/src/main/java/net/minecraft/server/level/EntityPlayer.java
+++ b/src/main/java/net/minecraft/server/level/EntityPlayer.java
@@ -284,6 +284,8 @@ public class EntityPlayer extends EntityHuman implements ICrafting {
@@ -67,10 +67,10 @@ index 598b30244e74a56d62dc4ace5362225447860a0a..f59d7e245aa3768004c7f82837a74822
public Scoreboard getScoreboard() {
return getBukkitEntity().getScoreboard().getHandle();
diff --git a/src/main/java/net/minecraft/server/network/PlayerConnection.java b/src/main/java/net/minecraft/server/network/PlayerConnection.java
-index 15349a7bddcad5a4a6db07a8aa6ae8d06163b1f6..37663436c1ffed4552cdcdac7a5c09fe9b632fee 100644
+index 85964e7fe2cc96ad3b967dadd9ee5d095ee60e2a..71ab9f136144aa7b06494144671b41e2af85de48 100644
--- a/src/main/java/net/minecraft/server/network/PlayerConnection.java
+++ b/src/main/java/net/minecraft/server/network/PlayerConnection.java
-@@ -1896,6 +1896,7 @@ public class PlayerConnection implements PacketListenerPlayIn {
+@@ -1901,6 +1901,7 @@ public class PlayerConnection implements PacketListenerPlayIn {
PlayerConnectionUtils.ensureMainThread(packetplayinresourcepackstatus, this, this.player.getWorldServer());
// Paper start
PlayerResourcePackStatusEvent.Status packStatus = PlayerResourcePackStatusEvent.Status.values()[packetplayinresourcepackstatus.status.ordinal()];
@@ -79,10 +79,10 @@ index 15349a7bddcad5a4a6db07a8aa6ae8d06163b1f6..37663436c1ffed4552cdcdac7a5c09fe
this.server.getPluginManager().callEvent(new PlayerResourcePackStatusEvent(getPlayer(), packStatus));
// Paper end
diff --git a/src/main/java/net/minecraft/server/players/PlayerList.java b/src/main/java/net/minecraft/server/players/PlayerList.java
-index c705bf1e651a764d56b87ebc5a86a938d8bd34bb..9360d35581c6961a768973cc31341381ee26e234 100644
+index 76ba1e038fb68eafa2c2039fa1cdd74d060dcf9f..2e5afd00bc7a2a58fd66c3bf1b38293762408662 100644
--- a/src/main/java/net/minecraft/server/players/PlayerList.java
+++ b/src/main/java/net/minecraft/server/players/PlayerList.java
-@@ -1009,6 +1009,8 @@ public abstract class PlayerList {
+@@ -1015,6 +1015,8 @@ public abstract class PlayerList {
}
// Paper end
@@ -108,10 +108,10 @@ index 2578a4677d1ee060f687be531e696b7c7be89e84..c441fcea9b2b5a77b801c8a69541cf42
+ }
}
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
-index f4052aaa2235894b996d65c569a083f1a09b59a3..1ff48eae5e5b732fbd1e720c55e08a30669bebfa 100644
+index 9e07a1e59bf756101a0aaff9891361cc7486854d..1c5bcc17a702f5af514ce4db7f5d096d5f449dd6 100644
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
-@@ -2507,5 +2507,20 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
+@@ -2512,5 +2512,20 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
public void resetIdleTimer() {
getHandle().resetIdleTimer();
}
diff --git a/patches/server/0019-Anvil-API.patch b/patches/server/0018-Anvil-API.patch
similarity index 100%
rename from patches/server/0019-Anvil-API.patch
rename to patches/server/0018-Anvil-API.patch
diff --git a/patches/server/0020-Configurable-villager-brain-ticks.patch b/patches/server/0019-Configurable-villager-brain-ticks.patch
similarity index 97%
rename from patches/server/0020-Configurable-villager-brain-ticks.patch
rename to patches/server/0019-Configurable-villager-brain-ticks.patch
index ec74523868..017e483867 100644
--- a/patches/server/0020-Configurable-villager-brain-ticks.patch
+++ b/patches/server/0019-Configurable-villager-brain-ticks.patch
@@ -5,7 +5,7 @@ Subject: [PATCH] Configurable villager brain ticks
diff --git a/src/main/java/net/minecraft/world/entity/npc/EntityVillager.java b/src/main/java/net/minecraft/world/entity/npc/EntityVillager.java
-index d8028675fc82883d716bcfb44431ca6ac7dfda36..5539c4cbea46398e92ab6ec56bb9b821e5f01e02 100644
+index d74ba20808d42acd10c3861b5314afd45fddb438..4c2b01774403211bf9af8b5c9f75bfa1b30e1746 100644
--- a/src/main/java/net/minecraft/world/entity/npc/EntityVillager.java
+++ b/src/main/java/net/minecraft/world/entity/npc/EntityVillager.java
@@ -127,6 +127,7 @@ public class EntityVillager extends EntityVillagerAbstract implements Reputation
diff --git a/patches/server/0021-Alternative-Keepalive-Handling.patch b/patches/server/0020-Alternative-Keepalive-Handling.patch
similarity index 97%
rename from patches/server/0021-Alternative-Keepalive-Handling.patch
rename to patches/server/0020-Alternative-Keepalive-Handling.patch
index 210c1d15c2..f288707095 100644
--- a/patches/server/0021-Alternative-Keepalive-Handling.patch
+++ b/patches/server/0020-Alternative-Keepalive-Handling.patch
@@ -17,7 +17,7 @@ index b4c37287362907b8507d156b978ba5b9d961bb7b..9e6e6636539702507abb78515e002819
return this.a;
}
diff --git a/src/main/java/net/minecraft/server/network/PlayerConnection.java b/src/main/java/net/minecraft/server/network/PlayerConnection.java
-index 37663436c1ffed4552cdcdac7a5c09fe9b632fee..f5ada346a11ac3becda4b87416beebd680ca16fa 100644
+index 71ab9f136144aa7b06494144671b41e2af85de48..a0a476d55afdf5ed9850368e99ab25af019075a8 100644
--- a/src/main/java/net/minecraft/server/network/PlayerConnection.java
+++ b/src/main/java/net/minecraft/server/network/PlayerConnection.java
@@ -233,6 +233,7 @@ public class PlayerConnection implements PacketListenerPlayIn {
@@ -50,7 +50,7 @@ index 37663436c1ffed4552cdcdac7a5c09fe9b632fee..f5ada346a11ac3becda4b87416beebd6
if (this.isPendingPing()) {
if (!this.processedDisconnect && elapsedTime >= KEEPALIVE_LIMIT) { // check keepalive limit, don't fire if already disconnected
PlayerConnection.LOGGER.warn("{} was kicked due to keepalive timeout!", this.player.getName()); // more info
-@@ -3079,6 +3095,16 @@ public class PlayerConnection implements PacketListenerPlayIn {
+@@ -3084,6 +3100,16 @@ public class PlayerConnection implements PacketListenerPlayIn {
@Override
public void a(PacketPlayInKeepAlive packetplayinkeepalive) {
diff --git a/patches/server/0022-Silk-touch-spawners.patch b/patches/server/0021-Silk-touch-spawners.patch
similarity index 100%
rename from patches/server/0022-Silk-touch-spawners.patch
rename to patches/server/0021-Silk-touch-spawners.patch
diff --git a/patches/server/0023-MC-168772-Fix-Add-turtle-egg-block-options.patch b/patches/server/0022-MC-168772-Fix-Add-turtle-egg-block-options.patch
similarity index 100%
rename from patches/server/0023-MC-168772-Fix-Add-turtle-egg-block-options.patch
rename to patches/server/0022-MC-168772-Fix-Add-turtle-egg-block-options.patch
diff --git a/patches/server/0024-Fix-vanilla-command-permission-handler.patch b/patches/server/0023-Fix-vanilla-command-permission-handler.patch
similarity index 100%
rename from patches/server/0024-Fix-vanilla-command-permission-handler.patch
rename to patches/server/0023-Fix-vanilla-command-permission-handler.patch
diff --git a/patches/server/0025-Logger-settings-suppressing-pointless-logs.patch b/patches/server/0024-Logger-settings-suppressing-pointless-logs.patch
similarity index 95%
rename from patches/server/0025-Logger-settings-suppressing-pointless-logs.patch
rename to patches/server/0024-Logger-settings-suppressing-pointless-logs.patch
index b357cfb29a..6f9d05321a 100644
--- a/patches/server/0025-Logger-settings-suppressing-pointless-logs.patch
+++ b/patches/server/0024-Logger-settings-suppressing-pointless-logs.patch
@@ -5,10 +5,10 @@ Subject: [PATCH] Logger settings (suppressing pointless logs)
diff --git a/src/main/java/net/minecraft/server/AdvancementDataPlayer.java b/src/main/java/net/minecraft/server/AdvancementDataPlayer.java
-index 7a8a1960882e291c46301d07da3e1c5415516893..59d781b5e61c5d2c004bc92300d8d42e81821308 100644
+index dfdbc028f68ced197ad179248ed3b1e9d70ba057..a1ee1066108985a95abddb03ff447b5a14f4f85f 100644
--- a/src/main/java/net/minecraft/server/AdvancementDataPlayer.java
+++ b/src/main/java/net/minecraft/server/AdvancementDataPlayer.java
-@@ -189,6 +189,7 @@ public class AdvancementDataPlayer {
+@@ -190,6 +190,7 @@ public class AdvancementDataPlayer {
if (advancement == null) {
// CraftBukkit start
if (entry.getKey().getNamespace().equals("minecraft")) {
diff --git a/patches/server/0026-Disable-outdated-build-check.patch b/patches/server/0025-Disable-outdated-build-check.patch
similarity index 100%
rename from patches/server/0026-Disable-outdated-build-check.patch
rename to patches/server/0025-Disable-outdated-build-check.patch
diff --git a/patches/server/0027-Giants-AI-settings.patch b/patches/server/0026-Giants-AI-settings.patch
similarity index 100%
rename from patches/server/0027-Giants-AI-settings.patch
rename to patches/server/0026-Giants-AI-settings.patch
diff --git a/patches/server/0028-Illusioners-AI-settings.patch b/patches/server/0027-Illusioners-AI-settings.patch
similarity index 100%
rename from patches/server/0028-Illusioners-AI-settings.patch
rename to patches/server/0027-Illusioners-AI-settings.patch
diff --git a/patches/server/0029-Zombie-horse-naturally-spawn.patch b/patches/server/0028-Zombie-horse-naturally-spawn.patch
similarity index 97%
rename from patches/server/0029-Zombie-horse-naturally-spawn.patch
rename to patches/server/0028-Zombie-horse-naturally-spawn.patch
index eff0f785f3..313b581c23 100644
--- a/patches/server/0029-Zombie-horse-naturally-spawn.patch
+++ b/patches/server/0028-Zombie-horse-naturally-spawn.patch
@@ -5,7 +5,7 @@ Subject: [PATCH] Zombie horse naturally spawn
diff --git a/src/main/java/net/minecraft/server/level/WorldServer.java b/src/main/java/net/minecraft/server/level/WorldServer.java
-index 4f1b055dfe38f6a48763f75c1795dcd6dae9d378..06517693aacc22c7507a09c15739e0779dbb82b0 100644
+index c3b9f28fbc153bf366093f6288272fd1c3c25a40..ed81ed932abba0ea72668950f2359c6bc5438c03 100644
--- a/src/main/java/net/minecraft/server/level/WorldServer.java
+++ b/src/main/java/net/minecraft/server/level/WorldServer.java
@@ -96,6 +96,7 @@ import net.minecraft.world.entity.ai.village.poi.VillagePlace;
diff --git a/patches/server/0030-Charged-creeper-naturally-spawn.patch b/patches/server/0029-Charged-creeper-naturally-spawn.patch
similarity index 100%
rename from patches/server/0030-Charged-creeper-naturally-spawn.patch
rename to patches/server/0029-Charged-creeper-naturally-spawn.patch
diff --git a/patches/server/0031-Rabbit-naturally-spawn-toast-and-killer.patch b/patches/server/0030-Rabbit-naturally-spawn-toast-and-killer.patch
similarity index 100%
rename from patches/server/0031-Rabbit-naturally-spawn-toast-and-killer.patch
rename to patches/server/0030-Rabbit-naturally-spawn-toast-and-killer.patch
diff --git a/patches/server/0032-Fix-outdated-server-showing-in-ping-before-server-fu.patch b/patches/server/0031-Fix-outdated-server-showing-in-ping-before-server-fu.patch
similarity index 100%
rename from patches/server/0032-Fix-outdated-server-showing-in-ping-before-server-fu.patch
rename to patches/server/0031-Fix-outdated-server-showing-in-ping-before-server-fu.patch
diff --git a/patches/server/0033-Make-Iron-Golems-Swim.patch b/patches/server/0032-Make-Iron-Golems-Swim.patch
similarity index 100%
rename from patches/server/0033-Make-Iron-Golems-Swim.patch
rename to patches/server/0032-Make-Iron-Golems-Swim.patch
diff --git a/patches/server/0034-Dont-send-useless-entity-packets.patch b/patches/server/0033-Dont-send-useless-entity-packets.patch
similarity index 95%
rename from patches/server/0034-Dont-send-useless-entity-packets.patch
rename to patches/server/0033-Dont-send-useless-entity-packets.patch
index 052206a8c8..aaca9df2aa 100644
--- a/patches/server/0034-Dont-send-useless-entity-packets.patch
+++ b/patches/server/0033-Dont-send-useless-entity-packets.patch
@@ -26,10 +26,10 @@ index 0eed10a6c4e0c7245f219d19ed1e2e5c94364db9..2b54a5f3347f788b751892105f888663
protected boolean h;
protected boolean i;
diff --git a/src/main/java/net/minecraft/server/level/EntityTrackerEntry.java b/src/main/java/net/minecraft/server/level/EntityTrackerEntry.java
-index 37e64e24ca3a90370cdf12e5ff9cd1fceede796b..f63ec5fa5a1cb34f4809a06a29d01603efb178f1 100644
+index 67ca28463f5add7c18f7f16b918c3f36f8feeeda..53e773c14689967d5b12467bf209eefb05f7a812 100644
--- a/src/main/java/net/minecraft/server/level/EntityTrackerEntry.java
+++ b/src/main/java/net/minecraft/server/level/EntityTrackerEntry.java
-@@ -208,6 +208,7 @@ public class EntityTrackerEntry {
+@@ -200,6 +200,7 @@ public class EntityTrackerEntry {
this.o = 0;
packet1 = new PacketPlayOutEntityTeleport(this.tracker);
}
@@ -37,7 +37,7 @@ index 37e64e24ca3a90370cdf12e5ff9cd1fceede796b..f63ec5fa5a1cb34f4809a06a29d01603
}
if ((this.e || this.tracker.impulse || this.tracker instanceof EntityLiving && ((EntityLiving) this.tracker).isGliding()) && this.tickCounter > 0) {
-@@ -301,6 +302,22 @@ public class EntityTrackerEntry {
+@@ -286,6 +287,22 @@ public class EntityTrackerEntry {
}
diff --git a/patches/server/0035-Tulips-change-fox-type.patch b/patches/server/0034-Tulips-change-fox-type.patch
similarity index 98%
rename from patches/server/0035-Tulips-change-fox-type.patch
rename to patches/server/0034-Tulips-change-fox-type.patch
index 4c440e6ed5..0a18c286fe 100644
--- a/patches/server/0035-Tulips-change-fox-type.patch
+++ b/patches/server/0034-Tulips-change-fox-type.patch
@@ -5,7 +5,7 @@ Subject: [PATCH] Tulips change fox type
diff --git a/src/main/java/net/minecraft/world/entity/animal/EntityFox.java b/src/main/java/net/minecraft/world/entity/animal/EntityFox.java
-index a3b714a9d63c6bb33a2731fb9293c9d155754b17..cea46348c0876e168376061fbaf258048e9358cb 100644
+index b7fa24318ef43918b6b10ff4ea8acb960527296e..19a9affdaba52d8e7dc1c4c20d5c0d52829f4989 100644
--- a/src/main/java/net/minecraft/world/entity/animal/EntityFox.java
+++ b/src/main/java/net/minecraft/world/entity/animal/EntityFox.java
@@ -30,6 +30,8 @@ import net.minecraft.tags.Tag;
diff --git a/patches/server/0036-Breedable-Polar-Bears.patch b/patches/server/0035-Breedable-Polar-Bears.patch
similarity index 100%
rename from patches/server/0036-Breedable-Polar-Bears.patch
rename to patches/server/0035-Breedable-Polar-Bears.patch
diff --git a/patches/server/0037-Chickens-can-retaliate.patch b/patches/server/0036-Chickens-can-retaliate.patch
similarity index 100%
rename from patches/server/0037-Chickens-can-retaliate.patch
rename to patches/server/0036-Chickens-can-retaliate.patch
diff --git a/patches/server/0038-Add-option-to-set-armorstand-step-height.patch b/patches/server/0037-Add-option-to-set-armorstand-step-height.patch
similarity index 100%
rename from patches/server/0038-Add-option-to-set-armorstand-step-height.patch
rename to patches/server/0037-Add-option-to-set-armorstand-step-height.patch
diff --git a/patches/server/0039-Cat-spawning-options.patch b/patches/server/0038-Cat-spawning-options.patch
similarity index 100%
rename from patches/server/0039-Cat-spawning-options.patch
rename to patches/server/0038-Cat-spawning-options.patch
diff --git a/patches/server/0040-MC-147659-Fix-non-black-cats-spawning-in-swamp-huts.patch b/patches/server/0039-MC-147659-Fix-non-black-cats-spawning-in-swamp-huts.patch
similarity index 100%
rename from patches/server/0040-MC-147659-Fix-non-black-cats-spawning-in-swamp-huts.patch
rename to patches/server/0039-MC-147659-Fix-non-black-cats-spawning-in-swamp-huts.patch
diff --git a/patches/server/0041-Cows-eat-mushrooms.patch b/patches/server/0040-Cows-eat-mushrooms.patch
similarity index 100%
rename from patches/server/0041-Cows-eat-mushrooms.patch
rename to patches/server/0040-Cows-eat-mushrooms.patch
diff --git a/patches/server/0042-Fix-cow-rotation-when-shearing-mooshroom.patch b/patches/server/0041-Fix-cow-rotation-when-shearing-mooshroom.patch
similarity index 100%
rename from patches/server/0042-Fix-cow-rotation-when-shearing-mooshroom.patch
rename to patches/server/0041-Fix-cow-rotation-when-shearing-mooshroom.patch
diff --git a/patches/server/0043-Pigs-give-saddle-back.patch b/patches/server/0042-Pigs-give-saddle-back.patch
similarity index 100%
rename from patches/server/0043-Pigs-give-saddle-back.patch
rename to patches/server/0042-Pigs-give-saddle-back.patch
diff --git a/patches/server/0044-Snowman-drop-and-put-back-pumpkin.patch b/patches/server/0043-Snowman-drop-and-put-back-pumpkin.patch
similarity index 100%
rename from patches/server/0044-Snowman-drop-and-put-back-pumpkin.patch
rename to patches/server/0043-Snowman-drop-and-put-back-pumpkin.patch
diff --git a/patches/server/0045-Ender-dragon-always-drop-full-exp.patch b/patches/server/0044-Ender-dragon-always-drop-full-exp.patch
similarity index 100%
rename from patches/server/0045-Ender-dragon-always-drop-full-exp.patch
rename to patches/server/0044-Ender-dragon-always-drop-full-exp.patch
diff --git a/patches/server/0046-Signs-editable-on-right-click.patch b/patches/server/0045-Signs-editable-on-right-click.patch
similarity index 100%
rename from patches/server/0046-Signs-editable-on-right-click.patch
rename to patches/server/0045-Signs-editable-on-right-click.patch
diff --git a/patches/server/0047-Signs-allow-color-codes.patch b/patches/server/0046-Signs-allow-color-codes.patch
similarity index 95%
rename from patches/server/0047-Signs-allow-color-codes.patch
rename to patches/server/0046-Signs-allow-color-codes.patch
index 2d6e0522dc..2409733418 100644
--- a/patches/server/0047-Signs-allow-color-codes.patch
+++ b/patches/server/0046-Signs-allow-color-codes.patch
@@ -5,7 +5,7 @@ Subject: [PATCH] Signs allow color codes
diff --git a/src/main/java/net/minecraft/server/level/EntityPlayer.java b/src/main/java/net/minecraft/server/level/EntityPlayer.java
-index f59d7e245aa3768004c7f82837a7482260a53406..c337b22a2f8ce5c76a1699956f6c06721046e814 100644
+index 6e3a3a50e01c41b40451bce05015714b5a7fe1e3..43900bb788f4baef420de0782c77d74dd7310f6e 100644
--- a/src/main/java/net/minecraft/server/level/EntityPlayer.java
+++ b/src/main/java/net/minecraft/server/level/EntityPlayer.java
@@ -1579,6 +1579,7 @@ public class EntityPlayer extends EntityHuman implements ICrafting {
@@ -17,10 +17,10 @@ index f59d7e245aa3768004c7f82837a7482260a53406..c337b22a2f8ce5c76a1699956f6c0672
this.playerConnection.sendPacket(new PacketPlayOutOpenSignEditor(tileentitysign.getPosition()));
}
diff --git a/src/main/java/net/minecraft/server/network/PlayerConnection.java b/src/main/java/net/minecraft/server/network/PlayerConnection.java
-index f5ada346a11ac3becda4b87416beebd680ca16fa..4f094f026b118775cae84024b2ba6c33e14784e6 100644
+index a0a476d55afdf5ed9850368e99ab25af019075a8..3559f52e2fa30a8a7600334ece981fe34896bd68 100644
--- a/src/main/java/net/minecraft/server/network/PlayerConnection.java
+++ b/src/main/java/net/minecraft/server/network/PlayerConnection.java
-@@ -3073,6 +3073,15 @@ public class PlayerConnection implements PacketListenerPlayIn {
+@@ -3078,6 +3078,15 @@ public class PlayerConnection implements PacketListenerPlayIn {
}
}
// Paper end
diff --git a/patches/server/0048-Allow-soil-to-moisten-from-water-directly-under-it.patch b/patches/server/0047-Allow-soil-to-moisten-from-water-directly-under-it.patch
similarity index 100%
rename from patches/server/0048-Allow-soil-to-moisten-from-water-directly-under-it.patch
rename to patches/server/0047-Allow-soil-to-moisten-from-water-directly-under-it.patch
diff --git a/patches/server/0049-Minecart-settings-and-WASD-controls.patch b/patches/server/0048-Minecart-settings-and-WASD-controls.patch
similarity index 98%
rename from patches/server/0049-Minecart-settings-and-WASD-controls.patch
rename to patches/server/0048-Minecart-settings-and-WASD-controls.patch
index 6129cb8a36..f53a36aa67 100644
--- a/patches/server/0049-Minecart-settings-and-WASD-controls.patch
+++ b/patches/server/0048-Minecart-settings-and-WASD-controls.patch
@@ -22,7 +22,7 @@ index 3c51ee00aa53e561c02bb779c7115d8475d70ed7..47381b2a804f1e2296d654933d77c2da
super(i, j, k);
}
diff --git a/src/main/java/net/minecraft/server/level/EntityPlayer.java b/src/main/java/net/minecraft/server/level/EntityPlayer.java
-index c337b22a2f8ce5c76a1699956f6c06721046e814..7fd6c93e7c7cd8f86d06710d39e4431e001bd97b 100644
+index 43900bb788f4baef420de0782c77d74dd7310f6e..01d4aa706f5c1cf35210bbdbf25b4687d110eaa1 100644
--- a/src/main/java/net/minecraft/server/level/EntityPlayer.java
+++ b/src/main/java/net/minecraft/server/level/EntityPlayer.java
@@ -1132,6 +1132,7 @@ public class EntityPlayer extends EntityHuman implements ICrafting {
@@ -170,7 +170,7 @@ index 527f3ed664854cdd938c34f00a064bc2f77148cc..1a1de9491a50e9e746e714fcb35633c2
}
}
diff --git a/src/main/java/net/minecraft/world/level/block/Block.java b/src/main/java/net/minecraft/world/level/block/Block.java
-index f8a982add50862f1bc977f3039e7e9aeed9138ae..fb7d5fa53c51766f348271285a2e921be1ca0497 100644
+index 96d7990c66bd569b1b5ee287c0238c7dbb4c503e..2448ff8e3a9c60d6d99dd8f4d3033553b2780c77 100644
--- a/src/main/java/net/minecraft/world/level/block/Block.java
+++ b/src/main/java/net/minecraft/world/level/block/Block.java
@@ -83,6 +83,7 @@ public class Block extends BlockBase implements IMaterial {
diff --git a/patches/server/0050-Disable-loot-drops-on-death-by-cramming.patch b/patches/server/0049-Disable-loot-drops-on-death-by-cramming.patch
similarity index 100%
rename from patches/server/0050-Disable-loot-drops-on-death-by-cramming.patch
rename to patches/server/0049-Disable-loot-drops-on-death-by-cramming.patch
diff --git a/patches/server/0051-Players-should-not-cram-to-death.patch b/patches/server/0050-Players-should-not-cram-to-death.patch
similarity index 91%
rename from patches/server/0051-Players-should-not-cram-to-death.patch
rename to patches/server/0050-Players-should-not-cram-to-death.patch
index a45127b45b..359d457915 100644
--- a/patches/server/0051-Players-should-not-cram-to-death.patch
+++ b/patches/server/0050-Players-should-not-cram-to-death.patch
@@ -5,7 +5,7 @@ Subject: [PATCH] Players should not cram to death
diff --git a/src/main/java/net/minecraft/server/level/EntityPlayer.java b/src/main/java/net/minecraft/server/level/EntityPlayer.java
-index 7fd6c93e7c7cd8f86d06710d39e4431e001bd97b..0f6760c6922be4a4322ebbc6212b0d88494f5a52 100644
+index 01d4aa706f5c1cf35210bbdbf25b4687d110eaa1..257265a036a62c7d5fbcff17a10a41198ed880a4 100644
--- a/src/main/java/net/minecraft/server/level/EntityPlayer.java
+++ b/src/main/java/net/minecraft/server/level/EntityPlayer.java
@@ -1556,7 +1556,7 @@ public class EntityPlayer extends EntityHuman implements ICrafting {
diff --git a/patches/server/0052-Option-to-toggle-milk-curing-bad-omen.patch b/patches/server/0051-Option-to-toggle-milk-curing-bad-omen.patch
similarity index 100%
rename from patches/server/0052-Option-to-toggle-milk-curing-bad-omen.patch
rename to patches/server/0051-Option-to-toggle-milk-curing-bad-omen.patch
diff --git a/patches/server/0053-End-gateway-should-check-if-entity-can-use-portal.patch b/patches/server/0052-End-gateway-should-check-if-entity-can-use-portal.patch
similarity index 100%
rename from patches/server/0053-End-gateway-should-check-if-entity-can-use-portal.patch
rename to patches/server/0052-End-gateway-should-check-if-entity-can-use-portal.patch
diff --git a/patches/server/0054-Fix-the-dead-lagging-the-server.patch b/patches/server/0053-Fix-the-dead-lagging-the-server.patch
similarity index 100%
rename from patches/server/0054-Fix-the-dead-lagging-the-server.patch
rename to patches/server/0053-Fix-the-dead-lagging-the-server.patch
diff --git a/patches/server/0055-Skip-events-if-there-s-no-listeners.patch b/patches/server/0054-Skip-events-if-there-s-no-listeners.patch
similarity index 87%
rename from patches/server/0055-Skip-events-if-there-s-no-listeners.patch
rename to patches/server/0054-Skip-events-if-there-s-no-listeners.patch
index 8fd44bfa0b..8a72a4f713 100644
--- a/patches/server/0055-Skip-events-if-there-s-no-listeners.patch
+++ b/patches/server/0054-Skip-events-if-there-s-no-listeners.patch
@@ -5,10 +5,10 @@ Subject: [PATCH] Skip events if there's no listeners
diff --git a/src/main/java/net/minecraft/commands/CommandDispatcher.java b/src/main/java/net/minecraft/commands/CommandDispatcher.java
-index 988d1c9e9f4f29325043eb083123d12dd5f8081d..c25440e810e61bcdc299a0caebaec54b6862dd3c 100644
+index 29a395e69aab9c50a45c5fd5ab8795fd8e3ef727..5ae31658fb1183eab66f682cc5477bc526c27753 100644
--- a/src/main/java/net/minecraft/commands/CommandDispatcher.java
+++ b/src/main/java/net/minecraft/commands/CommandDispatcher.java
-@@ -362,6 +362,7 @@ public class CommandDispatcher {
+@@ -367,6 +367,7 @@ public class CommandDispatcher {
}
private void runSync(EntityPlayer entityplayer, Collection bukkit, RootCommandNode rootcommandnode) {
@@ -16,7 +16,7 @@ index 988d1c9e9f4f29325043eb083123d12dd5f8081d..c25440e810e61bcdc299a0caebaec54b
// Paper end - Async command map building
new com.destroystokyo.paper.event.brigadier.AsyncPlayerSendCommandsEvent(entityplayer.getBukkitEntity(), (RootCommandNode) rootcommandnode, false).callEvent(); // Paper
PlayerCommandSendEvent event = new PlayerCommandSendEvent(entityplayer.getBukkitEntity(), new LinkedHashSet<>(bukkit));
-@@ -374,6 +375,7 @@ public class CommandDispatcher {
+@@ -379,6 +380,7 @@ public class CommandDispatcher {
}
}
// CraftBukkit end
diff --git a/patches/server/0056-Add-permission-for-F3-N-debug.patch b/patches/server/0055-Add-permission-for-F3-N-debug.patch
similarity index 83%
rename from patches/server/0056-Add-permission-for-F3-N-debug.patch
rename to patches/server/0055-Add-permission-for-F3-N-debug.patch
index 1c43ba78af..0bae63f24f 100644
--- a/patches/server/0056-Add-permission-for-F3-N-debug.patch
+++ b/patches/server/0055-Add-permission-for-F3-N-debug.patch
@@ -5,10 +5,10 @@ Subject: [PATCH] Add permission for F3+N debug
diff --git a/src/main/java/net/minecraft/server/players/PlayerList.java b/src/main/java/net/minecraft/server/players/PlayerList.java
-index 9360d35581c6961a768973cc31341381ee26e234..c742647c0c5e3e4925e4ee6d195a54a85435e65e 100644
+index 2e5afd00bc7a2a58fd66c3bf1b38293762408662..3622ea01edfb9dfaab254ceaf09582d9e8993174 100644
--- a/src/main/java/net/minecraft/server/players/PlayerList.java
+++ b/src/main/java/net/minecraft/server/players/PlayerList.java
-@@ -1168,6 +1168,7 @@ public abstract class PlayerList {
+@@ -1174,6 +1174,7 @@ public abstract class PlayerList {
} else {
b0 = (byte) (24 + i);
}
diff --git a/patches/server/0057-Add-wither-skeleton-takes-wither-damage-option.patch b/patches/server/0056-Add-wither-skeleton-takes-wither-damage-option.patch
similarity index 100%
rename from patches/server/0057-Add-wither-skeleton-takes-wither-damage-option.patch
rename to patches/server/0056-Add-wither-skeleton-takes-wither-damage-option.patch
diff --git a/patches/server/0058-Configurable-TPS-Catchup.patch b/patches/server/0057-Configurable-TPS-Catchup.patch
similarity index 93%
rename from patches/server/0058-Configurable-TPS-Catchup.patch
rename to patches/server/0057-Configurable-TPS-Catchup.patch
index f3d1f2b1cf..e706a155b9 100644
--- a/patches/server/0058-Configurable-TPS-Catchup.patch
+++ b/patches/server/0057-Configurable-TPS-Catchup.patch
@@ -5,10 +5,10 @@ Subject: [PATCH] Configurable TPS Catchup
diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java
-index c086f50613cc3b1061c9958eb2a8aba059a61e29..dccff89fcacdafe4961cd3121eb38ff8844e10da 100644
+index c8653b1214af3e08aa4f197c0e2923a81ed47ffc..9fbec9f98bd0dd727ef58d7f3f18a8a8ab9910e2 100644
--- a/src/main/java/net/minecraft/server/MinecraftServer.java
+++ b/src/main/java/net/minecraft/server/MinecraftServer.java
-@@ -1132,7 +1132,13 @@ public abstract class MinecraftServer extends IAsyncTaskHandlerReentrant
Date: Thu, 27 Feb 2020 21:42:19 -0600
-Subject: [PATCH] Configurable void damage height
+Subject: [PATCH] Configurable void damage height and damage
diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java
@@ -17,21 +17,36 @@ index 08f286a085cf36ce9a0ea420389f4ea33fb1cc1a..0950dcce2353504775813d9f60407361
&& world.paperConfig.doNetherTopVoidDamage()
&& this.locY() >= world.paperConfig.netherVoidTopDamageHeight)) {
this.doVoidDamage();
+diff --git a/src/main/java/net/minecraft/world/entity/EntityLiving.java b/src/main/java/net/minecraft/world/entity/EntityLiving.java
+index af08ec27f8c07653daa328d84bfc142bfc8a7f78..0d5bb154e4213283734c1c2c437aec2a8b8877fc 100644
+--- a/src/main/java/net/minecraft/world/entity/EntityLiving.java
++++ b/src/main/java/net/minecraft/world/entity/EntityLiving.java
+@@ -2129,7 +2129,7 @@ public abstract class EntityLiving extends Entity {
+
+ @Override
+ protected void an() {
+- this.damageEntity(DamageSource.OUT_OF_WORLD, 4.0F);
++ this.damageEntity(DamageSource.OUT_OF_WORLD, (float) world.purpurConfig.voidDamageDealt);
+ }
+
+ protected void dA() {
diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-index 32087bcc02c20448988c76e04dbc0dcc3db48641..dc63d6ee62a45ff4862c01327de3dc06021bf284 100644
+index 32087bcc02c20448988c76e04dbc0dcc3db48641..0e715362fcfb3d26825b51f4fd96d8cba810bf55 100644
--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-@@ -150,11 +150,13 @@ public class PurpurWorldConfig {
+@@ -150,11 +150,15 @@ public class PurpurWorldConfig {
public boolean entitiesPickUpLootBypassMobGriefing = false;
public boolean milkCuresBadOmen = true;
public double tridentLoyaltyVoidReturnHeight = 0.0D;
+ public double voidDamageHeight = -64.0D;
++ public double voidDamageDealt = 4.0D;
private void miscGameplayMechanicsSettings() {
disableDropsOnCrammingDeath = getBoolean("gameplay-mechanics.disable-drops-on-cramming-death", disableDropsOnCrammingDeath);
entitiesPickUpLootBypassMobGriefing = getBoolean("gameplay-mechanics.entities-pick-up-loot-bypass-mob-griefing", entitiesPickUpLootBypassMobGriefing);
milkCuresBadOmen = getBoolean("gameplay-mechanics.milk-cures-bad-omen", milkCuresBadOmen);
tridentLoyaltyVoidReturnHeight = getDouble("gameplay-mechanics.trident-loyalty-void-return-height", tridentLoyaltyVoidReturnHeight);
+ voidDamageHeight = getDouble("gameplay-mechanics.void-damage-height", voidDamageHeight);
++ voidDamageDealt = getDouble("gameplay-mechanics.void-damage-dealt", voidDamageDealt);
}
public String playerDeathExpDropEquation = "expLevel * 7";
diff --git a/patches/server/0071-Dispenser-curse-of-binding-protection.patch b/patches/server/0070-Dispenser-curse-of-binding-protection.patch
similarity index 95%
rename from patches/server/0071-Dispenser-curse-of-binding-protection.patch
rename to patches/server/0070-Dispenser-curse-of-binding-protection.patch
index eefbe8cc0f..bf2489e631 100644
--- a/patches/server/0071-Dispenser-curse-of-binding-protection.patch
+++ b/patches/server/0070-Dispenser-curse-of-binding-protection.patch
@@ -52,10 +52,10 @@ index 7962808aebf67cf9bc1dc4c1e106e943536fdced..d072b604a1cd8835c1fe658831cdaf9f
return this.b;
}
diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-index dc63d6ee62a45ff4862c01327de3dc06021bf284..d9c5f6f90c493dcf13199c488065d9dfbe34525e 100644
+index 0e715362fcfb3d26825b51f4fd96d8cba810bf55..d5095a9b20118bf9c35346fce95a446254872832 100644
--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-@@ -196,6 +196,11 @@ public class PurpurWorldConfig {
+@@ -198,6 +198,11 @@ public class PurpurWorldConfig {
});
}
diff --git a/patches/server/0072-Add-option-for-boats-to-eject-players-on-land.patch b/patches/server/0071-Add-option-for-boats-to-eject-players-on-land.patch
similarity index 89%
rename from patches/server/0072-Add-option-for-boats-to-eject-players-on-land.patch
rename to patches/server/0071-Add-option-for-boats-to-eject-players-on-land.patch
index 59e133a733..ffcc465848 100644
--- a/patches/server/0072-Add-option-for-boats-to-eject-players-on-land.patch
+++ b/patches/server/0071-Add-option-for-boats-to-eject-players-on-land.patch
@@ -17,10 +17,10 @@ index 5e2c13bd6e52ffe182ef034e05ba6fe1cb301005..01839c7319e175477ded7001e00e5937
} else {
return EntityBoat.EnumStatus.IN_AIR;
diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-index d9c5f6f90c493dcf13199c488065d9dfbe34525e..f1a5bc297e67129351e4cf72bc67c44f4af64b91 100644
+index d5095a9b20118bf9c35346fce95a446254872832..06c6e181b753a840e0060539b6b0387a7a1511dc 100644
--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-@@ -146,12 +146,14 @@ public class PurpurWorldConfig {
+@@ -146,6 +146,7 @@ public class PurpurWorldConfig {
idleTimeoutUpdateTabList = getBoolean("gameplay-mechanics.player.idle-timeout.update-tab-list", idleTimeoutUpdateTabList);
}
@@ -28,8 +28,9 @@ index d9c5f6f90c493dcf13199c488065d9dfbe34525e..f1a5bc297e67129351e4cf72bc67c44f
public boolean disableDropsOnCrammingDeath = false;
public boolean entitiesPickUpLootBypassMobGriefing = false;
public boolean milkCuresBadOmen = true;
- public double tridentLoyaltyVoidReturnHeight = 0.0D;
+@@ -153,6 +154,7 @@ public class PurpurWorldConfig {
public double voidDamageHeight = -64.0D;
+ public double voidDamageDealt = 4.0D;
private void miscGameplayMechanicsSettings() {
+ boatEjectPlayersOnLand = getBoolean("gameplay-mechanics.boat.eject-players-on-land", boatEjectPlayersOnLand);
disableDropsOnCrammingDeath = getBoolean("gameplay-mechanics.disable-drops-on-cramming-death", disableDropsOnCrammingDeath);
diff --git a/patches/server/0073-Add-obfhelpers-for-plugin-use.patch b/patches/server/0072-Add-obfhelpers-for-plugin-use.patch
similarity index 89%
rename from patches/server/0073-Add-obfhelpers-for-plugin-use.patch
rename to patches/server/0072-Add-obfhelpers-for-plugin-use.patch
index 793fe557ff..3bfcad3aac 100644
--- a/patches/server/0073-Add-obfhelpers-for-plugin-use.patch
+++ b/patches/server/0072-Add-obfhelpers-for-plugin-use.patch
@@ -5,7 +5,7 @@ Subject: [PATCH] Add obfhelpers for plugin use
diff --git a/src/main/java/net/minecraft/world/item/ItemStack.java b/src/main/java/net/minecraft/world/item/ItemStack.java
-index fee862951f2767d4a3c5268dff157c185378a939..91a1b2e955b04f0cc1ca05d7ee4d832d9efb97cb 100644
+index 366ceb65d40c685117d1c79a933864ab91d8aa11..a342174cf35ee6ac1f10028b60c5a19e1b547ef4 100644
--- a/src/main/java/net/minecraft/world/item/ItemStack.java
+++ b/src/main/java/net/minecraft/world/item/ItemStack.java
@@ -694,6 +694,7 @@ public final class ItemStack {
diff --git a/patches/server/0074-Mending-mends-most-damages-equipment-first.patch b/patches/server/0073-Mending-mends-most-damages-equipment-first.patch
similarity index 95%
rename from patches/server/0074-Mending-mends-most-damages-equipment-first.patch
rename to patches/server/0073-Mending-mends-most-damages-equipment-first.patch
index 2b57ebf3e3..67fe1f720c 100644
--- a/patches/server/0074-Mending-mends-most-damages-equipment-first.patch
+++ b/patches/server/0073-Mending-mends-most-damages-equipment-first.patch
@@ -18,7 +18,7 @@ index a7551e95185895a290be70d501496279eaf884ae..31d36ead273e8397ba2c826b791a2cf5
if (entry != null) {
ItemStack itemstack = (ItemStack) entry.getValue();
diff --git a/src/main/java/net/minecraft/world/item/ItemStack.java b/src/main/java/net/minecraft/world/item/ItemStack.java
-index 91a1b2e955b04f0cc1ca05d7ee4d832d9efb97cb..fcc6ee9481d577d39339cd0ac24dab06bd76e5c6 100644
+index a342174cf35ee6ac1f10028b60c5a19e1b547ef4..72400425d6177ba938057ec145f9499eb1160288 100644
--- a/src/main/java/net/minecraft/world/item/ItemStack.java
+++ b/src/main/java/net/minecraft/world/item/ItemStack.java
@@ -468,10 +468,19 @@ public final class ItemStack {
@@ -78,7 +78,7 @@ index 72afbf8f537770540e90a2880ea81de137ea10f5..b2d28c2bf0a9e93d38583e2d734c12fe
return a(enchantment, entityliving, (itemstack) -> {
return true;
diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-index f1a5bc297e67129351e4cf72bc67c44f4af64b91..7dd9a8af44fbf3e1a3fe48d9f259a4937a823f39 100644
+index 06c6e181b753a840e0060539b6b0387a7a1511dc..ce1d33315a7999fb304d6f7d843ab3d1f415eb17 100644
--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
@@ -146,6 +146,7 @@ public class PurpurWorldConfig {
@@ -89,9 +89,9 @@ index f1a5bc297e67129351e4cf72bc67c44f4af64b91..7dd9a8af44fbf3e1a3fe48d9f259a493
public boolean boatEjectPlayersOnLand = false;
public boolean disableDropsOnCrammingDeath = false;
public boolean entitiesPickUpLootBypassMobGriefing = false;
-@@ -153,6 +154,7 @@ public class PurpurWorldConfig {
- public double tridentLoyaltyVoidReturnHeight = 0.0D;
+@@ -154,6 +155,7 @@ public class PurpurWorldConfig {
public double voidDamageHeight = -64.0D;
+ public double voidDamageDealt = 4.0D;
private void miscGameplayMechanicsSettings() {
+ useBetterMending = getBoolean("gameplay-mechanics.use-better-mending", useBetterMending);
boatEjectPlayersOnLand = getBoolean("gameplay-mechanics.boat.eject-players-on-land", boatEjectPlayersOnLand);
diff --git a/patches/server/0075-Add-5-second-tps-average-in-tps.patch b/patches/server/0074-Add-5-second-tps-average-in-tps.patch
similarity index 93%
rename from patches/server/0075-Add-5-second-tps-average-in-tps.patch
rename to patches/server/0074-Add-5-second-tps-average-in-tps.patch
index 43175802ee..9cbc40fc07 100644
--- a/patches/server/0075-Add-5-second-tps-average-in-tps.patch
+++ b/patches/server/0074-Add-5-second-tps-average-in-tps.patch
@@ -27,10 +27,10 @@ index dc6bc1910ad0f9b27144d5750078c3ca607d03d3..e8be35f836ede2630d44902e99a21489
setListData(vector);
}
diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java
-index dccff89fcacdafe4961cd3121eb38ff8844e10da..409c272629ca935dcbaa9e73e10ace4a0bd8f9b7 100644
+index 9fbec9f98bd0dd727ef58d7f3f18a8a8ab9910e2..0cea9db58772d8c69b5cfdd4a2987593b2c9ea6c 100644
--- a/src/main/java/net/minecraft/server/MinecraftServer.java
+++ b/src/main/java/net/minecraft/server/MinecraftServer.java
-@@ -278,7 +278,7 @@ public abstract class MinecraftServer extends IAsyncTaskHandlerReentrant trackedPlayerMap = null;
-@@ -142,6 +143,15 @@ public class EntityTrackerEntry {
- this.c();
- }
-
-+ // Purpur start - respawn burning item entities on client (client kills them)
-+ if (tracker.fireTicks > 0 && tracker instanceof EntityItem) {
-+ EntityItem item = (EntityItem) tracker;
-+ if (item.immuneToFire && !item.dead) {
-+ item.respawnOnClient();
-+ }
-+ }
-+ // Purpur end
-+
- if (this.tickCounter % this.d == 0 || this.tracker.impulse || this.tracker.getDataWatcher().a()) {
- int i;
- int j;
diff --git a/src/main/java/net/minecraft/server/level/PlayerChunkMap.java b/src/main/java/net/minecraft/server/level/PlayerChunkMap.java
-index 737851cde7752e7cccf226f1868a38d6411bfb31..ae32fe66a70d583993fe81de4c95b7b2fe8a6fc8 100644
+index 0b48961a18da76dd25c0930f393f0ac9f709ad78..7444878986c802ff10f67e9d5d9ba277db709af4 100644
--- a/src/main/java/net/minecraft/server/level/PlayerChunkMap.java
+++ b/src/main/java/net/minecraft/server/level/PlayerChunkMap.java
-@@ -2457,7 +2457,7 @@ Sections go from 0..16. Now whenever a section is not empty, it can potentially
+@@ -2440,7 +2440,7 @@ Sections go from 0..16. Now whenever a section is not empty, it can potentially
public class EntityTracker {
- final EntityTrackerEntry trackerEntry; // Paper - private -> package private
-+ public final EntityTrackerEntry trackerEntry; // Paper - private -> public
- public final Entity tracker; // Airplane - public for chunk
++ public final EntityTrackerEntry trackerEntry; // Paper - private -> package private // Purpur -> public
+ private final Entity tracker;
private final int trackingDistance;
private SectionPosition e;
diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java
@@ -67,60 +43,53 @@ index 0950dcce2353504775813d9f60407361981c801d..6c0b1bc0c710d5795d559fe98af6319a
return this.O == tag;
}
diff --git a/src/main/java/net/minecraft/world/entity/item/EntityItem.java b/src/main/java/net/minecraft/world/entity/item/EntityItem.java
-index 5dc3670f35b04d933e96c4b42aa9fbcf941e69c7..3b84039a76843a0784e2d71bb66dc322450c2cab 100644
+index 5dc3670f35b04d933e96c4b42aa9fbcf941e69c7..92cd61cd6b085a03c502223f3861540d8c9f27e1 100644
--- a/src/main/java/net/minecraft/world/entity/item/EntityItem.java
+++ b/src/main/java/net/minecraft/world/entity/item/EntityItem.java
-@@ -10,10 +10,12 @@ import net.minecraft.nbt.NBTTagCompound;
- import net.minecraft.network.chat.ChatMessage;
- import net.minecraft.network.chat.IChatBaseComponent;
- import net.minecraft.network.protocol.Packet;
-+import net.minecraft.network.protocol.game.PacketPlayOutEntityMetadata;
- import net.minecraft.network.protocol.game.PacketPlayOutSpawnEntity;
- import net.minecraft.network.syncher.DataWatcher;
- import net.minecraft.network.syncher.DataWatcherObject;
- import net.minecraft.network.syncher.DataWatcherRegistry;
-+import net.minecraft.server.level.EntityPlayer;
- import net.minecraft.server.level.WorldServer;
- import net.minecraft.sounds.SoundEffects;
- import net.minecraft.stats.StatisticList;
-@@ -50,6 +52,9 @@ public class EntityItem extends Entity {
+@@ -50,6 +50,12 @@ public class EntityItem extends Entity {
public final float b;
private int lastTick = MinecraftServer.currentTick - 1; // CraftBukkit
public boolean canMobPickup = true; // Paper
-+ public boolean immuneToCactus = false; // Purpur
-+ public boolean immuneToExplosion = false; // Purpur
-+ public boolean immuneToFire = false; // Purpur
++ // Purpur start
++ public boolean immuneToCactus = false;
++ public boolean immuneToExplosion = false;
++ public boolean immuneToFire = false;
++ public boolean immuneToLightning = false;
++ // Purpur end
public EntityItem(EntityTypes extends EntityItem> entitytypes, World world) {
super(entitytypes, world);
-@@ -301,6 +306,16 @@ public class EntityItem extends Entity {
+@@ -301,6 +307,16 @@ public class EntityItem extends Entity {
return false;
} else if (!this.getItemStack().getItem().a(damagesource)) {
return false;
+ // Purpur start
-+ } else if (immuneToCactus && damagesource == DamageSource.CACTUS) {
-+ respawnOnClient();
-+ return false;
-+ } else if (immuneToFire && (damagesource.isFire() || damagesource == DamageSource.FIRE)) {
-+ return false;
-+ } else if (immuneToExplosion && damagesource.isExplosion()) {
++ } else if (
++ (immuneToCactus && damagesource == DamageSource.CACTUS) ||
++ (immuneToFire && (damagesource.isFire() || damagesource == DamageSource.FIRE)) ||
++ (immuneToLightning && damagesource == DamageSource.LIGHTNING) ||
++ (immuneToExplosion && damagesource.isExplosion())
++ ) {
+ respawnOnClient();
+ return false;
+ // Purpur end
} else {
// CraftBukkit start
if (org.bukkit.craftbukkit.event.CraftEventFactory.handleNonLivingEntityDamageEvent(this, damagesource, f)) {
-@@ -481,6 +496,9 @@ public class EntityItem extends Entity {
+@@ -481,6 +497,12 @@ public class EntityItem extends Entity {
com.google.common.base.Preconditions.checkArgument(!itemstack.isEmpty(), "Cannot drop air"); // CraftBukkit
this.getDataWatcher().set(EntityItem.ITEM, itemstack);
this.getDataWatcher().markDirty(EntityItem.ITEM); // CraftBukkit - SPIGOT-4591, must mark dirty
-+ if (world.purpurConfig.itemImmuneToCactus.contains(itemstack.getItem())) immuneToCactus = true; // Purpur
-+ if (world.purpurConfig.itemImmuneToExplosion.contains(itemstack.getItem())) immuneToExplosion = true; // Purpur
-+ if (world.purpurConfig.itemImmuneToFire.contains(itemstack.getItem())) immuneToFire = true; // Purpur
++ // Purpur start
++ if (world.purpurConfig.itemImmuneToCactus.contains(itemstack.getItem())) immuneToCactus = true;
++ if (world.purpurConfig.itemImmuneToExplosion.contains(itemstack.getItem())) immuneToExplosion = true;
++ if (world.purpurConfig.itemImmuneToFire.contains(itemstack.getItem())) immuneToFire = true;
++ if (world.purpurConfig.itemImmuneToLightning.contains(itemstack.getItem())) immuneToLightning = true;
++ // Purpur end
}
@Override
-@@ -562,4 +580,15 @@ public class EntityItem extends Entity {
+@@ -562,4 +584,15 @@ public class EntityItem extends Entity {
super.setPositionRaw(x, y, z);
}
// Paper end - fix MC-4
@@ -128,8 +97,8 @@ index 5dc3670f35b04d933e96c4b42aa9fbcf941e69c7..3b84039a76843a0784e2d71bb66dc322
+ // Purpur start
+ public void respawnOnClient() {
+ Packet> spawnPacket = new PacketPlayOutSpawnEntity(this);
-+ Packet> metadataPacket = new PacketPlayOutEntityMetadata(getId(), getDataWatcher(), true);
-+ for (EntityPlayer entityplayer : this.tracker.trackerEntry.trackedPlayers) {
++ Packet> metadataPacket = new net.minecraft.network.protocol.game.PacketPlayOutEntityMetadata(getId(), getDataWatcher(), true);
++ for (net.minecraft.server.level.EntityPlayer entityplayer : this.tracker.trackerEntry.trackedPlayers) {
+ entityplayer.playerConnection.sendPacket(spawnPacket);
+ entityplayer.playerConnection.sendPacket(metadataPacket);
+ }
@@ -137,16 +106,17 @@ index 5dc3670f35b04d933e96c4b42aa9fbcf941e69c7..3b84039a76843a0784e2d71bb66dc322
+ // Purpur end
}
diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-index 321f1811da81ffb31bd26442d2e3386c48d30086..12c3708150475ec16b394c79a78f4f0d740ea611 100644
+index 5e577cd97df14463f590919b2931a5065ac37033..dfcceebc9fbfa62fc14f3c53217af8e39025307d 100644
--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-@@ -135,6 +135,39 @@ public class PurpurWorldConfig {
+@@ -135,6 +135,49 @@ public class PurpurWorldConfig {
}
}
+ public List- itemImmuneToCactus = new ArrayList<>();
+ public List
- itemImmuneToExplosion = new ArrayList<>();
+ public List
- itemImmuneToFire = new ArrayList<>();
++ public List
- itemImmuneToLightning = new ArrayList<>();
+ private void itemSettings() {
+ itemImmuneToCactus.clear();
+ getList("gameplay-mechanics.item.immune.cactus", new ArrayList<>()).forEach(key -> {
@@ -175,16 +145,25 @@ index 321f1811da81ffb31bd26442d2e3386c48d30086..12c3708150475ec16b394c79a78f4f0d
+ Item item = IRegistry.ITEM.get(new MinecraftKey(key.toString()));
+ if (item != Items.AIR) itemImmuneToFire.add(item);
+ });
++ itemImmuneToLightning.clear();
++ getList("gameplay-mechanics.item.immune.lightning", new ArrayList<>()).forEach(key -> {
++ if (key.toString().equals("*")) {
++ IRegistry.ITEM.g().filter(item -> item != Items.AIR).forEach((item) -> itemImmuneToLightning.add(item));
++ return;
++ }
++ Item item = IRegistry.ITEM.get(new MinecraftKey(key.toString()));
++ if (item != Items.AIR) itemImmuneToLightning.add(item);
++ });
+ }
+
public boolean idleTimeoutKick = true;
public boolean idleTimeoutTickNearbyEntities = true;
public boolean idleTimeoutCountAsSleeping = false;
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftItem.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftItem.java
-index 7a78ef2f6f673568c0528fa46168c69d21f51a66..0418291a69216081353c05c99d11dcd913b6b8cb 100644
+index 7a78ef2f6f673568c0528fa46168c69d21f51a66..f91a04abe39f9a75530a213cd84e5024059752d1 100644
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftItem.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftItem.java
-@@ -114,4 +114,36 @@ public class CraftItem extends CraftEntity implements Item {
+@@ -114,4 +114,46 @@ public class CraftItem extends CraftEntity implements Item {
public EntityType getType() {
return EntityType.DROPPED_ITEM;
}
@@ -219,5 +198,15 @@ index 7a78ef2f6f673568c0528fa46168c69d21f51a66..0418291a69216081353c05c99d11dcd9
+ public boolean isImmuneToFire() {
+ return item.immuneToFire;
+ }
++
++ @Override
++ public void setImmuneToLightning(boolean immuneToLightning) {
++ item.immuneToLightning = immuneToLightning;
++ }
++
++ @Override
++ public boolean isImmuneToLightning() {
++ return item.immuneToLightning;
++ }
+ // Purpur end
}
diff --git a/patches/server/0078-Add-ping-command.patch b/patches/server/0077-Add-ping-command.patch
similarity index 97%
rename from patches/server/0078-Add-ping-command.patch
rename to patches/server/0077-Add-ping-command.patch
index e280c942ce..a3b75b0f05 100644
--- a/patches/server/0078-Add-ping-command.patch
+++ b/patches/server/0077-Add-ping-command.patch
@@ -5,7 +5,7 @@ Subject: [PATCH] Add /ping command
diff --git a/src/main/java/net/minecraft/commands/CommandDispatcher.java b/src/main/java/net/minecraft/commands/CommandDispatcher.java
-index c25440e810e61bcdc299a0caebaec54b6862dd3c..cf3776591446ad7b3d1ee1285c5aeffcb5e9495e 100644
+index 5ae31658fb1183eab66f682cc5477bc526c27753..94ed3811cbcc6f60a2c8bb033920f9c1ae2e91d6 100644
--- a/src/main/java/net/minecraft/commands/CommandDispatcher.java
+++ b/src/main/java/net/minecraft/commands/CommandDispatcher.java
@@ -191,6 +191,7 @@ public class CommandDispatcher {
@@ -16,7 +16,7 @@ index c25440e810e61bcdc299a0caebaec54b6862dd3c..cf3776591446ad7b3d1ee1285c5aeffc
}
if (commanddispatcher_servertype.d) {
-@@ -422,10 +423,12 @@ public class CommandDispatcher {
+@@ -427,10 +428,12 @@ public class CommandDispatcher {
}
@@ -29,7 +29,7 @@ index c25440e810e61bcdc299a0caebaec54b6862dd3c..cf3776591446ad7b3d1ee1285c5aeffc
public static RequiredArgumentBuilder a(String s, ArgumentType argumenttype) {
return RequiredArgumentBuilder.argument(s, argumenttype);
}
-@@ -441,6 +444,7 @@ public class CommandDispatcher {
+@@ -446,6 +449,7 @@ public class CommandDispatcher {
};
}
diff --git a/patches/server/0079-Configurable-jockey-options.patch b/patches/server/0078-Configurable-jockey-options.patch
similarity index 98%
rename from patches/server/0079-Configurable-jockey-options.patch
rename to patches/server/0078-Configurable-jockey-options.patch
index 4325f3ab11..fae4b907ef 100644
--- a/patches/server/0079-Configurable-jockey-options.patch
+++ b/patches/server/0078-Configurable-jockey-options.patch
@@ -193,10 +193,10 @@ index f341759f6110b51c856de09248d2f523c58aa712..99d0932e5352589cfbcc48a5e789651d
protected void initDatawatcher() {
super.initDatawatcher();
diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-index 12c3708150475ec16b394c79a78f4f0d740ea611..b01d82d76e07a482fd36a754b46ac22139114232 100644
+index dfcceebc9fbfa62fc14f3c53217af8e39025307d..a12c2ae8291114f17bbb05761272bf724f848b1c 100644
--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-@@ -309,6 +309,15 @@ public class PurpurWorldConfig {
+@@ -321,6 +321,15 @@ public class PurpurWorldConfig {
creeperChargedChance = getDouble("mobs.creeper.naturally-charged-chance", creeperChargedChance);
}
@@ -212,7 +212,7 @@ index 12c3708150475ec16b394c79a78f4f0d740ea611..b01d82d76e07a482fd36a754b46ac221
public boolean enderDragonAlwaysDropsFullExp = false;
private void enderDragonSettings() {
enderDragonAlwaysDropsFullExp = getBoolean("mobs.ender_dragon.always-drop-full-exp", enderDragonAlwaysDropsFullExp);
-@@ -346,6 +355,15 @@ public class PurpurWorldConfig {
+@@ -358,6 +367,15 @@ public class PurpurWorldConfig {
giantMaxHealth = getDouble("mobs.giant.attributes.max-health", giantMaxHealth);
}
@@ -228,7 +228,7 @@ index 12c3708150475ec16b394c79a78f4f0d740ea611..b01d82d76e07a482fd36a754b46ac221
public double illusionerMovementSpeed = 0.5D;
public double illusionerFollowRange = 18.0D;
public double illusionerMaxHealth = 32.0D;
-@@ -421,8 +439,35 @@ public class PurpurWorldConfig {
+@@ -433,8 +451,35 @@ public class PurpurWorldConfig {
witherSkeletonTakesWitherDamage = getBoolean("mobs.wither_skeleton.takes-wither-damage", witherSkeletonTakesWitherDamage);
}
diff --git a/patches/server/0080-Phantoms-attracted-to-crystals-and-crystals-shoot-ph.patch b/patches/server/0079-Phantoms-attracted-to-crystals-and-crystals-shoot-ph.patch
similarity index 99%
rename from patches/server/0080-Phantoms-attracted-to-crystals-and-crystals-shoot-ph.patch
rename to patches/server/0079-Phantoms-attracted-to-crystals-and-crystals-shoot-ph.patch
index 8b62666365..5d442f7434 100644
--- a/patches/server/0080-Phantoms-attracted-to-crystals-and-crystals-shoot-ph.patch
+++ b/patches/server/0079-Phantoms-attracted-to-crystals-and-crystals-shoot-ph.patch
@@ -350,10 +350,10 @@ index 42cf3fa42b73739182d26fbb524ee5b304c799b2..daf738e8f0987aa6ab200189d7a26d16
return entityliving != null ? EntityPhantom.this.a(EntityPhantom.this.getGoalTarget(), PathfinderTargetCondition.a) : false;
diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-index b01d82d76e07a482fd36a754b46ac22139114232..3194e8e31e9e98ed5ab81ebb45b4c765938db5f6 100644
+index a12c2ae8291114f17bbb05761272bf724f848b1c..3aec221db2cd425bc5188979bb0fc0625ca40f4a 100644
--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-@@ -383,6 +383,15 @@ public class PurpurWorldConfig {
+@@ -395,6 +395,15 @@ public class PurpurWorldConfig {
ironGolemCanSwim = getBoolean("mobs.iron_golem.can-swim", ironGolemCanSwim);
}
diff --git a/patches/server/0081-Add-phantom-spawning-options.patch b/patches/server/0080-Add-phantom-spawning-options.patch
similarity index 99%
rename from patches/server/0081-Add-phantom-spawning-options.patch
rename to patches/server/0080-Add-phantom-spawning-options.patch
index 00be25533c..7b59963d51 100644
--- a/patches/server/0081-Add-phantom-spawning-options.patch
+++ b/patches/server/0080-Add-phantom-spawning-options.patch
@@ -262,10 +262,10 @@ index e4f5e570636862481aac92ec9b74d6cf5723eb6e..e954adeff4fbfc1aa85ac3785c0c4c86
}
}
diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-index 3194e8e31e9e98ed5ab81ebb45b4c765938db5f6..041415d72d1c738dfa97c68ca47d0eaf473f33a2 100644
+index 3aec221db2cd425bc5188979bb0fc0625ca40f4a..d957ee4c10fde8596442f2f05f0347994df7bae5 100644
--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-@@ -386,10 +386,34 @@ public class PurpurWorldConfig {
+@@ -398,10 +398,34 @@ public class PurpurWorldConfig {
public double phantomAttackedByCrystalRadius = 0.0D;
public float phantomAttackedByCrystalDamage = 1.0F;
public double phantomOrbitCrystalRadius = 0.0D;
diff --git a/patches/server/0082-Implement-bed-explosion-options.patch b/patches/server/0081-Implement-bed-explosion-options.patch
similarity index 95%
rename from patches/server/0082-Implement-bed-explosion-options.patch
rename to patches/server/0081-Implement-bed-explosion-options.patch
index da06739d6b..fb42837554 100644
--- a/patches/server/0082-Implement-bed-explosion-options.patch
+++ b/patches/server/0081-Implement-bed-explosion-options.patch
@@ -18,7 +18,7 @@ index abe0a1c309d526de37efcac44922fa259e1d112c..db9ef25d0578538fd7c7950a3b3d0345
}
}
diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-index 041415d72d1c738dfa97c68ca47d0eaf473f33a2..7f934f3f630188e5ebcd3c216e2ae64ab2dc9dbf 100644
+index d957ee4c10fde8596442f2f05f0347994df7bae5..83f43b44946a9e5aeecacae776684934685d79ac 100644
--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
@@ -1,6 +1,7 @@
@@ -37,7 +37,7 @@ index 041415d72d1c738dfa97c68ca47d0eaf473f33a2..7f934f3f630188e5ebcd3c216e2ae64a
import static net.pl3x.purpur.PurpurConfig.log;
-@@ -246,6 +248,22 @@ public class PurpurWorldConfig {
+@@ -258,6 +260,22 @@ public class PurpurWorldConfig {
});
}
diff --git a/patches/server/0083-Implement-respawn-anchor-explosion-options.patch b/patches/server/0082-Implement-respawn-anchor-explosion-options.patch
similarity index 96%
rename from patches/server/0083-Implement-respawn-anchor-explosion-options.patch
rename to patches/server/0082-Implement-respawn-anchor-explosion-options.patch
index 0f6152cd3f..9c9686eed2 100644
--- a/patches/server/0083-Implement-respawn-anchor-explosion-options.patch
+++ b/patches/server/0082-Implement-respawn-anchor-explosion-options.patch
@@ -30,10 +30,10 @@ index 028e98decf8b0496b4ebcd1aad3aa474e5c4e7c1..9b7a7f1ae50baf53d314bbf1588afeb8
public static boolean a(World world) {
diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-index 7f934f3f630188e5ebcd3c216e2ae64ab2dc9dbf..09320a6d1d4390b59941381d1e0a4d365bb8beab 100644
+index 83f43b44946a9e5aeecacae776684934685d79ac..9d7f7fc586200206ff87dfa463479150ed8cd5f1 100644
--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-@@ -285,6 +285,22 @@ public class PurpurWorldConfig {
+@@ -297,6 +297,22 @@ public class PurpurWorldConfig {
lavaSpeedNotNether = getInt("blocks.lava.speed.not-nether", lavaSpeedNotNether);
}
diff --git a/patches/server/0084-Add-allow-water-in-end-world-option.patch b/patches/server/0083-Add-allow-water-in-end-world-option.patch
similarity index 100%
rename from patches/server/0084-Add-allow-water-in-end-world-option.patch
rename to patches/server/0083-Add-allow-water-in-end-world-option.patch
diff --git a/patches/server/0085-Allow-color-codes-in-books.patch b/patches/server/0084-Allow-color-codes-in-books.patch
similarity index 90%
rename from patches/server/0085-Allow-color-codes-in-books.patch
rename to patches/server/0084-Allow-color-codes-in-books.patch
index a9a4c0b81b..1b4f978ded 100644
--- a/patches/server/0085-Allow-color-codes-in-books.patch
+++ b/patches/server/0084-Allow-color-codes-in-books.patch
@@ -5,10 +5,10 @@ Subject: [PATCH] Allow color codes in books
diff --git a/src/main/java/net/minecraft/server/network/PlayerConnection.java b/src/main/java/net/minecraft/server/network/PlayerConnection.java
-index 4f094f026b118775cae84024b2ba6c33e14784e6..c4ef3fef4db2326a531694e6798bab6103c7061c 100644
+index 3559f52e2fa30a8a7600334ece981fe34896bd68..9998f20c9cc9857612f94f91d27e77da9c632323 100644
--- a/src/main/java/net/minecraft/server/network/PlayerConnection.java
+++ b/src/main/java/net/minecraft/server/network/PlayerConnection.java
-@@ -1211,7 +1211,8 @@ public class PlayerConnection implements PacketListenerPlayIn {
+@@ -1216,7 +1216,8 @@ public class PlayerConnection implements PacketListenerPlayIn {
if (itemstack.getItem() == Items.WRITABLE_BOOK) {
NBTTagList nbttaglist = new NBTTagList();
@@ -18,7 +18,7 @@ index 4f094f026b118775cae84024b2ba6c33e14784e6..c4ef3fef4db2326a531694e6798bab61
ItemStack old = itemstack.cloneItemStack(); // CraftBukkit
itemstack.a("pages", (NBTBase) nbttaglist);
this.player.inventory.setItem(i, CraftEventFactory.handleEditBookEvent(player, i, old, itemstack)); // CraftBukkit // Paper - Don't ignore result (see other callsite for handleEditBookEvent)
-@@ -1229,13 +1230,14 @@ public class PlayerConnection implements PacketListenerPlayIn {
+@@ -1234,13 +1235,14 @@ public class PlayerConnection implements PacketListenerPlayIn {
itemstack1.setTag(nbttagcompound.clone());
}
@@ -35,7 +35,7 @@ index 4f094f026b118775cae84024b2ba6c33e14784e6..c4ef3fef4db2326a531694e6798bab61
ChatComponentText chatcomponenttext = new ChatComponentText(s1);
String s2 = IChatBaseComponent.ChatSerializer.a((IChatBaseComponent) chatcomponenttext);
-@@ -1247,6 +1249,16 @@ public class PlayerConnection implements PacketListenerPlayIn {
+@@ -1252,6 +1254,16 @@ public class PlayerConnection implements PacketListenerPlayIn {
}
}
diff --git a/patches/server/0086-Entity-lifespan.patch b/patches/server/0085-Entity-lifespan.patch
similarity index 95%
rename from patches/server/0086-Entity-lifespan.patch
rename to patches/server/0085-Entity-lifespan.patch
index 6f7ffe99de..1b59ab5443 100644
--- a/patches/server/0086-Entity-lifespan.patch
+++ b/patches/server/0085-Entity-lifespan.patch
@@ -5,10 +5,10 @@ Subject: [PATCH] Entity lifespan
diff --git a/src/main/java/net/minecraft/server/network/PlayerConnection.java b/src/main/java/net/minecraft/server/network/PlayerConnection.java
-index c4ef3fef4db2326a531694e6798bab6103c7061c..92437cf4413ea76ef139b007adf2b76c2729dad2 100644
+index 9998f20c9cc9857612f94f91d27e77da9c632323..4e43cd877c45a014add62547a4dbfadbd09082d2 100644
--- a/src/main/java/net/minecraft/server/network/PlayerConnection.java
+++ b/src/main/java/net/minecraft/server/network/PlayerConnection.java
-@@ -2458,6 +2458,7 @@ public class PlayerConnection implements PacketListenerPlayIn {
+@@ -2463,6 +2463,7 @@ public class PlayerConnection implements PacketListenerPlayIn {
boolean triggerLeashUpdate = itemInHand != null && itemInHand.getItem() == Items.LEAD && entity instanceof EntityInsentient;
Item origItem = this.player.inventory.getItemInHand() == null ? null : this.player.inventory.getItemInHand().getItem();
PlayerInteractEntityEvent event;
@@ -104,7 +104,7 @@ index 84995be65d033dd712211e1e479675815099c3b1..e10377b379079bc467a60abe719075c5
}
diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-index 09320a6d1d4390b59941381d1e0a4d365bb8beab..2289c2ea20bddd4bdd93b1e25c04ed8ad8967053 100644
+index 9d7f7fc586200206ff87dfa463479150ed8cd5f1..fa003079da19ee63a02045d57ea3d6cf64578ebd 100644
--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
@@ -137,6 +137,11 @@ public class PurpurWorldConfig {
diff --git a/patches/server/0087-Add-option-to-teleport-to-spawn-if-outside-world-bor.patch b/patches/server/0086-Add-option-to-teleport-to-spawn-if-outside-world-bor.patch
similarity index 91%
rename from patches/server/0087-Add-option-to-teleport-to-spawn-if-outside-world-bor.patch
rename to patches/server/0086-Add-option-to-teleport-to-spawn-if-outside-world-bor.patch
index b03c0c880f..137f5119d9 100644
--- a/patches/server/0087-Add-option-to-teleport-to-spawn-if-outside-world-bor.patch
+++ b/patches/server/0086-Add-option-to-teleport-to-spawn-if-outside-world-bor.patch
@@ -5,7 +5,7 @@ Subject: [PATCH] Add option to teleport to spawn if outside world border
diff --git a/src/main/java/net/minecraft/server/level/EntityPlayer.java b/src/main/java/net/minecraft/server/level/EntityPlayer.java
-index 0f6760c6922be4a4322ebbc6212b0d88494f5a52..53c2bb5af825255e8c786bf02052f41c5d3e270b 100644
+index 257265a036a62c7d5fbcff17a10a41198ed880a4..da708df0dc50ea02441f9db2bfd52f04d9a8e3da 100644
--- a/src/main/java/net/minecraft/server/level/EntityPlayer.java
+++ b/src/main/java/net/minecraft/server/level/EntityPlayer.java
@@ -2556,4 +2556,26 @@ public class EntityPlayer extends EntityHuman implements ICrafting {
@@ -36,7 +36,7 @@ index 0f6760c6922be4a4322ebbc6212b0d88494f5a52..53c2bb5af825255e8c786bf02052f41c
+ // Purpur end
}
diff --git a/src/main/java/net/minecraft/world/entity/EntityLiving.java b/src/main/java/net/minecraft/world/entity/EntityLiving.java
-index 135e8b14d8b295797b87b2524a084f682bbf98ab..9c4bcc691ad2f6896b28d83f386fc8daa2777a3a 100644
+index 90c931f95dffbf9697ae4678a23d7c142c504a81..620bccdc44d3325dcb4450af979363ee94ba3f97 100644
--- a/src/main/java/net/minecraft/world/entity/EntityLiving.java
+++ b/src/main/java/net/minecraft/world/entity/EntityLiving.java
@@ -45,6 +45,7 @@ import net.minecraft.network.syncher.DataWatcher;
@@ -56,10 +56,10 @@ index 135e8b14d8b295797b87b2524a084f682bbf98ab..9c4bcc691ad2f6896b28d83f386fc8da
}
}
diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-index 2289c2ea20bddd4bdd93b1e25c04ed8ad8967053..22d3b094f23bde7d3195125c46bb09e7fa3c2346 100644
+index fa003079da19ee63a02045d57ea3d6cf64578ebd..cd9970db68b6c2f358115b616c36f52ad324fc90 100644
--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-@@ -230,6 +230,11 @@ public class PurpurWorldConfig {
+@@ -242,6 +242,11 @@ public class PurpurWorldConfig {
playerInvulnerableWhileAcceptingResourcePack = getBoolean("gameplay-mechanics.player.invulnerable-while-accepting-resource-pack", playerInvulnerableWhileAcceptingResourcePack);
}
diff --git a/patches/server/0088-Squid-EAR-immunity.patch b/patches/server/0087-Squid-EAR-immunity.patch
similarity index 93%
rename from patches/server/0088-Squid-EAR-immunity.patch
rename to patches/server/0087-Squid-EAR-immunity.patch
index 9904ce5653..222d6917cd 100644
--- a/patches/server/0088-Squid-EAR-immunity.patch
+++ b/patches/server/0087-Squid-EAR-immunity.patch
@@ -5,10 +5,10 @@ Subject: [PATCH] Squid EAR immunity
diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-index 22d3b094f23bde7d3195125c46bb09e7fa3c2346..9db3bc1540787e16f7d0033f9af5b04079775818 100644
+index cd9970db68b6c2f358115b616c36f52ad324fc90..86578f20429aa6bf5f3de1233c6287ce26be9827 100644
--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-@@ -487,6 +487,11 @@ public class PurpurWorldConfig {
+@@ -499,6 +499,11 @@ public class PurpurWorldConfig {
snowGolemPutPumpkinBack = getBoolean("mobs.snow_golem.pumpkin-can-be-added-back", snowGolemPutPumpkinBack);
}
diff --git a/patches/server/0089-Configurable-end-spike-seed.patch b/patches/server/0088-Configurable-end-spike-seed.patch
similarity index 100%
rename from patches/server/0089-Configurable-end-spike-seed.patch
rename to patches/server/0088-Configurable-end-spike-seed.patch
diff --git a/patches/server/0090-Configurable-dungeon-seed.patch b/patches/server/0089-Configurable-dungeon-seed.patch
similarity index 100%
rename from patches/server/0090-Configurable-dungeon-seed.patch
rename to patches/server/0089-Configurable-dungeon-seed.patch
diff --git a/patches/server/0091-Phantoms-burn-in-light.patch b/patches/server/0090-Phantoms-burn-in-light.patch
similarity index 97%
rename from patches/server/0091-Phantoms-burn-in-light.patch
rename to patches/server/0090-Phantoms-burn-in-light.patch
index 7f79e512dc..847da03927 100644
--- a/patches/server/0091-Phantoms-burn-in-light.patch
+++ b/patches/server/0090-Phantoms-burn-in-light.patch
@@ -86,10 +86,10 @@ index 993a88a5937417016821ef9d7cd58e4ee097491c..64b4fcf6f43c39db0fe57fc7a74f0d95
public static final Item dr = a(Blocks.JACK_O_LANTERN, CreativeModeTab.b);
public static final Item ds = a(Blocks.OAK_TRAPDOOR, CreativeModeTab.d);
diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-index 9db3bc1540787e16f7d0033f9af5b04079775818..ecb26650c17109ea51d4ad4842464e22835c0450 100644
+index 86578f20429aa6bf5f3de1233c6287ce26be9827..201974ec4db915e5a79ed36625f0870a7ff84207 100644
--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-@@ -442,6 +442,9 @@ public class PurpurWorldConfig {
+@@ -454,6 +454,9 @@ public class PurpurWorldConfig {
public int phantomSpawnOverheadRadius = 10;
public int phantomSpawnMinPerAttempt = 1;
public int phantomSpawnMaxPerAttempt = -1;
@@ -99,7 +99,7 @@ index 9db3bc1540787e16f7d0033f9af5b04079775818..ecb26650c17109ea51d4ad4842464e22
private void phantomSettings() {
phantomAttackedByCrystalRadius = getDouble("mobs.phantom.attacked-by-crystal-range", phantomAttackedByCrystalRadius);
phantomAttackedByCrystalDamage = (float) getDouble("mobs.phantom.attacked-by-crystal-damage", phantomAttackedByCrystalDamage);
-@@ -458,6 +461,9 @@ public class PurpurWorldConfig {
+@@ -470,6 +473,9 @@ public class PurpurWorldConfig {
phantomSpawnOverheadRadius = getInt("mobs.phantom.spawn.overhead.radius", phantomSpawnOverheadRadius);
phantomSpawnMinPerAttempt = getInt("mobs.phantom.spawn.per-attempt.min", phantomSpawnMinPerAttempt);
phantomSpawnMaxPerAttempt = getInt("mobs.phantom.spawn.per-attempt.max", phantomSpawnMaxPerAttempt);
diff --git a/patches/server/0092-Configurable-villager-breeding.patch b/patches/server/0091-Configurable-villager-breeding.patch
similarity index 87%
rename from patches/server/0092-Configurable-villager-breeding.patch
rename to patches/server/0091-Configurable-villager-breeding.patch
index 7a303b9bac..c6bcc6a614 100644
--- a/patches/server/0092-Configurable-villager-breeding.patch
+++ b/patches/server/0091-Configurable-villager-breeding.patch
@@ -5,7 +5,7 @@ Subject: [PATCH] Configurable villager breeding
diff --git a/src/main/java/net/minecraft/world/entity/npc/EntityVillager.java b/src/main/java/net/minecraft/world/entity/npc/EntityVillager.java
-index 2fad37812bfa39872e99c4432e1982d62f65efb7..d3032682af94428419daa02f55b6040090d8df73 100644
+index e06f7cfe2d7020f4f6c416d5b82958d3821a1529..e2779521977716aa58bb713de67cb2d9fa8cbe5f 100644
--- a/src/main/java/net/minecraft/world/entity/npc/EntityVillager.java
+++ b/src/main/java/net/minecraft/world/entity/npc/EntityVillager.java
@@ -718,7 +718,7 @@ public class EntityVillager extends EntityVillagerAbstract implements Reputation
@@ -18,10 +18,10 @@ index 2fad37812bfa39872e99c4432e1982d62f65efb7..d3032682af94428419daa02f55b60400
private boolean fr() {
diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-index ecb26650c17109ea51d4ad4842464e22835c0450..70a4fff198851c97de6c36c88bf579be51b8c0da 100644
+index 201974ec4db915e5a79ed36625f0870a7ff84207..db5638c4f2b6d672e619c9ba44184b6d9fe113a1 100644
--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-@@ -505,6 +505,7 @@ public class PurpurWorldConfig {
+@@ -517,6 +517,7 @@ public class PurpurWorldConfig {
public boolean villagerFollowEmeraldBlock = false;
public int villagerSpawnIronGolemRadius = 0;
public int villagerSpawnIronGolemLimit = 0;
@@ -29,7 +29,7 @@ index ecb26650c17109ea51d4ad4842464e22835c0450..70a4fff198851c97de6c36c88bf579be
private void villagerSettings() {
villagerBrainTicks = getInt("mobs.villager.brain-ticks", villagerBrainTicks);
villagerUseBrainTicksOnlyWhenLagging = getBoolean("mobs.villager.use-brain-ticks-only-when-lagging", villagerUseBrainTicksOnlyWhenLagging);
-@@ -513,6 +514,7 @@ public class PurpurWorldConfig {
+@@ -525,6 +526,7 @@ public class PurpurWorldConfig {
villagerFollowEmeraldBlock = getBoolean("mobs.villager.follow-emerald-blocks", villagerFollowEmeraldBlock);
villagerSpawnIronGolemRadius = getInt("mobs.villager.spawn-iron-golem.radius", villagerSpawnIronGolemRadius);
villagerSpawnIronGolemLimit = getInt("mobs.villager.spawn-iron-golem.limit", villagerSpawnIronGolemLimit);
diff --git a/patches/server/0093-Redstone-deactivates-spawners.patch b/patches/server/0092-Redstone-deactivates-spawners.patch
similarity index 93%
rename from patches/server/0093-Redstone-deactivates-spawners.patch
rename to patches/server/0092-Redstone-deactivates-spawners.patch
index 779f61a28d..281da9a683 100644
--- a/patches/server/0093-Redstone-deactivates-spawners.patch
+++ b/patches/server/0092-Redstone-deactivates-spawners.patch
@@ -26,10 +26,10 @@ index 5538404456dfee42257fad9040fcc0fefdfc5fab..b3a03dc66e803d9dc7000cc7d6960e87
public abstract BlockPosition b();
}
diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-index 70a4fff198851c97de6c36c88bf579be51b8c0da..6bfa7faa7c2093c9da55d98343a87bcc6a182ca4 100644
+index db5638c4f2b6d672e619c9ba44184b6d9fe113a1..a36b9ea779fd984a16332e66f122d9505fad67de 100644
--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-@@ -318,6 +318,11 @@ public class PurpurWorldConfig {
+@@ -330,6 +330,11 @@ public class PurpurWorldConfig {
signRightClickEdit = getBoolean("blocks.sign.right-click-edit", signRightClickEdit);
}
diff --git a/patches/server/0094-Totems-work-in-inventory.patch b/patches/server/0093-Totems-work-in-inventory.patch
similarity index 90%
rename from patches/server/0094-Totems-work-in-inventory.patch
rename to patches/server/0093-Totems-work-in-inventory.patch
index 1e1faa2261..8509b4b755 100644
--- a/patches/server/0094-Totems-work-in-inventory.patch
+++ b/patches/server/0093-Totems-work-in-inventory.patch
@@ -5,7 +5,7 @@ Subject: [PATCH] Totems work in inventory
diff --git a/src/main/java/net/minecraft/world/entity/EntityLiving.java b/src/main/java/net/minecraft/world/entity/EntityLiving.java
-index 9c4bcc691ad2f6896b28d83f386fc8daa2777a3a..69101211dc01e5fbd1f156cbd612b4231098da5a 100644
+index 620bccdc44d3325dcb4450af979363ee94ba3f97..c9caa6919d47283331a9e0c79b22590b80293693 100644
--- a/src/main/java/net/minecraft/world/entity/EntityLiving.java
+++ b/src/main/java/net/minecraft/world/entity/EntityLiving.java
@@ -1426,6 +1426,19 @@ public abstract class EntityLiving extends Entity {
@@ -29,10 +29,10 @@ index 9c4bcc691ad2f6896b28d83f386fc8daa2777a3a..69101211dc01e5fbd1f156cbd612b423
event.setCancelled(itemstack == null);
this.world.getServer().getPluginManager().callEvent(event);
diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-index 6bfa7faa7c2093c9da55d98343a87bcc6a182ca4..1ddd2ca349e303c75e0bb9b848c25f92383e84b5 100644
+index a36b9ea779fd984a16332e66f122d9505fad67de..ad4da617cf718e1c03e1532a9b45d7f927539a14 100644
--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-@@ -235,6 +235,11 @@ public class PurpurWorldConfig {
+@@ -247,6 +247,11 @@ public class PurpurWorldConfig {
teleportIfOutsideBorder = getBoolean("gameplay-mechanics.player.teleport-if-outside-border", teleportIfOutsideBorder);
}
diff --git a/patches/server/0095-Populator-seed-controls.patch b/patches/server/0094-Populator-seed-controls.patch
similarity index 100%
rename from patches/server/0095-Populator-seed-controls.patch
rename to patches/server/0094-Populator-seed-controls.patch
diff --git a/patches/server/0096-Add-vindicator-johnny-spawn-chance.patch b/patches/server/0095-Add-vindicator-johnny-spawn-chance.patch
similarity index 96%
rename from patches/server/0096-Add-vindicator-johnny-spawn-chance.patch
rename to patches/server/0095-Add-vindicator-johnny-spawn-chance.patch
index cf02983f96..389e35cf6a 100644
--- a/patches/server/0096-Add-vindicator-johnny-spawn-chance.patch
+++ b/patches/server/0095-Add-vindicator-johnny-spawn-chance.patch
@@ -30,7 +30,7 @@ index f0eda0b83bab8e3a8adbb569b5997402b0e08e9a..fe84d6d2b74b6ae00c4c66682107296a
}
diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-index 1ddd2ca349e303c75e0bb9b848c25f92383e84b5..55d7c48f0dd03c690b0d0b1fee4f3a5306de8d1d 100644
+index ad4da617cf718e1c03e1532a9b45d7f927539a14..b328c9f69fd43ca7ed57ee7f5b46ca998f2cb672 100644
--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
@@ -40,6 +40,11 @@ public class PurpurWorldConfig {
diff --git a/patches/server/0097-Add-option-to-disable-mushroom-and-note-block-update.patch b/patches/server/0096-Add-option-to-disable-mushroom-and-note-block-update.patch
similarity index 100%
rename from patches/server/0097-Add-option-to-disable-mushroom-and-note-block-update.patch
rename to patches/server/0096-Add-option-to-disable-mushroom-and-note-block-update.patch
diff --git a/patches/server/0098-Dispensers-place-anvils-option.patch b/patches/server/0097-Dispensers-place-anvils-option.patch
similarity index 92%
rename from patches/server/0098-Dispensers-place-anvils-option.patch
rename to patches/server/0097-Dispensers-place-anvils-option.patch
index d95be60247..557ecd82bd 100644
--- a/patches/server/0098-Dispensers-place-anvils-option.patch
+++ b/patches/server/0097-Dispensers-place-anvils-option.patch
@@ -33,7 +33,7 @@ index 0a40df2151bd388b6633a6f50b14f1f41ed4ce62..3ff1d8b3dfaeb875e5e70b97abb79a21
return this.k;
}
diff --git a/src/main/java/net/minecraft/core/dispenser/IDispenseBehavior.java b/src/main/java/net/minecraft/core/dispenser/IDispenseBehavior.java
-index 93093c05da53e5ddc59fac179081af2e0893706d..a6f74fc09843de9ad5af5c45e303e754ceea2c6d 100644
+index 0055a96b51a1d38d31e129c417c97bcfc9d0b745..31237773907341ee64c71507b5e1bf247ef2c524 100644
--- a/src/main/java/net/minecraft/core/dispenser/IDispenseBehavior.java
+++ b/src/main/java/net/minecraft/core/dispenser/IDispenseBehavior.java
@@ -52,6 +52,7 @@ import net.minecraft.world.level.IMaterial;
@@ -44,7 +44,7 @@ index 93093c05da53e5ddc59fac179081af2e0893706d..a6f74fc09843de9ad5af5c45e303e754
import net.minecraft.world.level.block.BlockBeehive;
import net.minecraft.world.level.block.BlockCampfire;
import net.minecraft.world.level.block.BlockDispenser;
-@@ -989,6 +990,23 @@ public interface IDispenseBehavior {
+@@ -995,6 +996,23 @@ public interface IDispenseBehavior {
}
}));
BlockDispenser.a((IMaterial) Items.SHEARS.getItem(), (IDispenseBehavior) (new DispenseBehaviorShears()));
@@ -69,10 +69,10 @@ index 93093c05da53e5ddc59fac179081af2e0893706d..a6f74fc09843de9ad5af5c45e303e754
static void a(ISourceBlock isourceblock, Entity entity, EnumDirection enumdirection) {
diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-index 55d7c48f0dd03c690b0d0b1fee4f3a5306de8d1d..0d29894033d648c3588f4d02646ebe6cdd11f334 100644
+index b328c9f69fd43ca7ed57ee7f5b46ca998f2cb672..54b8021bfac69800d4cec996a94c2fea53249130 100644
--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-@@ -285,8 +285,10 @@ public class PurpurWorldConfig {
+@@ -297,8 +297,10 @@ public class PurpurWorldConfig {
}
public boolean dispenserApplyCursedArmor = true;
diff --git a/patches/server/0099-Allow-anvil-colors.patch b/patches/server/0098-Allow-anvil-colors.patch
similarity index 94%
rename from patches/server/0099-Allow-anvil-colors.patch
rename to patches/server/0098-Allow-anvil-colors.patch
index a5449f5809..21f2238b64 100644
--- a/patches/server/0099-Allow-anvil-colors.patch
+++ b/patches/server/0098-Allow-anvil-colors.patch
@@ -41,10 +41,10 @@ index 1b2d633f3d5d735039f18f27fb1387bd5a74f0d8..77810fbb70bf2e1ad03c28c0d69ceaa6
}
diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-index 0d29894033d648c3588f4d02646ebe6cdd11f334..87eb9d7a9d15640fe8d5892ae609d63dc6754379 100644
+index 54b8021bfac69800d4cec996a94c2fea53249130..96e5aaec4e35bd092e9a71ca5cb61c6a66b9c0fc 100644
--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-@@ -268,6 +268,11 @@ public class PurpurWorldConfig {
+@@ -280,6 +280,11 @@ public class PurpurWorldConfig {
});
}
diff --git a/patches/server/0100-Add-no-random-tick-block-list.patch b/patches/server/0099-Add-no-random-tick-block-list.patch
similarity index 93%
rename from patches/server/0100-Add-no-random-tick-block-list.patch
rename to patches/server/0099-Add-no-random-tick-block-list.patch
index 5bae683817..9a0651d3bb 100644
--- a/patches/server/0100-Add-no-random-tick-block-list.patch
+++ b/patches/server/0099-Add-no-random-tick-block-list.patch
@@ -5,7 +5,7 @@ Subject: [PATCH] Add no-random-tick block list
diff --git a/src/main/java/net/minecraft/server/level/WorldServer.java b/src/main/java/net/minecraft/server/level/WorldServer.java
-index 06517693aacc22c7507a09c15739e0779dbb82b0..9fce5ff2a7980a02510fdc5d1e45d39336d1542a 100644
+index ed81ed932abba0ea72668950f2359c6bc5438c03..449822699f5d9f78a89d747f01e16a64064c57cd 100644
--- a/src/main/java/net/minecraft/server/level/WorldServer.java
+++ b/src/main/java/net/minecraft/server/level/WorldServer.java
@@ -532,14 +532,14 @@ public class WorldServer extends World implements GeneratorAccessSeed {
@@ -26,7 +26,7 @@ index 06517693aacc22c7507a09c15739e0779dbb82b0..9fce5ff2a7980a02510fdc5d1e45d393
this.nextTickListFluid = new TickListServer<>(this, (fluidtype) -> {
return fluidtype == null || fluidtype == FluidTypes.EMPTY;
diff --git a/src/main/java/net/minecraft/world/level/block/state/BlockBase.java b/src/main/java/net/minecraft/world/level/block/state/BlockBase.java
-index 6124b56d935386784371422960a07d518f848cf3..e5f66cdf95b6073545efc8d1527b0a5e2741f79d 100644
+index 1d82f719440c95765c01a588f4785d630b8b527a..0ea0a1fc5f4d879d48bbdf24731dabec10dbccd1 100644
--- a/src/main/java/net/minecraft/world/level/block/state/BlockBase.java
+++ b/src/main/java/net/minecraft/world/level/block/state/BlockBase.java
@@ -671,10 +671,12 @@ public abstract class BlockBase {
@@ -43,7 +43,7 @@ index 6124b56d935386784371422960a07d518f848cf3..e5f66cdf95b6073545efc8d1527b0a5e
}
diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-index 87eb9d7a9d15640fe8d5892ae609d63dc6754379..895480fdb4ce200a2194ab5d0873b5ab1a0b9325 100644
+index 96e5aaec4e35bd092e9a71ca5cb61c6a66b9c0fc..aa4302ba319c0968632025524d5a9c5479a693e2 100644
--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
@@ -11,8 +11,10 @@ import org.bukkit.configuration.ConfigurationSection;
@@ -57,7 +57,7 @@ index 87eb9d7a9d15640fe8d5892ae609d63dc6754379..895480fdb4ce200a2194ab5d0873b5ab
import java.util.logging.Level;
import static net.pl3x.purpur.PurpurConfig.log;
-@@ -235,6 +237,28 @@ public class PurpurWorldConfig {
+@@ -247,6 +249,28 @@ public class PurpurWorldConfig {
playerInvulnerableWhileAcceptingResourcePack = getBoolean("gameplay-mechanics.player.invulnerable-while-accepting-resource-pack", playerInvulnerableWhileAcceptingResourcePack);
}
diff --git a/patches/server/0101-Add-option-to-disable-dolphin-treasure-searching.patch b/patches/server/0100-Add-option-to-disable-dolphin-treasure-searching.patch
similarity index 92%
rename from patches/server/0101-Add-option-to-disable-dolphin-treasure-searching.patch
rename to patches/server/0100-Add-option-to-disable-dolphin-treasure-searching.patch
index ec2fe0d8f8..b6405f16c0 100644
--- a/patches/server/0101-Add-option-to-disable-dolphin-treasure-searching.patch
+++ b/patches/server/0100-Add-option-to-disable-dolphin-treasure-searching.patch
@@ -17,10 +17,10 @@ index 5d18e19eafd5dc01a6caa45075d8c0598f1bb709..e0a9b931c26dbd4e7739d09ae45e1cee
}
diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-index 895480fdb4ce200a2194ab5d0873b5ab1a0b9325..4fa9ca53480538687b3045bac74cbe74136e5fec 100644
+index aa4302ba319c0968632025524d5a9c5479a693e2..c2e4a8a50b0e70283fccce265e76fa78841f47b9 100644
--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-@@ -399,6 +399,11 @@ public class PurpurWorldConfig {
+@@ -411,6 +411,11 @@ public class PurpurWorldConfig {
creeperChargedChance = getDouble("mobs.creeper.naturally-charged-chance", creeperChargedChance);
}
diff --git a/patches/server/0102-Short-enderman-height.patch b/patches/server/0101-Short-enderman-height.patch
similarity index 100%
rename from patches/server/0102-Short-enderman-height.patch
rename to patches/server/0101-Short-enderman-height.patch
diff --git a/patches/server/0103-Stop-squids-floating-on-top-of-water.patch b/patches/server/0102-Stop-squids-floating-on-top-of-water.patch
similarity index 95%
rename from patches/server/0103-Stop-squids-floating-on-top-of-water.patch
rename to patches/server/0102-Stop-squids-floating-on-top-of-water.patch
index 085e376d2b..4feb464d7b 100644
--- a/patches/server/0103-Stop-squids-floating-on-top-of-water.patch
+++ b/patches/server/0102-Stop-squids-floating-on-top-of-water.patch
@@ -51,10 +51,10 @@ index 1f5f3e0d209426b97e32b82dd15176b800f85816..e6757b22497c6e274c3999d58671653e
protected void initPathfinder() {
this.goalSelector.a(0, new EntitySquid.PathfinderGoalSquid(this));
diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-index 4fa9ca53480538687b3045bac74cbe74136e5fec..ffb53daed6bb08d4f448f4d0a6fee6d10710541b 100644
+index c2e4a8a50b0e70283fccce265e76fa78841f47b9..f16f99517999ccbb0b5a678ffcb3befc93a3ae45 100644
--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-@@ -545,8 +545,10 @@ public class PurpurWorldConfig {
+@@ -557,8 +557,10 @@ public class PurpurWorldConfig {
}
public boolean squidImmuneToEAR = true;
diff --git a/patches/server/0104-Ridables.patch b/patches/server/0103-Ridables.patch
similarity index 93%
rename from patches/server/0104-Ridables.patch
rename to patches/server/0103-Ridables.patch
index 31616d053c..abef96672a 100644
--- a/patches/server/0104-Ridables.patch
+++ b/patches/server/0103-Ridables.patch
@@ -5,10 +5,10 @@ Subject: [PATCH] Ridables
diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java
-index 409c272629ca935dcbaa9e73e10ace4a0bd8f9b7..4ceaa8e905c9ba7277ee00cea020d01d14ae2178 100644
+index 0cea9db58772d8c69b5cfdd4a2987593b2c9ea6c..e3c3b2eb03ad132a91140cb459fd8f378154ee2e 100644
--- a/src/main/java/net/minecraft/server/MinecraftServer.java
+++ b/src/main/java/net/minecraft/server/MinecraftServer.java
-@@ -1540,6 +1540,7 @@ public abstract class MinecraftServer extends IAsyncTaskHandlerReentrant 0; // Paper
worldserver.hasEntityMoveEvent = EntityMoveEvent.getHandlerList().getRegisteredListeners().length > 0; // Paper
@@ -18,7 +18,7 @@ index 409c272629ca935dcbaa9e73e10ace4a0bd8f9b7..4ceaa8e905c9ba7277ee00cea020d01d
this.methodProfiler.a(() -> {
diff --git a/src/main/java/net/minecraft/server/PathfinderGoalHasRider.java b/src/main/java/net/minecraft/server/PathfinderGoalHasRider.java
new file mode 100644
-index 0000000000000000000000000000000000000000..70961ec1d385dfd7c17fed6f33e4eb7fd57bc34a
+index 0000000000000000000000000000000000000000..4c5dd9431b9afb2f110228d058d2b0f0808f0ab9
--- /dev/null
+++ b/src/main/java/net/minecraft/server/PathfinderGoalHasRider.java
@@ -0,0 +1,21 @@
@@ -40,7 +40,7 @@ index 0000000000000000000000000000000000000000..70961ec1d385dfd7c17fed6f33e4eb7f
+ // shouldExecute
+ @Override
+ public boolean a() {
-+ return entity.hasRider();
++ return entity.hasPurpurRider();
+ }
+}
diff --git a/src/main/java/net/minecraft/server/PathfinderGoalHorseHasRider.java b/src/main/java/net/minecraft/server/PathfinderGoalHorseHasRider.java
@@ -68,16 +68,32 @@ index 0000000000000000000000000000000000000000..8b66d1215a6eef1302b5ecb46a4b3d50
+ }
+}
diff --git a/src/main/java/net/minecraft/server/level/EntityPlayer.java b/src/main/java/net/minecraft/server/level/EntityPlayer.java
-index 53c2bb5af825255e8c786bf02052f41c5d3e270b..af0253aecc8f3a4125b37aed4548c13b7ad6260a 100644
+index da708df0dc50ea02441f9db2bfd52f04d9a8e3da..0ed513afdab9b4f8e91b55ffc05f6d26bbd14d22 100644
--- a/src/main/java/net/minecraft/server/level/EntityPlayer.java
+++ b/src/main/java/net/minecraft/server/level/EntityPlayer.java
-@@ -642,6 +642,15 @@ public class EntityPlayer extends EntityHuman implements ICrafting {
+@@ -80,7 +80,6 @@ import net.minecraft.server.network.PlayerConnection;
+ import net.minecraft.server.players.PlayerList;
+ import net.minecraft.sounds.SoundCategory;
+ import net.minecraft.sounds.SoundEffect;
+-import net.minecraft.stats.RecipeBook;
+ import net.minecraft.stats.RecipeBookServer;
+ import net.minecraft.stats.ServerStatisticManager;
+ import net.minecraft.stats.Statistic;
+@@ -132,7 +131,6 @@ import net.minecraft.world.level.block.entity.TileEntityCommand;
+ import net.minecraft.world.level.block.entity.TileEntitySign;
+ import net.minecraft.world.level.block.state.IBlockData;
+ import net.minecraft.world.level.portal.ShapeDetectorShape;
+-import net.minecraft.world.level.storage.WorldData;
+ import net.minecraft.world.phys.AxisAlignedBB;
+ import net.minecraft.world.phys.Vec3D;
+ import net.minecraft.world.scores.ScoreboardScore;
+@@ -642,6 +640,15 @@ public class EntityPlayer extends EntityHuman implements ICrafting {
}
this.advancementDataPlayer.b(this);
+
+ // Purpur start
-+ if (this.world.purpurConfig.useNightVisionWhenRiding && this.getVehicle() != null && this.getVehicle().getRider() == this && world.getTime() % 100 == 0) { // 5 seconds
++ if (this.world.purpurConfig.useNightVisionWhenRiding && this.getVehicle() != null && this.getVehicle().getPurpurRider() == this && world.getTime() % 100 == 0) { // 5 seconds
+ MobEffect nightVision = this.getEffect(MobEffects.NIGHT_VISION);
+ if (nightVision == null || nightVision.getDuration() <= 300) { // 15 seconds
+ this.addEffect(new MobEffect(MobEffects.NIGHT_VISION, 400, 0)); // 20 seconds
@@ -88,7 +104,7 @@ index 53c2bb5af825255e8c786bf02052f41c5d3e270b..af0253aecc8f3a4125b37aed4548c13b
public void playerTick() {
diff --git a/src/main/java/net/minecraft/server/level/WorldServer.java b/src/main/java/net/minecraft/server/level/WorldServer.java
-index 9fce5ff2a7980a02510fdc5d1e45d39336d1542a..535cd9faeeb8072b395bff7a3f7ca095afb02df4 100644
+index 449822699f5d9f78a89d747f01e16a64064c57cd..132cf3beabc9206c7ba5fb557bb487fa813cc5a7 100644
--- a/src/main/java/net/minecraft/server/level/WorldServer.java
+++ b/src/main/java/net/minecraft/server/level/WorldServer.java
@@ -216,6 +216,7 @@ public class WorldServer extends World implements GeneratorAccessSeed {
@@ -100,10 +116,10 @@ index 9fce5ff2a7980a02510fdc5d1e45d39336d1542a..535cd9faeeb8072b395bff7a3f7ca095
return new Throwable(entity + " Added to world at " + new java.util.Date());
}
diff --git a/src/main/java/net/minecraft/server/network/PlayerConnection.java b/src/main/java/net/minecraft/server/network/PlayerConnection.java
-index 92437cf4413ea76ef139b007adf2b76c2729dad2..07541f23ee853dae137440129e600d345774cd90 100644
+index 4e43cd877c45a014add62547a4dbfadbd09082d2..bf6c040cfe68f96fa25511967091677abdaf4f0e 100644
--- a/src/main/java/net/minecraft/server/network/PlayerConnection.java
+++ b/src/main/java/net/minecraft/server/network/PlayerConnection.java
-@@ -2467,6 +2467,8 @@ public class PlayerConnection implements PacketListenerPlayIn {
+@@ -2472,6 +2472,8 @@ public class PlayerConnection implements PacketListenerPlayIn {
}
this.server.getPluginManager().callEvent(event);
@@ -133,7 +149,7 @@ index 6ba14f603b8ec69597c70677cc317f802d6afae9..24fd920394774bf38d2818a4cd013670
this.B = true;
return this;
diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java
-index 4e084e26e0430422b0348a0a91f0e412ff3a9eff..4e1363050bef7fff9117250b79cbf35bf6bfc537 100644
+index 4e084e26e0430422b0348a0a91f0e412ff3a9eff..2fed41af0416174a6e23282e3931f0b7d4f6f29f 100644
--- a/src/main/java/net/minecraft/world/entity/Entity.java
+++ b/src/main/java/net/minecraft/world/entity/Entity.java
@@ -22,6 +22,7 @@ import net.minecraft.BlockUtil;
@@ -144,7 +160,15 @@ index 4e084e26e0430422b0348a0a91f0e412ff3a9eff..4e1363050bef7fff9117250b79cbf35b
import net.minecraft.advancements.CriterionTriggers;
import net.minecraft.commands.CommandListenerWrapper;
import net.minecraft.commands.ICommandListener;
-@@ -197,7 +198,7 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, ne
+@@ -104,7 +105,6 @@ import net.minecraft.world.phys.AxisAlignedBB;
+ import net.minecraft.world.phys.MovingObjectPosition;
+ import net.minecraft.world.phys.Vec2F;
+ import net.minecraft.world.phys.Vec3D;
+-import net.minecraft.world.phys.shapes.OperatorBoolean;
+ import net.minecraft.world.phys.shapes.VoxelShape;
+ import net.minecraft.world.phys.shapes.VoxelShapeCollision;
+ import net.minecraft.world.phys.shapes.VoxelShapes;
+@@ -197,7 +197,7 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, ne
private int id;
public boolean i; public final boolean blocksEntitySpawning() { return this.i; } // Paper - OBFHELPER
public final List passengers;
@@ -153,7 +177,7 @@ index 4e084e26e0430422b0348a0a91f0e412ff3a9eff..4e1363050bef7fff9117250b79cbf35b
@Nullable
private Entity vehicle;
public boolean attachedToPlayer;
-@@ -213,7 +214,7 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, ne
+@@ -213,7 +213,7 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, ne
public float lastYaw;
public float lastPitch;
private AxisAlignedBB boundingBox;
@@ -162,7 +186,7 @@ index 4e084e26e0430422b0348a0a91f0e412ff3a9eff..4e1363050bef7fff9117250b79cbf35b
public boolean positionChanged;
public boolean v;
public boolean velocityChanged;
-@@ -269,7 +270,7 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, ne
+@@ -269,7 +269,7 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, ne
private boolean az;
private final double[] aA;
private long aB;
@@ -171,7 +195,7 @@ index 4e084e26e0430422b0348a0a91f0e412ff3a9eff..4e1363050bef7fff9117250b79cbf35b
private float headHeight;
// CraftBukkit start
public boolean persist = true;
-@@ -1621,6 +1622,7 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, ne
+@@ -1621,6 +1621,7 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, ne
return !this.justCreated && this.M.getDouble(TagsFluid.LAVA) > 0.0D;
}
@@ -179,7 +203,7 @@ index 4e084e26e0430422b0348a0a91f0e412ff3a9eff..4e1363050bef7fff9117250b79cbf35b
public void a(float f, Vec3D vec3d) {
Vec3D vec3d1 = a(vec3d, f, this.yaw);
-@@ -2377,6 +2379,7 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, ne
+@@ -2377,6 +2378,7 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, ne
return this.a(entity, false);
}
@@ -187,7 +211,7 @@ index 4e084e26e0430422b0348a0a91f0e412ff3a9eff..4e1363050bef7fff9117250b79cbf35b
public boolean a(Entity entity, boolean flag) {
for (Entity entity1 = entity; entity1.vehicle != null; entity1 = entity1.vehicle) {
if (entity1.vehicle == this) {
-@@ -2472,6 +2475,13 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, ne
+@@ -2472,6 +2474,13 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, ne
this.passengers.add(entity);
}
@@ -195,26 +219,26 @@ index 4e084e26e0430422b0348a0a91f0e412ff3a9eff..4e1363050bef7fff9117250b79cbf35b
+ if (isRidable() && passengers.get(0) == entity && entity instanceof EntityHuman) {
+ EntityHuman entityhuman = (EntityHuman) entity;
+ onMount(entityhuman);
-+ this.rider = entityhuman;
++ this.purpurRider = entityhuman;
+ }
+ // Purpur end
}
return true; // CraftBukkit
}
-@@ -2512,6 +2522,12 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, ne
+@@ -2512,6 +2521,12 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, ne
return false;
}
// Spigot end
+ // Purpur start
-+ if (rider != null && passengers.get(0) == rider) {
-+ onDismount(rider);
-+ this.rider = null;
++ if (purpurRider != null && passengers.get(0) == purpurRider) {
++ onDismount(purpurRider);
++ this.purpurRider = null;
+ }
+ // Purpur end
this.passengers.remove(entity);
entity.j = 60;
}
-@@ -2677,6 +2693,7 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, ne
+@@ -2677,6 +2692,7 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, ne
this.setFlag(4, flag);
}
@@ -222,7 +246,7 @@ index 4e084e26e0430422b0348a0a91f0e412ff3a9eff..4e1363050bef7fff9117250b79cbf35b
public boolean bE() {
return this.glowing || this.world.isClientSide && this.getFlag(6);
}
-@@ -2899,6 +2916,7 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, ne
+@@ -2899,6 +2915,7 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, ne
public void setHeadRotation(float f) {}
@@ -230,7 +254,7 @@ index 4e084e26e0430422b0348a0a91f0e412ff3a9eff..4e1363050bef7fff9117250b79cbf35b
public void n(float f) {}
public boolean bL() {
-@@ -3340,6 +3358,18 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, ne
+@@ -3340,6 +3357,18 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, ne
return false;
}
@@ -249,20 +273,20 @@ index 4e084e26e0430422b0348a0a91f0e412ff3a9eff..4e1363050bef7fff9117250b79cbf35b
@Override
public void sendMessage(IChatBaseComponent ichatbasecomponent, UUID uuid) {}
-@@ -3792,4 +3822,47 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, ne
+@@ -3792,4 +3821,47 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, ne
return ((ChunkProviderServer) world.getChunkProvider()).isInEntityTickingChunk(this);
}
// Paper end
+
+ // Purpur start
-+ private EntityHuman rider;
++ private EntityHuman purpurRider;
+
-+ public EntityHuman getRider() {
-+ return rider;
++ public EntityHuman getPurpurRider() {
++ return purpurRider;
+ }
+
-+ public boolean hasRider() {
-+ return rider != null;
++ public boolean hasPurpurRider() {
++ return purpurRider != null;
+ }
+
+ public boolean isRidable() {
@@ -298,10 +322,19 @@ index 4e084e26e0430422b0348a0a91f0e412ff3a9eff..4e1363050bef7fff9117250b79cbf35b
+ // Purpur end
}
diff --git a/src/main/java/net/minecraft/world/entity/EntityInsentient.java b/src/main/java/net/minecraft/world/entity/EntityInsentient.java
-index e10377b379079bc467a60abe719075c5ef73e858..df33b46ff1267f0f2692a8956438f3bd1e2a3086 100644
+index e10377b379079bc467a60abe719075c5ef73e858..a5e3809d60a78d4638c81a2279ce15e6a66fd336 100644
--- a/src/main/java/net/minecraft/world/entity/EntityInsentient.java
+++ b/src/main/java/net/minecraft/world/entity/EntityInsentient.java
-@@ -100,7 +100,7 @@ public abstract class EntityInsentient extends EntityLiving {
+@@ -46,8 +46,6 @@ import net.minecraft.world.entity.ai.sensing.EntitySenses;
+ import net.minecraft.world.entity.decoration.EntityHanging;
+ import net.minecraft.world.entity.decoration.EntityLeash;
+ import net.minecraft.world.entity.item.EntityItem;
+-import net.minecraft.world.entity.monster.EntityBlaze;
+-import net.minecraft.world.entity.monster.EntityEnderman;
+ import net.minecraft.world.entity.monster.IMonster;
+ import net.minecraft.world.entity.npc.EntityVillagerAbstract;
+ import net.minecraft.world.entity.player.EntityHuman;
+@@ -100,7 +98,7 @@ public abstract class EntityInsentient extends EntityLiving {
protected int f;
protected ControllerLook lookController;
protected ControllerMove moveController;
@@ -310,7 +343,7 @@ index e10377b379079bc467a60abe719075c5ef73e858..df33b46ff1267f0f2692a8956438f3bd
private final EntityAIBodyControl c;
protected NavigationAbstract navigation;
public PathfinderGoalSelector goalSelector;
-@@ -138,8 +138,8 @@ public abstract class EntityInsentient extends EntityLiving {
+@@ -138,8 +136,8 @@ public abstract class EntityInsentient extends EntityLiving {
this.bA = -1.0F;
this.goalSelector = new PathfinderGoalSelector(world.getMethodProfilerSupplier());
this.targetSelector = new PathfinderGoalSelector(world.getMethodProfilerSupplier());
@@ -321,7 +354,7 @@ index e10377b379079bc467a60abe719075c5ef73e858..df33b46ff1267f0f2692a8956438f3bd
this.bi = new ControllerJump(this);
this.c = this.r();
this.navigation = this.b(world);
-@@ -328,10 +328,10 @@ public abstract class EntityInsentient extends EntityLiving {
+@@ -328,10 +326,10 @@ public abstract class EntityInsentient extends EntityLiving {
// Purpur start
private void incrementTicksSinceLastInteraction() {
++ticksSinceLastInteraction;
@@ -329,14 +362,14 @@ index e10377b379079bc467a60abe719075c5ef73e858..df33b46ff1267f0f2692a8956438f3bd
- // ticksSinceLastInteraction = 0;
- // return;
- //}
-+ if (hasRider()) {
++ if (hasPurpurRider()) {
+ ticksSinceLastInteraction = 0;
+ return;
+ }
if (world.purpurConfig.entityLifeSpan <= 0) {
return; // feature disabled
}
-@@ -626,14 +626,17 @@ public abstract class EntityInsentient extends EntityLiving {
+@@ -626,14 +624,17 @@ public abstract class EntityInsentient extends EntityLiving {
return super.dp();
}
@@ -354,7 +387,7 @@ index e10377b379079bc467a60abe719075c5ef73e858..df33b46ff1267f0f2692a8956438f3bd
public void v(float f) {
this.aR = f;
}
-@@ -1332,7 +1335,7 @@ public abstract class EntityInsentient extends EntityLiving {
+@@ -1332,7 +1333,7 @@ public abstract class EntityInsentient extends EntityLiving {
protected void a(EntityHuman entityhuman, EntityInsentient entityinsentient) {}
protected EnumInteractionResult b(EntityHuman entityhuman, EnumHand enumhand) {
@@ -363,7 +396,7 @@ index e10377b379079bc467a60abe719075c5ef73e858..df33b46ff1267f0f2692a8956438f3bd
}
public boolean ev() {
-@@ -1713,4 +1716,54 @@ public abstract class EntityInsentient extends EntityLiving {
+@@ -1713,4 +1714,54 @@ public abstract class EntityInsentient extends EntityLiving {
this.unleash(true, event.isDropLeash());
// Paper end
}
@@ -419,7 +452,7 @@ index e10377b379079bc467a60abe719075c5ef73e858..df33b46ff1267f0f2692a8956438f3bd
+ // Purpur end
}
diff --git a/src/main/java/net/minecraft/world/entity/EntityLiving.java b/src/main/java/net/minecraft/world/entity/EntityLiving.java
-index 69101211dc01e5fbd1f156cbd612b4231098da5a..2d3ec6505b91a2cb43a1e2285a7d4e57a54e243c 100644
+index c9caa6919d47283331a9e0c79b22590b80293693..8b7a2eaa4f73b72f9022dbf58a46239541c81ff7 100644
--- a/src/main/java/net/minecraft/world/entity/EntityLiving.java
+++ b/src/main/java/net/minecraft/world/entity/EntityLiving.java
@@ -559,7 +559,7 @@ public abstract class EntityLiving extends Entity {
@@ -471,12 +504,12 @@ index 69101211dc01e5fbd1f156cbd612b4231098da5a..2d3ec6505b91a2cb43a1e2285a7d4e57
}
}
+ // Purpur start
-+ if (hasRider()) {
-+ getRider().resetIdleTimer();
++ if (hasPurpurRider()) {
++ getPurpurRider().resetIdleTimer();
+ if (((WorldServer) world).hasRidableMoveEvent && this instanceof EntityInsentient) {
+ Location from = new Location(world.getWorld(), lastX, lastY, lastZ, lastYaw, lastPitch);
+ Location to = new Location(world.getWorld(), locX(), locY(), locZ(), yaw, pitch);
-+ net.pl3x.purpur.event.entity.RidableMoveEvent event = new net.pl3x.purpur.event.entity.RidableMoveEvent((org.bukkit.entity.Mob) getBukkitLivingEntity(), (Player) getRider().getBukkitEntity(), from, to.clone());
++ net.pl3x.purpur.event.entity.RidableMoveEvent event = new net.pl3x.purpur.event.entity.RidableMoveEvent((org.bukkit.entity.Mob) getBukkitLivingEntity(), (Player) getPurpurRider().getBukkitEntity(), from, to.clone());
+ if (!event.callEvent()) {
+ setLocation(from.getX(), from.getY(), from.getZ(), from.getYaw(), from.getPitch());
+ } else if (!to.equals(event.getTo())) {
@@ -646,7 +679,7 @@ index 2aa5789437ba7eb20579da238c407a65a25b1d44..434229b146978ba7dc08a83ea55fdb3a
public ControllerMove(EntityInsentient entityinsentient) {
diff --git a/src/main/java/net/minecraft/world/entity/ambient/EntityBat.java b/src/main/java/net/minecraft/world/entity/ambient/EntityBat.java
-index 341b95f73a839a548b202e7bf97fd18760c71fd8..eed98fd7e84b4f390b8b356258f5011da561a343 100644
+index 341b95f73a839a548b202e7bf97fd18760c71fd8..a99c2b4281196ad3b93292da52fc4c6bf4207181 100644
--- a/src/main/java/net/minecraft/world/entity/ambient/EntityBat.java
+++ b/src/main/java/net/minecraft/world/entity/ambient/EntityBat.java
@@ -22,6 +22,7 @@ import net.minecraft.world.entity.EntityPose;
@@ -693,7 +726,7 @@ index 341b95f73a839a548b202e7bf97fd18760c71fd8..eed98fd7e84b4f390b8b356258f5011d
+ @Override
+ public void g(Vec3D vec3d) {
+ super.g(vec3d);
-+ if (hasRider() && !onGround) {
++ if (hasPurpurRider() && !onGround) {
+ float speed = (float) getAttributeInstance(GenericAttributes.FLYING_SPEED).getValue() * 2;
+ setSpeed(speed);
+ Vec3D mot = getMot();
@@ -720,7 +753,7 @@ index 341b95f73a839a548b202e7bf97fd18760c71fd8..eed98fd7e84b4f390b8b356258f5011d
@Override
protected void mobTick() {
+ // Purpur start
-+ if (hasRider()) {
++ if (hasPurpurRider()) {
+ Vec3D mot = getMot();
+ setMot(mot.x, mot.y + (getVertical() > 0 ? 0.07D : 0.0D), mot.z);
+ return;
@@ -730,7 +763,7 @@ index 341b95f73a839a548b202e7bf97fd18760c71fd8..eed98fd7e84b4f390b8b356258f5011d
BlockPosition blockposition = this.getChunkCoordinates();
BlockPosition blockposition1 = blockposition.up();
diff --git a/src/main/java/net/minecraft/world/entity/animal/EntityBee.java b/src/main/java/net/minecraft/world/entity/animal/EntityBee.java
-index 1d1f71a995a99b2101891a7a5bda7bec5d67f118..0c6d3dae70eeea844a31f9edf54410db13e0b04b 100644
+index 1d1f71a995a99b2101891a7a5bda7bec5d67f118..bcd510e0bf647a240edfaac1348119c5e1d7dc42 100644
--- a/src/main/java/net/minecraft/world/entity/animal/EntityBee.java
+++ b/src/main/java/net/minecraft/world/entity/animal/EntityBee.java
@@ -22,6 +22,7 @@ import net.minecraft.network.protocol.game.PacketDebug;
@@ -741,7 +774,7 @@ index 1d1f71a995a99b2101891a7a5bda7bec5d67f118..0c6d3dae70eeea844a31f9edf54410db
import net.minecraft.server.level.WorldServer;
import net.minecraft.sounds.SoundEffect;
import net.minecraft.sounds.SoundEffects;
-@@ -44,6 +45,7 @@ import net.minecraft.world.entity.EntityPose;
+@@ -44,10 +45,10 @@ import net.minecraft.world.entity.EntityPose;
import net.minecraft.world.entity.EntitySize;
import net.minecraft.world.entity.EntityTypes;
import net.minecraft.world.entity.EnumMonsterType;
@@ -749,7 +782,11 @@ index 1d1f71a995a99b2101891a7a5bda7bec5d67f118..0c6d3dae70eeea844a31f9edf54410db
import net.minecraft.world.entity.IEntityAngerable;
import net.minecraft.world.entity.ai.attributes.AttributeProvider;
import net.minecraft.world.entity.ai.attributes.GenericAttributes;
-@@ -111,6 +113,7 @@ public class EntityBee extends EntityAnimal implements IEntityAngerable, EntityB
+-import net.minecraft.world.entity.ai.control.ControllerLook;
+ import net.minecraft.world.entity.ai.control.ControllerMoveFlying;
+ import net.minecraft.world.entity.ai.goal.PathfinderGoal;
+ import net.minecraft.world.entity.ai.goal.PathfinderGoalBreed;
+@@ -111,6 +112,7 @@ public class EntityBee extends EntityAnimal implements IEntityAngerable, EntityB
public EntityBee(EntityTypes extends EntityBee> entitytypes, World world) {
super(entitytypes, world);
@@ -757,7 +794,7 @@ index 1d1f71a995a99b2101891a7a5bda7bec5d67f118..0c6d3dae70eeea844a31f9edf54410db
// Paper start - apply gravity to bees when they get stuck in the void, fixes MC-167279
this.moveController = new ControllerMoveFlying(this, 20, true) {
@Override
-@@ -120,6 +123,22 @@ public class EntityBee extends EntityAnimal implements IEntityAngerable, EntityB
+@@ -120,6 +122,22 @@ public class EntityBee extends EntityAnimal implements IEntityAngerable, EntityB
}
super.tick();
}
@@ -765,8 +802,8 @@ index 1d1f71a995a99b2101891a7a5bda7bec5d67f118..0c6d3dae70eeea844a31f9edf54410db
+ // Purpur start
+ @Override
+ public void a() { // tick
-+ if (getEntity().hasRider()) {
-+ flyingController.tick(getEntity().getRider());
++ if (getEntity().hasPurpurRider()) {
++ flyingController.tick(getEntity().getPurpurRider());
+ } else {
+ tick();
+ }
@@ -774,13 +811,13 @@ index 1d1f71a995a99b2101891a7a5bda7bec5d67f118..0c6d3dae70eeea844a31f9edf54410db
+
+ @Override
+ public boolean b() { // isUpdating
-+ return getEntity().hasRider() || super.b();
++ return getEntity().hasPurpurRider() || super.b();
+ }
+ // Purpur end
};
// Paper end
this.lookController = new EntityBee.j(this);
-@@ -130,6 +149,35 @@ public class EntityBee extends EntityAnimal implements IEntityAngerable, EntityB
+@@ -130,6 +148,35 @@ public class EntityBee extends EntityAnimal implements IEntityAngerable, EntityB
this.a(PathType.FENCE, -1.0F);
}
@@ -803,7 +840,7 @@ index 1d1f71a995a99b2101891a7a5bda7bec5d67f118..0c6d3dae70eeea844a31f9edf54410db
+ @Override
+ public void g(Vec3D vec3d) {
+ super.g(vec3d);
-+ if (hasRider() && !onGround) {
++ if (hasPurpurRider() && !onGround) {
+ float speed = (float) getAttributeInstance(GenericAttributes.FLYING_SPEED).getValue() * 2;
+ setSpeed(speed);
+ Vec3D mot = getMot();
@@ -816,7 +853,7 @@ index 1d1f71a995a99b2101891a7a5bda7bec5d67f118..0c6d3dae70eeea844a31f9edf54410db
@Override
protected void initDatawatcher() {
super.initDatawatcher();
-@@ -144,6 +192,7 @@ public class EntityBee extends EntityAnimal implements IEntityAngerable, EntityB
+@@ -144,6 +191,7 @@ public class EntityBee extends EntityAnimal implements IEntityAngerable, EntityB
@Override
protected void initPathfinder() {
@@ -824,7 +861,7 @@ index 1d1f71a995a99b2101891a7a5bda7bec5d67f118..0c6d3dae70eeea844a31f9edf54410db
this.goalSelector.a(0, new EntityBee.b(this, 1.399999976158142D, true));
this.goalSelector.a(1, new EntityBee.d());
this.goalSelector.a(2, new PathfinderGoalBreed(this, 1.0D));
-@@ -159,6 +208,7 @@ public class EntityBee extends EntityAnimal implements IEntityAngerable, EntityB
+@@ -159,6 +207,7 @@ public class EntityBee extends EntityAnimal implements IEntityAngerable, EntityB
this.goalSelector.a(7, new EntityBee.g());
this.goalSelector.a(8, new EntityBee.l());
this.goalSelector.a(9, new PathfinderGoalFloat(this));
@@ -832,7 +869,7 @@ index 1d1f71a995a99b2101891a7a5bda7bec5d67f118..0c6d3dae70eeea844a31f9edf54410db
this.targetSelector.a(1, (new EntityBee.h(this)).a(new Class[0]));
this.targetSelector.a(2, new EntityBee.c(this));
this.targetSelector.a(3, new PathfinderGoalUniversalAngerReset<>(this, true));
-@@ -629,6 +679,7 @@ public class EntityBee extends EntityAnimal implements IEntityAngerable, EntityB
+@@ -629,6 +678,7 @@ public class EntityBee extends EntityAnimal implements IEntityAngerable, EntityB
private d() {
super(); // CraftBukkit - decompile error
@@ -840,7 +877,7 @@ index 1d1f71a995a99b2101891a7a5bda7bec5d67f118..0c6d3dae70eeea844a31f9edf54410db
}
@Override
-@@ -691,6 +742,7 @@ public class EntityBee extends EntityAnimal implements IEntityAngerable, EntityB
+@@ -691,6 +741,7 @@ public class EntityBee extends EntityAnimal implements IEntityAngerable, EntityB
private g() {
super(); // CraftBukkit - decompile error
@@ -848,7 +885,7 @@ index 1d1f71a995a99b2101891a7a5bda7bec5d67f118..0c6d3dae70eeea844a31f9edf54410db
}
@Override
-@@ -755,6 +807,7 @@ public class EntityBee extends EntityAnimal implements IEntityAngerable, EntityB
+@@ -755,6 +806,7 @@ public class EntityBee extends EntityAnimal implements IEntityAngerable, EntityB
private i() {
super(); // CraftBukkit - decompile error
@@ -856,7 +893,7 @@ index 1d1f71a995a99b2101891a7a5bda7bec5d67f118..0c6d3dae70eeea844a31f9edf54410db
}
@Override
-@@ -978,16 +1031,16 @@ public class EntityBee extends EntityAnimal implements IEntityAngerable, EntityB
+@@ -978,16 +1030,16 @@ public class EntityBee extends EntityAnimal implements IEntityAngerable, EntityB
}
}
@@ -877,7 +914,7 @@ index 1d1f71a995a99b2101891a7a5bda7bec5d67f118..0c6d3dae70eeea844a31f9edf54410db
}
diff --git a/src/main/java/net/minecraft/world/entity/animal/EntityCat.java b/src/main/java/net/minecraft/world/entity/animal/EntityCat.java
-index c8f529b3fd227ce3354f442038b27cd716f57254..3efb010d0e045d14051a33bd7465669e415c26bd 100644
+index c8f529b3fd227ce3354f442038b27cd716f57254..bac3035e2382df2d79e592b02395753eee08fa4b 100644
--- a/src/main/java/net/minecraft/world/entity/animal/EntityCat.java
+++ b/src/main/java/net/minecraft/world/entity/animal/EntityCat.java
@@ -14,6 +14,7 @@ import net.minecraft.network.syncher.DataWatcher;
@@ -952,7 +989,7 @@ index c8f529b3fd227ce3354f442038b27cd716f57254..3efb010d0e045d14051a33bd7465669e
@Override
public EnumInteractionResult b(EntityHuman entityhuman, EnumHand enumhand) {
-+ if (hasRider()) return EnumInteractionResult.PASS; // Purpur
++ if (hasPurpurRider()) return EnumInteractionResult.PASS; // Purpur
ItemStack itemstack = entityhuman.b(enumhand);
Item item = itemstack.getItem();
@@ -1033,7 +1070,7 @@ index aac7992a30a0b69cb34097aeb0fe021f54a3cdac..897e0d5ca44a0c475634f08e7d4fcf12
protected ItemStack eK() {
return new ItemStack(Items.COD_BUCKET);
diff --git a/src/main/java/net/minecraft/world/entity/animal/EntityCow.java b/src/main/java/net/minecraft/world/entity/animal/EntityCow.java
-index 962dde5fcc617bc39b7d06a1e295370b9d60696c..cad256514c7df92847522c8d7ddf45ebe02658c4 100644
+index 962dde5fcc617bc39b7d06a1e295370b9d60696c..b2d3fc3151a952ac783101443772736a206a6a3b 100644
--- a/src/main/java/net/minecraft/world/entity/animal/EntityCow.java
+++ b/src/main/java/net/minecraft/world/entity/animal/EntityCow.java
@@ -2,6 +2,7 @@ package net.minecraft.world.entity.animal;
@@ -1071,7 +1108,7 @@ index 962dde5fcc617bc39b7d06a1e295370b9d60696c..cad256514c7df92847522c8d7ddf45eb
@Override
public EnumInteractionResult b(EntityHuman entityhuman, EnumHand enumhand) {
-+ if (hasRider()) return EnumInteractionResult.PASS; // Purpur
++ if (hasPurpurRider()) return EnumInteractionResult.PASS; // Purpur
ItemStack itemstack = entityhuman.b(enumhand);
if (itemstack.getItem() == Items.BUCKET && !this.isBaby()) {
@@ -1125,7 +1162,7 @@ index 962dde5fcc617bc39b7d06a1e295370b9d60696c..cad256514c7df92847522c8d7ddf45eb
this.world.addEntity(mooshroom);
this.die();
diff --git a/src/main/java/net/minecraft/world/entity/animal/EntityDolphin.java b/src/main/java/net/minecraft/world/entity/animal/EntityDolphin.java
-index e0a9b931c26dbd4e7739d09ae45e1cee72ab210c..880c3aaf4e684209879dc921480619e7c61ee4a0 100644
+index e0a9b931c26dbd4e7739d09ae45e1cee72ab210c..e4442716b329f3101bfd39fc7ce13d5419b427bf 100644
--- a/src/main/java/net/minecraft/world/entity/animal/EntityDolphin.java
+++ b/src/main/java/net/minecraft/world/entity/animal/EntityDolphin.java
@@ -16,6 +16,7 @@ import net.minecraft.network.syncher.DataWatcher;
@@ -1161,13 +1198,13 @@ index e0a9b931c26dbd4e7739d09ae45e1cee72ab210c..880c3aaf4e684209879dc921480619e7
+
+ @Override
+ public boolean onSpacebar() {
-+ if (spitCooldown == 0 && hasRider()) {
++ if (spitCooldown == 0 && hasPurpurRider()) {
+ spitCooldown = world.purpurConfig.dolphinSpitCooldown;
-+ if (!hasRider()) {
++ if (!hasPurpurRider()) {
+ return false;
+ }
+
-+ org.bukkit.craftbukkit.entity.CraftPlayer player = (org.bukkit.craftbukkit.entity.CraftPlayer) getRider().getBukkitEntity();
++ org.bukkit.craftbukkit.entity.CraftPlayer player = (org.bukkit.craftbukkit.entity.CraftPlayer) getPurpurRider().getBukkitEntity();
+ if (!player.hasPermission("allow.special.dolphin")) {
+ return false;
+ }
@@ -1266,10 +1303,18 @@ index e0a9b931c26dbd4e7739d09ae45e1cee72ab210c..880c3aaf4e684209879dc921480619e7
this.i.setMot(this.i.getMot().add(0.0D, 0.005D, 0.0D));
}
diff --git a/src/main/java/net/minecraft/world/entity/animal/EntityFish.java b/src/main/java/net/minecraft/world/entity/animal/EntityFish.java
-index cbd7c37cd1d6f5dddcbc515ecc2d9df46e109bfa..bdbb389407a68d7f9fd7db366d710777ec3e2649 100644
+index cbd7c37cd1d6f5dddcbc515ecc2d9df46e109bfa..d9a5d5fb718f8c3d66844279622eae44fe826fff 100644
--- a/src/main/java/net/minecraft/world/entity/animal/EntityFish.java
+++ b/src/main/java/net/minecraft/world/entity/animal/EntityFish.java
-@@ -8,6 +8,7 @@ import net.minecraft.nbt.NBTTagCompound;
+@@ -1,13 +1,14 @@
+ package net.minecraft.world.entity.animal;
+
+ import java.util.Random;
+-import java.util.function.Predicate;
++
+ import net.minecraft.advancements.CriterionTriggers;
+ import net.minecraft.core.BlockPosition;
+ import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.network.syncher.DataWatcher;
import net.minecraft.network.syncher.DataWatcherObject;
import net.minecraft.network.syncher.DataWatcherRegistry;
@@ -1277,7 +1322,15 @@ index cbd7c37cd1d6f5dddcbc515ecc2d9df46e109bfa..bdbb389407a68d7f9fd7db366d710777
import net.minecraft.server.level.EntityPlayer;
import net.minecraft.sounds.SoundEffect;
import net.minecraft.sounds.SoundEffects;
-@@ -116,13 +117,12 @@ public abstract class EntityFish extends EntityWaterAnimal {
+@@ -29,7 +30,6 @@ import net.minecraft.world.entity.ai.control.ControllerMove;
+ import net.minecraft.world.entity.ai.goal.PathfinderGoalAvoidTarget;
+ import net.minecraft.world.entity.ai.goal.PathfinderGoalPanic;
+ import net.minecraft.world.entity.ai.goal.PathfinderGoalRandomSwim;
+-import net.minecraft.world.entity.ai.goal.PathfinderGoalSelector;
+ import net.minecraft.world.entity.ai.navigation.NavigationAbstract;
+ import net.minecraft.world.entity.ai.navigation.NavigationGuardian;
+ import net.minecraft.world.entity.player.EntityHuman;
+@@ -116,13 +116,12 @@ public abstract class EntityFish extends EntityWaterAnimal {
@Override
protected void initPathfinder() {
super.initPathfinder();
@@ -1297,16 +1350,16 @@ index cbd7c37cd1d6f5dddcbc515ecc2d9df46e109bfa..bdbb389407a68d7f9fd7db366d710777
}
@Override
-@@ -133,7 +133,7 @@ public abstract class EntityFish extends EntityWaterAnimal {
+@@ -133,7 +132,7 @@ public abstract class EntityFish extends EntityWaterAnimal {
@Override
public void g(Vec3D vec3d) {
if (this.doAITick() && this.isInWater()) {
- this.a(0.01F, vec3d);
-+ this.a(hasRider() ? getSpeed() : 0.01F, vec3d); // Purpur
++ this.a(hasPurpurRider() ? getSpeed() : 0.01F, vec3d); // Purpur
this.move(EnumMoveType.SELF, this.getMot());
this.setMot(this.getMot().a(0.9D));
if (this.getGoalTarget() == null) {
-@@ -220,9 +220,9 @@ public abstract class EntityFish extends EntityWaterAnimal {
+@@ -220,9 +219,9 @@ public abstract class EntityFish extends EntityWaterAnimal {
@Override
protected void b(BlockPosition blockposition, IBlockData iblockdata) {}
@@ -1318,7 +1371,7 @@ index cbd7c37cd1d6f5dddcbc515ecc2d9df46e109bfa..bdbb389407a68d7f9fd7db366d710777
a(EntityFish entityfish) {
super(entityfish);
-@@ -230,7 +230,15 @@ public abstract class EntityFish extends EntityWaterAnimal {
+@@ -230,7 +229,15 @@ public abstract class EntityFish extends EntityWaterAnimal {
}
@Override
@@ -1349,7 +1402,7 @@ index 21780f5dbcd4384649f08161f0812202ee94c96d..a03b0ed0a3f74ccb7572e1c4fa8e345a
@Override
diff --git a/src/main/java/net/minecraft/world/entity/animal/EntityFox.java b/src/main/java/net/minecraft/world/entity/animal/EntityFox.java
-index cea46348c0876e168376061fbaf258048e9358cb..0c1151b598aa681e63ddaac29e4a589f917fd03b 100644
+index 19a9affdaba52d8e7dc1c4c20d5c0d52829f4989..7b1a6d846f25d8bc659a541fce59df79347ba9bc 100644
--- a/src/main/java/net/minecraft/world/entity/animal/EntityFox.java
+++ b/src/main/java/net/minecraft/world/entity/animal/EntityFox.java
@@ -21,6 +21,7 @@ import net.minecraft.network.syncher.DataWatcher;
@@ -1360,7 +1413,16 @@ index cea46348c0876e168376061fbaf258048e9358cb..0c1151b598aa681e63ddaac29e4a589f
import net.minecraft.server.level.EntityPlayer;
import net.minecraft.server.level.WorldServer;
import net.minecraft.sounds.SoundEffect;
-@@ -127,6 +128,39 @@ public class EntityFox extends EntityAnimal {
+@@ -48,8 +49,6 @@ import net.minecraft.world.entity.GroupDataEntity;
+ import net.minecraft.world.entity.IEntitySelector;
+ import net.minecraft.world.entity.ai.attributes.AttributeProvider;
+ import net.minecraft.world.entity.ai.attributes.GenericAttributes;
+-import net.minecraft.world.entity.ai.control.ControllerLook;
+-import net.minecraft.world.entity.ai.control.ControllerMove;
+ import net.minecraft.world.entity.ai.goal.PathfinderGoal;
+ import net.minecraft.world.entity.ai.goal.PathfinderGoalAvoidTarget;
+ import net.minecraft.world.entity.ai.goal.PathfinderGoalBreed;
+@@ -127,6 +126,39 @@ public class EntityFox extends EntityAnimal {
this.setCanPickupLoot(true);
}
@@ -1377,7 +1439,7 @@ index cea46348c0876e168376061fbaf258048e9358cb..0c1151b598aa681e63ddaac29e4a589f
+
+ @Override
+ public float getJumpHeight() {
-+ return !hasRider() ? super.getJumpHeight() : 0.5F;
++ return !hasPurpurRider() ? super.getJumpHeight() : 0.5F;
+ }
+
+ @Override
@@ -1400,7 +1462,7 @@ index cea46348c0876e168376061fbaf258048e9358cb..0c1151b598aa681e63ddaac29e4a589f
@Override
protected void initDatawatcher() {
super.initDatawatcher();
-@@ -146,6 +180,7 @@ public class EntityFox extends EntityAnimal {
+@@ -146,6 +178,7 @@ public class EntityFox extends EntityAnimal {
return entityliving instanceof EntityFishSchool;
});
this.goalSelector.a(0, new EntityFox.g());
@@ -1408,7 +1470,7 @@ index cea46348c0876e168376061fbaf258048e9358cb..0c1151b598aa681e63ddaac29e4a589f
this.goalSelector.a(1, new EntityFox.b());
this.goalSelector.a(2, new EntityFox.n(2.2D));
this.goalSelector.a(3, new EntityFox.e(1.0D));
-@@ -171,6 +206,7 @@ public class EntityFox extends EntityAnimal {
+@@ -171,6 +204,7 @@ public class EntityFox extends EntityAnimal {
this.goalSelector.a(11, new EntityFox.p());
this.goalSelector.a(12, new EntityFox.j(this, EntityHuman.class, 24.0F));
this.goalSelector.a(13, new EntityFox.r());
@@ -1416,7 +1478,7 @@ index cea46348c0876e168376061fbaf258048e9358cb..0c1151b598aa681e63ddaac29e4a589f
this.targetSelector.a(3, new EntityFox.a(EntityLiving.class, false, false, (entityliving) -> {
return EntityFox.bt.test(entityliving) && !this.c(entityliving.getUniqueID());
}));
-@@ -458,6 +494,7 @@ public class EntityFox extends EntityAnimal {
+@@ -458,6 +492,7 @@ public class EntityFox extends EntityAnimal {
return itemstack1.isEmpty() || this.bD > 0 && item.isFood() && !itemstack1.getItem().isFood();
}
@@ -1424,7 +1486,7 @@ index cea46348c0876e168376061fbaf258048e9358cb..0c1151b598aa681e63ddaac29e4a589f
private void m(ItemStack itemstack) {
if (!itemstack.isEmpty() && !this.world.isClientSide) {
EntityItem entityitem = new EntityItem(this.world, this.locX() + this.getLookDirection().x, this.locY() + 1.0D, this.locZ() + this.getLookDirection().z, itemstack);
-@@ -553,6 +590,7 @@ public class EntityFox extends EntityAnimal {
+@@ -553,6 +588,7 @@ public class EntityFox extends EntityAnimal {
return this.t(16);
}
@@ -1432,7 +1494,7 @@ index cea46348c0876e168376061fbaf258048e9358cb..0c1151b598aa681e63ddaac29e4a589f
public void u(boolean flag) {
this.d(16, flag);
}
-@@ -595,6 +633,7 @@ public class EntityFox extends EntityAnimal {
+@@ -595,6 +631,7 @@ public class EntityFox extends EntityAnimal {
this.setSleeping(false);
}
@@ -1440,7 +1502,7 @@ index cea46348c0876e168376061fbaf258048e9358cb..0c1151b598aa681e63ddaac29e4a589f
private void fd() {
this.w(false);
this.setCrouching(false);
-@@ -760,16 +799,16 @@ public class EntityFox extends EntityAnimal {
+@@ -760,16 +797,16 @@ public class EntityFox extends EntityAnimal {
}
}
@@ -1460,7 +1522,7 @@ index cea46348c0876e168376061fbaf258048e9358cb..0c1151b598aa681e63ddaac29e4a589f
}
}
-@@ -1439,16 +1478,16 @@ public class EntityFox extends EntityAnimal {
+@@ -1439,16 +1476,16 @@ public class EntityFox extends EntityAnimal {
}
}
@@ -1771,7 +1833,7 @@ index 711b322007a0973ff0aebf3c25efbae8fc7741d0..0d912399e1975d9c0d5525f5b89049f4
}
}
diff --git a/src/main/java/net/minecraft/world/entity/animal/EntityParrot.java b/src/main/java/net/minecraft/world/entity/animal/EntityParrot.java
-index 699dd0ac1f8d0d340ab1a560106336fc7cc95d5b..5c26eea7e3e93dc7bcd8b86519e84db58b70cecb 100644
+index 699dd0ac1f8d0d340ab1a560106336fc7cc95d5b..9f705b75a14ba456808485ce4ddef9550aac3fe9 100644
--- a/src/main/java/net/minecraft/world/entity/animal/EntityParrot.java
+++ b/src/main/java/net/minecraft/world/entity/animal/EntityParrot.java
@@ -16,6 +16,7 @@ import net.minecraft.nbt.NBTTagCompound;
@@ -1800,8 +1862,8 @@ index 699dd0ac1f8d0d340ab1a560106336fc7cc95d5b..5c26eea7e3e93dc7bcd8b86519e84db5
+ this.moveController = new ControllerMoveFlying(this, 10, false) {
+ @Override
+ public void a() { // tick
-+ if (getEntity().hasRider()) {
-+ flyingController.tick(getEntity().getRider());
++ if (getEntity().hasPurpurRider()) {
++ flyingController.tick(getEntity().getPurpurRider());
+ } else {
+ tick();
+ }
@@ -1809,7 +1871,7 @@ index 699dd0ac1f8d0d340ab1a560106336fc7cc95d5b..5c26eea7e3e93dc7bcd8b86519e84db5
+
+ @Override
+ public boolean b() { // isUpdating
-+ return getEntity().hasRider() ? getForward() != 0 || getStrafe() != 0 : super.b();
++ return getEntity().hasPurpurRider() ? getForward() != 0 || getStrafe() != 0 : super.b();
+ }
+ };
+ // Purpur end
@@ -1837,7 +1899,7 @@ index 699dd0ac1f8d0d340ab1a560106336fc7cc95d5b..5c26eea7e3e93dc7bcd8b86519e84db5
+ @Override
+ public void g(Vec3D vec3d) {
+ super.g(vec3d);
-+ if (hasRider() && !onGround) {
++ if (hasPurpurRider() && !onGround) {
+ float speed = (float) getAttributeInstance(GenericAttributes.FLYING_SPEED).getValue() * 2;
+ setSpeed(speed);
+ Vec3D mot = getMot();
@@ -1898,7 +1960,7 @@ index 1a540e41e6161d011ca4ed30c68ae9df4567b8db..cef69f99d7bc9b6605b9654c50f43a1e
this.goalSelector.a(3, new PathfinderGoalBreed(this, 1.0D));
this.goalSelector.a(4, new PathfinderGoalTempt(this, 1.2D, RecipeItemStack.a(Items.CARROT_ON_A_STICK), false));
diff --git a/src/main/java/net/minecraft/world/entity/animal/EntityPolarBear.java b/src/main/java/net/minecraft/world/entity/animal/EntityPolarBear.java
-index f25f5ced218555af0d62844a78842cfc7599d608..e686491a469573a3fc466c46be1b7430ff02ba53 100644
+index f25f5ced218555af0d62844a78842cfc7599d608..b46315700b8857318b03b83097fcf829047f8ca4 100644
--- a/src/main/java/net/minecraft/world/entity/animal/EntityPolarBear.java
+++ b/src/main/java/net/minecraft/world/entity/animal/EntityPolarBear.java
@@ -14,6 +14,7 @@ import net.minecraft.network.syncher.DataWatcher;
@@ -1933,7 +1995,7 @@ index f25f5ced218555af0d62844a78842cfc7599d608..e686491a469573a3fc466c46be1b7430
+ @Override
+ public boolean onSpacebar() {
+ if (!isStanding()) {
-+ if (hasRider() && getRider().getForward() == 0 && getRider().getStrafe() == 0) {
++ if (hasPurpurRider() && getPurpurRider().getForward() == 0 && getPurpurRider().getStrafe() == 0) {
+ setStanding(true);
+ playSound(SoundEffects.ENTITY_POLAR_BEAR_WARNING, 1.0F, 1.0F);
+ }
@@ -2013,7 +2075,7 @@ index e9f20d387ccdacfbb1a48dc31e2a6cd4843a0d7b..38fe79872b4b7f4ad4a030fbdf505efb
@Override
diff --git a/src/main/java/net/minecraft/world/entity/animal/EntityRabbit.java b/src/main/java/net/minecraft/world/entity/animal/EntityRabbit.java
-index 180fc927074dc683ad4d482a00dd4e04ff7923d0..fff6bcff9d44c7d49cd2d0c334ea702531c74ea1 100644
+index 180fc927074dc683ad4d482a00dd4e04ff7923d0..4660f37bc89418e0c3767305d390a53f5c0d3c55 100644
--- a/src/main/java/net/minecraft/world/entity/animal/EntityRabbit.java
+++ b/src/main/java/net/minecraft/world/entity/animal/EntityRabbit.java
@@ -10,6 +10,7 @@ import net.minecraft.network.syncher.DataWatcher;
@@ -2024,7 +2086,15 @@ index 180fc927074dc683ad4d482a00dd4e04ff7923d0..fff6bcff9d44c7d49cd2d0c334ea7025
import net.minecraft.server.level.WorldServer;
import net.minecraft.sounds.SoundCategory;
import net.minecraft.sounds.SoundEffect;
-@@ -75,6 +76,18 @@ public class EntityRabbit extends EntityAnimal {
+@@ -27,7 +28,6 @@ import net.minecraft.world.entity.GroupDataEntity;
+ import net.minecraft.world.entity.ai.attributes.AttributeProvider;
+ import net.minecraft.world.entity.ai.attributes.GenericAttributes;
+ import net.minecraft.world.entity.ai.control.ControllerJump;
+-import net.minecraft.world.entity.ai.control.ControllerMove;
+ import net.minecraft.world.entity.ai.goal.PathfinderGoalAvoidTarget;
+ import net.minecraft.world.entity.ai.goal.PathfinderGoalBreed;
+ import net.minecraft.world.entity.ai.goal.PathfinderGoalFloat;
+@@ -75,6 +75,18 @@ public class EntityRabbit extends EntityAnimal {
this.initializePathFinderGoals(); // CraftBukkit - moved code
}
@@ -2043,7 +2113,7 @@ index 180fc927074dc683ad4d482a00dd4e04ff7923d0..fff6bcff9d44c7d49cd2d0c334ea7025
// CraftBukkit start - code from constructor
public void initializePathFinderGoals(){
this.i(0.0D);
-@@ -83,7 +96,8 @@ public class EntityRabbit extends EntityAnimal {
+@@ -83,7 +95,8 @@ public class EntityRabbit extends EntityAnimal {
@Override
public void initPathfinder() {
@@ -2053,14 +2123,14 @@ index 180fc927074dc683ad4d482a00dd4e04ff7923d0..fff6bcff9d44c7d49cd2d0c334ea7025
this.goalSelector.a(1, new EntityRabbit.PathfinderGoalRabbitPanic(this, 2.2D));
this.goalSelector.a(2, new PathfinderGoalBreed(this, 0.8D));
this.goalSelector.a(3, new PathfinderGoalTempt(this, 1.0D, RecipeItemStack.a(Items.CARROT, Items.GOLDEN_CARROT, Blocks.DANDELION), false));
-@@ -96,7 +110,15 @@ public class EntityRabbit extends EntityAnimal {
+@@ -96,7 +109,15 @@ public class EntityRabbit extends EntityAnimal {
}
@Override
- protected float dJ() {
+ // Purpur start
+ public float getJumpHeight() {
-+ if (hasRider()) {
++ if (hasPurpurRider()) {
+ if (getForward() < 0) {
+ setSpeed(getForward() * 2F);
+ }
@@ -2070,7 +2140,7 @@ index 180fc927074dc683ad4d482a00dd4e04ff7923d0..fff6bcff9d44c7d49cd2d0c334ea7025
if (!this.positionChanged && (!this.moveController.b() || this.moveController.e() <= this.locY() + 0.5D)) {
PathEntity pathentity = this.navigation.k();
-@@ -115,7 +137,7 @@ public class EntityRabbit extends EntityAnimal {
+@@ -115,7 +136,7 @@ public class EntityRabbit extends EntityAnimal {
}
@Override
@@ -2079,7 +2149,7 @@ index 180fc927074dc683ad4d482a00dd4e04ff7923d0..fff6bcff9d44c7d49cd2d0c334ea7025
super.jump();
double d0 = this.moveController.c();
-@@ -147,6 +169,7 @@ public class EntityRabbit extends EntityAnimal {
+@@ -147,6 +168,7 @@ public class EntityRabbit extends EntityAnimal {
}
@@ -2087,12 +2157,12 @@ index 180fc927074dc683ad4d482a00dd4e04ff7923d0..fff6bcff9d44c7d49cd2d0c334ea7025
public void eK() {
this.setJumping(true);
this.br = 10;
-@@ -161,6 +184,13 @@ public class EntityRabbit extends EntityAnimal {
+@@ -161,6 +183,13 @@ public class EntityRabbit extends EntityAnimal {
@Override
public void mobTick() {
+ // Purpur start
-+ if (hasRider()) {
++ if (hasPurpurRider()) {
+ handleJumping();
+ return;
+ }
@@ -2101,7 +2171,7 @@ index 180fc927074dc683ad4d482a00dd4e04ff7923d0..fff6bcff9d44c7d49cd2d0c334ea7025
if (this.bt > 0) {
--this.bt;
}
-@@ -211,6 +241,39 @@ public class EntityRabbit extends EntityAnimal {
+@@ -211,6 +240,39 @@ public class EntityRabbit extends EntityAnimal {
this.bs = this.onGround;
}
@@ -2141,7 +2211,7 @@ index 180fc927074dc683ad4d482a00dd4e04ff7923d0..fff6bcff9d44c7d49cd2d0c334ea7025
@Override
public boolean aO() {
return false;
-@@ -540,7 +603,7 @@ public class EntityRabbit extends EntityAnimal {
+@@ -540,7 +602,7 @@ public class EntityRabbit extends EntityAnimal {
}
}
@@ -2150,7 +2220,7 @@ index 180fc927074dc683ad4d482a00dd4e04ff7923d0..fff6bcff9d44c7d49cd2d0c334ea7025
private final EntityRabbit i;
private double j;
-@@ -551,14 +614,14 @@ public class EntityRabbit extends EntityAnimal {
+@@ -551,14 +613,14 @@ public class EntityRabbit extends EntityAnimal {
}
@Override
@@ -2167,7 +2237,7 @@ index 180fc927074dc683ad4d482a00dd4e04ff7923d0..fff6bcff9d44c7d49cd2d0c334ea7025
}
@Override
-@@ -585,14 +648,17 @@ public class EntityRabbit extends EntityAnimal {
+@@ -585,14 +647,17 @@ public class EntityRabbit extends EntityAnimal {
this.c = entityrabbit;
}
@@ -2245,7 +2315,7 @@ index 88bed962bc17242ee6a9c93b7e0fec8bc578b35f..8f3296031f220dd7bb3ae9fe2443e479
this.goalSelector.a(2, new PathfinderGoalBreed(this, 1.0D));
this.goalSelector.a(3, new PathfinderGoalTempt(this, 1.1D, RecipeItemStack.a(Items.WHEAT), false));
diff --git a/src/main/java/net/minecraft/world/entity/animal/EntitySnowman.java b/src/main/java/net/minecraft/world/entity/animal/EntitySnowman.java
-index 44119f52a4f169ffcea53fb69393bfedfd1a62a7..cfcf67e99ae345f77a55771e6a25bdcdb4a9740a 100644
+index 44119f52a4f169ffcea53fb69393bfedfd1a62a7..a692b973717ecc56d808039418599a11aedc2c5a 100644
--- a/src/main/java/net/minecraft/world/entity/animal/EntitySnowman.java
+++ b/src/main/java/net/minecraft/world/entity/animal/EntitySnowman.java
@@ -6,6 +6,7 @@ import net.minecraft.nbt.NBTTagCompound;
@@ -2287,7 +2357,7 @@ index 44119f52a4f169ffcea53fb69393bfedfd1a62a7..cfcf67e99ae345f77a55771e6a25bdcd
return;
}
-+ if (hasRider() && !world.purpurConfig.snowGolemLeaveTrailWhenRidden) return; // Purpur - don't leave snow trail when being ridden
++ if (hasPurpurRider() && !world.purpurConfig.snowGolemLeaveTrailWhenRidden) return; // Purpur - don't leave snow trail when being ridden
IBlockData iblockdata = Blocks.SNOW.getBlockData();
for (int l = 0; l < 4; ++l) {
@@ -2310,7 +2380,7 @@ index 44119f52a4f169ffcea53fb69393bfedfd1a62a7..cfcf67e99ae345f77a55771e6a25bdcd
}
diff --git a/src/main/java/net/minecraft/world/entity/animal/EntitySquid.java b/src/main/java/net/minecraft/world/entity/animal/EntitySquid.java
-index e6757b22497c6e274c3999d58671653e931ebe2b..a9fa18931d93dd7fa428b8cd6a414d4b3a3b4fbb 100644
+index e6757b22497c6e274c3999d58671653e931ebe2b..777c3bcf267d6cf31300588826d3af6b55cab350 100644
--- a/src/main/java/net/minecraft/world/entity/animal/EntitySquid.java
+++ b/src/main/java/net/minecraft/world/entity/animal/EntitySquid.java
@@ -4,6 +4,7 @@ package net.minecraft.world.entity.animal;
@@ -2392,7 +2462,7 @@ index e6757b22497c6e274c3999d58671653e931ebe2b..a9fa18931d93dd7fa428b8cd6a414d4b
public void e() {
+ // Purpur start
+ EntitySquid squid = getSquid();
-+ EntityHuman rider = squid.getRider();
++ EntityHuman rider = squid.getPurpurRider();
+ if (rider != null) {
+ if (rider.jumping) {
+ squid.onSpacebar();
@@ -2784,7 +2854,7 @@ index 2e448a40dbf2fa5b4df4493f14738210615bab38..d57e7c02268e5d8a00b0b5897fa03dce
+ protected void eV() { if (world.purpurConfig.zombieHorseCanSwim) goalSelector.a(0, new PathfinderGoalFloat(this)); } // Purpur
}
diff --git a/src/main/java/net/minecraft/world/entity/animal/horse/EntityLlama.java b/src/main/java/net/minecraft/world/entity/animal/horse/EntityLlama.java
-index 1c6435bf2cd870b795f87368057d8dfc1e1c938a..d1bd7b9a6a8cfb6b609db4229b2f42a40b8b484f 100644
+index 1c6435bf2cd870b795f87368057d8dfc1e1c938a..d25177f9500a084e0f18a20b1eb1c4ac170048ec 100644
--- a/src/main/java/net/minecraft/world/entity/animal/horse/EntityLlama.java
+++ b/src/main/java/net/minecraft/world/entity/animal/horse/EntityLlama.java
@@ -8,6 +8,7 @@ import net.minecraft.nbt.NBTTagCompound;
@@ -2803,8 +2873,8 @@ index 1c6435bf2cd870b795f87368057d8dfc1e1c938a..d1bd7b9a6a8cfb6b609db4229b2f42a4
+ this.moveController = new net.pl3x.purpur.controller.ControllerMoveWASD(this) {
+ @Override
+ public void a() { // tick
-+ if (entity.hasRider() && hasSaddle()) {
-+ tick(entity.getRider());
++ if (entity.hasPurpurRider() && hasSaddle()) {
++ tick(entity.getPurpurRider());
+ } else {
+ tick();
+ }
@@ -2813,8 +2883,8 @@ index 1c6435bf2cd870b795f87368057d8dfc1e1c938a..d1bd7b9a6a8cfb6b609db4229b2f42a4
+ this.lookController = new net.pl3x.purpur.controller.ControllerLookWASD(this) {
+ @Override
+ public void a() { // tick
-+ if (entity.hasRider() && hasSaddle()) {
-+ tick(entity.getRider());
++ if (entity.hasPurpurRider() && hasSaddle()) {
++ tick(entity.getPurpurRider());
+ } else {
+ tick();
+ }
@@ -2927,7 +2997,7 @@ index f1065c2a37835d760fb57194f7edfd029f426b48..3f2065e2939be54639f44501f7aa8ee5
+ // Purpur end
}
diff --git a/src/main/java/net/minecraft/world/entity/boss/enderdragon/EntityEnderDragon.java b/src/main/java/net/minecraft/world/entity/boss/enderdragon/EntityEnderDragon.java
-index 3fff101637708a1a12f9a457bd3512ae94a8f884..7f583c6c15f0191219eb911d901ea28d86c11489 100644
+index 3fff101637708a1a12f9a457bd3512ae94a8f884..b2d1a0144353a1da61221b59a0acc028b0cf746e 100644
--- a/src/main/java/net/minecraft/world/entity/boss/enderdragon/EntityEnderDragon.java
+++ b/src/main/java/net/minecraft/world/entity/boss/enderdragon/EntityEnderDragon.java
@@ -23,6 +23,7 @@ import net.minecraft.world.entity.Entity;
@@ -2996,7 +3066,7 @@ index 3fff101637708a1a12f9a457bd3512ae94a8f884..7f583c6c15f0191219eb911d901ea28d
@Override
public void movementTick() {
+ // Purpur start
-+ boolean hasRider = getRider() != null;
++ boolean hasRider = getPurpurRider() != null;
+ if (hasRider) {
+ if (!hadRider) {
+ hadRider = true;
@@ -3077,7 +3147,7 @@ index 3fff101637708a1a12f9a457bd3512ae94a8f884..7f583c6c15f0191219eb911d901ea28d
this.bF.b(this);
}
diff --git a/src/main/java/net/minecraft/world/entity/boss/wither/EntityWither.java b/src/main/java/net/minecraft/world/entity/boss/wither/EntityWither.java
-index 930fc752ec0a988b17bc556cd428161638a14f27..4c0a555cdb5bc34c73040b9533beaee56cbce70a 100644
+index 930fc752ec0a988b17bc556cd428161638a14f27..73875b925cbf527f91a7c0ec09d350a7a2ec1260 100644
--- a/src/main/java/net/minecraft/world/entity/boss/wither/EntityWither.java
+++ b/src/main/java/net/minecraft/world/entity/boss/wither/EntityWither.java
@@ -12,6 +12,7 @@ import net.minecraft.network.chat.IChatBaseComponent;
@@ -3104,7 +3174,7 @@ index 930fc752ec0a988b17bc556cd428161638a14f27..4c0a555cdb5bc34c73040b9533beaee5
import net.minecraft.world.entity.ai.attributes.AttributeProvider;
import net.minecraft.world.entity.ai.attributes.GenericAttributes;
import net.minecraft.world.entity.ai.goal.PathfinderGoal;
-@@ -48,8 +51,12 @@ import net.minecraft.world.item.Items;
+@@ -48,14 +51,16 @@ import net.minecraft.world.item.Items;
import net.minecraft.world.level.Explosion;
import net.minecraft.world.level.GameRules;
import net.minecraft.world.level.IMaterial;
@@ -3117,7 +3187,13 @@ index 930fc752ec0a988b17bc556cd428161638a14f27..4c0a555cdb5bc34c73040b9533beaee5
import net.minecraft.world.phys.Vec3D;
// CraftBukkit start
-@@ -82,6 +89,7 @@ public class EntityWither extends EntityMonster implements IRangedEntity {
+ import net.minecraft.network.protocol.game.PacketPlayOutWorldEvent;
+-import net.minecraft.server.MinecraftServer;
+-import net.minecraft.server.level.WorldServer;
+ import net.minecraft.world.level.block.Blocks;
+ import org.bukkit.craftbukkit.event.CraftEventFactory;
+ import org.bukkit.event.entity.EntityRegainHealthEvent;
+@@ -82,6 +87,7 @@ public class EntityWither extends EntityMonster implements IRangedEntity {
return entityliving.getMonsterType() != EnumMonsterType.UNDEAD && entityliving.ei();
};
private static final PathfinderTargetCondition bz = (new PathfinderTargetCondition()).a(20.0D).a(EntityWither.by);
@@ -3125,7 +3201,7 @@ index 930fc752ec0a988b17bc556cd428161638a14f27..4c0a555cdb5bc34c73040b9533beaee5
// Paper start
private boolean canPortal = false;
-@@ -94,15 +102,122 @@ public class EntityWither extends EntityMonster implements IRangedEntity {
+@@ -94,15 +100,122 @@ public class EntityWither extends EntityMonster implements IRangedEntity {
this.setHealth(this.getMaxHealth());
this.getNavigation().d(true);
this.f = 50;
@@ -3151,7 +3227,7 @@ index 930fc752ec0a988b17bc556cd428161638a14f27..4c0a555cdb5bc34c73040b9533beaee5
+ @Override
+ public void g(Vec3D vec3d) {
+ super.g(vec3d);
-+ if (hasRider() && !onGround) {
++ if (hasPurpurRider() && !onGround) {
+ float speed = (float) getAttributeInstance(GenericAttributes.FLYING_SPEED).getValue() * 5F;
+ setSpeed(speed);
+ Vec3D mot = getMot();
@@ -3172,7 +3248,7 @@ index 930fc752ec0a988b17bc556cd428161638a14f27..4c0a555cdb5bc34c73040b9533beaee5
+
+ @Override
+ public boolean onClick(EnumHand hand) {
-+ return shoot(getRider(), hand == EnumHand.MAIN_HAND ? new int[]{1} : new int[]{2});
++ return shoot(getPurpurRider(), hand == EnumHand.MAIN_HAND ? new int[]{1} : new int[]{2});
+ }
+
+ public boolean shoot(EntityHuman rider, int[] heads) {
@@ -3249,12 +3325,12 @@ index 930fc752ec0a988b17bc556cd428161638a14f27..4c0a555cdb5bc34c73040b9533beaee5
this.targetSelector.a(1, new PathfinderGoalHurtByTarget(this, new Class[0]));
if(this.world.paperConfig.fixWitherTargetingBug) this.targetSelector.a(2, new PathfinderGoalNearestAttackableTarget<>(this, EntityHuman.class, 0, false, false, null)); // Paper - Fix MC-29274
this.targetSelector.a(2, new PathfinderGoalNearestAttackableTarget<>(this, EntityInsentient.class, 0, false, false, EntityWither.by));
-@@ -245,6 +360,16 @@ public class EntityWither extends EntityMonster implements IRangedEntity {
+@@ -245,6 +358,16 @@ public class EntityWither extends EntityMonster implements IRangedEntity {
@Override
protected void mobTick() {
+ // Purpur start
-+ if (hasRider()) {
++ if (hasPurpurRider()) {
+ Vec3D mot = getMot();
+ setMot(mot.x, mot.y + (getVertical() > 0 ? 0.07D : 0.0D), mot.z);
+ }
@@ -3266,7 +3342,7 @@ index 930fc752ec0a988b17bc556cd428161638a14f27..4c0a555cdb5bc34c73040b9533beaee5
int i;
if (this.getInvul() > 0) {
-@@ -428,7 +553,7 @@ public class EntityWither extends EntityMonster implements IRangedEntity {
+@@ -428,7 +551,7 @@ public class EntityWither extends EntityMonster implements IRangedEntity {
this.bossBattle.removePlayer(entityplayer);
}
@@ -3275,7 +3351,7 @@ index 930fc752ec0a988b17bc556cd428161638a14f27..4c0a555cdb5bc34c73040b9533beaee5
if (i <= 0) {
return this.locX();
} else {
-@@ -439,11 +564,11 @@ public class EntityWither extends EntityMonster implements IRangedEntity {
+@@ -439,11 +562,11 @@ public class EntityWither extends EntityMonster implements IRangedEntity {
}
}
@@ -3289,7 +3365,7 @@ index 930fc752ec0a988b17bc556cd428161638a14f27..4c0a555cdb5bc34c73040b9533beaee5
if (i <= 0) {
return this.locZ();
} else {
-@@ -567,7 +692,7 @@ public class EntityWither extends EntityMonster implements IRangedEntity {
+@@ -567,7 +690,7 @@ public class EntityWither extends EntityMonster implements IRangedEntity {
}
public static AttributeProvider.Builder eK() {
@@ -3298,22 +3374,22 @@ index 930fc752ec0a988b17bc556cd428161638a14f27..4c0a555cdb5bc34c73040b9533beaee5
}
public int getInvul() {
-@@ -579,11 +704,11 @@ public class EntityWither extends EntityMonster implements IRangedEntity {
+@@ -579,11 +702,11 @@ public class EntityWither extends EntityMonster implements IRangedEntity {
}
public int getHeadTarget(int i) {
- return (Integer) this.datawatcher.get((DataWatcherObject) EntityWither.bo.get(i));
-+ return hasRider() ? 0 : this.datawatcher.get(EntityWither.bo.get(i)); // Purpur
++ return hasPurpurRider() ? 0 : this.datawatcher.get(EntityWither.bo.get(i)); // Purpur
}
public void setHeadTarget(int i, int j) {
- this.datawatcher.set((DataWatcherObject) EntityWither.bo.get(i), j);
-+ if (!hasRider()) this.datawatcher.set(EntityWither.bo.get(i), j); // Purpur
++ if (!hasPurpurRider()) this.datawatcher.set(EntityWither.bo.get(i), j); // Purpur
}
public final boolean isPowered() { return this.S_(); } // Paper - OBFHELPER
diff --git a/src/main/java/net/minecraft/world/entity/monster/EntityBlaze.java b/src/main/java/net/minecraft/world/entity/monster/EntityBlaze.java
-index 88a4dcf9feaa5f66da1394c139b795582c00a8ac..9a109ed062e5abedaad295383aca6441321da276 100644
+index 88a4dcf9feaa5f66da1394c139b795582c00a8ac..6553fd92c26d71ac0a60bd046c7f968f2dfe6667 100644
--- a/src/main/java/net/minecraft/world/entity/monster/EntityBlaze.java
+++ b/src/main/java/net/minecraft/world/entity/monster/EntityBlaze.java
@@ -5,6 +5,7 @@ import net.minecraft.core.particles.Particles;
@@ -3363,7 +3439,7 @@ index 88a4dcf9feaa5f66da1394c139b795582c00a8ac..9a109ed062e5abedaad295383aca6441
+ @Override
+ public void g(Vec3D vec3d) {
+ super.g(vec3d);
-+ if (hasRider() && !onGround) {
++ if (hasPurpurRider() && !onGround) {
+ float speed = (float) getAttributeInstance(GenericAttributes.FLYING_SPEED).getValue();
+ setSpeed(speed);
+ Vec3D mot = getMot();
@@ -3398,7 +3474,7 @@ index 88a4dcf9feaa5f66da1394c139b795582c00a8ac..9a109ed062e5abedaad295383aca6441
@Override
protected void mobTick() {
+ // Purpur start
-+ if (hasRider()) {
++ if (hasPurpurRider()) {
+ Vec3D mot = getMot();
+ setMot(mot.x, getVertical() > 0 ? 0.07D : -0.07D, mot.z);
+ return;
@@ -3432,7 +3508,7 @@ index 65d0027186f19f10292ea64976ebb93c12b98394..27baf5cde99d8f25b1e7583c30339fcc
return EntitySpider.eK().a(GenericAttributes.MAX_HEALTH, 12.0D);
}
diff --git a/src/main/java/net/minecraft/world/entity/monster/EntityCreeper.java b/src/main/java/net/minecraft/world/entity/monster/EntityCreeper.java
-index 09df2bd3b523072de0e9858e6e707e3721474422..2cb9908a5c53528b2e02a1231752adc5ad8354f8 100644
+index 09df2bd3b523072de0e9858e6e707e3721474422..1daacdd75c709cd5508434b41589bd57032de27c 100644
--- a/src/main/java/net/minecraft/world/entity/monster/EntityCreeper.java
+++ b/src/main/java/net/minecraft/world/entity/monster/EntityCreeper.java
@@ -6,6 +6,7 @@ import net.minecraft.nbt.NBTTagCompound;
@@ -3481,8 +3557,8 @@ index 09df2bd3b523072de0e9858e6e707e3721474422..2cb9908a5c53528b2e02a1231752adc5
+ if (powerToggleDelay > 0) {
+ powerToggleDelay--;
+ }
-+ if (hasRider()) {
-+ if (getRider().getForward() != 0 || getRider().getStrafe() != 0) {
++ if (hasPurpurRider()) {
++ if (getPurpurRider().getForward() != 0 || getPurpurRider().getStrafe() != 0) {
+ spacebarCharge = 0;
+ setIgnited(false);
+ }
@@ -3508,7 +3584,7 @@ index 09df2bd3b523072de0e9858e6e707e3721474422..2cb9908a5c53528b2e02a1231752adc5
+ spacebarCharge++;
+ if (spacebarCharge > maxFuseTicks - 2) {
+ spacebarCharge = 0;
-+ if (getRider().getBukkitEntity().hasPermission("allow.powered.creeper")) {
++ if (getPurpurRider().getBukkitEntity().hasPermission("allow.powered.creeper")) {
+ powerToggleDelay = 20;
+ setPowered(!isPowered());
+ setIgnited(false);
@@ -3516,8 +3592,8 @@ index 09df2bd3b523072de0e9858e6e707e3721474422..2cb9908a5c53528b2e02a1231752adc5
+ }
+ }
+ if (!isIgnited()) {
-+ if (hasRider() && getRider().getForward() == 0 && getRider().getStrafe() == 0 &&
-+ getRider().getBukkitEntity().hasPermission("allow.special.creeper")) {
++ if (hasPurpurRider() && getPurpurRider().getForward() == 0 && getPurpurRider().getStrafe() == 0 &&
++ getPurpurRider().getBukkitEntity().hasPermission("allow.special.creeper")) {
+ setIgnited(true);
+ return true;
+ }
@@ -3614,7 +3690,7 @@ index ea776755767f29e49de2792afa30f79420d0fa4c..1d4039d61a2c77a38a31947010cee26f
@Override
diff --git a/src/main/java/net/minecraft/world/entity/monster/EntityEnderman.java b/src/main/java/net/minecraft/world/entity/monster/EntityEnderman.java
-index 52aa47036acee2ec21ae2d6f4df634ecbf04b3b0..03fa2cfc1d5bc27e03e9979b3f33d88362c19066 100644
+index 52aa47036acee2ec21ae2d6f4df634ecbf04b3b0..32ed22dbaaed536dd3df0fb59e3c19431ee42540 100644
--- a/src/main/java/net/minecraft/world/entity/monster/EntityEnderman.java
+++ b/src/main/java/net/minecraft/world/entity/monster/EntityEnderman.java
@@ -16,6 +16,7 @@ import net.minecraft.nbt.NBTTagCompound;
@@ -3661,7 +3737,7 @@ index 52aa47036acee2ec21ae2d6f4df634ecbf04b3b0..03fa2cfc1d5bc27e03e9979b3f33d883
@Override
protected void mobTick() {
- if (this.world.isDay() && this.ticksLived >= this.bs + 600) {
-+ if (!hasRider() && this.world.isDay() && this.ticksLived >= this.bs + 600) { // Purpur - no random teleporting
++ if (!hasPurpurRider() && this.world.isDay() && this.ticksLived >= this.bs + 600) { // Purpur - no random teleporting
float f = this.aR();
if (f > 0.5F && this.world.e(this.getChunkCoordinates()) && this.random.nextFloat() * 30.0F < (f - 0.4F) * 2.0F && this.tryEscape(EndermanEscapeEvent.Reason.RUNAWAY)) { // Paper
@@ -3669,7 +3745,7 @@ index 52aa47036acee2ec21ae2d6f4df634ecbf04b3b0..03fa2cfc1d5bc27e03e9979b3f33d883
if (this.isInvulnerable(damagesource)) {
return false;
} else if (net.pl3x.purpur.PurpurConfig.endermanShortHeight && damagesource == DamageSource.STUCK) { return false; // Purpur - no suffocation damage if short height
-+ } else if (hasRider()) { return super.damageEntity(damagesource, f); // Purpur - no teleporting on damage
++ } else if (hasPurpurRider()) { return super.damageEntity(damagesource, f); // Purpur - no teleporting on damage
} else if (damagesource instanceof EntityDamageSourceIndirect) {
if (this.tryEscape(EndermanEscapeEvent.Reason.INDIRECT)) { // Paper start
for (int i = 0; i < 64; ++i) {
@@ -3808,7 +3884,7 @@ index 2aa6b6ca93c25c59ad224348aad1bb34d9bbc6a3..55607910183155080e3d96296421438d
@Override
diff --git a/src/main/java/net/minecraft/world/entity/monster/EntityGhast.java b/src/main/java/net/minecraft/world/entity/monster/EntityGhast.java
-index a3e3f6e07674c54c2d2a02661ce4342b43aafe44..8784647f512d280ee0a092ecd406321268359314 100644
+index a3e3f6e07674c54c2d2a02661ce4342b43aafe44..b6d49740a1c8dfa19e871869b92b307fc8397588 100644
--- a/src/main/java/net/minecraft/world/entity/monster/EntityGhast.java
+++ b/src/main/java/net/minecraft/world/entity/monster/EntityGhast.java
@@ -7,6 +7,7 @@ import net.minecraft.nbt.NBTTagCompound;
@@ -3850,7 +3926,7 @@ index a3e3f6e07674c54c2d2a02661ce4342b43aafe44..8784647f512d280ee0a092ecd4063212
+ @Override
+ public void g(Vec3D vec3d) {
+ super.g(vec3d);
-+ if (hasRider() && !onGround) {
++ if (hasPurpurRider() && !onGround) {
+ float speed = (float) getAttributeInstance(GenericAttributes.FLYING_SPEED).getValue();
+ setSpeed(speed);
+ Vec3D mot = getMot();
@@ -3939,7 +4015,7 @@ index a188a89143cb1b0243dacdec33c446ca4120219f..7395fa90198a9138b2c33273d8f35403
this.targetSelector.a(2, new PathfinderGoalNearestAttackableTarget<>(this, EntityHuman.class, true));
this.targetSelector.a(3, new PathfinderGoalNearestAttackableTarget<>(this, EntityVillager.class, false));
diff --git a/src/main/java/net/minecraft/world/entity/monster/EntityGuardian.java b/src/main/java/net/minecraft/world/entity/monster/EntityGuardian.java
-index d53e2a9d27f9976d1fd8ea30b88a0da089aec7b6..6980b6988549b37a33d204a6e84c9e81d384a57a 100644
+index d53e2a9d27f9976d1fd8ea30b88a0da089aec7b6..66ae664add95f4441724b49a470a2fef569042d6 100644
--- a/src/main/java/net/minecraft/world/entity/monster/EntityGuardian.java
+++ b/src/main/java/net/minecraft/world/entity/monster/EntityGuardian.java
@@ -9,6 +9,7 @@ import net.minecraft.core.particles.Particles;
@@ -4008,7 +4084,7 @@ index d53e2a9d27f9976d1fd8ea30b88a0da089aec7b6..6980b6988549b37a33d204a6e84c9e81
public void g(Vec3D vec3d) {
if (this.doAITick() && this.isInWater()) {
- this.a(0.1F, vec3d);
-+ this.a(hasRider() ? getSpeed() : 0.1F, vec3d); // Purpur
++ this.a(hasPurpurRider() ? getSpeed() : 0.1F, vec3d); // Purpur
this.move(EnumMoveType.SELF, this.getMot());
this.setMot(this.getMot().a(0.9D));
if (!this.eN() && this.getGoalTarget() == null) {
@@ -4153,7 +4229,7 @@ index fe80e93b00f3bb2f297c6528c3951313fa3c08c7..15ed51a2746c09538a425fce25fa25f2
@Override
diff --git a/src/main/java/net/minecraft/world/entity/monster/EntityPhantom.java b/src/main/java/net/minecraft/world/entity/monster/EntityPhantom.java
-index 07ede7b75a65a5815f1ae1ebf03ec0fdb4621afb..a836839b17cbda8ac269f032b141ba448e3bab8c 100644
+index 07ede7b75a65a5815f1ae1ebf03ec0fdb4621afb..1c24a2abe3921fb3cf8341e4fd620d919e2917af 100644
--- a/src/main/java/net/minecraft/world/entity/monster/EntityPhantom.java
+++ b/src/main/java/net/minecraft/world/entity/monster/EntityPhantom.java
@@ -13,6 +13,7 @@ import net.minecraft.network.syncher.DataWatcher;
@@ -4201,7 +4277,7 @@ index 07ede7b75a65a5815f1ae1ebf03ec0fdb4621afb..a836839b17cbda8ac269f032b141ba44
+ @Override
+ public void g(Vec3D vec3d) {
+ super.g(vec3d);
-+ if (hasRider() && !onGround) {
++ if (hasPurpurRider() && !onGround) {
+ float speed = (float) getAttributeInstance(GenericAttributes.FLYING_SPEED).getValue();
+ setSpeed(speed);
+ Vec3D mot = getMot();
@@ -4216,7 +4292,7 @@ index 07ede7b75a65a5815f1ae1ebf03ec0fdb4621afb..a836839b17cbda8ac269f032b141ba44
+
+ @Override
+ public boolean onSpacebar() {
-+ if (hasRider() && getRider().getBukkitEntity().hasPermission("allow.special.phantom")) {
++ if (hasPurpurRider() && getPurpurRider().getBukkitEntity().hasPermission("allow.special.phantom")) {
+ shoot();
+ }
+ return false;
@@ -4259,7 +4335,7 @@ index 07ede7b75a65a5815f1ae1ebf03ec0fdb4621afb..a836839b17cbda8ac269f032b141ba44
@Override
public void movementTick() {
- if (this.isAlive() && ((world.purpurConfig.phantomBurnInDaylight && this.isInDaylight()) || (world.purpurConfig.phantomBurnInLight > 0 && world.getLightLevel(new BlockPosition(this)) >= world.purpurConfig.phantomBurnInLight))) { // Purpur
-+ if (this.isAlive() && !hasRider() && ((world.purpurConfig.phantomBurnInDaylight && this.isInDaylight()) || (world.purpurConfig.phantomBurnInLight > 0 && world.getLightLevel(new BlockPosition(this)) >= world.purpurConfig.phantomBurnInLight))) { // Purpur
++ if (this.isAlive() && !hasPurpurRider() && ((world.purpurConfig.phantomBurnInDaylight && this.isInDaylight()) || (world.purpurConfig.phantomBurnInLight > 0 && world.getLightLevel(new BlockPosition(this)) >= world.purpurConfig.phantomBurnInLight))) { // Purpur
this.setOnFire(8);
}
@@ -4268,7 +4344,7 @@ index 07ede7b75a65a5815f1ae1ebf03ec0fdb4621afb..a836839b17cbda8ac269f032b141ba44
@Override
public boolean a() {
- if (isCirclingCrystal()) return false; // Purpur - pathfinder does not have a flag
-+ if (getRider() != null || isCirclingCrystal()) return false; // Purpur - pathfinder does not have a flag
++ if (getPurpurRider() != null || isCirclingCrystal()) return false; // Purpur - pathfinder does not have a flag
if (this.c > 0) {
--this.c;
return false;
@@ -4277,7 +4353,7 @@ index 07ede7b75a65a5815f1ae1ebf03ec0fdb4621afb..a836839b17cbda8ac269f032b141ba44
@Override
public boolean b() {
- if (isCirclingCrystal()) return false; // Purpur - pathfinder does not have a flag
-+ if (getRider() != null || isCirclingCrystal()) return false; // Purpur - pathfinder does not have a flag
++ if (getPurpurRider() != null || isCirclingCrystal()) return false; // Purpur - pathfinder does not have a flag
EntityLiving entityliving = EntityPhantom.this.getGoalTarget();
return entityliving != null ? EntityPhantom.this.a(entityliving, PathfinderTargetCondition.a) : false;
@@ -4286,7 +4362,7 @@ index 07ede7b75a65a5815f1ae1ebf03ec0fdb4621afb..a836839b17cbda8ac269f032b141ba44
@Override
public boolean a() {
- if (isCirclingCrystal()) return false; // Purpur - pathfinder does not have a flag
-+ if (getRider() != null || isCirclingCrystal()) return false; // Purpur - pathfinder does not have a flag
++ if (getPurpurRider() != null || isCirclingCrystal()) return false; // Purpur - pathfinder does not have a flag
EntityLiving entityliving = EntityPhantom.this.getGoalTarget();
return entityliving != null ? EntityPhantom.this.a(EntityPhantom.this.getGoalTarget(), PathfinderTargetCondition.a) : false;
@@ -4410,7 +4486,7 @@ index ea105fb86553f5212d616c976eaf2a16bf5b6561..2a4ac6e608650d56cc2b564e715b7b68
this.targetSelector.a(2, new PathfinderGoalNearestAttackableTarget<>(this, EntityHuman.class, true));
this.targetSelector.a(3, new PathfinderGoalNearestAttackableTarget<>(this, EntityVillagerAbstract.class, false));
diff --git a/src/main/java/net/minecraft/world/entity/monster/EntityRavager.java b/src/main/java/net/minecraft/world/entity/monster/EntityRavager.java
-index 16d5cae64887b82e67eeb61ccb714e6125ff0c09..dc1ca7b334e89b4d0be775b6f6e6f4222ea02dcc 100644
+index 16d5cae64887b82e67eeb61ccb714e6125ff0c09..cc37e545ece89803fad91801775470df4620bd62 100644
--- a/src/main/java/net/minecraft/world/entity/monster/EntityRavager.java
+++ b/src/main/java/net/minecraft/world/entity/monster/EntityRavager.java
@@ -7,6 +7,7 @@ import javax.annotation.Nullable;
@@ -4421,7 +4497,15 @@ index 16d5cae64887b82e67eeb61ccb714e6125ff0c09..dc1ca7b334e89b4d0be775b6f6e6f422
import net.minecraft.sounds.SoundEffect;
import net.minecraft.sounds.SoundEffects;
import net.minecraft.tags.Tag;
-@@ -61,14 +62,37 @@ public class EntityRavager extends EntityRaider {
+@@ -38,7 +39,6 @@ import net.minecraft.world.level.IBlockAccess;
+ import net.minecraft.world.level.IWorldReader;
+ import net.minecraft.world.level.World;
+ import net.minecraft.world.level.block.Block;
+-import net.minecraft.world.level.block.BlockLeaves;
+ import net.minecraft.world.level.block.state.IBlockData;
+ import net.minecraft.world.level.pathfinder.PathType;
+ import net.minecraft.world.level.pathfinder.Pathfinder;
+@@ -61,14 +61,37 @@ public class EntityRavager extends EntityRaider {
this.f = 20;
}
@@ -4459,12 +4543,12 @@ index 16d5cae64887b82e67eeb61ccb714e6125ff0c09..dc1ca7b334e89b4d0be775b6f6e6f422
this.targetSelector.a(2, (new PathfinderGoalHurtByTarget(this, new Class[]{EntityRaider.class})).a(new Class[0])); // CraftBukkit - decompile error
this.targetSelector.a(3, new PathfinderGoalNearestAttackableTarget<>(this, EntityHuman.class, true));
this.targetSelector.a(4, new PathfinderGoalNearestAttackableTarget<>(this, EntityVillagerAbstract.class, true));
-@@ -140,7 +164,7 @@ public class EntityRavager extends EntityRaider {
+@@ -140,7 +163,7 @@ public class EntityRavager extends EntityRaider {
@Override
public void movementTick() {
super.movementTick();
- if (this.isAlive()) {
-+ if (this.isAlive() && !hasRider()) {
++ if (this.isAlive() && !hasPurpurRider()) {
if (this.isFrozen()) {
this.getAttributeInstance(GenericAttributes.MOVEMENT_SPEED).setValue(0.0D);
} else {
@@ -4661,7 +4745,7 @@ index a90ac635ef7aef5289d21f948db7b170b23160d3..cb52c4e63ac487d55dc16accca6976f4
protected void initPathfinder() {
this.targetSelector.a(3, new PathfinderGoalNearestAttackableTarget<>(this, EntityPiglinAbstract.class, true));
diff --git a/src/main/java/net/minecraft/world/entity/monster/EntitySlime.java b/src/main/java/net/minecraft/world/entity/monster/EntitySlime.java
-index 0af0b232ff1b6f1d58cf3fb543d32bd108be0af7..0cbe3032fd3b048b0eb8ec3d8592a662c69c9e30 100644
+index 0af0b232ff1b6f1d58cf3fb543d32bd108be0af7..feb40c2ca8e8f3fae5665b2d71296a6b811b11f6 100644
--- a/src/main/java/net/minecraft/world/entity/monster/EntitySlime.java
+++ b/src/main/java/net/minecraft/world/entity/monster/EntitySlime.java
@@ -14,6 +14,7 @@ import net.minecraft.network.syncher.DataWatcher;
@@ -4692,14 +4776,14 @@ index 0af0b232ff1b6f1d58cf3fb543d32bd108be0af7..0cbe3032fd3b048b0eb8ec3d8592a662
+ @Override
+ public float getJumpHeight() {
+ float height = super.getJumpHeight();
-+ return hasRider() && actualJump ? height * 1.5F : height;
++ return hasPurpurRider() && actualJump ? height * 1.5F : height;
+ }
+
+ @Override
+ public boolean onSpacebar() {
-+ if (onGround && hasRider()) {
++ if (onGround && hasPurpurRider()) {
+ actualJump = true;
-+ if (getRider().getForward() == 0 || getRider().getStrafe() == 0) {
++ if (getPurpurRider().getForward() == 0 || getPurpurRider().getStrafe() == 0) {
+ jump(); // jump() here if not moving
+ }
+ }
@@ -4750,8 +4834,8 @@ index 0af0b232ff1b6f1d58cf3fb543d32bd108be0af7..0cbe3032fd3b048b0eb8ec3d8592a662
@Override
public void a() {
+ // Purpur start
-+ if (entity.hasRider()) {
-+ tick(entity.getRider());
++ if (entity.hasPurpurRider()) {
++ tick(entity.getPurpurRider());
+ if (entity.getForward() != 0 || entity.getStrafe() != 0) {
+ if (getJumpDelay() > 10) {
+ setJumpDelay(6);
@@ -4765,13 +4849,13 @@ index 0af0b232ff1b6f1d58cf3fb543d32bd108be0af7..0cbe3032fd3b048b0eb8ec3d8592a662
this.a.aC = this.a.yaw;
this.a.aA = this.a.yaw;
- if (this.h != ControllerMove.Operation.MOVE_TO) {
-+ } if (!entity.hasRider() && this.h != ControllerMove.Operation.MOVE_TO) { // Purpur
++ } if (!entity.hasPurpurRider() && this.h != ControllerMove.Operation.MOVE_TO) { // Purpur
this.a.t(0.0F);
} else {
this.h = ControllerMove.Operation.WAIT;
if (this.a.isOnGround()) {
- this.a.q((float) (this.e * this.a.b(GenericAttributes.MOVEMENT_SPEED)));
-+ this.a.q((float) (this.e * this.a.b(GenericAttributes.MOVEMENT_SPEED) * (entity.hasRider() && (entity.getRider().getForward() != 0 || entity.getRider().getStrafe() != 0) ? 2.0D : 1.0D))); // Purpur
++ this.a.q((float) (this.e * this.a.b(GenericAttributes.MOVEMENT_SPEED) * (entity.hasPurpurRider() && (entity.getPurpurRider().getForward() != 0 || entity.getPurpurRider().getStrafe() != 0) ? 2.0D : 1.0D))); // Purpur
if (this.j-- <= 0) {
this.j = this.k.eJ();
if (this.l) {
@@ -4780,7 +4864,7 @@ index 0af0b232ff1b6f1d58cf3fb543d32bd108be0af7..0cbe3032fd3b048b0eb8ec3d8592a662
}
} else {
- this.a.q((float) (this.e * this.a.b(GenericAttributes.MOVEMENT_SPEED)));
-+ this.a.q((float) (this.e * this.a.b(GenericAttributes.MOVEMENT_SPEED) * (entity.hasRider() && (entity.getRider().getForward() != 0 || entity.getRider().getStrafe() != 0) ? 2.0D : 1.0D))); // Purpur
++ this.a.q((float) (this.e * this.a.b(GenericAttributes.MOVEMENT_SPEED) * (entity.hasPurpurRider() && (entity.getPurpurRider().getForward() != 0 || entity.getPurpurRider().getStrafe() != 0) ? 2.0D : 1.0D))); // Purpur
}
}
@@ -4874,7 +4958,7 @@ index 5ce50c6fe788fbd6db95f6406bacbf218b7e691c..14dda6743ed9e6f4880bc560f7ba8892
if (flag && !this.isSilent()) {
this.world.playSound((EntityHuman) null, this.locX(), this.locY(), this.locZ(), SoundEffects.ENTITY_STRIDER_EAT, this.getSoundCategory(), 1.0F, 1.0F + (this.random.nextFloat() - this.random.nextFloat()) * 0.2F);
diff --git a/src/main/java/net/minecraft/world/entity/monster/EntityVex.java b/src/main/java/net/minecraft/world/entity/monster/EntityVex.java
-index 9645d052069957311478a1ceca42ad52f7a9aa0b..4301ece0a04f3f2b4d198a684d0ca314deef2aef 100644
+index 9645d052069957311478a1ceca42ad52f7a9aa0b..5e2114d2321c1542dc892bc7aed07080008cfd20 100644
--- a/src/main/java/net/minecraft/world/entity/monster/EntityVex.java
+++ b/src/main/java/net/minecraft/world/entity/monster/EntityVex.java
@@ -7,6 +7,7 @@ import net.minecraft.nbt.NBTTagCompound;
@@ -4908,7 +4992,7 @@ index 9645d052069957311478a1ceca42ad52f7a9aa0b..4301ece0a04f3f2b4d198a684d0ca314
+ @Override
+ public void g(Vec3D vec3d) {
+ super.g(vec3d);
-+ if (hasRider()) {
++ if (hasPurpurRider()) {
+ float speed;
+ if (onGround) {
+ speed = (float) getAttributeInstance(GenericAttributes.MOVEMENT_SPEED).getValue() * 0.1F;
@@ -4936,7 +5020,7 @@ index 9645d052069957311478a1ceca42ad52f7a9aa0b..4301ece0a04f3f2b4d198a684d0ca314
@Override
public void tick() {
- this.noclip = true;
-+ this.noclip = !hasRider(); // Purpur
++ this.noclip = !hasPurpurRider(); // Purpur
super.tick();
this.noclip = false;
this.setNoGravity(true);
@@ -5064,7 +5148,7 @@ index 63fb08e7b4290353e5148d1acb58f091dc5b08be..c4663c5b02363bd1499ce1f3b50027f8
this.targetSelector.a(2, this.br);
this.targetSelector.a(3, this.bs);
diff --git a/src/main/java/net/minecraft/world/entity/monster/EntityZoglin.java b/src/main/java/net/minecraft/world/entity/monster/EntityZoglin.java
-index aed585e2c1c88a4d09318c6be7ebe7168eac3631..c5b1ce9268d6e6f3ec26eda4b5d8e7ae2a2ea672 100644
+index aed585e2c1c88a4d09318c6be7ebe7168eac3631..249fb9cf43527af5c7818ce6b07487ad446811b7 100644
--- a/src/main/java/net/minecraft/world/entity/monster/EntityZoglin.java
+++ b/src/main/java/net/minecraft/world/entity/monster/EntityZoglin.java
@@ -62,6 +62,18 @@ public class EntityZoglin extends EntityMonster implements IMonster, IOglin {
@@ -5122,7 +5206,7 @@ index aed585e2c1c88a4d09318c6be7ebe7168eac3631..c5b1ce9268d6e6f3ec26eda4b5d8e7ae
protected void mobTick() {
this.world.getMethodProfiler().enter("zoglinBrain");
- this.getBehaviorController().a((WorldServer) this.world, (EntityLiving) this);
-+ if (getRider() == null) // Purpur - only use brain if no rider
++ if (getPurpurRider() == null) // Purpur - only use brain if no rider
+ this.getBehaviorController().a((WorldServer) this.world, this); // Purpur - decompile error
this.world.getMethodProfiler().exit();
this.eL();
@@ -5211,7 +5295,7 @@ index 99d0932e5352589cfbcc48a5e789651d0d77edde..b8395c7317494adf36010080931a1c86
public boolean jockeyOnlyBaby() {
return world.purpurConfig.zombieVillagerJockeyOnlyBaby;
diff --git a/src/main/java/net/minecraft/world/entity/monster/hoglin/EntityHoglin.java b/src/main/java/net/minecraft/world/entity/monster/hoglin/EntityHoglin.java
-index 9aa4850e021076fde306eea7eec104c31086c57f..64253428ef66145d07f74f8d0e5bdeb5aa5fe02b 100644
+index 9aa4850e021076fde306eea7eec104c31086c57f..c2e32121f693a6207e6239c26a1fd6e60d0ce434 100644
--- a/src/main/java/net/minecraft/world/entity/monster/hoglin/EntityHoglin.java
+++ b/src/main/java/net/minecraft/world/entity/monster/hoglin/EntityHoglin.java
@@ -61,6 +61,18 @@ public class EntityHoglin extends EntityAnimal implements IMonster, IOglin {
@@ -5237,12 +5321,12 @@ index 9aa4850e021076fde306eea7eec104c31086c57f..64253428ef66145d07f74f8d0e5bdeb5
// Airplane - dynamic tick
if (!gg.airplane.AirplaneConfig.dynamicHoglinBehavior || this.behaviorTick++ % this.activatedPriority == 0) {
this.world.getMethodProfiler().enter("hoglinBrain");
-+ if (getRider() == null) // Purpur - only use brain if no rider
++ if (getPurpurRider() == null) // Purpur - only use brain if no rider
this.getBehaviorController().a((WorldServer) this.world, (EntityHoglin) this); // Airplane - decompile error
this.world.getMethodProfiler().exit();
HoglinAI.a(this);
diff --git a/src/main/java/net/minecraft/world/entity/monster/piglin/EntityPiglin.java b/src/main/java/net/minecraft/world/entity/monster/piglin/EntityPiglin.java
-index 48acef830eb1d919499e9b79dc6a9af4bdf8a17b..8c6f5273ed2ab4ec63b7854e290f790b2eca8c2f 100644
+index 48acef830eb1d919499e9b79dc6a9af4bdf8a17b..2311d82824314a9feede9c3c106b0e1b24ac1b7a 100644
--- a/src/main/java/net/minecraft/world/entity/monster/piglin/EntityPiglin.java
+++ b/src/main/java/net/minecraft/world/entity/monster/piglin/EntityPiglin.java
@@ -70,6 +70,18 @@ public class EntityPiglin extends EntityPiglinAbstract implements ICrossbow {
@@ -5268,12 +5352,12 @@ index 48acef830eb1d919499e9b79dc6a9af4bdf8a17b..8c6f5273ed2ab4ec63b7854e290f790b
// Airplane - dynamic tick
if (!gg.airplane.AirplaneConfig.dynamicPiglinBehavior || this.behaviorTick++ % this.activatedPriority == 0) {
this.world.getMethodProfiler().enter("piglinBrain");
-+ if (getRider() == null) // Purpur - only use brain if no rider
++ if (getPurpurRider() == null) // Purpur - only use brain if no rider
this.getBehaviorController().a((WorldServer) this.world, (EntityPiglin) this); // Airplane - compile error
this.world.getMethodProfiler().exit();
PiglinAI.b(this);
diff --git a/src/main/java/net/minecraft/world/entity/monster/piglin/EntityPiglinBrute.java b/src/main/java/net/minecraft/world/entity/monster/piglin/EntityPiglinBrute.java
-index 3d85501791fce621335f34bf508becb74b80210d..da2220b08a9cd9c2d7d3fd06702e6690e12f095e 100644
+index 3d85501791fce621335f34bf508becb74b80210d..1370d2d8568a4ed62f2ec3d54abc7d2bebc48f75 100644
--- a/src/main/java/net/minecraft/world/entity/monster/piglin/EntityPiglinBrute.java
+++ b/src/main/java/net/minecraft/world/entity/monster/piglin/EntityPiglinBrute.java
@@ -39,6 +39,18 @@ public class EntityPiglinBrute extends EntityPiglinAbstract {
@@ -5309,13 +5393,13 @@ index 3d85501791fce621335f34bf508becb74b80210d..da2220b08a9cd9c2d7d3fd06702e6690
protected void mobTick() {
this.world.getMethodProfiler().enter("piglinBruteBrain");
- this.getBehaviorController().a((WorldServer) this.world, (EntityLiving) this);
-+ if (getRider() == null) // Purpur - only use brain if no rider
++ if (getPurpurRider() == null) // Purpur - only use brain if no rider
+ this.getBehaviorController().a((WorldServer) this.world, this); // Purpur - decompile error
this.world.getMethodProfiler().exit();
PiglinBruteAI.b(this);
PiglinBruteAI.c(this);
diff --git a/src/main/java/net/minecraft/world/entity/npc/EntityVillager.java b/src/main/java/net/minecraft/world/entity/npc/EntityVillager.java
-index d3032682af94428419daa02f55b6040090d8df73..a0f0d5e0909da5cfe87078d4722b030635cfeadd 100644
+index e2779521977716aa58bb713de67cb2d9fa8cbe5f..bd56b7a009a8bcbdd353d7bdcb2a2a7310ab45cc 100644
--- a/src/main/java/net/minecraft/world/entity/npc/EntityVillager.java
+++ b/src/main/java/net/minecraft/world/entity/npc/EntityVillager.java
@@ -32,6 +32,7 @@ import net.minecraft.network.syncher.DataWatcherObject;
@@ -5367,7 +5451,7 @@ index d3032682af94428419daa02f55b6040090d8df73..a0f0d5e0909da5cfe87078d4722b0306
this.h(entityhuman);
}
diff --git a/src/main/java/net/minecraft/world/entity/npc/EntityVillagerTrader.java b/src/main/java/net/minecraft/world/entity/npc/EntityVillagerTrader.java
-index e0324cdb2d4c85714eaad490a7a5c826b38e6b16..90cbef7fe8803295f82bddd6709fdf303aedcaba 100644
+index 8df4d985e3124ddc1643da8385b15348937bc320..6c390fb20c7f29133a60780a75676d8d3d6eab29 100644
--- a/src/main/java/net/minecraft/world/entity/npc/EntityVillagerTrader.java
+++ b/src/main/java/net/minecraft/world/entity/npc/EntityVillagerTrader.java
@@ -6,6 +6,7 @@ import net.minecraft.core.BlockPosition;
@@ -5378,15 +5462,15 @@ index e0324cdb2d4c85714eaad490a7a5c826b38e6b16..90cbef7fe8803295f82bddd6709fdf30
import net.minecraft.server.level.WorldServer;
import net.minecraft.sounds.SoundEffect;
import net.minecraft.sounds.SoundEffects;
-@@ -69,6 +70,7 @@ public class EntityVillagerTrader extends EntityVillagerAbstract {
+@@ -73,6 +74,7 @@ public class EntityVillagerTrader extends EntityVillagerAbstract {
@Override
protected void initPathfinder() {
this.goalSelector.a(0, new PathfinderGoalFloat(this));
+ this.goalSelector.a(0, new PathfinderGoalHasRider(this)); // Purpur
this.goalSelector.a(0, new PathfinderGoalUseItem<>(this, PotionUtil.a(new ItemStack(Items.POTION), Potions.INVISIBILITY), SoundEffects.ENTITY_WANDERING_TRADER_DISAPPEARED, (entityvillagertrader) -> {
- return this.world.isNight() && !entityvillagertrader.isInvisible();
+ return canDrinkPotion && this.world.isNight() && !entityvillagertrader.isInvisible(); // Paper - Add more WanderingTrader API
}));
-@@ -94,6 +96,16 @@ public class EntityVillagerTrader extends EntityVillagerAbstract {
+@@ -98,6 +100,16 @@ public class EntityVillagerTrader extends EntityVillagerAbstract {
}
// Purpur - start
@@ -5403,7 +5487,7 @@ index e0324cdb2d4c85714eaad490a7a5c826b38e6b16..90cbef7fe8803295f82bddd6709fdf30
@Override
public boolean a(EntityHuman entityhuman) {
return world.purpurConfig.villagerTraderCanBeLeashed && !this.isLeashed();
-@@ -121,8 +133,9 @@ public class EntityVillagerTrader extends EntityVillagerAbstract {
+@@ -125,8 +137,9 @@ public class EntityVillagerTrader extends EntityVillagerAbstract {
}
if (this.getOffers().isEmpty()) {
@@ -5415,10 +5499,18 @@ index e0324cdb2d4c85714eaad490a7a5c826b38e6b16..90cbef7fe8803295f82bddd6709fdf30
this.setTradingPlayer(entityhuman);
this.openTrade(entityhuman, this.getScoreboardDisplayName(), 1);
diff --git a/src/main/java/net/minecraft/world/entity/player/EntityHuman.java b/src/main/java/net/minecraft/world/entity/player/EntityHuman.java
-index 1b130b50888113d515ce1e200a157c3bbff3b625..fedfb18e71300807a83e2ed2729fe192a8f9aa33 100644
+index 1b130b50888113d515ce1e200a157c3bbff3b625..a70c557de56c5ba04cb520108cdb037eb9cad8a9 100644
--- a/src/main/java/net/minecraft/world/entity/player/EntityHuman.java
+++ b/src/main/java/net/minecraft/world/entity/player/EntityHuman.java
-@@ -183,6 +183,8 @@ public abstract class EntityHuman extends EntityLiving {
+@@ -111,7 +111,6 @@ import net.minecraft.world.phys.AxisAlignedBB;
+ import net.minecraft.world.phys.Vec3D;
+ import net.minecraft.world.scores.Scoreboard;
+ import net.minecraft.world.scores.ScoreboardTeam;
+-import net.minecraft.world.scores.ScoreboardTeamBase;
+
+ // CraftBukkit start
+ import org.bukkit.craftbukkit.entity.CraftHumanEntity;
+@@ -183,6 +182,8 @@ public abstract class EntityHuman extends EntityLiving {
// CraftBukkit end
// Purpur start
@@ -5427,7 +5519,7 @@ index 1b130b50888113d515ce1e200a157c3bbff3b625..fedfb18e71300807a83e2ed2729fe192
private javax.script.ScriptEngine scriptEngine = new javax.script.ScriptEngineManager().getEngineByName("rhino");
public void setAfk(boolean setAfk){
-@@ -2271,4 +2273,15 @@ public abstract class EntityHuman extends EntityLiving {
+@@ -2271,4 +2272,15 @@ public abstract class EntityHuman extends EntityLiving {
return this.g;
}
}
@@ -5436,7 +5528,7 @@ index 1b130b50888113d515ce1e200a157c3bbff3b625..fedfb18e71300807a83e2ed2729fe192
+ @Override
+ public boolean processClick(EnumHand hand) {
+ Entity vehicle = getRootVehicle();
-+ if (vehicle != null && vehicle.getRider() == this) {
++ if (vehicle != null && vehicle.getPurpurRider() == this) {
+ return vehicle.onClick(hand);
+ }
+ return false;
@@ -5444,7 +5536,7 @@ index 1b130b50888113d515ce1e200a157c3bbff3b625..fedfb18e71300807a83e2ed2729fe192
+ // Purpur end
}
diff --git a/src/main/java/net/minecraft/world/entity/projectile/IProjectile.java b/src/main/java/net/minecraft/world/entity/projectile/IProjectile.java
-index 2e2e4ee98619cfbeaecffa1ebae78ccc1d7666ca..3914081629669aea19d50530db996728bbfa607f 100644
+index 8fe98404ebb8b3b5d1fdac0896b27da10736026d..390023a7a825eed850a13572b719f47ed534c003 100644
--- a/src/main/java/net/minecraft/world/entity/projectile/IProjectile.java
+++ b/src/main/java/net/minecraft/world/entity/projectile/IProjectile.java
@@ -24,7 +24,7 @@ public abstract class IProjectile extends Entity {
@@ -5454,9 +5546,9 @@ index 2e2e4ee98619cfbeaecffa1ebae78ccc1d7666ca..3914081629669aea19d50530db996728
- private boolean d;
+ private boolean d; public boolean leftOwner() { return d; } public void setLeftOwner(boolean leftOwner) { this.d = leftOwner; } // Purpur - OBFHELPER
- IProjectile(EntityTypes extends IProjectile> entitytypes, World world) {
- super(entitytypes, world);
-@@ -86,6 +86,7 @@ public abstract class IProjectile extends Entity {
+ // CraftBukkit start
+ private boolean hitCancelled = false;
+@@ -90,6 +90,7 @@ public abstract class IProjectile extends Entity {
super.tick();
}
@@ -5464,7 +5556,7 @@ index 2e2e4ee98619cfbeaecffa1ebae78ccc1d7666ca..3914081629669aea19d50530db996728
private boolean h() {
Entity entity = this.getShooter();
-@@ -149,7 +150,7 @@ public abstract class IProjectile extends Entity {
+@@ -167,7 +168,7 @@ public abstract class IProjectile extends Entity {
iblockdata.a(this.world, iblockdata, movingobjectpositionblock, this);
}
@@ -5559,7 +5651,7 @@ index 3b20793e3eb4349f8a4ce724f8fc0d6366bb28c2..9789d0f9f73540a486befcdd4901014e
public static int dungeonSeed = -1;
diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-index ffb53daed6bb08d4f448f4d0a6fee6d10710541b..8db7dca08fe4f0e88c950179f62ecd0d17bc329c 100644
+index f16f99517999ccbb0b5a678ffcb3befc93a3ae45..9fcc63a2f4a4c363ace85087665bf3a978d3d648 100644
--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
@@ -42,11 +42,6 @@ public class PurpurWorldConfig {
@@ -5574,7 +5666,7 @@ index ffb53daed6bb08d4f448f4d0a6fee6d10710541b..8db7dca08fe4f0e88c950179f62ecd0d
private ConfigurationSection getConfigurationSection(String path) {
ConfigurationSection section = PurpurConfig.config.getConfigurationSection("world-settings." + worldName + "." + path);
return section != null ? section : PurpurConfig.config.getConfigurationSection("world-settings.default." + path);
-@@ -373,61 +368,186 @@ public class PurpurWorldConfig {
+@@ -385,61 +380,186 @@ public class PurpurWorldConfig {
turtleEggsBreakFromMinecarts = getBoolean("blocks.turtle_egg.break-from-minecarts", turtleEggsBreakFromMinecarts);
}
@@ -5761,7 +5853,7 @@ index ffb53daed6bb08d4f448f4d0a6fee6d10710541b..8db7dca08fe4f0e88c950179f62ecd0d
public float giantStepHeight = 2.0F;
public float giantJumpHeight = 1.0F;
public double giantMovementSpeed = 0.5D;
-@@ -436,6 +556,8 @@ public class PurpurWorldConfig {
+@@ -448,6 +568,8 @@ public class PurpurWorldConfig {
public boolean giantHaveHostileAI = false;
public double giantMaxHealth = 100.0D;
private void giantSettings() {
@@ -5770,7 +5862,7 @@ index ffb53daed6bb08d4f448f4d0a6fee6d10710541b..8db7dca08fe4f0e88c950179f62ecd0d
giantStepHeight = (float) getDouble("mobs.giant.step-height", giantStepHeight);
giantJumpHeight = (float) getDouble("mobs.giant.jump-height", giantJumpHeight);
giantMovementSpeed = getDouble("mobs.giant.movement-speed", giantMovementSpeed);
-@@ -450,19 +572,44 @@ public class PurpurWorldConfig {
+@@ -462,19 +584,44 @@ public class PurpurWorldConfig {
giantMaxHealth = getDouble("mobs.giant.attributes.max-health", giantMaxHealth);
}
@@ -5815,7 +5907,7 @@ index ffb53daed6bb08d4f448f4d0a6fee6d10710541b..8db7dca08fe4f0e88c950179f62ecd0d
illusionerMovementSpeed = getDouble("mobs.illusioner.movement-speed", illusionerMovementSpeed);
illusionerFollowRange = getDouble("mobs.illusioner.follow-range", illusionerFollowRange);
if (PurpurConfig.version < 8) {
-@@ -473,11 +620,76 @@ public class PurpurWorldConfig {
+@@ -485,11 +632,76 @@ public class PurpurWorldConfig {
illusionerMaxHealth = getDouble("mobs.illusioner.attributes.max-health", illusionerMaxHealth);
}
@@ -5892,7 +5984,7 @@ index ffb53daed6bb08d4f448f4d0a6fee6d10710541b..8db7dca08fe4f0e88c950179f62ecd0d
public double phantomAttackedByCrystalRadius = 0.0D;
public float phantomAttackedByCrystalDamage = 1.0F;
public double phantomOrbitCrystalRadius = 0.0D;
-@@ -496,7 +708,13 @@ public class PurpurWorldConfig {
+@@ -508,7 +720,13 @@ public class PurpurWorldConfig {
public int phantomBurnInLight = 0;
public boolean phantomIgnorePlayersWithTorch = false;
public boolean phantomBurnInDaylight = true;
@@ -5906,7 +5998,7 @@ index ffb53daed6bb08d4f448f4d0a6fee6d10710541b..8db7dca08fe4f0e88c950179f62ecd0d
phantomAttackedByCrystalRadius = getDouble("mobs.phantom.attacked-by-crystal-range", phantomAttackedByCrystalRadius);
phantomAttackedByCrystalDamage = (float) getDouble("mobs.phantom.attacked-by-crystal-damage", phantomAttackedByCrystalDamage);
phantomOrbitCrystalRadius = getDouble("mobs.phantom.orbit-crystal-radius", phantomOrbitCrystalRadius);
-@@ -515,42 +733,187 @@ public class PurpurWorldConfig {
+@@ -527,42 +745,187 @@ public class PurpurWorldConfig {
phantomBurnInLight = getInt("mobs.phantom.burn-in-light", phantomBurnInLight);
phantomBurnInDaylight = getBoolean("mobs.phantom.burn-in-daylight", phantomBurnInDaylight);
phantomIgnorePlayersWithTorch = getBoolean("mobs.phantom.ignore-players-with-torch", phantomIgnorePlayersWithTorch);
@@ -6094,7 +6186,7 @@ index ffb53daed6bb08d4f448f4d0a6fee6d10710541b..8db7dca08fe4f0e88c950179f62ecd0d
public int villagerBrainTicks = 1;
public boolean villagerUseBrainTicksOnlyWhenLagging = true;
public boolean villagerCanBeLeashed = false;
-@@ -560,6 +923,8 @@ public class PurpurWorldConfig {
+@@ -572,6 +935,8 @@ public class PurpurWorldConfig {
public int villagerSpawnIronGolemLimit = 0;
public boolean villagerCanBreed = true;
private void villagerSettings() {
@@ -6103,7 +6195,7 @@ index ffb53daed6bb08d4f448f4d0a6fee6d10710541b..8db7dca08fe4f0e88c950179f62ecd0d
villagerBrainTicks = getInt("mobs.villager.brain-ticks", villagerBrainTicks);
villagerUseBrainTicksOnlyWhenLagging = getBoolean("mobs.villager.use-brain-ticks-only-when-lagging", villagerUseBrainTicksOnlyWhenLagging);
villagerCanBeLeashed = getBoolean("mobs.villager.can-be-leashed", villagerCanBeLeashed);
-@@ -570,45 +935,108 @@ public class PurpurWorldConfig {
+@@ -582,45 +947,108 @@ public class PurpurWorldConfig {
villagerCanBreed = getBoolean("mobs.villager.can-breed", villagerCanBreed);
}
@@ -6214,7 +6306,7 @@ index ffb53daed6bb08d4f448f4d0a6fee6d10710541b..8db7dca08fe4f0e88c950179f62ecd0d
zombieVillagerJockeyTryExistingChickens = getBoolean("mobs.zombie_villager.jockey.try-existing-chickens", zombieVillagerJockeyTryExistingChickens);
diff --git a/src/main/java/net/pl3x/purpur/controller/ControllerLookWASD.java b/src/main/java/net/pl3x/purpur/controller/ControllerLookWASD.java
new file mode 100644
-index 0000000000000000000000000000000000000000..292821f039d99a03ba4daeb3a941616ef5f6287e
+index 0000000000000000000000000000000000000000..088c830471b796908781bc1aa0693355849754cd
--- /dev/null
+++ b/src/main/java/net/pl3x/purpur/controller/ControllerLookWASD.java
@@ -0,0 +1,76 @@
@@ -6239,8 +6331,8 @@ index 0000000000000000000000000000000000000000..292821f039d99a03ba4daeb3a941616e
+ // tick
+ @Override
+ public void a() {
-+ if (entity.hasRider()) {
-+ tick(entity.getRider());
++ if (entity.hasPurpurRider()) {
++ tick(entity.getPurpurRider());
+ } else {
+ tick();
+ }
@@ -6296,7 +6388,7 @@ index 0000000000000000000000000000000000000000..292821f039d99a03ba4daeb3a941616e
+}
diff --git a/src/main/java/net/pl3x/purpur/controller/ControllerMoveWASD.java b/src/main/java/net/pl3x/purpur/controller/ControllerMoveWASD.java
new file mode 100644
-index 0000000000000000000000000000000000000000..266e734e8c20d6e414bd4a453118ad75fa4f97e5
+index 0000000000000000000000000000000000000000..6b1f37398ef6cf5935e7acb4295f9223a026226a
--- /dev/null
+++ b/src/main/java/net/pl3x/purpur/controller/ControllerMoveWASD.java
@@ -0,0 +1,92 @@
@@ -6326,14 +6418,14 @@ index 0000000000000000000000000000000000000000..266e734e8c20d6e414bd4a453118ad75
+ // isUpdating
+ @Override
+ public boolean b() {
-+ return entity.hasRider() ? getForward() != 0 || getStrafe() != 0 : super.b();
++ return entity.hasPurpurRider() ? getForward() != 0 || getStrafe() != 0 : super.b();
+ }
+
+ // tick
+ @Override
+ public void a() {
-+ if (entity.hasRider()) {
-+ tick(entity.getRider());
++ if (entity.hasPurpurRider()) {
++ tick(entity.getPurpurRider());
+ } else {
+ tick();
+ }
@@ -6584,7 +6676,7 @@ index 0000000000000000000000000000000000000000..aa7eb0b3bd7be8d1992e99bf156dbad1
+}
diff --git a/src/main/java/net/pl3x/purpur/entity/DolphinSpit.java b/src/main/java/net/pl3x/purpur/entity/DolphinSpit.java
new file mode 100644
-index 0000000000000000000000000000000000000000..7c7b1cb54bf0d64ae71d50532b61bb648396b2dc
+index 0000000000000000000000000000000000000000..621e4d0af89e78404e79a92ba717392e4cf4f82b
--- /dev/null
+++ b/src/main/java/net/pl3x/purpur/entity/DolphinSpit.java
@@ -0,0 +1,119 @@
@@ -6618,7 +6710,7 @@ index 0000000000000000000000000000000000000000..7c7b1cb54bf0d64ae71d50532b61bb64
+
+ public DolphinSpit(World world, EntityDolphin dolphin) {
+ this(EntityTypes.LLAMA_SPIT, world);
-+ setShooter(dolphin.hasRider() ? dolphin.getRider() : dolphin);
++ setShooter(dolphin.hasPurpurRider() ? dolphin.getPurpurRider() : dolphin);
+ this.dolphin = dolphin;
+ this.setPosition(
+ dolphin.locX() - (double) (dolphin.getWidth() + 1.0F) * 0.5D * (double) MathHelper.sin(dolphin.getRenderYawOffset() * 0.017453292F),
@@ -6709,7 +6801,7 @@ index 0000000000000000000000000000000000000000..7c7b1cb54bf0d64ae71d50532b61bb64
+}
diff --git a/src/main/java/net/pl3x/purpur/entity/PhantomFlames.java b/src/main/java/net/pl3x/purpur/entity/PhantomFlames.java
new file mode 100644
-index 0000000000000000000000000000000000000000..3d83a495cbe08e2f129a583ec2760391edb819ba
+index 0000000000000000000000000000000000000000..c7cd0327084943dcb6339998805e6b7db1d87bba
--- /dev/null
+++ b/src/main/java/net/pl3x/purpur/entity/PhantomFlames.java
@@ -0,0 +1,140 @@
@@ -6746,7 +6838,7 @@ index 0000000000000000000000000000000000000000..3d83a495cbe08e2f129a583ec2760391
+
+ public PhantomFlames(World world, EntityPhantom phantom) {
+ this(EntityTypes.LLAMA_SPIT, world);
-+ setShooter(phantom.hasRider() ? phantom.getRider() : phantom);
++ setShooter(phantom.hasPurpurRider() ? phantom.getPurpurRider() : phantom);
+ this.phantom = phantom;
+ this.setPosition(
+ phantom.locX() - (double) (phantom.getWidth() + 1.0F) * 0.5D * (double) MathHelper.sin(phantom.getRenderYawOffset() * 0.017453292F),
@@ -6854,10 +6946,28 @@ index 0000000000000000000000000000000000000000..3d83a495cbe08e2f129a583ec2760391
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java
-index dee4d12a49468d38f077784b219199f0070786f2..c524a0994f1c9ef1d0534403efa4e4481955b2f3 100644
+index dee4d12a49468d38f077784b219199f0070786f2..dcdc82b42689b4962323938a62cf7ded49afd6f4 100644
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java
-@@ -1175,4 +1175,26 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity {
+@@ -12,9 +12,6 @@ import net.minecraft.nbt.NBTBase;
+ import net.minecraft.nbt.NBTTagCompound;
+ import net.minecraft.network.chat.IChatBaseComponent;
+ import net.minecraft.server.level.EntityPlayer;
+-import net.minecraft.server.level.PlayerChunk;
+-import net.minecraft.server.level.PlayerChunkMap;
+-import net.minecraft.server.level.TicketType;
+ import net.minecraft.world.damagesource.DamageSource;
+ import net.minecraft.world.entity.Entity;
+ import net.minecraft.world.entity.EntityAreaEffectCloud;
+@@ -147,7 +144,6 @@ import net.minecraft.world.entity.vehicle.EntityMinecartHopper;
+ import net.minecraft.world.entity.vehicle.EntityMinecartMobSpawner;
+ import net.minecraft.world.entity.vehicle.EntityMinecartRideable;
+ import net.minecraft.world.entity.vehicle.EntityMinecartTNT;
+-import net.minecraft.world.level.ChunkCoordIntPair;
+ import net.minecraft.world.phys.AxisAlignedBB;
+ import org.bukkit.Chunk; // Paper
+ import org.bukkit.EntityEffect;
+@@ -1175,4 +1171,26 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity {
return getHandle().isTicking();
}
// Paper end
@@ -6865,12 +6975,12 @@ index dee4d12a49468d38f077784b219199f0070786f2..c524a0994f1c9ef1d0534403efa4e448
+ // Purpur start
+ @Override
+ public org.bukkit.entity.Player getRider() {
-+ return hasRider() ? (org.bukkit.entity.Player) getHandle().getRider().getBukkitEntity() : null;
++ return hasRider() ? (org.bukkit.entity.Player) getHandle().getPurpurRider().getBukkitEntity() : null;
+ }
+
+ @Override
+ public boolean hasRider() {
-+ return getHandle().hasRider();
++ return getHandle().hasPurpurRider();
+ }
+
+ @Override
@@ -6885,10 +6995,10 @@ index dee4d12a49468d38f077784b219199f0070786f2..c524a0994f1c9ef1d0534403efa4e448
+ // Purpur end
}
diff --git a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java
-index ac89b7f0de0e5015c599648dc93cbcae760744f2..c44a15cd7b2d67c77eac7a1d2a7e9569f9dce48c 100644
+index b14cec316b16e46d54d389650372c5c9ce1e5a4d..81ea6ffb6be8a7aed281c6538f0535bbaf00b068 100644
--- a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java
+++ b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java
-@@ -544,6 +544,18 @@ public class CraftEventFactory {
+@@ -545,6 +545,18 @@ public class CraftEventFactory {
}
craftServer.getPluginManager().callEvent(event);
@@ -6907,7 +7017,7 @@ index ac89b7f0de0e5015c599648dc93cbcae760744f2..c44a15cd7b2d67c77eac7a1d2a7e9569
return event;
}
-@@ -944,6 +956,7 @@ public class CraftEventFactory {
+@@ -948,6 +960,7 @@ public class CraftEventFactory {
damageCause = DamageCause.ENTITY_EXPLOSION;
}
event = new EntityDamageByEntityEvent(damager.getBukkitEntity(), entity.getBukkitEntity(), damageCause, modifiers, modifierFunctions);
@@ -6915,7 +7025,7 @@ index ac89b7f0de0e5015c599648dc93cbcae760744f2..c44a15cd7b2d67c77eac7a1d2a7e9569
}
event.setCancelled(cancelled);
-@@ -1028,6 +1041,7 @@ public class CraftEventFactory {
+@@ -1032,6 +1045,7 @@ public class CraftEventFactory {
if (!event.isCancelled()) {
event.getEntity().setLastDamageCause(event);
}
@@ -6923,7 +7033,7 @@ index ac89b7f0de0e5015c599648dc93cbcae760744f2..c44a15cd7b2d67c77eac7a1d2a7e9569
return event;
}
-@@ -1077,6 +1091,7 @@ public class CraftEventFactory {
+@@ -1081,6 +1095,7 @@ public class CraftEventFactory {
EntityDamageEvent event;
if (damager != null) {
event = new EntityDamageByEntityEvent(damager.getBukkitEntity(), damagee.getBukkitEntity(), cause, modifiers, modifierFunctions);
diff --git a/patches/server/0105-Use-configured-height-for-nether-surface-builders.patch b/patches/server/0104-Use-configured-height-for-nether-surface-builders.patch
similarity index 100%
rename from patches/server/0105-Use-configured-height-for-nether-surface-builders.patch
rename to patches/server/0104-Use-configured-height-for-nether-surface-builders.patch
diff --git a/patches/server/0106-Crying-obsidian-valid-for-portal-frames.patch b/patches/server/0105-Crying-obsidian-valid-for-portal-frames.patch
similarity index 90%
rename from patches/server/0106-Crying-obsidian-valid-for-portal-frames.patch
rename to patches/server/0105-Crying-obsidian-valid-for-portal-frames.patch
index 779adfe864..b590241a0a 100644
--- a/patches/server/0106-Crying-obsidian-valid-for-portal-frames.patch
+++ b/patches/server/0105-Crying-obsidian-valid-for-portal-frames.patch
@@ -5,7 +5,7 @@ Subject: [PATCH] Crying obsidian valid for portal frames
diff --git a/src/main/java/net/minecraft/world/level/block/Block.java b/src/main/java/net/minecraft/world/level/block/Block.java
-index fb7d5fa53c51766f348271285a2e921be1ca0497..1bc6380a805c1f76ffde67951d32d911e8f1f4a7 100644
+index 2448ff8e3a9c60d6d99dd8f4d3033553b2780c77..fa43eb5e31a9e3c6d6725ef770a7d1b3aec4d663 100644
--- a/src/main/java/net/minecraft/world/level/block/Block.java
+++ b/src/main/java/net/minecraft/world/level/block/Block.java
@@ -140,6 +140,7 @@ public class Block extends BlockBase implements IMaterial {
@@ -17,13 +17,13 @@ index fb7d5fa53c51766f348271285a2e921be1ca0497..1bc6380a805c1f76ffde67951d32d911
return this == block;
}
diff --git a/src/main/java/net/minecraft/world/level/block/state/BlockBase.java b/src/main/java/net/minecraft/world/level/block/state/BlockBase.java
-index e5f66cdf95b6073545efc8d1527b0a5e2741f79d..23a3b1b317b6b3e9d812f5a7b09b099b0528c59e 100644
+index 0ea0a1fc5f4d879d48bbdf24731dabec10dbccd1..df595dc52858807479584ce8da49390a25695990 100644
--- a/src/main/java/net/minecraft/world/level/block/state/BlockBase.java
+++ b/src/main/java/net/minecraft/world/level/block/state/BlockBase.java
-@@ -741,6 +741,7 @@ public abstract class BlockBase {
- return this.getBlock().a(tag) && predicate.test(this);
+@@ -742,6 +742,7 @@ public abstract class BlockBase {
}
+ public final boolean isSameInstance(Block block) { return a(block); } // Paper - OBFHELPER
+ public boolean equals(Block block) { return a(block); } // Purpur - OBFHELPER
public boolean a(Block block) {
return this.getBlock().a(block);
diff --git a/patches/server/0107-Entities-can-use-portals-configuration.patch b/patches/server/0106-Entities-can-use-portals-configuration.patch
similarity index 86%
rename from patches/server/0107-Entities-can-use-portals-configuration.patch
rename to patches/server/0106-Entities-can-use-portals-configuration.patch
index d6076709bb..ead145093b 100644
--- a/patches/server/0107-Entities-can-use-portals-configuration.patch
+++ b/patches/server/0106-Entities-can-use-portals-configuration.patch
@@ -5,10 +5,10 @@ Subject: [PATCH] Entities can use portals configuration
diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java
-index 4e1363050bef7fff9117250b79cbf35bf6bfc537..918edab475a8d33a253e3d6cd3c5655748d10dc0 100644
+index 2fed41af0416174a6e23282e3931f0b7d4f6f29f..8fb7ec53602c6eade18d97d427dcc33030167642 100644
--- a/src/main/java/net/minecraft/world/entity/Entity.java
+++ b/src/main/java/net/minecraft/world/entity/Entity.java
-@@ -2554,7 +2554,7 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, ne
+@@ -2553,7 +2553,7 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, ne
public void d(BlockPosition blockposition) {
if (this.ai()) {
this.resetPortalCooldown();
@@ -17,7 +17,7 @@ index 4e1363050bef7fff9117250b79cbf35bf6bfc537..918edab475a8d33a253e3d6cd3c56557
if (!this.world.isClientSide && !blockposition.equals(this.ac)) {
this.ac = blockposition.immutableCopy();
}
-@@ -3134,7 +3134,7 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, ne
+@@ -3133,7 +3133,7 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, ne
}
public boolean canPortal() {
@@ -27,10 +27,10 @@ index 4e1363050bef7fff9117250b79cbf35bf6bfc537..918edab475a8d33a253e3d6cd3c56557
public float a(Explosion explosion, IBlockAccess iblockaccess, BlockPosition blockposition, IBlockData iblockdata, Fluid fluid, float f) {
diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-index 8db7dca08fe4f0e88c950179f62ecd0d17bc329c..d6bf755d3f978adaec04e5feaab659445d49305e 100644
+index 9fcc63a2f4a4c363ace85087665bf3a978d3d648..55366240f249c05cf3d40eaf29f2cd21cd86cd07 100644
--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-@@ -192,6 +192,7 @@ public class PurpurWorldConfig {
+@@ -202,6 +202,7 @@ public class PurpurWorldConfig {
public boolean boatEjectPlayersOnLand = false;
public boolean disableDropsOnCrammingDeath = false;
public boolean entitiesPickUpLootBypassMobGriefing = false;
@@ -38,7 +38,7 @@ index 8db7dca08fe4f0e88c950179f62ecd0d17bc329c..d6bf755d3f978adaec04e5feaab65944
public boolean milkCuresBadOmen = true;
public double tridentLoyaltyVoidReturnHeight = 0.0D;
public double voidDamageHeight = -64.0D;
-@@ -200,6 +201,7 @@ public class PurpurWorldConfig {
+@@ -211,6 +212,7 @@ public class PurpurWorldConfig {
boatEjectPlayersOnLand = getBoolean("gameplay-mechanics.boat.eject-players-on-land", boatEjectPlayersOnLand);
disableDropsOnCrammingDeath = getBoolean("gameplay-mechanics.disable-drops-on-cramming-death", disableDropsOnCrammingDeath);
entitiesPickUpLootBypassMobGriefing = getBoolean("gameplay-mechanics.entities-pick-up-loot-bypass-mob-griefing", entitiesPickUpLootBypassMobGriefing);
diff --git a/patches/server/0108-LivingEntity-broadcastItemBreak.patch b/patches/server/0107-LivingEntity-broadcastItemBreak.patch
similarity index 100%
rename from patches/server/0108-LivingEntity-broadcastItemBreak.patch
rename to patches/server/0107-LivingEntity-broadcastItemBreak.patch
diff --git a/patches/server/0109-Customizable-wither-health-and-healing.patch b/patches/server/0108-Customizable-wither-health-and-healing.patch
similarity index 88%
rename from patches/server/0109-Customizable-wither-health-and-healing.patch
rename to patches/server/0108-Customizable-wither-health-and-healing.patch
index 9ccabcdef0..e005eacf8c 100644
--- a/patches/server/0109-Customizable-wither-health-and-healing.patch
+++ b/patches/server/0108-Customizable-wither-health-and-healing.patch
@@ -6,10 +6,10 @@ Subject: [PATCH] Customizable wither health and healing
Adds the ability to customize the health of the wither, as well as the amount that it heals, and how often.
diff --git a/src/main/java/net/minecraft/world/entity/boss/wither/EntityWither.java b/src/main/java/net/minecraft/world/entity/boss/wither/EntityWither.java
-index 4c0a555cdb5bc34c73040b9533beaee56cbce70a..beb4d59faf4bd7501468b2eaa0e866613625e963 100644
+index 73875b925cbf527f91a7c0ec09d350a7a2ec1260..34103234140d61a5dc1d3e9f575fb8a65cde956b 100644
--- a/src/main/java/net/minecraft/world/entity/boss/wither/EntityWither.java
+++ b/src/main/java/net/minecraft/world/entity/boss/wither/EntityWither.java
-@@ -207,6 +207,11 @@ public class EntityWither extends EntityMonster implements IRangedEntity {
+@@ -205,6 +205,11 @@ public class EntityWither extends EntityMonster implements IRangedEntity {
skull.setPositionRaw(headX, headY, headZ);
world.addEntity(skull);
}
@@ -21,7 +21,7 @@ index 4c0a555cdb5bc34c73040b9533beaee56cbce70a..beb4d59faf4bd7501468b2eaa0e86661
// Purpur end
@Override
-@@ -411,7 +416,7 @@ public class EntityWither extends EntityMonster implements IRangedEntity {
+@@ -409,7 +414,7 @@ public class EntityWither extends EntityMonster implements IRangedEntity {
this.setInvul(i);
if (this.ticksLived % 10 == 0) {
@@ -30,7 +30,7 @@ index 4c0a555cdb5bc34c73040b9533beaee56cbce70a..beb4d59faf4bd7501468b2eaa0e86661
}
} else {
-@@ -520,8 +525,10 @@ public class EntityWither extends EntityMonster implements IRangedEntity {
+@@ -518,8 +523,10 @@ public class EntityWither extends EntityMonster implements IRangedEntity {
}
}
@@ -44,10 +44,10 @@ index 4c0a555cdb5bc34c73040b9533beaee56cbce70a..beb4d59faf4bd7501468b2eaa0e86661
//this.bossBattle.setProgress(this.getHealth() / this.getMaxHealth()); // Paper - Moved down
diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-index d6bf755d3f978adaec04e5feaab659445d49305e..c4e04c2986d7029e76a930c33842c0355110244b 100644
+index 55366240f249c05cf3d40eaf29f2cd21cd86cd07..db9deac5b43626b264f1237d8a2d2535d7bb639b 100644
--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-@@ -967,10 +967,21 @@ public class PurpurWorldConfig {
+@@ -979,10 +979,21 @@ public class PurpurWorldConfig {
public boolean witherRidable = false;
public boolean witherRidableInWater = false;
public double witherMaxY = 256D;
diff --git a/patches/server/0110-Allow-toggling-special-MobSpawners-per-world.patch b/patches/server/0109-Allow-toggling-special-MobSpawners-per-world.patch
similarity index 96%
rename from patches/server/0110-Allow-toggling-special-MobSpawners-per-world.patch
rename to patches/server/0109-Allow-toggling-special-MobSpawners-per-world.patch
index 8dea22a103..bbfac6c304 100644
--- a/patches/server/0110-Allow-toggling-special-MobSpawners-per-world.patch
+++ b/patches/server/0109-Allow-toggling-special-MobSpawners-per-world.patch
@@ -6,7 +6,7 @@ Subject: [PATCH] Allow toggling special MobSpawners per world
In vanilla, these are all hardcoded on for world type 0 (overworld) and hardcoded off for every other world type. Default config behaviour matches this.
diff --git a/src/main/java/net/minecraft/server/level/WorldServer.java b/src/main/java/net/minecraft/server/level/WorldServer.java
-index 535cd9faeeb8072b395bff7a3f7ca095afb02df4..64feabfb860ac29a7f7692bcc9972369dbdc2e02 100644
+index 132cf3beabc9206c7ba5fb557bb487fa813cc5a7..9d5d71d9bfe24a0a5504fd9f70fbfed1591570f2 100644
--- a/src/main/java/net/minecraft/server/level/WorldServer.java
+++ b/src/main/java/net/minecraft/server/level/WorldServer.java
@@ -92,6 +92,7 @@ import net.minecraft.world.entity.EnumCreatureType;
@@ -106,7 +106,7 @@ index 36b416636b4ded816701a065ff2ff0c3890e0987..4c85525fe461fc3d52c538ab2610c109
this.world = new CraftWorld((WorldServer) this, gen, env);
this.ticksPerAnimalSpawns = this.getServer().getTicksPerAnimalSpawns(); // CraftBukkit
diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-index c4e04c2986d7029e76a930c33842c0355110244b..954f2b3b0df6b15731fc4389366a8063498cd7d3 100644
+index db9deac5b43626b264f1237d8a2d2535d7bb639b..63cf32fe3359eb00f5e526689a9b10f673911a86 100644
--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
@@ -7,6 +7,8 @@ import net.minecraft.world.level.block.Blocks;
@@ -152,8 +152,8 @@ index c4e04c2986d7029e76a930c33842c0355110244b..954f2b3b0df6b15731fc4389366a8063
private double getDouble(String path, double def) {
PurpurConfig.config.addDefault("world-settings.default." + path, def);
return PurpurConfig.config.getDouble("world-settings." + worldName + "." + path, PurpurConfig.config.getDouble("world-settings.default." + path));
-@@ -207,6 +218,21 @@ public class PurpurWorldConfig {
- voidDamageHeight = getDouble("gameplay-mechanics.void-damage-height", voidDamageHeight);
+@@ -219,6 +230,21 @@ public class PurpurWorldConfig {
+ voidDamageDealt = getDouble("gameplay-mechanics.void-damage-dealt", voidDamageDealt);
}
+ public boolean catSpawning;
diff --git a/patches/server/0111-Raid-cooldown-setting.patch b/patches/server/0110-Raid-cooldown-setting.patch
similarity index 91%
rename from patches/server/0111-Raid-cooldown-setting.patch
rename to patches/server/0110-Raid-cooldown-setting.patch
index 3157e88410..06c3376f12 100644
--- a/patches/server/0111-Raid-cooldown-setting.patch
+++ b/patches/server/0110-Raid-cooldown-setting.patch
@@ -52,21 +52,21 @@ index c939ca087af4588e14669a2d53d7c116dcb59f16..11271762dcf5783c3179de1afc6a882c
if (!this.raids.containsKey(raid.getId())) {
this.raids.put(raid.getId(), raid);
diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-index 954f2b3b0df6b15731fc4389366a8063498cd7d3..7fc194d11ffeb82890d2faa1841bdb94f68336c2 100644
+index 63cf32fe3359eb00f5e526689a9b10f673911a86..1e0af82c74259783fdc86a7824b18ff1d14fe938 100644
--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-@@ -207,6 +207,7 @@ public class PurpurWorldConfig {
- public boolean milkCuresBadOmen = true;
+@@ -218,6 +218,7 @@ public class PurpurWorldConfig {
public double tridentLoyaltyVoidReturnHeight = 0.0D;
public double voidDamageHeight = -64.0D;
+ public double voidDamageDealt = 4.0D;
+ public int raidCooldownSeconds = 0;
private void miscGameplayMechanicsSettings() {
useBetterMending = getBoolean("gameplay-mechanics.use-better-mending", useBetterMending);
boatEjectPlayersOnLand = getBoolean("gameplay-mechanics.boat.eject-players-on-land", boatEjectPlayersOnLand);
-@@ -216,6 +217,7 @@ public class PurpurWorldConfig {
- milkCuresBadOmen = getBoolean("gameplay-mechanics.milk-cures-bad-omen", milkCuresBadOmen);
+@@ -228,6 +229,7 @@ public class PurpurWorldConfig {
tridentLoyaltyVoidReturnHeight = getDouble("gameplay-mechanics.trident-loyalty-void-return-height", tridentLoyaltyVoidReturnHeight);
voidDamageHeight = getDouble("gameplay-mechanics.void-damage-height", voidDamageHeight);
+ voidDamageDealt = getDouble("gameplay-mechanics.void-damage-dealt", voidDamageDealt);
+ raidCooldownSeconds = getInt("gameplay-mechanics.raid-cooldown-seconds", raidCooldownSeconds);
}
diff --git a/patches/server/0112-Despawn-rate-config-options-per-projectile-type.patch b/patches/server/0111-Despawn-rate-config-options-per-projectile-type.patch
similarity index 92%
rename from patches/server/0112-Despawn-rate-config-options-per-projectile-type.patch
rename to patches/server/0111-Despawn-rate-config-options-per-projectile-type.patch
index 168ede3078..625a596c5c 100644
--- a/patches/server/0112-Despawn-rate-config-options-per-projectile-type.patch
+++ b/patches/server/0111-Despawn-rate-config-options-per-projectile-type.patch
@@ -6,7 +6,7 @@ Subject: [PATCH] Despawn rate config options per projectile type
Default values of -1 respect vanilla behaviour.
diff --git a/src/main/java/net/minecraft/world/entity/projectile/EntityArrow.java b/src/main/java/net/minecraft/world/entity/projectile/EntityArrow.java
-index e440d26c920c4efddf958c61bfdfa508273062cc..3ee404effe339a5742926255da6a9c41d1bc9367 100644
+index 42c1a7e8d51868c74e92d97f1df8d36fcaab6252..5775a28cb9d94b94b6e6bbc810fe31260810632e 100644
--- a/src/main/java/net/minecraft/world/entity/projectile/EntityArrow.java
+++ b/src/main/java/net/minecraft/world/entity/projectile/EntityArrow.java
@@ -61,7 +61,7 @@ public abstract class EntityArrow extends IProjectile {
@@ -18,7 +18,7 @@ index e440d26c920c4efddf958c61bfdfa508273062cc..3ee404effe339a5742926255da6a9c41
private double damage;
public int knockbackStrength;
private SoundEffect ak;
-@@ -295,13 +295,23 @@ public abstract class EntityArrow extends IProjectile {
+@@ -293,13 +293,23 @@ public abstract class EntityArrow extends IProjectile {
}
@@ -96,10 +96,10 @@ index efdf5bc4f07231690c680429b3f77bd07970eee0..cf2c691357c41a7e7044f7a719144db2
+ // Purpur end
}
diff --git a/src/main/java/net/minecraft/world/entity/projectile/EntityFireworks.java b/src/main/java/net/minecraft/world/entity/projectile/EntityFireworks.java
-index f9a355c847d778a9aad1987882fc816af92450ba..9b4b8b1a0f7654c9c30ca614cac6f485f82db5ef 100644
+index ca7a10c4b04766d7eb55be9252e96ef939e76df3..6a6ed24640c152bd5d6637b30ccce3efdf8a4856 100644
--- a/src/main/java/net/minecraft/world/entity/projectile/EntityFireworks.java
+++ b/src/main/java/net/minecraft/world/entity/projectile/EntityFireworks.java
-@@ -325,4 +325,11 @@ public class EntityFireworks extends IProjectile {
+@@ -323,4 +323,11 @@ public class EntityFireworks extends IProjectile {
public Packet> P() {
return new PacketPlayOutSpawnEntity(this);
}
@@ -112,10 +112,10 @@ index f9a355c847d778a9aad1987882fc816af92450ba..9b4b8b1a0f7654c9c30ca614cac6f485
+ // Purpur end
}
diff --git a/src/main/java/net/minecraft/world/entity/projectile/EntityFishingHook.java b/src/main/java/net/minecraft/world/entity/projectile/EntityFishingHook.java
-index dc6d279766ccc83a8f450028a09491b1c88f524c..5a5773209183331d849368c6b300367ac0ebe203 100644
+index 45f0f004e97b20e5c6c5b1f205b088bf8aa86017..242ba2c1feb07f9e582a722f34e6362dd84f27cc 100644
--- a/src/main/java/net/minecraft/world/entity/projectile/EntityFishingHook.java
+++ b/src/main/java/net/minecraft/world/entity/projectile/EntityFishingHook.java
-@@ -617,4 +617,11 @@ public class EntityFishingHook extends IProjectile {
+@@ -615,4 +615,11 @@ public class EntityFishingHook extends IProjectile {
private HookState() {}
}
@@ -144,10 +144,10 @@ index cf2663d9883654f53b327246d85ee63c3990cd71..e860737bacfea0a1d728dbaaf41d6216
+ // Purpur end
}
diff --git a/src/main/java/net/minecraft/world/entity/projectile/EntityLlamaSpit.java b/src/main/java/net/minecraft/world/entity/projectile/EntityLlamaSpit.java
-index 8aef834a6e8fcf5d44986745affb8f27bc3dfd6b..0bfb80331cea6bd2cf85a9475b6416691edd8b0b 100644
+index 6f497fc1b1eb33d0d9dfb0dc014b25b7eeb0dfac..56de41fc11720f4a37ee4e1e7cbec1b2dbe3ab76 100644
--- a/src/main/java/net/minecraft/world/entity/projectile/EntityLlamaSpit.java
+++ b/src/main/java/net/minecraft/world/entity/projectile/EntityLlamaSpit.java
-@@ -88,4 +88,11 @@ public class EntityLlamaSpit extends IProjectile {
+@@ -86,4 +86,11 @@ public class EntityLlamaSpit extends IProjectile {
public Packet> P() {
return new PacketPlayOutSpawnEntity(this);
}
@@ -176,7 +176,7 @@ index dbc0afc5fb9e358a3e6d596692f57fb28303c4da..a3344719bcf178df5b63cda6f6a854c2
+ // Purpur end
}
diff --git a/src/main/java/net/minecraft/world/entity/projectile/EntityShulkerBullet.java b/src/main/java/net/minecraft/world/entity/projectile/EntityShulkerBullet.java
-index 1ae528ccd09a6536b3aac320e6218f03c274d6a9..cfc1376bfed9399daa6f27f54780ccf8e05753c6 100644
+index 24076f3de298173e293507f2024105532f833455..96c609aa888b4fb83db6eddba259bd553fe0dd0a 100644
--- a/src/main/java/net/minecraft/world/entity/projectile/EntityShulkerBullet.java
+++ b/src/main/java/net/minecraft/world/entity/projectile/EntityShulkerBullet.java
@@ -337,4 +337,11 @@ public class EntityShulkerBullet extends IProjectile {
@@ -257,16 +257,18 @@ index 021a7e31dc3650c0c404a893374528e6a63dfbad..2fe0e32a1158cccb3060f5a986c9fc41
+ // Purpur end
}
diff --git a/src/main/java/net/minecraft/world/entity/projectile/IProjectile.java b/src/main/java/net/minecraft/world/entity/projectile/IProjectile.java
-index 3914081629669aea19d50530db996728bbfa607f..62fa5be9090c8789e91bf9b9f614e74a4a6babdd 100644
+index 390023a7a825eed850a13572b719f47ed534c003..8df2b646df701b4d21f956b9870d7c09c13e2b6d 100644
--- a/src/main/java/net/minecraft/world/entity/projectile/IProjectile.java
+++ b/src/main/java/net/minecraft/world/entity/projectile/IProjectile.java
-@@ -25,11 +25,25 @@ public abstract class IProjectile extends Entity {
+@@ -25,6 +25,7 @@ public abstract class IProjectile extends Entity {
private UUID shooter;
private int c;
private boolean d; public boolean leftOwner() { return d; } public void setLeftOwner(boolean leftOwner) { this.d = leftOwner; } // Purpur - OBFHELPER
+ public int despawnCounter; // Purpur - moved from EntityArrow
- IProjectile(EntityTypes extends IProjectile> entitytypes, World world) {
+ // CraftBukkit start
+ private boolean hitCancelled = false;
+@@ -34,6 +35,19 @@ public abstract class IProjectile extends Entity {
super(entitytypes, world);
}
@@ -286,7 +288,7 @@ index 3914081629669aea19d50530db996728bbfa607f..62fa5be9090c8789e91bf9b9f614e74a
public void setShooter(@Nullable Entity entity) {
if (entity != null) {
this.shooter = entity.getUniqueID();
-@@ -84,6 +98,12 @@ public abstract class IProjectile extends Entity {
+@@ -88,6 +102,12 @@ public abstract class IProjectile extends Entity {
}
super.tick();
@@ -300,10 +302,10 @@ index 3914081629669aea19d50530db996728bbfa607f..62fa5be9090c8789e91bf9b9f614e74a
public boolean checkIfLeftOwner() { return this.h(); } // Purpur - OBFHELPER
diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-index 7fc194d11ffeb82890d2faa1841bdb94f68336c2..8312461ed8c4b47049ec0eb0501306c14ebfee94 100644
+index 1e0af82c74259783fdc86a7824b18ff1d14fe938..c9fa235746dd8cf148ae88c3cca4c4a9639d0f61 100644
--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-@@ -199,6 +199,35 @@ public class PurpurWorldConfig {
+@@ -209,6 +209,35 @@ public class PurpurWorldConfig {
idleTimeoutUpdateTabList = getBoolean("gameplay-mechanics.player.idle-timeout.update-tab-list", idleTimeoutUpdateTabList);
}
diff --git a/patches/server/0113-Add-option-to-disable-zombie-aggressiveness-towards-.patch b/patches/server/0112-Add-option-to-disable-zombie-aggressiveness-towards-.patch
similarity index 97%
rename from patches/server/0113-Add-option-to-disable-zombie-aggressiveness-towards-.patch
rename to patches/server/0112-Add-option-to-disable-zombie-aggressiveness-towards-.patch
index f48cfed042..30f3457d4a 100644
--- a/patches/server/0113-Add-option-to-disable-zombie-aggressiveness-towards-.patch
+++ b/patches/server/0112-Add-option-to-disable-zombie-aggressiveness-towards-.patch
@@ -69,10 +69,10 @@ index 901fe8d224130c67bad00636b065bc798859a18e..88264b7b2c21a377f4b0dd857065e401
this.targetSelector.a(5, new PathfinderGoalNearestAttackableTarget<>(this, EntityTurtle.class, 10, true, false, EntityTurtle.bo));
}
diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-index 8312461ed8c4b47049ec0eb0501306c14ebfee94..b6ad75695b80c4ec2249caa908b2fd2f4bbfbfaf 100644
+index c9fa235746dd8cf148ae88c3cca4c4a9639d0f61..94681a3cb57950b0cd074927aa63bf84e3ef0cf7 100644
--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-@@ -1069,12 +1069,14 @@ public class PurpurWorldConfig {
+@@ -1081,12 +1081,14 @@ public class PurpurWorldConfig {
public boolean zombieJockeyOnlyBaby = true;
public double zombieJockeyChance = 0.05D;
public boolean zombieJockeyTryExistingChickens = true;
diff --git a/patches/server/0114-Persistent-TileEntity-Lore-and-DisplayName.patch b/patches/server/0113-Persistent-TileEntity-Lore-and-DisplayName.patch
similarity index 96%
rename from patches/server/0114-Persistent-TileEntity-Lore-and-DisplayName.patch
rename to patches/server/0113-Persistent-TileEntity-Lore-and-DisplayName.patch
index c83b96a9c1..1a90317e28 100644
--- a/patches/server/0114-Persistent-TileEntity-Lore-and-DisplayName.patch
+++ b/patches/server/0113-Persistent-TileEntity-Lore-and-DisplayName.patch
@@ -61,7 +61,7 @@ index 59d52c252b2e59923b8e513dd4d2e1ec9ce34dc7..4be1c8ee85f411a8b01be50b8cc3dc38
@Nullable
diff --git a/src/main/java/net/minecraft/world/level/block/Block.java b/src/main/java/net/minecraft/world/level/block/Block.java
-index 1bc6380a805c1f76ffde67951d32d911e8f1f4a7..1e3adc491f0454edf4e19fb0bdf5d2cb7c8e842d 100644
+index fa43eb5e31a9e3c6d6725ef770a7d1b3aec4d663..a835285d230ea0dffa1b28c2a7a006041f2e6b2a 100644
--- a/src/main/java/net/minecraft/world/level/block/Block.java
+++ b/src/main/java/net/minecraft/world/level/block/Block.java
@@ -15,10 +15,15 @@ import net.minecraft.core.EnumDirection;
@@ -214,22 +214,22 @@ index 93d02ccb87c17404c55884f52ae40c7b7ddfb103..35c4d5414db66b977a354ac50d35a6aa
+ // Purpur end
}
diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-index b6ad75695b80c4ec2249caa908b2fd2f4bbfbfaf..1a5a8242a11f5b5851c9184d0a216110a591df8e 100644
+index 94681a3cb57950b0cd074927aa63bf84e3ef0cf7..a9f4732ece4764cabb1ae7b55fa9c273996f7d9d 100644
--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-@@ -234,6 +234,7 @@ public class PurpurWorldConfig {
+@@ -244,6 +244,7 @@ public class PurpurWorldConfig {
public boolean entitiesPickUpLootBypassMobGriefing = false;
public boolean entitiesCanUsePortals = true;
public boolean milkCuresBadOmen = true;
+ public boolean persistentTileEntityDisplayNames = false;
public double tridentLoyaltyVoidReturnHeight = 0.0D;
public double voidDamageHeight = -64.0D;
- public int raidCooldownSeconds = 0;
-@@ -244,6 +245,7 @@ public class PurpurWorldConfig {
+ public double voidDamageDealt = 4.0D;
+@@ -255,6 +256,7 @@ public class PurpurWorldConfig {
entitiesPickUpLootBypassMobGriefing = getBoolean("gameplay-mechanics.entities-pick-up-loot-bypass-mob-griefing", entitiesPickUpLootBypassMobGriefing);
entitiesCanUsePortals = getBoolean("gameplay-mechanics.entities-can-use-portals", entitiesCanUsePortals);
milkCuresBadOmen = getBoolean("gameplay-mechanics.milk-cures-bad-omen", milkCuresBadOmen);
+ persistentTileEntityDisplayNames = getBoolean("gameplay-mechanics.persistent-tileentity-display-names-and-lore", persistentTileEntityDisplayNames);
tridentLoyaltyVoidReturnHeight = getDouble("gameplay-mechanics.trident-loyalty-void-return-height", tridentLoyaltyVoidReturnHeight);
voidDamageHeight = getDouble("gameplay-mechanics.void-damage-height", voidDamageHeight);
- raidCooldownSeconds = getInt("gameplay-mechanics.raid-cooldown-seconds", raidCooldownSeconds);
+ voidDamageDealt = getDouble("gameplay-mechanics.void-damage-dealt", voidDamageDealt);
diff --git a/patches/server/0115-Add-predicate-to-recipe-s-ExactChoice-ingredient.patch b/patches/server/0114-Add-predicate-to-recipe-s-ExactChoice-ingredient.patch
similarity index 100%
rename from patches/server/0115-Add-predicate-to-recipe-s-ExactChoice-ingredient.patch
rename to patches/server/0114-Add-predicate-to-recipe-s-ExactChoice-ingredient.patch
diff --git a/patches/server/0116-Flying-squids-Oh-my.patch b/patches/server/0115-Flying-squids-Oh-my.patch
similarity index 91%
rename from patches/server/0116-Flying-squids-Oh-my.patch
rename to patches/server/0115-Flying-squids-Oh-my.patch
index 03e2962320..b29144311e 100644
--- a/patches/server/0116-Flying-squids-Oh-my.patch
+++ b/patches/server/0115-Flying-squids-Oh-my.patch
@@ -5,7 +5,7 @@ Subject: [PATCH] Flying squids! Oh my!
diff --git a/src/main/java/net/minecraft/world/entity/animal/EntitySquid.java b/src/main/java/net/minecraft/world/entity/animal/EntitySquid.java
-index a9fa18931d93dd7fa428b8cd6a414d4b3a3b4fbb..be48e12dd6c9a390bf383129953bcd3d1f818427 100644
+index 777c3bcf267d6cf31300588826d3af6b55cab350..7ec3e5d136cbb708b3bb29aa79bdd401d37d56dc 100644
--- a/src/main/java/net/minecraft/world/entity/animal/EntitySquid.java
+++ b/src/main/java/net/minecraft/world/entity/animal/EntitySquid.java
@@ -81,6 +81,11 @@ public class EntitySquid extends EntityWaterAnimal {
@@ -38,10 +38,10 @@ index a9fa18931d93dd7fa428b8cd6a414d4b3a3b4fbb..be48e12dd6c9a390bf383129953bcd3d
float f1 = MathHelper.cos(f) * 0.2F;
float f2 = -0.1F + this.b.getRandom().nextFloat() * 0.2F;
diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-index 1a5a8242a11f5b5851c9184d0a216110a591df8e..630e6b38d391112a42c60650af78f79afe6a190e 100644
+index a9f4732ece4764cabb1ae7b55fa9c273996f7d9d..9a18d3612d38cdd3d85cc69fba6df355b6cc6829 100644
--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-@@ -925,10 +925,12 @@ public class PurpurWorldConfig {
+@@ -937,10 +937,12 @@ public class PurpurWorldConfig {
public boolean squidRidable = false;
public boolean squidImmuneToEAR = true;
public double squidOffsetWaterCheck = 0.0D;
diff --git a/patches/server/0117-Infinity-bow-settings.patch b/patches/server/0116-Infinity-bow-settings.patch
similarity index 95%
rename from patches/server/0117-Infinity-bow-settings.patch
rename to patches/server/0116-Infinity-bow-settings.patch
index 28df332c18..51c938b3fc 100644
--- a/patches/server/0117-Infinity-bow-settings.patch
+++ b/patches/server/0116-Infinity-bow-settings.patch
@@ -26,10 +26,10 @@ index 015f4d71f35a9d512814389b6e6cab74c0daf116..c7e20b25b4d09463fa54c66e62208e90
entityhuman.b(StatisticList.ITEM_USED.b(this));
}
diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-index 630e6b38d391112a42c60650af78f79afe6a190e..7c89bda2330b1a3fe5a5c83ee0038936938b7ae0 100644
+index 9a18d3612d38cdd3d85cc69fba6df355b6cc6829..e982733732e3dfd9d34cf5d9e87a9caa3af2d6e8 100644
--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-@@ -199,6 +199,15 @@ public class PurpurWorldConfig {
+@@ -209,6 +209,15 @@ public class PurpurWorldConfig {
idleTimeoutUpdateTabList = getBoolean("gameplay-mechanics.player.idle-timeout.update-tab-list", idleTimeoutUpdateTabList);
}
diff --git a/patches/server/0118-Stonecutter-damage.patch b/patches/server/0117-Stonecutter-damage.patch
similarity index 67%
rename from patches/server/0118-Stonecutter-damage.patch
rename to patches/server/0117-Stonecutter-damage.patch
index d3842ac3d8..2d0a11f809 100644
--- a/patches/server/0118-Stonecutter-damage.patch
+++ b/patches/server/0117-Stonecutter-damage.patch
@@ -4,31 +4,34 @@ Date: Mon, 5 Oct 2020 12:15:14 -0500
Subject: [PATCH] Stonecutter damage
+diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java
+index 8fb7ec53602c6eade18d97d427dcc33030167642..ac52732d4c1a3056664b40a15b6ee9cda9bea3d0 100644
+--- a/src/main/java/net/minecraft/world/entity/Entity.java
++++ b/src/main/java/net/minecraft/world/entity/Entity.java
+@@ -893,7 +893,7 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, ne
+ }
+ // CraftBukkit end
+
+- if (this.onGround && !this.bv()) {
++ if (this.onGround && (!this.bv() || (block == Blocks.STONECUTTER && world.purpurConfig.stonecutterDamage > 0.0F))) { // Purpur
+ block.stepOn(this.world, blockposition, this);
+ }
+
diff --git a/src/main/java/net/minecraft/world/level/block/BlockStonecutter.java b/src/main/java/net/minecraft/world/level/block/BlockStonecutter.java
-index 54c9586cd7f8c9691a1c7ded9c9c96b0f316b0b6..988204918854e982e334eb2417b83914b58cbcf6 100644
+index 54c9586cd7f8c9691a1c7ded9c9c96b0f316b0b6..68c6f090a10564a790f3bf175e2378d1f7103b8e 100644
--- a/src/main/java/net/minecraft/world/level/block/BlockStonecutter.java
+++ b/src/main/java/net/minecraft/world/level/block/BlockStonecutter.java
-@@ -10,6 +10,9 @@ import net.minecraft.world.EnumHand;
- import net.minecraft.world.EnumInteractionResult;
- import net.minecraft.world.ITileInventory;
- import net.minecraft.world.TileInventory;
-+import net.minecraft.world.damagesource.DamageSource;
-+import net.minecraft.world.entity.Entity;
-+import net.minecraft.world.entity.EntityLiving;
- import net.minecraft.world.entity.player.EntityHuman;
- import net.minecraft.world.inventory.ContainerAccess;
- import net.minecraft.world.inventory.ContainerStonecutter;
-@@ -94,4 +97,16 @@ public class BlockStonecutter extends Block {
+@@ -94,4 +94,16 @@ public class BlockStonecutter extends Block {
public boolean a(IBlockData iblockdata, IBlockAccess iblockaccess, BlockPosition blockposition, PathMode pathmode) {
return false;
}
+
+ // Purpur start
+ @Override
-+ public void stepOn(World world, BlockPosition pos, Entity entity) {
-+ if (world.purpurConfig.stonecutterDamage > 0.0F && entity instanceof EntityLiving) {
++ public void stepOn(World world, BlockPosition pos, net.minecraft.world.entity.Entity entity) {
++ if (world.purpurConfig.stonecutterDamage > 0.0F && entity instanceof net.minecraft.world.entity.EntityLiving) {
+ org.bukkit.craftbukkit.event.CraftEventFactory.blockDamage = world.getWorld().getBlockAt(pos.getX(), pos.getY(), pos.getZ());
-+ entity.damageEntity(DamageSource.CACTUS, world.purpurConfig.stonecutterDamage);
++ entity.damageEntity(net.minecraft.world.damagesource.DamageSource.CACTUS, world.purpurConfig.stonecutterDamage);
+ org.bukkit.craftbukkit.event.CraftEventFactory.blockDamage = null;
+ }
+ super.stepOn(world, pos, entity);
@@ -49,10 +52,10 @@ index 7b92a54cfb64fb77af99e6bf66eacbdb9e769dc1..9d08094165cf18d99116b5c721fff888
}
diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-index 7c89bda2330b1a3fe5a5c83ee0038936938b7ae0..b8929df319ccb260b0f8fc841c9665c6aa2548eb 100644
+index e982733732e3dfd9d34cf5d9e87a9caa3af2d6e8..11f699eb7d68013df708a874a214da6be3fe6773 100644
--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-@@ -429,6 +429,11 @@ public class PurpurWorldConfig {
+@@ -441,6 +441,11 @@ public class PurpurWorldConfig {
spawnerDeactivateByRedstone = getBoolean("blocks.spawner.deactivate-by-redstone", spawnerDeactivateByRedstone);
}
diff --git a/patches/server/0119-Configurable-daylight-cycle.patch b/patches/server/0118-Configurable-daylight-cycle.patch
similarity index 96%
rename from patches/server/0119-Configurable-daylight-cycle.patch
rename to patches/server/0118-Configurable-daylight-cycle.patch
index 515819368b..280f2eab5f 100644
--- a/patches/server/0119-Configurable-daylight-cycle.patch
+++ b/patches/server/0118-Configurable-daylight-cycle.patch
@@ -18,7 +18,7 @@ index 3086ee023685781d94e2fb99fc8dff5264f01165..74c1047305cac5673e274096709c757e
public PacketPlayOutUpdateTime() {}
diff --git a/src/main/java/net/minecraft/server/level/WorldServer.java b/src/main/java/net/minecraft/server/level/WorldServer.java
-index 64feabfb860ac29a7f7692bcc9972369dbdc2e02..028911ebe843751080564d90e96306524e5a2e21 100644
+index 9d5d71d9bfe24a0a5504fd9f70fbfed1591570f2..e76e54fb833ce69968d08f78836acf23e6436653 100644
--- a/src/main/java/net/minecraft/server/level/WorldServer.java
+++ b/src/main/java/net/minecraft/server/level/WorldServer.java
@@ -64,6 +64,7 @@ import net.minecraft.network.protocol.game.PacketPlayOutExplosion;
@@ -82,7 +82,7 @@ index 64feabfb860ac29a7f7692bcc9972369dbdc2e02..028911ebe843751080564d90e9630652
public void doMobSpawning(boolean flag, boolean flag1) {
diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-index b8929df319ccb260b0f8fc841c9665c6aa2548eb..fb694fd7be60dc9ae7305b4a03a767b6ae169778 100644
+index 11f699eb7d68013df708a874a214da6be3fe6773..b11a71a1dda78098f1995f289a1fb45c9a02eeb6 100644
--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
@@ -150,6 +150,13 @@ public class PurpurWorldConfig {
diff --git a/patches/server/0120-Allow-infinite-and-mending-enchantments-together.patch b/patches/server/0119-Allow-infinite-and-mending-enchantments-together.patch
similarity index 100%
rename from patches/server/0120-Allow-infinite-and-mending-enchantments-together.patch
rename to patches/server/0119-Allow-infinite-and-mending-enchantments-together.patch
diff --git a/patches/server/0121-Infinite-fuel-furnace.patch b/patches/server/0120-Infinite-fuel-furnace.patch
similarity index 96%
rename from patches/server/0121-Infinite-fuel-furnace.patch
rename to patches/server/0120-Infinite-fuel-furnace.patch
index 17ef2aa9da..5e29941e01 100644
--- a/patches/server/0121-Infinite-fuel-furnace.patch
+++ b/patches/server/0120-Infinite-fuel-furnace.patch
@@ -57,10 +57,10 @@ index 9ce19b89c16eb6edd3d5d5cc87a966a37f66895c..ac42fd627009a87709448354f232d8b5
if (flag1) {
diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-index fb694fd7be60dc9ae7305b4a03a767b6ae169778..1ee44467f98f8ecffa7c7d61a6169ba0b727f234 100644
+index b11a71a1dda78098f1995f289a1fb45c9a02eeb6..30ca0eaf588b7056963e9c6ecb4682608b46a463 100644
--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-@@ -397,6 +397,11 @@ public class PurpurWorldConfig {
+@@ -409,6 +409,11 @@ public class PurpurWorldConfig {
farmlandGetsMoistFromBelow = getBoolean("blocks.farmland.gets-moist-from-below", farmlandGetsMoistFromBelow);
}
diff --git a/patches/server/0122-Arrows-should-not-reset-despawn-counter.patch b/patches/server/0121-Arrows-should-not-reset-despawn-counter.patch
similarity index 86%
rename from patches/server/0122-Arrows-should-not-reset-despawn-counter.patch
rename to patches/server/0121-Arrows-should-not-reset-despawn-counter.patch
index 7074af8b97..e0af66b86d 100644
--- a/patches/server/0122-Arrows-should-not-reset-despawn-counter.patch
+++ b/patches/server/0121-Arrows-should-not-reset-despawn-counter.patch
@@ -7,10 +7,10 @@ This prevents keeping arrows alive indefinitely (such as when the block
the arrow is stuck in gets removed, like a piston head going up/down)
diff --git a/src/main/java/net/minecraft/world/entity/projectile/EntityArrow.java b/src/main/java/net/minecraft/world/entity/projectile/EntityArrow.java
-index 3ee404effe339a5742926255da6a9c41d1bc9367..6f0a306449844dc50426202262219d0e952459cc 100644
+index 5775a28cb9d94b94b6e6bbc810fe31260810632e..7861b9e28b0fcc7ab931498fc7c96404456b9998 100644
--- a/src/main/java/net/minecraft/world/entity/projectile/EntityArrow.java
+++ b/src/main/java/net/minecraft/world/entity/projectile/EntityArrow.java
-@@ -283,7 +283,7 @@ public abstract class EntityArrow extends IProjectile {
+@@ -281,7 +281,7 @@ public abstract class EntityArrow extends IProjectile {
Vec3D vec3d = this.getMot();
this.setMot(vec3d.d((double) (this.random.nextFloat() * 0.2F), (double) (this.random.nextFloat() * 0.2F), (double) (this.random.nextFloat() * 0.2F)));
diff --git a/patches/server/0123-Add-tablist-suffix-option-for-afk.patch b/patches/server/0122-Add-tablist-suffix-option-for-afk.patch
similarity index 93%
rename from patches/server/0123-Add-tablist-suffix-option-for-afk.patch
rename to patches/server/0122-Add-tablist-suffix-option-for-afk.patch
index f84593dc7e..0cff40fe6c 100644
--- a/patches/server/0123-Add-tablist-suffix-option-for-afk.patch
+++ b/patches/server/0122-Add-tablist-suffix-option-for-afk.patch
@@ -5,10 +5,10 @@ Subject: [PATCH] Add tablist suffix option for afk
diff --git a/src/main/java/net/minecraft/server/level/EntityPlayer.java b/src/main/java/net/minecraft/server/level/EntityPlayer.java
-index af0253aecc8f3a4125b37aed4548c13b7ad6260a..38254784de3165e8546e1fcd4f780741abb78558 100644
+index 0ed513afdab9b4f8e91b55ffc05f6d26bbd14d22..a2fc2924191590c6273f0393f39516d686573296 100644
--- a/src/main/java/net/minecraft/server/level/EntityPlayer.java
+++ b/src/main/java/net/minecraft/server/level/EntityPlayer.java
-@@ -2122,7 +2122,11 @@ public class EntityPlayer extends EntityHuman implements ICrafting {
+@@ -2120,7 +2120,11 @@ public class EntityPlayer extends EntityHuman implements ICrafting {
}
if (world.purpurConfig.idleTimeoutUpdateTabList) {
diff --git a/patches/server/0124-Ability-to-re-add-farmland-mechanics-from-Alpha.patch b/patches/server/0123-Ability-to-re-add-farmland-mechanics-from-Alpha.patch
similarity index 92%
rename from patches/server/0124-Ability-to-re-add-farmland-mechanics-from-Alpha.patch
rename to patches/server/0123-Ability-to-re-add-farmland-mechanics-from-Alpha.patch
index 35814292fd..a4c3052aaf 100644
--- a/patches/server/0124-Ability-to-re-add-farmland-mechanics-from-Alpha.patch
+++ b/patches/server/0123-Ability-to-re-add-farmland-mechanics-from-Alpha.patch
@@ -24,10 +24,10 @@ index 2bbaa2fb426869223a9b2f07406496c1b0daff3f..3e8893bf76b8ffda4c595c81086556ea
return;
}
diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-index 1ee44467f98f8ecffa7c7d61a6169ba0b727f234..c29f923872dea87fa3fcbb9e4e8554947b569121 100644
+index 30ca0eaf588b7056963e9c6ecb4682608b46a463..44c27c6dd4993add42410373191a46f4cc92f42f 100644
--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-@@ -393,8 +393,10 @@ public class PurpurWorldConfig {
+@@ -405,8 +405,10 @@ public class PurpurWorldConfig {
}
public boolean farmlandGetsMoistFromBelow = false;
diff --git a/patches/server/0125-Add-adjustable-breeding-cooldown-to-config.patch b/patches/server/0124-Add-adjustable-breeding-cooldown-to-config.patch
similarity index 90%
rename from patches/server/0125-Add-adjustable-breeding-cooldown-to-config.patch
rename to patches/server/0124-Add-adjustable-breeding-cooldown-to-config.patch
index 8bbae10b3f..918de7cdc6 100644
--- a/patches/server/0125-Add-adjustable-breeding-cooldown-to-config.patch
+++ b/patches/server/0124-Add-adjustable-breeding-cooldown-to-config.patch
@@ -5,7 +5,7 @@ Subject: [PATCH] Add adjustable breeding cooldown to config
diff --git a/src/main/java/net/minecraft/world/entity/animal/EntityAnimal.java b/src/main/java/net/minecraft/world/entity/animal/EntityAnimal.java
-index 28dd42921961c6a47f2d85a5f93b8298f2c228d3..6ae5fafd379863bf23df3580d3dbc7a5ba63b545 100644
+index 4de0a733819d408e8b9a55b604f455281d7732c5..94b5874c1eb90c02a557179a2a1170b1da85deb4 100644
--- a/src/main/java/net/minecraft/world/entity/animal/EntityAnimal.java
+++ b/src/main/java/net/minecraft/world/entity/animal/EntityAnimal.java
@@ -145,7 +145,7 @@ public abstract class EntityAnimal extends EntityAgeable {
@@ -30,8 +30,8 @@ index 28dd42921961c6a47f2d85a5f93b8298f2c228d3..6ae5fafd379863bf23df3580d3dbc7a5
+ }
+ // Purpur end
// CraftBukkit start - call EntityBreedEvent
- int experience = this.getRandom().nextInt(7) + 1;
- org.bukkit.event.entity.EntityBreedEvent entityBreedEvent = org.bukkit.craftbukkit.event.CraftEventFactory.callEntityBreedEvent(entityageable, this, entityanimal, entityplayer, this.breedItem, experience);
+ entityageable.setBaby(true);
+ entityageable.setPositionRotation(this.locX(), this.locY(), this.locZ(), 0.0F, 0.0F);
diff --git a/src/main/java/net/minecraft/world/level/World.java b/src/main/java/net/minecraft/world/level/World.java
index 4c85525fe461fc3d52c538ab2610c1098c9d0151..b03865ca77c3fbd4fe61db450ffd3cede9613568 100644
--- a/src/main/java/net/minecraft/world/level/World.java
@@ -102,20 +102,20 @@ index 4c85525fe461fc3d52c538ab2610c1098c9d0151..b03865ca77c3fbd4fe61db450ffd3ced
this.world = new CraftWorld((WorldServer) this, gen, env);
this.ticksPerAnimalSpawns = this.getServer().getTicksPerAnimalSpawns(); // CraftBukkit
diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-index c29f923872dea87fa3fcbb9e4e8554947b569121..def36f72153b25094693b82e962366cc19ae4d13 100644
+index 44c27c6dd4993add42410373191a46f4cc92f42f..b92715b115332e8197d5a02a2f308a1ab0f447b6 100644
--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-@@ -254,6 +254,7 @@ public class PurpurWorldConfig {
- public double tridentLoyaltyVoidReturnHeight = 0.0D;
+@@ -265,6 +265,7 @@ public class PurpurWorldConfig {
public double voidDamageHeight = -64.0D;
+ public double voidDamageDealt = 4.0D;
public int raidCooldownSeconds = 0;
+ public int animalBreedingCooldownSeconds = 0;
private void miscGameplayMechanicsSettings() {
useBetterMending = getBoolean("gameplay-mechanics.use-better-mending", useBetterMending);
boatEjectPlayersOnLand = getBoolean("gameplay-mechanics.boat.eject-players-on-land", boatEjectPlayersOnLand);
-@@ -265,6 +266,7 @@ public class PurpurWorldConfig {
- tridentLoyaltyVoidReturnHeight = getDouble("gameplay-mechanics.trident-loyalty-void-return-height", tridentLoyaltyVoidReturnHeight);
+@@ -277,6 +278,7 @@ public class PurpurWorldConfig {
voidDamageHeight = getDouble("gameplay-mechanics.void-damage-height", voidDamageHeight);
+ voidDamageDealt = getDouble("gameplay-mechanics.void-damage-dealt", voidDamageDealt);
raidCooldownSeconds = getInt("gameplay-mechanics.raid-cooldown-seconds", raidCooldownSeconds);
+ animalBreedingCooldownSeconds = getInt("gameplay-mechanics.animal-breeding-cooldown-seconds", animalBreedingCooldownSeconds);
}
diff --git a/patches/server/0126-Make-entity-breeding-times-configurable.patch b/patches/server/0125-Make-entity-breeding-times-configurable.patch
similarity index 91%
rename from patches/server/0126-Make-entity-breeding-times-configurable.patch
rename to patches/server/0125-Make-entity-breeding-times-configurable.patch
index 7d677e8973..9f54bbcc85 100644
--- a/patches/server/0126-Make-entity-breeding-times-configurable.patch
+++ b/patches/server/0125-Make-entity-breeding-times-configurable.patch
@@ -5,24 +5,24 @@ Subject: [PATCH] Make entity breeding times configurable
diff --git a/src/main/java/net/minecraft/world/entity/ai/behavior/BehaviorMakeLove.java b/src/main/java/net/minecraft/world/entity/ai/behavior/BehaviorMakeLove.java
-index a68428554b93f4aba9f0cb0b3af03985896830b7..c1e8b9562eb37cee3d47034b93d4ef0c998eb52f 100644
+index 79989c143fc8393172475e33d356510b3547afb9..d1315f4b6e026f70e04a0b54289fd13b4be17cde 100644
--- a/src/main/java/net/minecraft/world/entity/ai/behavior/BehaviorMakeLove.java
+++ b/src/main/java/net/minecraft/world/entity/ai/behavior/BehaviorMakeLove.java
-@@ -115,8 +115,10 @@ public class BehaviorMakeLove extends Behavior {
- if (entityvillager2 == null) {
- return Optional.empty();
- } else {
+@@ -117,8 +117,10 @@ public class BehaviorMakeLove extends Behavior {
+ return Optional.empty();
+ }
+ // CraftBukkit end
- entityvillager.setAgeRaw(6000);
- entityvillager1.setAgeRaw(6000);
+ // Purpur start
+ entityvillager.setAgeRaw(worldserver.purpurConfig.villagerBreedingTicks);
+ entityvillager1.setAgeRaw(worldserver.purpurConfig.villagerBreedingTicks);
+ // Purpur end
- entityvillager2.setAgeRaw(-24000);
- entityvillager2.setPositionRotation(entityvillager.locX(), entityvillager.locY(), entityvillager.locZ(), 0.0F, 0.0F);
worldserver.addAllEntities(entityvillager2, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.BREEDING); // CraftBukkit - added SpawnReason
+ worldserver.broadcastEntityEffect(entityvillager2, (byte) 12);
+ return Optional.of(entityvillager2);
diff --git a/src/main/java/net/minecraft/world/entity/animal/EntityAnimal.java b/src/main/java/net/minecraft/world/entity/animal/EntityAnimal.java
-index 6ae5fafd379863bf23df3580d3dbc7a5ba63b545..38a4072a5df3abd3d1d9929f6402b3edfdd6c197 100644
+index 94b5874c1eb90c02a557179a2a1170b1da85deb4..181bb648dd32f71c7f9d3fbb4974e2a1afba61ac 100644
--- a/src/main/java/net/minecraft/world/entity/animal/EntityAnimal.java
+++ b/src/main/java/net/minecraft/world/entity/animal/EntityAnimal.java
@@ -38,6 +38,7 @@ public abstract class EntityAnimal extends EntityAgeable {
@@ -33,7 +33,7 @@ index 6ae5fafd379863bf23df3580d3dbc7a5ba63b545..38a4072a5df3abd3d1d9929f6402b3ed
protected EntityAnimal(EntityTypes extends EntityAnimal> entitytypes, World world) {
super(entitytypes, world);
-@@ -259,8 +260,10 @@ public abstract class EntityAnimal extends EntityAgeable {
+@@ -261,8 +262,10 @@ public abstract class EntityAnimal extends EntityAgeable {
CriterionTriggers.o.a(entityplayer, this, entityanimal, entityageable);
}
@@ -45,12 +45,12 @@ index 6ae5fafd379863bf23df3580d3dbc7a5ba63b545..38a4072a5df3abd3d1d9929f6402b3ed
+ // Purpur end
this.resetLove();
entityanimal.resetLove();
- entityageable.setBaby(true);
+ worldserver.addAllEntities(entityageable, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.BREEDING); // CraftBukkit - added SpawnReason
diff --git a/src/main/java/net/minecraft/world/entity/animal/EntityBee.java b/src/main/java/net/minecraft/world/entity/animal/EntityBee.java
-index 0c6d3dae70eeea844a31f9edf54410db13e0b04b..9e40fd6585592ccd1deff1d8319c57660474c053 100644
+index bcd510e0bf647a240edfaac1348119c5e1d7dc42..6086dda5b06f0c0e02734edf7141b13715420d3c 100644
--- a/src/main/java/net/minecraft/world/entity/animal/EntityBee.java
+++ b/src/main/java/net/minecraft/world/entity/animal/EntityBee.java
-@@ -176,6 +176,11 @@ public class EntityBee extends EntityAnimal implements IEntityAngerable, EntityB
+@@ -175,6 +175,11 @@ public class EntityBee extends EntityAnimal implements IEntityAngerable, EntityB
setMot(mot.a(0.9D));
}
}
@@ -63,7 +63,7 @@ index 0c6d3dae70eeea844a31f9edf54410db13e0b04b..9e40fd6585592ccd1deff1d8319c5766
@Override
diff --git a/src/main/java/net/minecraft/world/entity/animal/EntityCat.java b/src/main/java/net/minecraft/world/entity/animal/EntityCat.java
-index 3efb010d0e045d14051a33bd7465669e415c26bd..079b95ef465f7155f426a2c87a4a50f8369d0a18 100644
+index bac3035e2382df2d79e592b02395753eee08fa4b..187047de5530ccec1e9804f8039839246ab248f3 100644
--- a/src/main/java/net/minecraft/world/entity/animal/EntityCat.java
+++ b/src/main/java/net/minecraft/world/entity/animal/EntityCat.java
@@ -122,6 +122,11 @@ public class EntityCat extends EntityTameableAnimal {
@@ -95,7 +95,7 @@ index 5c744f1eac19e144c39a2c146d312f0547d6e589..ab54e809f735cea7d84366d2bc205351
@Override
diff --git a/src/main/java/net/minecraft/world/entity/animal/EntityCow.java b/src/main/java/net/minecraft/world/entity/animal/EntityCow.java
-index cad256514c7df92847522c8d7ddf45ebe02658c4..93589a2b86e6663d93f6b536b853996c08db549a 100644
+index b2d3fc3151a952ac783101443772736a206a6a3b..7ed55ebe1bb768351a5cb4cdc7d4d3b0816d53b1 100644
--- a/src/main/java/net/minecraft/world/entity/animal/EntityCow.java
+++ b/src/main/java/net/minecraft/world/entity/animal/EntityCow.java
@@ -54,6 +54,11 @@ public class EntityCow extends EntityAnimal {
@@ -111,10 +111,10 @@ index cad256514c7df92847522c8d7ddf45ebe02658c4..93589a2b86e6663d93f6b536b853996c
@Override
diff --git a/src/main/java/net/minecraft/world/entity/animal/EntityFox.java b/src/main/java/net/minecraft/world/entity/animal/EntityFox.java
-index 0c1151b598aa681e63ddaac29e4a589f917fd03b..7bf546a1b2a80179962ed08a35d86f0a28eda3c2 100644
+index 7b1a6d846f25d8bc659a541fce59df79347ba9bc..70369d03985250fa5eaf398fa98d35a2c2a06ff1 100644
--- a/src/main/java/net/minecraft/world/entity/animal/EntityFox.java
+++ b/src/main/java/net/minecraft/world/entity/animal/EntityFox.java
-@@ -159,6 +159,11 @@ public class EntityFox extends EntityAnimal {
+@@ -157,6 +157,11 @@ public class EntityFox extends EntityAnimal {
super.onDismount(entityhuman);
setCanPickupLoot(true);
}
@@ -138,7 +138,7 @@ index 0c1151b598aa681e63ddaac29e4a589f917fd03b..7bf546a1b2a80179962ed08a35d86f0a
+ // Purpur end
this.animal.resetLove();
this.partner.resetLove();
- entityfox.setAgeRaw(-24000);
+ worldserver.addAllEntities(entityfox, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.BREEDING); // CraftBukkit - added SpawnReason
diff --git a/src/main/java/net/minecraft/world/entity/animal/EntityMushroomCow.java b/src/main/java/net/minecraft/world/entity/animal/EntityMushroomCow.java
index 815e907e8db721f2a6f0f831b69c44a9573b5c9b..ab4a8ee6e1912f230cbf3353eb42c3bc8a9db58e 100644
--- a/src/main/java/net/minecraft/world/entity/animal/EntityMushroomCow.java
@@ -188,7 +188,7 @@ index 0d912399e1975d9c0d5525f5b89049f40e7efcc0..e6952c0a8d90eb4b133c517d97299f2c
@Override
diff --git a/src/main/java/net/minecraft/world/entity/animal/EntityParrot.java b/src/main/java/net/minecraft/world/entity/animal/EntityParrot.java
-index 5c26eea7e3e93dc7bcd8b86519e84db58b70cecb..5463e1779422ff19499727a000fdfbbfc38809a8 100644
+index 9f705b75a14ba456808485ce4ddef9550aac3fe9..7346921a24bdd57aa3814386bc372b082b23b4bc 100644
--- a/src/main/java/net/minecraft/world/entity/animal/EntityParrot.java
+++ b/src/main/java/net/minecraft/world/entity/animal/EntityParrot.java
@@ -171,6 +171,11 @@ public class EntityParrot extends EntityPerchable implements EntityBird {
@@ -220,7 +220,7 @@ index cef69f99d7bc9b6605b9654c50f43a1ebc1a8509..5aa8806063186bec36b38adc51e2ea82
@Override
diff --git a/src/main/java/net/minecraft/world/entity/animal/EntityPolarBear.java b/src/main/java/net/minecraft/world/entity/animal/EntityPolarBear.java
-index e686491a469573a3fc466c46be1b7430ff02ba53..2306abb72ea76a52fd6f27648c4815ad99f8f005 100644
+index b46315700b8857318b03b83097fcf829047f8ca4..c9c7c9de638079393bbea86f8069023dcbcbca83 100644
--- a/src/main/java/net/minecraft/world/entity/animal/EntityPolarBear.java
+++ b/src/main/java/net/minecraft/world/entity/animal/EntityPolarBear.java
@@ -116,6 +116,11 @@ public class EntityPolarBear extends EntityAnimal implements IEntityAngerable {
@@ -236,10 +236,10 @@ index e686491a469573a3fc466c46be1b7430ff02ba53..2306abb72ea76a52fd6f27648c4815ad
@Override
diff --git a/src/main/java/net/minecraft/world/entity/animal/EntityRabbit.java b/src/main/java/net/minecraft/world/entity/animal/EntityRabbit.java
-index fff6bcff9d44c7d49cd2d0c334ea702531c74ea1..0b706404895b69fbca79502a327ec20b47ed99f0 100644
+index 4660f37bc89418e0c3767305d390a53f5c0d3c55..465701232567e4058f9dfc776560ccde33fee66c 100644
--- a/src/main/java/net/minecraft/world/entity/animal/EntityRabbit.java
+++ b/src/main/java/net/minecraft/world/entity/animal/EntityRabbit.java
-@@ -86,6 +86,11 @@ public class EntityRabbit extends EntityAnimal {
+@@ -85,6 +85,11 @@ public class EntityRabbit extends EntityAnimal {
public boolean isRidableInWater() {
return world.purpurConfig.rabbitRidableInWater;
}
@@ -380,7 +380,7 @@ index d57e7c02268e5d8a00b0b5897fa03dcee10cd2e0..c776f18722d1aa73f53da66ef6b37564
public static AttributeProvider.Builder eL() {
diff --git a/src/main/java/net/minecraft/world/entity/animal/horse/EntityLlama.java b/src/main/java/net/minecraft/world/entity/animal/horse/EntityLlama.java
-index d1bd7b9a6a8cfb6b609db4229b2f42a40b8b484f..b3d51abc9bad9cad6fdc5dbdc2bf09d43a565f98 100644
+index d25177f9500a084e0f18a20b1eb1c4ac170048ec..2710c246a147f117d2d90014c37988888010dc36 100644
--- a/src/main/java/net/minecraft/world/entity/animal/horse/EntityLlama.java
+++ b/src/main/java/net/minecraft/world/entity/animal/horse/EntityLlama.java
@@ -108,6 +108,11 @@ public class EntityLlama extends EntityHorseChestedAbstract implements IRangedEn
@@ -412,7 +412,7 @@ index 14dda6743ed9e6f4880bc560f7ba8892d8e84afe..cba66a08feceeeaf7c123da595fc7b12
public static boolean c(EntityTypes entitytypes, GeneratorAccess generatoraccess, EnumMobSpawn enummobspawn, BlockPosition blockposition, Random random) {
diff --git a/src/main/java/net/minecraft/world/entity/monster/hoglin/EntityHoglin.java b/src/main/java/net/minecraft/world/entity/monster/hoglin/EntityHoglin.java
-index 64253428ef66145d07f74f8d0e5bdeb5aa5fe02b..828d01abe8202a246ce07c1c652a17cbc829d904 100644
+index c2e32121f693a6207e6239c26a1fd6e60d0ce434..8c2815c8b11c8db8e6c1d0caf71188322e52094d 100644
--- a/src/main/java/net/minecraft/world/entity/monster/hoglin/EntityHoglin.java
+++ b/src/main/java/net/minecraft/world/entity/monster/hoglin/EntityHoglin.java
@@ -71,6 +71,11 @@ public class EntityHoglin extends EntityAnimal implements IMonster, IOglin {
@@ -428,10 +428,10 @@ index 64253428ef66145d07f74f8d0e5bdeb5aa5fe02b..828d01abe8202a246ce07c1c652a17cb
@Override
diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-index def36f72153b25094693b82e962366cc19ae4d13..1ac6394340aaf61c899b758351cfb667f6d9bc09 100644
+index b92715b115332e8197d5a02a2f308a1ab0f447b6..bd37234624a720c1077aabf0123de61a0d4e05cb 100644
--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-@@ -480,10 +480,12 @@ public class PurpurWorldConfig {
+@@ -492,10 +492,12 @@ public class PurpurWorldConfig {
public boolean beeRidable = false;
public boolean beeRidableInWater = false;
public double beeMaxY = 256D;
@@ -444,7 +444,7 @@ index def36f72153b25094693b82e962366cc19ae4d13..1ac6394340aaf61c899b758351cfb667
}
public boolean blazeRidable = false;
-@@ -500,12 +502,14 @@ public class PurpurWorldConfig {
+@@ -512,12 +514,14 @@ public class PurpurWorldConfig {
public int catSpawnDelay = 1200;
public int catSpawnSwampHutScanRange = 16;
public int catSpawnVillageScanRange = 48;
@@ -459,7 +459,7 @@ index def36f72153b25094693b82e962366cc19ae4d13..1ac6394340aaf61c899b758351cfb667
}
public boolean caveSpiderRidable = false;
-@@ -518,10 +522,12 @@ public class PurpurWorldConfig {
+@@ -530,10 +534,12 @@ public class PurpurWorldConfig {
public boolean chickenRidable = false;
public boolean chickenRidableInWater = false;
public boolean chickenRetaliate = false;
@@ -472,7 +472,7 @@ index def36f72153b25094693b82e962366cc19ae4d13..1ac6394340aaf61c899b758351cfb667
}
public boolean codRidable = false;
-@@ -532,10 +538,12 @@ public class PurpurWorldConfig {
+@@ -544,10 +550,12 @@ public class PurpurWorldConfig {
public boolean cowRidable = false;
public boolean cowRidableInWater = false;
public int cowFeedMushrooms = 0;
@@ -485,7 +485,7 @@ index def36f72153b25094693b82e962366cc19ae4d13..1ac6394340aaf61c899b758351cfb667
}
public boolean creeperRidable = false;
-@@ -563,8 +571,10 @@ public class PurpurWorldConfig {
+@@ -575,8 +583,10 @@ public class PurpurWorldConfig {
}
public boolean donkeyRidableInWater = false;
@@ -496,7 +496,7 @@ index def36f72153b25094693b82e962366cc19ae4d13..1ac6394340aaf61c899b758351cfb667
}
public boolean drownedRidable = false;
-@@ -622,10 +632,12 @@ public class PurpurWorldConfig {
+@@ -634,10 +644,12 @@ public class PurpurWorldConfig {
public boolean foxRidable = false;
public boolean foxRidableInWater = false;
public boolean foxTypeChangesWithTulips = false;
@@ -509,7 +509,7 @@ index def36f72153b25094693b82e962366cc19ae4d13..1ac6394340aaf61c899b758351cfb667
}
public boolean ghastRidable = false;
-@@ -670,14 +682,18 @@ public class PurpurWorldConfig {
+@@ -682,14 +694,18 @@ public class PurpurWorldConfig {
public boolean hoglinRidable = false;
public boolean hoglinRidableInWater = false;
@@ -528,7 +528,7 @@ index def36f72153b25094693b82e962366cc19ae4d13..1ac6394340aaf61c899b758351cfb667
}
public boolean huskRidable = false;
-@@ -722,9 +738,11 @@ public class PurpurWorldConfig {
+@@ -734,9 +750,11 @@ public class PurpurWorldConfig {
public boolean llamaRidable = false;
public boolean llamaRidableInWater = false;
@@ -540,7 +540,7 @@ index def36f72153b25094693b82e962366cc19ae4d13..1ac6394340aaf61c899b758351cfb667
}
public boolean llamaTraderRidable = false;
-@@ -743,28 +761,36 @@ public class PurpurWorldConfig {
+@@ -755,28 +773,36 @@ public class PurpurWorldConfig {
public boolean mooshroomRidable = false;
public boolean mooshroomRidableInWater = false;
@@ -577,7 +577,7 @@ index def36f72153b25094693b82e962366cc19ae4d13..1ac6394340aaf61c899b758351cfb667
}
public boolean parrotRidable = false;
-@@ -830,10 +856,12 @@ public class PurpurWorldConfig {
+@@ -842,10 +868,12 @@ public class PurpurWorldConfig {
public boolean pigRidable = false;
public boolean pigRidableInWater = false;
public boolean pigGiveSaddleBack = false;
@@ -590,7 +590,7 @@ index def36f72153b25094693b82e962366cc19ae4d13..1ac6394340aaf61c899b758351cfb667
}
public boolean piglinRidable = false;
-@@ -861,12 +889,14 @@ public class PurpurWorldConfig {
+@@ -873,12 +901,14 @@ public class PurpurWorldConfig {
public boolean polarBearRidableInWater = false;
public String polarBearBreedableItemString = "";
public Item polarBearBreedableItem = null;
@@ -605,7 +605,7 @@ index def36f72153b25094693b82e962366cc19ae4d13..1ac6394340aaf61c899b758351cfb667
}
public boolean pufferfishRidable = false;
-@@ -878,11 +908,13 @@ public class PurpurWorldConfig {
+@@ -890,11 +920,13 @@ public class PurpurWorldConfig {
public boolean rabbitRidableInWater = false;
public double rabbitNaturalToast = 0.0D;
public double rabbitNaturalKiller = 0.0D;
@@ -619,7 +619,7 @@ index def36f72153b25094693b82e962366cc19ae4d13..1ac6394340aaf61c899b758351cfb667
}
public boolean ravagerRidable = false;
-@@ -899,9 +931,11 @@ public class PurpurWorldConfig {
+@@ -911,9 +943,11 @@ public class PurpurWorldConfig {
public boolean sheepRidable = false;
public boolean sheepRidableInWater = false;
@@ -631,7 +631,7 @@ index def36f72153b25094693b82e962366cc19ae4d13..1ac6394340aaf61c899b758351cfb667
}
public boolean shulkerRidable = false;
-@@ -979,9 +1013,11 @@ public class PurpurWorldConfig {
+@@ -991,9 +1025,11 @@ public class PurpurWorldConfig {
public boolean striderRidable = false;
public boolean striderRidableInWater = false;
@@ -643,7 +643,7 @@ index def36f72153b25094693b82e962366cc19ae4d13..1ac6394340aaf61c899b758351cfb667
}
public boolean tropicalFishRidable = false;
-@@ -991,9 +1027,11 @@ public class PurpurWorldConfig {
+@@ -1003,9 +1039,11 @@ public class PurpurWorldConfig {
public boolean turtleRidable = false;
public boolean turtleRidableInWater = false;
@@ -655,7 +655,7 @@ index def36f72153b25094693b82e962366cc19ae4d13..1ac6394340aaf61c899b758351cfb667
}
public boolean vexRidable = false;
-@@ -1015,6 +1053,7 @@ public class PurpurWorldConfig {
+@@ -1027,6 +1065,7 @@ public class PurpurWorldConfig {
public int villagerSpawnIronGolemRadius = 0;
public int villagerSpawnIronGolemLimit = 0;
public boolean villagerCanBreed = true;
@@ -663,7 +663,7 @@ index def36f72153b25094693b82e962366cc19ae4d13..1ac6394340aaf61c899b758351cfb667
private void villagerSettings() {
villagerRidable = getBoolean("mobs.villager.ridable", villagerRidable);
villagerRidableInWater = getBoolean("mobs.villager.ridable-in-water", villagerRidableInWater);
-@@ -1026,6 +1065,7 @@ public class PurpurWorldConfig {
+@@ -1038,6 +1077,7 @@ public class PurpurWorldConfig {
villagerSpawnIronGolemRadius = getInt("mobs.villager.spawn-iron-golem.radius", villagerSpawnIronGolemRadius);
villagerSpawnIronGolemLimit = getInt("mobs.villager.spawn-iron-golem.limit", villagerSpawnIronGolemLimit);
villagerCanBreed = getBoolean("mobs.villager.can-breed", villagerCanBreed);
@@ -671,7 +671,7 @@ index def36f72153b25094693b82e962366cc19ae4d13..1ac6394340aaf61c899b758351cfb667
}
public boolean villagerTraderRidable = false;
-@@ -1086,9 +1126,11 @@ public class PurpurWorldConfig {
+@@ -1098,9 +1138,11 @@ public class PurpurWorldConfig {
public boolean wolfRidable = false;
public boolean wolfRidableInWater = false;
diff --git a/patches/server/0127-Apply-display-names-from-item-forms-of-entities-to-e.patch b/patches/server/0126-Apply-display-names-from-item-forms-of-entities-to-e.patch
similarity index 96%
rename from patches/server/0127-Apply-display-names-from-item-forms-of-entities-to-e.patch
rename to patches/server/0126-Apply-display-names-from-item-forms-of-entities-to-e.patch
index 59b5a91622..52b56cbf0c 100644
--- a/patches/server/0127-Apply-display-names-from-item-forms-of-entities-to-e.patch
+++ b/patches/server/0126-Apply-display-names-from-item-forms-of-entities-to-e.patch
@@ -142,7 +142,7 @@ index bbd3bb2d12e500d15485598783d39b0cb63a6d83..8e4c3304779cfccf7d45d4843f9c15bf
if (((EntityHanging) object).survives()) {
diff --git a/src/main/java/net/minecraft/world/item/ItemStack.java b/src/main/java/net/minecraft/world/item/ItemStack.java
-index 81e2ccfa4f6cf6a4ad9236cf0ce94df8dc3ec5b6..132972755ac74838f3386e0fac5033380b71fce5 100644
+index 2aa761656ce75f78732c502fd4ce65034b6c2919..a4c41caae425e054db3f40a9abc41f45ccd20730 100644
--- a/src/main/java/net/minecraft/world/item/ItemStack.java
+++ b/src/main/java/net/minecraft/world/item/ItemStack.java
@@ -788,6 +788,7 @@ public final class ItemStack {
@@ -154,7 +154,7 @@ index 81e2ccfa4f6cf6a4ad9236cf0ce94df8dc3ec5b6..132972755ac74838f3386e0fac503338
NBTTagCompound nbttagcompound = this.a("display");
diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-index 1ac6394340aaf61c899b758351cfb667f6d9bc09..0c159098cff5a67bc2ebc9374138843172316f01 100644
+index bd37234624a720c1077aabf0123de61a0d4e05cb..b650293ff3315760e29307113e29fb2731af472b 100644
--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
@@ -83,8 +83,10 @@ public class PurpurWorldConfig {
@@ -168,19 +168,19 @@ index 1ac6394340aaf61c899b758351cfb667f6d9bc09..0c159098cff5a67bc2ebc93741388431
armorstandStepHeight = (float) getDouble("gameplay-mechanics.armorstand.step-height", armorstandStepHeight);
}
-@@ -251,6 +253,7 @@ public class PurpurWorldConfig {
+@@ -261,6 +263,7 @@ public class PurpurWorldConfig {
public boolean entitiesCanUsePortals = true;
public boolean milkCuresBadOmen = true;
public boolean persistentTileEntityDisplayNames = false;
+ public boolean persistentDroppableEntityDisplayNames = false;
public double tridentLoyaltyVoidReturnHeight = 0.0D;
public double voidDamageHeight = -64.0D;
- public int raidCooldownSeconds = 0;
-@@ -263,6 +266,7 @@ public class PurpurWorldConfig {
+ public double voidDamageDealt = 4.0D;
+@@ -274,6 +277,7 @@ public class PurpurWorldConfig {
entitiesCanUsePortals = getBoolean("gameplay-mechanics.entities-can-use-portals", entitiesCanUsePortals);
milkCuresBadOmen = getBoolean("gameplay-mechanics.milk-cures-bad-omen", milkCuresBadOmen);
persistentTileEntityDisplayNames = getBoolean("gameplay-mechanics.persistent-tileentity-display-names-and-lore", persistentTileEntityDisplayNames);
+ persistentDroppableEntityDisplayNames = getBoolean("gameplay-mechanics.persistent-droppable-entity-display-names", persistentDroppableEntityDisplayNames);
tridentLoyaltyVoidReturnHeight = getDouble("gameplay-mechanics.trident-loyalty-void-return-height", tridentLoyaltyVoidReturnHeight);
voidDamageHeight = getDouble("gameplay-mechanics.void-damage-height", voidDamageHeight);
- raidCooldownSeconds = getInt("gameplay-mechanics.raid-cooldown-seconds", raidCooldownSeconds);
+ voidDamageDealt = getDouble("gameplay-mechanics.void-damage-dealt", voidDamageDealt);
diff --git a/patches/server/0128-Set-name-visible-when-using-a-Name-Tag-on-an-Armor-S.patch b/patches/server/0127-Set-name-visible-when-using-a-Name-Tag-on-an-Armor-S.patch
similarity index 96%
rename from patches/server/0128-Set-name-visible-when-using-a-Name-Tag-on-an-Armor-S.patch
rename to patches/server/0127-Set-name-visible-when-using-a-Name-Tag-on-an-Armor-S.patch
index 4745abc916..facfc49577 100644
--- a/patches/server/0128-Set-name-visible-when-using-a-Name-Tag-on-an-Armor-S.patch
+++ b/patches/server/0127-Set-name-visible-when-using-a-Name-Tag-on-an-Armor-S.patch
@@ -29,7 +29,7 @@ index b9b2b27e534ba87a1aae3c521f393a066a18a199..4f4e9ebb9af4970fe920a540d40dbc56
((EntityInsentient) newEntityLiving).setPersistent();
}
diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-index 0c159098cff5a67bc2ebc9374138843172316f01..4cd8acf6ef170193f38c3926e467aa2e9c7acf63 100644
+index b650293ff3315760e29307113e29fb2731af472b..dc1418f8f324eae24af3e993c6c720ff73702c92 100644
--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
@@ -84,9 +84,11 @@ public class PurpurWorldConfig {
diff --git a/patches/server/0129-Add-twisting-and-weeping-vines-growth-rates.patch b/patches/server/0128-Add-twisting-and-weeping-vines-growth-rates.patch
similarity index 97%
rename from patches/server/0129-Add-twisting-and-weeping-vines-growth-rates.patch
rename to patches/server/0128-Add-twisting-and-weeping-vines-growth-rates.patch
index 34a7c54966..def89357ce 100644
--- a/patches/server/0129-Add-twisting-and-weeping-vines-growth-rates.patch
+++ b/patches/server/0128-Add-twisting-and-weeping-vines-growth-rates.patch
@@ -91,10 +91,10 @@ index 2552631084926c2fad40b3f21ae479c0e1cfdb77..198bd8857571872ed3f7437529c330dc
+ // Purpur end
}
diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-index 4cd8acf6ef170193f38c3926e467aa2e9c7acf63..495c8fc0e632dfc4f73d2929b1da9adea18345a5 100644
+index dc1418f8f324eae24af3e993c6c720ff73702c92..17bbe2ceea016bcb00dc5542bea47e083e723ea5 100644
--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-@@ -465,6 +465,16 @@ public class PurpurWorldConfig {
+@@ -477,6 +477,16 @@ public class PurpurWorldConfig {
turtleEggsBreakFromMinecarts = getBoolean("blocks.turtle_egg.break-from-minecarts", turtleEggsBreakFromMinecarts);
}
diff --git a/patches/server/0130-Kelp-weeping-and-twisting-vines-configurable-max-gro.patch b/patches/server/0129-Kelp-weeping-and-twisting-vines-configurable-max-gro.patch
similarity index 97%
rename from patches/server/0130-Kelp-weeping-and-twisting-vines-configurable-max-gro.patch
rename to patches/server/0129-Kelp-weeping-and-twisting-vines-configurable-max-gro.patch
index cf86764322..bdd2fc3d55 100644
--- a/patches/server/0130-Kelp-weeping-and-twisting-vines-configurable-max-gro.patch
+++ b/patches/server/0129-Kelp-weeping-and-twisting-vines-configurable-max-gro.patch
@@ -89,10 +89,10 @@ index 198bd8857571872ed3f7437529c330dceeb825db..a71f97e87ee7210f3246e542dd768403
// Purpur end
}
diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-index 495c8fc0e632dfc4f73d2929b1da9adea18345a5..15ea799b677b8be82f38ce4ab152878fd577d174 100644
+index 17bbe2ceea016bcb00dc5542bea47e083e723ea5..221b6d3c98afe1c72481a922ac7eeff9801d8c2f 100644
--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-@@ -412,6 +412,11 @@ public class PurpurWorldConfig {
+@@ -424,6 +424,11 @@ public class PurpurWorldConfig {
furnaceInfiniteFuel = getBoolean("blocks.furnace.infinite-fuel", furnaceInfiniteFuel);
}
@@ -104,7 +104,7 @@ index 495c8fc0e632dfc4f73d2929b1da9adea18345a5..15ea799b677b8be82f38ce4ab152878f
public boolean lavaInfinite = false;
public int lavaInfiniteRequiredSources = 2;
public int lavaSpeedNether = 10;
-@@ -466,13 +471,17 @@ public class PurpurWorldConfig {
+@@ -478,13 +483,17 @@ public class PurpurWorldConfig {
}
public double twistingVinesGrowthModifier = 0.10D;
diff --git a/patches/server/0131-Add-config-for-allowing-Endermen-to-despawn-even-whi.patch b/patches/server/0130-Add-config-for-allowing-Endermen-to-despawn-even-whi.patch
similarity index 89%
rename from patches/server/0131-Add-config-for-allowing-Endermen-to-despawn-even-whi.patch
rename to patches/server/0130-Add-config-for-allowing-Endermen-to-despawn-even-whi.patch
index 4bf8428019..5349d657e9 100644
--- a/patches/server/0131-Add-config-for-allowing-Endermen-to-despawn-even-whi.patch
+++ b/patches/server/0130-Add-config-for-allowing-Endermen-to-despawn-even-whi.patch
@@ -8,7 +8,7 @@ This should help to reduce the amount of dirt, gravel, grass, and etc.
that Endermen like to randomly place all over the world.
diff --git a/src/main/java/net/minecraft/world/entity/monster/EntityEnderman.java b/src/main/java/net/minecraft/world/entity/monster/EntityEnderman.java
-index 03fa2cfc1d5bc27e03e9979b3f33d88362c19066..18b3f8d1fadd1424327261d92b49977a35c4948c 100644
+index 32ed22dbaaed536dd3df0fb59e3c19431ee42540..c04ff259f650b0e5a361c4f17b8b5ff9ecb8ab71 100644
--- a/src/main/java/net/minecraft/world/entity/monster/EntityEnderman.java
+++ b/src/main/java/net/minecraft/world/entity/monster/EntityEnderman.java
@@ -435,7 +435,7 @@ public class EntityEnderman extends EntityMonster implements IEntityAngerable {
@@ -21,10 +21,10 @@ index 03fa2cfc1d5bc27e03e9979b3f33d88362c19066..18b3f8d1fadd1424327261d92b49977a
static class PathfinderGoalEndermanPickupBlock extends PathfinderGoal {
diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-index 15ea799b677b8be82f38ce4ab152878fd577d174..fb3d98999a926763f7319b24c35cdf0116ff0682 100644
+index 221b6d3c98afe1c72481a922ac7eeff9801d8c2f..3b9898ee7ae0fb826cfc3102d3b84bc5323d163d 100644
--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-@@ -634,10 +634,12 @@ public class PurpurWorldConfig {
+@@ -646,10 +646,12 @@ public class PurpurWorldConfig {
public boolean endermanRidable = false;
public boolean endermanRidableInWater = false;
public boolean endermanAllowGriefing = true;
diff --git a/patches/server/0132-Add-critical-hit-check-to-EntityDamagedByEntityEvent.patch b/patches/server/0131-Add-critical-hit-check-to-EntityDamagedByEntityEvent.patch
similarity index 85%
rename from patches/server/0132-Add-critical-hit-check-to-EntityDamagedByEntityEvent.patch
rename to patches/server/0131-Add-critical-hit-check-to-EntityDamagedByEntityEvent.patch
index fe8789395e..f295b10776 100644
--- a/patches/server/0132-Add-critical-hit-check-to-EntityDamagedByEntityEvent.patch
+++ b/patches/server/0131-Add-critical-hit-check-to-EntityDamagedByEntityEvent.patch
@@ -5,10 +5,10 @@ Subject: [PATCH] Add critical hit check to EntityDamagedByEntityEvent
diff --git a/src/main/java/net/minecraft/world/entity/player/EntityHuman.java b/src/main/java/net/minecraft/world/entity/player/EntityHuman.java
-index fedfb18e71300807a83e2ed2729fe192a8f9aa33..af10d5aea7909ee9f38982264233f0a45c153003 100644
+index a70c557de56c5ba04cb520108cdb037eb9cad8a9..78442fe87ceaf65b302536c893610aa0269b6dee 100644
--- a/src/main/java/net/minecraft/world/entity/player/EntityHuman.java
+++ b/src/main/java/net/minecraft/world/entity/player/EntityHuman.java
-@@ -171,6 +171,7 @@ public abstract class EntityHuman extends EntityLiving {
+@@ -170,6 +170,7 @@ public abstract class EntityHuman extends EntityLiving {
// Paper start
public boolean affectsSpawning = true;
// Paper end
@@ -16,7 +16,7 @@ index fedfb18e71300807a83e2ed2729fe192a8f9aa33..af10d5aea7909ee9f38982264233f0a4
// CraftBukkit start
public boolean fauxSleeping;
-@@ -1178,6 +1179,7 @@ public abstract class EntityHuman extends EntityLiving {
+@@ -1177,6 +1178,7 @@ public abstract class EntityHuman extends EntityLiving {
flag2 = flag2 && !world.paperConfig.disablePlayerCrits; // Paper
flag2 = flag2 && !this.isSprinting();
if (flag2) {
@@ -24,7 +24,7 @@ index fedfb18e71300807a83e2ed2729fe192a8f9aa33..af10d5aea7909ee9f38982264233f0a4
f *= 1.5F;
}
-@@ -1214,6 +1216,7 @@ public abstract class EntityHuman extends EntityLiving {
+@@ -1213,6 +1215,7 @@ public abstract class EntityHuman extends EntityLiving {
Vec3D vec3d = entity.getMot();
boolean flag5 = entity.damageEntity(DamageSource.playerAttack(this), f);
@@ -33,10 +33,10 @@ index fedfb18e71300807a83e2ed2729fe192a8f9aa33..af10d5aea7909ee9f38982264233f0a4
if (flag5) {
if (i > 0) {
diff --git a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java
-index c44a15cd7b2d67c77eac7a1d2a7e9569f9dce48c..ad325f58198fcae7b9cae55e4c9675c8498838d1 100644
+index 81ea6ffb6be8a7aed281c6538f0535bbaf00b068..064256873da7660815aeb416a6cfe55c24e6838d 100644
--- a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java
+++ b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java
-@@ -1090,7 +1090,7 @@ public class CraftEventFactory {
+@@ -1094,7 +1094,7 @@ public class CraftEventFactory {
private static EntityDamageEvent callEntityDamageEvent(Entity damager, Entity damagee, DamageCause cause, Map modifiers, Map> modifierFunctions, boolean cancelled) {
EntityDamageEvent event;
if (damager != null) {
diff --git a/patches/server/0133-Add-configurable-snowball-damage.patch b/patches/server/0132-Add-configurable-snowball-damage.patch
similarity index 92%
rename from patches/server/0133-Add-configurable-snowball-damage.patch
rename to patches/server/0132-Add-configurable-snowball-damage.patch
index 3dd5d8cbcb..f5b27b088f 100644
--- a/patches/server/0133-Add-configurable-snowball-damage.patch
+++ b/patches/server/0132-Add-configurable-snowball-damage.patch
@@ -18,10 +18,10 @@ index 0d3b9c81e47eef645335e49a1d6d88db7338aa4b..6bfd3f57e6c04ed426870d6dbf068bf3
entity.damageEntity(DamageSource.projectile(this, this.getShooter()), (float) i);
}
diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-index fb3d98999a926763f7319b24c35cdf0116ff0682..c9ba9beabf41905f892e8f657d40de9bc78ca337 100644
+index 3b9898ee7ae0fb826cfc3102d3b84bc5323d163d..b6a3d73dc0866d98b00f52d65a39646ab001a1f2 100644
--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-@@ -248,6 +248,11 @@ public class PurpurWorldConfig {
+@@ -258,6 +258,11 @@ public class PurpurWorldConfig {
witherSkullDespawnRate = getInt("gameplay-mechanics.projectile-despawn-rates.wither_skull", witherSkullDespawnRate);
}
diff --git a/patches/server/0134-Zombie-break-door-minimum-difficulty-option.patch b/patches/server/0133-Zombie-break-door-minimum-difficulty-option.patch
similarity index 95%
rename from patches/server/0134-Zombie-break-door-minimum-difficulty-option.patch
rename to patches/server/0133-Zombie-break-door-minimum-difficulty-option.patch
index a3f4740589..ced0497c3f 100644
--- a/patches/server/0134-Zombie-break-door-minimum-difficulty-option.patch
+++ b/patches/server/0133-Zombie-break-door-minimum-difficulty-option.patch
@@ -50,7 +50,7 @@ index 10ee8a0a717354f50b29e7ebeab0ee2aa7bf42f7..d785066e2a52699c18315f7244d80db6
+ // Purpur end
}
diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-index c9ba9beabf41905f892e8f657d40de9bc78ca337..af4725f4d224bbb8c1fb1fac78c217343e9717a8 100644
+index b6a3d73dc0866d98b00f52d65a39646ab001a1f2..1ea011a2fbf6b6d2b7f9ff59e86303d17d130831 100644
--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
@@ -1,6 +1,7 @@
@@ -61,7 +61,7 @@ index c9ba9beabf41905f892e8f657d40de9bc78ca337..af4725f4d224bbb8c1fb1fac78c21734
import net.minecraft.world.level.Explosion;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.Blocks;
-@@ -1178,6 +1179,7 @@ public class PurpurWorldConfig {
+@@ -1190,6 +1191,7 @@ public class PurpurWorldConfig {
public double zombieJockeyChance = 0.05D;
public boolean zombieJockeyTryExistingChickens = true;
public boolean zombieAggressiveTowardsVillagerWhenLagging = true;
@@ -69,7 +69,7 @@ index c9ba9beabf41905f892e8f657d40de9bc78ca337..af4725f4d224bbb8c1fb1fac78c21734
private void zombieSettings() {
zombieRidable = getBoolean("mobs.zombie.ridable", zombieRidable);
zombieRidableInWater = getBoolean("mobs.zombie.ridable-in-water", zombieRidableInWater);
-@@ -1185,6 +1187,11 @@ public class PurpurWorldConfig {
+@@ -1197,6 +1199,11 @@ public class PurpurWorldConfig {
zombieJockeyChance = getDouble("mobs.zombie.jockey.chance", zombieJockeyChance);
zombieJockeyTryExistingChickens = getBoolean("mobs.zombie.jockey.try-existing-chickens", zombieJockeyTryExistingChickens);
zombieAggressiveTowardsVillagerWhenLagging = getBoolean("mobs.zombie.aggressive-towards-villager-when-lagging", zombieAggressiveTowardsVillagerWhenLagging);
diff --git a/patches/server/0135-Add-demo-command.patch b/patches/server/0134-Add-demo-command.patch
similarity index 96%
rename from patches/server/0135-Add-demo-command.patch
rename to patches/server/0134-Add-demo-command.patch
index 9184f8f927..be372b730c 100644
--- a/patches/server/0135-Add-demo-command.patch
+++ b/patches/server/0134-Add-demo-command.patch
@@ -5,7 +5,7 @@ Subject: [PATCH] Add demo command
diff --git a/src/main/java/net/minecraft/commands/CommandDispatcher.java b/src/main/java/net/minecraft/commands/CommandDispatcher.java
-index cf3776591446ad7b3d1ee1285c5aeffcb5e9495e..0982b14a4b39c40a68ee900d506b4e44f840299d 100644
+index 94ed3811cbcc6f60a2c8bb033920f9c1ae2e91d6..2f5e8ed345ace0d9abb7edebe1fd47e562b1d272 100644
--- a/src/main/java/net/minecraft/commands/CommandDispatcher.java
+++ b/src/main/java/net/minecraft/commands/CommandDispatcher.java
@@ -191,6 +191,7 @@ public class CommandDispatcher {
@@ -51,7 +51,7 @@ index b903a19e0fcf008cb8358be2d5050c89d2addf28..69d6d3fb4333531ea63acf5272ffa52e
}
diff --git a/src/main/java/net/pl3x/purpur/command/DemoCommand.java b/src/main/java/net/pl3x/purpur/command/DemoCommand.java
new file mode 100644
-index 0000000000000000000000000000000000000000..d621dab3c40f5d093474444eccecd8e7c9e301a1
+index 0000000000000000000000000000000000000000..7ea2e07c95c26528e118541ca2bba4d6117ab28f
--- /dev/null
+++ b/src/main/java/net/pl3x/purpur/command/DemoCommand.java
@@ -0,0 +1,39 @@
@@ -88,7 +88,7 @@ index 0000000000000000000000000000000000000000..d621dab3c40f5d093474444eccecd8e7
+ for (EntityPlayer player : targets) {
+ PacketPlayOutGameStateChange packet = new PacketPlayOutGameStateChange(PacketPlayOutGameStateChange.demo(), 0);
+ player.playerConnection.sendPacket(packet);
-+ String output = String.format(PurpurConfig.demoCommandOutput, player.getProfile().getName(), player.ping);
++ String output = String.format(PurpurConfig.demoCommandOutput, player.getProfile().getName());
+ sender.sendMessage(CraftChatMessage.fromStringOrNull(output), false);
+ }
+ return targets.size();
diff --git a/patches/server/0136-Left-handed-API.patch b/patches/server/0135-Left-handed-API.patch
similarity index 100%
rename from patches/server/0136-Left-handed-API.patch
rename to patches/server/0135-Left-handed-API.patch
diff --git a/patches/server/0137-Origami-Fix-ProtocolLib-issues-on-Java-15.patch b/patches/server/0136-Origami-Fix-ProtocolLib-issues-on-Java-15.patch
similarity index 100%
rename from patches/server/0137-Origami-Fix-ProtocolLib-issues-on-Java-15.patch
rename to patches/server/0136-Origami-Fix-ProtocolLib-issues-on-Java-15.patch
diff --git a/patches/server/0138-Changeable-Mob-Left-Handed-Chance.patch b/patches/server/0137-Changeable-Mob-Left-Handed-Chance.patch
similarity index 88%
rename from patches/server/0138-Changeable-Mob-Left-Handed-Chance.patch
rename to patches/server/0137-Changeable-Mob-Left-Handed-Chance.patch
index 8955091c65..8617c890a2 100644
--- a/patches/server/0138-Changeable-Mob-Left-Handed-Chance.patch
+++ b/patches/server/0137-Changeable-Mob-Left-Handed-Chance.patch
@@ -5,10 +5,10 @@ Subject: [PATCH] Changeable Mob Left Handed Chance
diff --git a/src/main/java/net/minecraft/world/entity/EntityInsentient.java b/src/main/java/net/minecraft/world/entity/EntityInsentient.java
-index df33b46ff1267f0f2692a8956438f3bd1e2a3086..a6ea96683b0f4d35015dff6168f3bf458346fb6f 100644
+index a5e3809d60a78d4638c81a2279ce15e6a66fd336..0eae61c48e780225cd253e91d247d8814950afb5 100644
--- a/src/main/java/net/minecraft/world/entity/EntityInsentient.java
+++ b/src/main/java/net/minecraft/world/entity/EntityInsentient.java
-@@ -1216,7 +1216,7 @@ public abstract class EntityInsentient extends EntityLiving {
+@@ -1214,7 +1214,7 @@ public abstract class EntityInsentient extends EntityLiving {
@Nullable
public GroupDataEntity prepare(WorldAccess worldaccess, DifficultyDamageScaler difficultydamagescaler, EnumMobSpawn enummobspawn, @Nullable GroupDataEntity groupdataentity, @Nullable NBTTagCompound nbttagcompound) {
this.getAttributeInstance(GenericAttributes.FOLLOW_RANGE).addModifier(new AttributeModifier("Random spawn bonus", this.random.nextGaussian() * 0.05D, AttributeModifier.Operation.MULTIPLY_BASE));
@@ -18,7 +18,7 @@ index df33b46ff1267f0f2692a8956438f3bd1e2a3086..a6ea96683b0f4d35015dff6168f3bf45
} else {
this.setLeftHanded(false);
diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-index af4725f4d224bbb8c1fb1fac78c217343e9717a8..0baa0b3c33d91f79030d639091628224bb27bdc6 100644
+index 1ea011a2fbf6b6d2b7f9ff59e86303d17d130831..5e3b23d50b6e8494066c71bdf7c14edc4a4a3716 100644
--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
@@ -163,8 +163,10 @@ public class PurpurWorldConfig {
diff --git a/patches/server/0139-Add-boat-fall-damage-config.patch b/patches/server/0138-Add-boat-fall-damage-config.patch
similarity index 89%
rename from patches/server/0139-Add-boat-fall-damage-config.patch
rename to patches/server/0138-Add-boat-fall-damage-config.patch
index e4a43e2169..319d4ac9b2 100644
--- a/patches/server/0139-Add-boat-fall-damage-config.patch
+++ b/patches/server/0138-Add-boat-fall-damage-config.patch
@@ -5,10 +5,10 @@ Subject: [PATCH] Add boat fall damage config
diff --git a/src/main/java/net/minecraft/server/level/EntityPlayer.java b/src/main/java/net/minecraft/server/level/EntityPlayer.java
-index 38254784de3165e8546e1fcd4f780741abb78558..8010b0c68b99c2e8986d01a4635e1a37f4313dbe 100644
+index a2fc2924191590c6273f0393f39516d686573296..5a119537aca2f47c60b24a7b394a99051aec87b8 100644
--- a/src/main/java/net/minecraft/server/level/EntityPlayer.java
+++ b/src/main/java/net/minecraft/server/level/EntityPlayer.java
-@@ -1141,7 +1141,16 @@ public class EntityPlayer extends EntityHuman implements ICrafting {
+@@ -1139,7 +1139,16 @@ public class EntityPlayer extends EntityHuman implements ICrafting {
if (this.isInvulnerable(damagesource)) {
return false;
} else {
@@ -27,10 +27,10 @@ index 38254784de3165e8546e1fcd4f780741abb78558..8010b0c68b99c2e8986d01a4635e1a37
if (!flag && isSpawnInvulnerable() && damagesource != DamageSource.OUT_OF_WORLD) { // Purpur
diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-index 0baa0b3c33d91f79030d639091628224bb27bdc6..d0aa12148e5abe3b2df3b4341b11b55feb73535e 100644
+index 5e3b23d50b6e8494066c71bdf7c14edc4a4a3716..944c1bbcb868e2e24f26db04b588f6f0c13164e5 100644
--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-@@ -258,6 +258,7 @@ public class PurpurWorldConfig {
+@@ -268,6 +268,7 @@ public class PurpurWorldConfig {
public boolean useBetterMending = false;
public boolean boatEjectPlayersOnLand = false;
@@ -38,7 +38,7 @@ index 0baa0b3c33d91f79030d639091628224bb27bdc6..d0aa12148e5abe3b2df3b4341b11b55f
public boolean disableDropsOnCrammingDeath = false;
public boolean entitiesPickUpLootBypassMobGriefing = false;
public boolean entitiesCanUsePortals = true;
-@@ -271,6 +272,7 @@ public class PurpurWorldConfig {
+@@ -282,6 +283,7 @@ public class PurpurWorldConfig {
private void miscGameplayMechanicsSettings() {
useBetterMending = getBoolean("gameplay-mechanics.use-better-mending", useBetterMending);
boatEjectPlayersOnLand = getBoolean("gameplay-mechanics.boat.eject-players-on-land", boatEjectPlayersOnLand);
diff --git a/patches/server/0140-Config-migration-disable-saving-projectiles-to-disk-.patch b/patches/server/0139-Config-migration-disable-saving-projectiles-to-disk-.patch
similarity index 97%
rename from patches/server/0140-Config-migration-disable-saving-projectiles-to-disk-.patch
rename to patches/server/0139-Config-migration-disable-saving-projectiles-to-disk-.patch
index fa155d874a..112f4b895d 100644
--- a/patches/server/0140-Config-migration-disable-saving-projectiles-to-disk-.patch
+++ b/patches/server/0139-Config-migration-disable-saving-projectiles-to-disk-.patch
@@ -36,7 +36,7 @@ index 69d6d3fb4333531ea63acf5272ffa52ed296346f..457a20aee6f7aa25be052bec202bbcb8
public static String afkBroadcastBack = "§e§o%s is no longer AFK";
public static String afkTabListPrefix = "[AFK] ";
diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-index d0aa12148e5abe3b2df3b4341b11b55feb73535e..81cd441842e63c0465bd64d9f9009852fed1296a 100644
+index 944c1bbcb868e2e24f26db04b588f6f0c13164e5..c2044a89fd1547092fd3d6be671570fcf2a60f09 100644
--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
@@ -1,5 +1,6 @@
diff --git a/patches/server/0141-Snow-Golem-rate-of-fire-config.patch b/patches/server/0140-Snow-Golem-rate-of-fire-config.patch
similarity index 93%
rename from patches/server/0141-Snow-Golem-rate-of-fire-config.patch
rename to patches/server/0140-Snow-Golem-rate-of-fire-config.patch
index ce3317645e..b1f61e1d32 100644
--- a/patches/server/0141-Snow-Golem-rate-of-fire-config.patch
+++ b/patches/server/0140-Snow-Golem-rate-of-fire-config.patch
@@ -10,7 +10,7 @@ If min-shoot-interval-ticks and max-shoot-interval-ticks are both set to
0, snow golems won't shoot any snowballs.
diff --git a/src/main/java/net/minecraft/world/entity/animal/EntitySnowman.java b/src/main/java/net/minecraft/world/entity/animal/EntitySnowman.java
-index cfcf67e99ae345f77a55771e6a25bdcdb4a9740a..28b5c22ecfe573ac9d91b74e54ebd3e3c5e6373f 100644
+index a692b973717ecc56d808039418599a11aedc2c5a..76fe39cf57384602c7422cb340f15ca7cac65ef9 100644
--- a/src/main/java/net/minecraft/world/entity/animal/EntitySnowman.java
+++ b/src/main/java/net/minecraft/world/entity/animal/EntitySnowman.java
@@ -66,7 +66,7 @@ public class EntitySnowman extends EntityGolem implements IShearable, IRangedEnt
@@ -23,10 +23,10 @@ index cfcf67e99ae345f77a55771e6a25bdcdb4a9740a..28b5c22ecfe573ac9d91b74e54ebd3e3
this.goalSelector.a(3, new PathfinderGoalLookAtPlayer(this, EntityHuman.class, 6.0F));
this.goalSelector.a(4, new PathfinderGoalRandomLookaround(this));
diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-index 81cd441842e63c0465bd64d9f9009852fed1296a..f534924050ac90716979e9f2b66c8a0752454fad 100644
+index c2044a89fd1547092fd3d6be671570fcf2a60f09..ed2b682b3717e58eb18ef12c18f362a75174f069 100644
--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-@@ -1027,12 +1027,20 @@ public class PurpurWorldConfig {
+@@ -1039,12 +1039,20 @@ public class PurpurWorldConfig {
public boolean snowGolemLeaveTrailWhenRidden = false;
public boolean snowGolemDropsPumpkin = true;
public boolean snowGolemPutPumpkinBack = false;
diff --git a/patches/server/0142-PaperPR-Config-option-for-Piglins-guarding-chests.patch b/patches/server/0141-PaperPR-Config-option-for-Piglins-guarding-chests.patch
similarity index 100%
rename from patches/server/0142-PaperPR-Config-option-for-Piglins-guarding-chests.patch
rename to patches/server/0141-PaperPR-Config-option-for-Piglins-guarding-chests.patch
diff --git a/patches/server/0143-EMC-Configurable-disable-give-dropping.patch b/patches/server/0142-EMC-Configurable-disable-give-dropping.patch
similarity index 100%
rename from patches/server/0143-EMC-Configurable-disable-give-dropping.patch
rename to patches/server/0142-EMC-Configurable-disable-give-dropping.patch
diff --git a/patches/server/0144-Config-migration-climbing-should-not-bypass-cramming.patch b/patches/server/0143-Config-migration-climbing-should-not-bypass-cramming.patch
similarity index 96%
rename from patches/server/0144-Config-migration-climbing-should-not-bypass-cramming.patch
rename to patches/server/0143-Config-migration-climbing-should-not-bypass-cramming.patch
index fd8cdf7e23..b87b4c702c 100644
--- a/patches/server/0144-Config-migration-climbing-should-not-bypass-cramming.patch
+++ b/patches/server/0143-Config-migration-climbing-should-not-bypass-cramming.patch
@@ -28,7 +28,7 @@ index 521604b37ca61b849420f206fde88210b582cd3c..116f17bcc02d15951fa248c6ce4e2cf3
public static String afkBroadcastBack = "§e§o%s is no longer AFK";
public static String afkTabListPrefix = "[AFK] ";
diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-index f534924050ac90716979e9f2b66c8a0752454fad..efd2bce6fa4572093acb7ef67d85aac1a989bcf3 100644
+index ed2b682b3717e58eb18ef12c18f362a75174f069..3e2898e3582efc00764885739e1df3a2ab5d5f6e 100644
--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
@@ -96,6 +96,17 @@ public class PurpurWorldConfig {
diff --git a/patches/server/0145-Lobotomize-stuck-villagers.patch b/patches/server/0144-Lobotomize-stuck-villagers.patch
similarity index 93%
rename from patches/server/0145-Lobotomize-stuck-villagers.patch
rename to patches/server/0144-Lobotomize-stuck-villagers.patch
index d349b92eb4..a37e113f69 100644
--- a/patches/server/0145-Lobotomize-stuck-villagers.patch
+++ b/patches/server/0144-Lobotomize-stuck-villagers.patch
@@ -5,10 +5,10 @@ Subject: [PATCH] Lobotomize stuck villagers
diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java
-index 918edab475a8d33a253e3d6cd3c5655748d10dc0..4d64fb19c3c9cce41e89ba4d702e687b34620b7e 100644
+index ac52732d4c1a3056664b40a15b6ee9cda9bea3d0..3230436d90306de325b8f72d813030288c2c28ed 100644
--- a/src/main/java/net/minecraft/world/entity/Entity.java
+++ b/src/main/java/net/minecraft/world/entity/Entity.java
-@@ -207,7 +207,7 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, ne
+@@ -206,7 +206,7 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, ne
public double lastY;
public double lastZ;
private Vec3D loc;
@@ -30,7 +30,7 @@ index 48e6a4c588ef39a4bde067d79b96a656c68750ce..ac7bad10697c6fde7d512753992d5971
// Paper start - add target parameter
return this.a(blockposition, null, i);
diff --git a/src/main/java/net/minecraft/world/entity/npc/EntityVillager.java b/src/main/java/net/minecraft/world/entity/npc/EntityVillager.java
-index a0f0d5e0909da5cfe87078d4722b030635cfeadd..bc14e242f97f9f6d8e581d12319c95ae5f70f250 100644
+index bd56b7a009a8bcbdd353d7bdcb2a2a7310ab45cc..45739558f10687870b475711735342d839859e03 100644
--- a/src/main/java/net/minecraft/world/entity/npc/EntityVillager.java
+++ b/src/main/java/net/minecraft/world/entity/npc/EntityVillager.java
@@ -89,6 +89,7 @@ import net.minecraft.world.level.IWorldReader;
@@ -99,10 +99,10 @@ index a0f0d5e0909da5cfe87078d4722b030635cfeadd..bc14e242f97f9f6d8e581d12319c95ae
long i = this.bC + 12000L;
long j = this.world.getTime();
diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-index efd2bce6fa4572093acb7ef67d85aac1a989bcf3..300fb6bb60fa961f2321183553c293730d4c4cd0 100644
+index 3e2898e3582efc00764885739e1df3a2ab5d5f6e..6f4aab0495e168afe3927b994e9c42ddce59dc20 100644
--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-@@ -1122,6 +1122,8 @@ public class PurpurWorldConfig {
+@@ -1134,6 +1134,8 @@ public class PurpurWorldConfig {
public int villagerSpawnIronGolemLimit = 0;
public boolean villagerCanBreed = true;
public int villagerBreedingTicks = 6000;
@@ -111,7 +111,7 @@ index efd2bce6fa4572093acb7ef67d85aac1a989bcf3..300fb6bb60fa961f2321183553c29373
private void villagerSettings() {
villagerRidable = getBoolean("mobs.villager.ridable", villagerRidable);
villagerRidableInWater = getBoolean("mobs.villager.ridable-in-water", villagerRidableInWater);
-@@ -1134,6 +1136,13 @@ public class PurpurWorldConfig {
+@@ -1146,6 +1148,13 @@ public class PurpurWorldConfig {
villagerSpawnIronGolemLimit = getInt("mobs.villager.spawn-iron-golem.limit", villagerSpawnIronGolemLimit);
villagerCanBreed = getBoolean("mobs.villager.can-breed", villagerCanBreed);
villagerBreedingTicks = getInt("mobs.villager.breeding-delay-ticks", villagerBreedingTicks);
diff --git a/patches/server/0146-Option-for-Villager-Clerics-to-farm-Nether-Wart.patch b/patches/server/0145-Option-for-Villager-Clerics-to-farm-Nether-Wart.patch
similarity index 98%
rename from patches/server/0146-Option-for-Villager-Clerics-to-farm-Nether-Wart.patch
rename to patches/server/0145-Option-for-Villager-Clerics-to-farm-Nether-Wart.patch
index ecba7bf1e4..0e63f1fe8b 100644
--- a/patches/server/0146-Option-for-Villager-Clerics-to-farm-Nether-Wart.patch
+++ b/patches/server/0145-Option-for-Villager-Clerics-to-farm-Nether-Wart.patch
@@ -186,7 +186,7 @@ index 25c10973c74f98224dd1d2ae5e7178b9781374aa..d50b5632f0e53147ea23109f1ed627b4
behaviorcontroller.removeMemory(MemoryModuleType.SECONDARY_JOB_SITE);
}
diff --git a/src/main/java/net/minecraft/world/entity/npc/EntityVillager.java b/src/main/java/net/minecraft/world/entity/npc/EntityVillager.java
-index bc14e242f97f9f6d8e581d12319c95ae5f70f250..0924e0c13b3c57e46f6dc40232707088f96e98c7 100644
+index 45739558f10687870b475711735342d839859e03..0699d835da44296ede8ee6458a7bf8ebccc313ae 100644
--- a/src/main/java/net/minecraft/world/entity/npc/EntityVillager.java
+++ b/src/main/java/net/minecraft/world/entity/npc/EntityVillager.java
@@ -203,7 +203,7 @@ public class EntityVillager extends EntityVillagerAbstract implements Reputation
@@ -198,7 +198,7 @@ index bc14e242f97f9f6d8e581d12319c95ae5f70f250..0924e0c13b3c57e46f6dc40232707088
}
behaviorcontroller.a(Activity.CORE, Behaviors.a(villagerprofession, 0.5F));
-@@ -944,6 +944,11 @@ public class EntityVillager extends EntityVillagerAbstract implements Reputation
+@@ -951,6 +951,11 @@ public class EntityVillager extends EntityVillagerAbstract implements Reputation
}
public boolean canPlant() {
@@ -224,10 +224,10 @@ index 69de7588eebba7557cdaec129f19ec1fc2c675c5..dd9b678481620856fb7eaaa04c3b812c
public static final VillagerProfession FISHERMAN = a("fisherman", VillagePlaceType.i, SoundEffects.ENTITY_VILLAGER_WORK_FISHERMAN);
public static final VillagerProfession FLETCHER = a("fletcher", VillagePlaceType.j, SoundEffects.ENTITY_VILLAGER_WORK_FLETCHER);
diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-index 300fb6bb60fa961f2321183553c293730d4c4cd0..bf82602521eacbe2ae18b548e2f2013f9179c23b 100644
+index 6f4aab0495e168afe3927b994e9c42ddce59dc20..efe82464beb6741413b73bbd6adc5c45eba7bcd6 100644
--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-@@ -1124,6 +1124,8 @@ public class PurpurWorldConfig {
+@@ -1136,6 +1136,8 @@ public class PurpurWorldConfig {
public int villagerBreedingTicks = 6000;
public boolean villagerLobotomizeEnabled = false;
public int villagerLobotomizeCheck = 60;
@@ -236,7 +236,7 @@ index 300fb6bb60fa961f2321183553c293730d4c4cd0..bf82602521eacbe2ae18b548e2f2013f
private void villagerSettings() {
villagerRidable = getBoolean("mobs.villager.ridable", villagerRidable);
villagerRidableInWater = getBoolean("mobs.villager.ridable-in-water", villagerRidableInWater);
-@@ -1143,6 +1145,8 @@ public class PurpurWorldConfig {
+@@ -1155,6 +1157,8 @@ public class PurpurWorldConfig {
}
villagerLobotomizeEnabled = getBoolean("mobs.villager.lobotomize.enabled", villagerLobotomizeEnabled);
villagerLobotomizeCheck = getInt("mobs.villager.lobotomize.check-interval", villagerLobotomizeCheck);
diff --git a/patches/server/0147-Toggle-for-Zombified-Piglin-death-always-counting-as.patch b/patches/server/0146-Toggle-for-Zombified-Piglin-death-always-counting-as.patch
similarity index 95%
rename from patches/server/0147-Toggle-for-Zombified-Piglin-death-always-counting-as.patch
rename to patches/server/0146-Toggle-for-Zombified-Piglin-death-always-counting-as.patch
index bd0b9c9c7c..e2cc2138e5 100644
--- a/patches/server/0147-Toggle-for-Zombified-Piglin-death-always-counting-as.patch
+++ b/patches/server/0146-Toggle-for-Zombified-Piglin-death-always-counting-as.patch
@@ -35,10 +35,10 @@ index 9f50054211db48e7fe764434e8d71aab0995e57a..82279ab2f3c1edec14c24c3a7ad24d09
}
diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-index bf82602521eacbe2ae18b548e2f2013f9179c23b..4ff49f042f1573162b1db59d1e3aeba72b0ef448 100644
+index efe82464beb6741413b73bbd6adc5c45eba7bcd6..7d32788c5e538be6eff9b6ff4655f279ac1e0e6b 100644
--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-@@ -1256,12 +1256,14 @@ public class PurpurWorldConfig {
+@@ -1268,12 +1268,14 @@ public class PurpurWorldConfig {
public boolean zombifiedPiglinJockeyOnlyBaby = true;
public double zombifiedPiglinJockeyChance = 0.05D;
public boolean zombifiedPiglinJockeyTryExistingChickens = true;
diff --git a/patches/server/0148-Spread-out-and-optimise-player-list-ticks.patch b/patches/server/0147-Spread-out-and-optimise-player-list-ticks.patch
similarity index 92%
rename from patches/server/0148-Spread-out-and-optimise-player-list-ticks.patch
rename to patches/server/0147-Spread-out-and-optimise-player-list-ticks.patch
index 31a9dd0269..ca0fc3b9e6 100644
--- a/patches/server/0148-Spread-out-and-optimise-player-list-ticks.patch
+++ b/patches/server/0147-Spread-out-and-optimise-player-list-ticks.patch
@@ -5,7 +5,7 @@ Subject: [PATCH] Spread out and optimise player list ticks
diff --git a/src/main/java/net/minecraft/server/players/PlayerList.java b/src/main/java/net/minecraft/server/players/PlayerList.java
-index c742647c0c5e3e4925e4ee6d195a54a85435e65e..8307b44718198f6f2325454f72bd296c33cba58a 100644
+index 3622ea01edfb9dfaab254ceaf09582d9e8993174..070de6c066b2e293e0bc0ea9722a9a3dcf520431 100644
--- a/src/main/java/net/minecraft/server/players/PlayerList.java
+++ b/src/main/java/net/minecraft/server/players/PlayerList.java
@@ -151,7 +151,7 @@ public abstract class PlayerList {
@@ -17,7 +17,7 @@ index c742647c0c5e3e4925e4ee6d195a54a85435e65e..8307b44718198f6f2325454f72bd296c
// CraftBukkit start
private CraftServer cserver;
-@@ -1023,22 +1023,23 @@ public abstract class PlayerList {
+@@ -1029,22 +1029,23 @@ public abstract class PlayerList {
}
public void tick() {
@@ -56,7 +56,7 @@ index c742647c0c5e3e4925e4ee6d195a54a85435e65e..8307b44718198f6f2325454f72bd296c
public void sendAll(Packet> packet) {
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
-index 1ff48eae5e5b732fbd1e720c55e08a30669bebfa..ca465a53a0c6232f912287704fc63cdcc59a28bd 100644
+index 1c5bcc17a702f5af514ce4db7f5d096d5f449dd6..e204374c8f17ca5514e9bcfd24d411069285de29 100644
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
@@ -1444,7 +1444,13 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
diff --git a/patches/server/0149-Configurable-chance-for-wolves-to-spawn-rabid.patch b/patches/server/0148-Configurable-chance-for-wolves-to-spawn-rabid.patch
similarity index 98%
rename from patches/server/0149-Configurable-chance-for-wolves-to-spawn-rabid.patch
rename to patches/server/0148-Configurable-chance-for-wolves-to-spawn-rabid.patch
index 1c440e4dfc..0b8375fad7 100644
--- a/patches/server/0149-Configurable-chance-for-wolves-to-spawn-rabid.patch
+++ b/patches/server/0148-Configurable-chance-for-wolves-to-spawn-rabid.patch
@@ -7,7 +7,7 @@ Configurable chance to spawn a wolf that is rabid.
Rabid wolves attack all players, mobs, and animals.
diff --git a/src/main/java/net/minecraft/world/entity/EntityLiving.java b/src/main/java/net/minecraft/world/entity/EntityLiving.java
-index 2d3ec6505b91a2cb43a1e2285a7d4e57a54e243c..f0a485056f3ad94e7375fbdfd512026b969a0eed 100644
+index 8b7a2eaa4f73b72f9022dbf58a46239541c81ff7..a090f563d7019615c055847ce0c2b0f2a343d70b 100644
--- a/src/main/java/net/minecraft/world/entity/EntityLiving.java
+++ b/src/main/java/net/minecraft/world/entity/EntityLiving.java
@@ -2213,6 +2213,7 @@ public abstract class EntityLiving extends Entity {
@@ -242,10 +242,10 @@ index dd3c7ad7701ad18ccaf86d73fde7051090ed3d57..e8c6aca70db693250224d1c162e3c268
return super.b(entityhuman, enumhand);
}
diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-index 4ff49f042f1573162b1db59d1e3aeba72b0ef448..5b549ab625890cd49e6820e31a15e80680b78237 100644
+index 7d32788c5e538be6eff9b6ff4655f279ac1e0e6b..5a05d4e511bf7c96d3e01c59e6e53b105bf7baf6 100644
--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-@@ -1207,10 +1207,14 @@ public class PurpurWorldConfig {
+@@ -1219,10 +1219,14 @@ public class PurpurWorldConfig {
public boolean wolfRidable = false;
public boolean wolfRidableInWater = false;
diff --git a/patches/server/0150-Configurable-default-wolf-collar-color.patch b/patches/server/0149-Configurable-default-wolf-collar-color.patch
similarity index 94%
rename from patches/server/0150-Configurable-default-wolf-collar-color.patch
rename to patches/server/0149-Configurable-default-wolf-collar-color.patch
index 298a43f99f..b2e3efadbc 100644
--- a/patches/server/0150-Configurable-default-wolf-collar-color.patch
+++ b/patches/server/0149-Configurable-default-wolf-collar-color.patch
@@ -24,7 +24,7 @@ index e8c6aca70db693250224d1c162e3c2684687ea41..e33aadead6e6c5e0a7b39ef95e7aeb0f
@Override
diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-index 5b549ab625890cd49e6820e31a15e80680b78237..7ddb0119baa33a6641599fce7c7112d05dd7fb5d 100644
+index 5a05d4e511bf7c96d3e01c59e6e53b105bf7baf6..0666c523f82b9083ed8e81570faa923bbeb00ab8 100644
--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
@@ -3,6 +3,7 @@ package net.pl3x.purpur;
@@ -35,7 +35,7 @@ index 5b549ab625890cd49e6820e31a15e80680b78237..7ddb0119baa33a6641599fce7c7112d0
import net.minecraft.world.level.Explosion;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.Blocks;
-@@ -1207,12 +1208,18 @@ public class PurpurWorldConfig {
+@@ -1219,12 +1220,18 @@ public class PurpurWorldConfig {
public boolean wolfRidable = false;
public boolean wolfRidableInWater = false;
diff --git a/patches/server/0151-Configurable-entity-base-attributes.patch b/patches/server/0150-Configurable-entity-base-attributes.patch
similarity index 96%
rename from patches/server/0151-Configurable-entity-base-attributes.patch
rename to patches/server/0150-Configurable-entity-base-attributes.patch
index dcd7377a4f..a4e8dfae57 100644
--- a/patches/server/0151-Configurable-entity-base-attributes.patch
+++ b/patches/server/0150-Configurable-entity-base-attributes.patch
@@ -5,7 +5,7 @@ Subject: [PATCH] Configurable entity base attributes
diff --git a/src/main/java/net/minecraft/world/entity/ambient/EntityBat.java b/src/main/java/net/minecraft/world/entity/ambient/EntityBat.java
-index eed98fd7e84b4f390b8b356258f5011da561a343..88a0d51f78bee9a1b0762b46db4d91a9f8f8c75d 100644
+index a99c2b4281196ad3b93292da52fc4c6bf4207181..bd02320d450a7fd7254f01b1c44ef421c1810ea7 100644
--- a/src/main/java/net/minecraft/world/entity/ambient/EntityBat.java
+++ b/src/main/java/net/minecraft/world/entity/ambient/EntityBat.java
@@ -82,6 +82,18 @@ public class EntityBat extends EntityAmbient {
@@ -28,10 +28,10 @@ index eed98fd7e84b4f390b8b356258f5011da561a343..88a0d51f78bee9a1b0762b46db4d91a9
@Override
diff --git a/src/main/java/net/minecraft/world/entity/animal/EntityBee.java b/src/main/java/net/minecraft/world/entity/animal/EntityBee.java
-index 9e40fd6585592ccd1deff1d8319c57660474c053..c39a7a6d7f391debd632a199eeec8ded6189ad76 100644
+index 6086dda5b06f0c0e02734edf7141b13715420d3c..e425e093c233a21e5ef457e3a94defe8b74261d2 100644
--- a/src/main/java/net/minecraft/world/entity/animal/EntityBee.java
+++ b/src/main/java/net/minecraft/world/entity/animal/EntityBee.java
-@@ -181,6 +181,11 @@ public class EntityBee extends EntityAnimal implements IEntityAngerable, EntityB
+@@ -180,6 +180,11 @@ public class EntityBee extends EntityAnimal implements IEntityAngerable, EntityB
public int getPurpurBreedTime() {
return this.world.purpurConfig.beeBreedingTicks;
}
@@ -44,7 +44,7 @@ index 9e40fd6585592ccd1deff1d8319c57660474c053..c39a7a6d7f391debd632a199eeec8ded
@Override
diff --git a/src/main/java/net/minecraft/world/entity/animal/EntityCat.java b/src/main/java/net/minecraft/world/entity/animal/EntityCat.java
-index 079b95ef465f7155f426a2c87a4a50f8369d0a18..7143b0801be7877762e41da336ea5e4e57f2e463 100644
+index 187047de5530ccec1e9804f8039839246ab248f3..a4e3e36f081803b0588a0e907a3a834b7a3ab3eb 100644
--- a/src/main/java/net/minecraft/world/entity/animal/EntityCat.java
+++ b/src/main/java/net/minecraft/world/entity/animal/EntityCat.java
@@ -127,6 +127,11 @@ public class EntityCat extends EntityTameableAnimal {
@@ -96,7 +96,7 @@ index 897e0d5ca44a0c475634f08e7d4fcf129ee197ab..07c6dc6a1b9af7b9662f4dd4b4a2ddfc
@Override
diff --git a/src/main/java/net/minecraft/world/entity/animal/EntityCow.java b/src/main/java/net/minecraft/world/entity/animal/EntityCow.java
-index 93589a2b86e6663d93f6b536b853996c08db549a..2a8c0537fbb68577a3da3f8d07c16e9ca18b224d 100644
+index 7ed55ebe1bb768351a5cb4cdc7d4d3b0816d53b1..06af4c63fa05b243b7692cbc41b4f62ca0548def 100644
--- a/src/main/java/net/minecraft/world/entity/animal/EntityCow.java
+++ b/src/main/java/net/minecraft/world/entity/animal/EntityCow.java
@@ -59,6 +59,11 @@ public class EntityCow extends EntityAnimal {
@@ -112,7 +112,7 @@ index 93589a2b86e6663d93f6b536b853996c08db549a..2a8c0537fbb68577a3da3f8d07c16e9c
@Override
diff --git a/src/main/java/net/minecraft/world/entity/animal/EntityDolphin.java b/src/main/java/net/minecraft/world/entity/animal/EntityDolphin.java
-index 880c3aaf4e684209879dc921480619e7c61ee4a0..6b32b3e4877efa64942838a07af5d48cd4e33a80 100644
+index e4442716b329f3101bfd39fc7ce13d5419b427bf..3ca911cebc01692f63b8731a5df6d9ea3fbad66b 100644
--- a/src/main/java/net/minecraft/world/entity/animal/EntityDolphin.java
+++ b/src/main/java/net/minecraft/world/entity/animal/EntityDolphin.java
@@ -128,6 +128,11 @@ public class EntityDolphin extends EntityWaterAnimal {
@@ -128,10 +128,10 @@ index 880c3aaf4e684209879dc921480619e7c61ee4a0..6b32b3e4877efa64942838a07af5d48c
@Nullable
diff --git a/src/main/java/net/minecraft/world/entity/animal/EntityFox.java b/src/main/java/net/minecraft/world/entity/animal/EntityFox.java
-index 7bf546a1b2a80179962ed08a35d86f0a28eda3c2..b8b0ee65798dc94d707fa64bd53fdda5506331d9 100644
+index 70369d03985250fa5eaf398fa98d35a2c2a06ff1..5a2e624f1b6636f058cc69989324914f174a271a 100644
--- a/src/main/java/net/minecraft/world/entity/animal/EntityFox.java
+++ b/src/main/java/net/minecraft/world/entity/animal/EntityFox.java
-@@ -164,6 +164,11 @@ public class EntityFox extends EntityAnimal {
+@@ -162,6 +162,11 @@ public class EntityFox extends EntityAnimal {
public int getPurpurBreedTime() {
return this.world.purpurConfig.foxBreedingTicks;
}
@@ -240,7 +240,7 @@ index e6952c0a8d90eb4b133c517d97299f2c3db7e329..94141b8c1ad62e6d187726734d25dd0e
if (this.isLazy()) {
diff --git a/src/main/java/net/minecraft/world/entity/animal/EntityParrot.java b/src/main/java/net/minecraft/world/entity/animal/EntityParrot.java
-index 5463e1779422ff19499727a000fdfbbfc38809a8..efa4318989893c946e9d7671d0dead6c4a6e315f 100644
+index 7346921a24bdd57aa3814386bc372b082b23b4bc..7500de8bcdd32f08bf6d32e70cfe09baf097cc2b 100644
--- a/src/main/java/net/minecraft/world/entity/animal/EntityParrot.java
+++ b/src/main/java/net/minecraft/world/entity/animal/EntityParrot.java
@@ -176,6 +176,11 @@ public class EntityParrot extends EntityPerchable implements EntityBird {
@@ -272,7 +272,7 @@ index 5aa8806063186bec36b38adc51e2ea82bf6ff21a..8d24855f230a5ca6280f885d5b1c26ec
@Override
diff --git a/src/main/java/net/minecraft/world/entity/animal/EntityPolarBear.java b/src/main/java/net/minecraft/world/entity/animal/EntityPolarBear.java
-index 2306abb72ea76a52fd6f27648c4815ad99f8f005..5a496d55b40f98609b0a9aac25929f6b5c0311ba 100644
+index c9c7c9de638079393bbea86f8069023dcbcbca83..83494d3c989a120297c21a1bd560bc37734dc86a 100644
--- a/src/main/java/net/minecraft/world/entity/animal/EntityPolarBear.java
+++ b/src/main/java/net/minecraft/world/entity/animal/EntityPolarBear.java
@@ -121,6 +121,11 @@ public class EntityPolarBear extends EntityAnimal implements IEntityAngerable {
@@ -312,10 +312,10 @@ index 38fe79872b4b7f4ad4a030fbdf505efbc0352fc0..0d32590cf4cfdd95da6aceac5190d42c
@Override
diff --git a/src/main/java/net/minecraft/world/entity/animal/EntityRabbit.java b/src/main/java/net/minecraft/world/entity/animal/EntityRabbit.java
-index 0b706404895b69fbca79502a327ec20b47ed99f0..284c52276b2fd816990c23b7b8a9ee50e70ab005 100644
+index 465701232567e4058f9dfc776560ccde33fee66c..ef031ac08b06e78d8826579c49cf5e43683318f9 100644
--- a/src/main/java/net/minecraft/world/entity/animal/EntityRabbit.java
+++ b/src/main/java/net/minecraft/world/entity/animal/EntityRabbit.java
-@@ -91,6 +91,11 @@ public class EntityRabbit extends EntityAnimal {
+@@ -90,6 +90,11 @@ public class EntityRabbit extends EntityAnimal {
public int getPurpurBreedTime() {
return this.world.purpurConfig.rabbitBreedingTicks;
}
@@ -368,7 +368,7 @@ index ff6fc821085e4430a3b1008140b0b7fcacc59d2e..365f70117a287fab2fbf63ee8d89a10a
@Override
diff --git a/src/main/java/net/minecraft/world/entity/animal/EntitySnowman.java b/src/main/java/net/minecraft/world/entity/animal/EntitySnowman.java
-index 28b5c22ecfe573ac9d91b74e54ebd3e3c5e6373f..88db8ff8cb415b84ab98cc0550c705d5a472230c 100644
+index 76fe39cf57384602c7422cb340f15ca7cac65ef9..3934966b06eb9880ed316cee84d099edd80c09b9 100644
--- a/src/main/java/net/minecraft/world/entity/animal/EntitySnowman.java
+++ b/src/main/java/net/minecraft/world/entity/animal/EntitySnowman.java
@@ -61,6 +61,11 @@ public class EntitySnowman extends EntityGolem implements IShearable, IRangedEnt
@@ -384,7 +384,7 @@ index 28b5c22ecfe573ac9d91b74e54ebd3e3c5e6373f..88db8ff8cb415b84ab98cc0550c705d5
@Override
diff --git a/src/main/java/net/minecraft/world/entity/animal/EntitySquid.java b/src/main/java/net/minecraft/world/entity/animal/EntitySquid.java
-index be48e12dd6c9a390bf383129953bcd3d1f818427..1e7632d2ca4440dee4e406e26da61411ec5bc88f 100644
+index 7ec3e5d136cbb708b3bb29aa79bdd401d37d56dc..fa629ebc4946a0c3e891e5e2dd881277b3e25347 100644
--- a/src/main/java/net/minecraft/world/entity/animal/EntitySquid.java
+++ b/src/main/java/net/minecraft/world/entity/animal/EntitySquid.java
@@ -86,6 +86,11 @@ public class EntitySquid extends EntityWaterAnimal {
@@ -653,7 +653,7 @@ index c776f18722d1aa73f53da66ef6b37564eeaddd2a..1820c2d225d1fa919de2b1c0593370a8
public static AttributeProvider.Builder eL() {
diff --git a/src/main/java/net/minecraft/world/entity/animal/horse/EntityLlama.java b/src/main/java/net/minecraft/world/entity/animal/horse/EntityLlama.java
-index b3d51abc9bad9cad6fdc5dbdc2bf09d43a565f98..762fed5ba27474951c1962e6f034e8494b1035d6 100644
+index 2710c246a147f117d2d90014c37988888010dc36..4bea68fa35177d84a35dc5ced3e501a87e2a5391 100644
--- a/src/main/java/net/minecraft/world/entity/animal/horse/EntityLlama.java
+++ b/src/main/java/net/minecraft/world/entity/animal/horse/EntityLlama.java
@@ -113,6 +113,21 @@ public class EntityLlama extends EntityHorseChestedAbstract implements IRangedEn
@@ -705,7 +705,7 @@ index 0fb651bcde1109b0eb30b60226d3512648dceb41..73f59982d70093d308c6dc6a9a569334
@Override
diff --git a/src/main/java/net/minecraft/world/entity/boss/enderdragon/EntityEnderDragon.java b/src/main/java/net/minecraft/world/entity/boss/enderdragon/EntityEnderDragon.java
-index 7f583c6c15f0191219eb911d901ea28d86c11489..999a6d17eccd6305c0063e1558abfe70d72c39fe 100644
+index b2d1a0144353a1da61221b59a0acc028b0cf746e..aeff46b575a05145fb509b5e5a489b2067776e2f 100644
--- a/src/main/java/net/minecraft/world/entity/boss/enderdragon/EntityEnderDragon.java
+++ b/src/main/java/net/minecraft/world/entity/boss/enderdragon/EntityEnderDragon.java
@@ -147,6 +147,11 @@ public class EntityEnderDragon extends EntityInsentient implements IMonster {
@@ -721,7 +721,7 @@ index 7f583c6c15f0191219eb911d901ea28d86c11489..999a6d17eccd6305c0063e1558abfe70
public static AttributeProvider.Builder m() {
diff --git a/src/main/java/net/minecraft/world/entity/monster/EntityBlaze.java b/src/main/java/net/minecraft/world/entity/monster/EntityBlaze.java
-index 9a109ed062e5abedaad295383aca6441321da276..45e69d2f8da4c5babfd2e67055cc0a4c6d3baac7 100644
+index 6553fd92c26d71ac0a60bd046c7f968f2dfe6667..55b6f483aca8cbb5c30b3759e23c86a699e19569 100644
--- a/src/main/java/net/minecraft/world/entity/monster/EntityBlaze.java
+++ b/src/main/java/net/minecraft/world/entity/monster/EntityBlaze.java
@@ -72,6 +72,11 @@ public class EntityBlaze extends EntityMonster {
@@ -753,7 +753,7 @@ index 27baf5cde99d8f25b1e7583c30339fcc71a3786f..72b298642f17c13f0f5959034e345a47
public static AttributeProvider.Builder m() {
diff --git a/src/main/java/net/minecraft/world/entity/monster/EntityCreeper.java b/src/main/java/net/minecraft/world/entity/monster/EntityCreeper.java
-index 2cb9908a5c53528b2e02a1231752adc5ad8354f8..62d40f726355283baddde349c52bee0599bb293c 100644
+index 1daacdd75c709cd5508434b41589bd57032de27c..d049aac0208386198d1da4e9470e64898d27b1c9 100644
--- a/src/main/java/net/minecraft/world/entity/monster/EntityCreeper.java
+++ b/src/main/java/net/minecraft/world/entity/monster/EntityCreeper.java
@@ -137,6 +137,11 @@ public class EntityCreeper extends EntityMonster {
@@ -789,7 +789,7 @@ index 93946f4e3cad07e20189a44ce512682b4cbc163b..926a38adb52b7d99ce2a9fcc52eb4878
@Override
diff --git a/src/main/java/net/minecraft/world/entity/monster/EntityEnderman.java b/src/main/java/net/minecraft/world/entity/monster/EntityEnderman.java
-index 18b3f8d1fadd1424327261d92b49977a35c4948c..478ac5bfdc69b5c3e24906bb5e0ea1dff81cea98 100644
+index c04ff259f650b0e5a361c4f17b8b5ff9ecb8ab71..a1cc0b414479e693de9428412ba837fd9bf57751 100644
--- a/src/main/java/net/minecraft/world/entity/monster/EntityEnderman.java
+++ b/src/main/java/net/minecraft/world/entity/monster/EntityEnderman.java
@@ -96,6 +96,11 @@ public class EntityEnderman extends EntityMonster implements IEntityAngerable {
@@ -837,7 +837,7 @@ index 55607910183155080e3d96296421438d17f19c8f..8d7b8d2ac9a7340e2cfd0d1b8963e4e4
@Override
diff --git a/src/main/java/net/minecraft/world/entity/monster/EntityGhast.java b/src/main/java/net/minecraft/world/entity/monster/EntityGhast.java
-index 8784647f512d280ee0a092ecd406321268359314..5c39a9aec865d25a9aa5edcfd3a0fd6d1166cbd1 100644
+index b6d49740a1c8dfa19e871869b92b307fc8397588..e83d9aae4a04fc67587d40cec1f24ba5ebb58e10 100644
--- a/src/main/java/net/minecraft/world/entity/monster/EntityGhast.java
+++ b/src/main/java/net/minecraft/world/entity/monster/EntityGhast.java
@@ -73,6 +73,11 @@ public class EntityGhast extends EntityFlying implements IMonster {
@@ -853,7 +853,7 @@ index 8784647f512d280ee0a092ecd406321268359314..5c39a9aec865d25a9aa5edcfd3a0fd6d
@Override
diff --git a/src/main/java/net/minecraft/world/entity/monster/EntityGuardian.java b/src/main/java/net/minecraft/world/entity/monster/EntityGuardian.java
-index 6980b6988549b37a33d204a6e84c9e81d384a57a..248c64ea21de214bfbb2fa39f289382fd4f76202 100644
+index 66ae664add95f4441724b49a470a2fef569042d6..291b2e0defe4d63d4f746a3879c1fee59d2997d7 100644
--- a/src/main/java/net/minecraft/world/entity/monster/EntityGuardian.java
+++ b/src/main/java/net/minecraft/world/entity/monster/EntityGuardian.java
@@ -86,6 +86,11 @@ public class EntityGuardian extends EntityMonster {
@@ -905,7 +905,7 @@ index 15ed51a2746c09538a425fce25fa25f2619b7033..626a207cdb727866cb75f4e53a688086
public static AttributeProvider.Builder m() {
diff --git a/src/main/java/net/minecraft/world/entity/monster/EntityPhantom.java b/src/main/java/net/minecraft/world/entity/monster/EntityPhantom.java
-index a836839b17cbda8ac269f032b141ba448e3bab8c..902b26d609aef8dd46e8875cb7c06f187511e8d5 100644
+index 1c24a2abe3921fb3cf8341e4fd620d919e2917af..11e45bfa1086f56cdbd87e3ced194ee82f36d142 100644
--- a/src/main/java/net/minecraft/world/entity/monster/EntityPhantom.java
+++ b/src/main/java/net/minecraft/world/entity/monster/EntityPhantom.java
@@ -120,6 +120,11 @@ public class EntityPhantom extends EntityFlying implements IMonster {
@@ -966,10 +966,10 @@ index 2a4ac6e608650d56cc2b564e715b7b685e7f3f62..43a1a31db5ddfd30b66c63c6b2cceb1d
@Override
diff --git a/src/main/java/net/minecraft/world/entity/monster/EntityRavager.java b/src/main/java/net/minecraft/world/entity/monster/EntityRavager.java
-index dc1ca7b334e89b4d0be775b6f6e6f4222ea02dcc..80c3cd540a46e249e85586e8d7a2f0f6226091fc 100644
+index cc37e545ece89803fad91801775470df4620bd62..7e3b59e2302a27f7b8a3f43b75527199722a896f 100644
--- a/src/main/java/net/minecraft/world/entity/monster/EntityRavager.java
+++ b/src/main/java/net/minecraft/world/entity/monster/EntityRavager.java
-@@ -81,6 +81,11 @@ public class EntityRavager extends EntityRaider {
+@@ -80,6 +80,11 @@ public class EntityRavager extends EntityRaider {
double speed = this.getAttributeInstance(GenericAttributes.MOVEMENT_SPEED).getBaseValue();
getAttributeInstance(GenericAttributes.MOVEMENT_SPEED).setValue(speed);
}
@@ -1078,7 +1078,7 @@ index cb52c4e63ac487d55dc16accca6976f44f904112..62f1808a456f46a6c7fbb5e030d9ed65
@Override
diff --git a/src/main/java/net/minecraft/world/entity/monster/EntitySlime.java b/src/main/java/net/minecraft/world/entity/monster/EntitySlime.java
-index 0cbe3032fd3b048b0eb8ec3d8592a662c69c9e30..ce0d52a501dbff7c4eb70270bafa3e2a77599107 100644
+index feb40c2ca8e8f3fae5665b2d71296a6b811b11f6..2b826dadb4b9132541c9844d144ce7050829250b 100644
--- a/src/main/java/net/minecraft/world/entity/monster/EntitySlime.java
+++ b/src/main/java/net/minecraft/world/entity/monster/EntitySlime.java
@@ -51,6 +51,7 @@ import com.destroystokyo.paper.event.entity.SlimeChangeDirectionEvent;
@@ -1170,7 +1170,7 @@ index cba66a08feceeeaf7c123da595fc7b12c5749783..892aa844a98ae0d192737c6fc6df0a21
public static boolean c(EntityTypes entitytypes, GeneratorAccess generatoraccess, EnumMobSpawn enummobspawn, BlockPosition blockposition, Random random) {
diff --git a/src/main/java/net/minecraft/world/entity/monster/EntityVex.java b/src/main/java/net/minecraft/world/entity/monster/EntityVex.java
-index 4301ece0a04f3f2b4d198a684d0ca314deef2aef..69d47697442fa80fbed08a11bb9e66057d059101 100644
+index 5e2114d2321c1542dc892bc7aed07080008cfd20..6835abd1badd1f03401870f4fed2b6911211d931 100644
--- a/src/main/java/net/minecraft/world/entity/monster/EntityVex.java
+++ b/src/main/java/net/minecraft/world/entity/monster/EntityVex.java
@@ -92,6 +92,11 @@ public class EntityVex extends EntityMonster {
@@ -1218,7 +1218,7 @@ index c4663c5b02363bd1499ce1f3b50027f8aa7c68e7..a119923ee8d8ac00892f594a8af6d392
@Override
diff --git a/src/main/java/net/minecraft/world/entity/monster/EntityZoglin.java b/src/main/java/net/minecraft/world/entity/monster/EntityZoglin.java
-index c5b1ce9268d6e6f3ec26eda4b5d8e7ae2a2ea672..17c96e8eaa5cde028024f5ad4b853e3399a942d5 100644
+index 249fb9cf43527af5c7818ce6b07487ad446811b7..4d03a2dc2aed9b292ac17dc57d560f13e655cf4a 100644
--- a/src/main/java/net/minecraft/world/entity/monster/EntityZoglin.java
+++ b/src/main/java/net/minecraft/world/entity/monster/EntityZoglin.java
@@ -72,6 +72,11 @@ public class EntityZoglin extends EntityMonster implements IMonster, IOglin {
@@ -1319,7 +1319,7 @@ index b8395c7317494adf36010080931a1c8635ab6cfa..aeeee97a87680f072188d1fcc9ec55b5
@Override
diff --git a/src/main/java/net/minecraft/world/entity/monster/hoglin/EntityHoglin.java b/src/main/java/net/minecraft/world/entity/monster/hoglin/EntityHoglin.java
-index 828d01abe8202a246ce07c1c652a17cbc829d904..b271df48d04f12a68e0b7abf2f1375749a9a0f08 100644
+index 8c2815c8b11c8db8e6c1d0caf71188322e52094d..0b6c80e908392025197b68d1ba6b3eed6d69c9b2 100644
--- a/src/main/java/net/minecraft/world/entity/monster/hoglin/EntityHoglin.java
+++ b/src/main/java/net/minecraft/world/entity/monster/hoglin/EntityHoglin.java
@@ -76,6 +76,11 @@ public class EntityHoglin extends EntityAnimal implements IMonster, IOglin {
@@ -1335,7 +1335,7 @@ index 828d01abe8202a246ce07c1c652a17cbc829d904..b271df48d04f12a68e0b7abf2f137574
@Override
diff --git a/src/main/java/net/minecraft/world/entity/monster/piglin/EntityPiglin.java b/src/main/java/net/minecraft/world/entity/monster/piglin/EntityPiglin.java
-index 8c6f5273ed2ab4ec63b7854e290f790b2eca8c2f..99fc16aae085da564c5236e68925a8a2225f5c27 100644
+index 2311d82824314a9feede9c3c106b0e1b24ac1b7a..17dde4532714378f7480f55991d94fc82e9a2b05 100644
--- a/src/main/java/net/minecraft/world/entity/monster/piglin/EntityPiglin.java
+++ b/src/main/java/net/minecraft/world/entity/monster/piglin/EntityPiglin.java
@@ -80,6 +80,11 @@ public class EntityPiglin extends EntityPiglinAbstract implements ICrossbow {
@@ -1351,7 +1351,7 @@ index 8c6f5273ed2ab4ec63b7854e290f790b2eca8c2f..99fc16aae085da564c5236e68925a8a2
@Override
diff --git a/src/main/java/net/minecraft/world/entity/monster/piglin/EntityPiglinBrute.java b/src/main/java/net/minecraft/world/entity/monster/piglin/EntityPiglinBrute.java
-index da2220b08a9cd9c2d7d3fd06702e6690e12f095e..c441d6b2ce29d914a29c2f39d70adb14e9ab31a6 100644
+index 1370d2d8568a4ed62f2ec3d54abc7d2bebc48f75..201b78ffb5062254a6b3447f217df03dfb498710 100644
--- a/src/main/java/net/minecraft/world/entity/monster/piglin/EntityPiglinBrute.java
+++ b/src/main/java/net/minecraft/world/entity/monster/piglin/EntityPiglinBrute.java
@@ -49,6 +49,11 @@ public class EntityPiglinBrute extends EntityPiglinAbstract {
@@ -1367,7 +1367,7 @@ index da2220b08a9cd9c2d7d3fd06702e6690e12f095e..c441d6b2ce29d914a29c2f39d70adb14
public static AttributeProvider.Builder eS() {
diff --git a/src/main/java/net/minecraft/world/entity/npc/EntityVillager.java b/src/main/java/net/minecraft/world/entity/npc/EntityVillager.java
-index 0924e0c13b3c57e46f6dc40232707088f96e98c7..16933de70a23414859019e19545bfa5baa38091a 100644
+index 0699d835da44296ede8ee6458a7bf8ebccc313ae..f911cd4cf2ad82e81b09f92063abd573797fe5d6 100644
--- a/src/main/java/net/minecraft/world/entity/npc/EntityVillager.java
+++ b/src/main/java/net/minecraft/world/entity/npc/EntityVillager.java
@@ -167,6 +167,11 @@ public class EntityVillager extends EntityVillagerAbstract implements Reputation
@@ -1383,7 +1383,7 @@ index 0924e0c13b3c57e46f6dc40232707088f96e98c7..16933de70a23414859019e19545bfa5b
@Override
diff --git a/src/main/java/net/minecraft/world/entity/npc/EntityVillagerTrader.java b/src/main/java/net/minecraft/world/entity/npc/EntityVillagerTrader.java
-index 90cbef7fe8803295f82bddd6709fdf303aedcaba..b84916c0c58fd208ef5547299f8db8462d1c42fe 100644
+index 6c390fb20c7f29133a60780a75676d8d3d6eab29..f6e0a92037d22de102c42cc1953ea90919bd3a34 100644
--- a/src/main/java/net/minecraft/world/entity/npc/EntityVillagerTrader.java
+++ b/src/main/java/net/minecraft/world/entity/npc/EntityVillagerTrader.java
@@ -18,6 +18,7 @@ import net.minecraft.world.entity.EntityAgeable;
@@ -1394,7 +1394,7 @@ index 90cbef7fe8803295f82bddd6709fdf303aedcaba..b84916c0c58fd208ef5547299f8db846
import net.minecraft.world.entity.ai.goal.PathfinderGoal;
import net.minecraft.world.entity.ai.goal.PathfinderGoalAvoidTarget;
import net.minecraft.world.entity.ai.goal.PathfinderGoalFloat;
-@@ -110,6 +111,11 @@ public class EntityVillagerTrader extends EntityVillagerAbstract {
+@@ -114,6 +115,11 @@ public class EntityVillagerTrader extends EntityVillagerAbstract {
public boolean a(EntityHuman entityhuman) {
return world.purpurConfig.villagerTraderCanBeLeashed && !this.isLeashed();
}
@@ -1407,10 +1407,10 @@ index 90cbef7fe8803295f82bddd6709fdf303aedcaba..b84916c0c58fd208ef5547299f8db846
@Nullable
diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-index 7ddb0119baa33a6641599fce7c7112d05dd7fb5d..464d6e35970b42319934d74a1f41076cf4f8b784 100644
+index 0666c523f82b9083ed8e81570faa923bbeb00ab8..f0f8165c51c17855d0c719d47bea194b80ff7847 100644
--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-@@ -530,30 +530,58 @@ public class PurpurWorldConfig {
+@@ -542,30 +542,58 @@ public class PurpurWorldConfig {
public boolean batRidable = false;
public boolean batRidableInWater = false;
public double batMaxY = 256D;
@@ -1469,7 +1469,7 @@ index 7ddb0119baa33a6641599fce7c7112d05dd7fb5d..464d6e35970b42319934d74a1f41076c
}
public boolean catRidable = false;
-@@ -562,6 +590,7 @@ public class PurpurWorldConfig {
+@@ -574,6 +602,7 @@ public class PurpurWorldConfig {
public int catSpawnSwampHutScanRange = 16;
public int catSpawnVillageScanRange = 48;
public int catBreedingTicks = 6000;
@@ -1477,7 +1477,7 @@ index 7ddb0119baa33a6641599fce7c7112d05dd7fb5d..464d6e35970b42319934d74a1f41076c
private void catSettings() {
catRidable = getBoolean("mobs.cat.ridable", catRidable);
catRidableInWater = getBoolean("mobs.cat.ridable-in-water", catRidableInWater);
-@@ -569,51 +598,92 @@ public class PurpurWorldConfig {
+@@ -581,51 +610,92 @@ public class PurpurWorldConfig {
catSpawnSwampHutScanRange = getInt("mobs.cat.scan-range-for-other-cats.swamp-hut", catSpawnSwampHutScanRange);
catSpawnVillageScanRange = getInt("mobs.cat.scan-range-for-other-cats.village", catSpawnVillageScanRange);
catBreedingTicks = getInt("mobs.cat.breeding-delay-ticks", catBreedingTicks);
@@ -1570,7 +1570,7 @@ index 7ddb0119baa33a6641599fce7c7112d05dd7fb5d..464d6e35970b42319934d74a1f41076c
}
public boolean dolphinRidable = false;
-@@ -621,19 +691,45 @@ public class PurpurWorldConfig {
+@@ -633,19 +703,45 @@ public class PurpurWorldConfig {
public float dolphinSpitSpeed = 1.0F;
public float dolphinSpitDamage = 2.0F;
public boolean dolphinDisableTreasureSearching = false;
@@ -1616,7 +1616,7 @@ index 7ddb0119baa33a6641599fce7c7112d05dd7fb5d..464d6e35970b42319934d74a1f41076c
}
public boolean drownedRidable = false;
-@@ -641,73 +737,135 @@ public class PurpurWorldConfig {
+@@ -653,73 +749,135 @@ public class PurpurWorldConfig {
public boolean drownedJockeyOnlyBaby = true;
public double drownedJockeyChance = 0.05D;
public boolean drownedJockeyTryExistingChickens = true;
@@ -1752,7 +1752,7 @@ index 7ddb0119baa33a6641599fce7c7112d05dd7fb5d..464d6e35970b42319934d74a1f41076c
}
public boolean giantRidable = false;
-@@ -730,31 +888,68 @@ public class PurpurWorldConfig {
+@@ -742,31 +900,68 @@ public class PurpurWorldConfig {
giantHaveHostileAI = getBoolean("mobs.giant.have-hostile-ai", giantHaveHostileAI);
if (PurpurConfig.version < 8) {
double oldValue = getDouble("mobs.giant.max-health", giantMaxHealth);
@@ -1823,7 +1823,7 @@ index 7ddb0119baa33a6641599fce7c7112d05dd7fb5d..464d6e35970b42319934d74a1f41076c
}
public boolean huskRidable = false;
-@@ -762,12 +957,21 @@ public class PurpurWorldConfig {
+@@ -774,12 +969,21 @@ public class PurpurWorldConfig {
public boolean huskJockeyOnlyBaby = true;
public double huskJockeyChance = 0.05D;
public boolean huskJockeyTryExistingChickens = true;
@@ -1845,7 +1845,7 @@ index 7ddb0119baa33a6641599fce7c7112d05dd7fb5d..464d6e35970b42319934d74a1f41076c
}
public boolean illusionerRidable = false;
-@@ -782,85 +986,188 @@ public class PurpurWorldConfig {
+@@ -794,85 +998,188 @@ public class PurpurWorldConfig {
illusionerFollowRange = getDouble("mobs.illusioner.follow-range", illusionerFollowRange);
if (PurpurConfig.version < 8) {
double oldValue = getDouble("mobs.illusioner.max-health", illusionerMaxHealth);
@@ -2036,7 +2036,7 @@ index 7ddb0119baa33a6641599fce7c7112d05dd7fb5d..464d6e35970b42319934d74a1f41076c
}
public boolean phantomRidable = false;
-@@ -887,6 +1194,7 @@ public class PurpurWorldConfig {
+@@ -899,6 +1206,7 @@ public class PurpurWorldConfig {
public boolean phantomIgnorePlayersWithTorch = false;
public boolean phantomBurnInDaylight = true;
public boolean phantomAllowGriefing = false;
@@ -2044,7 +2044,7 @@ index 7ddb0119baa33a6641599fce7c7112d05dd7fb5d..464d6e35970b42319934d74a1f41076c
private void phantomSettings() {
phantomRidable = getBoolean("mobs.phantom.ridable", phantomRidable);
phantomRidableInWater = getBoolean("mobs.phantom.ridable-in-water", phantomRidableInWater);
-@@ -912,38 +1220,72 @@ public class PurpurWorldConfig {
+@@ -924,38 +1232,72 @@ public class PurpurWorldConfig {
phantomBurnInDaylight = getBoolean("mobs.phantom.burn-in-daylight", phantomBurnInDaylight);
phantomIgnorePlayersWithTorch = getBoolean("mobs.phantom.ignore-players-with-torch", phantomIgnorePlayersWithTorch);
phantomAllowGriefing = getBoolean("mobs.phantom.allow-griefing", phantomAllowGriefing);
@@ -2117,7 +2117,7 @@ index 7ddb0119baa33a6641599fce7c7112d05dd7fb5d..464d6e35970b42319934d74a1f41076c
}
public boolean polarBearRidable = false;
-@@ -951,6 +1293,7 @@ public class PurpurWorldConfig {
+@@ -963,6 +1305,7 @@ public class PurpurWorldConfig {
public String polarBearBreedableItemString = "";
public Item polarBearBreedableItem = null;
public int polarBearBreedingTicks = 6000;
@@ -2125,7 +2125,7 @@ index 7ddb0119baa33a6641599fce7c7112d05dd7fb5d..464d6e35970b42319934d74a1f41076c
private void polarBearSettings() {
polarBearRidable = getBoolean("mobs.polar_bear.ridable", polarBearRidable);
polarBearRidableInWater = getBoolean("mobs.polar_bear.ridable-in-water", polarBearRidableInWater);
-@@ -958,11 +1301,24 @@ public class PurpurWorldConfig {
+@@ -970,11 +1313,24 @@ public class PurpurWorldConfig {
Item item = IRegistry.ITEM.get(new MinecraftKey(polarBearBreedableItemString));
if (item != Items.AIR) polarBearBreedableItem = item;
polarBearBreedingTicks = getInt("mobs.polar_bear.breeding-delay-ticks", polarBearBreedingTicks);
@@ -2150,7 +2150,7 @@ index 7ddb0119baa33a6641599fce7c7112d05dd7fb5d..464d6e35970b42319934d74a1f41076c
}
public boolean rabbitRidable = false;
-@@ -970,68 +1326,144 @@ public class PurpurWorldConfig {
+@@ -982,68 +1338,144 @@ public class PurpurWorldConfig {
public double rabbitNaturalToast = 0.0D;
public double rabbitNaturalKiller = 0.0D;
public int rabbitBreedingTicks = 6000;
@@ -2295,7 +2295,7 @@ index 7ddb0119baa33a6641599fce7c7112d05dd7fb5d..464d6e35970b42319934d74a1f41076c
}
public boolean snowGolemRidable = false;
-@@ -1043,6 +1475,7 @@ public class PurpurWorldConfig {
+@@ -1055,6 +1487,7 @@ public class PurpurWorldConfig {
public int snowGolemSnowBallMax = 20;
public float snowGolemSnowBallModifier = 10.0F;
public double snowGolemAttackDistance = 1.25D;
@@ -2303,7 +2303,7 @@ index 7ddb0119baa33a6641599fce7c7112d05dd7fb5d..464d6e35970b42319934d74a1f41076c
private void snowGolemSettings() {
snowGolemRidable = getBoolean("mobs.snow_golem.ridable", snowGolemRidable);
snowGolemRidableInWater = getBoolean("mobs.snow_golem.ridable-in-water", snowGolemRidableInWater);
-@@ -1053,63 +1486,118 @@ public class PurpurWorldConfig {
+@@ -1065,63 +1498,118 @@ public class PurpurWorldConfig {
snowGolemSnowBallMax = getInt("mobs.snow_golem.max-shoot-interval-ticks", snowGolemSnowBallMax);
snowGolemSnowBallModifier = (float) getDouble("mobs.snow_golem.snow-ball-modifier", snowGolemSnowBallModifier);
snowGolemAttackDistance = getDouble("mobs.snow_golem.attack-distance", snowGolemAttackDistance);
@@ -2422,7 +2422,7 @@ index 7ddb0119baa33a6641599fce7c7112d05dd7fb5d..464d6e35970b42319934d74a1f41076c
}
public boolean villagerRidable = false;
-@@ -1127,6 +1615,7 @@ public class PurpurWorldConfig {
+@@ -1139,6 +1627,7 @@ public class PurpurWorldConfig {
public int villagerLobotomizeCheck = 60;
public boolean villagerClericsFarmWarts = false;
public boolean villagerClericFarmersThrowWarts = true;
@@ -2430,7 +2430,7 @@ index 7ddb0119baa33a6641599fce7c7112d05dd7fb5d..464d6e35970b42319934d74a1f41076c
private void villagerSettings() {
villagerRidable = getBoolean("mobs.villager.ridable", villagerRidable);
villagerRidableInWater = getBoolean("mobs.villager.ridable-in-water", villagerRidableInWater);
-@@ -1148,33 +1637,60 @@ public class PurpurWorldConfig {
+@@ -1160,33 +1649,60 @@ public class PurpurWorldConfig {
villagerLobotomizeCheck = getInt("mobs.villager.lobotomize.check-interval", villagerLobotomizeCheck);
villagerClericsFarmWarts = getBoolean("mobs.villager.clerics-farm-warts", villagerClericsFarmWarts);
villagerClericFarmersThrowWarts = getBoolean("mobs.villager.cleric-wart-farmers-throw-warts-at-villagers", villagerClericFarmersThrowWarts);
@@ -2491,7 +2491,7 @@ index 7ddb0119baa33a6641599fce7c7112d05dd7fb5d..464d6e35970b42319934d74a1f41076c
}
public boolean witherRidable = false;
-@@ -1191,19 +1707,30 @@ public class PurpurWorldConfig {
+@@ -1203,19 +1719,30 @@ public class PurpurWorldConfig {
witherHealthRegenDelay = getInt("mobs.wither.health-regen-delay", witherHealthRegenDelay);
if (PurpurConfig.version < 8) {
double oldValue = getDouble("mobs.wither.max-health", witherMaxHealth);
@@ -2524,7 +2524,7 @@ index 7ddb0119baa33a6641599fce7c7112d05dd7fb5d..464d6e35970b42319934d74a1f41076c
}
public boolean wolfRidable = false;
-@@ -1212,6 +1739,7 @@ public class PurpurWorldConfig {
+@@ -1224,6 +1751,7 @@ public class PurpurWorldConfig {
public boolean wolfMilkCuresRabies = true;
public double wolfNaturalRabid = 0.0D;
public int wolfBreedingTicks = 6000;
@@ -2532,7 +2532,7 @@ index 7ddb0119baa33a6641599fce7c7112d05dd7fb5d..464d6e35970b42319934d74a1f41076c
private void wolfSettings() {
wolfRidable = getBoolean("mobs.wolf.ridable", wolfRidable);
wolfRidableInWater = getBoolean("mobs.wolf.ridable-in-water", wolfRidableInWater);
-@@ -1223,13 +1751,26 @@ public class PurpurWorldConfig {
+@@ -1235,13 +1763,26 @@ public class PurpurWorldConfig {
wolfMilkCuresRabies = getBoolean("mobs.wolf.milk-cures-rabid-wolves", wolfMilkCuresRabies);
wolfNaturalRabid = getDouble("mobs.wolf.spawn-rabid-chance", wolfNaturalRabid);
wolfBreedingTicks = getInt("mobs.wolf.breeding-delay-ticks", wolfBreedingTicks);
@@ -2559,7 +2559,7 @@ index 7ddb0119baa33a6641599fce7c7112d05dd7fb5d..464d6e35970b42319934d74a1f41076c
}
public boolean zombieRidable = false;
-@@ -1239,6 +1780,8 @@ public class PurpurWorldConfig {
+@@ -1251,6 +1792,8 @@ public class PurpurWorldConfig {
public boolean zombieJockeyTryExistingChickens = true;
public boolean zombieAggressiveTowardsVillagerWhenLagging = true;
public EnumDifficulty zombieBreakDoorMinDifficulty = EnumDifficulty.HARD;
@@ -2568,7 +2568,7 @@ index 7ddb0119baa33a6641599fce7c7112d05dd7fb5d..464d6e35970b42319934d74a1f41076c
private void zombieSettings() {
zombieRidable = getBoolean("mobs.zombie.ridable", zombieRidable);
zombieRidableInWater = getBoolean("mobs.zombie.ridable-in-water", zombieRidableInWater);
-@@ -1251,15 +1794,40 @@ public class PurpurWorldConfig {
+@@ -1263,15 +1806,40 @@ public class PurpurWorldConfig {
} catch (IllegalArgumentException ignore) {
zombieBreakDoorMinDifficulty = EnumDifficulty.HARD;
}
@@ -2609,7 +2609,7 @@ index 7ddb0119baa33a6641599fce7c7112d05dd7fb5d..464d6e35970b42319934d74a1f41076c
}
public boolean zombifiedPiglinRidable = false;
-@@ -1268,6 +1836,8 @@ public class PurpurWorldConfig {
+@@ -1280,6 +1848,8 @@ public class PurpurWorldConfig {
public double zombifiedPiglinJockeyChance = 0.05D;
public boolean zombifiedPiglinJockeyTryExistingChickens = true;
public boolean zombifiedPiglinCountAsPlayerKillWhenAngry = true;
@@ -2618,7 +2618,7 @@ index 7ddb0119baa33a6641599fce7c7112d05dd7fb5d..464d6e35970b42319934d74a1f41076c
private void zombifiedPiglinSettings() {
zombifiedPiglinRidable = getBoolean("mobs.zombified_piglin.ridable", zombifiedPiglinRidable);
zombifiedPiglinRidableInWater = getBoolean("mobs.zombified_piglin.ridable-in-water", zombifiedPiglinRidableInWater);
-@@ -1275,6 +1845,13 @@ public class PurpurWorldConfig {
+@@ -1287,6 +1857,13 @@ public class PurpurWorldConfig {
zombifiedPiglinJockeyChance = getDouble("mobs.zombified_piglin.jockey.chance", zombifiedPiglinJockeyChance);
zombifiedPiglinJockeyTryExistingChickens = getBoolean("mobs.zombified_piglin.jockey.try-existing-chickens", zombifiedPiglinJockeyTryExistingChickens);
zombifiedPiglinCountAsPlayerKillWhenAngry = getBoolean("mobs.zombified_piglin.count-as-player-kill-when-angry", zombifiedPiglinCountAsPlayerKillWhenAngry);
@@ -2632,7 +2632,7 @@ index 7ddb0119baa33a6641599fce7c7112d05dd7fb5d..464d6e35970b42319934d74a1f41076c
}
public boolean zombieVillagerRidable = false;
-@@ -1282,11 +1859,20 @@ public class PurpurWorldConfig {
+@@ -1294,11 +1871,20 @@ public class PurpurWorldConfig {
public boolean zombieVillagerJockeyOnlyBaby = true;
public double zombieVillagerJockeyChance = 0.05D;
public boolean zombieVillagerJockeyTryExistingChickens = true;
diff --git a/patches/server/0152-Phantom-flames-on-swoop.patch b/patches/server/0151-Phantom-flames-on-swoop.patch
similarity index 87%
rename from patches/server/0152-Phantom-flames-on-swoop.patch
rename to patches/server/0151-Phantom-flames-on-swoop.patch
index 3e2e1cd1fb..2da268d8ba 100644
--- a/patches/server/0152-Phantom-flames-on-swoop.patch
+++ b/patches/server/0151-Phantom-flames-on-swoop.patch
@@ -5,7 +5,7 @@ Subject: [PATCH] Phantom flames on swoop
diff --git a/src/main/java/net/minecraft/world/entity/monster/EntityPhantom.java b/src/main/java/net/minecraft/world/entity/monster/EntityPhantom.java
-index 902b26d609aef8dd46e8875cb7c06f187511e8d5..4f3d4f2596c69881f0653bddcc3bf2b9ede3ca8f 100644
+index 11e45bfa1086f56cdbd87e3ced194ee82f36d142..0e78d383347fa15a008bde543b08c707bb5bd54a 100644
--- a/src/main/java/net/minecraft/world/entity/monster/EntityPhantom.java
+++ b/src/main/java/net/minecraft/world/entity/monster/EntityPhantom.java
@@ -226,6 +226,7 @@ public class EntityPhantom extends EntityFlying implements IMonster {
@@ -17,10 +17,10 @@ index 902b26d609aef8dd46e8875cb7c06f187511e8d5..4f3d4f2596c69881f0653bddcc3bf2b9
@Override
diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-index 464d6e35970b42319934d74a1f41076cf4f8b784..8484e197272327722b6f20c23f92af44525311df 100644
+index f0f8165c51c17855d0c719d47bea194b80ff7847..c84a331c157ea1180813cba1107bf901a35b2833 100644
--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-@@ -1194,6 +1194,7 @@ public class PurpurWorldConfig {
+@@ -1206,6 +1206,7 @@ public class PurpurWorldConfig {
public boolean phantomIgnorePlayersWithTorch = false;
public boolean phantomBurnInDaylight = true;
public boolean phantomAllowGriefing = false;
@@ -28,7 +28,7 @@ index 464d6e35970b42319934d74a1f41076cf4f8b784..8484e197272327722b6f20c23f92af44
public double phantomMaxHealth = 20.0D;
private void phantomSettings() {
phantomRidable = getBoolean("mobs.phantom.ridable", phantomRidable);
-@@ -1220,6 +1221,7 @@ public class PurpurWorldConfig {
+@@ -1232,6 +1233,7 @@ public class PurpurWorldConfig {
phantomBurnInDaylight = getBoolean("mobs.phantom.burn-in-daylight", phantomBurnInDaylight);
phantomIgnorePlayersWithTorch = getBoolean("mobs.phantom.ignore-players-with-torch", phantomIgnorePlayersWithTorch);
phantomAllowGriefing = getBoolean("mobs.phantom.allow-griefing", phantomAllowGriefing);
diff --git a/patches/server/0153-Option-for-chests-to-open-even-with-a-solid-block-on.patch b/patches/server/0152-Option-for-chests-to-open-even-with-a-solid-block-on.patch
similarity index 91%
rename from patches/server/0153-Option-for-chests-to-open-even-with-a-solid-block-on.patch
rename to patches/server/0152-Option-for-chests-to-open-even-with-a-solid-block-on.patch
index a8432a8053..3f720b22d0 100644
--- a/patches/server/0153-Option-for-chests-to-open-even-with-a-solid-block-on.patch
+++ b/patches/server/0152-Option-for-chests-to-open-even-with-a-solid-block-on.patch
@@ -17,10 +17,10 @@ index a45ee959f41e7f349ff2c309f21fa44ec671cb87..cddf8e3d34385eb264cd28ba6b4392d6
return iblockaccess.getType(blockposition1).isOccluding(iblockaccess, blockposition1);
diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-index 8484e197272327722b6f20c23f92af44525311df..62cdf46803a178de52150d3180d2db7bc1e5e84f 100644
+index c84a331c157ea1180813cba1107bf901a35b2833..3d1cfd550b12c8dd4bd536c518ac169ff6bbfe50 100644
--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-@@ -427,6 +427,11 @@ public class PurpurWorldConfig {
+@@ -439,6 +439,11 @@ public class PurpurWorldConfig {
}
}
diff --git a/patches/server/0154-Implement-TPSBar.patch b/patches/server/0153-Implement-TPSBar.patch
similarity index 93%
rename from patches/server/0154-Implement-TPSBar.patch
rename to patches/server/0153-Implement-TPSBar.patch
index 6094ad5bec..8514179557 100644
--- a/patches/server/0154-Implement-TPSBar.patch
+++ b/patches/server/0153-Implement-TPSBar.patch
@@ -5,7 +5,7 @@ Subject: [PATCH] Implement TPSBar
diff --git a/src/main/java/net/minecraft/commands/CommandDispatcher.java b/src/main/java/net/minecraft/commands/CommandDispatcher.java
-index 0982b14a4b39c40a68ee900d506b4e44f840299d..324f475513eecab4242b8900084d7f088bd0e10b 100644
+index 2f5e8ed345ace0d9abb7edebe1fd47e562b1d272..ce95a7d9c967d723bad468bd00a5c0a6b887aa33 100644
--- a/src/main/java/net/minecraft/commands/CommandDispatcher.java
+++ b/src/main/java/net/minecraft/commands/CommandDispatcher.java
@@ -193,6 +193,7 @@ public class CommandDispatcher {
@@ -17,10 +17,10 @@ index 0982b14a4b39c40a68ee900d506b4e44f840299d..324f475513eecab4242b8900084d7f08
if (commanddispatcher_servertype.d) {
diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java
-index 4ceaa8e905c9ba7277ee00cea020d01d14ae2178..137c52999666ea331ac52c230f0674d489a95524 100644
+index e3c3b2eb03ad132a91140cb459fd8f378154ee2e..176fc4c8b7c5ef45b29cb8aaa1b1ff16dbfc9b7c 100644
--- a/src/main/java/net/minecraft/server/MinecraftServer.java
+++ b/src/main/java/net/minecraft/server/MinecraftServer.java
-@@ -989,6 +989,7 @@ public abstract class MinecraftServer extends IAsyncTaskHandlerReentrant 100) {
PlayerConnection.LOGGER.warn(this.player.getName() + " tried to send a book with too many pages");
@@ -16,7 +16,7 @@ index 07541f23ee853dae137440129e600d345774cd90..5a2f84cd1456b072084e2db53a24c986
minecraftServer.scheduleOnMain(() -> this.disconnect("Book too large!"));
return;
}
-@@ -1135,6 +1136,7 @@ public class PlayerConnection implements PacketListenerPlayIn {
+@@ -1140,6 +1141,7 @@ public class PlayerConnection implements PacketListenerPlayIn {
int byteLength = testString.getBytes(java.nio.charset.StandardCharsets.UTF_8).length;
if (byteLength > 256 * 4) {
PlayerConnection.LOGGER.warn(this.player.getName() + " tried to send a book with with a page too large!");
@@ -24,7 +24,7 @@ index 07541f23ee853dae137440129e600d345774cd90..5a2f84cd1456b072084e2db53a24c986
minecraftServer.scheduleOnMain(() -> this.disconnect("Book too large!"));
return;
}
-@@ -1158,6 +1160,7 @@ public class PlayerConnection implements PacketListenerPlayIn {
+@@ -1163,6 +1165,7 @@ public class PlayerConnection implements PacketListenerPlayIn {
if (byteTotal > byteAllowed) {
PlayerConnection.LOGGER.warn(this.player.getName() + " tried to send too large of a book. Book Size: " + byteTotal + " - Allowed: "+ byteAllowed + " - Pages: " + pageList.size());
diff --git a/patches/server/0157-Full-netherite-armor-grants-fire-resistance.patch b/patches/server/0156-Full-netherite-armor-grants-fire-resistance.patch
similarity index 91%
rename from patches/server/0157-Full-netherite-armor-grants-fire-resistance.patch
rename to patches/server/0156-Full-netherite-armor-grants-fire-resistance.patch
index 2b19153394..8fba6eb366 100644
--- a/patches/server/0157-Full-netherite-armor-grants-fire-resistance.patch
+++ b/patches/server/0156-Full-netherite-armor-grants-fire-resistance.patch
@@ -5,10 +5,10 @@ Subject: [PATCH] Full netherite armor grants fire resistance
diff --git a/src/main/java/net/minecraft/world/entity/player/EntityHuman.java b/src/main/java/net/minecraft/world/entity/player/EntityHuman.java
-index af10d5aea7909ee9f38982264233f0a45c153003..5a2678cf3a8441344629b6a0bf4b6be538baae4f 100644
+index 78442fe87ceaf65b302536c893610aa0269b6dee..663dfa707dd948df2f25dab287fa4a0580070b75 100644
--- a/src/main/java/net/minecraft/world/entity/player/EntityHuman.java
+++ b/src/main/java/net/minecraft/world/entity/player/EntityHuman.java
-@@ -341,6 +341,16 @@ public abstract class EntityHuman extends EntityLiving {
+@@ -340,6 +340,16 @@ public abstract class EntityHuman extends EntityLiving {
this.addEffect(new MobEffect(MobEffects.WATER_BREATHING, 200, 0, false, false, true), org.bukkit.event.entity.EntityPotionEffectEvent.Cause.TURTLE_HELMET); // CraftBukkit
}
@@ -26,10 +26,10 @@ index af10d5aea7909ee9f38982264233f0a45c153003..5a2678cf3a8441344629b6a0bf4b6be5
protected ItemCooldown i() {
diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-index c9faf726d5f64142946438966b887655e75759af..2d9d963773b1df9a5d7520a5c295d40ebf56761f 100644
+index 130dc441be74963c272381e992ea39883804f9f7..318513f5612a694c2b240840b24a39210457c202 100644
--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-@@ -344,6 +344,19 @@ public class PurpurWorldConfig {
+@@ -356,6 +356,19 @@ public class PurpurWorldConfig {
playerDeathExpDropMax = getInt("gameplay-mechanics.player.exp-dropped-on-death.maximum", playerDeathExpDropMax);
}
diff --git a/patches/server/0158-Fix-rotating-UP-DOWN-CW-and-CCW.patch b/patches/server/0157-Fix-rotating-UP-DOWN-CW-and-CCW.patch
similarity index 100%
rename from patches/server/0158-Fix-rotating-UP-DOWN-CW-and-CCW.patch
rename to patches/server/0157-Fix-rotating-UP-DOWN-CW-and-CCW.patch
diff --git a/patches/server/0159-Add-MC-4-fix-back.patch b/patches/server/0158-Add-MC-4-fix-back.patch
similarity index 86%
rename from patches/server/0159-Add-MC-4-fix-back.patch
rename to patches/server/0158-Add-MC-4-fix-back.patch
index c3d1fe8bf4..6651ddd114 100644
--- a/patches/server/0159-Add-MC-4-fix-back.patch
+++ b/patches/server/0158-Add-MC-4-fix-back.patch
@@ -5,10 +5,10 @@ Subject: [PATCH] Add MC-4 fix back
diff --git a/src/main/java/net/minecraft/world/entity/item/EntityItem.java b/src/main/java/net/minecraft/world/entity/item/EntityItem.java
-index 3b84039a76843a0784e2d71bb66dc322450c2cab..8640472dba341285a37edb086e1bea387204fd04 100644
+index 92cd61cd6b085a03c502223f3861540d8c9f27e1..51663e58def93cc38157a99069db86603faf4c0a 100644
--- a/src/main/java/net/minecraft/world/entity/item/EntityItem.java
+++ b/src/main/java/net/minecraft/world/entity/item/EntityItem.java
-@@ -571,7 +571,7 @@ public class EntityItem extends Entity {
+@@ -575,7 +575,7 @@ public class EntityItem extends Entity {
// Paper start - fix MC-4
public void setPositionRaw(double x, double y, double z) {
diff --git a/patches/server/0160-Add-mobGriefing-bypass-to-everything-affected.patch b/patches/server/0159-Add-mobGriefing-bypass-to-everything-affected.patch
similarity index 94%
rename from patches/server/0160-Add-mobGriefing-bypass-to-everything-affected.patch
rename to patches/server/0159-Add-mobGriefing-bypass-to-everything-affected.patch
index 63a6c0fef2..f1ec5ef442 100644
--- a/patches/server/0160-Add-mobGriefing-bypass-to-everything-affected.patch
+++ b/patches/server/0159-Add-mobGriefing-bypass-to-everything-affected.patch
@@ -6,7 +6,7 @@ Subject: [PATCH] Add mobGriefing bypass to everything affected
This adds the "bypass-mob-griefing" world config option to everything that is affected by the gamerule.
diff --git a/src/main/java/net/minecraft/world/entity/EntityLiving.java b/src/main/java/net/minecraft/world/entity/EntityLiving.java
-index f0a485056f3ad94e7375fbdfd512026b969a0eed..e866531958c9d0171d39ba7f6963fe92eb2d42cc 100644
+index a090f563d7019615c055847ce0c2b0f2a343d70b..6447830095d02af5535fcf1f154b8c5260b90d33 100644
--- a/src/main/java/net/minecraft/world/entity/EntityLiving.java
+++ b/src/main/java/net/minecraft/world/entity/EntityLiving.java
@@ -1571,7 +1571,7 @@ public abstract class EntityLiving extends Entity {
@@ -76,10 +76,10 @@ index 61a62c093b24c43064f116630d85096159e082d3..2519a78f7e5dd759680a1f47a1047885
} else if (this.c > 0) {
--this.c;
diff --git a/src/main/java/net/minecraft/world/entity/animal/EntityFox.java b/src/main/java/net/minecraft/world/entity/animal/EntityFox.java
-index b8b0ee65798dc94d707fa64bd53fdda5506331d9..355735c2efbba62481d059b8e733c9c70e834be1 100644
+index 5a2e624f1b6636f058cc69989324914f174a271a..03fee11004b27402ec9da39c617c226175242bb4 100644
--- a/src/main/java/net/minecraft/world/entity/animal/EntityFox.java
+++ b/src/main/java/net/minecraft/world/entity/animal/EntityFox.java
-@@ -1075,7 +1075,7 @@ public class EntityFox extends EntityAnimal {
+@@ -1073,7 +1073,7 @@ public class EntityFox extends EntityAnimal {
}
protected void n() {
@@ -89,10 +89,10 @@ index b8b0ee65798dc94d707fa64bd53fdda5506331d9..355735c2efbba62481d059b8e733c9c7
if (iblockdata.a(Blocks.SWEET_BERRY_BUSH)) {
diff --git a/src/main/java/net/minecraft/world/entity/animal/EntityRabbit.java b/src/main/java/net/minecraft/world/entity/animal/EntityRabbit.java
-index 284c52276b2fd816990c23b7b8a9ee50e70ab005..acb4c79b23fada090c5605cd352a573bdb0667bf 100644
+index ef031ac08b06e78d8826579c49cf5e43683318f9..a5be1a9d4e6f08f23215b49a30c1121167cc7a89 100644
--- a/src/main/java/net/minecraft/world/entity/animal/EntityRabbit.java
+++ b/src/main/java/net/minecraft/world/entity/animal/EntityRabbit.java
-@@ -518,7 +518,7 @@ public class EntityRabbit extends EntityAnimal {
+@@ -517,7 +517,7 @@ public class EntityRabbit extends EntityAnimal {
@Override
public boolean a() {
if (this.c <= 0) {
@@ -102,7 +102,7 @@ index 284c52276b2fd816990c23b7b8a9ee50e70ab005..acb4c79b23fada090c5605cd352a573b
}
diff --git a/src/main/java/net/minecraft/world/entity/animal/EntitySnowman.java b/src/main/java/net/minecraft/world/entity/animal/EntitySnowman.java
-index 88db8ff8cb415b84ab98cc0550c705d5a472230c..17f27d2bf5be746a0fa0e1e0fecab8158b2b3587 100644
+index 3934966b06eb9880ed316cee84d099edd80c09b9..b13cd3f344a0e2c4c02b30f80ca9a81d93cc1954 100644
--- a/src/main/java/net/minecraft/world/entity/animal/EntitySnowman.java
+++ b/src/main/java/net/minecraft/world/entity/animal/EntitySnowman.java
@@ -123,7 +123,7 @@ public class EntitySnowman extends EntityGolem implements IShearable, IRangedEnt
@@ -115,7 +115,7 @@ index 88db8ff8cb415b84ab98cc0550c705d5a472230c..17f27d2bf5be746a0fa0e1e0fecab815
}
diff --git a/src/main/java/net/minecraft/world/entity/boss/enderdragon/EntityEnderDragon.java b/src/main/java/net/minecraft/world/entity/boss/enderdragon/EntityEnderDragon.java
-index 999a6d17eccd6305c0063e1558abfe70d72c39fe..a81d782877ff6116477792fa4cec0846e56ed384 100644
+index aeff46b575a05145fb509b5e5a489b2067776e2f..0614483830336f3bbd348319ca3eed8767568852 100644
--- a/src/main/java/net/minecraft/world/entity/boss/enderdragon/EntityEnderDragon.java
+++ b/src/main/java/net/minecraft/world/entity/boss/enderdragon/EntityEnderDragon.java
@@ -539,7 +539,7 @@ public class EntityEnderDragon extends EntityInsentient implements IMonster {
@@ -128,10 +128,10 @@ index 999a6d17eccd6305c0063e1558abfe70d72c39fe..a81d782877ff6116477792fa4cec0846
// flag1 = this.world.a(blockposition, false) || flag1;
flag1 = true;
diff --git a/src/main/java/net/minecraft/world/entity/boss/wither/EntityWither.java b/src/main/java/net/minecraft/world/entity/boss/wither/EntityWither.java
-index beb4d59faf4bd7501468b2eaa0e866613625e963..fa6b72c7a12b20f8ccffa360a3895e4d8f4277e4 100644
+index 34103234140d61a5dc1d3e9f575fb8a65cde956b..9a152b7cd351380e696640a51e5f8b64225f25f0 100644
--- a/src/main/java/net/minecraft/world/entity/boss/wither/EntityWither.java
+++ b/src/main/java/net/minecraft/world/entity/boss/wither/EntityWither.java
-@@ -380,7 +380,7 @@ public class EntityWither extends EntityMonster implements IRangedEntity {
+@@ -378,7 +378,7 @@ public class EntityWither extends EntityMonster implements IRangedEntity {
if (this.getInvul() > 0) {
i = this.getInvul() - 1;
if (i <= 0) {
@@ -140,7 +140,7 @@ index beb4d59faf4bd7501468b2eaa0e866613625e963..fa6b72c7a12b20f8ccffa360a3895e4d
// CraftBukkit start
// this.world.createExplosion(this, this.locX(), this.getHeadY(), this.locZ(), 7.0F, false, explosion_effect);
ExplosionPrimeEvent event = new ExplosionPrimeEvent(this.getBukkitEntity(), 7.0F, false);
-@@ -492,7 +492,7 @@ public class EntityWither extends EntityMonster implements IRangedEntity {
+@@ -490,7 +490,7 @@ public class EntityWither extends EntityMonster implements IRangedEntity {
if (this.bw > 0) {
--this.bw;
@@ -150,7 +150,7 @@ index beb4d59faf4bd7501468b2eaa0e866613625e963..fa6b72c7a12b20f8ccffa360a3895e4d
j = MathHelper.floor(this.locX());
int j1 = MathHelper.floor(this.locZ());
diff --git a/src/main/java/net/minecraft/world/entity/monster/EntityEnderman.java b/src/main/java/net/minecraft/world/entity/monster/EntityEnderman.java
-index 478ac5bfdc69b5c3e24906bb5e0ea1dff81cea98..ea500a6080f73dcc35d83a3b5a170f57dedaa431 100644
+index a1cc0b414479e693de9428412ba837fd9bf57751..d8c568d821b859bac0a9839c42c9596cf964b16e 100644
--- a/src/main/java/net/minecraft/world/entity/monster/EntityEnderman.java
+++ b/src/main/java/net/minecraft/world/entity/monster/EntityEnderman.java
@@ -455,7 +455,7 @@ public class EntityEnderman extends EntityMonster implements IEntityAngerable {
@@ -185,10 +185,10 @@ index 8d7b8d2ac9a7340e2cfd0d1b8963e4e4d97e8bc8..8a219ac18307c715913f5c2a80b1ff35
} else {
List list = EntityEvoker.this.world.a(EntitySheep.class, this.e, EntityEvoker.this, EntityEvoker.this.getBoundingBox().grow(16.0D, 4.0D, 16.0D));
diff --git a/src/main/java/net/minecraft/world/entity/monster/EntityRavager.java b/src/main/java/net/minecraft/world/entity/monster/EntityRavager.java
-index 80c3cd540a46e249e85586e8d7a2f0f6226091fc..6809c93fe435d183a27204fb4460fd68a86aa04f 100644
+index 7e3b59e2302a27f7b8a3f43b75527199722a896f..16da85620c067b005ce029c8b9c5ea1642a794f0 100644
--- a/src/main/java/net/minecraft/world/entity/monster/EntityRavager.java
+++ b/src/main/java/net/minecraft/world/entity/monster/EntityRavager.java
-@@ -179,7 +179,7 @@ public class EntityRavager extends EntityRaider {
+@@ -178,7 +178,7 @@ public class EntityRavager extends EntityRaider {
this.getAttributeInstance(GenericAttributes.MOVEMENT_SPEED).setValue(MathHelper.d(0.1D, d1, d0));
}
@@ -338,10 +338,10 @@ index 04504901b1933ed760b34b8abb994de8ec340a4e..e18be05c9a9230105ec54395d4391c86
return true;
// Purpur end
diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-index 2d9d963773b1df9a5d7520a5c295d40ebf56761f..751558a0a3fcb0433d7b580e5618755bdb277292 100644
+index 318513f5612a694c2b240840b24a39210457c202..6943af6037c1b8832c2fa652b92b9a2badf8bac5 100644
--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-@@ -286,6 +286,7 @@ public class PurpurWorldConfig {
+@@ -296,6 +296,7 @@ public class PurpurWorldConfig {
public boolean disableDropsOnCrammingDeath = false;
public boolean entitiesPickUpLootBypassMobGriefing = false;
public boolean entitiesCanUsePortals = true;
@@ -349,7 +349,7 @@ index 2d9d963773b1df9a5d7520a5c295d40ebf56761f..751558a0a3fcb0433d7b580e5618755b
public boolean milkCuresBadOmen = true;
public boolean persistentTileEntityDisplayNames = false;
public boolean persistentDroppableEntityDisplayNames = false;
-@@ -300,6 +301,7 @@ public class PurpurWorldConfig {
+@@ -311,6 +312,7 @@ public class PurpurWorldConfig {
disableDropsOnCrammingDeath = getBoolean("gameplay-mechanics.disable-drops-on-cramming-death", disableDropsOnCrammingDeath);
entitiesPickUpLootBypassMobGriefing = getBoolean("gameplay-mechanics.entities-pick-up-loot-bypass-mob-griefing", entitiesPickUpLootBypassMobGriefing);
entitiesCanUsePortals = getBoolean("gameplay-mechanics.entities-can-use-portals", entitiesCanUsePortals);
@@ -357,7 +357,7 @@ index 2d9d963773b1df9a5d7520a5c295d40ebf56761f..751558a0a3fcb0433d7b580e5618755b
milkCuresBadOmen = getBoolean("gameplay-mechanics.milk-cures-bad-omen", milkCuresBadOmen);
persistentTileEntityDisplayNames = getBoolean("gameplay-mechanics.persistent-tileentity-display-names-and-lore", persistentTileEntityDisplayNames);
persistentDroppableEntityDisplayNames = getBoolean("gameplay-mechanics.persistent-droppable-entity-display-names", persistentDroppableEntityDisplayNames);
-@@ -452,9 +454,11 @@ public class PurpurWorldConfig {
+@@ -464,9 +466,11 @@ public class PurpurWorldConfig {
dispenserPlaceAnvils = getBoolean("blocks.dispenser.place-anvils", dispenserPlaceAnvils);
}
@@ -369,7 +369,7 @@ index 2d9d963773b1df9a5d7520a5c295d40ebf56761f..751558a0a3fcb0433d7b580e5618755b
farmlandGetsMoistFromBelow = getBoolean("blocks.farmland.gets-moist-from-below", farmlandGetsMoistFromBelow);
farmlandAlpha = getBoolean("blocks.farmland.use-alpha-farmland", farmlandAlpha);
}
-@@ -513,10 +517,12 @@ public class PurpurWorldConfig {
+@@ -525,10 +529,12 @@ public class PurpurWorldConfig {
stonecutterDamage = (float) getDouble("blocks.stonecutter.damage", stonecutterDamage);
}
@@ -382,7 +382,7 @@ index 2d9d963773b1df9a5d7520a5c295d40ebf56761f..751558a0a3fcb0433d7b580e5618755b
turtleEggsBreakFromExpOrbs = getBoolean("blocks.turtle_egg.break-from-exp-orbs", turtleEggsBreakFromExpOrbs);
turtleEggsBreakFromItems = getBoolean("blocks.turtle_egg.break-from-items", turtleEggsBreakFromItems);
turtleEggsBreakFromMinecarts = getBoolean("blocks.turtle_egg.break-from-minecarts", turtleEggsBreakFromMinecarts);
-@@ -788,12 +794,14 @@ public class PurpurWorldConfig {
+@@ -800,12 +806,14 @@ public class PurpurWorldConfig {
public boolean enderDragonRidableInWater = false;
public double enderDragonMaxY = 256D;
public boolean enderDragonAlwaysDropsFullExp = false;
@@ -397,7 +397,7 @@ index 2d9d963773b1df9a5d7520a5c295d40ebf56761f..751558a0a3fcb0433d7b580e5618755b
if (PurpurConfig.version < 8) {
double oldValue = getDouble("mobs.ender_dragon.max-health", enderDragonMaxHealth);
set("mobs.ender_dragon.max-health", null);
-@@ -809,12 +817,14 @@ public class PurpurWorldConfig {
+@@ -821,12 +829,14 @@ public class PurpurWorldConfig {
public boolean endermanRidable = false;
public boolean endermanRidableInWater = false;
public boolean endermanAllowGriefing = true;
@@ -412,7 +412,7 @@ index 2d9d963773b1df9a5d7520a5c295d40ebf56761f..751558a0a3fcb0433d7b580e5618755b
endermanDespawnEvenWithBlock = getBoolean("mobs.enderman.can-despawn-with-held-block", endermanDespawnEvenWithBlock);
if (PurpurConfig.version < 10) {
double oldValue = getDouble("mobs.enderman.attributes.max-health", endermanMaxHealth);
-@@ -840,10 +850,12 @@ public class PurpurWorldConfig {
+@@ -852,10 +862,12 @@ public class PurpurWorldConfig {
public boolean evokerRidable = false;
public boolean evokerRidableInWater = false;
@@ -425,7 +425,7 @@ index 2d9d963773b1df9a5d7520a5c295d40ebf56761f..751558a0a3fcb0433d7b580e5618755b
if (PurpurConfig.version < 10) {
double oldValue = getDouble("mobs.evoker.attributes.max-health", evokerMaxHealth);
set("mobs.evoker.attributes.max-health", null);
-@@ -854,12 +866,14 @@ public class PurpurWorldConfig {
+@@ -866,12 +878,14 @@ public class PurpurWorldConfig {
public boolean foxRidable = false;
public boolean foxRidableInWater = false;
@@ -440,7 +440,7 @@ index 2d9d963773b1df9a5d7520a5c295d40ebf56761f..751558a0a3fcb0433d7b580e5618755b
foxTypeChangesWithTulips = getBoolean("mobs.fox.tulips-change-type", foxTypeChangesWithTulips);
foxBreedingTicks = getInt("mobs.fox.breeding-delay-ticks", foxBreedingTicks);
if (PurpurConfig.version < 10) {
-@@ -1296,10 +1310,12 @@ public class PurpurWorldConfig {
+@@ -1308,10 +1322,12 @@ public class PurpurWorldConfig {
public boolean pillagerRidable = false;
public boolean pillagerRidableInWater = false;
@@ -453,7 +453,7 @@ index 2d9d963773b1df9a5d7520a5c295d40ebf56761f..751558a0a3fcb0433d7b580e5618755b
if (PurpurConfig.version < 10) {
double oldValue = getDouble("mobs.pillager.attributes.max-health", pillagerMaxHealth);
set("mobs.pillager.attributes.max-health", null);
-@@ -1343,6 +1359,7 @@ public class PurpurWorldConfig {
+@@ -1355,6 +1371,7 @@ public class PurpurWorldConfig {
public boolean rabbitRidable = false;
public boolean rabbitRidableInWater = false;
@@ -461,7 +461,7 @@ index 2d9d963773b1df9a5d7520a5c295d40ebf56761f..751558a0a3fcb0433d7b580e5618755b
public double rabbitNaturalToast = 0.0D;
public double rabbitNaturalKiller = 0.0D;
public int rabbitBreedingTicks = 6000;
-@@ -1350,6 +1367,7 @@ public class PurpurWorldConfig {
+@@ -1362,6 +1379,7 @@ public class PurpurWorldConfig {
private void rabbitSettings() {
rabbitRidable = getBoolean("mobs.rabbit.ridable", rabbitRidable);
rabbitRidableInWater = getBoolean("mobs.rabbit.ridable-in-water", rabbitRidableInWater);
@@ -469,7 +469,7 @@ index 2d9d963773b1df9a5d7520a5c295d40ebf56761f..751558a0a3fcb0433d7b580e5618755b
rabbitNaturalToast = getDouble("mobs.rabbit.spawn-toast-chance", rabbitNaturalToast);
rabbitNaturalKiller = getDouble("mobs.rabbit.spawn-killer-rabbit-chance", rabbitNaturalKiller);
rabbitBreedingTicks = getInt("mobs.rabbit.breeding-delay-ticks", rabbitBreedingTicks);
-@@ -1363,10 +1381,12 @@ public class PurpurWorldConfig {
+@@ -1375,10 +1393,12 @@ public class PurpurWorldConfig {
public boolean ravagerRidable = false;
public boolean ravagerRidableInWater = false;
@@ -482,7 +482,7 @@ index 2d9d963773b1df9a5d7520a5c295d40ebf56761f..751558a0a3fcb0433d7b580e5618755b
if (PurpurConfig.version < 10) {
double oldValue = getDouble("mobs.ravager.attributes.max-health", ravagerMaxHealth);
set("mobs.ravager.attributes.max-health", null);
-@@ -1390,11 +1410,13 @@ public class PurpurWorldConfig {
+@@ -1402,11 +1422,13 @@ public class PurpurWorldConfig {
public boolean sheepRidable = false;
public boolean sheepRidableInWater = false;
public int sheepBreedingTicks = 6000;
@@ -496,7 +496,7 @@ index 2d9d963773b1df9a5d7520a5c295d40ebf56761f..751558a0a3fcb0433d7b580e5618755b
if (PurpurConfig.version < 10) {
double oldValue = getDouble("mobs.sheep.attributes.max-health", sheepMaxHealth);
set("mobs.sheep.attributes.max-health", null);
-@@ -1419,10 +1441,12 @@ public class PurpurWorldConfig {
+@@ -1431,10 +1453,12 @@ public class PurpurWorldConfig {
public boolean silverfishRidable = false;
public boolean silverfishRidableInWater = false;
@@ -509,7 +509,7 @@ index 2d9d963773b1df9a5d7520a5c295d40ebf56761f..751558a0a3fcb0433d7b580e5618755b
if (PurpurConfig.version < 10) {
double oldValue = getDouble("mobs.silverfish.attributes.max-health", silverfishMaxHealth);
set("mobs.silverfish.attributes.max-health", null);
-@@ -1489,6 +1513,7 @@ public class PurpurWorldConfig {
+@@ -1501,6 +1525,7 @@ public class PurpurWorldConfig {
public boolean snowGolemRidable = false;
public boolean snowGolemRidableInWater = false;
public boolean snowGolemLeaveTrailWhenRidden = false;
@@ -517,7 +517,7 @@ index 2d9d963773b1df9a5d7520a5c295d40ebf56761f..751558a0a3fcb0433d7b580e5618755b
public boolean snowGolemDropsPumpkin = true;
public boolean snowGolemPutPumpkinBack = false;
public int snowGolemSnowBallMin = 20;
-@@ -1500,6 +1525,7 @@ public class PurpurWorldConfig {
+@@ -1512,6 +1537,7 @@ public class PurpurWorldConfig {
snowGolemRidable = getBoolean("mobs.snow_golem.ridable", snowGolemRidable);
snowGolemRidableInWater = getBoolean("mobs.snow_golem.ridable-in-water", snowGolemRidableInWater);
snowGolemLeaveTrailWhenRidden = getBoolean("mobs.snow_golem.leave-trail-when-ridden", snowGolemLeaveTrailWhenRidden);
@@ -525,7 +525,7 @@ index 2d9d963773b1df9a5d7520a5c295d40ebf56761f..751558a0a3fcb0433d7b580e5618755b
snowGolemDropsPumpkin = getBoolean("mobs.snow_golem.drop-pumpkin-when-sheared", snowGolemDropsPumpkin);
snowGolemPutPumpkinBack = getBoolean("mobs.snow_golem.pumpkin-can-be-added-back", snowGolemPutPumpkinBack);
snowGolemSnowBallMin = getInt("mobs.snow_golem.min-shoot-interval-ticks", snowGolemSnowBallMin);
-@@ -1718,6 +1744,7 @@ public class PurpurWorldConfig {
+@@ -1730,6 +1756,7 @@ public class PurpurWorldConfig {
public boolean witherRidable = false;
public boolean witherRidableInWater = false;
public double witherMaxY = 256D;
@@ -533,7 +533,7 @@ index 2d9d963773b1df9a5d7520a5c295d40ebf56761f..751558a0a3fcb0433d7b580e5618755b
public float witherHealthRegenAmount = 1.0f;
public int witherHealthRegenDelay = 20;
public double witherMaxHealth = 300.0D;
-@@ -1725,6 +1752,7 @@ public class PurpurWorldConfig {
+@@ -1737,6 +1764,7 @@ public class PurpurWorldConfig {
witherRidable = getBoolean("mobs.wither.ridable", witherRidable);
witherRidableInWater = getBoolean("mobs.wither.ridable-in-water", witherRidableInWater);
witherMaxY = getDouble("mobs.wither.ridable-max-y", witherMaxY);
@@ -541,7 +541,7 @@ index 2d9d963773b1df9a5d7520a5c295d40ebf56761f..751558a0a3fcb0433d7b580e5618755b
witherHealthRegenAmount = (float) getDouble("mobs.wither.health-regen-amount", witherHealthRegenAmount);
witherHealthRegenDelay = getInt("mobs.wither.health-regen-delay", witherHealthRegenDelay);
if (PurpurConfig.version < 8) {
-@@ -1797,6 +1825,7 @@ public class PurpurWorldConfig {
+@@ -1809,6 +1837,7 @@ public class PurpurWorldConfig {
public boolean zombieRidable = false;
public boolean zombieRidableInWater = false;
@@ -549,7 +549,7 @@ index 2d9d963773b1df9a5d7520a5c295d40ebf56761f..751558a0a3fcb0433d7b580e5618755b
public boolean zombieJockeyOnlyBaby = true;
public double zombieJockeyChance = 0.05D;
public boolean zombieJockeyTryExistingChickens = true;
-@@ -1807,6 +1836,7 @@ public class PurpurWorldConfig {
+@@ -1819,6 +1848,7 @@ public class PurpurWorldConfig {
private void zombieSettings() {
zombieRidable = getBoolean("mobs.zombie.ridable", zombieRidable);
zombieRidableInWater = getBoolean("mobs.zombie.ridable-in-water", zombieRidableInWater);
diff --git a/patches/server/0161-Config-to-allow-Note-Block-sounds-when-blocked.patch b/patches/server/0160-Config-to-allow-Note-Block-sounds-when-blocked.patch
similarity index 93%
rename from patches/server/0161-Config-to-allow-Note-Block-sounds-when-blocked.patch
rename to patches/server/0160-Config-to-allow-Note-Block-sounds-when-blocked.patch
index 6bd91842c2..5f989a5327 100644
--- a/patches/server/0161-Config-to-allow-Note-Block-sounds-when-blocked.patch
+++ b/patches/server/0160-Config-to-allow-Note-Block-sounds-when-blocked.patch
@@ -22,10 +22,10 @@ index 148718f8f96d94e76a4a7a96d5955b624c2dc661..075987567cd4412c8f0fb4e31b786394
org.bukkit.event.block.NotePlayEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callNotePlayEvent(world, blockposition, data.get(BlockNote.INSTRUMENT), data.get(BlockNote.NOTE));
if (!event.isCancelled()) {
diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-index 751558a0a3fcb0433d7b580e5618755bdb277292..681e4d41aed335b62fb9aaa030f7fc119cfbfa88 100644
+index 6943af6037c1b8832c2fa652b92b9a2badf8bac5..a0df754d98e4be46720ba0962bdf7bf62f3425bb 100644
--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-@@ -288,6 +288,7 @@ public class PurpurWorldConfig {
+@@ -298,6 +298,7 @@ public class PurpurWorldConfig {
public boolean entitiesCanUsePortals = true;
public boolean fireballsBypassMobGriefing = false;
public boolean milkCuresBadOmen = true;
@@ -33,7 +33,7 @@ index 751558a0a3fcb0433d7b580e5618755bdb277292..681e4d41aed335b62fb9aaa030f7fc11
public boolean persistentTileEntityDisplayNames = false;
public boolean persistentDroppableEntityDisplayNames = false;
public double tridentLoyaltyVoidReturnHeight = 0.0D;
-@@ -303,6 +304,7 @@ public class PurpurWorldConfig {
+@@ -314,6 +315,7 @@ public class PurpurWorldConfig {
entitiesCanUsePortals = getBoolean("gameplay-mechanics.entities-can-use-portals", entitiesCanUsePortals);
fireballsBypassMobGriefing = getBoolean("gameplay-mechanics.fireballs-bypass-mob-griefing", fireballsBypassMobGriefing);
milkCuresBadOmen = getBoolean("gameplay-mechanics.milk-cures-bad-omen", milkCuresBadOmen);
diff --git a/patches/server/0162-Add-EntityTeleportHinderedEvent.patch b/patches/server/0161-Add-EntityTeleportHinderedEvent.patch
similarity index 95%
rename from patches/server/0162-Add-EntityTeleportHinderedEvent.patch
rename to patches/server/0161-Add-EntityTeleportHinderedEvent.patch
index a31f33df93..fcd808b33b 100644
--- a/patches/server/0162-Add-EntityTeleportHinderedEvent.patch
+++ b/patches/server/0161-Add-EntityTeleportHinderedEvent.patch
@@ -82,7 +82,7 @@ index d918194e45953764fa3fd286b715714330a60941..70496562faa89e92da34a4f7b891f845
if (this.exitPortal == null && this.world.getTypeKey() == DimensionManager.THE_END) { // CraftBukkit - work in alternate worlds
this.a((WorldServer) this.world);
diff --git a/src/main/java/net/minecraft/world/level/block/state/BlockBase.java b/src/main/java/net/minecraft/world/level/block/state/BlockBase.java
-index 23a3b1b317b6b3e9d812f5a7b09b099b0528c59e..4f40c6c3397596c81147fae4a6a51bfd517643d2 100644
+index df595dc52858807479584ce8da49390a25695990..0990eb8b2e2d8a5f7c1a2640727d86c37a50298e 100644
--- a/src/main/java/net/minecraft/world/level/block/state/BlockBase.java
+++ b/src/main/java/net/minecraft/world/level/block/state/BlockBase.java
@@ -303,6 +303,7 @@ public abstract class BlockBase {
@@ -94,10 +94,10 @@ index 23a3b1b317b6b3e9d812f5a7b09b099b0528c59e..4f40c6c3397596c81147fae4a6a51bfd
public void a(IBlockData iblockdata, World world, BlockPosition blockposition, Entity entity) {}
diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-index 681e4d41aed335b62fb9aaa030f7fc119cfbfa88..82963c98c127ae3e5d5dddb321771f08aee9b9a7 100644
+index a0df754d98e4be46720ba0962bdf7bf62f3425bb..c8b510a49ba5c299ec38ea1a56f5245ec6161b55 100644
--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-@@ -1929,4 +1929,9 @@ public class PurpurWorldConfig {
+@@ -1941,4 +1941,9 @@ public class PurpurWorldConfig {
zombieVillagerMaxHealth = getDouble("mobs.zombie_villager.attributes.max_health", zombieVillagerMaxHealth);
zombieVillagerSpawnReinforcements = getDouble("mobs.zombie_villager.attributes.spawn_reinforcements", zombieVillagerSpawnReinforcements);
}
@@ -108,10 +108,10 @@ index 681e4d41aed335b62fb9aaa030f7fc119cfbfa88..82963c98c127ae3e5d5dddb321771f08
+ }
}
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java
-index c524a0994f1c9ef1d0534403efa4e4481955b2f3..a80f664d2cf713fd751421be3735e2f4779f0056 100644
+index dcdc82b42689b4962323938a62cf7ded49afd6f4..4a70d657fd83627e8d66b52cb5f87381b43ad76a 100644
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java
-@@ -554,6 +554,10 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity {
+@@ -550,6 +550,10 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity {
location.checkFinite();
if (entity.isVehicle() || entity.dead) {
@@ -123,7 +123,7 @@ index c524a0994f1c9ef1d0534403efa4e4481955b2f3..a80f664d2cf713fd751421be3735e2f4
}
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
-index ca465a53a0c6232f912287704fc63cdcc59a28bd..37564214c6595dfc07534124f749bf65002325c2 100644
+index e204374c8f17ca5514e9bcfd24d411069285de29..7e0b3aa37af39db2bc2f630e479008dd9a443776 100644
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
@@ -126,6 +126,7 @@ import org.bukkit.entity.EntityType;
diff --git a/patches/server/0163-Add-StructureGenerateEvent.patch b/patches/server/0162-Add-StructureGenerateEvent.patch
similarity index 100%
rename from patches/server/0163-Add-StructureGenerateEvent.patch
rename to patches/server/0162-Add-StructureGenerateEvent.patch
diff --git a/patches/server/0164-Farmland-trampling-changes.patch b/patches/server/0163-Farmland-trampling-changes.patch
similarity index 96%
rename from patches/server/0164-Farmland-trampling-changes.patch
rename to patches/server/0163-Farmland-trampling-changes.patch
index d74cefa312..b5727a7c3e 100644
--- a/patches/server/0164-Farmland-trampling-changes.patch
+++ b/patches/server/0163-Farmland-trampling-changes.patch
@@ -54,10 +54,10 @@ index d3fd0b418b9088b621e44f5da452db74b433efe8..e7e5ee52cb7ac7e406c837db686d0a96
if (CraftEventFactory.callEntityChangeBlockEvent(entity, blockposition, Blocks.DIRT.getBlockData()).isCancelled()) {
return;
diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-index 82963c98c127ae3e5d5dddb321771f08aee9b9a7..9fe79ccb92bfc0fca6660d159c4bc209d8302fd5 100644
+index c8b510a49ba5c299ec38ea1a56f5245ec6161b55..e639519a78bababc5d8034841e9ab2c20d34e4f7 100644
--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-@@ -459,10 +459,16 @@ public class PurpurWorldConfig {
+@@ -471,10 +471,16 @@ public class PurpurWorldConfig {
public boolean farmlandBypassMobGriefing = false;
public boolean farmlandGetsMoistFromBelow = false;
public boolean farmlandAlpha = false;
diff --git a/patches/server/0165-Movement-options-for-armor-stands.patch b/patches/server/0164-Movement-options-for-armor-stands.patch
similarity index 95%
rename from patches/server/0165-Movement-options-for-armor-stands.patch
rename to patches/server/0164-Movement-options-for-armor-stands.patch
index 296679f31e..304545ff7f 100644
--- a/patches/server/0165-Movement-options-for-armor-stands.patch
+++ b/patches/server/0164-Movement-options-for-armor-stands.patch
@@ -17,10 +17,10 @@ You should have received a copy of the GNU General Public License
along with this program. If not, see .
diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java
-index 4d64fb19c3c9cce41e89ba4d702e687b34620b7e..2545b0891a299301a8d9e194e795b0f3856f2178 100644
+index 3230436d90306de325b8f72d813030288c2c28ed..6ad5d690b43b9eabc39a72e9e0ff4c0abf498175 100644
--- a/src/main/java/net/minecraft/world/entity/Entity.java
+++ b/src/main/java/net/minecraft/world/entity/Entity.java
-@@ -1500,7 +1500,7 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, ne
+@@ -1499,7 +1499,7 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, ne
return this.isInWater() || flag;
}
@@ -74,7 +74,7 @@ index 43dc0925887e2e9e86445cccff57be7994ca0d58..ecb797e67554d30e35b3aca4d0fc9b0e
+ // Purpur end
}
diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-index 9fe79ccb92bfc0fca6660d159c4bc209d8302fd5..edb7f82c0ebadd05095917f303be9c6f72a4a893 100644
+index e639519a78bababc5d8034841e9ab2c20d34e4f7..9d8056d7766925fec57b17b55f56dd8c67382b0a 100644
--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
@@ -111,10 +111,16 @@ public class PurpurWorldConfig {
diff --git a/patches/server/0166-Fix-stuck-in-portals.patch b/patches/server/0165-Fix-stuck-in-portals.patch
similarity index 84%
rename from patches/server/0166-Fix-stuck-in-portals.patch
rename to patches/server/0165-Fix-stuck-in-portals.patch
index a744a37758..0f2a529d15 100644
--- a/patches/server/0166-Fix-stuck-in-portals.patch
+++ b/patches/server/0165-Fix-stuck-in-portals.patch
@@ -5,10 +5,10 @@ Subject: [PATCH] Fix stuck in portals
diff --git a/src/main/java/net/minecraft/server/level/EntityPlayer.java b/src/main/java/net/minecraft/server/level/EntityPlayer.java
-index 8010b0c68b99c2e8986d01a4635e1a37f4313dbe..ea9523fc977ec4a96bf113c33d0f9643f0cf7419 100644
+index 5a119537aca2f47c60b24a7b394a99051aec87b8..75871b1556f7c54a13488d9f985051f732d68d67 100644
--- a/src/main/java/net/minecraft/server/level/EntityPlayer.java
+++ b/src/main/java/net/minecraft/server/level/EntityPlayer.java
-@@ -1291,6 +1291,7 @@ public class EntityPlayer extends EntityHuman implements ICrafting {
+@@ -1289,6 +1289,7 @@ public class EntityPlayer extends EntityHuman implements ICrafting {
playerlist.d(this);
worldserver1.removePlayer(this);
this.dead = false;
@@ -17,10 +17,10 @@ index 8010b0c68b99c2e8986d01a4635e1a37f4313dbe..ea9523fc977ec4a96bf113c33d0f9643
// CraftBukkit end
this.spawnIn(worldserver);
diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java
-index 2545b0891a299301a8d9e194e795b0f3856f2178..fdd374232ced8f4da675afaee3f5278c036ef112 100644
+index 6ad5d690b43b9eabc39a72e9e0ff4c0abf498175..90d625a7d653a9eb2763f806e635795e2a5f32e3 100644
--- a/src/main/java/net/minecraft/world/entity/Entity.java
+++ b/src/main/java/net/minecraft/world/entity/Entity.java
-@@ -2551,12 +2551,15 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, ne
+@@ -2550,12 +2550,15 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, ne
return new Vec2F(this.pitch, this.yaw);
}
@@ -37,10 +37,10 @@ index 2545b0891a299301a8d9e194e795b0f3856f2178..fdd374232ced8f4da675afaee3f5278c
this.inPortal = true;
diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-index edb7f82c0ebadd05095917f303be9c6f72a4a893..3dd8868ab3f1675ff5e7547285f9a89b9d56cd63 100644
+index 9d8056d7766925fec57b17b55f56dd8c67382b0a..742db39c2bcd0a1416108e6ee57bd8156b50c0b8 100644
--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-@@ -396,6 +396,11 @@ public class PurpurWorldConfig {
+@@ -408,6 +408,11 @@ public class PurpurWorldConfig {
});
}
diff --git a/patches/server/0167-Config-to-use-infinity-bows-without-arrows.patch b/patches/server/0166-Config-to-use-infinity-bows-without-arrows.patch
similarity index 94%
rename from patches/server/0167-Config-to-use-infinity-bows-without-arrows.patch
rename to patches/server/0166-Config-to-use-infinity-bows-without-arrows.patch
index 3eb40f8d00..ce6517eeeb 100644
--- a/patches/server/0167-Config-to-use-infinity-bows-without-arrows.patch
+++ b/patches/server/0166-Config-to-use-infinity-bows-without-arrows.patch
@@ -20,10 +20,10 @@ index c7e20b25b4d09463fa54c66e62208e90515013e2..59b803ec4552058f2dda269e9435daf6
} else {
entityhuman.c(enumhand);
diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-index 3dd8868ab3f1675ff5e7547285f9a89b9d56cd63..235eba799c4b92738a57b62bc6bb572dd417a45b 100644
+index 742db39c2bcd0a1416108e6ee57bd8156b50c0b8..7b0babbd727421ecd05523eadbff3abb758fab6f 100644
--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-@@ -243,10 +243,12 @@ public class PurpurWorldConfig {
+@@ -253,10 +253,12 @@ public class PurpurWorldConfig {
idleTimeoutUpdateTabList = getBoolean("gameplay-mechanics.player.idle-timeout.update-tab-list", idleTimeoutUpdateTabList);
}
diff --git a/patches/server/0168-Toggle-for-water-sensitive-mob-damage.patch b/patches/server/0167-Toggle-for-water-sensitive-mob-damage.patch
similarity index 87%
rename from patches/server/0168-Toggle-for-water-sensitive-mob-damage.patch
rename to patches/server/0167-Toggle-for-water-sensitive-mob-damage.patch
index 560369b1a7..c2a2562b33 100644
--- a/patches/server/0168-Toggle-for-water-sensitive-mob-damage.patch
+++ b/patches/server/0167-Toggle-for-water-sensitive-mob-damage.patch
@@ -5,10 +5,10 @@ Subject: [PATCH] Toggle for water sensitive mob damage
diff --git a/src/main/java/net/minecraft/world/entity/EntityInsentient.java b/src/main/java/net/minecraft/world/entity/EntityInsentient.java
-index a6ea96683b0f4d35015dff6168f3bf458346fb6f..95c08c31cb4d9df73f0af8f0e3b61236e1b46faa 100644
+index 0eae61c48e780225cd253e91d247d8814950afb5..d838f5a85d561444f9a96e6f61161a2e4470c4c4 100644
--- a/src/main/java/net/minecraft/world/entity/EntityInsentient.java
+++ b/src/main/java/net/minecraft/world/entity/EntityInsentient.java
-@@ -863,7 +863,8 @@ public abstract class EntityInsentient extends EntityLiving {
+@@ -861,7 +861,8 @@ public abstract class EntityInsentient extends EntityLiving {
if (goalFloat.validConditions()) goalFloat.update();
this.getControllerJump().jumpIfSet();
}
@@ -19,7 +19,7 @@ index a6ea96683b0f4d35015dff6168f3bf458346fb6f..95c08c31cb4d9df73f0af8f0e3b61236
}
return;
diff --git a/src/main/java/net/minecraft/world/entity/EntityLiving.java b/src/main/java/net/minecraft/world/entity/EntityLiving.java
-index e866531958c9d0171d39ba7f6963fe92eb2d42cc..d0adfc802371f562fe87c3f8ebe2368ff133776a 100644
+index 6447830095d02af5535fcf1f154b8c5260b90d33..bcd8938d71c617ad5c2fdc57f8153800765ffabb 100644
--- a/src/main/java/net/minecraft/world/entity/EntityLiving.java
+++ b/src/main/java/net/minecraft/world/entity/EntityLiving.java
@@ -2990,6 +2990,7 @@ public abstract class EntityLiving extends Entity {
@@ -31,7 +31,7 @@ index e866531958c9d0171d39ba7f6963fe92eb2d42cc..d0adfc802371f562fe87c3f8ebe2368f
return false;
}
diff --git a/src/main/java/net/minecraft/world/entity/animal/EntitySnowman.java b/src/main/java/net/minecraft/world/entity/animal/EntitySnowman.java
-index 17f27d2bf5be746a0fa0e1e0fecab8158b2b3587..ad30cc92333aabf7d9fb3fb046e7ecb63629ee5b 100644
+index b13cd3f344a0e2c4c02b30f80ca9a81d93cc1954..d7aa3bd329eef71d58a8ea9be5735c58a598222b 100644
--- a/src/main/java/net/minecraft/world/entity/animal/EntitySnowman.java
+++ b/src/main/java/net/minecraft/world/entity/animal/EntitySnowman.java
@@ -108,7 +108,7 @@ public class EntitySnowman extends EntityGolem implements IShearable, IRangedEnt
@@ -44,7 +44,7 @@ index 17f27d2bf5be746a0fa0e1e0fecab8158b2b3587..ad30cc92333aabf7d9fb3fb046e7ecb6
@Override
diff --git a/src/main/java/net/minecraft/world/entity/monster/EntityBlaze.java b/src/main/java/net/minecraft/world/entity/monster/EntityBlaze.java
-index 45e69d2f8da4c5babfd2e67055cc0a4c6d3baac7..f90a0fcd41996cfb6935a2299306e6a4bf19701a 100644
+index 55b6f483aca8cbb5c30b3759e23c86a699e19569..09f8f792bb800a274f7b127bc925c07416906ed5 100644
--- a/src/main/java/net/minecraft/world/entity/monster/EntityBlaze.java
+++ b/src/main/java/net/minecraft/world/entity/monster/EntityBlaze.java
@@ -143,7 +143,7 @@ public class EntityBlaze extends EntityMonster {
@@ -57,7 +57,7 @@ index 45e69d2f8da4c5babfd2e67055cc0a4c6d3baac7..f90a0fcd41996cfb6935a2299306e6a4
@Override
diff --git a/src/main/java/net/minecraft/world/entity/monster/EntityEnderman.java b/src/main/java/net/minecraft/world/entity/monster/EntityEnderman.java
-index ea500a6080f73dcc35d83a3b5a170f57dedaa431..d290787f74579dd4c138eb827e44544814bfe315 100644
+index d8c568d821b859bac0a9839c42c9596cf964b16e..402a07551d9e78bac5e0f45e30b0abb7a4c82704 100644
--- a/src/main/java/net/minecraft/world/entity/monster/EntityEnderman.java
+++ b/src/main/java/net/minecraft/world/entity/monster/EntityEnderman.java
@@ -290,7 +290,7 @@ public class EntityEnderman extends EntityMonster implements IEntityAngerable {
@@ -83,10 +83,10 @@ index 5e4cc99a746d98231bbb71672fbc02431e4fab48..f52ae7446c16d5b8ac51bd2e12bb51d2
@Override
diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-index 235eba799c4b92738a57b62bc6bb572dd417a45b..aa73eb1ec79ae552d60c31d0168a0e91cdabb4f5 100644
+index 7b0babbd727421ecd05523eadbff3abb758fab6f..faa5df044857f19503b35bbcf7366ac13b2fa2a9 100644
--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-@@ -617,6 +617,7 @@ public class PurpurWorldConfig {
+@@ -629,6 +629,7 @@ public class PurpurWorldConfig {
public boolean blazeRidableInWater = false;
public double blazeMaxY = 256D;
public double blazeMaxHealth = 20.0D;
@@ -94,7 +94,7 @@ index 235eba799c4b92738a57b62bc6bb572dd417a45b..aa73eb1ec79ae552d60c31d0168a0e91
private void blazeSettings() {
blazeRidable = getBoolean("mobs.blaze.ridable", blazeRidable);
blazeRidableInWater = getBoolean("mobs.blaze.ridable-in-water", blazeRidableInWater);
-@@ -627,6 +628,7 @@ public class PurpurWorldConfig {
+@@ -639,6 +640,7 @@ public class PurpurWorldConfig {
set("mobs.blaze.attributes.max_health", oldValue);
}
blazeMaxHealth = getDouble("mobs.blaze.attributes.max_health", blazeMaxHealth);
@@ -102,7 +102,7 @@ index 235eba799c4b92738a57b62bc6bb572dd417a45b..aa73eb1ec79ae552d60c31d0168a0e91
}
public boolean catRidable = false;
-@@ -841,6 +843,7 @@ public class PurpurWorldConfig {
+@@ -853,6 +855,7 @@ public class PurpurWorldConfig {
public boolean endermanBypassMobGriefing = false;
public boolean endermanDespawnEvenWithBlock = false;
public double endermanMaxHealth = 40.0D;
@@ -110,7 +110,7 @@ index 235eba799c4b92738a57b62bc6bb572dd417a45b..aa73eb1ec79ae552d60c31d0168a0e91
private void endermanSettings() {
endermanRidable = getBoolean("mobs.enderman.ridable", endermanRidable);
endermanRidableInWater = getBoolean("mobs.enderman.ridable-in-water", endermanRidableInWater);
-@@ -853,6 +856,7 @@ public class PurpurWorldConfig {
+@@ -865,6 +868,7 @@ public class PurpurWorldConfig {
set("mobs.enderman.attributes.max_health", oldValue);
}
endermanMaxHealth = getDouble("mobs.enderman.attributes.max_health", endermanMaxHealth);
@@ -118,7 +118,7 @@ index 235eba799c4b92738a57b62bc6bb572dd417a45b..aa73eb1ec79ae552d60c31d0168a0e91
}
public boolean endermiteRidable = false;
-@@ -1542,6 +1546,7 @@ public class PurpurWorldConfig {
+@@ -1554,6 +1558,7 @@ public class PurpurWorldConfig {
public float snowGolemSnowBallModifier = 10.0F;
public double snowGolemAttackDistance = 1.25D;
public double snowGolemMaxHealth = 4.0D;
@@ -126,7 +126,7 @@ index 235eba799c4b92738a57b62bc6bb572dd417a45b..aa73eb1ec79ae552d60c31d0168a0e91
private void snowGolemSettings() {
snowGolemRidable = getBoolean("mobs.snow_golem.ridable", snowGolemRidable);
snowGolemRidableInWater = getBoolean("mobs.snow_golem.ridable-in-water", snowGolemRidableInWater);
-@@ -1559,6 +1564,7 @@ public class PurpurWorldConfig {
+@@ -1571,6 +1576,7 @@ public class PurpurWorldConfig {
set("mobs.snow_golem.attributes.max_health", oldValue);
}
snowGolemMaxHealth = getDouble("mobs.snow_golem.attributes.max_health", snowGolemMaxHealth);
@@ -134,7 +134,7 @@ index 235eba799c4b92738a57b62bc6bb572dd417a45b..aa73eb1ec79ae552d60c31d0168a0e91
}
public boolean squidRidable = false;
-@@ -1612,6 +1618,7 @@ public class PurpurWorldConfig {
+@@ -1624,6 +1630,7 @@ public class PurpurWorldConfig {
public int striderBreedingTicks = 6000;
public boolean striderGiveSaddleBack = false;
public double striderMaxHealth = 20.0D;
@@ -142,7 +142,7 @@ index 235eba799c4b92738a57b62bc6bb572dd417a45b..aa73eb1ec79ae552d60c31d0168a0e91
private void striderSettings() {
striderRidable = getBoolean("mobs.strider.ridable", striderRidable);
striderRidableInWater = getBoolean("mobs.strider.ridable-in-water", striderRidableInWater);
-@@ -1623,6 +1630,7 @@ public class PurpurWorldConfig {
+@@ -1635,6 +1642,7 @@ public class PurpurWorldConfig {
set("mobs.strider.attributes.max_health", oldValue);
}
striderMaxHealth = getDouble("mobs.strider.attributes.max_health", striderMaxHealth);
diff --git a/patches/server/0169-Config-to-always-tame-in-Creative.patch b/patches/server/0168-Config-to-always-tame-in-Creative.patch
similarity index 93%
rename from patches/server/0169-Config-to-always-tame-in-Creative.patch
rename to patches/server/0168-Config-to-always-tame-in-Creative.patch
index ee61a022f3..97db59cb96 100644
--- a/patches/server/0169-Config-to-always-tame-in-Creative.patch
+++ b/patches/server/0168-Config-to-always-tame-in-Creative.patch
@@ -20,7 +20,7 @@ index d285f5aa66fa81a2f56920c05afb4506cb82fa54..39e348847bcecd91013452e71ef16729
return;
}
diff --git a/src/main/java/net/minecraft/world/entity/animal/EntityCat.java b/src/main/java/net/minecraft/world/entity/animal/EntityCat.java
-index 7143b0801be7877762e41da336ea5e4e57f2e463..a099d8e0c5a3e4b804c8af978161ec1747ee7fa3 100644
+index a4e3e36f081803b0588a0e907a3a834b7a3ab3eb..84784e91eb6c4bee7e66a6dee8736b948414a7a5 100644
--- a/src/main/java/net/minecraft/world/entity/animal/EntityCat.java
+++ b/src/main/java/net/minecraft/world/entity/animal/EntityCat.java
@@ -439,7 +439,7 @@ public class EntityCat extends EntityTameableAnimal {
@@ -33,7 +33,7 @@ index 7143b0801be7877762e41da336ea5e4e57f2e463..a099d8e0c5a3e4b804c8af978161ec17
this.setWillSit(true);
this.world.broadcastEntityEffect(this, (byte) 7);
diff --git a/src/main/java/net/minecraft/world/entity/animal/EntityParrot.java b/src/main/java/net/minecraft/world/entity/animal/EntityParrot.java
-index efa4318989893c946e9d7671d0dead6c4a6e315f..b2a8bfc3e53a2071ab7451fbdb3d49d97f0c430a 100644
+index 7500de8bcdd32f08bf6d32e70cfe09baf097cc2b..2f51e80a02817f1e36c8fe9542809ab881263a16 100644
--- a/src/main/java/net/minecraft/world/entity/animal/EntityParrot.java
+++ b/src/main/java/net/minecraft/world/entity/animal/EntityParrot.java
@@ -301,7 +301,7 @@ public class EntityParrot extends EntityPerchable implements EntityBird {
@@ -59,10 +59,10 @@ index 090903fbc8f6cd1522c7afb358f708f5ae3395f4..884a3f03c73efb8fb0863976615fba5e
this.navigation.o();
this.setGoalTarget((EntityLiving) null);
diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-index aa73eb1ec79ae552d60c31d0168a0e91cdabb4f5..447188e570bbab37a225f9c2583a8481a90a22ef 100644
+index faa5df044857f19503b35bbcf7366ac13b2fa2a9..88e28b680e144e1b0bb919e93644b86a48b553e1 100644
--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-@@ -289,6 +289,7 @@ public class PurpurWorldConfig {
+@@ -299,6 +299,7 @@ public class PurpurWorldConfig {
}
public boolean useBetterMending = false;
@@ -70,7 +70,7 @@ index aa73eb1ec79ae552d60c31d0168a0e91cdabb4f5..447188e570bbab37a225f9c2583a8481
public boolean boatEjectPlayersOnLand = false;
public boolean boatsDoFallDamage = true;
public boolean disableDropsOnCrammingDeath = false;
-@@ -305,6 +306,7 @@ public class PurpurWorldConfig {
+@@ -316,6 +317,7 @@ public class PurpurWorldConfig {
public int animalBreedingCooldownSeconds = 0;
private void miscGameplayMechanicsSettings() {
useBetterMending = getBoolean("gameplay-mechanics.use-better-mending", useBetterMending);
diff --git a/patches/server/0170-End-crystal-explosion-options.patch b/patches/server/0169-End-crystal-explosion-options.patch
similarity index 97%
rename from patches/server/0170-End-crystal-explosion-options.patch
rename to patches/server/0169-End-crystal-explosion-options.patch
index 0aa2171260..30f429f991 100644
--- a/patches/server/0170-End-crystal-explosion-options.patch
+++ b/patches/server/0169-End-crystal-explosion-options.patch
@@ -52,10 +52,10 @@ index 2c983e6a092464d1867fcbe875b2e1461ec8556b..a92c900a6092c07b34711428fac268f4
this.a(damagesource);
diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-index 447188e570bbab37a225f9c2583a8481a90a22ef..d98671c6db4d86a9324f120c68e610364337bee6 100644
+index 88e28b680e144e1b0bb919e93644b86a48b553e1..266b64abb949fca2cc667395d175c962c55435db 100644
--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-@@ -1963,4 +1963,33 @@ public class PurpurWorldConfig {
+@@ -1975,4 +1975,33 @@ public class PurpurWorldConfig {
private void imposeTeleportRestrictionsOnGateways() {
imposeTeleportRestrictionsOnGateways = getBoolean("gameplay-mechanics.impose-teleport-restrictions-on-gateways", imposeTeleportRestrictionsOnGateways);
}
diff --git a/patches/server/0171-Add-unsafe-Entity-serialization-API.patch b/patches/server/0170-Add-unsafe-Entity-serialization-API.patch
similarity index 96%
rename from patches/server/0171-Add-unsafe-Entity-serialization-API.patch
rename to patches/server/0170-Add-unsafe-Entity-serialization-API.patch
index 210d0d565a..0cdc1d0da8 100644
--- a/patches/server/0171-Add-unsafe-Entity-serialization-API.patch
+++ b/patches/server/0170-Add-unsafe-Entity-serialization-API.patch
@@ -29,10 +29,10 @@ index e1ef642f06078202fb782ac16b268e6429c5e202..778c981d4458957533fc3ac44095051b
return SystemUtils.a(a(nbttagcompound).map((entitytypes) -> {
return entitytypes.a(world);
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java
-index a80f664d2cf713fd751421be3735e2f4779f0056..6c37bf58bd269c2d7e1c84e5791e8245e4c75aea 100644
+index 4a70d657fd83627e8d66b52cb5f87381b43ad76a..af69023b241560031f6aa116561d7407b2502578 100644
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java
-@@ -1200,5 +1200,12 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity {
+@@ -1196,5 +1196,12 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity {
public boolean isRidableInWater() {
return getHandle().isRidableInWater();
}
@@ -46,7 +46,7 @@ index a80f664d2cf713fd751421be3735e2f4779f0056..6c37bf58bd269c2d7e1c84e5791e8245
// Purpur end
}
diff --git a/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java b/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java
-index 67f93f252a26f8b598a4b48c63c321728b246cae..b05b6e911026b8b8ad2e12b7a6705364ec90769d 100644
+index ed290f61ec5adcb3033c7cb7e0fcca8d9722c234..2ccceec865a44edfe606beac06508c30a5e398f0 100644
--- a/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java
+++ b/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java
@@ -410,9 +410,14 @@ public final class CraftMagicNumbers implements UnsafeValues {
diff --git a/patches/server/0172-Add-ghast-allow-griefing-option.patch b/patches/server/0171-Add-ghast-allow-griefing-option.patch
similarity index 92%
rename from patches/server/0172-Add-ghast-allow-griefing-option.patch
rename to patches/server/0171-Add-ghast-allow-griefing-option.patch
index c60936e16f..fc94c688b2 100644
--- a/patches/server/0172-Add-ghast-allow-griefing-option.patch
+++ b/patches/server/0171-Add-ghast-allow-griefing-option.patch
@@ -5,7 +5,7 @@ Subject: [PATCH] Add ghast allow-griefing option
diff --git a/src/main/java/net/minecraft/world/entity/monster/EntityGhast.java b/src/main/java/net/minecraft/world/entity/monster/EntityGhast.java
-index 5c39a9aec865d25a9aa5edcfd3a0fd6d1166cbd1..4bc8b6ec44a03390ced313e84b03ab6662a3c0a2 100644
+index e83d9aae4a04fc67587d40cec1f24ba5ebb58e10..5834b38ab206a9db6d3e336074095ce85bdbcc50 100644
--- a/src/main/java/net/minecraft/world/entity/monster/EntityGhast.java
+++ b/src/main/java/net/minecraft/world/entity/monster/EntityGhast.java
@@ -230,6 +230,7 @@ public class EntityGhast extends EntityFlying implements IMonster {
@@ -38,10 +38,10 @@ index 61f06eacb4ea4ef869b60c9014cc23b25583eead..627915ee205fdcc93c5424ad7d7ea057
// CraftBukkit start - fire ExplosionPrimeEvent
ExplosionPrimeEvent event = new ExplosionPrimeEvent((org.bukkit.entity.Explosive) this.getBukkitEntity());
diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-index d98671c6db4d86a9324f120c68e610364337bee6..fa3c9dbcdea3701cdecd2e4324690528af47247f 100644
+index 266b64abb949fca2cc667395d175c962c55435db..23f7a3af8f92fd6e89601b0e1b4b2d1635dfe0b0 100644
--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-@@ -914,6 +914,7 @@ public class PurpurWorldConfig {
+@@ -926,6 +926,7 @@ public class PurpurWorldConfig {
public boolean ghastRidable = false;
public boolean ghastRidableInWater = false;
public double ghastMaxY = 256D;
@@ -49,7 +49,7 @@ index d98671c6db4d86a9324f120c68e610364337bee6..fa3c9dbcdea3701cdecd2e4324690528
public double ghastMaxHealth = 10.0D;
private void ghastSettings() {
ghastRidable = getBoolean("mobs.ghast.ridable", ghastRidable);
-@@ -924,6 +925,7 @@ public class PurpurWorldConfig {
+@@ -936,6 +937,7 @@ public class PurpurWorldConfig {
set("mobs.ghast.attributes.max-health", null);
set("mobs.ghast.attributes.max_health", oldValue);
}
diff --git a/patches/server/0173-Configs-for-if-Wither-Ender-Dragon-can-ride-vehicles.patch b/patches/server/0172-Configs-for-if-Wither-Ender-Dragon-can-ride-vehicles.patch
similarity index 83%
rename from patches/server/0173-Configs-for-if-Wither-Ender-Dragon-can-ride-vehicles.patch
rename to patches/server/0172-Configs-for-if-Wither-Ender-Dragon-can-ride-vehicles.patch
index 2b0fb75afb..d05ebea2ce 100644
--- a/patches/server/0173-Configs-for-if-Wither-Ender-Dragon-can-ride-vehicles.patch
+++ b/patches/server/0172-Configs-for-if-Wither-Ender-Dragon-can-ride-vehicles.patch
@@ -5,10 +5,10 @@ Subject: [PATCH] Configs for if Wither/Ender Dragon can ride vehicles
diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java
-index fdd374232ced8f4da675afaee3f5278c036ef112..f3151969e5841861d31ac50abdfef3c65e5198a3 100644
+index 90d625a7d653a9eb2763f806e635795e2a5f32e3..3d9116d9e562e70cd20a6fa8ca561dff04f20907 100644
--- a/src/main/java/net/minecraft/world/entity/Entity.java
+++ b/src/main/java/net/minecraft/world/entity/Entity.java
-@@ -2401,7 +2401,7 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, ne
+@@ -2400,7 +2400,7 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, ne
}
}
@@ -18,7 +18,7 @@ index fdd374232ced8f4da675afaee3f5278c036ef112..f3151969e5841861d31ac50abdfef3c6
}
diff --git a/src/main/java/net/minecraft/world/entity/boss/enderdragon/EntityEnderDragon.java b/src/main/java/net/minecraft/world/entity/boss/enderdragon/EntityEnderDragon.java
-index a81d782877ff6116477792fa4cec0846e56ed384..6b0a71ce1c51e587ee17c8d60aaa52bbc87fb321 100644
+index 0614483830336f3bbd348319ca3eed8767568852..d27f61959e924e1ce6c7d76c905d98a762823e91 100644
--- a/src/main/java/net/minecraft/world/entity/boss/enderdragon/EntityEnderDragon.java
+++ b/src/main/java/net/minecraft/world/entity/boss/enderdragon/EntityEnderDragon.java
@@ -1073,6 +1073,7 @@ public class EntityEnderDragon extends EntityInsentient implements IMonster {
@@ -30,10 +30,10 @@ index a81d782877ff6116477792fa4cec0846e56ed384..6b0a71ce1c51e587ee17c8d60aaa52bb
}
diff --git a/src/main/java/net/minecraft/world/entity/boss/wither/EntityWither.java b/src/main/java/net/minecraft/world/entity/boss/wither/EntityWither.java
-index fa6b72c7a12b20f8ccffa360a3895e4d8f4277e4..4a3e0f7f59ca4fd64be62a580d08b6ab84649ee8 100644
+index 9a152b7cd351380e696640a51e5f8b64225f25f0..e34e25d62bd677fc7373e73b4118898a4f7f4d26 100644
--- a/src/main/java/net/minecraft/world/entity/boss/wither/EntityWither.java
+++ b/src/main/java/net/minecraft/world/entity/boss/wither/EntityWither.java
-@@ -730,6 +730,7 @@ public class EntityWither extends EntityMonster implements IRangedEntity {
+@@ -728,6 +728,7 @@ public class EntityWither extends EntityMonster implements IRangedEntity {
@Override
protected boolean n(Entity entity) {
@@ -42,10 +42,10 @@ index fa6b72c7a12b20f8ccffa360a3895e4d8f4277e4..4a3e0f7f59ca4fd64be62a580d08b6ab
}
diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-index fa3c9dbcdea3701cdecd2e4324690528af47247f..b82cf670d693096884f801e72efbcb535d0952a7 100644
+index 23f7a3af8f92fd6e89601b0e1b4b2d1635dfe0b0..b2d7e4ee4ecef476d633278c960130110c862520 100644
--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-@@ -821,6 +821,7 @@ public class PurpurWorldConfig {
+@@ -833,6 +833,7 @@ public class PurpurWorldConfig {
public boolean enderDragonAlwaysDropsFullExp = false;
public boolean enderDragonBypassMobGriefing = false;
public double enderDragonMaxHealth = 200.0D;
@@ -53,7 +53,7 @@ index fa3c9dbcdea3701cdecd2e4324690528af47247f..b82cf670d693096884f801e72efbcb53
private void enderDragonSettings() {
enderDragonRidable = getBoolean("mobs.ender_dragon.ridable", enderDragonRidable);
enderDragonRidableInWater = getBoolean("mobs.ender_dragon.ridable-in-water", enderDragonRidableInWater);
-@@ -837,6 +838,7 @@ public class PurpurWorldConfig {
+@@ -849,6 +850,7 @@ public class PurpurWorldConfig {
set("mobs.ender_dragon.attributes.max_health", oldValue);
}
enderDragonMaxHealth = getDouble("mobs.ender_dragon.attributes.max_health", enderDragonMaxHealth);
@@ -61,7 +61,7 @@ index fa3c9dbcdea3701cdecd2e4324690528af47247f..b82cf670d693096884f801e72efbcb53
}
public boolean endermanRidable = false;
-@@ -1781,6 +1783,7 @@ public class PurpurWorldConfig {
+@@ -1793,6 +1795,7 @@ public class PurpurWorldConfig {
public float witherHealthRegenAmount = 1.0f;
public int witherHealthRegenDelay = 20;
public double witherMaxHealth = 300.0D;
@@ -69,7 +69,7 @@ index fa3c9dbcdea3701cdecd2e4324690528af47247f..b82cf670d693096884f801e72efbcb53
private void witherSettings() {
witherRidable = getBoolean("mobs.wither.ridable", witherRidable);
witherRidableInWater = getBoolean("mobs.wither.ridable-in-water", witherRidableInWater);
-@@ -1798,6 +1801,7 @@ public class PurpurWorldConfig {
+@@ -1810,6 +1813,7 @@ public class PurpurWorldConfig {
set("mobs.wither.attributes.max_health", oldValue);
}
witherMaxHealth = getDouble("mobs.wither.attributes.max_health", witherMaxHealth);
diff --git a/patches/server/0174-Dont-run-with-scissors.patch b/patches/server/0173-Dont-run-with-scissors.patch
similarity index 83%
rename from patches/server/0174-Dont-run-with-scissors.patch
rename to patches/server/0173-Dont-run-with-scissors.patch
index d621022418..370a0f7961 100644
--- a/patches/server/0174-Dont-run-with-scissors.patch
+++ b/patches/server/0173-Dont-run-with-scissors.patch
@@ -5,10 +5,10 @@ Subject: [PATCH] Dont run with scissors!
diff --git a/src/main/java/net/minecraft/server/network/PlayerConnection.java b/src/main/java/net/minecraft/server/network/PlayerConnection.java
-index 5a2f84cd1456b072084e2db53a24c9863cb75563..40ad7f050b7f11f2810b07970c9e29354525de98 100644
+index fbfb3eba79ded3720edf93b3d1c18cbc02c086dd..0bed1f132200876122f92f0ca539e53afa222c14 100644
--- a/src/main/java/net/minecraft/server/network/PlayerConnection.java
+++ b/src/main/java/net/minecraft/server/network/PlayerConnection.java
-@@ -1547,6 +1547,12 @@ public class PlayerConnection implements PacketListenerPlayIn {
+@@ -1552,6 +1552,12 @@ public class PlayerConnection implements PacketListenerPlayIn {
this.player.fallDistance = 0.0F;
}
@@ -22,21 +22,21 @@ index 5a2f84cd1456b072084e2db53a24c9863cb75563..40ad7f050b7f11f2810b07970c9e2935
this.o = this.player.locX();
this.p = this.player.locY();
diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-index b82cf670d693096884f801e72efbcb535d0952a7..6e37207d2c1d83a18d39cde4436b9b16c693df77 100644
+index b2d7e4ee4ecef476d633278c960130110c862520..02ebb0fc704b5e77cf508893d67feef036df80ed 100644
--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-@@ -202,6 +202,8 @@ public class PurpurWorldConfig {
- public List
- itemImmuneToCactus = new ArrayList<>();
+@@ -203,6 +203,8 @@ public class PurpurWorldConfig {
public List
- itemImmuneToExplosion = new ArrayList<>();
public List
- itemImmuneToFire = new ArrayList<>();
+ public List
- itemImmuneToLightning = new ArrayList<>();
+ public boolean dontRunWithScissors = false;
+ public double scissorsRunningDamage = 1D;
private void itemSettings() {
itemImmuneToCactus.clear();
getList("gameplay-mechanics.item.immune.cactus", new ArrayList<>()).forEach(key -> {
-@@ -230,6 +232,8 @@ public class PurpurWorldConfig {
+@@ -240,6 +242,8 @@ public class PurpurWorldConfig {
Item item = IRegistry.ITEM.get(new MinecraftKey(key.toString()));
- if (item != Items.AIR) itemImmuneToFire.add(item);
+ if (item != Items.AIR) itemImmuneToLightning.add(item);
});
+ dontRunWithScissors = getBoolean("gameplay-mechanics.item.shears.damage-if-sprinting", dontRunWithScissors);
+ scissorsRunningDamage = getDouble("gameplay-mechanics.item.shears.sprinting-damage", scissorsRunningDamage);
diff --git a/patches/server/0175-One-Punch-Man.patch b/patches/server/0174-One-Punch-Man.patch
similarity index 85%
rename from patches/server/0175-One-Punch-Man.patch
rename to patches/server/0174-One-Punch-Man.patch
index a338b15bdf..0518f43c53 100644
--- a/patches/server/0175-One-Punch-Man.patch
+++ b/patches/server/0174-One-Punch-Man.patch
@@ -5,7 +5,7 @@ Subject: [PATCH] One Punch Man!
diff --git a/src/main/java/net/minecraft/world/entity/EntityLiving.java b/src/main/java/net/minecraft/world/entity/EntityLiving.java
-index d0adfc802371f562fe87c3f8ebe2368ff133776a..93f8aa6d40b1eba6535f170bf0a79417d7d21069 100644
+index bcd8938d71c617ad5c2fdc57f8153800765ffabb..008c97dc6f5b9c08c86d6c2743a6389086d3359e 100644
--- a/src/main/java/net/minecraft/world/entity/EntityLiving.java
+++ b/src/main/java/net/minecraft/world/entity/EntityLiving.java
@@ -2032,6 +2032,23 @@ public abstract class EntityLiving extends Entity {
@@ -33,7 +33,7 @@ index d0adfc802371f562fe87c3f8ebe2368ff133776a..93f8aa6d40b1eba6535f170bf0a79417
if (human) {
// PAIL: Be sure to drag all this code from the EntityHuman subclass each update.
diff --git a/src/main/java/net/minecraft/world/item/ItemStack.java b/src/main/java/net/minecraft/world/item/ItemStack.java
-index 132972755ac74838f3386e0fac5033380b71fce5..26fff0540e3d8863e83b0a60df2205422d50f1e1 100644
+index a4c41caae425e054db3f40a9abc41f45ccd20730..2e4bc664412feb8657c7b9995d281203a14d48fd 100644
--- a/src/main/java/net/minecraft/world/item/ItemStack.java
+++ b/src/main/java/net/minecraft/world/item/ItemStack.java
@@ -897,6 +897,7 @@ public final class ItemStack {
@@ -45,19 +45,19 @@ index 132972755ac74838f3386e0fac5033380b71fce5..26fff0540e3d8863e83b0a60df220542
Object object;
diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-index 6e37207d2c1d83a18d39cde4436b9b16c693df77..087ab9b2b9be1a02f472563226fb7d8fb96a4dc3 100644
+index 02ebb0fc704b5e77cf508893d67feef036df80ed..f577b1054f8bdd2be933f7dae3ffe18dfeb87fe5 100644
--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-@@ -308,6 +308,7 @@ public class PurpurWorldConfig {
- public double voidDamageHeight = -64.0D;
+@@ -319,6 +319,7 @@ public class PurpurWorldConfig {
+ public double voidDamageDealt = 4.0D;
public int raidCooldownSeconds = 0;
public int animalBreedingCooldownSeconds = 0;
+ public boolean creativeOnePunch = false;
private void miscGameplayMechanicsSettings() {
useBetterMending = getBoolean("gameplay-mechanics.use-better-mending", useBetterMending);
alwaysTameInCreative = getBoolean("gameplay-mechanics.always-tame-in-creative", alwaysTameInCreative);
-@@ -325,6 +326,7 @@ public class PurpurWorldConfig {
- voidDamageHeight = getDouble("gameplay-mechanics.void-damage-height", voidDamageHeight);
+@@ -337,6 +338,7 @@ public class PurpurWorldConfig {
+ voidDamageDealt = getDouble("gameplay-mechanics.void-damage-dealt", voidDamageDealt);
raidCooldownSeconds = getInt("gameplay-mechanics.raid-cooldown-seconds", raidCooldownSeconds);
animalBreedingCooldownSeconds = getInt("gameplay-mechanics.animal-breeding-cooldown-seconds", animalBreedingCooldownSeconds);
+ creativeOnePunch = getBoolean("gameplay-mechanics.player.one-punch-in-creative", creativeOnePunch);
diff --git a/patches/server/0176-Add-config-for-snow-on-blue-ice.patch b/patches/server/0175-Add-config-for-snow-on-blue-ice.patch
similarity index 94%
rename from patches/server/0176-Add-config-for-snow-on-blue-ice.patch
rename to patches/server/0175-Add-config-for-snow-on-blue-ice.patch
index f40427dcd8..45beedc6b9 100644
--- a/patches/server/0176-Add-config-for-snow-on-blue-ice.patch
+++ b/patches/server/0175-Add-config-for-snow-on-blue-ice.patch
@@ -29,10 +29,10 @@ index d44b88185ce58346007c6ef70b76f8e0df23e95c..4b7497acc5b26da48375625b4a31fb05
@Override
diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-index 087ab9b2b9be1a02f472563226fb7d8fb96a4dc3..c207b7004cd6da7de11bbe88ae7b84a1a9874bbc 100644
+index f577b1054f8bdd2be933f7dae3ffe18dfeb87fe5..8cf40f10dccd9b4f52507e432dcfd6b2015e90f2 100644
--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-@@ -465,6 +465,11 @@ public class PurpurWorldConfig {
+@@ -477,6 +477,11 @@ public class PurpurWorldConfig {
}
}
diff --git a/patches/server/0177-Configurable-Ender-Pearl-cooldown-damage-and-Endermi.patch b/patches/server/0176-Configurable-Ender-Pearl-cooldown-damage-and-Endermi.patch
similarity index 94%
rename from patches/server/0177-Configurable-Ender-Pearl-cooldown-damage-and-Endermi.patch
rename to patches/server/0176-Configurable-Ender-Pearl-cooldown-damage-and-Endermi.patch
index 7a071516c2..e7f886dc58 100644
--- a/patches/server/0177-Configurable-Ender-Pearl-cooldown-damage-and-Endermi.patch
+++ b/patches/server/0176-Configurable-Ender-Pearl-cooldown-damage-and-Endermi.patch
@@ -43,11 +43,11 @@ index 9896d77381e7fadf1ef2619210713e190c1445d0..61512c6755f29cb2c228ae3e80b1e083
// Paper end
if (entityhuman instanceof net.minecraft.server.level.EntityPlayer) {
diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-index c207b7004cd6da7de11bbe88ae7b84a1a9874bbc..ecbf06ad3c649f1175ac0885591ed6f1190c737a 100644
+index 8cf40f10dccd9b4f52507e432dcfd6b2015e90f2..129fef2e4da94bcd80153379a7246590e4ea9cdd 100644
--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-@@ -204,6 +204,10 @@ public class PurpurWorldConfig {
- public List
- itemImmuneToFire = new ArrayList<>();
+@@ -205,6 +205,10 @@ public class PurpurWorldConfig {
+ public List
- itemImmuneToLightning = new ArrayList<>();
public boolean dontRunWithScissors = false;
public double scissorsRunningDamage = 1D;
+ public float enderPearlDamage = 5.0F;
@@ -57,7 +57,7 @@ index c207b7004cd6da7de11bbe88ae7b84a1a9874bbc..ecbf06ad3c649f1175ac0885591ed6f1
private void itemSettings() {
itemImmuneToCactus.clear();
getList("gameplay-mechanics.item.immune.cactus", new ArrayList<>()).forEach(key -> {
-@@ -234,6 +238,10 @@ public class PurpurWorldConfig {
+@@ -244,6 +248,10 @@ public class PurpurWorldConfig {
});
dontRunWithScissors = getBoolean("gameplay-mechanics.item.shears.damage-if-sprinting", dontRunWithScissors);
scissorsRunningDamage = getDouble("gameplay-mechanics.item.shears.sprinting-damage", scissorsRunningDamage);
diff --git a/patches/server/0178-Config-to-ignore-nearby-mobs-when-sleeping.patch b/patches/server/0177-Config-to-ignore-nearby-mobs-when-sleeping.patch
similarity index 85%
rename from patches/server/0178-Config-to-ignore-nearby-mobs-when-sleeping.patch
rename to patches/server/0177-Config-to-ignore-nearby-mobs-when-sleeping.patch
index 62adf4ee46..0f9d3ecc99 100644
--- a/patches/server/0178-Config-to-ignore-nearby-mobs-when-sleeping.patch
+++ b/patches/server/0177-Config-to-ignore-nearby-mobs-when-sleeping.patch
@@ -5,10 +5,10 @@ Subject: [PATCH] Config to ignore nearby mobs when sleeping
diff --git a/src/main/java/net/minecraft/server/level/EntityPlayer.java b/src/main/java/net/minecraft/server/level/EntityPlayer.java
-index ea9523fc977ec4a96bf113c33d0f9643f0cf7419..9e2c11fb728af209207627331c0acc98314ca125 100644
+index 75871b1556f7c54a13488d9f985051f732d68d67..1288c946865c2be32fafbd7dbe419a98c8050194 100644
--- a/src/main/java/net/minecraft/server/level/EntityPlayer.java
+++ b/src/main/java/net/minecraft/server/level/EntityPlayer.java
-@@ -1441,7 +1441,7 @@ public class EntityPlayer extends EntityHuman implements ICrafting {
+@@ -1439,7 +1439,7 @@ public class EntityPlayer extends EntityHuman implements ICrafting {
return entitymonster.f((EntityHuman) this);
});
@@ -18,10 +18,10 @@ index ea9523fc977ec4a96bf113c33d0f9643f0cf7419..9e2c11fb728af209207627331c0acc98
}
}
diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-index ecbf06ad3c649f1175ac0885591ed6f1190c737a..feff8cc3a8e38c67f06e08a593b51e99c4d8381f 100644
+index 129fef2e4da94bcd80153379a7246590e4ea9cdd..eaaaf9e5490095cd70ca892fa927017e6ea9de9d 100644
--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-@@ -317,6 +317,7 @@ public class PurpurWorldConfig {
+@@ -328,6 +328,7 @@ public class PurpurWorldConfig {
public int raidCooldownSeconds = 0;
public int animalBreedingCooldownSeconds = 0;
public boolean creativeOnePunch = false;
@@ -29,7 +29,7 @@ index ecbf06ad3c649f1175ac0885591ed6f1190c737a..feff8cc3a8e38c67f06e08a593b51e99
private void miscGameplayMechanicsSettings() {
useBetterMending = getBoolean("gameplay-mechanics.use-better-mending", useBetterMending);
alwaysTameInCreative = getBoolean("gameplay-mechanics.always-tame-in-creative", alwaysTameInCreative);
-@@ -335,6 +336,7 @@ public class PurpurWorldConfig {
+@@ -347,6 +348,7 @@ public class PurpurWorldConfig {
raidCooldownSeconds = getInt("gameplay-mechanics.raid-cooldown-seconds", raidCooldownSeconds);
animalBreedingCooldownSeconds = getInt("gameplay-mechanics.animal-breeding-cooldown-seconds", animalBreedingCooldownSeconds);
creativeOnePunch = getBoolean("gameplay-mechanics.player.one-punch-in-creative", creativeOnePunch);
diff --git a/patches/server/0179-Config-for-Enderman-to-aggro-spawned-Endermites.patch b/patches/server/0178-Config-for-Enderman-to-aggro-spawned-Endermites.patch
similarity index 89%
rename from patches/server/0179-Config-for-Enderman-to-aggro-spawned-Endermites.patch
rename to patches/server/0178-Config-for-Enderman-to-aggro-spawned-Endermites.patch
index 54951ea3f2..95fbae18c8 100644
--- a/patches/server/0179-Config-for-Enderman-to-aggro-spawned-Endermites.patch
+++ b/patches/server/0178-Config-for-Enderman-to-aggro-spawned-Endermites.patch
@@ -6,7 +6,7 @@ Subject: [PATCH] Config for Enderman to aggro spawned Endermites
By default, Enderman do not attack Endermites unless spawned by an Ender Pearl.
diff --git a/src/main/java/net/minecraft/world/entity/monster/EntityEnderman.java b/src/main/java/net/minecraft/world/entity/monster/EntityEnderman.java
-index d290787f74579dd4c138eb827e44544814bfe315..46143a710e057378ebe0ad644de275604b11d886 100644
+index 402a07551d9e78bac5e0f45e30b0abb7a4c82704..f113d5106bbee6fb0a5267547154f0839d03d089 100644
--- a/src/main/java/net/minecraft/world/entity/monster/EntityEnderman.java
+++ b/src/main/java/net/minecraft/world/entity/monster/EntityEnderman.java
@@ -72,7 +72,7 @@ public class EntityEnderman extends EntityMonster implements IEntityAngerable {
@@ -19,10 +19,10 @@ index d290787f74579dd4c138eb827e44544814bfe315..46143a710e057378ebe0ad644de27560
private int br = Integer.MIN_VALUE;
private int bs;
diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-index feff8cc3a8e38c67f06e08a593b51e99c4d8381f..76d63988772452525ece58e5d717fd84f3bad2f6 100644
+index eaaaf9e5490095cd70ca892fa927017e6ea9de9d..bb8ad6a4ac87c4c34d12c5fc1dd92f3d63b84bc1 100644
--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-@@ -869,6 +869,7 @@ public class PurpurWorldConfig {
+@@ -881,6 +881,7 @@ public class PurpurWorldConfig {
public boolean endermanDespawnEvenWithBlock = false;
public double endermanMaxHealth = 40.0D;
public boolean endermanTakeDamageFromWater = true;
@@ -30,7 +30,7 @@ index feff8cc3a8e38c67f06e08a593b51e99c4d8381f..76d63988772452525ece58e5d717fd84
private void endermanSettings() {
endermanRidable = getBoolean("mobs.enderman.ridable", endermanRidable);
endermanRidableInWater = getBoolean("mobs.enderman.ridable-in-water", endermanRidableInWater);
-@@ -882,6 +883,7 @@ public class PurpurWorldConfig {
+@@ -894,6 +895,7 @@ public class PurpurWorldConfig {
}
endermanMaxHealth = getDouble("mobs.enderman.attributes.max_health", endermanMaxHealth);
endermanTakeDamageFromWater = getBoolean("mobs.enderman.takes-damage-from-water", endermanTakeDamageFromWater);
diff --git a/patches/server/0180-Config-to-ignore-Dragon-Head-wearers-and-stare-aggro.patch b/patches/server/0179-Config-to-ignore-Dragon-Head-wearers-and-stare-aggro.patch
similarity index 91%
rename from patches/server/0180-Config-to-ignore-Dragon-Head-wearers-and-stare-aggro.patch
rename to patches/server/0179-Config-to-ignore-Dragon-Head-wearers-and-stare-aggro.patch
index 2327ecb734..2dfe053f1a 100644
--- a/patches/server/0180-Config-to-ignore-Dragon-Head-wearers-and-stare-aggro.patch
+++ b/patches/server/0179-Config-to-ignore-Dragon-Head-wearers-and-stare-aggro.patch
@@ -7,7 +7,7 @@ Prevents Enderman from becoming aggresive towards players that are wearing a Dra
Adds functionality to a useless item!
diff --git a/src/main/java/net/minecraft/world/entity/monster/EntityEnderman.java b/src/main/java/net/minecraft/world/entity/monster/EntityEnderman.java
-index 46143a710e057378ebe0ad644de275604b11d886..0ed19429c1a9021e636fdfffa582b4e093fbc2e7 100644
+index f113d5106bbee6fb0a5267547154f0839d03d089..bd03e91861237eeda50e607af4e26c1ad2d71297 100644
--- a/src/main/java/net/minecraft/world/entity/monster/EntityEnderman.java
+++ b/src/main/java/net/minecraft/world/entity/monster/EntityEnderman.java
@@ -50,6 +50,7 @@ import net.minecraft.world.entity.ai.goal.target.PathfinderGoalUniversalAngerRes
@@ -28,10 +28,10 @@ index 46143a710e057378ebe0ad644de275604b11d886..0ed19429c1a9021e636fdfffa582b4e0
} else {
Vec3D vec3d = entityhuman.f(1.0F).d();
diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-index 76d63988772452525ece58e5d717fd84f3bad2f6..673d55a3458dcb4bca61779757d3329598bd305d 100644
+index bb8ad6a4ac87c4c34d12c5fc1dd92f3d63b84bc1..838f97829dcb2926a56e3c34c4cbcdb9a13d6d84 100644
--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-@@ -870,6 +870,8 @@ public class PurpurWorldConfig {
+@@ -882,6 +882,8 @@ public class PurpurWorldConfig {
public double endermanMaxHealth = 40.0D;
public boolean endermanTakeDamageFromWater = true;
public boolean endermanAggroSpawnedEndermites = false;
@@ -40,7 +40,7 @@ index 76d63988772452525ece58e5d717fd84f3bad2f6..673d55a3458dcb4bca61779757d33295
private void endermanSettings() {
endermanRidable = getBoolean("mobs.enderman.ridable", endermanRidable);
endermanRidableInWater = getBoolean("mobs.enderman.ridable-in-water", endermanRidableInWater);
-@@ -884,6 +886,8 @@ public class PurpurWorldConfig {
+@@ -896,6 +898,8 @@ public class PurpurWorldConfig {
endermanMaxHealth = getDouble("mobs.enderman.attributes.max_health", endermanMaxHealth);
endermanTakeDamageFromWater = getBoolean("mobs.enderman.takes-damage-from-water", endermanTakeDamageFromWater);
endermanAggroSpawnedEndermites = getBoolean("mobs.enderman.aggressive-towards-spawned-endermites", endermanAggroSpawnedEndermites);
diff --git a/patches/server/0181-Re-enable-timings-by-default.patch b/patches/server/0180-Re-enable-timings-by-default.patch
similarity index 100%
rename from patches/server/0181-Re-enable-timings-by-default.patch
rename to patches/server/0180-Re-enable-timings-by-default.patch
diff --git a/patches/server/0182-Tick-fluids-config.patch b/patches/server/0181-Tick-fluids-config.patch
similarity index 95%
rename from patches/server/0182-Tick-fluids-config.patch
rename to patches/server/0181-Tick-fluids-config.patch
index bdd95da414..4f9630e591 100644
--- a/patches/server/0182-Tick-fluids-config.patch
+++ b/patches/server/0181-Tick-fluids-config.patch
@@ -36,10 +36,10 @@ index 0ed8d938b8fafdb03e01a00a201ba3f8597ac6e9..0eff89bf9e114271c34c37cad1b98691
}
diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-index 673d55a3458dcb4bca61779757d3329598bd305d..4d40319188375b71cb7feeecf1907693c3cbd021 100644
+index 838f97829dcb2926a56e3c34c4cbcdb9a13d6d84..d9fee278a2a5c04cc1a1796df2a6a77b432f47cc 100644
--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-@@ -295,6 +295,11 @@ public class PurpurWorldConfig {
+@@ -305,6 +305,11 @@ public class PurpurWorldConfig {
witherSkullDespawnRate = getInt("gameplay-mechanics.projectile-despawn-rates.wither_skull", witherSkullDespawnRate);
}
diff --git a/patches/server/0183-Config-to-disable-Llama-caravans.patch b/patches/server/0182-Config-to-disable-Llama-caravans.patch
similarity index 91%
rename from patches/server/0183-Config-to-disable-Llama-caravans.patch
rename to patches/server/0182-Config-to-disable-Llama-caravans.patch
index 7dedb9e66b..baaca271c1 100644
--- a/patches/server/0183-Config-to-disable-Llama-caravans.patch
+++ b/patches/server/0182-Config-to-disable-Llama-caravans.patch
@@ -19,7 +19,7 @@ index 34a854131dd939693a6df4d52103714ebe373dc3..ea02a78c31ed43220a2b83be4bd2a896
List list = this.a.world.getEntities(this.a, this.a.getBoundingBox().grow(9.0D, 4.0D, 9.0D), (entity) -> {
EntityTypes> entitytypes = entity.getEntityType();
diff --git a/src/main/java/net/minecraft/world/entity/animal/horse/EntityLlama.java b/src/main/java/net/minecraft/world/entity/animal/horse/EntityLlama.java
-index 762fed5ba27474951c1962e6f034e8494b1035d6..567a1da3c167c20ae3fb86c2a1f3608ebb1056b6 100644
+index 4bea68fa35177d84a35dc5ced3e501a87e2a5391..f91e9dc5ae635329257f6b78b88c9c7c89e2f43d 100644
--- a/src/main/java/net/minecraft/world/entity/animal/horse/EntityLlama.java
+++ b/src/main/java/net/minecraft/world/entity/animal/horse/EntityLlama.java
@@ -518,7 +518,7 @@ public class EntityLlama extends EntityHorseChestedAbstract implements IRangedEn
@@ -32,10 +32,10 @@ index 762fed5ba27474951c1962e6f034e8494b1035d6..567a1da3c167c20ae3fb86c2a1f3608e
this.bB.bC = this;
}
diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-index 4d40319188375b71cb7feeecf1907693c3cbd021..1ac22df208eccccfa290c1e3e5a15b6d2b675b9e 100644
+index d9fee278a2a5c04cc1a1796df2a6a77b432f47cc..c58a64f8ff38cde2de70ef9e06c1a6ca9e263669 100644
--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-@@ -1109,6 +1109,7 @@ public class PurpurWorldConfig {
+@@ -1121,6 +1121,7 @@ public class PurpurWorldConfig {
public boolean llamaRidable = false;
public boolean llamaRidableInWater = false;
@@ -43,7 +43,7 @@ index 4d40319188375b71cb7feeecf1907693c3cbd021..1ac22df208eccccfa290c1e3e5a15b6d
public int llamaBreedingTicks = 6000;
public double llamaMaxHealthMin = 15.0D;
public double llamaMaxHealthMax = 30.0D;
-@@ -1119,6 +1120,7 @@ public class PurpurWorldConfig {
+@@ -1131,6 +1132,7 @@ public class PurpurWorldConfig {
private void llamaSettings() {
llamaRidable = getBoolean("mobs.llama.ridable", llamaRidable);
llamaRidableInWater = getBoolean("mobs.llama.ridable-in-water", llamaRidableInWater);
diff --git a/patches/server/0184-Config-to-make-Creepers-explode-on-death.patch b/patches/server/0183-Config-to-make-Creepers-explode-on-death.patch
similarity index 93%
rename from patches/server/0184-Config-to-make-Creepers-explode-on-death.patch
rename to patches/server/0183-Config-to-make-Creepers-explode-on-death.patch
index 35b5b28081..d2b096238a 100644
--- a/patches/server/0184-Config-to-make-Creepers-explode-on-death.patch
+++ b/patches/server/0183-Config-to-make-Creepers-explode-on-death.patch
@@ -6,7 +6,7 @@ Subject: [PATCH] Config to make Creepers explode on death
Creepers exploded after being killed in the alpha days. This brings that back.
diff --git a/src/main/java/net/minecraft/world/entity/monster/EntityCreeper.java b/src/main/java/net/minecraft/world/entity/monster/EntityCreeper.java
-index 62d40f726355283baddde349c52bee0599bb293c..014091f35ee5aac0ee2f155ccec2daf586e4d3d3 100644
+index d049aac0208386198d1da4e9470e64898d27b1c9..27d5e9fc5ec1396e95180fc14e8a61b030cfd1e6 100644
--- a/src/main/java/net/minecraft/world/entity/monster/EntityCreeper.java
+++ b/src/main/java/net/minecraft/world/entity/monster/EntityCreeper.java
@@ -7,6 +7,7 @@ import net.minecraft.network.syncher.DataWatcher;
@@ -57,10 +57,10 @@ index 62d40f726355283baddde349c52bee0599bb293c..014091f35ee5aac0ee2f155ccec2daf5
private void createEffectCloud() {
diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-index 1ac22df208eccccfa290c1e3e5a15b6d2b675b9e..f32c331bb904326070cacf00337a207af8509226 100644
+index c58a64f8ff38cde2de70ef9e06c1a6ca9e263669..1fcd11d5f14458cd42e8ff54d4f244067ab0736e 100644
--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-@@ -745,12 +745,14 @@ public class PurpurWorldConfig {
+@@ -757,12 +757,14 @@ public class PurpurWorldConfig {
public boolean creeperRidable = false;
public boolean creeperRidableInWater = false;
diff --git a/patches/server/0185-Configurable-ravager-griefable-blocks-list.patch b/patches/server/0184-Configurable-ravager-griefable-blocks-list.patch
similarity index 92%
rename from patches/server/0185-Configurable-ravager-griefable-blocks-list.patch
rename to patches/server/0184-Configurable-ravager-griefable-blocks-list.patch
index 4dd4625590..b2374c463f 100644
--- a/patches/server/0185-Configurable-ravager-griefable-blocks-list.patch
+++ b/patches/server/0184-Configurable-ravager-griefable-blocks-list.patch
@@ -5,10 +5,10 @@ Subject: [PATCH] Configurable ravager griefable blocks list
diff --git a/src/main/java/net/minecraft/world/entity/monster/EntityRavager.java b/src/main/java/net/minecraft/world/entity/monster/EntityRavager.java
-index 6809c93fe435d183a27204fb4460fd68a86aa04f..aee5e370907d238cb0a0fb55a45341c8f60ed7d0 100644
+index 16da85620c067b005ce029c8b9c5ea1642a794f0..c2a6f1cb399c2cd659e2b2191edbc2a687a40eeb 100644
--- a/src/main/java/net/minecraft/world/entity/monster/EntityRavager.java
+++ b/src/main/java/net/minecraft/world/entity/monster/EntityRavager.java
-@@ -189,7 +189,7 @@ public class EntityRavager extends EntityRaider {
+@@ -188,7 +188,7 @@ public class EntityRavager extends EntityRaider {
IBlockData iblockdata = this.world.getType(blockposition);
Block block = iblockdata.getBlock();
@@ -31,10 +31,10 @@ index 5f8366beeaac7153a0421554f9bf91fbf265edca..7fca4d1713e8061d9de825cdae484012
}
diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-index f32c331bb904326070cacf00337a207af8509226..1199e500376d442ffdc5028bda3169ec7bc29985 100644
+index 1fcd11d5f14458cd42e8ff54d4f244067ab0736e..e360409a15feeb793bd3b4be82f9eda89b5660d7 100644
--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-@@ -1450,6 +1450,7 @@ public class PurpurWorldConfig {
+@@ -1462,6 +1462,7 @@ public class PurpurWorldConfig {
public boolean ravagerRidableInWater = false;
public boolean ravagerBypassMobGriefing = false;
public double ravagerMaxHealth = 100.0D;
@@ -42,7 +42,7 @@ index f32c331bb904326070cacf00337a207af8509226..1199e500376d442ffdc5028bda3169ec
private void ravagerSettings() {
ravagerRidable = getBoolean("mobs.ravager.ridable", ravagerRidable);
ravagerRidableInWater = getBoolean("mobs.ravager.ridable-in-water", ravagerRidableInWater);
-@@ -1460,6 +1461,23 @@ public class PurpurWorldConfig {
+@@ -1472,6 +1473,23 @@ public class PurpurWorldConfig {
set("mobs.ravager.attributes.max_health", oldValue);
}
ravagerMaxHealth = getDouble("mobs.ravager.attributes.max_health", ravagerMaxHealth);
diff --git a/patches/server/0186-Sneak-to-bulk-process-composter.patch b/patches/server/0185-Sneak-to-bulk-process-composter.patch
similarity index 95%
rename from patches/server/0186-Sneak-to-bulk-process-composter.patch
rename to patches/server/0185-Sneak-to-bulk-process-composter.patch
index 36d164a238..0e61afadf0 100644
--- a/patches/server/0186-Sneak-to-bulk-process-composter.patch
+++ b/patches/server/0185-Sneak-to-bulk-process-composter.patch
@@ -44,10 +44,10 @@ index e4e519ba773388b8d26a8f794a6eff51e3d8f72e..c0b235d5edf3cd14021696d1b4f76ce3
// CraftBukkit start
double rand = worldserver.getRandom().nextDouble();
diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-index 1199e500376d442ffdc5028bda3169ec7bc29985..e5fc4fbd6bb417607ced21d84ca0e85804d107cb 100644
+index e360409a15feeb793bd3b4be82f9eda89b5660d7..bb3c5d34b58ccf9bbaa1102e36b82a56f0dda7e3 100644
--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-@@ -490,6 +490,11 @@ public class PurpurWorldConfig {
+@@ -502,6 +502,11 @@ public class PurpurWorldConfig {
chestOpenWithBlockOnTop = getBoolean("blocks.chest.open-with-solid-block-on-top", chestOpenWithBlockOnTop);
}
diff --git a/patches/server/0187-Config-for-skipping-night.patch b/patches/server/0186-Config-for-skipping-night.patch
similarity index 88%
rename from patches/server/0187-Config-for-skipping-night.patch
rename to patches/server/0186-Config-for-skipping-night.patch
index c112d3b0d2..e468115857 100644
--- a/patches/server/0187-Config-for-skipping-night.patch
+++ b/patches/server/0186-Config-for-skipping-night.patch
@@ -5,7 +5,7 @@ Subject: [PATCH] Config for skipping night
diff --git a/src/main/java/net/minecraft/server/level/WorldServer.java b/src/main/java/net/minecraft/server/level/WorldServer.java
-index 028911ebe843751080564d90e96306524e5a2e21..f84066233f551be145a7db2694b3c7cb0c918128 100644
+index e76e54fb833ce69968d08f78836acf23e6436653..db91e4ca583f676fe74d35a2368b3c39ab58cd9a 100644
--- a/src/main/java/net/minecraft/server/level/WorldServer.java
+++ b/src/main/java/net/minecraft/server/level/WorldServer.java
@@ -1028,7 +1028,7 @@ public class WorldServer extends World implements GeneratorAccessSeed {
@@ -18,10 +18,10 @@ index 028911ebe843751080564d90e96306524e5a2e21..f84066233f551be145a7db2694b3c7cb
})) {
// CraftBukkit start
diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-index e5fc4fbd6bb417607ced21d84ca0e85804d107cb..2932b5f7a5a10dcc83755066c692f5edf7fafa1a 100644
+index bb3c5d34b58ccf9bbaa1102e36b82a56f0dda7e3..c87ce9aed539f382e91fcfae956339068a618b79 100644
--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-@@ -323,6 +323,7 @@ public class PurpurWorldConfig {
+@@ -334,6 +334,7 @@ public class PurpurWorldConfig {
public int animalBreedingCooldownSeconds = 0;
public boolean creativeOnePunch = false;
public boolean playerSleepNearMonsters = false;
@@ -29,7 +29,7 @@ index e5fc4fbd6bb417607ced21d84ca0e85804d107cb..2932b5f7a5a10dcc83755066c692f5ed
private void miscGameplayMechanicsSettings() {
useBetterMending = getBoolean("gameplay-mechanics.use-better-mending", useBetterMending);
alwaysTameInCreative = getBoolean("gameplay-mechanics.always-tame-in-creative", alwaysTameInCreative);
-@@ -342,6 +343,7 @@ public class PurpurWorldConfig {
+@@ -354,6 +355,7 @@ public class PurpurWorldConfig {
animalBreedingCooldownSeconds = getInt("gameplay-mechanics.animal-breeding-cooldown-seconds", animalBreedingCooldownSeconds);
creativeOnePunch = getBoolean("gameplay-mechanics.player.one-punch-in-creative", creativeOnePunch);
playerSleepNearMonsters = getBoolean("gameplay-mechanics.player.sleep-ignore-nearby-mobs", playerSleepNearMonsters);
diff --git a/patches/server/0188-Add-config-for-villager-trading.patch b/patches/server/0187-Add-config-for-villager-trading.patch
similarity index 87%
rename from patches/server/0188-Add-config-for-villager-trading.patch
rename to patches/server/0187-Add-config-for-villager-trading.patch
index e28397b9ef..b96d228c3f 100644
--- a/patches/server/0188-Add-config-for-villager-trading.patch
+++ b/patches/server/0187-Add-config-for-villager-trading.patch
@@ -5,7 +5,7 @@ Subject: [PATCH] Add config for villager trading
diff --git a/src/main/java/net/minecraft/world/entity/npc/EntityVillager.java b/src/main/java/net/minecraft/world/entity/npc/EntityVillager.java
-index 16933de70a23414859019e19545bfa5baa38091a..a02748bff911415d95bea344f179ad27ff9d6092 100644
+index f911cd4cf2ad82e81b09f92063abd573797fe5d6..4903d79ad1036df8f52aded6ddaca604d4a8434a 100644
--- a/src/main/java/net/minecraft/world/entity/npc/EntityVillager.java
+++ b/src/main/java/net/minecraft/world/entity/npc/EntityVillager.java
@@ -373,7 +373,7 @@ public class EntityVillager extends EntityVillagerAbstract implements Reputation
@@ -18,10 +18,10 @@ index 16933de70a23414859019e19545bfa5baa38091a..a02748bff911415d95bea344f179ad27
}
diff --git a/src/main/java/net/minecraft/world/entity/npc/EntityVillagerTrader.java b/src/main/java/net/minecraft/world/entity/npc/EntityVillagerTrader.java
-index b84916c0c58fd208ef5547299f8db8462d1c42fe..0b6b6aa6b358759c45bbcf4a9ffa53777c8efa1d 100644
+index f6e0a92037d22de102c42cc1953ea90919bd3a34..03e811e854034c6ca9cd11d35ed0a2dbd14c6097 100644
--- a/src/main/java/net/minecraft/world/entity/npc/EntityVillagerTrader.java
+++ b/src/main/java/net/minecraft/world/entity/npc/EntityVillagerTrader.java
-@@ -142,7 +142,7 @@ public class EntityVillagerTrader extends EntityVillagerAbstract {
+@@ -146,7 +146,7 @@ public class EntityVillagerTrader extends EntityVillagerAbstract {
return tryRide(entityhuman, enumhand); // Purpur
} else {
if (world.purpurConfig.villagerTraderRidable && itemstack.isEmpty()) return tryRide(entityhuman, enumhand); // Purpur
@@ -31,10 +31,10 @@ index b84916c0c58fd208ef5547299f8db8462d1c42fe..0b6b6aa6b358759c45bbcf4a9ffa5377
this.openTrade(entityhuman, this.getScoreboardDisplayName(), 1);
}
diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-index 2932b5f7a5a10dcc83755066c692f5edf7fafa1a..82f1a60b57c94f4e301b8048c6b1de15c9f7b41f 100644
+index c87ce9aed539f382e91fcfae956339068a618b79..c2314380e7064459dd104b09b900c5a28b592b71 100644
--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-@@ -1760,6 +1760,7 @@ public class PurpurWorldConfig {
+@@ -1772,6 +1772,7 @@ public class PurpurWorldConfig {
public boolean villagerClericsFarmWarts = false;
public boolean villagerClericFarmersThrowWarts = true;
public double villagerMaxHealth = 20.0D;
@@ -42,7 +42,7 @@ index 2932b5f7a5a10dcc83755066c692f5edf7fafa1a..82f1a60b57c94f4e301b8048c6b1de15
private void villagerSettings() {
villagerRidable = getBoolean("mobs.villager.ridable", villagerRidable);
villagerRidableInWater = getBoolean("mobs.villager.ridable-in-water", villagerRidableInWater);
-@@ -1787,6 +1788,7 @@ public class PurpurWorldConfig {
+@@ -1799,6 +1800,7 @@ public class PurpurWorldConfig {
set("mobs.villager.attributes.max_health", oldValue);
}
villagerMaxHealth = getDouble("mobs.villager.attributes.max_health", villagerMaxHealth);
@@ -50,7 +50,7 @@ index 2932b5f7a5a10dcc83755066c692f5edf7fafa1a..82f1a60b57c94f4e301b8048c6b1de15
}
public boolean villagerTraderRidable = false;
-@@ -1794,6 +1796,7 @@ public class PurpurWorldConfig {
+@@ -1806,6 +1808,7 @@ public class PurpurWorldConfig {
public boolean villagerTraderCanBeLeashed = false;
public boolean villagerTraderFollowEmeraldBlock = false;
public double villagerTraderMaxHealth = 20.0D;
@@ -58,7 +58,7 @@ index 2932b5f7a5a10dcc83755066c692f5edf7fafa1a..82f1a60b57c94f4e301b8048c6b1de15
private void villagerTraderSettings() {
villagerTraderRidable = getBoolean("mobs.wandering_trader.ridable", villagerTraderRidable);
villagerTraderRidableInWater = getBoolean("mobs.wandering_trader.ridable-in-water", villagerTraderRidableInWater);
-@@ -1805,6 +1808,7 @@ public class PurpurWorldConfig {
+@@ -1817,6 +1820,7 @@ public class PurpurWorldConfig {
set("mobs.wandering_trader.attributes.max_health", oldValue);
}
villagerTraderMaxHealth = getDouble("mobs.wandering_trader.attributes.max_health", villagerTraderMaxHealth);
diff --git a/patches/server/0189-Allow-infinity-on-crossbows.patch b/patches/server/0188-Allow-infinity-on-crossbows.patch
similarity index 100%
rename from patches/server/0189-Allow-infinity-on-crossbows.patch
rename to patches/server/0188-Allow-infinity-on-crossbows.patch
diff --git a/patches/server/0190-Drowning-Settings.patch b/patches/server/0189-Drowning-Settings.patch
similarity index 88%
rename from patches/server/0190-Drowning-Settings.patch
rename to patches/server/0189-Drowning-Settings.patch
index 03420f7216..c4cf3aabfe 100644
--- a/patches/server/0190-Drowning-Settings.patch
+++ b/patches/server/0189-Drowning-Settings.patch
@@ -5,10 +5,10 @@ Subject: [PATCH] Drowning Settings
diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java
-index f3151969e5841861d31ac50abdfef3c65e5198a3..706a1e2fadb0880277093be5de63f4dc0792fb72 100644
+index 3d9116d9e562e70cd20a6fa8ca561dff04f20907..6d8197c6c3f430c1f218431ffe72d0fddad82674 100644
--- a/src/main/java/net/minecraft/world/entity/Entity.java
+++ b/src/main/java/net/minecraft/world/entity/Entity.java
-@@ -2606,7 +2606,7 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, ne
+@@ -2605,7 +2605,7 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, ne
}
public int getDefaultPortalCooldown() {
@@ -18,7 +18,7 @@ index f3151969e5841861d31ac50abdfef3c65e5198a3..706a1e2fadb0880277093be5de63f4dc
public Iterable bn() {
diff --git a/src/main/java/net/minecraft/world/entity/EntityLiving.java b/src/main/java/net/minecraft/world/entity/EntityLiving.java
-index 93f8aa6d40b1eba6535f170bf0a79417d7d21069..8db61c8b392c8e95f6896b6e48e4d74ddd6b8708 100644
+index 008c97dc6f5b9c08c86d6c2743a6389086d3359e..aa2106e038ff882924be5b956af7cb3e8ff00397 100644
--- a/src/main/java/net/minecraft/world/entity/EntityLiving.java
+++ b/src/main/java/net/minecraft/world/entity/EntityLiving.java
@@ -394,7 +394,7 @@ public abstract class EntityLiving extends Entity {
@@ -40,10 +40,10 @@ index 93f8aa6d40b1eba6535f170bf0a79417d7d21069..8db61c8b392c8e95f6896b6e48e4d74d
}
diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-index 82f1a60b57c94f4e301b8048c6b1de15c9f7b41f..0c79d6af4604d900bfa33f544ac0e0e56932de50 100644
+index c2314380e7064459dd104b09b900c5a28b592b71..82da1dd5bb8b02c948be51fa941d3b31a3f0dc20 100644
--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-@@ -2035,6 +2035,15 @@ public class PurpurWorldConfig {
+@@ -2047,6 +2047,15 @@ public class PurpurWorldConfig {
imposeTeleportRestrictionsOnGateways = getBoolean("gameplay-mechanics.impose-teleport-restrictions-on-gateways", imposeTeleportRestrictionsOnGateways);
}
diff --git a/patches/server/0191-Break-individual-slabs-when-sneaking.patch b/patches/server/0190-Break-individual-slabs-when-sneaking.patch
similarity index 96%
rename from patches/server/0191-Break-individual-slabs-when-sneaking.patch
rename to patches/server/0190-Break-individual-slabs-when-sneaking.patch
index 435ed3ebb8..989dfd74b2 100644
--- a/patches/server/0191-Break-individual-slabs-when-sneaking.patch
+++ b/patches/server/0190-Break-individual-slabs-when-sneaking.patch
@@ -57,10 +57,10 @@ index 12c0fa5072755fd2a4f575b0cc5e4222617490ce..94965b216d50b29b95f09fa9019c177b
+ // Purpur end
}
diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-index 0c79d6af4604d900bfa33f544ac0e0e56932de50..a927869cdb6e935226a20200827bd297aac4e8b2 100644
+index 82da1dd5bb8b02c948be51fa941d3b31a3f0dc20..accfdc659f97fb75387776326f4d1b6bd1742aaf 100644
--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-@@ -563,6 +563,11 @@ public class PurpurWorldConfig {
+@@ -575,6 +575,11 @@ public class PurpurWorldConfig {
signRightClickEdit = getBoolean("blocks.sign.right-click-edit", signRightClickEdit);
}
diff --git a/patches/server/0192-Config-to-disable-hostile-mob-spawn-on-ice.patch b/patches/server/0191-Config-to-disable-hostile-mob-spawn-on-ice.patch
similarity index 93%
rename from patches/server/0192-Config-to-disable-hostile-mob-spawn-on-ice.patch
rename to patches/server/0191-Config-to-disable-hostile-mob-spawn-on-ice.patch
index cc0a2cb2b9..91f4ba15f8 100644
--- a/patches/server/0192-Config-to-disable-hostile-mob-spawn-on-ice.patch
+++ b/patches/server/0191-Config-to-disable-hostile-mob-spawn-on-ice.patch
@@ -22,10 +22,10 @@ index c484e27650364b6537fe6b2e8e14de98382b86a3..096a7b76e0ae42ba8b859159e20fb72e
return false;
} else {
diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-index a927869cdb6e935226a20200827bd297aac4e8b2..2f544d8bb44a1bee18468cb8611591413507c521 100644
+index accfdc659f97fb75387776326f4d1b6bd1742aaf..cb20d4cccbaf52d71df7e1e4f877f6938f2969e3 100644
--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-@@ -483,8 +483,12 @@ public class PurpurWorldConfig {
+@@ -495,8 +495,12 @@ public class PurpurWorldConfig {
}
public boolean snowOnBlueIce = true;
diff --git a/patches/server/0193-Config-to-show-Armor-Stand-arms-on-spawn.patch b/patches/server/0192-Config-to-show-Armor-Stand-arms-on-spawn.patch
similarity index 96%
rename from patches/server/0193-Config-to-show-Armor-Stand-arms-on-spawn.patch
rename to patches/server/0192-Config-to-show-Armor-Stand-arms-on-spawn.patch
index 717ade0e64..9955fb63f3 100644
--- a/patches/server/0193-Config-to-show-Armor-Stand-arms-on-spawn.patch
+++ b/patches/server/0192-Config-to-show-Armor-Stand-arms-on-spawn.patch
@@ -17,7 +17,7 @@ index ecb797e67554d30e35b3aca4d0fc9b0e3f6c1a50..ddc1c3383cdc32fa832485f3922c7418
public EntityArmorStand(World world, double d0, double d1, double d2) {
diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-index 2f544d8bb44a1bee18468cb8611591413507c521..47f5be1a1adb8cf98b84324e346cbf60099840c0 100644
+index cb20d4cccbaf52d71df7e1e4f877f6938f2969e3..295cc5427a1bdc8f89a0b0c34b3c1f1db7c47a2f 100644
--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
@@ -114,6 +114,7 @@ public class PurpurWorldConfig {
diff --git a/patches/server/0194-Option-to-make-doors-require-redstone.patch b/patches/server/0193-Option-to-make-doors-require-redstone.patch
similarity index 97%
rename from patches/server/0194-Option-to-make-doors-require-redstone.patch
rename to patches/server/0193-Option-to-make-doors-require-redstone.patch
index a59f6c328b..086353f9ff 100644
--- a/patches/server/0194-Option-to-make-doors-require-redstone.patch
+++ b/patches/server/0193-Option-to-make-doors-require-redstone.patch
@@ -70,10 +70,10 @@ index 453b46851f021d4285be123bedc8982fc8844da2..2a7695c899b12c87ab89d00116b6f0dd
+ // Purpur end
}
diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-index 47f5be1a1adb8cf98b84324e346cbf60099840c0..813752be37c5f2956c4f10dcd974e4437020906c 100644
+index 295cc5427a1bdc8f89a0b0c34b3c1f1db7c47a2f..9cb06d3e3109c08b2e9f3336365dd14241c4faca 100644
--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-@@ -484,6 +484,16 @@ public class PurpurWorldConfig {
+@@ -496,6 +496,16 @@ public class PurpurWorldConfig {
}
}
diff --git a/patches/server/0195-Config-to-allow-for-unsafe-enchants.patch b/patches/server/0194-Config-to-allow-for-unsafe-enchants.patch
similarity index 100%
rename from patches/server/0195-Config-to-allow-for-unsafe-enchants.patch
rename to patches/server/0194-Config-to-allow-for-unsafe-enchants.patch
diff --git a/patches/server/0196-Configurable-sponge-absorption.patch b/patches/server/0195-Configurable-sponge-absorption.patch
similarity index 95%
rename from patches/server/0196-Configurable-sponge-absorption.patch
rename to patches/server/0195-Configurable-sponge-absorption.patch
index e3553be729..b5c4dbcd16 100644
--- a/patches/server/0196-Configurable-sponge-absorption.patch
+++ b/patches/server/0195-Configurable-sponge-absorption.patch
@@ -43,10 +43,10 @@ index d80eee47390ab202eea0368571421bbc94655ab1..b36536d4cc95797c59549f5db1f67b34
}
}
diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-index 813752be37c5f2956c4f10dcd974e4437020906c..e2504bf2846b66563936fc9329561da66e8ae985 100644
+index 9cb06d3e3109c08b2e9f3336365dd14241c4faca..8be800300b6cbbd17ede87f279ebb04e9c9123fc 100644
--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-@@ -589,6 +589,13 @@ public class PurpurWorldConfig {
+@@ -601,6 +601,13 @@ public class PurpurWorldConfig {
spawnerDeactivateByRedstone = getBoolean("blocks.spawner.deactivate-by-redstone", spawnerDeactivateByRedstone);
}
diff --git a/patches/server/0197-Projectile-offset-config.patch b/patches/server/0196-Projectile-offset-config.patch
similarity index 98%
rename from patches/server/0197-Projectile-offset-config.patch
rename to patches/server/0196-Projectile-offset-config.patch
index 3f9fbdde7f..3ffdffca30 100644
--- a/patches/server/0197-Projectile-offset-config.patch
+++ b/patches/server/0196-Projectile-offset-config.patch
@@ -96,10 +96,10 @@ index 0711d195c654edef5875f587e391bacfdea096da..2341c98859faa61662d7ed343e6ed157
entitythrowntrident.fromPlayer = EntityArrow.PickupStatus.CREATIVE_ONLY;
}
diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-index e2504bf2846b66563936fc9329561da66e8ae985..75cae460f560a3825915a96126f28ce3d4f9e182 100644
+index 8be800300b6cbbd17ede87f279ebb04e9c9123fc..ad2e2ae106295a8ce84b404998de535724fd9427 100644
--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-@@ -307,6 +307,23 @@ public class PurpurWorldConfig {
+@@ -317,6 +317,23 @@ public class PurpurWorldConfig {
snowballDamage = getInt("gameplay-mechanics.projectile-damage.snowball", snowballDamage);
}
diff --git a/patches/server/0198-Config-for-powered-rail-activation-distance.patch b/patches/server/0197-Config-for-powered-rail-activation-distance.patch
similarity index 91%
rename from patches/server/0198-Config-for-powered-rail-activation-distance.patch
rename to patches/server/0197-Config-for-powered-rail-activation-distance.patch
index 5c008316ca..a045e1947e 100644
--- a/patches/server/0198-Config-for-powered-rail-activation-distance.patch
+++ b/patches/server/0197-Config-for-powered-rail-activation-distance.patch
@@ -18,10 +18,10 @@ index b26e168fbf49bbe7ec981b5b186c94ca67827f4a..bc91c96a29dcc60c578b342055b8eaf3
} else {
int j = blockposition.getX();
diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-index 75cae460f560a3825915a96126f28ce3d4f9e182..3b380cd47061724b20e153d97bac865d344a2eec 100644
+index ad2e2ae106295a8ce84b404998de535724fd9427..37835f19ce917b36cb56e0d0d58d9be349919cab 100644
--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-@@ -573,6 +573,11 @@ public class PurpurWorldConfig {
+@@ -585,6 +585,11 @@ public class PurpurWorldConfig {
lavaSpeedNotNether = getInt("blocks.lava.speed.not-nether", lavaSpeedNotNether);
}
diff --git a/patches/server/0199-Piglin-portal-spawn-modifier.patch b/patches/server/0198-Piglin-portal-spawn-modifier.patch
similarity index 93%
rename from patches/server/0199-Piglin-portal-spawn-modifier.patch
rename to patches/server/0198-Piglin-portal-spawn-modifier.patch
index fa7f95737c..c0636e3aaf 100644
--- a/patches/server/0199-Piglin-portal-spawn-modifier.patch
+++ b/patches/server/0198-Piglin-portal-spawn-modifier.patch
@@ -31,10 +31,10 @@ index ac5ce96ab62ec210816e7af85a4269073b7a9270..84140e01eba780ffb8289bff75d1b58a
blockposition = blockposition.down();
}
diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-index 3b380cd47061724b20e153d97bac865d344a2eec..f3cde1e3d06da82b7a54898df5d331f279b2a954 100644
+index 37835f19ce917b36cb56e0d0d58d9be349919cab..78e4ef0103e1c9f96ec160e74b870902eda5e842 100644
--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-@@ -1407,6 +1407,7 @@ public class PurpurWorldConfig {
+@@ -1419,6 +1419,7 @@ public class PurpurWorldConfig {
public boolean piglinRidable = false;
public boolean piglinRidableInWater = false;
public double piglinMaxHealth = 16.0D;
@@ -42,7 +42,7 @@ index 3b380cd47061724b20e153d97bac865d344a2eec..f3cde1e3d06da82b7a54898df5d331f2
private void piglinSettings() {
piglinRidable = getBoolean("mobs.piglin.ridable", piglinRidable);
piglinRidableInWater = getBoolean("mobs.piglin.ridable-in-water", piglinRidableInWater);
-@@ -1416,6 +1417,7 @@ public class PurpurWorldConfig {
+@@ -1428,6 +1429,7 @@ public class PurpurWorldConfig {
set("mobs.piglin.attributes.max_health", oldValue);
}
piglinMaxHealth = getDouble("mobs.piglin.attributes.max_health", piglinMaxHealth);
diff --git a/patches/server/0200-Config-to-change-max-number-of-bees.patch b/patches/server/0199-Config-to-change-max-number-of-bees.patch
similarity index 96%
rename from patches/server/0200-Config-to-change-max-number-of-bees.patch
rename to patches/server/0199-Config-to-change-max-number-of-bees.patch
index 63d5396a09..c21f11fb7a 100644
--- a/patches/server/0200-Config-to-change-max-number-of-bees.patch
+++ b/patches/server/0199-Config-to-change-max-number-of-bees.patch
@@ -5,7 +5,7 @@ Subject: [PATCH] Config to change max number of bees
diff --git a/src/main/java/net/minecraft/world/level/block/entity/TileEntityBeehive.java b/src/main/java/net/minecraft/world/level/block/entity/TileEntityBeehive.java
-index 3cbcbb028b864f1d14e004628bbc0829f71ab476..3ce6a1b1f75443d1d1c6740d6f3f730f06a34f6a 100644
+index 80083a6666a28372946cf0e68ded44d075357f7d..58bf1008ab19340bce5111e006a8de0e7f39e0e5 100644
--- a/src/main/java/net/minecraft/world/level/block/entity/TileEntityBeehive.java
+++ b/src/main/java/net/minecraft/world/level/block/entity/TileEntityBeehive.java
@@ -29,7 +29,7 @@ public class TileEntityBeehive extends TileEntity implements ITickable {
diff --git a/patches/server/0201-Configurable-damage-settings-for-magma-blocks.patch b/patches/server/0200-Configurable-damage-settings-for-magma-blocks.patch
similarity index 74%
rename from patches/server/0201-Configurable-damage-settings-for-magma-blocks.patch
rename to patches/server/0200-Configurable-damage-settings-for-magma-blocks.patch
index fe2252a90f..cc6f278c5d 100644
--- a/patches/server/0201-Configurable-damage-settings-for-magma-blocks.patch
+++ b/patches/server/0200-Configurable-damage-settings-for-magma-blocks.patch
@@ -5,25 +5,18 @@ Subject: [PATCH] Configurable damage settings for magma blocks
diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java
-index 706a1e2fadb0880277093be5de63f4dc0792fb72..f498bba37f3a40060a0847500b70e7cb55c745cd 100644
+index 6d8197c6c3f430c1f218431ffe72d0fddad82674..d52ac77516cbf62293afbbfdd96f5a4861a3025f 100644
--- a/src/main/java/net/minecraft/world/entity/Entity.java
+++ b/src/main/java/net/minecraft/world/entity/Entity.java
-@@ -894,9 +894,15 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, ne
+@@ -893,7 +893,7 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, ne
}
// CraftBukkit end
-+ // Purpur start
-+ if (block instanceof net.minecraft.world.level.block.BlockMagma && this.onGround) {
-+ block.stepOn(this.world, blockposition, this);
-+ } else {
- if (this.onGround && !this.bv()) {
+- if (this.onGround && (!this.bv() || (block == Blocks.STONECUTTER && world.purpurConfig.stonecutterDamage > 0.0F))) { // Purpur
++ if (this.onGround && (!this.bv() || (block == Blocks.STONECUTTER && world.purpurConfig.stonecutterDamage > 0.0F) || (block == Blocks.MAGMA_BLOCK && world.purpurConfig.magmaBlockDamageWhenSneaking))) { // Purpur
block.stepOn(this.world, blockposition, this);
}
-+ }
-+ // Purpur end
- if (this.playStepSound() && !this.isPassenger()) {
- double d0 = vec3d1.x;
diff --git a/src/main/java/net/minecraft/world/item/enchantment/EnchantmentManager.java b/src/main/java/net/minecraft/world/item/enchantment/EnchantmentManager.java
index b2d28c2bf0a9e93d38583e2d734c12fed4f63d5d..b889e5426781da215b5c26477015d04457142213 100644
--- a/src/main/java/net/minecraft/world/item/enchantment/EnchantmentManager.java
@@ -38,7 +31,7 @@ index b2d28c2bf0a9e93d38583e2d734c12fed4f63d5d..b889e5426781da215b5c26477015d044
}
diff --git a/src/main/java/net/minecraft/world/level/block/BlockMagma.java b/src/main/java/net/minecraft/world/level/block/BlockMagma.java
-index 4559085fa4452d3a9f59ed967ccb69a7823718e5..f1c53428c8f9eb0922fc16f152c6566d1a32cac0 100644
+index 4559085fa4452d3a9f59ed967ccb69a7823718e5..0d9e9f972066c1114971d825468b64f53a4af1d2 100644
--- a/src/main/java/net/minecraft/world/level/block/BlockMagma.java
+++ b/src/main/java/net/minecraft/world/level/block/BlockMagma.java
@@ -27,7 +27,7 @@ public class BlockMagma extends Block {
@@ -46,15 +39,15 @@ index 4559085fa4452d3a9f59ed967ccb69a7823718e5..f1c53428c8f9eb0922fc16f152c6566d
@Override
public void stepOn(World world, BlockPosition blockposition, Entity entity) {
- if (!entity.isFireProof() && entity instanceof EntityLiving && !EnchantmentManager.i((EntityLiving) entity)) {
-+ if (!entity.isFireProof() && entity instanceof EntityLiving && (world.purpurConfig.magmaBlockDamageWhenSneaking || !entity.isSneaking()) && (world.purpurConfig.magmaBlockDamageWithFrostWalker || !EnchantmentManager.hasFrostWalker((EntityLiving) entity))) { // Purpur
++ if (!entity.isFireProof() && entity instanceof EntityLiving && (world.purpurConfig.magmaBlockDamageWithFrostWalker || !EnchantmentManager.hasFrostWalker((EntityLiving) entity))) { // Purpur
org.bukkit.craftbukkit.event.CraftEventFactory.blockDamage = world.getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()); // CraftBukkit
entity.damageEntity(DamageSource.HOT_FLOOR, 1.0F);
org.bukkit.craftbukkit.event.CraftEventFactory.blockDamage = null; // CraftBukkit
diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-index f3cde1e3d06da82b7a54898df5d331f279b2a954..78e39c9424c296bf07f89d63ce42b02b96c2cd35 100644
+index 78e4ef0103e1c9f96ec160e74b870902eda5e842..9ad9d80331ea52c08500cd9155ba6fdc1bc22a3a 100644
--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-@@ -2124,4 +2124,11 @@ public class PurpurWorldConfig {
+@@ -2136,4 +2136,11 @@ public class PurpurWorldConfig {
baseCrystalExplosionEffect = Explosion.Effect.DESTROY;
}
}
diff --git a/patches/server/0202-Config-for-wither-explosion-radius.patch b/patches/server/0201-Config-for-wither-explosion-radius.patch
similarity index 91%
rename from patches/server/0202-Config-for-wither-explosion-radius.patch
rename to patches/server/0201-Config-for-wither-explosion-radius.patch
index 478a88895d..3ae87def39 100644
--- a/patches/server/0202-Config-for-wither-explosion-radius.patch
+++ b/patches/server/0201-Config-for-wither-explosion-radius.patch
@@ -18,10 +18,10 @@ index 616b5267d1d94b2be37ec48983b45e4478502fb5..052cffb156e4e6f31df3935fd8312eb3
if (!event.isCancelled()) {
diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-index 78e39c9424c296bf07f89d63ce42b02b96c2cd35..69d6ced8e583a3a0625ced9d444caca21fa80723 100644
+index 9ad9d80331ea52c08500cd9155ba6fdc1bc22a3a..3d3e4e686cd74145b002b2df276e61762697918b 100644
--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
-@@ -1901,6 +1901,7 @@ public class PurpurWorldConfig {
+@@ -1913,6 +1913,7 @@ public class PurpurWorldConfig {
public int witherHealthRegenDelay = 20;
public double witherMaxHealth = 300.0D;
public boolean witherCanRideVehicles = false;
@@ -29,7 +29,7 @@ index 78e39c9424c296bf07f89d63ce42b02b96c2cd35..69d6ced8e583a3a0625ced9d444caca2
private void witherSettings() {
witherRidable = getBoolean("mobs.wither.ridable", witherRidable);
witherRidableInWater = getBoolean("mobs.wither.ridable-in-water", witherRidableInWater);
-@@ -1919,6 +1920,7 @@ public class PurpurWorldConfig {
+@@ -1931,6 +1932,7 @@ public class PurpurWorldConfig {
}
witherMaxHealth = getDouble("mobs.wither.attributes.max_health", witherMaxHealth);
witherCanRideVehicles = getBoolean("mobs.wither.can-ride-vehicles", witherCanRideVehicles);
diff --git a/patches/server/0202-Add-credits-command.patch b/patches/server/0202-Add-credits-command.patch
new file mode 100644
index 0000000000..993d994edc
--- /dev/null
+++ b/patches/server/0202-Add-credits-command.patch
@@ -0,0 +1,98 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Encode42
+Date: Fri, 30 Apr 2021 14:03:06 -0400
+Subject: [PATCH] Add credits command
+
+
+diff --git a/src/main/java/net/minecraft/commands/CommandDispatcher.java b/src/main/java/net/minecraft/commands/CommandDispatcher.java
+index ce95a7d9c967d723bad468bd00a5c0a6b887aa33..0703148d079d86921dac42ef90e514d3584bf569 100644
+--- a/src/main/java/net/minecraft/commands/CommandDispatcher.java
++++ b/src/main/java/net/minecraft/commands/CommandDispatcher.java
+@@ -191,6 +191,7 @@ public class CommandDispatcher {
+ CommandIdleTimeout.a(this.b);
+ CommandStop.a(this.b);
+ CommandWhitelist.a(this.b);
++ net.pl3x.purpur.command.CreditsCommand.register(getDispatcher()); // Purpur
+ net.pl3x.purpur.command.DemoCommand.register(getDispatcher()); // Purpur
+ net.pl3x.purpur.command.PingCommand.register(getDispatcher()); // Purpur
+ net.pl3x.purpur.command.TPSBarCommand.register(getDispatcher()); // Purpur
+diff --git a/src/main/java/net/minecraft/network/protocol/game/PacketPlayOutGameStateChange.java b/src/main/java/net/minecraft/network/protocol/game/PacketPlayOutGameStateChange.java
+index 0161657748d398b6827ef8bc2b00b8a63bf37c55..aaff933c5bf619303842ce6b9a9dc979bcfde7bd 100644
+--- a/src/main/java/net/minecraft/network/protocol/game/PacketPlayOutGameStateChange.java
++++ b/src/main/java/net/minecraft/network/protocol/game/PacketPlayOutGameStateChange.java
+@@ -12,7 +12,7 @@ public class PacketPlayOutGameStateChange implements Packet dispatcher) {
++ dispatcher.register(CommandDispatcher.literal("credits")
++ .requires((listener) -> {
++ return listener.hasPermission(2);
++ })
++ .executes((context) -> {
++ return execute(context.getSource(), Collections.singleton(context.getSource().getPlayerOrException()));
++ })
++ .then(CommandDispatcher.argument("targets", ArgumentEntity.players())
++ .executes((context) -> {
++ return execute(context.getSource(), ArgumentEntity.getPlayers(context, "targets"));
++ })
++ )
++ ).setPermission("bukkit.command.credits");
++ }
++
++ private static int execute(CommandListenerWrapper sender, Collection targets) {
++ for (EntityPlayer player : targets) {
++ PacketPlayOutGameStateChange packet = new PacketPlayOutGameStateChange(PacketPlayOutGameStateChange.credits(), 1F);
++ player.viewingCredits = true;
++ player.playerConnection.sendPacket(packet);
++ String output = String.format(PurpurConfig.creditsCommandOutput, player.getProfile().getName());
++ sender.sendMessage(CraftChatMessage.fromStringOrNull(output), false);
++ }
++ return targets.size();
++ }
++}
diff --git a/patches/server/0203-Gamemode-extra-permissions.patch b/patches/server/0203-Gamemode-extra-permissions.patch
new file mode 100644
index 0000000000..af93f8e534
--- /dev/null
+++ b/patches/server/0203-Gamemode-extra-permissions.patch
@@ -0,0 +1,78 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: BillyGalbreath
+Date: Fri, 30 Apr 2021 13:39:39 -0500
+Subject: [PATCH] Gamemode extra permissions
+
+
+diff --git a/src/main/java/net/minecraft/commands/CommandListenerWrapper.java b/src/main/java/net/minecraft/commands/CommandListenerWrapper.java
+index 4480fe75cfad35a5104b5116c5ec2c80d18f15f5..d73daa29f784283e03ad2ea3126cca7e572602d4 100644
+--- a/src/main/java/net/minecraft/commands/CommandListenerWrapper.java
++++ b/src/main/java/net/minecraft/commands/CommandListenerWrapper.java
+@@ -190,6 +190,21 @@ public class CommandListenerWrapper implements ICompletionProvider, com.destroys
+ }
+ // CraftBukkit end
+
++ // Purpur start
++ public boolean testPermission(int i, String bukkitPermission) {
++ if (hasPermission(i, bukkitPermission)) {
++ return true;
++ }
++ String permissionMessage = getWorld().getServer().getPermissionMessage();
++ if (permissionMessage.length() != 0) {
++ for (String line : permissionMessage.replace("", bukkitPermission).split("\n")) {
++ sendFailureMessage(new ChatComponentText(line));
++ }
++ }
++ return false;
++ }
++ // Purpur end
++
+ public Vec3D getPosition() {
+ return this.d;
+ }
+diff --git a/src/main/java/net/minecraft/server/commands/CommandGamemode.java b/src/main/java/net/minecraft/server/commands/CommandGamemode.java
+index 376d5eac9c17365266d8a4986bf4c19030454c9a..f004d027d673ec09c768c3ab0734b6b099921ef9 100644
+--- a/src/main/java/net/minecraft/server/commands/CommandGamemode.java
++++ b/src/main/java/net/minecraft/server/commands/CommandGamemode.java
+@@ -55,6 +55,7 @@ public class CommandGamemode {
+ }
+
+ private static int a(CommandContext commandcontext, Collection collection, EnumGamemode enumgamemode) {
++ if (net.pl3x.purpur.PurpurConfig.commandGamemodeRequiresPermission && !commandcontext.getSource().testPermission(2, "minecraft.command.gamemode." + enumgamemode.b())) return 0; // Purpur
+ int i = 0;
+ Iterator iterator = collection.iterator();
+
+diff --git a/src/main/java/net/pl3x/purpur/PurpurConfig.java b/src/main/java/net/pl3x/purpur/PurpurConfig.java
+index e0228fb58149ac8a9430d54157d5e92c93618f22..56424e45c04e7165c0671f74cdcd0147d1069af7 100644
+--- a/src/main/java/net/pl3x/purpur/PurpurConfig.java
++++ b/src/main/java/net/pl3x/purpur/PurpurConfig.java
+@@ -211,6 +211,11 @@ public class PurpurConfig {
+ disableGiveCommandDrops = getBoolean("settings.disable-give-dropping", disableGiveCommandDrops);
+ }
+
++ public static boolean commandGamemodeRequiresPermission = false;
++ private static void commandSettings() {
++ commandGamemodeRequiresPermission = getBoolean("settings.command.gamemode.requires-specific-permission", commandGamemodeRequiresPermission);
++ }
++
+ public static boolean barrelSixRows = false;
+ public static boolean enderChestSixRows = false;
+ public static boolean enderChestPermissionRows = false;
+diff --git a/src/main/java/org/bukkit/craftbukkit/util/permissions/CommandPermissions.java b/src/main/java/org/bukkit/craftbukkit/util/permissions/CommandPermissions.java
+index f0a57d225b81a505ff12425155ba838d8fad990c..81ead4723872528c53efa9e0f23799571447ac86 100644
+--- a/src/main/java/org/bukkit/craftbukkit/util/permissions/CommandPermissions.java
++++ b/src/main/java/org/bukkit/craftbukkit/util/permissions/CommandPermissions.java
+@@ -23,7 +23,12 @@ public final class CommandPermissions {
+ DefaultPermissions.registerPermission(PREFIX + "kick", "Allows the user to kick players", PermissionDefault.OP, commands);
+ DefaultPermissions.registerPermission(PREFIX + "stop", "Allows the user to stop the server", PermissionDefault.OP, commands);
+ DefaultPermissions.registerPermission(PREFIX + "list", "Allows the user to list all online players", PermissionDefault.OP, commands);
+- DefaultPermissions.registerPermission(PREFIX + "gamemode", "Allows the user to change the gamemode of another player", PermissionDefault.OP, commands);
++ // Purpur start
++ Permission gamemode = DefaultPermissions.registerPermission(PREFIX + "gamemode", "Allows the user to change the gamemode of another player", PermissionDefault.OP, commands);
++ for (net.minecraft.world.level.EnumGamemode enumgamemode : net.minecraft.world.level.EnumGamemode.values()) {
++ gamemode.addParent(DefaultPermissions.registerPermission(PREFIX + "gamemode." + enumgamemode.b(), "Allows the user to set " + enumgamemode.b() + " gamemode", PermissionDefault.OP), true);
++ }
++ // Purpur end
+ DefaultPermissions.registerPermission(PREFIX + "xp", "Allows the user to give themselves or others arbitrary values of experience", PermissionDefault.OP, commands);
+ DefaultPermissions.registerPermission(PREFIX + "toggledownfall", "Allows the user to toggle rain on/off for a given world", PermissionDefault.OP, commands);
+ DefaultPermissions.registerPermission(PREFIX + "defaultgamemode", "Allows the user to change the default gamemode of the server", PermissionDefault.OP, commands);
diff --git a/patches/server/0204-Config-for-changing-the-blocks-that-turn-into-paths.patch b/patches/server/0204-Config-for-changing-the-blocks-that-turn-into-paths.patch
new file mode 100644
index 0000000000..a4558dd3ef
--- /dev/null
+++ b/patches/server/0204-Config-for-changing-the-blocks-that-turn-into-paths.patch
@@ -0,0 +1,40 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: 12emin34
+Date: Thu, 29 Apr 2021 23:56:02 +0200
+Subject: [PATCH] Config for changing the blocks that turn into paths
+
+
+diff --git a/src/main/java/net/minecraft/world/item/ItemSpade.java b/src/main/java/net/minecraft/world/item/ItemSpade.java
+index 9ba8ae49e18fb8714b434715bd669b8e22004cd7..c0c87d0dc8d6f02597219cd6a74e6ed7856ea229 100644
+--- a/src/main/java/net/minecraft/world/item/ItemSpade.java
++++ b/src/main/java/net/minecraft/world/item/ItemSpade.java
+@@ -43,7 +43,7 @@ public class ItemSpade extends ItemTool {
+ return EnumInteractionResult.PASS;
+ } else {
+ EntityHuman entityhuman = itemactioncontext.getEntity();
+- IBlockData iblockdata1 = (IBlockData) ItemSpade.a.get(iblockdata.getBlock());
++ IBlockData iblockdata1 = world.purpurConfig.shovelTurnsBlockToGrassPath.contains(iblockdata.getBlock()) ? Blocks.GRASS_PATH.getBlockData() : ItemSpade.a.get(iblockdata.getBlock()); // Purpur
+ IBlockData iblockdata2 = null;
+
+ if (iblockdata1 != null && world.getType(blockposition.up()).isAir()) {
+diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
+index 3d3e4e686cd74145b002b2df276e61762697918b..e082de2fdbd4803f5c79699b813062291f8e2bb7 100644
+--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
++++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
+@@ -469,6 +469,16 @@ public class PurpurWorldConfig {
+ totemOfUndyingWorksInInventory = getBoolean("gameplay-mechanics.player.totem-of-undying-works-in-inventory", totemOfUndyingWorksInInventory);
+ }
+
++ public List shovelTurnsBlockToGrassPath = new ArrayList<>();
++ private void shovelSettings() {
++ getList("gameplay-mechanics.shovel-turns-block-to-grass-path", new ArrayList(){{
++ add("minecraft:grass_block");
++ }}).forEach(key -> {
++ Block block = IRegistry.BLOCK.get(new MinecraftKey(key.toString()));
++ if (block != Blocks.AIR) shovelTurnsBlockToGrassPath.add(block);
++ });
++ }
++
+ public boolean silkTouchEnabled = false;
+ public String silkTouchSpawnerName = "Spawner";
+ public List silkTouchSpawnerLore = new ArrayList<>();
diff --git a/patches/server/0205-Allows-you-to-change-the-thrust-limit-of-a-piston-by.patch b/patches/server/0205-Allows-you-to-change-the-thrust-limit-of-a-piston-by.patch
new file mode 100644
index 0000000000..8c5c9d2d1f
--- /dev/null
+++ b/patches/server/0205-Allows-you-to-change-the-thrust-limit-of-a-piston-by.patch
@@ -0,0 +1,60 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: DoctaEnkoda
+Date: Sun, 2 May 2021 23:14:54 +0200
+Subject: [PATCH] Allows you to change the thrust limit of a piston by World
+
+
+diff --git a/src/main/java/net/minecraft/world/level/block/piston/PistonExtendsChecker.java b/src/main/java/net/minecraft/world/level/block/piston/PistonExtendsChecker.java
+index 6c9c4ab65b7e42efa68027057242e25b70313081..cbe34059659e0f80ff384508b01e516cd7c5e28a 100644
+--- a/src/main/java/net/minecraft/world/level/block/piston/PistonExtendsChecker.java
++++ b/src/main/java/net/minecraft/world/level/block/piston/PistonExtendsChecker.java
+@@ -12,7 +12,7 @@ import net.minecraft.world.level.material.EnumPistonReaction;
+
+ public class PistonExtendsChecker {
+
+- private final World a;
++ private final World a; public World getWorld() { return a; } // Purpur - OBFHELPER
+ private final BlockPosition b;
+ private final boolean c;
+ private final BlockPosition d;
+@@ -86,7 +86,7 @@ public class PistonExtendsChecker {
+ } else {
+ int i = 1;
+
+- if (i + this.f.size() > 12) {
++ if (i + this.f.size() > this.getWorld().purpurConfig.pistonBlockPushLimit) { // Purpur
+ return false;
+ } else {
+ while (a(block)) {
+@@ -100,7 +100,7 @@ public class PistonExtendsChecker {
+ }
+
+ ++i;
+- if (i + this.f.size() > 12) {
++ if (i + this.f.size() > this.getWorld().purpurConfig.pistonBlockPushLimit) { // Purpur
+ return false;
+ }
+ }
+@@ -148,7 +148,7 @@ public class PistonExtendsChecker {
+ return true;
+ }
+
+- if (this.f.size() >= 12) {
++ if (this.f.size() >= this.getWorld().purpurConfig.pistonBlockPushLimit) { // Purpur
+ return false;
+ }
+
+diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
+index e082de2fdbd4803f5c79699b813062291f8e2bb7..07c66f9d41e7a74021dde6702d654710e400e93b 100644
+--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
++++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
+@@ -2155,4 +2155,9 @@ public class PurpurWorldConfig {
+ magmaBlockDamageWhenSneaking = getBoolean("blocks.magma-block.damage-when-sneaking", magmaBlockDamageWhenSneaking);
+ magmaBlockDamageWithFrostWalker = getBoolean("blocks.magma-block.damage-with-frost-walker", magmaBlockDamageWithFrostWalker);
+ }
++
++ public int pistonBlockPushLimit = 12;
++ private void pistonSettings() {
++ pistonBlockPushLimit = getInt("blocks.piston.block-push-limit", pistonBlockPushLimit);
++ }
+ }
diff --git a/patches/server/0206-Allows-to-display-progress-messages-by-player-instea.patch b/patches/server/0206-Allows-to-display-progress-messages-by-player-instea.patch
new file mode 100644
index 0000000000..5037fba494
--- /dev/null
+++ b/patches/server/0206-Allows-to-display-progress-messages-by-player-instea.patch
@@ -0,0 +1,49 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: DoctaEnkoda
+Date: Mon, 3 May 2021 01:33:14 +0200
+Subject: [PATCH] Allows to display progress messages by player instead to
+ everyone on the server.
+
+
+diff --git a/src/main/java/net/minecraft/server/AdvancementDataPlayer.java b/src/main/java/net/minecraft/server/AdvancementDataPlayer.java
+index a1ee1066108985a95abddb03ff447b5a14f4f85f..4720644ae82f76f835f14c0b3a00e7b7874fb1e2 100644
+--- a/src/main/java/net/minecraft/server/AdvancementDataPlayer.java
++++ b/src/main/java/net/minecraft/server/AdvancementDataPlayer.java
+@@ -60,7 +60,7 @@ public class AdvancementDataPlayer {
+ private static final TypeToken