Implement image to map

This commit is contained in:
dfsek 2020-09-21 14:28:52 -07:00
parent 44f302b564
commit 653e7f65f1
15 changed files with 241 additions and 31 deletions

View File

@ -6,6 +6,11 @@
<option name="name" value="Central Repository" /> <option name="name" value="Central Repository" />
<option name="url" value="https://repo.maven.apache.org/maven2" /> <option name="url" value="https://repo.maven.apache.org/maven2" />
</remote-repository> </remote-repository>
<remote-repository>
<option name="id" value="aikar" />
<option name="name" value="aikar" />
<option name="url" value="https://repo.aikar.co/content/groups/aikar/" />
</remote-repository>
<remote-repository> <remote-repository>
<option name="id" value="spigotmc-repo" /> <option name="id" value="spigotmc-repo" />
<option name="name" value="spigotmc-repo" /> <option name="name" value="spigotmc-repo" />
@ -21,6 +26,11 @@
<option name="name" value="JBoss Community repository" /> <option name="name" value="JBoss Community repository" />
<option name="url" value="https://repository.jboss.org/nexus/content/repositories/public/" /> <option name="url" value="https://repository.jboss.org/nexus/content/repositories/public/" />
</remote-repository> </remote-repository>
<remote-repository>
<option name="id" value="minecraft-repo" />
<option name="name" value="minecraft-repo" />
<option name="url" value="https://libraries.minecraft.net/" />
</remote-repository>
<remote-repository> <remote-repository>
<option name="id" value="gaea.local" /> <option name="id" value="gaea.local" />
<option name="name" value="gaea" /> <option name="name" value="gaea" />

2
.idea/vcs.xml generated
View File

@ -2,5 +2,7 @@
<project version="4"> <project version="4">
<component name="VcsDirectoryMappings"> <component name="VcsDirectoryMappings">
<mapping directory="" vcs="Git" /> <mapping directory="" vcs="Git" />
<mapping directory="$PROJECT_DIR$/target/server" vcs="Git" />
<mapping directory="$PROJECT_DIR$/target/server/plugins/Terra" vcs="Git" />
</component> </component>
</project> </project>

25
pom.xml
View File

@ -27,11 +27,15 @@
<relocations> <relocations>
<relocation> <relocation>
<pattern>org.polydev.gaea</pattern> <pattern>org.polydev.gaea</pattern>
<shadedPattern>com.dfsek.terra.gaea</shadedPattern> <shadedPattern>com.dfsek.terra.lib.gaea</shadedPattern>
</relocation> </relocation>
<relocation> <relocation>
<pattern>org.apache.commons</pattern> <pattern>org.apache.commons</pattern>
<shadedPattern>com.dfsek.terra.commons</shadedPattern> <shadedPattern>com.dfsek.terra.lib.commons</shadedPattern>
</relocation>
<relocation>
<pattern>me.lucko.commodore</pattern>
<shadedPattern>com.dfsek.terra.lib</shadedPattern>
</relocation> </relocation>
</relocations> </relocations>
</configuration> </configuration>
@ -55,6 +59,10 @@
<id>spigotmc-repo</id> <id>spigotmc-repo</id>
<url>https://hub.spigotmc.org/nexus/content/repositories/snapshots/</url> <url>https://hub.spigotmc.org/nexus/content/repositories/snapshots/</url>
</repository> </repository>
<repository>
<id>minecraft-repo</id>
<url>https://libraries.minecraft.net/</url>
</repository>
<repository> <repository>
<id>gaea.local</id> <id>gaea.local</id>
<name>gaea</name> <name>gaea</name>
@ -83,7 +91,7 @@
<dependency> <dependency>
<groupId>org.polydev</groupId> <groupId>org.polydev</groupId>
<artifactId>gaea</artifactId> <artifactId>gaea</artifactId>
<version>1.9.0</version> <version>1.9.4</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>javax.vecmath</groupId> <groupId>javax.vecmath</groupId>
@ -92,11 +100,16 @@
<scope>test</scope> <scope>test</scope>
</dependency> </dependency>
<dependency> <dependency>
<groupId>javax.vecmath</groupId> <groupId>me.lucko</groupId>
<artifactId>vecmath</artifactId> <artifactId>commodore</artifactId>
<version>1.5.2</version> <version>1.9</version>
<scope>compile</scope> <scope>compile</scope>
</dependency> </dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-imaging</artifactId>
<version>1.0-alpha2</version>
</dependency>
</dependencies> </dependencies>
</project> </project>

View File

@ -1,12 +1,24 @@
package com.dfsek.terra; package com.dfsek.terra;
import com.dfsek.terra.config.ConfigUtil; import com.dfsek.terra.config.ConfigUtil;
import com.mojang.brigadier.arguments.BoolArgumentType;
import com.mojang.brigadier.arguments.StringArgumentType;
import com.mojang.brigadier.builder.LiteralArgumentBuilder;
import com.mojang.brigadier.builder.RequiredArgumentBuilder;
import com.mojang.brigadier.tree.LiteralCommandNode;
import me.lucko.commodore.Commodore;
import me.lucko.commodore.CommodoreProvider;
import me.lucko.commodore.file.CommodoreFileFormat;
import org.bukkit.command.Command;
import org.bukkit.command.PluginCommand;
import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.generator.ChunkGenerator; import org.bukkit.generator.ChunkGenerator;
import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.plugin.java.JavaPlugin;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import java.io.InputStream;
public class Terra extends JavaPlugin { public class Terra extends JavaPlugin {
private static FileConfiguration config; private static FileConfiguration config;
private static Terra instance; private static Terra instance;
@ -23,15 +35,32 @@ public class Terra extends JavaPlugin {
@Override @Override
public void onEnable() { public void onEnable() {
ConfigUtil.loadConfig(this); ConfigUtil.loadConfig(this);
getCommand("terra").setExecutor(new TerraCommand()); //getCommand("terra").setExecutor(new TerraCommand());
PluginCommand command = getCommand("terra");
command.setExecutor(new TerraCommand());
if (CommodoreProvider.isSupported()) {
Commodore commodore = CommodoreProvider.getCommodore(this);
try {
register(this, command, commodore);
} catch(Exception e) {
e.printStackTrace();
}
} else getLogger().severe("Brigadier is not properly supported! Commands will NOT work properly!");
saveDefaultConfig(); saveDefaultConfig();
config = getConfig(); config = getConfig();
instance = this; instance = this;
} }
@NotNull public static void register(JavaPlugin plugin, Command pluginCommand, Commodore commodore) throws Exception {
public static FileConfiguration getConfigFile() { try (InputStream is = Terra.class.getResourceAsStream("/terra.commodore")) {
return config; if (is == null) {
throw new Exception("Brigadier command data missing from jar");
}
LiteralCommandNode<?> commandNode = CommodoreFileFormat.parse(is);
commodore.register(pluginCommand, commandNode, player -> player.hasPermission("terra.command"));
}
} }
@Override @Override

View File

@ -9,24 +9,29 @@ import org.bukkit.block.Block;
import org.bukkit.command.Command; import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.command.TabCompleter;
import org.bukkit.command.TabExecutor;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.polydev.gaea.profiler.WorldProfiler; import org.polydev.gaea.profiler.WorldProfiler;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Random; import java.util.Random;
public class TerraCommand implements CommandExecutor { public class TerraCommand implements CommandExecutor, TabExecutor {
@Override @Override
public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) {
switch(args[0]) { switch(args[0]) {
case "reload": case "reload":
ConfigUtil.loadConfig(Terra.getInstance()); ConfigUtil.loadConfig(Terra.getInstance());
sender.sendMessage("Reloaded Terra config."); sender.sendMessage("Reloaded Terra config.");
break; return true;
case "biome": case "biome":
if(!(sender instanceof Player)) return false; if(!(sender instanceof Player)) return false;
sender.sendMessage("You are in " + BiomeConfig.fromBiome((UserDefinedBiome) TerraBiomeGrid.fromWorld(((Player) sender).getWorld()).getBiome(((Player) sender).getLocation())).getFriendlyName()); sender.sendMessage("You are in " + BiomeConfig.fromBiome((UserDefinedBiome) TerraBiomeGrid.fromWorld(((Player) sender).getWorld()).getBiome(((Player) sender).getLocation())).getFriendlyName());
break; return true;
case "profile": case "profile":
if(! (sender instanceof Player)) { if(! (sender instanceof Player)) {
sender.sendMessage("Command is for players only."); sender.sendMessage("Command is for players only.");
@ -53,16 +58,6 @@ public class TerraCommand implements CommandExecutor {
} }
} else sender.sendMessage("World is not a Terra world!"); } else sender.sendMessage("World is not a Terra world!");
break; break;
case "get_data":
if(! (sender instanceof Player)) {
sender.sendMessage("Command is for players only.");
return true;
}
Block b = ((Player) sender).getTargetBlockExact(25);
sender.sendMessage(b.getBlockData().getAsString());
//NMSStructure villageBase = new NMSStructure(((Player) sender).getLocation(), NMSStructure.getAsTag(Class.forName("net.minecraft.server.v1_16_R2.AbstractDragonController").getResourceAsStream("/data/minecraft/structures/village/plains/town_centers/plains_fountain_01.nbt")));
//villageBase.paste();
break;
case "ore": case "ore":
if(! (sender instanceof Player)) { if(! (sender instanceof Player)) {
sender.sendMessage("Command is for players only."); sender.sendMessage("Command is for players only.");
@ -75,7 +70,16 @@ public class TerraCommand implements CommandExecutor {
return true; return true;
} }
ore.doVein(bl.getLocation(), new Random()); ore.doVein(bl.getLocation(), new Random());
}
return true; return true;
}
return false;
}
@Override
public List<String> onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) {
//System.out.println("Label " + label + " args: " + Arrays.toString(args));
if(args[0].equals("tpbiome")) return BiomeConfig.getBiomeIDs();
else if(args[0].equals("ore")) return OreConfig.getOreIDs();
else return Collections.emptyList();
} }
} }

View File

@ -1,36 +1,48 @@
package com.dfsek.terra.biome; package com.dfsek.terra.biome;
import com.dfsek.terra.config.WorldConfig; import com.dfsek.terra.config.WorldConfig;
import com.dfsek.terra.image.ImageLoader;
import org.bukkit.World; import org.bukkit.World;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.polydev.gaea.biome.BiomeGrid; import org.polydev.gaea.biome.BiomeGrid;
import org.polydev.gaea.biome.NormalizationUtil; import org.polydev.gaea.biome.NormalizationUtil;
import org.polydev.gaea.math.FastNoise; import org.polydev.gaea.math.FastNoise;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.Objects;
public class BiomeZone { public class BiomeZone {
private BiomeGrid[] grids; private BiomeGrid[] grids;
private final World w; private final World w;
private final FastNoise noise; private final FastNoise noise;
private static final Map<World, BiomeZone> zones = new HashMap<>(); private static final Map<World, BiomeZone> zones = new HashMap<>();
@Nullable
private final ImageLoader imageLoader;
private final boolean useImage;
private final ImageLoader.Channel channel;
private BiomeZone(World w, float freq) { private BiomeZone(World w, float freq) {
this.w = w; this.w = w;
this.noise = new FastNoise((int) w.getSeed()+2); this.noise = new FastNoise((int) w.getSeed()+2);
this.noise.setNoiseType(FastNoise.NoiseType.SimplexFractal); this.noise.setNoiseType(FastNoise.NoiseType.SimplexFractal);
this.noise.setFractalOctaves(4); this.noise.setFractalOctaves(4);
this.noise.setFrequency(WorldConfig.fromWorld(w).zoneFreq); this.noise.setFrequency(WorldConfig.fromWorld(w).zoneFreq);
setZones(WorldConfig.fromWorld(w).definedGrids); WorldConfig c = WorldConfig.fromWorld(w);
setZones(c.definedGrids);
imageLoader = c.imageLoader;
useImage = c.fromImage;
channel = c.zoneChannel;
zones.put(w, this); zones.put(w, this);
} }
public void setZones(BiomeGrid[] grids) { public void setZones(@NotNull BiomeGrid[] grids) {
if(grids.length != 32) throw new IllegalArgumentException("Illegal number of grids!"); if(grids.length != 32) throw new IllegalArgumentException("Illegal number of grids!");
this.grids = grids; this.grids = grids;
} }
protected BiomeGrid getGrid(int x, int z) { protected BiomeGrid getGrid(int x, int z) {
return grids[NormalizationUtil.normalize(noise.getNoise(x, z), 32)]; return grids[NormalizationUtil.normalize(useImage ? Objects.requireNonNull(imageLoader).getNoiseVal(x, z, channel) : noise.getNoise(x, z), 32)];
} }
protected static BiomeZone fromWorld(World w) { protected static BiomeZone fromWorld(World w) {

View File

@ -1,8 +1,11 @@
package com.dfsek.terra.biome; package com.dfsek.terra.biome;
import com.dfsek.terra.Terra; import com.dfsek.terra.Terra;
import com.dfsek.terra.config.WorldConfig;
import com.dfsek.terra.image.ImageLoader;
import com.dfsek.terra.math.NoiseFunction2; import com.dfsek.terra.math.NoiseFunction2;
import com.dfsek.terra.math.NoiseFunction3; import com.dfsek.terra.math.NoiseFunction3;
import org.bukkit.World;
import org.polydev.gaea.biome.BiomeTerrain; import org.polydev.gaea.biome.BiomeTerrain;
import org.polydev.gaea.math.FastNoise; import org.polydev.gaea.math.FastNoise;
import org.polydev.gaea.math.parsii.eval.Expression; import org.polydev.gaea.math.parsii.eval.Expression;
@ -45,7 +48,7 @@ public class UserDefinedGenerator extends BiomeTerrain {
* @return double - Noise value at the specified coordinates. * @return double - Noise value at the specified coordinates.
*/ */
@Override @Override
public double getNoise(FastNoise gen, int x, int z) { public double getNoise(FastNoise gen, World w, int x, int z) {
synchronized(noiseLock) { synchronized(noiseLock) {
xVar.setValue(x); xVar.setValue(x);
yVar.setValue(0); yVar.setValue(0);
@ -66,7 +69,7 @@ public class UserDefinedGenerator extends BiomeTerrain {
* @return double - Noise value at the specified coordinates. * @return double - Noise value at the specified coordinates.
*/ */
@Override @Override
public double getNoise(FastNoise gen, int x, int y, int z) { public double getNoise(FastNoise gen, World w, int x, int y, int z) {
synchronized(noiseLock) { synchronized(noiseLock) {
xVar.setValue(x); xVar.setValue(x);
yVar.setValue(y); yVar.setValue(y);

View File

@ -1,18 +1,51 @@
package com.dfsek.terra.biome; package com.dfsek.terra.biome;
import com.dfsek.terra.config.WorldConfig;
import com.dfsek.terra.config.genconfig.BiomeGridConfig; import com.dfsek.terra.config.genconfig.BiomeGridConfig;
import com.dfsek.terra.image.ImageLoader;
import org.bukkit.Location;
import org.bukkit.World; import org.bukkit.World;
import org.polydev.gaea.biome.Biome;
import org.polydev.gaea.biome.BiomeGrid; import org.polydev.gaea.biome.BiomeGrid;
public class UserDefinedGrid extends BiomeGrid { public class UserDefinedGrid extends BiomeGrid {
private final ImageLoader imageLoader;
private final boolean fromImage;
private final ImageLoader.Channel channelX;
private final ImageLoader.Channel channelZ;
public UserDefinedGrid(World w, float freq1, float freq2, BiomeGridConfig config) { public UserDefinedGrid(World w, float freq1, float freq2, BiomeGridConfig config) {
super(w, freq1, freq2, config.getBiomeGrid().length, config.getBiomeGrid()[0].length); super(w, freq1, freq2, config.getBiomeGrid().length, config.getBiomeGrid()[0].length);
super.setNormalType(NormalType.LOOKUP4096); super.setNormalType(NormalType.LOOKUP4096);
super.setGrid(config.getBiomeGrid()); super.setGrid(config.getBiomeGrid());
WorldConfig c = WorldConfig.fromWorld(w);
imageLoader = c.imageLoader;
fromImage = c.fromImage;
channelX = c.biomeXChannel;
channelZ = c.biomeZChannel;
} }
public UserDefinedGrid(World w, float freq1, float freq2, UserDefinedBiome[][] b) { public UserDefinedGrid(World w, float freq1, float freq2, UserDefinedBiome[][] b) {
super(w, freq1, freq2, b.length, b[0].length); super(w, freq1, freq2, b.length, b[0].length);
super.setNormalType(NormalType.LOOKUP4096); super.setNormalType(NormalType.LOOKUP4096);
super.setGrid(b); super.setGrid(b);
WorldConfig c = WorldConfig.fromWorld(w);
imageLoader = c.imageLoader;
fromImage = c.fromImage;
channelX = c.biomeXChannel;
channelZ = c.biomeZChannel;
}
@Override
public Biome getBiome(int x, int z) {
if(fromImage) {
int xi = imageLoader.getChannel(x, z, channelX);
int zi = imageLoader.getChannel(x, z, channelZ);
return super.getGrid()[getSizeX() * (xi/256)][getSizeZ() * (zi/256)];
}
return super.getBiome(x, z);
}
@Override
public Biome getBiome(Location l) {
return this.getBiome(l.getBlockX(), l.getBlockZ());
} }
} }

View File

@ -5,6 +5,7 @@ import com.dfsek.terra.biome.UserDefinedBiome;
import com.dfsek.terra.biome.UserDefinedGrid; import com.dfsek.terra.biome.UserDefinedGrid;
import com.dfsek.terra.config.genconfig.BiomeConfig; import com.dfsek.terra.config.genconfig.BiomeConfig;
import com.dfsek.terra.config.genconfig.BiomeGridConfig; import com.dfsek.terra.config.genconfig.BiomeGridConfig;
import com.dfsek.terra.image.ImageLoader;
import org.bukkit.World; import org.bukkit.World;
import org.bukkit.configuration.InvalidConfigurationException; import org.bukkit.configuration.InvalidConfigurationException;
import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.configuration.file.FileConfiguration;
@ -26,7 +27,13 @@ public class WorldConfig {
public float freq1; public float freq1;
public float freq2; public float freq2;
public int seaLevel; public int seaLevel;
public boolean fromImage;
public UserDefinedGrid[] definedGrids = new UserDefinedGrid[32]; public UserDefinedGrid[] definedGrids = new UserDefinedGrid[32];
public ImageLoader.Channel biomeXChannel;
public ImageLoader.Channel biomeZChannel;
public ImageLoader.Channel zoneChannel;
public ImageLoader.Channel terrainChannel;
public ImageLoader imageLoader;
public WorldConfig(World w, JavaPlugin main) { public WorldConfig(World w, JavaPlugin main) {
@ -67,6 +74,16 @@ public class WorldConfig {
zoneFreq = 1f/config.getInt("frequencies.zone", 1536); zoneFreq = 1f/config.getInt("frequencies.zone", 1536);
freq1 = 1f/config.getInt("frequencies.grid-1", 256); freq1 = 1f/config.getInt("frequencies.grid-1", 256);
freq2 = 1f/config.getInt("frequencies.grid-2", 512); freq2 = 1f/config.getInt("frequencies.grid-2", 512);
fromImage = config.getBoolean("image.use-image", false);
biomeXChannel = ImageLoader.Channel.valueOf(Objects.requireNonNull(config.getString("image.channels.biome-x", "red")).toUpperCase());
biomeZChannel = ImageLoader.Channel.valueOf(Objects.requireNonNull(config.getString("image.channels.biome-z", "green")).toUpperCase());
zoneChannel = ImageLoader.Channel.valueOf(Objects.requireNonNull(config.getString("image.channels.zone", "blue")).toUpperCase());
try {
imageLoader = new ImageLoader(new File(Objects.requireNonNull(config.getString("image.image-location"))));
} catch(IOException | NullPointerException e) {
e.printStackTrace();
fromImage = false;
}
configs.put(w, this); // WorldConfig must be included in map before Grids are loaded. configs.put(w, this); // WorldConfig must be included in map before Grids are loaded.

View File

@ -24,8 +24,11 @@ import org.polydev.gaea.world.palette.RandomPalette;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections; import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Objects; import java.util.Objects;
import java.util.Random; import java.util.Random;
@ -194,6 +197,10 @@ public class BiomeConfig extends TerraConfigObject {
throw new IllegalArgumentException("No BiomeConfig for provided biome."); throw new IllegalArgumentException("No BiomeConfig for provided biome.");
} }
public static List<String> getBiomeIDs() {
return new ArrayList<>(biomes.keySet());
}
public static BiomeConfig fromID(String id) { public static BiomeConfig fromID(String id) {
return biomes.get(id); return biomes.get(id);
} }

View File

@ -28,6 +28,7 @@ public class CarverConfig extends TerraConfigObject {
private String id; private String id;
private Set<Material> replaceableInner; private Set<Material> replaceableInner;
private Set<Material> replaceableOuter; private Set<Material> replaceableOuter;
private Set<Material> update;
private Map<Material, Set<Material>> shift; private Map<Material, Set<Material>> shift;
private Map<Integer, ProbabilityCollection<BlockData>> inner; private Map<Integer, ProbabilityCollection<BlockData>> inner;
private Map<Integer, ProbabilityCollection<BlockData>> outer; private Map<Integer, ProbabilityCollection<BlockData>> outer;
@ -71,6 +72,16 @@ public class CarverConfig extends TerraConfigObject {
throw new InvalidConfigurationException("Could not load data for " + s); throw new InvalidConfigurationException("Could not load data for " + s);
} }
} }
update = new HashSet<>();
for(String s : getStringList("update")) {
try {
if(update.contains(Bukkit.createBlockData(s).getMaterial())) Bukkit.getLogger().warning("Duplicate material in update list: " + s);
update.add(Bukkit.createBlockData(s).getMaterial());
} catch(NullPointerException | IllegalArgumentException e) {
throw new InvalidConfigurationException("Could not load data for " + s);
}
}
shift = new HashMap<>(); shift = new HashMap<>();
for(Map.Entry<String, Object> e : getConfigurationSection("shift").getValues(false).entrySet()) { for(Map.Entry<String, Object> e : getConfigurationSection("shift").getValues(false).entrySet()) {
Set<Material> l = new HashSet<>(); Set<Material> l = new HashSet<>();
@ -120,6 +131,10 @@ public class CarverConfig extends TerraConfigObject {
return shift; return shift;
} }
public Set<Material> getUpdateBlocks() {
return update;
}
public boolean isReplaceableInner(Material m) { public boolean isReplaceableInner(Material m) {
if(replaceIsBlacklistInner) { if(replaceIsBlacklistInner) {
return !replaceableInner.contains(m); return !replaceableInner.contains(m);

View File

@ -14,6 +14,7 @@ import org.polydev.gaea.math.FastNoise;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@ -81,6 +82,10 @@ public class OreConfig extends TerraConfigObject {
} }
} }
public static List<String> getOreIDs() {
return new ArrayList<>(ores.keySet());
}
@Override @Override
public String toString() { public String toString() {
return "Ore with name " + getFriendlyName() + ", ID " + getID(); return "Ore with name " + getFriendlyName() + ", ID " + getID();

View File

@ -0,0 +1,45 @@
package com.dfsek.terra.image;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import javax.imageio.ImageIO;
public class ImageLoader {
private final BufferedImage image;
double inverseRoot2 = 0.7071067811865475;
public ImageLoader(File file) throws IOException {
image = ImageIO.read(file);
}
public int getChannel(int x, int y, Channel channel) {
int rgb;
try {
rgb = image.getRGB(Math.floorMod(x, image.getWidth()), Math.floorMod(y, image.getHeight()));
} catch(ArrayIndexOutOfBoundsException e) {
e.printStackTrace();
throw new IllegalArgumentException("Index " + x + "/" + x + "out of bounds for size " + image.getWidth() + "/" + image.getHeight());
}
switch(channel) {
case RED: return rgb >> 16 & 0xff;
case GREEN: return rgb >> 8 & 0xff;
case BLUE: return rgb & 0xff;
case ALPHA: return rgb >> 32 & 0xff;
default: throw new IllegalArgumentException();
}
}
public double getNoiseVal(int x, int y, Channel channel) {
return ((double) (getChannel(x, y, channel) - 128)/128)*inverseRoot2;
}
public enum Channel {
RED, GREEN, BLUE, ALPHA
}
}

View File

@ -32,7 +32,6 @@ public class CavePopulator extends BlockPopulator {
Vector v = e.getKey(); Vector v = e.getKey();
Block b = chunk.getBlock(v.getBlockX(), v.getBlockY(), v.getBlockZ()); Block b = chunk.getBlock(v.getBlockX(), v.getBlockY(), v.getBlockZ());
Material m = b.getType(); Material m = b.getType();
boolean liquid = b.getType().equals(Material.WATER) || b.getType().equals(Material.LAVA);
if(e.getValue().equals(CarvingData.CarvingType.CENTER) && c.isReplaceableInner(m)) { if(e.getValue().equals(CarvingData.CarvingType.CENTER) && c.isReplaceableInner(m)) {
if(c.getShiftedBlocks().containsKey(b.getType())) shiftCandidate.put(b.getLocation(), b.getType()); if(c.getShiftedBlocks().containsKey(b.getType())) shiftCandidate.put(b.getLocation(), b.getType());
b.setBlockData(c.getPaletteInner(v.getBlockY()).get(random), false); b.setBlockData(c.getPaletteInner(v.getBlockY()).get(random), false);
@ -40,7 +39,7 @@ public class CavePopulator extends BlockPopulator {
if(c.getShiftedBlocks().containsKey(b.getType())) shiftCandidate.put(b.getLocation(), b.getType()); if(c.getShiftedBlocks().containsKey(b.getType())) shiftCandidate.put(b.getLocation(), b.getType());
b.setBlockData(c.getPaletteOuter(v.getBlockY()).get(random), false); b.setBlockData(c.getPaletteOuter(v.getBlockY()).get(random), false);
} }
if(liquid) { if(c.getUpdateBlocks().contains(m)) {
updateNeeded.add(b); updateNeeded.add(b);
} }
} }

View File

@ -0,0 +1,16 @@
terra {
biome;
reload;
profile {
start;
stop;
reset;
query;
}
tpbiome {
biome brigadier:string single_word;
}
ore {
ore brigadier:string single_word;
}
}