Implement tpbiome command

This commit is contained in:
dfsek 2020-10-02 00:49:06 -07:00
parent 8b0c2030ee
commit d91f5b03d0
6 changed files with 134 additions and 45 deletions

View File

@ -1,4 +1,63 @@
package com.dfsek.terra.async; package com.dfsek.terra.async;
public class AsyncBiomeFinder { import com.dfsek.terra.Terra;
import com.dfsek.terra.biome.TerraBiomeGrid;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.entity.Player;
import org.polydev.gaea.biome.Biome;
import org.polydev.gaea.generation.GenerationPhase;
public class AsyncBiomeFinder implements Runnable {
private final TerraBiomeGrid grid;
private final int centerX;
private final int centerZ;
private final int startRadius;
private final int maxRadius;
private final Biome target;
private final Player p;
private final boolean tp;
public AsyncBiomeFinder(TerraBiomeGrid grid, Biome target, Player p, int startRadius, int maxRadius, boolean tp) {
this.grid = grid;
this.target = target;
this.p = p;
this.centerX = p.getLocation().getBlockX();
this.centerZ = p.getLocation().getBlockZ();
this.startRadius = startRadius;
this.maxRadius = maxRadius;
this.tp = tp;
}
@Override
public void run() {
int x = centerX;
int z = centerZ;
int run = 1;
boolean toggle = true;
main: for(int i = startRadius; i < maxRadius; i++) {
for(int j = 0; j < run; j++) {
if(toggle) x++;
else x--;
if(checkBiome(x, z).equals(target)) break main;
}
for(int j = 0; j < run; j++) {
if(toggle) z++;
else z--;
if(checkBiome(x, z).equals(target)) break main;
}
run++;
toggle = !toggle;
}
if(checkBiome(x, z).equals(target) && p.isOnline()) {
p.sendMessage("Located biome at (" + x + ", " + z + ").");
if(tp) {
int finalX = x;
int finalZ = z;
Bukkit.getScheduler().runTask(Terra.getInstance(), () -> p.teleport(new Location(p.getWorld(), finalX, p.getLocation().getY(), finalZ)));
}
} else if(p.isOnline()) p.sendMessage("Unable to locate biome.");
}
private Biome checkBiome(int x, int z) {
return grid.getBiome(x, z, GenerationPhase.POST_GEN);
}
} }

View File

@ -1,41 +0,0 @@
package com.dfsek.terra.command;
import com.dfsek.terra.TerraWorld;
import com.dfsek.terra.command.type.WorldCommand;
import com.dfsek.terra.generation.TerraChunkGenerator;
import org.bukkit.World;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
import java.util.Collections;
import java.util.List;
public class BiomeTeleportCommand extends WorldCommand {
@Override
public boolean execute(@NotNull Player sender, @NotNull Command command, @NotNull String label, @NotNull String[] args, World world) {
return false;
}
@Override
public String getName() {
return "tpbiome";
}
@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) {
if(!(sender instanceof Player) || !(((Player) sender).getWorld().getGenerator() instanceof TerraChunkGenerator)) return Collections.emptyList();
return TerraWorld.getWorld(((Player) sender).getWorld()).getConfig().getBiomeIDs();
}
}

View File

@ -1,5 +1,6 @@
package com.dfsek.terra.command; package com.dfsek.terra.command;
import com.dfsek.terra.command.biome.BiomeCommand;
import com.dfsek.terra.command.image.ImageCommand; import com.dfsek.terra.command.image.ImageCommand;
import com.dfsek.terra.command.profile.ProfileCommand; import com.dfsek.terra.command.profile.ProfileCommand;
import com.dfsek.terra.command.structure.StructureCommand; import com.dfsek.terra.command.structure.StructureCommand;

View File

@ -1,4 +1,4 @@
package com.dfsek.terra.command; package com.dfsek.terra.command.biome;
import com.dfsek.terra.TerraWorld; import com.dfsek.terra.TerraWorld;
import com.dfsek.terra.biome.TerraBiomeGrid; import com.dfsek.terra.biome.TerraBiomeGrid;
@ -11,6 +11,7 @@ import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.polydev.gaea.generation.GenerationPhase; import org.polydev.gaea.generation.GenerationPhase;
import java.util.Arrays;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
@ -30,7 +31,7 @@ public class BiomeCommand extends WorldCommand {
@Override @Override
public List<com.dfsek.terra.command.type.Command> getSubCommands() { public List<com.dfsek.terra.command.type.Command> getSubCommands() {
return Collections.emptyList(); return Arrays.asList(new BiomeLocateCommand(true), new BiomeLocateCommand(false));
} }
@Override @Override

View File

@ -0,0 +1,69 @@
package com.dfsek.terra.command.biome;
import com.dfsek.terra.Terra;
import com.dfsek.terra.TerraWorld;
import com.dfsek.terra.async.AsyncBiomeFinder;
import com.dfsek.terra.biome.UserDefinedBiome;
import com.dfsek.terra.command.type.WorldCommand;
import com.dfsek.terra.generation.TerraChunkGenerator;
import org.bukkit.Bukkit;
import org.bukkit.World;
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;
import java.util.stream.Collectors;
public class BiomeLocateCommand extends WorldCommand {
private final boolean tp;
public BiomeLocateCommand(boolean teleport) {
this.tp = teleport;
}
@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;
}
UserDefinedBiome b;
try {
b = TerraWorld.getWorld(world).getConfig().getBiome(id).getBiome();
} catch(IllegalArgumentException | NullPointerException e) {
sender.sendMessage("Invalid biome ID: " + id);
return true;
}
Bukkit.getScheduler().runTaskAsynchronously(Terra.getInstance(), new AsyncBiomeFinder(TerraWorld.getWorld(world).getGrid(), b, sender, 0, maxRadius, tp));
return false;
}
@Override
public String getName() {
return tp ? "teleport" : "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().getBiomeIDs();
if(args.length == 1) return ids.stream().filter(string -> string.toUpperCase().startsWith(args[0].toUpperCase())).collect(Collectors.toList());
return Collections.emptyList();
}
}

View File

@ -67,7 +67,7 @@ public abstract class Command implements CommandExecutor, TabCompleter {
if(c.getName().equals(args[0])) return c.onCommand(sender, command, label, Arrays.stream(args, 1, args.length).toArray(String[]::new)); if(c.getName().equals(args[0])) return c.onCommand(sender, command, label, Arrays.stream(args, 1, args.length).toArray(String[]::new));
} }
if(args.length != arguments()) { if(args.length != arguments()) {
sender.sendMessage("Invalid command."); sender.sendMessage("Invalid command. (Expected " + arguments() + " arguments, found " + args.length + ").");
return true; return true;
} }
return execute(sender, command, label, args); return execute(sender, command, label, args);