diff --git a/src/main/java/org/dimdev/dimdoors/api/util/TeleportUtil.java b/src/main/java/org/dimdev/dimdoors/api/util/TeleportUtil.java index 80508cb3..4537dba6 100644 --- a/src/main/java/org/dimdev/dimdoors/api/util/TeleportUtil.java +++ b/src/main/java/org/dimdev/dimdoors/api/util/TeleportUtil.java @@ -23,30 +23,11 @@ import org.dimdev.dimdoors.world.ModDimensions; @SuppressWarnings("deprecation") public final class TeleportUtil { public static E teleport(E entity, World world, BlockPos pos, float yaw) { - if (world.isClient) { - throw new UnsupportedOperationException("Only supported on ServerWorld"); - } - return teleport(entity, world, Vec3d.ofBottomCenter(pos), yaw); } public static E teleport(E entity, World world, Vec3d pos, float yaw) { - if (world.isClient) { - throw new UnsupportedOperationException("Only supported on ServerWorld"); - } - - if (entity.world.getRegistryKey().equals(world.getRegistryKey())) { - entity.yaw = yaw; - entity.teleport(pos.x, pos.y, pos.z); - - return entity; - } - - if (entity.isPlayer() && world.getRegistryKey() == ModDimensions.DUNGEON) { - ((PlayerEntity) entity).incrementStat(ModStats.TIMES_BEEN_TO_DUNGEON); - } - - return FabricDimensions.teleport(entity, (ServerWorld) world, new TeleportTarget(pos, entity.getVelocity(), yaw, entity.getPitch(1.0F))); + return teleport(entity, world, pos, new EulerAngle(entity.pitch, yaw, 0), entity.getVelocity()); } public static E teleport(E entity, World world, Vec3d pos, EulerAngle angle, Vec3d velocity) { @@ -64,6 +45,9 @@ public final class TeleportUtil { } if (entity instanceof ServerPlayerEntity) { + if (world.getRegistryKey() == ModDimensions.DUNGEON) { + ((PlayerEntity) entity).incrementStat(ModStats.TIMES_BEEN_TO_DUNGEON); + } ((ExtendedServerPlayNetworkHandler) ((ServerPlayerEntity) entity).networkHandler).getDimDoorsPacketHandler().syncPocketAddonsIfNeeded(world, new BlockPos(pos)); } diff --git a/src/main/java/org/dimdev/dimdoors/command/DimTeleportCommand.java b/src/main/java/org/dimdev/dimdoors/command/DimTeleportCommand.java index d02bb2b0..834a321b 100644 --- a/src/main/java/org/dimdev/dimdoors/command/DimTeleportCommand.java +++ b/src/main/java/org/dimdev/dimdoors/command/DimTeleportCommand.java @@ -2,6 +2,7 @@ package org.dimdev.dimdoors.command; import com.mojang.brigadier.Command; import com.mojang.brigadier.CommandDispatcher; +import com.mojang.brigadier.arguments.FloatArgumentType; import org.dimdev.dimdoors.api.util.TeleportUtil; import net.minecraft.command.argument.DimensionArgumentType; @@ -11,30 +12,51 @@ import net.minecraft.server.command.CommandManager; import net.minecraft.server.command.ServerCommandSource; import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.server.world.ServerWorld; +import net.minecraft.util.math.EulerAngle; import net.minecraft.util.math.Vec3d; +import net.minecraft.world.gen.GenerationStep; + import org.dimdev.dimdoors.api.util.math.MathUtil; +import net.fabricmc.fabric.api.biome.v1.BiomeModifications; +import net.fabricmc.fabric.api.biome.v1.BiomeSelectors; + public class DimTeleportCommand { public static void register(CommandDispatcher dispatcher) { dispatcher.register(CommandManager.literal("dimteleport") .then(CommandManager .argument("dimension", DimensionArgumentType.dimension()) .executes(ctx -> { - return teleport(ctx.getSource().getEntity(), DimensionArgumentType.getDimensionArgument(ctx, "dimension"), ctx.getSource().getPosition()); + ServerPlayerEntity player = ctx.getSource().getPlayer(); + return teleport(player, DimensionArgumentType.getDimensionArgument(ctx, "dimension"), player.getPos(), MathUtil.entityEulerAngle(player)); }) .then(CommandManager .argument("coordinates", Vec3ArgumentType.vec3()) .executes(ctx -> { ServerPlayerEntity player = ctx.getSource().getPlayer(); - return teleport(player, DimensionArgumentType.getDimensionArgument(ctx, "dimension"), Vec3ArgumentType.getVec3(ctx, "coordinates")); + return teleport(player, DimensionArgumentType.getDimensionArgument(ctx, "dimension"), Vec3ArgumentType.getVec3(ctx, "coordinates"), MathUtil.entityEulerAngle(player)); }) + .then(CommandManager + .argument("yaw", FloatArgumentType.floatArg()) + .executes( ctx -> { + ServerPlayerEntity player = ctx.getSource().getPlayer(); + return teleport(player, DimensionArgumentType.getDimensionArgument(ctx, "dimension"), Vec3ArgumentType.getVec3(ctx, "coordinates"), new EulerAngle(player.pitch, FloatArgumentType.getFloat(ctx, "yaw"), 0)); + }) + .then(CommandManager + .argument("pitch", FloatArgumentType.floatArg()) + .executes( ctx -> { + ServerPlayerEntity player = ctx.getSource().getPlayer(); + return teleport(player, DimensionArgumentType.getDimensionArgument(ctx, "dimension"), Vec3ArgumentType.getVec3(ctx, "coordinates"), new EulerAngle(FloatArgumentType.getFloat(ctx, "pitch"), FloatArgumentType.getFloat(ctx, "yaw"), 0)); + }) + ) + ) ) ) ); } - private static int teleport(Entity entity, ServerWorld dimension, Vec3d pos) { - TeleportUtil.teleport(entity, dimension, pos, MathUtil.entityEulerAngle(entity), entity.getVelocity()); + private static int teleport(Entity entity, ServerWorld dimension, Vec3d pos, EulerAngle angle) { + TeleportUtil.teleport(entity, dimension, pos, angle, entity.getVelocity()); return Command.SINGLE_SUCCESS; } }