| package net.glowstone.io.entity; |
| |
| import java.util.UUID; |
| import java.util.stream.Collectors; |
| import net.glowstone.GlowServer; |
| import net.glowstone.entity.GlowAreaEffectCloud; |
| import net.glowstone.inventory.GlowMetaPotion; |
| import net.glowstone.util.nbt.CompoundTag; |
| import org.bukkit.Color; |
| import org.bukkit.Location; |
| import org.bukkit.Particle; |
| import org.bukkit.entity.Entity; |
| import org.bukkit.entity.EntityType; |
| import org.bukkit.potion.PotionData; |
| import org.bukkit.projectiles.ProjectileSource; |
| |
| class AreaEffectCloudStore extends EntityStore<GlowAreaEffectCloud> { |
| |
| private static final String DURATION = "Duration"; |
| private static final String COLOR = "Color"; |
| private static final String REAPPLICATION_DELAY = "ReapplicationDelay"; |
| private static final String WAIT_TIME = "WaitTime"; |
| private static final String OWNER_UUID_LEAST = "OwnerUUIDLeast"; |
| private static final String OWNER_UUID_MOST = "OwnerUUIDMost"; |
| private static final String DURATION_ON_USE = "DurationOnUse"; |
| private static final String RADIUS = "Radius"; |
| private static final String RADIUS_ON_USE = "RadiusOnUse"; |
| private static final String RADIUS_PER_TICK = "RadiusPerTick"; |
| private static final String PARTICLE = "Particle"; |
| private static final String POTION = "Potion"; |
| private static final String EFFECTS = "Effects"; |
| |
| public AreaEffectCloudStore() { |
| super(GlowAreaEffectCloud.class, EntityType.AREA_EFFECT_CLOUD); |
| } |
| |
| @Override |
| public void load(GlowAreaEffectCloud entity, CompoundTag tag) { |
| super.load(entity, tag); |
| tag.readInt(COLOR, rgb -> entity.setColor(Color.fromRGB(rgb))); |
| tag.readInt(DURATION, entity::setDuration); |
| tag.readInt(REAPPLICATION_DELAY, entity::setReapplicationDelay); |
| tag.readInt(WAIT_TIME, entity::setWaitTime); |
| // TODO: OWNER_UUID_LEAST, OWNER_UUID_MOST |
| tag.readInt(DURATION_ON_USE, entity::setDurationOnUse); |
| tag.readFloat(RADIUS, entity::setRadius); |
| tag.readFloat(RADIUS_ON_USE, entity::setRadiusOnUse); |
| tag.readFloat(RADIUS_PER_TICK, entity::setRadiusPerTick); |
| tag.readString(PARTICLE, particle -> { |
| try { |
| entity.setParticle(Particle.valueOf(particle)); |
| } catch (IllegalArgumentException e) { |
| GlowServer.logger.warning(() -> String.format( |
| "Ignoring invalid particle type %s in tag %s", particle, tag)); |
| } |
| }); |
| // TODO: Potion |
| tag.readCompoundList(EFFECTS, effects -> effects |
| .stream() |
| .map(GlowMetaPotion::fromNbt) |
| .forEach(effect -> entity.addCustomEffect(effect, false))); |
| } |
| |
| @Override |
| public void save(GlowAreaEffectCloud entity, CompoundTag tag) { |
| super.save(entity, tag); |
| tag.putInt("Age", entity.getTicksLived()); |
| Color color = entity.getColor(); |
| if (color != null) { |
| tag.putInt(COLOR, color.asRGB()); |
| } |
| tag.putInt(DURATION, entity.getDuration()); |
| tag.putInt(REAPPLICATION_DELAY, entity.getReapplicationDelay()); |
| tag.putInt(WAIT_TIME, entity.getWaitTime()); |
| ProjectileSource source = entity.getSource(); |
| if (source instanceof Entity) { |
| UUID uuid = ((Entity) source).getUniqueId(); |
| tag.putLong(OWNER_UUID_LEAST, uuid.getLeastSignificantBits()); |
| tag.putLong(OWNER_UUID_MOST, uuid.getMostSignificantBits()); |
| } |
| tag.putInt(DURATION_ON_USE, entity.getDurationOnUse()); |
| tag.putFloat(RADIUS, entity.getRadius()); |
| tag.putFloat(RADIUS_ON_USE, entity.getRadiusOnUse()); |
| tag.putFloat(RADIUS_PER_TICK, entity.getRadiusPerTick()); |
| Particle particle = entity.getParticle(); |
| if (particle != null) { |
| tag.putString(PARTICLE, particle.toString()); |
| } |
| PotionData potion = entity.getBasePotionData(); |
| if (potion != null) { |
| tag.putString(POTION, GlowMetaPotion.dataToString(potion)); |
| } |
| tag.putCompoundList(EFFECTS, entity |
| .getCustomEffects() |
| .stream() |
| .map(GlowMetaPotion::toNbt) |
| .collect(Collectors.toList())); |
| // TODO: Are ParticleParam1 and ParticleParam2 unused? |
| } |
| |
| @Override |
| public GlowAreaEffectCloud createEntity(Location location, CompoundTag compound) { |
| GlowAreaEffectCloud cloud = new GlowAreaEffectCloud(location); |
| load(cloud, compound); |
| return cloud; |
| } |
| } |