mirror of
https://github.com/LeavesMC/Leaves.git
synced 2025-12-19 14:59:32 +00:00
101 lines
6.0 KiB
Diff
101 lines
6.0 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: violetc <58360096+s-yh-china@users.noreply.github.com>
|
|
Date: Thu, 3 Aug 2023 14:21:47 +0800
|
|
Subject: [PATCH] Force peaceful mode switch
|
|
|
|
|
|
diff --git a/net/minecraft/server/level/ServerChunkCache.java b/net/minecraft/server/level/ServerChunkCache.java
|
|
index 59e8a5e1b35c81883c9b1ca00c6e55d77584d8cc..1e6f7c0997efdeb06dbf1450b3d7f5f4ecc4072c 100644
|
|
--- a/net/minecraft/server/level/ServerChunkCache.java
|
|
+++ b/net/minecraft/server/level/ServerChunkCache.java
|
|
@@ -184,6 +184,12 @@ public class ServerChunkCache extends ChunkSource implements ca.spottedleaf.moon
|
|
}
|
|
// Paper end - chunk tick iteration optimisations
|
|
|
|
+ // Leaves start - peaceful mode switch
|
|
+ public int peacefulModeSwitchTick = org.leavesmc.leaves.LeavesConfig.modify.peacefulModeSwitch.tick;
|
|
+ public Set<Class<? extends Entity>> peacefulModeSwitchEntityTypes = org.leavesmc.leaves.LeavesConfig.modify.peacefulModeSwitch.classTypes;
|
|
+ public int peacefulModeSwitchCount = -1;
|
|
+ // Leaves end - peaceful mode switch
|
|
+
|
|
|
|
public ServerChunkCache(
|
|
ServerLevel level,
|
|
@@ -512,6 +518,20 @@ public class ServerChunkCache extends ChunkSource implements ca.spottedleaf.moon
|
|
this.lastInhabitedUpdate = gameTime;
|
|
if (!this.level.isDebug()) {
|
|
ProfilerFiller profilerFiller = Profiler.get();
|
|
+ // Leaves start - peaceful mode switch
|
|
+ if (peacefulModeSwitchTick > 0) {
|
|
+ if (this.level.getLevelData().getGameTime() % peacefulModeSwitchTick == 0) {
|
|
+ peacefulModeSwitchCount = 0;
|
|
+ this.level.getAllEntities().forEach(entity -> {
|
|
+ if (peacefulModeSwitchEntityTypes.contains(entity.getClass())) {
|
|
+ peacefulModeSwitchCount++;
|
|
+ }
|
|
+ });
|
|
+ }
|
|
+ } else {
|
|
+ peacefulModeSwitchCount = -1;
|
|
+ }
|
|
+ // Leaves end - peaceful mode switch
|
|
profilerFiller.push("pollingChunks");
|
|
if (this.level.tickRateManager().runsNormally()) {
|
|
profilerFiller.push("tickingChunks");
|
|
@@ -568,6 +588,14 @@ public class ServerChunkCache extends ChunkSource implements ca.spottedleaf.moon
|
|
boolean _boolean = this.level.getGameRules().getBoolean(GameRules.RULE_DOMOBSPAWNING) && !this.level.players().isEmpty(); // CraftBukkit
|
|
int _int = this.level.getGameRules().getInt(GameRules.RULE_RANDOMTICKING);
|
|
List<MobCategory> filteredSpawningCategories;
|
|
+ // Leaves start - peaceful mode switch
|
|
+ boolean peacefulModeSwitch = false;
|
|
+ if (lastSpawnState != null && peacefulModeSwitchCount != -1) {
|
|
+ if (peacefulModeSwitchCount >= NaturalSpawner.globalLimitForCategory(level, net.minecraft.world.entity.MobCategory.MONSTER, lastSpawnState.getSpawnableChunkCount())) {
|
|
+ peacefulModeSwitch = true;
|
|
+ }
|
|
+ }
|
|
+ // Leaves end - peaceful mode switch
|
|
if (_boolean && (this.spawnEnemies || this.spawnFriendlies)) {
|
|
// Paper start - PlayerNaturallySpawnCreaturesEvent
|
|
for (ServerPlayer entityPlayer : this.level.players()) {
|
|
@@ -578,7 +606,7 @@ public class ServerChunkCache extends ChunkSource implements ca.spottedleaf.moon
|
|
}
|
|
// Paper end - PlayerNaturallySpawnCreaturesEvent
|
|
boolean flag = this.level.ticksPerSpawnCategory.getLong(org.bukkit.entity.SpawnCategory.ANIMAL) != 0L && this.level.getLevelData().getGameTime() % this.level.ticksPerSpawnCategory.getLong(org.bukkit.entity.SpawnCategory.ANIMAL) == 0L; // CraftBukkit
|
|
- filteredSpawningCategories = NaturalSpawner.getFilteredSpawningCategories(spawnState, this.spawnFriendlies, this.spawnEnemies, flag, this.level); // CraftBukkit
|
|
+ filteredSpawningCategories = NaturalSpawner.getFilteredSpawningCategories(spawnState, this.spawnFriendlies, this.spawnEnemies, flag, this.level, peacefulModeSwitch); // CraftBukkit Leaves start - peaceful mode switch
|
|
} else {
|
|
filteredSpawningCategories = List.of();
|
|
}
|
|
diff --git a/net/minecraft/world/level/NaturalSpawner.java b/net/minecraft/world/level/NaturalSpawner.java
|
|
index 5427f5e1f0416a8dfa3e9c38c3ce69d6e2bd37a6..acfecf37c6e3efc21d7f2194d9efed79146b1f1d 100644
|
|
--- a/net/minecraft/world/level/NaturalSpawner.java
|
|
+++ b/net/minecraft/world/level/NaturalSpawner.java
|
|
@@ -116,16 +116,26 @@ public final class NaturalSpawner {
|
|
static Biome getRoughBiome(BlockPos pos, ChunkAccess chunk) {
|
|
return chunk.getNoiseBiome(QuartPos.fromBlock(pos.getX()), QuartPos.fromBlock(pos.getY()), QuartPos.fromBlock(pos.getZ())).value();
|
|
}
|
|
-
|
|
+ // Leaves start - peaceful mode switch
|
|
// CraftBukkit start - add server
|
|
public static List<MobCategory> getFilteredSpawningCategories(
|
|
NaturalSpawner.SpawnState spawnState, boolean spawnFriendlies, boolean spawnEnemies, boolean spawnPassives, ServerLevel level
|
|
) {
|
|
+ return getFilteredSpawningCategories(spawnState, spawnFriendlies, spawnEnemies, spawnPassives, level, false);
|
|
+ }
|
|
+
|
|
+ public static List<MobCategory> getFilteredSpawningCategories(NaturalSpawner.SpawnState spawnState, boolean spawnFriendlies, boolean spawnEnemies, boolean spawnPassives, ServerLevel level, boolean peacefulModeSwitch) {
|
|
+ // Leaves end - peaceful mode switch
|
|
net.minecraft.world.level.storage.LevelData worlddata = level.getLevelData(); // CraftBukkit - Other mob type spawn tick rate
|
|
// CraftBukkit end
|
|
List<MobCategory> list = new ArrayList<>(SPAWNING_CATEGORIES.length);
|
|
|
|
for (MobCategory mobCategory : SPAWNING_CATEGORIES) {
|
|
+ // Leaves start - peaceful mode switch
|
|
+ if (mobCategory == MobCategory.MONSTER && peacefulModeSwitch) {
|
|
+ continue;
|
|
+ }
|
|
+ // Leaves end - peaceful mode switch
|
|
// CraftBukkit start - Use per-world spawn limits
|
|
boolean spawnThisTick = true;
|
|
int limit = mobCategory.getMaxInstancesPerChunk();
|