mirror of
https://github.com/Grasscutters/Grasscutter.git
synced 2026-05-17 07:02:32 +08:00
Update position parameters to support rotation-based offsets (#2374)
This commit is contained in:
committed by
GitHub
Unverified
parent
047feaf4aa
commit
ff6a51db30
@@ -1,5 +1,7 @@
|
||||
package emu.grasscutter.command;
|
||||
|
||||
import emu.grasscutter.game.world.Position;
|
||||
|
||||
import java.util.*;
|
||||
import java.util.function.BiConsumer;
|
||||
import java.util.regex.*;
|
||||
@@ -65,4 +67,62 @@ public class CommandHelpers {
|
||||
}
|
||||
return current;
|
||||
}
|
||||
|
||||
public static Position parsePosition(String inputX, String inputY, String inputZ, Position curPos, Position curRot) {
|
||||
Position offset = new Position();
|
||||
Position target = new Position(curPos);
|
||||
if (inputX.contains("~")) { // Relative
|
||||
if (!inputX.equals("~")) { // Relative with offset
|
||||
target.addX(Float.parseFloat(inputX.replace("~", "")));
|
||||
}
|
||||
} else if (inputX.contains("^")) {
|
||||
if (!inputX.equals("^")) {
|
||||
offset.setX(Float.parseFloat(inputX.replace("^", "")));
|
||||
}
|
||||
} else { // Absolute
|
||||
target.setX(Float.parseFloat(inputX));
|
||||
}
|
||||
|
||||
if (inputY.contains("~")) { // Relative
|
||||
if (!inputY.equals("~")) { // Relative with offset
|
||||
target.addY(Float.parseFloat(inputY.replace("~", "")));
|
||||
}
|
||||
} else if (inputY.contains("^")) {
|
||||
if (!inputY.equals("^")) {
|
||||
offset.setY(Float.parseFloat(inputY.replace("^", "")));
|
||||
}
|
||||
} else { // Absolute
|
||||
target.setY(Float.parseFloat(inputY));
|
||||
}
|
||||
|
||||
if (inputZ.contains("~")) { // Relative
|
||||
if (!inputZ.equals("~")) { // Relative with offset
|
||||
target.addZ(Float.parseFloat(inputZ.replace("~", "")));
|
||||
}
|
||||
} else if (inputZ.contains("^")) {
|
||||
if (!inputZ.equals("^")) {
|
||||
offset.setZ(Float.parseFloat(inputZ.replace("^", "")));
|
||||
}
|
||||
} else { // Absolute
|
||||
target.setZ(Float.parseFloat(inputZ));
|
||||
}
|
||||
|
||||
if (!offset.equal3d(Position.ZERO)) {
|
||||
return calculateOffset(target, curRot, offset);
|
||||
} else {
|
||||
return target;
|
||||
}
|
||||
}
|
||||
|
||||
public static Position calculateOffset(Position pos, Position rot, Position offset) {
|
||||
// Degrees to radians
|
||||
float angleZ = (float) Math.toRadians(rot.getY());
|
||||
float angleX = (float) Math.toRadians(rot.getY() + 90);
|
||||
|
||||
// Calculate offset based on current position and rotation
|
||||
return new Position(
|
||||
pos.getX() + offset.getZ() * (float)Math.sin(angleZ) + offset.getX() * (float)Math.sin(angleX),
|
||||
pos.getY() + offset.getY(),
|
||||
pos.getZ() + offset.getZ() * (float)Math.cos(angleZ) + offset.getX() * (float)Math.cos(angleX));
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user