Search in sources :

Example 21 with DataQuery

use of org.spongepowered.api.data.DataQuery in project Nucleus by NucleusPowered.

the class NucleusItemStackSnapshotSerialiser method deserialize.

@Override
public NucleusItemStackSnapshot deserialize(TypeToken<?> type, ConfigurationNode value) throws ObjectMappingException {
    // Process enchantments, temporary fix before Sponge gets a more general fix in.
    boolean emptyEnchant = false;
    ConfigurationNode ench = value.getNode("UnsafeData", "ench");
    if (!ench.isVirtual()) {
        List<? extends ConfigurationNode> enchantments = ench.getChildrenList();
        if (enchantments.isEmpty()) {
            // Remove empty enchantment list.
            value.getNode("UnsafeData").removeChild("ench");
        } else {
            enchantments.forEach(x -> {
                try {
                    short id = Short.parseShort(x.getNode("id").getString());
                    short lvl = Short.parseShort(x.getNode("lvl").getString());
                    x.getNode("id").setValue(id);
                    x.getNode("lvl").setValue(lvl);
                } catch (NumberFormatException e) {
                    x.setValue(null);
                }
            });
        }
    }
    ConfigurationNode data = value.getNode("Data");
    if (!data.isVirtual() && data.hasListChildren()) {
        List<? extends ConfigurationNode> n = data.getChildrenList().stream().filter(x -> !x.getNode("DataClass").getString("").endsWith("SpongeEnchantmentData") || (!x.getNode("ManipulatorData", "ItemEnchantments").isVirtual() && x.getNode("ManipulatorData", "ItemEnchantments").hasListChildren())).collect(Collectors.toList());
        emptyEnchant = n.size() != data.getChildrenList().size();
        if (emptyEnchant) {
            if (n.isEmpty()) {
                value.removeChild("Data");
            } else {
                value.getNode("Data").setValue(n);
            }
        }
    }
    DataContainer dataContainer = DataTranslators.CONFIGURATION_NODE.translate(value);
    Set<DataQuery> ldq = dataContainer.getKeys(true);
    for (DataQuery dataQuery : ldq) {
        String el = dataQuery.asString(".");
        if (el.contains("$Array$")) {
            try {
                Tuple<DataQuery, Object> r = TypeHelper.getArray(dataQuery, dataContainer);
                dataContainer.set(r.getFirst(), r.getSecond());
            } catch (Exception e) {
                e.printStackTrace();
            }
            dataContainer.remove(dataQuery);
        }
    }
    ItemStack snapshot;
    try {
        snapshot = ItemStack.builder().fromContainer(dataContainer).build();
    } catch (Exception e) {
        return NucleusItemStackSnapshot.NONE;
    }
    if (emptyEnchant) {
        snapshot.offer(Keys.ITEM_ENCHANTMENTS, Lists.newArrayList());
        return new NucleusItemStackSnapshot(snapshot.createSnapshot());
    }
    if (snapshot.get(Keys.ITEM_ENCHANTMENTS).isPresent()) {
        // Reset the data.
        snapshot.offer(Keys.ITEM_ENCHANTMENTS, snapshot.get(Keys.ITEM_ENCHANTMENTS).get());
        return new NucleusItemStackSnapshot(snapshot.createSnapshot());
    }
    return new NucleusItemStackSnapshot(snapshot.createSnapshot());
}
Also used : TypeHelper(io.github.nucleuspowered.nucleus.util.TypeHelper) Keys(org.spongepowered.api.data.key.Keys) DataContainer(org.spongepowered.api.data.DataContainer) Set(java.util.Set) ItemStackSnapshot(org.spongepowered.api.item.inventory.ItemStackSnapshot) TypeToken(com.google.common.reflect.TypeToken) NucleusItemStackSnapshot(io.github.nucleuspowered.nucleus.configurate.wrappers.NucleusItemStackSnapshot) Tuple(org.spongepowered.api.util.Tuple) TypeSerializer(ninja.leaping.configurate.objectmapping.serialize.TypeSerializer) DataQuery(org.spongepowered.api.data.DataQuery) Collectors(java.util.stream.Collectors) ItemStack(org.spongepowered.api.item.inventory.ItemStack) List(java.util.List) Lists(com.google.common.collect.Lists) ObjectMappingException(ninja.leaping.configurate.objectmapping.ObjectMappingException) DataTranslators(org.spongepowered.api.data.persistence.DataTranslators) Map(java.util.Map) ConfigurationNode(ninja.leaping.configurate.ConfigurationNode) NucleusItemStackSnapshot(io.github.nucleuspowered.nucleus.configurate.wrappers.NucleusItemStackSnapshot) ObjectMappingException(ninja.leaping.configurate.objectmapping.ObjectMappingException) DataContainer(org.spongepowered.api.data.DataContainer) ConfigurationNode(ninja.leaping.configurate.ConfigurationNode) DataQuery(org.spongepowered.api.data.DataQuery) ItemStack(org.spongepowered.api.item.inventory.ItemStack)

Example 22 with DataQuery

use of org.spongepowered.api.data.DataQuery in project Nucleus by NucleusPowered.

the class TypeHelper method getArray.

public static Tuple<DataQuery, Object> getArray(DataQuery query, DataView container) {
    String a = query.asString(".");
    DataQuery q = DataQuery.of('.', query.asString(".").replaceAll("\\$Array\\$[a-zA-Z]$", ""));
    String objType = a.substring(a.length() - 1);
    List<?> array = container.getList(query).orElse(Lists.newArrayList());
    int size = array.size();
    switch(objType) {
        case "B":
            {
                byte[] b = new byte[size];
                for (int i = 0; i < size; i++) {
                    Object obj = array.get(i);
                    if (obj instanceof String) {
                        b[i] = Byte.parseByte((String) obj);
                    } else {
                        b[i] = ((Number) obj).byteValue();
                    }
                }
                return Tuple.of(q, b);
            }
        case "S":
            {
                short[] b = new short[size];
                for (int i = 0; i < size; i++) {
                    Object obj = array.get(i);
                    if (obj instanceof String) {
                        b[i] = Short.parseShort((String) obj);
                    } else {
                        b[i] = ((Number) obj).shortValue();
                    }
                }
                return Tuple.of(q, b);
            }
        case "I":
            {
                int[] b = new int[size];
                for (int i = 0; i < size; i++) {
                    Object obj = array.get(i);
                    if (obj instanceof String) {
                        b[i] = Integer.parseInt((String) obj);
                    } else {
                        b[i] = ((Number) obj).intValue();
                    }
                }
                return Tuple.of(q, b);
            }
        case "J":
            {
                long[] b = new long[size];
                for (int i = 0; i < size; i++) {
                    Object obj = array.get(i);
                    if (obj instanceof String) {
                        b[i] = Long.parseLong((String) obj);
                    } else {
                        b[i] = ((Number) obj).longValue();
                    }
                }
                return Tuple.of(q, b);
            }
        case "F":
            {
                float[] b = new float[size];
                for (int i = 0; i < size; i++) {
                    Object obj = array.get(i);
                    if (obj instanceof String) {
                        b[i] = Float.parseFloat((String) obj);
                    } else {
                        b[i] = ((Number) obj).floatValue();
                    }
                }
                return Tuple.of(q, b);
            }
        case "D":
            {
                double[] b = new double[size];
                for (int i = 0; i < size; i++) {
                    Object obj = array.get(i);
                    if (obj instanceof String) {
                        b[i] = Double.parseDouble((String) obj);
                    } else {
                        b[i] = ((Number) obj).doubleValue();
                    }
                }
                return Tuple.of(q, b);
            }
        case "Z":
            {
                boolean[] b = new boolean[size];
                for (int i = 0; i < size; i++) {
                    Object obj = array.get(i);
                    if (obj instanceof String) {
                        b[i] = Boolean.parseBoolean((String) obj);
                    } else {
                        b[i] = (Boolean) obj;
                    }
                }
                return Tuple.of(q, b);
            }
    }
    throw new RuntimeException();
}
Also used : DataQuery(org.spongepowered.api.data.DataQuery)

Example 23 with DataQuery

use of org.spongepowered.api.data.DataQuery in project SpongeCommon by SpongePowered.

the class MemoryDataView method set.

@Override
@SuppressWarnings({ "rawtypes", "unchecked" })
public DataView set(DataQuery path, Object value) {
    checkNotNull(path, "path");
    checkNotNull(value, "value");
    checkState(this.container != null);
    @Nullable DataManager manager;
    // TODO: this call to getDataManager each set can be cleaned up
    try {
        manager = Sponge.getDataManager();
    } catch (Exception e) {
        manager = null;
    }
    List<String> parts = path.getParts();
    String key = parts.get(0);
    if (parts.size() > 1) {
        DataQuery subQuery = of(key);
        Optional<DataView> subViewOptional = this.getUnsafeView(subQuery);
        DataView subView;
        if (!subViewOptional.isPresent()) {
            this.createView(subQuery);
            subView = (DataView) this.map.get(key);
        } else {
            subView = subViewOptional.get();
        }
        subView.set(path.popFirst(), value);
        return this;
    }
    if (value instanceof DataView) {
        checkArgument(value != this, "Cannot set a DataView to itself.");
        // always have to copy a data view to avoid overwriting existing
        // views and to set the interior path correctly.
        copyDataView(path, (DataView) value);
    } else if (value instanceof DataSerializable) {
        DataContainer valueContainer = ((DataSerializable) value).toContainer();
        checkArgument(!(valueContainer).equals(this), "Cannot insert self-referencing DataSerializable");
        // see above for why this is copied
        copyDataView(path, valueContainer);
    } else if (value instanceof CatalogType) {
        return set(path, ((CatalogType) value).getId());
    } else if (manager != null && manager.getTranslator(value.getClass()).isPresent()) {
        DataTranslator serializer = manager.getTranslator(value.getClass()).get();
        final DataContainer container = serializer.translate(value);
        checkArgument(!container.equals(this), "Cannot insert self-referencing Objects!");
        // see above for why this is copied
        copyDataView(path, container);
    } else if (value instanceof Collection) {
        setCollection(key, (Collection) value);
    } else if (value instanceof Map) {
        setMap(key, (Map) value);
    } else if (value.getClass().isArray()) {
        if (this.safety == SafetyMode.ALL_DATA_CLONED || this.safety == SafetyMode.CLONED_ON_SET) {
            if (value instanceof byte[]) {
                this.map.put(key, ArrayUtils.clone((byte[]) value));
            } else if (value instanceof short[]) {
                this.map.put(key, ArrayUtils.clone((short[]) value));
            } else if (value instanceof int[]) {
                this.map.put(key, ArrayUtils.clone((int[]) value));
            } else if (value instanceof long[]) {
                this.map.put(key, ArrayUtils.clone((long[]) value));
            } else if (value instanceof float[]) {
                this.map.put(key, ArrayUtils.clone((float[]) value));
            } else if (value instanceof double[]) {
                this.map.put(key, ArrayUtils.clone((double[]) value));
            } else if (value instanceof boolean[]) {
                this.map.put(key, ArrayUtils.clone((boolean[]) value));
            } else {
                this.map.put(key, ArrayUtils.clone((Object[]) value));
            }
        } else {
            this.map.put(key, value);
        }
    } else {
        this.map.put(key, value);
    }
    return this;
}
Also used : DataTranslator(org.spongepowered.api.data.persistence.DataTranslator) DataManager(org.spongepowered.api.data.DataManager) DataSerializable(org.spongepowered.api.data.DataSerializable) DataView(org.spongepowered.api.data.DataView) DataContainer(org.spongepowered.api.data.DataContainer) CatalogType(org.spongepowered.api.CatalogType) Collection(java.util.Collection) DataQuery(org.spongepowered.api.data.DataQuery) Map(java.util.Map) ImmutableMap(com.google.common.collect.ImmutableMap) Nullable(javax.annotation.Nullable)

Example 24 with DataQuery

use of org.spongepowered.api.data.DataQuery in project SpongeCommon by SpongePowered.

the class MemoryDataView method remove.

@Override
public DataView remove(DataQuery path) {
    checkNotNull(path, "path");
    List<String> parts = path.getParts();
    if (parts.size() > 1) {
        String subKey = parts.get(0);
        DataQuery subQuery = of(subKey);
        Optional<DataView> subViewOptional = this.getUnsafeView(subQuery);
        if (!subViewOptional.isPresent()) {
            return this;
        }
        DataView subView = subViewOptional.get();
        subView.remove(path.popFirst());
    } else {
        this.map.remove(parts.get(0));
    }
    return this;
}
Also used : DataView(org.spongepowered.api.data.DataView) DataQuery(org.spongepowered.api.data.DataQuery)

Example 25 with DataQuery

use of org.spongepowered.api.data.DataQuery in project SpongeCommon by SpongePowered.

the class SchematicTranslator method addTo.

@Override
public DataView addTo(Schematic schematic, DataView data) {
    final int xMin = schematic.getBlockMin().getX();
    final int yMin = schematic.getBlockMin().getY();
    final int zMin = schematic.getBlockMin().getZ();
    final int width = schematic.getBlockSize().getX();
    final int height = schematic.getBlockSize().getY();
    final int length = schematic.getBlockSize().getZ();
    if (width > MAX_SIZE || height > MAX_SIZE || length > MAX_SIZE) {
        throw new IllegalArgumentException(String.format("Schematic is larger than maximum allowable size (found: (%d, %d, %d) max: (%d, %<d, %<d)", width, height, length, MAX_SIZE));
    }
    data.set(DataQueries.Schematic.WIDTH, width);
    data.set(DataQueries.Schematic.HEIGHT, height);
    data.set(DataQueries.Schematic.LENGTH, length);
    data.set(DataQueries.Schematic.VERSION, VERSION);
    for (DataQuery metaKey : schematic.getMetadata().getKeys(false)) {
        data.set(DataQueries.Schematic.METADATA.then(metaKey), schematic.getMetadata().get(metaKey).get());
    }
    int[] offset = new int[] { -xMin, -yMin, -zMin };
    data.set(DataQueries.Schematic.OFFSET, offset);
    BlockPalette palette = schematic.getPalette();
    ByteArrayOutputStream buffer = new ByteArrayOutputStream(width * height * length);
    for (int y = 0; y < height; y++) {
        int y0 = yMin + y;
        for (int z = 0; z < length; z++) {
            int z0 = zMin + z;
            for (int x = 0; x < width; x++) {
                int x0 = xMin + x;
                BlockState state = schematic.getBlock(x0, y0, z0);
                int id = palette.getOrAssign(state);
                while ((id & -128) != 0) {
                    buffer.write(id & 127 | 128);
                    id >>>= 7;
                }
                buffer.write(id);
            }
        }
    }
    data.set(DataQueries.Schematic.BLOCK_DATA, buffer.toByteArray());
    if (palette.getType() == BlockPaletteTypes.LOCAL) {
        DataQuery paletteQuery = DataQueries.Schematic.PALETTE;
        for (BlockState state : palette.getEntries()) {
            // getOrAssign to skip the optional, it will never assign
            data.set(paletteQuery.then(state.getId()), palette.getOrAssign(state));
        }
        data.set(DataQueries.Schematic.PALETTE_MAX, palette.getHighestId());
    }
    List<DataView> tileEntities = Lists.newArrayList();
    for (Map.Entry<Vector3i, TileEntityArchetype> entry : schematic.getTileEntityArchetypes().entrySet()) {
        Vector3i pos = entry.getKey();
        DataContainer tiledata = entry.getValue().getTileData();
        int[] apos = new int[] { pos.getX() - xMin, pos.getY() - yMin, pos.getZ() - zMin };
        tiledata.set(DataQueries.Schematic.TILEENTITY_POS, apos);
        if (!tiledata.contains(DataQueries.CONTENT_VERSION)) {
            // Set a default content version of 1
            tiledata.set(DataQueries.CONTENT_VERSION, 1);
        }
        tileEntities.add(tiledata);
    }
    data.set(DataQueries.Schematic.TILEENTITY_DATA, tileEntities);
    return data;
}
Also used : BlockPalette(org.spongepowered.api.world.schematic.BlockPalette) ByteArrayOutputStream(java.io.ByteArrayOutputStream) DataView(org.spongepowered.api.data.DataView) DataContainer(org.spongepowered.api.data.DataContainer) BlockState(org.spongepowered.api.block.BlockState) Vector3i(com.flowpowered.math.vector.Vector3i) DataQuery(org.spongepowered.api.data.DataQuery) TileEntityArchetype(org.spongepowered.api.block.tileentity.TileEntityArchetype) Map(java.util.Map)

Aggregations

DataQuery (org.spongepowered.api.data.DataQuery)41 DataContainer (org.spongepowered.api.data.DataContainer)23 DataView (org.spongepowered.api.data.DataView)20 Test (org.junit.Test)14 Map (java.util.Map)12 ArrayList (java.util.ArrayList)7 List (java.util.List)7 DataTypeSerializer (org.lanternpowered.server.data.persistence.DataTypeSerializer)7 ImmutableMap (com.google.common.collect.ImmutableMap)4 TypeToken (com.google.common.reflect.TypeToken)4 Collection (java.util.Collection)4 HashMap (java.util.HashMap)4 Set (java.util.Set)4 Collectors (java.util.stream.Collectors)4 Nullable (javax.annotation.Nullable)4 CatalogType (org.spongepowered.api.CatalogType)4 DataSerializable (org.spongepowered.api.data.DataSerializable)4 Vector3i (com.flowpowered.math.vector.Vector3i)3 Lists (com.google.common.collect.Lists)3 LinkedHashMap (java.util.LinkedHashMap)3