mirror of
https://github.com/PolyhedralDev/Terra.git
synced 2026-04-10 17:56:03 +00:00
Begin work on structure /locate, fix voxel geometry and add test commands, begin work on simplex caves
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
@@ -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) {
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user