2022-12-07 19:52:09 +01:00
|
|
|
/**
|
|
|
|
* (c) 2016 dmulloy2
|
|
|
|
*/
|
|
|
|
package com.comphenix.protocol.wrappers;
|
|
|
|
|
|
|
|
import com.comphenix.protocol.reflect.EquivalentConverter;
|
|
|
|
import com.comphenix.protocol.reflect.StructureModifier;
|
|
|
|
import com.comphenix.protocol.utility.MinecraftReflection;
|
|
|
|
|
|
|
|
import java.lang.reflect.Constructor;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @author dmulloy2
|
|
|
|
*/
|
|
|
|
public class Vector3F {
|
2023-05-12 16:35:34 +02:00
|
|
|
protected float x;
|
|
|
|
protected float y;
|
|
|
|
protected float z;
|
|
|
|
|
|
|
|
public Vector3F() {
|
|
|
|
this(0, 0, 0);
|
|
|
|
}
|
|
|
|
|
|
|
|
public Vector3F(float x, float y, float z) {
|
|
|
|
this.x = x;
|
|
|
|
this.y = y;
|
|
|
|
this.z = z;
|
|
|
|
}
|
|
|
|
|
|
|
|
public float getX() {
|
|
|
|
return x;
|
|
|
|
}
|
|
|
|
|
|
|
|
public Vector3F setX(float x) {
|
|
|
|
this.x = x;
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
|
|
|
|
public float getY() {
|
|
|
|
return y;
|
|
|
|
}
|
|
|
|
|
|
|
|
public Vector3F setY(float y) {
|
|
|
|
this.y = y;
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
|
|
|
|
public float getZ() {
|
|
|
|
return z;
|
|
|
|
}
|
|
|
|
|
|
|
|
public Vector3F setZ(float z) {
|
|
|
|
this.z = z;
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public int hashCode() {
|
|
|
|
final int prime = 31;
|
|
|
|
int result = 1;
|
|
|
|
result = prime * result + Float.floatToIntBits(x);
|
|
|
|
result = prime * result + Float.floatToIntBits(y);
|
|
|
|
result = prime * result + Float.floatToIntBits(z);
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public boolean equals(Object obj) {
|
|
|
|
if (this == obj) return true;
|
|
|
|
|
|
|
|
if (obj instanceof Vector3F) {
|
|
|
|
Vector3F that = (Vector3F) obj;
|
|
|
|
if (Float.floatToIntBits(x) != Float.floatToIntBits(that.x))
|
|
|
|
return false;
|
|
|
|
if (Float.floatToIntBits(y) != Float.floatToIntBits(that.y))
|
|
|
|
return false;
|
|
|
|
if (Float.floatToIntBits(z) != Float.floatToIntBits(that.z))
|
|
|
|
return false;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
private static Constructor<?> constructor = null;
|
|
|
|
private static final Class<?> NMS_CLASS = MinecraftReflection.getNullableNMS("core.Vector3f", "core.Rotations", "Vector3f");
|
|
|
|
|
|
|
|
public static Class<?> getMinecraftClass() {
|
|
|
|
return NMS_CLASS;
|
|
|
|
}
|
|
|
|
|
|
|
|
public static EquivalentConverter<Vector3F> getConverter() {
|
|
|
|
return Converters.ignoreNull(new EquivalentConverter<Vector3F>() {
|
|
|
|
@Override
|
|
|
|
public Class<Vector3F> getSpecificType() {
|
|
|
|
return Vector3F.class;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public Object getGeneric(Vector3F specific) {
|
|
|
|
if (constructor == null) {
|
|
|
|
try {
|
|
|
|
constructor = NMS_CLASS.getConstructor(float.class, float.class, float.class);
|
|
|
|
} catch (ReflectiveOperationException ex) {
|
|
|
|
throw new RuntimeException("Failed to find constructor for Vector3f", ex);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
try {
|
|
|
|
return constructor.newInstance(specific.x, specific.y, specific.z);
|
|
|
|
} catch (ReflectiveOperationException ex) {
|
|
|
|
throw new RuntimeException("Failed to create new instance of Vector3f", ex);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public Vector3F getSpecific(Object generic) {
|
|
|
|
StructureModifier<Float> modifier = new StructureModifier<Float>(generic.getClass())
|
|
|
|
.withTarget(generic).withType(float.class);
|
|
|
|
float x = modifier.read(0);
|
|
|
|
float y = modifier.read(1);
|
|
|
|
float z = modifier.read(2);
|
|
|
|
return new Vector3F(x, y, z);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
2016-07-06 21:47:24 +02:00
|
|
|
}
|