107 lines
		
	
	
	
		
			3.3 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
			
		
		
	
	
			107 lines
		
	
	
	
		
			3.3 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
| package net.minecraft.commands.arguments.coordinates;
 | |
| 
 | |
| import com.mojang.brigadier.StringReader;
 | |
| import com.mojang.brigadier.exceptions.CommandSyntaxException;
 | |
| import java.util.Objects;
 | |
| import net.minecraft.commands.CommandSourceStack;
 | |
| import net.minecraft.util.Mth;
 | |
| import net.minecraft.world.phys.Vec2;
 | |
| import net.minecraft.world.phys.Vec3;
 | |
| 
 | |
| public class LocalCoordinates implements Coordinates {
 | |
| 	public static final char PREFIX_LOCAL_COORDINATE = '^';
 | |
| 	private final double left;
 | |
| 	private final double up;
 | |
| 	private final double forwards;
 | |
| 
 | |
| 	public LocalCoordinates(double left, double up, double forwards) {
 | |
| 		this.left = left;
 | |
| 		this.up = up;
 | |
| 		this.forwards = forwards;
 | |
| 	}
 | |
| 
 | |
| 	@Override
 | |
| 	public Vec3 getPosition(CommandSourceStack source) {
 | |
| 		Vec2 vec2 = source.getRotation();
 | |
| 		Vec3 vec3 = source.getAnchor().apply(source);
 | |
| 		float f = Mth.cos((vec2.y + 90.0F) * (float) (Math.PI / 180.0));
 | |
| 		float g = Mth.sin((vec2.y + 90.0F) * (float) (Math.PI / 180.0));
 | |
| 		float h = Mth.cos(-vec2.x * (float) (Math.PI / 180.0));
 | |
| 		float i = Mth.sin(-vec2.x * (float) (Math.PI / 180.0));
 | |
| 		float j = Mth.cos((-vec2.x + 90.0F) * (float) (Math.PI / 180.0));
 | |
| 		float k = Mth.sin((-vec2.x + 90.0F) * (float) (Math.PI / 180.0));
 | |
| 		Vec3 vec32 = new Vec3(f * h, i, g * h);
 | |
| 		Vec3 vec33 = new Vec3(f * j, k, g * j);
 | |
| 		Vec3 vec34 = vec32.cross(vec33).scale(-1.0);
 | |
| 		double d = vec32.x * this.forwards + vec33.x * this.up + vec34.x * this.left;
 | |
| 		double e = vec32.y * this.forwards + vec33.y * this.up + vec34.y * this.left;
 | |
| 		double l = vec32.z * this.forwards + vec33.z * this.up + vec34.z * this.left;
 | |
| 		return new Vec3(vec3.x + d, vec3.y + e, vec3.z + l);
 | |
| 	}
 | |
| 
 | |
| 	@Override
 | |
| 	public Vec2 getRotation(CommandSourceStack source) {
 | |
| 		return Vec2.ZERO;
 | |
| 	}
 | |
| 
 | |
| 	@Override
 | |
| 	public boolean isXRelative() {
 | |
| 		return true;
 | |
| 	}
 | |
| 
 | |
| 	@Override
 | |
| 	public boolean isYRelative() {
 | |
| 		return true;
 | |
| 	}
 | |
| 
 | |
| 	@Override
 | |
| 	public boolean isZRelative() {
 | |
| 		return true;
 | |
| 	}
 | |
| 
 | |
| 	public static LocalCoordinates parse(StringReader reader) throws CommandSyntaxException {
 | |
| 		int i = reader.getCursor();
 | |
| 		double d = readDouble(reader, i);
 | |
| 		if (reader.canRead() && reader.peek() == ' ') {
 | |
| 			reader.skip();
 | |
| 			double e = readDouble(reader, i);
 | |
| 			if (reader.canRead() && reader.peek() == ' ') {
 | |
| 				reader.skip();
 | |
| 				double f = readDouble(reader, i);
 | |
| 				return new LocalCoordinates(d, e, f);
 | |
| 			} else {
 | |
| 				reader.setCursor(i);
 | |
| 				throw Vec3Argument.ERROR_NOT_COMPLETE.createWithContext(reader);
 | |
| 			}
 | |
| 		} else {
 | |
| 			reader.setCursor(i);
 | |
| 			throw Vec3Argument.ERROR_NOT_COMPLETE.createWithContext(reader);
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	private static double readDouble(StringReader reader, int start) throws CommandSyntaxException {
 | |
| 		if (!reader.canRead()) {
 | |
| 			throw WorldCoordinate.ERROR_EXPECTED_DOUBLE.createWithContext(reader);
 | |
| 		} else if (reader.peek() != '^') {
 | |
| 			reader.setCursor(start);
 | |
| 			throw Vec3Argument.ERROR_MIXED_TYPE.createWithContext(reader);
 | |
| 		} else {
 | |
| 			reader.skip();
 | |
| 			return reader.canRead() && reader.peek() != ' ' ? reader.readDouble() : 0.0;
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	public boolean equals(Object object) {
 | |
| 		if (this == object) {
 | |
| 			return true;
 | |
| 		} else {
 | |
| 			return !(object instanceof LocalCoordinates localCoordinates)
 | |
| 				? false
 | |
| 				: this.left == localCoordinates.left && this.up == localCoordinates.up && this.forwards == localCoordinates.forwards;
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	public int hashCode() {
 | |
| 		return Objects.hash(new Object[]{this.left, this.up, this.forwards});
 | |
| 	}
 | |
| }
 |