diff --git a/patches/server/0055-Implement-configurable-search-radius-for-villagers-t.patch b/patches/server/0055-Implement-configurable-search-radius-for-villagers-t.patch index 56a1b45ea..d717da062 100644 --- a/patches/server/0055-Implement-configurable-search-radius-for-villagers-t.patch +++ b/patches/server/0055-Implement-configurable-search-radius-for-villagers-t.patch @@ -1,4 +1,4 @@ -From b0e936f3b1898320af6de97e05c0e7c9eb2c163e Mon Sep 17 00:00:00 2001 +From 9d2c3b412daedf083676cd1ff5087ece29bcb6fc Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Mon, 22 Jul 2019 17:32:17 -0500 Subject: [PATCH] Implement configurable search radius for villagers to spawn diff --git a/patches/server/0056-Implement-lagging-threshold.patch b/patches/server/0056-Implement-lagging-threshold.patch index 1b3f6859e..8ea63a564 100644 --- a/patches/server/0056-Implement-lagging-threshold.patch +++ b/patches/server/0056-Implement-lagging-threshold.patch @@ -1,4 +1,4 @@ -From e20a8875da1fd27d1a92a487e81a79efa9392f75 Mon Sep 17 00:00:00 2001 +From 79e256f34314e8e2de5949c4e4c91a3634274e21 Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Tue, 23 Jul 2019 10:07:16 -0500 Subject: [PATCH] Implement lagging threshold @@ -30,7 +30,7 @@ index f8da3a77da..af37c943e7 100644 tickSection = curTime; } diff --git a/src/main/java/net/pl3x/purpur/PurpurConfig.java b/src/main/java/net/pl3x/purpur/PurpurConfig.java -index db98610520..6f97d26cb8 100644 +index b3eb71fdb4..2e81da63ba 100644 --- a/src/main/java/net/pl3x/purpur/PurpurConfig.java +++ b/src/main/java/net/pl3x/purpur/PurpurConfig.java @@ -136,6 +136,11 @@ public class PurpurConfig { diff --git a/patches/server/0057-Implement-configurable-villager-brain-ticks.patch b/patches/server/0057-Implement-configurable-villager-brain-ticks.patch index 28a1bf742..866a3e3a9 100644 --- a/patches/server/0057-Implement-configurable-villager-brain-ticks.patch +++ b/patches/server/0057-Implement-configurable-villager-brain-ticks.patch @@ -1,4 +1,4 @@ -From b42e47629d65fc5fef17091dc5f310f5cbeaf1ab Mon Sep 17 00:00:00 2001 +From c189a5bd5351849938ff12f6860fd18ab22c7adc Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Tue, 23 Jul 2019 08:28:21 -0500 Subject: [PATCH] Implement configurable villager brain ticks @@ -40,7 +40,7 @@ index 0800788e5b..2c45661386 100644 this.world.getMethodProfiler().exit(); if (!this.dY() && this.bE > 0) { diff --git a/src/main/java/net/pl3x/purpur/PurpurConfig.java b/src/main/java/net/pl3x/purpur/PurpurConfig.java -index 6f97d26cb8..a0bd985833 100644 +index 2e81da63ba..3569542b3c 100644 --- a/src/main/java/net/pl3x/purpur/PurpurConfig.java +++ b/src/main/java/net/pl3x/purpur/PurpurConfig.java @@ -211,6 +211,13 @@ public class PurpurConfig { diff --git a/patches/server/0058-Implement-elytra-settings.patch b/patches/server/0058-Implement-elytra-settings.patch index a79629d0a..893fe2441 100644 --- a/patches/server/0058-Implement-elytra-settings.patch +++ b/patches/server/0058-Implement-elytra-settings.patch @@ -1,4 +1,4 @@ -From 8fe170dadbfa162a96bce3f144e17eaa07c09c2c Mon Sep 17 00:00:00 2001 +From a7df7ee02f9e66f02dcba7660a5151e8eea0717a Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Thu, 25 Jul 2019 18:07:37 -0500 Subject: [PATCH] Implement elytra settings diff --git a/patches/server/0059-Better-server-sleeping-waiting.patch b/patches/server/0059-Better-server-sleeping-waiting.patch index 4fc9aadf6..c27f753d8 100644 --- a/patches/server/0059-Better-server-sleeping-waiting.patch +++ b/patches/server/0059-Better-server-sleeping-waiting.patch @@ -1,4 +1,4 @@ -From 84a3bcdb0c169415617c66653dcae9432e40d3d4 Mon Sep 17 00:00:00 2001 +From c3af754aac95a1dab57a6c4af0f01dc6822de186 Mon Sep 17 00:00:00 2001 From: Spottedleaf Date: Sat, 20 Jul 2019 15:20:04 -0700 Subject: [PATCH] Better server sleeping/waiting diff --git a/patches/server/0060-Rate-limit-packets-incoming-from-players.patch b/patches/server/0060-Rate-limit-packets-incoming-from-players.patch index eba4309d8..2151f06a5 100644 --- a/patches/server/0060-Rate-limit-packets-incoming-from-players.patch +++ b/patches/server/0060-Rate-limit-packets-incoming-from-players.patch @@ -1,4 +1,4 @@ -From 3bb66bffba108f87d54f038adff9f73652ef6425 Mon Sep 17 00:00:00 2001 +From 74b36f2305ac80610cb923a841f4411f3999a430 Mon Sep 17 00:00:00 2001 From: Spottedleaf Date: Mon, 11 Mar 2019 12:18:29 -0700 Subject: [PATCH] Rate limit packets incoming from players diff --git a/patches/server/0061-Add-option-to-disable-pillager-patrols.patch b/patches/server/0061-Add-option-to-disable-pillager-patrols.patch index 06c00968f..52eb20aee 100644 --- a/patches/server/0061-Add-option-to-disable-pillager-patrols.patch +++ b/patches/server/0061-Add-option-to-disable-pillager-patrols.patch @@ -1,4 +1,4 @@ -From 98545d3bf632e6a1938fe8833611943f761c46a3 Mon Sep 17 00:00:00 2001 +From 96e65150a1dc77f3d5e9e5f0c774ce24dd91b2ad Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Sat, 27 Jul 2019 17:20:35 -0500 Subject: [PATCH] Add option to disable pillager patrols @@ -21,7 +21,7 @@ index bb612b3861..99bb38f033 100644 return 0; } else { diff --git a/src/main/java/net/pl3x/purpur/PurpurConfig.java b/src/main/java/net/pl3x/purpur/PurpurConfig.java -index a0bd985833..bf8a9f30c8 100644 +index 3569542b3c..de5b014be0 100644 --- a/src/main/java/net/pl3x/purpur/PurpurConfig.java +++ b/src/main/java/net/pl3x/purpur/PurpurConfig.java @@ -204,6 +204,11 @@ public class PurpurConfig { diff --git a/patches/server/0062-Add-5-second-tps-average-in-tps.patch b/patches/server/0062-Add-5-second-tps-average-in-tps.patch index 9def5a503..801fd75a6 100644 --- a/patches/server/0062-Add-5-second-tps-average-in-tps.patch +++ b/patches/server/0062-Add-5-second-tps-average-in-tps.patch @@ -1,4 +1,4 @@ -From 55b239d2c5ce869c390f2778c8189f9daa03d1f1 Mon Sep 17 00:00:00 2001 +From ab9996cd24a955a6dc0149de4ddc06e825c271f2 Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Sun, 28 Jul 2019 01:27:37 -0500 Subject: [PATCH] Add 5 second tps average in /tps diff --git a/patches/server/0063-implement-optional-per-player-mob-spawns.patch b/patches/server/0063-implement-optional-per-player-mob-spawns.patch new file mode 100644 index 000000000..216420f8d --- /dev/null +++ b/patches/server/0063-implement-optional-per-player-mob-spawns.patch @@ -0,0 +1,255 @@ +From 0b8e834d7e7521806c55671591c93ea868c7db4e Mon Sep 17 00:00:00 2001 +From: kickash32 +Date: Tue, 11 Jun 2019 22:22:16 -0400 +Subject: [PATCH] implement optional per player mob spawns + +--- + .../destroystokyo/paper/PaperWorldConfig.java | 5 +++ + .../minecraft/server/ChunkProviderServer.java | 16 +++++++-- + .../net/minecraft/server/EntityTypes.java | 1 + + .../net/minecraft/server/PlayerChunkMap.java | 5 +-- + .../net/minecraft/server/SpawnerCreature.java | 27 +++++++------- + .../net/minecraft/server/WorldServer.java | 36 +++++++++++++++++++ + 6 files changed, 72 insertions(+), 18 deletions(-) + +diff --git a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java +index 318a470eea..72b77e27e8 100644 +--- a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java ++++ b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java +@@ -509,6 +509,11 @@ public class PaperWorldConfig { + maxAutoSaveChunksPerTick = getInt("max-auto-save-chunks-per-tick", 24); + } + ++ public boolean perPlayerMobSpawns = false; ++ private void perPlayerMobSpawns() { ++ perPlayerMobSpawns = getBoolean("per-player-mob-spawns", false); ++ } ++ + public boolean countAllMobsForSpawning = false; + private void countAllMobsForSpawning() { + countAllMobsForSpawning = getBoolean("count-all-mobs-for-spawning", false); +diff --git a/src/main/java/net/minecraft/server/ChunkProviderServer.java b/src/main/java/net/minecraft/server/ChunkProviderServer.java +index b1bea8f90d..d92446d79b 100644 +--- a/src/main/java/net/minecraft/server/ChunkProviderServer.java ++++ b/src/main/java/net/minecraft/server/ChunkProviderServer.java +@@ -601,9 +601,21 @@ public class ChunkProviderServer extends IChunkProvider { + // Paper start - only allow spawns upto the limit per chunk and update count afterwards + int currEntityCount = object2intmap.getInt(enumcreaturetype); + int difference = k1 - currEntityCount; ++ if(this.world.paperConfig.perPlayerMobSpawns){ ++ final int[] min = {Integer.MAX_VALUE}; ++ final int finalLimit = limit; ++ playerChunkMap.getPlayersNear(chunk.getPos()) ++ .forEach((entityplayer) -> min[0] = Math.min( ++ finalLimit - ((WorldServer)chunk.getWorld()).getMobCountNear(entityplayer, enumcreaturetype), ++ min[0])); ++ difference = (min[0] == Integer.MAX_VALUE) ? 0 : min[0]; ++ } ++ + if (difference > 0) { +- object2intmap.put(enumcreaturetype, currEntityCount + SpawnerCreature.spawnMobs(enumcreaturetype, world, chunk, blockposition, difference)); +- // Paper end ++ List spawned = SpawnerCreature.spawnMobs(enumcreaturetype, this.world, chunk, blockposition, difference); ++ object2intmap.put(enumcreaturetype, currEntityCount + spawned.size()); ++ this.world.updatePlayerMobTypeMap(spawned); ++ // Paper end + } + } + } +diff --git a/src/main/java/net/minecraft/server/EntityTypes.java b/src/main/java/net/minecraft/server/EntityTypes.java +index d92fbea4c7..f9bc2ab66e 100644 +--- a/src/main/java/net/minecraft/server/EntityTypes.java ++++ b/src/main/java/net/minecraft/server/EntityTypes.java +@@ -267,6 +267,7 @@ public class EntityTypes { + return this.be; + } + ++ public EnumCreatureType getEnumCreatureType(){ return this.e(); } // Paper - OBFHELPER + public EnumCreatureType e() { + return this.ba; + } +diff --git a/src/main/java/net/minecraft/server/PlayerChunkMap.java b/src/main/java/net/minecraft/server/PlayerChunkMap.java +index 4c774e31dc..ebf0298631 100644 +--- a/src/main/java/net/minecraft/server/PlayerChunkMap.java ++++ b/src/main/java/net/minecraft/server/PlayerChunkMap.java +@@ -137,6 +137,7 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d { + this.setViewDistance(i); + } + ++ private static double squareDist(ChunkCoordIntPair chunkcoord, Entity entity) { return a(chunkcoord, entity); } // Paper - OBFHELPER + private static double a(ChunkCoordIntPair chunkcoordintpair, Entity entity) { + double d0 = (double) (chunkcoordintpair.x * 16 + 8); + double d1 = (double) (chunkcoordintpair.z * 16 + 8); +@@ -1340,8 +1341,8 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d { + + } + +- @Override +- public Stream a(ChunkCoordIntPair chunkcoordintpair, boolean flag) { ++ public Stream getPlayersNear(ChunkCoordIntPair coordIntPair) { return a(coordIntPair, false); } // Paper - OBFHELPER ++ @Override public Stream a(ChunkCoordIntPair chunkcoordintpair, boolean flag) { + return this.playerMap.a(chunkcoordintpair.pair()).filter((entityplayer) -> { + int i = b(chunkcoordintpair, entityplayer, true); + +diff --git a/src/main/java/net/minecraft/server/SpawnerCreature.java b/src/main/java/net/minecraft/server/SpawnerCreature.java +index 78bed1ca7e..0524bb2a86 100644 +--- a/src/main/java/net/minecraft/server/SpawnerCreature.java ++++ b/src/main/java/net/minecraft/server/SpawnerCreature.java +@@ -20,16 +20,15 @@ public final class SpawnerCreature { + public static void a(EnumCreatureType enumcreaturetype, World world, Chunk chunk, BlockPosition blockposition) { + spawnMobs(enumcreaturetype, world, chunk, blockposition, Integer.MAX_VALUE); + } +- +- public static int spawnMobs(EnumCreatureType enumcreaturetype, World world, Chunk chunk, BlockPosition blockposition, int maxSpawns) { +- // Paper end ++ public static List spawnMobs(EnumCreatureType enumcreaturetype, World world, Chunk chunk, BlockPosition blockposition, int maxSpawns) { ++ List mobsSpawned = new java.util.ArrayList<>(); ++ // Paper end + ChunkGenerator chunkgenerator = world.getChunkProvider().getChunkGenerator(); + int i = 0; + BlockPosition blockposition1 = getRandomPosition(world, chunk); + int j = blockposition1.getX(); + int k = blockposition1.getY(); + int l = blockposition1.getZ(); +- int amountSpawned = 0; // Paper - keep track of mobs spawned + + if (k >= 1) { + IBlockData iblockdata = world.getTypeIfLoadedAndInBounds(blockposition1); // Paper - don't load chunks for mob spawn +@@ -84,15 +83,15 @@ public final class SpawnerCreature { + // Purpur start + if (entitytypes == EntityTypes.GIANT) { + if (!net.pl3x.purpur.PurpurConfig.giantsNaturallySpawn) { +- return amountSpawned; ++ return mobsSpawned; + } + } else if (entitytypes == EntityTypes.ILLUSIONER) { + if (!net.pl3x.purpur.PurpurConfig.illusionersNaturallySpawn) { +- return amountSpawned; ++ return mobsSpawned; + } + } else if (entitytypes == EntityTypes.PHANTOM) { + if (!net.pl3x.purpur.PurpurConfig.spawnPhantomsInTheEnd) { +- return amountSpawned; ++ return mobsSpawned; + } + blockposition_mutableblockposition.y = 70 + world.random.nextInt(20); + } +@@ -115,7 +114,7 @@ public final class SpawnerCreature { + ); + if (!event.callEvent()) { + if (event.shouldAbortSpawn()) { +- return amountSpawned; // Paper ++ return mobsSpawned; // Paper + } + ++i2; + continue; +@@ -134,7 +133,7 @@ public final class SpawnerCreature { + } catch (Exception exception) { + SpawnerCreature.LOGGER.warn("Failed to create mob", exception); + ServerInternalException.reportInternalException(exception); // Paper +- return amountSpawned; // Paper ++ return mobsSpawned; // Paper + } + + entityinsentient.setPositionRotation((double) f, (double) k, (double) f1, world.random.nextFloat() * 360.0F, 0.0F); +@@ -145,15 +144,15 @@ public final class SpawnerCreature { + ++i; + ++i2; + // Paper start - stop when limit is reached +- ++amountSpawned; ++ mobsSpawned.add(entityinsentient); + } +- if (amountSpawned >= maxSpawns) { +- return amountSpawned; ++ if (mobsSpawned.size() >= maxSpawns) { ++ return mobsSpawned; + } + // Paper end + // CraftBukkit end + if (i >= entityinsentient.dC()) { +- return amountSpawned; // Paper ++ return mobsSpawned; // Paper + } + + if (entityinsentient.c(i2)) { +@@ -179,7 +178,7 @@ public final class SpawnerCreature { + + } + } +- return amountSpawned; // Paper ++ return mobsSpawned; // Paper + } + + @Nullable +diff --git a/src/main/java/net/minecraft/server/WorldServer.java b/src/main/java/net/minecraft/server/WorldServer.java +index ba4f7999f9..38768a5002 100644 +--- a/src/main/java/net/minecraft/server/WorldServer.java ++++ b/src/main/java/net/minecraft/server/WorldServer.java +@@ -70,6 +70,7 @@ public class WorldServer extends World { + private boolean ticking; + @Nullable + private final MobSpawnerTrader mobSpawnerTrader; ++ private Map> playerMobTypeMap; // Paper + + // CraftBukkit start + private int tickPosition; +@@ -966,6 +967,7 @@ public class WorldServer extends World { + } + + public Object2IntMap l() { ++ List filteredEntities = new java.util.ArrayList<>(); // Paper + Object2IntMap object2intmap = new Object2IntOpenHashMap(); + ObjectIterator objectiterator = this.entitiesById.values().iterator(); + +@@ -990,14 +992,48 @@ public class WorldServer extends World { + entity.spawnReason == CreatureSpawnEvent.SpawnReason.CHUNK_GEN)) { + continue; + } ++ filteredEntities.add(entity); // Paper + // Paper end + object2intmap.mergeInt(enumcreaturetype, 1, Integer::sum); + } + } + ++ // Paper start ++ if(this.paperConfig.perPlayerMobSpawns) { ++ this.playerMobTypeMap = new java.util.HashMap<>(this.players.size()); ++ updatePlayerMobTypeMap(filteredEntities); ++ } ++ // Paper end + return object2intmap; + } + ++ // Paper start ++ public void updatePlayerMobTypeMap(List entities) { ++ if (this.playerMobTypeMap == null) { return; } ++ for (Entity entity : entities) { ++ ((ChunkProviderServer) this.chunkProvider).playerChunkMap.getPlayersNear(entity.getChunkAtLocation().getPos()).forEach( (player) -> { ++ if (!this.playerMobTypeMap.containsKey(player.uniqueID)) { this.playerMobTypeMap.put(player.uniqueID, new java.util.EnumMap<>(EnumCreatureType.class)); } ++ Map tmpMap = this.playerMobTypeMap.get(player.uniqueID); ++ EnumCreatureType enumType = entity.getEntityType().getEnumCreatureType(); ++ tmpMap.put( ++ enumType, ++ tmpMap.getOrDefault(enumType, 0) + 1); ++ }); ++ } ++ } ++ ++ public int getMobCountNear(EntityPlayer entityPlayer, EnumCreatureType enumCreatureType) { ++ int count = 0; ++ if (this.playerMobTypeMap != null) { ++ Map map = this.playerMobTypeMap.get(entityPlayer.uniqueID); ++ if (map != null) { ++ count = map.getOrDefault(enumCreatureType, 0); ++ } ++ } ++ return count; ++ } ++ // Paper end ++ + @Override + public boolean addEntity(Entity entity) { + // CraftBukkit start +-- +2.20.1 +