From 6cd91bcc1df506baa30eb4d846d590eb99db618a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zo=C3=AB?= Date: Fri, 19 Aug 2022 20:36:32 -0500 Subject: [PATCH] Random Changes --- .../structure/StructureCommandAddon.java | 14 ++++-- .../distributors/PaddedGridDistributor.java | 6 ++- .../addons/flora/flora/gen/TerraFlora.java | 9 ++-- .../locators/GaussianRandomLocator.java | 5 +- .../locator/locators/RandomLocator.java | 5 +- .../terra/addons/ore/ores/VanillaOre.java | 4 +- .../structure/structures/loot/Entry.java | 6 +-- .../structures/loot/LootTableImpl.java | 6 +-- .../structure/structures/loot/Pool.java | 8 ++-- .../loot/functions/AmountFunction.java | 6 +-- .../loot/functions/DamageFunction.java | 6 +-- .../loot/functions/EnchantFunction.java | 6 +-- .../loot/functions/LootFunction.java | 6 +-- .../feature/FeatureGenerationStage.java | 7 ++- .../shortcut/block/SingletonStructure.java | 4 +- .../structure/mutator/MutatedStructure.java | 4 +- .../terra/addons/sponge/SpongeStructure.java | 4 +- .../terrascript/script/StructureScript.java | 6 +-- .../script/TerraImplementationArguments.java | 8 ++-- .../script/functions/LootFunction.java | 8 ++-- .../dfsek/terra/api/structure/LootTable.java | 12 ++--- .../dfsek/terra/api/structure/Structure.java | 4 +- .../dfsek/terra/api/util/ConstantRange.java | 4 +- .../dfsek/terra/api/util/PopulationUtil.java | 12 +++-- .../java/com/dfsek/terra/api/util/Range.java | 4 +- .../collection/ProbabilityCollection.java | 6 +-- .../BukkitChunkGeneratorWrapper.java | 6 +-- .../mod/mixin/gameplay/BoneMealItemMixin.java | 6 ++- .../mod/mixin/gameplay/BoneMealTaskMixin.java | 8 ++-- .../mod/mixin/gameplay/ServerWorldMixin.java | 6 ++- .../terra/mod/util/FertilizableUtil.java | 15 ++---- .../terra/mod/util/MinecraftAdapter.java | 47 +++++++++++++++++++ 32 files changed, 161 insertions(+), 97 deletions(-) diff --git a/common/addons/command-structures/src/main/java/com/dfsek/terra/addons/commands/structure/StructureCommandAddon.java b/common/addons/command-structures/src/main/java/com/dfsek/terra/addons/commands/structure/StructureCommandAddon.java index f1d8d552c..dbafef915 100644 --- a/common/addons/command-structures/src/main/java/com/dfsek/terra/addons/commands/structure/StructureCommandAddon.java +++ b/common/addons/command-structures/src/main/java/com/dfsek/terra/addons/commands/structure/StructureCommandAddon.java @@ -6,8 +6,6 @@ import cloud.commandframework.arguments.standard.EnumArgument; import cloud.commandframework.arguments.standard.LongArgument; import cloud.commandframework.context.CommandContext; -import java.util.Random; - import com.dfsek.terra.addons.manifest.api.MonadAddonInitializer; import com.dfsek.terra.addons.manifest.api.monad.Do; import com.dfsek.terra.addons.manifest.api.monad.Get; @@ -27,6 +25,8 @@ import com.dfsek.terra.api.util.Rotation; import com.dfsek.terra.api.util.function.monad.Monad; import com.dfsek.terra.api.util.reflection.TypeKey; +import java.util.random.RandomGenerator; +import java.util.random.RandomGeneratorFactory; public class StructureCommandAddon implements MonadAddonInitializer { private static Registry getStructureRegistry(CommandContext sender) { @@ -57,9 +57,13 @@ public class StructureCommandAddon implements MonadAddonInitializer { structure.generate( sender.position().toInt(), sender.world(), - ((Long) context.get("seed") == 0) ? new Random() : new Random(context.get("seed")), - context.get("rotation") - ); + ((Long) context.get("seed") == 0) + ? RandomGeneratorFactory.of("Xoroshiro128PlusPlus") + .create() + : RandomGeneratorFactory.of("Xoroshiro128PlusPlus") + .create(context.get("seed")), + context.get("rotation") + ); }) .permission("terra.structures.generate") ); diff --git a/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/distributors/PaddedGridDistributor.java b/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/distributors/PaddedGridDistributor.java index bb380e034..444d2bc2f 100644 --- a/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/distributors/PaddedGridDistributor.java +++ b/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/distributors/PaddedGridDistributor.java @@ -2,7 +2,8 @@ package com.dfsek.terra.addons.feature.distributor.distributors; import net.jafama.FastMath; -import java.util.Random; +import java.util.random.RandomGenerator; +import java.util.random.RandomGeneratorFactory; import com.dfsek.terra.api.structure.feature.Distributor; import com.dfsek.terra.api.util.MathUtil; @@ -35,7 +36,8 @@ public class PaddedGridDistributor implements Distributor { int cellX = FastMath.floorDiv(x, cellWidth); int cellZ = FastMath.floorDiv(z, cellWidth); - Random random = new Random((murmur64(MathUtil.squash(cellX, cellZ)) ^ seed) + salt); + RandomGenerator random = RandomGeneratorFactory.of("Xoroshiro128PlusPlus").create( + (murmur64(MathUtil.squash(cellX, cellZ)) ^ seed) + salt); int pointX = random.nextInt(width) + cellX * cellWidth; int pointZ = random.nextInt(width) + cellZ * cellWidth; diff --git a/common/addons/config-flora/src/main/java/com/dfsek/terra/addons/flora/flora/gen/TerraFlora.java b/common/addons/config-flora/src/main/java/com/dfsek/terra/addons/flora/flora/gen/TerraFlora.java index 31fbf1558..a28e2b05f 100644 --- a/common/addons/config-flora/src/main/java/com/dfsek/terra/addons/flora/flora/gen/TerraFlora.java +++ b/common/addons/config-flora/src/main/java/com/dfsek/terra/addons/flora/flora/gen/TerraFlora.java @@ -12,7 +12,8 @@ import net.jafama.FastMath; import java.util.ArrayList; import java.util.EnumSet; import java.util.List; -import java.util.Random; +import java.util.random.RandomGenerator; +import java.util.random.RandomGeneratorFactory; import com.dfsek.terra.api.block.state.BlockState; import com.dfsek.terra.api.block.state.properties.enums.Direction; @@ -73,7 +74,7 @@ public class TerraFlora implements Structure { } @Override - public boolean generate(Vector3Int location, WritableWorld world, Random random, Rotation rotation) { + public boolean generate(Vector3Int location, WritableWorld world, RandomGenerator random, Rotation rotation) { boolean doRotation = testRotation.size() > 0; int size = layers.size(); int c = ceiling ? -1 : 1; @@ -88,7 +89,9 @@ public class TerraFlora implements Structure { location.getZ(), world.getSeed()); if(doRotation) { Direction oneFace = new ArrayList<>(faces).get( - new Random(location.getX() ^ location.getZ()).nextInt(faces.size())); // Get random face. + RandomGeneratorFactory.of("Xoroshiro128PlusPlus") + .create(location.getX() ^ location.getZ()) + .nextInt(faces.size())); // Get RandomGenerator face. } world.setBlockState(location.mutable().add(0, i + c, 0).immutable(), data, physics); } diff --git a/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/locators/GaussianRandomLocator.java b/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/locators/GaussianRandomLocator.java index 16fb827e5..471ef0cd5 100644 --- a/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/locators/GaussianRandomLocator.java +++ b/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/locators/GaussianRandomLocator.java @@ -7,7 +7,8 @@ package com.dfsek.terra.addons.feature.locator.locators; -import java.util.Random; +import java.util.random.RandomGenerator; +import java.util.random.RandomGeneratorFactory; import com.dfsek.terra.api.structure.feature.BinaryColumn; import com.dfsek.terra.api.structure.feature.Locator; @@ -40,7 +41,7 @@ public class GaussianRandomLocator implements Locator { seed = 31 * seed + column.getZ(); seed += salt; - Random r = new Random(seed); + RandomGenerator r = RandomGeneratorFactory.of("Xoroshiro128PlusPlus").create(seed); int size = points.get(r); diff --git a/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/locators/RandomLocator.java b/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/locators/RandomLocator.java index fc86878ff..fb91e469a 100644 --- a/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/locators/RandomLocator.java +++ b/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/locators/RandomLocator.java @@ -7,7 +7,8 @@ package com.dfsek.terra.addons.feature.locator.locators; -import java.util.Random; +import java.util.random.RandomGenerator; +import java.util.random.RandomGeneratorFactory; import com.dfsek.terra.api.structure.feature.BinaryColumn; import com.dfsek.terra.api.structure.feature.Locator; @@ -36,7 +37,7 @@ public class RandomLocator implements Locator { seed = 31 * seed + column.getZ(); seed += salt; - Random r = new Random(seed); + RandomGenerator r = RandomGeneratorFactory.of("Xoroshiro128PlusPlus").create(seed); int size = points.get(r); diff --git a/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/ores/VanillaOre.java b/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/ores/VanillaOre.java index a1046aea9..7f3a781d7 100644 --- a/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/ores/VanillaOre.java +++ b/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/ores/VanillaOre.java @@ -10,7 +10,7 @@ package com.dfsek.terra.addons.ore.ores; import net.jafama.FastMath; import java.util.Map; -import java.util.Random; +import java.util.random.RandomGenerator; import com.dfsek.terra.api.block.BlockType; import com.dfsek.terra.api.block.state.BlockState; @@ -42,7 +42,7 @@ public class VanillaOre implements Structure { } @Override - public boolean generate(Vector3Int location, WritableWorld world, Random random, Rotation rotation) { + public boolean generate(Vector3Int location, WritableWorld world, RandomGenerator random, Rotation rotation) { int centerX = location.getX(); int centerZ = location.getZ(); int centerY = location.getY(); diff --git a/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/structures/loot/Entry.java b/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/structures/loot/Entry.java index ab8be10e2..4acfce6e6 100644 --- a/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/structures/loot/Entry.java +++ b/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/structures/loot/Entry.java @@ -13,7 +13,7 @@ import org.json.simple.JSONObject; import java.util.ArrayList; import java.util.List; -import java.util.Random; +import java.util.random.RandomGenerator; import com.dfsek.terra.addons.structure.structures.loot.functions.AmountFunction; import com.dfsek.terra.addons.structure.structures.loot.functions.DamageFunction; @@ -86,11 +86,11 @@ public class Entry { /** * Fetches a single ItemStack from the Entry, applying all functions to it. * - * @param r The Random instance to apply functions with + * @param r The RandomGenerator instance to apply functions with * * @return ItemStack - The ItemStack with all functions applied. */ - public ItemStack getItem(Random r) { + public ItemStack getItem(RandomGenerator r) { ItemStack item = this.item.newItemStack(1); for(LootFunction f : functions) { item = f.apply(item, r); diff --git a/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/structures/loot/LootTableImpl.java b/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/structures/loot/LootTableImpl.java index c817c2d2d..6caeb9052 100644 --- a/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/structures/loot/LootTableImpl.java +++ b/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/structures/loot/LootTableImpl.java @@ -14,7 +14,7 @@ import org.json.simple.parser.ParseException; import java.util.ArrayList; import java.util.List; -import java.util.Random; +import java.util.random.RandomGenerator; import com.dfsek.terra.api.Platform; import com.dfsek.terra.api.inventory.Inventory; @@ -44,7 +44,7 @@ public class LootTableImpl implements com.dfsek.terra.api.structure.LootTable { } @Override - public void fillInventory(Inventory i, Random r) { + public void fillInventory(Inventory i, RandomGenerator r) { List loot = getLoot(r); for(ItemStack stack : loot) { int attempts = 0; @@ -70,7 +70,7 @@ public class LootTableImpl implements com.dfsek.terra.api.structure.LootTable { } @Override - public List getLoot(Random r) { + public List getLoot(RandomGenerator r) { List itemList = new ArrayList<>(); for(Pool pool : pools) { itemList.addAll(pool.getItems(r)); diff --git a/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/structures/loot/Pool.java b/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/structures/loot/Pool.java index a807cb4a1..fa29a5090 100644 --- a/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/structures/loot/Pool.java +++ b/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/structures/loot/Pool.java @@ -13,7 +13,7 @@ import org.json.simple.JSONObject; import java.util.ArrayList; import java.util.List; -import java.util.Random; +import java.util.random.RandomGenerator; import com.dfsek.terra.api.Platform; import com.dfsek.terra.api.inventory.ItemStack; @@ -51,13 +51,13 @@ public class Pool { } /** - * Fetches a list of items from the pool using the provided Random instance. + * Fetches a list of items from the pool using the provided RandomGenerator instance. * - * @param r The Random instance to use. + * @param r The RandomGenerator instance to use. * * @return List<ItemStack> - The list of items fetched. */ - public List getItems(Random r) { + public List getItems(RandomGenerator r) { int rolls = r.nextInt(max - min + 1) + min; List items = new ArrayList<>(); diff --git a/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/structures/loot/functions/AmountFunction.java b/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/structures/loot/functions/AmountFunction.java index 8fd59a5ee..8461dc623 100644 --- a/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/structures/loot/functions/AmountFunction.java +++ b/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/structures/loot/functions/AmountFunction.java @@ -8,7 +8,7 @@ package com.dfsek.terra.addons.structure.structures.loot.functions; -import java.util.Random; +import java.util.random.RandomGenerator; import com.dfsek.terra.api.inventory.ItemStack; @@ -35,12 +35,12 @@ public class AmountFunction implements LootFunction { * Applies the function to an ItemStack. * * @param original The ItemStack on which to apply the function. - * @param r The Random instance to use. + * @param r The RandomGenerator instance to use. * * @return - ItemStack - The mutated ItemStack. */ @Override - public ItemStack apply(ItemStack original, Random r) { + public ItemStack apply(ItemStack original, RandomGenerator r) { original.setAmount(r.nextInt(max - min + 1) + min); return original; } diff --git a/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/structures/loot/functions/DamageFunction.java b/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/structures/loot/functions/DamageFunction.java index 09eda7417..cd9664770 100644 --- a/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/structures/loot/functions/DamageFunction.java +++ b/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/structures/loot/functions/DamageFunction.java @@ -7,7 +7,7 @@ package com.dfsek.terra.addons.structure.structures.loot.functions; -import java.util.Random; +import java.util.random.RandomGenerator; import com.dfsek.terra.api.inventory.ItemStack; import com.dfsek.terra.api.inventory.item.Damageable; @@ -36,12 +36,12 @@ public class DamageFunction implements LootFunction { * Applies the function to an ItemStack. * * @param original The ItemStack on which to apply the function. - * @param r The Random instance to use. + * @param r The RandomGenerator instance to use. * * @return - ItemStack - The mutated ItemStack. */ @Override - public ItemStack apply(ItemStack original, Random r) { + public ItemStack apply(ItemStack original, RandomGenerator r) { if(original == null) return null; if(!original.isDamageable()) return original; ItemMeta meta = original.getItemMeta(); diff --git a/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/structures/loot/functions/EnchantFunction.java b/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/structures/loot/functions/EnchantFunction.java index 6f5b4d62d..4e54941ba 100644 --- a/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/structures/loot/functions/EnchantFunction.java +++ b/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/structures/loot/functions/EnchantFunction.java @@ -15,7 +15,7 @@ import org.slf4j.LoggerFactory; import java.util.ArrayList; import java.util.Collections; import java.util.List; -import java.util.Random; +import java.util.random.RandomGenerator; import com.dfsek.terra.api.Platform; import com.dfsek.terra.api.inventory.ItemStack; @@ -42,12 +42,12 @@ public class EnchantFunction implements LootFunction { * Applies the function to an ItemStack. * * @param original The ItemStack on which to apply the function. - * @param r The Random instance to use. + * @param r The RandomGenerator instance to use. * * @return - ItemStack - The mutated ItemStack. */ @Override - public ItemStack apply(ItemStack original, Random r) { + public ItemStack apply(ItemStack original, RandomGenerator r) { if(original.getItemMeta() == null) return original; double enchant = (r.nextDouble() * (max - min)) + min; diff --git a/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/structures/loot/functions/LootFunction.java b/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/structures/loot/functions/LootFunction.java index ebe0fd550..adce098a7 100644 --- a/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/structures/loot/functions/LootFunction.java +++ b/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/structures/loot/functions/LootFunction.java @@ -8,7 +8,7 @@ package com.dfsek.terra.addons.structure.structures.loot.functions; -import java.util.Random; +import java.util.random.RandomGenerator; import com.dfsek.terra.api.inventory.ItemStack; @@ -21,9 +21,9 @@ public interface LootFunction { * Applies the function to an ItemStack. * * @param original The ItemStack on which to apply the function. - * @param r The Random instance to use. + * @param r The RandomGenerator instance to use. * * @return - ItemStack - The mutated ItemStack. */ - ItemStack apply(ItemStack original, Random r); + ItemStack apply(ItemStack original, RandomGenerator r); } diff --git a/common/addons/generation-stage-feature/src/main/java/com/dfsek/terra/addons/generation/feature/FeatureGenerationStage.java b/common/addons/generation-stage-feature/src/main/java/com/dfsek/terra/addons/generation/feature/FeatureGenerationStage.java index 5408b26e4..150e381d4 100644 --- a/common/addons/generation-stage-feature/src/main/java/com/dfsek/terra/addons/generation/feature/FeatureGenerationStage.java +++ b/common/addons/generation-stage-feature/src/main/java/com/dfsek/terra/addons/generation/feature/FeatureGenerationStage.java @@ -8,7 +8,8 @@ package com.dfsek.terra.addons.generation.feature; import java.util.Collections; -import java.util.Random; +import java.util.random.RandomGenerator; +import java.util.random.RandomGeneratorFactory; import com.dfsek.terra.addons.generation.feature.config.BiomeFeatures; import com.dfsek.terra.api.Platform; @@ -72,7 +73,9 @@ public class FeatureGenerationStage implements GenerationStage, StringIdentifiab .forEach(y -> feature.getStructure(world, x, y, z) .generate(Vector3Int.of(x, y, z), world, - new Random(coordinateSeed * 31 + y), + RandomGeneratorFactory.of( + "Xoroshiro128PlusPlus") + .create(coordinateSeed * 31 + y), Rotation.NONE) ); } diff --git a/common/addons/structure-block-shortcut/src/main/java/com/dfsek/terra/addons/palette/shortcut/block/SingletonStructure.java b/common/addons/structure-block-shortcut/src/main/java/com/dfsek/terra/addons/palette/shortcut/block/SingletonStructure.java index 7d14c6ee7..d7fba683f 100644 --- a/common/addons/structure-block-shortcut/src/main/java/com/dfsek/terra/addons/palette/shortcut/block/SingletonStructure.java +++ b/common/addons/structure-block-shortcut/src/main/java/com/dfsek/terra/addons/palette/shortcut/block/SingletonStructure.java @@ -1,6 +1,6 @@ package com.dfsek.terra.addons.palette.shortcut.block; -import java.util.Random; +import java.util.random.RandomGenerator; import com.dfsek.terra.api.block.state.BlockState; import com.dfsek.terra.api.structure.Structure; @@ -17,7 +17,7 @@ public class SingletonStructure implements Structure { } @Override - public boolean generate(Vector3Int location, WritableWorld world, Random random, Rotation rotation) { + public boolean generate(Vector3Int location, WritableWorld world, RandomGenerator random, Rotation rotation) { world.setBlockState(location, blockState); return true; } diff --git a/common/addons/structure-mutator/src/main/java/com/dfsek/terra/addons/structure/mutator/MutatedStructure.java b/common/addons/structure-mutator/src/main/java/com/dfsek/terra/addons/structure/mutator/MutatedStructure.java index a5aafdd1e..8ff16d9db 100644 --- a/common/addons/structure-mutator/src/main/java/com/dfsek/terra/addons/structure/mutator/MutatedStructure.java +++ b/common/addons/structure-mutator/src/main/java/com/dfsek/terra/addons/structure/mutator/MutatedStructure.java @@ -1,6 +1,6 @@ package com.dfsek.terra.addons.structure.mutator; -import java.util.Random; +import java.util.random.RandomGenerator; import com.dfsek.terra.api.registry.key.Keyed; import com.dfsek.terra.api.registry.key.RegistryKey; @@ -32,7 +32,7 @@ public class MutatedStructure implements Structure, Keyed { } @Override - public boolean generate(Vector3Int location, WritableWorld world, Random random, Rotation rotation) { + public boolean generate(Vector3Int location, WritableWorld world, RandomGenerator random, Rotation rotation) { return base.generate(location, world .buffer() diff --git a/common/addons/structure-sponge-loader/src/main/java/com/dfsek/terra/addons/sponge/SpongeStructure.java b/common/addons/structure-sponge-loader/src/main/java/com/dfsek/terra/addons/sponge/SpongeStructure.java index e08c51146..1e3cf7f0c 100644 --- a/common/addons/structure-sponge-loader/src/main/java/com/dfsek/terra/addons/sponge/SpongeStructure.java +++ b/common/addons/structure-sponge-loader/src/main/java/com/dfsek/terra/addons/sponge/SpongeStructure.java @@ -7,7 +7,7 @@ package com.dfsek.terra.addons.sponge; -import java.util.Random; +import java.util.random.RandomGenerator; import com.dfsek.terra.api.block.state.BlockState; import com.dfsek.terra.api.registry.key.Keyed; @@ -31,7 +31,7 @@ public class SpongeStructure implements Structure, Keyed { } @Override - public boolean generate(Vector3Int location, WritableWorld world, Random random, Rotation rotation) { + public boolean generate(Vector3Int location, WritableWorld world, RandomGenerator random, Rotation rotation) { int bX = location.getX(); int bY = location.getY(); int bZ = location.getZ(); diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/StructureScript.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/StructureScript.java index e865d0d6d..9a9d040ff 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/StructureScript.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/StructureScript.java @@ -15,7 +15,7 @@ import org.slf4j.LoggerFactory; import java.io.IOException; import java.io.InputStream; import java.nio.charset.Charset; -import java.util.Random; +import java.util.random.RandomGenerator; import com.dfsek.terra.addons.terrascript.parser.Parser; import com.dfsek.terra.addons.terrascript.parser.lang.Executable; @@ -130,14 +130,14 @@ public class StructureScript implements Structure, Keyed { @Override @SuppressWarnings("try") - public boolean generate(Vector3Int location, WritableWorld world, Random random, Rotation rotation) { + public boolean generate(Vector3Int location, WritableWorld world, RandomGenerator random, Rotation rotation) { platform.getProfiler().push(profile); boolean result = applyBlock(new TerraImplementationArguments(location, rotation, random, world, 0)); platform.getProfiler().pop(profile); return result; } - public boolean generate(Vector3Int location, WritableWorld world, Random random, Rotation rotation, int recursions) { + public boolean generate(Vector3Int location, WritableWorld world, RandomGenerator random, Rotation rotation, int recursions) { platform.getProfiler().push(profile); boolean result = applyBlock(new TerraImplementationArguments(location, rotation, random, world, recursions)); platform.getProfiler().pop(profile); diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/TerraImplementationArguments.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/TerraImplementationArguments.java index b9b9af058..d768b30ec 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/TerraImplementationArguments.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/TerraImplementationArguments.java @@ -9,7 +9,7 @@ package com.dfsek.terra.addons.terrascript.script; import java.util.HashMap; import java.util.Map; -import java.util.Random; +import java.util.random.RandomGenerator; import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments; import com.dfsek.terra.api.util.Rotation; @@ -20,14 +20,14 @@ import com.dfsek.terra.api.world.WritableWorld; public class TerraImplementationArguments implements ImplementationArguments { private final Rotation rotation; - private final Random random; + private final RandomGenerator random; private final WritableWorld world; private final Map marks = new HashMap<>(); private final int recursions; private final Vector3Int origin; private boolean waterlog = false; - public TerraImplementationArguments(Vector3Int origin, Rotation rotation, Random random, WritableWorld world, int recursions) { + public TerraImplementationArguments(Vector3Int origin, Rotation rotation, RandomGenerator random, WritableWorld world, int recursions) { this.rotation = rotation; this.random = random; this.world = world; @@ -39,7 +39,7 @@ public class TerraImplementationArguments implements ImplementationArguments { return recursions; } - public Random getRandom() { + public RandomGenerator getRandom() { return random; } diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/LootFunction.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/LootFunction.java index ebadb9288..a58ee67d5 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/LootFunction.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/LootFunction.java @@ -11,8 +11,6 @@ import net.jafama.FastMath; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.util.Random; - import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments; import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.parser.lang.Scope; @@ -31,6 +29,9 @@ import com.dfsek.terra.api.util.RotationUtil; import com.dfsek.terra.api.util.vector.Vector2; import com.dfsek.terra.api.util.vector.Vector3; +import java.util.random.RandomGenerator; +import java.util.random.RandomGeneratorFactory; + public class LootFunction implements Function { private static final Logger LOGGER = LoggerFactory.getLogger(LootFunction.class); @@ -85,7 +86,8 @@ public class LootFunction implements Function { if(event.isCancelled()) return; event.getTable().fillInventory(container.getInventory(), - new Random(apply.hashCode())); + RandomGeneratorFactory.of( + "Xoroshiro128PlusPlus").create(apply.hashCode())); data.update(false); } catch(Exception e) { LOGGER.error("Could not apply loot at {}", apply, e); diff --git a/common/api/src/main/java/com/dfsek/terra/api/structure/LootTable.java b/common/api/src/main/java/com/dfsek/terra/api/structure/LootTable.java index 162247c82..64f1f250e 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/structure/LootTable.java +++ b/common/api/src/main/java/com/dfsek/terra/api/structure/LootTable.java @@ -10,7 +10,7 @@ package com.dfsek.terra.api.structure; import org.jetbrains.annotations.ApiStatus.Experimental; import java.util.List; -import java.util.Random; +import java.util.random.RandomGenerator; import com.dfsek.terra.api.inventory.Inventory; import com.dfsek.terra.api.inventory.ItemStack; @@ -22,16 +22,16 @@ public interface LootTable { * Fills an Inventory with loot. * * @param i The Inventory to fill. - * @param r The The Random instance to use. + * @param r The The RandomGenerator instance to use. */ - void fillInventory(Inventory i, Random r); + void fillInventory(Inventory i, RandomGenerator r); /** - * Fetches a list of ItemStacks from the loot table using the given Random instance. + * Fetches a list of ItemStacks from the loot table using the given RandomGenerator instance. * - * @param r The Random instance to use. + * @param r The RandomGenerator instance to use. * * @return List<ItemStack> - The list of loot fetched. */ - List getLoot(Random r); + List getLoot(RandomGenerator r); } diff --git a/common/api/src/main/java/com/dfsek/terra/api/structure/Structure.java b/common/api/src/main/java/com/dfsek/terra/api/structure/Structure.java index 479c77e38..20aa70d1d 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/structure/Structure.java +++ b/common/api/src/main/java/com/dfsek/terra/api/structure/Structure.java @@ -7,7 +7,7 @@ package com.dfsek.terra.api.structure; -import java.util.Random; +import java.util.random.RandomGenerator; import com.dfsek.terra.api.util.Rotation; import com.dfsek.terra.api.util.vector.Vector3Int; @@ -15,5 +15,5 @@ import com.dfsek.terra.api.world.WritableWorld; public interface Structure { - boolean generate(Vector3Int location, WritableWorld world, Random random, Rotation rotation); + boolean generate(Vector3Int location, WritableWorld world, RandomGenerator random, Rotation rotation); } diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/ConstantRange.java b/common/api/src/main/java/com/dfsek/terra/api/util/ConstantRange.java index 5849d09a6..cb8bc8278 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/util/ConstantRange.java +++ b/common/api/src/main/java/com/dfsek/terra/api/util/ConstantRange.java @@ -11,7 +11,7 @@ import net.jafama.FastMath; import org.jetbrains.annotations.NotNull; import java.util.Iterator; -import java.util.Random; +import java.util.random.RandomGenerator; public class ConstantRange implements Range { @@ -37,7 +37,7 @@ public class ConstantRange implements Range { } @Override - public int get(Random r) { + public int get(RandomGenerator r) { return r.nextInt(min, max); } diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/PopulationUtil.java b/common/api/src/main/java/com/dfsek/terra/api/util/PopulationUtil.java index d8949a0c2..6360bc028 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/util/PopulationUtil.java +++ b/common/api/src/main/java/com/dfsek/terra/api/util/PopulationUtil.java @@ -7,18 +7,20 @@ package com.dfsek.terra.api.util; -import java.util.Random; +import java.util.random.RandomGenerator; +import java.util.random.RandomGeneratorFactory; import com.dfsek.terra.api.world.chunk.Chunk; public final class PopulationUtil { - public static Random getRandom(Chunk c) { + public static RandomGenerator getRandom(Chunk c) { return getRandom(c, 0); } - public static Random getRandom(Chunk c, long salt) { - return new Random(getCarverChunkSeed(c.getX(), c.getZ(), c.getWorld().getSeed() + salt)); + public static RandomGenerator getRandom(Chunk c, long salt) { + return RandomGeneratorFactory.of("Xoroshiro128PlusPlus").create( + getCarverChunkSeed(c.getX(), c.getZ(), c.getWorld().getSeed() + salt)); } /** @@ -31,7 +33,7 @@ public final class PopulationUtil { * @return long - The carver seed. */ public static long getCarverChunkSeed(int chunkX, int chunkZ, long seed) { - Random r = new Random(seed); + RandomGenerator r = RandomGeneratorFactory.of("Xoroshiro128PlusPlus").create(seed); return chunkX * r.nextLong() ^ chunkZ * r.nextLong() ^ seed; } } diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/Range.java b/common/api/src/main/java/com/dfsek/terra/api/util/Range.java index c417b8183..df7c46d28 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/util/Range.java +++ b/common/api/src/main/java/com/dfsek/terra/api/util/Range.java @@ -10,8 +10,8 @@ package com.dfsek.terra.api.util; import org.jetbrains.annotations.NotNull; import java.util.Iterator; -import java.util.Random; import java.util.function.Supplier; +import java.util.random.RandomGenerator; public interface Range extends Iterable { @@ -19,7 +19,7 @@ public interface Range extends Iterable { Range reflect(int pt); - int get(Random r); + int get(RandomGenerator r); Range intersects(Range other); diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/collection/ProbabilityCollection.java b/common/api/src/main/java/com/dfsek/terra/api/util/collection/ProbabilityCollection.java index f5d5863c6..4302fa50f 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/util/collection/ProbabilityCollection.java +++ b/common/api/src/main/java/com/dfsek/terra/api/util/collection/ProbabilityCollection.java @@ -15,9 +15,9 @@ import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.Map; -import java.util.Random; import java.util.Set; import java.util.function.Function; +import java.util.random.RandomGenerator; import com.dfsek.terra.api.noise.NoiseSampler; import com.dfsek.terra.api.util.MathUtil; @@ -43,7 +43,7 @@ public class ProbabilityCollection implements Collection { } @SuppressWarnings("unchecked") - public E get(Random r) { + public E get(RandomGenerator r) { if(array.length == 0) return null; return (E) array[r.nextInt(array.length)]; } @@ -195,7 +195,7 @@ public class ProbabilityCollection implements Collection { } @Override - public T get(Random r) { + public T get(RandomGenerator r) { return single; } diff --git a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/generator/BukkitChunkGeneratorWrapper.java b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/generator/BukkitChunkGeneratorWrapper.java index 4cb9bfaef..9df6f7f15 100644 --- a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/generator/BukkitChunkGeneratorWrapper.java +++ b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/generator/BukkitChunkGeneratorWrapper.java @@ -28,7 +28,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.List; -import java.util.Random; +import java.util.random.RandomGenerator; import java.util.stream.Collectors; import com.dfsek.terra.api.block.state.BlockState; @@ -63,7 +63,7 @@ public class BukkitChunkGeneratorWrapper extends org.bukkit.generator.ChunkGener } @Override - public void generateNoise(@NotNull WorldInfo worldInfo, @NotNull Random random, int x, int z, @NotNull ChunkData chunkData) { + public void generateNoise(@NotNull WorldInfo worldInfo, @NotNull RandomGenerator random, int x, int z, @NotNull ChunkData chunkData) { BukkitWorldProperties properties = new BukkitWorldProperties(worldInfo); delegate.generateChunkData(new BukkitProtoChunk(chunkData), properties, pack.getBiomeProvider(), x, z); } @@ -74,7 +74,7 @@ public class BukkitChunkGeneratorWrapper extends org.bukkit.generator.ChunkGener .stream() .map(generationStage -> new BlockPopulator() { @Override - public void populate(@NotNull WorldInfo worldInfo, @NotNull Random random, int x, int z, + public void populate(@NotNull WorldInfo worldInfo, @NotNull RandomGenerator random, int x, int z, @NotNull LimitedRegion limitedRegion) { generationStage.populate(new BukkitProtoWorld(limitedRegion, air, pack.getBiomeProvider())); } diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/gameplay/BoneMealItemMixin.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/gameplay/BoneMealItemMixin.java index 22fac5a71..96c69f8a8 100644 --- a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/gameplay/BoneMealItemMixin.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/gameplay/BoneMealItemMixin.java @@ -1,6 +1,8 @@ package com.dfsek.terra.mod.mixin.gameplay; +import com.dfsek.terra.mod.util.MinecraftAdapter; + import net.minecraft.item.BoneMealItem; import net.minecraft.item.ItemStack; import net.minecraft.server.world.ServerWorld; @@ -14,6 +16,8 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import com.dfsek.terra.mod.util.FertilizableUtil; +import java.util.random.RandomGenerator; + @Mixin(BoneMealItem.class) public class BoneMealItemMixin { @@ -22,7 +26,7 @@ public class BoneMealItemMixin { @Inject(method = "useOnFertilizable", at = @At("HEAD"), cancellable = true) private static void injectUseOnFertilizable(ItemStack stack, World world, BlockPos pos, CallbackInfoReturnable cir) { if(world instanceof ServerWorld) { - Boolean value = FertilizableUtil.grow((ServerWorld) world, pos, world.getBlockState(pos), cooldownId); + Boolean value = FertilizableUtil.grow((ServerWorld) world, MinecraftAdapter.adapt(world.getRandom()), pos, world.getBlockState(pos), cooldownId); stack.decrement(1); if(value != null) { cir.setReturnValue(value); diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/gameplay/BoneMealTaskMixin.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/gameplay/BoneMealTaskMixin.java index f21e424e0..3eb8d813b 100644 --- a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/gameplay/BoneMealTaskMixin.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/gameplay/BoneMealTaskMixin.java @@ -1,7 +1,7 @@ package com.dfsek.terra.mod.mixin.gameplay; -import com.dfsek.terra.api.structure.Structure; +import com.dfsek.terra.mod.util.MinecraftAdapter; import net.minecraft.block.Block; import net.minecraft.block.BlockState; @@ -16,9 +16,9 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import java.util.Map; -import java.util.Random; +import java.util.random.RandomGenerator; -import com.dfsek.terra.api.structure.configured.ConfiguredStructure; +import com.dfsek.terra.api.structure.Structure; import com.dfsek.terra.api.util.Rotation; import com.dfsek.terra.api.util.vector.Vector3Int; import com.dfsek.terra.api.world.WritableWorld; @@ -42,7 +42,7 @@ public class BoneMealTaskMixin { if(villagerFertilizable) { Structure canGrow = config.getCanGrow(); if(canGrow != null) { - Random random = (Random) world.getRandom(); + RandomGenerator random = MinecraftAdapter.adapt(world.getRandom()); cir.setReturnValue(canGrow.generate( Vector3Int.of(pos.getX(), pos.getY(), pos.getZ()), (WritableWorld) world, random, Rotation.NONE)); return; diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/gameplay/ServerWorldMixin.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/gameplay/ServerWorldMixin.java index 0081db33d..b64726b36 100644 --- a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/gameplay/ServerWorldMixin.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/gameplay/ServerWorldMixin.java @@ -1,6 +1,8 @@ package com.dfsek.terra.mod.mixin.gameplay; +import com.dfsek.terra.mod.util.MinecraftAdapter; + import net.minecraft.block.BlockState; import net.minecraft.server.world.ServerWorld; import net.minecraft.util.Identifier; @@ -12,6 +14,8 @@ import org.spongepowered.asm.mixin.injection.Redirect; import com.dfsek.terra.mod.util.FertilizableUtil; +import java.util.random.RandomGenerator; + @Mixin(ServerWorld.class) public class ServerWorldMixin { @@ -22,7 +26,7 @@ public class ServerWorldMixin { target = "Lnet/minecraft/block/BlockState;randomTick(Lnet/minecraft/server/world/ServerWorld;" + "Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/util/math/random/Random;)V")) public void injectTickChunk(BlockState instance, ServerWorld serverWorld, BlockPos blockPos, Random random) { - Boolean value = FertilizableUtil.grow(serverWorld, blockPos, instance, cooldownId); + Boolean value = FertilizableUtil.grow(serverWorld, MinecraftAdapter.adapt(random), blockPos, instance, cooldownId); if(value != null) { if(!value) { instance.randomTick(serverWorld, blockPos, random); diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/util/FertilizableUtil.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/util/FertilizableUtil.java index d29af1232..a550660ca 100644 --- a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/util/FertilizableUtil.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/util/FertilizableUtil.java @@ -1,7 +1,5 @@ package com.dfsek.terra.mod.util; -import com.dfsek.terra.api.structure.Structure; - import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.server.world.ServerWorld; @@ -10,9 +8,9 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.util.registry.Registry; import java.util.Map; -import java.util.Random; +import java.util.random.RandomGenerator; -import com.dfsek.terra.api.structure.configured.ConfiguredStructure; +import com.dfsek.terra.api.structure.Structure; import com.dfsek.terra.api.util.Rotation; import com.dfsek.terra.api.util.vector.Vector3Int; import com.dfsek.terra.api.world.WritableWorld; @@ -20,14 +18,7 @@ import com.dfsek.terra.mod.config.FertilizableConfig; public class FertilizableUtil { - - private static final Random mojankRandom = new Random(); - - public static Boolean grow(ServerWorld world, BlockPos pos, BlockState state, Identifier cooldownId) { - return grow(world, mojankRandom, pos, state, cooldownId); - } - - public static Boolean grow(ServerWorld world, Random random, BlockPos pos, BlockState state, Identifier cooldownId) { + public static Boolean grow(ServerWorld world, RandomGenerator random, BlockPos pos, BlockState state, Identifier cooldownId) { Map map = BiomeUtil.TERRA_BIOME_FERTILIZABLE_MAP.get(world.getBiome(pos)); if(map != null) { Block block = state.getBlock(); diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/util/MinecraftAdapter.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/util/MinecraftAdapter.java index 2f43913e2..f21f40505 100644 --- a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/util/MinecraftAdapter.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/util/MinecraftAdapter.java @@ -18,11 +18,14 @@ package com.dfsek.terra.mod.util; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.random.Random; import net.minecraft.world.HeightLimitView; import com.dfsek.terra.api.util.vector.Vector3; import com.dfsek.terra.api.world.info.WorldProperties; +import java.util.random.RandomGenerator; + public final class MinecraftAdapter { @@ -53,4 +56,48 @@ public final class MinecraftAdapter { } }; } + + public static RandomGenerator adapt(Random random) { + return new RandomGenerator() { + @Override + public boolean nextBoolean() { + return random.nextBoolean(); + } + + @Override + public float nextFloat() { + return random.nextFloat(); + } + + @Override + public double nextDouble() { + return random.nextDouble(); + } + + @Override + public int nextInt() { + return random.nextInt(); + } + + @Override + public int nextInt(int bound) { + return random.nextInt(bound); + } + + @Override + public long nextLong() { + return random.nextLong(); + } + + @Override + public double nextGaussian() { + return random.nextGaussian(); + } + + @Override + public int nextInt(int origin, int bound) { + return random.nextBetween(origin, bound); + } + }; + } }