Allow specifying angles in dimteleport

This commit is contained in:
SD 2021-03-31 20:46:46 +05:30
parent 33163e01ad
commit 66d0f9c72c
2 changed files with 30 additions and 24 deletions

View file

@ -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));
}

View file

@ -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;
}
}