mirror of
https://github.com/Winds-Studio/Leaf.git
synced 2025-12-28 19:39:17 +00:00
add config
This commit is contained in:
@@ -57,26 +57,42 @@ index ce2621a87dec1befb016b3437ceb2d02ed6d0b75..c0d941af10ffe8c158dab9db40c7c576
|
||||
|
||||
public static boolean isInNetherFortressBounds(BlockPos pos, ServerLevel level, MobCategory category, StructureManager structureManager) {
|
||||
diff --git a/net/minecraft/world/level/biome/BiomeManager.java b/net/minecraft/world/level/biome/BiomeManager.java
|
||||
index a48175a7ebb1788ace46395621ed78d910178a53..4c0c74b73651cdbc98f0c8f101832e4c23fd0f8d 100644
|
||||
index a48175a7ebb1788ace46395621ed78d910178a53..cb6b99dd4504681bdf2f7dbd7e3d2218304f891a 100644
|
||||
--- a/net/minecraft/world/level/biome/BiomeManager.java
|
||||
+++ b/net/minecraft/world/level/biome/BiomeManager.java
|
||||
@@ -15,6 +15,10 @@ public class BiomeManager {
|
||||
@@ -15,10 +15,23 @@ public class BiomeManager {
|
||||
private final BiomeManager.NoiseBiomeSource noiseBiomeSource;
|
||||
private final long biomeZoomSeed;
|
||||
private static final double maxOffset = 0.4500000001D; // Leaf - Carpet-Fixes - Optimized getBiome method
|
||||
+ // Leaf start - cache getBiome
|
||||
+ private final Holder<Biome>[] biomeCache = new Holder[65536];
|
||||
+ private final long[] biomeCachePos = new long[65536];
|
||||
+ private final Holder<Biome>[] biomeCache;
|
||||
+ private final long[] biomeCachePos;
|
||||
+ // Leaf end - cache getBiome
|
||||
|
||||
public BiomeManager(BiomeManager.NoiseBiomeSource noiseBiomeSource, long biomeZoomSeed) {
|
||||
this.noiseBiomeSource = noiseBiomeSource;
|
||||
@@ -29,6 +33,37 @@ public class BiomeManager {
|
||||
this.biomeZoomSeed = biomeZoomSeed;
|
||||
+ // Leaf start - cache getBiome
|
||||
+ if (org.dreeam.leaf.config.modules.opt.OptimizeBiome.enabled) {
|
||||
+ biomeCache = new Holder[65536];
|
||||
+ biomeCachePos = new long[65536];
|
||||
+ } else {
|
||||
+ biomeCache = null;
|
||||
+ biomeCachePos = null;
|
||||
+ }
|
||||
+ // Leaf end - cache getBiome
|
||||
}
|
||||
|
||||
public static long obfuscateSeed(long seed) {
|
||||
@@ -29,6 +42,40 @@ public class BiomeManager {
|
||||
return new BiomeManager(newSource, this.biomeZoomSeed);
|
||||
}
|
||||
|
||||
+ // Leaf start - cache getBiome
|
||||
+ public Holder<Biome> getBiomeCached(BlockPos pos) {
|
||||
+ if (biomeCache == null) {
|
||||
+ return getBiome(pos);
|
||||
+ }
|
||||
+ int xMinus2 = pos.getX() - 2;
|
||||
+ int yMinus2 = pos.getY() - 2;
|
||||
+ int zMinus2 = pos.getZ() - 2;
|
||||
@@ -109,7 +125,7 @@ index a48175a7ebb1788ace46395621ed78d910178a53..4c0c74b73651cdbc98f0c8f101832e4c
|
||||
public Holder<Biome> getBiome(BlockPos pos) {
|
||||
// Leaf start - Carpet-Fixes - Optimized getBiome method
|
||||
int xMinus2 = pos.getX() - 2;
|
||||
@@ -126,9 +161,18 @@ public class BiomeManager {
|
||||
@@ -126,9 +173,18 @@ public class BiomeManager {
|
||||
return Mth.square(zNoise + fiddle2) + Mth.square(yNoise + fiddle1) + Mth.square(xNoise + fiddle);
|
||||
}
|
||||
|
||||
|
||||
@@ -5,45 +5,27 @@ Subject: [PATCH] optimise NaturalSpawner#spawnForChunk
|
||||
|
||||
|
||||
diff --git a/net/minecraft/world/level/NaturalSpawner.java b/net/minecraft/world/level/NaturalSpawner.java
|
||||
index c0d941af10ffe8c158dab9db40c7c5767b6cfd6e..878eb750f2d2bddae81d9fbfb772d13077b37d51 100644
|
||||
index c0d941af10ffe8c158dab9db40c7c5767b6cfd6e..450f17badaa3f6c8f1cdb9e6dc76828b70afe6fc 100644
|
||||
--- a/net/minecraft/world/level/NaturalSpawner.java
|
||||
+++ b/net/minecraft/world/level/NaturalSpawner.java
|
||||
@@ -156,8 +156,15 @@ public final class NaturalSpawner {
|
||||
}
|
||||
@@ -238,10 +238,13 @@ public final class NaturalSpawner {
|
||||
// Paper end - throttle failed spawn attempts
|
||||
) {
|
||||
// Paper end - Optional per player mob spawns
|
||||
- BlockPos randomPosWithin = getRandomPosWithin(level, chunk);
|
||||
- if (randomPosWithin.getY() >= level.getMinY() + 1) {
|
||||
- return spawnCategoryForPosition(category, level, chunk, randomPosWithin, filter, callback, maxSpawns, trackEntity, false); // Paper - Optional per player mob spawns // Paper - throttle failed spawn attempts
|
||||
+ // Leaf start
|
||||
+ BlockPos.MutableBlockPos pos = new BlockPos.MutableBlockPos();
|
||||
+ mutableRandomPosWithin(pos, level, chunk);
|
||||
+ if (pos.getY() >= level.getMinY() + 1) {
|
||||
+ return spawnCategoryForPosition(category, level, chunk, pos, filter, callback, maxSpawns, trackEntity, false); // Paper - Optional per player mob spawns // Paper - throttle failed spawn attempts
|
||||
}
|
||||
+ // Leaf end
|
||||
|
||||
public static void spawnForChunk(ServerLevel level, LevelChunk chunk, NaturalSpawner.SpawnState spawnState, List<MobCategory> categories) {
|
||||
+ BlockPos.MutableBlockPos pos = new BlockPos.MutableBlockPos(); // Leaf
|
||||
for (MobCategory mobCategory : categories) {
|
||||
// Paper start - Optional per player mob spawns
|
||||
+ // Leaf start - reduce 3/4 while failed 16 canSpawn attempts
|
||||
+ if (chunk.failedSpawnAttempts[mobCategory.ordinal()] >= 16 && (level.random.nextInt(4)) != 0) {
|
||||
+ continue;
|
||||
+ }
|
||||
+ // Leaf end - reduce 3/4 while failed 16 canSpawn attempts
|
||||
+ // Paper start - Optional per player mob attempts
|
||||
final boolean canSpawn;
|
||||
int maxSpawns = Integer.MAX_VALUE;
|
||||
if (level.paperConfig().entities.spawning.perPlayerMobSpawns) {
|
||||
@@ -197,9 +204,16 @@ public final class NaturalSpawner {
|
||||
canSpawn = spawnState.canSpawnForCategoryLocal(mobCategory, chunk.getPos());
|
||||
}
|
||||
if (canSpawn) {
|
||||
+ // Leaf start
|
||||
// Paper start - throttle failed spawn attempts
|
||||
- int spawnCount = spawnCategoryForChunk(mobCategory, level, chunk, spawnState::canSpawn, spawnState::afterSpawn,
|
||||
- maxSpawns, level.paperConfig().entities.spawning.perPlayerMobSpawns ? level.getChunkSource().chunkMap::updatePlayerMobTypeMap : null, false);
|
||||
+ int spawnCount = 0;
|
||||
+ final Consumer<Entity> trackEntity = level.paperConfig().entities.spawning.perPlayerMobSpawns ? level.getChunkSource().chunkMap::updatePlayerMobTypeMap : null;
|
||||
+ // Paper end - Optional per player mob spawns
|
||||
+ mutableRandomPosWithin(pos, level, chunk);
|
||||
+ if (pos.getY() >= level.getMinY() + 1) {
|
||||
+ spawnCount = spawnCategoryForPosition(mobCategory, level, chunk, pos, spawnState::canSpawn, spawnState::afterSpawn, maxSpawns, trackEntity, false);// Paper - Optional per player mob spawns // Paper - throttle failed spawn attempts
|
||||
+ } // Paper - throttle failed spawn attempts
|
||||
+ // Leaf end
|
||||
if (spawnCount == 0) {
|
||||
chunk.failedSpawnAttempts[mobCategory.ordinal()]++;
|
||||
} else {
|
||||
@@ -275,31 +289,60 @@ public final class NaturalSpawner {
|
||||
return 0; // Paper - throttle failed spawn attempts
|
||||
}
|
||||
@@ -275,31 +278,60 @@ public final class NaturalSpawner {
|
||||
StructureManager structureManager = level.structureManager();
|
||||
ChunkGenerator generator = level.getChunkSource().getGenerator();
|
||||
int y = pos.getY();
|
||||
@@ -113,7 +95,7 @@ index c0d941af10ffe8c158dab9db40c7c5767b6cfd6e..878eb750f2d2bddae81d9fbfb772d130
|
||||
if (spawnerData == null) {
|
||||
Optional<MobSpawnSettings.SpawnerData> randomSpawnMobAt = getRandomSpawnMobAt(
|
||||
level, structureManager, generator, category, level.random, mutableBlockPos
|
||||
@@ -368,8 +411,8 @@ public final class NaturalSpawner {
|
||||
@@ -368,8 +400,8 @@ public final class NaturalSpawner {
|
||||
|
||||
private static boolean isRightDistanceToPlayerAndSpawnPoint(ServerLevel level, ChunkAccess chunk, BlockPos.MutableBlockPos pos, double distance) {
|
||||
return !(distance <= 576.0)
|
||||
@@ -124,7 +106,7 @@ index c0d941af10ffe8c158dab9db40c7c5767b6cfd6e..878eb750f2d2bddae81d9fbfb772d130
|
||||
}
|
||||
|
||||
// Paper start - PreCreatureSpawnEvent
|
||||
@@ -474,6 +517,17 @@ public final class NaturalSpawner {
|
||||
@@ -474,6 +506,17 @@ public final class NaturalSpawner {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -5,7 +5,7 @@ Subject: [PATCH] optimize structure map
|
||||
|
||||
|
||||
diff --git a/net/minecraft/world/level/chunk/ChunkAccess.java b/net/minecraft/world/level/chunk/ChunkAccess.java
|
||||
index 50a9903367f49ece2a267d10944b1515c7b93859..db6828ec94682c16b5b7ec6fc6262df256781f01 100644
|
||||
index 50a9903367f49ece2a267d10944b1515c7b93859..ceabb277bef2633de8f55e16431dbb4d0869817b 100644
|
||||
--- a/net/minecraft/world/level/chunk/ChunkAccess.java
|
||||
+++ b/net/minecraft/world/level/chunk/ChunkAccess.java
|
||||
@@ -76,8 +76,8 @@ public abstract class ChunkAccess implements BiomeManager.NoiseBiomeSource, Ligh
|
||||
@@ -24,7 +24,7 @@ index 50a9903367f49ece2a267d10944b1515c7b93859..db6828ec94682c16b5b7ec6fc6262df2
|
||||
|
||||
public Map<Structure, StructureStart> getAllStarts() {
|
||||
- return Collections.unmodifiableMap(this.structureStarts);
|
||||
+ return it.unimi.dsi.fastutil.objects.Object2ObjectMaps.unmodifiable((it.unimi.dsi.fastutil.objects.Object2ObjectArrayMap<Structure, StructureStart>) this.structureStarts); // Leaf
|
||||
+ return this.structureStarts; // Leaf
|
||||
}
|
||||
|
||||
public void setAllStarts(Map<Structure, StructureStart> structureStarts) {
|
||||
@@ -40,7 +40,7 @@ index 50a9903367f49ece2a267d10944b1515c7b93859..db6828ec94682c16b5b7ec6fc6262df2
|
||||
@Override
|
||||
public Map<Structure, LongSet> getAllReferences() {
|
||||
- return Collections.unmodifiableMap(this.structuresRefences);
|
||||
+ return it.unimi.dsi.fastutil.objects.Object2ObjectMaps.unmodifiable((it.unimi.dsi.fastutil.objects.Object2ObjectArrayMap<Structure, LongSet>) this.structuresRefences); // Leaf
|
||||
+ return this.structuresRefences; // Leaf
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -0,0 +1,29 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: hayanesuru <hayanesuru@outlook.jp>
|
||||
Date: Tue, 3 Jun 2025 21:34:25 +0900
|
||||
Subject: [PATCH] throttle mob spawning
|
||||
|
||||
|
||||
diff --git a/net/minecraft/world/level/NaturalSpawner.java b/net/minecraft/world/level/NaturalSpawner.java
|
||||
index 450f17badaa3f6c8f1cdb9e6dc76828b70afe6fc..8db4fd335e661111c52721be2f5ffc65a2c843d2 100644
|
||||
--- a/net/minecraft/world/level/NaturalSpawner.java
|
||||
+++ b/net/minecraft/world/level/NaturalSpawner.java
|
||||
@@ -160,6 +160,18 @@ public final class NaturalSpawner {
|
||||
// Paper start - Optional per player mob spawns
|
||||
final boolean canSpawn;
|
||||
int maxSpawns = Integer.MAX_VALUE;
|
||||
+ // Leaf start
|
||||
+ if (org.dreeam.leaf.config.modules.opt.ThrottleNaturalSpawnMob.enabled) {
|
||||
+ int spawnChance = org.dreeam.leaf.config.modules.opt.ThrottleNaturalSpawnMob.spawnChance[mobCategory.ordinal()];
|
||||
+ long failedAttempt = org.dreeam.leaf.config.modules.opt.ThrottleNaturalSpawnMob.failedAttempts[mobCategory.ordinal()];
|
||||
+ if (failedAttempt >= 0L
|
||||
+ && spawnChance >= 0
|
||||
+ && chunk.failedSpawnAttempts[mobCategory.ordinal()] >= failedAttempt
|
||||
+ && (level.random.nextInt() & 1023) > spawnChance) {
|
||||
+ continue;
|
||||
+ }
|
||||
+ }
|
||||
+ // Leaf end
|
||||
if (level.paperConfig().entities.spawning.perPlayerMobSpawns) {
|
||||
// Copied from getFilteredSpawningCategories
|
||||
int limit = mobCategory.getMaxInstancesPerChunk();
|
||||
@@ -0,0 +1,17 @@
|
||||
package org.dreeam.leaf.config.modules.opt;
|
||||
|
||||
import org.dreeam.leaf.config.ConfigModules;
|
||||
import org.dreeam.leaf.config.EnumConfigCategory;
|
||||
|
||||
public class OptimizeBiome extends ConfigModules {
|
||||
public String getBasePath() {
|
||||
return EnumConfigCategory.PERF.getBaseKeyName() + ".cache-mob-spawning-biome";
|
||||
}
|
||||
|
||||
public static boolean enabled = false;
|
||||
|
||||
@Override
|
||||
public void onLoaded() {
|
||||
enabled = config().getBoolean(getBasePath(), enabled);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,28 @@
|
||||
package org.dreeam.leaf.config.modules.opt;
|
||||
|
||||
import net.minecraft.world.entity.MobCategory;
|
||||
import org.dreeam.leaf.config.ConfigModules;
|
||||
import org.dreeam.leaf.config.EnumConfigCategory;
|
||||
|
||||
public class ThrottleNaturalSpawnMob extends ConfigModules {
|
||||
public String getBasePath() {
|
||||
return EnumConfigCategory.PERF.getBaseKeyName() + ".throttled-mob-spawning";
|
||||
}
|
||||
|
||||
public static boolean enabled = false;
|
||||
public static long[] failedAttempts;
|
||||
public static int[] spawnChance;
|
||||
|
||||
@Override
|
||||
public void onLoaded() {
|
||||
enabled = config.getBoolean(getBasePath() + ".enabled", enabled);
|
||||
MobCategory[] categories = MobCategory.values();
|
||||
failedAttempts = new long[categories.length];
|
||||
spawnChance = new int[categories.length];
|
||||
for (int i = 0; i < categories.length; i++) {
|
||||
String category = getBasePath() + "." + categories[i].getSerializedName();
|
||||
failedAttempts[i] = config.getLong(category + ".failed-attempts", -1);
|
||||
spawnChance[i] = (int) Math.round(config.getDouble(category + ".spawn-chance", 100.0) * 10.24);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user