Allow specifying angles in dimteleport
This commit is contained in:
parent
33163e01ad
commit
66d0f9c72c
2 changed files with 30 additions and 24 deletions
|
@ -23,30 +23,11 @@ import org.dimdev.dimdoors.world.ModDimensions;
|
|||
@SuppressWarnings("deprecation")
|
||||
public final class TeleportUtil {
|
||||
public static <E extends Entity> 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 extends Entity> 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 extends Entity> 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));
|
||||
}
|
||||
|
||||
|
|
|
@ -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<ServerCommandSource> 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;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue