118 lines
3.6 KiB
Java
118 lines
3.6 KiB
Java
package net.minecraft.client.telemetry;
|
|
|
|
import com.mojang.serialization.DataResult;
|
|
import com.mojang.serialization.DynamicOps;
|
|
import com.mojang.serialization.MapCodec;
|
|
import com.mojang.serialization.MapLike;
|
|
import com.mojang.serialization.RecordBuilder;
|
|
import it.unimi.dsi.fastutil.objects.Reference2ObjectOpenHashMap;
|
|
import java.util.List;
|
|
import java.util.Map;
|
|
import java.util.Set;
|
|
import java.util.stream.Stream;
|
|
import net.fabricmc.api.EnvType;
|
|
import net.fabricmc.api.Environment;
|
|
import org.jetbrains.annotations.Nullable;
|
|
|
|
@Environment(EnvType.CLIENT)
|
|
public class TelemetryPropertyMap {
|
|
final Map<TelemetryProperty<?>, Object> entries;
|
|
|
|
TelemetryPropertyMap(Map<TelemetryProperty<?>, Object> entries) {
|
|
this.entries = entries;
|
|
}
|
|
|
|
public static TelemetryPropertyMap.Builder builder() {
|
|
return new TelemetryPropertyMap.Builder();
|
|
}
|
|
|
|
public static MapCodec<TelemetryPropertyMap> createCodec(List<TelemetryProperty<?>> properties) {
|
|
return new MapCodec<TelemetryPropertyMap>() {
|
|
public <T> RecordBuilder<T> encode(TelemetryPropertyMap map, DynamicOps<T> ops, RecordBuilder<T> builder) {
|
|
RecordBuilder<T> recordBuilder = builder;
|
|
|
|
for (TelemetryProperty<?> telemetryProperty : properties) {
|
|
recordBuilder = this.encodeProperty(map, recordBuilder, telemetryProperty);
|
|
}
|
|
|
|
return recordBuilder;
|
|
}
|
|
|
|
private <T, V> RecordBuilder<T> encodeProperty(TelemetryPropertyMap map, RecordBuilder<T> builder, TelemetryProperty<V> key) {
|
|
V object = map.get(key);
|
|
return object != null ? builder.add(key.id(), object, key.codec()) : builder;
|
|
}
|
|
|
|
@Override
|
|
public <T> DataResult<TelemetryPropertyMap> decode(DynamicOps<T> dynamicOps, MapLike<T> mapLike) {
|
|
DataResult<TelemetryPropertyMap.Builder> dataResult = DataResult.success(new TelemetryPropertyMap.Builder());
|
|
|
|
for (TelemetryProperty<?> telemetryProperty : properties) {
|
|
dataResult = this.decodeProperty(dataResult, dynamicOps, mapLike, telemetryProperty);
|
|
}
|
|
|
|
return dataResult.map(TelemetryPropertyMap.Builder::build);
|
|
}
|
|
|
|
private <T, V> DataResult<TelemetryPropertyMap.Builder> decodeProperty(
|
|
DataResult<TelemetryPropertyMap.Builder> result, DynamicOps<T> ops, MapLike<T> value, TelemetryProperty<V> property
|
|
) {
|
|
T object = value.get(property.id());
|
|
if (object != null) {
|
|
DataResult<V> dataResult = property.codec().parse(ops, object);
|
|
return result.apply2stable((builder, objectx) -> builder.put(property, (V)objectx), dataResult);
|
|
} else {
|
|
return result;
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public <T> Stream<T> keys(DynamicOps<T> dynamicOps) {
|
|
return properties.stream().map(TelemetryProperty::id).map(dynamicOps::createString);
|
|
}
|
|
};
|
|
}
|
|
|
|
@Nullable
|
|
public <T> T get(TelemetryProperty<T> key) {
|
|
return (T)this.entries.get(key);
|
|
}
|
|
|
|
public String toString() {
|
|
return this.entries.toString();
|
|
}
|
|
|
|
public Set<TelemetryProperty<?>> propertySet() {
|
|
return this.entries.keySet();
|
|
}
|
|
|
|
@Environment(EnvType.CLIENT)
|
|
public static class Builder {
|
|
private final Map<TelemetryProperty<?>, Object> entries = new Reference2ObjectOpenHashMap<>();
|
|
|
|
Builder() {
|
|
}
|
|
|
|
public <T> TelemetryPropertyMap.Builder put(TelemetryProperty<T> key, T value) {
|
|
this.entries.put(key, value);
|
|
return this;
|
|
}
|
|
|
|
public <T> TelemetryPropertyMap.Builder putIfNotNull(TelemetryProperty<T> key, @Nullable T value) {
|
|
if (value != null) {
|
|
this.entries.put(key, value);
|
|
}
|
|
|
|
return this;
|
|
}
|
|
|
|
public TelemetryPropertyMap.Builder putAll(TelemetryPropertyMap propertyMap) {
|
|
this.entries.putAll(propertyMap.entries);
|
|
return this;
|
|
}
|
|
|
|
public TelemetryPropertyMap build() {
|
|
return new TelemetryPropertyMap(this.entries);
|
|
}
|
|
}
|
|
}
|