use of org.spongepowered.api.data.manipulator.DataManipulator in project SpongeCommon by SpongePowered.
the class MixinTileEntity method toContainer.
@Override
public DataContainer toContainer() {
final DataContainer container = DataContainer.createNew().set(Queries.CONTENT_VERSION, getContentVersion()).set(Queries.WORLD_ID, ((World) this.world).getUniqueId().toString()).set(Queries.POSITION_X, this.getPos().getX()).set(Queries.POSITION_Y, this.getPos().getY()).set(Queries.POSITION_Z, this.getPos().getZ()).set(DataQueries.BLOCK_ENTITY_TILE_TYPE, this.tileType.getId());
final NBTTagCompound compound = new NBTTagCompound();
this.writeToNBT(compound);
// We must filter the custom data so it isn't stored twice
NbtDataUtil.filterSpongeCustomData(compound);
container.set(DataQueries.UNSAFE_NBT, NbtTranslator.getInstance().translateFrom(compound));
final Collection<DataManipulator<?, ?>> manipulators = ((IMixinCustomDataHolder) this).getCustomManipulators();
if (!manipulators.isEmpty()) {
container.set(DataQueries.DATA_MANIPULATORS, DataUtil.getSerializedManipulatorList(manipulators));
}
return container;
}
use of org.spongepowered.api.data.manipulator.DataManipulator in project SpongeCommon by SpongePowered.
the class MixinWorld_Data method offer.
@Override
public DataTransactionResult offer(int x, int y, int z, DataManipulator<?, ?> manipulator, MergeFunction function) {
final BlockState blockState = getBlock(x, y, z).withExtendedProperties(new Location<>(this, x, y, z));
final ImmutableDataManipulator<?, ?> immutableDataManipulator = manipulator.asImmutable();
if (blockState.supports((Class) immutableDataManipulator.getClass())) {
final List<ImmutableValue<?>> old = new ArrayList<>(blockState.getValues());
final BlockState newState = blockState.with(immutableDataManipulator).get();
old.removeAll(newState.getValues());
setBlock(x, y, z, newState);
return DataTransactionResult.successReplaceResult(old, manipulator.getValues());
}
return getTileEntity(x, y, z).map(tileEntity -> tileEntity.offer(manipulator, function)).orElseGet(() -> DataTransactionResult.failResult(manipulator.getValues()));
}
use of org.spongepowered.api.data.manipulator.DataManipulator in project SpongeCommon by SpongePowered.
the class MixinEntity method toContainer.
@Override
public DataContainer toContainer() {
final Transform<World> transform = getTransform();
final NBTTagCompound compound = new NBTTagCompound();
writeToNBT(compound);
// We must filter the custom data so it isn't stored twice
NbtDataUtil.filterSpongeCustomData(compound);
final DataContainer unsafeNbt = NbtTranslator.getInstance().translateFrom(compound);
final DataContainer container = DataContainer.createNew().set(Queries.CONTENT_VERSION, getContentVersion()).set(DataQueries.ENTITY_CLASS, this.getClass().getName()).set(Queries.WORLD_ID, transform.getExtent().getUniqueId().toString()).createView(DataQueries.SNAPSHOT_WORLD_POSITION).set(Queries.POSITION_X, transform.getPosition().getX()).set(Queries.POSITION_Y, transform.getPosition().getY()).set(Queries.POSITION_Z, transform.getPosition().getZ()).getContainer().createView(DataQueries.ENTITY_ROTATION).set(Queries.POSITION_X, transform.getRotation().getX()).set(Queries.POSITION_Y, transform.getRotation().getY()).set(Queries.POSITION_Z, transform.getRotation().getZ()).getContainer().createView(DataQueries.ENTITY_SCALE).set(Queries.POSITION_X, transform.getScale().getX()).set(Queries.POSITION_Y, transform.getScale().getY()).set(Queries.POSITION_Z, transform.getScale().getZ()).getContainer().set(DataQueries.ENTITY_TYPE, this.entityType.getId()).set(DataQueries.UNSAFE_NBT, unsafeNbt);
final Collection<DataManipulator<?, ?>> manipulators = ((IMixinCustomDataHolder) this).getCustomManipulators();
if (!manipulators.isEmpty()) {
container.set(DataQueries.DATA_MANIPULATORS, DataUtil.getSerializedManipulatorList(manipulators));
}
return container;
}
use of org.spongepowered.api.data.manipulator.DataManipulator in project SpongeCommon by SpongePowered.
the class SpongeItemStackBuilder method fromContainer.
@Override
public ItemStack.Builder fromContainer(DataView container) {
checkNotNull(container);
if (!container.contains(DataQueries.ITEM_TYPE) || !container.contains(DataQueries.ITEM_COUNT) || !container.contains(DataQueries.ITEM_DAMAGE_VALUE)) {
return this;
}
reset();
final int count = getData(container, DataQueries.ITEM_COUNT, Integer.class);
quantity(count);
final String itemTypeId = getData(container, DataQueries.ITEM_TYPE, String.class);
final ItemType itemType = SpongeImpl.getRegistry().getType(ItemType.class, itemTypeId).get();
itemType(itemType);
this.damageValue = getData(container, DataQueries.ITEM_DAMAGE_VALUE, Integer.class);
if (container.contains(DataQueries.UNSAFE_NBT)) {
final NBTTagCompound compound = NbtTranslator.getInstance().translateData(container.getView(DataQueries.UNSAFE_NBT).get());
if (compound.hasKey(NbtDataUtil.SPONGE_DATA, NbtDataUtil.TAG_COMPOUND)) {
compound.removeTag(NbtDataUtil.SPONGE_DATA);
}
this.compound = compound;
}
if (container.contains(DataQueries.DATA_MANIPULATORS)) {
final List<DataView> views = container.getViewList(DataQueries.DATA_MANIPULATORS).get();
final SerializedDataTransaction transaction = DataUtil.deserializeManipulatorList(views);
final List<DataManipulator<?, ?>> manipulators = transaction.deserializedManipulators;
this.itemDataSet = new HashSet<>();
manipulators.forEach(this.itemDataSet::add);
}
return this;
}
use of org.spongepowered.api.data.manipulator.DataManipulator in project SpongeCommon by SpongePowered.
the class MixinItemStack method readFromNbt.
@Override
public void readFromNbt(NBTTagCompound compound) {
if (compound.hasKey(NbtDataUtil.CUSTOM_MANIPULATOR_TAG_LIST, NbtDataUtil.TAG_LIST)) {
final NBTTagList list = compound.getTagList(NbtDataUtil.CUSTOM_MANIPULATOR_TAG_LIST, NbtDataUtil.TAG_COMPOUND);
if (!list.hasNoTags()) {
compound.removeTag(NbtDataUtil.CUSTOM_MANIPULATOR_TAG_LIST);
final List<DataView> views = Lists.newArrayList();
for (int i = 0; i < list.tagCount(); i++) {
final NBTTagCompound dataCompound = list.getCompoundTagAt(i);
views.add(NbtTranslator.getInstance().translateFrom(dataCompound));
}
final SerializedDataTransaction transaction = DataUtil.deserializeManipulatorList(views);
final List<DataManipulator<?, ?>> manipulators = transaction.deserializedManipulators;
for (DataManipulator<?, ?> manipulator : manipulators) {
offerCustom(manipulator, MergeFunction.IGNORE_ALL);
}
if (!transaction.failedData.isEmpty()) {
addFailedData(transaction.failedData);
}
} else {
compound.removeTag(NbtDataUtil.CUSTOM_MANIPULATOR_TAG_LIST);
if (compound.hasNoTags()) {
getTagCompound().removeTag(NbtDataUtil.SPONGE_DATA);
return;
}
}
}
if (compound.hasKey(NbtDataUtil.FAILED_CUSTOM_DATA, NbtDataUtil.TAG_LIST)) {
final NBTTagList list = compound.getTagList(NbtDataUtil.FAILED_CUSTOM_DATA, NbtDataUtil.TAG_COMPOUND);
final ImmutableList.Builder<DataView> builder = ImmutableList.builder();
if (list.tagCount() != 0) {
for (int i = 0; i < list.tagCount(); i++) {
final NBTTagCompound internal = list.getCompoundTagAt(i);
builder.add(NbtTranslator.getInstance().translateFrom(internal));
}
}
// Re-attempt to deserialize custom data
final SerializedDataTransaction transaction = DataUtil.deserializeManipulatorList(builder.build());
final List<DataManipulator<?, ?>> manipulators = transaction.deserializedManipulators;
for (DataManipulator<?, ?> manipulator : manipulators) {
offer(manipulator);
}
if (!transaction.failedData.isEmpty()) {
this.addFailedData(transaction.failedData);
}
}
if (compound.hasNoTags()) {
getTagCompound().removeTag(NbtDataUtil.SPONGE_DATA);
if (getTagCompound().hasNoTags()) {
setTagCompound(null);
}
}
}
Aggregations