diff --git a/build.gradle.kts b/build.gradle.kts index 141e8d0e1..2b1599f4c 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -43,7 +43,6 @@ dependencies { implementation("commons-io:commons-io:2.4") implementation("org.apache.commons:commons-imaging:1.0-alpha2") - implementation("org.apache.commons:commons-math3:3.6.1") compileOnly("com.sk89q.worldedit:worldedit-bukkit:7.2.0-SNAPSHOT") implementation("org.bstats:bstats-bukkit:1.7") @@ -55,7 +54,7 @@ dependencies { compileOnly("org.spigotmc:spigot-api:1.16.2-R0.1-SNAPSHOT") implementation("io.papermc:paperlib:1.0.5") - implementation("it.unimi.dsi:dsiutils:2.6.14") + implementation("net.jafama:jafama:2.3.2") // JUnit. @@ -107,7 +106,8 @@ tasks.named("shadowJar") { relocate("org.bstats.bukkit", "com.dfsek.terra.lib.bstats") relocate("parsii", "com.dfsek.terra.lib.parsii") relocate("io.papermc.lib", "com.dfsek.terra.lib.paperlib") - relocate("it.unimi.dsi", "com.dfsek.terra.lib.unimi") + relocate("net.jafama", "com.dfsek.terra.lib.jafama") + minimize() } tasks.build { diff --git a/lib/Gaea-1.14.3.jar b/lib/Gaea-1.14.3.jar index 62866ea34..0fc0aa392 100644 Binary files a/lib/Gaea-1.14.3.jar and b/lib/Gaea-1.14.3.jar differ diff --git a/lib/parsii-1.2.1.jar b/lib/parsii-1.2.1.jar index f41d64924..c68c7f1ad 100644 Binary files a/lib/parsii-1.2.1.jar and b/lib/parsii-1.2.1.jar differ diff --git a/src/main/java/com/dfsek/terra/EventListener.java b/src/main/java/com/dfsek/terra/EventListener.java index 9dcf6fa62..15551566c 100644 --- a/src/main/java/com/dfsek/terra/EventListener.java +++ b/src/main/java/com/dfsek/terra/EventListener.java @@ -6,7 +6,6 @@ import com.dfsek.terra.config.genconfig.TreeConfig; import com.dfsek.terra.config.genconfig.structure.StructureConfig; import com.dfsek.terra.registry.TreeRegistry; import com.dfsek.terra.util.StructureTypeEnum; -import it.unimi.dsi.util.XoRoShiRo128PlusPlusRandom; import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.block.data.BlockData; @@ -24,6 +23,7 @@ import org.bukkit.event.world.StructureGrowEvent; import org.polydev.gaea.GaeaPlugin; import org.polydev.gaea.tree.Tree; import org.polydev.gaea.tree.TreeType; +import org.polydev.gaea.util.FastRandom; public class EventListener implements Listener { private final GaeaPlugin main; @@ -81,9 +81,9 @@ public class EventListener implements Listener { Tree tree = registry.get(TreeType.fromBukkit(e.getSpecies()).toString()); Debug.info("Overriding tree type: " + e.getSpecies()); if(tree instanceof TreeConfig) { - if(!((TreeConfig) tree).plantBlockCheck(e.getLocation(), new XoRoShiRo128PlusPlusRandom())) { + if(!((TreeConfig) tree).plantBlockCheck(e.getLocation(), new FastRandom())) { block.setBlockData(data); } - } else if(!tree.plant(e.getLocation(), new XoRoShiRo128PlusPlusRandom(), Terra.getInstance())) block.setBlockData(data); + } else if(!tree.plant(e.getLocation(), new FastRandom(), Terra.getInstance())) block.setBlockData(data); } } diff --git a/src/main/java/com/dfsek/terra/async/AsyncStructureFinder.java b/src/main/java/com/dfsek/terra/async/AsyncStructureFinder.java index c3ed76555..70baefc9b 100644 --- a/src/main/java/com/dfsek/terra/async/AsyncStructureFinder.java +++ b/src/main/java/com/dfsek/terra/async/AsyncStructureFinder.java @@ -6,11 +6,11 @@ import com.dfsek.terra.biome.grid.TerraBiomeGrid; import com.dfsek.terra.config.genconfig.structure.StructureConfig; import com.dfsek.terra.structure.Rotation; import com.dfsek.terra.structure.Structure; -import it.unimi.dsi.util.XoRoShiRo128PlusPlusRandom; import org.bukkit.Location; import org.bukkit.World; import org.bukkit.util.Vector; import org.jetbrains.annotations.NotNull; +import org.polydev.gaea.util.FastRandom; import java.util.Random; import java.util.function.Consumer; @@ -36,7 +36,7 @@ public class AsyncStructureFinder extends AsyncFeatureFinder { Location spawn = target.getSpawn().getChunkSpawn(x, z, world.getSeed()).toLocation(world); if(!TerraWorld.getWorld(world).getConfig().getBiome((UserDefinedBiome) getGrid().getBiome(spawn)).getStructures().contains(target)) return false; - Random r2 = new XoRoShiRo128PlusPlusRandom(spawn.hashCode()); + Random r2 = new FastRandom(spawn.hashCode()); Structure struc = target.getStructure(r2); Rotation rotation = Rotation.fromDegrees(r2.nextInt(4) * 90); for(int y = target.getSearchStart().get(r2); y > 0; y--) { diff --git a/src/main/java/com/dfsek/terra/biome/postprocessing/ErosionNoise.java b/src/main/java/com/dfsek/terra/biome/postprocessing/ErosionNoise.java index 2052659dd..3202dde91 100644 --- a/src/main/java/com/dfsek/terra/biome/postprocessing/ErosionNoise.java +++ b/src/main/java/com/dfsek/terra/biome/postprocessing/ErosionNoise.java @@ -1,6 +1,6 @@ package com.dfsek.terra.biome.postprocessing; -import org.apache.commons.math3.util.FastMath; +import net.jafama.FastMath; import org.polydev.gaea.math.FastNoiseLite; /** diff --git a/src/main/java/com/dfsek/terra/carving/Cavern.java b/src/main/java/com/dfsek/terra/carving/Cavern.java index d963e95b9..7ec405639 100644 --- a/src/main/java/com/dfsek/terra/carving/Cavern.java +++ b/src/main/java/com/dfsek/terra/carving/Cavern.java @@ -4,12 +4,12 @@ import com.dfsek.terra.procgen.GridSpawn; import com.dfsek.terra.procgen.voxel.DeformedSphere; import com.dfsek.terra.procgen.voxel.Tube; import com.dfsek.terra.procgen.voxel.VoxelGeometry; -import it.unimi.dsi.util.XoRoShiRo128PlusPlusRandom; import org.bukkit.Bukkit; import org.bukkit.World; import org.bukkit.util.Vector; import org.polydev.gaea.math.FastNoiseLite; import org.polydev.gaea.math.MathUtil; +import org.polydev.gaea.util.FastRandom; import java.util.Random; @@ -24,7 +24,7 @@ public class Cavern { public VoxelGeometry carveChunk(int chunkX, int chunkZ) { long seedC = MathUtil.getCarverChunkSeed(chunkX, chunkZ, seed); - Random chunk = new XoRoShiRo128PlusPlusRandom(seedC); + Random chunk = new FastRandom(seedC); Vector org = node.getNodeLocation((chunkX << 4) + 8, (chunkZ << 4) + 8).clone().setY(chunk.nextInt(128)); VoxelGeometry carve = VoxelGeometry.getBlank(); @@ -34,7 +34,7 @@ public class Cavern { Bukkit.getLogger().info("Cavern: " + org.toString()); carve.merge(new DeformedSphere(org.clone(), chunk.nextInt(4) + 3, 0.75, smpl)); - Vector _00 = new Vector(org.getX() + 16, new XoRoShiRo128PlusPlusRandom(MathUtil.getCarverChunkSeed(chunkX + 1, chunkZ, seed)).nextInt(128), org.getZ()); + Vector _00 = new Vector(org.getX() + 16, new FastRandom(MathUtil.getCarverChunkSeed(chunkX + 1, chunkZ, seed)).nextInt(128), org.getZ()); carve.merge(new Tube(org, _00, 4)); return carve; diff --git a/src/main/java/com/dfsek/terra/carving/SimplexCarver.java b/src/main/java/com/dfsek/terra/carving/SimplexCarver.java index 2f86e573d..8641dd229 100644 --- a/src/main/java/com/dfsek/terra/carving/SimplexCarver.java +++ b/src/main/java/com/dfsek/terra/carving/SimplexCarver.java @@ -1,6 +1,6 @@ package com.dfsek.terra.carving; -import org.apache.commons.math3.util.FastMath; +import net.jafama.FastMath; import org.bukkit.World; import org.bukkit.util.Vector; import org.polydev.gaea.math.FastNoiseLite; diff --git a/src/main/java/com/dfsek/terra/carving/UserDefinedCarver.java b/src/main/java/com/dfsek/terra/carving/UserDefinedCarver.java index 1df4c251c..25f147d2c 100644 --- a/src/main/java/com/dfsek/terra/carving/UserDefinedCarver.java +++ b/src/main/java/com/dfsek/terra/carving/UserDefinedCarver.java @@ -3,12 +3,12 @@ package com.dfsek.terra.carving; import com.dfsek.terra.TerraWorld; import com.dfsek.terra.biome.UserDefinedBiome; import com.dfsek.terra.config.base.ConfigPack; -import it.unimi.dsi.util.XoRoShiRo128PlusPlusRandom; -import org.apache.commons.math3.util.FastMath; +import net.jafama.FastMath; import org.bukkit.World; import org.bukkit.util.Vector; import org.polydev.gaea.generation.GenerationPhase; import org.polydev.gaea.math.Range; +import org.polydev.gaea.util.FastRandom; import org.polydev.gaea.world.carving.Carver; import org.polydev.gaea.world.carving.Worm; @@ -41,7 +41,7 @@ public class UserDefinedCarver extends Carver { @Override public Worm getWorm(long l, Vector vector) { - Random r = new XoRoShiRo128PlusPlusRandom(l + hash); + Random r = new FastRandom(l + hash); return new UserDefinedWorm(length.get(r) / 2, r, vector, radius.getMax(), topCut, bottomCut); } @@ -60,7 +60,7 @@ public class UserDefinedCarver extends Carver { @Override public boolean isChunkCarved(World w, int chunkX, int chunkZ, Random random) { ConfigPack c = TerraWorld.getWorld(w).getConfig(); - return new XoRoShiRo128PlusPlusRandom(random.nextLong() + hash).nextInt(100) < c.getBiome((UserDefinedBiome) TerraWorld.getWorld(w).getGrid().getBiome(chunkX << 4, chunkZ << 4, GenerationPhase.POPULATE)).getCarverChance(this); + return new FastRandom(random.nextLong() + hash).nextInt(100) < c.getBiome((UserDefinedBiome) TerraWorld.getWorld(w).getGrid().getBiome(chunkX << 4, chunkZ << 4, GenerationPhase.POPULATE)).getCarverChance(this); } private class UserDefinedWorm extends Worm { diff --git a/src/main/java/com/dfsek/terra/command/OreCommand.java b/src/main/java/com/dfsek/terra/command/OreCommand.java index dfae3ec5b..c5a13a29d 100644 --- a/src/main/java/com/dfsek/terra/command/OreCommand.java +++ b/src/main/java/com/dfsek/terra/command/OreCommand.java @@ -3,8 +3,7 @@ package com.dfsek.terra.command; import com.dfsek.terra.TerraWorld; import com.dfsek.terra.config.genconfig.OreConfig; import com.dfsek.terra.config.lang.LangUtil; -import it.unimi.dsi.util.XoRoShiRo128PlusPlusRandom; -import org.apache.commons.math3.util.FastMath; +import net.jafama.FastMath; import org.bukkit.World; import org.bukkit.block.Block; import org.bukkit.command.Command; @@ -13,6 +12,7 @@ import org.bukkit.entity.Player; import org.bukkit.util.Vector; import org.jetbrains.annotations.NotNull; import org.polydev.gaea.command.WorldCommand; +import org.polydev.gaea.util.FastRandom; import java.util.Collections; import java.util.List; @@ -36,7 +36,7 @@ public class OreCommand extends WorldCommand { return true; } Vector source = new Vector(FastMath.floorMod(bl.getX(), 16), bl.getY(), FastMath.floorMod(bl.getZ(), 16)); - ore.doVein(source, bl.getChunk(), new XoRoShiRo128PlusPlusRandom()); + ore.doVein(source, bl.getChunk(), new FastRandom()); } else { LangUtil.send("command.ore.main-menu", sender); } diff --git a/src/main/java/com/dfsek/terra/config/genconfig/FloraConfig.java b/src/main/java/com/dfsek/terra/config/genconfig/FloraConfig.java index 338a22940..474b53b86 100644 --- a/src/main/java/com/dfsek/terra/config/genconfig/FloraConfig.java +++ b/src/main/java/com/dfsek/terra/config/genconfig/FloraConfig.java @@ -4,8 +4,7 @@ import com.dfsek.terra.config.TerraConfig; import com.dfsek.terra.config.base.ConfigPack; import com.dfsek.terra.config.base.ConfigUtil; import com.dfsek.terra.config.exception.ConfigException; -import it.unimi.dsi.util.XoRoShiRo128PlusPlusRandom; -import org.apache.commons.math3.util.FastMath; +import net.jafama.FastMath; import org.bukkit.Chunk; import org.bukkit.Location; import org.bukkit.Material; @@ -14,6 +13,7 @@ import org.bukkit.block.BlockFace; import org.bukkit.block.data.BlockData; import org.bukkit.configuration.InvalidConfigurationException; import org.polydev.gaea.math.Range; +import org.polydev.gaea.util.FastRandom; import org.polydev.gaea.world.Flora; import org.polydev.gaea.world.palette.Palette; import org.polydev.gaea.world.palette.RandomPalette; @@ -53,7 +53,7 @@ public class FloraConfig extends TerraConfig implements Flora { physics = getBoolean("physics", false); ceiling = getBoolean("ceiling", false); - Palette p = new RandomPalette<>(new XoRoShiRo128PlusPlusRandom(getInt("seed", 4))); + Palette p = new RandomPalette<>(new FastRandom(getInt("seed", 4))); floraPalette = PaletteConfig.getPalette(getMapList("layers"), p); } diff --git a/src/main/java/com/dfsek/terra/config/genconfig/OreConfig.java b/src/main/java/com/dfsek/terra/config/genconfig/OreConfig.java index a642539ab..917396877 100644 --- a/src/main/java/com/dfsek/terra/config/genconfig/OreConfig.java +++ b/src/main/java/com/dfsek/terra/config/genconfig/OreConfig.java @@ -4,7 +4,7 @@ import com.dfsek.terra.config.TerraConfig; import com.dfsek.terra.config.base.ConfigPack; import com.dfsek.terra.config.base.ConfigUtil; import com.dfsek.terra.config.exception.ConfigException; -import org.apache.commons.math3.util.FastMath; +import net.jafama.FastMath; import org.bukkit.Bukkit; import org.bukkit.Chunk; import org.bukkit.Material; diff --git a/src/main/java/com/dfsek/terra/config/genconfig/PaletteConfig.java b/src/main/java/com/dfsek/terra/config/genconfig/PaletteConfig.java index 412d11bb9..2d93a465c 100644 --- a/src/main/java/com/dfsek/terra/config/genconfig/PaletteConfig.java +++ b/src/main/java/com/dfsek/terra/config/genconfig/PaletteConfig.java @@ -4,12 +4,12 @@ import com.dfsek.terra.Debug; import com.dfsek.terra.config.TerraConfig; import com.dfsek.terra.config.base.ConfigPack; import com.dfsek.terra.config.exception.ConfigException; -import it.unimi.dsi.util.XoRoShiRo128PlusPlusRandom; import org.bukkit.Bukkit; import org.bukkit.block.data.BlockData; import org.bukkit.configuration.InvalidConfigurationException; import org.polydev.gaea.math.FastNoiseLite; import org.polydev.gaea.math.ProbabilityCollection; +import org.polydev.gaea.util.FastRandom; import org.polydev.gaea.world.palette.Palette; import org.polydev.gaea.world.palette.RandomPalette; import org.polydev.gaea.world.palette.SimplexPalette; @@ -36,7 +36,7 @@ public class PaletteConfig extends TerraConfig { pNoise.setFractalOctaves(4); pNoise.setFrequency(getDouble("frequency", 0.02)); pal = new SimplexPalette<>(pNoise); - } else pal = new RandomPalette<>(new XoRoShiRo128PlusPlusRandom(getInt("seed", 2403))); + } else pal = new RandomPalette<>(new FastRandom(getInt("seed", 2403))); palette = getPalette(getMapList("layers"), pal); } diff --git a/src/main/java/com/dfsek/terra/config/genconfig/biome/BiomeOceanConfig.java b/src/main/java/com/dfsek/terra/config/genconfig/biome/BiomeOceanConfig.java index de316e4af..cf720f839 100644 --- a/src/main/java/com/dfsek/terra/config/genconfig/biome/BiomeOceanConfig.java +++ b/src/main/java/com/dfsek/terra/config/genconfig/biome/BiomeOceanConfig.java @@ -4,18 +4,18 @@ import com.dfsek.terra.config.TerraConfig; import com.dfsek.terra.config.TerraConfigSection; import com.dfsek.terra.config.exception.ConfigException; import com.dfsek.terra.config.exception.NotFoundException; -import it.unimi.dsi.util.XoRoShiRo128PlusPlusRandom; import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.block.data.BlockData; import org.bukkit.configuration.InvalidConfigurationException; import org.jetbrains.annotations.NotNull; import org.polydev.gaea.math.ProbabilityCollection; +import org.polydev.gaea.util.FastRandom; import org.polydev.gaea.world.palette.Palette; import org.polydev.gaea.world.palette.RandomPalette; public class BiomeOceanConfig extends TerraConfigSection { - private static final Palette oceanDefault = new RandomPalette(new XoRoShiRo128PlusPlusRandom(0)).add(Material.WATER.createBlockData(), 1); + private static final Palette oceanDefault = new RandomPalette(new FastRandom(0)).add(Material.WATER.createBlockData(), 1); private final Palette ocean; private final int seaLevel; @@ -26,7 +26,7 @@ public class BiomeOceanConfig extends TerraConfigSection { if(oceanN != null) { if(oceanN.startsWith("BLOCK:")) { try { - ocean = new RandomPalette(new XoRoShiRo128PlusPlusRandom(0)).add(new ProbabilityCollection().add(Bukkit.createBlockData(oceanN.substring(6)), 1), 1); + ocean = new RandomPalette(new FastRandom(0)).add(new ProbabilityCollection().add(Bukkit.createBlockData(oceanN.substring(6)), 1), 1); } catch(IllegalArgumentException ex) { throw new ConfigException("BlockData \"" + oceanN + "\" is invalid! (Ocean Palette)", parent.getID()); } diff --git a/src/main/java/com/dfsek/terra/config/genconfig/biome/BiomePaletteConfig.java b/src/main/java/com/dfsek/terra/config/genconfig/biome/BiomePaletteConfig.java index 315bddd14..f7273ab84 100644 --- a/src/main/java/com/dfsek/terra/config/genconfig/biome/BiomePaletteConfig.java +++ b/src/main/java/com/dfsek/terra/config/genconfig/biome/BiomePaletteConfig.java @@ -4,11 +4,11 @@ import com.dfsek.terra.config.TerraConfig; import com.dfsek.terra.config.TerraConfigSection; import com.dfsek.terra.config.exception.ConfigException; import com.dfsek.terra.config.exception.NotFoundException; -import it.unimi.dsi.util.XoRoShiRo128PlusPlusRandom; import org.bukkit.Bukkit; import org.bukkit.block.data.BlockData; import org.bukkit.configuration.InvalidConfigurationException; import org.polydev.gaea.math.ProbabilityCollection; +import org.polydev.gaea.util.FastRandom; import org.polydev.gaea.world.palette.Palette; import org.polydev.gaea.world.palette.RandomPalette; @@ -29,7 +29,7 @@ public class BiomePaletteConfig extends TerraConfigSection { try { if(((String) entry.getKey()).startsWith("BLOCK:")) { try { - paletteMap.put((Integer) entry.getValue(), new RandomPalette(new XoRoShiRo128PlusPlusRandom(0)).add(new ProbabilityCollection().add(Bukkit.createBlockData(((String) entry.getKey()).substring(6)), 1), 1)); + paletteMap.put((Integer) entry.getValue(), new RandomPalette(new FastRandom(0)).add(new ProbabilityCollection().add(Bukkit.createBlockData(((String) entry.getKey()).substring(6)), 1), 1)); } catch(IllegalArgumentException ex) { throw new ConfigException("BlockData " + entry.getKey() + " is invalid! (Palettes)", parent.getID()); } diff --git a/src/main/java/com/dfsek/terra/config/genconfig/biome/BiomeSlabConfig.java b/src/main/java/com/dfsek/terra/config/genconfig/biome/BiomeSlabConfig.java index ca15aef79..159378ca9 100644 --- a/src/main/java/com/dfsek/terra/config/genconfig/biome/BiomeSlabConfig.java +++ b/src/main/java/com/dfsek/terra/config/genconfig/biome/BiomeSlabConfig.java @@ -5,13 +5,13 @@ import com.dfsek.terra.config.TerraConfig; import com.dfsek.terra.config.TerraConfigSection; import com.dfsek.terra.config.exception.ConfigException; import com.dfsek.terra.config.exception.NotFoundException; -import it.unimi.dsi.util.XoRoShiRo128PlusPlusRandom; import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.block.data.BlockData; import org.bukkit.configuration.InvalidConfigurationException; import org.jetbrains.annotations.NotNull; import org.polydev.gaea.math.ProbabilityCollection; +import org.polydev.gaea.util.FastRandom; import org.polydev.gaea.world.palette.Palette; import org.polydev.gaea.world.palette.RandomPalette; @@ -42,7 +42,7 @@ public class BiomeSlabConfig extends TerraConfigSection { if(((String) entry.getValue()).startsWith("BLOCK:")) { try { Debug.info("Adding slab palette with single material " + entry.getKey()); - paletteMap.put(Bukkit.createBlockData((String) entry.getKey()).getMaterial(), new RandomPalette(new XoRoShiRo128PlusPlusRandom(0)).add(new ProbabilityCollection().add(Bukkit.createBlockData(((String) entry.getValue()).substring(6)), 1), 1)); + paletteMap.put(Bukkit.createBlockData((String) entry.getKey()).getMaterial(), new RandomPalette(new FastRandom(0)).add(new ProbabilityCollection().add(Bukkit.createBlockData(((String) entry.getValue()).substring(6)), 1), 1)); } catch(IllegalArgumentException ex) { throw new ConfigException("Invalid BlockData in slab configuration: " + ex.getMessage(), getParent().getConfig().getID()); } diff --git a/src/main/java/com/dfsek/terra/debug/gui/DebugFrame.java b/src/main/java/com/dfsek/terra/debug/gui/DebugFrame.java index 055fd261c..d9436e63a 100644 --- a/src/main/java/com/dfsek/terra/debug/gui/DebugFrame.java +++ b/src/main/java/com/dfsek/terra/debug/gui/DebugFrame.java @@ -4,7 +4,7 @@ import com.dfsek.terra.TerraWorld; import com.dfsek.terra.biome.UserDefinedBiome; import com.dfsek.terra.generation.TerraChunkGenerator; import com.dfsek.terra.image.ImageLoader; -import org.apache.commons.math3.util.FastMath; +import net.jafama.FastMath; import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.polydev.gaea.generation.GenerationPhase; diff --git a/src/main/java/com/dfsek/terra/image/ImageLoader.java b/src/main/java/com/dfsek/terra/image/ImageLoader.java index 4f248a1f7..99167bde8 100644 --- a/src/main/java/com/dfsek/terra/image/ImageLoader.java +++ b/src/main/java/com/dfsek/terra/image/ImageLoader.java @@ -5,7 +5,7 @@ import com.dfsek.terra.biome.BiomeZone; import com.dfsek.terra.biome.grid.TerraBiomeGrid; import com.dfsek.terra.config.base.ConfigUtil; import com.dfsek.terra.debug.gui.DebugGUI; -import org.apache.commons.math3.util.FastMath; +import net.jafama.FastMath; import org.bukkit.World; import org.polydev.gaea.biome.NormalizationUtil; diff --git a/src/main/java/com/dfsek/terra/population/FloraPopulator.java b/src/main/java/com/dfsek/terra/population/FloraPopulator.java index 3fd495c26..998c9e19f 100644 --- a/src/main/java/com/dfsek/terra/population/FloraPopulator.java +++ b/src/main/java/com/dfsek/terra/population/FloraPopulator.java @@ -9,8 +9,7 @@ import com.dfsek.terra.config.base.ConfigPack; import com.dfsek.terra.config.genconfig.biome.BiomeConfig; import com.dfsek.terra.config.genconfig.biome.BiomeFloraConfig; import com.dfsek.terra.event.TreeGenerateEvent; -import com.dfsek.terra.util.GlueList; -import org.apache.commons.math3.util.FastMath; +import net.jafama.FastMath; import org.bukkit.Bukkit; import org.bukkit.Chunk; import org.bukkit.Location; @@ -22,9 +21,9 @@ import org.polydev.gaea.math.Range; import org.polydev.gaea.population.GaeaBlockPopulator; import org.polydev.gaea.profiler.ProfileFuture; import org.polydev.gaea.tree.Tree; +import org.polydev.gaea.util.GlueList; import org.polydev.gaea.world.Flora; -import java.util.ArrayList; import java.util.List; import java.util.Random; diff --git a/src/main/java/com/dfsek/terra/population/StructurePopulator.java b/src/main/java/com/dfsek/terra/population/StructurePopulator.java index 7b1d7aefa..23ee5336d 100644 --- a/src/main/java/com/dfsek/terra/population/StructurePopulator.java +++ b/src/main/java/com/dfsek/terra/population/StructurePopulator.java @@ -13,8 +13,7 @@ import com.dfsek.terra.structure.Structure; import com.dfsek.terra.structure.StructureContainedInventory; import com.dfsek.terra.structure.features.Feature; import com.dfsek.terra.util.structure.RotationUtil; -import it.unimi.dsi.util.XoRoShiRo128PlusPlusRandom; -import org.apache.commons.math3.util.FastMath; +import net.jafama.FastMath; import org.bukkit.Chunk; import org.bukkit.Location; import org.bukkit.World; @@ -23,6 +22,7 @@ import org.bukkit.inventory.BlockInventoryHolder; import org.jetbrains.annotations.NotNull; import org.polydev.gaea.profiler.ProfileFuture; import org.polydev.gaea.structures.loot.LootTable; +import org.polydev.gaea.util.FastRandom; import java.util.Random; @@ -42,7 +42,7 @@ public class StructurePopulator extends BlockPopulator { for(StructureConfig conf : config.getAllStructures()) { Location spawn = conf.getSpawn().getNearestSpawn(cx + 8, cz + 8, world.getSeed()).toLocation(world); if(!config.getBiome((UserDefinedBiome) grid.getBiome(spawn)).getStructures().contains(conf)) continue; - Random r2 = new XoRoShiRo128PlusPlusRandom(spawn.hashCode()); + Random r2 = new FastRandom(spawn.hashCode()); Structure struc = conf.getStructure(r2); Rotation rotation = Rotation.fromDegrees(r2.nextInt(4) * 90); for(int y = conf.getSearchStart().get(r2); y > 0; y--) { diff --git a/src/main/java/com/dfsek/terra/procgen/GridSpawn.java b/src/main/java/com/dfsek/terra/procgen/GridSpawn.java index 0a0e16ab9..6a53a9209 100644 --- a/src/main/java/com/dfsek/terra/procgen/GridSpawn.java +++ b/src/main/java/com/dfsek/terra/procgen/GridSpawn.java @@ -1,11 +1,10 @@ package com.dfsek.terra.procgen; -import com.dfsek.terra.util.GlueList; -import it.unimi.dsi.util.XoRoShiRo128PlusPlusRandom; import org.bukkit.util.Vector; import org.polydev.gaea.math.MathUtil; +import org.polydev.gaea.util.FastRandom; +import org.polydev.gaea.util.GlueList; -import java.util.ArrayList; import java.util.List; import java.util.Random; @@ -55,7 +54,7 @@ public class GridSpawn { * @return Vector representing spawnpoint */ public Vector getChunkSpawn(int structureChunkX, int structureChunkZ, long seed) { - Random r = new XoRoShiRo128PlusPlusRandom(MathUtil.getCarverChunkSeed(structureChunkX, structureChunkZ, seed)); + Random r = new FastRandom(MathUtil.getCarverChunkSeed(structureChunkX, structureChunkZ, seed)); int offsetX = r.nextInt(width); int offsetZ = r.nextInt(width); int sx = structureChunkX * (width + 2 * separation) + offsetX; diff --git a/src/main/java/com/dfsek/terra/procgen/math/Vector2.java b/src/main/java/com/dfsek/terra/procgen/math/Vector2.java index 3de79ec05..6ec295b17 100644 --- a/src/main/java/com/dfsek/terra/procgen/math/Vector2.java +++ b/src/main/java/com/dfsek/terra/procgen/math/Vector2.java @@ -1,6 +1,6 @@ package com.dfsek.terra.procgen.math; -import org.apache.commons.math3.util.FastMath; +import net.jafama.FastMath; /** * oh yeah diff --git a/src/main/java/com/dfsek/terra/procgen/pixel/Rectangle.java b/src/main/java/com/dfsek/terra/procgen/pixel/Rectangle.java index 78a075e33..fb2df4824 100644 --- a/src/main/java/com/dfsek/terra/procgen/pixel/Rectangle.java +++ b/src/main/java/com/dfsek/terra/procgen/pixel/Rectangle.java @@ -1,7 +1,7 @@ package com.dfsek.terra.procgen.pixel; import com.dfsek.terra.procgen.math.Vector2; -import org.apache.commons.math3.util.FastMath; +import net.jafama.FastMath; import java.util.HashSet; import java.util.Set; diff --git a/src/main/java/com/dfsek/terra/procgen/voxel/VoxelGeometry.java b/src/main/java/com/dfsek/terra/procgen/voxel/VoxelGeometry.java index b5db0e3a7..3d0405722 100644 --- a/src/main/java/com/dfsek/terra/procgen/voxel/VoxelGeometry.java +++ b/src/main/java/com/dfsek/terra/procgen/voxel/VoxelGeometry.java @@ -1,9 +1,8 @@ package com.dfsek.terra.procgen.voxel; -import com.dfsek.terra.util.GlueList; import org.bukkit.util.Vector; +import org.polydev.gaea.util.GlueList; -import java.util.ArrayList; import java.util.List; public abstract class VoxelGeometry { diff --git a/src/main/java/com/dfsek/terra/structure/Rotation.java b/src/main/java/com/dfsek/terra/structure/Rotation.java index cf4d02081..e9aac096e 100644 --- a/src/main/java/com/dfsek/terra/structure/Rotation.java +++ b/src/main/java/com/dfsek/terra/structure/Rotation.java @@ -1,6 +1,6 @@ package com.dfsek.terra.structure; -import org.apache.commons.math3.util.FastMath; +import net.jafama.FastMath; public enum Rotation { CW_90(90), CW_180(180), CCW_90(270), NONE(0); diff --git a/src/main/java/com/dfsek/terra/structure/Structure.java b/src/main/java/com/dfsek/terra/structure/Structure.java index 2e26b7451..d68394b2f 100644 --- a/src/main/java/com/dfsek/terra/structure/Structure.java +++ b/src/main/java/com/dfsek/terra/structure/Structure.java @@ -3,7 +3,7 @@ package com.dfsek.terra.structure; import com.dfsek.terra.Debug; import com.dfsek.terra.procgen.math.Vector2; import com.dfsek.terra.util.structure.RotationUtil; -import org.apache.commons.math3.util.FastMath; +import net.jafama.FastMath; import org.bukkit.Bukkit; import org.bukkit.Chunk; import org.bukkit.Location; diff --git a/src/main/java/com/dfsek/terra/structure/StructureInfo.java b/src/main/java/com/dfsek/terra/structure/StructureInfo.java index 1abcbcc09..e08fddcbf 100644 --- a/src/main/java/com/dfsek/terra/structure/StructureInfo.java +++ b/src/main/java/com/dfsek/terra/structure/StructureInfo.java @@ -1,7 +1,7 @@ package com.dfsek.terra.structure; import com.dfsek.terra.procgen.math.Vector2; -import org.apache.commons.math3.util.FastMath; +import net.jafama.FastMath; import java.io.Serializable; diff --git a/src/main/java/com/dfsek/terra/structure/features/EntityFeature.java b/src/main/java/com/dfsek/terra/structure/features/EntityFeature.java index 19b126d32..c44bf2d85 100644 --- a/src/main/java/com/dfsek/terra/structure/features/EntityFeature.java +++ b/src/main/java/com/dfsek/terra/structure/features/EntityFeature.java @@ -4,9 +4,7 @@ import com.dfsek.terra.Debug; import com.dfsek.terra.structure.Rotation; import com.dfsek.terra.structure.Structure; import com.dfsek.terra.structure.StructureInfo; -import com.dfsek.terra.util.GlueList; -import it.unimi.dsi.util.XoRoShiRo128PlusPlusRandom; -import org.apache.commons.math3.util.FastMath; +import net.jafama.FastMath; import org.bukkit.Chunk; import org.bukkit.Location; import org.bukkit.Material; @@ -15,8 +13,9 @@ import org.bukkit.block.BlockFace; import org.bukkit.entity.EntityType; import org.polydev.gaea.math.MathUtil; import org.polydev.gaea.math.Range; +import org.polydev.gaea.util.FastRandom; +import org.polydev.gaea.util.GlueList; -import java.util.ArrayList; import java.util.List; import java.util.Objects; import java.util.Random; @@ -57,7 +56,7 @@ public class EntityFeature implements Feature { @Override public void apply(Structure structure, Rotation r, Location l, Chunk chunk) { - Random random = new XoRoShiRo128PlusPlusRandom(MathUtil.getCarverChunkSeed(chunk.getX(), chunk.getZ(), chunk.getWorld().getSeed())); + Random random = new FastRandom(MathUtil.getCarverChunkSeed(chunk.getX(), chunk.getZ(), chunk.getWorld().getSeed())); for(Location attempt : getLocations(structure, r, l, random, amount.get(random))) { if(!isInChunk(chunk, attempt)) continue; // Don't attempt spawn if not in current chunk. attemptSpawn(attempt, l); diff --git a/src/main/java/com/dfsek/terra/util/DataUtil.java b/src/main/java/com/dfsek/terra/util/DataUtil.java index b2091c6a1..902d1accf 100644 --- a/src/main/java/com/dfsek/terra/util/DataUtil.java +++ b/src/main/java/com/dfsek/terra/util/DataUtil.java @@ -1,8 +1,8 @@ package com.dfsek.terra.util; -import it.unimi.dsi.util.XoRoShiRo128PlusPlusRandom; import org.bukkit.Material; import org.bukkit.block.data.BlockData; +import org.polydev.gaea.util.FastRandom; import org.polydev.gaea.world.palette.Palette; import org.polydev.gaea.world.palette.RandomPalette; @@ -11,5 +11,5 @@ public final class DataUtil { public static final BlockData SNOW = Material.SNOW.createBlockData(); public static final BlockData WATER = Material.WATER.createBlockData(); public static final BlockData AIR = Material.AIR.createBlockData(); - public static final Palette BLANK_PALETTE = new RandomPalette(new XoRoShiRo128PlusPlusRandom(2403)).add(AIR, 1); + public static final Palette BLANK_PALETTE = new RandomPalette(new FastRandom(2403)).add(AIR, 1); } diff --git a/src/main/java/com/dfsek/terra/util/GlueList.java b/src/main/java/com/dfsek/terra/util/GlueList.java deleted file mode 100644 index 9079513d3..000000000 --- a/src/main/java/com/dfsek/terra/util/GlueList.java +++ /dev/null @@ -1,1050 +0,0 @@ -/** - * Copyright 2015 Ertuğrul Çetin - *

- * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.dfsek.terra.util; - -import java.io.IOException; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; -import java.io.Serializable; -import java.util.AbstractList; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.ConcurrentModificationException; -import java.util.Iterator; -import java.util.LinkedList; -import java.util.List; -import java.util.ListIterator; -import java.util.NoSuchElementException; -import java.util.Objects; - -import static org.apache.commons.math3.util.FastMath.abs; -import static org.apache.commons.math3.util.FastMath.max; -import static org.apache.commons.math3.util.FastMath.min; - - -/** - * GlueList is a brand new List implementation which is way faster than ArrayList and LinkedList. - * This implementation inspired from ArrayList and LinkedList working mechanism. - *
- * Nodes holding data in arrays, in the beginning the world just like ArrayList ,inserts data into array one by one when there is no space for insertion to array - * new Node will be created and linked with the last Node. - *
- * The array which belongs to newly created node has half of the size of list , just like ArrayList. - * In ArrayList when there is no space for it it creates new array with double of old size and inserts old data into new one. - * Unlike ArrayList GlueList does it dynamically way with creating new node so old data does NOT have to be moved to another array. - * You can think that GlueList is dynamic version of ArrayList. - *
- * Adding and removing operations much faster than ArrayList and LinkedList. - * Searching operations nearly same with ArrayList and way better than LinkedList. - *

- * Best Case
- * Add O(1)
- * Remove O(1)
- * Search O(1)
- * Access O(1) - *

- * "m" number of created nodes.
- * "n" size of node array.
- * If you insert 10_000_000 record into List there will be just 36 nodes.

- * Worst Case
- * Add O(n*m)
- * Remove O(n*m)
- * Search O(m)
- * Access O(m) - *

- * version v1.0 - *

- * Date: 03.11.2015 - *

- * - * @author Ertuğrul Çetin ~ ertu.ctn@gmail.com - * @see Collection - * @see List - * @see LinkedList - * @see ArrayList - * @param the type of elements held in this collection - */ -public class GlueList extends AbstractList implements List, Cloneable, Serializable { - - transient Node first; - transient Node last; - - int size; - - int initialCapacity; - - private static final int DEFAULT_CAPACITY = 10; - - private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8; - - public GlueList() { - - Node initNode = new Node<>(null, null, 0, DEFAULT_CAPACITY); - - first = initNode; - last = initNode; - } - - public GlueList(int initialCapacity) { - - this.initialCapacity = (initialCapacity > MAX_ARRAY_SIZE) ? MAX_ARRAY_SIZE : initialCapacity; - - Node initNode = new Node<>(null, null, 0, initialCapacity); - - first = initNode; - last = initNode; - } - - public GlueList(Collection c) { - - Objects.requireNonNull(c); - - Object[] arr = c.toArray(); - - int len = arr.length; - - if (len != 0) { - - Node initNode = new Node<>(null, null, 0, len); - - first = initNode; - last = initNode; - - System.arraycopy(arr, 0, last.elementData, 0, len); - - last.elementDataPointer += len; - } else { - - Node initNode = new Node<>(null, null, 0, DEFAULT_CAPACITY); - - first = initNode; - last = initNode; - } - - modCount++; - size += len; - } - - @Override - public boolean add(T element) { - - Node l = last; - - if (l.isAddable()) { - l.add(element); - } else { - Node newNode = new Node<>(l, null, size); - newNode.add(element); - last = newNode; - l.next = last; - } - - modCount++; - size++; - - return true; - } - - @SuppressWarnings("unchecked") - @Override - public void add(int index, T element) { - - rangeCheckForAdd(index); - - Node node = getNodeForAdd(index); - - if (node == null) { - - Node l = last; - - Node newNode = new Node<>(l, null, size); - - last = newNode; - - l.next = last; - - node = newNode; - } - - //if it is last and has extra space for element... - if (node == last && node.elementData.length - node.elementDataPointer > 0) { - - int nodeArrIndex = index - node.startingIndex; - - System.arraycopy(node.elementData, nodeArrIndex, node.elementData, nodeArrIndex + 1, node.elementDataPointer - nodeArrIndex); - - node.elementData[nodeArrIndex] = element; - - if (nodeArrIndex > 0) { - System.arraycopy(node.elementData, 0, node.elementData, 0, nodeArrIndex); - } - - node.elementDataPointer++; - } else { - - int newLen = node.elementData.length + 1; - T[] newElementData = (T[]) new Object[newLen]; - - int nodeArrIndex = index - node.startingIndex; - - System.arraycopy(node.elementData, nodeArrIndex, newElementData, nodeArrIndex + 1, node.elementDataPointer - nodeArrIndex); - - newElementData[nodeArrIndex] = element; - - if (nodeArrIndex > 0) { - System.arraycopy(node.elementData, 0, newElementData, 0, nodeArrIndex); - } - - node.elementData = newElementData; - node.endingIndex++; - node.elementDataPointer++; - } - - updateNodesAfterAdd(node); - - modCount++; - size++; - } - - private void rangeCheckForAdd(int index) { - - if (index > size || index < 0) { - throw new ArrayIndexOutOfBoundsException(index); - } - } - - private void updateNodesAfterAdd(Node nodeFrom) { - - for (Node node = nodeFrom.next; node != null; node = node.next) { - - node.startingIndex++; - node.endingIndex++; - } - } - - @SuppressWarnings("unchecked") - @Override - public boolean addAll(Collection c) { - - Objects.requireNonNull(c); - - Object[] collection = c.toArray(); - - int len = collection.length; - - if (len == 0) { - return false; - } - - if (size == 0) { - - if (initialCapacity >= len) { - System.arraycopy(collection, 0, last.elementData, 0, len); - } else { - last.elementData = Arrays.copyOf((T[]) collection, len); - last.endingIndex = len - 1; - } - - last.elementDataPointer += len; - - modCount++; - size += len; - - return true; - } - - int elementDataLen = last.elementData.length; - int elementSize = last.elementDataPointer; - - int remainedStorage = elementDataLen - elementSize; - - if (remainedStorage == 0) { - - Node l = last; - - int newLen = (size >>> 1); - int initialLen = (len > newLen) ? len : newLen; - - Node newNode = new Node<>(l, null, size, initialLen); - - System.arraycopy(collection, 0, newNode.elementData, 0, len); - - newNode.elementDataPointer += len; - - last = newNode; - l.next = last; - - modCount++; - size += len; - - return true; - } - - if (len <= remainedStorage) { - - System.arraycopy(collection, 0, last.elementData, elementSize, len); - - last.elementDataPointer += len; - - modCount++; - size += len; - - return true; - } - - if (len > remainedStorage) { - - System.arraycopy(collection, 0, last.elementData, elementSize, remainedStorage); - - last.elementDataPointer += remainedStorage; - size += remainedStorage; - - int newLen = (size >>> 1); - int remainedDataLen = len - remainedStorage; - - int initialLen = (newLen > remainedDataLen) ? newLen : remainedDataLen; - - Node l = last; - - Node newNode = new Node<>(l, null, size, initialLen); - - System.arraycopy(collection, remainedStorage, newNode.elementData, 0, remainedDataLen); - - newNode.elementDataPointer += remainedDataLen; - - last = newNode; - l.next = last; - - modCount++; - size += remainedDataLen; - - return true; - } - - return false; - } - - @Override - public T set(int index, T element) { - - rangeCheck(index); - - Node node = getNode(index); - - int nodeArrIndex = index - node.startingIndex; - - T oldValue = node.elementData[nodeArrIndex]; - - node.elementData[nodeArrIndex] = element; - - return oldValue; - } - - @Override - public T get(int index) { - - rangeCheck(index); - - Node node = getNode(index); - - return node.elementData[index - node.startingIndex]; - } - - @Override - public int indexOf(Object o) { - - int index = 0; - - if (o == null) { - - for (Node node = first; node != null; node = node.next) { - for (int i = 0; i < node.elementDataPointer; i++) { - if (node.elementData[i] == null) { - return index; - } - index++; - } - } - } else { - - for (Node node = first; node != null; node = node.next) { - for (int i = 0; i < node.elementDataPointer; i++) { - if (o.equals(node.elementData[i])) { - return index; - } - index++; - } - } - } - - return -1; - } - - @Override - public int lastIndexOf(Object o) { - - int index = size - 1; - - if (o == null) { - for (Node node = last; node != null; node = node.pre) { - for (int i = node.elementDataPointer - 1; i >= 0; i--) { - if (node.elementData[i] == null) { - return index; - } - index--; - } - } - } else { - - for (Node node = last; node != null; node = node.pre) { - for (int i = node.elementDataPointer - 1; i >= 0; i--) { - if (o.equals(node.elementData[i])) { - return index; - } - index--; - } - } - } - - return -1; - } - - @Override - public boolean contains(Object o) { - return indexOf(o) != -1; - } - - @SuppressWarnings("unchecked") - @Override - public T remove(int index) { - - rangeCheck(index); - - Node node; - - if (size == 2 && first != last) { - - Node newNode = new Node<>(null, null, 0, 2); - newNode.add(first.elementData[0]); - newNode.add(last.elementData[0]); - - node = first = last = newNode; - } else { - node = getNode(index); - } - - T[] elementData = node.elementData; - - int elementSize = node.elementDataPointer; - - int nodeArrIndex = index - node.startingIndex; - - T oldValue = elementData[nodeArrIndex]; - - int numMoved = elementSize - nodeArrIndex - 1; - - if (numMoved > 0) { - System.arraycopy(node.elementData, nodeArrIndex + 1, node.elementData, nodeArrIndex, numMoved); - } - - if (first == last || node == last) { - node.elementData[elementSize - 1] = null; - } else { - node.elementData = Arrays.copyOf(node.elementData, elementSize - 1); - node.endingIndex = (--node.endingIndex < 0) ? 0 : node.endingIndex; - } - - node.elementDataPointer--; - - updateNodesAfterRemove(node); - - if (node.elementDataPointer == 0 && first != last) { - - Node next = node.next; - Node prev = node.pre; - - if (prev == null) { - first = next; - } else { - prev.next = next; - node.pre = null; - } - - if (next == null) { - last = prev; - } else { - next.pre = prev; - node.next = null; - } - - node.elementData = null; - } - - size--; - modCount++; - - return oldValue; - } - - @Override - public boolean removeAll(Collection c) { - - Objects.requireNonNull(c); - - Object[] arr = c.toArray(); - if (arr.length == 0) { - return false; - } - - boolean isModified = false; - - for (Object o : arr) { - isModified |= remove(o); - } - - return isModified; - } - - @Override - public boolean retainAll(Collection c) { - - Objects.requireNonNull(c); - - Object[] arr = c.toArray(); - if (arr.length == 0) { - return false; - } - - boolean isModified = false; - - Object[] elements = toArray(); - - for (Object element : elements) { - - if (!c.contains(element)) { - isModified |= remove(element); - } - } - - return isModified; - } - - @Override - public boolean remove(Object o) { - - int index = indexOf(o); - - if (index != -1) { - remove(index); - return true; - } else { - return false; - } - } - - private void updateNodesAfterRemove(Node fromNode) { - - for (Node node = fromNode.next; node != null; node = node.next) { - - node.startingIndex = (--node.startingIndex < 0) ? 0 : node.startingIndex; - node.endingIndex = (--node.endingIndex < 0) ? 0 : node.endingIndex; - } - } - - private Node getNode(int index) { - - int firstStartingIndex = first.startingIndex; - int firstEndingIndex = first.endingIndex; - - int firstMinDistance = min(abs(index - firstStartingIndex), abs(index - firstEndingIndex)); - - int lastStartingIndex = last.startingIndex; - int lastEndingIndex = last.endingIndex; - - int lastMinDistance = min(abs(index - lastStartingIndex), abs(index - lastEndingIndex)); - - if (firstMinDistance <= lastMinDistance) { - - Node node = first; - do { - - if (node.startingIndex <= index && index <= node.endingIndex) { - return node; - } - - node = node.next; - } while (true); - } else { - - Node node = last; - do { - - if (node.startingIndex <= index && index <= node.endingIndex) { - return node; - } - - node = node.pre; - } while (true); - } - } - - private Node getNodeForAdd(int index) { - - if (index == size && !(last.startingIndex <= index && index <= last.endingIndex)) { - return null; - } - - return getNode(index); - } - - private void rangeCheck(int index) { - - if (index >= size || index < 0) { - throw new ArrayIndexOutOfBoundsException(index); - } - } - - @Override - public void clear() { - - for (Node node = first; node != null; ) { - - Node next = node.next; - - node.next = null; - node.pre = null; - node.elementData = null; - - node = next; - } - - first = last = null; - - int capacity = min(MAX_ARRAY_SIZE, max(size, max(initialCapacity, DEFAULT_CAPACITY))); - - Node initNode = new Node<>(null, null, 0, capacity); - - initialCapacity = capacity; - - first = initNode; - last = initNode; - - modCount++; - size = 0; - } - - public void trimToSize() { - - int pointer = last.elementDataPointer; - int arrLen = last.elementData.length; - - if (pointer < arrLen && arrLen > 2) { - - if (pointer < 2) { - last.elementData = Arrays.copyOf(last.elementData, 2); - last.endingIndex -= arrLen - 2; - } else { - last.elementData = Arrays.copyOf(last.elementData, pointer); - last.endingIndex -= arrLen - pointer; - } - } - } - - @Override - public List subList(int fromIndex, int toIndex) { - return super.subList(fromIndex, toIndex); - } - - @Override - public Object[] toArray() { - - Object[] objects = new Object[size]; - - int i = 0; - for (Node node = first; node != null; node = node.next) { - - int len = node.elementDataPointer; - - if (len > 0) { - System.arraycopy(node.elementData, 0, objects, i, len); - } - - i += len; - } - - return objects; - } - - @SuppressWarnings("unchecked") - @Override - public T[] toArray(T[] a) { - return (T[]) Arrays.copyOf(toArray(), size, a.getClass()); - } - - public boolean isEmpty() { - return size == 0; - } - - @Override - public Iterator iterator() { - return new Itr(); - } - - private class Itr implements Iterator { - - Node node = first; - - int i = 0;//inner-array index - int j = 0;//total index -> cursor - - int lastReturn = -1; - - int expectedModCount = modCount; - int elementDataPointer = node.elementDataPointer; - - @Override - public boolean hasNext() { - return j != size; - } - - @Override - public T next() { - - checkForComodification(); - - if (j >= size) { - throw new NoSuchElementException(); - } - - if (j >= last.endingIndex + 1) { - throw new ConcurrentModificationException(); - } - - if (j == 0) {// it's for listIterator.when node becomes null. - node = first; - elementDataPointer = node.elementDataPointer; - i = 0; - } - - T val = node.elementData[i++]; - - if (i >= elementDataPointer) { - node = node.next; - i = 0; - elementDataPointer = (node != null) ? node.elementDataPointer : 0; - } - - lastReturn = j++; - - return val; - } - - @Override - public void remove() { - - if (lastReturn < 0) { - throw new IllegalStateException(); - } - - checkForComodification(); - - try { - GlueList.this.remove(lastReturn); - - j = lastReturn; - - lastReturn = -1; - - i = (--i < 0) ? 0 : i; - - elementDataPointer = (node != null) ? node.elementDataPointer : 0; - - expectedModCount = modCount; - } catch (IndexOutOfBoundsException e) { - throw new ConcurrentModificationException(); - } - } - - void checkForComodification() { - if (modCount != expectedModCount) { - throw new ConcurrentModificationException(); - } - } - } - - @Override - public ListIterator listIterator(int index) { - - checkPositionIndex(index); - - return new ListItr(index); - } - - private void checkPositionIndex(int index) { - - if (!(index >= 0 && index <= size)) { - throw new ArrayIndexOutOfBoundsException(index); - } - } - - @Override - public ListIterator listIterator() { - return new ListItr(0); - } - - private class ListItr extends Itr implements ListIterator { - - public ListItr(int index) { - node = (index == size) ? last : getNode(index); - j = index; - i = index - node.startingIndex; - elementDataPointer = node.elementDataPointer; - } - - @Override - public boolean hasPrevious() { - return j != 0; - } - - @Override - public T previous() { - - checkForComodification(); - - int temp = j - 1; - - if (temp < 0) { - throw new NoSuchElementException(); - } - - if (temp >= last.endingIndex + 1) { - throw new ConcurrentModificationException(); - } - - if (j == size) { - - node = last; - - elementDataPointer = node.elementDataPointer; - - i = elementDataPointer; - } - - int index = j - node.startingIndex; - if (index == 0) { - - node = node.pre; - - elementDataPointer = node.elementDataPointer; - - i = elementDataPointer; - } - - T val = node.elementData[--i]; - - if (i < 0) { - node = node.pre; - i = (node != null) ? node.elementDataPointer : 0; - } - - j = temp; - - lastReturn = j; - - return val; - } - - @Override - public int nextIndex() { - return j; - } - - @Override - public int previousIndex() { - return j - 1; - } - - @Override - public void set(T t) { - - if (lastReturn < 0) { - throw new IllegalStateException(); - } - - checkForComodification(); - - try { - GlueList.this.set(lastReturn, t); - } catch (IndexOutOfBoundsException e) { - throw new ConcurrentModificationException(); - } - } - - @Override - public void add(T t) { - - checkForComodification(); - - try { - int temp = j; - - GlueList.this.add(temp, t); - - j = temp + 1; - - lastReturn = -1; - - i++; - elementDataPointer = (node != null) ? node.elementDataPointer : 0; - - expectedModCount = modCount; - } catch (IndexOutOfBoundsException e) { - throw new ConcurrentModificationException(); - } - } - } - - @Override - public int size() { - return size; - } - - @SuppressWarnings("unchecked") - @Override - public Object clone() { - - try { - GlueList clone = (GlueList) super.clone(); - - clone.first = clone.last = null; - - int capacity = min(MAX_ARRAY_SIZE, max(clone.size, max(clone.initialCapacity, DEFAULT_CAPACITY))); - - Node initNode = new Node<>(null, null, 0, capacity); - - clone.initialCapacity = capacity; - - clone.first = clone.last = initNode; - - clone.modCount = 0; - clone.size = 0; - - for (Node node = first; node != null; node = node.next) { - - for (int i = 0; i < node.elementDataPointer; i++) { - clone.add(node.elementData[i]); - } - } - - return clone; - } catch (CloneNotSupportedException e) { - throw new InternalError(); - } - } - - private void writeObject(ObjectOutputStream s) throws IOException { - - int expectedModCount = modCount; - - s.defaultWriteObject(); - - s.writeInt(size); - - for (Node node = first; node != null; node = node.next) { - for (int i = 0; i < node.elementDataPointer; i++) { - s.writeObject(node.elementData[i]); - } - } - - if (modCount != expectedModCount) { - throw new ConcurrentModificationException(); - } - } - - - @SuppressWarnings("unchecked") - private void readObject(ObjectInputStream s) throws IOException, ClassNotFoundException { - - clear(); - - s.defaultReadObject(); - - int size = s.readInt(); - - for (int i = 0; i < size; i++) { - last.add((T) s.readObject()); - } - } - - static class Node { - - Node pre; - Node next; - - int listSize; - - int startingIndex; - int endingIndex; - - T[] elementData; - int elementDataPointer; - - @SuppressWarnings("unchecked") - Node(Node pre, Node next, int listSize) { - this.pre = pre; - this.next = next; - this.listSize = listSize; - this.elementData = (T[]) new Object[listSize >>> 1]; - this.startingIndex = listSize; - this.endingIndex = listSize + elementData.length - 1; - } - - Node(Node pre, Node next, int listSize, int initialCapacity) { - this.pre = pre; - this.next = next; - this.listSize = listSize; - this.elementData = createElementData(initialCapacity); - this.startingIndex = listSize; - this.endingIndex = listSize + elementData.length - 1; - } - - @SuppressWarnings("unchecked") - T[] createElementData(int capacity) { - - if (capacity == 0 || capacity == 1) { - return (T[]) new Object[DEFAULT_CAPACITY]; - } else if (capacity > 1) { - return (T[]) new Object[capacity]; - } else { - throw new IllegalArgumentException("Illegal Capacity: " + capacity); - } - } - - boolean isAddable() { - return elementDataPointer < elementData.length; - } - - void add(T element) { - elementData[elementDataPointer++] = element; - } - - @Override - public String toString() { - return String.format("[sIndex: %d - eIndex: %d | elementDataPointer: %d | elementDataLength: %d]", startingIndex, endingIndex, elementDataPointer, elementData.length); - } - } -} \ No newline at end of file diff --git a/src/main/java/com/dfsek/terra/util/structure/RotationUtil.java b/src/main/java/com/dfsek/terra/util/structure/RotationUtil.java index 4edc5153b..4d8bfa2a7 100644 --- a/src/main/java/com/dfsek/terra/util/structure/RotationUtil.java +++ b/src/main/java/com/dfsek/terra/util/structure/RotationUtil.java @@ -2,7 +2,7 @@ package com.dfsek.terra.util.structure; import com.dfsek.terra.procgen.math.Vector2; import com.dfsek.terra.structure.Rotation; -import org.apache.commons.math3.util.FastMath; +import net.jafama.FastMath; import org.bukkit.block.BlockFace; import org.bukkit.block.data.BlockData; import org.bukkit.block.data.Directional; diff --git a/src/test/java/DistributionTest.java b/src/test/java/DistributionTest.java index 22b646a7a..e391073d7 100644 --- a/src/test/java/DistributionTest.java +++ b/src/test/java/DistributionTest.java @@ -1,4 +1,4 @@ -import org.apache.commons.math3.util.FastMath; +import net.jafama.FastMath; import org.junit.jupiter.api.Test; import org.polydev.gaea.math.FastNoiseLite; diff --git a/src/test/java/LookupGenerator.java b/src/test/java/LookupGenerator.java index 34407b501..05c1b2919 100644 --- a/src/test/java/LookupGenerator.java +++ b/src/test/java/LookupGenerator.java @@ -1,7 +1,7 @@ -import com.dfsek.terra.util.GlueList; -import org.apache.commons.math3.util.FastMath; +import net.jafama.FastMath; import org.junit.jupiter.api.Test; import org.polydev.gaea.math.FastNoiseLite; +import org.polydev.gaea.util.GlueList; import java.util.ArrayList; import java.util.Collections;