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/net/minecraft/world/entity/npc/WanderingTraderSpawner.java b/src/main/java/net/minecraft/world/entity/npc/WanderingTraderSpawner.java index 83d0db5a9f03ee3ead10d9f61e5f425330eae0e9..02562a036d99d0ddadea28ae807c8e9463a8e341 100644 --- a/src/main/java/net/minecraft/world/entity/npc/WanderingTraderSpawner.java +++ b/src/main/java/net/minecraft/world/entity/npc/WanderingTraderSpawner.java @@ -40,32 +40,41 @@ 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().entities.spawning.wanderingTrader.spawnMinuteLength; + this.spawnDelay = world.paperConfig().entities.spawning.wanderingTrader.spawnDayLength; + this.spawnChance = world.paperConfig().entities.spawning.wanderingTrader.spawnChanceMin; + } 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().entities.spawning.wanderingTrader.spawnMinuteLength; + this.spawnDelay = this.spawnDelay - world.paperConfig().entities.spawning.wanderingTrader.spawnMinuteLength; + //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().entities.spawning.wanderingTrader.spawnDayLength; if (!world.getGameRules().getBoolean(GameRules.RULE_DOMOBSPAWNING)) { return 0; } else { @@ -73,10 +82,13 @@ public class WanderingTraderSpawner implements CustomSpawner { this.spawnChance = Mth.clamp(this.spawnChance + 25, 25, 75); this.serverLevelData.setWanderingTraderSpawnChance(this.spawnChance); + this.spawnChance = Mth.clamp(i + world.paperConfig().entities.spawning.wanderingTrader.spawnChanceFailureIncrement, world.paperConfig().entities.spawning.wanderingTrader.spawnChanceMin, world.paperConfig().entities.spawning.wanderingTrader.spawnChanceMax); + //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().entities.spawning.wanderingTrader.spawnChanceMin; + // Paper end return 1; } else { return 0;