mirror of
https://github.com/PaperMC/Paper.git
synced 2024-11-30 06:24:06 +01:00
156 lines
7.9 KiB
Diff
156 lines
7.9 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/level/ServerPlayer.java b/src/main/java/net/minecraft/server/level/ServerPlayer.java
|
||
|
index 7f4e81ee3339e90b8525541dccf6dea187853cf7..a469016c43251f16913a365c4131b2448eaa4c48 100644
|
||
|
--- a/src/main/java/net/minecraft/server/level/ServerPlayer.java
|
||
|
+++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java
|
||
|
@@ -213,6 +213,7 @@ public class ServerPlayer extends Player implements ContainerListener {
|
||
|
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/stats/StatType.java b/src/main/java/net/minecraft/stats/StatType.java
|
||
|
index ba48795a7b7cbf4622e64273ab488e26d7a862e2..b85987910cf80b1d1a04a7b772e19200f4ce4372 100644
|
||
|
--- a/src/main/java/net/minecraft/stats/StatType.java
|
||
|
+++ b/src/main/java/net/minecraft/stats/StatType.java
|
||
|
@@ -28,6 +28,7 @@ public class StatType<T> implements Iterable<Stat<T>> {
|
||
|
return this.map.values().iterator();
|
||
|
}
|
||
|
|
||
|
+ public final Stat<T> get(T t) { return this.get(t); }; // Paper - OBFHELPER
|
||
|
public Stat<T> get(T key) {
|
||
|
return this.get(key, StatFormatter.DEFAULT);
|
||
|
}
|
||
|
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 48efe133d294bb1b17e8ac8b44eea8a29f15845f..dcbe74bdb1b6e07f7b8845182576ef544493d377 100644
|
||
|
--- a/src/main/java/net/minecraft/world/level/levelgen/PatrolSpawner.java
|
||
|
+++ b/src/main/java/net/minecraft/world/level/levelgen/PatrolSpawner.java
|
||
|
@@ -4,11 +4,12 @@ import java.util.Random;
|
||
|
import net.minecraft.core.BlockPos;
|
||
|
import net.minecraft.nbt.CompoundTag;
|
||
|
import net.minecraft.server.level.ServerLevel;
|
||
|
+import net.minecraft.server.level.ServerPlayer;
|
||
|
+import net.minecraft.stats.Stats;
|
||
|
import net.minecraft.world.entity.EntityType;
|
||
|
import net.minecraft.world.entity.MobSpawnType;
|
||
|
import net.minecraft.world.entity.SpawnGroupData;
|
||
|
import net.minecraft.world.entity.monster.PatrollingMonster;
|
||
|
-import net.minecraft.world.entity.player.Player;
|
||
|
import net.minecraft.world.level.BlockGetter;
|
||
|
import net.minecraft.world.level.CustomSpawner;
|
||
|
import net.minecraft.world.level.GameRules;
|
||
|
@@ -20,13 +21,13 @@ import net.minecraft.world.level.block.state.BlockState;
|
||
|
|
||
|
public class PatrolSpawner implements CustomSpawner {
|
||
|
|
||
|
- private int nextTick;
|
||
|
+ private int nextTick;private int getSpawnDelay() { return nextTick; } private void setSpawnDelay(int spawnDelay) { this.nextTick = spawnDelay; } // Paper - OBFHELPER
|
||
|
|
||
|
public PatrolSpawner() {}
|
||
|
|
||
|
@Override
|
||
|
public int tick(ServerLevel world, boolean spawnMonsters, boolean spawnAnimals) {
|
||
|
- if (world.paperConfig.disablePillagerPatrols) return 0; // Paper
|
||
|
+ if (world.paperConfig.disablePillagerPatrols || world.paperConfig.patrolSpawnChance == 0) return 0; // Paper
|
||
|
if (!spawnMonsters) {
|
||
|
return 0;
|
||
|
} else if (!world.getGameRules().getBoolean(GameRules.RULE_DO_PATROL_SPAWNING)) {
|
||
|
@@ -34,23 +35,51 @@ public class PatrolSpawner implements CustomSpawner {
|
||
|
} else {
|
||
|
Random random = 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;
|
||
|
+ }
|
||
|
+
|
||
|
+ ServerPlayer entityhuman = world.players().get(random.nextInt(j));
|
||
|
+ if (entityhuman.isSpectator()) {
|
||
|
+ return 0;
|
||
|
+ }
|
||
|
+
|
||
|
+ int patrolSpawnDelay;
|
||
|
+ if (world.paperConfig.patrolPerPlayerDelay) {
|
||
|
+ --entityhuman.patrolSpawnDelay;
|
||
|
+ patrolSpawnDelay = entityhuman.patrolSpawnDelay;
|
||
|
} else {
|
||
|
- this.nextTick += 12000 + random.nextInt(1200);
|
||
|
- long i = world.getDayTime() / 24000L;
|
||
|
+ setSpawnDelay(getSpawnDelay() - 1);
|
||
|
+ patrolSpawnDelay = getSpawnDelay();
|
||
|
+ }
|
||
|
+
|
||
|
+ if (patrolSpawnDelay > 0) {
|
||
|
+ return 0;
|
||
|
+ } else {
|
||
|
+ long days;
|
||
|
+ if (world.paperConfig.patrolPerPlayerStart) {
|
||
|
+ days = entityhuman.getStats().getValue(Stats.CUSTOM.get(Stats.PLAY_ONE_MINUTE)) / 24000L; // PLAY_ONE_MINUTE is actually counting in ticks, a misnomer by Mojang
|
||
|
+ } else {
|
||
|
+ days = world.getDayTime() / 24000L;
|
||
|
+ }
|
||
|
+ if (world.paperConfig.patrolPerPlayerDelay) {
|
||
|
+ entityhuman.patrolSpawnDelay += world.paperConfig.patrolDelay + random.nextInt(1200);
|
||
|
+ } else {
|
||
|
+ setSpawnDelay(getSpawnDelay() + world.paperConfig.patrolDelay + random.nextInt(1200));
|
||
|
+ }
|
||
|
|
||
|
- if (i >= 5L && world.isDay()) {
|
||
|
- if (random.nextInt(5) != 0) {
|
||
|
+ if (days >= world.paperConfig.patrolStartDay && world.isDay()) {
|
||
|
+ if (random.nextDouble() >= world.paperConfig.patrolSpawnChance) {
|
||
|
+ // Paper end
|
||
|
return 0;
|
||
|
} else {
|
||
|
- int j = world.players().size();
|
||
|
|
||
|
if (j < 1) {
|
||
|
return 0;
|
||
|
} else {
|
||
|
- Player entityhuman = (Player) world.players().get(random.nextInt(j));
|
||
|
|
||
|
if (entityhuman.isSpectator()) {
|
||
|
return 0;
|