EnvironmentAttributeMap.java
net.minecraft.world.attribute.EnvironmentAttributeMap
信息
- 全限定名:net.minecraft.world.attribute.EnvironmentAttributeMap
- 类型:public final class
- 包:net.minecraft.world.attribute
- 源码路径:src/main/java/net/minecraft/world/attribute/EnvironmentAttributeMap.java
- 起始行号:L17
- 职责:
TODO
字段/常量
-
EMPTY- 类型:
EnvironmentAttributeMap - 修饰符:
public static final - 源码定位:
L18 - 说明:
TODO
- 类型:
-
CODEC- 类型:
Codec<EnvironmentAttributeMap> - 修饰符:
public static final - 源码定位:
L19 - 说明:
TODO
- 类型:
-
NETWORK_CODEC- 类型:
Codec<EnvironmentAttributeMap> - 修饰符:
public static final - 源码定位:
L23 - 说明:
TODO
- 类型:
-
CODEC_ONLY_POSITIONAL- 类型:
Codec<EnvironmentAttributeMap> - 修饰符:
public static final - 源码定位:
L26 - 说明:
TODO
- 类型:
-
entries- 类型:
Map<EnvironmentAttribute<?>,EnvironmentAttributeMap.Entry<?,?>> - 修饰符:
private final - 源码定位:
L34 - 说明:
TODO
- 类型:
内部类/嵌套类型
-
net.minecraft.world.attribute.EnvironmentAttributeMap.Builder- 类型:
class - 修饰符:
public static - 源码定位:
L80 - 说明:
TODO
- 类型:
-
net.minecraft.world.attribute.EnvironmentAttributeMap.Entry- 类型:
record - 修饰符:
public - 源码定位:
L108 - 说明:
TODO
- 类型:
构造器
private EnvironmentAttributeMap(Map<EnvironmentAttribute<?>,EnvironmentAttributeMap.Entry<?,?>> entries) @ L40
- 构造器名:EnvironmentAttributeMap
- 源码定位:L40
- 修饰符:private
参数:
- entries: Map<EnvironmentAttribute,EnvironmentAttributeMap.Entry>
说明:
TODO
方法
下面的方法块按源码顺序生成。
private static EnvironmentAttributeMap filterSyncable(EnvironmentAttributeMap attributes) @ L36
- 方法名:filterSyncable
- 源码定位:L36
- 返回类型:EnvironmentAttributeMap
- 修饰符:private static
参数:
- attributes: EnvironmentAttributeMap
说明:
TODO
public static EnvironmentAttributeMap.Builder builder() @ L44
- 方法名:builder
- 源码定位:L44
- 返回类型:EnvironmentAttributeMap.Builder
- 修饰符:public static
参数:
- 无
说明:
TODO
public <Value> EnvironmentAttributeMap.Entry<Value,?> get(EnvironmentAttribute<Value> attribute) @ L48
- 方法名:get
- 源码定位:L48
- 返回类型:
EnvironmentAttributeMap.Entry<Value,?> - 修饰符:public
参数:
- attribute: EnvironmentAttribute
说明:
TODO
public <Value> Value applyModifier(EnvironmentAttribute<Value> attribute, Value baseValue) @ L52
- 方法名:applyModifier
- 源码定位:L52
- 返回类型:
Value - 修饰符:public
参数:
- attribute: EnvironmentAttribute
- baseValue: Value
说明:
TODO
public boolean contains(EnvironmentAttribute<?> attribute) @ L57
- 方法名:contains
- 源码定位:L57
- 返回类型:boolean
- 修饰符:public
参数:
- attribute: EnvironmentAttribute<?>
说明:
TODO
public Set<EnvironmentAttribute<?>> keySet() @ L61
- 方法名:keySet
- 源码定位:L61
- 返回类型:Set<EnvironmentAttribute<?>>
- 修饰符:public
参数:
- 无
说明:
TODO
public boolean equals(Object obj) @ L65
- 方法名:equals
- 源码定位:L65
- 返回类型:boolean
- 修饰符:public
参数:
- obj: Object
说明:
TODO
public int hashCode() @ L70
- 方法名:hashCode
- 源码定位:L70
- 返回类型:int
- 修饰符:public
参数:
- 无
说明:
TODO
public String toString() @ L75
- 方法名:toString
- 源码定位:L75
- 返回类型:String
- 修饰符:public
参数:
- 无
说明:
TODO
代码
public final class EnvironmentAttributeMap {
public static final EnvironmentAttributeMap EMPTY = new EnvironmentAttributeMap(Map.of());
public static final Codec<EnvironmentAttributeMap> CODEC = Codec.lazyInitialized(
() -> Codec.dispatchedMap(EnvironmentAttributes.CODEC, Util.memoize((java.util.function.Function<EnvironmentAttribute<?>, Codec<? extends Entry<?, ?>>>) EnvironmentAttributeMap.Entry::createCodec))
.xmap(EnvironmentAttributeMap::new, v -> v.entries)
);
public static final Codec<EnvironmentAttributeMap> NETWORK_CODEC = CODEC.xmap(
EnvironmentAttributeMap::filterSyncable, EnvironmentAttributeMap::filterSyncable
);
public static final Codec<EnvironmentAttributeMap> CODEC_ONLY_POSITIONAL = CODEC.validate(
map -> {
List<EnvironmentAttribute<?>> illegalAttributes = map.keySet().stream().filter(attribute -> !attribute.isPositional()).toList();
return !illegalAttributes.isEmpty()
? DataResult.error(() -> "The following attributes cannot be positional: " + illegalAttributes)
: DataResult.success(map);
}
);
private final Map<EnvironmentAttribute<?>, EnvironmentAttributeMap.Entry<?, ?>> entries;
private static EnvironmentAttributeMap filterSyncable(EnvironmentAttributeMap attributes) {
return new EnvironmentAttributeMap(Map.copyOf(Maps.filterKeys(attributes.entries, EnvironmentAttribute::isSyncable)));
}
private EnvironmentAttributeMap(Map<EnvironmentAttribute<?>, EnvironmentAttributeMap.Entry<?, ?>> entries) {
this.entries = entries;
}
public static EnvironmentAttributeMap.Builder builder() {
return new EnvironmentAttributeMap.Builder();
}
public <Value> EnvironmentAttributeMap.@Nullable Entry<Value, ?> get(EnvironmentAttribute<Value> attribute) {
return (EnvironmentAttributeMap.Entry<Value, ?>)this.entries.get(attribute);
}
public <Value> Value applyModifier(EnvironmentAttribute<Value> attribute, Value baseValue) {
EnvironmentAttributeMap.Entry<Value, ?> entry = this.get(attribute);
return entry != null ? entry.applyModifier(baseValue) : baseValue;
}
public boolean contains(EnvironmentAttribute<?> attribute) {
return this.entries.containsKey(attribute);
}
public Set<EnvironmentAttribute<?>> keySet() {
return this.entries.keySet();
}
@Override
public boolean equals(Object obj) {
return obj == this ? true : obj instanceof EnvironmentAttributeMap attributes && this.entries.equals(attributes.entries);
}
@Override
public int hashCode() {
return this.entries.hashCode();
}
@Override
public String toString() {
return this.entries.toString();
}
public static class Builder {
private final Map<EnvironmentAttribute<?>, EnvironmentAttributeMap.Entry<?, ?>> entries = new HashMap<>();
private Builder() {
}
public EnvironmentAttributeMap.Builder putAll(EnvironmentAttributeMap map) {
this.entries.putAll(map.entries);
return this;
}
public <Value, Parameter> EnvironmentAttributeMap.Builder modify(
EnvironmentAttribute<Value> attribute, AttributeModifier<Value, Parameter> modifier, Parameter value
) {
attribute.type().checkAllowedModifier(modifier);
this.entries.put(attribute, new EnvironmentAttributeMap.Entry<>(value, modifier));
return this;
}
public <Value> EnvironmentAttributeMap.Builder set(EnvironmentAttribute<Value> attribute, Value value) {
return this.modify(attribute, AttributeModifier.override(), value);
}
public EnvironmentAttributeMap build() {
return this.entries.isEmpty() ? EnvironmentAttributeMap.EMPTY : new EnvironmentAttributeMap(Map.copyOf(this.entries));
}
}
public record Entry<Value, Argument>(Argument argument, AttributeModifier<Value, Argument> modifier) {
private static <Value> Codec<EnvironmentAttributeMap.Entry<Value, ?>> createCodec(EnvironmentAttribute<Value> attribute) {
Codec<EnvironmentAttributeMap.Entry<Value, ?>> fullCodec = attribute.type()
.modifierCodec()
.dispatch(
"modifier",
EnvironmentAttributeMap.Entry::modifier,
Util.memoize(modifier -> createFullCodec(attribute, (AttributeModifier<Value, ?>)modifier))
);
return Codec.either(attribute.valueCodec(), fullCodec)
.xmap(
either -> either.map(value -> new EnvironmentAttributeMap.Entry<>(value, AttributeModifier.override()), e -> e),
entry -> entry.modifier == AttributeModifier.override()
? Either.left((Value)entry.argument())
: Either.right((EnvironmentAttributeMap.Entry<Value, ?>)entry)
);
}
private static <Value, Argument> MapCodec<EnvironmentAttributeMap.Entry<Value, Argument>> createFullCodec(
EnvironmentAttribute<Value> attribute, AttributeModifier<Value, Argument> modifier
) {
return RecordCodecBuilder.mapCodec(
i -> i.group(modifier.argumentCodec(attribute).fieldOf("argument").forGetter(EnvironmentAttributeMap.Entry::argument))
.apply(i, value -> new EnvironmentAttributeMap.Entry<>(value, modifier))
);
}
public Value applyModifier(Value subject) {
return this.modifier.apply(subject, this.argument);
}
}
}引用的其他类
-
- 引用位置:
方法调用 - 关联成员:
Util.memoize()
- 引用位置:
-
- 引用位置:
参数/字段/返回值
- 引用位置:
-
- 引用位置:
方法调用 - 关联成员:
AttributeModifier.override()
- 引用位置: