PaperMC/Spigot-Server-Patches/0419-Pillager-patrol-spawn-settings-and-per-player-option.patch
Riley Park 4e958e229f
We're going on an Adventure! (#4842)
Co-authored-by: Jake Potrebic <jake.m.potrebic@gmail.com>
Co-authored-by: zml <zml@stellardrift.ca>
Co-authored-by: Mariell Hoversholm <proximyst@proximyst.com>
2021-02-21 20:45:33 +01:00

141 lines
7.3 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/com/destroystokyo/paper/PaperWorldConfig.java b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
index 525d702d78a609af987ebd2c32169b873e5c05ed..6c8e9d498c9a30a1aa88494ba09c3cae012a8fa1 100644
--- a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
+++ b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
@@ -582,10 +582,21 @@ public class PaperWorldConfig {
}
public boolean disablePillagerPatrols = false;
+ public double patrolSpawnChance = 0.2;
+ public boolean patrolPerPlayerDelay = false;
+ public int patrolDelay = 12000;
+ public boolean patrolPerPlayerStart = false;
+ public int patrolStartDay = 5;
private void pillagerSettings() {
disablePillagerPatrols = getBoolean("game-mechanics.disable-pillager-patrols", disablePillagerPatrols);
+ patrolSpawnChance = getDouble("game-mechanics.pillager-patrols.spawn-chance", patrolSpawnChance);
+ patrolPerPlayerDelay = getBoolean("game-mechanics.pillager-patrols.spawn-delay.per-player", patrolPerPlayerDelay);
+ patrolDelay = getInt("game-mechanics.pillager-patrols.spawn-delay.ticks", patrolDelay);
+ patrolPerPlayerStart = getBoolean("game-mechanics.pillager-patrols.start.per-player", patrolPerPlayerStart);
+ patrolStartDay = getInt("game-mechanics.pillager-patrols.start.day", patrolStartDay);
}
+
public boolean entitiesTargetWithFollowRange = false;
private void entitiesTargetWithFollowRange() {
entitiesTargetWithFollowRange = getBoolean("entities-target-with-follow-range", entitiesTargetWithFollowRange);
diff --git a/src/main/java/net/minecraft/server/EntityPlayer.java b/src/main/java/net/minecraft/server/EntityPlayer.java
index f87cfd0de55808c6d93e2e80772c122cf7a279b8..e60dac038e8a414a45f8dab465d722ee3fb5ef54 100644
--- a/src/main/java/net/minecraft/server/EntityPlayer.java
+++ b/src/main/java/net/minecraft/server/EntityPlayer.java
@@ -87,6 +87,7 @@ public class EntityPlayer extends EntityHuman implements ICrafting {
public boolean viewingCredits;
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.server.PacketPlayOutUpdateHealth queuedHealthUpdatePacket;
diff --git a/src/main/java/net/minecraft/server/MobSpawnerPatrol.java b/src/main/java/net/minecraft/server/MobSpawnerPatrol.java
index 7ed89bbe465402582c9d28f0a3935758a6b0f7af..13fccedb948ce5ced1678ff338f7eea5d53ee022 100644
--- a/src/main/java/net/minecraft/server/MobSpawnerPatrol.java
+++ b/src/main/java/net/minecraft/server/MobSpawnerPatrol.java
@@ -4,13 +4,13 @@ import java.util.Random;
public class MobSpawnerPatrol implements MobSpawner {
- private int a;
+ private int a;private int getSpawnDelay() { return a; } private void setSpawnDelay(int spawnDelay) { this.a = spawnDelay; } // Paper - OBFHELPER
public MobSpawnerPatrol() {}
@Override
public int a(WorldServer worldserver, boolean flag, boolean flag1) {
- if (worldserver.paperConfig.disablePillagerPatrols) return 0; // Paper
+ if (worldserver.paperConfig.disablePillagerPatrols || worldserver.paperConfig.patrolSpawnChance == 0) return 0; // Paper
if (!flag) {
return 0;
} else if (!worldserver.getGameRules().getBoolean(GameRules.DO_PATROL_SPAWNING)) {
@@ -18,23 +18,51 @@ public class MobSpawnerPatrol implements MobSpawner {
} else {
Random random = worldserver.random;
- --this.a;
- if (this.a > 0) {
+ // Paper start - Patrol settings
+ // Random player selection moved up for per player spawning and configuration
+ int j = worldserver.getPlayers().size();
+ if (j < 1) {
return 0;
+ }
+
+ EntityPlayer entityhuman = worldserver.getPlayers().get(random.nextInt(j));
+ if (entityhuman.isSpectator()) {
+ return 0;
+ }
+
+ int patrolSpawnDelay;
+ if (worldserver.paperConfig.patrolPerPlayerDelay) {
+ --entityhuman.patrolSpawnDelay;
+ patrolSpawnDelay = entityhuman.patrolSpawnDelay;
} else {
- this.a += 12000 + random.nextInt(1200);
- long i = worldserver.getDayTime() / 24000L;
+ setSpawnDelay(getSpawnDelay() - 1);
+ patrolSpawnDelay = getSpawnDelay();
+ }
+
+ if (patrolSpawnDelay > 0) {
+ return 0;
+ } else {
+ long days;
+ if (worldserver.paperConfig.patrolPerPlayerStart) {
+ days = entityhuman.getStatisticManager().getStatisticValue(StatisticList.CUSTOM.get(StatisticList.PLAY_ONE_MINUTE)) / 24000L; // PLAY_ONE_MINUTE is actually counting in ticks, a misnomer by Mojang
+ } else {
+ days = worldserver.getDayTime() / 24000L;
+ }
+ if (worldserver.paperConfig.patrolPerPlayerDelay) {
+ entityhuman.patrolSpawnDelay += worldserver.paperConfig.patrolDelay + random.nextInt(1200);
+ } else {
+ setSpawnDelay(getSpawnDelay() + worldserver.paperConfig.patrolDelay + random.nextInt(1200));
+ }
- if (i >= 5L && worldserver.isDay()) {
- if (random.nextInt(5) != 0) {
+ if (days >= worldserver.paperConfig.patrolStartDay && worldserver.isDay()) {
+ if (random.nextDouble() >= worldserver.paperConfig.patrolSpawnChance) {
+ // Paper end
return 0;
} else {
- int j = worldserver.getPlayers().size();
if (j < 1) {
return 0;
} else {
- EntityHuman entityhuman = (EntityHuman) worldserver.getPlayers().get(random.nextInt(j));
if (entityhuman.isSpectator()) {
return 0;
diff --git a/src/main/java/net/minecraft/server/StatisticWrapper.java b/src/main/java/net/minecraft/server/StatisticWrapper.java
index 3b6034038a4841ebc980b2392c71025d9b0dde35..795ea6fece2e28645e99f4578e26a6d12b4c1bf8 100644
--- a/src/main/java/net/minecraft/server/StatisticWrapper.java
+++ b/src/main/java/net/minecraft/server/StatisticWrapper.java
@@ -27,6 +27,7 @@ public class StatisticWrapper<T> implements Iterable<Statistic<T>> {
return this.b.values().iterator();
}
+ public final Statistic<T> get(T t) { return this.b(t); }; // Paper - OBFHELPER
public Statistic<T> b(T t0) {
return this.a(t0, Counter.DEFAULT);
}