mirror of
https://github.com/Winds-Studio/Leaf.git
synced 2025-12-29 03:49:21 +00:00
fix player alive check and add optimize despawn
This commit is contained in:
@@ -1,87 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Taiyou06 <kaandindar21@gmail.com>
|
||||
Date: Fri, 14 Feb 2025 20:08:14 +0100
|
||||
Subject: [PATCH] Cache eligible players for despawn checks
|
||||
|
||||
|
||||
diff --git a/net/minecraft/server/level/ServerLevel.java b/net/minecraft/server/level/ServerLevel.java
|
||||
index 0f311e603c8df175576a33d5d20369cbcda2be55..3a31f9132a7271ea476cc85c5a10ea7f327256bf 100644
|
||||
--- a/net/minecraft/server/level/ServerLevel.java
|
||||
+++ b/net/minecraft/server/level/ServerLevel.java
|
||||
@@ -729,6 +729,8 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
|
||||
return this.structureManager;
|
||||
}
|
||||
|
||||
+ public Player[] eligibleDespawnCheckingPlayerCache = new Player[0]; // Leaf - Cache eligible players for despawn checks
|
||||
+
|
||||
public void tick(BooleanSupplier hasTimeLeft) {
|
||||
this.handlingTick = true;
|
||||
TickRateManager tickRateManager = this.tickRateManager();
|
||||
@@ -796,6 +798,19 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
|
||||
}
|
||||
|
||||
io.papermc.paper.entity.activation.ActivationRange.activateEntities(this); // Paper - EAR
|
||||
+
|
||||
+ // Leaf start - Cache eligible players for despawn checks
|
||||
+ List<ServerPlayer> serverPlayers = new ArrayList<>(players().size());
|
||||
+ for (int i = 0; i < players().size(); i++) {
|
||||
+ ServerPlayer player = players().get(i);
|
||||
+ if (net.minecraft.world.entity.EntitySelector.PLAYER_AFFECTS_SPAWNING.test(player)) {
|
||||
+ serverPlayers.add(player);
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ eligibleDespawnCheckingPlayerCache = serverPlayers.toArray(new Player[0]);
|
||||
+ // Leaf end - Cache eligible players for despawn checks
|
||||
+
|
||||
this.entityTickList
|
||||
.forEach(
|
||||
entity -> {
|
||||
diff --git a/net/minecraft/server/level/ServerPlayer.java b/net/minecraft/server/level/ServerPlayer.java
|
||||
index 42032812e3c50f3ade62a0e69cb1168d83c42a71..b77c545788ade614d7ae0b29ccfcd4d50c4ddf55 100644
|
||||
--- a/net/minecraft/server/level/ServerPlayer.java
|
||||
+++ b/net/minecraft/server/level/ServerPlayer.java
|
||||
@@ -1546,6 +1546,13 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc
|
||||
this.containerMenu.broadcastChanges();
|
||||
}
|
||||
|
||||
+ // Leaf start - Cache eligible players for despawn checks
|
||||
+ @Override
|
||||
+ public boolean isAlive() {
|
||||
+ return !this.isRemoved() && this.entityData.get(DATA_HEALTH_ID) > 0.0f && !this.dead;
|
||||
+ }
|
||||
+ // Leaf end - Cache eligible players for despawn checks
|
||||
+
|
||||
// CraftBukkit start - moved bed result checks from below into separate method
|
||||
private Either<Player.BedSleepingProblem, Unit> getBedResult(BlockPos at, Direction direction) {
|
||||
if (this.isSleeping() || !this.isAlive()) {
|
||||
diff --git a/net/minecraft/world/entity/Mob.java b/net/minecraft/world/entity/Mob.java
|
||||
index 867353500482247bbec79f407246902c79a3d14a..4a1a336914eff8a178dcd992bd1bfea25a8be76b 100644
|
||||
--- a/net/minecraft/world/entity/Mob.java
|
||||
+++ b/net/minecraft/world/entity/Mob.java
|
||||
@@ -722,7 +722,24 @@ public abstract class Mob extends LivingEntity implements EquipmentUser, Leashab
|
||||
if (this.level().getDifficulty() == Difficulty.PEACEFUL && this.shouldDespawnInPeaceful()) {
|
||||
this.discard(EntityRemoveEvent.Cause.DESPAWN); // CraftBukkit - add Bukkit remove cause
|
||||
} else if (!this.isPersistenceRequired() && !this.requiresCustomPersistence()) {
|
||||
- Entity nearestPlayer = this.level().findNearbyPlayer(this, -1.0, EntitySelector.PLAYER_AFFECTS_SPAWNING); // Paper - Affects Spawning API
|
||||
+ // Leaf start - Cache eligible players for despawn checks
|
||||
+ Entity nearestPlayer = null;
|
||||
+
|
||||
+ if (this.level() instanceof ServerLevel serverLevel) {
|
||||
+ double minDist = Double.MAX_VALUE;
|
||||
+ for (int i = 0; i < serverLevel.eligibleDespawnCheckingPlayerCache.length; i++) {
|
||||
+ Player cachedPlayer = serverLevel.eligibleDespawnCheckingPlayerCache[i];
|
||||
+ double d1 = cachedPlayer.distanceToSqr(this);
|
||||
+ if (d1 <= minDist) {
|
||||
+ minDist = d1;
|
||||
+ nearestPlayer = cachedPlayer;
|
||||
+ }
|
||||
+ }
|
||||
+ } else {
|
||||
+ nearestPlayer = this.level().findNearbyPlayer(this, -1.0, EntitySelector.PLAYER_AFFECTS_SPAWNING); // Paper - Affects Spawning API
|
||||
+ }
|
||||
+ // Leaf end - Cache eligible players for despawn checks
|
||||
+
|
||||
if (nearestPlayer != null) {
|
||||
// Paper start - Configurable despawn distances
|
||||
final io.papermc.paper.configuration.WorldConfiguration.Entities.Spawning.DespawnRangePair despawnRangePair = this.level().paperConfig().entities.spawning.despawnRanges.get(this.getType().getCategory());
|
||||
@@ -0,0 +1,52 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: hayanesuru <hayanesuru@outlook.jp>
|
||||
Date: Fri, 4 Jul 2025 03:22:38 +0900
|
||||
Subject: [PATCH] optimize mob despawn
|
||||
|
||||
|
||||
diff --git a/net/minecraft/server/level/ServerLevel.java b/net/minecraft/server/level/ServerLevel.java
|
||||
index 0f311e603c8df175576a33d5d20369cbcda2be55..498b1ab5013030c4b9fe0eca57215d93965c43b6 100644
|
||||
--- a/net/minecraft/server/level/ServerLevel.java
|
||||
+++ b/net/minecraft/server/level/ServerLevel.java
|
||||
@@ -796,6 +796,8 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
|
||||
}
|
||||
|
||||
io.papermc.paper.entity.activation.ActivationRange.activateEntities(this); // Paper - EAR
|
||||
+
|
||||
+ if (org.dreeam.leaf.config.modules.opt.OptimizeDespawn.enabled) despawnMap.prepare(this); // Leaf - optimize despawn
|
||||
this.entityTickList
|
||||
.forEach(
|
||||
entity -> {
|
||||
@@ -831,6 +833,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
|
||||
}
|
||||
}
|
||||
);
|
||||
+ if (org.dreeam.leaf.config.modules.opt.OptimizeDespawn.enabled) despawnMap.reset(); // Leaf - optimize despawn
|
||||
this.tickBlockEntities();
|
||||
}
|
||||
// Paper - rewrite chunk system
|
||||
@@ -943,6 +946,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
|
||||
|
||||
private int currentIceAndSnowTick = 0; protected void resetIceAndSnowTick() { this.currentIceAndSnowTick = this.simpleRandom.nextInt(16); } // Gale - Airplane - optimize random calls in chunk ticking
|
||||
|
||||
+ public final org.dreeam.leaf.world.DespawnMap despawnMap = new org.dreeam.leaf.world.DespawnMap(); // Leaf - optimize despawn
|
||||
public void tickChunk(LevelChunk chunk, int randomTickSpeed) {
|
||||
final net.minecraft.world.level.levelgen.BitRandomSource simpleRandom = this.simpleRandom; // Paper - optimise random ticking // Leaf - Faster random generator - upcasting
|
||||
ChunkPos pos = chunk.getPos();
|
||||
diff --git a/net/minecraft/world/entity/Mob.java b/net/minecraft/world/entity/Mob.java
|
||||
index 867353500482247bbec79f407246902c79a3d14a..173ec6919cef2aa90c40d3bf33d927a2db7b4922 100644
|
||||
--- a/net/minecraft/world/entity/Mob.java
|
||||
+++ b/net/minecraft/world/entity/Mob.java
|
||||
@@ -722,6 +722,12 @@ public abstract class Mob extends LivingEntity implements EquipmentUser, Leashab
|
||||
if (this.level().getDifficulty() == Difficulty.PEACEFUL && this.shouldDespawnInPeaceful()) {
|
||||
this.discard(EntityRemoveEvent.Cause.DESPAWN); // CraftBukkit - add Bukkit remove cause
|
||||
} else if (!this.isPersistenceRequired() && !this.requiresCustomPersistence()) {
|
||||
+ // Leaf start - optimize despawn
|
||||
+ if (org.dreeam.leaf.config.modules.opt.OptimizeDespawn.enabled) {
|
||||
+ ((ServerLevel) level()).despawnMap.checkDespawn(this);
|
||||
+ return;
|
||||
+ }
|
||||
+ // Leaf end - optimize despawn
|
||||
Entity nearestPlayer = this.level().findNearbyPlayer(this, -1.0, EntitySelector.PLAYER_AFFECTS_SPAWNING); // Paper - Affects Spawning API
|
||||
if (nearestPlayer != null) {
|
||||
// Paper start - Configurable despawn distances
|
||||
@@ -411,7 +411,7 @@ index 8f41326fda8c5f9f6926038508be6c6529b051bc..46e171ca454253c32e22c0c18587e9a7
|
||||
}
|
||||
}
|
||||
diff --git a/net/minecraft/server/level/ServerLevel.java b/net/minecraft/server/level/ServerLevel.java
|
||||
index 3a31f9132a7271ea476cc85c5a10ea7f327256bf..58ec5cfb21d4834c3aaa74f76ca8a536eb86c30c 100644
|
||||
index 498b1ab5013030c4b9fe0eca57215d93965c43b6..397ac1603c742b82e74cfb5d3e579935d74933a2 100644
|
||||
--- a/net/minecraft/server/level/ServerLevel.java
|
||||
+++ b/net/minecraft/server/level/ServerLevel.java
|
||||
@@ -180,7 +180,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
|
||||
@@ -469,9 +469,9 @@ index 3a31f9132a7271ea476cc85c5a10ea7f327256bf..58ec5cfb21d4834c3aaa74f76ca8a536
|
||||
// Paper start
|
||||
@Override
|
||||
public boolean hasChunk(int chunkX, int chunkZ) {
|
||||
@@ -731,8 +752,112 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
|
||||
|
||||
public Player[] eligibleDespawnCheckingPlayerCache = new Player[0]; // Leaf - Cache eligible players for despawn checks
|
||||
@@ -729,8 +750,112 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
|
||||
return this.structureManager;
|
||||
}
|
||||
|
||||
+ // Leaf start - SparklyPaper - parallel world ticking
|
||||
+ private void processAsyncReadRequests() {
|
||||
@@ -582,7 +582,7 @@ index 3a31f9132a7271ea476cc85c5a10ea7f327256bf..58ec5cfb21d4834c3aaa74f76ca8a536
|
||||
TickRateManager tickRateManager = this.tickRateManager();
|
||||
boolean runsNormally = tickRateManager.runsNormally();
|
||||
if (runsNormally) {
|
||||
@@ -740,6 +865,14 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
|
||||
@@ -738,6 +863,14 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
|
||||
this.advanceWeatherCycle();
|
||||
}
|
||||
|
||||
@@ -597,7 +597,7 @@ index 3a31f9132a7271ea476cc85c5a10ea7f327256bf..58ec5cfb21d4834c3aaa74f76ca8a536
|
||||
int _int = this.getGameRules().getInt(GameRules.RULE_PLAYERS_SLEEPING_PERCENTAGE);
|
||||
if (this.purpurConfig.playersSkipNight && this.sleepStatus.areEnoughSleeping(_int) && this.sleepStatus.areEnoughDeepSleeping(_int, this.players)) { // Purpur - Config for skipping night
|
||||
// Paper start - create time skip event - move up calculations
|
||||
@@ -1317,9 +1450,12 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
|
||||
@@ -1306,9 +1439,12 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
|
||||
fluidState.tick(this, pos, blockState);
|
||||
}
|
||||
// Paper start - rewrite chunk system
|
||||
@@ -612,7 +612,7 @@ index 3a31f9132a7271ea476cc85c5a10ea7f327256bf..58ec5cfb21d4834c3aaa74f76ca8a536
|
||||
// Paper end - rewrite chunk system
|
||||
|
||||
}
|
||||
@@ -1330,9 +1466,12 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
|
||||
@@ -1319,9 +1455,12 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
|
||||
blockState.tick(this, pos, this.random);
|
||||
}
|
||||
// Paper start - rewrite chunk system
|
||||
@@ -627,7 +627,7 @@ index 3a31f9132a7271ea476cc85c5a10ea7f327256bf..58ec5cfb21d4834c3aaa74f76ca8a536
|
||||
// Paper end - rewrite chunk system
|
||||
|
||||
}
|
||||
@@ -1597,6 +1736,8 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
|
||||
@@ -1586,6 +1725,8 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
|
||||
}
|
||||
|
||||
private void addPlayer(ServerPlayer player) {
|
||||
@@ -636,7 +636,7 @@ index 3a31f9132a7271ea476cc85c5a10ea7f327256bf..58ec5cfb21d4834c3aaa74f76ca8a536
|
||||
Entity entity = this.getEntity(player.getUUID());
|
||||
if (entity != null) {
|
||||
LOGGER.warn("Force-added player with duplicate UUID {}", player.getUUID());
|
||||
@@ -1609,7 +1750,12 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
|
||||
@@ -1598,7 +1739,12 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
|
||||
|
||||
// CraftBukkit start
|
||||
private boolean addEntity(Entity entity, @Nullable org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason spawnReason) {
|
||||
@@ -651,7 +651,7 @@ index 3a31f9132a7271ea476cc85c5a10ea7f327256bf..58ec5cfb21d4834c3aaa74f76ca8a536
|
||||
// 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 b77c545788ade614d7ae0b29ccfcd4d50c4ddf55..9906244ab2e447de25546f25ec5f6ef6c4b221ab 100644
|
||||
index 42032812e3c50f3ade62a0e69cb1168d83c42a71..4140d5beb01b530e97ae308eedc639de70df696f 100644
|
||||
--- a/net/minecraft/server/level/ServerPlayer.java
|
||||
+++ b/net/minecraft/server/level/ServerPlayer.java
|
||||
@@ -465,6 +465,8 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc
|
||||
@@ -680,7 +680,7 @@ index b77c545788ade614d7ae0b29ccfcd4d50c4ddf55..9906244ab2e447de25546f25ec5f6ef6
|
||||
// CraftBukkit start
|
||||
/*
|
||||
this.isChangingDimension = true;
|
||||
@@ -1780,6 +1785,12 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc
|
||||
@@ -1773,6 +1778,12 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc
|
||||
return OptionalInt.empty();
|
||||
} else {
|
||||
// CraftBukkit start
|
||||
@@ -693,7 +693,7 @@ index b77c545788ade614d7ae0b29ccfcd4d50c4ddf55..9906244ab2e447de25546f25ec5f6ef6
|
||||
this.containerMenu = abstractContainerMenu; // Moved up
|
||||
if (!this.isImmobile())
|
||||
this.connection
|
||||
@@ -1844,6 +1855,11 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc
|
||||
@@ -1837,6 +1848,11 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc
|
||||
}
|
||||
@Override
|
||||
public void closeContainer(org.bukkit.event.inventory.InventoryCloseEvent.Reason reason) {
|
||||
|
||||
@@ -9,10 +9,10 @@ Leaf: ~48ms (-36%)
|
||||
This should help drastically on the farms that use actively changing fluids.
|
||||
|
||||
diff --git a/net/minecraft/server/level/ServerLevel.java b/net/minecraft/server/level/ServerLevel.java
|
||||
index 1b0bd86212e7ff0b8a80a524250b69bd68a9c685..d3b711d4aa5c54c05310a2089a8c371fc2c2acdf 100644
|
||||
index 56e6691f4fc425f13fe5f1fd40de16f4c54a3195..f77bd9472300aec6958ebfa69469fb4e1ee36484 100644
|
||||
--- a/net/minecraft/server/level/ServerLevel.java
|
||||
+++ b/net/minecraft/server/level/ServerLevel.java
|
||||
@@ -1449,6 +1449,10 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
|
||||
@@ -1438,6 +1438,10 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
|
||||
this.emptyTime = 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -5,10 +5,10 @@ Subject: [PATCH] Micro optimizations for random tick
|
||||
|
||||
|
||||
diff --git a/net/minecraft/server/level/ServerLevel.java b/net/minecraft/server/level/ServerLevel.java
|
||||
index d3b711d4aa5c54c05310a2089a8c371fc2c2acdf..478e8fa7955b3a084a7b519c0b4cddb399f72758 100644
|
||||
index f77bd9472300aec6958ebfa69469fb4e1ee36484..a9f33e705b3c0abfa3dcc01647a57c06bb614e1c 100644
|
||||
--- a/net/minecraft/server/level/ServerLevel.java
|
||||
+++ b/net/minecraft/server/level/ServerLevel.java
|
||||
@@ -1048,7 +1048,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
|
||||
@@ -1036,7 +1036,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
|
||||
// Paper start - optimise random ticking
|
||||
private void optimiseRandomTick(final LevelChunk chunk, final int tickSpeed) {
|
||||
final LevelChunkSection[] sections = chunk.getSections();
|
||||
@@ -17,7 +17,7 @@ index d3b711d4aa5c54c05310a2089a8c371fc2c2acdf..478e8fa7955b3a084a7b519c0b4cddb3
|
||||
final net.minecraft.world.level.levelgen.BitRandomSource simpleRandom = this.simpleRandom; // Leaf - Faster random generator - upcasting
|
||||
final boolean doubleTickFluids = !ca.spottedleaf.moonrise.common.PlatformHooks.get().configFixMC224294();
|
||||
|
||||
@@ -1057,41 +1057,41 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
|
||||
@@ -1045,41 +1045,41 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
|
||||
final int offsetZ = cpos.z << 4;
|
||||
|
||||
for (int sectionIndex = 0, sectionsLen = sections.length; sectionIndex < sectionsLen; sectionIndex++) {
|
||||
|
||||
@@ -134,7 +134,7 @@ index 9b8d119116b0c3a51d3fe2ff7efb33cc39627cc4..436e73086678e4afbf94f1b7bca9b0c7
|
||||
|
||||
// Gale start - Pufferfish - SIMD support
|
||||
diff --git a/net/minecraft/server/level/ServerLevel.java b/net/minecraft/server/level/ServerLevel.java
|
||||
index 478e8fa7955b3a084a7b519c0b4cddb399f72758..fc61a7083232148397a0b330ce2a4d70ba38543d 100644
|
||||
index a9f33e705b3c0abfa3dcc01647a57c06bb614e1c..02c2b9c1978959e1ee0be5c72a5f7b98aa282fc2 100644
|
||||
--- a/net/minecraft/server/level/ServerLevel.java
|
||||
+++ b/net/minecraft/server/level/ServerLevel.java
|
||||
@@ -175,7 +175,16 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
|
||||
@@ -178,7 +178,7 @@ index 478e8fa7955b3a084a7b519c0b4cddb399f72758..fc61a7083232148397a0b330ce2a4d70
|
||||
|
||||
// Leaf start - SparklyPaper - parallel world ticking - Shutdown handling for async reads
|
||||
diff --git a/net/minecraft/world/entity/Mob.java b/net/minecraft/world/entity/Mob.java
|
||||
index 4a1a336914eff8a178dcd992bd1bfea25a8be76b..7e3b35df01b63735fd4d5202788477a1342708a5 100644
|
||||
index 173ec6919cef2aa90c40d3bf33d927a2db7b4922..e99fd3cd5ca6863facd189bf9cd4a3d5c102424a 100644
|
||||
--- a/net/minecraft/world/entity/Mob.java
|
||||
+++ b/net/minecraft/world/entity/Mob.java
|
||||
@@ -138,6 +138,12 @@ public abstract class Mob extends LivingEntity implements EquipmentUser, Leashab
|
||||
@@ -206,7 +206,7 @@ index 4a1a336914eff8a178dcd992bd1bfea25a8be76b..7e3b35df01b63735fd4d5202788477a1
|
||||
}
|
||||
// Paper end
|
||||
|
||||
@@ -793,6 +804,11 @@ public abstract class Mob extends LivingEntity implements EquipmentUser, Leashab
|
||||
@@ -782,6 +793,11 @@ public abstract class Mob extends LivingEntity implements EquipmentUser, Leashab
|
||||
if (this.goalSelector.inactiveTick(this.activatedPriority, false)) // Pufferfish - use this to alternate ticking
|
||||
this.goalSelector.tick();
|
||||
}
|
||||
|
||||
@@ -79,10 +79,10 @@ index 6c7edbbf3935c40ccb78bee680ea75431718b9bd..fd2f79d976c9587b00380f8b8f784b32
|
||||
public String toString() {
|
||||
return "Reference{" + this.key + "=" + this.value + "}";
|
||||
diff --git a/net/minecraft/server/level/ServerPlayer.java b/net/minecraft/server/level/ServerPlayer.java
|
||||
index 89751b2651f85eefeca7c782460297fbb2ddbcff..a15c1c0a1eeb80bd10d5590dce73cb726569c61f 100644
|
||||
index 9ec5f1ebc013b427e92f92d6df722b42aa7f73d7..38edf089bac1de826cfc7e72384151ee25e46a95 100644
|
||||
--- a/net/minecraft/server/level/ServerPlayer.java
|
||||
+++ b/net/minecraft/server/level/ServerPlayer.java
|
||||
@@ -1911,7 +1911,7 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc
|
||||
@@ -1904,7 +1904,7 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc
|
||||
this.awardStat(Stats.SWIM_ONE_CM, rounded);
|
||||
this.causeFoodExhaustion(this.level().spigotConfig.swimMultiplier * (float) rounded * 0.01F, org.bukkit.event.entity.EntityExhaustionEvent.ExhaustionReason.SWIM); // CraftBukkit - EntityExhaustionEvent // Spigot
|
||||
}
|
||||
|
||||
@@ -172,13 +172,13 @@ index 46e171ca454253c32e22c0c18587e9a7ba19f331..1c7e2e5124c7d4c1b86039b0327bfd92
|
||||
}
|
||||
}
|
||||
diff --git a/net/minecraft/server/level/ServerLevel.java b/net/minecraft/server/level/ServerLevel.java
|
||||
index fc61a7083232148397a0b330ce2a4d70ba38543d..d319e4d7e12c4bae63893ad25dcdc3ed59c88d97 100644
|
||||
index 02c2b9c1978959e1ee0be5c72a5f7b98aa282fc2..4ec5142e233c87d2bb1ebe883cf10a5a1e5100b3 100644
|
||||
--- a/net/minecraft/server/level/ServerLevel.java
|
||||
+++ b/net/minecraft/server/level/ServerLevel.java
|
||||
@@ -1114,6 +1114,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
|
||||
|
||||
@@ -1103,6 +1103,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
|
||||
private int currentIceAndSnowTick = 0; protected void resetIceAndSnowTick() { this.currentIceAndSnowTick = this.simpleRandom.nextInt(16); } // Gale - Airplane - optimize random calls in chunk ticking
|
||||
|
||||
public final org.dreeam.leaf.world.DespawnMap despawnMap = new org.dreeam.leaf.world.DespawnMap(); // Leaf - optimize despawn
|
||||
+ public final org.dreeam.leaf.world.NatureSpawnChunkMap natureSpawnChunkMap = new org.dreeam.leaf.world.NatureSpawnChunkMap(); // Leaf - optimize mob spawning
|
||||
public void tickChunk(LevelChunk chunk, int randomTickSpeed) {
|
||||
final net.minecraft.world.level.levelgen.BitRandomSource simpleRandom = this.simpleRandom; // Paper - optimise random ticking // Leaf - Faster random generator - upcasting
|
||||
|
||||
@@ -24,12 +24,12 @@ index 1c7e2e5124c7d4c1b86039b0327bfd92c49df9b1..976fcc96f8f0a10338c5b98bd3908e6d
|
||||
this.level.tickCustomSpawners(this.spawnEnemies, this.spawnFriendlies);
|
||||
}
|
||||
diff --git a/net/minecraft/server/level/ServerLevel.java b/net/minecraft/server/level/ServerLevel.java
|
||||
index d319e4d7e12c4bae63893ad25dcdc3ed59c88d97..08c6f93bcc028c876e17870681382aa9fa2ba3ee 100644
|
||||
index 4ec5142e233c87d2bb1ebe883cf10a5a1e5100b3..307738d09dc4eb5918cbfb1153feb739fbc1cc68 100644
|
||||
--- a/net/minecraft/server/level/ServerLevel.java
|
||||
+++ b/net/minecraft/server/level/ServerLevel.java
|
||||
@@ -1115,6 +1115,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
|
||||
private int currentIceAndSnowTick = 0; protected void resetIceAndSnowTick() { this.currentIceAndSnowTick = this.simpleRandom.nextInt(16); } // Gale - Airplane - optimize random calls in chunk ticking
|
||||
@@ -1104,6 +1104,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
|
||||
|
||||
public final org.dreeam.leaf.world.DespawnMap despawnMap = new org.dreeam.leaf.world.DespawnMap(); // Leaf - optimize despawn
|
||||
public final org.dreeam.leaf.world.NatureSpawnChunkMap natureSpawnChunkMap = new org.dreeam.leaf.world.NatureSpawnChunkMap(); // Leaf - optimize mob spawning
|
||||
+ public final org.dreeam.leaf.world.RandomTickSystem randomTickSystem = new org.dreeam.leaf.world.RandomTickSystem(); // Leaf - optimize random tick
|
||||
public void tickChunk(LevelChunk chunk, int randomTickSpeed) {
|
||||
|
||||
@@ -5,16 +5,18 @@ Subject: [PATCH] optimize waypoint
|
||||
|
||||
|
||||
diff --git a/net/minecraft/world/entity/Entity.java b/net/minecraft/world/entity/Entity.java
|
||||
index 5ee9394fd35a9f61e6a54126ed2c567dff19c05b..502c6afe9ff8cb3d163862920794f15cec2f78a8 100644
|
||||
index eff20b8de6bddfeec4f25e6381bf914bca38e1c6..50dd29948e89e3f618722201841429121d7f19e0 100644
|
||||
--- a/net/minecraft/world/entity/Entity.java
|
||||
+++ b/net/minecraft/world/entity/Entity.java
|
||||
@@ -5117,12 +5117,14 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess
|
||||
@@ -5145,6 +5145,7 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess
|
||||
return;
|
||||
}
|
||||
// Paper end - Block invalid positions and bounding box
|
||||
+ boolean blockUpdated; // Leaf - optimize waypoint
|
||||
if (this.position.x != x || this.position.y != y || this.position.z != z) {
|
||||
synchronized (this.posLock) { // Paper - detailed watchdog information
|
||||
this.position = new Vec3(x, y, z);
|
||||
@@ -5152,7 +5153,8 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess
|
||||
int floor = Mth.floor(x);
|
||||
int floor1 = Mth.floor(y);
|
||||
int floor2 = Mth.floor(z);
|
||||
@@ -24,7 +26,7 @@ index 5ee9394fd35a9f61e6a54126ed2c567dff19c05b..502c6afe9ff8cb3d163862920794f15c
|
||||
this.blockPosition = new BlockPos(floor, floor1, floor2);
|
||||
this.inBlockState = null;
|
||||
if (SectionPos.blockToSectionCoord(floor) != this.chunkPosition.x || SectionPos.blockToSectionCoord(floor2) != this.chunkPosition.z) {
|
||||
@@ -5131,7 +5133,7 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess
|
||||
@@ -5161,7 +5163,7 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess
|
||||
}
|
||||
|
||||
this.levelCallback.onMove();
|
||||
@@ -100,10 +100,10 @@ index 4535858701b2bb232b9d2feb2af6551526232ddc..e65c62dbe4c1560ae153e4c4344e9194
|
||||
- // Paper end - detailed watchdog information
|
||||
}
|
||||
diff --git a/net/minecraft/server/level/ServerLevel.java b/net/minecraft/server/level/ServerLevel.java
|
||||
index 08c6f93bcc028c876e17870681382aa9fa2ba3ee..58a77b5aa49cb56eea33757e982ba1852bbfb679 100644
|
||||
index 307738d09dc4eb5918cbfb1153feb739fbc1cc68..0fc09b85e9d8e12f8103dcf755afa3928361c812 100644
|
||||
--- a/net/minecraft/server/level/ServerLevel.java
|
||||
+++ b/net/minecraft/server/level/ServerLevel.java
|
||||
@@ -1518,13 +1518,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
|
||||
@@ -1507,13 +1507,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
|
||||
// Paper end - log detailed entity tick information
|
||||
|
||||
public void tickNonPassenger(Entity entity) {
|
||||
@@ -117,7 +117,7 @@ index 08c6f93bcc028c876e17870681382aa9fa2ba3ee..58a77b5aa49cb56eea33757e982ba185
|
||||
entity.setOldPosAndRot();
|
||||
entity.tickCount++;
|
||||
entity.totalEntityAge++; // Paper - age-like counter for all entities
|
||||
@@ -1537,13 +1531,6 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
|
||||
@@ -1526,13 +1520,6 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
|
||||
for (Entity entity1 : entity.getPassengers()) {
|
||||
this.tickPassenger(entity, entity1, isActive); // Paper - EAR 2
|
||||
}
|
||||
@@ -132,7 +132,7 @@ index 08c6f93bcc028c876e17870681382aa9fa2ba3ee..58a77b5aa49cb56eea33757e982ba185
|
||||
|
||||
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 eff20b8de6bddfeec4f25e6381bf914bca38e1c6..5ee9394fd35a9f61e6a54126ed2c567dff19c05b 100644
|
||||
index 50dd29948e89e3f618722201841429121d7f19e0..502c6afe9ff8cb3d163862920794f15cec2f78a8 100644
|
||||
--- a/net/minecraft/world/entity/Entity.java
|
||||
+++ b/net/minecraft/world/entity/Entity.java
|
||||
@@ -1170,16 +1170,6 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess
|
||||
@@ -193,9 +193,9 @@ index eff20b8de6bddfeec4f25e6381bf914bca38e1c6..5ee9394fd35a9f61e6a54126ed2c567d
|
||||
}
|
||||
|
||||
public void addDeltaMovement(Vec3 addend) {
|
||||
@@ -5146,9 +5118,7 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess
|
||||
}
|
||||
@@ -5147,9 +5119,7 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess
|
||||
// Paper end - Block invalid positions and bounding box
|
||||
boolean blockUpdated; // Leaf - optimize waypoint
|
||||
if (this.position.x != x || this.position.y != y || this.position.z != z) {
|
||||
- synchronized (this.posLock) { // Paper - detailed watchdog information
|
||||
this.position = new Vec3(x, y, z);
|
||||
@@ -0,0 +1,19 @@
|
||||
package org.dreeam.leaf.config.modules.opt;
|
||||
|
||||
import org.dreeam.leaf.config.ConfigModules;
|
||||
import org.dreeam.leaf.config.EnumConfigCategory;
|
||||
import org.dreeam.leaf.config.annotations.Experimental;
|
||||
|
||||
public class OptimizeDespawn extends ConfigModules {
|
||||
public String getBasePath() {
|
||||
return EnumConfigCategory.PERF.getBaseKeyName() + ".optimize-mob-despawn";
|
||||
}
|
||||
|
||||
@Experimental
|
||||
public static boolean enabled = false;
|
||||
|
||||
@Override
|
||||
public void onLoaded() {
|
||||
enabled = config.getBoolean(getBasePath(), enabled);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,85 @@
|
||||
package org.dreeam.leaf.world;
|
||||
|
||||
import io.papermc.paper.configuration.WorldConfiguration;
|
||||
import io.papermc.paper.configuration.type.DespawnRange;
|
||||
import it.unimi.dsi.fastutil.objects.ObjectArrays;
|
||||
import net.minecraft.server.level.ServerLevel;
|
||||
import net.minecraft.server.level.ServerPlayer;
|
||||
import net.minecraft.util.Mth;
|
||||
import net.minecraft.world.entity.EntitySelector;
|
||||
import net.minecraft.world.entity.Mob;
|
||||
import net.minecraft.world.entity.player.Player;
|
||||
import net.minecraft.world.level.Level;
|
||||
import org.bukkit.event.entity.EntityRemoveEvent;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public final class DespawnMap {
|
||||
private static final ServerPlayer[] EMPTY_PLAYER_ARRAY = {};
|
||||
|
||||
private ServerPlayer[] players = EMPTY_PLAYER_ARRAY;
|
||||
private double[] pos = {};
|
||||
|
||||
public void prepare(ServerLevel world) {
|
||||
this.players = world.players().toArray(EMPTY_PLAYER_ARRAY);
|
||||
|
||||
List<ServerPlayer> playerList = world.players();
|
||||
ServerPlayer[] list = new ServerPlayer[playerList.size()];
|
||||
int newSize = 0;
|
||||
for (ServerPlayer player1 : playerList) {
|
||||
if (EntitySelector.PLAYER_AFFECTS_SPAWNING.test(player1)) {
|
||||
list[newSize++] = player1;
|
||||
}
|
||||
}
|
||||
list = ObjectArrays.trim(list, newSize);
|
||||
this.players = list;
|
||||
this.pos = new double[this.players.length * 3];
|
||||
for (int i = 0; i < players.length; i++) {
|
||||
this.pos[i * 3] = this.players[i].getX();
|
||||
this.pos[i * 3 + 1] = this.players[i].getY();
|
||||
this.pos[i * 3 + 2] = this.players[i].getZ();
|
||||
}
|
||||
}
|
||||
|
||||
public void reset() {
|
||||
this.players = EMPTY_PLAYER_ARRAY;
|
||||
}
|
||||
|
||||
public void checkDespawn(Mob mob) {
|
||||
double x = mob.getX();
|
||||
double y = mob.getY();
|
||||
double z = mob.getZ();
|
||||
double distance = Double.MAX_VALUE;
|
||||
Player nearestPlayer = null;
|
||||
for (int i = 0, playersSize = players.length; i < playersSize; i++) {
|
||||
final double dx = this.pos[i * 3] - x;
|
||||
final double dy = this.pos[i * 3 + 1] - y;
|
||||
final double dz = this.pos[i * 3 + 2] - z;
|
||||
double d1 = dx * dx + dy * dy + dz * dz;
|
||||
if (d1 < distance) {
|
||||
distance = d1;
|
||||
nearestPlayer = players[i];
|
||||
}
|
||||
}
|
||||
if (nearestPlayer == null) {
|
||||
return;
|
||||
}
|
||||
Level world = mob.level();
|
||||
final WorldConfiguration.Entities.Spawning.DespawnRangePair despawnRangePair = world.paperConfig().entities.spawning.despawnRanges.get(mob.getType().getCategory());
|
||||
final DespawnRange.Shape shape = world.paperConfig().entities.spawning.despawnRangeShape;
|
||||
final double dy = Math.abs(nearestPlayer.getY() - y);
|
||||
final double dySqr = Mth.square(dy);
|
||||
final double dxSqr = Mth.square(nearestPlayer.getX() - x);
|
||||
final double dzSqr = Mth.square(nearestPlayer.getZ() - z);
|
||||
final double distanceSquared = dxSqr + dzSqr + dySqr;
|
||||
if (despawnRangePair.hard().shouldDespawn(shape, dxSqr, dySqr, dzSqr, dy) && mob.removeWhenFarAway(distanceSquared)) {
|
||||
mob.discard(EntityRemoveEvent.Cause.DESPAWN);
|
||||
} else if (despawnRangePair.soft().shouldDespawn(shape, dxSqr, dySqr, dzSqr, dy)) {
|
||||
if (mob.getNoActionTime() > 600 && mob.random.nextInt(800) == 0 && mob.removeWhenFarAway(distanceSquared)) {
|
||||
mob.discard(EntityRemoveEvent.Cause.DESPAWN);
|
||||
}
|
||||
} else {
|
||||
mob.setNoActionTime(0);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user