Implemented better biome system.
This commit is contained in:
		@@ -0,0 +1,93 @@
 | 
			
		||||
package ca.recrown.islandsurvivalcraft.utilities.biomes;
 | 
			
		||||
 | 
			
		||||
import java.util.Arrays;
 | 
			
		||||
 | 
			
		||||
import org.bukkit.block.Biome;
 | 
			
		||||
 | 
			
		||||
import ca.recrown.islandsurvivalcraft.utilities.weighting.Weightable;
 | 
			
		||||
import ca.recrown.islandsurvivalcraft.utilities.weighting.WeightedSelector;
 | 
			
		||||
 | 
			
		||||
public enum BiomeClassifications implements Weightable {
 | 
			
		||||
    SNOWY(0.2f, new OceanBiomeInfo(Biome.FROZEN_OCEAN, Biome.COLD_OCEAN, Biome.DEEP_FROZEN_OCEAN),
 | 
			
		||||
        new LandBiomeInfo(Biome.SNOWY_TAIGA, null, Biome.SNOWY_TAIGA_HILLS, Biome.SNOWY_BEACH, 0.3f), 
 | 
			
		||||
        new LandBiomeInfo(Biome.SNOWY_TAIGA_MOUNTAINS, Biome.SNOWY_TAIGA, null, Biome.SNOWY_BEACH, 0.25f), 
 | 
			
		||||
        new LandBiomeInfo(Biome.SNOWY_TUNDRA, null, null, Biome.SNOWY_BEACH, 0.3f), 
 | 
			
		||||
        new LandBiomeInfo(Biome.ICE_SPIKES, null, null, Biome.SNOWY_BEACH, 0.15f)
 | 
			
		||||
    ),
 | 
			
		||||
    COLD(0.3f, new OceanBiomeInfo(Biome.COLD_OCEAN, null, Biome.DEEP_COLD_OCEAN),
 | 
			
		||||
        new LandBiomeInfo(Biome.MOUNTAINS, null, null, Biome.STONE_SHORE, 0.14f),
 | 
			
		||||
        new LandBiomeInfo(Biome.GRAVELLY_MOUNTAINS, 0.1f),
 | 
			
		||||
        new LandBiomeInfo(Biome.WOODED_MOUNTAINS, 0.08f),
 | 
			
		||||
        new LandBiomeInfo(Biome.MODIFIED_GRAVELLY_MOUNTAINS, 0.08f),
 | 
			
		||||
        new LandBiomeInfo(Biome.TAIGA, null, Biome.TAIGA_HILLS, Biome.BEACH, 0.15f),
 | 
			
		||||
        new LandBiomeInfo(Biome.TAIGA_MOUNTAINS, 0.15f),
 | 
			
		||||
        new LandBiomeInfo(Biome.GIANT_TREE_TAIGA, null, Biome.GIANT_TREE_TAIGA_HILLS, Biome.BEACH, 0.15f),
 | 
			
		||||
        new LandBiomeInfo(Biome.GIANT_SPRUCE_TAIGA, null, Biome.GIANT_SPRUCE_TAIGA_HILLS, Biome.BEACH, 0.15f)
 | 
			
		||||
    ),
 | 
			
		||||
    LUSH(0.3f, new OceanBiomeInfo(Biome.WARM_OCEAN, Biome.LUKEWARM_OCEAN, Biome.DEEP_LUKEWARM_OCEAN),
 | 
			
		||||
        new LandBiomeInfo(Biome.PLAINS, 0.15f),
 | 
			
		||||
        new LandBiomeInfo(Biome.SUNFLOWER_PLAINS, 0.075f),
 | 
			
		||||
        new LandBiomeInfo(Biome.FOREST, null, Biome.WOODED_HILLS, Biome.BEACH, 0.1f),
 | 
			
		||||
        new LandBiomeInfo(Biome.FLOWER_FOREST, 0.05f),
 | 
			
		||||
        new LandBiomeInfo(Biome.BIRCH_FOREST, null, Biome.BIRCH_FOREST_HILLS, Biome.BEACH, 0.1f),
 | 
			
		||||
        new LandBiomeInfo(Biome.TALL_BIRCH_FOREST, null, Biome.TALL_BIRCH_HILLS, Biome.BEACH, 0.075f),
 | 
			
		||||
        new LandBiomeInfo(Biome.DARK_FOREST, null, Biome.DARK_FOREST_HILLS, Biome.BEACH, 0.075f),
 | 
			
		||||
        new LandBiomeInfo(Biome.SWAMP, null, Biome.SWAMP_HILLS, null, 0.1f),
 | 
			
		||||
        new LandBiomeInfo(Biome.JUNGLE, Biome.JUNGLE_EDGE, Biome.JUNGLE_HILLS, Biome.BEACH, 0.075f),
 | 
			
		||||
        new LandBiomeInfo(Biome.MODIFIED_JUNGLE, Biome.MODIFIED_JUNGLE_EDGE, null, Biome.BEACH, 0.075f),
 | 
			
		||||
        new LandBiomeInfo(Biome.BAMBOO_JUNGLE, null, Biome.BAMBOO_JUNGLE_HILLS, Biome.BEACH, 0.075f),
 | 
			
		||||
        new LandBiomeInfo(Biome.MUSHROOM_FIELDS, null, null, Biome.MUSHROOM_FIELD_SHORE, 0.05f)
 | 
			
		||||
    ),
 | 
			
		||||
    WARM(0.2f, new OceanBiomeInfo(Biome.OCEAN, null, Biome.DEEP_OCEAN),
 | 
			
		||||
        new LandBiomeInfo(Biome.DESERT, null, Biome.DESERT_HILLS, Biome.BEACH, 0.2f),
 | 
			
		||||
        new LandBiomeInfo(Biome.SAVANNA, 0.2f),
 | 
			
		||||
        new LandBiomeInfo(Biome.SHATTERED_SAVANNA, 0.075f),
 | 
			
		||||
        new LandBiomeInfo(Biome.BADLANDS, 0.075f),
 | 
			
		||||
        new LandBiomeInfo(Biome.ERODED_BADLANDS, 0.075f),
 | 
			
		||||
        new LandBiomeInfo(Biome.WOODED_BADLANDS_PLATEAU, 0.075f),
 | 
			
		||||
        new LandBiomeInfo(Biome.MODIFIED_WOODED_BADLANDS_PLATEAU, 0.075f),
 | 
			
		||||
        new LandBiomeInfo(Biome.BADLANDS_PLATEAU, 0.075f),
 | 
			
		||||
        new LandBiomeInfo(Biome.SAVANNA_PLATEAU, 0.05f),
 | 
			
		||||
        new LandBiomeInfo(Biome.MODIFIED_BADLANDS_PLATEAU, 0.05f),
 | 
			
		||||
        new LandBiomeInfo(Biome.SHATTERED_SAVANNA_PLATEAU, 0.05f)
 | 
			
		||||
    ),
 | 
			
		||||
    ;
 | 
			
		||||
    
 | 
			
		||||
    private final LandBiomeInfo[] biomeInfos;
 | 
			
		||||
    private final float weight;
 | 
			
		||||
    private final OceanBiomeInfo associatedOceanBiomeInfo;
 | 
			
		||||
    private final WeightedSelector<LandBiomeInfo> selector;
 | 
			
		||||
 | 
			
		||||
    BiomeClassifications(float weight, OceanBiomeInfo oceanBiomeInfo, LandBiomeInfo... biomeInfos) {
 | 
			
		||||
        this.biomeInfos = biomeInfos;
 | 
			
		||||
        this.weight = weight;
 | 
			
		||||
        this.associatedOceanBiomeInfo = oceanBiomeInfo;
 | 
			
		||||
        selector = new WeightedSelector<>(Arrays.asList(biomeInfos));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @return the biomes associated with this classification.
 | 
			
		||||
     */
 | 
			
		||||
    public LandBiomeInfo[] getBiomeInfos() {
 | 
			
		||||
        return biomeInfos;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public float getWeight() {
 | 
			
		||||
        return weight;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @return the associatedOceanBiomeInfo
 | 
			
		||||
     */
 | 
			
		||||
    public OceanBiomeInfo getAssociatedOceanBiomeInfo() {
 | 
			
		||||
        return associatedOceanBiomeInfo;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @return the selector
 | 
			
		||||
     */
 | 
			
		||||
    public WeightedSelector<LandBiomeInfo> getSelector() {
 | 
			
		||||
        return selector;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,69 @@
 | 
			
		||||
package ca.recrown.islandsurvivalcraft.utilities.biomes;
 | 
			
		||||
 | 
			
		||||
import org.bukkit.block.Biome;
 | 
			
		||||
 | 
			
		||||
import ca.recrown.islandsurvivalcraft.utilities.weighting.Weightable;
 | 
			
		||||
 | 
			
		||||
public class LandBiomeInfo implements Weightable {
 | 
			
		||||
    private final Biome biome;
 | 
			
		||||
    private final float weight;
 | 
			
		||||
    private final Biome hillBiome;
 | 
			
		||||
    private final Biome transitionBiome;
 | 
			
		||||
    private final Biome preferredShore;
 | 
			
		||||
    
 | 
			
		||||
    /**
 | 
			
		||||
     * Creates a land biome information object.
 | 
			
		||||
     * @param biome the main biome this object represents.
 | 
			
		||||
     * @param transitionBiome the transition biome to go with this biome. May be null.
 | 
			
		||||
     * @param hill the hill biome that goes with this biome. May be null.
 | 
			
		||||
     * @param shore the preferred shore that goes with this biome. May be null.
 | 
			
		||||
     * @param weight the weight, relative to the others, chance this biome spawns.
 | 
			
		||||
     */
 | 
			
		||||
    public LandBiomeInfo(Biome biome, Biome transitionBiome, Biome hill, Biome shore, float weight) {
 | 
			
		||||
        if (biome == null) throw new IllegalArgumentException("Argument biome may never be null.");
 | 
			
		||||
        this.weight = weight;
 | 
			
		||||
        this.biome = biome;
 | 
			
		||||
        this.hillBiome = hill;
 | 
			
		||||
        this.preferredShore = shore;
 | 
			
		||||
        this.transitionBiome = transitionBiome;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public LandBiomeInfo(Biome biome, float weight) {
 | 
			
		||||
        this(biome, null, null, Biome.BEACH, weight);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @return the weight
 | 
			
		||||
     */
 | 
			
		||||
    public float getWeight() {
 | 
			
		||||
        return weight;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @return the biome
 | 
			
		||||
     */
 | 
			
		||||
    public Biome getBiome() {
 | 
			
		||||
        return biome;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @return the hill biome. May be null.
 | 
			
		||||
     */
 | 
			
		||||
    public Biome getHillBiome() {
 | 
			
		||||
        return hillBiome;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @return the shore biome.
 | 
			
		||||
     */
 | 
			
		||||
    public Biome getPreferredShore() {
 | 
			
		||||
        return preferredShore;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @return the transition biome if it has one. May be null.
 | 
			
		||||
     */
 | 
			
		||||
    public Biome getTransitionBiome() {
 | 
			
		||||
        return transitionBiome;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,37 @@
 | 
			
		||||
package ca.recrown.islandsurvivalcraft.utilities.biomes;
 | 
			
		||||
 | 
			
		||||
import org.bukkit.block.Biome;
 | 
			
		||||
 | 
			
		||||
public class OceanBiomeInfo {
 | 
			
		||||
    private final Biome ocean;
 | 
			
		||||
    private final Biome transitionOcean;
 | 
			
		||||
    private final Biome deepAlternative;
 | 
			
		||||
    
 | 
			
		||||
    public OceanBiomeInfo(Biome ocean, Biome transitionOcean, Biome deepAlternative) {
 | 
			
		||||
        if (ocean == null || deepAlternative == null) throw new IllegalArgumentException("Neither argument ocean nor deepAlternative may be null.");
 | 
			
		||||
        this.ocean = ocean;
 | 
			
		||||
        this.transitionOcean = transitionOcean;
 | 
			
		||||
        this.deepAlternative = deepAlternative;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    /**
 | 
			
		||||
     * @return the main ocean.
 | 
			
		||||
     */
 | 
			
		||||
    public Biome getOcean() {
 | 
			
		||||
        return ocean;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @return the transition ocean. May be null.
 | 
			
		||||
     */
 | 
			
		||||
    public Biome getTransitionOcean() {
 | 
			
		||||
        return transitionOcean;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @return the deep version of this ocean.
 | 
			
		||||
     */
 | 
			
		||||
    public Biome getDeepAlternative() {
 | 
			
		||||
        return deepAlternative;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,5 @@
 | 
			
		||||
package ca.recrown.islandsurvivalcraft.utilities.weighting;
 | 
			
		||||
 | 
			
		||||
public interface Weightable {
 | 
			
		||||
    public float getWeight();
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,27 @@
 | 
			
		||||
package ca.recrown.islandsurvivalcraft.utilities.weighting;
 | 
			
		||||
 | 
			
		||||
import java.util.Random;
 | 
			
		||||
import java.util.TreeMap;
 | 
			
		||||
 | 
			
		||||
public class WeightedSelector<T extends Weightable> {
 | 
			
		||||
    private final TreeMap<Float, T> map;
 | 
			
		||||
    private final float totalWeights;
 | 
			
		||||
 | 
			
		||||
    public WeightedSelector(Iterable<T> set) {
 | 
			
		||||
        float totalWeights = 0;
 | 
			
		||||
        map = new TreeMap<>();
 | 
			
		||||
        for (T t : set) {
 | 
			
		||||
            totalWeights += t.getWeight();
 | 
			
		||||
            map.put(totalWeights, t);
 | 
			
		||||
        }
 | 
			
		||||
        this.totalWeights = totalWeights;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public T selectRandom(Random random) {
 | 
			
		||||
        return map.ceilingEntry(random.nextFloat() * totalWeights).getValue();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public T selectRandom(float selector) {
 | 
			
		||||
        return map.ceilingEntry(selector * totalWeights).getValue();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,275 +1,25 @@
 | 
			
		||||
package ca.recrown.islandsurvivalcraft.world;
 | 
			
		||||
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
import java.util.HashMap;
 | 
			
		||||
import java.util.Random;
 | 
			
		||||
import java.util.Map.Entry;
 | 
			
		||||
 | 
			
		||||
import org.bukkit.block.Biome;
 | 
			
		||||
import org.bukkit.util.noise.SimplexOctaveGenerator;
 | 
			
		||||
 | 
			
		||||
import ca.recrown.islandsurvivalcraft.utilities.GeneralUtilities;
 | 
			
		||||
import ca.recrown.islandsurvivalcraft.world.TemperatureMap.TemperatureRegion;
 | 
			
		||||
import ca.recrown.islandsurvivalcraft.utilities.biomes.BiomeClassifications;
 | 
			
		||||
import ca.recrown.islandsurvivalcraft.utilities.biomes.LandBiomeInfo;
 | 
			
		||||
import ca.recrown.islandsurvivalcraft.utilities.biomes.OceanBiomeInfo;
 | 
			
		||||
 | 
			
		||||
public class BiomeMap {
 | 
			
		||||
    public enum MainBiomes {
 | 
			
		||||
        SNOWY_TUNDRA(0.0f, TemperatureRegion.SNOWY, ShoreBiomes.SNOWY_BEACH),
 | 
			
		||||
        ICE_SPIKES(0.0f, TemperatureRegion.SNOWY, ShoreBiomes.SNOWY_BEACH),
 | 
			
		||||
        SNOWY_TAIGA(-0.5f, TemperatureRegion.SNOWY, ShoreBiomes.SNOWY_BEACH),
 | 
			
		||||
        SNOWY_TAIGA_MOUNTAINS(-0.5f, TemperatureRegion.SNOWY, ShoreBiomes.SNOWY_BEACH),
 | 
			
		||||
        MOUNTAINS(0.2f, TemperatureRegion.COLD, ShoreBiomes.STONE_SHORE),
 | 
			
		||||
        GRAVELLY_MOUNTAINS(0.2f, TemperatureRegion.COLD),
 | 
			
		||||
        WOODED_MOUNTAINS(0.2f, TemperatureRegion.COLD, ShoreBiomes.STONE_SHORE),
 | 
			
		||||
        MODIFIED_GRAVELLY_MOUNTAINS(0.2f, TemperatureRegion.COLD),
 | 
			
		||||
        TAIGA(0.25f, TemperatureRegion.COLD),
 | 
			
		||||
        TAIGA_MOUNTAINS(0.25f, TemperatureRegion.COLD),
 | 
			
		||||
        GIANT_TREE_TAIGA(0.3f, TemperatureRegion.COLD),
 | 
			
		||||
        GIANT_SPRUCE_TAIGA(0.25f, TemperatureRegion.COLD),
 | 
			
		||||
        PLAINS(0.8f, TemperatureRegion.LUSH),
 | 
			
		||||
        SUNFLOWER_PLAINS(0.8f, TemperatureRegion.LUSH),
 | 
			
		||||
        FOREST(0.7f, TemperatureRegion.LUSH),
 | 
			
		||||
        FLOWER_FOREST(0.7f, TemperatureRegion.LUSH),
 | 
			
		||||
        BIRCH_FOREST(0.6f, TemperatureRegion.LUSH),
 | 
			
		||||
        TALL_BIRCH_FOREST(0.7f, TemperatureRegion.LUSH),
 | 
			
		||||
        DARK_FOREST(0.7f, TemperatureRegion.LUSH),
 | 
			
		||||
        DARK_FOREST_HILLS(0.7f, TemperatureRegion.LUSH),
 | 
			
		||||
        SWAMP(0.8f, TemperatureRegion.LUSH),
 | 
			
		||||
        SWAMP_HILLS(0.8f, TemperatureRegion.LUSH),
 | 
			
		||||
        JUNGLE(0.95f, TemperatureRegion.LUSH),
 | 
			
		||||
        MODIFIED_JUNGLE(0.95f, TemperatureRegion.LUSH),
 | 
			
		||||
        JUNGLE_EDGE(0.95f, TemperatureRegion.LUSH),
 | 
			
		||||
        MODIFIED_JUNGLE_EDGE(0.95f, TemperatureRegion.LUSH),
 | 
			
		||||
        BAMBOO_JUNGLE(0.95f, TemperatureRegion.LUSH),
 | 
			
		||||
        MUSHROOM_FIELDS(0.9f, TemperatureRegion.LUSH, ShoreBiomes.MUSHROOM_SHORE),
 | 
			
		||||
        DESERT(2.0f, TemperatureRegion.WARM),
 | 
			
		||||
        SAVANNA(1.2f, TemperatureRegion.WARM),
 | 
			
		||||
        SHATTERED_SAVANNA(1.1f, TemperatureRegion.WARM),
 | 
			
		||||
        BADLANDS(2.0f, TemperatureRegion.WARM),
 | 
			
		||||
        ERODED_BADLANDS(2.0f, TemperatureRegion.WARM),
 | 
			
		||||
        WOODED_BADLANDS_PLATEAU(2.0f, TemperatureRegion.WARM),
 | 
			
		||||
        MODIFIED_WOODED_BADLANDS_PLATEAU(2.0f, TemperatureRegion.WARM),
 | 
			
		||||
        BADLANDS_PLATEAU(2.0f, TemperatureRegion.WARM),
 | 
			
		||||
        SAVANNA_PLATEAU(1.0f, TemperatureRegion.WARM),
 | 
			
		||||
        MODIFIED_BADLANDS_PLATEAU(2.0f, TemperatureRegion.WARM),
 | 
			
		||||
        SHATTERED_SAVANNA_PLATEAU(1.0f, TemperatureRegion.WARM),
 | 
			
		||||
        ;
 | 
			
		||||
        private final float temperature;
 | 
			
		||||
        private final TemperatureRegion temperatureRegion;
 | 
			
		||||
        private final ShoreBiomes[] preferredShores;
 | 
			
		||||
 | 
			
		||||
        private MainBiomes(float temperature, TemperatureRegion temperatureRegion, ShoreBiomes... preferredShore) {
 | 
			
		||||
            this.temperature = temperature;
 | 
			
		||||
            this.preferredShores = preferredShore;
 | 
			
		||||
            this.temperatureRegion = temperatureRegion;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /**
 | 
			
		||||
         * @return the temperature
 | 
			
		||||
         */
 | 
			
		||||
        public float getTemperature() {
 | 
			
		||||
            return temperature;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /**
 | 
			
		||||
         * @return the preferredShore
 | 
			
		||||
         */
 | 
			
		||||
        public ShoreBiomes[] getPreferredShores() {
 | 
			
		||||
            return preferredShores;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /**
 | 
			
		||||
         * @return the temperatureRegion
 | 
			
		||||
         */
 | 
			
		||||
        public TemperatureRegion getTemperatureRegion() {
 | 
			
		||||
            return temperatureRegion;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public enum OceanBiomes {
 | 
			
		||||
        WARM_OCEAN(0.5f, TemperatureRegion.WARM),
 | 
			
		||||
        LUKEWARM_OCEAN(0.5f, TemperatureRegion.LUSH),
 | 
			
		||||
        OCEAN(0.5f, TemperatureRegion.LUSH),
 | 
			
		||||
        COLD_OCEAN(0.5f, TemperatureRegion.COLD),
 | 
			
		||||
        FROZEN_OCEAN(0.0f, TemperatureRegion.SNOWY);
 | 
			
		||||
 | 
			
		||||
        private final float temperature;
 | 
			
		||||
        private final TemperatureRegion temperatureRegion;
 | 
			
		||||
 | 
			
		||||
        private OceanBiomes(float temperature, TemperatureRegion temperatureRegion) {
 | 
			
		||||
            this.temperature = temperature;
 | 
			
		||||
            this.temperatureRegion = temperatureRegion;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /**
 | 
			
		||||
         * @return the temperature
 | 
			
		||||
         */
 | 
			
		||||
        public float getTemperature() {
 | 
			
		||||
            return temperature;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /**
 | 
			
		||||
         * @return the temperatureRegion
 | 
			
		||||
         */
 | 
			
		||||
        public TemperatureRegion getTemperatureRegion() {
 | 
			
		||||
            return temperatureRegion;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public enum ShoreBiomes {
 | 
			
		||||
        BEACH(0.8f, TemperatureRegion.LUSH),
 | 
			
		||||
        SNOWY_BEACH(0.05f, TemperatureRegion.SNOWY),
 | 
			
		||||
        MUSHROOM_SHORE(0.05f, TemperatureRegion.LUSH, true),
 | 
			
		||||
        STONE_SHORE(0.2f, TemperatureRegion.COLD);
 | 
			
		||||
 | 
			
		||||
        private final float temperature;
 | 
			
		||||
        private final TemperatureRegion temperatureRegion;
 | 
			
		||||
        private final boolean special;
 | 
			
		||||
        private ShoreBiomes(float temperature, TemperatureRegion associatedTemperatureRegion, boolean special) {
 | 
			
		||||
            this.temperature = temperature;
 | 
			
		||||
            this.temperatureRegion = associatedTemperatureRegion;
 | 
			
		||||
            this.special = special;
 | 
			
		||||
        }
 | 
			
		||||
        private ShoreBiomes(float temperature, TemperatureRegion associatedTemperatureRegion) {
 | 
			
		||||
            this(temperature, associatedTemperatureRegion, false);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /**
 | 
			
		||||
         * @return the temperature
 | 
			
		||||
         */
 | 
			
		||||
        public float getTemperature() {
 | 
			
		||||
            return temperature;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /**
 | 
			
		||||
         * @return the temperatureRegion
 | 
			
		||||
         */
 | 
			
		||||
        public TemperatureRegion getTemperatureRegion() {
 | 
			
		||||
            return temperatureRegion;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /**
 | 
			
		||||
         * @return the special
 | 
			
		||||
         */
 | 
			
		||||
        public boolean isSpecial() {
 | 
			
		||||
            return special;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    private final SimplexOctaveGenerator noise;
 | 
			
		||||
    private final HashMap<Biome, Float> landBiomeTemperatures = new HashMap<>();
 | 
			
		||||
    private volatile HashMap<Float, ArrayList<Biome>> temperaturesForLand = new HashMap<>();
 | 
			
		||||
    private final HashMap<Float, ArrayList<Biome>> temperaturePartitionedLandBiomes = new HashMap<>();
 | 
			
		||||
    private final HashMap<Biome, Float> oceanBiomeTemperatures = new HashMap<>();
 | 
			
		||||
    private volatile HashMap<Float, ArrayList<Biome>> temperaturesForOcean = new HashMap<>();
 | 
			
		||||
    private final HashMap<Float, ArrayList<Biome>> temperaturePartitionedOceanBiomes = new HashMap<>();
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    public BiomeMap(Random random) {
 | 
			
		||||
        this(random, 0.05d);
 | 
			
		||||
        this(random, 0.02d);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public BiomeMap(Random random, double scale) {
 | 
			
		||||
        noise = new SimplexOctaveGenerator(random, 2);
 | 
			
		||||
        noise.setScale(scale);
 | 
			
		||||
        temperaturePartitionedLandBiomes.put(0.05f, new ArrayList<>());
 | 
			
		||||
        temperaturePartitionedLandBiomes.put(0.30f, new ArrayList<>());
 | 
			
		||||
        temperaturePartitionedLandBiomes.put(0.95f, new ArrayList<>());
 | 
			
		||||
        temperaturePartitionedLandBiomes.put(2f, new ArrayList<>());
 | 
			
		||||
 | 
			
		||||
        temperaturePartitionedOceanBiomes.put(0.00f, new ArrayList<>());
 | 
			
		||||
        temperaturePartitionedOceanBiomes.put(0.3f, new ArrayList<>());
 | 
			
		||||
        temperaturePartitionedOceanBiomes.put(0.5f, new ArrayList<>());
 | 
			
		||||
 | 
			
		||||
        registerLandBiomeTemperatures();
 | 
			
		||||
        registerOceanBiomeTemperatures();
 | 
			
		||||
    }    
 | 
			
		||||
 | 
			
		||||
    private void registerLandBiomeTemperatures() {
 | 
			
		||||
        landBiomeTemperatures.put(Biome.SNOWY_TUNDRA, 0.0f);
 | 
			
		||||
        landBiomeTemperatures.put(Biome.ICE_SPIKES, 0.0f);
 | 
			
		||||
        landBiomeTemperatures.put(Biome.SNOWY_TAIGA, -0.5f);
 | 
			
		||||
        landBiomeTemperatures.put(Biome.SNOWY_TAIGA_MOUNTAINS, -0.5f);
 | 
			
		||||
        landBiomeTemperatures.put(Biome.MOUNTAINS, 0.2f);
 | 
			
		||||
        landBiomeTemperatures.put(Biome.GRAVELLY_MOUNTAINS, 0.2f);
 | 
			
		||||
        landBiomeTemperatures.put(Biome.WOODED_MOUNTAINS, 0.2f);
 | 
			
		||||
        landBiomeTemperatures.put(Biome.MODIFIED_GRAVELLY_MOUNTAINS, 0.2f);
 | 
			
		||||
        landBiomeTemperatures.put(Biome.TAIGA, 0.25f);
 | 
			
		||||
        landBiomeTemperatures.put(Biome.TAIGA_MOUNTAINS, 0.25f);
 | 
			
		||||
        landBiomeTemperatures.put(Biome.GIANT_TREE_TAIGA, 0.3f);
 | 
			
		||||
        landBiomeTemperatures.put(Biome.PLAINS, 0.8f);
 | 
			
		||||
        landBiomeTemperatures.put(Biome.SUNFLOWER_PLAINS, 0.8f);
 | 
			
		||||
        landBiomeTemperatures.put(Biome.FOREST, 0.7f);
 | 
			
		||||
        landBiomeTemperatures.put(Biome.FLOWER_FOREST, 0.7f);
 | 
			
		||||
        landBiomeTemperatures.put(Biome.BIRCH_FOREST, 0.6f);
 | 
			
		||||
        landBiomeTemperatures.put(Biome.TALL_BIRCH_FOREST, 0.7f);
 | 
			
		||||
        landBiomeTemperatures.put(Biome.DARK_FOREST, 0.7f);
 | 
			
		||||
        landBiomeTemperatures.put(Biome.SWAMP, 0.8f);
 | 
			
		||||
        landBiomeTemperatures.put(Biome.JUNGLE, 0.95f);
 | 
			
		||||
        landBiomeTemperatures.put(Biome.MODIFIED_JUNGLE, 0.95f);
 | 
			
		||||
        landBiomeTemperatures.put(Biome.BAMBOO_JUNGLE, 0.95f);
 | 
			
		||||
        landBiomeTemperatures.put(Biome.MUSHROOM_FIELDS, 0.9f);
 | 
			
		||||
        landBiomeTemperatures.put(Biome.DESERT, 2.0f);
 | 
			
		||||
        landBiomeTemperatures.put(Biome.SAVANNA, 1.2f);
 | 
			
		||||
        landBiomeTemperatures.put(Biome.SHATTERED_SAVANNA, 1.1f);
 | 
			
		||||
        landBiomeTemperatures.put(Biome.BADLANDS, 2.0f);
 | 
			
		||||
        landBiomeTemperatures.put(Biome.ERODED_BADLANDS, 2.0f);
 | 
			
		||||
        landBiomeTemperatures.put(Biome.WOODED_BADLANDS_PLATEAU, 2.0f);
 | 
			
		||||
        landBiomeTemperatures.put(Biome.MODIFIED_WOODED_BADLANDS_PLATEAU, 2.0f);
 | 
			
		||||
        landBiomeTemperatures.put(Biome.SAVANNA_PLATEAU, 1.0f);
 | 
			
		||||
        landBiomeTemperatures.put(Biome.BADLANDS_PLATEAU, 2.0f);
 | 
			
		||||
        landBiomeTemperatures.put(Biome.MODIFIED_BADLANDS_PLATEAU, 2.0f);
 | 
			
		||||
        landBiomeTemperatures.put(Biome.SHATTERED_SAVANNA_PLATEAU, 1.0f);
 | 
			
		||||
        temperaturesForLand = GeneralUtilities.invertHashMap(landBiomeTemperatures);
 | 
			
		||||
 | 
			
		||||
        for (Entry<Float, ArrayList<Biome>> entry : temperaturesForLand.entrySet()) {
 | 
			
		||||
            if (entry.getKey() <= 0.05f) {
 | 
			
		||||
                temperaturePartitionedLandBiomes.get(0.05f).addAll(entry.getValue());
 | 
			
		||||
            } else if (entry.getKey() <= 0.3) {
 | 
			
		||||
                temperaturePartitionedLandBiomes.get(0.3f).addAll(entry.getValue());
 | 
			
		||||
            } else if (entry.getKey() <= 0.85f) {
 | 
			
		||||
                temperaturePartitionedLandBiomes.get(0.95f).addAll(entry.getValue());
 | 
			
		||||
            } else {
 | 
			
		||||
                temperaturePartitionedLandBiomes.get(2.00f).addAll(entry.getValue());
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void registerOceanBiomeTemperatures() {
 | 
			
		||||
        oceanBiomeTemperatures.put(Biome.WARM_OCEAN, 0.5f);
 | 
			
		||||
        oceanBiomeTemperatures.put(Biome.LUKEWARM_OCEAN, 0.5f);
 | 
			
		||||
        oceanBiomeTemperatures.put(Biome.OCEAN, 0.3f);
 | 
			
		||||
        oceanBiomeTemperatures.put(Biome.COLD_OCEAN, 0.3f);
 | 
			
		||||
        oceanBiomeTemperatures.put(Biome.FROZEN_OCEAN, 0f);
 | 
			
		||||
        temperaturesForOcean = GeneralUtilities.invertHashMap(oceanBiomeTemperatures);
 | 
			
		||||
        for (Entry<Float, ArrayList<Biome>> entry : temperaturesForOcean.entrySet()) {
 | 
			
		||||
            if (entry.getKey() <= 0.00f) {
 | 
			
		||||
                temperaturePartitionedOceanBiomes.get(0.0f).addAll(entry.getValue());
 | 
			
		||||
            } else if (entry.getKey() <= 0.3f) {
 | 
			
		||||
                temperaturePartitionedOceanBiomes.get(0.3f).addAll(entry.getValue());
 | 
			
		||||
            } else {
 | 
			
		||||
                temperaturePartitionedOceanBiomes.get(0.5f).addAll(entry.getValue());
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Obtains the normal temperature for the given biome.
 | 
			
		||||
     * @param biome The given biome.
 | 
			
		||||
     * @return the Minecraft temperature.
 | 
			
		||||
     */
 | 
			
		||||
    public float getBiomeTemperature(Biome biome) {
 | 
			
		||||
        String biomeName = biome.name().toLowerCase();
 | 
			
		||||
        if (biomeName.endsWith("hills") || biomeName.endsWith("beach") || biomeName.endsWith("shore")) {
 | 
			
		||||
            String biomeTypeName = biomeName;
 | 
			
		||||
            biomeTypeName = biomeTypeName.replace("_hills", "");
 | 
			
		||||
            biomeTypeName = biomeTypeName.replace("_beach", "");
 | 
			
		||||
            biomeTypeName = biomeTypeName.replace("_shore", "");
 | 
			
		||||
 | 
			
		||||
            for (Entry<Biome, Float> entry : landBiomeTemperatures.entrySet()) {
 | 
			
		||||
                if (entry.getKey().name().toLowerCase().startsWith(biomeTypeName)) {
 | 
			
		||||
                    return entry.getValue();
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        return landBiomeTemperatures.get(biome);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -286,57 +36,25 @@ public class BiomeMap {
 | 
			
		||||
            }
 | 
			
		||||
            return Biome.JUNGLE_EDGE;
 | 
			
		||||
        } else if (biomeName.contains("mountain")) {
 | 
			
		||||
            //return Biome.MOUNTAIN_EDGE;
 | 
			
		||||
            return null;
 | 
			
		||||
        }
 | 
			
		||||
        return null;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Finds the shore biome from the given information.
 | 
			
		||||
     * @param from land biome that connects to it.
 | 
			
		||||
     * @param temperature the Minecraft temperature of this shore.
 | 
			
		||||
     * @return the shore biome associated with it.
 | 
			
		||||
     */
 | 
			
		||||
    public Biome getShoreBiome(Biome from, float temperature) {
 | 
			
		||||
        String biomeName = from.name().toLowerCase();
 | 
			
		||||
        if (biomeName.contains("mushroom")) {
 | 
			
		||||
            return Biome.MUSHROOM_FIELD_SHORE;
 | 
			
		||||
        } else if (biomeName.contains("mountains")) {
 | 
			
		||||
            return Biome.STONE_SHORE;
 | 
			
		||||
        }
 | 
			
		||||
        if (temperature < 0.05) {
 | 
			
		||||
            return Biome.SNOWY_BEACH;
 | 
			
		||||
        }
 | 
			
		||||
        return Biome.BEACH;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public boolean isOceanBiome(Biome biome) {
 | 
			
		||||
        return oceanBiomeTemperatures.containsKey(biome);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public boolean isLandBiome(Biome biome) {
 | 
			
		||||
        return !isOceanBiome(biome);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Randomly selects a land biome that fits in given temperature.
 | 
			
		||||
     * @param temperature Minecraft temperature to select biome from.
 | 
			
		||||
     * @param seed The seed to use to select the biome.
 | 
			
		||||
     * @return The randomly selected biome.
 | 
			
		||||
     */
 | 
			
		||||
    public Biome getLandBiome(float temperature, int worldX, int worldZ) {
 | 
			
		||||
        ArrayList<Biome> biomes = null;
 | 
			
		||||
        if (temperature <= 0.05f) {
 | 
			
		||||
            biomes = temperaturePartitionedLandBiomes.get(0.05f);
 | 
			
		||||
        } else if (temperature <= 0.3) {
 | 
			
		||||
            biomes = temperaturePartitionedLandBiomes.get(0.3f);
 | 
			
		||||
        } else if (temperature <= 0.85f) {
 | 
			
		||||
            biomes = temperaturePartitionedLandBiomes.get(0.95f);
 | 
			
		||||
    public BiomeClassifications getClassification(float temperature) {
 | 
			
		||||
        if (temperature <= 0.1f) {
 | 
			
		||||
            return BiomeClassifications.SNOWY;
 | 
			
		||||
        } else if (temperature <= 0.3f) {
 | 
			
		||||
            return BiomeClassifications.COLD;
 | 
			
		||||
        } else if (temperature <= 1f) {
 | 
			
		||||
            return BiomeClassifications.LUSH;
 | 
			
		||||
        } else {
 | 
			
		||||
            biomes = temperaturePartitionedLandBiomes.get(2.00f);
 | 
			
		||||
            return BiomeClassifications.WARM;
 | 
			
		||||
        }
 | 
			
		||||
        return biomes.get((int) ((noise.noise(worldX, worldZ, 0.5d, 0.5d, true) + 1d) / 2d) * biomes.size());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public LandBiomeInfo getLandBiomeInfo(float temperature, int worldX, int worldZ) {
 | 
			
		||||
        return getClassification(temperature).getSelector().selectRandom((float) noise.noise(worldX, worldZ, 0.5d, 0.5d, true));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -347,18 +65,9 @@ public class BiomeMap {
 | 
			
		||||
     * @param seed The seed to use to select the biome.
 | 
			
		||||
     * @return The randomly selected biome.
 | 
			
		||||
     */
 | 
			
		||||
    public Biome getOceanBiome(float temperature, boolean isDeep, int worldX, int worldZ) {
 | 
			
		||||
        ArrayList<Biome> biomes = null;
 | 
			
		||||
        if (temperature <= 0.00f) {
 | 
			
		||||
            biomes = temperaturePartitionedOceanBiomes.get(0.0f);
 | 
			
		||||
        } else if (temperature <= 0.3) {
 | 
			
		||||
            biomes = temperaturePartitionedOceanBiomes.get(0.3f);
 | 
			
		||||
        } else {
 | 
			
		||||
            biomes = temperaturePartitionedOceanBiomes.get(0.5f);
 | 
			
		||||
        }
 | 
			
		||||
        Biome oceanBiome = biomes.get((int) ((noise.noise(worldX, worldZ, 0.5d, 0.5d, true) + 1d) / 2d) * biomes.size());
 | 
			
		||||
        if (isDeep) oceanBiome = Biome.valueOf("DEEP_" + oceanBiome.name());
 | 
			
		||||
        return oceanBiome;
 | 
			
		||||
    public OceanBiomeInfo getOceanBiome(float temperature) {
 | 
			
		||||
        BiomeClassifications classification = getClassification(temperature);
 | 
			
		||||
        return classification.getAssociatedOceanBiomeInfo();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -20,9 +20,8 @@ public class IslandWorldMap {
 | 
			
		||||
    private final double NOISE_FREQ = 1.78D;
 | 
			
		||||
    private final double NOISE_AMP = 0.47D;
 | 
			
		||||
    private final float SHORE_PORTION = 0.095f;
 | 
			
		||||
    private final float SHALLOW_PORTION = 0.07f;
 | 
			
		||||
    private final float SHALLOW_PORTION = 0.06f;
 | 
			
		||||
    private final double SCALE = 0.005D;
 | 
			
		||||
    private final double DEEP_OCEAN_PORTION = 0.6d;
 | 
			
		||||
    private final DepthFirstSearch dfs;
 | 
			
		||||
 | 
			
		||||
    public IslandWorldMap(Random random) {
 | 
			
		||||
@@ -159,10 +158,6 @@ public class IslandWorldMap {
 | 
			
		||||
        return res;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public boolean isDeepOcean(int worldX, int worldZ) {
 | 
			
		||||
        return getWorldValue(worldX, worldZ) <= -DEEP_OCEAN_PORTION;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Find the island's origin block. Will call the coordinate target validatable to end early if nessecary.
 | 
			
		||||
     * @param worldX The x coordinate of the island block in question.
 | 
			
		||||
 
 | 
			
		||||
@@ -8,12 +8,7 @@ import ca.recrown.islandsurvivalcraft.utilities.caching.Cache;
 | 
			
		||||
import ca.recrown.islandsurvivalcraft.utilities.datatypes.Point2;
 | 
			
		||||
 | 
			
		||||
public class TemperatureMap {
 | 
			
		||||
    public enum TemperatureRegion {
 | 
			
		||||
        SNOWY,
 | 
			
		||||
        COLD,
 | 
			
		||||
        LUSH,
 | 
			
		||||
        WARM,
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private final Cache<Point2, Float> temperatureCache;
 | 
			
		||||
    private final double frequency = 0.5D;
 | 
			
		||||
    private final double amplitude = 0.5D;
 | 
			
		||||
@@ -23,14 +18,14 @@ public class TemperatureMap {
 | 
			
		||||
    public TemperatureMap(Random random) {
 | 
			
		||||
        temperatureCache = new Cache<>(1024);
 | 
			
		||||
        noiseGenerator = new SimplexOctaveGenerator(random, 2);
 | 
			
		||||
        noiseGenerator.setScale(0.002D);
 | 
			
		||||
        noiseGenerator.setScale(0.0009D);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public float getTemperature(int worldX, int worldZ) {
 | 
			
		||||
        Point2 loc = new Point2(worldX, worldZ);
 | 
			
		||||
        Float val = temperatureCache.get(loc);
 | 
			
		||||
        if (val == null) {
 | 
			
		||||
            val = (float) noiseGenerator.noise(worldX, worldZ, frequency, amplitude, true);
 | 
			
		||||
            val = (float) (((noiseGenerator.noise(worldX, worldZ, frequency, amplitude, true) + 1D) / 2D) * 3D - 1D);
 | 
			
		||||
            temperatureCache.set(loc, val);
 | 
			
		||||
        }
 | 
			
		||||
        return val;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,9 +1,13 @@
 | 
			
		||||
package ca.recrown.islandsurvivalcraft.world.generation.biomes;
 | 
			
		||||
 | 
			
		||||
import java.util.Arrays;
 | 
			
		||||
 | 
			
		||||
import org.bukkit.World;
 | 
			
		||||
import org.bukkit.block.Biome;
 | 
			
		||||
 | 
			
		||||
import ca.recrown.islandsurvivalcraft.utilities.GeneralUtilities;
 | 
			
		||||
import ca.recrown.islandsurvivalcraft.utilities.biomes.LandBiomeInfo;
 | 
			
		||||
import ca.recrown.islandsurvivalcraft.utilities.biomes.OceanBiomeInfo;
 | 
			
		||||
import ca.recrown.islandsurvivalcraft.utilities.caching.Cache;
 | 
			
		||||
import ca.recrown.islandsurvivalcraft.utilities.datatypes.Point2;
 | 
			
		||||
import ca.recrown.islandsurvivalcraft.utilities.floodfill.Floodable;
 | 
			
		||||
@@ -15,6 +19,9 @@ import ca.recrown.islandsurvivalcraft.world.IslandWorldMap;
 | 
			
		||||
import ca.recrown.islandsurvivalcraft.world.TemperatureMap;
 | 
			
		||||
 | 
			
		||||
public class UniqueBiomeGenerator implements BiomeGenerator {
 | 
			
		||||
    private final double DEEP_OCEAN_PORTION = 0.5d;
 | 
			
		||||
    private final double HILL_PORTION = 0.4;
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void generateBiomeColumn(Biome[][][] chunkBiomeSets, World world, int chunkX, int chunkZ, int localX, int localZ, IslandWorldMap islandMap, BiomeMap biomeSelector, TemperatureMap tempGen, Cache<Point2, Biome[]> biomeCache) {
 | 
			
		||||
        int worldX = 16 * chunkX + localX;
 | 
			
		||||
@@ -30,7 +37,8 @@ public class UniqueBiomeGenerator implements BiomeGenerator {
 | 
			
		||||
        //Fine, check if it's ocean.
 | 
			
		||||
        if (!islandMap.isIsland(worldX, worldZ)) {
 | 
			
		||||
            biomeSet = chunkBiomeSets[localX][localZ];
 | 
			
		||||
            biomeSet[0] = biomeSelector.getOceanBiome(tempGen.getTemperature(worldX, worldZ), islandMap.isDeepOcean(worldX, worldZ), worldX, worldZ);
 | 
			
		||||
            OceanBiomeInfo ocean = biomeSelector.getOceanBiome(tempGen.getTemperature(worldX, worldZ));
 | 
			
		||||
            biomeSet[0] = islandMap.getWorldValue(worldX, worldZ) >= -DEEP_OCEAN_PORTION ? ocean.getOcean() : ocean.getDeepAlternative();
 | 
			
		||||
            setCacheBiome(worldX, worldZ, biomeSet, chunkBiomeSets, biomeCache);
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
@@ -39,13 +47,16 @@ public class UniqueBiomeGenerator implements BiomeGenerator {
 | 
			
		||||
        IslandInfo islandInfo = new IslandInfo(islandMap, world, biomeCache);
 | 
			
		||||
        Point2 islandOrigin = islandMap.findIslandOrigin(worldX, worldZ, islandInfo);
 | 
			
		||||
        if (!islandInfo.isComplete()) {
 | 
			
		||||
            float temp = tempGen.getTemperature(worldX, worldZ);
 | 
			
		||||
            if (islandInfo.main == null) islandInfo.main = biomeSelector.getLandBiome(temp, islandOrigin.x, islandOrigin.y);
 | 
			
		||||
            if (islandInfo.shore == null) islandInfo.shore = biomeSelector.getShoreBiome(islandInfo.main, temp);
 | 
			
		||||
            if (islandInfo.shallow == null) islandInfo.shallow = biomeSelector.getOceanBiome(temp, islandMap.isDeepOcean(islandOrigin.x, islandOrigin.y), islandOrigin.x, islandOrigin.y);
 | 
			
		||||
            float temp = tempGen.getTemperature(islandOrigin.x, islandOrigin.y);
 | 
			
		||||
            LandBiomeInfo biomeInfo = biomeSelector.getLandBiomeInfo(temp, islandOrigin.x, islandOrigin.y);
 | 
			
		||||
            islandInfo.biomeset = new Biome[5];
 | 
			
		||||
            islandInfo.biomeset[1] = biomeInfo.getBiome();
 | 
			
		||||
            islandInfo.biomeset[2] = biomeInfo.getPreferredShore() == null ? Biome.BEACH : biomeInfo.getPreferredShore();
 | 
			
		||||
            islandInfo.biomeset[4] = biomeInfo.getHillBiome() == null ? islandInfo.biomeset[1] : biomeInfo.getHillBiome();
 | 
			
		||||
            islandInfo.biomeset[3] = islandInfo.biomeset[2];
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        PropagatorInfo propInfo = new PropagatorInfo(islandInfo, chunkBiomeSets, new Point2(chunkX, chunkZ), islandMap, biomeCache);
 | 
			
		||||
        PropagatorInfo propInfo = new PropagatorInfo(islandInfo.biomeset, chunkBiomeSets, new Point2(chunkX, chunkZ), islandMap, biomeCache);
 | 
			
		||||
        Flooder flooder = new Flooder(new Point2(worldX, worldZ), propInfo);
 | 
			
		||||
        flooder.start();
 | 
			
		||||
    }
 | 
			
		||||
@@ -76,7 +87,7 @@ public class UniqueBiomeGenerator implements BiomeGenerator {
 | 
			
		||||
        public final IslandWorldMap mapper;
 | 
			
		||||
        public final World world;
 | 
			
		||||
        private final Cache<Point2, Biome[]> biomeCache;
 | 
			
		||||
        public Biome main, shore, shallow;
 | 
			
		||||
        private Biome[] biomeset;
 | 
			
		||||
        
 | 
			
		||||
        public IslandInfo(IslandWorldMap mapper, World world, Cache<Point2, Biome[]> biomeCache) {
 | 
			
		||||
            this.mapper = mapper;
 | 
			
		||||
@@ -86,22 +97,12 @@ public class UniqueBiomeGenerator implements BiomeGenerator {
 | 
			
		||||
 | 
			
		||||
        @Override
 | 
			
		||||
        public boolean isCoordinateTarget(int x, int y) {
 | 
			
		||||
            Biome[] biomeSet = attemptGetBiomeSet(world, x, y, biomeCache, null);
 | 
			
		||||
            if (biomeSet != null) {
 | 
			
		||||
                main = biomeSet[1];
 | 
			
		||||
                shore = biomeSet[2];
 | 
			
		||||
                shallow = biomeSet[3];
 | 
			
		||||
                if ((main == null || shore == null) && mapper.isLand(x, y)) {
 | 
			
		||||
                    if (shore == null && mapper.isShore(x, y)) {
 | 
			
		||||
                        main = biomeSet[0];
 | 
			
		||||
                    } else if (main == null && !mapper.isShore(x, y)) {
 | 
			
		||||
                        shore = biomeSet[0];
 | 
			
		||||
            biomeset = attemptGetBiomeSet(world, x, y, biomeCache, null);
 | 
			
		||||
            if (biomeset != null) {
 | 
			
		||||
                if (!isComplete()) throw new IllegalStateException("There was an incomplete biome set.");
 | 
			
		||||
                return true;
 | 
			
		||||
            }
 | 
			
		||||
                } else if (shallow == null) {
 | 
			
		||||
                    shallow = biomeSet[0];
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            return isComplete();
 | 
			
		||||
            return false;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        @Override
 | 
			
		||||
@@ -110,21 +111,19 @@ public class UniqueBiomeGenerator implements BiomeGenerator {
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public boolean isComplete() {
 | 
			
		||||
            return main != null && shore != null && shallow != null;
 | 
			
		||||
            return !(biomeset == null || biomeset[1] == null || biomeset[2] == null || biomeset[3] == null || biomeset[4] == null);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private class PropagatorInfo implements Floodable {
 | 
			
		||||
        private final Biome shallow, shore, main;
 | 
			
		||||
        private final Biome[] biomeset;
 | 
			
		||||
        private final Biome[][][] biomes;
 | 
			
		||||
        private final Point2 chunkCoords;
 | 
			
		||||
        private final IslandWorldMap mapper;
 | 
			
		||||
        private final Cache<Point2, Biome[]> biomeCache;
 | 
			
		||||
 | 
			
		||||
        public PropagatorInfo(IslandInfo islandInfo, Biome[][][] biomes, Point2 chunkCoords, IslandWorldMap mapper, Cache<Point2, Biome[]> biomeCache) {
 | 
			
		||||
            this.shallow = islandInfo.shallow;
 | 
			
		||||
            this.shore = islandInfo.shore;
 | 
			
		||||
            this.main = islandInfo.main;
 | 
			
		||||
        public PropagatorInfo(Biome[] biomeset, Biome[][][] biomes, Point2 chunkCoords, IslandWorldMap mapper, Cache<Point2, Biome[]> biomeCache) {
 | 
			
		||||
            this.biomeset = biomeset;
 | 
			
		||||
            this.biomes = biomes;
 | 
			
		||||
            this.chunkCoords = chunkCoords;
 | 
			
		||||
            this.mapper = mapper;
 | 
			
		||||
@@ -137,18 +136,17 @@ public class UniqueBiomeGenerator implements BiomeGenerator {
 | 
			
		||||
            if (!this.chunkCoords.fastEquals(chunkCoords) || !mapper.isIsland(point.x, point.y)) return false;
 | 
			
		||||
            int x = point.x;
 | 
			
		||||
            int y = point.y;
 | 
			
		||||
            Biome[] biomeSet = new Biome[4];
 | 
			
		||||
            biomeSet[1] = main;
 | 
			
		||||
            biomeSet[2] = shore;
 | 
			
		||||
            biomeSet[3] = shallow;
 | 
			
		||||
            Biome[] biomeSet = Arrays.copyOf(biomeset, biomeset.length);
 | 
			
		||||
            if (mapper.isLand(x, y)) {
 | 
			
		||||
                if (mapper.isShore(x, y)) {
 | 
			
		||||
                    biomeSet[0] = shore;
 | 
			
		||||
                    biomeSet[0] = biomeset[2];
 | 
			
		||||
                } else if (mapper.getWorldValue(x, y) >= HILL_PORTION) {
 | 
			
		||||
                    biomeSet[0] = biomeset[4];
 | 
			
		||||
                } else {
 | 
			
		||||
                    biomeSet[0] = main;
 | 
			
		||||
                    biomeSet[0] = biomeset[1];
 | 
			
		||||
                }
 | 
			
		||||
            } else {
 | 
			
		||||
                biomeSet[0] = shallow;
 | 
			
		||||
                biomeSet[0] = biomeset[3];
 | 
			
		||||
            }
 | 
			
		||||
            
 | 
			
		||||
            setCacheBiome(x, y, biomeSet, biomes, biomeCache);
 | 
			
		||||
 
 | 
			
		||||
@@ -1,8 +1,6 @@
 | 
			
		||||
package ca.recrown.islandsurvivalcraft.world.generation.chunks;
 | 
			
		||||
 | 
			
		||||
import java.util.LinkedList;
 | 
			
		||||
import java.util.Random;
 | 
			
		||||
import java.util.concurrent.ExecutionException;
 | 
			
		||||
import java.util.concurrent.ExecutorService;
 | 
			
		||||
import java.util.concurrent.Future;
 | 
			
		||||
 | 
			
		||||
@@ -40,8 +38,7 @@ public class IslandWorldChunkGenerator extends ChunkGenerator implements Listene
 | 
			
		||||
    private volatile WorldHeightShader heightShader;
 | 
			
		||||
    private volatile WorldLayerShader layerShader;
 | 
			
		||||
    private volatile Cache<Point2, Biome[]> biomeCache = new Cache<>(131072);
 | 
			
		||||
    private volatile ExecutorService exAlpha = GeneralUtilities.ISC_EXECUTOR_ALPHA;
 | 
			
		||||
    private volatile ExecutorService exBeta = GeneralUtilities.ISC_EXECUTOR_BETA;
 | 
			
		||||
    private final ExecutorService exAlpha = GeneralUtilities.ISC_EXECUTOR_ALPHA;
 | 
			
		||||
 | 
			
		||||
    public void initialize() {
 | 
			
		||||
        if (initialized) throw new IllegalStateException("This generator has already been initialized.");
 | 
			
		||||
@@ -77,9 +74,6 @@ public class IslandWorldChunkGenerator extends ChunkGenerator implements Listene
 | 
			
		||||
            worldInfo.initialize(world, this);
 | 
			
		||||
        }
 | 
			
		||||
        if (!initialized) throw new IllegalStateException("This generator has not been initialized.");
 | 
			
		||||
 | 
			
		||||
        LinkedList<Future<Boolean>> tasks = new LinkedList<>();
 | 
			
		||||
        ChunkData chunkData = createChunkData(world);
 | 
			
		||||
        Future<Boolean> preLoader = exAlpha.submit(() -> {
 | 
			
		||||
            for (int x = GeneralUtilities.CHUNK_SIZE - 1; x >= 0; x--) {
 | 
			
		||||
                for (int z = GeneralUtilities.CHUNK_SIZE - 1; z >= 0; z--) {
 | 
			
		||||
@@ -90,7 +84,9 @@ public class IslandWorldChunkGenerator extends ChunkGenerator implements Listene
 | 
			
		||||
            return true;
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        Biome[][][] biomeArraySet = new Biome[GeneralUtilities.CHUNK_SIZE][GeneralUtilities.CHUNK_SIZE][4];
 | 
			
		||||
        ChunkData chunkData = createChunkData(world);
 | 
			
		||||
 | 
			
		||||
        Biome[][][] biomeArraySet = new Biome[GeneralUtilities.CHUNK_SIZE][GeneralUtilities.CHUNK_SIZE][5];
 | 
			
		||||
        for (int x = 0; x < GeneralUtilities.CHUNK_SIZE; x++) {
 | 
			
		||||
            for (int z = 0; z < GeneralUtilities.CHUNK_SIZE; z++) {
 | 
			
		||||
                final int localX = x;
 | 
			
		||||
@@ -101,13 +97,10 @@ public class IslandWorldChunkGenerator extends ChunkGenerator implements Listene
 | 
			
		||||
                    biomeGenerator.generateBiomeColumn(biomeArraySet, world, chunkX, chunkZ, localX, localZ, islandMap, biomeMap,
 | 
			
		||||
                            temperatureMap, biomeCache);
 | 
			
		||||
                }
 | 
			
		||||
                if (biomeArraySet[localX][localZ][0] == null) throw new IllegalStateException("Biome was null.");
 | 
			
		||||
                tasks.add(exBeta.submit(() -> {
 | 
			
		||||
 | 
			
		||||
                for (int y = 0; y < worldInfo.getWorldHeight(); y++) {
 | 
			
		||||
                    biomeGrid.setBiome(localX, y, localZ, biomeArraySet[localX][localZ][0]);
 | 
			
		||||
                }
 | 
			
		||||
                    return true;
 | 
			
		||||
                }));
 | 
			
		||||
 | 
			
		||||
                Biome[] currentBiomeSet = biomeArraySet[localX][localZ];
 | 
			
		||||
                int terrainHeight = heightShader.getTerrainHeight(worldX, worldZ, currentBiomeSet);
 | 
			
		||||
@@ -135,16 +128,7 @@ public class IslandWorldChunkGenerator extends ChunkGenerator implements Listene
 | 
			
		||||
                chunkData.setRegion(localX, 0, localZ, localX + 1, bedrockHeight, localZ + 1, Material.BEDROCK);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        preLoader.cancel(false);
 | 
			
		||||
        try {
 | 
			
		||||
            while (!tasks.isEmpty()) {
 | 
			
		||||
                tasks.poll().get();
 | 
			
		||||
            }
 | 
			
		||||
        } catch (ExecutionException | InterruptedException e) {
 | 
			
		||||
            e.printStackTrace();
 | 
			
		||||
            throw new IllegalStateException(e.getCause().getMessage());
 | 
			
		||||
        }
 | 
			
		||||
        return chunkData;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -27,11 +27,15 @@ public class WorldHeightShader {
 | 
			
		||||
        int height = 0;
 | 
			
		||||
        String biomeName = biomeSet[0].name().toLowerCase();
 | 
			
		||||
        if (!mapper.isLand(worldX, worldZ)) {
 | 
			
		||||
            height = (int) calculateTerrainFactor(worldX, worldZ, seaLevel * 0.8d, 1.7d, 0.5d, 1d, 0.1d);
 | 
			
		||||
            height = (int) Math.floor(calculateTerrainFactor(worldX, worldZ, seaLevel * 0.8d, 1.7d, 0.5d, 1d, 0.09d));
 | 
			
		||||
        } else if (biomeName.contains("beach")) {
 | 
			
		||||
            height = (int) (getIslandBiomeHeight(worldX, worldZ, biomeSet[1], 10d));
 | 
			
		||||
            if (biomeSet[1].name().toLowerCase().contains("mountains")) {
 | 
			
		||||
                height = (int) (getIslandBiomeHeight(worldX, worldZ, biomeSet[1], -15d));
 | 
			
		||||
            } else {
 | 
			
		||||
                height = (int) (getIslandBiomeHeight(worldX, worldZ, biomeSet[1], 0d));
 | 
			
		||||
            }
 | 
			
		||||
        } else if (biomeName.contains("shore")) {
 | 
			
		||||
            height = (int) (getIslandBiomeHeight(worldX, worldZ, biomeSet[1], -30d));
 | 
			
		||||
            height = (int) (getIslandBiomeHeight(worldX, worldZ, biomeSet[1], -15d));
 | 
			
		||||
        } else {
 | 
			
		||||
            height = getIslandBiomeHeight(worldX, worldZ, biomeSet[0], 0d) + 1;
 | 
			
		||||
        }
 | 
			
		||||
@@ -44,10 +48,8 @@ public class WorldHeightShader {
 | 
			
		||||
    private int getIslandBiomeHeight(int worldX, int worldZ, Biome biome, double heightModifier) {
 | 
			
		||||
        int res = 0;
 | 
			
		||||
        String biomeName = biome.name().toLowerCase();
 | 
			
		||||
        if (biomeName.contains("hills")) {
 | 
			
		||||
            res = (int) calculateTerrainFactor(worldX, worldZ, 60d + heightModifier, 1.5d, 0.5d);
 | 
			
		||||
        } else if (biomeName.contains("mountains")) {
 | 
			
		||||
            res = (int) calculateTerrainFactor(worldX, worldZ, 200d + heightModifier, 1.8d, 0.5d);
 | 
			
		||||
        if (biomeName.contains("mountains")) {
 | 
			
		||||
            res = (int) calculateTerrainFactor(worldX, worldZ, 180d + heightModifier, 1.88d, 0.5d);
 | 
			
		||||
        } else if (biomeName.contains("plateau")) {
 | 
			
		||||
            res = (int) Math.min(calculateTerrainFactor(worldX, worldZ, 60d + heightModifier), seaLevel + 30d);
 | 
			
		||||
        } else if (biomeName.contains("modified")) {
 | 
			
		||||
 
 | 
			
		||||
@@ -1,88 +0,0 @@
 | 
			
		||||
package ca.recrown.islandsurvivalcraft.world;
 | 
			
		||||
 | 
			
		||||
import static org.junit.jupiter.api.Assertions.assertEquals;
 | 
			
		||||
 | 
			
		||||
import java.util.Random;
 | 
			
		||||
 | 
			
		||||
import org.bukkit.block.Biome;
 | 
			
		||||
 | 
			
		||||
import org.junit.jupiter.api.BeforeAll;
 | 
			
		||||
import org.junit.jupiter.api.Test;
 | 
			
		||||
import org.junit.jupiter.api.TestInstance;
 | 
			
		||||
import org.junit.jupiter.api.TestInstance.Lifecycle;
 | 
			
		||||
 | 
			
		||||
@TestInstance(Lifecycle.PER_CLASS)
 | 
			
		||||
public class BiomeMapTest {
 | 
			
		||||
    private final Random random = new Random(10320452);
 | 
			
		||||
    BiomeMap biomeSelector;
 | 
			
		||||
 | 
			
		||||
    @BeforeAll
 | 
			
		||||
    public void setUp() {
 | 
			
		||||
        biomeSelector = new BiomeMap(random);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    public void testGetBiomeTemperatureBirchHill() {
 | 
			
		||||
        assertEquals(0.6f, biomeSelector.getBiomeTemperature(Biome.BIRCH_FOREST_HILLS));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    public void testGetBiomeTemperatureSwampHill() {
 | 
			
		||||
        assertEquals(0.8f, biomeSelector.getBiomeTemperature(Biome.SWAMP_HILLS));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    public void testGetBiomeTemperatureTaigaHill() {
 | 
			
		||||
        assertEquals(0.25f, biomeSelector.getBiomeTemperature(Biome.TAIGA_HILLS));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    public void testGetBiomeTemperatureSnowyTaigaHill() {
 | 
			
		||||
        assertEquals(-0.5f, biomeSelector.getBiomeTemperature(Biome.SNOWY_TAIGA_HILLS));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    public void testGetBiomeTemperatureSnowyTaigaMountain() {
 | 
			
		||||
        assertEquals(-0.5f, biomeSelector.getBiomeTemperature(Biome.SNOWY_TAIGA_MOUNTAINS));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    public void testGetTransitionalBiomeFromModifiedJungle() {
 | 
			
		||||
        assertEquals(Biome.MODIFIED_JUNGLE_EDGE, biomeSelector.getTransitionalBiome(Biome.MODIFIED_JUNGLE));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    public void testGetTransitionalBiomeFromOcean() {
 | 
			
		||||
        assertEquals(null, biomeSelector.getTransitionalBiome(Biome.OCEAN));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    public void testGetTransitionalBiomeFromMountain() {
 | 
			
		||||
        assertEquals(null, biomeSelector.getTransitionalBiome(Biome.MOUNTAINS));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    public void testGetTransitionalBiomeFromJungle() {
 | 
			
		||||
        assertEquals(Biome.JUNGLE_EDGE, biomeSelector.getTransitionalBiome(Biome.JUNGLE));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    public void testGetShoreBiomeFromMountain() {
 | 
			
		||||
        assertEquals(Biome.STONE_SHORE, biomeSelector.getShoreBiome(Biome.MOUNTAINS, 0.2f));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    public void testGetShoreBiomeFromMushroomIsland() {
 | 
			
		||||
        assertEquals(Biome.MUSHROOM_FIELD_SHORE, biomeSelector.getShoreBiome(Biome.MUSHROOM_FIELDS, 1.2f));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    public void testGetShoreBiomeFromPlains() {
 | 
			
		||||
        assertEquals(Biome.BEACH, biomeSelector.getShoreBiome(Biome.PLAINS, 0.8f));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    public void testGetShoreBiomeFromSnowyTaiga() {
 | 
			
		||||
        assertEquals(Biome.SNOWY_BEACH, biomeSelector.getShoreBiome(Biome.SNOWY_TAIGA, -0.5f));
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -60,7 +60,6 @@ public class DummyWorld implements World {
 | 
			
		||||
    @Override
 | 
			
		||||
    public void sendPluginMessage(Plugin source, String channel, byte[] message) {
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
@@ -72,7 +71,6 @@ public class DummyWorld implements World {
 | 
			
		||||
    @Override
 | 
			
		||||
    public void setMetadata(String metadataKey, MetadataValue newMetadataValue) {
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
@@ -90,7 +88,6 @@ public class DummyWorld implements World {
 | 
			
		||||
    @Override
 | 
			
		||||
    public void removeMetadata(String metadataKey, Plugin owningPlugin) {
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
@@ -228,7 +225,6 @@ public class DummyWorld implements World {
 | 
			
		||||
    @Override
 | 
			
		||||
    public void loadChunk(Chunk chunk) {
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
@@ -252,7 +248,6 @@ public class DummyWorld implements World {
 | 
			
		||||
    @Override
 | 
			
		||||
    public void loadChunk(int x, int z) {
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
@@ -306,7 +301,6 @@ public class DummyWorld implements World {
 | 
			
		||||
    @Override
 | 
			
		||||
    public void setChunkForceLoaded(int x, int z, boolean forced) {
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
@@ -330,7 +324,6 @@ public class DummyWorld implements World {
 | 
			
		||||
    @Override
 | 
			
		||||
    public void removePluginChunkTickets(Plugin plugin) {
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
@@ -364,8 +357,8 @@ public class DummyWorld implements World {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public <T extends AbstractArrow> T spawnArrow(Location location, Vector direction,
 | 
			
		||||
            float speed, float spread, Class<T> clazz) {
 | 
			
		||||
    public <T extends AbstractArrow> T spawnArrow(Location location, Vector direction, float speed, float spread,
 | 
			
		||||
            Class<T> clazz) {
 | 
			
		||||
 | 
			
		||||
        return null;
 | 
			
		||||
    }
 | 
			
		||||
@@ -463,57 +456,53 @@ public class DummyWorld implements World {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public Collection<Entity> getNearbyEntities(BoundingBox boundingBox,
 | 
			
		||||
    public Collection<Entity> getNearbyEntities(BoundingBox boundingBox, Predicate<Entity> filter) {
 | 
			
		||||
 | 
			
		||||
        return null;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public RayTraceResult rayTraceEntities(Location start, Vector direction, double maxDistance) {
 | 
			
		||||
 | 
			
		||||
        return null;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public RayTraceResult rayTraceEntities(Location start, Vector direction, double maxDistance, double raySize) {
 | 
			
		||||
 | 
			
		||||
        return null;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public RayTraceResult rayTraceEntities(Location start, Vector direction, double maxDistance,
 | 
			
		||||
            Predicate<Entity> filter) {
 | 
			
		||||
 | 
			
		||||
        return null;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public RayTraceResult rayTraceEntities(Location start, Vector direction,
 | 
			
		||||
            double maxDistance) {
 | 
			
		||||
    public RayTraceResult rayTraceEntities(Location start, Vector direction, double maxDistance, double raySize,
 | 
			
		||||
            Predicate<Entity> filter) {
 | 
			
		||||
 | 
			
		||||
        return null;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public RayTraceResult rayTraceEntities(Location start, Vector direction,
 | 
			
		||||
            double maxDistance, double raySize) {
 | 
			
		||||
    public RayTraceResult rayTraceBlocks(Location start, Vector direction, double maxDistance) {
 | 
			
		||||
 | 
			
		||||
        return null;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public RayTraceResult rayTraceEntities(Location start, Vector direction,
 | 
			
		||||
            double maxDistance, Predicate<Entity> filter) {
 | 
			
		||||
    public RayTraceResult rayTraceBlocks(Location start, Vector direction, double maxDistance,
 | 
			
		||||
            FluidCollisionMode fluidCollisionMode) {
 | 
			
		||||
 | 
			
		||||
        return null;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public RayTraceResult rayTraceEntities(Location start, Vector direction,
 | 
			
		||||
            double maxDistance, double raySize, Predicate<Entity> filter) {
 | 
			
		||||
 | 
			
		||||
        return null;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public RayTraceResult rayTraceBlocks(Location start, Vector direction,
 | 
			
		||||
            double maxDistance) {
 | 
			
		||||
 | 
			
		||||
        return null;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public RayTraceResult rayTraceBlocks(Location start, Vector direction,
 | 
			
		||||
            double maxDistance, FluidCollisionMode fluidCollisionMode) {
 | 
			
		||||
 | 
			
		||||
        return null;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public RayTraceResult rayTraceBlocks(Location start, Vector direction,
 | 
			
		||||
            double maxDistance, FluidCollisionMode fluidCollisionMode, boolean ignorePassableBlocks) {
 | 
			
		||||
    public RayTraceResult rayTraceBlocks(Location start, Vector direction, double maxDistance,
 | 
			
		||||
            FluidCollisionMode fluidCollisionMode, boolean ignorePassableBlocks) {
 | 
			
		||||
 | 
			
		||||
        return null;
 | 
			
		||||
    }
 | 
			
		||||
@@ -544,12 +533,6 @@ public class DummyWorld implements World {
 | 
			
		||||
        return null;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public boolean setSpawnLocation(Location location) {
 | 
			
		||||
 | 
			
		||||
        return false;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public boolean setSpawnLocation(int x, int y, int z) {
 | 
			
		||||
 | 
			
		||||
@@ -565,7 +548,6 @@ public class DummyWorld implements World {
 | 
			
		||||
    @Override
 | 
			
		||||
    public void setTime(long time) {
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
@@ -577,7 +559,6 @@ public class DummyWorld implements World {
 | 
			
		||||
    @Override
 | 
			
		||||
    public void setFullTime(long time) {
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
@@ -595,7 +576,6 @@ public class DummyWorld implements World {
 | 
			
		||||
    @Override
 | 
			
		||||
    public void setStorm(boolean hasStorm) {
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
@@ -607,7 +587,6 @@ public class DummyWorld implements World {
 | 
			
		||||
    @Override
 | 
			
		||||
    public void setWeatherDuration(int duration) {
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
@@ -619,7 +598,6 @@ public class DummyWorld implements World {
 | 
			
		||||
    @Override
 | 
			
		||||
    public void setThundering(boolean thundering) {
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
@@ -631,7 +609,6 @@ public class DummyWorld implements World {
 | 
			
		||||
    @Override
 | 
			
		||||
    public void setThunderDuration(int duration) {
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
@@ -672,8 +649,7 @@ public class DummyWorld implements World {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public boolean createExplosion(Entity source, Location loc, float power, boolean setFire,
 | 
			
		||||
            boolean breakBlocks) {
 | 
			
		||||
    public boolean createExplosion(Entity source, Location loc, float power, boolean setFire, boolean breakBlocks) {
 | 
			
		||||
 | 
			
		||||
        return false;
 | 
			
		||||
    }
 | 
			
		||||
@@ -685,8 +661,7 @@ public class DummyWorld implements World {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public boolean createExplosion(Location loc, float power, boolean setFire, boolean breakBlocks,
 | 
			
		||||
            Entity source) {
 | 
			
		||||
    public boolean createExplosion(Location loc, float power, boolean setFire, boolean breakBlocks, Entity source) {
 | 
			
		||||
 | 
			
		||||
        return false;
 | 
			
		||||
    }
 | 
			
		||||
@@ -712,7 +687,6 @@ public class DummyWorld implements World {
 | 
			
		||||
    @Override
 | 
			
		||||
    public void setPVP(boolean pvp) {
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
@@ -724,7 +698,6 @@ public class DummyWorld implements World {
 | 
			
		||||
    @Override
 | 
			
		||||
    public void save() {
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
@@ -734,29 +707,26 @@ public class DummyWorld implements World {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public <T extends Entity> T spawn(Location location, Class<T> clazz)
 | 
			
		||||
    public <T extends Entity> T spawn(Location location, Class<T> clazz) throws IllegalArgumentException {
 | 
			
		||||
 | 
			
		||||
        return null;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public <T extends Entity> T spawn(Location location, Class<T> clazz, Consumer<T> function)
 | 
			
		||||
            throws IllegalArgumentException {
 | 
			
		||||
 | 
			
		||||
        return null;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public <T extends Entity> T spawn(Location location, Class<T> clazz,
 | 
			
		||||
            Consumer<T> function) throws IllegalArgumentException {
 | 
			
		||||
    public FallingBlock spawnFallingBlock(Location location, MaterialData data) throws IllegalArgumentException {
 | 
			
		||||
 | 
			
		||||
        return null;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public FallingBlock spawnFallingBlock(Location location, MaterialData data)
 | 
			
		||||
            throws IllegalArgumentException {
 | 
			
		||||
 | 
			
		||||
        return null;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public FallingBlock spawnFallingBlock(Location location, BlockData data)
 | 
			
		||||
            throws IllegalArgumentException {
 | 
			
		||||
    public FallingBlock spawnFallingBlock(Location location, BlockData data) throws IllegalArgumentException {
 | 
			
		||||
 | 
			
		||||
        return null;
 | 
			
		||||
    }
 | 
			
		||||
@@ -771,25 +741,21 @@ public class DummyWorld implements World {
 | 
			
		||||
    @Override
 | 
			
		||||
    public void playEffect(Location location, Effect effect, int data) {
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void playEffect(Location location, Effect effect, int data, int radius) {
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public <T> void playEffect(Location location, Effect effect, T data) {
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public <T> void playEffect(Location location, Effect effect, T data, int radius) {
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
@@ -801,7 +767,6 @@ public class DummyWorld implements World {
 | 
			
		||||
    @Override
 | 
			
		||||
    public void setSpawnFlags(boolean allowMonsters, boolean allowAnimals) {
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
@@ -831,13 +796,11 @@ public class DummyWorld implements World {
 | 
			
		||||
    @Override
 | 
			
		||||
    public void setBiome(int x, int z, Biome bio) {
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void setBiome(int x, int y, int z, Biome bio) {
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
@@ -885,7 +848,6 @@ public class DummyWorld implements World {
 | 
			
		||||
    @Override
 | 
			
		||||
    public void setKeepSpawnInMemory(boolean keepLoaded) {
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
@@ -897,13 +859,11 @@ public class DummyWorld implements World {
 | 
			
		||||
    @Override
 | 
			
		||||
    public void setAutoSave(boolean value) {
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void setDifficulty(Difficulty difficulty) {
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
@@ -939,7 +899,6 @@ public class DummyWorld implements World {
 | 
			
		||||
    @Override
 | 
			
		||||
    public void setHardcore(boolean hardcore) {
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
@@ -951,7 +910,6 @@ public class DummyWorld implements World {
 | 
			
		||||
    @Override
 | 
			
		||||
    public void setTicksPerAnimalSpawns(int ticksPerAnimalSpawns) {
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
@@ -963,7 +921,6 @@ public class DummyWorld implements World {
 | 
			
		||||
    @Override
 | 
			
		||||
    public void setTicksPerMonsterSpawns(int ticksPerMonsterSpawns) {
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
@@ -975,7 +932,6 @@ public class DummyWorld implements World {
 | 
			
		||||
    @Override
 | 
			
		||||
    public void setTicksPerWaterSpawns(int ticksPerWaterSpawns) {
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
@@ -987,7 +943,6 @@ public class DummyWorld implements World {
 | 
			
		||||
    @Override
 | 
			
		||||
    public void setTicksPerAmbientSpawns(int ticksPerAmbientSpawns) {
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
@@ -999,7 +954,6 @@ public class DummyWorld implements World {
 | 
			
		||||
    @Override
 | 
			
		||||
    public void setMonsterSpawnLimit(int limit) {
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
@@ -1011,7 +965,6 @@ public class DummyWorld implements World {
 | 
			
		||||
    @Override
 | 
			
		||||
    public void setAnimalSpawnLimit(int limit) {
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
@@ -1023,7 +976,6 @@ public class DummyWorld implements World {
 | 
			
		||||
    @Override
 | 
			
		||||
    public void setWaterAnimalSpawnLimit(int limit) {
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
@@ -1035,32 +987,25 @@ public class DummyWorld implements World {
 | 
			
		||||
    @Override
 | 
			
		||||
    public void setAmbientSpawnLimit(int limit) {
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void playSound(Location location, Sound sound, float volume, float pitch) {
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void playSound(Location location, String sound, float volume, float pitch) {
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void playSound(Location location, Sound sound, SoundCategory category, float volume, float pitch) {
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void playSound(Location location, Sound sound, SoundCategory category,
 | 
			
		||||
            float volume, float pitch) {
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void playSound(Location location, String sound, SoundCategory category,
 | 
			
		||||
            float volume, float pitch) {
 | 
			
		||||
 | 
			
		||||
    public void playSound(Location location, String sound, SoundCategory category, float volume, float pitch) {
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -1115,32 +1060,26 @@ public class DummyWorld implements World {
 | 
			
		||||
    @Override
 | 
			
		||||
    public void spawnParticle(Particle particle, Location location, int count) {
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void spawnParticle(Particle particle, double x, double y, double z, int count) {
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public <T> void spawnParticle(Particle particle, Location location, int count, T data) {
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public <T> void spawnParticle(Particle particle, double x, double y, double z, int count, T data) {
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public <T> void spawnParticle(Particle particle, double x, double y, double z, int count,
 | 
			
		||||
            T data) {
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void spawnParticle(Particle particle, Location location, int count, double offsetX,
 | 
			
		||||
            double offsetY, double offsetZ) {
 | 
			
		||||
 | 
			
		||||
    public void spawnParticle(Particle particle, Location location, int count, double offsetX, double offsetY,
 | 
			
		||||
            double offsetZ) {
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -1148,13 +1087,11 @@ public class DummyWorld implements World {
 | 
			
		||||
    public void spawnParticle(Particle particle, double x, double y, double z, int count, double offsetX,
 | 
			
		||||
            double offsetY, double offsetZ) {
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public <T> void spawnParticle(Particle particle, Location location, int count, double offsetX,
 | 
			
		||||
            double offsetY, double offsetZ, T data) {
 | 
			
		||||
 | 
			
		||||
    public <T> void spawnParticle(Particle particle, Location location, int count, double offsetX, double offsetY,
 | 
			
		||||
            double offsetZ, T data) {
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -1162,13 +1099,11 @@ public class DummyWorld implements World {
 | 
			
		||||
    public <T> void spawnParticle(Particle particle, double x, double y, double z, int count, double offsetX,
 | 
			
		||||
            double offsetY, double offsetZ, T data) {
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void spawnParticle(Particle particle, Location location, int count, double offsetX,
 | 
			
		||||
            double offsetY, double offsetZ, double extra) {
 | 
			
		||||
 | 
			
		||||
    public void spawnParticle(Particle particle, Location location, int count, double offsetX, double offsetY,
 | 
			
		||||
            double offsetZ, double extra) {
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -1176,28 +1111,23 @@ public class DummyWorld implements World {
 | 
			
		||||
    public void spawnParticle(Particle particle, double x, double y, double z, int count, double offsetX,
 | 
			
		||||
            double offsetY, double offsetZ, double extra) {
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public <T> void spawnParticle(Particle particle, Location location, int count, double offsetX, double offsetY,
 | 
			
		||||
            double offsetZ, double extra, T data) {
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public <T> void spawnParticle(Particle particle, Location location, int count, double offsetX,
 | 
			
		||||
            double offsetY, double offsetZ, double extra, T data) {
 | 
			
		||||
 | 
			
		||||
    public <T> void spawnParticle(Particle particle, List<Player> receivers, Player source, double x, double y,
 | 
			
		||||
            double z, int count, double offsetX, double offsetY, double offsetZ, double extra, T data, boolean force) {
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public <T> void spawnParticle(Particle particle, List<Player> receivers, Player source,
 | 
			
		||||
            double x, double y, double z, int count, double offsetX, double offsetY, double offsetZ, double extra,
 | 
			
		||||
            T data, boolean force) {
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public <T> void spawnParticle(Particle particle, Location location, int count, double offsetX,
 | 
			
		||||
            double offsetY, double offsetZ, double extra, T data, boolean force) {
 | 
			
		||||
 | 
			
		||||
    public <T> void spawnParticle(Particle particle, Location location, int count, double offsetX, double offsetY,
 | 
			
		||||
            double offsetZ, double extra, T data, boolean force) {
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -1205,12 +1135,11 @@ public class DummyWorld implements World {
 | 
			
		||||
    public <T> void spawnParticle(Particle particle, double x, double y, double z, int count, double offsetX,
 | 
			
		||||
            double offsetY, double offsetZ, double extra, T data, boolean force) {
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public Location locateNearestStructure(Location origin, StructureType structureType,
 | 
			
		||||
            int radius, boolean findUnexplored) {
 | 
			
		||||
    public Location locateNearestStructure(Location origin, StructureType structureType, int radius,
 | 
			
		||||
            boolean findUnexplored) {
 | 
			
		||||
 | 
			
		||||
        return null;
 | 
			
		||||
    }
 | 
			
		||||
@@ -1245,4 +1174,22 @@ public class DummyWorld implements World {
 | 
			
		||||
        return null;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public int getNoTickViewDistance() {
 | 
			
		||||
        return 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void setNoTickViewDistance(int arg0) {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public boolean setSpawnLocation(Location location) {
 | 
			
		||||
        return false;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void setViewDistance(int arg0) {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user