Skip to content

Commit 6d63e46

Browse files
committed
cleanup ItemStackMixin & add transformer helpers
1 parent 11ddbdd commit 6d63e46

File tree

7 files changed

+286
-180
lines changed

7 files changed

+286
-180
lines changed

examples/postInit/vanilla.groovy

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ crafting.shapedBuilder()
3434
crafting.shapedBuilder()
3535
.name('gold_v_to_clay')
3636
.output(item('minecraft:clay'))
37-
.shape([[item('minecraft:gold_ingot'),null,item('minecraft:gold_ingot')],[null,item('minecraft:gold_ingot'),null]])
37+
.shape([[item('minecraft:gold_ingot'),null,item('minecraft:gold_ingot')],[null,item('minecraft:stone_pickaxe').transformDamage(2).whenAnyDamage(),null]])
3838
.register()
3939

4040
//crafting.addShaped(resource('example:resource_location'), item('minecraft:clay'), [[item('minecraft:cobblestone')],[item('minecraft:nether_star')],[item('minecraft:cobblestone')]])
@@ -131,7 +131,7 @@ def presetKeys = [
131131
T: item('minecraft:tnt'),
132132
D: item('minecraft:diamond'),
133133
S: ore('netherStar').reuse(),
134-
'!': item('minecraft:tnt').transform({ _ -> item('minecraft:diamond') }),
134+
'!': item('minecraft:tnt').transform(item('minecraft:diamond')),
135135
G: ore('ingotGold'),
136136
W: fluid('water') * 1000, // Any tank that contains >= 1000 mb and can be reduced by 1000.
137137
'0': item('minecraft:diamond_sword').withNbt([display:[Name:'Sword with Specific NBT data']])
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package com.cleanroommc.groovyscript.compat.vanilla;
2+
3+
import com.cleanroommc.groovyscript.api.IIngredient;
4+
import com.cleanroommc.groovyscript.helper.ingredient.OreDictIngredient;
5+
import net.minecraft.item.ItemStack;
6+
import net.minecraft.util.text.TextFormatting;
7+
8+
public class ItemStackExpansion {
9+
10+
public static ItemStack setRarity(ItemStack self, TextFormatting color) {
11+
VanillaModule.rarity.set(color, self);
12+
return self;
13+
}
14+
15+
public static void addOreDict(ItemStack self, OreDictIngredient ingredient) {
16+
VanillaModule.oreDict.add(ingredient.getOreDict(), self);
17+
}
18+
19+
public static void removeOreDict(ItemStack self, OreDictIngredient ingredient) {
20+
VanillaModule.oreDict.remove(ingredient.getOreDict(), self);
21+
}
22+
23+
public static boolean leftShift(ItemStack self, IIngredient ingredient) {
24+
return ingredient.isCase(self) && ingredient.getAmount() >= self.getCount();
25+
}
26+
27+
public static boolean isSameExact(ItemStack self, ItemStack itemStack) {
28+
return ItemStack.areItemStacksEqual(self, itemStack);
29+
}
30+
31+
public static boolean isSame(ItemStack self, ItemStack itemStack, boolean ignoreNbt) {
32+
return ItemStack.areItemsEqual(self, itemStack) && (ignoreNbt || ItemStack.areItemStackTagsEqual(self, itemStack));
33+
}
34+
}
Lines changed: 212 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,212 @@
1+
package com.cleanroommc.groovyscript.compat.vanilla;
2+
3+
import com.cleanroommc.groovyscript.api.IIngredient;
4+
import com.cleanroommc.groovyscript.api.IMarkable;
5+
import com.cleanroommc.groovyscript.api.INBTResourceStack;
6+
import com.cleanroommc.groovyscript.api.INbtIngredient;
7+
import com.cleanroommc.groovyscript.helper.ingredient.IngredientHelper;
8+
import com.cleanroommc.groovyscript.helper.ingredient.NbtHelper;
9+
import net.minecraft.init.Items;
10+
import net.minecraft.item.ItemStack;
11+
import net.minecraft.item.crafting.Ingredient;
12+
import net.minecraft.nbt.NBTTagCompound;
13+
import net.minecraftforge.common.ForgeHooks;
14+
import net.minecraftforge.oredict.OreDictionary;
15+
import org.jetbrains.annotations.Nullable;
16+
17+
import java.util.function.Predicate;
18+
import java.util.function.UnaryOperator;
19+
20+
public interface ItemStackMixinExpansion extends IIngredient, INbtIngredient, IMarkable {
21+
22+
static ItemStackMixinExpansion of(ItemStack stack) {
23+
return (ItemStackMixinExpansion) (Object) stack;
24+
}
25+
26+
ItemStack grs$getItemStack();
27+
28+
@Nullable
29+
ItemStackTransformer grs$getTransformer();
30+
31+
@Nullable
32+
Predicate<NBTTagCompound> grs$getNbtMatcher();
33+
34+
@Nullable
35+
Predicate<ItemStack> grs$getMatcher();
36+
37+
void grs$setTransformer(ItemStackTransformer transformer);
38+
39+
void grs$setNbtMatcher(Predicate<NBTTagCompound> matcher);
40+
41+
void grs$setMatcher(Predicate<ItemStack> matcher);
42+
43+
default boolean grs$isEmpty() {
44+
return grs$getItemStack().isEmpty();
45+
}
46+
47+
@Override
48+
default ItemStackMixinExpansion exactCopy() {
49+
if (grs$isEmpty()) {
50+
return (ItemStackMixinExpansion) (Object) ItemStack.EMPTY;
51+
}
52+
ItemStackMixinExpansion copy = of(grs$getItemStack().copy());
53+
copy.setMark(getMark());
54+
copy.grs$setTransformer(grs$getTransformer());
55+
copy.grs$setMatcher(grs$getMatcher());
56+
copy.grs$setNbtMatcher(grs$getNbtMatcher());
57+
return copy;
58+
}
59+
60+
@Override
61+
default boolean test(ItemStack stack) {
62+
if (!OreDictionary.itemMatches(grs$getItemStack(), stack, false) &&
63+
(grs$getMatcher() == null || !grs$getMatcher().test(stack))) {
64+
return false;
65+
}
66+
if (grs$getNbtMatcher() != null) {
67+
NBTTagCompound nbt = stack.getTagCompound();
68+
return nbt != null && grs$getNbtMatcher().test(nbt);
69+
}
70+
return true;
71+
}
72+
73+
default ItemStack when(Predicate<ItemStack> matchCondition) {
74+
ItemStackMixinExpansion fresh = exactCopy();
75+
fresh.grs$setMatcher(matchCondition);
76+
return fresh.grs$getItemStack();
77+
}
78+
79+
default ItemStack whenAnyDamage() {
80+
return when(stack -> stack.getItem() == grs$getItemStack().getItem());
81+
}
82+
83+
default ItemStack whenAnyMeta() {
84+
return whenAnyDamage();
85+
}
86+
87+
default ItemStack transform(ItemStackTransformer transformer) {
88+
ItemStackMixinExpansion fresh = exactCopy();
89+
fresh.grs$setTransformer(transformer);
90+
return fresh.grs$getItemStack();
91+
}
92+
93+
default ItemStack reuse() {
94+
return transform(self -> self);
95+
}
96+
97+
default ItemStack noreturn() {
98+
return transform(self -> ItemStack.EMPTY);
99+
}
100+
101+
default ItemStack transform(ItemStack stack) {
102+
return transform(self -> stack);
103+
}
104+
105+
default ItemStack transformDamage(int amount) {
106+
return transform(self -> of(self).withDamage(Math.min(32767, Items.DIAMOND.getDamage(self) + amount)));
107+
}
108+
109+
default ItemStack transformDamage() {
110+
return transformDamage(1);
111+
}
112+
113+
default ItemStack transformNbt(UnaryOperator<NBTTagCompound> transformer) {
114+
return transform(self -> {
115+
of(self).exactCopy().grs$getItemStack().setTagCompound(transformer.apply(self.getTagCompound()));
116+
return self;
117+
});
118+
}
119+
120+
@Override
121+
default ItemStack applyTransform(ItemStack matchedInput) {
122+
if (grs$getTransformer() != null) {
123+
ItemStack result = grs$getTransformer().transform(matchedInput);
124+
if (result == null) return ItemStack.EMPTY;
125+
return result.copy();
126+
}
127+
return ForgeHooks.getContainerItem(matchedInput);
128+
}
129+
130+
@Override
131+
default Ingredient toMcIngredient() {
132+
return Ingredient.fromStacks(grs$getItemStack());
133+
}
134+
135+
@Override
136+
default ItemStack[] getMatchingStacks() {
137+
return new ItemStack[]{IngredientHelper.toItemStack(exactCopy())};
138+
}
139+
140+
@Override
141+
default int getAmount() {
142+
return grs$getItemStack().getCount();
143+
}
144+
145+
@Override
146+
default void setAmount(int amount) {
147+
grs$getItemStack().setCount(amount);
148+
}
149+
150+
151+
@Override
152+
default @Nullable NBTTagCompound getNbt() {
153+
return grs$getItemStack().getTagCompound();
154+
}
155+
156+
@Override
157+
default void setNbt(NBTTagCompound nbt) {
158+
grs$getItemStack().setTagCompound(nbt);
159+
}
160+
161+
@Override
162+
default INBTResourceStack withNbt(NBTTagCompound nbt) {
163+
ItemStackMixinExpansion itemStackMixin = (ItemStackMixinExpansion) INbtIngredient.super.withNbt(nbt);
164+
itemStackMixin.grs$setNbtMatcher(nbt1 -> nbt.isEmpty() || NbtHelper.containsNbt(nbt1, nbt));
165+
return itemStackMixin;
166+
}
167+
168+
@Override
169+
default INbtIngredient withNbtExact(NBTTagCompound nbt) {
170+
ItemStackMixinExpansion itemStackMixin = (ItemStackMixinExpansion) INbtIngredient.super.withNbt(nbt);
171+
if (nbt == null) {
172+
itemStackMixin.grs$setNbtMatcher(null);
173+
} else {
174+
itemStackMixin.grs$setNbtMatcher(nbt1 -> nbt.isEmpty() || nbt1.equals(nbt));
175+
}
176+
return itemStackMixin;
177+
}
178+
179+
default INbtIngredient withNbtFilter(Predicate<NBTTagCompound> nbtFilter) {
180+
this.grs$setNbtMatcher(nbtFilter == null ? nbt -> true : nbtFilter);
181+
return this;
182+
}
183+
184+
default INbtIngredient whenNoNbt() {
185+
setNbt(null);
186+
grs$setMatcher(self -> {
187+
NBTTagCompound nbt = self.getTagCompound();
188+
return nbt == null || nbt.isEmpty();
189+
});
190+
return this;
191+
}
192+
193+
default INbtIngredient whenAnyNbt() {
194+
setNbt(new NBTTagCompound());
195+
grs$setMatcher(self -> {
196+
NBTTagCompound nbt = self.getTagCompound();
197+
return nbt != null && !nbt.isEmpty();
198+
});
199+
return this;
200+
}
201+
202+
default ItemStack withMeta(int meta) {
203+
ItemStack itemStack = exactCopy().grs$getItemStack();
204+
// reliably set itemDamage field of item stack
205+
Items.DIAMOND.setDamage(itemStack, meta);
206+
return itemStack;
207+
}
208+
209+
default ItemStack withDamage(int meta) {
210+
return withMeta(meta);
211+
}
212+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package com.cleanroommc.groovyscript.compat.vanilla;
2+
3+
import net.minecraft.item.ItemStack;
4+
5+
public interface ItemStackTransformer {
6+
7+
ItemStack transform(ItemStack self);
8+
}

src/main/java/com/cleanroommc/groovyscript/compat/vanilla/RarityItemStackExpansion.java

Lines changed: 0 additions & 12 deletions
This file was deleted.

src/main/java/com/cleanroommc/groovyscript/compat/vanilla/VanillaModule.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ public static void initializeBinding() {
3636
GroovyScript.getSandbox().registerBinding(rarity);
3737
GroovyScript.getSandbox().registerBinding(inWorldCrafting);
3838

39-
ExpansionHelper.mixinClass(ItemStack.class, RarityItemStackExpansion.class);
39+
ExpansionHelper.mixinClass(ItemStack.class, ItemStackExpansion.class);
4040
}
4141

4242
@Override

0 commit comments

Comments
 (0)