Search in sources :

Example 1 with Value

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);
}
Also used : Value(org.spongepowered.api.data.value.Value) ArrayList(java.util.ArrayList) ArrayList(java.util.ArrayList) ImmutableList(com.google.common.collect.ImmutableList) List(java.util.List) ResourceKey(org.spongepowered.api.ResourceKey) Key(org.spongepowered.api.data.Key) ResourceKey(org.spongepowered.api.ResourceKey)

Example 2 with Value

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();
}
Also used : CollectionValue(org.spongepowered.api.data.value.CollectionValue) Value(org.spongepowered.api.data.value.Value) MapValue(org.spongepowered.api.data.value.MapValue) DataTransactionResult(org.spongepowered.api.data.DataTransactionResult) Key(org.spongepowered.api.data.Key) SpongeKey(org.spongepowered.common.data.key.SpongeKey)

Example 3 with Value

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));
}
Also used : DataRegistration(org.spongepowered.api.data.DataRegistration) DataStore(org.spongepowered.api.data.persistence.DataStore) ItemType(org.spongepowered.api.item.ItemType) Value(org.spongepowered.api.data.value.Value) ItemStack(org.spongepowered.api.item.inventory.ItemStack) ResourceKey(org.spongepowered.api.ResourceKey) Listener(org.spongepowered.api.event.Listener)

Example 4 with Value

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);
        });
    }
}
Also used : DataContainer(org.spongepowered.api.data.persistence.DataContainer) Arrays(java.util.Arrays) SpongeDataRegistrationBuilder(org.spongepowered.common.data.SpongeDataRegistrationBuilder) BiFunction(java.util.function.BiFunction) DataRegistration(org.spongepowered.api.data.DataRegistration) DataView(org.spongepowered.api.data.persistence.DataView) ImmutableDataProviderBuilder(org.spongepowered.api.data.ImmutableDataProviderBuilder) DataTransactionResult(org.spongepowered.api.data.DataTransactionResult) Function(java.util.function.Function) Supplier(java.util.function.Supplier) Value(org.spongepowered.api.data.value.Value) SpongeDataManager(org.spongepowered.common.data.SpongeDataManager) DataManipulator(org.spongepowered.api.data.DataManipulator) DataStore(org.spongepowered.api.data.persistence.DataStore) BiConsumer(java.util.function.BiConsumer) ResourceKey(org.spongepowered.api.ResourceKey) MutableDataProviderBuilder(org.spongepowered.api.data.MutableDataProviderBuilder) DataContainerHolder(org.spongepowered.common.bridge.data.DataContainerHolder) Nullable(org.checkerframework.checker.nullness.qual.Nullable) SpongeDataStoreBuilder(org.spongepowered.common.data.persistence.datastore.SpongeDataStoreBuilder) DataContentUpdater(org.spongepowered.api.data.persistence.DataContentUpdater) SpongeDataRegistration(org.spongepowered.common.data.SpongeDataRegistration) DefaultedRegistryReference(org.spongepowered.api.registry.DefaultedRegistryReference) TypeTokenUtil(org.spongepowered.common.util.TypeTokenUtil) DataProvider(org.spongepowered.api.data.DataProvider) Sponge(org.spongepowered.api.Sponge) DataHolder(org.spongepowered.api.data.DataHolder) TypeToken(io.leangen.geantyref.TypeToken) Key(org.spongepowered.api.data.Key) Consumer(java.util.function.Consumer) CopyHelper(org.spongepowered.common.util.CopyHelper) Type(java.lang.reflect.Type) Optional(java.util.Optional) OptBool(org.spongepowered.api.util.OptBool) GenericTypeReflector(io.leangen.geantyref.GenericTypeReflector) DataContainer(org.spongepowered.api.data.persistence.DataContainer) DataContainerHolder(org.spongepowered.common.bridge.data.DataContainerHolder) DataManipulator(org.spongepowered.api.data.DataManipulator)

Example 5 with Value

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);
    }
}
Also used : DataProvider(org.spongepowered.api.data.DataProvider) DataHolder(org.spongepowered.api.data.DataHolder) SimpleNBTDataHolder(org.spongepowered.common.data.holder.SimpleNBTDataHolder) Value(org.spongepowered.api.data.value.Value)

Aggregations

Value (org.spongepowered.api.data.value.Value)7 Key (org.spongepowered.api.data.Key)4 ResourceKey (org.spongepowered.api.ResourceKey)3 GenericTypeReflector (io.leangen.geantyref.GenericTypeReflector)2 TypeToken (io.leangen.geantyref.TypeToken)2 Type (java.lang.reflect.Type)2 ArrayList (java.util.ArrayList)2 List (java.util.List)2 Supplier (java.util.function.Supplier)2 Nullable (org.checkerframework.checker.nullness.qual.Nullable)2 DataHolder (org.spongepowered.api.data.DataHolder)2 DataProvider (org.spongepowered.api.data.DataProvider)2 DataRegistration (org.spongepowered.api.data.DataRegistration)2 DataTransactionResult (org.spongepowered.api.data.DataTransactionResult)2 DataStore (org.spongepowered.api.data.persistence.DataStore)2 MapValue (org.spongepowered.api.data.value.MapValue)2 Preconditions (com.google.common.base.Preconditions)1 ImmutableList (com.google.common.collect.ImmutableList)1 TypeFactory (io.leangen.geantyref.TypeFactory)1 ParameterizedType (java.lang.reflect.ParameterizedType)1