Newer
Older
void-pack-super-server / work / decompile-ee3ecae0 / net / minecraft / server / AttributeModifiable.java
package net.minecraft.server;

import com.google.common.collect.Maps;
import com.google.common.collect.Sets;
import java.util.Collection;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.UUID;
import javax.annotation.Nullable;

public class AttributeModifiable implements AttributeInstance {

    private final AttributeMapBase a;
    private final IAttribute b;
    private final Map<AttributeModifier.Operation, Set<AttributeModifier>> c = Maps.newEnumMap(AttributeModifier.Operation.class);
    private final Map<String, Set<AttributeModifier>> d = Maps.newHashMap();
    private final Map<UUID, AttributeModifier> e = Maps.newHashMap();
    private double f;
    private boolean g = true;
    private double h;

    public AttributeModifiable(AttributeMapBase attributemapbase, IAttribute iattribute) {
        this.a = attributemapbase;
        this.b = iattribute;
        this.f = iattribute.getDefault();
        AttributeModifier.Operation[] aattributemodifier_operation = AttributeModifier.Operation.values();
        int i = aattributemodifier_operation.length;

        for (int j = 0; j < i; ++j) {
            AttributeModifier.Operation attributemodifier_operation = aattributemodifier_operation[j];

            this.c.put(attributemodifier_operation, Sets.newHashSet());
        }

    }

    @Override
    public IAttribute getAttribute() {
        return this.b;
    }

    @Override
    public double getBaseValue() {
        return this.f;
    }

    @Override
    public void setValue(double d0) {
        if (d0 != this.getBaseValue()) {
            this.f = d0;
            this.f();
        }
    }

    @Override
    public Set<AttributeModifier> a(AttributeModifier.Operation attributemodifier_operation) {
        return (Set) this.c.get(attributemodifier_operation);
    }

    @Override
    public Set<AttributeModifier> getModifiers() {
        Set<AttributeModifier> set = Sets.newHashSet();
        AttributeModifier.Operation[] aattributemodifier_operation = AttributeModifier.Operation.values();
        int i = aattributemodifier_operation.length;

        for (int j = 0; j < i; ++j) {
            AttributeModifier.Operation attributemodifier_operation = aattributemodifier_operation[j];

            set.addAll(this.a(attributemodifier_operation));
        }

        return set;
    }

    @Nullable
    @Override
    public AttributeModifier a(UUID uuid) {
        return (AttributeModifier) this.e.get(uuid);
    }

    @Override
    public boolean a(AttributeModifier attributemodifier) {
        return this.e.get(attributemodifier.getUniqueId()) != null;
    }

    @Override
    public void addModifier(AttributeModifier attributemodifier) {
        if (this.a(attributemodifier.getUniqueId()) != null) {
            throw new IllegalArgumentException("Modifier is already applied on this attribute!");
        } else {
            Set<AttributeModifier> set = (Set) this.d.computeIfAbsent(attributemodifier.getName(), (s) -> {
                return Sets.newHashSet();
            });

            ((Set) this.c.get(attributemodifier.getOperation())).add(attributemodifier);
            set.add(attributemodifier);
            this.e.put(attributemodifier.getUniqueId(), attributemodifier);
            this.f();
        }
    }

    protected void f() {
        this.g = true;
        this.a.a((AttributeInstance) this);
    }

    @Override
    public void removeModifier(AttributeModifier attributemodifier) {
        AttributeModifier.Operation[] aattributemodifier_operation = AttributeModifier.Operation.values();
        int i = aattributemodifier_operation.length;

        for (int j = 0; j < i; ++j) {
            AttributeModifier.Operation attributemodifier_operation = aattributemodifier_operation[j];

            ((Set) this.c.get(attributemodifier_operation)).remove(attributemodifier);
        }

        Set<AttributeModifier> set = (Set) this.d.get(attributemodifier.getName());

        if (set != null) {
            set.remove(attributemodifier);
            if (set.isEmpty()) {
                this.d.remove(attributemodifier.getName());
            }
        }

        this.e.remove(attributemodifier.getUniqueId());
        this.f();
    }

    @Override
    public void b(UUID uuid) {
        AttributeModifier attributemodifier = this.a(uuid);

        if (attributemodifier != null) {
            this.removeModifier(attributemodifier);
        }

    }

    @Override
    public double getValue() {
        if (this.g) {
            this.h = this.g();
            this.g = false;
        }

        return this.h;
    }

    private double g() {
        double d0 = this.getBaseValue();

        AttributeModifier attributemodifier;

        for (Iterator iterator = this.b(AttributeModifier.Operation.ADDITION).iterator(); iterator.hasNext(); d0 += attributemodifier.getAmount()) {
            attributemodifier = (AttributeModifier) iterator.next();
        }

        double d1 = d0;

        AttributeModifier attributemodifier1;
        Iterator iterator1;

        for (iterator1 = this.b(AttributeModifier.Operation.MULTIPLY_BASE).iterator(); iterator1.hasNext(); d1 += d0 * attributemodifier1.getAmount()) {
            attributemodifier1 = (AttributeModifier) iterator1.next();
        }

        for (iterator1 = this.b(AttributeModifier.Operation.MULTIPLY_TOTAL).iterator(); iterator1.hasNext(); d1 *= 1.0D + attributemodifier1.getAmount()) {
            attributemodifier1 = (AttributeModifier) iterator1.next();
        }

        return this.b.a(d1);
    }

    private Collection<AttributeModifier> b(AttributeModifier.Operation attributemodifier_operation) {
        Set<AttributeModifier> set = Sets.newHashSet(this.a(attributemodifier_operation));

        for (IAttribute iattribute = this.b.d(); iattribute != null; iattribute = iattribute.d()) {
            AttributeInstance attributeinstance = this.a.a(iattribute);

            if (attributeinstance != null) {
                set.addAll(attributeinstance.a(attributemodifier_operation));
            }
        }

        return set;
    }
}