mirror of
https://github.com/PaperMC/Paper.git
synced 2024-11-30 04:02:50 +01:00
38dc3b25d8
When per-player mob spawning is enabled we do not need to randomly shuffle the chunk list. Additionally, we can use the NearbyPlayers class to quickly retrieve nearby players instead of possible searching all players on the server.
96 lines
5.1 KiB
Diff
96 lines
5.1 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Phoenix616 <mail@moep.tv>
|
|
Date: Sat, 1 Feb 2020 16:50:39 +0100
|
|
Subject: [PATCH] Pillager patrol spawn settings and per player options
|
|
|
|
This adds config options for defining the spawn chance, spawn delay and
|
|
spawn start day as well as toggles for handling the spawn delay and
|
|
start day per player. (Based on the time played statistic)
|
|
When not per player it will use the Vanilla mechanic of one delay per
|
|
world and the world age for the start day.
|
|
|
|
diff --git a/src/main/java/net/minecraft/server/level/ServerPlayer.java b/src/main/java/net/minecraft/server/level/ServerPlayer.java
|
|
index 55c3416f209178a1a100228d9b1db620c79bc288..5c0b406214b7da3b33acf1f545105d4ecae1f783 100644
|
|
--- a/src/main/java/net/minecraft/server/level/ServerPlayer.java
|
|
+++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java
|
|
@@ -242,6 +242,7 @@ public class ServerPlayer extends Player {
|
|
public boolean wonGame;
|
|
private int containerUpdateDelay; // Paper
|
|
public long loginTime; // Paper
|
|
+ public int patrolSpawnDelay; // Paper - per player patrol spawns
|
|
// Paper start - cancellable death event
|
|
public boolean queueHealthUpdatePacket = false;
|
|
public net.minecraft.network.protocol.game.ClientboundSetHealthPacket queuedHealthUpdatePacket;
|
|
diff --git a/src/main/java/net/minecraft/world/level/levelgen/PatrolSpawner.java b/src/main/java/net/minecraft/world/level/levelgen/PatrolSpawner.java
|
|
index e5918fa3be107ac3a2fc8831fd78733a7506730a..a908652f1ebb426d265ef614746f70cd1e538268 100644
|
|
--- a/src/main/java/net/minecraft/world/level/levelgen/PatrolSpawner.java
|
|
+++ b/src/main/java/net/minecraft/world/level/levelgen/PatrolSpawner.java
|
|
@@ -25,7 +25,7 @@ public class PatrolSpawner implements CustomSpawner {
|
|
|
|
@Override
|
|
public int tick(ServerLevel world, boolean spawnMonsters, boolean spawnAnimals) {
|
|
- if (world.paperConfig().entities.behavior.pillagerPatrols.disable) return 0; // Paper
|
|
+ if (world.paperConfig().entities.behavior.pillagerPatrols.disable || world.paperConfig().entities.behavior.pillagerPatrols.spawnChance == 0) return 0; // Paper
|
|
if (!spawnMonsters) {
|
|
return 0;
|
|
} else if (!world.getGameRules().getBoolean(GameRules.RULE_DO_PATROL_SPAWNING)) {
|
|
@@ -33,23 +33,51 @@ public class PatrolSpawner implements CustomSpawner {
|
|
} else {
|
|
RandomSource randomsource = world.random;
|
|
|
|
- --this.nextTick;
|
|
- if (this.nextTick > 0) {
|
|
+ // Paper start - Patrol settings
|
|
+ // Random player selection moved up for per player spawning and configuration
|
|
+ int j = world.players().size();
|
|
+ if (j < 1) {
|
|
return 0;
|
|
+ }
|
|
+
|
|
+ net.minecraft.server.level.ServerPlayer entityhuman = world.players().get(randomsource.nextInt(j));
|
|
+ if (entityhuman.isSpectator()) {
|
|
+ return 0;
|
|
+ }
|
|
+
|
|
+ int patrolSpawnDelay;
|
|
+ if (world.paperConfig().entities.behavior.pillagerPatrols.spawnDelay.perPlayer) {
|
|
+ --entityhuman.patrolSpawnDelay;
|
|
+ patrolSpawnDelay = entityhuman.patrolSpawnDelay;
|
|
} else {
|
|
- this.nextTick += 12000 + randomsource.nextInt(1200);
|
|
- long i = world.getDayTime() / 24000L;
|
|
+ this.nextTick--;
|
|
+ patrolSpawnDelay = this.nextTick;
|
|
+ }
|
|
+
|
|
+ if (patrolSpawnDelay > 0) {
|
|
+ return 0;
|
|
+ } else {
|
|
+ long days;
|
|
+ if (world.paperConfig().entities.behavior.pillagerPatrols.start.perPlayer) {
|
|
+ days = entityhuman.getStats().getValue(net.minecraft.stats.Stats.CUSTOM.get(net.minecraft.stats.Stats.PLAY_TIME)) / 24000L; // PLAY_ONE_MINUTE is actually counting in ticks, a misnomer by Mojang
|
|
+ } else {
|
|
+ days = world.getDayTime() / 24000L;
|
|
+ }
|
|
+ if (world.paperConfig().entities.behavior.pillagerPatrols.spawnDelay.perPlayer) {
|
|
+ entityhuman.patrolSpawnDelay += world.paperConfig().entities.behavior.pillagerPatrols.spawnDelay.ticks + randomsource.nextInt(1200);
|
|
+ } else {
|
|
+ this.nextTick += world.paperConfig().entities.behavior.pillagerPatrols.spawnDelay.ticks + randomsource.nextInt(1200);
|
|
+ }
|
|
|
|
- if (i >= 5L && world.isDay()) {
|
|
- if (randomsource.nextInt(5) != 0) {
|
|
+ if (days >= world.paperConfig().entities.behavior.pillagerPatrols.start.day && world.isDay()) {
|
|
+ if (randomsource.nextDouble() >= world.paperConfig().entities.behavior.pillagerPatrols.spawnChance) {
|
|
+ // Paper end
|
|
return 0;
|
|
} else {
|
|
- int j = world.players().size();
|
|
|
|
if (j < 1) {
|
|
return 0;
|
|
} else {
|
|
- Player entityhuman = (Player) world.players().get(randomsource.nextInt(j));
|
|
|
|
if (entityhuman.isSpectator()) {
|
|
return 0;
|