Skip to content

Commit e8bd7f5

Browse files
committed
Fix Waypoint Compass
1 parent 6d82a1f commit e8bd7f5

5 files changed

Lines changed: 31 additions & 8 deletions

File tree

common/src/main/java/com/mamiyaotaru/voxelmap/Map.java

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -575,8 +575,8 @@ private void drawWaypointCompass(GuiGraphicsExtractor graphics) {
575575
double playerX = minecraft.player.getX();
576576
double playerY = minecraft.player.getY();
577577
double playerZ = minecraft.player.getZ();
578-
float playerYaw = minecraft.player.getYRot();
579578
int maxDistance = options.waypointCompassIconRange;
579+
ArrayList<CompassWaypoint> compassWaypoints = new ArrayList<>();
580580

581581
for (Waypoint waypoint : waypointManager.getWaypoints()) {
582582
if (!waypoint.isActive()) {
@@ -590,29 +590,43 @@ private void drawWaypointCompass(GuiGraphicsExtractor graphics) {
590590
continue;
591591
}
592592

593-
float targetYaw = (float) Math.toDegrees(Math.atan2(dz, dx)) - 90.0F;
594-
float deltaYaw = Mth.wrapDegrees(targetYaw - playerYaw);
593+
double wayX = playerX - waypoint.getXInCurrentDimension() - 0.5D;
594+
double wayZ = playerZ - waypoint.getZInCurrentDimension() - 0.5D;
595+
float deltaYaw = Mth.wrapDegrees((float) Math.toDegrees(Math.atan2(wayX, wayZ)) + this.direction);
595596
if (Math.abs(deltaYaw) > 90.0F) {
596597
continue;
597598
}
598599

599-
int x = centerX + Math.round(deltaYaw / 90.0F * (barWidth / 2.0F));
600-
int distance = (int) Math.sqrt(distanceSq);
600+
compassWaypoints.add(new CompassWaypoint(waypoint, deltaYaw, (int) Math.sqrt(distanceSq)));
601+
}
602+
603+
compassWaypoints.sort((first, second) -> {
604+
int angleCompare = Float.compare(Math.abs(first.deltaYaw()), Math.abs(second.deltaYaw()));
605+
return angleCompare != 0 ? angleCompare : Integer.compare(first.distance(), second.distance());
606+
});
607+
608+
int maxRendered = Mth.clamp(options.waypointCompassMaxWaypoints, 1, 64);
609+
for (CompassWaypoint compassWaypoint : compassWaypoints) {
610+
Waypoint waypoint = compassWaypoint.waypoint();
611+
int x = centerX - Math.round(compassWaypoint.deltaYaw() / 90.0F * (barWidth / 2.0F));
601612
String label = waypoint.name;
602-
String distanceLabel = distance + "m";
613+
String distanceLabel = compassWaypoint.distance() + "m";
603614
int textWidth = minecraft.font.width(label);
604615
int textX = Mth.clamp(x, barLeft + textWidth / 2 + 2, barRight - textWidth / 2 - 2);
605616
int color = withOpacity(waypoint.getUnifiedColor(), options.waypointCompassTextOpacity);
606617
drawCompassText(graphics, "♦", x, barY + 6, color, false);
607618
drawCompassText(graphics, label, textX, barY + 22, color, true);
608619
drawCompassText(graphics, distanceLabel, textX, barY + 32, color, true);
609620

610-
if (++rendered >= 8) {
621+
if (++rendered >= maxRendered) {
611622
break;
612623
}
613624
}
614625
}
615626

627+
private record CompassWaypoint(Waypoint waypoint, float deltaYaw, int distance) {
628+
}
629+
616630
private double playerX() {
617631
return minecraft.player == null ? 0.0D : minecraft.player.getX();
618632
}

common/src/main/java/com/mamiyaotaru/voxelmap/MapSettingsManager.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,7 @@ public class MapSettingsManager implements ISettingsManager {
9292
public boolean waypointCompassShowCoords = true;
9393
public boolean waypointCompassTextOutline = true;
9494
public int waypointCompassIconRange = -1;
95+
public int waypointCompassMaxWaypoints = 8;
9596
public int waypointCompassX = 50;
9697
public int waypointCompassY = 3;
9798
public int waypointCompassTextOpacity = 100;
@@ -222,6 +223,7 @@ public void loadAll() {
222223
case "Waypoint Compass Show Coords" -> waypointCompassShowCoords = Boolean.parseBoolean(curLine[1]);
223224
case "Waypoint Compass Text Outline" -> waypointCompassTextOutline = Boolean.parseBoolean(curLine[1]);
224225
case "Waypoint Compass Icon Range" -> waypointCompassIconRange = Mth.clamp(Integer.parseInt(curLine[1]), -1, 10000);
226+
case "Waypoint Compass Max Waypoints" -> waypointCompassMaxWaypoints = Mth.clamp(Integer.parseInt(curLine[1]), 1, 64);
225227
case "Waypoint Compass X" -> waypointCompassX = Mth.clamp(Integer.parseInt(curLine[1]), 0, 100);
226228
case "Waypoint Compass Y" -> waypointCompassY = Mth.clamp(Integer.parseInt(curLine[1]), 0, 40);
227229
case "Waypoint Compass Text Opacity" -> waypointCompassTextOpacity = Mth.clamp(Integer.parseInt(curLine[1]), 0, 100);
@@ -332,6 +334,7 @@ public void saveAll() {
332334
out.println("Waypoint Compass Show Coords:" + waypointCompassShowCoords);
333335
out.println("Waypoint Compass Text Outline:" + waypointCompassTextOutline);
334336
out.println("Waypoint Compass Icon Range:" + waypointCompassIconRange);
337+
out.println("Waypoint Compass Max Waypoints:" + waypointCompassMaxWaypoints);
335338
out.println("Waypoint Compass X:" + waypointCompassX);
336339
out.println("Waypoint Compass Y:" + waypointCompassY);
337340
out.println("Waypoint Compass Text Opacity:" + waypointCompassTextOpacity);
@@ -402,6 +405,7 @@ public String getKeyText(EnumOptionsMinimap option) {
402405
case WAYPOINT_DISTANCE -> s + (value < 0.0F ? I18n.get("options.minimap.waypoints.infinite") : (int) value);
403406
case WAYPOINT_SIGN_SCALE -> s + String.format("%.2fx", value);
404407
case WAYPOINT_COMPASS_ICON_RANGE -> s + (value < 0.0F ? I18n.get("options.minimap.waypoints.infinite") : (int) value);
408+
case WAYPOINT_COMPASS_MAX_WAYPOINTS -> s + (int) value;
405409
case WAYPOINT_COMPASS_X, WAYPOINT_COMPASS_Y, WAYPOINT_COMPASS_TEXT_OPACITY, WAYPOINT_COMPASS_OUTLINE_OPACITY, WAYPOINT_COMPASS_BACKGROUND_OPACITY -> s + (int) value;
406410

407411
default -> s + (value <= 0.0F ? I18n.get("options.off") : (int) value + "%");
@@ -650,6 +654,7 @@ public float getFloatValue(EnumOptionsMinimap option) {
650654
case WAYPOINT_DISTANCE -> maxWaypointDisplayDistance;
651655
case WAYPOINT_SIGN_SCALE -> waypointSignScale;
652656
case WAYPOINT_COMPASS_ICON_RANGE -> waypointCompassIconRange;
657+
case WAYPOINT_COMPASS_MAX_WAYPOINTS -> waypointCompassMaxWaypoints;
653658
case WAYPOINT_COMPASS_X -> waypointCompassX;
654659
case WAYPOINT_COMPASS_Y -> waypointCompassY;
655660
case WAYPOINT_COMPASS_TEXT_OPACITY -> waypointCompassTextOpacity;
@@ -684,6 +689,7 @@ public void setFloatValue(EnumOptionsMinimap option, float value) {
684689
float distance = Mth.lerp(value, 100.0F, 10001.0F);
685690
waypointCompassIconRange = distance > 10000.0F ? -1 : (int) distance;
686691
}
692+
case WAYPOINT_COMPASS_MAX_WAYPOINTS -> waypointCompassMaxWaypoints = Mth.clamp(Math.round(Mth.lerp(value, 1.0F, 64.0F)), 1, 64);
687693
case WAYPOINT_COMPASS_X -> waypointCompassX = Mth.clamp(Math.round(value * 100.0F), 0, 100);
688694
case WAYPOINT_COMPASS_Y -> waypointCompassY = Mth.clamp(Math.round(value * 40.0F), 0, 40);
689695
case WAYPOINT_COMPASS_TEXT_OPACITY -> waypointCompassTextOpacity = Mth.clamp(Math.round(value * 100.0F), 0, 100);

common/src/main/java/com/mamiyaotaru/voxelmap/gui/GuiWaypointsOptions.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717

1818
public class GuiWaypointsOptions extends GuiScreenMinimap {
1919
private static final EnumOptionsMinimap[] WAYPOINT_OPTIONS = { EnumOptionsMinimap.WAYPOINT_DISTANCE, EnumOptionsMinimap.WAYPOINT_SIGN_SCALE, EnumOptionsMinimap.WAYPOINT_BEACONS, EnumOptionsMinimap.AUTO_PORTAL_WAYPOINTS, EnumOptionsMinimap.CONFIRM_WAYPOINT_DELETE, EnumOptionsMinimap.DEATHPOINTS, EnumOptionsMinimap.WAYPOINT_DISTANCE_UNIT_CONVERSION, EnumOptionsMinimap.SHOW_IN_GAME_WAYPOINT_NAMES, EnumOptionsMinimap.SHOW_IN_GAME_WAYPOINT_DISTANCES };
20-
private static final EnumOptionsMinimap[] COMPASS_OPTIONS = { EnumOptionsMinimap.WAYPOINT_COMPASS, EnumOptionsMinimap.WAYPOINT_COMPASS_SHOW_COORDS, EnumOptionsMinimap.WAYPOINT_COMPASS_TEXT_OUTLINE, EnumOptionsMinimap.WAYPOINT_COMPASS_ICON_RANGE, EnumOptionsMinimap.WAYPOINT_COMPASS_X, EnumOptionsMinimap.WAYPOINT_COMPASS_Y, EnumOptionsMinimap.WAYPOINT_COMPASS_TEXT_OPACITY, EnumOptionsMinimap.WAYPOINT_COMPASS_OUTLINE_OPACITY, EnumOptionsMinimap.WAYPOINT_COMPASS_BACKGROUND_OPACITY };
20+
private static final EnumOptionsMinimap[] COMPASS_OPTIONS = { EnumOptionsMinimap.WAYPOINT_COMPASS, EnumOptionsMinimap.WAYPOINT_COMPASS_SHOW_COORDS, EnumOptionsMinimap.WAYPOINT_COMPASS_TEXT_OUTLINE, EnumOptionsMinimap.WAYPOINT_COMPASS_ICON_RANGE, EnumOptionsMinimap.WAYPOINT_COMPASS_MAX_WAYPOINTS, EnumOptionsMinimap.WAYPOINT_COMPASS_X, EnumOptionsMinimap.WAYPOINT_COMPASS_Y, EnumOptionsMinimap.WAYPOINT_COMPASS_TEXT_OPACITY, EnumOptionsMinimap.WAYPOINT_COMPASS_OUTLINE_OPACITY, EnumOptionsMinimap.WAYPOINT_COMPASS_BACKGROUND_OPACITY };
2121
private final MapSettingsManager options;
2222
private final List<SectionHeader> sectionHeaders = new ArrayList<>();
2323
protected Component screenTitle;
@@ -65,6 +65,7 @@ private int addSection(String title, EnumOptionsMinimap[] sectionOptions, int st
6565
}
6666
value = (value - 100.0F) / 9901.0F;
6767
}
68+
case WAYPOINT_COMPASS_MAX_WAYPOINTS -> value = (value - 1.0F) / 63.0F;
6869
case WAYPOINT_COMPASS_X, WAYPOINT_COMPASS_TEXT_OPACITY, WAYPOINT_COMPASS_OUTLINE_OPACITY, WAYPOINT_COMPASS_BACKGROUND_OPACITY -> value = value / 100.0F;
6970
case WAYPOINT_COMPASS_Y -> value = value / 40.0F;
7071
}

common/src/main/java/com/mamiyaotaru/voxelmap/gui/overridden/EnumOptionsMinimap.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ public enum EnumOptionsMinimap {
4444
WAYPOINT_COMPASS_SHOW_COORDS("options.minimap.waypoints.compassShowCoords", Type.BOOLEAN),
4545
WAYPOINT_COMPASS_TEXT_OUTLINE("options.minimap.waypoints.compassTextOutline", Type.BOOLEAN),
4646
WAYPOINT_COMPASS_ICON_RANGE("options.minimap.waypoints.compassIconRange", Type.FLOAT),
47+
WAYPOINT_COMPASS_MAX_WAYPOINTS("options.minimap.waypoints.compassMaxWaypoints", Type.FLOAT),
4748
WAYPOINT_COMPASS_X("options.minimap.waypoints.compassX", Type.FLOAT),
4849
WAYPOINT_COMPASS_Y("options.minimap.waypoints.compassY", Type.FLOAT),
4950
WAYPOINT_COMPASS_TEXT_OPACITY("options.minimap.waypoints.compassTextOpacity", Type.FLOAT),

common/src/main/resources/assets/voxelmap/lang/en_us.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,7 @@
113113
"options.minimap.waypoints.compassShowCoords": "Compass XYZ",
114114
"options.minimap.waypoints.compassTextOutline": "Compass Text Outline",
115115
"options.minimap.waypoints.compassIconRange": "Compass Icon Range",
116+
"options.minimap.waypoints.compassMaxWaypoints": "Compass Max Waypoints",
116117
"options.minimap.waypoints.compassX": "Compass X",
117118
"options.minimap.waypoints.compassY": "Compass Y",
118119
"options.minimap.waypoints.compassTextOpacity": "Compass Text Alpha",

0 commit comments

Comments
 (0)