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

CyclopsMC / IntegratedDynamics / 13739195914

08 Mar 2025 03:58PM UTC coverage: 39.059% (+0.06%) from 39.002%
13739195914

push

github

rubensworks
Merge remote-tracking branch 'origin/master-1.21-lts' into master-1.21

1966 of 8373 branches covered (23.48%)

Branch coverage included in aggregate %.

10307 of 23049 relevant lines covered (44.72%)

2.1 hits per line

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

14.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.nbt.CompoundTag;
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 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.*;
16
import org.cyclops.integrateddynamics.core.logicprogrammer.ValueTypeItemStackLPElement;
17
import org.cyclops.integrateddynamics.core.logicprogrammer.ValueTypeLPElementBase;
18

19
import java.util.Objects;
20
import java.util.Optional;
21

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

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

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

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

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

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

61
    @Override
62
    public Tag serialize(ValueDeseralizationContext valueDeseralizationContext, ValueItemStack value) {
63
        CompoundTag tag = new CompoundTag();
×
64
        ItemStack itemStack = value.getRawValue();
×
65
        if(!itemStack.isEmpty()) {
×
66
            tag.putInt("count", itemStack.getCount());
×
67
            return itemStack.save(valueDeseralizationContext.holderLookupProvider(), tag);
×
68
        }
69
        return tag;
×
70
    }
71

72
    @Override
73
    public ValueItemStack deserialize(ValueDeseralizationContext valueDeseralizationContext, Tag value) {
74
        if (value instanceof CompoundTag tag && !tag.isEmpty()) {
×
75
            // Forge returns air for tags with negative count,
76
            // so we set it to 1 for deserialization and fix it afterwards.
77
            int realCount = tag.getInt("count");
×
78
            // Consider the tag immutable, to avoid changes elsewhere
79
            tag = tag.copy();
×
80
            tag.putInt("count", 1);
×
81
            ItemStack itemStack = ItemStack.parseOptional(valueDeseralizationContext.holderLookupProvider(), tag);
×
82
            if (!itemStack.isEmpty()) {
×
83
                itemStack.setCount(realCount);
×
84
            }
85
            return ValueItemStack.of(itemStack);
×
86
        } else {
87
            return ValueItemStack.of(ItemStack.EMPTY);
×
88
        }
89
    }
90

91
    @Override
92
    public String getName(ValueItemStack a) {
93
        return toCompactString(a).getString();
×
94
    }
95

96
    @Override
97
    public boolean isNull(ValueItemStack a) {
98
        return a.getRawValue().isEmpty();
×
99
    }
100

101
    @Override
102
    public ValueTypeLPElementBase createLogicProgrammerElement() {
103
        return new ValueTypeItemStackLPElement<>(this, new ValueTypeItemStackLPElement.IItemStackToValue<ValueObjectTypeItemStack.ValueItemStack>() {
×
104
            @Override
105
            public boolean isNullable() {
106
                return true;
×
107
            }
108

109
            @Override
110
            public Component validate(ItemStack itemStack) {
111
                return null;
×
112
            }
113

114
            @Override
115
            public ValueObjectTypeItemStack.ValueItemStack getValue(ItemStack itemStack) {
116
                return ValueObjectTypeItemStack.ValueItemStack.of(itemStack);
×
117
            }
118
        });
119
    }
120

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

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

132
    @ToString
×
133
    public static class ValueItemStack extends ValueBase {
134

135
        private final ItemStack itemStack;
136

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

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

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

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

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

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

163
        private final Optional<ItemPredicate> itemPredicate;
164

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

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

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

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