mirror of
https://github.com/Winds-Studio/Leaf.git
synced 2025-12-30 20:39:21 +00:00
add ignoreSpawnRules to SpawnerSettings
This commit is contained in:
@@ -5,7 +5,7 @@ Subject: [PATCH] Spawner Configurations
|
||||
|
||||
|
||||
diff --git a/net/minecraft/world/level/BaseSpawner.java b/net/minecraft/world/level/BaseSpawner.java
|
||||
index 8c6f8cb08b247dcf497822ae991aa3afbcb784f1..9df9f4308c717db523d3c58e4d8dab7437984d02 100644
|
||||
index 8c6f8cb08b247dcf497822ae991aa3afbcb784f1..fd1c151958ec2535e56d2d04938803d586eeca8e 100644
|
||||
--- a/net/minecraft/world/level/BaseSpawner.java
|
||||
+++ b/net/minecraft/world/level/BaseSpawner.java
|
||||
@@ -53,6 +53,12 @@ public abstract class BaseSpawner {
|
||||
@@ -58,7 +58,7 @@ index 8c6f8cb08b247dcf497822ae991aa3afbcb784f1..9df9f4308c717db523d3c58e4d8dab74
|
||||
if (this.isNearPlayer(serverLevel, pos)) {
|
||||
if (this.spawnDelay < -tickDelay) { // Paper - Configurable mob spawner tick rate
|
||||
this.delay(serverLevel, pos);
|
||||
@@ -107,18 +136,43 @@ public abstract class BaseSpawner {
|
||||
@@ -107,18 +136,49 @@ public abstract class BaseSpawner {
|
||||
double d = size >= 1 ? list.getDouble(0) : pos.getX() + (random.nextDouble() - random.nextDouble()) * this.spawnRange + 0.5;
|
||||
double d1 = size >= 2 ? list.getDouble(1) : pos.getY() + random.nextInt(3) - 1;
|
||||
double d2 = size >= 3 ? list.getDouble(2) : pos.getZ() + (random.nextDouble() - random.nextDouble()) * this.spawnRange + 0.5;
|
||||
@@ -69,8 +69,11 @@ index 8c6f8cb08b247dcf497822ae991aa3afbcb784f1..9df9f4308c717db523d3c58e4d8dab74
|
||||
+ boolean skipBlockChecks = org.dreeam.leaf.config.modules.gameplay.SpawnerSettings.enabled &&
|
||||
+ !org.dreeam.leaf.config.modules.gameplay.SpawnerSettings.spawnerBlockChecks;
|
||||
+ if (skipBlockChecks || serverLevel.noCollision(optional.get().getSpawnAABB(d, d1, d2))) {
|
||||
BlockPos blockPos = BlockPos.containing(d, d1, d2);
|
||||
+ // 'skipBlockChecks' is true if SpawnerSettings.spawnerBlockChecks is false.
|
||||
+ // It means we skip physical block checks like collision and custom rule isValidPosition.
|
||||
+
|
||||
BlockPos blockPos = BlockPos.containing(d, d1, d2);
|
||||
+
|
||||
+ // Add light level check if enabled
|
||||
+ if (org.dreeam.leaf.config.modules.gameplay.SpawnerSettings.enabled &&
|
||||
+ org.dreeam.leaf.config.modules.gameplay.SpawnerSettings.lightLevelCheck) {
|
||||
@@ -87,8 +90,9 @@ index 8c6f8cb08b247dcf497822ae991aa3afbcb784f1..9df9f4308c717db523d3c58e4d8dab74
|
||||
+ continue;
|
||||
+ }
|
||||
+
|
||||
+ // Handle spawn rules checks
|
||||
+ boolean skipSpawnRules = false;
|
||||
+ // Determine if mob-specific spawn rules (like block types, biome requirements) should be skipped
|
||||
+ boolean skipMobSpecificRules = org.dreeam.leaf.config.modules.gameplay.SpawnerSettings.enabled &&
|
||||
+ org.dreeam.leaf.config.modules.gameplay.SpawnerSettings.ignoreSpawnRules;
|
||||
+ // Leaf end - Spawner Configurations
|
||||
if (nextSpawnData.getCustomSpawnRules().isPresent()) {
|
||||
if (!optional.get().getCategory().isFriendly() && serverLevel.getDifficulty() == Difficulty.PEACEFUL) {
|
||||
@@ -97,15 +101,17 @@ index 8c6f8cb08b247dcf497822ae991aa3afbcb784f1..9df9f4308c717db523d3c58e4d8dab74
|
||||
|
||||
SpawnData.CustomSpawnRules customSpawnRules = nextSpawnData.getCustomSpawnRules().get();
|
||||
- if (!customSpawnRules.isValidPosition(blockPos, serverLevel)) {
|
||||
+ // customSpawnRules.isValidPosition is controlled by spawnerBlockChecks (via !skipBlockChecks)
|
||||
+ if (!skipBlockChecks && !customSpawnRules.isValidPosition(blockPos, serverLevel)) { // Leaf - Spawner Configurations
|
||||
continue;
|
||||
}
|
||||
- } else if (!SpawnPlacements.checkSpawnRules(optional.get(), serverLevel, EntitySpawnReason.SPAWNER, blockPos, serverLevel.getRandom())) {
|
||||
+ } else if (!skipBlockChecks && !SpawnPlacements.checkSpawnRules(optional.get(), serverLevel, EntitySpawnReason.SPAWNER, blockPos, serverLevel.getRandom())) { // Leaf - Spawner Configurations
|
||||
+ } else if (!skipMobSpecificRules && !SpawnPlacements.checkSpawnRules(optional.get(), serverLevel, EntitySpawnReason.SPAWNER, blockPos, serverLevel.getRandom())) {
|
||||
+ // If not skipping mob-specific rules AND standard spawn rules fail, continue.
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -146,6 +200,7 @@ public abstract class BaseSpawner {
|
||||
@@ -146,6 +206,7 @@ public abstract class BaseSpawner {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -113,7 +119,7 @@ index 8c6f8cb08b247dcf497822ae991aa3afbcb784f1..9df9f4308c717db523d3c58e4d8dab74
|
||||
int size1 = serverLevel.getEntities(
|
||||
EntityTypeTest.forExactClass(entity.getClass()),
|
||||
new AABB(pos.getX(), pos.getY(), pos.getZ(), pos.getX() + 1, pos.getY() + 1, pos.getZ() + 1).inflate(this.spawnRange),
|
||||
@@ -156,12 +211,16 @@ public abstract class BaseSpawner {
|
||||
@@ -156,12 +217,28 @@ public abstract class BaseSpawner {
|
||||
this.delay(serverLevel, pos);
|
||||
return;
|
||||
}
|
||||
@@ -125,14 +131,26 @@ index 8c6f8cb08b247dcf497822ae991aa3afbcb784f1..9df9f4308c717db523d3c58e4d8dab74
|
||||
- if (nextSpawnData.getCustomSpawnRules().isEmpty() && !mob.checkSpawnRules(serverLevel, EntitySpawnReason.SPAWNER)
|
||||
- || !mob.checkSpawnObstruction(serverLevel)) {
|
||||
+ // Leaf start - Spawner Configurations
|
||||
+ // Skip spawn rule and obstruction checks if block checks are disabled
|
||||
+ if (!skipBlockChecks && (nextSpawnData.getCustomSpawnRules().isEmpty() && !mob.checkSpawnRules(serverLevel, EntitySpawnReason.SPAWNER)
|
||||
+ || !mob.checkSpawnObstruction(serverLevel))) {
|
||||
+ // Leaf end - Spawner Configurations
|
||||
+ // mob.checkSpawnRules is controlled by ignoreSpawnRules (via !skipMobSpecificRules)
|
||||
+ // mob.checkSpawnObstruction is controlled by spawnerBlockChecks (via !skipBlockChecks)
|
||||
+
|
||||
+ boolean mobSpecificRulesFailed = false;
|
||||
+ if (nextSpawnData.getCustomSpawnRules().isEmpty() && !skipMobSpecificRules) {
|
||||
+ if (!mob.checkSpawnRules(serverLevel, EntitySpawnReason.SPAWNER)) {
|
||||
+ mobSpecificRulesFailed = true;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ boolean obstructionFailed = false;
|
||||
+ if (!skipBlockChecks && !mob.checkSpawnObstruction(serverLevel)) { // If not skipping physical checks and obstruction fails
|
||||
+ obstructionFailed = true;
|
||||
+ }
|
||||
+
|
||||
+ if (mobSpecificRulesFailed || obstructionFailed) {
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -249,6 +308,13 @@ public abstract class BaseSpawner {
|
||||
@@ -249,6 +326,13 @@ public abstract class BaseSpawner {
|
||||
this.spawnPotentials = SimpleWeightedRandomList.single(this.nextSpawnData != null ? this.nextSpawnData : new SpawnData());
|
||||
}
|
||||
|
||||
|
||||
@@ -18,6 +18,7 @@ public class SpawnerSettings extends ConfigModules {
|
||||
public static boolean checkForNearbyPlayers = true;
|
||||
public static boolean spawnerBlockChecks = false;
|
||||
public static boolean waterPreventSpawnCheck = false;
|
||||
public static boolean ignoreSpawnRules = false;
|
||||
|
||||
public static int minSpawnDelay = 200;
|
||||
public static int maxSpawnDelay = 800;
|
||||
@@ -60,8 +61,8 @@ public class SpawnerSettings extends ConfigModules {
|
||||
|
||||
spawnerBlockChecks = config.getBoolean(getBasePath() + ".checks.spawner-block-checks", spawnerBlockChecks,
|
||||
config.pickStringRegionBased(
|
||||
"Check if there are blocks blocking the spawner to spawn the mob",
|
||||
"检查是否有方块阻挡刷怪笼生成怪物"
|
||||
"Check if there are physical blocks obstructing the spawn location, or if custom spawn rules (isValidPosition) fail due to block conditions.",
|
||||
"检查是否有物理方块阻挡生成位置, 或自定义生成规则(isValidPosition)因方块条件失败."
|
||||
));
|
||||
|
||||
waterPreventSpawnCheck = config.getBoolean(getBasePath() + ".checks.water-prevent-spawn-check", waterPreventSpawnCheck,
|
||||
@@ -70,6 +71,12 @@ public class SpawnerSettings extends ConfigModules {
|
||||
"检查周围是否有水阻止生成"
|
||||
));
|
||||
|
||||
ignoreSpawnRules = config.getBoolean(getBasePath() + ".checks.ignore-spawn-rules", ignoreSpawnRules,
|
||||
config.pickStringRegionBased(
|
||||
"Ignore mob-specific spawn rules, like animals needing grass or specific biomes/blocks (does not affect light level or physical obstruction checks).",
|
||||
"忽略特定于生物的生成规则, 例如动物需要草方块或特定的生物群系/方块 (不影响光照等级或物理障碍物检查)."
|
||||
));
|
||||
|
||||
// Delay settings
|
||||
|
||||
minSpawnDelay = config.getInt(getBasePath() + ".min-spawn-delay", minSpawnDelay,
|
||||
|
||||
Reference in New Issue
Block a user