package net.glowstone.entity; import com.flowpowered.networking.Message; import lombok.Data; import lombok.Getter; import lombok.RequiredArgsConstructor; import net.glowstone.net.GlowSession; import net.glowstone.net.message.play.entity.EntityPropertyMessage; import java.util.*; public class AttributeManager { private static final List<Modifier> EMPTY_LIST = new ArrayList<>(); private final GlowLivingEntity entity; private final Map<String, Property> properties; private boolean needsUpdate; public AttributeManager(GlowLivingEntity entity) { this.entity = entity; this.properties = new HashMap<>(); this.needsUpdate = false; } public void applyMessages(Collection<Message> messages) { if (!needsUpdate) return; messages.add(new EntityPropertyMessage(entity.id, properties)); needsUpdate = false; } public void sendMessages(GlowSession session) { if (!needsUpdate) return; session.send(new EntityPropertyMessage(entity.id, properties)); needsUpdate = false; } public void setProperty(Key key, double value) { setProperty(key.toString(), Math.max(0, Math.min(value, key.max)), null); } public double getPropertyValue(Key key) { if (properties.containsKey(key.toString())) { return properties.get(key.toString()).value; } return key.def; } public void setProperty(String key, double value, List<Modifier> modifiers) { if (properties.containsKey(key)) { properties.get(key).value = value; properties.get(key).modifiers = modifiers; } else { properties.put(key, new Property(value, modifiers == null ? EMPTY_LIST : modifiers)); } needsUpdate = true; } public Map<String, Property> getAllProperties() { return properties; } public static final class Property { @Getter private double value; @Getter private List<Modifier> modifiers; public Property(double value, List<Modifier> modifiers) { this.value = value; this.modifiers = modifiers; } } @Data public static final class Modifier { private final String name; private final UUID uuid; private final double amount; private final byte operation; } @RequiredArgsConstructor public static enum Key { KEY_MAX_HEALTH("generic.maxHealth", 20, Double.MAX_VALUE), KEY_FOLLOW_RANGE("generic.followRange", 32, 2048), KEY_KNOCKBACK_RESISTANCE("generic.knockbackResistance", 0, 1), KEY_MOVEMENT_SPEED("generic.movementSpeed", 0.699999988079071, Double.MAX_VALUE), KEY_ATTACK_DAMAGE("generic.attackDamage", 2, Double.MAX_VALUE), KEY_HORSE_JUMP_STRENGTH("horse.jumpStrength", 0.7, 2), KEY_ZOMBIE_SPAWN_REINFORCEMENTS("zombie.spawnReinforcements", 0, 1), ; private final String name; @Getter private final double def, max; @Override public String toString() { return name; } } }