use of org.spongepowered.api.data.DataView in project SpongeCommon by SpongePowered.
the class SpongeBlockSnapshot method toContainer.
@Override
public DataContainer toContainer() {
final DataContainer container = DataContainer.createNew().set(Queries.CONTENT_VERSION, getContentVersion()).set(Queries.WORLD_ID, this.worldUniqueId.toString()).createView(DataQueries.SNAPSHOT_WORLD_POSITION).set(Queries.POSITION_X, this.pos.getX()).set(Queries.POSITION_Y, this.pos.getY()).set(Queries.POSITION_Z, this.pos.getZ()).getContainer().set(DataQueries.BLOCK_STATE, this.blockState);
if (this.blockState != this.extendedState) {
container.set(DataQueries.BLOCK_EXTENDED_STATE, this.extendedState);
}
if (this.compound != null) {
container.set(DataQueries.UNSAFE_NBT, NbtTranslator.getInstance().translateFrom(this.compound));
}
final List<DataView> dataList = DataUtil.getSerializedImmutableManipulatorList(this.extraData);
if (!dataList.isEmpty()) {
container.set(DataQueries.SNAPSHOT_TILE_DATA, dataList);
}
return container;
}
use of org.spongepowered.api.data.DataView 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.DataView 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.DataView in project SpongeCommon by SpongePowered.
the class LegacySchematicTranslator 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.LEGACY_MATERIALS, "Alpha");
// These are added for better interop with WorldEdit
data.set(DataQueries.Schematic.LEGACY_OFFSET_X, -xMin);
data.set(DataQueries.Schematic.LEGACY_OFFSET_Y, -yMin);
data.set(DataQueries.Schematic.LEGACY_OFFSET_Z, -zMin);
SaveIterator itr = new SaveIterator(width, height, length);
schematic.getBlockWorker().iterate(itr);
byte[] blockids = itr.blockids;
byte[] extraids = itr.extraids;
byte[] blockdata = itr.blockdata;
data.set(DataQueries.Schematic.LEGACY_BLOCKS, blockids);
data.set(DataQueries.Schematic.LEGACY_BLOCK_DATA, blockdata);
if (extraids != null) {
data.set(DataQueries.Schematic.LEGACY_ADD_BLOCKS, extraids);
}
List<DataView> tileEntities = Lists.newArrayList();
for (Map.Entry<Vector3i, TileEntityArchetype> entry : schematic.getTileEntityArchetypes().entrySet()) {
Vector3i pos = entry.getKey();
DataContainer tiledata = entry.getValue().getTileData();
tiledata.set(DataQueries.X_POS, pos.getX() - xMin);
tiledata.set(DataQueries.Y_POS, pos.getY() - yMin);
tiledata.set(DataQueries.Z_POS, pos.getZ() - zMin);
tileEntities.add(tiledata);
}
data.set(DataQueries.Schematic.LEGACY_TILEDATA, tileEntities);
return data;
}
use of org.spongepowered.api.data.DataView 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