/** * (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 { 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 getConverter() { return Converters.ignoreNull(new EquivalentConverter() { @Override public Class 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 modifier = new StructureModifier(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); } }); } }