mirror of
https://github.com/PolyhedralDev/Terra.git
synced 2025-07-18 10:32:30 +00:00
Move StructureSpawnRequirements to separate classes.
This commit is contained in:
parent
658ed01055
commit
08d1ca02f9
@ -24,9 +24,9 @@ public class SpawnCommand extends WorldCommand implements DebugCommand {
|
||||
int x = p.getBlockX();
|
||||
int y = p.getBlockY();
|
||||
int z = p.getBlockZ();
|
||||
boolean air = StructureSpawnRequirement.AIR.matches(world, x, y, z);
|
||||
boolean ground = StructureSpawnRequirement.LAND.matches(world, x, y, z);
|
||||
boolean sea = StructureSpawnRequirement.OCEAN.matches(world, x, y, z);
|
||||
boolean air = StructureSpawnRequirement.AIR.getInstance(world).matches(x, y, z);
|
||||
boolean ground = StructureSpawnRequirement.LAND.getInstance(world).matches(x, y, z);
|
||||
boolean sea = StructureSpawnRequirement.OCEAN.getInstance(world).matches(x, y, z);
|
||||
|
||||
sender.sendMessage("AIR: " + air + "\nLAND: " + ground + "\nOCEAN: " + sea);
|
||||
return true;
|
||||
|
@ -277,7 +277,7 @@ public class Structure implements Serializable {
|
||||
public boolean checkSpawns(Location origin, Rotation r) {
|
||||
for(StructureContainedBlock b : spawns) {
|
||||
Vector2 rot = getRotatedCoords(new Vector2(b.getX() - structureInfo.getCenterX(), b.getZ() - structureInfo.getCenterZ()), r);
|
||||
if(!b.getRequirement().matches(origin.getWorld(), (int) rot.getX() + origin.getBlockX(), origin.getBlockY() + b.getY(), (int) rot.getZ() + origin.getBlockZ()))
|
||||
if(!b.getRequirement().getInstance(origin.getWorld()).matches((int) rot.getX() + origin.getBlockX(), origin.getBlockY() + b.getY(), (int) rot.getZ() + origin.getBlockZ()))
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
|
@ -1,74 +1,37 @@
|
||||
package com.dfsek.terra.structure;
|
||||
|
||||
import com.dfsek.terra.TerraWorld;
|
||||
import com.dfsek.terra.biome.UserDefinedBiome;
|
||||
import com.dfsek.terra.config.base.ConfigPack;
|
||||
import com.dfsek.terra.config.genconfig.biome.BiomeConfig;
|
||||
import com.dfsek.terra.structure.spawn.AirSpawn;
|
||||
import com.dfsek.terra.structure.spawn.BlankSpawn;
|
||||
import com.dfsek.terra.structure.spawn.LandSpawn;
|
||||
import com.dfsek.terra.structure.spawn.OceanSpawn;
|
||||
import com.dfsek.terra.structure.spawn.Requirement;
|
||||
import org.bukkit.World;
|
||||
import org.polydev.gaea.generation.GenerationPhase;
|
||||
import org.polydev.gaea.math.FastNoiseLite;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
public enum StructureSpawnRequirement implements Serializable {
|
||||
AIR {
|
||||
@Override
|
||||
public boolean matches(World w, int x, int y, int z) {
|
||||
setNoise(w, x, y, z);
|
||||
TerraWorld tw = TerraWorld.getWorld(w);
|
||||
ConfigPack wc = tw.getConfig();
|
||||
UserDefinedBiome b = (UserDefinedBiome) tw.getGrid().getBiome(x, z, GenerationPhase.POPULATE);
|
||||
BiomeConfig c = wc.getBiome(b);
|
||||
if(y <= c.getOcean().getSeaLevel()) return false;
|
||||
return b.getGenerator().getNoise(getNoise(w), w, x, y, z) <= 0;
|
||||
public Requirement getInstance(World world) {
|
||||
return new AirSpawn(world);
|
||||
}
|
||||
}, OCEAN {
|
||||
@Override
|
||||
public boolean matches(World w, int x, int y, int z) {
|
||||
setNoise(w, x, y, z);
|
||||
UserDefinedBiome b = (UserDefinedBiome) TerraWorld.getWorld(w).getGrid().getBiome(x, z, GenerationPhase.POPULATE);
|
||||
BiomeConfig c = TerraWorld.getWorld(w).getConfig().getBiome(b);
|
||||
if(y > c.getOcean().getSeaLevel()) return false;
|
||||
return b.getGenerator().getNoise(getNoise(w), w, x, y, z) <= 0;
|
||||
public Requirement getInstance(World world) {
|
||||
return new OceanSpawn(world);
|
||||
}
|
||||
}, LAND {
|
||||
@Override
|
||||
public boolean matches(World w, int x, int y, int z) {
|
||||
setNoise(w, x, y, z);
|
||||
UserDefinedBiome b = (UserDefinedBiome) TerraWorld.getWorld(w).getGrid().getBiome(x, z, GenerationPhase.POPULATE);
|
||||
return b.getGenerator().getNoise(getNoise(w), w, x, y, z) > 0;
|
||||
public Requirement getInstance(World world) {
|
||||
return new LandSpawn(world);
|
||||
}
|
||||
}, BLANK {
|
||||
@Override
|
||||
public boolean matches(World w, int x, int y, int z) {
|
||||
return true;
|
||||
public Requirement getInstance(World world) {
|
||||
return new BlankSpawn();
|
||||
}
|
||||
};
|
||||
private static final long serialVersionUID = -175639605885943679L;
|
||||
private static final transient Map<World, FastNoiseLite> noiseMap = new HashMap<>();
|
||||
|
||||
private static void setNoise(World w, int x, int y, int z) {
|
||||
TerraWorld tw = TerraWorld.getWorld(w);
|
||||
ConfigPack wc = tw.getConfig();
|
||||
if(getNoise(w) == null) {
|
||||
FastNoiseLite gen = new FastNoiseLite((int) w.getSeed());
|
||||
gen.setNoiseType(FastNoiseLite.NoiseType.OpenSimplex2);
|
||||
gen.setFractalType(FastNoiseLite.FractalType.FBm);
|
||||
gen.setFractalOctaves(wc.octaves);
|
||||
gen.setFrequency(wc.frequency);
|
||||
putNoise(w, gen);
|
||||
}
|
||||
}
|
||||
|
||||
public static void putNoise(World w, FastNoiseLite noise) {
|
||||
noiseMap.putIfAbsent(w, noise);
|
||||
}
|
||||
|
||||
private static FastNoiseLite getNoise(World w) {
|
||||
return noiseMap.get(w);
|
||||
}
|
||||
|
||||
public abstract boolean matches(World w, int x, int y, int z);
|
||||
public abstract Requirement getInstance(World world);
|
||||
}
|
||||
|
24
src/main/java/com/dfsek/terra/structure/spawn/AirSpawn.java
Normal file
24
src/main/java/com/dfsek/terra/structure/spawn/AirSpawn.java
Normal file
@ -0,0 +1,24 @@
|
||||
package com.dfsek.terra.structure.spawn;
|
||||
|
||||
import com.dfsek.terra.TerraWorld;
|
||||
import com.dfsek.terra.biome.UserDefinedBiome;
|
||||
import com.dfsek.terra.config.base.ConfigPack;
|
||||
import com.dfsek.terra.config.genconfig.biome.BiomeConfig;
|
||||
import org.bukkit.World;
|
||||
import org.polydev.gaea.generation.GenerationPhase;
|
||||
|
||||
public class AirSpawn extends Requirement {
|
||||
public AirSpawn(World world) {
|
||||
super(world);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean matches(int x, int y, int z) {
|
||||
TerraWorld tw = TerraWorld.getWorld(getWorld());
|
||||
ConfigPack wc = tw.getConfig();
|
||||
UserDefinedBiome b = (UserDefinedBiome) tw.getGrid().getBiome(x, z, GenerationPhase.POPULATE);
|
||||
BiomeConfig c = wc.getBiome(b);
|
||||
if(y <= c.getOcean().getSeaLevel()) return false;
|
||||
return b.getGenerator().getNoise(getNoise(), getWorld(), x, y, z) <= 0;
|
||||
}
|
||||
}
|
@ -0,0 +1,12 @@
|
||||
package com.dfsek.terra.structure.spawn;
|
||||
|
||||
public class BlankSpawn extends Requirement {
|
||||
public BlankSpawn() {
|
||||
super(null);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean matches(int x, int y, int z) {
|
||||
return true;
|
||||
}
|
||||
}
|
19
src/main/java/com/dfsek/terra/structure/spawn/LandSpawn.java
Normal file
19
src/main/java/com/dfsek/terra/structure/spawn/LandSpawn.java
Normal file
@ -0,0 +1,19 @@
|
||||
package com.dfsek.terra.structure.spawn;
|
||||
|
||||
import com.dfsek.terra.TerraWorld;
|
||||
import com.dfsek.terra.biome.UserDefinedBiome;
|
||||
import org.bukkit.World;
|
||||
import org.polydev.gaea.generation.GenerationPhase;
|
||||
|
||||
public class LandSpawn extends Requirement {
|
||||
public LandSpawn(World world) {
|
||||
super(world);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean matches(int x, int y, int z) {
|
||||
TerraWorld tw = TerraWorld.getWorld(getWorld());
|
||||
UserDefinedBiome b = (UserDefinedBiome) tw.getGrid().getBiome(x, z, GenerationPhase.POPULATE);
|
||||
return b.getGenerator().getNoise(getNoise(), getWorld(), x, y, z) > 0;
|
||||
}
|
||||
}
|
@ -0,0 +1,22 @@
|
||||
package com.dfsek.terra.structure.spawn;
|
||||
|
||||
import com.dfsek.terra.TerraWorld;
|
||||
import com.dfsek.terra.biome.UserDefinedBiome;
|
||||
import com.dfsek.terra.config.genconfig.biome.BiomeConfig;
|
||||
import org.bukkit.World;
|
||||
import org.polydev.gaea.generation.GenerationPhase;
|
||||
|
||||
public class OceanSpawn extends Requirement {
|
||||
public OceanSpawn(World world) {
|
||||
super(world);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean matches(int x, int y, int z) {
|
||||
TerraWorld tw = TerraWorld.getWorld(getWorld());
|
||||
UserDefinedBiome b = (UserDefinedBiome) tw.getGrid().getBiome(x, z, GenerationPhase.POPULATE);
|
||||
BiomeConfig c = tw.getConfig().getBiome(b);
|
||||
if(y > c.getOcean().getSeaLevel()) return false;
|
||||
return b.getGenerator().getNoise(getNoise(), getWorld(), x, y, z) <= 0;
|
||||
}
|
||||
}
|
@ -0,0 +1,25 @@
|
||||
package com.dfsek.terra.structure.spawn;
|
||||
|
||||
import com.dfsek.terra.generation.TerraChunkGenerator;
|
||||
import org.bukkit.World;
|
||||
import org.polydev.gaea.math.FastNoiseLite;
|
||||
|
||||
import java.util.Objects;
|
||||
|
||||
public abstract class Requirement {
|
||||
private final World world;
|
||||
|
||||
public Requirement(World world) {
|
||||
this.world = world;
|
||||
}
|
||||
|
||||
public abstract boolean matches(int x, int y, int z);
|
||||
|
||||
protected FastNoiseLite getNoise() {
|
||||
return ((TerraChunkGenerator) Objects.requireNonNull(world.getGenerator())).getNoiseGenerator();
|
||||
}
|
||||
|
||||
public World getWorld() {
|
||||
return world;
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user