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

CyclopsMC / IntegratedDynamics / 16705267059

03 Aug 2025 12:59PM UTC coverage: 53.099% (+0.008%) from 53.091%
16705267059

push

github

rubensworks
Make ItemStack serialization more compact

2866 of 8744 branches covered (32.78%)

Branch coverage included in aggregate %.

17325 of 29281 relevant lines covered (59.17%)

3.07 hits per line

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

23.08
/src/main/java/org/cyclops/integrateddynamics/core/evaluate/variable/ValueObjectTypeItemStack.java
1
package org.cyclops.integrateddynamics.core.evaluate.variable;
2

3
import lombok.ToString;
4
import net.minecraft.advancements.critereon.ItemPredicate;
5
import net.minecraft.core.registries.BuiltInRegistries;
6
import net.minecraft.network.chat.Component;
7
import net.minecraft.network.chat.MutableComponent;
8
import net.minecraft.world.item.ItemStack;
9
import net.minecraft.world.level.storage.ValueInput;
10
import net.minecraft.world.level.storage.ValueOutput;
11
import org.cyclops.commoncapabilities.api.capability.itemhandler.ItemMatch;
12
import org.cyclops.cyclopscore.helper.IModHelpers;
13
import org.cyclops.integrateddynamics.api.advancement.criterion.ValuePredicate;
14
import org.cyclops.integrateddynamics.api.evaluate.EvaluationException;
15
import org.cyclops.integrateddynamics.api.evaluate.variable.IValueTypeNamed;
16
import org.cyclops.integrateddynamics.api.evaluate.variable.IValueTypeNullable;
17
import org.cyclops.integrateddynamics.api.evaluate.variable.IValueTypeUniquelyNamed;
18
import org.cyclops.integrateddynamics.core.logicprogrammer.ValueTypeItemStackLPElement;
19
import org.cyclops.integrateddynamics.core.logicprogrammer.ValueTypeLPElementBase;
20

21
import java.util.Objects;
22
import java.util.Optional;
23

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

33
    public ValueObjectTypeItemStack() {
34
        super("itemstack", ValueObjectTypeItemStack.ValueItemStack.class);
4✔
35
    }
1✔
36

37
    public static MutableComponent getItemStackDisplayNameUsSafe(ItemStack itemStack) throws NoSuchMethodException {
38
        return !itemStack.isEmpty()
×
39
                ? (itemStack.getHoverName().copy().append((itemStack.getCount() > 1 ? " (" + itemStack.getCount() + ")" : "")))
×
40
                : Component.literal("");
×
41
    }
42

43
    public static MutableComponent getItemStackDisplayNameSafe(ItemStack itemStack) {
44
        // Certain mods may call client-side only methods,
45
        // so call a server-side-safe fallback method if that fails.
46
        try {
47
            return getItemStackDisplayNameUsSafe(itemStack);
×
48
        } catch (NoSuchMethodException e) {
×
49
            return Component.translatable(itemStack.getItem().getDescriptionId());
×
50
        }
51
    }
52

53
    @Override
54
    public ValueItemStack getDefault() {
55
        return ValueItemStack.of(ItemStack.EMPTY);
×
56
    }
57

58
    @Override
59
    public MutableComponent toCompactString(ValueItemStack value) {
60
        return ValueObjectTypeItemStack.getItemStackDisplayNameSafe(value.getRawValue());
×
61
    }
62

63
    @Override
64
    public void serialize(ValueOutput valueOutput, ValueItemStack value) {
65
        ItemStack itemStack;
66
        itemStack = value.getRawValue();
×
67
        int count = itemStack.getCount();
×
68
        if (itemStack.getCount() > 99) {
×
69
            itemStack = itemStack.copy();
×
70
            itemStack.setCount(99);
×
71
        }
72
        if (count > 127) {
×
73
            valueOutput.child("v").putInt("ExtendedCount", count);
×
74
        }
75
        valueOutput.store("v", ItemStack.OPTIONAL_CODEC, itemStack);
×
76
    }
×
77

78
    @Override
79
    public ValueItemStack deserialize(ValueInput valueInput) {
80
        ItemStack itemStack = valueInput.read("v", ItemStack.OPTIONAL_CODEC).orElseThrow();
×
81
        valueInput.child("v").orElseThrow().getInt("ExtendedCount").ifPresent(itemStack::setCount);
×
82
        return ValueItemStack.of(itemStack);
×
83
    }
84

85
    @Override
86
    public String getName(ValueItemStack a) {
87
        return toCompactString(a).getString();
×
88
    }
89

90
    @Override
91
    public boolean isNull(ValueItemStack a) {
92
        return a.getRawValue().isEmpty();
×
93
    }
94

95
    @Override
96
    public ValueTypeLPElementBase createLogicProgrammerElement() {
97
        return new ValueTypeItemStackLPElement<>(this, new ValueTypeItemStackLPElement.IItemStackToValue<ValueObjectTypeItemStack.ValueItemStack>() {
×
98
            @Override
99
            public boolean isNullable() {
100
                return true;
×
101
            }
102

103
            @Override
104
            public Component validate(ItemStack itemStack) {
105
                return null;
×
106
            }
107

108
            @Override
109
            public ValueObjectTypeItemStack.ValueItemStack getValue(ItemStack itemStack) {
110
                return ValueObjectTypeItemStack.ValueItemStack.of(itemStack);
×
111
            }
112

113
            @Override
114
            public ItemStack getValueAsItemStack(ValueItemStack value) {
115
                return value.getRawValue();
×
116
            }
117
        });
118
    }
119

120
    @Override
121
    public ValueItemStack materialize(ValueItemStack value) throws EvaluationException {
122
        return ValueItemStack.of(value.getRawValue().copy());
×
123
    }
124

125
    @Override
126
    public String getUniqueName(ValueItemStack value) {
127
        ItemStack itemStack = value.getRawValue();
×
128
        return !itemStack.isEmpty() ? BuiltInRegistries.ITEM.getKey(itemStack.getItem()).toString() : "";
×
129
    }
130

131
    @ToString
5✔
132
    public static class ValueItemStack extends ValueBase {
133

134
        private final ItemStack itemStack;
135

136
        private ValueItemStack(ItemStack itemStack) {
137
            super(ValueTypes.OBJECT_ITEMSTACK);
3✔
138
            this.itemStack = Objects.requireNonNull(itemStack, "Attempted to create a ValueItemStack for a null ItemStack.");
6✔
139
        }
1✔
140

141
        public static ValueItemStack of(ItemStack itemStack) {
142
            return new ValueItemStack(itemStack);
5✔
143
        }
144

145
        public ItemStack getRawValue() {
146
            return itemStack;
3✔
147
        }
148

149
        @Override
150
        public boolean equals(Object o) {
151
            return o instanceof ValueItemStack && ItemMatch.areItemStacksEqual(((ValueItemStack) o).itemStack, this.itemStack, ItemMatch.EXACT);
15!
152
        }
153

154
        @Override
155
        public int hashCode() {
156
            return 37 + IModHelpers.get().getItemStackHelpers().getItemStackHashCode(itemStack);
×
157
        }
158
    }
159

160
    public static class ValueItemStackPredicate extends ValuePredicate<ValueItemStack> {
161

162
        private final Optional<ItemPredicate> itemPredicate;
163

164
        public ValueItemStackPredicate(Optional<ItemPredicate> itemPredicate) {
165
            super(Optional.of(ValueTypes.OBJECT_ITEMSTACK), Optional.empty(), Optional.empty());
6✔
166
            this.itemPredicate = itemPredicate;
3✔
167
        }
1✔
168

169
        public Optional<ItemPredicate> getItemPredicate() {
170
            return itemPredicate;
×
171
        }
172

173
        @Override
174
        protected boolean testTyped(ValueItemStack value) {
175
            return super.testTyped(value) && (itemPredicate.isEmpty() || itemPredicate.get().test(value.getRawValue()));
×
176
        }
177
    }
178

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

© 2026 Coveralls, Inc