-
-
Notifications
You must be signed in to change notification settings - Fork 2.3k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Improve cancelling PreCreatureSpawnEvent with per player mob spawns (#…
- Loading branch information
1 parent
5bf82aa
commit 1b96c64
Showing
8 changed files
with
131 additions
and
17 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
91 changes: 91 additions & 0 deletions
91
patches/server/1008-Improve-cancelling-PreCreatureSpawnEvent-with-per-pl.patch
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,91 @@ | ||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 | ||
From: kickash32 <[email protected]> | ||
Date: Mon, 5 Apr 2021 01:42:35 -0400 | ||
Subject: [PATCH] Improve cancelling PreCreatureSpawnEvent with per player mob | ||
spawns | ||
|
||
|
||
diff --git a/src/main/java/net/minecraft/server/level/ChunkMap.java b/src/main/java/net/minecraft/server/level/ChunkMap.java | ||
index a98c134ce2ea51ae6d6f92959e57a4f0e03b0f6c..a4bf4ed615653ce30d2416a62e680d74e87b53fa 100644 | ||
--- a/src/main/java/net/minecraft/server/level/ChunkMap.java | ||
+++ b/src/main/java/net/minecraft/server/level/ChunkMap.java | ||
@@ -476,8 +476,27 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider | ||
} | ||
} | ||
|
||
+ // Paper start - per player mob count backoff | ||
+ public void updateFailurePlayerMobTypeMap(int chunkX, int chunkZ, net.minecraft.world.entity.MobCategory mobCategory) { | ||
+ if (!this.level.paperConfig().entities.spawning.perPlayerMobSpawns) { | ||
+ return; | ||
+ } | ||
+ int idx = mobCategory.ordinal(); | ||
+ final com.destroystokyo.paper.util.misc.PooledLinkedHashSets.PooledObjectLinkedOpenHashSet<ServerPlayer> inRange = this.playerMobDistanceMap.getObjectsInRange(chunkX, chunkZ); | ||
+ if (inRange != null) { | ||
+ final Object[] set = inRange.getBackingSet(); | ||
+ for (int i = 0; i < set.length; i++) { | ||
+ if (!(set[i] instanceof ServerPlayer serverPlayer)) { | ||
+ continue; | ||
+ } | ||
+ ++serverPlayer.mobBackoffCounts[idx]; | ||
+ } | ||
+ } | ||
+ } | ||
+ // Paper end - per player mob count backoff | ||
+ | ||
public int getMobCountNear(ServerPlayer entityPlayer, net.minecraft.world.entity.MobCategory mobCategory) { | ||
- return entityPlayer.mobCounts[mobCategory.ordinal()]; | ||
+ return entityPlayer.mobCounts[mobCategory.ordinal()] + entityPlayer.mobBackoffCounts[mobCategory.ordinal()]; // Paper - per player mob count backoff | ||
} | ||
// Paper end | ||
|
||
diff --git a/src/main/java/net/minecraft/server/level/ServerChunkCache.java b/src/main/java/net/minecraft/server/level/ServerChunkCache.java | ||
index 488a253e218409b5f0b4a872cee0928578fa7582..acbcdc8cb1523044b1657e03a141fae6389a3686 100644 | ||
--- a/src/main/java/net/minecraft/server/level/ServerChunkCache.java | ||
+++ b/src/main/java/net/minecraft/server/level/ServerChunkCache.java | ||
@@ -564,7 +564,17 @@ public class ServerChunkCache extends ChunkSource { | ||
if ((this.spawnFriendlies || this.spawnEnemies) && this.chunkMap.playerMobDistanceMap != null) { // don't count mobs when animals and monsters are disabled | ||
// re-set mob counts | ||
for (ServerPlayer player : this.level.players) { | ||
- Arrays.fill(player.mobCounts, 0); | ||
+ // Paper start - per player mob spawning backoff | ||
+ for (int ii = 0; ii < ServerPlayer.MOBCATEGORY_TOTAL_ENUMS; ii++) { | ||
+ player.mobCounts[ii] = 0; | ||
+ | ||
+ int newBackoff = player.mobBackoffCounts[ii] - 1; // TODO make configurable bleed // TODO use nonlinear algorithm? | ||
+ if (newBackoff < 0) { | ||
+ newBackoff = 0; | ||
+ } | ||
+ player.mobBackoffCounts[ii] = newBackoff; | ||
+ } | ||
+ // Paper end - per player mob spawning backoff | ||
} | ||
spawnercreature_d = NaturalSpawner.createState(l, this.level.getAllEntities(), this::getFullChunk, null, true); | ||
} else { | ||
diff --git a/src/main/java/net/minecraft/server/level/ServerPlayer.java b/src/main/java/net/minecraft/server/level/ServerPlayer.java | ||
index dc5fda83a66afbfeb7897fc20b4742899d8aca08..161c40692e8d469fad4169908b9353be0f85d0d8 100644 | ||
--- a/src/main/java/net/minecraft/server/level/ServerPlayer.java | ||
+++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java | ||
@@ -254,6 +254,7 @@ public class ServerPlayer extends Player { | ||
// Paper start - mob spawning rework | ||
public static final int MOBCATEGORY_TOTAL_ENUMS = net.minecraft.world.entity.MobCategory.values().length; | ||
public final int[] mobCounts = new int[MOBCATEGORY_TOTAL_ENUMS]; // Paper | ||
+ public final int[] mobBackoffCounts = new int[MOBCATEGORY_TOTAL_ENUMS]; // Paper - per player mob count backoff | ||
public final com.destroystokyo.paper.util.PooledHashSets.PooledObjectLinkedOpenHashSet<ServerPlayer> cachedSingleMobDistanceMap; | ||
// Paper end | ||
|
||
diff --git a/src/main/java/net/minecraft/world/level/NaturalSpawner.java b/src/main/java/net/minecraft/world/level/NaturalSpawner.java | ||
index 9ae2bd64514a83dbd8c22cc35a9ca4c39add5142..e85ddf92b4f6f044e2b5834a172f37d78e702ef3 100644 | ||
--- a/src/main/java/net/minecraft/world/level/NaturalSpawner.java | ||
+++ b/src/main/java/net/minecraft/world/level/NaturalSpawner.java | ||
@@ -279,6 +279,11 @@ public final class NaturalSpawner { | ||
|
||
// Paper start | ||
PreSpawnStatus doSpawning = isValidSpawnPostitionForType(world, group, structuremanager, chunkgenerator, biomesettingsmobs_c, blockposition_mutableblockposition, d2); | ||
+ // Paper start - mob count backoff | ||
+ if (doSpawning == PreSpawnStatus.ABORT || doSpawning == PreSpawnStatus.CANCELLED) { | ||
+ world.getChunkSource().chunkMap.updateFailurePlayerMobTypeMap(blockposition_mutableblockposition.getX() >> 4, blockposition_mutableblockposition.getZ() >> 4, group); | ||
+ } | ||
+ // Paper end - mob count backoff | ||
if (doSpawning == PreSpawnStatus.ABORT) { | ||
return j; // Paper | ||
} |
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.