mirror of
https://github.com/Sollace/Unicopia.git
synced 2024-11-27 15:17:59 +01:00
Added JEI support
This commit is contained in:
parent
0e54cbf29a
commit
aed4352a24
8 changed files with 225 additions and 1 deletions
|
@ -41,11 +41,15 @@ sourceCompatibility = 1.8
|
||||||
targetCompatibility = 1.8
|
targetCompatibility = 1.8
|
||||||
|
|
||||||
sourceSets {
|
sourceSets {
|
||||||
|
jei {
|
||||||
|
compileClasspath += main.compileClasspath
|
||||||
|
}
|
||||||
external {
|
external {
|
||||||
compileClasspath += main.compileClasspath
|
compileClasspath += main.compileClasspath
|
||||||
}
|
}
|
||||||
main {
|
main {
|
||||||
compileClasspath += external.output
|
compileClasspath += external.output
|
||||||
|
compileClasspath += jei.output
|
||||||
ext.refMap = project.refCore
|
ext.refMap = project.refCore
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,32 @@
|
||||||
|
package com.minelittlepony.unicopia.jei;
|
||||||
|
|
||||||
|
import mezz.jei.api.gui.IDrawable;
|
||||||
|
import net.minecraft.client.Minecraft;
|
||||||
|
import net.minecraft.client.renderer.GlStateManager;
|
||||||
|
|
||||||
|
class BlendedDrawable implements IDrawable {
|
||||||
|
|
||||||
|
private final IDrawable wrapped;
|
||||||
|
|
||||||
|
public BlendedDrawable(IDrawable wrapped) {
|
||||||
|
this.wrapped = wrapped;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getWidth() {
|
||||||
|
return wrapped.getWidth();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getHeight() {
|
||||||
|
return wrapped.getHeight();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void draw(Minecraft minecraft, int xOffset, int yOffset) {
|
||||||
|
GlStateManager.enableBlend();
|
||||||
|
wrapped.draw(minecraft, xOffset, yOffset);
|
||||||
|
GlStateManager.disableBlend();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,42 @@
|
||||||
|
package com.minelittlepony.unicopia.jei;
|
||||||
|
|
||||||
|
import com.minelittlepony.unicopia.Unicopia;
|
||||||
|
import com.minelittlepony.unicopia.enchanting.SpecialRecipe;
|
||||||
|
import com.minelittlepony.unicopia.enchanting.SpellRecipe;
|
||||||
|
import com.minelittlepony.unicopia.init.UItems;
|
||||||
|
import com.minelittlepony.unicopia.spell.SpellRegistry;
|
||||||
|
|
||||||
|
import mezz.jei.api.IGuiHelper;
|
||||||
|
import mezz.jei.api.IModPlugin;
|
||||||
|
import mezz.jei.api.IModRegistry;
|
||||||
|
import mezz.jei.api.ISubtypeRegistry;
|
||||||
|
import mezz.jei.api.JEIPlugin;
|
||||||
|
import mezz.jei.api.recipe.IRecipeCategoryRegistration;
|
||||||
|
|
||||||
|
@JEIPlugin
|
||||||
|
public class JEIUnicopia implements IModPlugin {
|
||||||
|
|
||||||
|
static IGuiHelper GUI_HELPER;
|
||||||
|
|
||||||
|
static final String RECIPE_UID = "unicopia:spellbook_2";
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void registerItemSubtypes(ISubtypeRegistry registry) {
|
||||||
|
registry.registerSubtypeInterpreter(UItems.spell, SpellRegistry::getKeyFromStack);
|
||||||
|
registry.registerSubtypeInterpreter(UItems.curse, SpellRegistry::getKeyFromStack);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void registerCategories(IRecipeCategoryRegistration registry) {
|
||||||
|
registry.addRecipeCategories(new SpellbookCategory());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void register(IModRegistry registry) {
|
||||||
|
GUI_HELPER = registry.getJeiHelpers().getGuiHelper();
|
||||||
|
|
||||||
|
registry.handleRecipes(SpellRecipe.class, SpellRecipeWrapper::new, RECIPE_UID);
|
||||||
|
registry.handleRecipes(SpecialRecipe.class, SpellRecipeWrapper::new, RECIPE_UID);
|
||||||
|
registry.addRecipes(Unicopia.getCraftingManager().getRecipes(), RECIPE_UID);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,37 @@
|
||||||
|
package com.minelittlepony.unicopia.jei;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
import com.minelittlepony.unicopia.enchanting.AbstractSpecialRecipe;
|
||||||
|
|
||||||
|
import mezz.jei.api.ingredients.IIngredients;
|
||||||
|
import mezz.jei.api.ingredients.VanillaTypes;
|
||||||
|
import mezz.jei.api.recipe.IRecipeWrapper;
|
||||||
|
import net.minecraft.item.ItemStack;
|
||||||
|
|
||||||
|
public class SpellRecipeWrapper implements IRecipeWrapper {
|
||||||
|
|
||||||
|
private final AbstractSpecialRecipe recipe;
|
||||||
|
|
||||||
|
public SpellRecipeWrapper(AbstractSpecialRecipe recipe) {
|
||||||
|
this.recipe = recipe;
|
||||||
|
}
|
||||||
|
|
||||||
|
public AbstractSpecialRecipe getRecipe() {
|
||||||
|
return recipe;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void getIngredients(IIngredients ingredients) {
|
||||||
|
|
||||||
|
List<List<ItemStack>> ingreds = recipe.getSpellIngredients().stream().map(ingredient -> {
|
||||||
|
return ingredient.getStacks().collect(Collectors.toList());
|
||||||
|
}).collect(Collectors.toList());
|
||||||
|
|
||||||
|
ingredients.setInputLists(VanillaTypes.ITEM, ingreds);
|
||||||
|
|
||||||
|
ingredients.setOutput(VanillaTypes.ITEM, recipe.getRecipeOutput());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,66 @@
|
||||||
|
package com.minelittlepony.unicopia.jei;
|
||||||
|
|
||||||
|
import com.minelittlepony.unicopia.Unicopia;
|
||||||
|
import com.minelittlepony.unicopia.inventory.gui.GuiSpellBook;
|
||||||
|
|
||||||
|
import mezz.jei.api.gui.IDrawable;
|
||||||
|
import mezz.jei.api.gui.IGuiItemStackGroup;
|
||||||
|
import mezz.jei.api.gui.IRecipeLayout;
|
||||||
|
import mezz.jei.api.ingredients.IIngredients;
|
||||||
|
import mezz.jei.api.ingredients.VanillaTypes;
|
||||||
|
import mezz.jei.api.recipe.IRecipeCategory;
|
||||||
|
import mezz.jei.api.recipe.IRecipeWrapper;
|
||||||
|
import net.minecraft.util.ResourceLocation;
|
||||||
|
|
||||||
|
public class SpellbookCategory implements IRecipeCategory<IRecipeWrapper> {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getUid() {
|
||||||
|
return JEIUnicopia.RECIPE_UID;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getTitle() {
|
||||||
|
return "Spellbook";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public IDrawable getIcon() {
|
||||||
|
return JEIUnicopia.GUI_HELPER.drawableBuilder(
|
||||||
|
new ResourceLocation(Unicopia.MODID, "textures/items/spellbook.png"), 0, 0, 16, 16)
|
||||||
|
.setTextureSize(16, 16)
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getModName() {
|
||||||
|
return "Unicopia";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public IDrawable getBackground() {
|
||||||
|
return new BlendedDrawable(
|
||||||
|
JEIUnicopia.GUI_HELPER.drawableBuilder(GuiSpellBook.spellBookGuiTextures, 405, 0, 105, 108)
|
||||||
|
.setTextureSize(512, 256)
|
||||||
|
.build());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setRecipe(IRecipeLayout recipeLayout, IRecipeWrapper recipeWrapper, @Deprecated IIngredients unused) {
|
||||||
|
recipeLayout.setShapeless();
|
||||||
|
|
||||||
|
IGuiItemStackGroup stacks = recipeLayout.getItemStacks();
|
||||||
|
|
||||||
|
stacks.init(0, true, 29, 3);
|
||||||
|
stacks.init(1, true, 3, 46);
|
||||||
|
stacks.init(2, true, 30, 86);
|
||||||
|
stacks.init(3, true, 80, 72);
|
||||||
|
stacks.init(4, true, 82, 15);
|
||||||
|
|
||||||
|
stacks.init(5, false, 46, 44);
|
||||||
|
|
||||||
|
stacks.set(unused);
|
||||||
|
|
||||||
|
stacks.set(5, unused.getOutputs(VanillaTypes.ITEM).get(0));
|
||||||
|
}
|
||||||
|
}
|
|
@ -80,6 +80,7 @@ public abstract class AbstractSpecialRecipe extends Impl<IRecipe> implements IRe
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return toMatch.isEmpty();
|
return toMatch.isEmpty();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -101,6 +102,14 @@ public abstract class AbstractSpecialRecipe extends Impl<IRecipe> implements IRe
|
||||||
return width * height < ingredients.size();
|
return width * height < ingredients.size();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public SpellIngredient getSpellItem() {
|
||||||
|
return spellitem;
|
||||||
|
}
|
||||||
|
|
||||||
|
public NonNullList<SpellIngredient> getSpellIngredients() {
|
||||||
|
return ingredients;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ItemStack getRecipeOutput() {
|
public ItemStack getRecipeOutput() {
|
||||||
return spellitem.getStack();
|
return spellitem.getStack();
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
package com.minelittlepony.unicopia.enchanting;
|
package com.minelittlepony.unicopia.enchanting;
|
||||||
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
import javax.annotation.Nonnull;
|
import javax.annotation.Nonnull;
|
||||||
|
|
||||||
|
@ -63,6 +64,11 @@ public class AffineIngredients {
|
||||||
return instance().getIngredient(res).getStack();
|
return instance().getIngredient(res).getStack();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Stream<ItemStack> getStacks() {
|
||||||
|
return instance().getIngredient(res).getStacks();
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean matches(ItemStack other, int materialMult) {
|
public boolean matches(ItemStack other, int materialMult) {
|
||||||
return instance().getIngredient(res).matches(other, materialMult);
|
return instance().getIngredient(res).matches(other, materialMult);
|
||||||
|
|
|
@ -1,18 +1,23 @@
|
||||||
package com.minelittlepony.unicopia.enchanting;
|
package com.minelittlepony.unicopia.enchanting;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Optional;
|
||||||
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
import javax.annotation.Nullable;
|
import javax.annotation.Nullable;
|
||||||
|
|
||||||
import com.google.common.collect.Lists;
|
import com.google.common.collect.Lists;
|
||||||
|
import com.google.common.collect.Streams;
|
||||||
import com.google.gson.JsonArray;
|
import com.google.gson.JsonArray;
|
||||||
import com.google.gson.JsonElement;
|
import com.google.gson.JsonElement;
|
||||||
import com.google.gson.JsonObject;
|
import com.google.gson.JsonObject;
|
||||||
import com.minelittlepony.unicopia.enchanting.AffineIngredients.AffineIngredient;
|
import com.minelittlepony.unicopia.enchanting.AffineIngredients.AffineIngredient;
|
||||||
import com.minelittlepony.unicopia.spell.SpellRegistry;
|
import com.minelittlepony.unicopia.spell.SpellRegistry;
|
||||||
|
|
||||||
|
import net.minecraft.creativetab.CreativeTabs;
|
||||||
import net.minecraft.item.Item;
|
import net.minecraft.item.Item;
|
||||||
import net.minecraft.item.ItemStack;
|
import net.minecraft.item.ItemStack;
|
||||||
|
import net.minecraft.util.NonNullList;
|
||||||
|
|
||||||
public interface SpellIngredient {
|
public interface SpellIngredient {
|
||||||
|
|
||||||
|
@ -31,6 +36,8 @@ public interface SpellIngredient {
|
||||||
|
|
||||||
ItemStack getStack();
|
ItemStack getStack();
|
||||||
|
|
||||||
|
Stream<ItemStack> getStacks();
|
||||||
|
|
||||||
class Compound implements SpellIngredient {
|
class Compound implements SpellIngredient {
|
||||||
private final List<SpellIngredient> items;
|
private final List<SpellIngredient> items;
|
||||||
|
|
||||||
|
@ -38,6 +45,16 @@ public interface SpellIngredient {
|
||||||
this.items = items;
|
this.items = items;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Stream<ItemStack> getStacks() {
|
||||||
|
Stream<ItemStack> stacks = Lists.<ItemStack>newArrayList().stream();
|
||||||
|
|
||||||
|
for (SpellIngredient i : items) {
|
||||||
|
stacks = Streams.concat(stacks, i.getStacks());
|
||||||
|
}
|
||||||
|
|
||||||
|
return stacks.distinct();
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ItemStack getStack() {
|
public ItemStack getStack() {
|
||||||
return items.get((int)(Math.random() * items.size())).getStack();
|
return items.get((int)(Math.random() * items.size())).getStack();
|
||||||
|
@ -80,6 +97,17 @@ public interface SpellIngredient {
|
||||||
ignoreMeta = meta;
|
ignoreMeta = meta;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Stream<ItemStack> getStacks() {
|
||||||
|
if (ignoreMeta && !contained.isEmpty()) {
|
||||||
|
NonNullList<ItemStack> subItems = NonNullList.create();
|
||||||
|
contained.getItem().getSubItems(CreativeTabs.SEARCH, subItems);
|
||||||
|
|
||||||
|
return subItems.stream();
|
||||||
|
}
|
||||||
|
|
||||||
|
return Streams.stream(Optional.ofNullable(contained));
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ItemStack getStack() {
|
public ItemStack getStack() {
|
||||||
return contained;
|
return contained;
|
||||||
|
@ -121,7 +149,7 @@ public interface SpellIngredient {
|
||||||
stack = SpellRegistry.instance().enchantStack(stack, spell);
|
stack = SpellRegistry.instance().enchantStack(stack, spell);
|
||||||
}
|
}
|
||||||
|
|
||||||
return new Single(stack, !json.has("data"));
|
return new Single(stack, !(json.has("spell") || json.has("data")));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (json.has("id")) {
|
if (json.has("id")) {
|
||||||
|
|
Loading…
Reference in a new issue