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

    • 引用位置: 方法调用
    • 关联成员: Util.memoize()
  • EnvironmentAttribute

    • 引用位置: 参数/字段/返回值
  • AttributeModifier

    • 引用位置: 方法调用
    • 关联成员: AttributeModifier.override()