aboutsummaryrefslogtreecommitdiffhomepage
path: root/Spigot-Server-Patches/0428-Pillager-patrol-spawn-settings-and-per-player-option.patch
blob: 4678c272c98c6624d2b836ac53406ccecc524762 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
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 f888fc1c5ef4212f81ed936da6485abadc336407..b987399ca3786a30f87c98658e8bf04d4aa2e2da 100644
--- a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
+++ b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
@@ -579,10 +579,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 b74a31904f0fedbff0534dd90e189c05282258b8..415049bb5fdcc5c3edaf71bc8ddc330fe6bbcdb2 100644
--- a/src/main/java/net/minecraft/server/EntityPlayer.java
+++ b/src/main/java/net/minecraft/server/EntityPlayer.java
@@ -81,6 +81,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 b1fea06d29a0c98136496d6eff81e6959cb73672..776e54ff472a67f535dfb409e753325a1105bcce 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);
     }