From 94171733ddc21a2fb3fee16d1ec8dd4fac1e5129 Mon Sep 17 00:00:00 2001 From: Aikar Date: Wed, 12 Sep 2018 21:50:34 -0400 Subject: [PATCH] Optimize Biome Mob Lookups for Mob Spawning Uses an EnumMap as well as a Set paired List for O(1) contains calls --- ...e-Biome-Mob-Lookups-for-Mob-Spawning.patch | 80 +++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 Spigot-Server-Patches/0370-Optimize-Biome-Mob-Lookups-for-Mob-Spawning.patch diff --git a/Spigot-Server-Patches/0370-Optimize-Biome-Mob-Lookups-for-Mob-Spawning.patch b/Spigot-Server-Patches/0370-Optimize-Biome-Mob-Lookups-for-Mob-Spawning.patch new file mode 100644 index 0000000000..9f560569b7 --- /dev/null +++ b/Spigot-Server-Patches/0370-Optimize-Biome-Mob-Lookups-for-Mob-Spawning.patch @@ -0,0 +1,80 @@ +From 12b790f4486e8c965077d12175aafeb535bd9388 Mon Sep 17 00:00:00 2001 +From: Aikar +Date: Wed, 12 Sep 2018 21:47:01 -0400 +Subject: [PATCH] Optimize Biome Mob Lookups for Mob Spawning + +Uses an EnumMap as well as a Set paired List for O(1) contains calls. + +diff --git a/src/main/java/net/minecraft/server/BiomeBase.java b/src/main/java/net/minecraft/server/BiomeBase.java +index 66c038784c..b6990a6d7a 100644 +--- a/src/main/java/net/minecraft/server/BiomeBase.java ++++ b/src/main/java/net/minecraft/server/BiomeBase.java +@@ -118,7 +118,7 @@ public abstract class BiomeBase { + protected final Map>> aW = Maps.newHashMap(); + protected final List> aX = Lists.newArrayList(); + protected final Map, WorldGenFeatureConfiguration> aY = Maps.newHashMap(); +- private final Map> aZ = Maps.newHashMap(); ++ private final java.util.EnumMap> aZ = Maps.newEnumMap(EnumCreatureType.class); // Paper + + @Nullable + public static BiomeBase a(BiomeBase biomebase) { +@@ -155,7 +155,7 @@ public abstract class BiomeBase { + } + + for(EnumCreatureType enumcreaturetype : EnumCreatureType.values()) { +- this.aZ.put(enumcreaturetype, Lists.newArrayList()); ++ this.aZ.put(enumcreaturetype, new MobList()); // Paper + } + + } else { +@@ -297,7 +297,7 @@ public abstract class BiomeBase { + public void a(WorldGenStage.Decoration worldgenstage$decoration, ChunkGenerator chunkgenerator, GeneratorAccess generatoraccess, long ix, SeededRandom seededrandom, BlockPosition blockposition) { + int jx = 0; + +- for(WorldGenFeatureComposite worldgenfeaturecomposite : (List)this.aW.get(worldgenstage$decoration)) { ++ for(WorldGenFeatureComposite worldgenfeaturecomposite : this.aW.get(worldgenstage$decoration)) { // Paper - decompile fix + seededrandom.b(ix, jx, worldgenstage$decoration.ordinal()); + worldgenfeaturecomposite.a(generatoraccess, chunkgenerator, seededrandom, blockposition, WorldGenFeatureConfiguration.e); + ++jx; +@@ -459,6 +459,38 @@ public abstract class BiomeBase { + + } + ++ // Paper start - keep track of data in a pair set to give O(1) contains calls - we have to hook removals incase plugins mess with it ++ public static class MobList extends java.util.ArrayList { ++ java.util.Set biomes = new java.util.HashSet<>(); ++ ++ @Override ++ public boolean contains(Object o) { ++ return biomes.contains(o); ++ } ++ ++ @Override ++ public boolean add(BiomeMeta biomeMeta) { ++ biomes.add(biomeMeta); ++ return super.add(biomeMeta); ++ } ++ ++ @Override ++ public BiomeMeta remove(int index) { ++ BiomeMeta removed = super.remove(index); ++ if (removed != null) { ++ biomes.remove(removed); ++ } ++ return removed; ++ } ++ ++ @Override ++ public void clear() { ++ biomes.clear(); ++ super.clear(); ++ } ++ } ++ // Paper end ++ + public static class BiomeMeta extends WeightedRandom.WeightedRandomChoice { + public EntityTypes b; + public int c; +-- +2.18.0 +