use of org.spongepowered.api.data.value.Value in project SpongeCommon by SpongePowered.
the class MemoryDataView method getDataKeyList.
@Override
public Optional<List<Key<? extends Value<?>>>> getDataKeyList(final DataQuery path) {
Objects.requireNonNull(path, "path");
final Optional<List<ResourceKey>> resourceKeys = this.getResourceKeyList(path);
if (!resourceKeys.isPresent()) {
return Optional.empty();
}
final List<Key<? extends Value<?>>> keys = new ArrayList<>();
for (final ResourceKey resourceKey : resourceKeys.get()) {
KeyProvider.INSTANCE.get(resourceKey).ifPresent(keys::add);
}
if (keys.isEmpty()) {
return Optional.empty();
}
return Optional.of(keys);
}
use of org.spongepowered.api.data.value.Value in project SpongeCommon by SpongePowered.
the class SpongeMutableDataHolder method copyFrom.
@Override
default DataTransactionResult copyFrom(ValueContainer that, MergeFunction function) {
requireNonNull(that, "that");
requireNonNull(function, "function");
final DataTransactionResult.Builder builder = DataTransactionResult.builder();
boolean success = false;
if (function == MergeFunction.REPLACEMENT_PREFERRED) {
// Produce less garbage if we know we don't have to merge any values
for (final Value<?> replacement : that.getValues()) {
final DataTransactionResult result = this.offer(replacement);
builder.absorbResult(result);
if (result.isSuccessful()) {
success = true;
}
}
} else if (function == MergeFunction.ORIGINAL_PREFERRED) {
// Produce less garbage if we know we don't have to merge any values
for (final Value replacement : that.getValues()) {
final Key<Value<Object>> key = replacement.key();
if (this.get(key).isPresent()) {
continue;
}
final Value merged = function.merge(null, replacement);
final DataTransactionResult result = this.offer(merged);
builder.absorbResult(result);
if (result.isSuccessful()) {
success = true;
}
}
} else {
for (final Value replacement : that.getValues()) {
final Key<Value<Object>> key = replacement.key();
@Nullable final Value original = this.getValue(key).map(Value::asImmutable).orElse(null);
final Value merged = function.merge(original, replacement);
final DataTransactionResult result = this.offer(merged);
builder.absorbResult(result);
if (result.isSuccessful()) {
success = true;
}
}
}
if (success) {
builder.result(DataTransactionResult.Type.SUCCESS);
} else {
builder.result(DataTransactionResult.Type.FAILURE);
}
return builder.build();
}
use of org.spongepowered.api.data.value.Value in project SpongeCommon by SpongePowered.
the class CustomDataTest method onRegisterData.
@Listener
public void onRegisterData(final RegisterDataEvent event) {
final ResourceKey key = ResourceKey.of(this.plugin, "mydata");
this.myDataKey = Key.builder().key(key).elementType(Integer.class).build();
final DataProvider<Value<Integer>, Integer> blockDataProvider = DataProvider.mutableBuilder().key(this.myDataKey).dataHolder(ServerLocation.class).get(this::getData).set(this::setData).delete(this::removeData).build();
final DataStore dataStore = DataStore.of(this.myDataKey, DataQuery.of("mykey"), ItemStack.class, User.class, ServerPlayer.class, BlockEntity.class, Entity.class);
final DataRegistration myRegistration = DataRegistration.builder().dataKey(this.myDataKey).store(dataStore).provider(blockDataProvider).build();
event.register(myRegistration);
// Or if it is super simple data
this.mySimpleDataKey = Key.from(this.plugin, "mysimpledata", String.class);
event.register(DataRegistration.of(this.mySimpleDataKey, ItemStack.class));
this.myItemTypeKey = Key.from(this.plugin, "myitemtypedata", ItemType.class);
event.register(DataRegistration.of(this.myItemTypeKey, ItemStack.class));
}
use of org.spongepowered.api.data.value.Value in project SpongeCommon by SpongePowered.
the class DataProviderRegistrator method registerDataStoreDelegatingProvider.
public <H extends DataHolder, K, V extends Value<K>> void registerDataStoreDelegatingProvider(final Key<V> key, final Type typeToken) {
// Create dataprovider for mutable and immutable DataContainerHolders
if (GenericTypeReflector.isSuperType(DataProviderRegistrator.MUTABLE, typeToken)) {
this.asMutable(GenericTypeReflector.erase(typeToken)).create(key).get(holder -> {
final DataContainer dataContainer = ((DataContainerHolder) holder).data$getDataContainer();
return SpongeDataManager.getDatastoreRegistry().getDataStore(key, typeToken).deserialize(dataContainer).get(key).orElse(null);
}).set((holder, v) -> {
final DataContainer dataContainer = ((DataContainerHolder) holder).data$getDataContainer();
final DataManipulator.Mutable manipulator = DataManipulator.mutableOf();
manipulator.set(key, v);
SpongeDataManager.getDatastoreRegistry().getDataStore(key, typeToken).serialize(manipulator, dataContainer);
((DataContainerHolder.Mutable) holder).data$setDataContainer(dataContainer);
});
} else if (GenericTypeReflector.isSuperType(DataProviderRegistrator.IMMUTABLE, typeToken)) {
this.asImmutable((Class<? super H>) GenericTypeReflector.erase(typeToken)).create(key).get(holder -> {
final DataContainer dataContainer = ((DataContainerHolder) holder).data$getDataContainer();
return SpongeDataManager.getDatastoreRegistry().getDataStore(key, typeToken).deserialize(dataContainer).get(key).orElse(null);
}).set((holder, v) -> {
final DataContainer dataContainer = ((DataContainerHolder) holder).data$getDataContainer();
final DataManipulator.Mutable manipulator = DataManipulator.mutableOf();
manipulator.set(key, v);
SpongeDataManager.getDatastoreRegistry().getDataStore(key, typeToken).serialize(manipulator, dataContainer);
return (H) ((DataContainerHolder.Immutable) holder).data$withDataContainer(dataContainer);
});
}
}
use of org.spongepowered.api.data.value.Value in project SpongeCommon by SpongePowered.
the class SpongeDataHolderMixin method bridge$mergeDeserialized.
@Override
@SuppressWarnings({ "rawtypes", "unchecked" })
public void bridge$mergeDeserialized(final DataManipulator.Mutable manipulator) {
if (this.impl$manipulator == null) {
this.impl$manipulator = DataManipulator.mutableOf();
}
if (this instanceof DataHolder.Mutable && !(this instanceof org.spongepowered.api.item.inventory.ItemStack)) {
// Does not work when adding ItemStacks to inventory because the Item may be empty (see Inventory#addResource)
for (final Value.Immutable<?> value : manipulator.getValues()) {
final DataProvider provider = SpongeDataManager.getProviderRegistry().getProvider(value.key(), this.getClass());
provider.offerValue((DataHolder.Mutable) this, value);
}
} else {
this.impl$manipulator.copyFrom(manipulator);
}
}
Aggregations