2022-04-17 20:43:07 +08:00
|
|
|
package emu.grasscutter.utils;
|
|
|
|
|
|
|
|
import java.io.Serializable;
|
|
|
|
|
2022-04-22 10:19:47 +08:00
|
|
|
import dev.morphia.annotations.Entity;
|
2022-04-17 20:43:07 +08:00
|
|
|
import emu.grasscutter.net.proto.VectorOuterClass.Vector;
|
|
|
|
|
2022-04-22 10:19:47 +08:00
|
|
|
@Entity
|
2022-04-17 20:43:07 +08:00
|
|
|
public class Position implements Serializable {
|
|
|
|
private static final long serialVersionUID = -2001232313615923575L;
|
|
|
|
|
|
|
|
private float x;
|
|
|
|
private float y;
|
|
|
|
private float z;
|
|
|
|
|
|
|
|
public Position() {
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
public Position(float x, float y) {
|
|
|
|
set(x, y);
|
|
|
|
}
|
|
|
|
|
|
|
|
public Position(float x, float y, float z) {
|
|
|
|
set(x, y, z);
|
|
|
|
}
|
|
|
|
|
|
|
|
public Position(String p) {
|
|
|
|
String[] split = p.split(",");
|
|
|
|
if (split.length >= 2) {
|
|
|
|
this.x = Float.parseFloat(split[0]);
|
|
|
|
this.y = Float.parseFloat(split[1]);
|
|
|
|
}
|
|
|
|
if (split.length >= 3) {
|
|
|
|
this.z = Float.parseFloat(split[2]);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public Position(Vector vector) {
|
|
|
|
this.set(vector);
|
|
|
|
}
|
|
|
|
|
|
|
|
public Position(Position pos) {
|
|
|
|
this.set(pos);
|
|
|
|
}
|
|
|
|
|
|
|
|
public float getX() {
|
|
|
|
return x;
|
|
|
|
}
|
|
|
|
|
|
|
|
public void setX(float x) {
|
|
|
|
this.x = x;
|
|
|
|
}
|
|
|
|
|
|
|
|
public float getZ() {
|
|
|
|
return z;
|
|
|
|
}
|
|
|
|
|
|
|
|
public void setZ(float z) {
|
|
|
|
this.z = z;
|
|
|
|
}
|
|
|
|
|
|
|
|
public float getY() {
|
|
|
|
return y;
|
|
|
|
}
|
|
|
|
|
|
|
|
public void setY(float y) {
|
|
|
|
this.y = y;
|
|
|
|
}
|
|
|
|
|
|
|
|
public Position set(float x, float y) {
|
|
|
|
this.x = x;
|
|
|
|
this.y = y;
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Deep copy
|
|
|
|
public Position set(Position pos) {
|
|
|
|
return this.set(pos.getX(), pos.getY(), pos.getZ());
|
|
|
|
}
|
|
|
|
|
|
|
|
public Position set(Vector pos) {
|
|
|
|
return this.set(pos.getX(), pos.getY(), pos.getZ());
|
|
|
|
}
|
|
|
|
|
|
|
|
public Position set(float x, float y, float z) {
|
|
|
|
this.x = x;
|
|
|
|
this.y = y;
|
|
|
|
this.z = z;
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
|
|
|
|
public Position add(Position add) {
|
|
|
|
this.x += add.getX();
|
|
|
|
this.y += add.getY();
|
|
|
|
this.z += add.getZ();
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
|
|
|
|
public Position addX(float d) {
|
|
|
|
this.x += d;
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
|
|
|
|
public Position addY(float d) {
|
|
|
|
this.y += d;
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
|
|
|
|
public Position addZ(float d) {
|
|
|
|
this.z += d;
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
|
|
|
|
public Position subtract(Position sub) {
|
|
|
|
this.x -= sub.getX();
|
|
|
|
this.y -= sub.getY();
|
|
|
|
this.z -= sub.getZ();
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
|
|
|
|
/** In radians
|
|
|
|
* */
|
|
|
|
public Position translate(float dist, float angle) {
|
|
|
|
this.x += dist * Math.sin(angle);
|
|
|
|
this.y += dist * Math.cos(angle);
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
|
|
|
|
public boolean equal2d(Position other) {
|
|
|
|
return getX() == other.getX() && getY() == other.getY();
|
|
|
|
}
|
|
|
|
|
|
|
|
public Position translateWithDegrees(float dist, float angle) {
|
|
|
|
angle = (float) Math.toRadians(angle);
|
|
|
|
this.x += dist * Math.sin(angle);
|
|
|
|
this.y += -dist * Math.cos(angle);
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public Position clone() {
|
|
|
|
return new Position(x, y, z);
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public String toString() {
|
|
|
|
return "(" + this.getX() + ", " + this.getY() + ", " + this.getZ() + ")";
|
|
|
|
}
|
|
|
|
|
|
|
|
public Vector toProto() {
|
|
|
|
return Vector.newBuilder()
|
|
|
|
.setX(this.getX())
|
|
|
|
.setY(this.getY())
|
|
|
|
.setZ(this.getZ())
|
|
|
|
.build();
|
|
|
|
}
|
|
|
|
}
|