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

CyclopsMC / IntegratedDynamics / 39312498789

19 Oct 2026 07:36PM UTC coverage: 48.454% (-0.2%) from 48.683%
39312498789

Pull #1766

github

claude
Color the types in the list of methods and types

The types in the list, such as Integer next to integer and the inputs
and output of methods, are shown in the colors of their types, as in
tooltips and in the footer. The selected entry gets a gray background
instead of a blue one, on which the blue of Boolean was hard to read.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MHtucHo4Qy2pTfBMgeE54y
Pull Request #1766: Expression cards in the Logic Programmer, editable as text

4812 of 12674 branches covered (37.97%)

Branch coverage included in aggregate %.

15726 of 29713 relevant lines covered (52.93%)

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