package net.minecraft.command.commands; import java.util.Collections; import java.util.EnumSet; import java.util.List; import net.minecraft.command.CommandException; import net.minecraft.command.CommandResultStats.Type; import net.minecraft.command.CommandUtilities; import net.minecraft.command.EntityNotFoundException; import net.minecraft.command.ICommandSender; import net.minecraft.command.SyntaxErrorException; import net.minecraft.command.arg.ArgWrapper; import net.minecraft.command.arg.CommandArg; import net.minecraft.command.collections.TypeIDs; import net.minecraft.command.construction.CommandConstructable; import net.minecraft.command.construction.CommandDescriptorDefault.CParserData; import net.minecraft.command.type.custom.coordinate.TypeCoordinate; import net.minecraft.command.type.custom.coordinate.TypeCoordinate.SingleShift; import net.minecraft.command.type.custom.coordinate.TypeCoordinates.Shift; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.network.play.server.S08PacketPlayerPosLook; import net.minecraft.network.play.server.S08PacketPlayerPosLook.EnumFlags; import net.minecraft.util.MathHelper; import net.minecraft.util.Vec3; public abstract class CommandTeleport extends CommandArg<Integer> { public static final CommandConstructable constructable = new CommandConstructable() { @Override public CommandArg<Integer> construct(final CParserData data) throws SyntaxErrorException { final CommandArg<List<Entity>> sourceEntities = data.get(TypeIDs.EntityList); final ArgWrapper<?> arg2 = data.get(); final CommandArg<SingleShift> yaw = data.get(TypeIDs.SingleShift); final CommandArg<SingleShift> pitch = data.get(TypeIDs.SingleShift); if (arg2 == null) { if (sourceEntities == null) throw data.parser.WUE("commands.tp.usage"); return new EntityTarget(null, yaw, pitch, new CommandArg<ICommandSender>() { @Override public Entity eval(final ICommandSender sender) throws CommandException { final List<Entity> ret = sourceEntities.eval(sender); if (ret.size() != 1) throw new EntityNotFoundException(); return ret.get(0); } }); } if (arg2.type == TypeIDs.ICmdSender) return new EntityTarget(sourceEntities, yaw, pitch, arg2.get(TypeIDs.ICmdSender)); return new CoordinatesTarget(sourceEntities, yaw, pitch, arg2.get(TypeIDs.Shift)); } }; private final CommandArg<List<Entity>> sources; protected final CommandArg<SingleShift> yaw; protected final CommandArg<SingleShift> pitch; public CommandTeleport(final CommandArg<List<Entity>> sources, final CommandArg<SingleShift> yaw, final CommandArg<SingleShift> pitch) { this.sources = sources; this.yaw = yaw == null ? TypeCoordinate.trivialShift : yaw; this.pitch = pitch == null ? TypeCoordinate.trivialShift : pitch; } protected List<Entity> getSources(final ICommandSender sender) throws CommandException { if (this.sources == null) { final Entity senderEntity = sender.getCommandSenderEntity(); if (senderEntity == null) throw new EntityNotFoundException(); sender.func_174794_a(Type.AFFECTED_ENTITIES, 1); return Collections.singletonList(senderEntity); } final List<Entity> ret = this.sources.eval(sender); sender.func_174794_a(Type.AFFECTED_ENTITIES, ret.size()); return ret; } private static class CoordinatesTarget extends CommandTeleport { private final CommandArg<Shift> targetPos; public CoordinatesTarget(final CommandArg<List<Entity>> sources, final CommandArg<SingleShift> yaw, final CommandArg<SingleShift> pitch, final CommandArg<Shift> targetPos) { super(sources, yaw, pitch); this.targetPos = targetPos; } @Override public Integer eval(final ICommandSender sender) throws CommandException { final Shift targetShift = this.targetPos.eval(sender); final Vec3 targetShiftVal = targetShift.getShiftValues(); final SingleShift yawShift = this.yaw.eval(sender); final SingleShift pitchShift = this.pitch.eval(sender); final float yawShiftVal = (float) yawShift.getShiftValue(); final float pitchShiftVal = (float) pitchShift.getShiftValue(); final EnumSet<EnumFlags> relativeData = EnumSet.noneOf(S08PacketPlayerPosLook.EnumFlags.class); if (targetShift.xRelative()) relativeData.add(S08PacketPlayerPosLook.EnumFlags.X); if (targetShift.yRelative()) relativeData.add(S08PacketPlayerPosLook.EnumFlags.Y); if (targetShift.zRelative()) relativeData.add(S08PacketPlayerPosLook.EnumFlags.Z); if (pitchShift.relative()) relativeData.add(S08PacketPlayerPosLook.EnumFlags.X_ROT); if (yawShift.relative()) relativeData.add(S08PacketPlayerPosLook.EnumFlags.Y_ROT); int successCount = 0; for (final Entity entity : this.getSources(sender)) { if (entity.worldObj == null) continue; final Vec3 targetPos = targetShift.addBase(entity.getPositionVector()); float yaw = (float) MathHelper.wrapAngleTo180_double(yawShift.addBase(entity.rotationYaw)); float pitch = (float) MathHelper.wrapAngleTo180_double(pitchShift.addBase(entity.rotationPitch)); if (pitch > 90.0F || pitch < -90.0F) { pitch = MathHelper.wrapAngleTo180_float(180.0F - pitch); yaw = MathHelper.wrapAngleTo180_float(yaw + 180.0F); } entity.mountEntity((Entity) null); if (entity instanceof EntityPlayerMP) ((EntityPlayerMP) entity).playerNetServerHandler.func_175089_a(targetShiftVal.xCoord, targetShiftVal.yCoord, targetShiftVal.zCoord, yawShiftVal, pitchShiftVal, relativeData); else entity.setLocationAndAngles(targetPos.xCoord, targetPos.yCoord, targetPos.zCoord, yaw, pitch); entity.setRotationYawHead(yaw); ++successCount; CommandUtilities.notifyOperators(sender, "commands.tp.success.coordinates", entity.getName(), targetPos.xCoord, targetPos.yCoord, targetPos.zCoord); } return successCount; } } private static class EntityTarget extends CommandTeleport { private final CommandArg<ICommandSender> target; public EntityTarget(final CommandArg<List<Entity>> sources, final CommandArg<SingleShift> yaw, final CommandArg<SingleShift> pitch, final CommandArg<ICommandSender> commandArg) { super(sources, yaw, pitch); this.target = commandArg; } @Override public Integer eval(final ICommandSender sender) throws CommandException { final ICommandSender target = this.target.eval(sender); final SingleShift yawShift = this.yaw.eval(sender); final SingleShift pitchShift = this.pitch.eval(sender); int successCount = 0; for (final Entity entity : this.getSources(sender)) if (target.getEntityWorld() != entity.worldObj) CommandUtilities.errorMessage(sender, "commands.tp.notSameDimension"); else { entity.mountEntity(null); float yaw = (float) MathHelper.wrapAngleTo180_double(yawShift.addBase(entity.rotationYaw)); float pitch = (float) MathHelper.wrapAngleTo180_double(pitchShift.addBase(entity.rotationPitch)); if (pitch > 90.0F || pitch < -90.0F) { pitch = MathHelper.wrapAngleTo180_float(180.0F - pitch); yaw = MathHelper.wrapAngleTo180_float(yaw + 180.0F); } final Vec3 targetPos = target.getPositionVector(); if (entity instanceof EntityPlayerMP) ((EntityPlayerMP) entity).playerNetServerHandler.setPlayerLocation(targetPos.xCoord, targetPos.yCoord, targetPos.zCoord, yaw, pitch); else entity.setLocationAndAngles(targetPos.xCoord, targetPos.yCoord, targetPos.zCoord, yaw, pitch); entity.setRotationYawHead(yaw); ++successCount; CommandUtilities.notifyOperators(sender, "commands.tp.success", entity.getName(), target.getName()); } return successCount; } } }