diff --git a/divinemc-server/build.gradle.kts.patch b/divinemc-server/build.gradle.kts.patch index 61e2def..26f2539 100644 --- a/divinemc-server/build.gradle.kts.patch +++ b/divinemc-server/build.gradle.kts.patch @@ -7,7 +7,7 @@ +val bxTeamMavenPublicUrl = "https://repo.bxteam.org/snapshots/" dependencies { - mache("io.papermc:mache:1.21.10+build.7") + mache("io.papermc:mache:1.21.10+build.9") @@ -26,6 +_,7 @@ // Purpur start - Rebrand diff --git a/divinemc-server/minecraft-patches/features/0002-Configuration.patch b/divinemc-server/minecraft-patches/features/0002-Configuration.patch index 61e2bcf..3dec235 100644 --- a/divinemc-server/minecraft-patches/features/0002-Configuration.patch +++ b/divinemc-server/minecraft-patches/features/0002-Configuration.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Configuration diff --git a/net/minecraft/server/dedicated/DedicatedServer.java b/net/minecraft/server/dedicated/DedicatedServer.java -index b138e704925193d151b69ef54f281a34d085c40b..231935f74443241a710ed2099bb32090ef34731d 100644 +index 50df5c788069b57493d5f4125d087f9bb9dd712c..49aa436abf89b16dc5249f37bf27b02b49d9e2e8 100644 --- a/net/minecraft/server/dedicated/DedicatedServer.java +++ b/net/minecraft/server/dedicated/DedicatedServer.java @@ -255,6 +255,8 @@ public class DedicatedServer extends MinecraftServer implements ServerInterface @@ -26,10 +26,10 @@ index b138e704925193d151b69ef54f281a34d085c40b..231935f74443241a710ed2099bb32090 // DivineMC start - Pufferfish: SIMD Support diff --git a/net/minecraft/world/level/Level.java b/net/minecraft/world/level/Level.java -index f7a4a6a69f76f0eadf00b61462d407d89eaee774..0dc444a63224ef3409f4e7ac800213d5a794a810 100644 +index c7cebf9ffb930ca228bd728996080781d7ed499f..be10e785bedb3193b1270ae2908824b2af005809 100644 --- a/net/minecraft/world/level/Level.java +++ b/net/minecraft/world/level/Level.java -@@ -166,6 +166,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl +@@ -167,6 +167,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl // Paper end - add paper world config public final org.purpurmc.purpur.PurpurWorldConfig purpurConfig; // Purpur - Purpur config files @@ -37,7 +37,7 @@ index f7a4a6a69f76f0eadf00b61462d407d89eaee774..0dc444a63224ef3409f4e7ac800213d5 public static @Nullable BlockPos lastPhysicsProblem; // Spigot private int tileTickPosition; public final Map explosionDensityCache = new java.util.HashMap<>(); // Paper - Optimize explosions -@@ -890,6 +891,14 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl +@@ -891,6 +892,14 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl this.spigotConfig = new org.spigotmc.SpigotWorldConfig(((net.minecraft.world.level.storage.PrimaryLevelData) levelData).getLevelName()); // Spigot this.paperConfig = paperWorldConfigCreator.apply(this.spigotConfig); // Paper - create paper world config this.purpurConfig = new org.purpurmc.purpur.PurpurWorldConfig(((net.minecraft.world.level.storage.PrimaryLevelData) levelData).getLevelName(), environment); // Purpur - Purpur config files diff --git a/divinemc-server/minecraft-patches/features/0003-Completely-remove-Mojang-profiler.patch b/divinemc-server/minecraft-patches/features/0003-Completely-remove-Mojang-profiler.patch index 2d0976f..9eb8ad5 100644 --- a/divinemc-server/minecraft-patches/features/0003-Completely-remove-Mojang-profiler.patch +++ b/divinemc-server/minecraft-patches/features/0003-Completely-remove-Mojang-profiler.patch @@ -1539,7 +1539,7 @@ index b8b641caf8b82f4071bfeff37d50ef65ff2a0505..d182aafc4c8b4ea657ec3228c45fb29f for (Entity entity : passengerEntity.getPassengers()) { this.tickPassenger(passengerEntity, entity, isActive); // Paper - EAR 2 diff --git a/net/minecraft/server/level/ServerPlayer.java b/net/minecraft/server/level/ServerPlayer.java -index 6836632940a8831f9020443d1c8a930e22fc054a..43cb158bee132cce0f3b09e31bc8ac83245ed3ea 100644 +index 6fd0803b266982daf12096cfab2ee92347d72e8a..b1667ed08c417daf292e092ca0d2ab9848ac8d61 100644 --- a/net/minecraft/server/level/ServerPlayer.java +++ b/net/minecraft/server/level/ServerPlayer.java @@ -110,8 +110,6 @@ import net.minecraft.util.Mth; @@ -1551,7 +1551,7 @@ index 6836632940a8831f9020443d1c8a930e22fc054a..43cb158bee132cce0f3b09e31bc8ac83 import net.minecraft.world.Container; import net.minecraft.world.Difficulty; import net.minecraft.world.InteractionHand; -@@ -1568,20 +1566,15 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc +@@ -1569,20 +1567,15 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc this.portalProcess = null; // SPIGOT-7785: there is no need to carry this over as it contains the old world/location and we might run into trouble if there is a portal in the same spot in both worlds serverLevel.removePlayerImmediately(this, Entity.RemovalReason.CHANGED_DIMENSION); this.unsetRemoved(); @@ -1799,7 +1799,7 @@ index 39a604c9a53930b53d959b1d2eb504aa964e9a58..0d0380e3955836ce125f777841477503 @Override diff --git a/net/minecraft/world/entity/Entity.java b/net/minecraft/world/entity/Entity.java -index e162b53f54c47ad29c80c39a14493a0fbf59dd12..36d1fd45772240aa963fcad67f15f37fc35d591f 100644 +index 6093e359be40d8df52e29f63d10aa9629850e826..dc558a32d0cf2d1e2d5cbb09a9377313083e9a57 100644 --- a/net/minecraft/world/entity/Entity.java +++ b/net/minecraft/world/entity/Entity.java @@ -82,8 +82,6 @@ import net.minecraft.util.RandomSource; @@ -1926,7 +1926,7 @@ index e162b53f54c47ad29c80c39a14493a0fbf59dd12..36d1fd45772240aa963fcad67f15f37f } } diff --git a/net/minecraft/world/entity/LivingEntity.java b/net/minecraft/world/entity/LivingEntity.java -index 9ea15e4656d34ab6738812b6168e15bd6d25fccb..bdd59ab98de1c1392cc8d73a3eedf28ffa64911a 100644 +index 9955a41d21345faad05843ee1b17321c3330f5d0..09987dac80cd031f7af0b63db50f5e719e05665a 100644 --- a/net/minecraft/world/entity/LivingEntity.java +++ b/net/minecraft/world/entity/LivingEntity.java @@ -70,8 +70,6 @@ import net.minecraft.tags.FluidTags; @@ -1938,7 +1938,7 @@ index 9ea15e4656d34ab6738812b6168e15bd6d25fccb..bdd59ab98de1c1392cc8d73a3eedf28f import net.minecraft.world.Difficulty; import net.minecraft.world.InteractionHand; import net.minecraft.world.damagesource.CombatRules; -@@ -440,8 +438,6 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin +@@ -441,8 +439,6 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin } super.baseTick(); @@ -1947,7 +1947,7 @@ index 9ea15e4656d34ab6738812b6168e15bd6d25fccb..bdd59ab98de1c1392cc8d73a3eedf28f if (this.isAlive() && this.level() instanceof ServerLevel serverLevel1) { boolean flag = this instanceof Player; if (this.isInWall()) { -@@ -528,7 +524,6 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin +@@ -529,7 +525,6 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin this.yBodyRotO = this.yBodyRot; this.yRotO = this.getYRot(); this.xRotO = this.getXRot(); @@ -1955,7 +1955,7 @@ index 9ea15e4656d34ab6738812b6168e15bd6d25fccb..bdd59ab98de1c1392cc8d73a3eedf28f } protected boolean shouldTakeDrowningDamage() { -@@ -3409,11 +3404,7 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin +@@ -3412,11 +3407,7 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin f1 = this.getYRot(); } @@ -1967,7 +1967,7 @@ index 9ea15e4656d34ab6738812b6168e15bd6d25fccb..bdd59ab98de1c1392cc8d73a3eedf28f // Paper start - stop large pitch and yaw changes from crashing the server this.yRotO += Math.round((this.getYRot() - this.yRotO) / 360.0F) * 360.0F; -@@ -3425,7 +3416,6 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin +@@ -3428,7 +3419,6 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin this.yHeadRotO += Math.round((this.yHeadRot - this.yHeadRotO) / 360.0F) * 360.0F; // Paper end - stop large pitch and yaw changes from crashing the server @@ -1975,7 +1975,7 @@ index 9ea15e4656d34ab6738812b6168e15bd6d25fccb..bdd59ab98de1c1392cc8d73a3eedf28f if (this.isFallFlying()) { this.fallFlyTicks++; } else { -@@ -3601,21 +3591,15 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin +@@ -3604,21 +3594,15 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin } this.setDeltaMovement(d, d1, d2); @@ -1997,7 +1997,7 @@ index 9ea15e4656d34ab6738812b6168e15bd6d25fccb..bdd59ab98de1c1392cc8d73a3eedf28f if (this.jumping && this.isAffectedByFluids()) { double fluidHeight; if (this.isInLava()) { -@@ -3644,8 +3628,6 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin +@@ -3647,8 +3631,6 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin this.noJumpDelay = 0; } @@ -2006,7 +2006,7 @@ index 9ea15e4656d34ab6738812b6168e15bd6d25fccb..bdd59ab98de1c1392cc8d73a3eedf28f if (this.isFallFlying()) { this.updateFallFlying(); } -@@ -3670,9 +3652,7 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin +@@ -3673,9 +3655,7 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin this.calculateEntityAnimation(this instanceof FlyingAnimal); } @@ -2016,7 +2016,7 @@ index 9ea15e4656d34ab6738812b6168e15bd6d25fccb..bdd59ab98de1c1392cc8d73a3eedf28f if ((!this.isInPowderSnow || !this.canFreeze()) && !this.freezeLocked) { // Paper - Freeze Tick Lock API this.setTicksFrozen(Math.max(0, this.getTicksFrozen() - 2)); } -@@ -3682,18 +3662,14 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin +@@ -3685,18 +3665,14 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin if (this.tickCount % 40 == 0 && this.isFullyFrozen() && this.canFreeze()) { this.hurtServer(serverLevel, this.damageSources().freeze(), 1.0F); } @@ -2036,7 +2036,7 @@ index 9ea15e4656d34ab6738812b6168e15bd6d25fccb..bdd59ab98de1c1392cc8d73a3eedf28f // Purpur start - Ridables if (this.xo != this.getX() || this.yo != this.getY() || this.zo != this.getZ() || this.yRotO != this.getYRot() || this.xRotO != this.getXRot()) { diff --git a/net/minecraft/world/entity/Mob.java b/net/minecraft/world/entity/Mob.java -index 699842fcc714a79f0ae83b899a301fa62400709c..c551b8c8c9b9d070afdbcf5cfcdb35e99830fd91 100644 +index 9c5336e47757879465679e27faf1f63c07952f56..b2853b6a3bca0ea04c50fedf5e2f5ff633ac2a21 100644 --- a/net/minecraft/world/entity/Mob.java +++ b/net/minecraft/world/entity/Mob.java @@ -31,8 +31,6 @@ import net.minecraft.util.debug.DebugGoalInfo; @@ -2259,7 +2259,7 @@ index e85f17f362548f13a414a41f711900add788b2f7..0506db902dab8c15e6460b5049d388f7 this.checkRestriction(); diff --git a/net/minecraft/world/entity/animal/allay/Allay.java b/net/minecraft/world/entity/animal/allay/Allay.java -index d842d0158f1c685a9350c61158a6eaa36ea9e897..ae68a19a0b13bc626efec6a028f3abba4a436f3b 100644 +index bbe59d6ab90f1b1274289ef20811f914afa55fd3..c8487029d5707d75b83aebc6fab7c65391f102f9 100644 --- a/net/minecraft/world/entity/animal/allay/Allay.java +++ b/net/minecraft/world/entity/animal/allay/Allay.java @@ -24,8 +24,6 @@ import net.minecraft.tags.GameEventTags; @@ -2271,7 +2271,7 @@ index d842d0158f1c685a9350c61158a6eaa36ea9e897..ae68a19a0b13bc626efec6a028f3abba import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.SimpleContainer; -@@ -268,14 +266,9 @@ public class Allay extends PathfinderMob implements InventoryCarrier, VibrationS +@@ -269,14 +267,9 @@ public class Allay extends PathfinderMob implements InventoryCarrier, VibrationS @Override protected void customServerAiStep(ServerLevel level) { @@ -2287,7 +2287,7 @@ index d842d0158f1c685a9350c61158a6eaa36ea9e897..ae68a19a0b13bc626efec6a028f3abba } diff --git a/net/minecraft/world/entity/animal/armadillo/Armadillo.java b/net/minecraft/world/entity/animal/armadillo/Armadillo.java -index 040fac5a4852b101299597e655a3774d83450172..bc7d026cae5c80e81b27b611557d48147f3e55d1 100644 +index 1ad2b942b3e9ba25c75d41b4cd21a58d43002289..a1cc92829b75200d6a66b52ed6ecc58343e91102 100644 --- a/net/minecraft/world/entity/animal/armadillo/Armadillo.java +++ b/net/minecraft/world/entity/animal/armadillo/Armadillo.java @@ -22,8 +22,6 @@ import net.minecraft.util.ByIdMap; @@ -2299,7 +2299,7 @@ index 040fac5a4852b101299597e655a3774d83450172..bc7d026cae5c80e81b27b611557d4814 import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.damagesource.DamageSource; -@@ -161,13 +159,8 @@ public class Armadillo extends Animal { +@@ -162,13 +160,8 @@ public class Armadillo extends Animal { @Override protected void customServerAiStep(ServerLevel level) { @@ -2426,7 +2426,7 @@ index 13b44b9560d46b351c4751aab189cc01c61d768d..37b1674c3f89d7ddba054b066df957f3 } diff --git a/net/minecraft/world/entity/animal/goat/Goat.java b/net/minecraft/world/entity/animal/goat/Goat.java -index 6b6461a61a1738d64220f571b8cf7b46605327c0..7ed4685600fb0d03d90e4b7e6044ee8c466ecd72 100644 +index a226956bc47c5f6145c0dd4d3f957be43e60272b..674d3d69c797ef3ca5934466806831b2cbcbb93a 100644 --- a/net/minecraft/world/entity/animal/goat/Goat.java +++ b/net/minecraft/world/entity/animal/goat/Goat.java @@ -19,8 +19,6 @@ import net.minecraft.tags.ItemTags; @@ -2438,7 +2438,7 @@ index 6b6461a61a1738d64220f571b8cf7b46605327c0..7ed4685600fb0d03d90e4b7e6044ee8c import net.minecraft.world.DifficultyInstance; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; -@@ -227,14 +225,9 @@ public class Goat extends Animal { +@@ -228,14 +226,9 @@ public class Goat extends Animal { @Override protected void customServerAiStep(ServerLevel level) { @@ -2454,7 +2454,7 @@ index 6b6461a61a1738d64220f571b8cf7b46605327c0..7ed4685600fb0d03d90e4b7e6044ee8c } diff --git a/net/minecraft/world/entity/animal/sniffer/Sniffer.java b/net/minecraft/world/entity/animal/sniffer/Sniffer.java -index d7e61ce6e2b77817f4eca913f2c319096e7f244f..2cfd97f10619fcd61f080bda1a617a664103ca53 100644 +index 7ef3c94f63c8a25d09e69b818ecdf79795803570..6f08f08c53831dd5b68e06a4a6aee95204334a3b 100644 --- a/net/minecraft/world/entity/animal/sniffer/Sniffer.java +++ b/net/minecraft/world/entity/animal/sniffer/Sniffer.java @@ -28,8 +28,6 @@ import net.minecraft.tags.BlockTags; @@ -2466,7 +2466,7 @@ index d7e61ce6e2b77817f4eca913f2c319096e7f244f..2cfd97f10619fcd61f080bda1a617a66 import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.damagesource.DamageSource; -@@ -496,13 +494,9 @@ public class Sniffer extends Animal { +@@ -497,13 +495,9 @@ public class Sniffer extends Animal { @Override protected void customServerAiStep(ServerLevel level) { @@ -2481,7 +2481,7 @@ index d7e61ce6e2b77817f4eca913f2c319096e7f244f..2cfd97f10619fcd61f080bda1a617a66 } diff --git a/net/minecraft/world/entity/monster/Zoglin.java b/net/minecraft/world/entity/monster/Zoglin.java -index 2632dd89d2f5661137e2c09b8cd426fc40599f69..233d175ba7e1c8516fff7897930c16a5de224820 100644 +index e2bf2bc45e4f8236ab47cf28c270dad748f80b50..2dac039f711d69295a749cd354128cdf8dfdc4c7 100644 --- a/net/minecraft/world/entity/monster/Zoglin.java +++ b/net/minecraft/world/entity/monster/Zoglin.java @@ -13,8 +13,6 @@ import net.minecraft.network.syncher.SynchedEntityData; @@ -2493,7 +2493,7 @@ index 2632dd89d2f5661137e2c09b8cd426fc40599f69..233d175ba7e1c8516fff7897930c16a5 import net.minecraft.util.valueproviders.UniformInt; import net.minecraft.world.DifficultyInstance; import net.minecraft.world.damagesource.DamageSource; -@@ -288,11 +286,8 @@ public class Zoglin extends Monster implements HoglinBase { +@@ -289,11 +287,8 @@ public class Zoglin extends Monster implements HoglinBase { @Override protected void customServerAiStep(ServerLevel level) { @@ -2533,7 +2533,7 @@ index 405eb5f041bf3a611f8111fd58864ffec30ab0c0..9ef421dfbb2d8d26d4a01d130dcbf3a6 } diff --git a/net/minecraft/world/entity/monster/creaking/Creaking.java b/net/minecraft/world/entity/monster/creaking/Creaking.java -index f31a29531cc7d63bed5a4bcbe3986bcc366b6103..6f7812f22399f67923e53a10a21ebd499ed40c64 100644 +index 6ab590b428e1a694b2538c53fabae9297b58b868..6ea2d7732eaf5eb99484834847f62858226c9879 100644 --- a/net/minecraft/world/entity/monster/creaking/Creaking.java +++ b/net/minecraft/world/entity/monster/creaking/Creaking.java @@ -15,8 +15,6 @@ import net.minecraft.server.level.ServerLevel; @@ -2545,7 +2545,7 @@ index f31a29531cc7d63bed5a4bcbe3986bcc366b6103..6f7812f22399f67923e53a10a21ebd49 import net.minecraft.world.damagesource.DamageSource; import net.minecraft.world.entity.AnimationState; import net.minecraft.world.entity.Entity; -@@ -235,10 +233,7 @@ public class Creaking extends Monster { +@@ -236,10 +234,7 @@ public class Creaking extends Monster { @Override protected void customServerAiStep(ServerLevel level) { @@ -2557,7 +2557,7 @@ index f31a29531cc7d63bed5a4bcbe3986bcc366b6103..6f7812f22399f67923e53a10a21ebd49 } diff --git a/net/minecraft/world/entity/monster/hoglin/Hoglin.java b/net/minecraft/world/entity/monster/hoglin/Hoglin.java -index 4dbfee2698fbd63c0832440265b6128aee5380d8..c309b01a461ddb47d20a6c96bd693e4850bd731b 100644 +index 72dc725b8cd6a2fca26aae376f91ab3e246a810b..1abc4d0de2ff983fc0c30bbc8a356d78f1c23897 100644 --- a/net/minecraft/world/entity/monster/hoglin/Hoglin.java +++ b/net/minecraft/world/entity/monster/hoglin/Hoglin.java @@ -14,8 +14,6 @@ import net.minecraft.sounds.SoundEvents; @@ -2569,7 +2569,7 @@ index 4dbfee2698fbd63c0832440265b6128aee5380d8..c309b01a461ddb47d20a6c96bd693e48 import net.minecraft.world.DifficultyInstance; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; -@@ -207,11 +205,8 @@ public class Hoglin extends Animal implements Enemy, HoglinBase { +@@ -208,11 +206,8 @@ public class Hoglin extends Animal implements Enemy, HoglinBase { @Override protected void customServerAiStep(ServerLevel level) { @@ -2632,7 +2632,7 @@ index ebe1b4e0b841906684561151919a5b3f6e206b60..0f1ed8ec352653089106ed8a143ab4ae PiglinBruteAi.maybePlayActivitySound(this); super.customServerAiStep(level); diff --git a/net/minecraft/world/entity/monster/warden/Warden.java b/net/minecraft/world/entity/monster/warden/Warden.java -index 380fe9b03e205d6c5b2eb48030384c8b756bc3f9..e9881eac70feebeb08f464efd4fa953cec9f62bf 100644 +index dede88234fd2b0f55863021446c4c9273f3a14d8..87976d8981f72732899c57a96971e851b86d5123 100644 --- a/net/minecraft/world/entity/monster/warden/Warden.java +++ b/net/minecraft/world/entity/monster/warden/Warden.java @@ -26,8 +26,6 @@ import net.minecraft.tags.TagKey; @@ -2644,7 +2644,7 @@ index 380fe9b03e205d6c5b2eb48030384c8b756bc3f9..e9881eac70feebeb08f464efd4fa953c import net.minecraft.world.DifficultyInstance; import net.minecraft.world.damagesource.DamageSource; import net.minecraft.world.effect.MobEffectInstance; -@@ -302,11 +300,8 @@ public class Warden extends Monster implements VibrationSystem { +@@ -303,11 +301,8 @@ public class Warden extends Monster implements VibrationSystem { @Override protected void customServerAiStep(ServerLevel level) { @@ -2657,7 +2657,7 @@ index 380fe9b03e205d6c5b2eb48030384c8b756bc3f9..e9881eac70feebeb08f464efd4fa953c if ((this.tickCount + this.getId()) % 120 == 0) { applyDarknessAround(level, this.position(), this, 20); diff --git a/net/minecraft/world/entity/npc/Villager.java b/net/minecraft/world/entity/npc/Villager.java -index 0ab9ac120703285baa563391653323c17d05b20b..e89ff53c568013a5f53afcf5759314221d37adf4 100644 +index bfff91e5e252141f887d8965ecf1dd9ff1cebfe3..d99a6ade82bbd01e25137fecfbec5dcef6765e79 100644 --- a/net/minecraft/world/entity/npc/Villager.java +++ b/net/minecraft/world/entity/npc/Villager.java @@ -35,8 +35,6 @@ import net.minecraft.stats.Stats; @@ -2669,7 +2669,7 @@ index 0ab9ac120703285baa563391653323c17d05b20b..e89ff53c568013a5f53afcf575931422 import net.minecraft.world.Difficulty; import net.minecraft.world.DifficultyInstance; import net.minecraft.world.InteractionHand; -@@ -393,8 +391,6 @@ public class Villager extends AbstractVillager implements ReputationEventHandler +@@ -394,8 +392,6 @@ public class Villager extends AbstractVillager implements ReputationEventHandler } protected void customServerAiStep(ServerLevel level, boolean inactive) { // Purpur - Lobotomize stuck villagers - not final // Paper end - EAR 2 @@ -2678,7 +2678,7 @@ index 0ab9ac120703285baa563391653323c17d05b20b..e89ff53c568013a5f53afcf575931422 // Purpur start - Lobotomize stuck villagers if (this.level().purpurConfig.villagerLobotomizeEnabled) { // treat as inactive if lobotomized -@@ -407,7 +403,6 @@ public class Villager extends AbstractVillager implements ReputationEventHandler +@@ -408,7 +404,6 @@ public class Villager extends AbstractVillager implements ReputationEventHandler } else if (this.isLobotomized && shouldRestock()) restock(); // Purpur end - Lobotomize stuck villagers @@ -2717,7 +2717,7 @@ index 07d7c4737635f671f33b8f73001d67928fc75782..f2c82217811712625df594667330a73f LOGGER.info("Loaded {} recipes", object.values().size()); } diff --git a/net/minecraft/world/level/Level.java b/net/minecraft/world/level/Level.java -index 5792422495a2d71ae4341e54817550e3d352d0b4..ad69e0e97d6d8efcfe73fe8a6f66cc64719704ac 100644 +index be10e785bedb3193b1270ae2908824b2af005809..d8b6f1b853609a7fcbd9c2fe6485e5080dece43a 100644 --- a/net/minecraft/world/level/Level.java +++ b/net/minecraft/world/level/Level.java @@ -36,7 +36,6 @@ import net.minecraft.util.AbortableIterationConsumer; @@ -2728,7 +2728,7 @@ index 5792422495a2d71ae4341e54817550e3d352d0b4..ad69e0e97d6d8efcfe73fe8a6f66cc64 import net.minecraft.util.random.WeightedList; import net.minecraft.world.DifficultyInstance; import net.minecraft.world.TickRateManager; -@@ -259,7 +258,6 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl +@@ -260,7 +259,6 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl @Override public final List getEntitiesOfClass(final Class entityClass, final AABB boundingBox, final Predicate predicate) { @@ -2736,7 +2736,7 @@ index 5792422495a2d71ae4341e54817550e3d352d0b4..ad69e0e97d6d8efcfe73fe8a6f66cc64 final List ret = new java.util.ArrayList<>(); ((ca.spottedleaf.moonrise.patches.chunk_system.level.ChunkSystemLevel)this).moonrise$getEntityLookup().getEntities(entityClass, null, boundingBox, ret, predicate); -@@ -269,7 +267,6 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl +@@ -270,7 +268,6 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl @Override public final List moonrise$getHardCollidingEntities(final Entity entity, final AABB box, final Predicate predicate) { @@ -2744,7 +2744,7 @@ index 5792422495a2d71ae4341e54817550e3d352d0b4..ad69e0e97d6d8efcfe73fe8a6f66cc64 final List ret = new java.util.ArrayList<>(); ((ca.spottedleaf.moonrise.patches.chunk_system.level.ChunkSystemLevel)this).moonrise$getEntityLookup().getHardCollidingEntities(entity, box, ret, predicate); -@@ -1735,7 +1732,6 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl +@@ -1736,7 +1733,6 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl @Override public List getEntities(@Nullable Entity entity, AABB boundingBox, Predicate predicate) { @@ -2752,7 +2752,7 @@ index 5792422495a2d71ae4341e54817550e3d352d0b4..ad69e0e97d6d8efcfe73fe8a6f66cc64 List list = Lists.newArrayList(); // Paper start - rewrite chunk system -@@ -1764,8 +1760,6 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl +@@ -1765,8 +1761,6 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl public void getEntities(final EntityTypeTest entityTypeTest, final AABB boundingBox, final Predicate predicate, final List into, final int maxCount) { @@ -2761,7 +2761,7 @@ index 5792422495a2d71ae4341e54817550e3d352d0b4..ad69e0e97d6d8efcfe73fe8a6f66cc64 if (entityTypeTest instanceof net.minecraft.world.entity.EntityType byType) { if (maxCount != Integer.MAX_VALUE) { ((ca.spottedleaf.moonrise.patches.chunk_system.level.ChunkSystemLevel)this).moonrise$getEntityLookup().getEntities(byType, boundingBox, into, predicate, maxCount); -@@ -1850,7 +1844,6 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl +@@ -1851,7 +1845,6 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl // Paper end - rewrite chunk system public boolean hasEntities(EntityTypeTest entityTypeTest, AABB bounds, Predicate predicate) { diff --git a/divinemc-server/minecraft-patches/features/0004-Paper-PR-Add-FillBottleEvents-for-player-and-dispens.patch b/divinemc-server/minecraft-patches/features/0004-Paper-PR-Add-FillBottleEvents-for-player-and-dispens.patch index 3951dc3..e7facc8 100644 --- a/divinemc-server/minecraft-patches/features/0004-Paper-PR-Add-FillBottleEvents-for-player-and-dispens.patch +++ b/divinemc-server/minecraft-patches/features/0004-Paper-PR-Add-FillBottleEvents-for-player-and-dispens.patch @@ -23,10 +23,10 @@ index c58b4a5426dc2e502e240e9b9270ead2ef65ecbd..1618e1d985ea798c1d7485b30fad5b45 player.awardStat(Stats.ITEM_USED.get(item)); // level.setBlockAndUpdate(pos, Blocks.WATER_CAULDRON.defaultBlockState()); // CraftBukkit diff --git a/net/minecraft/core/dispenser/DispenseItemBehavior.java b/net/minecraft/core/dispenser/DispenseItemBehavior.java -index 91a1ae527589ecab1322e97efd9e863a84fcb4fe..181fdb493f64442c659165c10e237ebc198fb6e2 100644 +index 5d0eb3893a0cca99ef53c2095b7b36a145dc15be..077ccddb7d358be352b6d497ed8b4e97b7d09262 100644 --- a/net/minecraft/core/dispenser/DispenseItemBehavior.java +++ b/net/minecraft/core/dispenser/DispenseItemBehavior.java -@@ -578,13 +578,25 @@ public interface DispenseItemBehavior { +@@ -580,13 +580,25 @@ public interface DispenseItemBehavior { blockStateBase -> blockStateBase.hasProperty(BeehiveBlock.HONEY_LEVEL) && blockStateBase.getBlock() instanceof BeehiveBlock ) && blockState.getValue(BeehiveBlock.HONEY_LEVEL) >= 5) { @@ -111,7 +111,7 @@ index 105f9166297de2bfa6bdcfa9f6a0ffb00c0242ac..111f43fc5c74577f8f3067a4f84be7a6 } diff --git a/net/minecraft/world/level/block/BeehiveBlock.java b/net/minecraft/world/level/block/BeehiveBlock.java -index 0768619454a88f555dd81a609a61f49dc2578f06..4eaec4533497ec354646b75c77f74170cac672bb 100644 +index 02671ed6ba302c36d15896bd1fb3a0883b6e0940..8e9426784b46f8b988279c1dc4c6d2276f394422 100644 --- a/net/minecraft/world/level/block/BeehiveBlock.java +++ b/net/minecraft/world/level/block/BeehiveBlock.java @@ -159,12 +159,26 @@ public class BeehiveBlock extends BaseEntityBlock { diff --git a/divinemc-server/minecraft-patches/features/0006-Raytrace-AntiXray-SDK-integration.patch b/divinemc-server/minecraft-patches/features/0006-Raytrace-AntiXray-SDK-integration.patch index 8b58711..241a2fb 100644 --- a/divinemc-server/minecraft-patches/features/0006-Raytrace-AntiXray-SDK-integration.patch +++ b/divinemc-server/minecraft-patches/features/0006-Raytrace-AntiXray-SDK-integration.patch @@ -8,7 +8,7 @@ Integration with Imanity Software's Raytrace AntiXray for better use of this plu Original project: https://github.com/Imanity-Software/raytrace-antixray-spigot-sdk diff --git a/net/minecraft/server/level/ServerPlayerGameMode.java b/net/minecraft/server/level/ServerPlayerGameMode.java -index 599d6a4f31e05369caf3ef9f5e54e83396743ec0..07dd9b8088e363110ecab24026a20485484710c4 100644 +index fad600f343ee0983efc183f083b1507648987575..9bbcffc77dcf0e062a7f3464aee7f8d0563a440f 100644 --- a/net/minecraft/server/level/ServerPlayerGameMode.java +++ b/net/minecraft/server/level/ServerPlayerGameMode.java @@ -316,6 +316,12 @@ public class ServerPlayerGameMode { @@ -25,10 +25,10 @@ index 599d6a4f31e05369caf3ef9f5e54e83396743ec0..07dd9b8088e363110ecab24026a20485 } diff --git a/net/minecraft/world/level/Level.java b/net/minecraft/world/level/Level.java -index 5b50b86c735fa2ba1b5452aacda7db5e64012076..b94b946986258fed3c6d68d9972a657e176d08a4 100644 +index d8b6f1b853609a7fcbd9c2fe6485e5080dece43a..21a20aa602f51bbd6c8cdcb52f6b485971834595 100644 --- a/net/minecraft/world/level/Level.java +++ b/net/minecraft/world/level/Level.java -@@ -1125,6 +1125,12 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl +@@ -1126,6 +1126,12 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl snapshot.setFlags(flags); // Paper - always set the flag of the most recent call to mitigate issues with multiple update at the same pos with different flags } BlockState blockState = chunkAt.setBlockState(pos, state, flags); diff --git a/divinemc-server/minecraft-patches/features/0007-Paper-PR-Add-ticket-on-player-join-to-avoid-chunk-lo.patch b/divinemc-server/minecraft-patches/features/0007-Paper-PR-Add-ticket-on-player-join-to-avoid-chunk-lo.patch index 726038c..c6c96d1 100644 --- a/divinemc-server/minecraft-patches/features/0007-Paper-PR-Add-ticket-on-player-join-to-avoid-chunk-lo.patch +++ b/divinemc-server/minecraft-patches/features/0007-Paper-PR-Add-ticket-on-player-join-to-avoid-chunk-lo.patch @@ -27,10 +27,10 @@ index 8697528095ebed543ee1bb3b6b617a26a800bd5d..4fc29f7aae32180f86af971f7f80a37a public static final int GENERATED_TICKET_LEVEL = ChunkHolderManager.FULL_LOADED_TICKET_LEVEL; public static final int LOADED_TICKET_LEVEL = ChunkTaskScheduler.getTicketLevel(ChunkStatus.EMPTY); diff --git a/net/minecraft/server/players/PlayerList.java b/net/minecraft/server/players/PlayerList.java -index 561165ccc8c4d66ef590fb8deb65782a214d9611..79210997e56ec6798d249608049e108724670cde 100644 +index 67f9d5384f26d27cb59c2bfa090697dd86b85b67..457dfcb459f2618e6975ab3e4ff37d5988dd50c2 100644 --- a/net/minecraft/server/players/PlayerList.java +++ b/net/minecraft/server/players/PlayerList.java -@@ -220,6 +220,13 @@ public abstract class PlayerList { +@@ -221,6 +221,13 @@ public abstract class PlayerList { // this.broadcastAll(ClientboundPlayerInfoUpdatePacket.createPlayerInitializing(List.of(player))); // CraftBukkit - replaced with loop below // Paper start - Fire PlayerJoinEvent when Player is actually ready; correctly register player BEFORE PlayerJoinEvent, so the entity is valid and doesn't require tick delay hacks player.suppressTrackerForLogin = true; diff --git a/divinemc-server/minecraft-patches/features/0015-Disable-leaf-decay.patch b/divinemc-server/minecraft-patches/features/0015-Disable-leaf-decay.patch index f5341c9..99b8c5b 100644 --- a/divinemc-server/minecraft-patches/features/0015-Disable-leaf-decay.patch +++ b/divinemc-server/minecraft-patches/features/0015-Disable-leaf-decay.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Disable leaf decay diff --git a/net/minecraft/world/level/block/LeavesBlock.java b/net/minecraft/world/level/block/LeavesBlock.java -index 66be73fe9ad14646057fa51b7c537a86c1e84ab9..4371fd03e4b5bd3a18024e0a9ee0e75cd77137e9 100644 +index b507dbb6ab345cf754775226c59320526d7b94f0..884f102836ff1ea08632804465f21a18bb7cd18d 100644 --- a/net/minecraft/world/level/block/LeavesBlock.java +++ b/net/minecraft/world/level/block/LeavesBlock.java @@ -70,12 +70,29 @@ public abstract class LeavesBlock extends Block implements SimpleWaterloggedBloc @@ -18,7 +18,7 @@ index 66be73fe9ad14646057fa51b7c537a86c1e84ab9..4371fd03e4b5bd3a18024e0a9ee0e75c @Override protected void tick(BlockState state, ServerLevel level, BlockPos pos, RandomSource random) { -- level.setBlock(pos, updateDistance(state, level, pos), 3); +- level.setBlock(pos, updateDistance(state, level, pos), Block.UPDATE_ALL); + // DivineMC start - Disable leaf decay + if (org.bxteam.divinemc.config.DivineConfig.FixesCategory.disableLeafDecay) return; // DivineMC - Disable leaf decay + int newValue = 7; @@ -34,7 +34,7 @@ index 66be73fe9ad14646057fa51b7c537a86c1e84ab9..4371fd03e4b5bd3a18024e0a9ee0e75c + } + + if (newValue != oldValue) { -+ level.setBlock(pos, state.setValue(DISTANCE, newValue), 3); ++ level.setBlock(pos, state.setValue(DISTANCE, newValue), Block.UPDATE_ALL); + } + // DivineMC end - Disable leaf decay } diff --git a/divinemc-server/minecraft-patches/features/0016-Optimize-entities.patch b/divinemc-server/minecraft-patches/features/0016-Optimize-entities.patch index 47a2e45..e351188 100644 --- a/divinemc-server/minecraft-patches/features/0016-Optimize-entities.patch +++ b/divinemc-server/minecraft-patches/features/0016-Optimize-entities.patch @@ -26,7 +26,7 @@ index 0adfd1cd5c21f8a7823cd1bf7c9aa91dd2654150..ad1ebec9d47a4f70b51259cd5ad8a6e7 super.onSyncedDataUpdated(key); diff --git a/net/minecraft/world/entity/Entity.java b/net/minecraft/world/entity/Entity.java -index 36d1fd45772240aa963fcad67f15f37fc35d591f..6b5b01b9525f51fe02f03f7249517599d1ba1945 100644 +index dc558a32d0cf2d1e2d5cbb09a9377313083e9a57..80b771f69549cf460b3d1fca2de8f27152e98f42 100644 --- a/net/minecraft/world/entity/Entity.java +++ b/net/minecraft/world/entity/Entity.java @@ -1711,6 +1711,10 @@ public abstract class Entity implements SyncedDataHolder, DebugValueSource, Name @@ -605,10 +605,10 @@ index 24d1928445b5571e040a2b12d5c82e77a880d9bd..dac0a23aebf2dea1972c07d5c82079da private boolean isVillagerBaby(LivingEntity livingEntity) { return livingEntity.getType() == EntityType.VILLAGER && livingEntity.isBaby(); diff --git a/net/minecraft/world/entity/animal/goat/Goat.java b/net/minecraft/world/entity/animal/goat/Goat.java -index 7ed4685600fb0d03d90e4b7e6044ee8c466ecd72..58ee22461c0330e2fbbbf283c154b8141e2d1953 100644 +index 674d3d69c797ef3ca5934466806831b2cbcbb93a..04a4cc148579904222b3c99a1ad4c64e5783afa2 100644 --- a/net/minecraft/world/entity/animal/goat/Goat.java +++ b/net/minecraft/world/entity/animal/goat/Goat.java -@@ -99,6 +99,13 @@ public class Goat extends Animal { +@@ -100,6 +100,13 @@ public class Goat extends Animal { this.getNavigation().setCanFloat(true); this.setPathfindingMalus(PathType.POWDER_SNOW, -1.0F); this.setPathfindingMalus(PathType.DANGER_POWDER_SNOW, -1.0F); diff --git a/divinemc-server/minecraft-patches/features/0020-Carpet-AMS-Addition-Optimized-dragon-respawn.patch b/divinemc-server/minecraft-patches/features/0020-Carpet-AMS-Addition-Optimized-dragon-respawn.patch index 3bf9da1..9231a17 100644 --- a/divinemc-server/minecraft-patches/features/0020-Carpet-AMS-Addition-Optimized-dragon-respawn.patch +++ b/divinemc-server/minecraft-patches/features/0020-Carpet-AMS-Addition-Optimized-dragon-respawn.patch @@ -25,10 +25,10 @@ index f7bb979f08634a7e1b77c59040f59fb5e11aafa5..e0eca73d9e8a77b2a4972db61001394c for (int i1 = 0; i1 < this.height; i1++) { for (int i2 = 0; i2 < this.depth; i2++) { diff --git a/net/minecraft/world/level/dimension/end/EndDragonFight.java b/net/minecraft/world/level/dimension/end/EndDragonFight.java -index 16156eb8e8bee376950a5f1efc9ac5e295716c61..4319cbd1c87629e125bd7ff4d71bdc8b40084469 100644 +index fcb0fb9ca663ec40e1541d099bc3d710963f6c9d..db9843fddf43bdc287978728f08230c0e6178195 100644 --- a/net/minecraft/world/level/dimension/end/EndDragonFight.java +++ b/net/minecraft/world/level/dimension/end/EndDragonFight.java -@@ -273,8 +273,68 @@ public class EndDragonFight { +@@ -274,8 +274,68 @@ public class EndDragonFight { return false; } @@ -97,7 +97,7 @@ index 16156eb8e8bee376950a5f1efc9ac5e295716c61..4319cbd1c87629e125bd7ff4d71bdc8b ChunkPos chunkPos = new ChunkPos(this.origin); for (int i = -8 + chunkPos.x; i <= 8 + chunkPos.x; i++) { -@@ -572,6 +632,11 @@ public class EndDragonFight { +@@ -573,6 +633,11 @@ public class EndDragonFight { } public boolean respawnDragon(List crystals) { // CraftBukkit - return boolean diff --git a/divinemc-server/minecraft-patches/features/0022-Option-to-disable-disconnect.spam.patch b/divinemc-server/minecraft-patches/features/0022-Option-to-disable-disconnect.spam.patch index fa20a7d..69287b4 100644 --- a/divinemc-server/minecraft-patches/features/0022-Option-to-disable-disconnect.spam.patch +++ b/divinemc-server/minecraft-patches/features/0022-Option-to-disable-disconnect.spam.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Option to disable disconnect.spam diff --git a/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/net/minecraft/server/network/ServerGamePacketListenerImpl.java -index edc358b08b94a12f2727c805e2254197df0ae25a..36c2b6d15373cf50a91f45df497d82a963696386 100644 +index 2ce82bb127978bf77812bb8cb526507f6985a92a..151e7113ed1a4906b97cea7d34aa522900c4ee3f 100644 --- a/net/minecraft/server/network/ServerGamePacketListenerImpl.java +++ b/net/minecraft/server/network/ServerGamePacketListenerImpl.java -@@ -852,7 +852,7 @@ public class ServerGamePacketListenerImpl +@@ -853,7 +853,7 @@ public class ServerGamePacketListenerImpl public void handleCustomCommandSuggestions(ServerboundCommandSuggestionPacket packet) { // PacketUtils.ensureRunningOnSameThread(packet, this, this.player.level()); // Paper - AsyncTabCompleteEvent; run this async // CraftBukkit start @@ -17,7 +17,7 @@ index edc358b08b94a12f2727c805e2254197df0ae25a..36c2b6d15373cf50a91f45df497d82a9 this.disconnectAsync(Component.translatable("disconnect.spam"), org.bukkit.event.player.PlayerKickEvent.Cause.SPAM); // Paper - Kick event cause // Paper - add proper async disconnect return; } -@@ -864,7 +864,7 @@ public class ServerGamePacketListenerImpl +@@ -865,7 +865,7 @@ public class ServerGamePacketListenerImpl // Paper end - Don't suggest if tab-complete is disabled // Paper start final int index; @@ -26,7 +26,7 @@ index edc358b08b94a12f2727c805e2254197df0ae25a..36c2b6d15373cf50a91f45df497d82a9 this.disconnectAsync(Component.translatable("disconnect.spam"), org.bukkit.event.player.PlayerKickEvent.Cause.SPAM); // Paper - add proper async disconnect return; } -@@ -924,6 +924,7 @@ public class ServerGamePacketListenerImpl +@@ -925,6 +925,7 @@ public class ServerGamePacketListenerImpl ParseResults parseResults = this.server.getCommands().getDispatcher().parse(stringReader, this.player.createCommandSourceStack()); // Paper start - Handle non-recoverable exceptions if (!parseResults.getExceptions().isEmpty() @@ -34,7 +34,7 @@ index edc358b08b94a12f2727c805e2254197df0ae25a..36c2b6d15373cf50a91f45df497d82a9 && parseResults.getExceptions().values().stream().anyMatch(e -> e instanceof io.papermc.paper.brigadier.TagParseCommandSyntaxException)) { this.disconnect(Component.translatable("disconnect.spam"), org.bukkit.event.player.PlayerKickEvent.Cause.SPAM); return; -@@ -2638,6 +2639,7 @@ public class ServerGamePacketListenerImpl +@@ -2639,6 +2640,7 @@ public class ServerGamePacketListenerImpl // this.chatSpamThrottler.increment(); if (!this.chatSpamThrottler.isIncrementAndUnderThreshold() // CraftBukkit end @@ -42,7 +42,7 @@ index edc358b08b94a12f2727c805e2254197df0ae25a..36c2b6d15373cf50a91f45df497d82a9 && !this.server.getPlayerList().isOp(this.player.nameAndId()) && !this.server.isSingleplayerOwner(this.player.nameAndId())) { this.disconnectAsync(Component.translatable("disconnect.spam"), org.bukkit.event.player.PlayerKickEvent.Cause.SPAM); // Paper - kick event cause & add proper async disconnect -@@ -3348,7 +3350,7 @@ public class ServerGamePacketListenerImpl +@@ -3349,7 +3351,7 @@ public class ServerGamePacketListenerImpl public void handlePlaceRecipe(ServerboundPlaceRecipePacket packet) { // Paper start - auto recipe limit if (!org.bukkit.Bukkit.isPrimaryThread()) { diff --git a/divinemc-server/minecraft-patches/features/0023-Option-to-disable-saving-of-snowball-and-firework.patch b/divinemc-server/minecraft-patches/features/0023-Option-to-disable-saving-of-snowball-and-firework.patch index 23d3b43..de5154a 100644 --- a/divinemc-server/minecraft-patches/features/0023-Option-to-disable-saving-of-snowball-and-firework.patch +++ b/divinemc-server/minecraft-patches/features/0023-Option-to-disable-saving-of-snowball-and-firework.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Option to disable saving of snowball and firework diff --git a/net/minecraft/world/entity/projectile/FireworkRocketEntity.java b/net/minecraft/world/entity/projectile/FireworkRocketEntity.java -index af9cf917f20a34479e01b63e686c65b2c783cea1..b344e6d0217500846852fa753075f1d58d3d50d8 100644 +index 145ed3c5f5823c7505767b6d7f4f4d16cc863948..d0624f0ecc2305b9c04bc299f8b575fd039876fa 100644 --- a/net/minecraft/world/entity/projectile/FireworkRocketEntity.java +++ b/net/minecraft/world/entity/projectile/FireworkRocketEntity.java -@@ -350,4 +350,14 @@ public class FireworkRocketEntity extends Projectile implements ItemSupplier { +@@ -351,4 +351,14 @@ public class FireworkRocketEntity extends Projectile implements ItemSupplier { double d1 = entity.position().z - this.position().z; return DoubleDoubleImmutablePair.of(d, d1); } @@ -24,10 +24,10 @@ index af9cf917f20a34479e01b63e686c65b2c783cea1..b344e6d0217500846852fa753075f1d5 + // DivineMC end - Option to disable saving firework } diff --git a/net/minecraft/world/entity/projectile/Snowball.java b/net/minecraft/world/entity/projectile/Snowball.java -index c0b423967d6361a5d8ef11a5855c025e31948fe5..1dd963aae166e059107aac1d585ccc3199afb66d 100644 +index 6e6e10140381b63f9833e704f5d35d7e74ac7e66..97e6628e0717b3d11b91b5eead7b3b4373966e05 100644 --- a/net/minecraft/world/entity/projectile/Snowball.java +++ b/net/minecraft/world/entity/projectile/Snowball.java -@@ -94,4 +94,14 @@ public class Snowball extends ThrowableItemProjectile { +@@ -95,4 +95,14 @@ public class Snowball extends ThrowableItemProjectile { this.discard(org.bukkit.event.entity.EntityRemoveEvent.Cause.HIT); // CraftBukkit - add Bukkit remove cause } } diff --git a/divinemc-server/minecraft-patches/features/0024-Snowball-and-Egg-knockback.patch b/divinemc-server/minecraft-patches/features/0024-Snowball-and-Egg-knockback.patch index 2015d34..8db52d1 100644 --- a/divinemc-server/minecraft-patches/features/0024-Snowball-and-Egg-knockback.patch +++ b/divinemc-server/minecraft-patches/features/0024-Snowball-and-Egg-knockback.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Snowball and Egg knockback diff --git a/net/minecraft/world/entity/projectile/Snowball.java b/net/minecraft/world/entity/projectile/Snowball.java -index 1dd963aae166e059107aac1d585ccc3199afb66d..0e594fe6cd25ac713ab70db167e276532d9fd993 100644 +index 97e6628e0717b3d11b91b5eead7b3b4373966e05..7afe2ce589a3c25ddabc707c7580751834c1940a 100644 --- a/net/minecraft/world/entity/projectile/Snowball.java +++ b/net/minecraft/world/entity/projectile/Snowball.java -@@ -54,6 +54,12 @@ public class Snowball extends ThrowableItemProjectile { +@@ -55,6 +55,12 @@ public class Snowball extends ThrowableItemProjectile { Entity entity = result.getEntity(); int i = entity.level().purpurConfig.snowballDamage >= 0 ? entity.level().purpurConfig.snowballDamage : entity instanceof Blaze ? 3 : 0; // Purpur - Add configurable snowball damage entity.hurt(this.damageSources().thrown(this, this.getOwner()), i); @@ -22,10 +22,10 @@ index 1dd963aae166e059107aac1d585ccc3199afb66d..0e594fe6cd25ac713ab70db167e27653 // Purpur start - options to extinguish fire blocks with snowballs - borrowed and modified code from ThrownPotion#onHitBlock and ThrownPotion#dowseFire diff --git a/net/minecraft/world/entity/projectile/ThrownEgg.java b/net/minecraft/world/entity/projectile/ThrownEgg.java -index baa6f5ef67aeaa18c45e9de6e747aea9066e42b7..d27d7c14facb58807f5c1e36b0d9b690c2b6631e 100644 +index bbb364be2af16a3c200d2197166bb3ad28e5e35d..ff0453123efb7a751d576e5bd2864fa495f8ef3d 100644 --- a/net/minecraft/world/entity/projectile/ThrownEgg.java +++ b/net/minecraft/world/entity/projectile/ThrownEgg.java -@@ -54,7 +54,14 @@ public class ThrownEgg extends ThrowableItemProjectile { +@@ -55,7 +55,14 @@ public class ThrownEgg extends ThrowableItemProjectile { @Override protected void onHitEntity(EntityHitResult result) { super.onHitEntity(result); diff --git a/divinemc-server/minecraft-patches/features/0025-Optimize-suffocation.patch b/divinemc-server/minecraft-patches/features/0025-Optimize-suffocation.patch index 9a428bb..6a97541 100644 --- a/divinemc-server/minecraft-patches/features/0025-Optimize-suffocation.patch +++ b/divinemc-server/minecraft-patches/features/0025-Optimize-suffocation.patch @@ -7,10 +7,10 @@ Original license: GPL v3 Original project: https://github.com/pufferfish-gg/Pufferfish diff --git a/net/minecraft/world/entity/LivingEntity.java b/net/minecraft/world/entity/LivingEntity.java -index bdd59ab98de1c1392cc8d73a3eedf28ffa64911a..509689bfffbe7b376ce3c4f9851342242ae3bab2 100644 +index 09987dac80cd031f7af0b63db50f5e719e05665a..288d23e443f495d7fbfd0bbbe1bca7a2ff9da64a 100644 --- a/net/minecraft/world/entity/LivingEntity.java +++ b/net/minecraft/world/entity/LivingEntity.java -@@ -426,6 +426,12 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin +@@ -427,6 +427,12 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin return this.getDeltaMovement().y() < 1.0E-5F && this.isInLiquid(); } @@ -23,7 +23,7 @@ index bdd59ab98de1c1392cc8d73a3eedf28ffa64911a..509689bfffbe7b376ce3c4f985134224 @Override public void baseTick() { this.oAttackAnim = this.attackAnim; -@@ -440,7 +446,7 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin +@@ -441,7 +447,7 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin super.baseTick(); if (this.isAlive() && this.level() instanceof ServerLevel serverLevel1) { boolean flag = this instanceof Player; diff --git a/divinemc-server/minecraft-patches/features/0027-Configurable-movement-speed-for-entities.patch b/divinemc-server/minecraft-patches/features/0027-Configurable-movement-speed-for-entities.patch index 0ff9848..c715ca1 100644 --- a/divinemc-server/minecraft-patches/features/0027-Configurable-movement-speed-for-entities.patch +++ b/divinemc-server/minecraft-patches/features/0027-Configurable-movement-speed-for-entities.patch @@ -17,10 +17,10 @@ index 5a947d7fbf1a08011d87f71b96a8f221130fb583..28fb51950c38ffbc88c3e01c113310fd @Override diff --git a/net/minecraft/world/entity/monster/Husk.java b/net/minecraft/world/entity/monster/Husk.java -index 0bc9c1b235cd5ac771c7b0f200abe4fde38b7858..6948b139a041991743f30186902275b4e752491b 100644 +index ef261e61358bf466bdfdd6cfe982c5afe53d7c4d..354f6b4c26194fe836ed89bff65aba31b464779f 100644 --- a/net/minecraft/world/entity/monster/Husk.java +++ b/net/minecraft/world/entity/monster/Husk.java -@@ -42,6 +42,7 @@ public class Husk extends Zombie { +@@ -43,6 +43,7 @@ public class Husk extends Zombie { @Override public void initAttributes() { this.getAttribute(net.minecraft.world.entity.ai.attributes.Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.huskMaxHealth); @@ -29,10 +29,10 @@ index 0bc9c1b235cd5ac771c7b0f200abe4fde38b7858..6948b139a041991743f30186902275b4 @Override diff --git a/net/minecraft/world/entity/monster/Zombie.java b/net/minecraft/world/entity/monster/Zombie.java -index 7e13f2958f3935077fe25570567d2576f435028c..68fadb2927a8a516926e201b3d640c8e133103ac 100644 +index 2dd08e5ef413c37a682046071b83f595c8499cf2..042fd91c2534fc07c3a34892a2e83940de245704 100644 --- a/net/minecraft/world/entity/monster/Zombie.java +++ b/net/minecraft/world/entity/monster/Zombie.java -@@ -125,6 +125,7 @@ public class Zombie extends Monster { +@@ -126,6 +126,7 @@ public class Zombie extends Monster { public void initAttributes() { this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.zombieMaxHealth); this.getAttribute(Attributes.SCALE).setBaseValue(this.level().purpurConfig.zombieScale); @@ -40,7 +40,7 @@ index 7e13f2958f3935077fe25570567d2576f435028c..68fadb2927a8a516926e201b3d640c8e } // Purpur end - Configurable entity base attributes -@@ -192,7 +193,6 @@ public class Zombie extends Monster { +@@ -193,7 +194,6 @@ public class Zombie extends Monster { public static AttributeSupplier.Builder createAttributes() { return Monster.createMonsterAttributes() .add(Attributes.FOLLOW_RANGE, 35.0) @@ -49,10 +49,10 @@ index 7e13f2958f3935077fe25570567d2576f435028c..68fadb2927a8a516926e201b3d640c8e .add(Attributes.ARMOR, 2.0) .add(Attributes.SPAWN_REINFORCEMENTS_CHANCE); diff --git a/net/minecraft/world/entity/monster/ZombieVillager.java b/net/minecraft/world/entity/monster/ZombieVillager.java -index c2e6ce3a7d17fa5ecd1f0dc42f7769a500e0052d..6253347617c321ef107fe575c3b99e1ffe1a7eb7 100644 +index 671afcaa17bac0235e362797320118864fec7e66..49a211381c60c2739b03127f8f98c7d8fbfcc9f1 100644 --- a/net/minecraft/world/entity/monster/ZombieVillager.java +++ b/net/minecraft/world/entity/monster/ZombieVillager.java -@@ -94,6 +94,7 @@ public class ZombieVillager extends Zombie implements VillagerDataHolder { +@@ -96,6 +96,7 @@ public class ZombieVillager extends Zombie implements VillagerDataHolder { @Override public void initAttributes() { this.getAttribute(net.minecraft.world.entity.ai.attributes.Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.zombieVillagerMaxHealth); diff --git a/divinemc-server/minecraft-patches/features/0028-Option-to-allow-weird-movement-and-disable-teleporti.patch b/divinemc-server/minecraft-patches/features/0028-Option-to-allow-weird-movement-and-disable-teleporti.patch index 8b75f5b..801c3b4 100644 --- a/divinemc-server/minecraft-patches/features/0028-Option-to-allow-weird-movement-and-disable-teleporti.patch +++ b/divinemc-server/minecraft-patches/features/0028-Option-to-allow-weird-movement-and-disable-teleporti.patch @@ -6,10 +6,10 @@ Subject: [PATCH] Option to allow weird movement and disable teleporting diff --git a/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/net/minecraft/server/network/ServerGamePacketListenerImpl.java -index 36c2b6d15373cf50a91f45df497d82a963696386..a306147f4b8213363f96745f4cd33a5a3b01777b 100644 +index 151e7113ed1a4906b97cea7d34aa522900c4ee3f..93885af89a402bdadaccd598c7c2939c96fdf6e4 100644 --- a/net/minecraft/server/network/ServerGamePacketListenerImpl.java +++ b/net/minecraft/server/network/ServerGamePacketListenerImpl.java -@@ -617,7 +617,7 @@ public class ServerGamePacketListenerImpl +@@ -618,7 +618,7 @@ public class ServerGamePacketListenerImpl return; } // Paper end - Prevent moving into unloaded chunks @@ -18,7 +18,7 @@ index 36c2b6d15373cf50a91f45df497d82a963696386..a306147f4b8213363f96745f4cd33a5a // CraftBukkit end LOGGER.warn("{} (vehicle of {}) moved too quickly! {},{},{}", rootVehicle.getPlainTextName(), this.player.getPlainTextName(), d3, d4, d5); this.send(ClientboundMoveVehiclePacket.fromEntity(rootVehicle)); -@@ -645,7 +645,7 @@ public class ServerGamePacketListenerImpl +@@ -646,7 +646,7 @@ public class ServerGamePacketListenerImpl d5 = d2 - rootVehicle.getZ(); d7 = d3 * d3 + d4 * d4 + d5 * d5; boolean flag1 = false; @@ -27,7 +27,7 @@ index 36c2b6d15373cf50a91f45df497d82a963696386..a306147f4b8213363f96745f4cd33a5a flag1 = true; // Paper - diff on change, this should be moved wrongly LOGGER.warn("{} (vehicle of {}) moved wrongly! {}", rootVehicle.getPlainTextName(), this.player.getPlainTextName(), Math.sqrt(d7)); } -@@ -1562,20 +1562,24 @@ public class ServerGamePacketListenerImpl +@@ -1563,20 +1563,24 @@ public class ServerGamePacketListenerImpl if (this.shouldCheckPlayerMovement(isFallFlying)) { float f2 = isFallFlying ? 300.0F : 100.0F; if (d7 - d6 > Math.max(f2, Mth.square(org.spigotmc.SpigotConfig.movedTooQuicklyMultiplier * (float) i * speed))) { @@ -63,7 +63,7 @@ index 36c2b6d15373cf50a91f45df497d82a963696386..a306147f4b8213363f96745f4cd33a5a } } } -@@ -1636,6 +1640,7 @@ public class ServerGamePacketListenerImpl +@@ -1637,6 +1641,7 @@ public class ServerGamePacketListenerImpl d7 = d3 * d3 + d4 * d4 + d5 * d5; boolean movedWrongly = false; // Paper - Add fail move event; rename if (!this.player.isChangingDimension() diff --git a/divinemc-server/minecraft-patches/features/0032-Optimize-Fluids.patch b/divinemc-server/minecraft-patches/features/0032-Optimize-Fluids.patch index e9a924e..098554f 100644 --- a/divinemc-server/minecraft-patches/features/0032-Optimize-Fluids.patch +++ b/divinemc-server/minecraft-patches/features/0032-Optimize-Fluids.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Optimize Fluids diff --git a/net/minecraft/world/level/block/LiquidBlock.java b/net/minecraft/world/level/block/LiquidBlock.java -index 283e5fc879fd9869205549d66b3b99662ec56564..8aa9dac64bcfb81fdfebd1327a0f18bbc104b9d8 100644 +index 8c00026651da489ab954710b59d5a03bf54ffd0d..6b55c4110ebf0c8fa74ede3d33bd4ad121c51908 100644 --- a/net/minecraft/world/level/block/LiquidBlock.java +++ b/net/minecraft/world/level/block/LiquidBlock.java @@ -199,6 +199,7 @@ public class LiquidBlock extends Block implements BucketPickup { @@ -17,7 +17,7 @@ index 283e5fc879fd9869205549d66b3b99662ec56564..8aa9dac64bcfb81fdfebd1327a0f18bb } // CraftBukkit end diff --git a/net/minecraft/world/level/material/FlowingFluid.java b/net/minecraft/world/level/material/FlowingFluid.java -index 18f008dceff896a405970afe157321105d55405f..1de0ef32b6519cad10c8ebf0ed328b6773bcb3ff 100644 +index 9685d02a9837c773094a5da5cff6fa6fcfeed86a..afab54ffe92241f8d549ebe9745a0b47bd3bada0 100644 --- a/net/minecraft/world/level/material/FlowingFluid.java +++ b/net/minecraft/world/level/material/FlowingFluid.java @@ -200,6 +200,7 @@ public abstract class FlowingFluid extends Fluid { @@ -132,10 +132,10 @@ index 18f008dceff896a405970afe157321105d55405f..1de0ef32b6519cad10c8ebf0ed328b67 return canPassThroughWall(Direction.DOWN, level, pos, state, belowPos, belowState) && (belowState.getFluidState().getType().isSame(this) || canHoldFluid(level, belowPos, belowState, this.getFlowing())); diff --git a/net/minecraft/world/level/material/LavaFluid.java b/net/minecraft/world/level/material/LavaFluid.java -index b7da2efaa784ef470029410be3e2359c5bf6dace..2d845b09abe3354f0999b117e78ffd00c41e8924 100644 +index 4df0dad91a5beeb0443ac1849e7783c470aae3d3..b7c01dadd69ce314ef6066d4c5d7c27080c7af8f 100644 --- a/net/minecraft/world/level/material/LavaFluid.java +++ b/net/minecraft/world/level/material/LavaFluid.java -@@ -237,6 +237,7 @@ public abstract class LavaFluid extends FlowingFluid { +@@ -239,6 +239,7 @@ public abstract class LavaFluid extends FlowingFluid { // CraftBukkit end } diff --git a/divinemc-server/minecraft-patches/features/0033-Optimize-Structure-Generation.patch b/divinemc-server/minecraft-patches/features/0033-Optimize-Structure-Generation.patch index 7dfe21b..3f51d48 100644 --- a/divinemc-server/minecraft-patches/features/0033-Optimize-Structure-Generation.patch +++ b/divinemc-server/minecraft-patches/features/0033-Optimize-Structure-Generation.patch @@ -197,10 +197,10 @@ index 103d604797bed34c2e357d01c2f7324dea3e9026..4aa68163958e89521f542470c473f8d5 Shapes.joinUnoptimized( mutableObject1.getValue(), Shapes.create(AABB.of(boundingBox3)), BooleanOp.ONLY_FIRST diff --git a/net/minecraft/world/level/levelgen/structure/pools/SinglePoolElement.java b/net/minecraft/world/level/levelgen/structure/pools/SinglePoolElement.java -index 5c081a5b3d10f713e4e82fe1a43758f553fe50e0..85e84603a19964f05d9d5e62eb096ca76c36ab00 100644 +index 0e107da76f267e8987b97c976a17e85cd5b8a341..f76a26a471dfe2f261b15d0ebbe3602cd05aaa4e 100644 --- a/net/minecraft/world/level/levelgen/structure/pools/SinglePoolElement.java +++ b/net/minecraft/world/level/levelgen/structure/pools/SinglePoolElement.java -@@ -119,8 +119,16 @@ public class SinglePoolElement extends StructurePoolElement { +@@ -120,8 +120,16 @@ public class SinglePoolElement extends StructurePoolElement { StructureTemplateManager structureTemplateManager, BlockPos pos, Rotation rotation, RandomSource random ) { List jigsaws = this.getTemplate(structureTemplateManager).getJigsaws(pos, rotation); @@ -219,7 +219,7 @@ index 5c081a5b3d10f713e4e82fe1a43758f553fe50e0..85e84603a19964f05d9d5e62eb096ca7 return jigsaws; } -@@ -196,4 +204,12 @@ public class SinglePoolElement extends StructurePoolElement { +@@ -197,4 +205,12 @@ public class SinglePoolElement extends StructurePoolElement { public ResourceLocation getTemplateLocation() { return this.template.orThrow(); } @@ -233,7 +233,7 @@ index 5c081a5b3d10f713e4e82fe1a43758f553fe50e0..85e84603a19964f05d9d5e62eb096ca7 + // DivineMC end - Optimize Structure Generation } diff --git a/net/minecraft/world/level/levelgen/structure/templatesystem/StructureTemplate.java b/net/minecraft/world/level/levelgen/structure/templatesystem/StructureTemplate.java -index 85f9b9a7df18a34fa7f8999b887bd444c3d3d067..0d98eee31f053614b9d4fddd811b6d17bd3a7a50 100644 +index a2405124c0d04827b9a98883e587729646df456f..da67064ed98d343e0b303819a8fdf5c48cc33b43 100644 --- a/net/minecraft/world/level/levelgen/structure/templatesystem/StructureTemplate.java +++ b/net/minecraft/world/level/levelgen/structure/templatesystem/StructureTemplate.java @@ -256,6 +256,12 @@ public class StructureTemplate { diff --git a/divinemc-server/minecraft-patches/features/0034-Implement-NoChatReports.patch b/divinemc-server/minecraft-patches/features/0034-Implement-NoChatReports.patch index 0a9dbeb..3ed4d41 100644 --- a/divinemc-server/minecraft-patches/features/0034-Implement-NoChatReports.patch +++ b/divinemc-server/minecraft-patches/features/0034-Implement-NoChatReports.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Implement NoChatReports diff --git a/net/minecraft/network/FriendlyByteBuf.java b/net/minecraft/network/FriendlyByteBuf.java -index be5ac057737fd67fbf2f80f879f8e2816750f041..85faebf1d75bc6d4e6b01d0dad1920069f6fd98d 100644 +index 9c57702310f710a83971faaf9f658610e47334df..ddf3e514310f7c8990acb7d9d733e5cc07f33eea 100644 --- a/net/minecraft/network/FriendlyByteBuf.java +++ b/net/minecraft/network/FriendlyByteBuf.java @@ -105,7 +105,28 @@ public class FriendlyByteBuf extends ByteBuf { @@ -287,10 +287,10 @@ index 4a333e87af17bd5b673b57c0fa0d3a239fb8db59..e5569978a23c5bde673146421963a2ff if (packet == null || this.processedDisconnect) { // Spigot return; diff --git a/net/minecraft/server/players/PlayerList.java b/net/minecraft/server/players/PlayerList.java -index adefc10f96c8216a4ba467f1f50672478b27b428..f67e870ece3bbd6b7e8e194d3b2da989229110e7 100644 +index 457dfcb459f2618e6975ab3e4ff37d5988dd50c2..42af746efa840152dfb0a8d73d9d227115254acc 100644 --- a/net/minecraft/server/players/PlayerList.java +++ b/net/minecraft/server/players/PlayerList.java -@@ -181,7 +181,7 @@ public abstract class PlayerList { +@@ -182,7 +182,7 @@ public abstract class PlayerList { !_boolean, _boolean2, player.createCommonSpawnInfo(serverLevel), @@ -299,7 +299,7 @@ index adefc10f96c8216a4ba467f1f50672478b27b428..f67e870ece3bbd6b7e8e194d3b2da989 ) ); player.getBukkitEntity().sendSupportedChannels(); // CraftBukkit -@@ -1196,6 +1196,7 @@ public abstract class PlayerList { +@@ -1197,6 +1197,7 @@ public abstract class PlayerList { } public boolean verifyChatTrusted(PlayerChatMessage message) { diff --git a/divinemc-server/minecraft-patches/features/0035-Lag-compensation.patch b/divinemc-server/minecraft-patches/features/0035-Lag-compensation.patch index f808335..91e4501 100644 --- a/divinemc-server/minecraft-patches/features/0035-Lag-compensation.patch +++ b/divinemc-server/minecraft-patches/features/0035-Lag-compensation.patch @@ -66,10 +66,10 @@ index 3275a8a3a57a6d836170efbf12bc1257282703c8..f038c8fe7fa84457dcee2276bbbdb7ec this.serverLevelData.setDayTime(time); // Purpur start - Configurable daylight cycle diff --git a/net/minecraft/world/entity/LivingEntity.java b/net/minecraft/world/entity/LivingEntity.java -index 509689bfffbe7b376ce3c4f9851342242ae3bab2..f15497ef868574ee2fe11611bfc31d9b102f80d0 100644 +index 288d23e443f495d7fbfd0bbbe1bca7a2ff9da64a..2dc2dd9dbbe63316827b620b991ad929ad7bb77e 100644 --- a/net/minecraft/world/entity/LivingEntity.java +++ b/net/minecraft/world/entity/LivingEntity.java -@@ -525,6 +525,7 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin +@@ -526,6 +526,7 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin } } @@ -77,7 +77,7 @@ index 509689bfffbe7b376ce3c4f9851342242ae3bab2..f15497ef868574ee2fe11611bfc31d9b this.tickEffects(); this.yHeadRotO = this.yHeadRot; this.yBodyRotO = this.yBodyRot; -@@ -532,6 +533,17 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin +@@ -533,6 +534,17 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin this.xRotO = this.getXRot(); } @@ -183,10 +183,10 @@ index 5305b72c37ba0fcde811d46e781fb4c74817da52..fbae6ab5d5a999039ae8d67cd3df193e BlocksAttacks blocksAttacks = stack.get(DataComponents.BLOCKS_ATTACKS); return blocksAttacks != null ? 72000 : 0; diff --git a/net/minecraft/world/level/GameRules.java b/net/minecraft/world/level/GameRules.java -index dbd3813cb0328b7b73c9b634b1b19be7ee3246f6..9b72f3266e3a7cf6bd934d2497f0c5332c09ae59 100644 +index 7141d2c69e27e9b14e99360686d9bff1d84c24e6..5eeaa5bca2c9482420990822781625a2c1a6e94e 100644 --- a/net/minecraft/world/level/GameRules.java +++ b/net/minecraft/world/level/GameRules.java -@@ -377,8 +377,31 @@ public class GameRules { +@@ -378,8 +378,31 @@ public class GameRules { } public int getInt(GameRules.Key key) { @@ -220,7 +220,7 @@ index dbd3813cb0328b7b73c9b634b1b19be7ee3246f6..9b72f3266e3a7cf6bd934d2497f0c533 public static class BooleanValue extends GameRules.Value { private boolean value; diff --git a/net/minecraft/world/level/block/state/BlockBehaviour.java b/net/minecraft/world/level/block/state/BlockBehaviour.java -index 00ca563d6bfbe6182dc246d5f6ffca7fc9a5ba85..611b29ccba29558d8cf54eccb2136a305bf989db 100644 +index f9794da266b5f08f01f88184d3bcca9d8371e44f..a6c99a119a923dd890169888ff4e9852f6e27855 100644 --- a/net/minecraft/world/level/block/state/BlockBehaviour.java +++ b/net/minecraft/world/level/block/state/BlockBehaviour.java @@ -350,13 +350,21 @@ public abstract class BlockBehaviour implements FeatureElement { @@ -248,10 +248,10 @@ index 00ca563d6bfbe6182dc246d5f6ffca7fc9a5ba85..611b29ccba29558d8cf54eccb2136a30 } diff --git a/net/minecraft/world/level/chunk/LevelChunk.java b/net/minecraft/world/level/chunk/LevelChunk.java -index 84bc3ed25a30ede18f66859129dacd73d6837d1f..524f987ba5cbf3d9fa502b51419cb163e099597c 100644 +index a403b61e0300ecfff55f10009ecd3ad57f543808..529f8a3a4db2effaa91d5b95244717dc44d4c6f4 100644 --- a/net/minecraft/world/level/chunk/LevelChunk.java +++ b/net/minecraft/world/level/chunk/LevelChunk.java -@@ -957,6 +957,19 @@ public class LevelChunk extends ChunkAccess implements DebugValueSource, ca.spot +@@ -959,6 +959,19 @@ public class LevelChunk extends ChunkAccess implements DebugValueSource, ca.spot this.ticker = ticker; } @@ -271,7 +271,7 @@ index 84bc3ed25a30ede18f66859129dacd73d6837d1f..524f987ba5cbf3d9fa502b51419cb163 @Override public void tick() { if (!this.blockEntity.isRemoved() && this.blockEntity.hasLevel()) { -@@ -967,7 +980,11 @@ public class LevelChunk extends ChunkAccess implements DebugValueSource, ca.spot +@@ -969,7 +982,11 @@ public class LevelChunk extends ChunkAccess implements DebugValueSource, ca.spot profilerFiller.push(this::getType); BlockState blockState = LevelChunk.this.getBlockState(blockPos); if (this.blockEntity.getType().isValid(blockState)) { @@ -285,10 +285,10 @@ index 84bc3ed25a30ede18f66859129dacd73d6837d1f..524f987ba5cbf3d9fa502b51419cb163 // Paper start - Remove the Block Entity if it's invalid } else { diff --git a/net/minecraft/world/level/material/LavaFluid.java b/net/minecraft/world/level/material/LavaFluid.java -index 2d845b09abe3354f0999b117e78ffd00c41e8924..9630a1fd95853671812c3249f32a8a1e3a05f7ab 100644 +index b7c01dadd69ce314ef6066d4c5d7c27080c7af8f..f838577f0290a1d9bffb860cbeb2daaa6b19957d 100644 --- a/net/minecraft/world/level/material/LavaFluid.java +++ b/net/minecraft/world/level/material/LavaFluid.java -@@ -188,9 +188,22 @@ public abstract class LavaFluid extends FlowingFluid { +@@ -190,9 +190,22 @@ public abstract class LavaFluid extends FlowingFluid { return fluidState.getHeight(level, pos) >= 0.44444445F && fluid.is(FluidTags.WATER); } diff --git a/divinemc-server/minecraft-patches/features/0036-Virtual-Threads.patch b/divinemc-server/minecraft-patches/features/0036-Virtual-Threads.patch index 3e8a836..d952924 100644 --- a/divinemc-server/minecraft-patches/features/0036-Virtual-Threads.patch +++ b/divinemc-server/minecraft-patches/features/0036-Virtual-Threads.patch @@ -36,10 +36,10 @@ index 3de2d76bf118750932a56d02233e4e6aff0b2728..690c67f2051996d0888a946b8c089d39 public ChatDecorator getChatDecorator() { diff --git a/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/net/minecraft/server/network/ServerGamePacketListenerImpl.java -index a306147f4b8213363f96745f4cd33a5a3b01777b..53f3193cbd6ddb53dde771a28f15aec5aee49d66 100644 +index 93885af89a402bdadaccd598c7c2939c96fdf6e4..3bd279d72d06f30c9b20146ba932a8f4832dee50 100644 --- a/net/minecraft/server/network/ServerGamePacketListenerImpl.java +++ b/net/minecraft/server/network/ServerGamePacketListenerImpl.java -@@ -844,8 +844,11 @@ public class ServerGamePacketListenerImpl +@@ -845,8 +845,11 @@ public class ServerGamePacketListenerImpl } // Paper start - AsyncTabCompleteEvent diff --git a/divinemc-server/minecraft-patches/features/0041-Dynamic-Activation-of-Brain.patch b/divinemc-server/minecraft-patches/features/0041-Dynamic-Activation-of-Brain.patch index ee6d58d..7fb8483 100644 --- a/divinemc-server/minecraft-patches/features/0041-Dynamic-Activation-of-Brain.patch +++ b/divinemc-server/minecraft-patches/features/0041-Dynamic-Activation-of-Brain.patch @@ -43,7 +43,7 @@ index 646ca37bba6da8ab0babbf4a1e6ba88e75658e72..1d9b32476c1b89984f1afa8e906ca094 if (!tickRateManager.isEntityFrozen(entity)) { entity.checkDespawn(); diff --git a/net/minecraft/world/entity/Entity.java b/net/minecraft/world/entity/Entity.java -index 6b5b01b9525f51fe02f03f7249517599d1ba1945..3dc742ca965a06629686c846c4018672576a9db1 100644 +index 80b771f69549cf460b3d1fca2de8f27152e98f42..5d5e125e55daf55764846c0d7ce2c3150847aeb8 100644 --- a/net/minecraft/world/entity/Entity.java +++ b/net/minecraft/world/entity/Entity.java @@ -366,6 +366,8 @@ public abstract class Entity implements SyncedDataHolder, DebugValueSource, Name @@ -68,7 +68,7 @@ index 881575864f864305973033ac6e664fc47e49ca16..7d5940327c5e7a945165228d502f678a @Nullable private Component description; diff --git a/net/minecraft/world/entity/Mob.java b/net/minecraft/world/entity/Mob.java -index c551b8c8c9b9d070afdbcf5cfcdb35e99830fd91..b61b9c512f23d5ae0465fe7196fbb222918b0988 100644 +index b2853b6a3bca0ea04c50fedf5e2f5ff633ac2a21..f7cdbc7ca10d4320da5deabe9e01ca774890d796 100644 --- a/net/minecraft/world/entity/Mob.java +++ b/net/minecraft/world/entity/Mob.java @@ -220,10 +220,10 @@ public abstract class Mob extends LivingEntity implements EquipmentUser, Leashab @@ -147,10 +147,10 @@ index 653c58c7637c46c8b46a5082f671324a2221d431..a4328a427636aa845d6627ecb75a9efe public boolean hasTasks() { for (WrappedGoal task : this.availableGoals) { diff --git a/net/minecraft/world/entity/animal/allay/Allay.java b/net/minecraft/world/entity/animal/allay/Allay.java -index ae68a19a0b13bc626efec6a028f3abba4a436f3b..c5526952961c3c2705f946021ff3a8306ad2bde1 100644 +index c8487029d5707d75b83aebc6fab7c65391f102f9..af6670cff00a3c2de21b91d7c9353f2e4171df9c 100644 --- a/net/minecraft/world/entity/animal/allay/Allay.java +++ b/net/minecraft/world/entity/animal/allay/Allay.java -@@ -112,6 +112,7 @@ public class Allay extends PathfinderMob implements InventoryCarrier, VibrationS +@@ -113,6 +113,7 @@ public class Allay extends PathfinderMob implements InventoryCarrier, VibrationS private float spinningAnimationTicks0; public boolean forceDancing = false; // CraftBukkit private org.purpurmc.purpur.controller.FlyingMoveControllerWASD purpurController; // Purpur - Ridables @@ -158,7 +158,7 @@ index ae68a19a0b13bc626efec6a028f3abba4a436f3b..c5526952961c3c2705f946021ff3a830 public Allay(EntityType type, Level level) { super(type, level); -@@ -266,10 +267,13 @@ public class Allay extends PathfinderMob implements InventoryCarrier, VibrationS +@@ -267,10 +268,13 @@ public class Allay extends PathfinderMob implements InventoryCarrier, VibrationS @Override protected void customServerAiStep(ServerLevel level) { @@ -272,10 +272,10 @@ index 37b1674c3f89d7ddba054b066df957f3337f4a89..e437dad4f65a77b1ecbefe324355e33e public static AttributeSupplier.Builder createAttributes() { diff --git a/net/minecraft/world/entity/animal/goat/Goat.java b/net/minecraft/world/entity/animal/goat/Goat.java -index 58ee22461c0330e2fbbbf283c154b8141e2d1953..1ef0fa87f55a4fe6309ed456b0458287925f9835 100644 +index 04a4cc148579904222b3c99a1ad4c64e5783afa2..b2c932706b8d910c6e10cfa0ca44bf77c4521835 100644 --- a/net/minecraft/world/entity/animal/goat/Goat.java +++ b/net/minecraft/world/entity/animal/goat/Goat.java -@@ -93,6 +93,7 @@ public class Goat extends Animal { +@@ -94,6 +94,7 @@ public class Goat extends Animal { private static final boolean DEFAULT_HAS_RIGHT_HORN = true; private boolean isLoweringHead; private int lowerHeadTick; @@ -283,7 +283,7 @@ index 58ee22461c0330e2fbbbf283c154b8141e2d1953..1ef0fa87f55a4fe6309ed456b0458287 public Goat(EntityType type, Level level) { super(type, level); -@@ -232,10 +233,13 @@ public class Goat extends Animal { +@@ -233,10 +234,13 @@ public class Goat extends Animal { @Override protected void customServerAiStep(ServerLevel level) { @@ -302,10 +302,10 @@ index 58ee22461c0330e2fbbbf283c154b8141e2d1953..1ef0fa87f55a4fe6309ed456b0458287 @Override diff --git a/net/minecraft/world/entity/monster/hoglin/Hoglin.java b/net/minecraft/world/entity/monster/hoglin/Hoglin.java -index c309b01a461ddb47d20a6c96bd693e4850bd731b..5ccf6e916c5c5ebe034a55b71725f740a21f4f83 100644 +index 1abc4d0de2ff983fc0c30bbc8a356d78f1c23897..f23c3918adf0a654be4365370e132067e8574c5c 100644 --- a/net/minecraft/world/entity/monster/hoglin/Hoglin.java +++ b/net/minecraft/world/entity/monster/hoglin/Hoglin.java -@@ -87,6 +87,7 @@ public class Hoglin extends Animal implements Enemy, HoglinBase { +@@ -88,6 +88,7 @@ public class Hoglin extends Animal implements Enemy, HoglinBase { MemoryModuleType.PACIFIED, MemoryModuleType.IS_PANICKING ); @@ -313,7 +313,7 @@ index c309b01a461ddb47d20a6c96bd693e4850bd731b..5ccf6e916c5c5ebe034a55b71725f740 public Hoglin(EntityType type, Level level) { super(type, level); -@@ -205,18 +206,21 @@ public class Hoglin extends Animal implements Enemy, HoglinBase { +@@ -206,18 +207,21 @@ public class Hoglin extends Animal implements Enemy, HoglinBase { @Override protected void customServerAiStep(ServerLevel level) { @@ -376,10 +376,10 @@ index b21ca373220f80c81cadab1eda482057d6366caf..8d0b364149c3772b95e97136f77749f7 @Override diff --git a/net/minecraft/world/entity/monster/warden/Warden.java b/net/minecraft/world/entity/monster/warden/Warden.java -index e9881eac70feebeb08f464efd4fa953cec9f62bf..6edd808e8d0c940dfa6dea463d549d6e80a5d465 100644 +index 87976d8981f72732899c57a96971e851b86d5123..5bc5b7e89c87eef6031729f2f7185263da014540 100644 --- a/net/minecraft/world/entity/monster/warden/Warden.java +++ b/net/minecraft/world/entity/monster/warden/Warden.java -@@ -107,6 +107,7 @@ public class Warden extends Monster implements VibrationSystem { +@@ -108,6 +108,7 @@ public class Warden extends Monster implements VibrationSystem { private final VibrationSystem.User vibrationUser; private VibrationSystem.Data vibrationData; AngerManagement angerManagement = new AngerManagement(this::canTargetEntity, Collections.emptyList()); @@ -387,7 +387,7 @@ index e9881eac70feebeb08f464efd4fa953cec9f62bf..6edd808e8d0c940dfa6dea463d549d6e public Warden(EntityType type, Level level) { super(type, level); -@@ -300,19 +301,22 @@ public class Warden extends Monster implements VibrationSystem { +@@ -301,19 +302,22 @@ public class Warden extends Monster implements VibrationSystem { @Override protected void customServerAiStep(ServerLevel level) { @@ -422,10 +422,10 @@ index e9881eac70feebeb08f464efd4fa953cec9f62bf..6edd808e8d0c940dfa6dea463d549d6e @Override diff --git a/net/minecraft/world/entity/npc/Villager.java b/net/minecraft/world/entity/npc/Villager.java -index e89ff53c568013a5f53afcf5759314221d37adf4..5443677ed4ecaaf3b647e3f72802e80d7d22fad9 100644 +index d99a6ade82bbd01e25137fecfbec5dcef6765e79..a356da48b20ab38648d75f9066b2ed4a013c13c2 100644 --- a/net/minecraft/world/entity/npc/Villager.java +++ b/net/minecraft/world/entity/npc/Villager.java -@@ -178,6 +178,8 @@ public class Villager extends AbstractVillager implements ReputationEventHandler +@@ -179,6 +179,8 @@ public class Villager extends AbstractVillager implements ReputationEventHandler ); private boolean isLobotomized = false; public boolean isLobotomized() { return this.isLobotomized; } // Purpur - Lobotomize stuck villagers private int notLobotomizedCount = 0; // Purpur - Lobotomize stuck villagers @@ -434,7 +434,7 @@ index e89ff53c568013a5f53afcf5759314221d37adf4..5443677ed4ecaaf3b647e3f72802e80d public Villager(EntityType type, Level level) { this(type, level, VillagerType.PLAINS); -@@ -398,7 +400,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler +@@ -399,7 +401,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler } else { this.isLobotomized = false; } diff --git a/divinemc-server/minecraft-patches/features/0042-Petal-Async-Pathfinding.patch b/divinemc-server/minecraft-patches/features/0042-Petal-Async-Pathfinding.patch index 725c622..1df3f4d 100644 --- a/divinemc-server/minecraft-patches/features/0042-Petal-Async-Pathfinding.patch +++ b/divinemc-server/minecraft-patches/features/0042-Petal-Async-Pathfinding.patch @@ -557,10 +557,10 @@ index 1f96fd5085bacb4c584576c7cb9f51e7898e9b03..d975b89c7bb57562852596751a4ff881 + // DivineMC end - async pathfinding } diff --git a/net/minecraft/world/entity/animal/Bee.java b/net/minecraft/world/entity/animal/Bee.java -index 968ec5a7188cc4e4a60956e12e44c4b746cf78d1..df32142019bc81896e3e84d3f69e23f5ae8cbd83 100644 +index 5e054044444b464243c11574bbac9a0eabcc4073..c52ed3f4744638922b585693e86fc71c356b0f82 100644 --- a/net/minecraft/world/entity/animal/Bee.java +++ b/net/minecraft/world/entity/animal/Bee.java -@@ -942,7 +942,7 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { +@@ -943,7 +943,7 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { } else { Bee.this.pathfindRandomlyTowards(Bee.this.hivePos); } @@ -569,7 +569,7 @@ index 968ec5a7188cc4e4a60956e12e44c4b746cf78d1..df32142019bc81896e3e84d3f69e23f5 boolean flag = this.pathfindDirectlyTowards(Bee.this.hivePos); if (!flag) { this.dropAndBlacklistHive(); -@@ -996,7 +996,7 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { +@@ -997,7 +997,7 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { return true; } else { Path path = Bee.this.navigation.getPath(); @@ -656,10 +656,10 @@ index da7644dd2b9e86ec8947250ff998fb554e881161..c842e500ddc229bc776c29a39c6f8a71 } diff --git a/net/minecraft/world/entity/monster/warden/Warden.java b/net/minecraft/world/entity/monster/warden/Warden.java -index 6edd808e8d0c940dfa6dea463d549d6e80a5d465..56f0aefd0f5c3087fc8122354fcb1b753aff2a4c 100644 +index 5bc5b7e89c87eef6031729f2f7185263da014540..f3a8e187740eacd4244da67d21b2ec7de1b2208a 100644 --- a/net/minecraft/world/entity/monster/warden/Warden.java +++ b/net/minecraft/world/entity/monster/warden/Warden.java -@@ -572,6 +572,16 @@ public class Warden extends Monster implements VibrationSystem { +@@ -573,6 +573,16 @@ public class Warden extends Monster implements VibrationSystem { @Override protected PathFinder createPathFinder(int maxVisitedNodes) { this.nodeEvaluator = new WalkNodeEvaluator(); diff --git a/divinemc-server/minecraft-patches/features/0043-Petal-Multithreaded-Tracker.patch b/divinemc-server/minecraft-patches/features/0043-Petal-Multithreaded-Tracker.patch index a1b69c0..d3c81f4 100644 --- a/divinemc-server/minecraft-patches/features/0043-Petal-Multithreaded-Tracker.patch +++ b/divinemc-server/minecraft-patches/features/0043-Petal-Multithreaded-Tracker.patch @@ -412,10 +412,10 @@ index 1d9b32476c1b89984f1afa8e906ca09472b8d6b2..0b1ea5c5248f0b54ba7b01d7bc89e154 } } diff --git a/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/net/minecraft/server/network/ServerGamePacketListenerImpl.java -index 53f3193cbd6ddb53dde771a28f15aec5aee49d66..64e5743aed23b4004de32122b880f99cb70eac8a 100644 +index 3bd279d72d06f30c9b20146ba932a8f4832dee50..ef578f42cceac5fd75d0d0528e2ec9791beff2d0 100644 --- a/net/minecraft/server/network/ServerGamePacketListenerImpl.java +++ b/net/minecraft/server/network/ServerGamePacketListenerImpl.java -@@ -1942,7 +1942,6 @@ public class ServerGamePacketListenerImpl +@@ -1943,7 +1943,6 @@ public class ServerGamePacketListenerImpl } public void internalTeleport(PositionMoveRotation posMoveRotation, Set relatives) { @@ -424,10 +424,10 @@ index 53f3193cbd6ddb53dde771a28f15aec5aee49d66..64e5743aed23b4004de32122b880f99c if (this.player.isRemoved()) { LOGGER.info("Attempt to teleport removed player {} restricted", player.getScoreboardName()); diff --git a/net/minecraft/world/entity/LivingEntity.java b/net/minecraft/world/entity/LivingEntity.java -index f15497ef868574ee2fe11611bfc31d9b102f80d0..ca392664826ca8ced5a1c2c8b2d22eb87c5bd139 100644 +index 2dc2dd9dbbe63316827b620b991ad929ad7bb77e..7ec1c2f39981b60343f152a5432b3677574ee46c 100644 --- a/net/minecraft/world/entity/LivingEntity.java +++ b/net/minecraft/world/entity/LivingEntity.java -@@ -1360,13 +1360,13 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin +@@ -1361,13 +1361,13 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin } private void refreshDirtyAttributes() { diff --git a/divinemc-server/minecraft-patches/features/0048-SparklyPaper-Parallel-world-ticking.patch b/divinemc-server/minecraft-patches/features/0048-SparklyPaper-Parallel-world-ticking.patch index e6f8ea0..ce03eb5 100644 --- a/divinemc-server/minecraft-patches/features/0048-SparklyPaper-Parallel-world-ticking.patch +++ b/divinemc-server/minecraft-patches/features/0048-SparklyPaper-Parallel-world-ticking.patch @@ -94,10 +94,10 @@ index ff747a1ecdf3c888bca0d69de4f85dcd810b6139..4970243433e7de4ec2e452f25f8737cd // The variable 'k' holds the maximum redstone power value of any adjacent blocks. // If 'k' has the highest level of all neighbors, then the power level of this diff --git a/net/minecraft/core/dispenser/DispenseItemBehavior.java b/net/minecraft/core/dispenser/DispenseItemBehavior.java -index 181fdb493f64442c659165c10e237ebc198fb6e2..43363235f3dc696973eee99548b1ae551cada371 100644 +index 077ccddb7d358be352b6d497ed8b4e97b7d09262..7197434fdd304d0608b1d0bf2b1d6c6e2eb3d1df 100644 --- a/net/minecraft/core/dispenser/DispenseItemBehavior.java +++ b/net/minecraft/core/dispenser/DispenseItemBehavior.java -@@ -410,8 +410,10 @@ public interface DispenseItemBehavior { +@@ -412,8 +412,10 @@ public interface DispenseItemBehavior { // CraftBukkit start level.captureTreeGeneration = false; if (!level.capturedBlockStates.isEmpty()) { @@ -330,7 +330,7 @@ index c37851095cfe637a2768de0aa179efe66e9a4cde..1afd48654a421f0e0d4d5c2f27bdfe0b LOGGER.info("Default game type: {}", properties.gameMode.get()); // Paper start - Unix domain socket support diff --git a/net/minecraft/server/level/ServerChunkCache.java b/net/minecraft/server/level/ServerChunkCache.java -index d8f0bd8173836796ecdd9771b637d24c7a807a79..e23f2004705fc299934a8b30e736ddf0a8eb2147 100644 +index c5b95557dc148cfc91c031bf0789001868a60cbd..6ea62fbffda38e477ef8e119608fc93793db95c3 100644 --- a/net/minecraft/server/level/ServerChunkCache.java +++ b/net/minecraft/server/level/ServerChunkCache.java @@ -176,8 +176,12 @@ public class ServerChunkCache extends ChunkSource implements ca.spottedleaf.moon @@ -465,10 +465,10 @@ index 0b1ea5c5248f0b54ba7b01d7bc89e1547ad2a89a..27a63526c4fde0a716eb9ac3f8f4d0fd // Paper start - extra debug info if (entity.valid) { diff --git a/net/minecraft/server/level/ServerPlayer.java b/net/minecraft/server/level/ServerPlayer.java -index 43cb158bee132cce0f3b09e31bc8ac83245ed3ea..7310f152ecdef82a2a211c149e72d29208ae078e 100644 +index b1667ed08c417daf292e092ca0d2ab9848ac8d61..f7603988f9d818bd66eba8a9d3d3edbef347b6c2 100644 --- a/net/minecraft/server/level/ServerPlayer.java +++ b/net/minecraft/server/level/ServerPlayer.java -@@ -443,6 +443,7 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc +@@ -444,6 +444,7 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc private boolean tpsBar = false; // Purpur - Implement TPSBar private boolean compassBar = false; // Purpur - Add compass command private boolean ramBar = false; // Purpur - Implement rambar commands @@ -476,7 +476,7 @@ index 43cb158bee132cce0f3b09e31bc8ac83245ed3ea..7310f152ecdef82a2a211c149e72d292 // Paper start - rewrite chunk system private ca.spottedleaf.moonrise.patches.chunk_system.player.RegionizedPlayerChunkLoader.PlayerChunkLoaderData chunkLoader; -@@ -723,6 +724,7 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc +@@ -724,6 +725,7 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc @Override public void tick() { @@ -484,15 +484,15 @@ index 43cb158bee132cce0f3b09e31bc8ac83245ed3ea..7310f152ecdef82a2a211c149e72d292 // CraftBukkit start if (this.joining) { this.joining = false; -@@ -1557,6 +1559,7 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc +@@ -1558,6 +1560,7 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc teleportTransition.postTeleportTransition().onTransition(this); return this; } else { + if (org.bxteam.divinemc.config.DivineConfig.AsyncCategory.enableParallelWorldTicking) ca.spottedleaf.moonrise.common.util.TickThread.ensureOnlyTickThread("Cannot change dimension of a player off-main, from world " + level().getWorld().getName() + " to world " + level.getWorld().getName()); // DivineMC - Parallel world ticking (additional concurrency issues logs) this.isChangingDimension = true; LevelData levelData = level.getLevelData(); - this.connection.send(new ClientboundRespawnPacket(this.createCommonSpawnInfo(level), (byte)3)); -@@ -1873,6 +1876,12 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc + this.connection.send(new ClientboundRespawnPacket(this.createCommonSpawnInfo(level), ClientboundRespawnPacket.KEEP_ALL_DATA)); +@@ -1874,6 +1877,12 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc return OptionalInt.empty(); } else { // CraftBukkit start @@ -505,7 +505,7 @@ index 43cb158bee132cce0f3b09e31bc8ac83245ed3ea..7310f152ecdef82a2a211c149e72d292 this.containerMenu = abstractContainerMenu; // Moved up if (!this.isImmobile()) this.connection -@@ -1937,6 +1946,11 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc +@@ -1938,6 +1947,11 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc } @Override public void closeContainer(org.bukkit.event.inventory.InventoryCloseEvent.Reason reason) { @@ -518,10 +518,10 @@ index 43cb158bee132cce0f3b09e31bc8ac83245ed3ea..7310f152ecdef82a2a211c149e72d292 // Paper end - Inventory close reason this.connection.send(new ClientboundContainerClosePacket(this.containerMenu.containerId)); diff --git a/net/minecraft/server/players/PlayerList.java b/net/minecraft/server/players/PlayerList.java -index f67e870ece3bbd6b7e8e194d3b2da989229110e7..249c85f283b4a80493014773c7e8bf06953cbc3a 100644 +index 42af746efa840152dfb0a8d73d9d227115254acc..9acc247ec540449a0e4cf3a5a0bc67a0e3dfbf15 100644 --- a/net/minecraft/server/players/PlayerList.java +++ b/net/minecraft/server/players/PlayerList.java -@@ -149,6 +149,7 @@ public abstract class PlayerList { +@@ -150,6 +150,7 @@ public abstract class PlayerList { abstract public void loadAndSaveFiles(); // Paper - fix converting txt to json file; moved from DedicatedPlayerList constructor public void placeNewPlayer(Connection connection, ServerPlayer player, CommonListenerCookie cookie) { @@ -529,7 +529,7 @@ index f67e870ece3bbd6b7e8e194d3b2da989229110e7..249c85f283b4a80493014773c7e8bf06 player.isRealPlayer = true; // Paper player.loginTime = System.currentTimeMillis(); // Paper - Replace OfflinePlayer#getLastPlayed NameAndId nameAndId = player.nameAndId(); -@@ -596,6 +597,7 @@ public abstract class PlayerList { +@@ -597,6 +598,7 @@ public abstract class PlayerList { // Paper start - respawn event public ServerPlayer respawn(ServerPlayer player, boolean keepInventory, Entity.RemovalReason reason, org.bukkit.event.player.PlayerRespawnEvent.RespawnReason respawnReason) { @@ -537,7 +537,7 @@ index f67e870ece3bbd6b7e8e194d3b2da989229110e7..249c85f283b4a80493014773c7e8bf06 ServerPlayer.RespawnResult result = player.findRespawnPositionAndUseSpawnBlock0(!keepInventory, TeleportTransition.DO_NOTHING, respawnReason); if (result == null) { // disconnected player during the respawn event return player; -@@ -608,6 +610,7 @@ public abstract class PlayerList { +@@ -609,6 +611,7 @@ public abstract class PlayerList { player.level().removePlayerImmediately(player, reason); ServerLevel level = teleportTransition.newLevel(); ServerPlayer serverPlayer = player; // Paper - TODO - recreate instance @@ -631,7 +631,7 @@ index f9e7532f86122a379692561a639a209a126e8bba..839f6b7696ef85314da185bedba7cfc5 if (isLocatorBarEnabledFor(player)) { if (!connection.isBroken()) { diff --git a/net/minecraft/world/entity/Entity.java b/net/minecraft/world/entity/Entity.java -index 3dc742ca965a06629686c846c4018672576a9db1..b3fb97a255bae7bdf0ed1aa0b8b2c376b39bdce7 100644 +index 5d5e125e55daf55764846c0d7ce2c3150847aeb8..56483d9e770e29526a36d4c8c5565092acb227c7 100644 --- a/net/minecraft/world/entity/Entity.java +++ b/net/minecraft/world/entity/Entity.java @@ -3540,14 +3540,34 @@ public abstract class Entity implements SyncedDataHolder, DebugValueSource, Name @@ -787,10 +787,10 @@ index 6adf1b2250234ede6e6f498ed0990ab523f09b8e..a8ae790a7b9bfd0d78cac0577bb7a4dd entity.getBrain().eraseMemory(MemoryModuleType.POTENTIAL_JOB_SITE); } diff --git a/net/minecraft/world/entity/npc/Villager.java b/net/minecraft/world/entity/npc/Villager.java -index 5443677ed4ecaaf3b647e3f72802e80d7d22fad9..f200827d35d981aef06b8136557b92fc9a566239 100644 +index a356da48b20ab38648d75f9066b2ed4a013c13c2..415b021c8f0b68e2aacd23b568ca35d95bf2ce66 100644 --- a/net/minecraft/world/entity/npc/Villager.java +++ b/net/minecraft/world/entity/npc/Villager.java -@@ -793,13 +793,24 @@ public class Villager extends AbstractVillager implements ReputationEventHandler +@@ -794,13 +794,24 @@ public class Villager extends AbstractVillager implements ReputationEventHandler this.brain.getMemory(moduleType).ifPresent(pos -> { ServerLevel level = server.getLevel(pos.dimension()); if (level != null) { @@ -913,7 +913,7 @@ index 9213d25928066ee6722f1a145ae37e99d6e62582..28f0b59500d67bdd92c97a7e138c9488 } else { Entity entity = owner.teleport( diff --git a/net/minecraft/world/inventory/AbstractContainerMenu.java b/net/minecraft/world/inventory/AbstractContainerMenu.java -index c0b54e17d75150b1114a9d5895311995726bb88f..7d35e587508f24401a998de27f88ce9cef961b8a 100644 +index 276b5e6ac82e6e55e0a19c25a7c966501aeaba44..c3021c0a8c588acf5ae8c9231e75bda984863267 100644 --- a/net/minecraft/world/inventory/AbstractContainerMenu.java +++ b/net/minecraft/world/inventory/AbstractContainerMenu.java @@ -96,8 +96,14 @@ public abstract class AbstractContainerMenu { @@ -949,10 +949,10 @@ index e4bcd4a3cbbc8942d52e5f3c7a4fb1572fdef91c..52a8a818a636e35b486b8aaf482cd688 serverLevel.capturedBlockStates.clear(); org.bukkit.event.world.StructureGrowEvent structureEvent = null; diff --git a/net/minecraft/world/level/Level.java b/net/minecraft/world/level/Level.java -index 79627c421088d439745164d7652a0cc1d93ced30..1f00b7ddf6c470c8a32e418775fa40e90ec88dbe 100644 +index 21a20aa602f51bbd6c8cdcb52f6b485971834595..7fe5cb2ea1c81b12baf302999a2794f20018707c 100644 --- a/net/minecraft/world/level/Level.java +++ b/net/minecraft/world/level/Level.java -@@ -170,6 +170,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl +@@ -171,6 +171,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl private int tileTickPosition; public final Map explosionDensityCache = new java.util.HashMap<>(); // Paper - Optimize explosions public java.util.ArrayDeque redstoneUpdateInfos; // Paper - Faster redstone torch rapid clock removal; Move from Map in BlockRedstoneTorch to here @@ -960,7 +960,7 @@ index 79627c421088d439745164d7652a0cc1d93ced30..1f00b7ddf6c470c8a32e418775fa40e9 // Purpur start - Add adjustable breeding cooldown to config private com.google.common.cache.Cache playerBreedingCooldowns; -@@ -920,6 +921,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl +@@ -921,6 +922,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl this.damageSources = new DamageSources(registryAccess); this.entityLookup = new ca.spottedleaf.moonrise.patches.chunk_system.level.entity.dfl.DefaultEntityLookup(this); // Paper - rewrite chunk system this.chunkPacketBlockController = this.paperConfig().anticheat.antiXray.enabled ? new io.papermc.paper.antixray.ChunkPacketBlockControllerAntiXray(this, executor) : io.papermc.paper.antixray.ChunkPacketBlockController.NO_OPERATION_INSTANCE; // Paper - Anti-Xray @@ -968,7 +968,7 @@ index 79627c421088d439745164d7652a0cc1d93ced30..1f00b7ddf6c470c8a32e418775fa40e9 } // Paper start - Cancel hit for vanished players -@@ -1088,6 +1090,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl +@@ -1089,6 +1091,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl @Override public boolean setBlock(BlockPos pos, BlockState state, int flags, int recursionLeft) { @@ -976,7 +976,7 @@ index 79627c421088d439745164d7652a0cc1d93ced30..1f00b7ddf6c470c8a32e418775fa40e9 // CraftBukkit start - tree generation if (this.captureTreeGeneration) { // Paper start - Protect Bedrock and End Portal/Frames from being destroyed -@@ -1471,11 +1474,12 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl +@@ -1472,11 +1475,12 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl this.blockEntityTickers.markAsRemoved(this.tileTickPosition); // DivineMC - optimize block entity removals - Fix MC-117075 } else if (runsNormally && this.shouldTickBlocksAt(tickingBlockEntity.getPos())) { tickingBlockEntity.tick(); @@ -993,7 +993,7 @@ index 79627c421088d439745164d7652a0cc1d93ced30..1f00b7ddf6c470c8a32e418775fa40e9 } } this.blockEntityTickers.removeMarkedEntries(); // DivineMC - optimize block entity removals - Fix MC-117075 -@@ -1495,7 +1499,11 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl +@@ -1496,7 +1500,11 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl entity.discard(org.bukkit.event.entity.EntityRemoveEvent.Cause.DISCARD); // Paper end - Prevent block entity and entity crashes } @@ -1006,7 +1006,7 @@ index 79627c421088d439745164d7652a0cc1d93ced30..1f00b7ddf6c470c8a32e418775fa40e9 } // Paper start - Option to prevent armor stands from doing entity lookups -@@ -1637,6 +1645,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl +@@ -1638,6 +1646,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl @Nullable @Override public BlockEntity getBlockEntity(BlockPos pos) { @@ -1014,7 +1014,7 @@ index 79627c421088d439745164d7652a0cc1d93ced30..1f00b7ddf6c470c8a32e418775fa40e9 // Paper start - Perf: Optimize capturedTileEntities lookup net.minecraft.world.level.block.entity.BlockEntity blockEntity; if (!this.capturedTileEntities.isEmpty() && (blockEntity = this.capturedTileEntities.get(pos)) != null) { -@@ -1653,6 +1662,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl +@@ -1654,6 +1663,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl } public void setBlockEntity(BlockEntity blockEntity) { @@ -1022,7 +1022,7 @@ index 79627c421088d439745164d7652a0cc1d93ced30..1f00b7ddf6c470c8a32e418775fa40e9 BlockPos blockPos = blockEntity.getBlockPos(); if (!this.isOutsideBuildHeight(blockPos)) { // CraftBukkit start -@@ -1738,6 +1748,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl +@@ -1739,6 +1749,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl @Override public List getEntities(@Nullable Entity entity, AABB boundingBox, Predicate predicate) { @@ -1030,7 +1030,7 @@ index 79627c421088d439745164d7652a0cc1d93ced30..1f00b7ddf6c470c8a32e418775fa40e9 List list = Lists.newArrayList(); // Paper start - rewrite chunk system -@@ -2087,8 +2098,15 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl +@@ -2088,8 +2099,15 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl public abstract RecipeAccess recipeAccess(); public BlockPos getBlockRandomPos(int x, int y, int z, int yMask) { @@ -1065,7 +1065,7 @@ index 9711efb088bd0da9168e9bcd0496bd7caddd2974..ea310d53f728aaf5de3284b372ed393e return value; }) diff --git a/net/minecraft/world/level/block/MushroomBlock.java b/net/minecraft/world/level/block/MushroomBlock.java -index d306f5f524dc64618df94c9783c2168dc561a5e3..6a0c4dc2ff5e3d82e811db63dc9da7b93e6f2cc9 100644 +index 9176cf8c47b19d76eb49a7c00fc6723836344d4b..05d173cb97b9c40d24b4c8485d509592a9afa9ad 100644 --- a/net/minecraft/world/level/block/MushroomBlock.java +++ b/net/minecraft/world/level/block/MushroomBlock.java @@ -93,7 +93,7 @@ public class MushroomBlock extends VegetationBlock implements BonemealableBlock @@ -1078,7 +1078,7 @@ index d306f5f524dc64618df94c9783c2168dc561a5e3..6a0c4dc2ff5e3d82e811db63dc9da7b9 return true; } else { diff --git a/net/minecraft/world/level/block/RedStoneWireBlock.java b/net/minecraft/world/level/block/RedStoneWireBlock.java -index eff16b8931cba66a7159a313abb2b98cb292a77d..846cf81e9446214510ec99f2809976612049255e 100644 +index a07d9237d227fe6d419d8a9bc44fc623b244ad3e..9f21d0a93a712538a15761c5834210856458bc78 100644 --- a/net/minecraft/world/level/block/RedStoneWireBlock.java +++ b/net/minecraft/world/level/block/RedStoneWireBlock.java @@ -66,6 +66,7 @@ public class RedStoneWireBlock extends Block { @@ -1185,7 +1185,7 @@ index eff16b8931cba66a7159a313abb2b98cb292a77d..846cf81e9446214510ec99f280997661 public static int getColorForPower(int power) { diff --git a/net/minecraft/world/level/block/SaplingBlock.java b/net/minecraft/world/level/block/SaplingBlock.java -index a5e4959c1b5133cfaeb9259d7e59b38a06453785..f63098847017f65ff24057e29c8b5a8d24a9d795 100644 +index 23e9e5e7ef76fe3d6e1bbc41faf69ee65ca77d80..9d52904766fd48902b85bdc34ffafcd874c77ad0 100644 --- a/net/minecraft/world/level/block/SaplingBlock.java +++ b/net/minecraft/world/level/block/SaplingBlock.java @@ -26,6 +26,26 @@ public class SaplingBlock extends VegetationBlock implements BonemealableBlock { @@ -1254,10 +1254,10 @@ index 1b2f8c4e1e362dc63fde2c7139039f0ce7eb762f..7c2acea8af6a3110d782b9b3afeac091 final org.bukkit.block.Block block = org.bukkit.craftbukkit.block.CraftBlock.at(blockEntity.getLevel(), blockEntity.getBlockPos()); net.kyori.adventure.text.Component lockedMessage = net.kyori.adventure.text.Component.translatable("container.isLocked", io.papermc.paper.adventure.PaperAdventure.asAdventure(displayName)); diff --git a/net/minecraft/world/level/block/entity/SculkCatalystBlockEntity.java b/net/minecraft/world/level/block/entity/SculkCatalystBlockEntity.java -index 0a94670dc20bb9c521b0395633eb100393895f6a..4ad9c47862a9791f72a18835a343bf0e962c14c8 100644 +index ab7be4298be22af32c4726f178b93896b96f599d..d78dc310002ebb4149b60a35bf514f1fd49f95c9 100644 --- a/net/minecraft/world/level/block/entity/SculkCatalystBlockEntity.java +++ b/net/minecraft/world/level/block/entity/SculkCatalystBlockEntity.java -@@ -43,9 +43,7 @@ public class SculkCatalystBlockEntity extends BlockEntity implements GameEventLi +@@ -44,9 +44,7 @@ public class SculkCatalystBlockEntity extends BlockEntity implements GameEventLi // Paper end - Fix NPE in SculkBloomEvent world access public static void serverTick(Level level, BlockPos pos, BlockState state, SculkCatalystBlockEntity sculkCatalyst) { @@ -1268,7 +1268,7 @@ index 0a94670dc20bb9c521b0395633eb100393895f6a..4ad9c47862a9791f72a18835a343bf0e @Override diff --git a/net/minecraft/world/level/block/grower/TreeGrower.java b/net/minecraft/world/level/block/grower/TreeGrower.java -index d23f255de9208f42125fa358a9e8194c984fe4d3..92e9bc9ba577474ca1108b8d0615739502ca5e57 100644 +index 3efebec19a1b4fefd6071247c614693e44bc3eb4..e71eb14879afc59298c87714062f7c4ee5ad0a8a 100644 --- a/net/minecraft/world/level/block/grower/TreeGrower.java +++ b/net/minecraft/world/level/block/grower/TreeGrower.java @@ -203,55 +203,59 @@ public final class TreeGrower { @@ -1355,7 +1355,7 @@ index d23f255de9208f42125fa358a9e8194c984fe4d3..92e9bc9ba577474ca1108b8d06157395 // CraftBukkit end } diff --git a/net/minecraft/world/level/chunk/LevelChunk.java b/net/minecraft/world/level/chunk/LevelChunk.java -index 524f987ba5cbf3d9fa502b51419cb163e099597c..76ba642de5673b407e3a802db9de060bcffae9b0 100644 +index 529f8a3a4db2effaa91d5b95244717dc44d4c6f4..0e505ad2ce4c8b79df95f08ca948c9687e07fa4c 100644 --- a/net/minecraft/world/level/chunk/LevelChunk.java +++ b/net/minecraft/world/level/chunk/LevelChunk.java @@ -374,6 +374,7 @@ public class LevelChunk extends ChunkAccess implements DebugValueSource, ca.spot diff --git a/divinemc-server/minecraft-patches/features/0050-Catch-update-suppressors.patch b/divinemc-server/minecraft-patches/features/0050-Catch-update-suppressors.patch index 5e19a39..6ef3439 100644 --- a/divinemc-server/minecraft-patches/features/0050-Catch-update-suppressors.patch +++ b/divinemc-server/minecraft-patches/features/0050-Catch-update-suppressors.patch @@ -4,6 +4,19 @@ Date: Sun, 23 Feb 2025 01:14:54 +0300 Subject: [PATCH] Catch update suppressors +diff --git a/net/minecraft/network/Connection.java b/net/minecraft/network/Connection.java +index 35b6f8365f4568da7bc0f4e47c39cb3690292aaf..e28d859b457ca0e24bc6dc9d6cd4a97f12ae0671 100644 +--- a/net/minecraft/network/Connection.java ++++ b/net/minecraft/network/Connection.java +@@ -327,7 +327,7 @@ public class Connection extends SimpleChannelInboundHandler> { + + private static void syncAfterConfigurationChange(ChannelFuture future) { + try { +- future.syncUninterruptibly(); ++ future.awaitUninterruptibly(5000L); // DivineMC - In rare cases this can get stuck, so we time out instead in worst case 5s of lag + } catch (Exception var2) { + if (var2 instanceof ClosedChannelException) { + LOGGER.info("Connection closed during protocol change"); diff --git a/net/minecraft/network/PacketProcessor.java b/net/minecraft/network/PacketProcessor.java index 3e4241976fdfe65bc0aae90a9097770745c0ddf1..98b101fde04fbf5507f021bb8d8e6bed334de5b6 100644 --- a/net/minecraft/network/PacketProcessor.java @@ -20,7 +33,7 @@ index 3e4241976fdfe65bc0aae90a9097770745c0ddf1..98b101fde04fbf5507f021bb8d8e6bed if (var3 instanceof ReportedException reportedException && reportedException.getCause() instanceof OutOfMemoryError) { throw PacketUtils.makeReportedException(var3, this.packet, this.listener); diff --git a/net/minecraft/server/MinecraftServer.java b/net/minecraft/server/MinecraftServer.java -index 6a714d59d01eafcd833f05208a948bf33b797392..f654664fb06556125cbd2a213c9fb89eabb329e7 100644 +index e3c7065cd4832e0c533f70d444c0a7beff53e423..d73546a9f086f67bafb3ce3a2a8ed5c227abc355 100644 --- a/net/minecraft/server/MinecraftServer.java +++ b/net/minecraft/server/MinecraftServer.java @@ -1744,6 +1744,10 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop tickingChunks = ((ca.spottedleaf.moonrise.patches.chunk_tick_iteration.ChunkTickServerLevel)this.level).moonrise$getPlayerTickingChunks(); + +- final LevelChunk[] raw = tickingChunks.getRawDataUnchecked(); ++ final LevelChunk[] raw = tickingChunks.toArray(new LevelChunk[0]); // DivineMC - Regionized Chunk Ticking - sync fix + final int size = tickingChunks.size(); + + Objects.checkFromToIndex(0, size, raw.length); +diff --git a/net/minecraft/server/level/ServerChunkCache.java b/net/minecraft/server/level/ServerChunkCache.java +index 6ea62fbffda38e477ef8e119608fc93793db95c3..74f63e549f8cadc80de26fcad11923151e0c40eb 100644 +--- a/net/minecraft/server/level/ServerChunkCache.java ++++ b/net/minecraft/server/level/ServerChunkCache.java +@@ -57,7 +57,7 @@ import org.slf4j.Logger; + public class ServerChunkCache extends ChunkSource implements ca.spottedleaf.moonrise.patches.chunk_system.world.ChunkSystemServerChunkCache { // Paper - rewrite chunk system + private static final Logger LOGGER = LogUtils.getLogger(); + private final DistanceManager distanceManager; +- private final ServerLevel level; ++ protected final ServerLevel level; // DivineMC - Regionized Chunk Ticking - private -> protected + public final Thread mainThread; + final ThreadedLevelLightEngine lightEngine; + public final ServerChunkCache.MainThreadExecutor mainThreadProcessor; +@@ -71,8 +71,10 @@ public class ServerChunkCache extends ChunkSource implements ca.spottedleaf.moon + private final long[] lastChunkPos = new long[4]; + private final ChunkStatus[] lastChunkStatus = new ChunkStatus[4]; + private final ChunkAccess[] lastChunk = new ChunkAccess[4]; +- private final List spawningChunks = new ObjectArrayList<>(); +- private final Set chunkHoldersToBroadcast = new ReferenceOpenHashSet<>(); ++ // DivineMC start - Regionized Chunk Ticking ++ private final ObjectArrayList spawningChunks = new ObjectArrayList<>(); ++ private final Set chunkHoldersToBroadcast = java.util.Collections.synchronizedSet(new ReferenceOpenHashSet<>()); ++ // DivineMC end - Regionized Chunk Ticking + @Nullable + @VisibleForDebug + private NaturalSpawner.SpawnState lastSpawnState; +@@ -156,34 +158,47 @@ public class ServerChunkCache extends ChunkSource implements ca.spottedleaf.moon + // Paper end - rewrite chunk system + // Paper start - chunk tick iteration optimisations + private final ca.spottedleaf.moonrise.common.util.SimpleThreadUnsafeRandom shuffleRandom = new ca.spottedleaf.moonrise.common.util.SimpleThreadUnsafeRandom(0L); +- private void iterateTickingChunksFaster() { ++ private void iterateTickingChunksFaster(final CompletableFuture spawns) { // DivineMC - Regionized Chunk Ticking + final ServerLevel world = this.level; + final int randomTickSpeed = world.getGameRules().getInt(GameRules.RULE_RANDOMTICKING); + + // TODO check on update: impl of forEachBlockTickingChunk will only iterate ENTITY ticking chunks! + // TODO check on update: consumer just runs tickChunk +- final ca.spottedleaf.moonrise.common.list.ReferenceList entityTickingChunks = ((ca.spottedleaf.moonrise.patches.chunk_system.level.ChunkSystemServerLevel)world).moonrise$getEntityTickingChunks(); ++ final ca.spottedleaf.moonrise.common.list.ReferenceList entityTickingChunks = ((ca.spottedleaf.moonrise.patches.chunk_system.level.ChunkSystemServerLevel)world).moonrise$getEntityTickingChunks(); // DivineMC - Regionized Chunk Ticking + + // note: we can use the backing array here because: + // 1. we do not care about new additions + // 2. _removes_ are impossible at this stage in the tick +- final LevelChunk[] raw = entityTickingChunks.getRawDataUnchecked(); ++ final LevelChunk[] raw = entityTickingChunks.toArray(new LevelChunk[0]); // DivineMC - use toArray instead of getRawDataUnchecked this way is safe and doesn't have performance impact + final int size = entityTickingChunks.size(); + +- java.util.Objects.checkFromToIndex(0, size, raw.length); +- for (int i = 0; i < size; ++i) { +- world.tickChunk(raw[i], randomTickSpeed); +- +- // call mid-tick tasks for chunk system +- if ((i & 7) == 0) { +- // DivineMC start - Parallel world ticking +- if (!org.bxteam.divinemc.config.DivineConfig.AsyncCategory.enableParallelWorldTicking) { +- ((ca.spottedleaf.moonrise.patches.chunk_system.server.ChunkSystemMinecraftServer) this.level.getServer()).moonrise$executeMidTickTasks(); +- continue; +- } ++ // DivineMC start - Regionized Chunk Ticking ++ if (org.bxteam.divinemc.config.DivineConfig.AsyncCategory.enableRegionizedChunkTicking) { ++ if (this instanceof org.bxteam.divinemc.async.rct.RegionizedChunkTicking rct) { ++ rct.execute(spawns, raw); ++ } ++ } else { ++ java.util.Objects.checkFromToIndex(0, size, raw.length); ++ for (int i = 0; i < size; ++i) { ++ world.tickChunk(raw[i], randomTickSpeed); ++ ++ // call mid-tick tasks for chunk system ++ if ((i & 7) == 0) { ++ // DivineMC start - Parallel world ticking ++ if (!org.bxteam.divinemc.config.DivineConfig.AsyncCategory.enableParallelWorldTicking) { ++ ((ca.spottedleaf.moonrise.patches.chunk_system.server.ChunkSystemMinecraftServer) this.level.getServer()).moonrise$executeMidTickTasks(); ++ continue; ++ } ++ // DivineMC end - Parallel world ticking ++ } + // DivineMC end - Parallel world ticking + } +- } ++ ++ if (org.bxteam.divinemc.config.DivineConfig.AsyncCategory.asyncNaturalSpawn) { ++ spawns.join(); ++ } ++ } ++ // DivineMC end - Regionized Chunk Ticking + } + // Paper end - chunk tick iteration optimisations + +@@ -502,14 +517,21 @@ public class ServerChunkCache extends ChunkSource implements ca.spottedleaf.moon + long gameTime = this.level.getGameTime(); + long l = gameTime - this.lastInhabitedUpdate; + this.lastInhabitedUpdate = gameTime; +- if (!this.level.isDebug()) { +- if (this.level.tickRateManager().runsNormally()) { +- this.tickChunks(l); +- } + ++ // DivineMC start - Regionized Chunk Ticking ++ if (this.level.isDebug()) { ++ return; ++ } ++ ++ if (!this.level.tickRateManager().runsNormally()) { // DivineMC - when frozen only broadcast changed chunks and don't run async mob spawning + this.broadcastChangedChunks(); ++ return; + } + ++ this.tickChunks(l); ++ this.broadcastChangedChunks(); ++ // DivineMC end - Regionized Chunk Ticking ++ + // DivineMC start - Pufferfish: Optimize mob spawning + if (org.bxteam.divinemc.config.DivineConfig.AsyncCategory.enableAsyncSpawning) { + for (ServerPlayer player : this.level.players) { +@@ -553,14 +575,18 @@ public class ServerChunkCache extends ChunkSource implements ca.spottedleaf.moon + } + + private void broadcastChangedChunks() { +- for (ChunkHolder chunkHolder : this.chunkHoldersToBroadcast) { +- LevelChunk tickingChunk = chunkHolder.getChunkToSend(); // Paper - rewrite chunk system +- if (tickingChunk != null) { +- chunkHolder.broadcastChanges(tickingChunk); ++ // DivineMC start - Regionized Chunk Ticking ++ synchronized (chunkHoldersToBroadcast) { ++ for (ChunkHolder chunkHolder : this.chunkHoldersToBroadcast) { ++ LevelChunk tickingChunk = chunkHolder.getChunkToSend(); // Paper - rewrite chunk system ++ if (tickingChunk != null) { ++ chunkHolder.broadcastChanges(tickingChunk); ++ } + } +- } + +- this.chunkHoldersToBroadcast.clear(); ++ this.chunkHoldersToBroadcast.clear(); ++ } ++ // DivineMC end - Regionized Chunk Ticking + } + + private void tickChunks(long timeInhabited) { +@@ -610,6 +636,24 @@ public class ServerChunkCache extends ChunkSource implements ca.spottedleaf.moon + filteredSpawningCategories = List.of(); + } + ++ // DivineMC start - Regionized Chunk Ticking ++ final CompletableFuture spawns; ++ if (org.bxteam.divinemc.config.DivineConfig.AsyncCategory.asyncNaturalSpawn) { ++ spawns = CompletableFuture.runAsync(() -> naturalSpawn(filteredSpawningCategories, timeInhabited), org.bxteam.divinemc.async.rct.RegionizedChunkTicking.REGION_EXECUTOR); ++ } else { ++ naturalSpawn(filteredSpawningCategories, timeInhabited); ++ spawns = new CompletableFuture<>(); ++ } ++ // DivineMC end - Regionized Chunk Ticking ++ ++ this.iterateTickingChunksFaster(spawns); // Paper - chunk tick iteration optimisations // DivineMC - Regionized Chunk Ticking ++ if (_boolean) { ++ this.level.tickCustomSpawners(this.spawnEnemies); ++ } ++ } ++ ++ // DivineMC start - Regionized Chunk Ticking ++ private void naturalSpawn(List filteredSpawningCategories, long timeInhabited) { + List list = this.spawningChunks; + + try { +@@ -627,12 +671,12 @@ public class ServerChunkCache extends ChunkSource implements ca.spottedleaf.moon + } finally { + list.clear(); + } ++ } + +- this.iterateTickingChunksFaster(); // Paper - chunk tick iteration optimisations +- if (_boolean) { +- this.level.tickCustomSpawners(this.spawnEnemies); +- } ++ protected net.minecraft.world.level.entity.EntityTickList getEntityTickList() { ++ return level.entityTickList; + } ++ // DivineMC end - Regionized Chunk Ticking + + private void tickSpawningChunk(LevelChunk chunk, long timeInhabited, List spawnCategories, NaturalSpawner.SpawnState spawnState) { + ChunkPos pos = chunk.getPos(); +diff --git a/net/minecraft/server/level/ServerLevel.java b/net/minecraft/server/level/ServerLevel.java +index ca9883277c0f036c94e861f7917ca42facd3c47b..8c98c2593eec14a8a378041e94cf52b8fbfedc30 100644 +--- a/net/minecraft/server/level/ServerLevel.java ++++ b/net/minecraft/server/level/ServerLevel.java +@@ -197,7 +197,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe + private final LevelTicks blockTicks = new LevelTicks<>(this::isPositionTickingWithEntitiesLoaded); + private final LevelTicks fluidTicks = new LevelTicks<>(this::isPositionTickingWithEntitiesLoaded); + private final PathTypeCache pathTypesByPosCache = new PathTypeCache(); +- final Set navigatingMobs = new ObjectOpenHashSet<>(); ++ final Set navigatingMobs = java.util.Collections.synchronizedSet(new ObjectOpenHashSet<>()); // DivineMC - Regionized Chunk Ticking + volatile boolean isUpdatingNavigations; + protected final Raids raids; + private final ObjectLinkedOpenHashSet blockEvents = new ObjectLinkedOpenHashSet<>(); +@@ -666,19 +666,37 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe + boolean flag = server.forceSynchronousWrites(); + DataFixer fixerUpper = server.getFixerUpper(); + // Paper - rewrite chunk system +- this.chunkSource = new ServerChunkCache( +- this, +- levelStorageAccess, +- fixerUpper, +- server.getStructureManager(), +- dispatcher, +- chunkGenerator, +- this.spigotConfig.viewDistance, // Spigot +- this.spigotConfig.simulationDistance, // Spigot +- flag, +- null, // Paper - rewrite chunk system +- () -> server.overworld().getDataStorage() +- ); ++ // DivineMC start - Regionized Chunk Ticking ++ if (org.bxteam.divinemc.config.DivineConfig.AsyncCategory.enableRegionizedChunkTicking) { ++ this.chunkSource = new org.bxteam.divinemc.async.rct.RegionizedChunkTicking( ++ this, ++ levelStorageAccess, ++ fixerUpper, ++ server.getStructureManager(), ++ dispatcher, ++ chunkGenerator, ++ this.spigotConfig.viewDistance, // Spigot ++ this.spigotConfig.simulationDistance, // Spigot ++ flag, ++ null, // Paper - rewrite chunk system ++ () -> server.overworld().getDataStorage() ++ ); ++ } else { ++ this.chunkSource = new ServerChunkCache( ++ this, ++ levelStorageAccess, ++ fixerUpper, ++ server.getStructureManager(), ++ dispatcher, ++ chunkGenerator, ++ this.spigotConfig.viewDistance, // Spigot ++ this.spigotConfig.simulationDistance, // Spigot ++ flag, ++ null, // Paper - rewrite chunk system ++ () -> server.overworld().getDataStorage() ++ ); ++ } ++ // DivineMC end - Regionized Chunk Ticking + this.chunkSource.getGeneratorState().ensureStructuresGenerated(); + this.portalForcer = new PortalForcer(this); + this.updateSkyBrightness(); +@@ -846,6 +864,13 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe + this.dragonFight.tick(); + } + ++ // DivineMC start - Regionized Chunk Ticking ++ if (org.bxteam.divinemc.config.DivineConfig.AsyncCategory.enableRegionizedChunkTicking) { ++ this.tickBlockEntities(); ++ return; ++ } ++ // DivineMC end - Regionized Chunk Ticking ++ + io.papermc.paper.entity.activation.ActivationRange.activateEntities(this); // Paper - EAR + this.entityTickList + .forEach( +@@ -1874,22 +1899,16 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe + if (Shapes.joinIsNotEmpty(collisionShape, collisionShape1, BooleanOp.NOT_SAME)) { + List list = new ObjectArrayList<>(); + +- try { // Paper - catch CME see below why +- for (Mob mob : this.navigatingMobs) { +- PathNavigation navigation = mob.getNavigation(); +- if (navigation.shouldRecomputePath(pos)) { +- list.add(navigation); ++ // DivineMC start - Regionized Chunk Ticking ++ synchronized (this.navigatingMobs) { ++ for (Mob mob : this.navigatingMobs) { ++ PathNavigation navigation = mob.getNavigation(); ++ if (navigation.shouldRecomputePath(pos)) { ++ list.add(navigation); ++ } + } + } +- // Paper start - catch CME see below why +- } catch (final java.util.ConcurrentModificationException concurrentModificationException) { +- // 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 +- // As this is a relative edge case it is much faster than copying navigators (on either read or write) +- this.sendBlockUpdated(pos, oldState, newState, flags); +- return; +- } +- // Paper end - catch CME see below why ++ // DivineMC end - Regionized Chunk Ticking + + try { + this.isUpdatingNavigations = true; +diff --git a/net/minecraft/world/level/Level.java b/net/minecraft/world/level/Level.java +index 7fe5cb2ea1c81b12baf302999a2794f20018707c..738cbde3595165e0f05c0a6fde21499e98dc850b 100644 +--- a/net/minecraft/world/level/Level.java ++++ b/net/minecraft/world/level/Level.java +@@ -113,7 +113,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl + .build(); + public final org.bxteam.divinemc.util.BlockEntityTickersList blockEntityTickers = new org.bxteam.divinemc.util.BlockEntityTickersList(); // DivineMC - optimize block entity removals - Fix MC-117075 + protected final CollectingNeighborUpdater neighborUpdater; +- private final List pendingBlockEntityTickers = Lists.newArrayList(); ++ private final List pendingBlockEntityTickers = java.util.Collections.synchronizedList(Lists.newArrayList()); // DivineMC - Regionized Chunk Ticking + private boolean tickingBlockEntities; + public final Thread thread; + private final boolean isDebug; +@@ -145,7 +145,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl + + public boolean captureBlockStates = false; + public boolean captureTreeGeneration = false; +- public Map capturedBlockStates = new java.util.LinkedHashMap<>(); // Paper ++ public Map capturedBlockStates = java.util.Collections.synchronizedMap(new java.util.LinkedHashMap<>()); // Paper // DivineMC - Regionized Chunk Ticking + public Map capturedTileEntities = new java.util.LinkedHashMap<>(); // Paper - Retain block place order when capturing blockstates + @Nullable + public List captureDrops; +@@ -1459,10 +1459,14 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl + + public void tickBlockEntities() { + this.tickingBlockEntities = true; +- if (!this.pendingBlockEntityTickers.isEmpty()) { +- this.blockEntityTickers.addAll(this.pendingBlockEntityTickers); +- this.pendingBlockEntityTickers.clear(); ++ // DivineMC start - Regionized Chunk Ticking - synchronization fix ++ synchronized (pendingBlockEntityTickers) { ++ if (!this.pendingBlockEntityTickers.isEmpty()) { ++ this.blockEntityTickers.addAll(this.pendingBlockEntityTickers); ++ this.pendingBlockEntityTickers.clear(); ++ } + } ++ // DivineMC end - Regionized Chunk Ticking - synchronization fix + + // Spigot start + boolean runsNormally = this.tickRateManager().runsNormally(); diff --git a/net/minecraft/world/level/block/ShulkerBoxBlock.java b/net/minecraft/world/level/block/ShulkerBoxBlock.java index e08083fbb6c3090c9a6f78dbbe487cbd4fec485a..d5d77110e7799223a66c2d6e47a1d9b4653f3ec4 100644 --- a/net/minecraft/world/level/block/ShulkerBoxBlock.java @@ -57,8 +414,30 @@ index e08083fbb6c3090c9a6f78dbbe487cbd4fec485a..d5d77110e7799223a66c2d6e47a1d9b4 } public static Block getBlockByColor(@Nullable DyeColor color) { +diff --git a/net/minecraft/world/level/redstone/CollectingNeighborUpdater.java b/net/minecraft/world/level/redstone/CollectingNeighborUpdater.java +index 5d17213a692016d2f005c7820bf2cf1f42ce411f..ccb2e0c28aeaebbeef15fbb650fa3c2e5c241ceb 100644 +--- a/net/minecraft/world/level/redstone/CollectingNeighborUpdater.java ++++ b/net/minecraft/world/level/redstone/CollectingNeighborUpdater.java +@@ -53,7 +53,7 @@ public class CollectingNeighborUpdater implements NeighborUpdater { + this.addAndRun(pos, new CollectingNeighborUpdater.MultiNeighborUpdate(pos.immutable(), block, orientation, facing)); + } + +- private void addAndRun(BlockPos pos, CollectingNeighborUpdater.NeighborUpdates updates) { ++ private synchronized void addAndRun(BlockPos pos, CollectingNeighborUpdater.NeighborUpdates updates) { // DivineMC - Regionized Chunk Ticking - synchronized + boolean flag = this.count > 0; + boolean flag1 = this.maxChainedNeighborUpdates >= 0 && this.count >= this.maxChainedNeighborUpdates; + this.count++; +@@ -72,7 +72,7 @@ public class CollectingNeighborUpdater implements NeighborUpdater { + } + } + +- private void runUpdates() { ++ private synchronized void runUpdates() { // DivineMC - Regionized Chunk Ticking - synchronized + try { + while (!this.stack.isEmpty() || !this.addedThisLayer.isEmpty()) { + for (int i = this.addedThisLayer.size() - 1; i >= 0; i--) { diff --git a/net/minecraft/world/level/redstone/NeighborUpdater.java b/net/minecraft/world/level/redstone/NeighborUpdater.java -index 3f4b17a222fdbf97ca8979a43f1f231d9e9d8ddb..1b7a1481d4d4167036185ddcbafe7c11a1b84a52 100644 +index f45cf0136e77ed5a903d033a7b0611e5edc23db9..e5b0cc92a2f9cdb89cd2436f6591531f8ae91d28 100644 --- a/net/minecraft/world/level/redstone/NeighborUpdater.java +++ b/net/minecraft/world/level/redstone/NeighborUpdater.java @@ -60,9 +60,19 @@ public interface NeighborUpdater { diff --git a/divinemc-server/minecraft-patches/features/0052-C2ME-Limit-NBT-cache.patch b/divinemc-server/minecraft-patches/features/0051-C2ME-Limit-NBT-cache.patch similarity index 100% rename from divinemc-server/minecraft-patches/features/0052-C2ME-Limit-NBT-cache.patch rename to divinemc-server/minecraft-patches/features/0051-C2ME-Limit-NBT-cache.patch diff --git a/divinemc-server/minecraft-patches/features/0051-Regionized-Chunk-Ticking.patch b/divinemc-server/minecraft-patches/features/0051-Regionized-Chunk-Ticking.patch deleted file mode 100644 index 21bc198..0000000 --- a/divinemc-server/minecraft-patches/features/0051-Regionized-Chunk-Ticking.patch +++ /dev/null @@ -1,386 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: NONPLAYT <76615486+NONPLAYT@users.noreply.github.com> -Date: Mon, 9 Jun 2025 13:51:43 +0300 -Subject: [PATCH] Regionized Chunk Ticking - -This patch adds regionized chunk ticking feature, by grouping adjacent chunks into regions and processing each region on its own thread. - -Original idea by Dueris, modified by NONPLAYT and heavily optimized by dan28000 - -diff --git a/net/minecraft/network/Connection.java b/net/minecraft/network/Connection.java -index 35b6f8365f4568da7bc0f4e47c39cb3690292aaf..e28d859b457ca0e24bc6dc9d6cd4a97f12ae0671 100644 ---- a/net/minecraft/network/Connection.java -+++ b/net/minecraft/network/Connection.java -@@ -327,7 +327,7 @@ public class Connection extends SimpleChannelInboundHandler> { - - private static void syncAfterConfigurationChange(ChannelFuture future) { - try { -- future.syncUninterruptibly(); -+ future.awaitUninterruptibly(5000L); // DivineMC - In rare cases this can get stuck, so we time out instead in worst case 5s of lag - } catch (Exception var2) { - if (var2 instanceof ClosedChannelException) { - LOGGER.info("Connection closed during protocol change"); -diff --git a/net/minecraft/server/level/ChunkMap.java b/net/minecraft/server/level/ChunkMap.java -index 04dd1bec1aff470e67a21fb0b25932685992ec82..72a0a80f1fffa43e143c80c689db5302f462114e 100644 ---- a/net/minecraft/server/level/ChunkMap.java -+++ b/net/minecraft/server/level/ChunkMap.java -@@ -737,7 +737,7 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider - // Paper start - optimise chunk tick iteration - final ca.spottedleaf.moonrise.common.list.ReferenceList tickingChunks = ((ca.spottedleaf.moonrise.patches.chunk_tick_iteration.ChunkTickServerLevel)this.level).moonrise$getPlayerTickingChunks(); - -- final LevelChunk[] raw = tickingChunks.getRawDataUnchecked(); -+ final LevelChunk[] raw = tickingChunks.toArray(new LevelChunk[0]); // DivineMC - Regionized Chunk Ticking - sync fix - final int size = tickingChunks.size(); - - Objects.checkFromToIndex(0, size, raw.length); -diff --git a/net/minecraft/server/level/ServerChunkCache.java b/net/minecraft/server/level/ServerChunkCache.java -index 6ea62fbffda38e477ef8e119608fc93793db95c3..dda53860397ee52f64209a8d08a7707cfa2f7592 100644 ---- a/net/minecraft/server/level/ServerChunkCache.java -+++ b/net/minecraft/server/level/ServerChunkCache.java -@@ -57,7 +57,7 @@ import org.slf4j.Logger; - public class ServerChunkCache extends ChunkSource implements ca.spottedleaf.moonrise.patches.chunk_system.world.ChunkSystemServerChunkCache { // Paper - rewrite chunk system - private static final Logger LOGGER = LogUtils.getLogger(); - private final DistanceManager distanceManager; -- private final ServerLevel level; -+ protected final ServerLevel level; // DivineMC - Regionized Chunk Ticking - private -> protected - public final Thread mainThread; - final ThreadedLevelLightEngine lightEngine; - public final ServerChunkCache.MainThreadExecutor mainThreadProcessor; -@@ -71,8 +71,10 @@ public class ServerChunkCache extends ChunkSource implements ca.spottedleaf.moon - private final long[] lastChunkPos = new long[4]; - private final ChunkStatus[] lastChunkStatus = new ChunkStatus[4]; - private final ChunkAccess[] lastChunk = new ChunkAccess[4]; -- private final List spawningChunks = new ObjectArrayList<>(); -- private final Set chunkHoldersToBroadcast = new ReferenceOpenHashSet<>(); -+ // DivineMC start - Regionized Chunk Ticking -+ private final ObjectArrayList spawningChunks = new ObjectArrayList<>(); -+ private final Set chunkHoldersToBroadcast = java.util.Collections.synchronizedSet(new ReferenceOpenHashSet<>()); -+ // DivineMC end - Regionized Chunk Ticking - @Nullable - @VisibleForDebug - private NaturalSpawner.SpawnState lastSpawnState; -@@ -156,34 +158,46 @@ public class ServerChunkCache extends ChunkSource implements ca.spottedleaf.moon - // Paper end - rewrite chunk system - // Paper start - chunk tick iteration optimisations - private final ca.spottedleaf.moonrise.common.util.SimpleThreadUnsafeRandom shuffleRandom = new ca.spottedleaf.moonrise.common.util.SimpleThreadUnsafeRandom(0L); -- private void iterateTickingChunksFaster() { -+ private void iterateTickingChunksFaster(final CompletableFuture spawns) { // DivineMC - Regionized Chunk Ticking - final ServerLevel world = this.level; - final int randomTickSpeed = world.getGameRules().getInt(GameRules.RULE_RANDOMTICKING); - - // TODO check on update: impl of forEachBlockTickingChunk will only iterate ENTITY ticking chunks! - // TODO check on update: consumer just runs tickChunk -- final ca.spottedleaf.moonrise.common.list.ReferenceList entityTickingChunks = ((ca.spottedleaf.moonrise.patches.chunk_system.level.ChunkSystemServerLevel)world).moonrise$getEntityTickingChunks(); -+ final ca.spottedleaf.moonrise.common.list.ReferenceList entityTickingChunks = ((ca.spottedleaf.moonrise.patches.chunk_system.level.ChunkSystemServerLevel)world).moonrise$getEntityTickingChunks(); // DivineMC - Regionized Chunk Ticking - - // note: we can use the backing array here because: - // 1. we do not care about new additions - // 2. _removes_ are impossible at this stage in the tick -- final LevelChunk[] raw = entityTickingChunks.getRawDataUnchecked(); -+ final LevelChunk[] raw = entityTickingChunks.toArray(new LevelChunk[0]); // DivineMC - use toArray instead of getRawDataUnchecked this way is safe and doesn't have performance impact - final int size = entityTickingChunks.size(); - -- java.util.Objects.checkFromToIndex(0, size, raw.length); -- for (int i = 0; i < size; ++i) { -- world.tickChunk(raw[i], randomTickSpeed); -- -- // call mid-tick tasks for chunk system -- if ((i & 7) == 0) { -- // DivineMC start - Parallel world ticking -- if (!org.bxteam.divinemc.config.DivineConfig.AsyncCategory.enableParallelWorldTicking) { -- ((ca.spottedleaf.moonrise.patches.chunk_system.server.ChunkSystemMinecraftServer) this.level.getServer()).moonrise$executeMidTickTasks(); -- continue; -+ // DivineMC start - Regionized Chunk Ticking -+ if (org.bxteam.divinemc.config.DivineConfig.AsyncCategory.enableRegionizedChunkTicking) { -+ if (this instanceof org.bxteam.divinemc.async.rct.RegionizedChunkTicking rct) { -+ rct.execute(spawns, raw); -+ } -+ } else { -+ java.util.Objects.checkFromToIndex(0, size, raw.length); -+ for (int i = 0; i < size; ++i) { -+ world.tickChunk(raw[i], randomTickSpeed); -+ -+ // call mid-tick tasks for chunk system -+ if ((i & 7) == 0) { -+ // DivineMC start - Parallel world ticking -+ if (!org.bxteam.divinemc.config.DivineConfig.AsyncCategory.enableParallelWorldTicking) { -+ ((ca.spottedleaf.moonrise.patches.chunk_system.server.ChunkSystemMinecraftServer) this.level.getServer()).moonrise$executeMidTickTasks(); -+ continue; -+ } -+ // DivineMC end - Parallel world ticking - } -- // DivineMC end - Parallel world ticking -+ } -+ -+ if (org.bxteam.divinemc.config.DivineConfig.AsyncCategory.asyncNaturalSpawn) { -+ spawns.join(); - } - } -+ // DivineMC end - Regionized Chunk Ticking - } - // Paper end - chunk tick iteration optimisations - -@@ -502,14 +516,21 @@ public class ServerChunkCache extends ChunkSource implements ca.spottedleaf.moon - long gameTime = this.level.getGameTime(); - long l = gameTime - this.lastInhabitedUpdate; - this.lastInhabitedUpdate = gameTime; -- if (!this.level.isDebug()) { -- if (this.level.tickRateManager().runsNormally()) { -- this.tickChunks(l); -- } - -+ // DivineMC start - Regionized Chunk Ticking -+ if (this.level.isDebug()) { -+ return; -+ } -+ -+ if (!this.level.tickRateManager().runsNormally()) { // DivineMC - when frozen only broadcast changed chunks and don't run async mob spawning - this.broadcastChangedChunks(); -+ return; - } - -+ this.tickChunks(l); -+ this.broadcastChangedChunks(); -+ // DivineMC end - Regionized Chunk Ticking -+ - // DivineMC start - Pufferfish: Optimize mob spawning - if (org.bxteam.divinemc.config.DivineConfig.AsyncCategory.enableAsyncSpawning) { - for (ServerPlayer player : this.level.players) { -@@ -553,14 +574,18 @@ public class ServerChunkCache extends ChunkSource implements ca.spottedleaf.moon - } - - private void broadcastChangedChunks() { -- for (ChunkHolder chunkHolder : this.chunkHoldersToBroadcast) { -- LevelChunk tickingChunk = chunkHolder.getChunkToSend(); // Paper - rewrite chunk system -- if (tickingChunk != null) { -- chunkHolder.broadcastChanges(tickingChunk); -+ // DivineMC start - Regionized Chunk Ticking -+ synchronized (chunkHoldersToBroadcast) { -+ for (ChunkHolder chunkHolder : this.chunkHoldersToBroadcast) { -+ LevelChunk tickingChunk = chunkHolder.getChunkToSend(); // Paper - rewrite chunk system -+ if (tickingChunk != null) { -+ chunkHolder.broadcastChanges(tickingChunk); -+ } - } -- } - -- this.chunkHoldersToBroadcast.clear(); -+ this.chunkHoldersToBroadcast.clear(); -+ } -+ // DivineMC end - Regionized Chunk Ticking - } - - private void tickChunks(long timeInhabited) { -@@ -610,6 +635,24 @@ public class ServerChunkCache extends ChunkSource implements ca.spottedleaf.moon - filteredSpawningCategories = List.of(); - } - -+ // DivineMC start - Regionized Chunk Ticking -+ final CompletableFuture spawns; -+ if (org.bxteam.divinemc.config.DivineConfig.AsyncCategory.asyncNaturalSpawn) { -+ spawns = CompletableFuture.runAsync(() -> naturalSpawn(filteredSpawningCategories, timeInhabited), org.bxteam.divinemc.async.rct.RegionizedChunkTicking.REGION_EXECUTOR); -+ } else { -+ naturalSpawn(filteredSpawningCategories, timeInhabited); -+ spawns = new CompletableFuture<>(); -+ } -+ // DivineMC end - Regionized Chunk Ticking -+ -+ this.iterateTickingChunksFaster(spawns); // Paper - chunk tick iteration optimisations // DivineMC - Regionized Chunk Ticking -+ if (_boolean) { -+ this.level.tickCustomSpawners(this.spawnEnemies); -+ } -+ } -+ -+ // DivineMC start - Regionized Chunk Ticking -+ private void naturalSpawn(List filteredSpawningCategories, long timeInhabited) { - List list = this.spawningChunks; - - try { -@@ -627,12 +670,12 @@ public class ServerChunkCache extends ChunkSource implements ca.spottedleaf.moon - } finally { - list.clear(); - } -+ } - -- this.iterateTickingChunksFaster(); // Paper - chunk tick iteration optimisations -- if (_boolean) { -- this.level.tickCustomSpawners(this.spawnEnemies); -- } -+ protected net.minecraft.world.level.entity.EntityTickList getEntityTickList() { -+ return level.entityTickList; - } -+ // DivineMC end - Regionized Chunk Ticking - - private void tickSpawningChunk(LevelChunk chunk, long timeInhabited, List spawnCategories, NaturalSpawner.SpawnState spawnState) { - ChunkPos pos = chunk.getPos(); -diff --git a/net/minecraft/server/level/ServerLevel.java b/net/minecraft/server/level/ServerLevel.java -index ca9883277c0f036c94e861f7917ca42facd3c47b..8c98c2593eec14a8a378041e94cf52b8fbfedc30 100644 ---- a/net/minecraft/server/level/ServerLevel.java -+++ b/net/minecraft/server/level/ServerLevel.java -@@ -197,7 +197,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe - private final LevelTicks blockTicks = new LevelTicks<>(this::isPositionTickingWithEntitiesLoaded); - private final LevelTicks fluidTicks = new LevelTicks<>(this::isPositionTickingWithEntitiesLoaded); - private final PathTypeCache pathTypesByPosCache = new PathTypeCache(); -- final Set navigatingMobs = new ObjectOpenHashSet<>(); -+ final Set navigatingMobs = java.util.Collections.synchronizedSet(new ObjectOpenHashSet<>()); // DivineMC - Regionized Chunk Ticking - volatile boolean isUpdatingNavigations; - protected final Raids raids; - private final ObjectLinkedOpenHashSet blockEvents = new ObjectLinkedOpenHashSet<>(); -@@ -666,19 +666,37 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe - boolean flag = server.forceSynchronousWrites(); - DataFixer fixerUpper = server.getFixerUpper(); - // Paper - rewrite chunk system -- this.chunkSource = new ServerChunkCache( -- this, -- levelStorageAccess, -- fixerUpper, -- server.getStructureManager(), -- dispatcher, -- chunkGenerator, -- this.spigotConfig.viewDistance, // Spigot -- this.spigotConfig.simulationDistance, // Spigot -- flag, -- null, // Paper - rewrite chunk system -- () -> server.overworld().getDataStorage() -- ); -+ // DivineMC start - Regionized Chunk Ticking -+ if (org.bxteam.divinemc.config.DivineConfig.AsyncCategory.enableRegionizedChunkTicking) { -+ this.chunkSource = new org.bxteam.divinemc.async.rct.RegionizedChunkTicking( -+ this, -+ levelStorageAccess, -+ fixerUpper, -+ server.getStructureManager(), -+ dispatcher, -+ chunkGenerator, -+ this.spigotConfig.viewDistance, // Spigot -+ this.spigotConfig.simulationDistance, // Spigot -+ flag, -+ null, // Paper - rewrite chunk system -+ () -> server.overworld().getDataStorage() -+ ); -+ } else { -+ this.chunkSource = new ServerChunkCache( -+ this, -+ levelStorageAccess, -+ fixerUpper, -+ server.getStructureManager(), -+ dispatcher, -+ chunkGenerator, -+ this.spigotConfig.viewDistance, // Spigot -+ this.spigotConfig.simulationDistance, // Spigot -+ flag, -+ null, // Paper - rewrite chunk system -+ () -> server.overworld().getDataStorage() -+ ); -+ } -+ // DivineMC end - Regionized Chunk Ticking - this.chunkSource.getGeneratorState().ensureStructuresGenerated(); - this.portalForcer = new PortalForcer(this); - this.updateSkyBrightness(); -@@ -846,6 +864,13 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe - this.dragonFight.tick(); - } - -+ // DivineMC start - Regionized Chunk Ticking -+ if (org.bxteam.divinemc.config.DivineConfig.AsyncCategory.enableRegionizedChunkTicking) { -+ this.tickBlockEntities(); -+ return; -+ } -+ // DivineMC end - Regionized Chunk Ticking -+ - io.papermc.paper.entity.activation.ActivationRange.activateEntities(this); // Paper - EAR - this.entityTickList - .forEach( -@@ -1874,22 +1899,16 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe - if (Shapes.joinIsNotEmpty(collisionShape, collisionShape1, BooleanOp.NOT_SAME)) { - List list = new ObjectArrayList<>(); - -- try { // Paper - catch CME see below why -- for (Mob mob : this.navigatingMobs) { -- PathNavigation navigation = mob.getNavigation(); -- if (navigation.shouldRecomputePath(pos)) { -- list.add(navigation); -+ // DivineMC start - Regionized Chunk Ticking -+ synchronized (this.navigatingMobs) { -+ for (Mob mob : this.navigatingMobs) { -+ PathNavigation navigation = mob.getNavigation(); -+ if (navigation.shouldRecomputePath(pos)) { -+ list.add(navigation); -+ } - } - } -- // Paper start - catch CME see below why -- } catch (final java.util.ConcurrentModificationException concurrentModificationException) { -- // 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 -- // As this is a relative edge case it is much faster than copying navigators (on either read or write) -- this.sendBlockUpdated(pos, oldState, newState, flags); -- return; -- } -- // Paper end - catch CME see below why -+ // DivineMC end - Regionized Chunk Ticking - - try { - this.isUpdatingNavigations = true; -diff --git a/net/minecraft/world/level/Level.java b/net/minecraft/world/level/Level.java -index 1f00b7ddf6c470c8a32e418775fa40e90ec88dbe..5e6306c5322d46c051aea02525d49ae9ed76b85f 100644 ---- a/net/minecraft/world/level/Level.java -+++ b/net/minecraft/world/level/Level.java -@@ -112,7 +112,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl - .build(); - public final org.bxteam.divinemc.util.BlockEntityTickersList blockEntityTickers = new org.bxteam.divinemc.util.BlockEntityTickersList(); // DivineMC - optimize block entity removals - Fix MC-117075 - protected final CollectingNeighborUpdater neighborUpdater; -- private final List pendingBlockEntityTickers = Lists.newArrayList(); -+ private final List pendingBlockEntityTickers = java.util.Collections.synchronizedList(Lists.newArrayList()); // DivineMC - Regionized Chunk Ticking - private boolean tickingBlockEntities; - public final Thread thread; - private final boolean isDebug; -@@ -144,7 +144,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl - - public boolean captureBlockStates = false; - public boolean captureTreeGeneration = false; -- public Map capturedBlockStates = new java.util.LinkedHashMap<>(); // Paper -+ public Map capturedBlockStates = java.util.Collections.synchronizedMap(new java.util.LinkedHashMap<>()); // Paper // DivineMC - Regionized Chunk Ticking - public Map capturedTileEntities = new java.util.LinkedHashMap<>(); // Paper - Retain block place order when capturing blockstates - @Nullable - public List captureDrops; -@@ -1458,10 +1458,14 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl - - public void tickBlockEntities() { - this.tickingBlockEntities = true; -- if (!this.pendingBlockEntityTickers.isEmpty()) { -- this.blockEntityTickers.addAll(this.pendingBlockEntityTickers); -- this.pendingBlockEntityTickers.clear(); -+ // DivineMC start - Regionized Chunk Ticking - synchronization fix -+ synchronized (pendingBlockEntityTickers) { -+ if (!this.pendingBlockEntityTickers.isEmpty()) { -+ this.blockEntityTickers.addAll(this.pendingBlockEntityTickers); -+ this.pendingBlockEntityTickers.clear(); -+ } - } -+ // DivineMC end - Regionized Chunk Ticking - synchronization fix - - // Spigot start - boolean runsNormally = this.tickRateManager().runsNormally(); -diff --git a/net/minecraft/world/level/redstone/CollectingNeighborUpdater.java b/net/minecraft/world/level/redstone/CollectingNeighborUpdater.java -index 5d17213a692016d2f005c7820bf2cf1f42ce411f..ccb2e0c28aeaebbeef15fbb650fa3c2e5c241ceb 100644 ---- a/net/minecraft/world/level/redstone/CollectingNeighborUpdater.java -+++ b/net/minecraft/world/level/redstone/CollectingNeighborUpdater.java -@@ -53,7 +53,7 @@ public class CollectingNeighborUpdater implements NeighborUpdater { - this.addAndRun(pos, new CollectingNeighborUpdater.MultiNeighborUpdate(pos.immutable(), block, orientation, facing)); - } - -- private void addAndRun(BlockPos pos, CollectingNeighborUpdater.NeighborUpdates updates) { -+ private synchronized void addAndRun(BlockPos pos, CollectingNeighborUpdater.NeighborUpdates updates) { // DivineMC - Regionized Chunk Ticking - synchronized - boolean flag = this.count > 0; - boolean flag1 = this.maxChainedNeighborUpdates >= 0 && this.count >= this.maxChainedNeighborUpdates; - this.count++; -@@ -72,7 +72,7 @@ public class CollectingNeighborUpdater implements NeighborUpdater { - } - } - -- private void runUpdates() { -+ private synchronized void runUpdates() { // DivineMC - Regionized Chunk Ticking - synchronized - try { - while (!this.stack.isEmpty() || !this.addedThisLayer.isEmpty()) { - for (int i = this.addedThisLayer.size() - 1; i >= 0; i--) { diff --git a/divinemc-server/minecraft-patches/features/0053-C2ME-Optimize-Aquifer-and-Beardifier.patch b/divinemc-server/minecraft-patches/features/0052-C2ME-Optimize-Aquifer-and-Beardifier.patch similarity index 100% rename from divinemc-server/minecraft-patches/features/0053-C2ME-Optimize-Aquifer-and-Beardifier.patch rename to divinemc-server/minecraft-patches/features/0052-C2ME-Optimize-Aquifer-and-Beardifier.patch diff --git a/divinemc-server/minecraft-patches/features/0054-Copper-Bulb-1gt-delay.patch b/divinemc-server/minecraft-patches/features/0053-Copper-Bulb-1gt-delay.patch similarity index 95% rename from divinemc-server/minecraft-patches/features/0054-Copper-Bulb-1gt-delay.patch rename to divinemc-server/minecraft-patches/features/0053-Copper-Bulb-1gt-delay.patch index 1644586..16af07b 100644 --- a/divinemc-server/minecraft-patches/features/0054-Copper-Bulb-1gt-delay.patch +++ b/divinemc-server/minecraft-patches/features/0053-Copper-Bulb-1gt-delay.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Copper Bulb 1gt delay diff --git a/net/minecraft/world/level/block/CopperBulbBlock.java b/net/minecraft/world/level/block/CopperBulbBlock.java -index 54511c27d8d85f1a9702d899f1f7c7dda201cdfa..1a9b785b1a0b06dcc9f4b9520303eab33e092db0 100644 +index 153af604a49d243bc64ffbbb4e11932f3dfdb373..d0803888a3b695f1b2e5a105d56c20146e54b10a 100644 --- a/net/minecraft/world/level/block/CopperBulbBlock.java +++ b/net/minecraft/world/level/block/CopperBulbBlock.java @@ -33,16 +33,36 @@ public class CopperBulbBlock extends Block { diff --git a/divinemc-server/minecraft-patches/features/0055-Crafter-1gt-delay.patch b/divinemc-server/minecraft-patches/features/0054-Crafter-1gt-delay.patch similarity index 92% rename from divinemc-server/minecraft-patches/features/0055-Crafter-1gt-delay.patch rename to divinemc-server/minecraft-patches/features/0054-Crafter-1gt-delay.patch index 8305174..8c60a6a 100644 --- a/divinemc-server/minecraft-patches/features/0055-Crafter-1gt-delay.patch +++ b/divinemc-server/minecraft-patches/features/0054-Crafter-1gt-delay.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Crafter 1gt delay diff --git a/net/minecraft/world/level/block/CrafterBlock.java b/net/minecraft/world/level/block/CrafterBlock.java -index 6dd3c0f60b04bc690ebd4a33ec57ef806961ee32..dad8035aff94854eadeb454ef60e6c90dbb31d1e 100644 +index a132883d85d515edb131049714915902444e4c3e..68e28ff810d6420dafc03cc43d7edbe5ee38d971 100644 --- a/net/minecraft/world/level/block/CrafterBlock.java +++ b/net/minecraft/world/level/block/CrafterBlock.java @@ -75,7 +75,7 @@ public class CrafterBlock extends BaseEntityBlock { @@ -14,7 +14,7 @@ index 6dd3c0f60b04bc690ebd4a33ec57ef806961ee32..dad8035aff94854eadeb454ef60e6c90 if (hasNeighborSignal && !triggeredValue) { - level.scheduleTick(pos, this, 4); + level.scheduleTick(pos, this, !org.bxteam.divinemc.config.DivineConfig.MiscCategory.copperBulb1gt ? 4 : 1); // DivineMC - Crafter 1gt delay - level.setBlock(pos, state.setValue(TRIGGERED, true), 2); + level.setBlock(pos, state.setValue(TRIGGERED, true), Block.UPDATE_CLIENTS); this.setBlockEntityTriggered(blockEntity, true); } else if (!hasNeighborSignal && triggeredValue) { @@ -125,7 +125,7 @@ public class CrafterBlock extends BaseEntityBlock { diff --git a/divinemc-server/minecraft-patches/features/0056-Raytrace-Entity-Tracker.patch b/divinemc-server/minecraft-patches/features/0055-Raytrace-Entity-Tracker.patch similarity index 94% rename from divinemc-server/minecraft-patches/features/0056-Raytrace-Entity-Tracker.patch rename to divinemc-server/minecraft-patches/features/0055-Raytrace-Entity-Tracker.patch index 0ab8a90..0dd121c 100644 --- a/divinemc-server/minecraft-patches/features/0056-Raytrace-Entity-Tracker.patch +++ b/divinemc-server/minecraft-patches/features/0055-Raytrace-Entity-Tracker.patch @@ -10,7 +10,7 @@ Original project: https://github.com/LogisticsCraft/OcclusionCulling Original license: MIT diff --git a/net/minecraft/world/entity/Entity.java b/net/minecraft/world/entity/Entity.java -index b3fb97a255bae7bdf0ed1aa0b8b2c376b39bdce7..3248a68175708fd7b10020113475844ae3fd2a8f 100644 +index 56483d9e770e29526a36d4c8c5565092acb227c7..9db43874a94770d49ea5ff48a46c4657e4819e98 100644 --- a/net/minecraft/world/entity/Entity.java +++ b/net/minecraft/world/entity/Entity.java @@ -147,7 +147,7 @@ import net.minecraft.world.waypoints.WaypointTransmitter; @@ -83,10 +83,10 @@ index 7d5940327c5e7a945165228d502f678a8234cd02..5a4a337694c36e6342c0b0ae5034ac2f private static EntityType register(ResourceKey> key, EntityType.Builder builder) { return Registry.register(BuiltInRegistries.ENTITY_TYPE, key, builder.build(key)); diff --git a/net/minecraft/world/entity/player/Player.java b/net/minecraft/world/entity/player/Player.java -index d5337d37be18d2ebb047e122b220e1a694f46696..bd41bbac179460d38edee624334cdcd0efb5504c 100644 +index 68942a2d15cfeddf1928a3ad270b1ce29685f8f0..149332116ff211c122b1dbf9b8010610174451db 100644 --- a/net/minecraft/world/entity/player/Player.java +++ b/net/minecraft/world/entity/player/Player.java -@@ -183,6 +183,25 @@ public abstract class Player extends Avatar implements ContainerUser { +@@ -184,6 +184,25 @@ public abstract class Player extends Avatar implements ContainerUser { public int burpDelay = 0; // Purpur - Burp delay public boolean canPortalInstant = false; // Purpur - Add portal permission bypass public int sixRowEnderchestSlotCount = -1; // Purpur - Barrels and enderchests 6 rows @@ -112,7 +112,7 @@ index d5337d37be18d2ebb047e122b220e1a694f46696..bd41bbac179460d38edee624334cdcd0 // CraftBukkit start public boolean fauxSleeping; -@@ -269,6 +288,25 @@ public abstract class Player extends Avatar implements ContainerUser { +@@ -270,6 +289,25 @@ public abstract class Player extends Avatar implements ContainerUser { @Override public void tick() { @@ -138,7 +138,7 @@ index d5337d37be18d2ebb047e122b220e1a694f46696..bd41bbac179460d38edee624334cdcd0 // Purpur start - Burp delay if (this.burpDelay > 0 && --this.burpDelay == 0) { this.level().playSound(null, getX(), getY(), getZ(), SoundEvents.PLAYER_BURP, SoundSource.PLAYERS, 1.0F, this.level().random.nextFloat() * 0.1F + 0.9F); -@@ -1314,6 +1352,7 @@ public abstract class Player extends Avatar implements ContainerUser { +@@ -1315,6 +1353,7 @@ public abstract class Player extends Avatar implements ContainerUser { if (this.hasContainerOpen()) { this.doCloseContainer(); } diff --git a/divinemc-server/minecraft-patches/features/0057-Leaves-Protocol-Core.patch b/divinemc-server/minecraft-patches/features/0056-Leaves-Protocol-Core.patch similarity index 95% rename from divinemc-server/minecraft-patches/features/0057-Leaves-Protocol-Core.patch rename to divinemc-server/minecraft-patches/features/0056-Leaves-Protocol-Core.patch index 209b5e5..57f4f39 100644 --- a/divinemc-server/minecraft-patches/features/0057-Leaves-Protocol-Core.patch +++ b/divinemc-server/minecraft-patches/features/0056-Leaves-Protocol-Core.patch @@ -35,7 +35,7 @@ index fb263fa1f30a7dfcb7ec2656abfb38e5fe88eac9..c3be4c2fd4a544967322a45d3b8c0fe7 }; } diff --git a/net/minecraft/server/MinecraftServer.java b/net/minecraft/server/MinecraftServer.java -index f654664fb06556125cbd2a213c9fb89eabb329e7..9c1798cca21a3f36f0347a0a4ac1fe9ababe60af 100644 +index d73546a9f086f67bafb3ce3a2a8ed5c227abc355..5feb76f4cd7274943f1b763c5eb7071c4bf2b809 100644 --- a/net/minecraft/server/MinecraftServer.java +++ b/net/minecraft/server/MinecraftServer.java @@ -1848,6 +1848,8 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop onlinePlayers = Lists.newArrayListWithExpectedSize(this.players.size() - 1); // Paper - Use single player info update packet on join for (int i = 0; i < this.players.size(); ++i) { -@@ -267,7 +268,7 @@ public abstract class PlayerList { +@@ -268,7 +269,7 @@ public abstract class PlayerList { // Paper start - Add Listing API for Player if (entityplayer1.getBukkitEntity().isListed(bukkitPlayer)) { // Paper end - Add Listing API for Player @@ -59,7 +59,7 @@ index dd592eae80b8869b9b40f04767a8ab8e10d4fe7e..df4b28f16e0cd2ddcf094b8bc60f13e7 // Paper start - Add Listing API for Player } else { entityplayer1.connection.send(ClientboundPlayerInfoUpdatePacket.createSinglePlayerInitializing(player, false)); -@@ -283,7 +284,10 @@ public abstract class PlayerList { +@@ -284,7 +285,10 @@ public abstract class PlayerList { } // Paper start - Use single player info update packet on join if (!onlinePlayers.isEmpty()) { @@ -71,7 +71,7 @@ index dd592eae80b8869b9b40f04767a8ab8e10d4fe7e..df4b28f16e0cd2ddcf094b8bc60f13e7 } // Paper end - Use single player info update packet on join player.sentListPacket = true; -@@ -1337,4 +1341,69 @@ public abstract class PlayerList { +@@ -1338,4 +1342,69 @@ public abstract class PlayerList { public boolean isAllowCommandsForAllPlayers() { return this.allowCommandsForAllPlayers; } diff --git a/divinemc-server/minecraft-patches/features/0064-Paper-PR-Fire-ServerListPingEvent-for-secondary-motd.patch b/divinemc-server/minecraft-patches/features/0063-Paper-PR-Fire-ServerListPingEvent-for-secondary-motd.patch similarity index 92% rename from divinemc-server/minecraft-patches/features/0064-Paper-PR-Fire-ServerListPingEvent-for-secondary-motd.patch rename to divinemc-server/minecraft-patches/features/0063-Paper-PR-Fire-ServerListPingEvent-for-secondary-motd.patch index 05bbaab..6039632 100644 --- a/divinemc-server/minecraft-patches/features/0064-Paper-PR-Fire-ServerListPingEvent-for-secondary-motd.patch +++ b/divinemc-server/minecraft-patches/features/0063-Paper-PR-Fire-ServerListPingEvent-for-secondary-motd.patch @@ -8,10 +8,10 @@ Original project: https://github.com/PaperMC/Paper Paper pull request: https://github.com/PaperMC/Paper/pull/8074 diff --git a/net/minecraft/server/players/PlayerList.java b/net/minecraft/server/players/PlayerList.java -index df4b28f16e0cd2ddcf094b8bc60f13e7707ab84b..a11f16112bbc064f5fa011574f7f495a04737374 100644 +index 551ba3a85f9bd3861512585939ab898d20e733a8..eb3f3a2d70de239b8324b35529987daf70202042 100644 --- a/net/minecraft/server/players/PlayerList.java +++ b/net/minecraft/server/players/PlayerList.java -@@ -209,10 +209,15 @@ public abstract class PlayerList { +@@ -210,10 +210,15 @@ public abstract class PlayerList { mutableComponent.withStyle(ChatFormatting.YELLOW); Component joinMessage = mutableComponent; // Paper - Adventure serverGamePacketListenerImpl.teleport(player.getX(), player.getY(), player.getZ(), player.getYRot(), player.getXRot()); diff --git a/divinemc-server/minecraft-patches/features/0065-Configurable-player-spawn-tracking-range.patch b/divinemc-server/minecraft-patches/features/0064-Configurable-player-spawn-tracking-range.patch similarity index 100% rename from divinemc-server/minecraft-patches/features/0065-Configurable-player-spawn-tracking-range.patch rename to divinemc-server/minecraft-patches/features/0064-Configurable-player-spawn-tracking-range.patch diff --git a/divinemc-server/minecraft-patches/features/0066-Optimize-collections.patch b/divinemc-server/minecraft-patches/features/0065-Optimize-collections.patch similarity index 95% rename from divinemc-server/minecraft-patches/features/0066-Optimize-collections.patch rename to divinemc-server/minecraft-patches/features/0065-Optimize-collections.patch index 922985a..3a4386c 100644 --- a/divinemc-server/minecraft-patches/features/0066-Optimize-collections.patch +++ b/divinemc-server/minecraft-patches/features/0065-Optimize-collections.patch @@ -54,10 +54,10 @@ index 71fafa5cf67cd1e460b0be14ecfe0c922b666704..993c03f1957b6905ed943ff34ec9c530 public int serverViewDistance; public final WorldGenContext worldGenContext; // Paper - public diff --git a/net/minecraft/world/level/Level.java b/net/minecraft/world/level/Level.java -index ebe34866e79397ac4c6a6bba97c99f5354adbe64..604b4670f59e0c3ed5c287e8a0c573560826ed78 100644 +index 738cbde3595165e0f05c0a6fde21499e98dc850b..4ec89234607f58ee32d0ea2ef056c8098e137041 100644 --- a/net/minecraft/world/level/Level.java +++ b/net/minecraft/world/level/Level.java -@@ -259,7 +259,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl +@@ -260,7 +260,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl @Override public final List getEntitiesOfClass(final Class entityClass, final AABB boundingBox, final Predicate predicate) { @@ -66,7 +66,7 @@ index ebe34866e79397ac4c6a6bba97c99f5354adbe64..604b4670f59e0c3ed5c287e8a0c57356 ((ca.spottedleaf.moonrise.patches.chunk_system.level.ChunkSystemLevel)this).moonrise$getEntityLookup().getEntities(entityClass, null, boundingBox, ret, predicate); -@@ -268,7 +268,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl +@@ -269,7 +269,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl @Override public final List moonrise$getHardCollidingEntities(final Entity entity, final AABB box, final Predicate predicate) { diff --git a/divinemc-server/minecraft-patches/features/0067-Optimize-level-ticking.patch b/divinemc-server/minecraft-patches/features/0066-Optimize-level-ticking.patch similarity index 99% rename from divinemc-server/minecraft-patches/features/0067-Optimize-level-ticking.patch rename to divinemc-server/minecraft-patches/features/0066-Optimize-level-ticking.patch index e8832dc..d68d9bc 100644 --- a/divinemc-server/minecraft-patches/features/0067-Optimize-level-ticking.patch +++ b/divinemc-server/minecraft-patches/features/0066-Optimize-level-ticking.patch @@ -73,7 +73,7 @@ index 4788686f0bd8ab67700bf3687560ff4a26a8e493..ba496e78740218a176d8e3117a21cbfc public void tickChunk(LevelChunk chunk, int randomTickSpeed) { diff --git a/net/minecraft/world/level/chunk/LevelChunk.java b/net/minecraft/world/level/chunk/LevelChunk.java -index 76ba642de5673b407e3a802db9de060bcffae9b0..29f4cce6823ad13bec607523f059166f97a48c22 100644 +index 0e505ad2ce4c8b79df95f08ca948c9687e07fa4c..9b8aa40984d87ab1078fe71b5ccc0ca04f67a55c 100644 --- a/net/minecraft/world/level/chunk/LevelChunk.java +++ b/net/minecraft/world/level/chunk/LevelChunk.java @@ -84,7 +84,7 @@ public class LevelChunk extends ChunkAccess implements DebugValueSource, ca.spot diff --git a/divinemc-server/minecraft-patches/features/0068-Optimize-Moonrise.patch b/divinemc-server/minecraft-patches/features/0067-Optimize-Moonrise.patch similarity index 99% rename from divinemc-server/minecraft-patches/features/0068-Optimize-Moonrise.patch rename to divinemc-server/minecraft-patches/features/0067-Optimize-Moonrise.patch index f154f23..306870c 100644 --- a/divinemc-server/minecraft-patches/features/0068-Optimize-Moonrise.patch +++ b/divinemc-server/minecraft-patches/features/0067-Optimize-Moonrise.patch @@ -452,10 +452,10 @@ index d03d075d5c56b7d2beb5f0aafecbb69f5b3bbf5b..ce3b8f4161dde3e2758c5d33445da150 } diff --git a/net/minecraft/server/level/ServerChunkCache.java b/net/minecraft/server/level/ServerChunkCache.java -index e8efa7b12746423de11b6970efe1651db2509511..a90086ae56118720cb49b674e031bc9d6f8dbd42 100644 +index 74f63e549f8cadc80de26fcad11923151e0c40eb..c549f0203fb278a37f1c3246a98bf3d6e3216afe 100644 --- a/net/minecraft/server/level/ServerChunkCache.java +++ b/net/minecraft/server/level/ServerChunkCache.java -@@ -461,8 +461,7 @@ public class ServerChunkCache extends ChunkSource implements ca.spottedleaf.moon +@@ -462,8 +462,7 @@ public class ServerChunkCache extends ChunkSource implements ca.spottedleaf.moon public boolean isPositionTicking(long chunkPos) { // Paper start - rewrite chunk system diff --git a/divinemc-server/minecraft-patches/features/0069-lithium-combined_heightmap_update.patch b/divinemc-server/minecraft-patches/features/0068-lithium-combined_heightmap_update.patch similarity index 96% rename from divinemc-server/minecraft-patches/features/0069-lithium-combined_heightmap_update.patch rename to divinemc-server/minecraft-patches/features/0068-lithium-combined_heightmap_update.patch index 4253d1b..902ced7 100644 --- a/divinemc-server/minecraft-patches/features/0069-lithium-combined_heightmap_update.patch +++ b/divinemc-server/minecraft-patches/features/0068-lithium-combined_heightmap_update.patch @@ -10,7 +10,7 @@ As part of: Lithium (https://github.com/CaffeineMC/lithium) Licensed under: LGPL-3.0 (https://www.gnu.org/licenses/lgpl-3.0.html) diff --git a/net/minecraft/world/level/chunk/LevelChunk.java b/net/minecraft/world/level/chunk/LevelChunk.java -index 29f4cce6823ad13bec607523f059166f97a48c22..60f3567ef70a82ad1704aec3135e6a72f5033e12 100644 +index 9b8aa40984d87ab1078fe71b5ccc0ca04f67a55c..acddfe7fdd4305ba832af62d607a06213b29469d 100644 --- a/net/minecraft/world/level/chunk/LevelChunk.java +++ b/net/minecraft/world/level/chunk/LevelChunk.java @@ -389,10 +389,13 @@ public class LevelChunk extends ChunkAccess implements DebugValueSource, ca.spot diff --git a/divinemc-server/minecraft-patches/features/0070-Entity-Status-Lock.patch b/divinemc-server/minecraft-patches/features/0069-Entity-Status-Lock.patch similarity index 100% rename from divinemc-server/minecraft-patches/features/0070-Entity-Status-Lock.patch rename to divinemc-server/minecraft-patches/features/0069-Entity-Status-Lock.patch diff --git a/divinemc-server/minecraft-patches/features/0071-lithium-sleeping_block_entity.patch b/divinemc-server/minecraft-patches/features/0070-lithium-sleeping_block_entity.patch similarity index 97% rename from divinemc-server/minecraft-patches/features/0071-lithium-sleeping_block_entity.patch rename to divinemc-server/minecraft-patches/features/0070-lithium-sleeping_block_entity.patch index c44fe37..990b26d 100644 --- a/divinemc-server/minecraft-patches/features/0071-lithium-sleeping_block_entity.patch +++ b/divinemc-server/minecraft-patches/features/0070-lithium-sleeping_block_entity.patch @@ -96,7 +96,7 @@ index 8e6f097b4d17aaaf8eccc16e11ce2bd01ad63322..ded99b157865f5bcfd64b3082c628a71 int getContainerSize(); diff --git a/net/minecraft/world/entity/Entity.java b/net/minecraft/world/entity/Entity.java -index d767cc3ca7e559640cfde7f1f765b87c3d9c16ea..b18ece927ca8b86539fb8ed5ca18ac3f5f3ea3a3 100644 +index 013261aff0b9ecfeb51f3baf597d7ee211a8a095..ef9c0258d3f9371ddfc9931dce2c2584139e6752 100644 --- a/net/minecraft/world/entity/Entity.java +++ b/net/minecraft/world/entity/Entity.java @@ -5099,6 +5099,18 @@ public abstract class Entity implements SyncedDataHolder, DebugValueSource, Name @@ -264,7 +264,7 @@ index 0f9bfcd1eab023c1772e9fafcda85d110904bd1c..a54dbf14af2abcf0307c1c43fb82cfd6 + // DivineMC end - lithium: sleeping_block_entity } diff --git a/net/minecraft/world/inventory/AbstractContainerMenu.java b/net/minecraft/world/inventory/AbstractContainerMenu.java -index 7d35e587508f24401a998de27f88ce9cef961b8a..343bfbb8b122b5c1d6fd8de736a8ad7ed5367cd6 100644 +index c3021c0a8c588acf5ae8c9231e75bda984863267..0f3f9efdce86c3fb50247245eb5a3e1c1a14a794 100644 --- a/net/minecraft/world/inventory/AbstractContainerMenu.java +++ b/net/minecraft/world/inventory/AbstractContainerMenu.java @@ -901,6 +901,12 @@ public abstract class AbstractContainerMenu { @@ -417,10 +417,10 @@ index 52a8a818a636e35b486b8aaf482cd68849a0bbcd..7706bf3cdd8017eb0591a4002489835b + // DivineMC end - lithium: sleeping_block_entity } diff --git a/net/minecraft/world/level/Level.java b/net/minecraft/world/level/Level.java -index b799bcd450da148a941289a23bd3758cc75245d2..2c06a6dd8d6164818777753f6572e1f07043abae 100644 +index 4ec89234607f58ee32d0ea2ef056c8098e137041..e05c873814b6212ea61a4914e8a34cb9ac17822b 100644 --- a/net/minecraft/world/level/Level.java +++ b/net/minecraft/world/level/Level.java -@@ -1476,7 +1476,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl +@@ -1477,7 +1477,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl // Spigot end if (tickingBlockEntity.isRemoved()) { this.blockEntityTickers.markAsRemoved(this.tileTickPosition); // DivineMC - optimize block entity removals - Fix MC-117075 @@ -429,7 +429,7 @@ index b799bcd450da148a941289a23bd3758cc75245d2..2c06a6dd8d6164818777753f6572e1f0 tickingBlockEntity.tick(); // DivineMC start - Parallel world ticking ++tickedEntities; -@@ -2196,4 +2196,25 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl +@@ -2197,4 +2197,25 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl return getWorld().getEnvironment() == org.bukkit.World.Environment.THE_END; } // Purpur end - Add allow water in end world option @@ -456,7 +456,7 @@ index b799bcd450da148a941289a23bd3758cc75245d2..2c06a6dd8d6164818777753f6572e1f0 + // DivineMC end - lithium: sleeping_block_entity } diff --git a/net/minecraft/world/level/block/ComposterBlock.java b/net/minecraft/world/level/block/ComposterBlock.java -index 8cc6f7fcf8da2498fab3a0e300da785c489a63cc..2c3dc9e0131071530eab9b7f0cabe4b8519cc294 100644 +index 90ef0ea828303ccfa568c6acb3975c48f628261a..da18bce7cb9e99d207476471b511643e7eb609b9 100644 --- a/net/minecraft/world/level/block/ComposterBlock.java +++ b/net/minecraft/world/level/block/ComposterBlock.java @@ -440,7 +440,7 @@ public class ComposterBlock extends Block implements WorldlyContainerHolder { @@ -480,7 +480,7 @@ index 8cc6f7fcf8da2498fab3a0e300da785c489a63cc..2c3dc9e0131071530eab9b7f0cabe4b8 @@ -508,12 +508,13 @@ public class ComposterBlock extends Block implements WorldlyContainerHolder { } // Paper end - Add CompostItemEvent and EntityCompostItemEvent - this.level.levelEvent(1500, this.pos, blockState != this.state ? 1 : 0); + this.level.levelEvent(LevelEvent.COMPOSTER_FILL, this.pos, blockState != this.state ? 1 : 0); + if (org.bxteam.divinemc.config.DivineConfig.PerformanceCategory.sleepingBlockEntity) this.changed = false; // DivineMC - lithium: sleeping_block_entity this.removeItemNoUpdate(0); } @@ -493,7 +493,7 @@ index 8cc6f7fcf8da2498fab3a0e300da785c489a63cc..2c3dc9e0131071530eab9b7f0cabe4b8 private final LevelAccessor level; private final BlockPos pos; diff --git a/net/minecraft/world/level/block/DiodeBlock.java b/net/minecraft/world/level/block/DiodeBlock.java -index a5b4b64b3feef04661c3dcd6eea29ffda7f0785c..c6511c1f40455b1c277542a4d71df453e7470e02 100644 +index 1158bdc1993a1c8f907070d6190c5a7d02d4bdb6..0fccdb394438bc35cdd38741a9c91bb022741c3d 100644 --- a/net/minecraft/world/level/block/DiodeBlock.java +++ b/net/minecraft/world/level/block/DiodeBlock.java @@ -173,6 +173,7 @@ public abstract class DiodeBlock extends HorizontalDirectionalBlock { @@ -505,7 +505,7 @@ index a5b4b64b3feef04661c3dcd6eea29ffda7f0785c..c6511c1f40455b1c277542a4d71df453 @Override diff --git a/net/minecraft/world/level/block/HopperBlock.java b/net/minecraft/world/level/block/HopperBlock.java -index 2a6d5790ac3bc4984937c5b6d70f8f49f2c59116..3903871081cc670d7c4532a1ebf3934ff5e0e621 100644 +index 3140269761935201882173e568004488147a4110..288215bb11c0b63db7c354d12995ac5756382404 100644 --- a/net/minecraft/world/level/block/HopperBlock.java +++ b/net/minecraft/world/level/block/HopperBlock.java @@ -38,7 +38,7 @@ import net.minecraft.world.phys.shapes.CollisionContext; @@ -568,10 +568,10 @@ index 2a6d5790ac3bc4984937c5b6d70f8f49f2c59116..3903871081cc670d7c4532a1ebf3934f + // DivineMC end - lithium: sleeping_block_entity } diff --git a/net/minecraft/world/level/block/entity/AbstractFurnaceBlockEntity.java b/net/minecraft/world/level/block/entity/AbstractFurnaceBlockEntity.java -index ab9200d1b402374e71a9c3b09baf8f5b504ac365..515c0ef0952601ef9e39144ef86c8a48a0f8d267 100644 +index 3dfd539f4453d9c47c99af36e7ba64400fc89a5c..9d6928f886b7fc164553144ff985e0e93d8635d1 100644 --- a/net/minecraft/world/level/block/entity/AbstractFurnaceBlockEntity.java +++ b/net/minecraft/world/level/block/entity/AbstractFurnaceBlockEntity.java -@@ -39,7 +39,7 @@ import net.minecraft.world.level.storage.ValueInput; +@@ -40,7 +40,7 @@ import net.minecraft.world.level.storage.ValueInput; import net.minecraft.world.level.storage.ValueOutput; import net.minecraft.world.phys.Vec3; @@ -580,7 +580,7 @@ index ab9200d1b402374e71a9c3b09baf8f5b504ac365..515c0ef0952601ef9e39144ef86c8a48 protected static final int SLOT_INPUT = 0; protected static final int SLOT_FUEL = 1; protected static final int SLOT_RESULT = 2; -@@ -164,6 +164,7 @@ public abstract class AbstractFurnaceBlockEntity extends BaseContainerBlockEntit +@@ -165,6 +165,7 @@ public abstract class AbstractFurnaceBlockEntity extends BaseContainerBlockEntit this.recipesUsed.clear(); this.recipesUsed.putAll(input.read("RecipesUsed", RECIPES_USED_CODEC).orElse(Map.of())); this.cookSpeedMultiplier = input.getDoubleOr("Paper.CookSpeedMultiplier", 1); // Paper - cook speed multiplier API @@ -588,7 +588,7 @@ index ab9200d1b402374e71a9c3b09baf8f5b504ac365..515c0ef0952601ef9e39144ef86c8a48 } @Override -@@ -285,6 +286,12 @@ public abstract class AbstractFurnaceBlockEntity extends BaseContainerBlockEntit +@@ -286,6 +287,12 @@ public abstract class AbstractFurnaceBlockEntity extends BaseContainerBlockEntit setChanged(level, pos, state); } @@ -601,7 +601,7 @@ index ab9200d1b402374e71a9c3b09baf8f5b504ac365..515c0ef0952601ef9e39144ef86c8a48 if (usedLavaFromUnderneath) furnace.items.set(1, ItemStack.EMPTY); // Purpur - Furnace uses lava from underneath } -@@ -544,4 +551,53 @@ public abstract class AbstractFurnaceBlockEntity extends BaseContainerBlockEntit +@@ -545,4 +552,53 @@ public abstract class AbstractFurnaceBlockEntity extends BaseContainerBlockEntit this.getRecipesToAwardAndPopExperience(serverLevel, Vec3.atCenterOf(pos)); } } @@ -656,10 +656,10 @@ index ab9200d1b402374e71a9c3b09baf8f5b504ac365..515c0ef0952601ef9e39144ef86c8a48 + // DivineMC end - lithium: sleeping_block_entity } diff --git a/net/minecraft/world/level/block/entity/BarrelBlockEntity.java b/net/minecraft/world/level/block/entity/BarrelBlockEntity.java -index a4a4150beab8f2fa409a2d1d495a56679aecbae3..30cedca5e54d2da058e733cc44cff766920b46ff 100644 +index 04f6b3c328377091734a111f5a219379e32b5640..cec2996063356d0b1ac52d479b0e2ce3c5fa5078 100644 --- a/net/minecraft/world/level/block/entity/BarrelBlockEntity.java +++ b/net/minecraft/world/level/block/entity/BarrelBlockEntity.java -@@ -22,7 +22,7 @@ import net.minecraft.world.level.block.state.BlockState; +@@ -23,7 +23,7 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.storage.ValueInput; import net.minecraft.world.level.storage.ValueOutput; @@ -668,7 +668,7 @@ index a4a4150beab8f2fa409a2d1d495a56679aecbae3..30cedca5e54d2da058e733cc44cff766 // CraftBukkit start - add fields and methods public java.util.List transaction = new java.util.ArrayList<>(); private int maxStack = MAX_STACK; -@@ -139,6 +139,7 @@ public class BarrelBlockEntity extends RandomizableContainerBlockEntity { +@@ -140,6 +140,7 @@ public class BarrelBlockEntity extends RandomizableContainerBlockEntity { @Override protected void setItems(NonNullList items) { this.items = items; @@ -676,7 +676,7 @@ index a4a4150beab8f2fa409a2d1d495a56679aecbae3..30cedca5e54d2da058e733cc44cff766 } @Override -@@ -197,4 +198,16 @@ public class BarrelBlockEntity extends RandomizableContainerBlockEntity { +@@ -198,4 +199,16 @@ public class BarrelBlockEntity extends RandomizableContainerBlockEntity { double d2 = this.worldPosition.getZ() + 0.5 + unitVec3i.getZ() / 2.0; this.level.playSound(null, d, d1, d2, sound, SoundSource.BLOCKS, 0.5F, this.level.random.nextFloat() * 0.1F + 0.9F); } @@ -894,10 +894,10 @@ index 9a9208d3716c2ed7fbcc5ea8518d4b7d3cb2296a..6a2f56e9925185813b84a70fdc870980 + // DivineMC end - lithium: sleeping_block_entity } diff --git a/net/minecraft/world/level/block/entity/BrewingStandBlockEntity.java b/net/minecraft/world/level/block/entity/BrewingStandBlockEntity.java -index 8b9606c4a89ccea494a7ea55099161c236d4b772..acc14f050147583f1bf82edf74ae1317a8ec9761 100644 +index 5b28e257982c911f4d8ffe286dc125b3f9b64ee4..960bbd0b2e4b17768e0c152ec1160cfb17dd8065 100644 --- a/net/minecraft/world/level/block/entity/BrewingStandBlockEntity.java +++ b/net/minecraft/world/level/block/entity/BrewingStandBlockEntity.java -@@ -24,7 +24,7 @@ import net.minecraft.world.level.block.state.BlockState; +@@ -26,7 +26,7 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.storage.ValueInput; import net.minecraft.world.level.storage.ValueOutput; @@ -906,7 +906,7 @@ index 8b9606c4a89ccea494a7ea55099161c236d4b772..acc14f050147583f1bf82edf74ae1317 private static final int INGREDIENT_SLOT = 3; private static final int FUEL_SLOT = 4; private static final int[] SLOTS_FOR_UP = new int[]{3}; -@@ -136,6 +136,7 @@ public class BrewingStandBlockEntity extends BaseContainerBlockEntity implements +@@ -138,6 +138,7 @@ public class BrewingStandBlockEntity extends BaseContainerBlockEntity implements } public static void serverTick(Level level, BlockPos pos, BlockState state, BrewingStandBlockEntity blockEntity) { @@ -914,7 +914,7 @@ index 8b9606c4a89ccea494a7ea55099161c236d4b772..acc14f050147583f1bf82edf74ae1317 ItemStack itemStack = blockEntity.items.get(4); if (blockEntity.fuel <= 0 && itemStack.is(ItemTags.BREWING_FUEL)) { // CraftBukkit start -@@ -153,6 +154,7 @@ public class BrewingStandBlockEntity extends BaseContainerBlockEntity implements +@@ -155,6 +156,7 @@ public class BrewingStandBlockEntity extends BaseContainerBlockEntity implements itemStack.shrink(1); } // CraftBukkit end @@ -922,7 +922,7 @@ index 8b9606c4a89ccea494a7ea55099161c236d4b772..acc14f050147583f1bf82edf74ae1317 setChanged(level, pos, state); } -@@ -167,7 +169,7 @@ public class BrewingStandBlockEntity extends BaseContainerBlockEntity implements +@@ -169,7 +171,7 @@ public class BrewingStandBlockEntity extends BaseContainerBlockEntity implements } else if (!isBrewable || !itemStack1.is(blockEntity.ingredient)) { blockEntity.brewTime = 0; } @@ -931,7 +931,7 @@ index 8b9606c4a89ccea494a7ea55099161c236d4b772..acc14f050147583f1bf82edf74ae1317 setChanged(level, pos, state); } else if (isBrewable && blockEntity.fuel > 0) { blockEntity.fuel--; -@@ -180,6 +182,7 @@ public class BrewingStandBlockEntity extends BaseContainerBlockEntity implements +@@ -182,6 +184,7 @@ public class BrewingStandBlockEntity extends BaseContainerBlockEntity implements blockEntity.brewTime = event.getBrewingTime(); // 400 -> event.getTotalBrewTime() // Paper - use brewing time from event // CraftBukkit end blockEntity.ingredient = itemStack1.getItem(); @@ -939,7 +939,7 @@ index 8b9606c4a89ccea494a7ea55099161c236d4b772..acc14f050147583f1bf82edf74ae1317 setChanged(level, pos, state); } -@@ -286,6 +289,7 @@ public class BrewingStandBlockEntity extends BaseContainerBlockEntity implements +@@ -288,6 +291,7 @@ public class BrewingStandBlockEntity extends BaseContainerBlockEntity implements } this.fuel = input.getByteOr("Fuel", (byte)0); @@ -947,7 +947,7 @@ index 8b9606c4a89ccea494a7ea55099161c236d4b772..acc14f050147583f1bf82edf74ae1317 } @Override -@@ -332,4 +336,53 @@ public class BrewingStandBlockEntity extends BaseContainerBlockEntity implements +@@ -334,4 +338,53 @@ public class BrewingStandBlockEntity extends BaseContainerBlockEntity implements protected AbstractContainerMenu createMenu(int id, Inventory player) { return new BrewingStandMenu(id, player, this, this.dataAccess); } @@ -1002,10 +1002,10 @@ index 8b9606c4a89ccea494a7ea55099161c236d4b772..acc14f050147583f1bf82edf74ae1317 + // DivineMC end - lithium: sleeping_block_entity } diff --git a/net/minecraft/world/level/block/entity/CampfireBlockEntity.java b/net/minecraft/world/level/block/entity/CampfireBlockEntity.java -index fb7932e17d7d00ee3050e71c88510fa23befb1bb..d4f8dc6e37eea8da251e3dfb917607a79f6f08cf 100644 +index 78c4d1fc052d72f8599c82291d2233ec2e552137..306c5bf630b295d27e5b1885bd784bbfbc846812 100644 --- a/net/minecraft/world/level/block/entity/CampfireBlockEntity.java +++ b/net/minecraft/world/level/block/entity/CampfireBlockEntity.java -@@ -38,7 +38,7 @@ import net.minecraft.world.level.storage.ValueInput; +@@ -39,7 +39,7 @@ import net.minecraft.world.level.storage.ValueInput; import net.minecraft.world.level.storage.ValueOutput; import org.slf4j.Logger; @@ -1014,7 +1014,7 @@ index fb7932e17d7d00ee3050e71c88510fa23befb1bb..d4f8dc6e37eea8da251e3dfb917607a7 private static final Logger LOGGER = LogUtils.getLogger(); private static final int BURN_COOL_SPEED = 2; private static final int NUM_SLOTS = 4; -@@ -112,7 +112,11 @@ public class CampfireBlockEntity extends BlockEntity implements Clearable { +@@ -113,7 +113,11 @@ public class CampfireBlockEntity extends BlockEntity implements Clearable { if (flag) { setChanged(level, pos, state); @@ -1026,7 +1026,7 @@ index fb7932e17d7d00ee3050e71c88510fa23befb1bb..d4f8dc6e37eea8da251e3dfb917607a7 } public static void cooldownTick(Level level, BlockPos pos, BlockState state, CampfireBlockEntity blockEntity) { -@@ -127,7 +131,11 @@ public class CampfireBlockEntity extends BlockEntity implements Clearable { +@@ -128,7 +132,11 @@ public class CampfireBlockEntity extends BlockEntity implements Clearable { if (flag) { setChanged(level, pos, state); @@ -1038,7 +1038,7 @@ index fb7932e17d7d00ee3050e71c88510fa23befb1bb..d4f8dc6e37eea8da251e3dfb917607a7 } public static void particleTick(Level level, BlockPos pos, BlockState state, CampfireBlockEntity blockEntity) { -@@ -183,6 +191,7 @@ public class CampfireBlockEntity extends BlockEntity implements Clearable { +@@ -184,6 +192,7 @@ public class CampfireBlockEntity extends BlockEntity implements Clearable { System.arraycopy(cookingState, 0, this.stopCooking, 0, Math.min(this.stopCooking.length, bytes.capacity())); }); // Paper end - Add more Campfire API @@ -1046,7 +1046,7 @@ index fb7932e17d7d00ee3050e71c88510fa23befb1bb..d4f8dc6e37eea8da251e3dfb917607a7 } @Override -@@ -237,6 +246,7 @@ public class CampfireBlockEntity extends BlockEntity implements Clearable { +@@ -238,6 +247,7 @@ public class CampfireBlockEntity extends BlockEntity implements Clearable { this.cookingTime[i] = event.getTotalCookTime(); // i -> event.getTotalCookTime() // CraftBukkit end this.cookingProgress[i] = 0; @@ -1054,7 +1054,7 @@ index fb7932e17d7d00ee3050e71c88510fa23befb1bb..d4f8dc6e37eea8da251e3dfb917607a7 this.items.set(i, stack.consumeAndReturn(1, entity)); level.gameEvent(GameEvent.BLOCK_CHANGE, this.getBlockPos(), GameEvent.Context.of(entity, this.getBlockState())); this.markUpdated(); -@@ -280,4 +290,30 @@ public class CampfireBlockEntity extends BlockEntity implements Clearable { +@@ -281,4 +291,30 @@ public class CampfireBlockEntity extends BlockEntity implements Clearable { public void removeComponentsFromTag(ValueOutput output) { output.discard("Items"); } @@ -1175,10 +1175,10 @@ index 6b1299c20573ca009f6bffce829a4a593f548fce..e36049d044d7adc7e587c1c825fba36c + // DivineMC end - lithium: sleeping_block_entity } diff --git a/net/minecraft/world/level/block/entity/ChiseledBookShelfBlockEntity.java b/net/minecraft/world/level/block/entity/ChiseledBookShelfBlockEntity.java -index 986d3fb65f3bbcb0357b9764ac4f338d64cb62c9..bfbf72f9f44b0239f92f188074016f6192641992 100644 +index 25cde0c41ef94f9fb602ed346baad7b4b0ae77f9..c2ee7d85356a7ba4dc53197d2bb0911ad971d82e 100644 --- a/net/minecraft/world/level/block/entity/ChiseledBookShelfBlockEntity.java +++ b/net/minecraft/world/level/block/entity/ChiseledBookShelfBlockEntity.java -@@ -21,7 +21,7 @@ import net.minecraft.world.level.storage.ValueInput; +@@ -22,7 +22,7 @@ import net.minecraft.world.level.storage.ValueInput; import net.minecraft.world.level.storage.ValueOutput; import org.slf4j.Logger; @@ -1187,7 +1187,7 @@ index 986d3fb65f3bbcb0357b9764ac4f338d64cb62c9..bfbf72f9f44b0239f92f188074016f61 public static final int MAX_BOOKS_IN_STORAGE = 6; private static final Logger LOGGER = LogUtils.getLogger(); private static final int DEFAULT_LAST_INTERACTED_SLOT = -1; -@@ -170,4 +170,11 @@ public class ChiseledBookShelfBlockEntity extends BlockEntity implements ListBac +@@ -171,4 +171,11 @@ public class ChiseledBookShelfBlockEntity extends BlockEntity implements ListBac public void removeComponentsFromTag(ValueOutput output) { output.discard("Items"); } @@ -1200,10 +1200,10 @@ index 986d3fb65f3bbcb0357b9764ac4f338d64cb62c9..bfbf72f9f44b0239f92f188074016f61 + // DivineMC end - lithium: sleeping_block_entity } diff --git a/net/minecraft/world/level/block/entity/CrafterBlockEntity.java b/net/minecraft/world/level/block/entity/CrafterBlockEntity.java -index 09f937e826b2a87d11a739e1398cc83a9f84e7e3..d36f925f675d485f8ad86d43b048e6911a918602 100644 +index ffb5f2a07afcd6a3df0442ba48faa1557184d27c..8db1c47dd2f5c2165efc88954c6bb53015e9a4cf 100644 --- a/net/minecraft/world/level/block/entity/CrafterBlockEntity.java +++ b/net/minecraft/world/level/block/entity/CrafterBlockEntity.java -@@ -22,7 +22,7 @@ import net.minecraft.world.level.block.state.BlockState; +@@ -23,7 +23,7 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.storage.ValueInput; import net.minecraft.world.level.storage.ValueOutput; @@ -1212,7 +1212,7 @@ index 09f937e826b2a87d11a739e1398cc83a9f84e7e3..d36f925f675d485f8ad86d43b048e691 public static final int CONTAINER_WIDTH = 3; public static final int CONTAINER_HEIGHT = 3; public static final int CONTAINER_SIZE = 9; -@@ -170,6 +170,7 @@ public class CrafterBlockEntity extends RandomizableContainerBlockEntity impleme +@@ -171,6 +171,7 @@ public class CrafterBlockEntity extends RandomizableContainerBlockEntity impleme } }); this.containerData.set(9, input.getIntOr("triggered", 0)); @@ -1220,8 +1220,8 @@ index 09f937e826b2a87d11a739e1398cc83a9f84e7e3..d36f925f675d485f8ad86d43b048e691 } @Override -@@ -279,10 +280,12 @@ public class CrafterBlockEntity extends RandomizableContainerBlockEntity impleme - level.setBlock(pos, state.setValue(CrafterBlock.CRAFTING, false), 3); +@@ -280,10 +281,12 @@ public class CrafterBlockEntity extends RandomizableContainerBlockEntity impleme + level.setBlock(pos, state.setValue(CrafterBlock.CRAFTING, false), Block.UPDATE_ALL); } } + if (org.bxteam.divinemc.config.DivineConfig.PerformanceCategory.sleepingBlockEntity && i < 0) crafter.checkSleep(); // DivineMC - lithium: sleeping_block_entity @@ -1233,7 +1233,7 @@ index 09f937e826b2a87d11a739e1398cc83a9f84e7e3..d36f925f675d485f8ad86d43b048e691 } public int getRedstoneSignal() { -@@ -301,4 +304,43 @@ public class CrafterBlockEntity extends RandomizableContainerBlockEntity impleme +@@ -302,4 +305,43 @@ public class CrafterBlockEntity extends RandomizableContainerBlockEntity impleme private boolean slotCanBeDisabled(int slot) { return slot > -1 && slot < 9 && this.items.get(slot).isEmpty(); } @@ -2260,7 +2260,7 @@ index daf4f28d04a1ad1e034c6d7dedba9e4e2272f2ea..3afb0ce74c5378ce909c1a1e6182aaae + } } diff --git a/net/minecraft/world/level/block/entity/ShulkerBoxBlockEntity.java b/net/minecraft/world/level/block/entity/ShulkerBoxBlockEntity.java -index d0880daad9d43e0b3a8d6010fcc114344df9e58a..94685824a6ab1373e9d888e8d02d464d769dd918 100644 +index 4d268864656ad67e6971b74534e25ac47d922cbd..a2af20103729392df0167a632672ae11caf05340 100644 --- a/net/minecraft/world/level/block/entity/ShulkerBoxBlockEntity.java +++ b/net/minecraft/world/level/block/entity/ShulkerBoxBlockEntity.java @@ -32,7 +32,7 @@ import net.minecraft.world.level.storage.ValueOutput; @@ -2337,7 +2337,7 @@ index d0880daad9d43e0b3a8d6010fcc114344df9e58a..94685824a6ab1373e9d888e8d02d464d + // DivineMC end - lithium: sleeping_block_entity } diff --git a/net/minecraft/world/level/block/state/BlockBehaviour.java b/net/minecraft/world/level/block/state/BlockBehaviour.java -index 611b29ccba29558d8cf54eccb2136a305bf989db..f7362eb5e7f42eac024dc3a89ecb6a46073fc834 100644 +index a6c99a119a923dd890169888ff4e9852f6e27855..754a4c463c3706512fc42fd3ad32841fc8320709 100644 --- a/net/minecraft/world/level/block/state/BlockBehaviour.java +++ b/net/minecraft/world/level/block/state/BlockBehaviour.java @@ -84,7 +84,7 @@ import net.minecraft.world.phys.shapes.CollisionContext; @@ -2358,10 +2358,10 @@ index 611b29ccba29558d8cf54eccb2136a305bf989db..f7362eb5e7f42eac024dc3a89ecb6a46 } diff --git a/net/minecraft/world/level/chunk/LevelChunk.java b/net/minecraft/world/level/chunk/LevelChunk.java -index 60f3567ef70a82ad1704aec3135e6a72f5033e12..3cd9d7cb9b9506874b7f7a242324ac122a5d1844 100644 +index acddfe7fdd4305ba832af62d607a06213b29469d..d0c6cbb27237dca9028ec66f95886bcbeaf05dc2 100644 --- a/net/minecraft/world/level/chunk/LevelChunk.java +++ b/net/minecraft/world/level/chunk/LevelChunk.java -@@ -931,12 +931,14 @@ public class LevelChunk extends ChunkAccess implements DebugValueSource, ca.spot +@@ -933,12 +933,14 @@ public class LevelChunk extends ChunkAccess implements DebugValueSource, ca.spot (pos, ticker1) -> { TickingBlockEntity tickingBlockEntity = this.createTicker(blockEntity, ticker); if (ticker1 != null) { diff --git a/divinemc-server/minecraft-patches/features/0072-lithium-equipment_tracking.patch b/divinemc-server/minecraft-patches/features/0071-lithium-equipment_tracking.patch similarity index 96% rename from divinemc-server/minecraft-patches/features/0072-lithium-equipment_tracking.patch rename to divinemc-server/minecraft-patches/features/0071-lithium-equipment_tracking.patch index 73e1c99..2be99ca 100644 --- a/divinemc-server/minecraft-patches/features/0072-lithium-equipment_tracking.patch +++ b/divinemc-server/minecraft-patches/features/0071-lithium-equipment_tracking.patch @@ -187,10 +187,10 @@ index 1e00a7bd89d885cabb4b9ca3c86fbd8cd93cebf5..4fb31f578c2a4a5dc137c38de8f64159 + // DivineMC end - lithium: equipment_tracking } diff --git a/net/minecraft/world/entity/LivingEntity.java b/net/minecraft/world/entity/LivingEntity.java -index ca392664826ca8ced5a1c2c8b2d22eb87c5bd139..c08fb102fb9d325cf7c41e32b32833e70474fecb 100644 +index 7ec1c2f39981b60343f152a5432b3677574ee46c..e3e64a0bf7b8b9e04114a2b0b363932517deea0f 100644 --- a/net/minecraft/world/entity/LivingEntity.java +++ b/net/minecraft/world/entity/LivingEntity.java -@@ -439,9 +439,17 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin +@@ -440,9 +440,17 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin this.getSleepingPos().ifPresent(this::setPosToBed); } @@ -210,7 +210,7 @@ index ca392664826ca8ced5a1c2c8b2d22eb87c5bd139..c08fb102fb9d325cf7c41e32b32833e7 super.baseTick(); if (this.isAlive() && this.level() instanceof ServerLevel serverLevel1) { -@@ -3451,6 +3459,7 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin +@@ -3454,6 +3462,7 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin public void detectEquipmentUpdates() { Map map = this.collectEquipmentChanges(); if (map != null) { @@ -218,7 +218,7 @@ index ca392664826ca8ced5a1c2c8b2d22eb87c5bd139..c08fb102fb9d325cf7c41e32b32833e7 this.handleHandSwap(map); if (!map.isEmpty()) { this.handleEquipmentChanges(map); -@@ -3460,6 +3469,14 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin +@@ -3463,6 +3472,14 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin @Nullable private Map collectEquipmentChanges() { @@ -234,10 +234,10 @@ index ca392664826ca8ced5a1c2c8b2d22eb87c5bd139..c08fb102fb9d325cf7c41e32b32833e7 // Paper start - EntityEquipmentChangedEvent record EquipmentChangeImpl(org.bukkit.inventory.ItemStack oldItem, org.bukkit.inventory.ItemStack newItem) implements io.papermc.paper.event.entity.EntityEquipmentChangedEvent.EquipmentChange { diff --git a/net/minecraft/world/entity/decoration/ArmorStand.java b/net/minecraft/world/entity/decoration/ArmorStand.java -index 03a350b91948b8309a74edb5e1f35d336316ff34..71f9dac6d592a41d80d7563d3f71884e26d3ece4 100644 +index 9a298e111b9142dd878ee03b442d1110a9e0897e..ff3a4d740631d9f353cf1812f124b68aac144f64 100644 --- a/net/minecraft/world/entity/decoration/ArmorStand.java +++ b/net/minecraft/world/entity/decoration/ArmorStand.java -@@ -528,8 +528,9 @@ public class ArmorStand extends LivingEntity { +@@ -529,8 +529,9 @@ public class ArmorStand extends LivingEntity { maxUpStep = level().purpurConfig.armorstandStepHeight; // Purpur - Add option to set armorstand step height if (!this.canTick) { if (this.noTickEquipmentDirty) { diff --git a/divinemc-server/minecraft-patches/features/0073-Configurable-Files-Locations.patch b/divinemc-server/minecraft-patches/features/0072-Configurable-Files-Locations.patch similarity index 91% rename from divinemc-server/minecraft-patches/features/0073-Configurable-Files-Locations.patch rename to divinemc-server/minecraft-patches/features/0072-Configurable-Files-Locations.patch index 8035611..084fd33 100644 --- a/divinemc-server/minecraft-patches/features/0073-Configurable-Files-Locations.patch +++ b/divinemc-server/minecraft-patches/features/0072-Configurable-Files-Locations.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Configurable Files Locations diff --git a/net/minecraft/server/players/PlayerList.java b/net/minecraft/server/players/PlayerList.java -index a11f16112bbc064f5fa011574f7f495a04737374..6284c770132d63b9569ca967ac14d367148177d6 100644 +index eb3f3a2d70de239b8324b35529987daf70202042..c5c24720058be1782ec71905ae04c8448fc902d7 100644 --- a/net/minecraft/server/players/PlayerList.java +++ b/net/minecraft/server/players/PlayerList.java -@@ -99,10 +99,12 @@ import net.minecraft.world.scores.Team; +@@ -100,10 +100,12 @@ import net.minecraft.world.scores.Team; import org.slf4j.Logger; public abstract class PlayerList { @@ -25,7 +25,7 @@ index a11f16112bbc064f5fa011574f7f495a04737374..6284c770132d63b9569ca967ac14d367 public static final Component CHAT_FILTERED_FULL = Component.translatable("chat.filtered_full"); public static final Component DUPLICATE_LOGIN_DISCONNECT_MESSAGE = Component.translatable("multiplayer.disconnect.duplicate_login"); private static final Logger LOGGER = LogUtils.getLogger(); -@@ -140,10 +142,17 @@ public abstract class PlayerList { +@@ -141,10 +143,17 @@ public abstract class PlayerList { this.server = server; this.registries = registries; this.playerIo = playerIo; diff --git a/divinemc-server/minecraft-patches/features/0074-Pufferfish-Cache-climbing-check-for-activation.patch b/divinemc-server/minecraft-patches/features/0073-Pufferfish-Cache-climbing-check-for-activation.patch similarity index 89% rename from divinemc-server/minecraft-patches/features/0074-Pufferfish-Cache-climbing-check-for-activation.patch rename to divinemc-server/minecraft-patches/features/0073-Pufferfish-Cache-climbing-check-for-activation.patch index cb0f1c1..5c3eb91 100644 --- a/divinemc-server/minecraft-patches/features/0074-Pufferfish-Cache-climbing-check-for-activation.patch +++ b/divinemc-server/minecraft-patches/features/0073-Pufferfish-Cache-climbing-check-for-activation.patch @@ -10,7 +10,7 @@ As part of: Pufferfish (https://github.com/pufferfish-gg/Pufferfish) Licensed under: GPL-3.0 (https://www.gnu.org/licenses/gpl-3.0.html) diff --git a/io/papermc/paper/entity/activation/ActivationRange.java b/io/papermc/paper/entity/activation/ActivationRange.java -index 226088405c019922085285ba5d04d7c131470c69..61bf86a1380060ff118c31b5070b28705a897529 100644 +index 5d9089d98ed0daa8ee680123e50c3ce9abd2bca6..04623779031daa2f0d8e9c149f0b40388cb2bd8b 100644 --- a/io/papermc/paper/entity/activation/ActivationRange.java +++ b/io/papermc/paper/entity/activation/ActivationRange.java @@ -238,7 +238,7 @@ public final class ActivationRange { @@ -23,10 +23,10 @@ index 226088405c019922085285ba5d04d7c131470c69..61bf86a1380060ff118c31b5070b2870 } if (entity instanceof final Mob mob && mob.getTarget() != null) { diff --git a/net/minecraft/world/entity/LivingEntity.java b/net/minecraft/world/entity/LivingEntity.java -index c08fb102fb9d325cf7c41e32b32833e70474fecb..3533a8fe46f255025db70242b214fcd51916a6d0 100644 +index e3e64a0bf7b8b9e04114a2b0b363932517deea0f..ad3e68127ba84bdc18f738dbf709099a50aa8216 100644 --- a/net/minecraft/world/entity/LivingEntity.java +++ b/net/minecraft/world/entity/LivingEntity.java -@@ -2243,6 +2243,20 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin +@@ -2244,6 +2244,20 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin return this.lastClimbablePos; } diff --git a/divinemc-server/minecraft-patches/features/0075-Pufferfish-Make-EntityCollisionContext-a-live-repres.patch b/divinemc-server/minecraft-patches/features/0074-Pufferfish-Make-EntityCollisionContext-a-live-repres.patch similarity index 100% rename from divinemc-server/minecraft-patches/features/0075-Pufferfish-Make-EntityCollisionContext-a-live-repres.patch rename to divinemc-server/minecraft-patches/features/0074-Pufferfish-Make-EntityCollisionContext-a-live-repres.patch diff --git a/divinemc-server/minecraft-patches/features/0076-Pufferfish-Better-checking-for-useless-move-packets.patch b/divinemc-server/minecraft-patches/features/0075-Pufferfish-Better-checking-for-useless-move-packets.patch similarity index 100% rename from divinemc-server/minecraft-patches/features/0076-Pufferfish-Better-checking-for-useless-move-packets.patch rename to divinemc-server/minecraft-patches/features/0075-Pufferfish-Better-checking-for-useless-move-packets.patch diff --git a/divinemc-server/minecraft-patches/sources/net/minecraft/server/level/ServerPlayer.java.patch b/divinemc-server/minecraft-patches/sources/net/minecraft/server/level/ServerPlayer.java.patch index 53181aa..532cd6a 100644 --- a/divinemc-server/minecraft-patches/sources/net/minecraft/server/level/ServerPlayer.java.patch +++ b/divinemc-server/minecraft-patches/sources/net/minecraft/server/level/ServerPlayer.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/server/level/ServerPlayer.java +++ b/net/minecraft/server/level/ServerPlayer.java -@@ -2344,6 +_,7 @@ +@@ -2345,6 +_,7 @@ this.connection.send(new ClientboundGameEventPacket(ClientboundGameEventPacket.CHANGE_GAME_MODE, gameMode.getId())); if (gameMode == GameType.SPECTATOR) { this.removeEntitiesOnShoulder(); diff --git a/divinemc-server/minecraft-patches/sources/net/minecraft/server/network/ServerGamePacketListenerImpl.java.patch b/divinemc-server/minecraft-patches/sources/net/minecraft/server/network/ServerGamePacketListenerImpl.java.patch index 6a82c62..9018599 100644 --- a/divinemc-server/minecraft-patches/sources/net/minecraft/server/network/ServerGamePacketListenerImpl.java.patch +++ b/divinemc-server/minecraft-patches/sources/net/minecraft/server/network/ServerGamePacketListenerImpl.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/server/network/ServerGamePacketListenerImpl.java +++ b/net/minecraft/server/network/ServerGamePacketListenerImpl.java -@@ -315,6 +_,7 @@ +@@ -316,6 +_,7 @@ private static final int MAX_SIGN_LINE_LENGTH = Integer.getInteger("Paper.maxSignLength", 80); // Paper - Limit client sign length private final io.papermc.paper.event.packet.ClientTickEndEvent tickEndEvent; // Paper - add client tick end event public final io.papermc.paper.connection.PaperPlayerGameConnection playerGameConnection; // Paper @@ -8,7 +8,7 @@ public ServerGamePacketListenerImpl(MinecraftServer server, Connection connection, ServerPlayer player, CommonListenerCookie cookie) { super(server, connection, cookie); -@@ -326,6 +_,7 @@ +@@ -327,6 +_,7 @@ this.chatMessageChain = new FutureChain(server.chatExecutor); // CraftBukkit - async chat this.tickEndEvent = new io.papermc.paper.event.packet.ClientTickEndEvent(player.getBukkitEntity()); // Paper - add client tick end event this.playerGameConnection = new io.papermc.paper.connection.PaperPlayerGameConnection(this); // Paper diff --git a/divinemc-server/minecraft-patches/sources/net/minecraft/server/players/PlayerList.java.patch b/divinemc-server/minecraft-patches/sources/net/minecraft/server/players/PlayerList.java.patch index cd8ad08..eb32fae 100644 --- a/divinemc-server/minecraft-patches/sources/net/minecraft/server/players/PlayerList.java.patch +++ b/divinemc-server/minecraft-patches/sources/net/minecraft/server/players/PlayerList.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/server/players/PlayerList.java +++ b/net/minecraft/server/players/PlayerList.java -@@ -1025,6 +_,7 @@ +@@ -1026,6 +_,7 @@ player.connection.send(new ClientboundSetChunkCacheRadiusPacket(level.spigotConfig.viewDistance)); player.connection.send(new ClientboundSetSimulationDistancePacket(level.spigotConfig.simulationDistance)); // Paper end diff --git a/divinemc-server/minecraft-patches/sources/net/minecraft/world/entity/LivingEntity.java.patch b/divinemc-server/minecraft-patches/sources/net/minecraft/world/entity/LivingEntity.java.patch index a076f43..0919d5b 100644 --- a/divinemc-server/minecraft-patches/sources/net/minecraft/world/entity/LivingEntity.java.patch +++ b/divinemc-server/minecraft-patches/sources/net/minecraft/world/entity/LivingEntity.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/LivingEntity.java +++ b/net/minecraft/world/entity/LivingEntity.java -@@ -756,6 +_,7 @@ +@@ -757,6 +_,7 @@ super.remove(reason, eventCause); // CraftBukkit this.brain.clearMemories(); @@ -8,7 +8,7 @@ } @Override -@@ -1431,7 +_,7 @@ +@@ -1432,7 +_,7 @@ player.setRealHealth(health); } @@ -17,7 +17,7 @@ return; } // CraftBukkit end -@@ -2799,6 +_,7 @@ +@@ -2802,6 +_,7 @@ } protected void updateSwingTime() { @@ -25,7 +25,7 @@ int currentSwingDuration = this.getCurrentSwingDuration(); if (this.swinging) { this.swingTime++; -@@ -3315,7 +_,13 @@ +@@ -3318,7 +_,13 @@ } protected float getFlyingSpeed() { @@ -40,11 +40,11 @@ } public float getSpeed() { -@@ -3764,6 +_,7 @@ +@@ -3767,6 +_,7 @@ protected void updateFallFlying() { this.checkFallDistanceAccumulation(); if (!this.level().isClientSide()) { + if (!this.isFallFlying() && this.fallFlyTicks == 0) return; // DivineMC - lithium: entity.fast_elytra_check if (!this.canGlide()) { if (this.getSharedFlag(7) != false && !CraftEventFactory.callToggleGlideEvent(this, false).isCancelled()) // CraftBukkit - this.setSharedFlag(7, false); + this.setSharedFlag(Entity.FLAG_FALL_FLYING, false); diff --git a/divinemc-server/minecraft-patches/sources/net/minecraft/world/entity/monster/ZombieVillager.java.patch b/divinemc-server/minecraft-patches/sources/net/minecraft/world/entity/monster/ZombieVillager.java.patch index 3ecd489..2724d0a 100644 --- a/divinemc-server/minecraft-patches/sources/net/minecraft/world/entity/monster/ZombieVillager.java.patch +++ b/divinemc-server/minecraft-patches/sources/net/minecraft/world/entity/monster/ZombieVillager.java.patch @@ -1,8 +1,8 @@ --- a/net/minecraft/world/entity/monster/ZombieVillager.java +++ b/net/minecraft/world/entity/monster/ZombieVillager.java -@@ -301,6 +_,12 @@ +@@ -303,6 +_,12 @@ if (!this.isSilent()) { - level.levelEvent(null, 1027, this.blockPosition(), 0); + level.levelEvent(null, LevelEvent.SOUND_ZOMBIE_CONVERTED, this.blockPosition(), 0); } + + // DivineMC start - Fix MC-200418 diff --git a/divinemc-server/minecraft-patches/sources/net/minecraft/world/entity/player/Player.java.patch b/divinemc-server/minecraft-patches/sources/net/minecraft/world/entity/player/Player.java.patch index 224a4ac..cd44647 100644 --- a/divinemc-server/minecraft-patches/sources/net/minecraft/world/entity/player/Player.java.patch +++ b/divinemc-server/minecraft-patches/sources/net/minecraft/world/entity/player/Player.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/player/Player.java +++ b/net/minecraft/world/entity/player/Player.java -@@ -1669,6 +_,7 @@ +@@ -1670,6 +_,7 @@ } public void causeFoodExhaustion(float exhaustion, org.bukkit.event.entity.EntityExhaustionEvent.ExhaustionReason reason) { diff --git a/divinemc-server/minecraft-patches/sources/net/minecraft/world/level/GameRules.java.patch b/divinemc-server/minecraft-patches/sources/net/minecraft/world/level/GameRules.java.patch index 686dbbe..7b9549e 100644 --- a/divinemc-server/minecraft-patches/sources/net/minecraft/world/level/GameRules.java.patch +++ b/divinemc-server/minecraft-patches/sources/net/minecraft/world/level/GameRules.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/level/GameRules.java +++ b/net/minecraft/world/level/GameRules.java -@@ -299,7 +_,7 @@ +@@ -300,7 +_,7 @@ } private GameRules(Map, GameRules.Value> rules, FeatureFlagSet enabledFeatures) { diff --git a/divinemc-server/minecraft-patches/sources/net/minecraft/world/level/Level.java.patch b/divinemc-server/minecraft-patches/sources/net/minecraft/world/level/Level.java.patch index a03204c..f7ffa12 100644 --- a/divinemc-server/minecraft-patches/sources/net/minecraft/world/level/Level.java.patch +++ b/divinemc-server/minecraft-patches/sources/net/minecraft/world/level/Level.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/level/Level.java +++ b/net/minecraft/world/level/Level.java -@@ -111,7 +_,7 @@ +@@ -112,7 +_,7 @@ .add(new ExplosionParticleInfo(ParticleTypes.POOF, 0.5F, 1.0F)) .add(new ExplosionParticleInfo(ParticleTypes.SMOKE, 1.0F, 1.0F)) .build(); @@ -9,7 +9,7 @@ protected final CollectingNeighborUpdater neighborUpdater; private final List pendingBlockEntityTickers = Lists.newArrayList(); private boolean tickingBlockEntities; -@@ -1452,13 +_,11 @@ +@@ -1453,13 +_,11 @@ boolean runsNormally = this.tickRateManager().runsNormally(); int tickedEntities = 0; // Paper - rewrite chunk system @@ -24,7 +24,7 @@ } else if (runsNormally && this.shouldTickBlocksAt(tickingBlockEntity.getPos())) { tickingBlockEntity.tick(); // Paper start - rewrite chunk system -@@ -1468,7 +_,7 @@ +@@ -1469,7 +_,7 @@ // Paper end - rewrite chunk system } } diff --git a/divinemc-server/minecraft-patches/sources/net/minecraft/world/level/block/TripWireHookBlock.java.patch b/divinemc-server/minecraft-patches/sources/net/minecraft/world/level/block/TripWireHookBlock.java.patch index 4e2c08c..d7d32cb 100644 --- a/divinemc-server/minecraft-patches/sources/net/minecraft/world/level/block/TripWireHookBlock.java.patch +++ b/divinemc-server/minecraft-patches/sources/net/minecraft/world/level/block/TripWireHookBlock.java.patch @@ -5,7 +5,7 @@ emitState(level, pos, flag2, flag3, flag, flag1); if (!attaching) { - if (io.papermc.paper.configuration.GlobalConfiguration.get().unsupportedSettings.skipTripwireHookPlacementValidation || level.getBlockState(pos).is(Blocks.TRIPWIRE_HOOK)) // Paper - Validate tripwire hook placement before update - level.setBlock(pos, blockState1.setValue(FACING, direction), 3); + level.setBlock(pos, blockState1.setValue(FACING, direction), Block.UPDATE_ALL); if (shouldNotifyNeighbours) { notifyNeighbors(block, level, pos, direction); @@ -200,10 +_,18 @@ diff --git a/divinemc-server/paper-patches/features/0001-Rebrand.patch b/divinemc-server/paper-patches/features/0001-Rebrand.patch index 6480785..1d0b375 100644 --- a/divinemc-server/paper-patches/features/0001-Rebrand.patch +++ b/divinemc-server/paper-patches/features/0001-Rebrand.patch @@ -279,326 +279,311 @@ diff --git a/src/main/resources/logo.png b/src/main/resources/logo.png index 518591dd83289e041a16e2c2e7d7e7640d4b2e1b..f54753531b3bf2e8b5377f342465e727c7da98f2 100644 GIT binary patch literal 6677 -zcmeAS@N?(olHy`uVBq!ia0y~yVAKI&4rT@h2EWC1?hFhJEa{HEjtmSN`?>!lvNA9* -zC?tCX`7$t6sWC7#v@kIIVqjosc)`F>YQVtoDuIE)Y6b&?c)^@qfi?^b46y+|A+8Jz -z4AzE*1{#{~F76Sb5mpvfPWDb-4o==4-paCa1{xY-Lc;2bN^+7?DspmG=2rST`W|i` -z=BDO)>Kgib`Z`)VdK#K$#%3zYDt1+tPBi3T(HkZ(U6;;l9^VC -zTSH@S`*j8ehN#pC&op0O1}z2#1`Y;RMj-}J=rS@eGB7YoF@S=Uk%581i%}ZR4r0`R -zs$pVaU=oJ1L8=(Qzyst71_lN&Eg$sVgn>cA)YHW=q~g}wyDyzqTL~~ccwP48O4Nnm -zH%YbsukT6qoMAe%CE%4&{gx>~pEwm~viy0!|Nf6&d13SC5moa0Jnryp{8CrbxPx)y -zmwhpncP2zs)vvS2JI}cC)^+dqm!}?kD=^{Jbnl*M5Y>G&S7qA0{n}hb3U}|#eLPJj -z%lrM~sVplOS!o^lTAf=}Pc+G&5nZ@ze|<$lcb&%c##O!Xdd64v!-cN;Kko|q -zTd7d^J$UD%kX!|=OD#VPW6ZQpxJoa#Z#(VxbVtVa=f?|{25xnF1d*Q{{9zVFI(}8GFZ@uogp}^Jh$6k5icQ0O_u$t^4QDNUcK -zb;MQshoG|0*Q+~(R+#ABDmfsLxN7~8(%EjRnHLkx3|B9=uiwWcKG!+4rE5;<#?2pA -z{=c)e_~OmVqbnHv*VNTZ*;k*9DY=&(xT;b8T2aNJ`TN84Y%;%nn-;psf66OOH`m|i -z`*RqVCjGhi<$;j#{NMU)Azx-)nckZ6P9WU+(a~E19bI|}Azw0j(}JhZ(CFJ=v!E$v -zhmCq-Ujvp;P&u_}o^`NVCqPW9Q<$A_f?EcL?F!cHFutP1g4epqZpNFTTEgdNj% -z@HUz{Cg&>1<@|FuX$nc&AXU=1+w8^M=~~tMDe5RqyFPu~yevtsJGM{;#Tb -z{Je8gU((FiOtr@ZLbr2gvYvhHwNBnLe98HUCT+K`E_#_xQNr6RjQH2C3@g7VX)$^B -zN-?cFObJu9@;>^k*rFEXy6eW|=&xa`CU%Fe+HutQW0A!~tplbzg{L@OE#BxQx?k^t -z&}@&T1-|c$mj!Lz`;bHI_L2GaDFpFiBZ_L9tS0^ugd7!N6$um~HJ&YcyPoe}@?XQ377r07#oBR`D9&d@29XU-~HFm1s -zWcc0Hek1(P(vLF7qt@oVl=La*4BRTHrESeSwQ;V9-p>!*K^Kh`{J!QK`V{k6{pCA_ -zRRZFxA22^o2-EwU!yDwN$30ba_2WbHm$6$dy0jzWvZ7H=#zU^~JV&kLsf#xyuMNxL -z-lDQa`P9yc&ma7ClA>xBG_4a@w&>(dfl#h%RdbK2_FdXAtwbn%PS?7lX3xK!@%#E| -zQtQ-1OZl=k`nAtI?Z$dtWTn9LMlI>nr$l9#Q~nwYPoH~g?b@K9wkCnT2R0Qf<)7)c -z^U{hVzL%t~dYN*b4!GJr`^%a~dDlIxH@#3>l6^3C!mGBtNupVsJfuknmo^QbKQ -z#%rBlZ6&$~Vs5osxlC={8dtm~N3V_HI!DmYO&86#PCfpfduwLNDxWoS9LcGLh8(-x -zCaltqUQ_fqX5+K@Zc}@&3I(o_xITG8-vQQY0i~FVmv=Xaz75|nZIhQNV|LHgQ-@5i -zurl_rtCr}!ovR@Fu1z(-_s}Y>zNLkYt9zP03UElOmYiW->9$Tqt3C93WQ6VYEYZhG -zZ^aoOD+=M8)^t^Dfu-w;qK#I1U8cRS -z=l7dvZO~f%AXV$Y(RI!%-g>V1wDDYwjQ0H3@?9pY8oNzpOI9^@Z!Pd}o*UqMFlsMX -zgqfb1&hLIVsjJNf6Hc%G8j;oiHH+h_$(rlojN0d}zLh*%$hPxQ$d>nqR^BoQWL&d- -z`=kij>#wu9rr)=Ysb<-c6EeYj8B@%|zOxCT`==hWD&D*A*3JuZb`#I+JdwJ*D8}mQ -z0nyjYe0QH(Ziw5yK1|QHadDyHOogd8Hl+Gqh$yc#E}1SF7R;0#-Lcx%u_?yqv0Imc -zsO>&;o3?jG2eW25MX2tGxw^W@uvc35P{;)D1-E`|?hTlFc-ARa{Z~rjmv?Zw&Nx-r -z8IsQwc3I@ut+1alTV|fxkvB>CTI@I9fNQa75x&OEVWo!aelS%n-5MOYX4y>6*G4fP -zS-0>`cWT`@E6r`q&z+CBGu|uoawVCbJrnV{=&1OGx^%6p9al}n51e`?WF+)osJZT+ -z{@J&#D`l?z{w)(>-8c2=(Gk6H{W7p{CVdY7-~0+Ccmr<2jG3$+G?8$2JwO -zeR+Z{d)cLbMV70UJ&ZWMxZ$eF=cLG;*It`0niTc5IIwWd5IVKtYLP78%9y$~zb)Oq -z%62>p17)R^ucZaEtbVQ(Aur$VtR+6&4PE6kE6DE=^@o;{VX+dp`%Z_u}r(zEEayYL0 -zR;m_yc4G{)ZP(MZKA$76cIZSHT~~a$j`zD&cUR)ouTM9gi!sybeEnzM&vm>%teU$L -zu6{L&u+|oP{_39T-K~zwGr1D4Zf&?4BPn)v8Q=S2orN>IoMt?fU&s_us+(YXRwv?} -z){NHHoqwd9_^V|XJ&G{Y>OZ4-+OJPM%bLJ14+*lx}O>? -zF;3k2G%bQ%`PzxrTWg*8tJel5>Trj)AAMD3vP0_dtVyL0BHEh;Uq5y}&=j+evFuPt -z-KIC*T302zw@Oahuxwd|McDD98?^ea7H^ajJZ{Cf?rd9fhzU9dlX@^ -z`to}H1WUb+r#p82RgWlJe#B+-HD|!EZH#)Y^RSb>ARA7W#cU-jgXlUcm2CUlMXl?vnsy1;nsAK -z*NcTVSm`mY)^BhUJv!;0L|xJvqs7)z)2??VHk#Uqy-eCIYB^22!AbPsDrd%xUc9X@ -zBa(NUG#%aHF~2aUK~N|Esz%7U!%KSv!(yd3p6Zp}bdLMgH;IiL;xCQ0BL2y=MED-w -zcqhOm>W7TqLC3HQ+9Df{{o7Jtd*rNs-_xBcI`P|`*VG=~ct;>yF6{D|meyj^eNTec -zxgB7NS-`t2;inn%5hm784<{X|jJT`D5!R{czQukov+DFBQ@1sJ-HCfSB3`WbU-4-} -zTd%^JT_^tNn1(*SJ@?A7j?!mF2@```1D+=QJj<}=UGL3}QR|#_Ox9?1eckpvqT<;h -zg#*=d+IbO#e -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 +zD7IlonkOy3AIJvqJ+^v3B{iHk+09aQ#>kl{ +zmaISJQBQP8%5~(PD4NTU;H% +zN4-1eLAj|t8F9I*tOJKM3*6eu_ik{zyQXVr`+F=q1YAwrdHH=#%BbwO{yyyY;)#O9 +zGoK`Ujx6-fNTj483E1!FGtYVz6zXJkTq}>qH=7wK@z<-uMz+lx_|+jFzKR&rwU*h7 +z-SX~-k+=i6A(lrB*0r`9T8GUNIhfO&-z;_$ZArSIsvPp?xN$s|$dHe^`OM^F>B%4e +z+B+^26JapEmg)E{;0#))&Eg{uHb-Q`84A;T-g<0_D1txOzm@fAkH7Bi)a>I9KNL*w +z8u{ixFO8tyq?{r4KmQm +zSNiE?)c%L{xJxhP4&5oKhr-|T5c1%mU!3b24|v+PPTx7XiKE<3_og)W8hwd4bQ{h> +zw@BZ$Vn;F^AsxsUQYH4)WS37yHJ(jv^McSfJ!KYWI{j#p^1Z|(l4aXFHm%b)_D;p6 +zeK-F2{zQ2YFT{AfE%kmcleZA9 +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 +zKQC*8IZKJ85gXf`D@XmrZ}z0B4$-% +z#5u_aJlT~Rz#nDlIJ6PugYP20>(80*@KTjt2Lvz5mZ0M7$)CcUk@p_s$^h?o_rF$>!zEoV+I-e)}5CY2o9PEjay* +zV>Cj8ZChL}gx7qpb>?}aNx}GS69W2l#$e=$@mq@2rNQ3ZaqlTtH2F0b9YVEg_&cmp +z9vx$cf7u~q1PkZir56Xw60;6fM=X)hnQ`bvgB}QZiFos!aZPc!EHRvJhPYeZiG3_? +zjZbnKVSm#-9*)S}?Zz7Ix5mdiDb3_8pG#x{I61G8qoRfu1(?S9zqVOT5UPa0RFVoy +zxGZG6EN57Ym|95?5w#v3susU+2$|LdW!O*>lhl?!cqW?wb$~FN*e&rbyxv*?dCe5X +zA3X1$($YNfAX74Uu7Tv&Y0zVaUwg5SyFa7>J}6Pc<8{{Dz36a2cWZ@ziU|3oYtGnA +znJD06B5HU9wr-RKbRVXY{N@dMhVhN*V%+a3VjRb0wX;hVazYu=%el;UduXEp%w^7< +zb|+!8yUq+Ya!HO6tIB5eqD~poR2H$D+@pe77pwERgEIA +z0!|y>AQ6FFu;Cr?4;OGC36S8`-RHRs!ojv|9~nbh^^c7~^@OJH?SB5}xeQZzNnGTp +zU${G$vNFg^JlLjxT2*m!{P!2zieBFsmDoj7By5jYgbdVWx_kcpnE-OIb+w^e5#s*~ +DA-Nv< literal 9260 -zcmeAS@N?(olHy`uVBq!ia0y~yU^oH79Lx+1471we)-W(I{SEL5ab;j&*zEAXF5~}E -zga0u-|5FKJPi^?W!SR1V#sAsC|8uJUhfe&z&gK7d&;R>O|DV(NKOy%25rhB6YyQs+`9DA4 -z|3%gRmz4isR{DQe>fa*2|M`{wv+6)wkRP|JySE-tqjO5%zzj`~TS?|Lqq2Kd$@#pwa(% -zK_K^^)%c&<_`fa(q-#?2|HS5hrA7aNBJ|DTBbKWy~hY5xDD=KocB|K|q%k8l5Pz4U*0FUT=Ftw17C-5?)LivHi7_e`Bnd?M*c4@1G)K< -z%Kw6LP<~1toyYy8jhL|I->k9$D%QN-E1e|Cbj3KcW3UvE_eqGbnBJ#s1%828y_a -zejqE>JN>UJ_bNd -z`hTk}DC9%?{@s=Q7ux~y;~~TU&xHS5FZ;jC0u+Nf8~@j5|Np@C|AF{F*SY_Frv2Y! -z|GzT{l;pm${STV>za{PeW6}R_c>kL(|9?~FpZ}EqvqJydEdHNf_wS|P|MG@^Zp|@8 -z3=9k#N`m}?894b^+5QP>J1X;wRB*Y=c539fqD_#g}^n4fMaf -zTwj -z#M$P{hj&}bKU_GuzAohLgIm|8M*Dw#{P5<&1x@jv-(0#bA-bp -z_CUjo4HG0)n3W!|@7LHaqA~ZtsTl{DIC{Ey4vFniS-`F4qL6m}^Bg6vFK=&)iT;a! -zHaq9s{O5npSI+xi{NUa$o5knU)3tY)>Oa46XwIA`-gl&?o2=SXoRqX^_wEk{+ow&9 -zy~ioTz_d&A@wHWa;$=$i4||{FT}ioetE9_h=VXf{(S#p|JTG)_3chnII7hQk#OigJ -zy0Amso*nN_uGN)2C+X5Rr}eVeqcApw;Na=1cWzC5{?qZn42|=3pB46T$}Hd!-0t?o -zzC&j2ze}pGr*O(FUR;=cSnH;%!^OL`at700h1_}Z;>F+JJHOq@y8h59rtf1?ZTQZV -z^gFcy*HbmO&w4t?%$h^1`|0oUzOuXTUrBYBJq}x|vT^B=i8&AQZ{K5gIChM$rC@ci -zc^AjxfV3GF7KJ%EDK4)cA6aWx`HW{#*CtEFpdxn`O64 -zsd!7XFSP8LuAx)qw>Ip0d*S=|f0r+3^rv)o*7GvH`t|GAsjBjKf3NCanIKi!AkAle?Qm}5i@1Yg7_yr$&IOQSxYBq -zYlp6yewEMchbn)+<&Sq{^t=AU -zmQ&QH#T)&)6B-t_N=y55MmVdPusctKO;yR!S=GBg=}0<=#y&~vTw)yA);%TGZ)3)? -z<$+VDZ4&xobh>k$>-)C0Hv9H_5_}hx4PZmb!XcniA^R;BqHuGdHrQ%newK` -zTg={-@xAZNgGPcOl~?=hCe50td?)jwqreVnhk3RiA|h97Y`b&lsl*MXST#A<`TkRO -zdQNz)){vm3^-%wgqnA;8FLPpr{$uvpC(_T)v#q!wwWUeMoa@%a#V*_a%sajCnc%;xZUtNjM>h7&uw}0y#O>#YSxa`W>h<^+D&K0Vu -zFV1+)dOUGowf*%YwKh#UzTg|v!nbYFH?L@D -z9G+?S$l$)L=a!lNbxS2gkv2xtX*g&zIz;Y`nB&UO8{^*sui^N!6e -zm}zn%art_k@*J1jmx>hZ4+I%657fRJImPvFW$}W-Z(F-(%zXL!_2;`;dn^Nv9!uPy -z++A}nE$CY(LsI5S#!>*k?8N=zM7id^DZ@1d*)evhwpUZ>o(7= -zsctdi=j`=PpU`6OaF$JQPteihynlYC0=GLuW;VC40OvaQ4AWcNXULSty3Ou)Ij%iH -zTizkY`GicR)|5+6e%0JIR9Lx^(^gq5tY5&r({knP$@~*CwstBC#jxE@_|wk2gy+VM -zwwncN-Z@img#-r|m!H==x8M?o@>v<4D!B)XuVzIr;&i;;nDAdv&)m3D{QZpz@he|i -z4`%lkzF5V*S&X&z-QtR?O$zO&826pM(syCEudi<%+xn(xj-Ux?@BV+7;_vO=W_9^Wi%c8;gYJ+p&7?^C -zh@@G;Z%#hfwR>~o)FMZ}rE5FZIp=3_EL?5m8vo(I$kbb -zw{G#`WNCYj(!h?O9u;QR_Fl`?d_6sk?hJp~4ti!iIiO+~vGUNrX4QAUliL);YKx9` -zgvHb>(os{F*X?m%eng+U6gD@ZTC%|mb_T>u5w+e0<*$_z&myfNz2zCntzXx=a)9i%w(S1 -z{Tb1$wijmv@3$=9w)@r{hOWf0pP4TN+4hLD%zV7sET;d$+B2Fh54SIToXO75q0{CP -z=I}F*FIV&Yp-7o0Q{tycn7H4O_!juteI1)+LAY*4y~WQzchVkNedl1lx0&sCc;O-2 -zCo4REaGaeO5Z$f7dF?mDkyde*>QzieR+~>9RWdtac_zQ_h~bkD7oRFmliKRG_epM> -zi=4CD|IWy#Dy(~+$5a@8YZY?aWh%Ebf$vJ&*9ViA`_GqRc{peL22Ky1T+RPMRr{+i -zNA9=m>uYr5+Y#tB-;g~>`|0VW*6i&k0T -z4~wJ!_6P`A)n@()tZH5w_NKOakCVUcrK_!{1^wlJu8}_@{4z6gJ&!Hp+`Y#x_N>}3 -zUv%-VxXQ0v{7*RkI`+uF+`47$iW7@Of6hLxobV-lx{d7*$t#hn?QE7$Z=ODz&6i+r -zF{!(5!W^$F0rnZ^C%>Ch+tO9CsDJWWi4XI(L@kr^v?zLiZ|}BQELOLLoH`F@+b(DR -z`8(fEpy21D_F99|a{KR$py>+&}TNm&qR4jJPP;<4L-?4~!D(jxff%&tV4Q{LxN_AMsvC@Cvl?N$* -z)j$1wr@+0Xi@j;fw`Cpi=hyGgZn>Iqdv|wV%zCvaH$GRL-0f+>VO@K3hVksPOXBu4 -zgly5Nt8>>bV`96Z?CfQmxJA`tvigHxOJ<7PdiIu1FG6jL)=aecwy|IB -zk%#()R?(lY_2VYIJSv-P`Lm`@jaA`8(EknZPVDVhNa4#`!oa+3hQdW3uDgOS4+UL} -z>u{|uVPb!<)z?aYF?Tf=^Sz6wxz5>5{dtGfdwpilDSnG3@I`37yK^w$N1~yG_MzC`{}soHM_8HO{w6K -zJC4iO-}rcfXP0vAY`s*63B7uA%@AW`bimY -z16x0pZaKz(yu)t&*)YqSx$>LH+9YRvtD?Qm1l?LnG4U> -zACL_dt=``CFzBXR{jRSsb8|0vw7%l6HT(OK{eG82?a}Z@mu3`e2`h?OZ22ivY;fai -zd+{8}BCeUt*O)9W=~~21;P+utJUaR8ZoSui>he!E*c_d?b_&;w$6sXQU$8f_92T;h -zQ2*~D|0Dj;MGF_qJ-2%C8*LS-&qChC^%<{zbao{MbalkOUU-B5mt@CE^S_^0zf@2; -z?-DV|rSGIB17F;P-I5YzaiJ$3THA+hUUl#wW9^6LKc|?PuIi-+*cq&?4OMDq$WK9iO)S -zw|KM@5=(jd@5OG|7}L`5CtL5t#dU@;6EiHzb2IfaxH~y*^3NOp64>@@UDvBgkKc&2 -zeN&coIPfy8&GFyg>GDe^8?U%y$TBgjFmHm$nKe!aS6s4K-LcKMM*8$t|KI+^Y*5m4@$EceJ` -zrNOA6tju#nh~?XcrMjx&mkxYe)q5fKYO{i1*n{$op)96B44VWUX0bH>NoQCRtkGdC -zwx?2;A?W?7OU}`vwr4nm6GW$b=!mZNW9cm29MvPaCn&o_VXKovU3{bH#YbHSidc#d -zuKUv0ldCDs{;luLgoEsodu=z!iLP1t=|irIfWCNlGS8B2VG<|aYqKqC+~y^6rmpYk -z!A@Q-!w0$FwmmmJ{!&h)y5i?c!HgvdrVpHXie(sXD)Kxjuba@B$EXm+B6!gD#IM5! -zs=PTjr&)1g!>f^YAuah9&{a; -zxYRmtuFQ$&SBt8?%6BL@`!k7F&71hp+NeU>`PmC*(>ApiWihYrsxhq;X8APxrUE0& -zBOZ7CrU`E*zmSdGk*DVR^WDwVv>-Wwgo8~JEUzU-FuiX4t8mhZJxHD9$?W?-92T{# -z_2^!zy@sQQw?rZ5jHliHRkJ-W{{B|noyHdJui&1)gjd_IO;EXXp|#LY)3p*F<=ZES -zM)Ejq;>%fPxqQwYK@a|~^Wz2g-n0F>$nV9ciFOqp*D9WTtx1_%s8IgyLz53zgrGNX -zE#VlwGsz)nO3g7`$NyM&uBswOQh9g -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 -z%E>H+(#~Iu39^6niZ{|Ww56~q -z$YpnIJIK=%X4+B1GwtS7!N$o~V*XX+zs)&u&(5JFe6`dOcY*%&_GP!Ww6&!<1%b$L7G+Fg|x$!6_mNq|G;Vt&LYl417v`Bqn -zlHvrurUiKmCJ1hic5++hoMYN7bIf_2lP(M2k=o0O%jYY4EN4==d|j~N#Wl%^0#~w& -zm!EgHkUcf`@CSWA8Mg&$rks{_)=Qw@ -z-N|oNN=inDV%+;}2WnEL$XFjfs&w?~C(DN2*S$Qn9ZlAp6aB?;O}@Cbf_cKGxooQ-BbXFYi}*YwPRnv{#lH{C2Y9Q^(57{d}*MdiAVU``_=rwJbm^93b3KHfT- -zej+w-y7xZgj{=SxYL`x!*l6jz=ka6fn}I3f=^6o(l|00qH`J%{b{?p+cD}V%F-b}J -z@sS(3!s!N1_nVsg54UcU32Jd+zO;_dGtE7AoyFn8w{AVVzcVydy>-7PAhN_v(|ON5 -zE5)2Ri&IA;JEq4~h^Gozo4LIYZL|nAUi9{3)kML)8Rav5=j^?}mlz$w_^2evO-f2c -zq4eIzyN}kmtGw;Lm&57EXgf=B({gi8&uM+w9XY~x8K3b -zu9W2{P(5+F%+;-Bh3^(AOjP*Wd9!Uo8(VRQT-;f{Gw$bdYo=Vc@A>uMo9XAK1);qY -zlr;w)32R%b-4x}&GL^pxH|6}IQ6}X*{E`8-=uS?KdeqQJH6t3#KE>voVS-D -zD0X${QX$sc4?mPVNj=kcgQvy)}(K{kW6u)1>G!J8-?Hl%jjkjEJPf -z^&dV|woN*bIibpaNww9HFy-j0W*b?U)s5K%S}$IkVDw$UaYN+}6J@3L^Iw;)o6S`y -zu%uc`rTn@;(vq~5MjDH_=870j+^qP`;rWdNJ-bwIu2MT3*VMeegKKw-h0JB+Ndb?` -z4hP0+Ppi3c>A`~c4@yqR$<<|-PfUI?=e+wBCF7~@SEt@waH!Ctt>^8=;O7rYayE2+ -zR$Zk1vnqFv7{7;}^Q179+*eYgDy5PiD4>%l- -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 +z<wCdy-3tTl}j4kzaCmrni9Diizn#a{@0 +zu;<>ZBofe$`#ML)Z*Aj8mbPS3-(VgSdF3LA8LJgBPj{3IaB~uLBuylKO*>ev*i|tuS(Wff3`Ogj^{GsE +zb-&NcY_)d|4#vv+AW}skSWrN{p$KOp?oug)BPoM*O}*h=wrr-PGYCt{qwP-&I!~hn +z&+*{EI5^09slk8i%kFcTjCcO6Oc}M9iiS}cuLLw0fyMPfjZ_M`;HWDHP^ke=f*5^! +z(0!2p!N9nZ8J+AP5sfunmbw64l@2)3@53_`Q@g&4FYKeDLbz2F-Pl@Er#INAtM()n +z<;MFT;osC}L2=Y4P1?cm)V{7nauSgh +zx4)k@#lLT}(uM?{Z&NvzT8pnJk@-MDvv4wOKsY+l9S8OdOw}cex#$t*B6ppAEloQy +z8u`9L`Ky$*$*G}A=)h6BjVn=_YuPie5epXe0vLKZP=Pxps%a&uGrdg4y#R{YobnDn +zWlMl5J;9|5ev`f`BO3Uh(yuK%@i^`+fAimq+_>*)z(;wrFdXn2nVJw1y_>PcV%p-) +zt#ZCU`}~DIE5y1BiI$qSd5XIebq(uRB-FnL#^x=bDHO-ls3({4R}-PgePOPH8ggGN +z^EAdT|N11qATWCZQ}ZY#=hum&;_xeyp*|O{VN?%jM$?&+DK=8LzLP4?U!YQ_JT0`M +z`m!W@TCB5mlr9&jJ{^cX4Ye=uf(7g!BDG1LQfZM#P5u-^$L1K~rOMk7oWI24W>ZJVoZ8!*NX>jC%2pgw@7$v*amGL8JnA`*TjN)y=JPix$ +zHom^xjfr~ZFvhO?xbJHg&jfEZgboIqN@pk*%G-#&cX5DM>_>dMo{P<(#6bOBlgEyG +zzi7pMrVsz<*TT+n%Xo*+rUVN +ztJqe<9EEg`YU)i$PQ+gn%oA5sG>b*6QUjZVf+Ju4QKWr32^B^>#t1pQ*dNT#SxuC8 +zGNJ9mH6R-92O+m#!DECXMrB|3+|cZ$?^qoag;w8-vr)Z5hx@2MVoazOwqdLo2-lu( +ziwF(a3SNH{+U_=d6KFp}-N^eInrfTZ{p%Yc;K{NXO^Sl0qy(%)%sUXL +zA6Ic}&$4}O+ulD-?|#%otX@aO$zD_RW;|WXeL`u5;iz`2Ja937zabkT*wwyB&2HIU +z%>tpNcvDWCsG=IjRr(V|Z7N`9^tphbhiC}fIrVcS>=>)uMStm;g&z-HK{fFz2ud&X +zKo;y87PhB3IZGZ&D%bJ2dZ<-Z7I$fCrPWl6O0ir})>f~+rM8k@!Q(EpWCD9f!k>me +zRhs@Q3_eZ!{s3QHUMaN0uShhn$y!N+)a +z6F#K#O21}#Wz2NGar1LUq3S|3=0~&VTjxVeqcysO1QIGwgglMcjXc3^9R9i556MW! +zA%G1+Y)mPX16RcVB#B?R~Xl +zIeR6G9EBEoU+Sk|=Q=4gQdT~j9ecG~G45m|E+IkhfuBxT`M%^wZkNkXpL0AjS!$%u +zg-={lr6QW@$p<#-f}T{y|0rAEpY~$9`Ffd=BP+`1#;?ge=@mLGkdmI~u?Dai2i+}> +zr-d}7M&xTHsK7@<3$tPd^Yg3fLzxDa!oOJ_N!hGt&$}5!9&TOIuzhIP>)^&CM1CIF +zY>A-293)fzq2lbB(1wKk=>#3=G1eTT&8(iBSJab=V@AGnDSwOhxKg{m8sa~TR||^x +zH?*-f-l|Zq;GkYEt~~O`56i(Z6gi`*^TxMZuc-f=NMlvry~%u2a>kz*@R^tJ@{7%-A@wfa)Z +z0~dL|Z*tTjEX7ED(M%2gZ|Zi_L4TWr%=BR=y4%;?-COo)8t(xaW)#f?Uhc9^d-1?K +z=UDW-cu8J#%~t1$>T7o{K5NXC7Z^ +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 +zWZQ?eQkgCCqwANoAm&K4|fw*k7ipV +zB1v2pR!seE-oV-2@pAb2ne;%k;&0+LB7z16@)VH1MO9)MHU9kSp)dCNVB91j?4mmO +zv3NP2%#IeX=+W7Ni#8IjoTpc(!3T*dt7!EX8VlAzQq6uvFcs%W{$71OuAvW8Wpseg+*PVYLv?WMN=C|H@$;E_S5fVp$L;GyupU7jZ$kfvC58X?uLqEZijH!v +HqBZh=dic2S diff --git a/divinemc-server/paper-patches/files/src/main/java/ca/spottedleaf/moonrise/common/time/TickData.java.patch b/divinemc-server/paper-patches/files/src/main/java/ca/spottedleaf/moonrise/common/time/TickData.java.patch new file mode 100644 index 0000000..a74d792 --- /dev/null +++ b/divinemc-server/paper-patches/files/src/main/java/ca/spottedleaf/moonrise/common/time/TickData.java.patch @@ -0,0 +1,119 @@ +--- a/src/main/java/ca/spottedleaf/moonrise/common/time/TickData.java ++++ b/src/main/java/ca/spottedleaf/moonrise/common/time/TickData.java +@@ -292,51 +_,78 @@ + // So, we will "compact" the data by merging any inbetween tick times + // the next tick. + // If there is no "next tick", then we will create one. +- final int len = allData.size(); +- final List collapsedData = new ArrayList<>(len); +- +- long totalTickTime = 0L; +- long totalCpuTime = 0L; +- TickTime lastActualTick = null; +- +- for (final TickTime time : allData) { +- if (!time.isTickExecution()) { +- totalTickTime += time.tickLength(); +- totalCpuTime += time.supportCPUTime() ? time.tickCpuTime() : 0L; +- } else { +- final long tickCpu = time.supportCPUTime() ? time.tickCpuTime() : 0L; +- ++ final List collapsedData = new ArrayList<>(); ++ for (int i = 0, len = allData.size(); i < len; ++i) { ++ final List toCollapse = new ArrayList<>(); ++ TickTime lastTick = null; ++ for (;i < len; ++i) { ++ final TickTime time = allData.get(i); ++ if (!time.isTickExecution()) { ++ toCollapse.add(time); ++ continue; ++ } ++ lastTick = time; ++ break; ++ } ++ ++ if (toCollapse.isEmpty()) { ++ // nothing to collapse ++ final TickTime last = allData.get(i); + collapsedData.add( + new TickInformation( +- time.differenceFromLastTick(tickInterval), +- time.tickLength() + totalTickTime, +- tickCpu + totalCpuTime ++ last.differenceFromLastTick(tickInterval), ++ last.tickLength(), ++ last.supportCPUTime() ? last.tickCpuTime() : 0L + ) + ); +- +- totalTickTime = 0L; +- totalCpuTime = 0L; +- lastActualTick = time; +- } +- } +- +- if (totalTickTime > 0 && createFakeTick) { +- final long differenceBetweenTicks; +- if (lastActualTick != null) { +- differenceBetweenTicks = lastActualTick.tickStart(); + } else { +- differenceBetweenTicks = Math.max(tickInterval, totalTickTime); ++ long totalTickTime = 0L; ++ long totalCpuTime = 0L; ++ for (int k = 0, len2 = toCollapse.size(); k < len2; ++k) { ++ final TickTime time = toCollapse.get(k); ++ totalTickTime += time.tickLength(); ++ totalCpuTime += time.supportCPUTime() ? time.tickCpuTime() : 0L; ++ } ++ if (i < len) { ++ // we know there is a tick to collapse into ++ final TickTime last = allData.get(i); ++ collapsedData.add( ++ new TickInformation( ++ last.differenceFromLastTick(tickInterval), ++ last.tickLength() + totalTickTime, ++ (last.supportCPUTime() ? last.tickCpuTime() : 0L) + totalCpuTime ++ ) ++ ); ++ } else if (createFakeTick) { ++ // we do not have a tick to collapse into, so we must make one up ++ // we will assume that the tick is "starting now" and ongoing ++ ++ // compute difference between imaginary tick and last tick ++ final long differenceBetweenTicks; ++ if (lastTick != null) { ++ // we have a last tick, use it ++ differenceBetweenTicks = lastTick.tickStart(); ++ } else { ++ // we don't have a last tick, so we must make one up that makes sense ++ // if the current interval exceeds the max tick time, then use it ++ ++ // Otherwise use the interval length. ++ // This is how differenceFromLastTick() works on TickTime when there is no previous interval. ++ differenceBetweenTicks = Math.max( ++ tickInterval, totalTickTime ++ ); ++ } ++ ++ collapsedData.add( ++ new TickInformation( ++ differenceBetweenTicks, ++ totalTickTime, ++ totalCpuTime ++ ) ++ ); ++ } + } +- +- collapsedData.add( +- new TickInformation( +- differenceBetweenTicks, +- totalTickTime, +- totalCpuTime +- ) +- ); + } +- + return collapsedData; + } + diff --git a/gradle.properties b/gradle.properties index abffb4f..3a2b8f0 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,7 +2,7 @@ group = org.bxteam.divinemc version=1.21.10-R0.1-SNAPSHOT mcVersion=1.21.10 -purpurRef=ffe2f809feaded534170af84df7286d805e058bd +purpurRef=626a3cb2323d9ded16690171c0d431a2ab82b370 experimental=true org.gradle.configuration-cache=true