diff --git a/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/DistributorAddon.java b/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/DistributorAddon.java index f28e5b02d..30f724f69 100644 --- a/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/DistributorAddon.java +++ b/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/DistributorAddon.java @@ -17,6 +17,7 @@ import com.dfsek.terra.addons.feature.distributor.config.PaddedGridDistributorTe import com.dfsek.terra.addons.feature.distributor.config.SamplerDistributorTemplate; import com.dfsek.terra.addons.feature.distributor.config.OrDistributorTemplate; import com.dfsek.terra.addons.feature.distributor.config.PointSetDistributorTemplate; +import com.dfsek.terra.addons.feature.distributor.config.XorDistributorTemplate; import com.dfsek.terra.addons.feature.distributor.config.YesDistributorTemplate; import com.dfsek.terra.addons.feature.distributor.util.Point; import com.dfsek.terra.addons.feature.distributor.util.PointTemplate; @@ -46,13 +47,16 @@ public class DistributorAddon implements AddonInitializer { .getHandler(FunctionalEventHandler.class) .register(addon, ConfigPackPreLoadEvent.class) .then(event -> { - CheckedRegistry>> distributorRegistry = event.getPack().getOrCreateRegistry( - DISTRIBUTOR_TOKEN); + CheckedRegistry>> distributorRegistry = event + .getPack() + .getOrCreateRegistry(DISTRIBUTOR_TOKEN); + distributorRegistry.register(addon.key("SAMPLER"), SamplerDistributorTemplate::new); distributorRegistry.register(addon.key("POINTS"), PointSetDistributorTemplate::new); distributorRegistry.register(addon.key("PADDED_GRID"), PaddedGridDistributorTemplate::new); distributorRegistry.register(addon.key("AND"), AndDistributorTemplate::new); distributorRegistry.register(addon.key("OR"), OrDistributorTemplate::new); + distributorRegistry.register(addon.key("XOR"), XorDistributorTemplate::new); distributorRegistry.register(addon.key("YES"), YesDistributorTemplate::new); distributorRegistry.register(addon.key("NO"), NoDistributorTemplate::new); diff --git a/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/config/XorDistributorTemplate.java b/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/config/XorDistributorTemplate.java new file mode 100644 index 000000000..8fb0e1e10 --- /dev/null +++ b/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/config/XorDistributorTemplate.java @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2020-2021 Polyhedral Development + * + * The Terra Core Addons are licensed under the terms of the MIT License. For more details, + * reference the LICENSE file in this module's root directory. + */ + +package com.dfsek.terra.addons.feature.distributor.config; + +import com.dfsek.tectonic.api.config.template.ValidatedConfigTemplate; +import com.dfsek.tectonic.api.config.template.annotations.Value; +import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; +import com.dfsek.tectonic.api.exception.ValidationException; + +import com.dfsek.terra.api.config.meta.Meta; +import com.dfsek.terra.api.structure.feature.Distributor; + +import java.util.List; + + +public class XorDistributorTemplate implements ObjectTemplate, ValidatedConfigTemplate { + @Value("distributors") + private @Meta List<@Meta Distributor> distributors; + + + @Override + public Distributor get() { + Distributor current = distributors.remove(0); + while(!distributors.isEmpty()) { + current = current.xor(distributors.remove(0)); + } + return current; + } + + @Override + public boolean validate() throws ValidationException { + if(distributors.isEmpty()) throw new ValidationException("XOR Distributor must specify at least 1 distributor."); + return true; + } +}