Begin work on structure /locate, fix voxel geometry and add test commands, begin work on simplex caves

This commit is contained in:
dfsek
2020-10-04 02:23:35 -07:00
parent 188cf612fb
commit c80e65cce9
18 changed files with 583 additions and 46 deletions

View File

@@ -1,6 +1,7 @@
package com.dfsek.terra.command;
import com.dfsek.terra.command.biome.BiomeCommand;
import com.dfsek.terra.command.geometry.GeometryCommand;
import com.dfsek.terra.command.image.ImageCommand;
import com.dfsek.terra.command.profile.ProfileCommand;
import com.dfsek.terra.command.structure.StructureCommand;
@@ -19,7 +20,8 @@ public class TerraCommand extends Command {
new ProfileCommand(),
new SaveDataCommand(),
new StructureCommand(),
new ImageCommand());
new ImageCommand(),
new GeometryCommand());
@Override
public String getName() {
@@ -33,21 +35,13 @@ public class TerraCommand extends Command {
@Override
public boolean execute(@NotNull CommandSender sender, org.bukkit.command.@NotNull Command command, @NotNull String label, @NotNull String[] args) {
if(args.length > 0) {
for(com.dfsek.terra.command.type.Command c : commands) {
if(c.getName().equals(args[0])) return c.execute(sender, command, label, Arrays.stream(args, 1, args.length).toArray(String[]::new));
}
sender.sendMessage("Invalid command.");
return true;
} else {
sender.sendMessage("--------------------Terra--------------------");
sender.sendMessage("reload - Reload configuration data");
sender.sendMessage("biome - Get current biome");
sender.sendMessage("ore - Generate an ore vein at the location you are facing (For debugging)");
sender.sendMessage("save-data - Save population data");
sender.sendMessage("structure - Load and export structures");
sender.sendMessage("profile - Profiler options");
}
sender.sendMessage("--------------------Terra--------------------");
sender.sendMessage("reload - Reload configuration data");
sender.sendMessage("biome - Get current biome");
sender.sendMessage("ore - Generate an ore vein at the location you are facing (For debugging)");
sender.sendMessage("save-data - Save population data");
sender.sendMessage("structure - Load and export structures");
sender.sendMessage("profile - Profiler options");
return true;
}

View File

@@ -0,0 +1,71 @@
package com.dfsek.terra.command.geometry;
import com.dfsek.terra.command.type.PlayerCommand;
import com.dfsek.terra.procgen.voxel.DeformedSphere;
import com.dfsek.terra.procgen.voxel.Sphere;
import org.bukkit.Material;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.util.Vector;
import org.jetbrains.annotations.NotNull;
import org.polydev.gaea.math.FastNoise;
import java.util.Collections;
import java.util.List;
public class DeformedSphereCommand extends PlayerCommand {
@Override
public boolean execute(@NotNull Player sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) {
int radius;
try {
radius = Integer.parseInt(args[0]);
} catch(NumberFormatException e) {
sender.sendMessage("Invalid radius: " + args[0]);
return true;
}
double deform;
try {
deform = Double.parseDouble(args[1]);
} catch(NumberFormatException e) {
sender.sendMessage("Invalid deform: " + args[1]);
return true;
}
float freq;
try {
freq = Float.parseFloat(args[2]);
} catch(NumberFormatException e) {
sender.sendMessage("Invalid frequency: " + args[2]);
return true;
}
FastNoise n = new FastNoise((int) sender.getWorld().getSeed());
n.setNoiseType(FastNoise.NoiseType.Simplex);
n.setFrequency(freq);
DeformedSphere sphere = new DeformedSphere(sender.getLocation().toVector(), radius, deform, n);
for(Vector v : sphere.getGeometry()) {
v.toLocation(sender.getWorld()).getBlock().setType(Material.STONE);
}
return true;
}
@Override
public String getName() {
return "deformedsphere";
}
@Override
public List<com.dfsek.terra.command.type.Command> getSubCommands() {
return Collections.emptyList();
}
@Override
public int arguments() {
return 3;
}
@Override
public List<String> getTabCompletions(@NotNull CommandSender sender, @NotNull String alias, @NotNull String[] args) {
return Collections.emptyList();
}
}

View File

@@ -0,0 +1,43 @@
package com.dfsek.terra.command.geometry;
import com.dfsek.terra.command.type.PlayerCommand;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
public class GeometryCommand extends PlayerCommand {
@Override
public boolean execute(@NotNull Player sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) {
sender.sendMessage("---------------Terra/geometry----------------");
sender.sendMessage("Various voxel geometry debugging commands");
sender.sendMessage("sphere - Generate a sphere");
sender.sendMessage("deformsphere - Generate a deformed sphere");
sender.sendMessage("tube - Generate a tube");
return true;
}
@Override
public String getName() {
return "geometry";
}
@Override
public List<com.dfsek.terra.command.type.Command> getSubCommands() {
return Arrays.asList(new SphereCommand(), new TubeCommand(), new DeformedSphereCommand());
}
@Override
public int arguments() {
return 0;
}
@Override
public List<String> getTabCompletions(@NotNull CommandSender sender, @NotNull String alias, @NotNull String[] args) {
return Collections.emptyList();
}
}

View File

@@ -0,0 +1,51 @@
package com.dfsek.terra.command.geometry;
import com.dfsek.terra.command.type.PlayerCommand;
import com.dfsek.terra.procgen.voxel.Sphere;
import org.bukkit.Material;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.util.Vector;
import org.jetbrains.annotations.NotNull;
import java.util.Collections;
import java.util.List;
public class SphereCommand extends PlayerCommand {
@Override
public boolean execute(@NotNull Player sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) {
int radius;
try {
radius = Integer.parseInt(args[0]);
} catch(NumberFormatException e) {
sender.sendMessage("Invalid radius: " + args[0]);
return true;
}
Sphere sphere = new Sphere(sender.getLocation().toVector(), radius);
for(Vector v : sphere.getGeometry()) {
v.toLocation(sender.getWorld()).getBlock().setType(Material.STONE);
}
return true;
}
@Override
public String getName() {
return "sphere";
}
@Override
public List<com.dfsek.terra.command.type.Command> getSubCommands() {
return Collections.emptyList();
}
@Override
public int arguments() {
return 1;
}
@Override
public List<String> getTabCompletions(@NotNull CommandSender sender, @NotNull String alias, @NotNull String[] args) {
return Collections.emptyList();
}
}

View File

@@ -0,0 +1,60 @@
package com.dfsek.terra.command.geometry;
import com.dfsek.terra.WorldEditUtil;
import com.dfsek.terra.command.type.PlayerCommand;
import com.dfsek.terra.procgen.voxel.Tube;
import com.sk89q.worldedit.IncompleteRegionException;
import com.sk89q.worldedit.bukkit.BukkitAdapter;
import com.sk89q.worldedit.bukkit.WorldEditPlugin;
import com.sk89q.worldedit.math.BlockVector3;
import com.sk89q.worldedit.regions.Region;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.util.Vector;
import org.jetbrains.annotations.NotNull;
import java.util.Collections;
import java.util.List;
public class TubeCommand extends PlayerCommand {
@Override
public boolean execute(@NotNull Player sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) {
Location[] l = WorldEditUtil.getSelectionPositions(sender);
if(l == null) return true;
int radius;
try {
radius = Integer.parseInt(args[0]);
} catch(NumberFormatException e) {
sender.sendMessage("Invalid radius: " + args[0]);
return true;
}
Tube tube = new Tube(l[0].toVector(), l[1].toVector(), radius);
for(Vector v : tube.getGeometry()) {
v.toLocation(sender.getWorld()).getBlock().setType(Material.STONE);
}
return true;
}
@Override
public String getName() {
return "tube";
}
@Override
public List<com.dfsek.terra.command.type.Command> getSubCommands() {
return Collections.emptyList();
}
@Override
public int arguments() {
return 1;
}
@Override
public List<String> getTabCompletions(@NotNull CommandSender sender, @NotNull String alias, @NotNull String[] args) {
return Collections.emptyList();
}
}

View File

@@ -24,28 +24,11 @@ import java.util.List;
public class ExportCommand extends PlayerCommand {
@Override
public boolean execute(@NotNull Player sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) {
WorldEditPlugin we = WorldEditUtil.getWorldEdit();
if(we == null) {
sender.sendMessage("WorldEdit is not installed! Please install WorldEdit before attempting to export structures.");
return true;
}
Region selection;
try {
selection = we.getSession(sender).getSelection(BukkitAdapter.adapt(sender.getWorld()));
} catch(IncompleteRegionException e) {
sender.sendMessage("Invalid/incomplete selection!");
return true;
}
BukkitAdapter.adapt(sender);
if(selection == null) {
sender.sendMessage("Please make a selection before attempting to export!");
return true;
}
BlockVector3 min = selection.getMinimumPoint();
BlockVector3 max = selection.getMaximumPoint();
Location l1 = new Location(sender.getWorld(), min.getBlockX(), min.getBlockY(), min.getBlockZ());
Location l2 = new Location(sender.getWorld(), max.getBlockX(), max.getBlockY(), max.getBlockZ());
GaeaStructure structure = null;
Location[] l = WorldEditUtil.getSelectionLocations(sender);
if(l == null) return true;
Location l1 = l[0];
Location l2 = l[1];
GaeaStructure structure;
try {
structure = new GaeaStructure(l1, l2, args[0]);
} catch(InitializationException e) {

View File

@@ -0,0 +1,74 @@
package com.dfsek.terra.command.structure;
import com.dfsek.terra.Terra;
import com.dfsek.terra.TerraWorld;
import com.dfsek.terra.async.AsyncStructureFinder;
import com.dfsek.terra.biome.UserDefinedBiome;
import com.dfsek.terra.command.type.WorldCommand;
import com.dfsek.terra.config.genconfig.StructureConfig;
import com.dfsek.terra.generation.TerraChunkGenerator;
import com.dfsek.terra.procgen.GridSpawn;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.World;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.util.Vector;
import org.jetbrains.annotations.NotNull;
import org.polydev.gaea.structures.UserDefinedStructure;
import java.util.Collections;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
public class LocateCommand extends WorldCommand {
private final boolean tp;
public LocateCommand(boolean tp) {
this.tp = tp;
}
@Override
public boolean execute(@NotNull Player sender, @NotNull Command command, @NotNull String label, @NotNull String[] args, World world) {
String id = args[0];
int maxRadius;
try {
maxRadius = Integer.parseInt(args[1]);
} catch(NumberFormatException e) {
sender.sendMessage("Invalid radius: " + args[1]);
return true;
}
StructureConfig s;
try {
s = Objects.requireNonNull(TerraWorld.getWorld(world).getConfig().getStructure(id));
} catch(IllegalArgumentException | NullPointerException e) {
sender.sendMessage("Invalid biome ID: " + id);
return true;
}
Bukkit.getScheduler().runTaskAsynchronously(Terra.getInstance(), new AsyncStructureFinder(TerraWorld.getWorld(world).getGrid(), s, sender, 0, maxRadius, tp));
return true;
}
@Override
public String getName() {
return tp ? "tp" : "locate";
}
@Override
public List<com.dfsek.terra.command.type.Command> getSubCommands() {
return Collections.emptyList();
}
@Override
public int arguments() {
return 2;
}
@Override
public List<String> getTabCompletions(@NotNull CommandSender sender, @NotNull String alias, @NotNull String[] args) {
if(!(sender instanceof Player) || !(((Player) sender).getWorld().getGenerator() instanceof TerraChunkGenerator)) return Collections.emptyList();
List<String> ids = TerraWorld.getWorld(((Player) sender).getWorld()).getConfig().getStructureIDs();
if(args.length == 1) return ids.stream().filter(string -> string.toUpperCase().startsWith(args[0].toUpperCase())).collect(Collectors.toList());
return Collections.emptyList();
}
}

View File

@@ -21,7 +21,7 @@ public class StructureCommand extends PlayerCommand {
@Override
public List<com.dfsek.terra.command.type.Command> getSubCommands() {
return Arrays.asList(new ExportCommand(), new LoadCommand());
return Arrays.asList(new ExportCommand(), new LoadCommand(), new LocateCommand(false), new LocateCommand(true));
}
@Override
@@ -31,7 +31,7 @@ public class StructureCommand extends PlayerCommand {
@Override
public int arguments() {
return 1;
return 0;
}
@Override