From bd9a837d955f4d28e19180cd842624b143d8eae6 Mon Sep 17 00:00:00 2001 From: Rime <81419447+Emirlol@users.noreply.github.com> Date: Thu, 11 Jul 2024 21:43:02 +0300 Subject: Move block pos argument stuff into a different folder --- .../skyblock/chocolatefactory/EggFinder.java | 2 +- .../skyblock/dungeon/secrets/DungeonManager.java | 4 +- .../skyblock/dwarven/CrystalsLocationsManager.java | 4 +- .../skyblock/waypoint/MythologicalRitual.java | 4 +- .../skyblock/waypoint/OrderedWaypoints.java | 4 +- .../argumenttypes/ClientBlockPosArgumentType.java | 73 ------------- .../command/argumenttypes/ClientPosArgument.java | 27 ----- .../argumenttypes/DefaultClientPosArgument.java | 113 --------------------- .../argumenttypes/LookingClientPosArgument.java | 106 ------------------- .../blockpos/ClientBlockPosArgumentType.java | 72 +++++++++++++ .../argumenttypes/blockpos/ClientPosArgument.java | 27 +++++ .../blockpos/DefaultClientPosArgument.java | 113 +++++++++++++++++++++ .../blockpos/LookingClientPosArgument.java | 106 +++++++++++++++++++ 13 files changed, 327 insertions(+), 328 deletions(-) delete mode 100644 src/main/java/de/hysky/skyblocker/utils/command/argumenttypes/ClientBlockPosArgumentType.java delete mode 100644 src/main/java/de/hysky/skyblocker/utils/command/argumenttypes/ClientPosArgument.java delete mode 100644 src/main/java/de/hysky/skyblocker/utils/command/argumenttypes/DefaultClientPosArgument.java delete mode 100644 src/main/java/de/hysky/skyblocker/utils/command/argumenttypes/LookingClientPosArgument.java create mode 100644 src/main/java/de/hysky/skyblocker/utils/command/argumenttypes/blockpos/ClientBlockPosArgumentType.java create mode 100644 src/main/java/de/hysky/skyblocker/utils/command/argumenttypes/blockpos/ClientPosArgument.java create mode 100644 src/main/java/de/hysky/skyblocker/utils/command/argumenttypes/blockpos/DefaultClientPosArgument.java create mode 100644 src/main/java/de/hysky/skyblocker/utils/command/argumenttypes/blockpos/LookingClientPosArgument.java (limited to 'src/main/java/de') diff --git a/src/main/java/de/hysky/skyblocker/skyblock/chocolatefactory/EggFinder.java b/src/main/java/de/hysky/skyblocker/skyblock/chocolatefactory/EggFinder.java index 0dd594af..2c1ee2eb 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/chocolatefactory/EggFinder.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/chocolatefactory/EggFinder.java @@ -5,7 +5,7 @@ import de.hysky.skyblocker.SkyblockerMod; import de.hysky.skyblocker.config.SkyblockerConfigManager; import de.hysky.skyblocker.events.SkyblockEvents; import de.hysky.skyblocker.utils.*; -import de.hysky.skyblocker.utils.command.argumenttypes.ClientBlockPosArgumentType; +import de.hysky.skyblocker.utils.command.argumenttypes.blockpos.ClientBlockPosArgumentType; import de.hysky.skyblocker.utils.command.argumenttypes.EggTypeArgumentType; import de.hysky.skyblocker.utils.scheduler.MessageScheduler; import de.hysky.skyblocker.utils.waypoint.Waypoint; diff --git a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/secrets/DungeonManager.java b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/secrets/DungeonManager.java index e6faff70..11f31f34 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/secrets/DungeonManager.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/secrets/DungeonManager.java @@ -20,8 +20,8 @@ import de.hysky.skyblocker.skyblock.dungeon.DungeonMap; import de.hysky.skyblocker.utils.Constants; import de.hysky.skyblocker.utils.Tickable; import de.hysky.skyblocker.utils.Utils; -import de.hysky.skyblocker.utils.command.argumenttypes.ClientBlockPosArgumentType; -import de.hysky.skyblocker.utils.command.argumenttypes.ClientPosArgument; +import de.hysky.skyblocker.utils.command.argumenttypes.blockpos.ClientBlockPosArgumentType; +import de.hysky.skyblocker.utils.command.argumenttypes.blockpos.ClientPosArgument; import de.hysky.skyblocker.utils.scheduler.Scheduler; import it.unimi.dsi.fastutil.objects.Object2ByteMap; import it.unimi.dsi.fastutil.objects.Object2ByteMaps; diff --git a/src/main/java/de/hysky/skyblocker/skyblock/dwarven/CrystalsLocationsManager.java b/src/main/java/de/hysky/skyblocker/skyblock/dwarven/CrystalsLocationsManager.java index 9f5afcc3..83167c18 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/dwarven/CrystalsLocationsManager.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/dwarven/CrystalsLocationsManager.java @@ -8,8 +8,8 @@ import de.hysky.skyblocker.SkyblockerMod; import de.hysky.skyblocker.config.SkyblockerConfigManager; import de.hysky.skyblocker.utils.Constants; import de.hysky.skyblocker.utils.Utils; -import de.hysky.skyblocker.utils.command.argumenttypes.ClientBlockPosArgumentType; -import de.hysky.skyblocker.utils.command.argumenttypes.ClientPosArgument; +import de.hysky.skyblocker.utils.command.argumenttypes.blockpos.ClientBlockPosArgumentType; +import de.hysky.skyblocker.utils.command.argumenttypes.blockpos.ClientPosArgument; import de.hysky.skyblocker.utils.scheduler.MessageScheduler; import de.hysky.skyblocker.utils.scheduler.Scheduler; import net.fabricmc.fabric.api.client.command.v2.ClientCommandRegistrationCallback; diff --git a/src/main/java/de/hysky/skyblocker/skyblock/waypoint/MythologicalRitual.java b/src/main/java/de/hysky/skyblocker/skyblock/waypoint/MythologicalRitual.java index e7884686..2b064770 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/waypoint/MythologicalRitual.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/waypoint/MythologicalRitual.java @@ -7,8 +7,8 @@ import de.hysky.skyblocker.utils.ColorUtils; import de.hysky.skyblocker.utils.ItemUtils; import de.hysky.skyblocker.utils.Location; import de.hysky.skyblocker.utils.Utils; -import de.hysky.skyblocker.utils.command.argumenttypes.ClientBlockPosArgumentType; -import de.hysky.skyblocker.utils.command.argumenttypes.ClientPosArgument; +import de.hysky.skyblocker.utils.command.argumenttypes.blockpos.ClientBlockPosArgumentType; +import de.hysky.skyblocker.utils.command.argumenttypes.blockpos.ClientPosArgument; import de.hysky.skyblocker.utils.render.RenderHelper; import de.hysky.skyblocker.utils.waypoint.Waypoint; import net.fabricmc.fabric.api.client.command.v2.ClientCommandRegistrationCallback; diff --git a/src/main/java/de/hysky/skyblocker/skyblock/waypoint/OrderedWaypoints.java b/src/main/java/de/hysky/skyblocker/skyblock/waypoint/OrderedWaypoints.java index 10fe0b6b..b199ffa3 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/waypoint/OrderedWaypoints.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/waypoint/OrderedWaypoints.java @@ -15,8 +15,8 @@ import de.hysky.skyblocker.config.SkyblockerConfigManager; import de.hysky.skyblocker.skyblock.item.CustomArmorDyeColors; import de.hysky.skyblocker.utils.Constants; import de.hysky.skyblocker.utils.Utils; -import de.hysky.skyblocker.utils.command.argumenttypes.ClientBlockPosArgumentType; -import de.hysky.skyblocker.utils.command.argumenttypes.ClientPosArgument; +import de.hysky.skyblocker.utils.command.argumenttypes.blockpos.ClientBlockPosArgumentType; +import de.hysky.skyblocker.utils.command.argumenttypes.blockpos.ClientPosArgument; import de.hysky.skyblocker.utils.render.RenderHelper; import de.hysky.skyblocker.utils.waypoint.Waypoint; import it.unimi.dsi.fastutil.floats.FloatArrayList; diff --git a/src/main/java/de/hysky/skyblocker/utils/command/argumenttypes/ClientBlockPosArgumentType.java b/src/main/java/de/hysky/skyblocker/utils/command/argumenttypes/ClientBlockPosArgumentType.java deleted file mode 100644 index 1257c1e4..00000000 --- a/src/main/java/de/hysky/skyblocker/utils/command/argumenttypes/ClientBlockPosArgumentType.java +++ /dev/null @@ -1,73 +0,0 @@ -package de.hysky.skyblocker.utils.command.argumenttypes; - -import com.mojang.brigadier.StringReader; -import com.mojang.brigadier.arguments.ArgumentType; -import com.mojang.brigadier.context.CommandContext; -import com.mojang.brigadier.exceptions.CommandSyntaxException; -import com.mojang.brigadier.suggestion.Suggestions; -import com.mojang.brigadier.suggestion.SuggestionsBuilder; -import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource; -import net.minecraft.client.world.ClientWorld; -import net.minecraft.command.CommandSource; -import net.minecraft.command.argument.BlockPosArgumentType; -import net.minecraft.server.command.CommandManager; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; - -import java.util.Collection; -import java.util.Collections; -import java.util.concurrent.CompletableFuture; - -import static net.minecraft.command.argument.BlockPosArgumentType.*; - -// Uses the static fields of BlockPosArgumentType to not create the same field twice -public class ClientBlockPosArgumentType implements ArgumentType { - public static ClientBlockPosArgumentType blockPos() { - return new ClientBlockPosArgumentType(); - } - - public static BlockPos getLoadedBlockPos(CommandContext context, String name) throws CommandSyntaxException { - return getLoadedBlockPos(context, context.getSource().getWorld(), name); - } - - public static BlockPos getLoadedBlockPos(CommandContext context, ClientWorld world, String name) throws CommandSyntaxException { - BlockPos blockPos = getBlockPos(context, name); - if (!world.isChunkLoaded(blockPos)) throw UNLOADED_EXCEPTION.create(); - if (!world.isInBuildLimit(blockPos)) throw OUT_OF_WORLD_EXCEPTION.create(); - - return blockPos; - - } - - public static BlockPos getBlockPos(CommandContext context, String name) { - return context.getArgument(name, ClientPosArgument.class).toAbsoluteBlockPos(context.getSource()); - } - - public static BlockPos getValidBlockPos(CommandContext context, String name) throws CommandSyntaxException { - BlockPos blockPos = getBlockPos(context, name); - if (!World.isValid(blockPos)) { - throw OUT_OF_BOUNDS_EXCEPTION.create(); - } else { - return blockPos; - } - } - - public ClientPosArgument parse(StringReader stringReader) throws CommandSyntaxException { - return stringReader.canRead() && stringReader.peek() == '^' ? LookingClientPosArgument.parse(stringReader) : DefaultClientPosArgument.parse(stringReader); - } - - @Override - public CompletableFuture listSuggestions(CommandContext context, SuggestionsBuilder builder) { - if (!(context.getSource() instanceof CommandSource commandSource)) return Suggestions.empty(); - - String string = builder.getRemaining(); - Collection collection = !string.isEmpty() && string.charAt(0) == '^' ? Collections.singleton(CommandSource.RelativePosition.ZERO_LOCAL) : commandSource.getBlockPositionSuggestions(); - - return CommandSource.suggestPositions(string, collection, builder, CommandManager.getCommandValidator(this::parse)); - } - - @Override - public Collection getExamples() { - return BlockPosArgumentType.EXAMPLES; - } -} diff --git a/src/main/java/de/hysky/skyblocker/utils/command/argumenttypes/ClientPosArgument.java b/src/main/java/de/hysky/skyblocker/utils/command/argumenttypes/ClientPosArgument.java deleted file mode 100644 index ad0da38b..00000000 --- a/src/main/java/de/hysky/skyblocker/utils/command/argumenttypes/ClientPosArgument.java +++ /dev/null @@ -1,27 +0,0 @@ -package de.hysky.skyblocker.utils.command.argumenttypes; - -import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Vec2f; -import net.minecraft.util.math.Vec3d; - -/** - * This interface, its 2 implementations and ClientBlockPosArgumentType are all copied from minecraft - * and converted to use FabricClientCommandSource instead of ServerCommandSource. - * This removes the need for hacky workarounds such as creating new ServerCommandSources with null or 0 on every argument. - */ -public interface ClientPosArgument { - Vec3d toAbsolutePos(FabricClientCommandSource source); - - Vec2f toAbsoluteRotation(FabricClientCommandSource source); - - default BlockPos toAbsoluteBlockPos(FabricClientCommandSource source) { - return BlockPos.ofFloored(this.toAbsolutePos(source)); - } - - boolean isXRelative(); - - boolean isYRelative(); - - boolean isZRelative(); -} diff --git a/src/main/java/de/hysky/skyblocker/utils/command/argumenttypes/DefaultClientPosArgument.java b/src/main/java/de/hysky/skyblocker/utils/command/argumenttypes/DefaultClientPosArgument.java deleted file mode 100644 index 99507f64..00000000 --- a/src/main/java/de/hysky/skyblocker/utils/command/argumenttypes/DefaultClientPosArgument.java +++ /dev/null @@ -1,113 +0,0 @@ -package de.hysky.skyblocker.utils.command.argumenttypes; - -import com.mojang.brigadier.StringReader; -import com.mojang.brigadier.exceptions.CommandSyntaxException; -import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource; -import net.minecraft.command.argument.CoordinateArgument; -import net.minecraft.command.argument.Vec3ArgumentType; -import net.minecraft.util.math.Vec2f; -import net.minecraft.util.math.Vec3d; - -public class DefaultClientPosArgument implements ClientPosArgument { - private final CoordinateArgument x; - private final CoordinateArgument y; - private final CoordinateArgument z; - - public DefaultClientPosArgument(CoordinateArgument x, CoordinateArgument y, CoordinateArgument z) { - this.x = x; - this.y = y; - this.z = z; - } - - @Override - public Vec3d toAbsolutePos(FabricClientCommandSource source) { - Vec3d vec3d = source.getPosition(); - return new Vec3d(this.x.toAbsoluteCoordinate(vec3d.x), this.y.toAbsoluteCoordinate(vec3d.y), this.z.toAbsoluteCoordinate(vec3d.z)); - } - - @Override - public Vec2f toAbsoluteRotation(FabricClientCommandSource source) { - Vec2f vec2f = source.getRotation(); - return new Vec2f((float)this.x.toAbsoluteCoordinate(vec2f.x), (float)this.y.toAbsoluteCoordinate(vec2f.y)); - } - - @Override - public boolean isXRelative() { - return this.x.isRelative(); - } - - @Override - public boolean isYRelative() { - return this.y.isRelative(); - } - - @Override - public boolean isZRelative() { - return this.z.isRelative(); - } - - public boolean equals(Object o) { - if (this == o) return true; - - return o instanceof DefaultClientPosArgument defaultPosArgument && - this.x.equals(defaultPosArgument.x) && this.y.equals(defaultPosArgument.y) && this.z.equals(defaultPosArgument.z); - } - - public static DefaultClientPosArgument parse(StringReader reader) throws CommandSyntaxException { - int i = reader.getCursor(); - CoordinateArgument coordinateArgument = CoordinateArgument.parse(reader); - if (reader.canRead() && reader.peek() == ' ') { - reader.skip(); - CoordinateArgument coordinateArgument2 = CoordinateArgument.parse(reader); - if (reader.canRead() && reader.peek() == ' ') { - reader.skip(); - CoordinateArgument coordinateArgument3 = CoordinateArgument.parse(reader); - return new DefaultClientPosArgument(coordinateArgument, coordinateArgument2, coordinateArgument3); - } else { - reader.setCursor(i); - throw Vec3ArgumentType.INCOMPLETE_EXCEPTION.createWithContext(reader); - } - } else { - reader.setCursor(i); - throw Vec3ArgumentType.INCOMPLETE_EXCEPTION.createWithContext(reader); - } - } - - public static DefaultClientPosArgument parse(StringReader reader, boolean centerIntegers) throws CommandSyntaxException { - int i = reader.getCursor(); - CoordinateArgument coordinateArgument = CoordinateArgument.parse(reader, centerIntegers); - if (reader.canRead() && reader.peek() == ' ') { - reader.skip(); - CoordinateArgument coordinateArgument2 = CoordinateArgument.parse(reader, false); - if (reader.canRead() && reader.peek() == ' ') { - reader.skip(); - CoordinateArgument coordinateArgument3 = CoordinateArgument.parse(reader, centerIntegers); - return new DefaultClientPosArgument(coordinateArgument, coordinateArgument2, coordinateArgument3); - } else { - reader.setCursor(i); - throw Vec3ArgumentType.INCOMPLETE_EXCEPTION.createWithContext(reader); - } - } else { - reader.setCursor(i); - throw Vec3ArgumentType.INCOMPLETE_EXCEPTION.createWithContext(reader); - } - } - - public static DefaultClientPosArgument absolute(double x, double y, double z) { - return new DefaultClientPosArgument(new CoordinateArgument(false, x), new CoordinateArgument(false, y), new CoordinateArgument(false, z)); - } - - public static DefaultClientPosArgument absolute(Vec2f vec) { - return new DefaultClientPosArgument(new CoordinateArgument(false, vec.x), new CoordinateArgument(false, vec.y), new CoordinateArgument(true, 0.0)); - } - - public static DefaultClientPosArgument zero() { - return new DefaultClientPosArgument(new CoordinateArgument(true, 0.0), new CoordinateArgument(true, 0.0), new CoordinateArgument(true, 0.0)); - } - - public int hashCode() { - int i = this.x.hashCode(); - i = 31 * i + this.y.hashCode(); - return 31 * i + this.z.hashCode(); - } -} diff --git a/src/main/java/de/hysky/skyblocker/utils/command/argumenttypes/LookingClientPosArgument.java b/src/main/java/de/hysky/skyblocker/utils/command/argumenttypes/LookingClientPosArgument.java deleted file mode 100644 index 0e9204e1..00000000 --- a/src/main/java/de/hysky/skyblocker/utils/command/argumenttypes/LookingClientPosArgument.java +++ /dev/null @@ -1,106 +0,0 @@ -package de.hysky.skyblocker.utils.command.argumenttypes; - -import com.mojang.brigadier.StringReader; -import com.mojang.brigadier.exceptions.CommandSyntaxException; -import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource; -import net.minecraft.command.argument.CoordinateArgument; -import net.minecraft.command.argument.Vec3ArgumentType; -import net.minecraft.util.math.MathHelper; -import net.minecraft.util.math.Vec2f; -import net.minecraft.util.math.Vec3d; - -import java.util.Objects; - -public class LookingClientPosArgument implements ClientPosArgument { - private final double x; - private final double y; - private final double z; - - public LookingClientPosArgument(double x, double y, double z) { - this.x = x; - this.y = y; - this.z = z; - } - - @Override - public Vec3d toAbsolutePos(FabricClientCommandSource source) { - Vec2f vec2f = source.getRotation(); - Vec3d vec3d = source.getPlayer().getPos(); - float f = MathHelper.cos((vec2f.y + 90.0F) * (float) (Math.PI / 180.0)); - float g = MathHelper.sin((vec2f.y + 90.0F) * (float) (Math.PI / 180.0)); - float h = MathHelper.cos(-vec2f.x * (float) (Math.PI / 180.0)); - float i = MathHelper.sin(-vec2f.x * (float) (Math.PI / 180.0)); - float j = MathHelper.cos((-vec2f.x + 90.0F) * (float) (Math.PI / 180.0)); - float k = MathHelper.sin((-vec2f.x + 90.0F) * (float) (Math.PI / 180.0)); - Vec3d vec3d2 = new Vec3d(f * h, i, g * h); - Vec3d vec3d3 = new Vec3d(f * j, k, g * j); - Vec3d vec3d4 = vec3d2.crossProduct(vec3d3).multiply(-1.0); - double d = vec3d2.x * this.z + vec3d3.x * this.y + vec3d4.x * this.x; - double e = vec3d2.y * this.z + vec3d3.y * this.y + vec3d4.y * this.x; - double l = vec3d2.z * this.z + vec3d3.z * this.y + vec3d4.z * this.x; - return new Vec3d(vec3d.x + d, vec3d.y + e, vec3d.z + l); - } - - @Override - public Vec2f toAbsoluteRotation(FabricClientCommandSource source) { - return Vec2f.ZERO; - } - - @Override - public boolean isXRelative() { - return true; - } - - @Override - public boolean isYRelative() { - return true; - } - - @Override - public boolean isZRelative() { - return true; - } - - public static LookingClientPosArgument parse(StringReader reader) throws CommandSyntaxException { - int i = reader.getCursor(); - double d = readCoordinate(reader, i); - if (reader.canRead() && reader.peek() == ' ') { - reader.skip(); - double e = readCoordinate(reader, i); - if (reader.canRead() && reader.peek() == ' ') { - reader.skip(); - double f = readCoordinate(reader, i); - return new LookingClientPosArgument(d, e, f); - } else { - reader.setCursor(i); - throw Vec3ArgumentType.INCOMPLETE_EXCEPTION.createWithContext(reader); - } - } else { - reader.setCursor(i); - throw Vec3ArgumentType.INCOMPLETE_EXCEPTION.createWithContext(reader); - } - } - - private static double readCoordinate(StringReader reader, int startingCursorPos) throws CommandSyntaxException { - if (!reader.canRead()) { - throw CoordinateArgument.MISSING_COORDINATE.createWithContext(reader); - } else if (reader.peek() != '^') { - reader.setCursor(startingCursorPos); - throw Vec3ArgumentType.MIXED_COORDINATE_EXCEPTION.createWithContext(reader); - } else { - reader.skip(); - return reader.canRead() && reader.peek() != ' ' ? reader.readDouble() : 0.0; - } - } - - public boolean equals(Object o) { - if (this == o) return true; - - return o instanceof LookingClientPosArgument lookingPosArgument - && this.x == lookingPosArgument.x && this.y == lookingPosArgument.y && this.z == lookingPosArgument.z; - } - - public int hashCode() { - return Objects.hash(x, y, z); - } -} diff --git a/src/main/java/de/hysky/skyblocker/utils/command/argumenttypes/blockpos/ClientBlockPosArgumentType.java b/src/main/java/de/hysky/skyblocker/utils/command/argumenttypes/blockpos/ClientBlockPosArgumentType.java new file mode 100644 index 00000000..3a226414 --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/utils/command/argumenttypes/blockpos/ClientBlockPosArgumentType.java @@ -0,0 +1,72 @@ +package de.hysky.skyblocker.utils.command.argumenttypes.blockpos; + +import com.mojang.brigadier.StringReader; +import com.mojang.brigadier.arguments.ArgumentType; +import com.mojang.brigadier.context.CommandContext; +import com.mojang.brigadier.exceptions.CommandSyntaxException; +import com.mojang.brigadier.suggestion.Suggestions; +import com.mojang.brigadier.suggestion.SuggestionsBuilder; +import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource; +import net.minecraft.client.world.ClientWorld; +import net.minecraft.command.CommandSource; +import net.minecraft.command.argument.BlockPosArgumentType; +import net.minecraft.server.command.CommandManager; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; + +import java.util.Collection; +import java.util.Collections; +import java.util.concurrent.CompletableFuture; + +import static net.minecraft.command.argument.BlockPosArgumentType.*; + +// Uses the static fields of BlockPosArgumentType to not create the same field twice +public class ClientBlockPosArgumentType implements ArgumentType { + public static ClientBlockPosArgumentType blockPos() { + return new ClientBlockPosArgumentType(); + } + + public static BlockPos getLoadedBlockPos(CommandContext context, String name) throws CommandSyntaxException { + return getLoadedBlockPos(context, context.getSource().getWorld(), name); + } + + public static BlockPos getLoadedBlockPos(CommandContext context, ClientWorld world, String name) throws CommandSyntaxException { + BlockPos blockPos = getBlockPos(context, name); + if (!world.isChunkLoaded(blockPos)) throw UNLOADED_EXCEPTION.create(); + if (!world.isInBuildLimit(blockPos)) throw OUT_OF_WORLD_EXCEPTION.create(); + + return blockPos; + } + + public static BlockPos getBlockPos(CommandContext context, String name) { + return context.getArgument(name, ClientPosArgument.class).toAbsoluteBlockPos(context.getSource()); + } + + public static BlockPos getValidBlockPos(CommandContext context, String name) throws CommandSyntaxException { + BlockPos blockPos = getBlockPos(context, name); + if (!World.isValid(blockPos)) { + throw OUT_OF_BOUNDS_EXCEPTION.create(); + } else { + return blockPos; + } + } + + public ClientPosArgument parse(StringReader stringReader) throws CommandSyntaxException { + return stringReader.canRead() && stringReader.peek() == '^' ? LookingClientPosArgument.parse(stringReader) : DefaultClientPosArgument.parse(stringReader); + } + + @Override + public CompletableFuture listSuggestions(CommandContext context, SuggestionsBuilder builder) { + if (!(context.getSource() instanceof CommandSource commandSource)) return Suggestions.empty(); + + String string = builder.getRemaining(); + Collection collection = !string.isEmpty() && string.charAt(0) == '^' ? Collections.singleton(CommandSource.RelativePosition.ZERO_LOCAL) : commandSource.getBlockPositionSuggestions(); + + return CommandSource.suggestPositions(string, collection, builder, CommandManager.getCommandValidator(this::parse)); + } + + @Override + public Collection getExamples() { + return BlockPosArgumentType.EXAMPLES; + } +} diff --git a/src/main/java/de/hysky/skyblocker/utils/command/argumenttypes/blockpos/ClientPosArgument.java b/src/main/java/de/hysky/skyblocker/utils/command/argumenttypes/blockpos/ClientPosArgument.java new file mode 100644 index 00000000..3dff86ab --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/utils/command/argumenttypes/blockpos/ClientPosArgument.java @@ -0,0 +1,27 @@ +package de.hysky.skyblocker.utils.command.argumenttypes.blockpos; + +import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Vec2f; +import net.minecraft.util.math.Vec3d; + +/** + * This interface, its 2 implementations and ClientBlockPosArgumentType are all copied from minecraft + * and converted to use FabricClientCommandSource instead of ServerCommandSource. + * This removes the need for hacky workarounds such as creating new ServerCommandSources with null or 0 on every argument. + */ +public interface ClientPosArgument { + Vec3d toAbsolutePos(FabricClientCommandSource source); + + Vec2f toAbsoluteRotation(FabricClientCommandSource source); + + default BlockPos toAbsoluteBlockPos(FabricClientCommandSource source) { + return BlockPos.ofFloored(this.toAbsolutePos(source)); + } + + boolean isXRelative(); + + boolean isYRelative(); + + boolean isZRelative(); +} diff --git a/src/main/java/de/hysky/skyblocker/utils/command/argumenttypes/blockpos/DefaultClientPosArgument.java b/src/main/java/de/hysky/skyblocker/utils/command/argumenttypes/blockpos/DefaultClientPosArgument.java new file mode 100644 index 00000000..47258b9f --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/utils/command/argumenttypes/blockpos/DefaultClientPosArgument.java @@ -0,0 +1,113 @@ +package de.hysky.skyblocker.utils.command.argumenttypes.blockpos; + +import com.mojang.brigadier.StringReader; +import com.mojang.brigadier.exceptions.CommandSyntaxException; +import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource; +import net.minecraft.command.argument.CoordinateArgument; +import net.minecraft.command.argument.Vec3ArgumentType; +import net.minecraft.util.math.Vec2f; +import net.minecraft.util.math.Vec3d; + +public class DefaultClientPosArgument implements ClientPosArgument { + private final CoordinateArgument x; + private final CoordinateArgument y; + private final CoordinateArgument z; + + public DefaultClientPosArgument(CoordinateArgument x, CoordinateArgument y, CoordinateArgument z) { + this.x = x; + this.y = y; + this.z = z; + } + + @Override + public Vec3d toAbsolutePos(FabricClientCommandSource source) { + Vec3d vec3d = source.getPosition(); + return new Vec3d(this.x.toAbsoluteCoordinate(vec3d.x), this.y.toAbsoluteCoordinate(vec3d.y), this.z.toAbsoluteCoordinate(vec3d.z)); + } + + @Override + public Vec2f toAbsoluteRotation(FabricClientCommandSource source) { + Vec2f vec2f = source.getRotation(); + return new Vec2f((float)this.x.toAbsoluteCoordinate(vec2f.x), (float)this.y.toAbsoluteCoordinate(vec2f.y)); + } + + @Override + public boolean isXRelative() { + return this.x.isRelative(); + } + + @Override + public boolean isYRelative() { + return this.y.isRelative(); + } + + @Override + public boolean isZRelative() { + return this.z.isRelative(); + } + + public boolean equals(Object o) { + if (this == o) return true; + + return o instanceof DefaultClientPosArgument defaultPosArgument && + this.x.equals(defaultPosArgument.x) && this.y.equals(defaultPosArgument.y) && this.z.equals(defaultPosArgument.z); + } + + public static DefaultClientPosArgument parse(StringReader reader) throws CommandSyntaxException { + int i = reader.getCursor(); + CoordinateArgument coordinateArgument = CoordinateArgument.parse(reader); + if (reader.canRead() && reader.peek() == ' ') { + reader.skip(); + CoordinateArgument coordinateArgument2 = CoordinateArgument.parse(reader); + if (reader.canRead() && reader.peek() == ' ') { + reader.skip(); + CoordinateArgument coordinateArgument3 = CoordinateArgument.parse(reader); + return new DefaultClientPosArgument(coordinateArgument, coordinateArgument2, coordinateArgument3); + } else { + reader.setCursor(i); + throw Vec3ArgumentType.INCOMPLETE_EXCEPTION.createWithContext(reader); + } + } else { + reader.setCursor(i); + throw Vec3ArgumentType.INCOMPLETE_EXCEPTION.createWithContext(reader); + } + } + + public static DefaultClientPosArgument parse(StringReader reader, boolean centerIntegers) throws CommandSyntaxException { + int i = reader.getCursor(); + CoordinateArgument coordinateArgument = CoordinateArgument.parse(reader, centerIntegers); + if (reader.canRead() && reader.peek() == ' ') { + reader.skip(); + CoordinateArgument coordinateArgument2 = CoordinateArgument.parse(reader, false); + if (reader.canRead() && reader.peek() == ' ') { + reader.skip(); + CoordinateArgument coordinateArgument3 = CoordinateArgument.parse(reader, centerIntegers); + return new DefaultClientPosArgument(coordinateArgument, coordinateArgument2, coordinateArgument3); + } else { + reader.setCursor(i); + throw Vec3ArgumentType.INCOMPLETE_EXCEPTION.createWithContext(reader); + } + } else { + reader.setCursor(i); + throw Vec3ArgumentType.INCOMPLETE_EXCEPTION.createWithContext(reader); + } + } + + public static DefaultClientPosArgument absolute(double x, double y, double z) { + return new DefaultClientPosArgument(new CoordinateArgument(false, x), new CoordinateArgument(false, y), new CoordinateArgument(false, z)); + } + + public static DefaultClientPosArgument absolute(Vec2f vec) { + return new DefaultClientPosArgument(new CoordinateArgument(false, vec.x), new CoordinateArgument(false, vec.y), new CoordinateArgument(true, 0.0)); + } + + public static DefaultClientPosArgument zero() { + return new DefaultClientPosArgument(new CoordinateArgument(true, 0.0), new CoordinateArgument(true, 0.0), new CoordinateArgument(true, 0.0)); + } + + public int hashCode() { + int i = this.x.hashCode(); + i = 31 * i + this.y.hashCode(); + return 31 * i + this.z.hashCode(); + } +} diff --git a/src/main/java/de/hysky/skyblocker/utils/command/argumenttypes/blockpos/LookingClientPosArgument.java b/src/main/java/de/hysky/skyblocker/utils/command/argumenttypes/blockpos/LookingClientPosArgument.java new file mode 100644 index 00000000..3f89f9c7 --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/utils/command/argumenttypes/blockpos/LookingClientPosArgument.java @@ -0,0 +1,106 @@ +package de.hysky.skyblocker.utils.command.argumenttypes.blockpos; + +import com.mojang.brigadier.StringReader; +import com.mojang.brigadier.exceptions.CommandSyntaxException; +import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource; +import net.minecraft.command.argument.CoordinateArgument; +import net.minecraft.command.argument.Vec3ArgumentType; +import net.minecraft.util.math.MathHelper; +import net.minecraft.util.math.Vec2f; +import net.minecraft.util.math.Vec3d; + +import java.util.Objects; + +public class LookingClientPosArgument implements ClientPosArgument { + private final double x; + private final double y; + private final double z; + + public LookingClientPosArgument(double x, double y, double z) { + this.x = x; + this.y = y; + this.z = z; + } + + @Override + public Vec3d toAbsolutePos(FabricClientCommandSource source) { + Vec2f vec2f = source.getRotation(); + Vec3d vec3d = source.getPlayer().getPos(); + float f = MathHelper.cos((vec2f.y + 90.0F) * (float) (Math.PI / 180.0)); + float g = MathHelper.sin((vec2f.y + 90.0F) * (float) (Math.PI / 180.0)); + float h = MathHelper.cos(-vec2f.x * (float) (Math.PI / 180.0)); + float i = MathHelper.sin(-vec2f.x * (float) (Math.PI / 180.0)); + float j = MathHelper.cos((-vec2f.x + 90.0F) * (float) (Math.PI / 180.0)); + float k = MathHelper.sin((-vec2f.x + 90.0F) * (float) (Math.PI / 180.0)); + Vec3d vec3d2 = new Vec3d(f * h, i, g * h); + Vec3d vec3d3 = new Vec3d(f * j, k, g * j); + Vec3d vec3d4 = vec3d2.crossProduct(vec3d3).multiply(-1.0); + double d = vec3d2.x * this.z + vec3d3.x * this.y + vec3d4.x * this.x; + double e = vec3d2.y * this.z + vec3d3.y * this.y + vec3d4.y * this.x; + double l = vec3d2.z * this.z + vec3d3.z * this.y + vec3d4.z * this.x; + return new Vec3d(vec3d.x + d, vec3d.y + e, vec3d.z + l); + } + + @Override + public Vec2f toAbsoluteRotation(FabricClientCommandSource source) { + return Vec2f.ZERO; + } + + @Override + public boolean isXRelative() { + return true; + } + + @Override + public boolean isYRelative() { + return true; + } + + @Override + public boolean isZRelative() { + return true; + } + + public static LookingClientPosArgument parse(StringReader reader) throws CommandSyntaxException { + int i = reader.getCursor(); + double d = readCoordinate(reader, i); + if (reader.canRead() && reader.peek() == ' ') { + reader.skip(); + double e = readCoordinate(reader, i); + if (reader.canRead() && reader.peek() == ' ') { + reader.skip(); + double f = readCoordinate(reader, i); + return new LookingClientPosArgument(d, e, f); + } else { + reader.setCursor(i); + throw Vec3ArgumentType.INCOMPLETE_EXCEPTION.createWithContext(reader); + } + } else { + reader.setCursor(i); + throw Vec3ArgumentType.INCOMPLETE_EXCEPTION.createWithContext(reader); + } + } + + private static double readCoordinate(StringReader reader, int startingCursorPos) throws CommandSyntaxException { + if (!reader.canRead()) { + throw CoordinateArgument.MISSING_COORDINATE.createWithContext(reader); + } else if (reader.peek() != '^') { + reader.setCursor(startingCursorPos); + throw Vec3ArgumentType.MIXED_COORDINATE_EXCEPTION.createWithContext(reader); + } else { + reader.skip(); + return reader.canRead() && reader.peek() != ' ' ? reader.readDouble() : 0.0; + } + } + + public boolean equals(Object o) { + if (this == o) return true; + + return o instanceof LookingClientPosArgument lookingPosArgument + && this.x == lookingPosArgument.x && this.y == lookingPosArgument.y && this.z == lookingPosArgument.z; + } + + public int hashCode() { + return Objects.hash(x, y, z); + } +} -- cgit