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

CyclopsMC / IntegratedDynamics / 39559710586

21 Oct 2026 07:06AM UTC coverage: 48.358% (-0.3%) from 48.683%
39559710586

Pull #1766

github

web-flow
Merge ba5e4c0c2 into 5e2bd8ece
Pull Request #1766: Expression cards in the Logic Programmer, editable as text

4875 of 12840 branches covered (37.97%)

Branch coverage included in aggregate %.

15823 of 29962 relevant lines covered (52.81%)

2.59 hits per line

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

58.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
        //  as expressions call this type fluid. This keeps the saved unique name, but changes names that scripts use.
36
        super("fluidstack", ValueObjectTypeFluidStack.ValueFluidStack.class);
4 ✔
37
    }
1 ✔
38

39
    @Override
40
    public ValueFluidStack getDefault() {
41
        return ValueFluidStack.of(FluidStack.EMPTY);
×
42
    }
43

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

50
    @Override
51
    public Tag serialize(ValueDeseralizationContext valueDeseralizationContext, ValueFluidStack value) {
52
        return FluidStack.OPTIONAL_CODEC.encodeStart(valueDeseralizationContext.holderLookupProvider().createSerializationContext(NbtOps.INSTANCE), value.getRawValue()).getOrThrow();
11 ✔
53
    }
54

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

66
    @Override
67
    public String getName(ValueFluidStack a) {
68
        return toCompactString(a).getString();
×
69
    }
70

71
    @Override
72
    public boolean isNull(ValueFluidStack a) {
73
        return a.getRawValue().isEmpty();
×
74
    }
75

76
    @Override
77
    public ValueTypeLPElementBase createLogicProgrammerElement() {
78
        return new ValueTypeItemStackLPElement<>(this, new ValueTypeItemStackLPElement.IItemStackToValue<ValueObjectTypeFluidStack.ValueFluidStack>() {
12 ✔
79
            @Override
80
            public boolean isNullable() {
81
                return true;
×
82
            }
83

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

92
            @Override
93
            public ValueObjectTypeFluidStack.ValueFluidStack getValue(ItemStack itemStack) {
94
                return ValueObjectTypeFluidStack.ValueFluidStack.of(Helpers.getFluidStack(itemStack));
4 ✔
95
            }
96

97
            @Override
98
            public ItemStack getValueAsItemStack(ValueFluidStack value) {
99
                return value.getRawValue().getFluid().getFluidType().getBucket(value.getRawValue());
8 ✔
100
            }
101
        });
102
    }
103

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

111
    @ToString
×
112
    public static class ValueFluidStack extends ValueBase {
113

114
        private final FluidStack fluidStack;
115

116
        private ValueFluidStack(FluidStack itemStack) {
117
            super(ValueTypes.OBJECT_FLUIDSTACK);
3 ✔
118
            this.fluidStack = Objects.requireNonNull(itemStack, "Attempted to create a ValueFluidStack for a null FluidStack.");
6 ✔
119
        }
1 ✔
120

121
        public static ValueFluidStack of(FluidStack itemStack) {
122
            return new ValueFluidStack(itemStack);
5 ✔
123
        }
124

125
        public FluidStack getRawValue() {
126
            return fluidStack;
3 ✔
127
        }
128

129
        @Override
130
        public boolean equals(Object o) {
131
            return o instanceof ValueFluidStack && FluidStack.matches(this.getRawValue(), ((ValueFluidStack) o).getRawValue());
14 !
132
        }
133

134
        @Override
135
        public int hashCode() {
136
            return fluidStack.hashCode();
×
137
        }
138

139
    }
140

141
}
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