From 41933b84a0a96ae016d570adb041d5f42e2e0ef2 Mon Sep 17 00:00:00 2001 From: dfsek Date: Wed, 10 Mar 2021 02:46:00 -0700 Subject: [PATCH] implement entity teleportation and biome locate --- .../dfsek/terra/api/math/vector/Location.java | 5 ++ .../terra/api/platform/entity/Entity.java | 2 + .../dfsek/terra/commands/BiomeCommand.java | 46 +++++++++++ .../com/dfsek/terra/commands/CommandUtil.java | 3 + .../dfsek/terra/commands/GetBlockCommand.java | 26 +++++++ .../dfsek/terra/commands/PacksCommand.java | 33 ++++++++ .../commands/biome/BiomeInfoCommand.java | 24 ++++++ .../commands/biome/BiomeLocateCommand.java | 78 +++++++++++++++++++ .../biome/arg/BiomeArgumentParser.java | 19 +++++ .../commands/biome/tab/BiomeTabCompleter.java | 22 ++++++ .../com/dfsek/terra/bukkit/BukkitEntity.java | 5 ++ .../com/dfsek/terra/bukkit/BukkitPlayer.java | 5 ++ .../command/command/GetBlockCommand.java | 44 ----------- .../bukkit/command/command/PacksCommand.java | 58 -------------- .../fabric/world/entity/FabricEntity.java | 8 ++ .../fabric/world/entity/FabricPlayer.java | 8 ++ 16 files changed, 284 insertions(+), 102 deletions(-) create mode 100644 common/src/main/java/com/dfsek/terra/commands/BiomeCommand.java create mode 100644 common/src/main/java/com/dfsek/terra/commands/GetBlockCommand.java create mode 100644 common/src/main/java/com/dfsek/terra/commands/PacksCommand.java create mode 100644 common/src/main/java/com/dfsek/terra/commands/biome/BiomeInfoCommand.java create mode 100644 common/src/main/java/com/dfsek/terra/commands/biome/BiomeLocateCommand.java create mode 100644 common/src/main/java/com/dfsek/terra/commands/biome/arg/BiomeArgumentParser.java create mode 100644 common/src/main/java/com/dfsek/terra/commands/biome/tab/BiomeTabCompleter.java delete mode 100644 platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/GetBlockCommand.java delete mode 100644 platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/PacksCommand.java diff --git a/common/src/main/java/com/dfsek/terra/api/math/vector/Location.java b/common/src/main/java/com/dfsek/terra/api/math/vector/Location.java index a030f9e49..de01cce98 100644 --- a/common/src/main/java/com/dfsek/terra/api/math/vector/Location.java +++ b/common/src/main/java/com/dfsek/terra/api/math/vector/Location.java @@ -170,4 +170,9 @@ public class Location implements Cloneable { public String toString() { return "[" + world + ": (" + getX() + ", " + getY() + ", " + getZ() + ")]"; } + + public Location multiply(double v) { + vector.multiply(v); + return this; + } } diff --git a/common/src/main/java/com/dfsek/terra/api/platform/entity/Entity.java b/common/src/main/java/com/dfsek/terra/api/platform/entity/Entity.java index 692ae6498..51c9be6e5 100644 --- a/common/src/main/java/com/dfsek/terra/api/platform/entity/Entity.java +++ b/common/src/main/java/com/dfsek/terra/api/platform/entity/Entity.java @@ -8,5 +8,7 @@ import com.dfsek.terra.api.platform.world.World; public interface Entity extends Handle, CommandSender { Location getLocation(); + void setLocation(Location location); + World getWorld(); } diff --git a/common/src/main/java/com/dfsek/terra/commands/BiomeCommand.java b/common/src/main/java/com/dfsek/terra/commands/BiomeCommand.java new file mode 100644 index 000000000..91c97f2d5 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/commands/BiomeCommand.java @@ -0,0 +1,46 @@ +package com.dfsek.terra.commands; + +import com.dfsek.terra.api.TerraPlugin; +import com.dfsek.terra.api.command.CommandTemplate; +import com.dfsek.terra.api.command.annotation.Command; +import com.dfsek.terra.api.command.annotation.Subcommand; +import com.dfsek.terra.api.command.annotation.type.PlayerCommand; +import com.dfsek.terra.api.command.annotation.type.WorldCommand; +import com.dfsek.terra.api.injection.annotations.Inject; +import com.dfsek.terra.api.platform.CommandSender; +import com.dfsek.terra.api.platform.entity.Player; +import com.dfsek.terra.api.world.biome.UserDefinedBiome; +import com.dfsek.terra.api.world.biome.provider.BiomeProvider; +import com.dfsek.terra.commands.biome.BiomeInfoCommand; +import com.dfsek.terra.commands.biome.BiomeLocateCommand; +import com.dfsek.terra.config.lang.LangUtil; + +@Command( + subcommands = { + @Subcommand( + value = "info", + aliases = {"i"}, + clazz = BiomeInfoCommand.class + ), + @Subcommand( + value = "locate", + aliases = {"l"}, + clazz = BiomeLocateCommand.class + ) + } +) +@WorldCommand +@PlayerCommand +public class BiomeCommand implements CommandTemplate { + @Inject + private TerraPlugin main; + + @Override + public void execute(CommandSender sender) { + Player player = (Player) sender; + + BiomeProvider provider = main.getWorld(player.getWorld()).getBiomeProvider(); + UserDefinedBiome biome = (UserDefinedBiome) provider.getBiome(player.getLocation()); + LangUtil.send("command.biome.in", sender, biome.getID()); + } +} diff --git a/common/src/main/java/com/dfsek/terra/commands/CommandUtil.java b/common/src/main/java/com/dfsek/terra/commands/CommandUtil.java index ae5bdd1aa..75ea0fa03 100644 --- a/common/src/main/java/com/dfsek/terra/commands/CommandUtil.java +++ b/common/src/main/java/com/dfsek/terra/commands/CommandUtil.java @@ -11,5 +11,8 @@ public final class CommandUtil { manager.register("reload", ReloadCommand.class); manager.register("addons", AddonsCommand.class); manager.register("version", VersionCommand.class); + manager.register("getblock", GetBlockCommand.class); + manager.register("packs", PacksCommand.class); + manager.register("biome", BiomeCommand.class); } } diff --git a/common/src/main/java/com/dfsek/terra/commands/GetBlockCommand.java b/common/src/main/java/com/dfsek/terra/commands/GetBlockCommand.java new file mode 100644 index 000000000..982ba3262 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/commands/GetBlockCommand.java @@ -0,0 +1,26 @@ +package com.dfsek.terra.commands; + +import com.dfsek.terra.api.TerraPlugin; +import com.dfsek.terra.api.command.CommandTemplate; +import com.dfsek.terra.api.command.annotation.Command; +import com.dfsek.terra.api.command.annotation.type.DebugCommand; +import com.dfsek.terra.api.command.annotation.type.PlayerCommand; +import com.dfsek.terra.api.command.annotation.type.WorldCommand; +import com.dfsek.terra.api.injection.annotations.Inject; +import com.dfsek.terra.api.platform.CommandSender; +import com.dfsek.terra.api.platform.entity.Player; + +@WorldCommand +@DebugCommand +@PlayerCommand +@Command +public class GetBlockCommand implements CommandTemplate { + @Inject + private TerraPlugin main; + + @Override + public void execute(CommandSender sender) { + Player player = (Player) sender; + sender.sendMessage("Block: " + main.getWorld(player.getWorld()).getUngeneratedBlock(player.getLocation()).getAsString()); + } +} diff --git a/common/src/main/java/com/dfsek/terra/commands/PacksCommand.java b/common/src/main/java/com/dfsek/terra/commands/PacksCommand.java new file mode 100644 index 000000000..4a92fa8fa --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/commands/PacksCommand.java @@ -0,0 +1,33 @@ +package com.dfsek.terra.commands; + +import com.dfsek.terra.api.TerraPlugin; +import com.dfsek.terra.api.command.CommandTemplate; +import com.dfsek.terra.api.command.annotation.Command; +import com.dfsek.terra.api.injection.annotations.Inject; +import com.dfsek.terra.api.platform.CommandSender; +import com.dfsek.terra.api.registry.CheckedRegistry; +import com.dfsek.terra.config.lang.LangUtil; +import com.dfsek.terra.config.pack.ConfigPack; +import com.dfsek.terra.config.pack.ConfigPackTemplate; + +@Command +public class PacksCommand implements CommandTemplate { + @Inject + private TerraPlugin main; + + @Override + public void execute(CommandSender sender) { + CheckedRegistry registry = main.getConfigRegistry(); + + if(registry.entries().size() == 0) { + LangUtil.send("command.packs.none", sender); + return; + } + + LangUtil.send("command.packs.main", sender); + registry.entries().forEach(entry -> { + ConfigPackTemplate template = entry.getTemplate(); + LangUtil.send("command.packs.pack", sender, template.getID(), template.getAuthor(), template.getVersion()); + }); + } +} diff --git a/common/src/main/java/com/dfsek/terra/commands/biome/BiomeInfoCommand.java b/common/src/main/java/com/dfsek/terra/commands/biome/BiomeInfoCommand.java new file mode 100644 index 000000000..e87033e63 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/commands/biome/BiomeInfoCommand.java @@ -0,0 +1,24 @@ +package com.dfsek.terra.commands.biome; + +import com.dfsek.terra.api.command.CommandTemplate; +import com.dfsek.terra.api.command.annotation.Argument; +import com.dfsek.terra.api.command.annotation.Command; +import com.dfsek.terra.api.platform.CommandSender; +import com.dfsek.terra.commands.biome.arg.BiomeArgumentParser; +import com.dfsek.terra.commands.biome.tab.BiomeTabCompleter; + +@Command( + arguments = { + @Argument( + value = "biome", + tabCompleter = BiomeTabCompleter.class, + argumentParser = BiomeArgumentParser.class + ) + } +) +public class BiomeInfoCommand implements CommandTemplate { + @Override + public void execute(CommandSender sender) { + + } +} diff --git a/common/src/main/java/com/dfsek/terra/commands/biome/BiomeLocateCommand.java b/common/src/main/java/com/dfsek/terra/commands/biome/BiomeLocateCommand.java new file mode 100644 index 000000000..09f20dde8 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/commands/biome/BiomeLocateCommand.java @@ -0,0 +1,78 @@ +package com.dfsek.terra.commands.biome; + +import com.dfsek.terra.api.TerraPlugin; +import com.dfsek.terra.api.command.CommandTemplate; +import com.dfsek.terra.api.command.annotation.Argument; +import com.dfsek.terra.api.command.annotation.Command; +import com.dfsek.terra.api.command.annotation.Switch; +import com.dfsek.terra.api.command.annotation.inject.ArgumentTarget; +import com.dfsek.terra.api.command.annotation.inject.SwitchTarget; +import com.dfsek.terra.api.command.annotation.type.PlayerCommand; +import com.dfsek.terra.api.command.annotation.type.WorldCommand; +import com.dfsek.terra.api.command.arg.IntegerArgumentParser; +import com.dfsek.terra.api.injection.annotations.Inject; +import com.dfsek.terra.api.math.vector.Location; +import com.dfsek.terra.api.math.vector.Vector3; +import com.dfsek.terra.api.platform.CommandSender; +import com.dfsek.terra.api.platform.entity.Player; +import com.dfsek.terra.api.world.biome.TerraBiome; +import com.dfsek.terra.api.world.locate.AsyncBiomeFinder; +import com.dfsek.terra.commands.biome.arg.BiomeArgumentParser; +import com.dfsek.terra.commands.biome.tab.BiomeTabCompleter; +import com.dfsek.terra.config.lang.LangUtil; + +import java.util.Locale; + +@PlayerCommand +@WorldCommand +@Command( + arguments = { + @Argument( + value = "biome", + tabCompleter = BiomeTabCompleter.class, + argumentParser = BiomeArgumentParser.class + ), + @Argument( + value = "radius", + required = false, + defaultValue = "1000", + argumentParser = IntegerArgumentParser.class + ) + }, + switches = { + @Switch( + value = "teleport", + aliases = {"t", "tp"} + ) + } +) +public class BiomeLocateCommand implements CommandTemplate { + + @ArgumentTarget("radius") + private Integer radius; + + @ArgumentTarget("biome") + private TerraBiome biome; + + @SwitchTarget("teleport") + private boolean teleport; + + @Inject + private TerraPlugin main; + + @Override + public void execute(CommandSender sender) { + + Player player = (Player) sender; + + new Thread(new AsyncBiomeFinder(main.getWorld(player.getWorld()).getBiomeProvider(), biome, player.getLocation().clone().multiply((1D / main.getTerraConfig().getBiomeSearchResolution())), 0, radius, location -> { + if(location != null) { + sender.sendMessage(String.format("The nearest %s is at [%d, ~, %d] (%.1f blocks away)", biome.getID().toLowerCase(Locale.ROOT), location.getBlockX(), location.getBlockZ(), location.add(new Vector3(0, player.getLocation().getY(), 0)).distance(player.getLocation().toVector()))); + if(teleport) { + player.setLocation(new Location(player.getWorld(), location.getX(), player.getLocation().getY(), location.getZ())); + } + } else LangUtil.send("command.biome.unable-to-locate", sender); + }, main), "Biome Location Thread").start(); + + } +} diff --git a/common/src/main/java/com/dfsek/terra/commands/biome/arg/BiomeArgumentParser.java b/common/src/main/java/com/dfsek/terra/commands/biome/arg/BiomeArgumentParser.java new file mode 100644 index 000000000..251036d39 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/commands/biome/arg/BiomeArgumentParser.java @@ -0,0 +1,19 @@ +package com.dfsek.terra.commands.biome.arg; + +import com.dfsek.terra.api.TerraPlugin; +import com.dfsek.terra.api.command.arg.ArgumentParser; +import com.dfsek.terra.api.injection.annotations.Inject; +import com.dfsek.terra.api.platform.CommandSender; +import com.dfsek.terra.api.platform.entity.Player; +import com.dfsek.terra.api.world.biome.TerraBiome; + +public class BiomeArgumentParser implements ArgumentParser { + @Inject + private TerraPlugin main; + + @Override + public TerraBiome parse(CommandSender sender, String arg) { + Player player = (Player) sender; + return main.getWorld(player.getWorld()).getConfig().getBiomeRegistry().get(arg); + } +} diff --git a/common/src/main/java/com/dfsek/terra/commands/biome/tab/BiomeTabCompleter.java b/common/src/main/java/com/dfsek/terra/commands/biome/tab/BiomeTabCompleter.java new file mode 100644 index 000000000..f2461c532 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/commands/biome/tab/BiomeTabCompleter.java @@ -0,0 +1,22 @@ +package com.dfsek.terra.commands.biome.tab; + +import com.dfsek.terra.api.TerraPlugin; +import com.dfsek.terra.api.command.tab.TabCompleter; +import com.dfsek.terra.api.injection.annotations.Inject; +import com.dfsek.terra.api.platform.CommandSender; +import com.dfsek.terra.api.platform.entity.Player; +import com.dfsek.terra.api.world.biome.TerraBiome; + +import java.util.List; +import java.util.stream.Collectors; + +public class BiomeTabCompleter implements TabCompleter { + @Inject + private TerraPlugin main; + + @Override + public List complete(CommandSender sender) { + Player player = (Player) sender; + return main.getWorld(player.getWorld()).getConfig().getBiomeRegistry().entries().stream().map(TerraBiome::getID).collect(Collectors.toList()); + } +} diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitEntity.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitEntity.java index bb20cda6f..ff3bd80ec 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitEntity.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitEntity.java @@ -22,6 +22,11 @@ public class BukkitEntity implements Entity { return BukkitAdapter.adapt(entity.getLocation()); } + @Override + public void setLocation(Location location) { + entity.teleport(BukkitAdapter.adapt(location)); + } + @Override public World getWorld() { return BukkitAdapter.adapt(entity.getWorld()); diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitPlayer.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitPlayer.java index fbf763e6b..822fa0d7c 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitPlayer.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitPlayer.java @@ -23,6 +23,11 @@ public class BukkitPlayer implements Player { return new Location(BukkitAdapter.adapt(bukkit.getWorld()), bukkit.getX(), bukkit.getY(), bukkit.getZ()); } + @Override + public void setLocation(Location location) { + delegate.teleport(BukkitAdapter.adapt(location)); + } + @Override public World getWorld() { return BukkitAdapter.adapt(delegate.getWorld()); diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/GetBlockCommand.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/GetBlockCommand.java deleted file mode 100644 index 2585430c6..000000000 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/GetBlockCommand.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.dfsek.terra.bukkit.command.command; - -import com.dfsek.terra.bukkit.command.WorldCommand; -import com.dfsek.terra.bukkit.world.BukkitAdapter; -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 GetBlockCommand extends WorldCommand { - public GetBlockCommand(com.dfsek.terra.bukkit.command.Command parent) { - super(parent); - } - - @Override - public boolean execute(@NotNull Player player, @NotNull Command command, @NotNull String s, @NotNull String[] strings, World world) { - player.sendMessage("Block: " + getMain().getWorld(BukkitAdapter.adapt(world)).getUngeneratedBlock(BukkitAdapter.adapt(player.getLocation())).getAsString()); - return true; - } - - @Override - public String getName() { - return "block"; - } - - @Override - public List getSubCommands() { - return Collections.emptyList(); - } - - @Override - public int arguments() { - return 0; - } - - @Override - public List getTabCompletions(@NotNull CommandSender commandSender, @NotNull String s, @NotNull String[] strings) { - return Collections.emptyList(); - } -} diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/PacksCommand.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/PacksCommand.java deleted file mode 100644 index 1bdd037a1..000000000 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/PacksCommand.java +++ /dev/null @@ -1,58 +0,0 @@ -package com.dfsek.terra.bukkit.command.command; - -import com.dfsek.terra.api.registry.CheckedRegistry; -import com.dfsek.terra.bukkit.BukkitCommandSender; -import com.dfsek.terra.bukkit.command.Command; -import com.dfsek.terra.config.lang.LangUtil; -import com.dfsek.terra.config.pack.ConfigPack; -import com.dfsek.terra.config.pack.ConfigPackTemplate; -import org.bukkit.command.CommandSender; -import org.jetbrains.annotations.NotNull; - -import java.util.Collections; -import java.util.List; - -public class PacksCommand extends Command { - public PacksCommand(Command parent) { - super(parent); - } - - @Override - public String getName() { - return "packs"; - } - - @Override - public List getSubCommands() { - return Collections.emptyList(); - } - - @Override - public boolean execute(@NotNull CommandSender commandSender, org.bukkit.command.@NotNull Command command, @NotNull String s, @NotNull String[] strings) { - - CheckedRegistry registry = getMain().getConfigRegistry(); - - if(registry.entries().size() == 0) { - LangUtil.send("command.packs.none", new BukkitCommandSender(commandSender)); - return true; - } - - LangUtil.send("command.packs.main", new BukkitCommandSender(commandSender)); - registry.entries().forEach(entry -> { - ConfigPackTemplate template = entry.getTemplate(); - LangUtil.send("command.packs.pack", new BukkitCommandSender(commandSender), template.getID(), template.getAuthor(), template.getVersion()); - }); - - return true; - } - - @Override - public int arguments() { - return 0; - } - - @Override - public List getTabCompletions(@NotNull CommandSender commandSender, @NotNull String s, @NotNull String[] strings) { - return Collections.emptyList(); - } -} diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/entity/FabricEntity.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/entity/FabricEntity.java index f19d6d820..65c26849d 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/entity/FabricEntity.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/entity/FabricEntity.java @@ -5,6 +5,8 @@ import com.dfsek.terra.api.platform.entity.Entity; import com.dfsek.terra.api.platform.world.World; import com.dfsek.terra.fabric.world.FabricAdapter; import com.dfsek.terra.fabric.world.handles.world.FabricWorldAccess; +import com.dfsek.terra.fabric.world.handles.world.FabricWorldHandle; +import net.minecraft.server.world.ServerWorld; public class FabricEntity implements Entity { private final net.minecraft.entity.Entity delegate; @@ -28,6 +30,12 @@ public class FabricEntity implements Entity { return new Location(new FabricWorldAccess(delegate.world), FabricAdapter.adapt(delegate.getBlockPos())); } + @Override + public void setLocation(Location location) { + delegate.teleport(location.getX(), location.getY(), location.getZ()); + delegate.moveToWorld((ServerWorld) ((FabricWorldHandle) location).getWorld()); + } + @Override public World getWorld() { return new FabricWorldAccess(delegate.world); diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/entity/FabricPlayer.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/entity/FabricPlayer.java index d57d9d642..25f3a4caa 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/entity/FabricPlayer.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/entity/FabricPlayer.java @@ -5,7 +5,9 @@ import com.dfsek.terra.api.platform.entity.Player; import com.dfsek.terra.api.platform.world.World; import com.dfsek.terra.fabric.world.FabricAdapter; import com.dfsek.terra.fabric.world.handles.world.FabricWorldAccess; +import com.dfsek.terra.fabric.world.handles.world.FabricWorldHandle; import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.server.world.ServerWorld; import net.minecraft.text.LiteralText; public class FabricPlayer implements Player { @@ -34,4 +36,10 @@ public class FabricPlayer implements Player { public World getWorld() { return new FabricWorldAccess(delegate.world); } + + @Override + public void setLocation(Location location) { + delegate.teleport(location.getX(), location.getY(), location.getZ()); + delegate.moveToWorld((ServerWorld) ((FabricWorldHandle) location).getWorld()); + } }