• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

CyclopsMC / IntegratedDynamics / 42496019643

08 Nov 2026 03:40PM UTC coverage: 49.451% (+0.07%) from 49.377%
42496019643

push

github

web-flow
Add Expressions support to the Logic Programmer (#1766)

This allows constant values and multiple nested operators
to be combined within a single variable card, without having
to combine multiple variable cards.

These expressions can either be created through the existing
Logic Programmer interface, or they can be written in a text-form
for easy exchange across worlds and players.

5080 of 13034 branches covered (38.97%)

Branch coverage included in aggregate %.

16343 of 30288 relevant lines covered (53.96%)

2.65 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

61.7
/src/main/java/org/cyclops/integrateddynamics/core/evaluate/variable/ValueObjectTypeFluidStack.java
1
package org.cyclops.integrateddynamics.core.evaluate.variable;
2

3
import lombok.ToString;
4
import net.minecraft.core.registries.BuiltInRegistries;
5
import net.minecraft.nbt.CompoundTag;
6
import net.minecraft.nbt.NbtOps;
7
import net.minecraft.nbt.Tag;
8
import net.minecraft.network.chat.Component;
9
import net.minecraft.network.chat.MutableComponent;
10
import net.minecraft.world.item.ItemStack;
11
import net.neoforged.neoforge.fluids.FluidStack;
12
import net.neoforged.neoforge.fluids.FluidUtil;
13
import org.cyclops.integrateddynamics.api.evaluate.variable.IValueTypeNamed;
14
import org.cyclops.integrateddynamics.api.evaluate.variable.IValueTypeNullable;
15
import org.cyclops.integrateddynamics.api.evaluate.variable.IValueTypeUniquelyNamed;
16
import org.cyclops.integrateddynamics.api.evaluate.variable.ValueDeseralizationContext;
17
import org.cyclops.integrateddynamics.core.helper.Helpers;
18
import org.cyclops.integrateddynamics.core.helper.L10NValues;
19
import org.cyclops.integrateddynamics.core.logicprogrammer.ValueTypeItemStackLPElement;
20
import org.cyclops.integrateddynamics.core.logicprogrammer.ValueTypeLPElementBase;
21

22
import java.util.Objects;
23

24
/**
25
 * Value type with values that are fluidstacks.
26
 * @author rubensworks
27
 */
28
public class ValueObjectTypeFluidStack extends ValueObjectTypeBase<ValueObjectTypeFluidStack.ValueFluidStack> implements
29
        IValueTypeNamed<ValueObjectTypeFluidStack.ValueFluidStack>,
30
        IValueTypeUniquelyNamed<ValueObjectTypeFluidStack.ValueFluidStack>,
31
        IValueTypeNullable<ValueObjectTypeFluidStack.ValueFluidStack> {
32

33
    public ValueObjectTypeFluidStack() {
34
        // TODO: in next major, prefix the global interact names of operators on fluids with fluid instead of fluidstack.
35
        super("fluidstack", ValueObjectTypeFluidStack.ValueFluidStack.class);
4 ✔
36
    }
1 ✔
37

38
    @Override
39
    public String getExpressionName() {
40
        return "Fluid";
2 ✔
41
    }
42

43
    @Override
44
    public ValueFluidStack getDefault() {
45
        return ValueFluidStack.of(FluidStack.EMPTY);
×
46
    }
47

48
    @Override
49
    public MutableComponent toCompactString(ValueFluidStack value) {
50
        FluidStack fluidStack = value.getRawValue();
×
51
        return !fluidStack.isEmpty() ? fluidStack.getHoverName().copy().append(String.format(" (%s mB)", fluidStack.getAmount())) : Component.literal("");
×
52
    }
53

54
    @Override
55
    public Tag serialize(ValueDeseralizationContext valueDeseralizationContext, ValueFluidStack value) {
56
        return FluidStack.OPTIONAL_CODEC.encodeStart(valueDeseralizationContext.holderLookupProvider().createSerializationContext(NbtOps.INSTANCE), value.getRawValue()).getOrThrow();
11 ✔
57
    }
58

59
    @Override
60
    public ValueFluidStack deserialize(ValueDeseralizationContext valueDeseralizationContext, Tag value) {
61
        if (value instanceof CompoundTag) {
3 !
62
            FluidStack fluidStack = FluidStack.OPTIONAL_CODEC.decode(valueDeseralizationContext.holderLookupProvider().createSerializationContext(NbtOps.INSTANCE), value)
7 ✔
63
                    .getOrThrow().getFirst();
5 ✔
64
            return ValueFluidStack.of(fluidStack);
3 ✔
65
        } else {
66
            return null;
×
67
        }
68
    }
69

70
    @Override
71
    public String getName(ValueFluidStack a) {
72
        return toCompactString(a).getString();
×
73
    }
74

75
    @Override
76
    public boolean isNull(ValueFluidStack a) {
77
        return a.getRawValue().isEmpty();
×
78
    }
79

80
    @Override
81
    public ValueTypeLPElementBase createLogicProgrammerElement() {
82
        return new ValueTypeItemStackLPElement<>(this, new ValueTypeItemStackLPElement.IItemStackToValue<ValueObjectTypeFluidStack.ValueFluidStack>() {
12 ✔
83
            @Override
84
            public boolean isNullable() {
85
                return true;
×
86
            }
87

88
            @Override
89
            public Component validate(ItemStack itemStack) {
90
                return itemStack.isEmpty() ||
5 !
91
                        FluidUtil.getFluidHandler(itemStack).isPresent() ?
3 ✔
92
                        null :
2 ✔
93
                        Component.translatable(L10NValues.VALUETYPE_OBJECT_FLUID_ERROR_NOFLUID);
2 ✔
94
            }
95

96
            @Override
97
            public ValueObjectTypeFluidStack.ValueFluidStack getValue(ItemStack itemStack) {
98
                return ValueObjectTypeFluidStack.ValueFluidStack.of(Helpers.getFluidStack(itemStack));
4 ✔
99
            }
100

101
            @Override
102
            public ItemStack getValueAsItemStack(ValueFluidStack value) {
103
                return value.getRawValue().getFluid().getFluidType().getBucket(value.getRawValue());
8 ✔
104
            }
105
        });
106
    }
107

108
    @Override
109
    public String getUniqueName(ValueFluidStack value) {
110
        FluidStack fluidStack = value.getRawValue();
×
111
        return !fluidStack.isEmpty() ?
×
112
                String.format("%s %s", BuiltInRegistries.FLUID.getKey(fluidStack.getFluid()), fluidStack.getAmount()) : "";
×
113
    }
114

115
    @ToString
5 ✔
116
    public static class ValueFluidStack extends ValueBase {
117

118
        private final FluidStack fluidStack;
119

120
        private ValueFluidStack(FluidStack itemStack) {
121
            super(ValueTypes.OBJECT_FLUIDSTACK);
3 ✔
122
            this.fluidStack = Objects.requireNonNull(itemStack, "Attempted to create a ValueFluidStack for a null FluidStack.");
6 ✔
123
        }
1 ✔
124

125
        public static ValueFluidStack of(FluidStack itemStack) {
126
            return new ValueFluidStack(itemStack);
5 ✔
127
        }
128

129
        public FluidStack getRawValue() {
130
            return fluidStack;
3 ✔
131
        }
132

133
        @Override
134
        public boolean equals(Object o) {
135
            return o instanceof ValueFluidStack && FluidStack.matches(this.getRawValue(), ((ValueFluidStack) o).getRawValue());
14 !
136
        }
137

138
        @Override
139
        public int hashCode() {
140
            return fluidStack.hashCode();
×
141
        }
142

143
    }
144

145
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE TRIAL · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc