9
0
mirror of https://github.com/BX-Team/DivineMC.git synced 2025-12-19 14:59:25 +00:00

Updated Upstream (Purpur)

Upstream has released updates that appear to apply and compile correctly

Purpur Changes:
This commit is contained in:
wiyba
2025-10-31 15:33:03 +03:00
parent 8792d0da9e
commit 6e0570e215
63 changed files with 1087 additions and 990 deletions

View File

@@ -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

View File

@@ -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<ServerExplosion.CacheKey, Float> 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

View File

@@ -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 <T extends Entity> List<T> getEntitiesOfClass(final Class<T> entityClass, final AABB boundingBox, final Predicate<? super T> predicate) {
@@ -2736,7 +2736,7 @@ index 5792422495a2d71ae4341e54817550e3d352d0b4..ad69e0e97d6d8efcfe73fe8a6f66cc64
final List<T> 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<Entity> moonrise$getHardCollidingEntities(final Entity entity, final AABB box, final Predicate<? super Entity> predicate) {
@@ -2744,7 +2744,7 @@ index 5792422495a2d71ae4341e54817550e3d352d0b4..ad69e0e97d6d8efcfe73fe8a6f66cc64
final List<Entity> 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<Entity> getEntities(@Nullable Entity entity, AABB boundingBox, Predicate<? super Entity> predicate) {
@@ -2752,7 +2752,7 @@ index 5792422495a2d71ae4341e54817550e3d352d0b4..ad69e0e97d6d8efcfe73fe8a6f66cc64
List<Entity> 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 <T extends Entity> void getEntities(final EntityTypeTest<Entity, T> entityTypeTest,
final AABB boundingBox, final Predicate<? super T> predicate,
final List<? super T> into, final int maxCount) {
@@ -2761,7 +2761,7 @@ index 5792422495a2d71ae4341e54817550e3d352d0b4..ad69e0e97d6d8efcfe73fe8a6f66cc64
if (entityTypeTest instanceof net.minecraft.world.entity.EntityType<T> 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 <T extends Entity> boolean hasEntities(EntityTypeTest<Entity, T> entityTypeTest, AABB bounds, Predicate<? super T> predicate) {

View File

@@ -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 {

View File

@@ -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);

View File

@@ -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;

View File

@@ -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
}

View File

@@ -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);

View File

@@ -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<EndCrystal> crystals) { // CraftBukkit - return boolean

View File

@@ -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<CommandSourceStack> 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()) {

View File

@@ -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
}
}

View File

@@ -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);

View File

@@ -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;

View File

@@ -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);

View File

@@ -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()

View File

@@ -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
}

View File

@@ -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<StructureTemplate.JigsawBlockInfo> 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 {

View File

@@ -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) {

View File

@@ -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<GameRules.IntegerValue> key) {
@@ -220,7 +220,7 @@ index dbd3813cb0328b7b73c9b634b1b19be7ee3246f6..9b72f3266e3a7cf6bd934d2497f0c533
public static class BooleanValue extends GameRules.Value<GameRules.BooleanValue> {
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);
}

View File

@@ -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

View File

@@ -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<? extends Allay> 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<? extends Goat> 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<? extends Hoglin> 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<? extends Monster> 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<? extends Villager> 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;
}

View File

@@ -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();

View File

@@ -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<Relative> 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() {

View File

@@ -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<ServerExplosion.CacheKey, Float> explosionDensityCache = new java.util.HashMap<>(); // Paper - Optimize explosions
public java.util.ArrayDeque<net.minecraft.world.level.block.RedstoneTorchBlock.Toggle> 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<BreedingCooldownPair, Object> 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<Entity> getEntities(@Nullable Entity entity, AABB boundingBox, Predicate<? super Entity> predicate) {
@@ -1030,7 +1030,7 @@ index 79627c421088d439745164d7652a0cc1d93ced30..1f00b7ddf6c470c8a32e418775fa40e9
List<Entity> 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

View File

@@ -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<Packet<?>> {
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<TickTa
@@ -34,6 +47,350 @@ index 6a714d59d01eafcd833f05208a948bf33b797392..f654664fb06556125cbd2a213c9fb89e
} catch (Throwable levelTickingException) {
CrashReport crashReport = CrashReport.forThrowable(levelTickingException, "Exception ticking world");
serverLevel.fillReportDetails(crashReport);
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<net.minecraft.world.level.chunk.LevelChunk> 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<LevelChunk> spawningChunks = new ObjectArrayList<>();
- private final Set<ChunkHolder> chunkHoldersToBroadcast = new ReferenceOpenHashSet<>();
+ // DivineMC start - Regionized Chunk Ticking
+ private final ObjectArrayList<LevelChunk> spawningChunks = new ObjectArrayList<>();
+ private final Set<ChunkHolder> 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<Void> 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<net.minecraft.world.level.chunk.LevelChunk> entityTickingChunks = ((ca.spottedleaf.moonrise.patches.chunk_system.level.ChunkSystemServerLevel)world).moonrise$getEntityTickingChunks();
+ final ca.spottedleaf.moonrise.common.list.ReferenceList<LevelChunk> 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<Void> 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<MobCategory> filteredSpawningCategories, long timeInhabited) {
List<LevelChunk> 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<MobCategory> 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<Block> blockTicks = new LevelTicks<>(this::isPositionTickingWithEntitiesLoaded);
private final LevelTicks<Fluid> fluidTicks = new LevelTicks<>(this::isPositionTickingWithEntitiesLoaded);
private final PathTypeCache pathTypesByPosCache = new PathTypeCache();
- final Set<Mob> navigatingMobs = new ObjectOpenHashSet<>();
+ final Set<Mob> navigatingMobs = java.util.Collections.synchronizedSet(new ObjectOpenHashSet<>()); // DivineMC - Regionized Chunk Ticking
volatile boolean isUpdatingNavigations;
protected final Raids raids;
private final ObjectLinkedOpenHashSet<BlockEventData> 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<PathNavigation> 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<TickingBlockEntity> pendingBlockEntityTickers = Lists.newArrayList();
+ private final List<TickingBlockEntity> 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<BlockPos, org.bukkit.craftbukkit.block.CraftBlockState> capturedBlockStates = new java.util.LinkedHashMap<>(); // Paper
+ public Map<BlockPos, org.bukkit.craftbukkit.block.CraftBlockState> capturedBlockStates = java.util.Collections.synchronizedMap(new java.util.LinkedHashMap<>()); // Paper // DivineMC - Regionized Chunk Ticking
public Map<BlockPos, BlockEntity> capturedTileEntities = new java.util.LinkedHashMap<>(); // Paper - Retain block place order when capturing blockstates
@Nullable
public List<net.minecraft.world.entity.item.ItemEntity> 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 {

View File

@@ -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<Packet<?>> {
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<net.minecraft.world.level.chunk.LevelChunk> 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<LevelChunk> spawningChunks = new ObjectArrayList<>();
- private final Set<ChunkHolder> chunkHoldersToBroadcast = new ReferenceOpenHashSet<>();
+ // DivineMC start - Regionized Chunk Ticking
+ private final ObjectArrayList<LevelChunk> spawningChunks = new ObjectArrayList<>();
+ private final Set<ChunkHolder> 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<Void> 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<net.minecraft.world.level.chunk.LevelChunk> entityTickingChunks = ((ca.spottedleaf.moonrise.patches.chunk_system.level.ChunkSystemServerLevel)world).moonrise$getEntityTickingChunks();
+ final ca.spottedleaf.moonrise.common.list.ReferenceList<LevelChunk> 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<Void> 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<MobCategory> filteredSpawningCategories, long timeInhabited) {
List<LevelChunk> 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<MobCategory> 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<Block> blockTicks = new LevelTicks<>(this::isPositionTickingWithEntitiesLoaded);
private final LevelTicks<Fluid> fluidTicks = new LevelTicks<>(this::isPositionTickingWithEntitiesLoaded);
private final PathTypeCache pathTypesByPosCache = new PathTypeCache();
- final Set<Mob> navigatingMobs = new ObjectOpenHashSet<>();
+ final Set<Mob> navigatingMobs = java.util.Collections.synchronizedSet(new ObjectOpenHashSet<>()); // DivineMC - Regionized Chunk Ticking
volatile boolean isUpdatingNavigations;
protected final Raids raids;
private final ObjectLinkedOpenHashSet<BlockEventData> 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<PathNavigation> 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<TickingBlockEntity> pendingBlockEntityTickers = Lists.newArrayList();
+ private final List<TickingBlockEntity> 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<BlockPos, org.bukkit.craftbukkit.block.CraftBlockState> capturedBlockStates = new java.util.LinkedHashMap<>(); // Paper
+ public Map<BlockPos, org.bukkit.craftbukkit.block.CraftBlockState> capturedBlockStates = java.util.Collections.synchronizedMap(new java.util.LinkedHashMap<>()); // Paper // DivineMC - Regionized Chunk Ticking
public Map<BlockPos, BlockEntity> capturedTileEntities = new java.util.LinkedHashMap<>(); // Paper - Retain block place order when capturing blockstates
@Nullable
public List<net.minecraft.world.entity.item.ItemEntity> 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--) {

View File

@@ -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 {

View File

@@ -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 {

View File

@@ -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 <T extends Entity> EntityType<T> register(ResourceKey<EntityType<?>> key, EntityType.Builder<T> 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();
}

View File

@@ -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<TickTa
@@ -95,10 +95,10 @@ index e5569978a23c5bde673146421963a2ff0905d514..65d74d0021b48e92f8d06ad19a255023
bridge.removeChannel(channel);
}
diff --git a/net/minecraft/server/players/PlayerList.java b/net/minecraft/server/players/PlayerList.java
index 249c85f283b4a80493014773c7e8bf06953cbc3a..dd592eae80b8869b9b40f04767a8ab8e10d4fe7e 100644
index 9acc247ec540449a0e4cf3a5a0bc67a0e3dfbf15..bf26f788b3c77ef344f072e399cada116b95e757 100644
--- a/net/minecraft/server/players/PlayerList.java
+++ b/net/minecraft/server/players/PlayerList.java
@@ -246,6 +246,8 @@ public abstract class PlayerList {
@@ -247,6 +247,8 @@ public abstract class PlayerList {
return;
}
@@ -107,7 +107,7 @@ index 249c85f283b4a80493014773c7e8bf06953cbc3a..dd592eae80b8869b9b40f04767a8ab8e
final net.kyori.adventure.text.Component jm = playerJoinEvent.joinMessage();
if (jm != null && !jm.equals(net.kyori.adventure.text.Component.empty())) { // Paper - Adventure
@@ -432,6 +434,7 @@ public abstract class PlayerList {
@@ -433,6 +435,7 @@ public abstract class PlayerList {
return this.remove(player, net.kyori.adventure.text.Component.translatable("multiplayer.player.left", net.kyori.adventure.text.format.NamedTextColor.YELLOW, io.papermc.paper.configuration.GlobalConfiguration.get().messages.useDisplayNameInQuitMessage ? player.getBukkitEntity().displayName() : io.papermc.paper.adventure.PaperAdventure.asAdventure(player.getDisplayName())));
}
public @Nullable net.kyori.adventure.text.Component remove(ServerPlayer player, net.kyori.adventure.text.Component leaveMessage) {
@@ -115,7 +115,7 @@ index 249c85f283b4a80493014773c7e8bf06953cbc3a..dd592eae80b8869b9b40f04767a8ab8e
// Paper end - Fix kick event leave message not being sent
org.purpurmc.purpur.task.BossBarTask.removeFromAll(player.getBukkitEntity()); // Purpur - Implement TPSBar
ServerLevel serverLevel = player.level();
@@ -1328,6 +1331,7 @@ public abstract class PlayerList {
@@ -1329,6 +1332,7 @@ public abstract class PlayerList {
serverPlayer.connection.send(clientboundUpdateRecipesPacket);
serverPlayer.getRecipeBook().sendInitialRecipeBook(serverPlayer);
}

View File

@@ -60,7 +60,7 @@ index 51c126735ace8fdde89ad97b5cab62f244212db0..23f6ed26b531ea570fdf2ae48c1e2710
+ public void moonrise$write(final org.bxteam.divinemc.region.IRegionFile regionFile) throws IOException; // DivineMC - Buffered Linear region format
}
diff --git a/net/minecraft/server/MinecraftServer.java b/net/minecraft/server/MinecraftServer.java
index 9c1798cca21a3f36f0347a0a4ac1fe9ababe60af..fe55ccb61324f4132448720bbab48e0f4c9b6b4d 100644
index 5feb76f4cd7274943f1b763c5eb7071c4bf2b809..c574bb4a1cce4af4e3cda1f76e789b7c1660fc21 100644
--- a/net/minecraft/server/MinecraftServer.java
+++ b/net/minecraft/server/MinecraftServer.java
@@ -958,10 +958,10 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa

View File

@@ -102,7 +102,7 @@ index 8c98c2593eec14a8a378041e94cf52b8fbfedc30..4788686f0bd8ab67700bf3687560ff4a
private void tickPassenger(Entity ridingEntity, Entity passengerEntity, final boolean isActive) { // Paper - EAR 2
diff --git a/net/minecraft/world/entity/Entity.java b/net/minecraft/world/entity/Entity.java
index 3248a68175708fd7b10020113475844ae3fd2a8f..d767cc3ca7e559640cfde7f1f765b87c3d9c16ea 100644
index 9db43874a94770d49ea5ff48a46c4657e4819e98..013261aff0b9ecfeb51f3baf597d7ee211a8a095 100644
--- a/net/minecraft/world/entity/Entity.java
+++ b/net/minecraft/world/entity/Entity.java
@@ -1116,29 +1116,10 @@ public abstract class Entity implements SyncedDataHolder, DebugValueSource, Name

View File

@@ -5,7 +5,7 @@ Subject: [PATCH] Do not send spectator change packet
diff --git a/net/minecraft/server/level/ServerPlayerGameMode.java b/net/minecraft/server/level/ServerPlayerGameMode.java
index e2040f79550bdfacf32c94c369284d28526ed2ea..9018f3fe36a2786de380bc8e4d5cfb9425325b36 100644
index 9bbcffc77dcf0e062a7f3464aee7f8d0563a440f..4b0afe40a06c76b4378f7a5979d6217c4b947770 100644
--- a/net/minecraft/server/level/ServerPlayerGameMode.java
+++ b/net/minecraft/server/level/ServerPlayerGameMode.java
@@ -86,10 +86,7 @@ public class ServerPlayerGameMode {
@@ -39,10 +39,10 @@ index e2040f79550bdfacf32c94c369284d28526ed2ea..9018f3fe36a2786de380bc8e4d5cfb94
+ // DivineMC end - Do not send spectator change packet
}
diff --git a/net/minecraft/server/players/PlayerList.java b/net/minecraft/server/players/PlayerList.java
index dd592eae80b8869b9b40f04767a8ab8e10d4fe7e..df4b28f16e0cd2ddcf094b8bc60f13e7707ab84b 100644
index bf26f788b3c77ef344f072e399cada116b95e757..551ba3a85f9bd3861512585939ab898d20e733a8 100644
--- a/net/minecraft/server/players/PlayerList.java
+++ b/net/minecraft/server/players/PlayerList.java
@@ -258,6 +258,7 @@ public abstract class PlayerList {
@@ -259,6 +259,7 @@ public abstract class PlayerList {
// CraftBukkit start - sendAll above replaced with this loop
ClientboundPlayerInfoUpdatePacket packet = ClientboundPlayerInfoUpdatePacket.createPlayerInitializing(List.of(player)); // Paper - Add Listing API for Player
@@ -50,7 +50,7 @@ index dd592eae80b8869b9b40f04767a8ab8e10d4fe7e..df4b28f16e0cd2ddcf094b8bc60f13e7
final List<ServerPlayer> 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;
}

View File

@@ -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());

View File

@@ -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 <T extends Entity> List<T> getEntitiesOfClass(final Class<T> entityClass, final AABB boundingBox, final Predicate<? super T> 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<Entity> moonrise$getHardCollidingEntities(final Entity entity, final AABB box, final Predicate<? super Entity> predicate) {

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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<org.bukkit.entity.HumanEntity> 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<ItemStack> 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) {

View File

@@ -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<EquipmentSlot, ItemStack> 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<EquipmentSlot, ItemStack> 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) {

View File

@@ -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;

View File

@@ -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;
}

View File

@@ -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();

View File

@@ -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

View File

@@ -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

View File

@@ -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);

View File

@@ -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

View File

@@ -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) {

View File

@@ -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.Key<?>, GameRules.Value<?>> rules, FeatureFlagSet enabledFeatures) {

View File

@@ -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<TickingBlockEntity> 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
}
}

View File

@@ -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 @@

View File

@@ -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
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
Mr>mdKI;Vst03o>^`Tzg`
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
DA-Nv<
literal 9260
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
HqBZh=dic2S

View File

@@ -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<TickInformation> 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<TickInformation> collapsedData = new ArrayList<>();
+ for (int i = 0, len = allData.size(); i < len; ++i) {
+ final List<TickTime> 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;
}

View File

@@ -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