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

CyclopsMC / IntegratedDynamics / 42512800491

08 Nov 2026 06:34PM UTC coverage: 58.683% (+0.3%) from 58.387%
42512800491

Pull #1783

github

claude
Merge remote-tracking branch 'origin/master-26-lts' into master-26

Ports the expressions of the Logic Programmer to Minecraft 26.3:
- Keys and mouse buttons use the SDL codes of InputConstants instead of GLFW.
  Undo and redo read the shortcut key, so they follow the keyboard layout, and
  Ctrl, or Cmd on macOS, comes from the key event, as Minecraft#hasControlDown
  no longer means Cmd on macOS.
- The expression text field starts SDL text input when it gets focus, without
  which no typed characters arrive.
- Blocks without properties are written as their id alone in 26.3, so a typed
  compound with only an id is kept when it is written as that id.
- MinMaxBounds, the screen, the left and top of containers, advancement icons and
  color names follow their 26.3 replacements.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MHtucHo4Qy2pTfBMgeE54y
Pull Request #1783: Upmerge expressions in the Logic Programmer to 26.3

5838 of 13555 branches covered (43.07%)

Branch coverage included in aggregate %.

26172 of 40992 relevant lines covered (63.85%)

3.35 hits per line

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

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

3
import net.minecraft.core.registries.BuiltInRegistries;
4
import net.minecraft.network.chat.Component;
5
import net.minecraft.network.chat.MutableComponent;
6
import net.minecraft.world.item.ItemStack;
7
import net.minecraft.world.level.storage.ValueInput;
8
import net.minecraft.world.level.storage.ValueOutput;
9
import net.neoforged.neoforge.capabilities.Capabilities;
10
import net.neoforged.neoforge.fluids.FluidStack;
11
import net.neoforged.neoforge.transfer.access.ItemAccess;
12
import org.cyclops.integrateddynamics.api.evaluate.variable.IValueTypeNamed;
13
import org.cyclops.integrateddynamics.api.evaluate.variable.IValueTypeNullable;
14
import org.cyclops.integrateddynamics.api.evaluate.variable.IValueTypeUniquelyNamed;
15
import org.cyclops.integrateddynamics.core.helper.Helpers;
16
import org.cyclops.integrateddynamics.core.helper.L10NValues;
17
import org.cyclops.integrateddynamics.core.logicprogrammer.ValueTypeItemStackLPElement;
18
import org.cyclops.integrateddynamics.core.logicprogrammer.ValueTypeLPElementBase;
19

20
import java.util.Objects;
21

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

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

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

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

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

52
    @Override
53
    public void serialize(ValueOutput valueOutput, ValueFluidStack value) {
54
        valueOutput.store("v", FluidStack.OPTIONAL_CODEC, value.getRawValue());
6 ✔
55
    }
1 ✔
56

57
    @Override
58
    public ValueFluidStack deserialize(ValueInput valueInput) {
59
        return ValueFluidStack.of(valueInput.read("v", FluidStack.OPTIONAL_CODEC).orElse(FluidStack.EMPTY));
9 ✔
60
    }
61

62
    @Override
63
    public String getName(ValueFluidStack a) {
64
        return toCompactString(a).getString();
×
65
    }
66

67
    @Override
68
    public boolean isNull(ValueFluidStack a) {
69
        return a.getRawValue().isEmpty();
×
70
    }
71

72
    @Override
73
    public ValueTypeLPElementBase createLogicProgrammerElement() {
74
        return new ValueTypeItemStackLPElement<>(this, new ValueTypeItemStackLPElement.IItemStackToValue<ValueObjectTypeFluidStack.ValueFluidStack>() {
17 ✔
75
            @Override
76
            public boolean isNullable() {
77
                return true;
×
78
            }
79

80
            @Override
81
            public Component validate(ItemStack itemStack) {
82
                return itemStack.isEmpty() ||
5 !
83
                        ItemAccess.forStack(itemStack).getCapability(Capabilities.Fluid.ITEM) != null ?
4 ✔
84
                        null :
2 ✔
85
                        Component.translatable(L10NValues.VALUETYPE_OBJECT_FLUID_ERROR_NOFLUID);
2 ✔
86
            }
87

88
            @Override
89
            public ValueObjectTypeFluidStack.ValueFluidStack getValue(ItemStack itemStack) {
90
                return ValueObjectTypeFluidStack.ValueFluidStack.of(Helpers.getFluidStack(itemStack));
4 ✔
91
            }
92

93
            @Override
94
            public ItemStack getValueAsItemStack(ValueFluidStack value) {
95
                return value.getRawValue().getFluid().getFluidType().getBucket(value.getRawValue());
8 ✔
96
            }
97
        });
98
    }
99

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

107
    public static class ValueFluidStack extends ValueBase {
108

109
        private final FluidStack fluidStack;
110

111
        private ValueFluidStack(FluidStack itemStack) {
112
            super(ValueTypes.OBJECT_FLUIDSTACK);
3 ✔
113
            this.fluidStack = Objects.requireNonNull(itemStack, "Attempted to create a ValueFluidStack for a null FluidStack.");
6 ✔
114
        }
1 ✔
115

116
        public static ValueFluidStack of(FluidStack itemStack) {
117
            return new ValueFluidStack(itemStack);
5 ✔
118
        }
119

120
        public FluidStack getRawValue() {
121
            return fluidStack;
3 ✔
122
        }
123

124
        @Override
125
        public boolean equals(Object o) {
126
            return o instanceof ValueFluidStack && FluidStack.matches(this.getRawValue(), ((ValueFluidStack) o).getRawValue());
14 !
127
        }
128

129
        @Override
130
        public int hashCode() {
131
            return fluidStack.hashCode();
×
132
        }
133

134
        @Override
135
        public String toString() {
136
            return "ValueFluidStack(fluidStack=" + this.fluidStack + ")";
5 ✔
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