package com.volmit.iris.object; import com.volmit.iris.Iris; import com.volmit.iris.gen.ContextualChunkGenerator; import com.volmit.iris.gen.atomics.AtomicCache; import com.volmit.iris.util.ArrayType; import com.volmit.iris.util.CNG; import com.volmit.iris.util.Desc; import com.volmit.iris.util.DontObfuscate; import com.volmit.iris.util.IRare; import com.volmit.iris.util.KList; import com.volmit.iris.util.KMap; import com.volmit.iris.util.KSet; import com.volmit.iris.util.MaxNumber; import com.volmit.iris.util.MinNumber; import com.volmit.iris.util.RNG; import com.volmit.iris.util.Required; import lombok.Data; import lombok.EqualsAndHashCode; @Desc("Represents an iris region") @Data @EqualsAndHashCode(callSuper = false) public class IrisRegion extends IrisRegistrant implements IRare { @MinNumber(2) @Required @DontObfuscate @Desc("The name of the region") private String name = "A Region"; @ArrayType(min = 1, type = IrisEffect.class) @DontObfuscate @Desc("Effects are ambient effects such as potion effects, random sounds, or even particles around each player. All of these effects are played via packets so two players won't see/hear each others effects.\nDue to performance reasons, effects will play arround the player even if where the effect was played is no longer in the biome the player is in.") private KList effects = new KList<>(); @MinNumber(1) @MaxNumber(256) @DontObfuscate @Desc("The rarity of the region") private int rarity = 1; @MinNumber(0.0001) @MaxNumber(1) @DontObfuscate @Desc("The shore ration (How much percent of land should be a shore)") private double shoreRatio = 0.13; @MinNumber(0) @DontObfuscate @Desc("The min shore height") private double shoreHeightMin = 1.2; @DontObfuscate @MinNumber(0) @Desc("The scrambling between biomes") private double biomeShuffle = 11; @MinNumber(0) @DontObfuscate @Desc("The the max shore height") private double shoreHeightMax = 3.2; @MinNumber(0.0001) @DontObfuscate @Desc("The varience of the shore height") private double shoreHeightZoom = 3.14; @MinNumber(0.0001) @DontObfuscate @Desc("How large land biomes are in this region") private double landBiomeZoom = 1; @MinNumber(0.0001) @DontObfuscate @Desc("How large shore biomes are in this region") private double shoreBiomeZoom = 1; @MinNumber(0.0001) @DontObfuscate @Desc("How large sea biomes are in this region") private double seaBiomeZoom = 1; @MinNumber(0.0001) @DontObfuscate @Desc("How large island biomes are in this region") private double islandBiomeZoom = 1; @MinNumber(0.0001) @DontObfuscate @Desc("How large cave biomes are in this region") private double caveBiomeZoom = 1; @MinNumber(0.0001) @DontObfuscate @Desc("How large skyland biomes are in this region") private double skylandBiomeZoom = 1; @MinNumber(0.0001) @MaxNumber(1) @DontObfuscate @Desc("The biome implosion ratio, how much to implode biomes into children (chance)") private double biomeImplosionRatio = 0.4; @ArrayType(min = 1, type = IrisStructurePlacement.class) @DontObfuscate @Desc("A list of structure tilesets") private KList structures = new KList<>(); @Required @ArrayType(min = 1, type = String.class) @DontObfuscate @Desc("A list of root-level biomes in this region. Don't specify child biomes of other biomes here. Just the root parents.") private KList landBiomes = new KList<>(); @Required @ArrayType(min = 1, type = String.class) @DontObfuscate @Desc("A list of root-level biomes in this region. Don't specify child biomes of other biomes here. Just the root parents.") private KList seaBiomes = new KList<>(); @Required @ArrayType(min = 1, type = String.class) @DontObfuscate @Desc("A list of root-level biomes in this region. Don't specify child biomes of other biomes here. Just the root parents.") private KList shoreBiomes = new KList<>(); @ArrayType(min = 1, type = String.class) @DontObfuscate @Desc("A list of root-level biomes in this region. Don't specify child biomes of other biomes here. Just the root parents.") private KList caveBiomes = new KList<>(); @ArrayType(min = 1, type = String.class) @DontObfuscate @Desc("A list of root-level biomes in this region. Don't specify child biomes of other biomes here. Just the root parents.") private KList islandBiomes = new KList<>(); @ArrayType(min = 1, type = String.class) @DontObfuscate @Desc("A list of root-level biomes in this region. Don't specify child biomes of other biomes here. Just the root parents.") private KList skylandBiomes = new KList<>(); @ArrayType(min = 1, type = IrisRegionRidge.class) @DontObfuscate @Desc("Ridge biomes create a vein-like network like rivers through this region") private KList ridgeBiomes = new KList<>(); @ArrayType(min = 1, type = IrisRegionSpot.class) @DontObfuscate @Desc("Spot biomes splotch themselves across this region like lakes") private KList spotBiomes = new KList<>(); @ArrayType(min = 1, type = IrisDepositGenerator.class) @Desc("Define regional deposit generators that add onto the global deposit generators") private KList deposits = new KList<>(); private transient AtomicCache> cacheRidge = new AtomicCache<>(); private transient AtomicCache> cacheSpot = new AtomicCache<>(); private transient AtomicCache shoreHeightGenerator = new AtomicCache<>(); private transient AtomicCache> realLandBiomes = new AtomicCache<>(); private transient AtomicCache> realSeaBiomes = new AtomicCache<>(); private transient AtomicCache> realShoreBiomes = new AtomicCache<>(); private transient AtomicCache> realIslandBiomes = new AtomicCache<>(); private transient AtomicCache> realSkylandBiomes = new AtomicCache<>(); private transient AtomicCache> realCaveBiomes = new AtomicCache<>(); public double getBiomeZoom(InferredType t) { switch(t) { case CAVE: return caveBiomeZoom; case ISLAND: return islandBiomeZoom; case LAND: return landBiomeZoom; case SEA: return seaBiomeZoom; case SHORE: return shoreBiomeZoom; case SKYLAND: return skylandBiomeZoom; default: break; } return 1; } public KList getRidgeBiomeKeys() { return cacheRidge.aquire(() -> { KList cacheRidge = new KList(); ridgeBiomes.forEach((i) -> cacheRidge.add(i.getBiome())); return cacheRidge; }); } public KList getSpotBiomeKeys() { return cacheSpot.aquire(() -> { KList cacheSpot = new KList(); spotBiomes.forEach((i) -> cacheSpot.add(i.getBiome())); return cacheSpot; }); } public CNG getShoreHeightGenerator() { return shoreHeightGenerator.aquire(() -> { return CNG.signature(new RNG((long) (getName().length() + getIslandBiomes().size() + getLandBiomeZoom() + getLandBiomes().size() + 3458612))); }); } public double getShoreHeight(double x, double z) { return getShoreHeightGenerator().fitDoubleD(shoreHeightMin, shoreHeightMax, x / shoreHeightZoom, z / shoreHeightZoom); } public KList getAllBiomes(ContextualChunkGenerator g) { KMap b = new KMap<>(); KSet names = new KSet<>(); names.addAll(landBiomes); names.addAll(islandBiomes); names.addAll(caveBiomes); names.addAll(skylandBiomes); names.addAll(seaBiomes); names.addAll(shoreBiomes); spotBiomes.forEach((i) -> names.add(i.getBiome())); ridgeBiomes.forEach((i) -> names.add(i.getBiome())); while(!names.isEmpty()) { for(String i : new KList<>(names)) { if(b.containsKey(i)) { names.remove(i); continue; } IrisBiome biome = (g == null ? Iris.globaldata : g.getData()).getBiomeLoader().load(i); b.put(biome.getLoadKey(), biome); names.remove(i); names.addAll(biome.getChildren()); } } return b.v(); } public KList getBiomes(ContextualChunkGenerator g, InferredType type) { if(type.equals(InferredType.LAND)) { return getRealLandBiomes(g); } else if(type.equals(InferredType.SEA)) { return getRealSeaBiomes(g); } else if(type.equals(InferredType.SHORE)) { return getRealShoreBiomes(g); } else if(type.equals(InferredType.CAVE)) { return getRealCaveBiomes(g); } else if(type.equals(InferredType.ISLAND)) { return getRealIslandBiomes(g); } else if(type.equals(InferredType.SKYLAND)) { return getRealSkylandBiomes(g); } return new KList<>(); } public KList getRealCaveBiomes(ContextualChunkGenerator g) { return realCaveBiomes.aquire(() -> { KList realCaveBiomes = new KList<>(); for(String i : getCaveBiomes()) { realCaveBiomes.add((g == null ? Iris.globaldata : g.getData()).getBiomeLoader().load(i)); } return realCaveBiomes; }); } public KList getRealSkylandBiomes(ContextualChunkGenerator g) { return realSkylandBiomes.aquire(() -> { KList realSkylandBiomes = new KList<>(); for(String i : getSkylandBiomes()) { realSkylandBiomes.add((g == null ? Iris.globaldata : g.getData()).getBiomeLoader().load(i)); } return realSkylandBiomes; }); } public KList getRealIslandBiomes(ContextualChunkGenerator g) { return realIslandBiomes.aquire(() -> { KList realIslandBiomes = new KList<>(); for(String i : getIslandBiomes()) { realIslandBiomes.add((g == null ? Iris.globaldata : g.getData()).getBiomeLoader().load(i)); } return realIslandBiomes; }); } public KList getRealShoreBiomes(ContextualChunkGenerator g) { return realShoreBiomes.aquire(() -> { KList realShoreBiomes = new KList<>(); for(String i : getShoreBiomes()) { realShoreBiomes.add((g == null ? Iris.globaldata : g.getData()).getBiomeLoader().load(i)); } return realShoreBiomes; }); } public KList getRealSeaBiomes(ContextualChunkGenerator g) { return realSeaBiomes.aquire(() -> { KList realSeaBiomes = new KList<>(); for(String i : getSeaBiomes()) { realSeaBiomes.add((g == null ? Iris.globaldata : g.getData()).getBiomeLoader().load(i)); } return realSeaBiomes; }); } public KList getRealLandBiomes(ContextualChunkGenerator g) { return realLandBiomes.aquire(() -> { KList realLandBiomes = new KList<>(); for(String i : getLandBiomes()) { realLandBiomes.add((g == null ? Iris.globaldata : g.getData()).getBiomeLoader().load(i)); } return realLandBiomes; }); } }