313 lines
8.2 KiB
Java
313 lines
8.2 KiB
Java
package com.hypixel.hytale.server.npc.movement;
|
|
|
|
import com.hypixel.hytale.math.vector.Vector3d;
|
|
import javax.annotation.Nonnull;
|
|
import javax.annotation.Nullable;
|
|
|
|
public class Steering {
|
|
public static final Steering NULL = new Steering().clear();
|
|
private final Vector3d translation = new Vector3d();
|
|
private double maxDistance = Double.MAX_VALUE;
|
|
private Vector3d maxDistanceComponentSelector;
|
|
private boolean hasTranslation;
|
|
private float yaw;
|
|
private boolean hasYaw;
|
|
private float pitch;
|
|
private boolean hasPitch;
|
|
private float roll;
|
|
private boolean hasRoll;
|
|
private double relativeTurnSpeed;
|
|
private boolean hasRelativeTurnSpeed;
|
|
|
|
@Nonnull
|
|
public Steering clear() {
|
|
this.clearTranslation();
|
|
this.clearRotation();
|
|
return this;
|
|
}
|
|
|
|
@Nonnull
|
|
public Steering assign(@Nonnull Steering other) {
|
|
this.translation.assign(other.translation);
|
|
this.maxDistance = other.maxDistance;
|
|
this.maxDistanceComponentSelector = other.maxDistanceComponentSelector;
|
|
this.hasTranslation = other.hasTranslation;
|
|
this.yaw = other.yaw;
|
|
this.hasYaw = other.hasYaw;
|
|
this.pitch = other.pitch;
|
|
this.hasPitch = other.hasPitch;
|
|
this.relativeTurnSpeed = other.relativeTurnSpeed;
|
|
this.hasRelativeTurnSpeed = other.hasRelativeTurnSpeed;
|
|
return this;
|
|
}
|
|
|
|
@Override
|
|
public boolean equals(@Nullable Object o) {
|
|
if (this == o) {
|
|
return true;
|
|
} else if (o != null && this.getClass() == o.getClass()) {
|
|
Steering steering = (Steering)o;
|
|
if (Double.compare(steering.maxDistance, this.maxDistance) != 0) {
|
|
return false;
|
|
} else if (this.hasTranslation != steering.hasTranslation) {
|
|
return false;
|
|
} else if (Float.compare(steering.yaw, this.yaw) != 0) {
|
|
return false;
|
|
} else if (this.hasYaw != steering.hasYaw) {
|
|
return false;
|
|
} else if (Float.compare(steering.pitch, this.pitch) != 0) {
|
|
return false;
|
|
} else if (this.hasPitch != steering.hasPitch) {
|
|
return false;
|
|
} else if (Float.compare(steering.roll, this.roll) != 0) {
|
|
return false;
|
|
} else if (this.hasRoll != steering.hasRoll) {
|
|
return false;
|
|
} else if (!this.translation.equals(steering.translation)) {
|
|
return false;
|
|
} else if (Double.compare(steering.relativeTurnSpeed, this.relativeTurnSpeed) != 0) {
|
|
return false;
|
|
} else {
|
|
return this.hasRelativeTurnSpeed != steering.hasRelativeTurnSpeed
|
|
? false
|
|
: this.maxDistanceComponentSelector.equals(steering.maxDistanceComponentSelector);
|
|
}
|
|
} else {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public int hashCode() {
|
|
int result = this.translation.hashCode();
|
|
long temp = Double.doubleToLongBits(this.maxDistance);
|
|
result = 31 * result + (int)(temp ^ temp >>> 32);
|
|
result = 31 * result + this.maxDistanceComponentSelector.hashCode();
|
|
result = 31 * result + (this.hasTranslation ? 1 : 0);
|
|
result = 31 * result + (this.yaw != 0.0F ? Float.floatToIntBits(this.yaw) : 0);
|
|
result = 31 * result + (this.hasYaw ? 1 : 0);
|
|
result = 31 * result + (this.pitch != 0.0F ? Float.floatToIntBits(this.pitch) : 0);
|
|
result = 31 * result + (this.hasPitch ? 1 : 0);
|
|
result = 31 * result + (this.roll != 0.0F ? Float.floatToIntBits(this.roll) : 0);
|
|
return 31 * result + (this.hasRoll ? 1 : 0);
|
|
}
|
|
|
|
@Nonnull
|
|
public Steering clearTranslation() {
|
|
this.translation.assign(Vector3d.ZERO);
|
|
this.maxDistance = Double.MAX_VALUE;
|
|
this.hasTranslation = false;
|
|
return this;
|
|
}
|
|
|
|
@Nonnull
|
|
public Steering clearRotation() {
|
|
this.yaw = 0.0F;
|
|
this.hasYaw = false;
|
|
this.pitch = 0.0F;
|
|
this.hasPitch = false;
|
|
this.relativeTurnSpeed = 0.0;
|
|
this.hasRelativeTurnSpeed = false;
|
|
return this;
|
|
}
|
|
|
|
@Nonnull
|
|
public Vector3d getTranslation() {
|
|
return this.translation;
|
|
}
|
|
|
|
public double getX() {
|
|
return this.translation.x;
|
|
}
|
|
|
|
@Nonnull
|
|
public Steering setX(double value) {
|
|
this.hasTranslation = true;
|
|
this.translation.x = value;
|
|
return this;
|
|
}
|
|
|
|
public double getY() {
|
|
return this.translation.y;
|
|
}
|
|
|
|
@Nonnull
|
|
public Steering setY(double value) {
|
|
this.hasTranslation = true;
|
|
this.translation.y = value;
|
|
return this;
|
|
}
|
|
|
|
public double getZ() {
|
|
return this.translation.z;
|
|
}
|
|
|
|
@Nonnull
|
|
public Steering setZ(double value) {
|
|
this.hasTranslation = true;
|
|
this.translation.z = value;
|
|
return this;
|
|
}
|
|
|
|
@Nonnull
|
|
public Steering setTranslation(@Nonnull Vector3d translation) {
|
|
this.hasTranslation = true;
|
|
this.translation.assign(translation);
|
|
return this;
|
|
}
|
|
|
|
@Nonnull
|
|
public Steering setTranslation(double x, double y, double z) {
|
|
this.hasTranslation = true;
|
|
this.translation.assign(x, y, z);
|
|
return this;
|
|
}
|
|
|
|
@Nonnull
|
|
public Steering setTranslationRelativeSpeed(double relativeSpeed) {
|
|
this.translation.setLength(relativeSpeed);
|
|
return this;
|
|
}
|
|
|
|
@Nonnull
|
|
public Steering scaleTranslation(double speedFactor) {
|
|
this.translation.scale(speedFactor);
|
|
return this;
|
|
}
|
|
|
|
@Nonnull
|
|
public Steering ensureMinTranslation(double relativeSpeed) {
|
|
if (this.translation.squaredLength() < relativeSpeed * relativeSpeed && this.translation.squaredLength() > 0.0) {
|
|
this.translation.setLength(relativeSpeed);
|
|
}
|
|
|
|
return this;
|
|
}
|
|
|
|
public double getMaxDistance() {
|
|
return this.maxDistance;
|
|
}
|
|
|
|
public void setMaxDistance(double maxDistance) {
|
|
this.maxDistance = maxDistance;
|
|
}
|
|
|
|
public void clearMaxDistance() {
|
|
this.setMaxDistance(Double.MAX_VALUE);
|
|
}
|
|
|
|
public Vector3d getMaxDistanceComponentSelector() {
|
|
return this.maxDistanceComponentSelector;
|
|
}
|
|
|
|
public void setMaxDistanceComponentSelector(Vector3d maxDistanceComponentSelector) {
|
|
this.maxDistanceComponentSelector = maxDistanceComponentSelector;
|
|
}
|
|
|
|
public void clearMaxDistanceComponentSelector() {
|
|
this.setMaxDistanceComponentSelector(null);
|
|
}
|
|
|
|
public float getYaw() {
|
|
return this.yaw;
|
|
}
|
|
|
|
@Nonnull
|
|
public Steering setYaw(float angle) {
|
|
this.yaw = angle;
|
|
this.hasYaw = true;
|
|
return this;
|
|
}
|
|
|
|
public void clearYaw() {
|
|
this.hasYaw = false;
|
|
}
|
|
|
|
public float getPitch() {
|
|
return this.pitch;
|
|
}
|
|
|
|
@Nonnull
|
|
public Steering setPitch(float angle) {
|
|
this.pitch = angle;
|
|
this.hasPitch = true;
|
|
return this;
|
|
}
|
|
|
|
public void clearPitch() {
|
|
this.hasPitch = false;
|
|
}
|
|
|
|
public float getRoll() {
|
|
return this.roll;
|
|
}
|
|
|
|
@Nonnull
|
|
public Steering setRoll(float angle) {
|
|
this.roll = angle;
|
|
this.hasRoll = true;
|
|
return this;
|
|
}
|
|
|
|
public void clearRoll() {
|
|
this.hasRoll = false;
|
|
}
|
|
|
|
@Nonnull
|
|
public Steering setRelativeTurnSpeed(double relativeTurnSpeed) {
|
|
this.relativeTurnSpeed = relativeTurnSpeed;
|
|
this.hasRelativeTurnSpeed = true;
|
|
return this;
|
|
}
|
|
|
|
public boolean hasTranslation() {
|
|
return this.hasTranslation;
|
|
}
|
|
|
|
public boolean hasYaw() {
|
|
return this.hasYaw;
|
|
}
|
|
|
|
public boolean hasPitch() {
|
|
return this.hasPitch;
|
|
}
|
|
|
|
public boolean hasRoll() {
|
|
return this.hasRoll;
|
|
}
|
|
|
|
public double getSpeed() {
|
|
return !this.hasTranslation() ? 0.0 : this.translation.length();
|
|
}
|
|
|
|
public double getRelativeTurnSpeed() {
|
|
return !this.hasRelativeTurnSpeed ? 1.0 : this.relativeTurnSpeed;
|
|
}
|
|
|
|
@Nonnull
|
|
@Override
|
|
public String toString() {
|
|
return "Steering{translation="
|
|
+ this.translation
|
|
+ ", hasTranslation="
|
|
+ this.hasTranslation
|
|
+ ", yaw="
|
|
+ this.yaw
|
|
+ ", hasYaw="
|
|
+ this.hasYaw
|
|
+ ", pitch="
|
|
+ this.pitch
|
|
+ ", hasPitch="
|
|
+ this.hasPitch
|
|
+ ", roll="
|
|
+ this.roll
|
|
+ ", hasRoll="
|
|
+ this.hasRoll
|
|
+ ", relativeTurnSpeed="
|
|
+ this.relativeTurnSpeed
|
|
+ ", hasRelativeTurnSpeed="
|
|
+ this.hasRelativeTurnSpeed
|
|
+ "}";
|
|
}
|
|
}
|