Skip to content
Open
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
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