Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 6 additions & 2 deletions examples/postInit/custom/vanilla.groovy
Original file line number Diff line number Diff line change
Expand Up @@ -21,17 +21,21 @@ log.info(ore_iron >> (item_iron * 3)) // false
println file.path
}*/

for (var stack in mods.minecraft.allItems[5..12]) {
log.info stack
}

// Crafting recipes are typically created via recipe builder, but also have shorthand versions for some common uses.
// Here are a series of examples, with the shorthand and corresponding recipe builder:

//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')]])
crafting.shapedBuilder()
mods.minecraft.crafting.shapedBuilder()
.output(item('minecraft:gold_block'))
.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')]])
.register()

//crafting.addShaped('gold_v_to_clay', item('minecraft:clay'), [[item('minecraft:gold_ingot'),null,item('minecraft:gold_ingot')],[null,item('minecraft:gold_ingot'),null]])
crafting.shapedBuilder()
minecraft.crafting.shapedBuilder()
.name('gold_v_to_clay')
.output(item('minecraft:clay'))
.shape([[item('minecraft:gold_ingot'),null,item('minecraft:gold_ingot')],[null,item('minecraft:stone_pickaxe').transformDamage(2).whenAnyDamage(),null]])
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -165,7 +165,6 @@ public static void initializeGroovyPreInit() {
// called via mixin in between construction and fml pre init
ObjectMapperManager.init();
StandardInfoParserRegistry.init();
VanillaModule.initializeBinding();
ModSupport.init();
for (ObjectMapper<?> goh : ObjectMapperManager.getObjectMappers()) {
getSandbox().registerBinding(goh);
Expand Down
30 changes: 30 additions & 0 deletions src/main/java/com/cleanroommc/groovyscript/api/IIngredient.java
Original file line number Diff line number Diff line change
@@ -1,12 +1,15 @@
package com.cleanroommc.groovyscript.api;

import com.cleanroommc.groovyscript.helper.ingredient.OrIngredient;
import com.google.common.collect.AbstractIterator;
import groovy.lang.IntRange;
import net.minecraft.item.ItemStack;
import net.minecraft.item.crafting.Ingredient;
import net.minecraftforge.common.ForgeHooks;
import net.minecraftforge.fluids.FluidStack;
import org.jetbrains.annotations.Nullable;

import java.util.Iterator;
import java.util.function.Predicate;

/**
Expand Down Expand Up @@ -51,6 +54,33 @@ default boolean isCase(ItemStack ingredient) {
return ingredient != null && test(ingredient);
}

// [i] operator
default ItemStack getAt(int index) {
ItemStack[] stacks = getMatchingStacks();
while (index < 0) index += stacks.length;
return getMatchingStacks()[index];
}

default ItemStack getFirst() {
return getAt(0);
}

// allows using a range in [] operator like [5..12]
default Iterable<ItemStack> getAt(IntRange range) {
return () -> new AbstractIterator<>() {

private final Iterator<Integer> it = range.iterator();

@Override
protected ItemStack computeNext() {
if (it.hasNext()) {
return getAt(it.next());
}
return endOfData();
}
};
}

@Override
default IIngredient withAmount(int amount) {
IIngredient iIngredientStack = exactCopy();
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
package com.cleanroommc.groovyscript.compat.mods;

import com.cleanroommc.groovyscript.helper.ingredient.ItemsIngredient;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.util.NonNullList;
import net.minecraftforge.fml.common.Loader;
import net.minecraftforge.fml.common.ModContainer;
import net.minecraftforge.fml.common.registry.ForgeRegistries;

import java.util.ArrayList;
import java.util.List;

public class ForgeModWrapper {

private ModContainer container;
private ItemsIngredient items;

public ForgeModWrapper(ModContainer container) {
this.container = container;
}

public ForgeModWrapper() {}

void initialize(String owner) {
this.container = Loader.instance().getIndexedModList().get(owner);
if (this.container == null) {
throw new IllegalStateException("Can't create property container for unloaded mod!");
}
}

public ItemsIngredient getAllItems() {
if (this.items == null) {
List<ItemStack> items = new ArrayList<>();
NonNullList<ItemStack> stacks = NonNullList.create();
for (Item item : ForgeRegistries.ITEMS) {
if (item.getRegistryName().getNamespace().equals(container.getModId())) {
item.getSubItems(CreativeTabs.SEARCH, stacks);
items.addAll(stacks);
stacks.clear();
}
}
this.items = new ItemsIngredient(items);
}
return this.items;
}

public ModContainer getContainer() {
return container;
}

public String getId() {
return this.container.getModId();
}

public String getName() {
return this.container.getName();
}

public String getVersion() {
return this.container.getVersion();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
import java.util.Collections;
import java.util.Map;

public class GroovyPropertyContainer {
public class GroovyPropertyContainer extends ForgeModWrapper {

private final Map<String, INamed> properties = new Object2ObjectOpenHashMap<>();
private final Map<String, INamed> view = Collections.unmodifiableMap(properties);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
package com.cleanroommc.groovyscript.compat.mods;

import com.cleanroommc.groovyscript.compat.vanilla.VanillaModule;
import com.google.common.base.Supplier;
import com.google.common.base.Suppliers;
import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet;
import org.jetbrains.annotations.NotNull;

import java.util.Collection;
import java.util.Collections;
import java.util.Set;

public final class MinecraftModContainer extends GroovyContainer<VanillaModule> {

private static final String modId = "minecraft";
private static final String containerName = "Minecraft";
private final Supplier<VanillaModule> modProperty;
private final Collection<String> aliases;

MinecraftModContainer() {
this.modProperty = Suppliers.memoize(() -> {
VanillaModule t = VanillaModule.INSTANCE;
t.addPropertyFieldsOf(t, false);
return t;
});
Set<String> aliasSet = new ObjectOpenHashSet<>();
aliasSet.add("mc");
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

would vanilla be a good alias? would allow mods.vanilla, which i find rather amusing.
i believe using aliasSet.addAll(Alias.generateOf("Vanilla", containerName).and("MC", "mc")); should work.

aliasSet.add(modId);
this.aliases = Collections.unmodifiableSet(aliasSet);
ModSupport.INSTANCE.registerContainer(this);
}

@Override
public boolean isLoaded() {
return true;
}

@Override
public @NotNull Collection<String> getAliases() {
return aliases;
}

@Override
public VanillaModule get() {
return modProperty.get();
}

@Override
public @NotNull String getModId() {
return modId;
}

@Override
public @NotNull String getContainerName() {
return containerName;
}

@Override
public void onCompatLoaded(GroovyContainer<?> container) {}
}
Original file line number Diff line number Diff line change
Expand Up @@ -67,9 +67,11 @@
import com.cleanroommc.groovyscript.compat.mods.tinkersconstruct.TinkersConstruct;
import com.cleanroommc.groovyscript.compat.mods.woot.Woot;
import com.cleanroommc.groovyscript.sandbox.expand.ExpansionHelper;
import com.google.common.base.Suppliers;
import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet;
import net.minecraftforge.fml.common.Loader;
import net.minecraftforge.fml.common.ModContainer;
import net.minecraftforge.fml.common.discovery.ASMDataTable;
import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.NotNull;
Expand All @@ -86,6 +88,8 @@ public class ModSupport {

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

public static final MinecraftModContainer MINECRAFT = new MinecraftModContainer();

public static final GroovyContainer<ActuallyAdditions> ACTUALLY_ADDITIONS = new InternalModContainer<>("actuallyadditions", "Actually Additions", ActuallyAdditions::new, "aa");
public static final GroovyContainer<AdditionalEnchantedMiner> ADDITIONAL_ENCHANTED_MINER = new InternalModContainer<>("quarryplus", "Additional Enchanted Miner", AdditionalEnchantedMiner::new);
public static final GroovyContainer<AdvancedMortars> ADVANCED_MORTARS = new InternalModContainer<>("advancedmortars", "Advanced Mortars", AdvancedMortars::new);
Expand Down Expand Up @@ -224,7 +228,9 @@ public static void init() {
for (GroovyContainer<?> container : containerList) {
if (container.isLoaded()) {
container.onCompatLoaded(container);
container.get().initialize(container);
GroovyPropertyContainer propertyContainer = container.get();
propertyContainer.initialize(container);
propertyContainer.initialize(container.getModId());
ExpansionHelper.mixinConstProperty(ModSupport.class, container.getModId(), container.get(), false);
for (String s : container.getAliases()) {
if (!container.getModId().equals(s)) {
Expand All @@ -233,6 +239,17 @@ public static void init() {
}
}
}
for (ModContainer container : Loader.instance().getModList()) {
if (!INSTANCE.hasCompatFor(container.getModId())) {
ExpansionHelper.mixinProperty(
ModSupport.class,
container.getModId(),
ForgeModWrapper.class,
Suppliers.memoize(() -> new ForgeModWrapper(container)),
null,
false);
}
}
}

public @NotNull GroovyContainer<?> getContainer(String mod) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,20 +1,16 @@
package com.cleanroommc.groovyscript.compat.vanilla;

import com.cleanroommc.groovyscript.GroovyScript;
import com.cleanroommc.groovyscript.api.GroovyBlacklist;
import com.cleanroommc.groovyscript.api.IScriptReloadable;
import com.cleanroommc.groovyscript.compat.content.Content;
import com.cleanroommc.groovyscript.compat.inworldcrafting.InWorldCrafting;
import com.cleanroommc.groovyscript.compat.loot.Loot;
import com.cleanroommc.groovyscript.compat.mods.GroovyContainer;
import com.cleanroommc.groovyscript.compat.mods.GroovyPropertyContainer;
import com.cleanroommc.groovyscript.sandbox.expand.ExpansionHelper;
import net.minecraft.command.ICommandSender;
import net.minecraft.item.ItemStack;

import java.util.Collection;
import java.util.Collections;

public class VanillaModule extends GroovyPropertyContainer implements IScriptReloadable {
public class VanillaModule extends GroovyPropertyContainer {

public static final VanillaModule INSTANCE = new VanillaModule();

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

public static void initializeBinding() {
private VanillaModule() {}

@Override
public void initialize(GroovyContainer<?> owner) {
GroovyScript.getSandbox().registerBinding("Minecraft", this);
GroovyScript.getSandbox().registerBinding("Vanilla", this);
// maybe remove some of these as globals?
GroovyScript.getSandbox().registerBinding(crafting);
GroovyScript.getSandbox().registerBinding(furnace);
GroovyScript.getSandbox().registerBinding(loot);
Expand All @@ -44,31 +46,4 @@ public static void initializeBinding() {
ExpansionHelper.mixinClass(ItemStack.class, ItemStackExpansion.class);
ExpansionHelper.mixinClass(ICommandSender.class, CommandSenderExpansion.class);
}

@Override
@GroovyBlacklist
public void onReload() {
crafting.onReload();
furnace.onReload();
loot.onReload();
oreDict.onReload();
rarity.onReload();
player.onReload();
inWorldCrafting.onReload();
command.onReload();
gameRule.onReload();
}

@Override
@GroovyBlacklist
public void afterScriptLoad() {
furnace.afterScriptLoad();
loot.afterScriptLoad();
inWorldCrafting.afterScriptLoad();
}

@Override
public Collection<String> getAliases() {
return Collections.emptyList();
}
}
Loading