From 1f433bf497102a1b7eb6cdbe589dac149e445d79 Mon Sep 17 00:00:00 2001 From: Sollace Date: Thu, 10 Jan 2019 19:46:40 +0200 Subject: [PATCH] Re-implemented the crafting interface for spellbooks --- .../com/minelittlepony/unicopia/UItems.java | 4 + .../com/minelittlepony/unicopia/Unicopia.java | 49 +++- .../enchanting/BasicCraftingEvent.java | 32 +++ .../unicopia/enchanting/IPageOwner.java | 32 +++ .../enchanting/IPageUnlockListener.java | 5 + .../enchanting/MultiPageUnlockEvent.java | 41 ++++ .../unicopia/enchanting/PagesList.java | 117 ++++++++++ .../unicopia/enchanting/SpellRecipe.java | 142 ++++++++++++ .../unicopia/entity/EntitySpellbook.java | 7 +- .../forgebullshit/BuildInTexturesBakery.java | 17 ++ .../inventory/InventorySpellBook.java | 19 ++ .../inventory/gui/ContainerSpellBook.java | 149 +++++++++++++ .../unicopia/inventory/gui/GuiSpellBook.java | 209 ++++++++++++++++++ .../inventory/slot/SlotEnchanting.java | 15 ++ .../inventory/slot/SlotEnchantingResult.java | 96 ++++++++ .../unicopia/network/ITransmittable.java | 5 + .../unicopia/player/IPlayer.java | 6 +- .../unicopia/player/PlayerCapabilities.java | 31 ++- .../unicopia/spell/SpellRegistry.java | 18 ++ .../util/crafting/CraftingManager.java | 197 +++++++++++++++++ .../unicopia/enchanting/recipes/shield.json | 12 + .../unicopia/textures/gui/container/book.png | Bin 0 -> 2117404 bytes .../textures/items/empty_slot_gem.png | Bin 0 -> 439 bytes 23 files changed, 1197 insertions(+), 6 deletions(-) create mode 100644 src/main/java/com/minelittlepony/unicopia/enchanting/BasicCraftingEvent.java create mode 100644 src/main/java/com/minelittlepony/unicopia/enchanting/IPageOwner.java create mode 100644 src/main/java/com/minelittlepony/unicopia/enchanting/IPageUnlockListener.java create mode 100644 src/main/java/com/minelittlepony/unicopia/enchanting/MultiPageUnlockEvent.java create mode 100644 src/main/java/com/minelittlepony/unicopia/enchanting/PagesList.java create mode 100644 src/main/java/com/minelittlepony/unicopia/enchanting/SpellRecipe.java create mode 100644 src/main/java/com/minelittlepony/unicopia/forgebullshit/BuildInTexturesBakery.java create mode 100644 src/main/java/com/minelittlepony/unicopia/inventory/InventorySpellBook.java create mode 100644 src/main/java/com/minelittlepony/unicopia/inventory/gui/ContainerSpellBook.java create mode 100644 src/main/java/com/minelittlepony/unicopia/inventory/gui/GuiSpellBook.java create mode 100644 src/main/java/com/minelittlepony/unicopia/inventory/slot/SlotEnchanting.java create mode 100644 src/main/java/com/minelittlepony/unicopia/inventory/slot/SlotEnchantingResult.java create mode 100644 src/main/java/com/minelittlepony/unicopia/network/ITransmittable.java create mode 100644 src/main/java/com/minelittlepony/unicopia/util/crafting/CraftingManager.java create mode 100644 src/main/resources/assets/unicopia/enchanting/recipes/shield.json create mode 100644 src/main/resources/assets/unicopia/textures/gui/container/book.png create mode 100644 src/main/resources/assets/unicopia/textures/items/empty_slot_gem.png diff --git a/src/main/java/com/minelittlepony/unicopia/UItems.java b/src/main/java/com/minelittlepony/unicopia/UItems.java index 9d301ab7..3dd7cf6c 100644 --- a/src/main/java/com/minelittlepony/unicopia/UItems.java +++ b/src/main/java/com/minelittlepony/unicopia/UItems.java @@ -33,11 +33,13 @@ import net.minecraft.item.crafting.IRecipe; import net.minecraft.item.crafting.Ingredient; import net.minecraft.item.crafting.ShapedRecipes; import net.minecraft.util.NonNullList; +import net.minecraft.util.ResourceLocation; import net.minecraftforge.client.model.ModelLoader; import net.minecraftforge.registries.IForgeRegistry; import static com.minelittlepony.unicopia.Predicates.*; +import com.minelittlepony.unicopia.forgebullshit.BuildInTexturesBakery; import com.minelittlepony.unicopia.forgebullshit.RegistryLockSpinner; public class UItems { @@ -153,6 +155,8 @@ public class UItems { registerAllVariants(tomato, "tomato", "rotten_tomato"); registerAllVariants(cloudsdale_tomato, "cloudsdale_tomato", "rotten_cloudsdale_tomato"); registerAllVariants(tomato_seeds, "tomato_seeds"); + + BuildInTexturesBakery.getBuiltInTextures().add(new ResourceLocation("unicopia", "items/empty_slot_gem")); } registerFuels(); diff --git a/src/main/java/com/minelittlepony/unicopia/Unicopia.java b/src/main/java/com/minelittlepony/unicopia/Unicopia.java index 96573be5..e992ac52 100644 --- a/src/main/java/com/minelittlepony/unicopia/Unicopia.java +++ b/src/main/java/com/minelittlepony/unicopia/Unicopia.java @@ -29,16 +29,23 @@ import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.Mod.EventBusSubscriber; import net.minecraftforge.fml.common.Mod.EventHandler; import net.minecraftforge.fml.common.event.FMLInitializationEvent; +import net.minecraftforge.fml.common.event.FMLPostInitializationEvent; import net.minecraftforge.fml.common.event.FMLPreInitializationEvent; import net.minecraftforge.fml.common.event.FMLServerStartingEvent; import net.minecraftforge.fml.common.eventhandler.Event.Result; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import net.minecraftforge.fml.common.gameevent.TickEvent; import net.minecraftforge.fml.common.gameevent.TickEvent.Phase; +import net.minecraftforge.fml.common.network.IGuiHandler; +import net.minecraftforge.fml.common.network.NetworkRegistry; import net.minecraftforge.fml.common.registry.EntityEntry; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; +import java.util.Map; +import java.util.function.Function; + +import com.google.gson.JsonObject; import com.minelittlepony.jumpingcastle.api.IChannel; import com.minelittlepony.jumpingcastle.api.JumpingCastle; import com.minelittlepony.jumpingcastle.api.Target; @@ -48,15 +55,19 @@ import com.minelittlepony.unicopia.client.particle.EntityMagicFX; import com.minelittlepony.unicopia.client.particle.EntityRaindropFX; import com.minelittlepony.unicopia.client.particle.Particles; import com.minelittlepony.unicopia.command.Commands; +import com.minelittlepony.unicopia.enchanting.SpellRecipe; import com.minelittlepony.unicopia.forgebullshit.FBS; import com.minelittlepony.unicopia.hud.UHud; import com.minelittlepony.unicopia.input.Keyboard; +import com.minelittlepony.unicopia.inventory.gui.ContainerSpellBook; +import com.minelittlepony.unicopia.inventory.gui.GuiSpellBook; import com.minelittlepony.unicopia.network.MsgPlayerAbility; import com.minelittlepony.unicopia.network.MsgPlayerCapabilities; import com.minelittlepony.unicopia.network.MsgRequestCapabilities; import com.minelittlepony.unicopia.player.IPlayer; import com.minelittlepony.unicopia.player.PlayerSpeciesList; import com.minelittlepony.unicopia.power.PowersRegistry; +import com.minelittlepony.unicopia.util.crafting.CraftingManager; import com.minelittlepony.pony.data.IPony; @Mod( @@ -66,7 +77,7 @@ import com.minelittlepony.pony.data.IPony; dependencies = "required-after:jumpingcastle" ) @EventBusSubscriber -public class Unicopia { +public class Unicopia implements IGuiHandler { public static final String MODID = "unicopia"; public static final String NAME = "@NAME@"; public static final String VERSION = "@VERSION@"; @@ -86,6 +97,8 @@ public class Unicopia { */ private static Race clientPlayerRace = getclientPlayerRace(); + private static CraftingManager craftingManager; + @EventHandler public void preInit(FMLPreInitializationEvent event) { if (UClient.isClientSide()) { @@ -117,6 +130,24 @@ public class Unicopia { UAdvancements.init(); FBS.init(); + + NetworkRegistry.INSTANCE.registerGuiHandler(this, this); + } + + @EventHandler + public void posInit(FMLPostInitializationEvent event) { + craftingManager = new CraftingManager(MODID, "enchanting") { + @Override + protected void registerRecipeTypes(Map> types) { + super.registerRecipeTypes(types); + + types.put("unicopia:crafting_spell", SpellRecipe::deserialize); + } + }; + } + + public static CraftingManager getCraftingManager() { + return craftingManager; } @SubscribeEvent @@ -295,4 +326,20 @@ public class Unicopia { event.setNewfov(fov); } + + @Override + public Object getServerGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) { + switch (ID) { + case 0: return new ContainerSpellBook(player.inventory, world, new BlockPos(x, y, z)); + default: return null; + } + } + + @Override + public Object getClientGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) { + switch (ID) { + case 0: return new GuiSpellBook(player); + default: return null; + } + } } diff --git a/src/main/java/com/minelittlepony/unicopia/enchanting/BasicCraftingEvent.java b/src/main/java/com/minelittlepony/unicopia/enchanting/BasicCraftingEvent.java new file mode 100644 index 00000000..ff8a8230 --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/enchanting/BasicCraftingEvent.java @@ -0,0 +1,32 @@ +package com.minelittlepony.unicopia.enchanting; + +import com.minelittlepony.unicopia.UItems; +import com.minelittlepony.unicopia.enchanting.PagesList.IPageEvent; +import com.minelittlepony.unicopia.spell.SpellRegistry; + +import net.minecraft.item.ItemStack; + +/** + * A basic event for unlocking a page when a gem is crafted for the given spell + */ +public class BasicCraftingEvent implements IPageEvent { + + private final String matched; + private final int pageIndex; + + public BasicCraftingEvent(int page, String effectName) { + matched = effectName; + pageIndex = page; + } + + @Override + public boolean matches(IPageOwner prop, ItemStack stack) { + return stack.getItem() == UItems.spell && SpellRegistry.getKeyFromStack(stack).equals(matched); + } + + @Override + public int getPage(int stackSize) { + return pageIndex; + } + +} diff --git a/src/main/java/com/minelittlepony/unicopia/enchanting/IPageOwner.java b/src/main/java/com/minelittlepony/unicopia/enchanting/IPageOwner.java new file mode 100644 index 00000000..b230cb68 --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/enchanting/IPageOwner.java @@ -0,0 +1,32 @@ +package com.minelittlepony.unicopia.enchanting; + +import java.util.List; + +import javax.annotation.Nonnull; + +import com.minelittlepony.unicopia.network.ITransmittable; + +public interface IPageOwner extends ITransmittable { + + @Nonnull + List getUnlockedPages(); + + default boolean hasPageUnlock(int pageIndex) { + return getUnlockedPages().contains(pageIndex); + } + + default boolean unlockPage(int pageIndex) { + if (!hasPageUnlock(pageIndex)) { + if (getUnlockedPages().add(pageIndex)) { + sendCapabilities(true); + + return true; + } + } + return false; + } + + default boolean hasUnlockedPages() { + return getUnlockedPages().size() > 0; + } +} diff --git a/src/main/java/com/minelittlepony/unicopia/enchanting/IPageUnlockListener.java b/src/main/java/com/minelittlepony/unicopia/enchanting/IPageUnlockListener.java new file mode 100644 index 00000000..500f9bc8 --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/enchanting/IPageUnlockListener.java @@ -0,0 +1,5 @@ +package com.minelittlepony.unicopia.enchanting; + +public interface IPageUnlockListener { + public void onPageUnlocked(); +} diff --git a/src/main/java/com/minelittlepony/unicopia/enchanting/MultiPageUnlockEvent.java b/src/main/java/com/minelittlepony/unicopia/enchanting/MultiPageUnlockEvent.java new file mode 100644 index 00000000..6b9f1357 --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/enchanting/MultiPageUnlockEvent.java @@ -0,0 +1,41 @@ +package com.minelittlepony.unicopia.enchanting; + +import com.minelittlepony.unicopia.enchanting.PagesList.IPageEvent; + +import net.minecraft.item.ItemStack; + +/** + * An unlock event that requires other pages to be unlocked before it too can be unlocked. + * + */ +public class MultiPageUnlockEvent implements IPageEvent { + + private final int pageIndex; + + private final int[][] otherPageIndeces; + + public MultiPageUnlockEvent(int page, int[]... otherPages) { + pageIndex = page; + otherPageIndeces = otherPages; + } + + @Override + public boolean matches(IPageOwner prop, ItemStack stack) { + for (int i = 0; i < otherPageIndeces.length; i++) { + if (!checkPageUnlockSet(prop, otherPageIndeces[i])) return false; + } + return true; + } + + private boolean checkPageUnlockSet(IPageOwner prop, int[] pages) { + for (int i = 0; i < pages.length; i++) { + if (prop.hasPageUnlock(pages[i])) return true; + } + return false; + } + + @Override + public int getPage(int stackSize) { + return pageIndex; + } +} diff --git a/src/main/java/com/minelittlepony/unicopia/enchanting/PagesList.java b/src/main/java/com/minelittlepony/unicopia/enchanting/PagesList.java new file mode 100644 index 00000000..c9e6ae83 --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/enchanting/PagesList.java @@ -0,0 +1,117 @@ +package com.minelittlepony.unicopia.enchanting; + +import java.util.ArrayList; +import java.util.List; + +import com.minelittlepony.unicopia.player.PlayerSpeciesList; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; + +public class PagesList { + + private static final List unreadPages = new ArrayList(); + + private static final List pageEvents = new ArrayList(); + + private static int totalPages = 0; + + /** + * Sets the maximum number of pages displayed in the spellbook. + * Only allows widening. Total pages cannot be reduced. + */ + public static void setTotalPages(int pages) { + if (pages > totalPages) { + totalPages = pages; + } + } + + public static int getTotalPages() { + return totalPages; + } + + /** + * Registers an event for unlocking a page. + */ + public static void registerPageEvent(IPageEvent event) { + pageEvents.add(event); + } + + /** + * Marks a page as read + */ + public static void readPage(int pageIndex) { + unreadPages.remove(Integer.valueOf(pageIndex)); + } + + /** + * Checks if there are any pages after the given index that are unread + * Only useful on the client + */ + public static boolean hasUnreadPagesAfter(int pageIndex) { + for (Integer i : unreadPages) { + if (i > pageIndex) return true; + } + return false; + } + + /** + * Checks if there are any pages before the given index that are unread + * Only useful on the client + */ + public static boolean hasUnreadPagesBefore(int pageIndex) { + for (Integer i : unreadPages) { + if (i < pageIndex) return true; + } + return false; + } + + /** + * Checks if the given page has been read yet. + * Only of use on the client + */ + public static boolean isPageUnread(int pageIndex) { + return unreadPages.contains(pageIndex); + } + + private static boolean unlockPages(IPageOwner prop, ItemStack stack) { + boolean result = false; + if (stack != null && stack.getCount() > 0) { + for (IPageEvent i : pageEvents) { + if (i.matches(prop, stack)) { + int page = i.getPage(stack.getCount()); + if (page >= 0 && prop.unlockPage(page)) { + result |= unreadPages.add(page); + } + } + } + } + return result; + } + + /** + * Checks for, and unlocks any pages that can be unlocked by the given item for the given player + * @return True if a page was unlocked, false otherwise + */ + public static boolean unlockPage(EntityPlayer player, ItemStack stack) { + return unlockPages(PlayerSpeciesList.instance().getPlayer(player), stack); + } + + /** + * A PageEvent for determining when certain pages must be unlocked. + * + */ + public static interface IPageEvent { + /** + * Checks if this event's conditions are met. + * @param prop PlayerExtension for the player doing the crafting + * @param stack ItemStack crafted + */ + public boolean matches(IPageOwner prop, ItemStack stack); + + /** + * Gets the page number corresponding to the given stack for this event + */ + public int getPage(int stackSize); + } +} diff --git a/src/main/java/com/minelittlepony/unicopia/enchanting/SpellRecipe.java b/src/main/java/com/minelittlepony/unicopia/enchanting/SpellRecipe.java new file mode 100644 index 00000000..bd796c2c --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/enchanting/SpellRecipe.java @@ -0,0 +1,142 @@ +package com.minelittlepony.unicopia.enchanting; + +import java.util.ArrayList; + +import com.google.common.collect.Lists; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.minelittlepony.unicopia.UItems; +import com.minelittlepony.unicopia.inventory.InventorySpellBook; +import com.minelittlepony.unicopia.spell.SpellRegistry; + +import net.minecraft.inventory.InventoryCrafting; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.item.crafting.IRecipe; +import net.minecraft.util.NonNullList; +import net.minecraft.world.World; + +import net.minecraftforge.registries.IForgeRegistryEntry.Impl; + +public class SpellRecipe extends Impl implements IRecipe { + + private String spellId; + + private final NonNullList ingredients; + + public static IRecipe deserialize(JsonObject json) { + + NonNullList ingredients = NonNullList.create(); + + for (JsonElement i : json.get("ingredients").getAsJsonArray()) { + JsonObject o = i.getAsJsonObject(); + + Item item = Item.getByNameOrId(o.get("item").getAsString()); + + if (item != null) { + int metadata = Math.max(0, o.has("data") ? o.get("data").getAsInt() : 0); + int size = Math.max(1, o.has("count") ? o.get("count").getAsInt() : 1); + + ingredients.add(new RecipeItem(new ItemStack(item, size, metadata), !o.has("data"))); + } + } + + json = json.get("result").getAsJsonObject(); + + String spellId = json.get("spell").getAsString(); + + return new SpellRecipe(spellId, ingredients); + } + + public SpellRecipe(String spellName, NonNullList ingredients) { + spellId = spellName; + this.ingredients = ingredients; + } + + @Override + public boolean matches(InventoryCrafting inv, World worldIn) { + ItemStack enchantedStack = ((InventorySpellBook)inv).getCraftResultMatrix().getStackInSlot(0); + + if (enchantedStack.isEmpty()) { + return false; + } + + int materialMult = enchantedStack.getCount(); + + ArrayList toMatch = Lists.newArrayList(ingredients); + + for (int i = 0; i < inv.getSizeInventory(); i++) { + ItemStack stack = inv.getStackInSlot(i); + + if (!stack.isEmpty()) { + if (toMatch.isEmpty() && !stack.isEmpty()) { + return false; + } + + if (!toMatch.isEmpty() && !toMatch.removeIf(s -> s.matches(stack, materialMult))) { + return false; + } + } + } + return toMatch.isEmpty(); + } + + @Override + public ItemStack getCraftingResult(InventoryCrafting inv) { + return getRecipeOutput(); + } + + @Override + public boolean canFit(int width, int height) { + return width * height < ingredients.size(); + } + + @Override + public ItemStack getRecipeOutput() { + return SpellRegistry.instance().enchantStack(new ItemStack(UItems.spell, 1), spellId); + } + + @Override + public NonNullList getRemainingItems(InventoryCrafting inv) { + NonNullList remainers = NonNullList.withSize(inv.getSizeInventory(), ItemStack.EMPTY); + for (int i = 0; i < remainers.size(); i++) { + ItemStack stack = inv.getStackInSlot(i); + + if (stack != null && stack.getItem().hasContainerItem(stack)) { + remainers.set(i, new ItemStack(stack.getItem().getContainerItem())); + } + } + return remainers; + } + + private static class RecipeItem { + + private final ItemStack contained; + private final boolean ignoreMeta; + + RecipeItem(ItemStack stack, boolean meta) { + contained = stack; + ignoreMeta = meta; + } + + boolean matches(ItemStack other, int materialMult) { + if (other.isEmpty() != contained.isEmpty()) { + return false; + } else if (other.isEmpty()) { + return true; + } + + if (other.isEmpty()) { + return false; + } + + if (contained.getItem() == other.getItem() + && (ignoreMeta || other.getMetadata() == contained.getMetadata())) { + + return other.getCount() >= (materialMult * contained.getCount()); + } + + return false; + } + } +} diff --git a/src/main/java/com/minelittlepony/unicopia/entity/EntitySpellbook.java b/src/main/java/com/minelittlepony/unicopia/entity/EntitySpellbook.java index 0caf39f7..fcc2ea04 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/EntitySpellbook.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/EntitySpellbook.java @@ -2,10 +2,12 @@ package com.minelittlepony.unicopia.entity; import com.minelittlepony.unicopia.Predicates; import com.minelittlepony.unicopia.UItems; +import com.minelittlepony.unicopia.Unicopia; import net.minecraft.block.SoundType; import net.minecraft.entity.EntityLiving; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.SoundEvents; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.network.datasync.DataParameter; @@ -130,7 +132,10 @@ public class EntitySpellbook extends EntityLiving implements IMagicals { } if (Predicates.MAGI.test(player)) { - //ApiGui.openContainer((EntityPlayerMP)player, new InterfaceBook()); + + player.playSound(SoundEvents.BLOCK_FURNACE_FIRE_CRACKLE, 2, 1); + + player.openGui(Unicopia.MODID, 0, world, (int)posX, (int)posY, (int)posZ); return EnumActionResult.SUCCESS; } diff --git a/src/main/java/com/minelittlepony/unicopia/forgebullshit/BuildInTexturesBakery.java b/src/main/java/com/minelittlepony/unicopia/forgebullshit/BuildInTexturesBakery.java new file mode 100644 index 00000000..436ab374 --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/forgebullshit/BuildInTexturesBakery.java @@ -0,0 +1,17 @@ +package com.minelittlepony.unicopia.forgebullshit; + +import java.util.Set; + +import net.minecraft.client.renderer.block.model.ModelBakery; +import net.minecraft.util.ResourceLocation; + + +public final class BuildInTexturesBakery extends ModelBakery { + private BuildInTexturesBakery() { + super(null, null, null); + } + + public static Set getBuiltInTextures() { + return LOCATIONS_BUILTIN_TEXTURES; + } +} diff --git a/src/main/java/com/minelittlepony/unicopia/inventory/InventorySpellBook.java b/src/main/java/com/minelittlepony/unicopia/inventory/InventorySpellBook.java new file mode 100644 index 00000000..2efc4b22 --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/inventory/InventorySpellBook.java @@ -0,0 +1,19 @@ +package com.minelittlepony.unicopia.inventory; + +import net.minecraft.inventory.Container; +import net.minecraft.inventory.IInventory; +import net.minecraft.inventory.InventoryCrafting; + +public class InventorySpellBook extends InventoryCrafting { + + private final IInventory craftResult; + + public InventorySpellBook(IInventory resultMatrix, Container eventHandler, int width, int height) { + super(eventHandler, width, height); + craftResult = resultMatrix; + } + + public IInventory getCraftResultMatrix() { + return craftResult; + } +} diff --git a/src/main/java/com/minelittlepony/unicopia/inventory/gui/ContainerSpellBook.java b/src/main/java/com/minelittlepony/unicopia/inventory/gui/ContainerSpellBook.java new file mode 100644 index 00000000..e5b8e0de --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/inventory/gui/ContainerSpellBook.java @@ -0,0 +1,149 @@ +package com.minelittlepony.unicopia.inventory.gui; + +import javax.annotation.Nonnull; + +import com.minelittlepony.unicopia.Predicates; +import com.minelittlepony.unicopia.Unicopia; +import com.minelittlepony.unicopia.enchanting.IPageUnlockListener; +import com.minelittlepony.unicopia.inventory.InventorySpellBook; +import com.minelittlepony.unicopia.inventory.slot.SlotEnchanting; +import com.minelittlepony.unicopia.inventory.slot.SlotEnchantingResult; +import com.minelittlepony.unicopia.item.ItemSpell; +import com.minelittlepony.unicopia.spell.SpellRegistry; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.init.SoundEvents; +import net.minecraft.inventory.Container; +import net.minecraft.inventory.IInventory; +import net.minecraft.inventory.InventoryBasic; +import net.minecraft.inventory.Slot; +import net.minecraft.item.ItemStack; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; + +public class ContainerSpellBook extends Container { + + private final World worldObj; + + private IInventory craftResult = new InventoryBasic("Spell Result", false, 1); + + private InventorySpellBook craftMatrix = new InventorySpellBook(craftResult, this, 5, 1); + + private IPageUnlockListener listener; + + private SlotEnchantingResult resultSlot = null; + + private final EntityPlayer player; + + public ContainerSpellBook(InventoryPlayer inventory, World world, BlockPos pos) { + super(); + worldObj = world; + player = inventory.player; + + initCraftingSlots(); + + for (int i = 0; i < 9; ++i) { + addSlotToContainer(new Slot(inventory, i, 121 + i * 18, 195)); + } + + onCraftMatrixChanged(craftMatrix); + } + + public void setListener(IPageUnlockListener listener) { + this.listener = listener; + + if (resultSlot != null) { + resultSlot.setListener(listener); + } + } + + public void initCraftingSlots() { + addSlotToContainer(new SlotEnchanting(craftMatrix, 0, 180, 50)); + addSlotToContainer(new SlotEnchanting(craftMatrix, 1, 154, 94)); + addSlotToContainer(new SlotEnchanting(craftMatrix, 2, 180, 134)); + addSlotToContainer(new SlotEnchanting(craftMatrix, 3, 231, 120)); + addSlotToContainer(new SlotEnchanting(craftMatrix, 4, 232, 65)); + addSlotToContainer(resultSlot = new SlotEnchantingResult(listener, player, craftMatrix, craftResult, 0, 196, 92)); + } + + @Override + public void onCraftMatrixChanged(IInventory inventoryIn) { + ItemStack current = craftResult.getStackInSlot(0); + + if (!current.isEmpty()) { + ItemStack crafted = Unicopia.getCraftingManager().findMatchingResult(craftMatrix, worldObj); + + if (!crafted.isEmpty()) { + current = SpellRegistry.instance().enchantStack(current, crafted); + + player.playSound(SoundEvents.BLOCK_NOTE_CHIME, 1, 1); + } else { + current = SpellRegistry.instance().disenchantStack(current); + + player.playSound(SoundEvents.BLOCK_NOTE_BASS, 1, 1); + } + + craftResult.setInventorySlotContents(0, current); + } + } + + @Nonnull + @Override + public ItemStack transferStackInSlot(EntityPlayer playerIn, int index) { + ItemStack stack = ItemStack.EMPTY; + Slot slot = inventorySlots.get(index); + + if (slot != null && slot.getHasStack()) { + ItemStack slotStack = slot.getStack(); + stack = slotStack.copy(); + + if (index > 5) { + if (stack.getItem() instanceof ItemSpell) { + if (!mergeItemStack(slotStack, 5, 6, false)) { + return ItemStack.EMPTY; + } + } else if (!mergeItemStack(slotStack, 0, 5, false)) { + return ItemStack.EMPTY; + } + } else { + if (!mergeItemStack(slotStack, 6, 15, false)) { + return ItemStack.EMPTY; + } + + slot.onSlotChange(slotStack, stack); + onCraftMatrixChanged(craftMatrix); + } + + if (slotStack.getCount() == stack.getCount()) { + return ItemStack.EMPTY; + } + + slot.onTake(playerIn, slotStack); + } + + return stack; + } + + @Override + public void onContainerClosed(EntityPlayer player) { + super.onContainerClosed(player); + + for (int i = 0; i < craftMatrix.getSizeInventory(); i++) { + if (craftMatrix.getStackInSlot(i) != null) { + player.dropItem(craftMatrix.getStackInSlot(i), false); + craftMatrix.setInventorySlotContents(i, ItemStack.EMPTY); + } + } + + if (craftResult.getStackInSlot(0) != null) { + player.dropItem(craftResult.getStackInSlot(0), false); + craftResult.setInventorySlotContents(0, ItemStack.EMPTY); + } + } + + @Override + public boolean canInteractWith(EntityPlayer player) { + return Predicates.MAGI.test(player); + } +} diff --git a/src/main/java/com/minelittlepony/unicopia/inventory/gui/GuiSpellBook.java b/src/main/java/com/minelittlepony/unicopia/inventory/gui/GuiSpellBook.java new file mode 100644 index 00000000..9514aa86 --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/inventory/gui/GuiSpellBook.java @@ -0,0 +1,209 @@ +package com.minelittlepony.unicopia.inventory.gui; + +import java.io.IOException; + +import org.lwjgl.opengl.GL11; + +import com.minelittlepony.unicopia.enchanting.IPageUnlockListener; +import com.minelittlepony.unicopia.enchanting.PagesList; +import com.minelittlepony.unicopia.inventory.slot.SlotEnchanting; +import com.minelittlepony.unicopia.player.IPlayer; +import com.minelittlepony.unicopia.player.PlayerSpeciesList; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiButton; +import net.minecraft.client.gui.inventory.GuiContainer; +import net.minecraft.client.renderer.GlStateManager; +import net.minecraft.client.renderer.texture.TextureUtil; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.Slot; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.ResourceLocation; + +public class GuiSpellBook extends GuiContainer implements IPageUnlockListener { + private static int currentPage = 0; + private static ResourceLocation spellBookPageTextures = new ResourceLocation("unicopia", "textures/gui/container/pages/page-" + currentPage + ".png"); + + private static final ResourceLocation spellBookGuiTextures = new ResourceLocation("unicopia", "textures/gui/container/book.png"); + + private IPlayer playerExtension; + + private PageButton nextPage; + private PageButton prevPage; + + public GuiSpellBook(EntityPlayer player) { + super(new ContainerSpellBook(player.inventory, player.world, new BlockPos(player))); + player.openContainer = inventorySlots; + ((ContainerSpellBook)inventorySlots).setListener(this); + xSize = 405; + ySize = 219; + allowUserInput = true; + playerExtension = PlayerSpeciesList.instance().getPlayer(player); + } + + @Override + public void initGui() { + super.initGui(); + buttonList.clear(); + + int x = (width - xSize) / 2; + int y = (height - ySize) / 2; + + buttonList.add(nextPage = new PageButton(1, x + 360, y + 160, true)); + buttonList.add(prevPage = new PageButton(2, x + 20, y + 160, false)); + } + + @Override + protected void actionPerformed(GuiButton button) throws IOException { + initGui(); + + if (button.id == 1) { + nextPage(); + } else { + prevPage(); + } + } + + public void nextPage() { + if (currentPage == 0) { + playerExtension.unlockPage(1); + } + if (currentPage < PagesList.getTotalPages() - 1) { + currentPage++; + spellBookPageTextures = new ResourceLocation("unicopia", "textures/gui/container/pages/page-" + currentPage + ".png"); + + onPageUnlocked(); + PagesList.readPage(currentPage); + } + } + + @Override + public void onPageUnlocked() { + if (PagesList.hasUnreadPagesAfter(currentPage)) { + nextPage.triggerShake(); + } + + if (PagesList.hasUnreadPagesBefore(currentPage)) { + prevPage.triggerShake(); + } + } + + public void prevPage() { + if (currentPage > 0) { + currentPage--; + spellBookPageTextures = new ResourceLocation("unicopia", "textures/gui/container/pages/page-" + currentPage + ".png"); + + onPageUnlocked(); + PagesList.readPage(currentPage); + } + } + + @Override + protected void drawGradientRect(int left, int top, int width, int height, int startColor, int endColor) { + Slot slot = getSlotUnderMouse(); + if (slot == null || left != slot.xPos || top != slot.yPos || !drawSlotOverlay(slot)) { + super.drawGradientRect(left, top, width, height, startColor, endColor); + } + } + + protected boolean drawSlotOverlay(Slot slot) { + if (slot instanceof SlotEnchanting) { + GlStateManager.enableBlend(); + GL11.glDisable(GL11.GL_ALPHA_TEST); + mc.getTextureManager().bindTexture(spellBookGuiTextures); + drawModalRectWithCustomSizedTexture(slot.xPos - 1, slot.yPos - 1, 51, 223, 18, 18, 512, 256); + GL11.glEnable(GL11.GL_ALPHA_TEST); + GlStateManager.disableBlend(); + return true; + } + return false; + } + + @Override + public void drawScreen(int mouseX, int mouseY, float partialTicks) { + super.drawScreen(mouseX, mouseY, partialTicks); + + renderHoveredToolTip(mouseX, mouseY); + } + + @Override + protected void drawGuiContainerForegroundLayer(int mouseX, int mouseY) { + if (PagesList.getTotalPages() > 0) { + String text = (currentPage + 1) + "/" + PagesList.getTotalPages(); + fontRenderer.drawString(text, 203 - fontRenderer.getStringWidth(text)/2, 165, 0x0); + } + } + + @Override + protected void drawGuiContainerBackgroundLayer(float partialTicks, int mouseX, int mouseY) { + GlStateManager.color(1, 1, 1, 1); + + int left = (width - xSize) / 2; + int top = (height - ySize) / 2; + + mc.getTextureManager().bindTexture(spellBookGuiTextures); + drawModalRectWithCustomSizedTexture(left, top, 0, 0, xSize, ySize, 512, 256); + + GlStateManager.enableBlend(); + GL11.glDisable(GL11.GL_ALPHA_TEST); + + if (playerExtension.hasPageUnlock(currentPage)) { + if (mc.getTextureManager().getTexture(spellBookPageTextures) != TextureUtil.MISSING_TEXTURE) { + GlStateManager.blendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + + mc.getTextureManager().bindTexture(spellBookPageTextures); + drawModalRectWithCustomSizedTexture(left, top, 0, 0, xSize, ySize, 512, 256); + } + } + + mc.getTextureManager().bindTexture(spellBookGuiTextures); + drawModalRectWithCustomSizedTexture(left + 152, top + 49, 407, 2, 100, 101, 512, 256); + + GL11.glEnable(GL11.GL_ALPHA_TEST); + GlStateManager.disableBlend(); + } + + static class PageButton extends GuiButton { + private final boolean direction; + + private int shakesLeft = 0; + private float shakeCount = 0; + + public PageButton(int id, int x, int y, boolean direction) { + super(id, x, y, 23, 13, ""); + this.direction = direction; + } + + @Override + public void drawButton(Minecraft mc, int mouseX, int mouseY, float partialTicks) { + if (visible) { + int x = this.x; + int y = this.y; + if (shakesLeft > 0) { + shakeCount += (float)Math.PI/2; + if (shakeCount >= Math.PI * 2) { + shakeCount %= Math.PI*2; + shakesLeft--; + } + x += (int)(Math.sin(shakeCount)*3); + y -= (int)(Math.sin(shakeCount)*3); + } + + boolean hovered = mouseX >= this.x && mouseY >= this.y && mouseX < this.x + width && mouseY < this.y + height; + GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F); + mc.getTextureManager().bindTexture(spellBookGuiTextures); + int u = 0; + int v = 220; + if (hovered) u += 23; + if (!direction) v += 13; + drawModalRectWithCustomSizedTexture(x, y, u, v, 23, 13, 512, 256); + } + } + + public void triggerShake() { + if (shakesLeft <= 0) { + shakesLeft = 5; + } + } + } +} diff --git a/src/main/java/com/minelittlepony/unicopia/inventory/slot/SlotEnchanting.java b/src/main/java/com/minelittlepony/unicopia/inventory/slot/SlotEnchanting.java new file mode 100644 index 00000000..a1f45bd7 --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/inventory/slot/SlotEnchanting.java @@ -0,0 +1,15 @@ +package com.minelittlepony.unicopia.inventory.slot; + +import net.minecraft.inventory.IInventory; +import net.minecraft.inventory.Slot; + +public class SlotEnchanting extends Slot { + + public SlotEnchanting(IInventory inventoryIn, int index, int xPosition, int yPosition) { + super(inventoryIn, index, xPosition, yPosition); + } + + public boolean canBeHovered() { + return true; + } +} diff --git a/src/main/java/com/minelittlepony/unicopia/inventory/slot/SlotEnchantingResult.java b/src/main/java/com/minelittlepony/unicopia/inventory/slot/SlotEnchantingResult.java new file mode 100644 index 00000000..3e0cba79 --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/inventory/slot/SlotEnchantingResult.java @@ -0,0 +1,96 @@ +package com.minelittlepony.unicopia.inventory.slot; + +import com.minelittlepony.unicopia.Unicopia; +import com.minelittlepony.unicopia.enchanting.IPageUnlockListener; +import com.minelittlepony.unicopia.enchanting.PagesList; +import com.minelittlepony.unicopia.inventory.InventorySpellBook; +import com.minelittlepony.unicopia.item.ItemSpell; +import com.minelittlepony.unicopia.spell.SpellRegistry; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.IInventory; +import net.minecraft.item.ItemStack; +import net.minecraft.util.NonNullList; + +public class SlotEnchantingResult extends SlotEnchanting { + + private final EntityPlayer thePlayer; + private final InventorySpellBook craftMatrix; + + private IPageUnlockListener listener; + + public SlotEnchantingResult(IPageUnlockListener listener, EntityPlayer player, InventorySpellBook craftMatric, IInventory inventory, int index, int xPosition, int yPosition) { + super(inventory, index, xPosition, yPosition); + thePlayer = player; + this.listener = listener; + craftMatrix = craftMatric; + } + + public void setListener(IPageUnlockListener listener) { + this.listener = listener; + } + + @Override + public ItemStack onTake(EntityPlayer player, ItemStack stack) { + onCrafting(stack); + + ItemStack current = craftMatrix.getCraftResultMatrix().getStackInSlot(0); + craftMatrix.getCraftResultMatrix().setInventorySlotContents(0, stack); + + NonNullList remaining = Unicopia.getCraftingManager().getRemainingItems(craftMatrix, player.world); + + craftMatrix.getCraftResultMatrix().setInventorySlotContents(0, current); + + for (int i = 0; i < remaining.size(); ++i) { + current = craftMatrix.getStackInSlot(i); + ItemStack remainder = remaining.get(i); + + if (!current.isEmpty()) { + if (current.getCount() < stack.getCount()) { + craftMatrix.setInventorySlotContents(i, ItemStack.EMPTY); + } else { + craftMatrix.decrStackSize(i, stack.getCount()); + } + + if (!remainder.isEmpty()) { + if (craftMatrix.getStackInSlot(i).isEmpty()) { + craftMatrix.setInventorySlotContents(i, remainder); + } else { + remainder.setCount(stack.getCount()); + if (!player.inventory.addItemStackToInventory(remainder)) { + player.dropItem(remainder, true); + } + } + } + } + } + + return super.onTake(player, stack); + } + + @Override + protected void onCrafting(ItemStack stack, int amount) { + onCrafting(stack); + } + + @Override + protected void onCrafting(ItemStack stack) { + if (PagesList.unlockPage(thePlayer, stack) && listener != null) { + listener.onPageUnlocked(); + } + + if (listener != null) { + listener.onPageUnlocked(); + } + } + + @Override + public boolean isItemValid(ItemStack stack) { + return stack.getItem() instanceof ItemSpell && !SpellRegistry.stackHasEnchantment(stack); + } + + @Override + public String getSlotTexture() { + return "unicopia:items/empty_slot_gem"; + } +} \ No newline at end of file diff --git a/src/main/java/com/minelittlepony/unicopia/network/ITransmittable.java b/src/main/java/com/minelittlepony/unicopia/network/ITransmittable.java new file mode 100644 index 00000000..a844f258 --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/network/ITransmittable.java @@ -0,0 +1,5 @@ +package com.minelittlepony.unicopia.network; + +public interface ITransmittable { + void sendCapabilities(boolean full); +} diff --git a/src/main/java/com/minelittlepony/unicopia/player/IPlayer.java b/src/main/java/com/minelittlepony/unicopia/player/IPlayer.java index dad49482..ec15deb9 100644 --- a/src/main/java/com/minelittlepony/unicopia/player/IPlayer.java +++ b/src/main/java/com/minelittlepony/unicopia/player/IPlayer.java @@ -3,6 +3,8 @@ package com.minelittlepony.unicopia.player; import java.util.UUID; import com.minelittlepony.model.anim.IInterpolator; +import com.minelittlepony.unicopia.enchanting.IPageOwner; +import com.minelittlepony.unicopia.network.ITransmittable; import com.minelittlepony.unicopia.spell.ICaster; import net.minecraft.client.Minecraft; @@ -10,9 +12,7 @@ import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; import net.minecraftforge.fml.common.FMLCommonHandler; -public interface IPlayer extends ICaster, IRaceContainer { - - void sendCapabilities(boolean full); +public interface IPlayer extends ICaster, IRaceContainer, ITransmittable, IPageOwner { IAbilityReceiver getAbilities(); diff --git a/src/main/java/com/minelittlepony/unicopia/player/PlayerCapabilities.java b/src/main/java/com/minelittlepony/unicopia/player/PlayerCapabilities.java index eb683ac1..ba446dff 100644 --- a/src/main/java/com/minelittlepony/unicopia/player/PlayerCapabilities.java +++ b/src/main/java/com/minelittlepony/unicopia/player/PlayerCapabilities.java @@ -1,5 +1,10 @@ package com.minelittlepony.unicopia.player; +import java.util.List; + +import javax.annotation.Nonnull; + +import com.google.common.collect.Lists; import com.minelittlepony.model.anim.BasicEasingInterpolator; import com.minelittlepony.model.anim.IInterpolator; import com.minelittlepony.unicopia.Race; @@ -17,6 +22,7 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.init.MobEffects; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagIntArray; import net.minecraft.network.datasync.DataParameter; import net.minecraft.network.datasync.DataSerializers; import net.minecraft.network.datasync.EntityDataManager; @@ -29,12 +35,17 @@ class PlayerCapabilities implements IPlayer, ICaster { private static final DataParameter PLAYER_RACE = EntityDataManager .createKey(EntityPlayer.class, DataSerializers.VARINT); + private static final DataParameter ENERGY = EntityDataManager + .createKey(EntityPlayer.class, DataSerializers.VARINT); + private static final DataParameter EXERTION = EntityDataManager .createKey(EntityPlayer.class, DataSerializers.FLOAT); private static final DataParameter EFFECT = EntityDataManager .createKey(EntityPlayer.class, DataSerializers.COMPOUND_TAG); + private final List pages = Lists.newArrayList(); + private final PlayerAbilityDelegate powers = new PlayerAbilityDelegate(this); private final PlayerGravityDelegate gravity = new PlayerGravityDelegate(this); @@ -57,6 +68,7 @@ class PlayerCapabilities implements IPlayer, ICaster { player.getDataManager().register(PLAYER_RACE, Race.HUMAN.ordinal()); player.getDataManager().register(EXERTION, 0F); player.getDataManager().register(EFFECT, new NBTTagCompound()); + player.getDataManager().register(ENERGY, 0); } @Override @@ -159,7 +171,7 @@ class PlayerCapabilities implements IPlayer, ICaster { if (!getPlayerSpecies().canCast()) { setEffect(null); } else { - if (entity.getEntityWorld().isRemote) { // && entity.getEntityWorld().getWorldTime() % 10 == 0 + if (entity.getEntityWorld().isRemote) { getEffect().renderOnPerson(this); } @@ -219,6 +231,10 @@ class PlayerCapabilities implements IPlayer, ICaster { compound.setTag("powers", powers.toNBT()); compound.setTag("gravity", gravity.toNBT()); + if (hasUnlockedPages()) { + compound.setTag("pages", new NBTTagIntArray(pages)); + } + IMagicEffect effect = getEffect(); if (effect != null) { @@ -236,6 +252,13 @@ class PlayerCapabilities implements IPlayer, ICaster { if (compound.hasKey("effect")) { setEffect(SpellRegistry.instance().createEffectFromNBT(compound.getCompoundTag("effect"))); } + + if (compound.hasKey("pages")) { + pages.clear(); + for (int i : compound.getIntArray("pages")) { + pages.add(i); + } + } } @Override @@ -274,4 +297,10 @@ class PlayerCapabilities implements IPlayer, ICaster { @Override public void setCurrentLevel(int level) { } + + @Nonnull + public List getUnlockedPages() { + return pages; + } + } diff --git a/src/main/java/com/minelittlepony/unicopia/spell/SpellRegistry.java b/src/main/java/com/minelittlepony/unicopia/spell/SpellRegistry.java index 1ea4050d..79b9731d 100644 --- a/src/main/java/com/minelittlepony/unicopia/spell/SpellRegistry.java +++ b/src/main/java/com/minelittlepony/unicopia/spell/SpellRegistry.java @@ -5,6 +5,8 @@ import java.util.Map; import java.util.Set; import java.util.concurrent.Callable; +import javax.annotation.Nonnull; + import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; @@ -82,6 +84,21 @@ public class SpellRegistry { } } + public ItemStack disenchantStack(ItemStack stack) { + if (stackHasEnchantment(stack)) { + stack.getTagCompound().removeTag("spell"); + } + + return stack; + } + + public ItemStack enchantStack(ItemStack stack, ItemStack from) { + stack.setTagCompound(new NBTTagCompound()); + stack.getTagCompound().setString("spell", getKeyFromStack(from)); + + return stack; + } + public ItemStack enchantStack(ItemStack stack, String name) { stack.setTagCompound(new NBTTagCompound()); stack.getTagCompound().setString("spell", name); @@ -89,6 +106,7 @@ public class SpellRegistry { return stack; } + @Nonnull public static String getKeyFromStack(ItemStack stack) { if (stack.isEmpty() || !stack.hasTagCompound() || !stack.getTagCompound().hasKey("spell")) { return ""; diff --git a/src/main/java/com/minelittlepony/unicopia/util/crafting/CraftingManager.java b/src/main/java/com/minelittlepony/unicopia/util/crafting/CraftingManager.java new file mode 100644 index 00000000..39aed55a --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/util/crafting/CraftingManager.java @@ -0,0 +1,197 @@ +package com.minelittlepony.unicopia.util.crafting; + +import java.io.BufferedReader; +import java.io.IOException; +import java.net.URI; +import java.net.URISyntaxException; +import java.net.URL; +import java.nio.file.FileSystem; +import java.nio.file.FileSystems; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.Collections; +import java.util.Iterator; +import java.util.Map; +import java.util.function.Function; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; + +import org.apache.commons.io.FilenameUtils; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import com.google.common.collect.Maps; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.JsonObject; +import com.google.gson.JsonParseException; +import com.google.gson.JsonSyntaxException; + +import net.minecraft.client.resources.IResourceManager; +import net.minecraft.client.resources.IResourceManagerReloadListener; +import net.minecraft.inventory.InventoryCrafting; +import net.minecraft.item.ItemStack; +import net.minecraft.item.crafting.IRecipe; +import net.minecraft.item.crafting.ShapedRecipes; +import net.minecraft.item.crafting.ShapelessRecipes; +import net.minecraft.util.JsonUtils; +import net.minecraft.util.NonNullList; +import net.minecraft.util.ResourceLocation; +import net.minecraft.world.World; + +public class CraftingManager implements IResourceManagerReloadListener { + + private static final Logger LOGGER = LogManager.getLogger(); + + private final Map REGISTRY = Maps.newHashMap(); + + private final Map> JSON_PARSERS = Maps.newHashMap(); + + private static final Gson gson = new GsonBuilder() + .setPrettyPrinting() + .disableHtmlEscaping() + .create(); + + @Nonnull + private final ResourceLocation crafting_id; + + public CraftingManager(String modid, String resourcename) { + this(new ResourceLocation(modid, resourcename + "/recipes")); + } + + public CraftingManager(@Nonnull ResourceLocation id) { + crafting_id = id; + + load(); + } + + protected void registerRecipeTypes(Map> types) { + types.put("crafting_shaped", ShapedRecipes::deserialize); + types.put("crafting_shapeless", ShapelessRecipes::deserialize); + } + + @Override + public void onResourceManagerReload(IResourceManager resourceManager) { + load(); + } + + public void load() { + JSON_PARSERS.clear(); + REGISTRY.clear(); + + registerRecipeTypes(JSON_PARSERS); + + try { + String loadLocation = "/assets/" + crafting_id.getNamespace() + "/" + crafting_id.getPath(); + + URL url = CraftingManager.class.getResource(loadLocation); + + if (url == null) { + LOGGER.error("Couldn't find .mcassetsroot"); + return; + } + + URI uri = url.toURI(); + + if ("file".equals(uri.getScheme())) { + loadRecipesFrom(Paths.get(CraftingManager.class.getResource(loadLocation).toURI())); + } else { + if (!"jar".equals(uri.getScheme())) { + LOGGER.error("Unsupported scheme " + uri + " trying to list all recipes"); + + return; + } + + try (FileSystem filesystem = FileSystems.newFileSystem(uri, Collections.emptyMap())) { + loadRecipesFrom(filesystem.getPath(loadLocation)); + } + } + } catch (IOException | URISyntaxException e) { + LOGGER.error("Couldn't get a list of all recipe files", e); + } + } + + private void loadRecipesFrom(@Nullable Path path) throws IOException { + if (path == null) { + return; + } + + Iterator iterator = Files.walk(path).iterator(); + + while (iterator.hasNext()) { + Path i = iterator.next(); + + if ("json".equals(FilenameUtils.getExtension(i.toString()))) { + ResourceLocation id = new ResourceLocation(FilenameUtils.removeExtension(path.relativize(i).toString()).replaceAll("\\\\", "/")); + + try(BufferedReader bufferedreader = Files.newBufferedReader(i)) { + REGISTRY.put(id, parseRecipeJson(JsonUtils.fromJson(gson, bufferedreader, JsonObject.class))); + } catch (JsonParseException e) { + LOGGER.error("Parsing error loading recipe " + id, e); + + return; + } catch (IOException e) { + LOGGER.error("Couldn't read recipe " + id + " from " + i, e); + + return; + } + } + } + } + + protected IRecipe parseRecipeJson(JsonObject json) { + String s = JsonUtils.getString(json, "type"); + + if (!JSON_PARSERS.containsKey(s)) { + throw new JsonSyntaxException("Invalid or unsupported recipe type '" + s + "'"); + } + + return JSON_PARSERS.get(s).apply(json); + } + + @Nonnull + public ItemStack findMatchingResult(InventoryCrafting craftMatrix, World worldIn) { + IRecipe recipe = findMatchingRecipe(craftMatrix, worldIn); + + if (recipe != null) { + return recipe.getCraftingResult(craftMatrix); + } + + return ItemStack.EMPTY; + } + + @Nullable + public IRecipe findMatchingRecipe(InventoryCrafting craftMatrix, World worldIn) { + load(); + + for (IRecipe irecipe : REGISTRY.values()) { + if (irecipe.matches(craftMatrix, worldIn)) { + return irecipe; + } + } + + return null; + } + + public NonNullList getRemainingItems(InventoryCrafting craftMatrix, World worldIn) { + IRecipe recipe = findMatchingRecipe(craftMatrix, worldIn); + + if (recipe != null) { + return recipe.getRemainingItems(craftMatrix); + } + + return cloneInventoryContents(craftMatrix); + } + + public static NonNullList cloneInventoryContents(InventoryCrafting craftMatrix) { + NonNullList result = NonNullList.withSize(craftMatrix.getSizeInventory(), ItemStack.EMPTY); + + for (int i = 0; i < result.size(); ++i) { + result.set(i, craftMatrix.getStackInSlot(i)); + } + + return result; + } +} diff --git a/src/main/resources/assets/unicopia/enchanting/recipes/shield.json b/src/main/resources/assets/unicopia/enchanting/recipes/shield.json new file mode 100644 index 00000000..b4cd9d46 --- /dev/null +++ b/src/main/resources/assets/unicopia/enchanting/recipes/shield.json @@ -0,0 +1,12 @@ +{ + "type": "unicopia:crafting_spell", + "ingredients": [ + { + "item": "minecraft:apple", + "data": 0 + } + ], + "result": { + "spell": "shield" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/unicopia/textures/gui/container/book.png b/src/main/resources/assets/unicopia/textures/gui/container/book.png new file mode 100644 index 0000000000000000000000000000000000000000..df003ecae8b1789f17f0395842eae5b8ecbbb1c9 GIT binary patch literal 2117404 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 literal 0 HcmV?d00001