Skip to content

Commit d23ac46

Browse files
authored
Fallback property container for all installed mods (#289)
* fallback mod container * for item iterator * make ingredient instead of iterable * reviews * [i] operator for item stacks, make OreDictIngredient extend ItemsIngredient, improvements * fixes & allow range in [] op * spotless * more
1 parent 9c13622 commit d23ac46

File tree

13 files changed

+236
-118
lines changed

13 files changed

+236
-118
lines changed

examples/postInit/custom/vanilla.groovy

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,17 +21,21 @@ log.info(ore_iron >> (item_iron * 3)) // false
2121
println file.path
2222
}*/
2323

24+
for (var stack in mods.minecraft.allItems[5..12]) {
25+
log.info stack
26+
}
27+
2428
// Crafting recipes are typically created via recipe builder, but also have shorthand versions for some common uses.
2529
// Here are a series of examples, with the shorthand and corresponding recipe builder:
2630

2731
//crafting.addShaped(item('minecraft:gold_block'), [[item('minecraft:gold_ingot'),item('minecraft:gold_ingot'),item('minecraft:gold_ingot')],[null, null, null],[item('minecraft:gold_ingot'),item('minecraft:gold_ingot'),item('minecraft:gold_ingot')]])
28-
crafting.shapedBuilder()
32+
mods.minecraft.crafting.shapedBuilder()
2933
.output(item('minecraft:gold_block'))
3034
.shape([[item('minecraft:gold_ingot'),item('minecraft:gold_ingot'),item('minecraft:gold_ingot')],[null, null, null],[item('minecraft:gold_ingot'),item('minecraft:gold_ingot'),item('minecraft:gold_ingot')]])
3135
.register()
3236

3337
//crafting.addShaped('gold_v_to_clay', item('minecraft:clay'), [[item('minecraft:gold_ingot'),null,item('minecraft:gold_ingot')],[null,item('minecraft:gold_ingot'),null]])
34-
crafting.shapedBuilder()
38+
minecraft.crafting.shapedBuilder()
3539
.name('gold_v_to_clay')
3640
.output(item('minecraft:clay'))
3741
.shape([[item('minecraft:gold_ingot'),null,item('minecraft:gold_ingot')],[null,item('minecraft:stone_pickaxe').transformDamage(2).whenAnyDamage(),null]])

src/main/java/com/cleanroommc/groovyscript/GroovyScript.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,6 @@ public static void initializeGroovyPreInit() {
165165
// called via mixin in between construction and fml pre init
166166
ObjectMapperManager.init();
167167
StandardInfoParserRegistry.init();
168-
VanillaModule.initializeBinding();
169168
ModSupport.init();
170169
for (ObjectMapper<?> goh : ObjectMapperManager.getObjectMappers()) {
171170
getSandbox().registerBinding(goh);

src/main/java/com/cleanroommc/groovyscript/api/IIngredient.java

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,15 @@
11
package com.cleanroommc.groovyscript.api;
22

33
import com.cleanroommc.groovyscript.helper.ingredient.OrIngredient;
4+
import com.google.common.collect.AbstractIterator;
5+
import groovy.lang.IntRange;
46
import net.minecraft.item.ItemStack;
57
import net.minecraft.item.crafting.Ingredient;
68
import net.minecraftforge.common.ForgeHooks;
79
import net.minecraftforge.fluids.FluidStack;
810
import org.jetbrains.annotations.Nullable;
911

12+
import java.util.Iterator;
1013
import java.util.function.Predicate;
1114

1215
/**
@@ -51,6 +54,33 @@ default boolean isCase(ItemStack ingredient) {
5154
return ingredient != null && test(ingredient);
5255
}
5356

57+
// [i] operator
58+
default ItemStack getAt(int index) {
59+
ItemStack[] stacks = getMatchingStacks();
60+
while (index < 0) index += stacks.length;
61+
return getMatchingStacks()[index];
62+
}
63+
64+
default ItemStack getFirst() {
65+
return getAt(0);
66+
}
67+
68+
// allows using a range in [] operator like [5..12]
69+
default Iterable<ItemStack> getAt(IntRange range) {
70+
return () -> new AbstractIterator<>() {
71+
72+
private final Iterator<Integer> it = range.iterator();
73+
74+
@Override
75+
protected ItemStack computeNext() {
76+
if (it.hasNext()) {
77+
return getAt(it.next());
78+
}
79+
return endOfData();
80+
}
81+
};
82+
}
83+
5484
@Override
5585
default IIngredient withAmount(int amount) {
5686
IIngredient iIngredientStack = exactCopy();
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
package com.cleanroommc.groovyscript.compat.mods;
2+
3+
import com.cleanroommc.groovyscript.helper.ingredient.ItemsIngredient;
4+
import net.minecraft.creativetab.CreativeTabs;
5+
import net.minecraft.item.Item;
6+
import net.minecraft.item.ItemStack;
7+
import net.minecraft.util.NonNullList;
8+
import net.minecraftforge.fml.common.Loader;
9+
import net.minecraftforge.fml.common.ModContainer;
10+
import net.minecraftforge.fml.common.registry.ForgeRegistries;
11+
12+
import java.util.ArrayList;
13+
import java.util.List;
14+
15+
public class ForgeModWrapper {
16+
17+
private ModContainer container;
18+
private ItemsIngredient items;
19+
20+
public ForgeModWrapper(ModContainer container) {
21+
this.container = container;
22+
}
23+
24+
public ForgeModWrapper() {}
25+
26+
void initialize(String owner) {
27+
this.container = Loader.instance().getIndexedModList().get(owner);
28+
if (this.container == null) {
29+
throw new IllegalStateException("Can't create property container for unloaded mod!");
30+
}
31+
}
32+
33+
public ItemsIngredient getAllItems() {
34+
if (this.items == null) {
35+
List<ItemStack> items = new ArrayList<>();
36+
NonNullList<ItemStack> stacks = NonNullList.create();
37+
for (Item item : ForgeRegistries.ITEMS) {
38+
if (item.getRegistryName().getNamespace().equals(container.getModId())) {
39+
item.getSubItems(CreativeTabs.SEARCH, stacks);
40+
items.addAll(stacks);
41+
stacks.clear();
42+
}
43+
}
44+
this.items = new ItemsIngredient(items);
45+
}
46+
return this.items;
47+
}
48+
49+
public ModContainer getContainer() {
50+
return container;
51+
}
52+
53+
public String getId() {
54+
return this.container.getModId();
55+
}
56+
57+
public String getName() {
58+
return this.container.getName();
59+
}
60+
61+
public String getVersion() {
62+
return this.container.getVersion();
63+
}
64+
}

src/main/java/com/cleanroommc/groovyscript/compat/mods/GroovyPropertyContainer.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
import java.util.Collections;
1818
import java.util.Map;
1919

20-
public class GroovyPropertyContainer {
20+
public class GroovyPropertyContainer extends ForgeModWrapper {
2121

2222
private final Map<String, INamed> properties = new Object2ObjectOpenHashMap<>();
2323
private final Map<String, INamed> view = Collections.unmodifiableMap(properties);
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
package com.cleanroommc.groovyscript.compat.mods;
2+
3+
import com.cleanroommc.groovyscript.compat.vanilla.VanillaModule;
4+
import com.google.common.base.Supplier;
5+
import com.google.common.base.Suppliers;
6+
import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet;
7+
import org.jetbrains.annotations.NotNull;
8+
9+
import java.util.Collection;
10+
import java.util.Collections;
11+
import java.util.Set;
12+
13+
public final class MinecraftModContainer extends GroovyContainer<VanillaModule> {
14+
15+
private static final String modId = "minecraft";
16+
private static final String containerName = "Minecraft";
17+
private final Supplier<VanillaModule> modProperty;
18+
private final Collection<String> aliases;
19+
20+
MinecraftModContainer() {
21+
this.modProperty = Suppliers.memoize(() -> {
22+
VanillaModule t = VanillaModule.INSTANCE;
23+
t.addPropertyFieldsOf(t, false);
24+
return t;
25+
});
26+
Set<String> aliasSet = new ObjectOpenHashSet<>();
27+
aliasSet.add("mc");
28+
aliasSet.add(modId);
29+
this.aliases = Collections.unmodifiableSet(aliasSet);
30+
ModSupport.INSTANCE.registerContainer(this);
31+
}
32+
33+
@Override
34+
public boolean isLoaded() {
35+
return true;
36+
}
37+
38+
@Override
39+
public @NotNull Collection<String> getAliases() {
40+
return aliases;
41+
}
42+
43+
@Override
44+
public VanillaModule get() {
45+
return modProperty.get();
46+
}
47+
48+
@Override
49+
public @NotNull String getModId() {
50+
return modId;
51+
}
52+
53+
@Override
54+
public @NotNull String getContainerName() {
55+
return containerName;
56+
}
57+
58+
@Override
59+
public void onCompatLoaded(GroovyContainer<?> container) {}
60+
}

src/main/java/com/cleanroommc/groovyscript/compat/mods/ModSupport.java

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,9 +68,11 @@
6868
import com.cleanroommc.groovyscript.compat.mods.tinkersconstruct.TinkersConstruct;
6969
import com.cleanroommc.groovyscript.compat.mods.woot.Woot;
7070
import com.cleanroommc.groovyscript.sandbox.expand.ExpansionHelper;
71+
import com.google.common.base.Suppliers;
7172
import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
7273
import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet;
7374
import net.minecraftforge.fml.common.Loader;
75+
import net.minecraftforge.fml.common.ModContainer;
7476
import net.minecraftforge.fml.common.discovery.ASMDataTable;
7577
import org.jetbrains.annotations.ApiStatus;
7678
import org.jetbrains.annotations.NotNull;
@@ -87,6 +89,8 @@ public class ModSupport {
8789

8890
public static final ModSupport INSTANCE = new ModSupport(); // Just for Binding purposes
8991

92+
public static final MinecraftModContainer MINECRAFT = new MinecraftModContainer();
93+
9094
public static final GroovyContainer<ActuallyAdditions> ACTUALLY_ADDITIONS = new InternalModContainer<>("actuallyadditions", "Actually Additions", ActuallyAdditions::new, "aa");
9195
public static final GroovyContainer<AdditionalEnchantedMiner> ADDITIONAL_ENCHANTED_MINER = new InternalModContainer<>("quarryplus", "Additional Enchanted Miner", AdditionalEnchantedMiner::new);
9296
public static final GroovyContainer<AdvancedMortars> ADVANCED_MORTARS = new InternalModContainer<>("advancedmortars", "Advanced Mortars", AdvancedMortars::new);
@@ -226,7 +230,9 @@ public static void init() {
226230
for (GroovyContainer<?> container : containerList) {
227231
if (container.isLoaded()) {
228232
container.onCompatLoaded(container);
229-
container.get().initialize(container);
233+
GroovyPropertyContainer propertyContainer = container.get();
234+
propertyContainer.initialize(container);
235+
propertyContainer.initialize(container.getModId());
230236
ExpansionHelper.mixinConstProperty(ModSupport.class, container.getModId(), container.get(), false);
231237
for (String s : container.getAliases()) {
232238
if (!container.getModId().equals(s)) {
@@ -235,6 +241,17 @@ public static void init() {
235241
}
236242
}
237243
}
244+
for (ModContainer container : Loader.instance().getModList()) {
245+
if (!INSTANCE.hasCompatFor(container.getModId())) {
246+
ExpansionHelper.mixinProperty(
247+
ModSupport.class,
248+
container.getModId(),
249+
ForgeModWrapper.class,
250+
Suppliers.memoize(() -> new ForgeModWrapper(container)),
251+
null,
252+
false);
253+
}
254+
}
238255
}
239256

240257
public @NotNull GroovyContainer<?> getContainer(String mod) {
Lines changed: 9 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,16 @@
11
package com.cleanroommc.groovyscript.compat.vanilla;
22

33
import com.cleanroommc.groovyscript.GroovyScript;
4-
import com.cleanroommc.groovyscript.api.GroovyBlacklist;
5-
import com.cleanroommc.groovyscript.api.IScriptReloadable;
64
import com.cleanroommc.groovyscript.compat.content.Content;
75
import com.cleanroommc.groovyscript.compat.inworldcrafting.InWorldCrafting;
86
import com.cleanroommc.groovyscript.compat.loot.Loot;
7+
import com.cleanroommc.groovyscript.compat.mods.GroovyContainer;
98
import com.cleanroommc.groovyscript.compat.mods.GroovyPropertyContainer;
109
import com.cleanroommc.groovyscript.sandbox.expand.ExpansionHelper;
1110
import net.minecraft.command.ICommandSender;
1211
import net.minecraft.item.ItemStack;
1312

14-
import java.util.Collection;
15-
import java.util.Collections;
16-
17-
public class VanillaModule extends GroovyPropertyContainer implements IScriptReloadable {
13+
public class VanillaModule extends GroovyPropertyContainer {
1814

1915
public static final VanillaModule INSTANCE = new VanillaModule();
2016

@@ -29,7 +25,13 @@ public class VanillaModule extends GroovyPropertyContainer implements IScriptRel
2925
public static final Command command = new Command();
3026
public static final GameRule gameRule = new GameRule();
3127

32-
public static void initializeBinding() {
28+
private VanillaModule() {}
29+
30+
@Override
31+
public void initialize(GroovyContainer<?> owner) {
32+
GroovyScript.getSandbox().registerBinding("Minecraft", this);
33+
GroovyScript.getSandbox().registerBinding("Vanilla", this);
34+
// maybe remove some of these as globals?
3335
GroovyScript.getSandbox().registerBinding(crafting);
3436
GroovyScript.getSandbox().registerBinding(furnace);
3537
GroovyScript.getSandbox().registerBinding(loot);
@@ -44,31 +46,4 @@ public static void initializeBinding() {
4446
ExpansionHelper.mixinClass(ItemStack.class, ItemStackExpansion.class);
4547
ExpansionHelper.mixinClass(ICommandSender.class, CommandSenderExpansion.class);
4648
}
47-
48-
@Override
49-
@GroovyBlacklist
50-
public void onReload() {
51-
crafting.onReload();
52-
furnace.onReload();
53-
loot.onReload();
54-
oreDict.onReload();
55-
rarity.onReload();
56-
player.onReload();
57-
inWorldCrafting.onReload();
58-
command.onReload();
59-
gameRule.onReload();
60-
}
61-
62-
@Override
63-
@GroovyBlacklist
64-
public void afterScriptLoad() {
65-
furnace.afterScriptLoad();
66-
loot.afterScriptLoad();
67-
inWorldCrafting.afterScriptLoad();
68-
}
69-
70-
@Override
71-
public Collection<String> getAliases() {
72-
return Collections.emptyList();
73-
}
7449
}

0 commit comments

Comments
 (0)