Search in sources :

Example 1 with SorterItemStackFilter

use of mekanism.common.content.transporter.SorterItemStackFilter in project Mekanism by mekanism.

the class CCArgumentWrapper method convertMapToFilter.

@Nullable
private static Object convertMapToFilter(Class<?> expectedType, Map<?, ?> map) {
    // We may want to try improving this at some point, or somehow making it slightly less hardcoded
    // but for now this will have to do
    Object type = map.get("type");
    if (type instanceof String) {
        // Handle filters as arguments, this may not be the best implementation, but it will do for now
        FilterType filterType = sanitizeStringToEnum(FilterType.class, (String) type);
        if (filterType != null) {
            IFilter<?> filter = BaseFilter.fromType(filterType);
            if (expectedType.isInstance(filter)) {
                // Validate the filter is of the type we expect
                if (filter instanceof IItemStackFilter) {
                    ItemStack stack = tryCreateFilterItem(map.get("item"), map.get("itemNBT"));
                    if (stack.isEmpty()) {
                        return null;
                    }
                    ((IItemStackFilter<?>) filter).setItemStack(stack);
                } else if (filter instanceof IMaterialFilter) {
                    ItemStack stack = tryCreateFilterItem(map.get("materialItem"), null);
                    if (stack.isEmpty()) {
                        return null;
                    }
                    ((IMaterialFilter<?>) filter).setMaterialItem(stack);
                } else if (filter instanceof IModIDFilter) {
                    String modId = tryGetFilterModId(map.get("modId"));
                    if (modId == null) {
                        return null;
                    }
                    ((IModIDFilter<?>) filter).setModID(modId);
                } else if (filter instanceof ITagFilter) {
                    String tag = tryGetFilterTag(map.get("tag"));
                    if (tag == null) {
                        return null;
                    }
                    ((ITagFilter<?>) filter).setTagName(tag);
                }
                if (filter instanceof MinerFilter) {
                    MinerFilter<?> minerFilter = (MinerFilter<?>) filter;
                    minerFilter.requiresReplacement = getBooleanFromRaw(map.get("requiresReplacement"));
                    minerFilter.replaceTarget = tryCreateItem(map.get("replaceTarget"));
                } else if (filter instanceof SorterFilter) {
                    SorterFilter<?> sorterFilter = (SorterFilter<?>) filter;
                    sorterFilter.allowDefault = getBooleanFromRaw(map.get("allowDefault"));
                    Object rawColor = map.get("color");
                    if (rawColor instanceof String) {
                        sorterFilter.color = sanitizeStringToEnum(EnumColor.class, (String) rawColor);
                    }
                    sorterFilter.sizeMode = getBooleanFromRaw(map.get("size"));
                    sorterFilter.min = getIntFromRaw(map.get("min"));
                    sorterFilter.max = getIntFromRaw(map.get("max"));
                    if (sorterFilter.min < 0 || sorterFilter.max < 0 || sorterFilter.min > sorterFilter.max || sorterFilter.max > 64) {
                        return null;
                    }
                    if (sorterFilter instanceof SorterItemStackFilter) {
                        SorterItemStackFilter sorterItemFilter = (SorterItemStackFilter) sorterFilter;
                        sorterItemFilter.fuzzyMode = getBooleanFromRaw(map.get("fuzzy"));
                    }
                } else if (filter instanceof QIOFilter) {
                    QIOFilter<?> qioFilter = (QIOFilter<?>) filter;
                    if (qioFilter instanceof QIOItemStackFilter) {
                        QIOItemStackFilter qioItemFilter = (QIOItemStackFilter) qioFilter;
                        qioItemFilter.fuzzyMode = getBooleanFromRaw(map.get("fuzzy"));
                    }
                } else if (filter instanceof OredictionificatorFilter) {
                    OredictionificatorFilter<?, ?, ?> oredictionificatorFilter = (OredictionificatorFilter<?, ?, ?>) filter;
                    Object rawTag = map.get("target");
                    if (!(rawTag instanceof String)) {
                        return null;
                    }
                    String tag = (String) rawTag;
                    if (tag.isEmpty()) {
                        return null;
                    }
                    ResourceLocation rl = ResourceLocation.tryParse(tag);
                    if (rl == null || !TileEntityOredictionificator.isValidTarget(rl)) {
                        return null;
                    }
                    oredictionificatorFilter.setFilter(rl);
                    if (oredictionificatorFilter instanceof OredictionificatorItemFilter) {
                        Item item = tryCreateItem(map.get("selected"));
                        if (item != Items.AIR) {
                            ((OredictionificatorItemFilter) oredictionificatorFilter).setSelectedOutput(item);
                        }
                    }
                }
                return filter;
            }
        }
    }
    return null;
}
Also used : SorterFilter(mekanism.common.content.transporter.SorterFilter) IMaterialFilter(mekanism.common.content.filter.IMaterialFilter) MinerFilter(mekanism.common.content.miner.MinerFilter) QIOItemStackFilter(mekanism.common.content.qio.filter.QIOItemStackFilter) ITagFilter(mekanism.common.content.filter.ITagFilter) Item(net.minecraft.item.Item) FilterType(mekanism.common.content.filter.FilterType) IItemStackFilter(mekanism.common.content.filter.IItemStackFilter) SorterItemStackFilter(mekanism.common.content.transporter.SorterItemStackFilter) ResourceLocation(net.minecraft.util.ResourceLocation) QIOFilter(mekanism.common.content.qio.filter.QIOFilter) OredictionificatorFilter(mekanism.common.content.oredictionificator.OredictionificatorFilter) ItemStack(net.minecraft.item.ItemStack) IModIDFilter(mekanism.common.content.filter.IModIDFilter) OredictionificatorItemFilter(mekanism.common.content.oredictionificator.OredictionificatorItemFilter) Nullable(javax.annotation.Nullable)

Example 2 with SorterItemStackFilter

use of mekanism.common.content.transporter.SorterItemStackFilter in project Mekanism by mekanism.

the class CCArgumentWrapper method wrapReturnType.

private static Object wrapReturnType(Object result) {
    if (result == null || result instanceof Number || result instanceof Boolean || result instanceof String) {
        // Short circuit if it doesn't need wrapping
        return result;
    } else if (result instanceof ResourceLocation || result instanceof UUID) {
        return result.toString();
    } else if (result instanceof ForgeRegistryEntry<?>) {
        return getName((ForgeRegistryEntry<?>) result);
    } else if (result instanceof ChemicalStack<?>) {
        ChemicalStack<?> stack = (ChemicalStack<?>) result;
        Map<String, Object> wrapped = new HashMap<>(2);
        wrapped.put("name", getName(stack.getType()));
        wrapped.put("amount", stack.getAmount());
        return wrapped;
    } else if (result instanceof FluidStack) {
        FluidStack stack = (FluidStack) result;
        return wrapStack(stack.getFluid(), "amount", stack.getAmount(), stack.getTag());
    } else if (result instanceof ItemStack) {
        ItemStack stack = (ItemStack) result;
        return wrapStack(stack.getItem(), "count", stack.getCount(), stack.getTag());
    } else if (result instanceof INBT) {
        Object wrapped = wrapNBT((INBT) result);
        if (wrapped != null) {
            return wrapped;
        }
    } else if (result instanceof Vector3i) {
        // BlockPos is covered by this case
        Vector3i pos = (Vector3i) result;
        Map<String, Object> wrapped = new HashMap<>(3);
        wrapped.put("x", pos.getX());
        wrapped.put("y", pos.getY());
        wrapped.put("z", pos.getZ());
        return wrapped;
    } else if (result instanceof Coord4D) {
        // BlockPos is covered by this case
        Coord4D coord = (Coord4D) result;
        Map<String, Object> wrapped = new HashMap<>(4);
        wrapped.put("x", coord.getX());
        wrapped.put("y", coord.getY());
        wrapped.put("z", coord.getZ());
        wrapped.put("dimension", wrapReturnType(coord.dimension.location()));
        return wrapped;
    } else if (result instanceof Frequency) {
        FrequencyIdentity identity = ((Frequency) result).getIdentity();
        Map<String, Object> wrapped = new HashMap<>(2);
        wrapped.put("key", wrapReturnType(identity.getKey()));
        wrapped.put("public", identity.isPublic());
        return wrapped;
    } else if (result instanceof Enum) {
        return ((Enum<?>) result).name();
    } else if (result instanceof IFilter) {
        Map<String, Object> wrapped = new HashMap<>();
        wrapped.put("type", wrapReturnType(((IFilter<?>) result).getFilterType()));
        if (result instanceof IItemStackFilter) {
            ItemStack stack = ((IItemStackFilter<?>) result).getItemStack();
            wrapped.put("item", wrapReturnType(stack.getItem()));
            if (!stack.isEmpty()) {
                CompoundNBT tag = stack.getTag();
                if (tag != null && !tag.isEmpty()) {
                    wrapped.put("itemNBT", wrapNBT(tag));
                }
            }
        } else if (result instanceof IMaterialFilter) {
            wrapped.put("materialItem", wrapReturnType(((IMaterialFilter<?>) result).getMaterialItem().getItem()));
        } else if (result instanceof IModIDFilter) {
            wrapped.put("modId", ((IModIDFilter<?>) result).getModID());
        } else if (result instanceof ITagFilter) {
            wrapped.put("tag", ((ITagFilter<?>) result).getTagName());
        }
        if (result instanceof MinerFilter) {
            MinerFilter<?> minerFilter = (MinerFilter<?>) result;
            wrapped.put("requiresReplacement", minerFilter.requiresReplacement);
            wrapped.put("replaceTarget", wrapReturnType(minerFilter.replaceTarget));
        } else if (result instanceof SorterFilter) {
            SorterFilter<?> sorterFilter = (SorterFilter<?>) result;
            wrapped.put("allowDefault", sorterFilter.allowDefault);
            wrapped.put("color", wrapReturnType(sorterFilter.color));
            wrapped.put("size", sorterFilter.sizeMode);
            wrapped.put("min", sorterFilter.min);
            wrapped.put("max", sorterFilter.max);
            if (sorterFilter instanceof SorterItemStackFilter) {
                SorterItemStackFilter filter = (SorterItemStackFilter) sorterFilter;
                wrapped.put("fuzzy", filter.fuzzyMode);
            }
        } else if (result instanceof QIOFilter) {
            QIOFilter<?> qioFilter = (QIOFilter<?>) result;
            if (qioFilter instanceof QIOItemStackFilter) {
                QIOItemStackFilter filter = (QIOItemStackFilter) qioFilter;
                wrapped.put("fuzzy", filter.fuzzyMode);
            }
        } else if (result instanceof OredictionificatorFilter) {
            OredictionificatorFilter<?, ?, ?> filter = (OredictionificatorFilter<?, ?, ?>) result;
            wrapped.put("target", filter.getFilterText());
            wrapped.put("selected", wrapReturnType(filter.getResultElement()));
        }
        return wrapped;
    } else if (result instanceof Map) {
        return ((Map<?, ?>) result).entrySet().stream().collect(Collectors.toMap(entry -> wrapReturnType(entry.getKey()), entry -> wrapReturnType(entry.getValue()), (a, b) -> b));
    } else if (result instanceof Collection) {
        // so there is no real difference at that point about the type it is
        return ((Collection<?>) result).stream().map(CCArgumentWrapper::wrapReturnType).collect(Collectors.toList());
    } else if (result instanceof Object[]) {
        // Note: This doesn't handle/deal with primitive arrays
        return Arrays.stream((Object[]) result).map(CCArgumentWrapper::wrapReturnType).toArray();
    }
    return result;
}
Also used : SorterFilter(mekanism.common.content.transporter.SorterFilter) Arrays(java.util.Arrays) OredictionificatorFilter(mekanism.common.content.oredictionificator.OredictionificatorFilter) ByteArrayNBT(net.minecraft.nbt.ByteArrayNBT) ChemicalStack(mekanism.api.chemical.ChemicalStack) Item(net.minecraft.item.Item) BiFunction(java.util.function.BiFunction) Constants(net.minecraftforge.common.util.Constants) Frequency(mekanism.common.lib.frequency.Frequency) CompoundNBT(net.minecraft.nbt.CompoundNBT) FloatNBT(net.minecraft.nbt.FloatNBT) QIOItemStackFilter(mekanism.common.content.qio.filter.QIOItemStackFilter) InputValidator(mekanism.common.util.text.InputValidator) IArguments(dan200.computercraft.api.lua.IArguments) TileEntityOredictionificator(mekanism.common.tile.machine.TileEntityOredictionificator) Locale(java.util.Locale) Map(java.util.Map) QIOFilter(mekanism.common.content.qio.filter.QIOFilter) SorterFilter(mekanism.common.content.transporter.SorterFilter) ByteNBT(net.minecraft.nbt.ByteNBT) ListNBT(net.minecraft.nbt.ListNBT) ForgeRegistryEntry(net.minecraftforge.registries.ForgeRegistryEntry) FilterType(mekanism.common.content.filter.FilterType) Collection(java.util.Collection) Set(java.util.Set) UUID(java.util.UUID) Collectors(java.util.stream.Collectors) ITagFilter(mekanism.common.content.filter.ITagFilter) IntNBT(net.minecraft.nbt.IntNBT) BaseFilter(mekanism.common.content.filter.BaseFilter) IModIDFilter(mekanism.common.content.filter.IModIDFilter) Optional(java.util.Optional) Vector3i(net.minecraft.util.math.vector.Vector3i) FluidStack(net.minecraftforge.fluids.FluidStack) IFilter(mekanism.common.content.filter.IFilter) ForgeRegistries(net.minecraftforge.registries.ForgeRegistries) IntStream(java.util.stream.IntStream) MethodResult(dan200.computercraft.api.lua.MethodResult) EnumColor(mekanism.api.text.EnumColor) LuaException(dan200.computercraft.api.lua.LuaException) ComputerArgumentHandler(mekanism.common.integration.computer.ComputerArgumentHandler) HashMap(java.util.HashMap) OredictionificatorItemFilter(mekanism.common.content.oredictionificator.OredictionificatorItemFilter) ItemStack(net.minecraft.item.ItemStack) FloatingLong(mekanism.api.math.FloatingLong) BiConsumer(java.util.function.BiConsumer) NumberNBT(net.minecraft.nbt.NumberNBT) Nullable(javax.annotation.Nullable) INBT(net.minecraft.nbt.INBT) LongArrayNBT(net.minecraft.nbt.LongArrayNBT) StringNBT(net.minecraft.nbt.StringNBT) EndNBT(net.minecraft.nbt.EndNBT) DoubleNBT(net.minecraft.nbt.DoubleNBT) VisibleForTesting(org.jetbrains.annotations.VisibleForTesting) IMaterialFilter(mekanism.common.content.filter.IMaterialFilter) CollectionNBT(net.minecraft.nbt.CollectionNBT) ShortNBT(net.minecraft.nbt.ShortNBT) MinerFilter(mekanism.common.content.miner.MinerFilter) Items(net.minecraft.item.Items) IntArrayNBT(net.minecraft.nbt.IntArrayNBT) Coord4D(mekanism.api.Coord4D) SorterItemStackFilter(mekanism.common.content.transporter.SorterItemStackFilter) IItemStackFilter(mekanism.common.content.filter.IItemStackFilter) LongNBT(net.minecraft.nbt.LongNBT) ResourceLocation(net.minecraft.util.ResourceLocation) DoublePredicate(java.util.function.DoublePredicate) Collections(java.util.Collections) FrequencyIdentity(mekanism.common.lib.frequency.Frequency.FrequencyIdentity) HashMap(java.util.HashMap) FluidStack(net.minecraftforge.fluids.FluidStack) FrequencyIdentity(mekanism.common.lib.frequency.Frequency.FrequencyIdentity) QIOItemStackFilter(mekanism.common.content.qio.filter.QIOItemStackFilter) IItemStackFilter(mekanism.common.content.filter.IItemStackFilter) INBT(net.minecraft.nbt.INBT) SorterItemStackFilter(mekanism.common.content.transporter.SorterItemStackFilter) ResourceLocation(net.minecraft.util.ResourceLocation) Coord4D(mekanism.api.Coord4D) QIOFilter(mekanism.common.content.qio.filter.QIOFilter) UUID(java.util.UUID) ChemicalStack(mekanism.api.chemical.ChemicalStack) CompoundNBT(net.minecraft.nbt.CompoundNBT) IMaterialFilter(mekanism.common.content.filter.IMaterialFilter) MinerFilter(mekanism.common.content.miner.MinerFilter) ForgeRegistryEntry(net.minecraftforge.registries.ForgeRegistryEntry) ITagFilter(mekanism.common.content.filter.ITagFilter) IFilter(mekanism.common.content.filter.IFilter) Vector3i(net.minecraft.util.math.vector.Vector3i) Frequency(mekanism.common.lib.frequency.Frequency) OredictionificatorFilter(mekanism.common.content.oredictionificator.OredictionificatorFilter) Collection(java.util.Collection) ItemStack(net.minecraft.item.ItemStack) IModIDFilter(mekanism.common.content.filter.IModIDFilter) Map(java.util.Map) HashMap(java.util.HashMap)

Aggregations

Nullable (javax.annotation.Nullable)2 FilterType (mekanism.common.content.filter.FilterType)2 IItemStackFilter (mekanism.common.content.filter.IItemStackFilter)2 IMaterialFilter (mekanism.common.content.filter.IMaterialFilter)2 IModIDFilter (mekanism.common.content.filter.IModIDFilter)2 ITagFilter (mekanism.common.content.filter.ITagFilter)2 MinerFilter (mekanism.common.content.miner.MinerFilter)2 OredictionificatorFilter (mekanism.common.content.oredictionificator.OredictionificatorFilter)2 OredictionificatorItemFilter (mekanism.common.content.oredictionificator.OredictionificatorItemFilter)2 QIOFilter (mekanism.common.content.qio.filter.QIOFilter)2 QIOItemStackFilter (mekanism.common.content.qio.filter.QIOItemStackFilter)2 SorterFilter (mekanism.common.content.transporter.SorterFilter)2 SorterItemStackFilter (mekanism.common.content.transporter.SorterItemStackFilter)2 Item (net.minecraft.item.Item)2 ItemStack (net.minecraft.item.ItemStack)2 ResourceLocation (net.minecraft.util.ResourceLocation)2 IArguments (dan200.computercraft.api.lua.IArguments)1 LuaException (dan200.computercraft.api.lua.LuaException)1 MethodResult (dan200.computercraft.api.lua.MethodResult)1 Arrays (java.util.Arrays)1