aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/de/hysky/skyblocker/utils/waypoint
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/de/hysky/skyblocker/utils/waypoint')
-rw-r--r--src/main/java/de/hysky/skyblocker/utils/waypoint/NamedWaypoint.java65
-rw-r--r--src/main/java/de/hysky/skyblocker/utils/waypoint/Waypoint.java40
-rw-r--r--src/main/java/de/hysky/skyblocker/utils/waypoint/WaypointCategory.java20
3 files changed, 104 insertions, 21 deletions
diff --git a/src/main/java/de/hysky/skyblocker/utils/waypoint/NamedWaypoint.java b/src/main/java/de/hysky/skyblocker/utils/waypoint/NamedWaypoint.java
index f959de78..2f02b51f 100644
--- a/src/main/java/de/hysky/skyblocker/utils/waypoint/NamedWaypoint.java
+++ b/src/main/java/de/hysky/skyblocker/utils/waypoint/NamedWaypoint.java
@@ -13,6 +13,7 @@ import net.minecraft.text.TextCodecs;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Vec3d;
+import java.util.Objects;
import java.util.function.Supplier;
public class NamedWaypoint extends Waypoint {
@@ -23,6 +24,7 @@ public class NamedWaypoint extends Waypoint {
colorComponentsList -> colorComponentsList.size() == 3 ? DataResult.success(Floats.toArray(colorComponentsList)) : DataResult.error(() -> "Expected 3 color components, got " + colorComponentsList.size() + " instead"),
Floats::asList
).fieldOf("colorComponents").forGetter(secretWaypoint -> secretWaypoint.colorComponents),
+ Codec.FLOAT.fieldOf("alpha").forGetter(secretWaypoint -> secretWaypoint.alpha),
Codec.BOOL.fieldOf("shouldRender").forGetter(Waypoint::shouldRender)
).apply(instance, NamedWaypoint::new));
public static final Codec<NamedWaypoint> SKYTILS_CODEC = RecordCodecBuilder.create(instance -> instance.group(
@@ -30,46 +32,78 @@ public class NamedWaypoint extends Waypoint {
Codec.INT.fieldOf("y").forGetter(waypoint -> waypoint.pos.getY()),
Codec.INT.fieldOf("z").forGetter(waypoint -> waypoint.pos.getZ()),
Codec.either(Codec.STRING, Codec.INT).xmap(either -> either.map(str -> str, Object::toString), Either::left).fieldOf("name").forGetter(waypoint -> waypoint.name.getString()),
- Codec.INT.fieldOf("color").forGetter(waypoint -> (int) (waypoint.colorComponents[0] * 255) << 16 | (int) (waypoint.colorComponents[1] * 255) << 8 | (int) (waypoint.colorComponents[2] * 255)),
+ Codec.INT.fieldOf("color").forGetter(waypoint -> (int) (waypoint.alpha * 255) << 24 | (int) (waypoint.colorComponents[0] * 255) << 16 | (int) (waypoint.colorComponents[1] * 255) << 8 | (int) (waypoint.colorComponents[2] * 255)),
Codec.BOOL.fieldOf("enabled").forGetter(Waypoint::shouldRender)
).apply(instance, NamedWaypoint::fromSkytils));
- protected final Text name;
- protected final Vec3d centerPos;
+ public final Text name;
+ public final Vec3d centerPos;
public NamedWaypoint(BlockPos pos, String name, float[] colorComponents) {
this(pos, name, colorComponents, true);
}
public NamedWaypoint(BlockPos pos, String name, float[] colorComponents, boolean shouldRender) {
- this(pos, Text.of(name), colorComponents, shouldRender);
+ this(pos, name, colorComponents, DEFAULT_HIGHLIGHT_ALPHA, shouldRender);
}
- public NamedWaypoint(BlockPos pos, Text name, float[] colorComponents, boolean shouldRender) {
- this(pos, name, () -> SkyblockerConfigManager.get().general.waypoints.waypointType, colorComponents, shouldRender);
+ public NamedWaypoint(BlockPos pos, String name, float[] colorComponents, float alpha, boolean shouldRender) {
+ this(pos, Text.of(name), colorComponents, alpha, shouldRender);
}
- public NamedWaypoint(BlockPos pos, String name, Supplier<Type> typeSupplier, float[] colorComponents, boolean shouldRender) {
- this(pos, Text.of(name), typeSupplier, colorComponents, shouldRender);
+ public NamedWaypoint(BlockPos pos, Text name, float[] colorComponents, float alpha, boolean shouldRender) {
+ this(pos, name, () -> SkyblockerConfigManager.get().uiAndVisuals.waypoints.waypointType, colorComponents, alpha, shouldRender);
}
public NamedWaypoint(BlockPos pos, Text name, Supplier<Type> typeSupplier, float[] colorComponents) {
- this(pos, name, typeSupplier, colorComponents, true);
+ this(pos, name, typeSupplier, colorComponents, DEFAULT_HIGHLIGHT_ALPHA, true);
}
- public NamedWaypoint(BlockPos pos, Text name, Supplier<Type> typeSupplier, float[] colorComponents, boolean shouldRender) {
- super(pos, typeSupplier, colorComponents, DEFAULT_HIGHLIGHT_ALPHA, DEFAULT_LINE_WIDTH, true, shouldRender);
+ public NamedWaypoint(BlockPos pos, Text name, Supplier<Type> typeSupplier, float[] colorComponents, float alpha, boolean shouldRender) {
+ super(pos, typeSupplier, colorComponents, alpha, DEFAULT_LINE_WIDTH, true, shouldRender);
this.name = name;
this.centerPos = pos.toCenterPos();
}
public static NamedWaypoint fromSkytils(int x, int y, int z, String name, int color, boolean enabled) {
- return new NamedWaypoint(new BlockPos(x, y, z), name, new float[]{((color & 0x00FF0000) >> 16) / 255f, ((color & 0x0000FF00) >> 8) / 255f, (color & 0x000000FF) / 255f}, enabled);
+ float alpha = ((color & 0xFF000000) >>> 24) / 255f;
+ if (alpha == 0) {
+ alpha = DEFAULT_HIGHLIGHT_ALPHA;
+ }
+ return new NamedWaypoint(new BlockPos(x, y, z), name, new float[]{((color & 0x00FF0000) >> 16) / 255f, ((color & 0x0000FF00) >> 8) / 255f, (color & 0x000000FF) / 255f}, alpha, enabled);
+ }
+
+ public NamedWaypoint copy() {
+ return new NamedWaypoint(pos, name, typeSupplier, getColorComponents(), alpha, shouldRender());
+ }
+
+ @Override
+ public NamedWaypoint withX(int x) {
+ return new NamedWaypoint(new BlockPos(x, pos.getY(), pos.getZ()), name, typeSupplier, getColorComponents(), alpha, shouldRender());
+ }
+
+ @Override
+ public NamedWaypoint withY(int y) {
+ return new NamedWaypoint(pos.withY(y), name, typeSupplier, getColorComponents(), alpha, shouldRender());
+ }
+
+ @Override
+ public NamedWaypoint withZ(int z) {
+ return new NamedWaypoint(new BlockPos(pos.getX(), pos.getY(), z), name, typeSupplier, getColorComponents(), alpha, shouldRender());
+ }
+
+ @Override
+ public NamedWaypoint withColor(float[] colorComponents, float alpha) {
+ return new NamedWaypoint(pos, name, typeSupplier, colorComponents, alpha, shouldRender());
}
public Text getName() {
return name;
}
+ public NamedWaypoint withName(String name) {
+ return new NamedWaypoint(pos, Text.literal(name), typeSupplier, getColorComponents(), alpha, shouldRender());
+ }
+
protected boolean shouldRenderName() {
return true;
}
@@ -83,7 +117,12 @@ public class NamedWaypoint extends Waypoint {
}
@Override
+ public int hashCode() {
+ return Objects.hash(super.hashCode(), name);
+ }
+
+ @Override
public boolean equals(Object obj) {
- return this == obj || obj instanceof NamedWaypoint waypoint && name.equals(waypoint.name);
+ return this == obj || super.equals(obj) && obj instanceof NamedWaypoint waypoint && name.equals(waypoint.name);
}
}
diff --git a/src/main/java/de/hysky/skyblocker/utils/waypoint/Waypoint.java b/src/main/java/de/hysky/skyblocker/utils/waypoint/Waypoint.java
index 75e2edcf..c991fb9c 100644
--- a/src/main/java/de/hysky/skyblocker/utils/waypoint/Waypoint.java
+++ b/src/main/java/de/hysky/skyblocker/utils/waypoint/Waypoint.java
@@ -3,10 +3,12 @@ package de.hysky.skyblocker.utils.waypoint;
import de.hysky.skyblocker.utils.render.RenderHelper;
import de.hysky.skyblocker.utils.render.Renderable;
import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderContext;
+import net.minecraft.util.StringIdentifiable;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Box;
import java.util.Arrays;
+import java.util.Objects;
import java.util.function.Supplier;
public class Waypoint implements Renderable {
@@ -16,9 +18,9 @@ public class Waypoint implements Renderable {
final Box box;
final Supplier<Type> typeSupplier;
protected final float[] colorComponents;
- final float alpha;
- final float lineWidth;
- final boolean throughWalls;
+ public final float alpha;
+ public final float lineWidth;
+ public final boolean throughWalls;
private boolean shouldRender;
public Waypoint(BlockPos pos, Type type, float[] colorComponents) {
@@ -56,6 +58,22 @@ public class Waypoint implements Renderable {
this.shouldRender = shouldRender;
}
+ public Waypoint withX(int x) {
+ return new Waypoint(new BlockPos(x, pos.getY(), pos.getZ()), typeSupplier, getColorComponents(), alpha, lineWidth, throughWalls, shouldRender());
+ }
+
+ public Waypoint withY(int y) {
+ return new Waypoint(pos.withY(y), typeSupplier, getColorComponents(), alpha, lineWidth, throughWalls, shouldRender());
+ }
+
+ public Waypoint withZ(int z) {
+ return new Waypoint(new BlockPos(pos.getX(), pos.getY(), z), typeSupplier, getColorComponents(), alpha, lineWidth, throughWalls, shouldRender());
+ }
+
+ public Waypoint withColor(float[] colorComponents, float alpha) {
+ return new Waypoint(pos, typeSupplier, colorComponents, alpha, lineWidth, throughWalls, shouldRender());
+ }
+
public boolean shouldRender() {
return shouldRender;
}
@@ -72,6 +90,10 @@ public class Waypoint implements Renderable {
this.shouldRender = !this.shouldRender;
}
+ public void setShouldRender(boolean shouldRender) {
+ this.shouldRender = shouldRender;
+ }
+
public float[] getColorComponents() {
return colorComponents;
}
@@ -96,11 +118,16 @@ public class Waypoint implements Renderable {
}
@Override
+ public int hashCode() {
+ return Objects.hash(pos, typeSupplier.get(), Arrays.hashCode(colorComponents), alpha, lineWidth, throughWalls, shouldRender);
+ }
+
+ @Override
public boolean equals(Object obj) {
return super.equals(obj) || obj instanceof Waypoint other && pos.equals(other.pos) && typeSupplier.get() == other.typeSupplier.get() && Arrays.equals(colorComponents, other.colorComponents) && alpha == other.alpha && lineWidth == other.lineWidth && throughWalls == other.throughWalls && shouldRender == other.shouldRender;
}
- public enum Type {
+ public enum Type implements StringIdentifiable {
WAYPOINT,
OUTLINED_WAYPOINT,
HIGHLIGHT,
@@ -108,6 +135,11 @@ public class Waypoint implements Renderable {
OUTLINE;
@Override
+ public String asString() {
+ return name().toLowerCase();
+ }
+
+ @Override
public String toString() {
return switch (this) {
case WAYPOINT -> "Waypoint";
diff --git a/src/main/java/de/hysky/skyblocker/utils/waypoint/WaypointCategory.java b/src/main/java/de/hysky/skyblocker/utils/waypoint/WaypointCategory.java
index b1ac6135..db2a6d82 100644
--- a/src/main/java/de/hysky/skyblocker/utils/waypoint/WaypointCategory.java
+++ b/src/main/java/de/hysky/skyblocker/utils/waypoint/WaypointCategory.java
@@ -4,8 +4,10 @@ import com.mojang.serialization.Codec;
import com.mojang.serialization.codecs.RecordCodecBuilder;
import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderContext;
-import java.util.ArrayList;
import java.util.List;
+import java.util.function.Predicate;
+import java.util.function.UnaryOperator;
+import java.util.stream.Collectors;
public record WaypointCategory(String name, String island, List<NamedWaypoint> waypoints) {
public static final Codec<WaypointCategory> CODEC = RecordCodecBuilder.create(instance -> instance.group(
@@ -19,13 +21,23 @@ public record WaypointCategory(String name, String island, List<NamedWaypoint> w
NamedWaypoint.SKYTILS_CODEC.listOf().fieldOf("waypoints").forGetter(WaypointCategory::waypoints)
).apply(instance, WaypointCategory::new));
- public WaypointCategory(WaypointCategory waypointCategory) {
- this(waypointCategory.name(), waypointCategory.island(), new ArrayList<>(waypointCategory.waypoints()));
+ public static UnaryOperator<WaypointCategory> filter(Predicate<NamedWaypoint> predicate) {
+ return waypointCategory -> new WaypointCategory(waypointCategory.name(), waypointCategory.island(), waypointCategory.waypoints().stream().filter(predicate).toList());
+ }
+
+ public WaypointCategory withName(String name) {
+ return new WaypointCategory(name, island(), waypoints());
+ }
+
+ public WaypointCategory deepCopy() {
+ return new WaypointCategory(name(), island(), waypoints().stream().map(NamedWaypoint::copy).collect(Collectors.toList()));
}
public void render(WorldRenderContext context) {
for (NamedWaypoint waypoint : waypoints) {
- waypoint.render(context);
+ if (waypoint.shouldRender()) {
+ waypoint.render(context);
+ }
}
}
}