1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
|
package de.hysky.skyblocker.utils.waypoint;
import com.google.common.primitives.Floats;
import com.mojang.datafixers.util.Either;
import com.mojang.serialization.Codec;
import com.mojang.serialization.DataResult;
import com.mojang.serialization.codecs.RecordCodecBuilder;
import de.hysky.skyblocker.config.SkyblockerConfigManager;
import de.hysky.skyblocker.utils.render.RenderHelper;
import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderContext;
import net.minecraft.text.Text;
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 {
public static final Codec<NamedWaypoint> CODEC = RecordCodecBuilder.create(instance -> instance.group(
BlockPos.CODEC.fieldOf("pos").forGetter(secretWaypoint -> secretWaypoint.pos),
TextCodecs.CODEC.fieldOf("name").forGetter(secretWaypoint -> secretWaypoint.name),
Codec.floatRange(0, 1).listOf().comapFlatMap(
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(
Codec.INT.fieldOf("x").forGetter(waypoint -> waypoint.pos.getX()),
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.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));
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, name, colorComponents, DEFAULT_HIGHLIGHT_ALPHA, 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, 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, DEFAULT_HIGHLIGHT_ALPHA, true);
}
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) {
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;
}
@Override
public void render(WorldRenderContext context) {
super.render(context);
if (shouldRenderName()) {
RenderHelper.renderText(context, name, centerPos.add(0, 1, 0), true);
}
}
@Override
public int hashCode() {
return Objects.hash(super.hashCode(), name);
}
@Override
public boolean equals(Object obj) {
return this == obj || super.equals(obj) && obj instanceof NamedWaypoint waypoint && name.equals(waypoint.name);
}
}
|