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());
}
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();
}
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;
}
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;
}
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;
}
Aggregations