diff --git a/src/main/java/org/dimdev/dimdoors/DimensionalDoorsInitializer.java b/src/main/java/org/dimdev/dimdoors/DimensionalDoorsInitializer.java index 07109485..d5725f9d 100644 --- a/src/main/java/org/dimdev/dimdoors/DimensionalDoorsInitializer.java +++ b/src/main/java/org/dimdev/dimdoors/DimensionalDoorsInitializer.java @@ -3,6 +3,8 @@ package org.dimdev.dimdoors; import net.fabricmc.api.ModInitializer; import net.fabricmc.fabric.api.registry.CommandRegistry; import org.dimdev.dimdoors.block.ModBlocks; +import org.dimdev.dimdoors.commands.CommandPocket; +import org.dimdev.dimdoors.commands.CommandSaveSchem; import org.dimdev.dimdoors.commands.DimTeleportCommand; import org.dimdev.dimdoors.commands.SchematicCommand; import org.dimdev.dimdoors.entity.ModEntityTypes; @@ -43,5 +45,8 @@ public class DimensionalDoorsInitializer implements ModInitializer { private void registerCommands() { CommandRegistry.INSTANCE.register(false, DimTeleportCommand::register); CommandRegistry.INSTANCE.register(false, SchematicCommand::register); + CommandRegistry.INSTANCE.register(false, CommandPocket::register); + CommandRegistry.INSTANCE.register(false, CommandSaveSchem::register); + } } diff --git a/src/main/java/org/dimdev/dimdoors/commands/CommandPocket.java b/src/main/java/org/dimdev/dimdoors/commands/CommandPocket.java new file mode 100644 index 00000000..3cd180c3 --- /dev/null +++ b/src/main/java/org/dimdev/dimdoors/commands/CommandPocket.java @@ -0,0 +1,80 @@ +package org.dimdev.dimdoors.commands; + +import com.flowpowered.math.vector.Vector3i; +import com.mojang.brigadier.CommandDispatcher; +import com.mojang.brigadier.arguments.BoolArgumentType; +import net.minecraft.command.CommandException; +import net.minecraft.server.command.CommandManager; +import net.minecraft.server.command.ServerCommandSource; +import net.minecraft.server.network.ServerPlayerEntity; +import net.minecraft.text.TranslatableText; +import org.dimdev.dimdoors.commands.arguments.GroupArugmentType; +import org.dimdev.dimdoors.commands.arguments.NameArugmentType; +import org.dimdev.dimdoors.pockets.PocketGenerator; +import org.dimdev.dimdoors.pockets.PocketTemplate; +import org.dimdev.dimdoors.pockets.SchematicHandler; +import org.dimdev.dimdoors.rift.registry.RiftRegistry; +import org.dimdev.dimdoors.rift.targets.EntityTarget; +import org.dimdev.dimdoors.world.ModDimensions; +import org.dimdev.pocketlib.Pocket; +import org.dimdev.util.Location; +import org.dimdev.util.TeleportUtil; + +public class CommandPocket { + public static void register(CommandDispatcher dispatcher) { + dispatcher.register(CommandManager.literal("pocket") + .then(CommandManager.argument("group", GroupArugmentType.group()) + .then(CommandManager.argument("name", NameArugmentType.name()) + .then(CommandManager + .argument("setup", BoolArgumentType.bool()) + .executes(ctx -> { + ServerPlayerEntity player = ctx.getSource().getPlayer(); + + if (!ModDimensions.isDimDoorsPocketDimension(player.world)) { + throw new CommandException(new TranslatableText("commands.generic.dimdoors.not_in_pocket")); + } + + String group = ctx.getArgument("group", String.class); + String name = ctx.getArgument("name", String.class); + boolean setup = BoolArgumentType.getBool(ctx, "setup"); + + pocket(group, name, setup, player); + + return 1; + }) + ) + .executes(ctx -> { + ServerPlayerEntity player = ctx.getSource().getPlayer(); + + if (!ModDimensions.isDimDoorsPocketDimension(player.world)) { + throw new CommandException(new TranslatableText("commands.generic.dimdoors.not_in_pocket")); + } + + String group = ctx.getArgument("group", String.class); + String name = ctx.getArgument("name", String.class); + + pocket(group, name, true, player); + + return 1; + })))); + } + + public static void pocket(String group, String name, boolean setup, ServerPlayerEntity player) { + try { + PocketTemplate template = SchematicHandler.INSTANCE.getTemplate(group, name); + + Pocket pocket = PocketGenerator.generatePocketFromTemplate(player.getServerWorld(), template, null, setup); + + // Teleport the player there + if (RiftRegistry.instance(player.world).getPocketEntrance(pocket) != null) { + EntityTarget entrance = (EntityTarget) player.world.getBlockEntity(RiftRegistry.instance(player.world).getPocketEntrance(pocket).pos); + entrance.receiveEntity(player, 0); + } else { + Vector3i size = pocket.getSize().add(1, 1, 1).mul(15).div(2); + TeleportUtil.teleport(player, new Location(player.getServerWorld(), pocket.getOrigin().add(size.getX(), size.getY(), size.getZ()))); + } + } catch (Exception e) { + e.printStackTrace(); + } + } +} diff --git a/src/main/java/org/dimdev/dimdoors/commands/CommandSaveSchem.java b/src/main/java/org/dimdev/dimdoors/commands/CommandSaveSchem.java new file mode 100644 index 00000000..f4a443f8 --- /dev/null +++ b/src/main/java/org/dimdev/dimdoors/commands/CommandSaveSchem.java @@ -0,0 +1,47 @@ +package org.dimdev.dimdoors.commands; + +import com.flowpowered.math.vector.Vector3i; +import com.mojang.brigadier.CommandDispatcher; +import com.mojang.brigadier.arguments.StringArgumentType; +import net.minecraft.command.CommandException; +import net.minecraft.server.command.CommandManager; +import net.minecraft.server.command.ServerCommandSource; +import net.minecraft.server.network.ServerPlayerEntity; +import net.minecraft.text.TranslatableText; +import net.minecraft.util.math.Vec3i; +import org.dimdev.dimdoors.pockets.SchematicHandler; +import org.dimdev.dimdoors.world.ModDimensions; +import org.dimdev.pocketlib.Pocket; +import org.dimdev.pocketlib.PocketRegistry; +import org.dimdev.util.schem.Schematic; + +public class CommandSaveSchem { + public static void register(CommandDispatcher dispatcher) { + dispatcher.register(CommandManager.literal("saveschem") + .then(CommandManager + .argument("name", StringArgumentType.string()) + .executes(ctx -> { + ServerPlayerEntity player = ctx.getSource().getPlayer(); + if(!ModDimensions.isDimDoorsPocketDimension(player.world)) { + throw new CommandException(new TranslatableText("commands.generic.dimdoors.not_in_pocket")); + } + + Pocket pocket = PocketRegistry.instance(player.getServerWorld()).getPocketAt(player.getBlockPos()); + if (pocket == null) throw new CommandException(new TranslatableText("commands.generic.dimdoors.not_in_pocket")); + + Vector3i size = pocket.getSize().add(1,1,1).mul(16).sub(1,1,1); + Schematic schematic = Schematic.createFromWorld(player.world, pocket.getOrigin(), pocket.getOrigin().add(new Vec3i(size.getX(), size.getY(), size.getZ()))); + + String name = StringArgumentType.getString(ctx, "name"); + + schematic.name = name; + schematic.author = player.getName().getString(); + + SchematicHandler.INSTANCE.saveSchematicForEditing(schematic, name); + + ctx.getSource().sendError(new TranslatableText("commands.saveschem.success")); + return 1; + })) + ); + } +} diff --git a/src/main/java/org/dimdev/dimdoors/commands/arguments/GroupArugmentType.java b/src/main/java/org/dimdev/dimdoors/commands/arguments/GroupArugmentType.java new file mode 100644 index 00000000..f27bf03c --- /dev/null +++ b/src/main/java/org/dimdev/dimdoors/commands/arguments/GroupArugmentType.java @@ -0,0 +1,33 @@ +package org.dimdev.dimdoors.commands.arguments; + +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.minecraft.server.command.CommandSource; +import org.dimdev.dimdoors.pockets.PocketTemplate; +import org.dimdev.dimdoors.pockets.SchematicHandler; + +import java.util.concurrent.CompletableFuture; + +public class GroupArugmentType implements ArgumentType { + @Override + public String parse(StringReader reader) throws CommandSyntaxException { + return reader.readUnquotedString(); + } + + public static GroupArugmentType group() { + return new GroupArugmentType(); + } + + public static PocketTemplate getPocketTemplate(CommandContext context, String name) { + return context.getArgument(name, PocketTemplate.class); + } + + @Override + public CompletableFuture listSuggestions(CommandContext context, SuggestionsBuilder builder) { + return CommandSource.suggestMatching(SchematicHandler.INSTANCE.getTemplateGroups().stream(), builder); + } +} diff --git a/src/main/java/org/dimdev/dimdoors/commands/arguments/NameArugmentType.java b/src/main/java/org/dimdev/dimdoors/commands/arguments/NameArugmentType.java new file mode 100644 index 00000000..69f544e9 --- /dev/null +++ b/src/main/java/org/dimdev/dimdoors/commands/arguments/NameArugmentType.java @@ -0,0 +1,30 @@ +package org.dimdev.dimdoors.commands.arguments; + +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.minecraft.server.command.CommandSource; +import org.dimdev.dimdoors.pockets.SchematicHandler; + +import java.util.concurrent.CompletableFuture; + +public class NameArugmentType implements ArgumentType { + @Override + public String parse(StringReader reader) throws CommandSyntaxException { + return reader.readUnquotedString(); + } + + public static NameArugmentType name() { + return new NameArugmentType(); + } + + @Override + public CompletableFuture listSuggestions(CommandContext context, SuggestionsBuilder builder) { + String group = context.getArgument("group", String.class); + + return CommandSource.suggestMatching(SchematicHandler.INSTANCE.getTemplateNames(group), builder); + } +} \ No newline at end of file diff --git a/src/main/java/org/dimdev/pocketlib/Pocket.java b/src/main/java/org/dimdev/pocketlib/Pocket.java index 246aab93..bafc2ca0 100644 --- a/src/main/java/org/dimdev/pocketlib/Pocket.java +++ b/src/main/java/org/dimdev/pocketlib/Pocket.java @@ -1,11 +1,13 @@ package org.dimdev.pocketlib; +import com.flowpowered.math.vector.Vector3i; import net.minecraft.entity.Entity; import net.minecraft.server.world.ServerWorld; import net.minecraft.text.TranslatableText; import net.minecraft.util.DyeColor; import net.minecraft.util.math.BlockBox; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Vec3i; import org.dimdev.annotatednbt.Saved; import org.dimdev.util.EntityUtils; @@ -97,4 +99,9 @@ public final class Pocket { public void setSize(int x, int y, int z) { box = new BlockBox(box.minX, box.minY, box.minZ, box.minX + x, box.minY + y, box.minZ + z); } + + public Vector3i getSize() { + Vec3i dimensions = box.getDimensions(); + return new Vector3i(dimensions.getX(), dimensions.getY(), dimensions.getZ()); + } } diff --git a/src/main/java/org/dimdev/util/TeleportUtil.java b/src/main/java/org/dimdev/util/TeleportUtil.java index 0d292e55..70a66918 100644 --- a/src/main/java/org/dimdev/util/TeleportUtil.java +++ b/src/main/java/org/dimdev/util/TeleportUtil.java @@ -3,6 +3,7 @@ package org.dimdev.util; import net.fabricmc.fabric.api.dimension.v1.FabricDimensions; import net.minecraft.block.pattern.BlockPattern; import net.minecraft.entity.Entity; +import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.server.world.ServerWorld; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Vec3d; @@ -27,4 +28,12 @@ public final class TeleportUtil { entity.setOnFireFor(0); // Workaround for https://bugs.mojang.com/browse/MC-100097 } } + + public static void teleport(ServerPlayerEntity player, Location location) { + teleport(player, location.world, location.pos, 0); + } + + public static void teleport(ServerPlayerEntity player, RotatedLocation location) { + teleport(player, location.world, location.pos, (int) location.yaw); + } }