geforkt von Mirrors/Paper
aa52bf9e33
Mojang made some changes to priorities in 1.17 and it seems that these changes conflict with the changes made in this patch, which in some cases appears to cause excessive rescheduling of tasks. This, however, is not confirmed as such but seems to be the behavior that we're seeing to cause this issue, if mojang has adopted the changes we suggested, then a good chunk of this patch may be unneeded, but, this needs a much better look than I'm currently able to do
112 Zeilen
6.6 KiB
Diff
112 Zeilen
6.6 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Jason Penilla <11360596+jpenilla@users.noreply.github.com>
|
|
Date: Thu, 20 Aug 2020 11:20:12 -0700
|
|
Subject: [PATCH] Add Wandering Trader spawn rate config options
|
|
|
|
Adds config options for modifying the spawn rates of Wandering Traders.
|
|
These values are all easy to understand and configure after a quick read of this
|
|
page on the Minecraft wiki: https://minecraft.gamepedia.com/Wandering_Trader#Spawning
|
|
Usages of the vanilla WanderingTraderSpawnDelay and WanderingTraderSpawnChance values
|
|
in IWorldServerData are removed as they were only used in certain places, with hardcoded
|
|
values used in other places.
|
|
|
|
diff --git a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
|
|
index 45e65d1c56b693d8f7c5c12da7774849c737aa96..935bb237f8ecd63ca4cec64a7c7a341c9d3358e5 100644
|
|
--- a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
|
|
+++ b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
|
|
@@ -61,6 +61,19 @@ public class PaperWorldConfig {
|
|
}
|
|
}
|
|
|
|
+ public int wanderingTraderSpawnMinuteTicks = 1200;
|
|
+ public int wanderingTraderSpawnDayTicks = 24000;
|
|
+ public int wanderingTraderSpawnChanceFailureIncrement = 25;
|
|
+ public int wanderingTraderSpawnChanceMin = 25;
|
|
+ public int wanderingTraderSpawnChanceMax = 75;
|
|
+ private void wanderingTraderSettings() {
|
|
+ wanderingTraderSpawnMinuteTicks = getInt("wandering-trader.spawn-minute-length", wanderingTraderSpawnMinuteTicks);
|
|
+ wanderingTraderSpawnDayTicks = getInt("wandering-trader.spawn-day-length", wanderingTraderSpawnDayTicks);
|
|
+ wanderingTraderSpawnChanceFailureIncrement = getInt("wandering-trader.spawn-chance-failure-increment", wanderingTraderSpawnChanceFailureIncrement);
|
|
+ wanderingTraderSpawnChanceMin = getInt("wandering-trader.spawn-chance-min", wanderingTraderSpawnChanceMin);
|
|
+ wanderingTraderSpawnChanceMax = getInt("wandering-trader.spawn-chance-max", wanderingTraderSpawnChanceMax);
|
|
+ }
|
|
+
|
|
public short keepLoadedRange;
|
|
private void keepLoadedRange() {
|
|
keepLoadedRange = (short) (getInt("keep-spawn-loaded-range", Math.min(spigotConfig.viewDistance, 10)) * 16);
|
|
diff --git a/src/main/java/net/minecraft/world/entity/npc/WanderingTraderSpawner.java b/src/main/java/net/minecraft/world/entity/npc/WanderingTraderSpawner.java
|
|
index 12aa0fd5b6bada9820c3a08eee47c870f9c183cb..60f08ecd0034e8ef2965b54b3abccce582d0ca54 100644
|
|
--- a/src/main/java/net/minecraft/world/entity/npc/WanderingTraderSpawner.java
|
|
+++ b/src/main/java/net/minecraft/world/entity/npc/WanderingTraderSpawner.java
|
|
@@ -43,43 +43,53 @@ public class WanderingTraderSpawner implements CustomSpawner {
|
|
|
|
public WanderingTraderSpawner(ServerLevelData properties) {
|
|
this.serverLevelData = properties;
|
|
- this.tickDelay = 1200;
|
|
- this.spawnDelay = properties.getWanderingTraderSpawnDelay();
|
|
- this.spawnChance = properties.getWanderingTraderSpawnChance();
|
|
- if (this.spawnDelay == 0 && this.spawnChance == 0) {
|
|
- this.spawnDelay = 24000;
|
|
- properties.setWanderingTraderSpawnDelay(this.spawnDelay);
|
|
- this.spawnChance = 25;
|
|
- properties.setWanderingTraderSpawnChance(this.spawnChance);
|
|
- }
|
|
+ // Paper start
|
|
+ this.tickDelay = Integer.MIN_VALUE;
|
|
+ //this.spawnDelay = properties.getWanderingTraderSpawnDelay(); // Paper - This value is read from the world file only for the first spawn, after which vanilla uses a hardcoded value
|
|
+ //this.spawnChance = properties.getWanderingTraderSpawnChance(); // Paper - This value is read from the world file only for the first spawn, after which vanilla uses a hardcoded value
|
|
+ //if (this.spawnDelay == 0 && this.spawnChance == 0) {
|
|
+ // this.spawnDelay = 24000;
|
|
+ // properties.setWanderingTraderSpawnDelay(this.spawnDelay);
|
|
+ // this.spawnChance = 25;
|
|
+ // properties.setWanderingTraderSpawnChance(this.spawnChance);
|
|
+ //}
|
|
+ // Paper end
|
|
|
|
}
|
|
|
|
@Override
|
|
public int tick(ServerLevel world, boolean spawnMonsters, boolean spawnAnimals) {
|
|
+ // Paper start
|
|
+ if (this.tickDelay == Integer.MIN_VALUE) {
|
|
+ this.tickDelay = world.paperConfig.wanderingTraderSpawnMinuteTicks;
|
|
+ this.spawnDelay = world.paperConfig.wanderingTraderSpawnDayTicks;
|
|
+ this.spawnChance = world.paperConfig.wanderingTraderSpawnChanceMin;
|
|
+ }
|
|
if (!world.getGameRules().getBoolean(GameRules.RULE_DO_TRADER_SPAWNING)) {
|
|
return 0;
|
|
- } else if (--this.tickDelay > 0) {
|
|
+ } else if (this.tickDelay - 1 > 0) {
|
|
+ this.tickDelay = this.tickDelay - 1;
|
|
return 0;
|
|
} else {
|
|
- this.tickDelay = 1200;
|
|
- this.spawnDelay -= 1200;
|
|
- this.serverLevelData.setWanderingTraderSpawnDelay(this.spawnDelay);
|
|
+ this.tickDelay = world.paperConfig.wanderingTraderSpawnMinuteTicks;
|
|
+ this.spawnDelay = this.spawnDelay - world.paperConfig.wanderingTraderSpawnMinuteTicks;
|
|
+ //this.serverLevelData.setWanderingTraderSpawnDelay(this.spawnDelay); // Paper - We don't need to save this value to disk if it gets set back to a hardcoded value anyways
|
|
if (this.spawnDelay > 0) {
|
|
return 0;
|
|
} else {
|
|
- this.spawnDelay = 24000;
|
|
+ this.spawnDelay = world.paperConfig.wanderingTraderSpawnDayTicks;
|
|
if (!world.getGameRules().getBoolean(GameRules.RULE_DOMOBSPAWNING)) {
|
|
return 0;
|
|
} else {
|
|
int i = this.spawnChance;
|
|
|
|
- this.spawnChance = Mth.clamp(this.spawnChance + 25, 25, 75);
|
|
- this.serverLevelData.setWanderingTraderSpawnChance(this.spawnChance);
|
|
+ this.spawnChance = Mth.clamp(i + world.paperConfig.wanderingTraderSpawnChanceFailureIncrement, world.paperConfig.wanderingTraderSpawnChanceMin, world.paperConfig.wanderingTraderSpawnChanceMax);
|
|
+ //this.serverLevelData.setWanderingTraderSpawnChance(this.spawnChance); // Paper - We don't need to save this value to disk if it gets set back to a hardcoded value anyways
|
|
if (this.random.nextInt(100) > i) {
|
|
return 0;
|
|
} else if (this.spawn(world)) {
|
|
- this.spawnChance = 25;
|
|
+ this.spawnChance = world.paperConfig.wanderingTraderSpawnChanceMin;
|
|
+ // Paper end
|
|
return 1;
|
|
} else {
|
|
return 0;
|