Skip to content
10 changes: 0 additions & 10 deletions src/main/java/cam72cam/mod/ModCore.java
Original file line number Diff line number Diff line change
Expand Up @@ -19,10 +19,7 @@
import cam72cam.mod.entity.ModdedEntity;
import cam72cam.mod.entity.sync.EntitySync;
import cam72cam.mod.event.ClientEvents;
import cam72cam.mod.event.CommonEvents;
import cam72cam.mod.input.Mouse;
import cam72cam.mod.item.Fuzzy;
import cam72cam.mod.item.Recipes;
import cam72cam.mod.net.Packet;
import cam72cam.mod.net.PacketDirection;
import cam72cam.mod.render.Light;
Expand All @@ -38,7 +35,6 @@
import net.minecraftforge.fml.DistExecutor;
import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent;
import net.minecraftforge.fml.event.lifecycle.FMLLoadCompleteEvent;
import net.minecraftforge.fml.event.lifecycle.GatherDataEvent;
import net.minecraftforge.fml.event.lifecycle.InterModEnqueueEvent;
import net.minecraftforge.fml.event.server.FMLServerStartedEvent;
import net.minecraftforge.fml.event.server.FMLServerStartingEvent;
Expand Down Expand Up @@ -483,12 +479,6 @@ public void serverEvent(ModEvent event) {
}
}

public static void genData(String MODID, GatherDataEvent event) {
CommonEvents.Recipe.REGISTER.execute(Runnable::run);
event.getGenerator().addProvider(new Recipes(event.getGenerator()));
Fuzzy.register(event.getGenerator());
}

public static void debug(String msg, Object... params) {
if (Config.DebugLogging) {
if (instance == null || instance.logger == null) {
Expand Down
1 change: 0 additions & 1 deletion src/main/java/cam72cam/mod/UMCMixinPlugin.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package cam72cam.mod;

import com.llamalad7.mixinextras.MixinExtrasBootstrap;
import cpw.mods.modlauncher.api.IEnvironment;
import cpw.mods.modlauncher.api.ITransformationService;
import cpw.mods.modlauncher.api.ITransformer;
Expand Down
33 changes: 32 additions & 1 deletion src/main/java/cam72cam/mod/event/CommonEvents.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
package cam72cam.mod.event;

import cam72cam.mod.ModCore;
import cam72cam.mod.event.platform.RegisterAdvancementEvent;
import cam72cam.mod.event.platform.RegisterBlockTagEvent;
import cam72cam.mod.event.platform.RegisterCraftingRecipeEvent;
import cam72cam.mod.event.platform.RegisterItemTagEvent;
import net.minecraft.entity.EntityType;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.inventory.container.ContainerType;
Expand All @@ -20,6 +24,8 @@
import net.minecraftforge.registries.IForgeRegistry;
import net.minecraft.world.server.ServerWorld;

import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;

/** Registry of events that fire off on both client and server. Do not use directly! */
Expand All @@ -41,6 +47,7 @@ public static final class World {
public static final class Block {
public static final Event<Runnable> REGISTER = new Event<>();
public static final Event<EventBusForge.BlockBrokenEvent> BROKEN = new Event<>();
public static final Event<Consumer<RegisterBlockTagEvent>> TAGS = new Event<>();
}

public static final class Tile {
Expand All @@ -49,10 +56,13 @@ public static final class Tile {

public static final class Item {
public static final Event<Runnable> REGISTER = new Event<>();
public static final Event<Consumer<RegisterItemTagEvent>> TAGS = new Event<>();
}

public static final class Recipe {
public static final Event<Runnable> REGISTER = new Event<>();
public static final Event<Consumer<RegisterCraftingRecipeEvent>> REGISTER = new Event<>();
//TODO make event listener refreshable
public static ThreadLocal<List<Consumer<RegisterAdvancementEvent>>> RECIPE_LISTENER = ThreadLocal.withInitial(ArrayList::new);
}

public static final class Entity {
Expand Down Expand Up @@ -157,5 +167,26 @@ public static void registerEntities(RegistryEvent.Register<EntityType<?>> event)
public static void registerContainers(RegistryEvent.Register<ContainerType<?>> event) {
CONTAINER_REGISTRY.execute(x -> x.accept(event.getRegistry()));
}

@SubscribeEvent
public static void registerItemTag(RegisterBlockTagEvent event) {
Block.TAGS.execute(x -> x.accept(event));
}

@SubscribeEvent
public static void registerItemTag(RegisterItemTagEvent event) {
Item.TAGS.execute(x -> x.accept(event));
}

@SubscribeEvent
public static void registerCraftingRecipe(RegisterCraftingRecipeEvent event) {
CommonEvents.Recipe.REGISTER.execute(x -> x.accept(event));
}

@SubscribeEvent
public static void registerRecipeTrigger(RegisterAdvancementEvent event) {
CommonEvents.Recipe.RECIPE_LISTENER.get().forEach(x -> x.accept(event));
CommonEvents.Recipe.RECIPE_LISTENER.set(new ArrayList<>());
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package cam72cam.mod.event.platform;

import cam72cam.mod.item.Fuzzy;
import net.minecraft.advancements.Advancement;
import net.minecraft.advancements.AdvancementRewards;
import net.minecraft.advancements.Criterion;
import net.minecraft.advancements.criterion.*;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.eventbus.api.Event;

import java.util.Map;

public class RegisterAdvancementEvent extends Event {
private static final ResourceLocation RECIPE = new ResourceLocation("minecraft:recipes/root");
private final Map<ResourceLocation, Advancement.Builder> map;

public RegisterAdvancementEvent(Map<ResourceLocation, Advancement.Builder> map) {
this.map = map;
}

public void registerRecipeTrigger(ResourceLocation ident, ResourceLocation recipe, Fuzzy... trigger) {
Advancement.Builder builder = Advancement.Builder.builder().withParentId(RECIPE);

// Criterion hasRecipe = new Criterion(new RecipeUnlockedTrigger.Instance(recipe));
// builder.withCriterion("has_recipe", hasRecipe);
for (int i = 0; i < trigger.length; i++) {
Fuzzy ingredient = trigger[i];
if (ingredient == null || ingredient.getTag() == null) continue;

Criterion hasItem = new Criterion(InventoryChangeTrigger.Instance.forItems(
ItemPredicate.Builder.create().tag(ingredient.getTag()).build()));
builder.withCriterion("has" + ingredient + i, hasItem);
}
builder.withRewards(AdvancementRewards.Builder.recipe(recipe));

map.put(ident, builder);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package cam72cam.mod.event.platform;

import net.minecraft.block.Block;
import net.minecraft.tags.Tag;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.eventbus.api.Event;

import java.util.Collection;
import java.util.Map;

public class RegisterBlockTagEvent extends Event {
private final Map<ResourceLocation, Tag.Builder<?>> map;

public RegisterBlockTagEvent(Map<ResourceLocation, Tag.Builder<?>> map) {
this.map = map;
}

public void registerTag(ResourceLocation ident, Collection<Block> includes) {
for (Block include : includes) {
registerTag(ident, include);
}
}

public void registerTag(ResourceLocation ident, Block block) {
Tag.Builder<Block> builder = (Tag.Builder<Block>) map.getOrDefault(ident, Tag.Builder.create());
builder.add(block);
map.put(ident, builder);
}

public void registerTag(ResourceLocation ident, Tag<Block> includes) {
Tag.Builder<Block> builder = (Tag.Builder<Block>) map.getOrDefault(ident, Tag.Builder.create());
includes.getEntries().forEach(builder::add);
map.put(ident, builder);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
package cam72cam.mod.event.platform;

import cam72cam.mod.ModCore;
import cam72cam.mod.event.CommonEvents;
import cam72cam.mod.item.Fuzzy;
import cam72cam.mod.item.ItemStack;
import com.google.common.collect.ImmutableMap;
import net.minecraft.item.crafting.IRecipe;
import net.minecraft.item.crafting.IRecipeType;
import net.minecraft.item.crafting.Ingredient;
import net.minecraft.item.crafting.ShapedRecipe;
import net.minecraft.util.NonNullList;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.eventbus.api.Event;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Stream;

//Only support full height recipe for now
public class RegisterCraftingRecipeEvent extends Event {
Map<IRecipeType<?>, ImmutableMap.Builder<ResourceLocation, IRecipe<?>>> map;

public RegisterCraftingRecipeEvent(Map<IRecipeType<?>, ImmutableMap.Builder<ResourceLocation, IRecipe<?>>> map) {
this.map = map;
}

public void register(ItemStack target, int width, List<Fuzzy> ingredients, List<Fuzzy> dependencies, List<Fuzzy> conflicts) {
ResourceLocation itemName = target.internal.getItem().getRegistryName();
ResourceLocation name = new ResourceLocation(itemName.getNamespace(), itemName.getPath()
+ ingredients.hashCode() + dependencies.hashCode() + conflicts.hashCode());
boolean dependencyNotMet = dependencies.stream().anyMatch(f -> f.getTag().getAllElements().isEmpty());
boolean hasConflict = conflicts.stream().anyMatch(f -> !f.getTag().getAllElements().isEmpty());

if (dependencyNotMet || hasConflict) {
ModCore.info("Requirements not met, skipping UMC recipe %s", name.toString());
return;
}

List<Ingredient> n = new ArrayList<>();
for (Fuzzy ingredient : ingredients) {
if (ingredient == null || ingredient.isEmpty()) {
n.add(new Ingredient(Stream.of(new Ingredient.SingleItemList(net.minecraft.item.ItemStack.EMPTY))));
} else {
n.add(new Ingredient(Stream.of(new Ingredient.TagList(ingredient.getTag()))));
}
}
NonNullList<Ingredient> ingredient = NonNullList.create();
ingredient.addAll(n);

ShapedRecipe recipe = new ShapedRecipe(name, "", width, 3, ingredient, target.internal);

CommonEvents.Recipe.RECIPE_LISTENER.get().add(event -> {
ResourceLocation ad = new ResourceLocation(name.getNamespace(), "unlock" + name.getPath());
event.registerRecipeTrigger(ad, name, ingredients.toArray(new Fuzzy[0]));
});
map.computeIfAbsent(IRecipeType.CRAFTING, o -> ImmutableMap.builder()).put(name, recipe);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package cam72cam.mod.event.platform;

import net.minecraft.item.Item;
import net.minecraft.tags.Tag;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.eventbus.api.Event;

import java.util.Collection;
import java.util.Map;

public class RegisterItemTagEvent extends Event {
private final Map<ResourceLocation, Tag.Builder<?>> map;

public RegisterItemTagEvent(Map<ResourceLocation, Tag.Builder<?>> map) {
this.map = map;
}

public void registerTag(ResourceLocation ident, Collection<Item> includes) {
for (Item include : includes) {
registerTag(ident, include);
}
}

public void registerTag(ResourceLocation ident, Item item) {
Tag.Builder<Item> builder = (Tag.Builder<Item>) map.getOrDefault(ident, Tag.Builder.create());
builder.add(item);
map.put(ident, builder);
}

public void registerTag(ResourceLocation ident, Tag<Item> includes) {
Tag.Builder<Item> builder = (Tag.Builder<Item>) map.getOrDefault(ident, Tag.Builder.create());
includes.getEntries().forEach(builder::add);
map.put(ident, builder);
}
}
29 changes: 10 additions & 19 deletions src/main/java/cam72cam/mod/item/Fuzzy.java
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
package cam72cam.mod.item;

import cam72cam.mod.config.ConfigFile;
import cam72cam.mod.event.CommonEvents;
import net.minecraft.block.Block;
import net.minecraft.block.Blocks;
import net.minecraft.data.DataGenerator;
import net.minecraft.data.ItemTagsProvider;
import net.minecraft.item.Item;
import net.minecraft.item.Items;
import net.minecraft.tags.ItemTags;
Expand Down Expand Up @@ -172,6 +171,7 @@ public Fuzzy add(Block block) {
/** Don't use directly (unless in version specific code) */
public Fuzzy add(Item item) {
customItems.add(item);
CommonEvents.Item.TAGS.subscribe(e -> e.registerTag(tag.getId(), item));
return this;
}

Expand All @@ -183,30 +183,21 @@ public Fuzzy add(CustomItem item) {
/** Pull other fuzzy into this one */
public Fuzzy include(Fuzzy other) {
includes.add(other);
CommonEvents.Item.TAGS.subscribe(e -> e.registerTag(tag.getId(), other.tag));
return this;
}

public Tag<Item> getTag() {
return tag;
}

@Override
public String toString() {
return ident;
}

public static void register(DataGenerator gen) {
gen.addProvider(new ItemTagsProvider(gen) {
@Override
protected void registerTags() {
for (Fuzzy value : registered.values()) {
if (!value.customItems.isEmpty() || !value.includes.isEmpty()) {
Tag.Builder<Item> builder = getBuilder(value.tag);
for (Item customItem : value.customItems) {
builder.add(customItem);
}
for (Fuzzy include : value.includes) {
builder.add(include.tag);
}
}
}
}
});
@Override
public int hashCode() {
return toString().hashCode();
}
}
Loading