From c161a74d7341f4d7a7635a358dedd555b37348cc Mon Sep 17 00:00:00 2001 From: Electroblob77 <35599699+Electroblob77@users.noreply.github.com> Date: Tue, 31 Mar 2020 21:33:10 +0100 Subject: [PATCH] Add bookshelf interface to arcane workbench Implements the main functionality: - Access bookshelves from within the workbench - Search by spell name, tier, element and type - Sort by tier, element or alphabetically, ascending or descending - Three-way shift-clicking support - Automatic return of books to bookshelves when wand is removed --- .../wizardry/block/BlockBookshelf.java | 10 - .../client/gui/GuiArcaneWorkbench.java | 223 +++++++++++-- .../inventory/ContainerArcaneWorkbench.java | 298 +++++++++++++++--- .../wizardry/inventory/SlotBookList.java | 70 ++++ .../wizardry/inventory/VirtualSlot.java | 79 +++++ .../electroblob/wizardry/spell/Spell.java | 29 ++ .../assets/ebwizardry/lang/en_gb.lang | 5 + .../assets/ebwizardry/lang/en_us.lang | 5 + .../textures/gui/arcane_workbench.png | Bin 31627 -> 40318 bytes 9 files changed, 646 insertions(+), 73 deletions(-) create mode 100644 src/main/java/electroblob/wizardry/inventory/SlotBookList.java create mode 100644 src/main/java/electroblob/wizardry/inventory/VirtualSlot.java diff --git a/src/main/java/electroblob/wizardry/block/BlockBookshelf.java b/src/main/java/electroblob/wizardry/block/BlockBookshelf.java index b4e23861..9fc4c90a 100644 --- a/src/main/java/electroblob/wizardry/block/BlockBookshelf.java +++ b/src/main/java/electroblob/wizardry/block/BlockBookshelf.java @@ -50,16 +50,6 @@ public class BlockBookshelf extends BlockHorizontal implements ITileEntityProvid return new BlockStateContainer.Builder(this).add(FACING).add(BOOKS).build(); } - @Override - public boolean isOpaqueCube(IBlockState state){ - return false; - } - - @Override - public boolean isFullCube(IBlockState state){ - return false; - } - @Override public BlockFaceShape getBlockFaceShape(IBlockAccess world, IBlockState state, BlockPos pos, EnumFacing face){ return state.getValue(FACING).getAxis() == face.getAxis() ? BlockFaceShape.UNDEFINED : BlockFaceShape.SOLID; diff --git a/src/main/java/electroblob/wizardry/client/gui/GuiArcaneWorkbench.java b/src/main/java/electroblob/wizardry/client/gui/GuiArcaneWorkbench.java index 7d8be0a3..28901598 100644 --- a/src/main/java/electroblob/wizardry/client/gui/GuiArcaneWorkbench.java +++ b/src/main/java/electroblob/wizardry/client/gui/GuiArcaneWorkbench.java @@ -6,6 +6,8 @@ import electroblob.wizardry.constants.Element; import electroblob.wizardry.constants.Tier; import electroblob.wizardry.data.SpellGlyphData; import electroblob.wizardry.data.WizardData; +import electroblob.wizardry.inventory.ContainerArcaneWorkbench; +import electroblob.wizardry.inventory.SlotBookList; import electroblob.wizardry.item.IManaStoringItem; import electroblob.wizardry.item.ISpellCastingItem; import electroblob.wizardry.item.IWorkbenchItem; @@ -14,23 +16,25 @@ import electroblob.wizardry.packet.PacketControlInput; import electroblob.wizardry.packet.WizardryPacketHandler; import electroblob.wizardry.registry.WizardrySounds; import electroblob.wizardry.spell.Spell; -import electroblob.wizardry.inventory.ContainerArcaneWorkbench; import electroblob.wizardry.tileentity.TileEntityArcaneWorkbench; import electroblob.wizardry.util.WandHelper; import net.minecraft.client.Minecraft; import net.minecraft.client.audio.PositionedSoundRecord; import net.minecraft.client.gui.GuiButton; +import net.minecraft.client.gui.GuiTextField; import net.minecraft.client.gui.inventory.GuiContainer; import net.minecraft.client.renderer.GlStateManager; import net.minecraft.client.renderer.GlStateManager.DestFactor; import net.minecraft.client.renderer.GlStateManager.SourceFactor; import net.minecraft.client.resources.I18n; import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.inventory.ClickType; import net.minecraft.inventory.IInventory; import net.minecraft.inventory.Slot; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.util.ResourceLocation; +import net.minecraft.util.math.MathHelper; import net.minecraft.util.text.TextFormatting; import net.minecraftforge.client.event.TextureStitchEvent; import net.minecraftforge.fml.common.Mod; @@ -38,6 +42,10 @@ import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import net.minecraftforge.fml.common.network.simpleimpl.IMessage; import net.minecraftforge.fml.relauncher.Side; import org.lwjgl.input.Keyboard; +import org.lwjgl.input.Mouse; + +import java.io.IOException; +import java.util.Locale; @Mod.EventBusSubscriber(Side.CLIENT) public class GuiArcaneWorkbench extends GuiContainer { @@ -46,12 +54,15 @@ public class GuiArcaneWorkbench extends GuiContainer { public static final ResourceLocation texture = new ResourceLocation(Wizardry.MODID, "textures/gui/arcane_workbench.png"); - private IInventory playerInventory; + private InventoryPlayer playerInventory; private IInventory arcaneWorkbenchInventory; + private ContainerArcaneWorkbench arcaneWorkbenchContainer; - private static final int TOOLTIP_WIDTH = 164; + private static final int TOOLTIP_WIDTH = 144; private static final int TOOLTIP_TEXT_INSET = 6; + private static final int BOOKSHELF_UI_WIDTH = 122; + /** We report the actual size of the GUI to Minecraft when a wand is in so JEI doesn't overdraw it. * For calculations, we use the size without the tooltip, which is stored in this constant. */ private static final int MAIN_GUI_WIDTH = 176; @@ -61,25 +72,69 @@ public class GuiArcaneWorkbench extends GuiContainer { private static final int RUNE_WIDTH = 100; private static final int RUNE_HEIGHT = 100; + private static final int SCROLL_BAR_LEFT = 102; + private static final int SCROLL_BAR_TOP = 34; + private static final int SCROLL_BAR_WIDTH = 12; + private static final int SCROLL_BAR_HEIGHT = 178; + private static final int SCROLL_HANDLE_HEIGHT = 15; + private static final int PROGRESSION_BAR_WIDTH = 152; private static final int PROGRESSION_BAR_HEIGHT = 3; private static final int HALO_DIAMETER = 156; private static final int TEXTURE_WIDTH = 512; - private static final int TEXTURE_HEIGHT = 256; + private static final int TEXTURE_HEIGHT = 512; private int animationTimer = 0; private static final int ANIMATION_DURATION = 20; + private GuiTextField searchField; + private boolean searchNeedsClearing; + + private float scroll = 0; + private boolean scrolling = false; + public GuiArcaneWorkbench(InventoryPlayer invPlayer, TileEntityArcaneWorkbench entity){ super(new ContainerArcaneWorkbench(invPlayer, entity)); + this.arcaneWorkbenchContainer = (ContainerArcaneWorkbench)inventorySlots; this.playerInventory = invPlayer; this.arcaneWorkbenchInventory = entity; xSize = MAIN_GUI_WIDTH; ySize = 220; } + @Override + public void initGui(){ + + this.mc.player.openContainer = this.inventorySlots; + this.guiLeft = (this.width - this.xSize) / 2; + this.guiTop = (this.height - this.ySize) / 2; + + Keyboard.enableRepeatEvents(true); + + this.buttonList.clear(); + this.buttonList.add(this.applyBtn = new GuiButtonApply(0, this.width / 2 + 64, this.height / 2 + 3)); + this.buttonList.add(new GuiButtonSort(1, this.guiLeft - 44, this.guiTop + 8, ContainerArcaneWorkbench.SortType.TIER)); + this.buttonList.add(new GuiButtonSort(2, this.guiLeft - 31, this.guiTop + 8, ContainerArcaneWorkbench.SortType.ELEMENT)); + this.buttonList.add(new GuiButtonSort(3, this.guiLeft - 18, this.guiTop + 8, ContainerArcaneWorkbench.SortType.ALPHABETICAL)); + + this.searchField = new GuiTextField(0, this.fontRenderer, this.guiLeft - 113, this.guiTop + 22, 104, this.fontRenderer.FONT_HEIGHT); + this.searchField.setMaxStringLength(50); + this.searchField.setEnableBackgroundDrawing(false); + this.searchField.setVisible(true); + this.searchField.setTextColor(16777215); + this.searchField.setCanLoseFocus(false); + this.searchField.setFocused(true); + + } + + @Override + public void onGuiClosed(){ + super.onGuiClosed(); + Keyboard.enableRepeatEvents(false); + } + // Huh, didn't realise this method existed. Pretty neat. @Override public void updateScreen(){ @@ -93,18 +148,33 @@ public class GuiArcaneWorkbench extends GuiContainer { GlStateManager.color(1, 1, 1, 1); // Just in case + boolean mouseHeld = Mouse.isButtonDown(0); + + if(!scrolling && mouseHeld && getMaxScrollRows() > 0 && isPointInRegion(SCROLL_BAR_LEFT - BOOKSHELF_UI_WIDTH, + SCROLL_BAR_TOP, SCROLL_BAR_WIDTH, SCROLL_BAR_HEIGHT, mouseX, mouseY)){ + scrolling = true; + } + + if(!mouseHeld || getMaxScrollRows() == 0) scrolling = false; + + if(scrolling){ + scroll = MathHelper.clamp((float)(mouseY - SCROLL_BAR_TOP - SCROLL_HANDLE_HEIGHT/2 - guiTop) + /(SCROLL_BAR_HEIGHT - SCROLL_HANDLE_HEIGHT), 0, 1); + arcaneWorkbenchContainer.scrollTo((int)(getMaxScrollRows() * scroll + 0.5f)); + } + Slot slot = this.inventorySlots.getSlot(ContainerArcaneWorkbench.CENTRE_SLOT); // Tests if there is a wand in the workbench and edits the positioning accordingly if(slot.getHasStack() && slot.getStack().getItem() instanceof IWorkbenchItem && ((IWorkbenchItem)slot.getStack().getItem()).showTooltip(slot.getStack())){ xSize = MAIN_GUI_WIDTH + TOOLTIP_WIDTH; - guiLeft = (this.width - this.xSize) / 2; - this.applyBtn.x = (this.width - TOOLTIP_WIDTH) / 2 + 64; +// guiLeft = (this.width - this.xSize) / 2; +// this.applyBtn.x = (this.width - TOOLTIP_WIDTH) / 2 + 64; }else{ xSize = MAIN_GUI_WIDTH; - guiLeft = (this.width - this.xSize) / 2; - this.applyBtn.x = this.width / 2 + 64; +// guiLeft = (this.width - this.xSize) / 2; +// this.applyBtn.x = this.width / 2 + 64; } this.applyBtn.enabled = slot.getHasStack(); @@ -218,6 +288,15 @@ public class GuiArcaneWorkbench extends GuiContainer { } } + // Bookshelf interface + DrawingUtils.drawTexturedRect(guiLeft - BOOKSHELF_UI_WIDTH, guiTop, 0, 256, BOOKSHELF_UI_WIDTH, ySize, TEXTURE_WIDTH, TEXTURE_HEIGHT); + + // Scroll bar + DrawingUtils.drawTexturedRect(guiLeft - BOOKSHELF_UI_WIDTH + SCROLL_BAR_LEFT, + guiTop + SCROLL_BAR_TOP + (int)(scroll * (SCROLL_BAR_HEIGHT - SCROLL_HANDLE_HEIGHT) + 0.5f), + getMaxScrollRows() > 0 ? 30 : 30 + SCROLL_BAR_WIDTH, 476, + SCROLL_BAR_WIDTH, SCROLL_HANDLE_HEIGHT, TEXTURE_WIDTH, TEXTURE_HEIGHT); + // Tooltip only drawn if there is a wand if(this.inventorySlots.getSlot(ContainerArcaneWorkbench.CENTRE_SLOT).getHasStack()){ @@ -302,11 +381,16 @@ public class GuiArcaneWorkbench extends GuiContainer { null); x += 18; GlStateManager.disableDepth(); + GlStateManager.disableLighting(); // Whyyyyyy? } } } } + this.searchField.drawTextBox(); // Easier to do this last, then we don't need to re-bind the GUI texture twice + + GlStateManager.color(1, 1, 1, 1); + Minecraft.getMinecraft().renderEngine.bindTexture(texture); // Fixes the bug that caused the slot highlight to render opaque. I don't know why it works, it just works! @@ -324,6 +408,7 @@ public class GuiArcaneWorkbench extends GuiContainer { : I18n.format(this.arcaneWorkbenchInventory.getName()), 8, 6, 4210752); this.fontRenderer.drawString(this.playerInventory.hasCustomName() ? this.playerInventory.getName() : I18n.format(this.playerInventory.getName()), 8, this.ySize - 96 + 2, 4210752); + this.fontRenderer.drawString(I18n.format("container." + Wizardry.MODID + ":arcane_workbench.bookshelves"), 8 - BOOKSHELF_UI_WIDTH, 6, 4210752); if(this.inventorySlots.getSlot(ContainerArcaneWorkbench.CENTRE_SLOT).getHasStack()){ @@ -421,28 +506,18 @@ public class GuiArcaneWorkbench extends GuiContainer { } } } + + this.buttonList.forEach(b -> b.drawButtonForegroundLayer(mouseX, mouseY)); } - @Override - public void initGui(){ - this.mc.player.openContainer = this.inventorySlots; - this.guiLeft = (this.width - this.xSize) / 2; - this.guiTop = (this.height - this.ySize) / 2; - Keyboard.enableRepeatEvents(true); - this.buttonList.clear(); - this.buttonList.add(this.applyBtn = new GuiButtonApply(0, this.width / 2 + 64, this.height / 2 + 3)); - } - - @Override - public void onGuiClosed(){ - super.onGuiClosed(); - Keyboard.enableRepeatEvents(false); - } + // Controls @Override protected void actionPerformed(GuiButton button){ + if(button.enabled){ - if(button.id == 0){ + + if(button == applyBtn){ // Packet building IMessage msg = new PacketControlInput.Message(PacketControlInput.ControlType.APPLY_BUTTON); WizardryPacketHandler.net.sendToServer(msg); @@ -452,10 +527,106 @@ public class GuiArcaneWorkbench extends GuiContainer { // Animation animationTimer = 20; } + + if(button instanceof GuiButtonSort) this.arcaneWorkbenchContainer.setSortType(((GuiButtonSort)button).sortType); } } - private class GuiButtonApply extends GuiButton { + private int getMaxScrollRows(){ + return Math.max(0, MathHelper.ceil((float)arcaneWorkbenchContainer.getActiveBookshelfSlots().size() + / ContainerArcaneWorkbench.BOOKSHELF_SLOTS_X) - ContainerArcaneWorkbench.BOOKSHELF_SLOTS_Y); + } + + @Override + public void handleMouseInput() throws IOException{ + + super.handleMouseInput(); + int scrollDist = -Mouse.getEventDWheel(); + + if(scrollDist != 0 && getMaxScrollRows() > 0){ + + if(scrollDist > 0) this.scroll += 1f / getMaxScrollRows(); + if(scrollDist < 0) this.scroll -= 1f / getMaxScrollRows(); + + scroll = MathHelper.clamp(scroll, 0, 1); + + arcaneWorkbenchContainer.scrollTo((int)(scroll * getMaxScrollRows() + 0.5f)); + } + } + + @Override + protected void handleMouseClick(Slot slot, int slotId, int mouseButton, ClickType type){ + + searchNeedsClearing = true; + + // Click type behaves weirdly, don't use it! Query the item stack held by the cursor instead + if(slot instanceof SlotBookList && ((SlotBookList)slot).hasDelegate() && playerInventory.getItemStack().isEmpty()){ + // If no item is currently being moved, divert book list slots to send the virtual slot through instead + // See explanation in ContainerArcaneWorkbench + Slot virtualSlot = ((SlotBookList)slot).getDelegate(); + super.handleMouseClick(virtualSlot, virtualSlot.slotNumber, mouseButton, type); + }else{ + super.handleMouseClick(slot, slotId, mouseButton, type); + } + + arcaneWorkbenchContainer.updateActiveBookshelfSlots(); + } + + @Override + protected void keyTyped(char typedChar, int keyCode) throws IOException { + + if(this.searchNeedsClearing){ + this.searchNeedsClearing = false; + this.searchField.setText(""); + } + + if(this.searchField.textboxKeyTyped(typedChar, keyCode)){ + arcaneWorkbenchContainer.setSearchText(searchField.getText().toLowerCase(Locale.ROOT)); + }else{ + super.keyTyped(typedChar, keyCode); + } + } + + // Nested classes + + private class GuiButtonSort extends GuiButton { + + private final ContainerArcaneWorkbench.SortType sortType; + + public GuiButtonSort(int id, int x, int y, ContainerArcaneWorkbench.SortType sortType){ + super(id, x, y, 10, 10, I18n.format("container." + Wizardry.MODID + ":arcane_workbench.sort_" + sortType.name)); + this.sortType = sortType; + } + + @Override + public void drawButton(Minecraft minecraft, int mouseX, int mouseY, float partialTicks){ + + if(this.visible){ + + // Whether the button is highlighted + this.hovered = mouseX >= this.x && mouseY >= this.y && mouseX < this.x + this.width && mouseY < this.y + this.height; + + int k = 0; + int l = 476 + this.sortType.ordinal() * this.height; + + if(sortType == GuiArcaneWorkbench.this.arcaneWorkbenchContainer.getSortType()){ + k += this.width; + if(GuiArcaneWorkbench.this.arcaneWorkbenchContainer.isSortDescending()) k += this.width; + } + + DrawingUtils.drawTexturedRect(this.x, this.y, k, l, this.width, this.height, TEXTURE_WIDTH, TEXTURE_HEIGHT); + + } + } + + @Override + public void drawButtonForegroundLayer(int mouseX, int mouseY){ + if(hovered) drawHoveringText(this.displayString, mouseX - guiLeft, mouseY - guiTop); + } + + } + + private static class GuiButtonApply extends GuiButton { public GuiButtonApply(int id, int x, int y){ super(id, x, y, 16, 16, I18n.format("container." + Wizardry.MODID + ":arcane_workbench.apply")); @@ -481,7 +652,7 @@ public class GuiArcaneWorkbench extends GuiContainer { //colour = 10526880; } - DrawingUtils.drawTexturedRect(this.x, this.y, k, l, this.width, this.height, 512, 256); + DrawingUtils.drawTexturedRect(this.x, this.y, k, l, this.width, this.height, TEXTURE_WIDTH, TEXTURE_HEIGHT); //this.drawCenteredString(minecraft.fontRenderer, this.displayString, this.x + this.width / 2, // this.y + (this.height - 8) / 2, colour); } diff --git a/src/main/java/electroblob/wizardry/inventory/ContainerArcaneWorkbench.java b/src/main/java/electroblob/wizardry/inventory/ContainerArcaneWorkbench.java index be8297c6..43c4a0de 100644 --- a/src/main/java/electroblob/wizardry/inventory/ContainerArcaneWorkbench.java +++ b/src/main/java/electroblob/wizardry/inventory/ContainerArcaneWorkbench.java @@ -1,27 +1,52 @@ package electroblob.wizardry.inventory; import electroblob.wizardry.Wizardry; +import electroblob.wizardry.block.BlockBookshelf; import electroblob.wizardry.event.SpellBindEvent; import electroblob.wizardry.item.IWorkbenchItem; import electroblob.wizardry.item.ItemSpellBook; import electroblob.wizardry.registry.WizardryAdvancementTriggers; import electroblob.wizardry.registry.WizardryItems; +import electroblob.wizardry.spell.Spell; import electroblob.wizardry.tileentity.TileEntityArcaneWorkbench; import electroblob.wizardry.util.WandHelper; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.inventory.ClickType; import net.minecraft.inventory.Container; import net.minecraft.inventory.IInventory; import net.minecraft.inventory.Slot; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; import net.minecraft.util.ResourceLocation; +import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.MathHelper; import net.minecraftforge.common.MinecraftForge; -import java.util.HashSet; -import java.util.Set; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import java.util.*; +import java.util.stream.Collectors; +/** + * The container for the arcane workbench GUI. + *

+ * The virtual slot system works as follows:

+ * - The container has two types of slots: {@link SlotBookList} and {@link VirtualSlot}.
+ * - The {@code SlotBookList}s are the ones that actually get displayed. They essentially delegate all their + * functions to the relevant {@code VirtualSlot}.
+ * - Each {@code VirtualSlot} refers to a specific slot in another {@link IInventory} nearby, but is not displayed + * directly on the GUI. They are sorted and filtered according to the GUI input via + * {@link ContainerArcaneWorkbench#getActiveBookshelfSlots()}.
+ * - When a stack is taken from a {@code SlotBookList} (or its current stack is queried), the {@code VirtualSlot} + * it delegates to depends on the current search term, sort order and state of the linked bookshelves.
+ * - When a stack is inserted into a {@code SlotBookList}, the {@code VirtualSlot} it delegates to depends + * instead on where the stack came from originally and which virtual slots are free.
+ * - Finally, the {@code SlotBookList}s are only really used on the client side (though they are included on the server + * for consistency, just in case). The bookshelf slot delegates to a virtual slot on the client side (which is where + * the search and sorting is done), and then the click is sent to the server. + */ public class ContainerArcaneWorkbench extends Container { /** The arcane workbench tile entity associated with this container. */ @@ -36,6 +61,19 @@ public class ContainerArcaneWorkbench extends Container { public static final int SLOT_RADIUS = 42; + public static final int BOOKSHELF_SLOTS_X = 5; + public static final int BOOKSHELF_SLOTS_Y = 10; + + public static final int PLAYER_INVENTORY_SIZE = 36; + + private List bookshelfSlots = new ArrayList<>(); + private List activeBookshelfSlots = new ArrayList<>(); + + private int scroll = 0; + private SortType sortType = SortType.TIER; + private boolean sortDescending = false; + private String searchText = ""; + public ContainerArcaneWorkbench(IInventory inventory, TileEntityArcaneWorkbench tileentity){ this.tileentity = tileentity; @@ -70,6 +108,15 @@ public class ContainerArcaneWorkbench extends Container { } } + for(int y = 0; y < BOOKSHELF_SLOTS_Y; y++){ + for(int x = 0; x < BOOKSHELF_SLOTS_X; x++){ + int index = x + y * BOOKSHELF_SLOTS_X; + this.addSlotToContainer(new SlotBookList(tileentity, UPGRADE_SLOT + 1 + index, -114 + x * 18, 34 + y * 18, this, index)); + } + } + + refreshBookshelfSlots(); // Must be done last + this.onSlotChanged(CENTRE_SLOT, wand, null); } @@ -181,38 +228,42 @@ public class ContainerArcaneWorkbench extends Container { ItemStack stack = slot.getStack(); // The stack that was there originally remainder = stack.copy(); // A copy of that stack - // Workbench -> inventory + // Workbench -> inventory/bookshelves if(clickedSlotId <= UPGRADE_SLOT){ - // Tries to move the stack into the player's inventory. If this fails... - if(!this.mergeItemStack(stack, UPGRADE_SLOT + 1, this.inventorySlots.size(), true)){ - return ItemStack.EMPTY; // ...nothing else happens. + // Try to move the stack into the bookshelves. If this fails... + if(getBookshelfSlots().isEmpty() || !this.mergeItemStack(stack, getBookshelfSlots().get(0).slotNumber, + getBookshelfSlots().get(getBookshelfSlots().size()-1).slotNumber + 1, false)){ + // ...try to move the stack into the player's inventory. If this fails... + if(!this.mergeItemStack(stack, UPGRADE_SLOT + 1, UPGRADE_SLOT + 1 + PLAYER_INVENTORY_SIZE, true)){ + return ItemStack.EMPTY; // ...nothing else happens. + } } } - // Inventory -> workbench - else{ - // The following logic prevents shift-clicking transferring the items to the wrong slot. - int minSlotId = 0; - int maxSlotId = UPGRADE_SLOT; + // Bookshelves -> workbench/inventory + else if(getSlot(clickedSlotId) instanceof VirtualSlot){ - if(stack.getItem() instanceof ItemSpellBook){ - minSlotId = 0; - maxSlotId = CRYSTAL_SLOT - 1; - }else if(getSlot(CRYSTAL_SLOT).isItemValid(stack)){ - minSlotId = CRYSTAL_SLOT; - maxSlotId = CRYSTAL_SLOT; - }else if(getSlot(CENTRE_SLOT).isItemValid(stack)){ - minSlotId = CENTRE_SLOT; - maxSlotId = CENTRE_SLOT; - }else if(getSlot(UPGRADE_SLOT).isItemValid(stack)){ - minSlotId = UPGRADE_SLOT; - maxSlotId = UPGRADE_SLOT; - }else{ - // If none of the above cases were true, then the item won't fit in the workbench. - return ItemStack.EMPTY; + int[] slotRange = findSlotRangeForItem(stack); + + // Try to move the stack into the workbench. If this fails... + if(slotRange == null || !this.mergeItemStack(stack, slotRange[0], slotRange[1] + 1, false)){ + // ...try to move the stack into the player's inventory. If this fails... + if(!this.mergeItemStack(stack, UPGRADE_SLOT + 1, UPGRADE_SLOT + 1 + PLAYER_INVENTORY_SIZE, true)){ + return ItemStack.EMPTY; // ...nothing else happens. + } } + } + // Inventory -> workbench/bookshelves + else{ - if(!this.mergeItemStack(stack, minSlotId, maxSlotId + 1, false)){ - return ItemStack.EMPTY; + int[] slotRange = findSlotRangeForItem(stack); + + // Try to move the stack into the workbench. If this fails... + if(slotRange == null || !this.mergeItemStack(stack, slotRange[0], slotRange[1] + 1, false)){ + // ...try to move the stack into the bookshelves. If this fails... + if(getBookshelfSlots().isEmpty() || !this.mergeItemStack(stack, getBookshelfSlots().get(0).slotNumber, + getBookshelfSlots().get(getBookshelfSlots().size()-1).slotNumber + 1, false)){ + return ItemStack.EMPTY; // ...nothing else happens. + } } } @@ -232,18 +283,59 @@ public class ContainerArcaneWorkbench extends Container { return remainder; } - // Overridden to stop stacks merging into 'removed' slots. - @Override - protected boolean mergeItemStack(ItemStack stack, int minSlotID, int maxSlotID, boolean p_75135_4_){ + /** + * Returns the minimum and maximum IDs (inclusive) of the workbench slots that are appropriate for the given stack, + * or null if no slots are appropriate. Note that this does mean the stack will fit, only that it is valid + * for all of the slots in the given range, and will fit if there is space for it. + * @param stack The stack to find a slot for + * @param excludeBookshelves Whether to exclude the bookshelf slots (useful when transferring from them) + * @return A 2-element int array of the minimum and maximum slot IDs respectively + */ + @Nullable + private int[] findSlotRangeForItem(ItemStack stack){ - for(int i = minSlotID; i < maxSlotID; i++){ - // System.out.println(this.getSlot(i).xDisplayPosition); - if(this.getSlot(i).xPos >= 0 && this.getSlot(i).yPos >= 0 && !this.getSlot(i).getHasStack()){ - return super.mergeItemStack(stack, minSlotID, maxSlotID, p_75135_4_); + if(this.getSlot(0).isItemValid(stack)){ // Spell books + + ItemStack centreStack = getSlot(CENTRE_SLOT).getStack(); + + if(centreStack.getItem() instanceof IWorkbenchItem){ + // Restrict the range to visible slots + // (How did I not think of this before? Why did I go to the trouble of overriding mergeItemStack? And + // how did that fix ever work in the first place?!) + int spellSlots = ((IWorkbenchItem)centreStack.getItem()).getSpellSlotCount(centreStack); + if(spellSlots > 0){ + return new int[]{0, spellSlots - 1}; + } + } + + }else if(getSlot(CRYSTAL_SLOT).isItemValid(stack)){ + return new int[]{CRYSTAL_SLOT, CRYSTAL_SLOT}; + + }else if(getSlot(CENTRE_SLOT).isItemValid(stack)){ + return new int[]{CENTRE_SLOT, CENTRE_SLOT}; + + }else if(getSlot(UPGRADE_SLOT).isItemValid(stack)){ + return new int[]{UPGRADE_SLOT, UPGRADE_SLOT}; + } + + return null; // It won't fit! + } + + @Override + public ItemStack slotClick(int slotId, int dragType, ClickType clickTypeIn, EntityPlayer player){ + + // -999 is used for slots in the player inventory + if(slotId > 0 && getSlot(slotId) instanceof SlotBookList){ + + ItemStack stack = player.inventory.getItemStack(); + + if(!stack.isEmpty() && !getBookshelfSlots().isEmpty()){ + mergeItemStack(stack, getBookshelfSlots().get(0).slotNumber, getBookshelfSlots().get(getBookshelfSlots().size() - 1).slotNumber + 1, false); + return stack; } } - // Only returns false if none of the slots given are enabled and empty - return false; + + return super.slotClick(slotId, dragType, clickTypeIn, player); } /** @@ -272,4 +364,136 @@ public class ContainerArcaneWorkbench extends Container { } } + /** Scrolls to the given row number. */ + public void scrollTo(int row){ + this.scroll = row; + } + + /** Sets the sorting type to the given type, or toggles the sort direction if it is already that type. */ + public void setSortType(SortType sortType){ + + if(this.sortType == sortType){ + this.sortDescending = !this.sortDescending; + }else{ + this.sortType = sortType; + this.sortDescending = false; + } + + updateActiveBookshelfSlots(); + } + + /** Returns the current sorting type. */ + public SortType getSortType(){ + return sortType; + } + + /** Returns true if the current sorting is in descending order, false otherwise. */ + public boolean isSortDescending(){ + return sortDescending; + } + + /** Sets the search text for the bookshelf slots. */ + public void setSearchText(@Nonnull String searchText){ + this.searchText = searchText; + this.scrollTo(0); + updateActiveBookshelfSlots(); + } + + /** Returns all bookshelf slots currently linked to this container, including empty ones. The returned list + * is a copy of the internal virtual slot list, with any invalid slots removed. */ + public List getBookshelfSlots(){ + List validSlots = new ArrayList<>(bookshelfSlots); + validSlots.removeIf(s -> !s.isValid()); + return validSlots; + } + + /** Updates the active bookshelf slots with the current search term and sorting. Client-side only! */ + public void updateActiveBookshelfSlots(){ + activeBookshelfSlots = bookshelfSlots.stream().filter(s -> s.isValid() && !s.getStack().isEmpty() + // Slot 0 is a convenient way of testing if the item is a valid spell book + && this.getSlot(0).isItemValid(s.getStack()) + && Spell.byMetadata(s.getStack().getMetadata()).matches(searchText)) + // TODO: This doesn't account for non-spell book items at the moment + .sorted(Comparator.comparing(s -> Spell.byMetadata(s.getStack().getMetadata()), + sortDescending ? sortType.comparator.reversed() : sortType.comparator)) + .collect(Collectors.toList()); + } + + /** Returns all the {@link VirtualSlot}s that are currently active, sorted according to the current sort order. A + * virtual slot is active if it is not empty and its contents match the current search term (if any). */ + public List getActiveBookshelfSlots(){ + return activeBookshelfSlots; + } + + /** Returns all the {@link VirtualSlot}s that are currently visible on screen (and hence have an associated 'real' + * slot), accounting for search and scrolling, and sorted according to the current sort order. */ + public List getVisibleBookshelfSlots(){ + List activeSlots = getActiveBookshelfSlots(); + return activeSlots.subList(BOOKSHELF_SLOTS_X * scroll, activeSlots.size()); + } + + // The following operations are expensive so should not be done every tick! + // N.B. If we drop the requirement of it working with any container it could potentially be a lot easier since + // we then always have control over the bookshelf classes + + /** Called on initialisation, and whenever a bookshelf is added or removed. */ + private void refreshBookshelfSlots(){ + + this.inventorySlots.removeAll(bookshelfSlots); + // TESTME: May need to do this for inventoryItemStacks (probably not though, seems like MC handles it) + bookshelfSlots.clear(); + + for(IInventory bookshelf : findNearbyBookshelves()){ + for(int i=0; i findNearbyBookshelves(){ + + List bookshelves = new ArrayList<>(); + + int searchRadius = 4; // TODO: Config option for this + + for(int x = -searchRadius; x <= searchRadius; x++){ + for(int y = -searchRadius; y <= searchRadius; y++){ + for(int z = -searchRadius; z <= searchRadius; z++){ + + BlockPos pos = this.tileentity.getPos().add(x, y, z); + // TODO: Config option for allowed containers + if(this.tileentity.getWorld().getBlockState(pos).getBlock() instanceof BlockBookshelf){ + TileEntity te = this.tileentity.getWorld().getTileEntity(pos); + if(te instanceof IInventory && te != this.tileentity) bookshelves.add((IInventory)te); + } + + } + } + } + + return bookshelves; + + } + + public enum SortType { + + TIER("tier", Comparator.naturalOrder()), + ELEMENT("element", Comparator.comparing(Spell::getElement).thenComparing(Spell::getTier)), + ALPHABETICAL("alphabetical", Comparator.comparing(Spell::getUnlocalisedName)); + + public String name; + public Comparator comparator; + + SortType(String name, Comparator comparator){ + this.name = name; + this.comparator = comparator; + } + + } } diff --git a/src/main/java/electroblob/wizardry/inventory/SlotBookList.java b/src/main/java/electroblob/wizardry/inventory/SlotBookList.java new file mode 100644 index 00000000..8d7696bd --- /dev/null +++ b/src/main/java/electroblob/wizardry/inventory/SlotBookList.java @@ -0,0 +1,70 @@ +package electroblob.wizardry.inventory; + +import electroblob.wizardry.item.ItemSpellBook; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.IInventory; +import net.minecraft.item.ItemStack; + +import java.util.List; + +public class SlotBookList extends SlotItemClassList { + + private final ContainerArcaneWorkbench container; + /** The position in the book list this slot occupies (in other words: the slot index, but offset so the first book + * list slot starts at 0). */ + private final int listIndex; + + public SlotBookList(IInventory inventory, int index, int x, int y, ContainerArcaneWorkbench container, int listIndex){ + super(inventory, index, x, y, 64, ItemSpellBook.class); + this.container = container; + this.listIndex = listIndex; + } + + /** Returns the {@link VirtualSlot} this slot currently accesses, or null if it does not currently have one. */ + public VirtualSlot getDelegate(){ + return hasDelegate() ? container.getVisibleBookshelfSlots().get(listIndex) : null; + } + + /** Returns true if this slot currently accesses a {@link VirtualSlot}, false otherwise. */ + public boolean hasDelegate(){ + return listIndex < container.getVisibleBookshelfSlots().size(); + } + + @Override + public ItemStack getStack(){ + return hasDelegate() ? getDelegate().getStack() : ItemStack.EMPTY; // Delegate item lookup to virtual slot + } + + // This doesn't depend on the client-side search and sorting stuff so it can be done in here + @Override + public boolean isItemValid(ItemStack stack){ + // It's valid if there is a virtual slot that will accept it + return container.getBookshelfSlots().stream().anyMatch(s -> s.isItemValid(stack)); + } + + // Actual item interaction is delegated client-side before it ever gets here (in the GUI class) + // Therefore we only need to handle empty slot clicks + + @Override + public ItemStack decrStackSize(int amount){ + return ItemStack.EMPTY; + } + + @Override + public boolean canTakeStack(EntityPlayer player){ + return false; + } + + @Override + public ItemStack onTake(EntityPlayer player, ItemStack stack){ + return stack; + } + + @Override + public void putStack(ItemStack stack){ + // Can't handle this here either because it gets tangled up with the 348-line behemoth that is + // Container#slotClick, which has all sorts of side-effects + // Instead, we need to delegate client-side, as before + } + +} diff --git a/src/main/java/electroblob/wizardry/inventory/VirtualSlot.java b/src/main/java/electroblob/wizardry/inventory/VirtualSlot.java new file mode 100644 index 00000000..cf806246 --- /dev/null +++ b/src/main/java/electroblob/wizardry/inventory/VirtualSlot.java @@ -0,0 +1,79 @@ +package electroblob.wizardry.inventory; + +import electroblob.wizardry.tileentity.TileEntityBookshelf; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.IInventory; +import net.minecraft.inventory.Slot; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; + +/** + * A {@code VirtualSlot} represents a slot in an inventory other than the one that is currently open. Like regular slots, + * they hold a single {@link net.minecraft.item.ItemStack}, but unlike regular slots, they are not drawn to the screen + * and cannot be interacted with directly. A virtual slot is effectively a reference to a specific slot in some other + * inventory that allows the details of that inventory to be abstracted away from the current container. + *

+ * N.B. For normal slots, {@code slotIndex == slotNumber} (index is for the inventory, number is for the container). + * Importantly, for virtual slots this is not the case, since the {@code Container} they belong to is not the + * one associated with the virtual slot's {@code IInventory}. + */ +public class VirtualSlot extends Slot { + + private final TileEntity tileEntity; + + public VirtualSlot(IInventory inventory, int index){ + super(inventory, index, -999, -999); + if(!(inventory instanceof TileEntity)) throw new IllegalArgumentException("Inventory must be a tile entity!"); + this.tileEntity = (TileEntity)inventory; + } + + @Override + public boolean isEnabled(){ + return false; // Virtual slots are never displayed + } + + // We don't really want to be updating the bookshelves every single tick (let alone every frame!), so we're going + // to have to do some 'assuming things stay the same until told otherwise'. This means it's possible that virtual + // slots will remain even when their containers are gone, so we need a failsafe for when that happens. + + /** Returns true if this slot is valid, i.e. the tile entity still exists. */ + public boolean isValid(){ + return !tileEntity.isInvalid(); + } + + // Normally the container decides if a stack is valid, but that's not going to work here + @Override + public boolean isItemValid(ItemStack stack){ + // getSlotIndex() is required here, NOT slotNumber (which is only populated when the slot is added to a + // container - the javadoc is wrong, it has nothing to do with inventories) + return isValid() && inventory.isItemValidForSlot(getSlotIndex(), stack); + } + + @Override + public boolean canTakeStack(EntityPlayer playerIn){ + return isValid() && super.canTakeStack(playerIn); + } + + @Override + public ItemStack onTake(EntityPlayer player, ItemStack stack){ + return isValid() ? super.onTake(player, stack) : ItemStack.EMPTY; + } + + @Override + public ItemStack getStack(){ + return isValid() ? super.getStack() : ItemStack.EMPTY; + } + + @Override + public void putStack(ItemStack stack){ + if(isValid() && inventory instanceof TileEntityBookshelf) ((TileEntityBookshelf)inventory).sync(); + if(isValid()) super.putStack(stack); + } + + @Override + public ItemStack decrStackSize(int amount){ + if(isValid() && inventory instanceof TileEntityBookshelf) ((TileEntityBookshelf)inventory).sync(); + return isValid() ? super.decrStackSize(amount) : ItemStack.EMPTY; + } + +} diff --git a/src/main/java/electroblob/wizardry/spell/Spell.java b/src/main/java/electroblob/wizardry/spell/Spell.java index 863bd31c..e817980f 100644 --- a/src/main/java/electroblob/wizardry/spell/Spell.java +++ b/src/main/java/electroblob/wizardry/spell/Spell.java @@ -117,6 +117,11 @@ public abstract class Spell extends IForgeRegistryEntry.Impl implements C public static final String SPLASH_EFFECT_DURATION = "splash_effect_duration"; public static final String SPLASH_EFFECT_STRENGTH = "splash_effect_strength"; + // TODO: Translations for these? + public static final String TIER_MATCH_PREFIX = "tier="; + public static final String ELEMENT_MATCH_PREFIX = "element="; + public static final String TYPE_MATCH_PREFIX = "type="; + /** Forge registry-based replacement for the internal spells list. */ public static IForgeRegistry registry; @@ -675,6 +680,30 @@ public abstract class Spell extends IForgeRegistryEntry.Impl implements C return net.minecraft.client.resources.I18n.format(getDescriptionTranslationKey()); } + /** + * Returns whether this spell matches the given string. Client-side only! A spell matches a particular string + * if any of the following conditions are true:

+ * - The spell's localised name contains the given string
+ * - The string starts with "tier:", and the localised name of the spell's tier contains the given string
+ * - The string starts with "element:", and the localised name of the spell's element contains the given string
+ * - The string starts with "type:", and the localised name of the spell's type contains the given string

+ * Matches are not case-sensitive. + * @param text The string to tested + * @return True if this spell matches the given string, false otherwise. + */ + public boolean matches(@Nonnull String text){ + + if(text.startsWith(TIER_MATCH_PREFIX)){ + return getTier().getDisplayName().toLowerCase(Locale.ROOT).contains(text.substring(TIER_MATCH_PREFIX.length())); + }else if(text.startsWith(ELEMENT_MATCH_PREFIX)){ + return getElement().getDisplayName().toLowerCase(Locale.ROOT).contains(text.substring(ELEMENT_MATCH_PREFIX.length())); + }else if(text.startsWith(TYPE_MATCH_PREFIX)){ + return getType().getDisplayName().toLowerCase(Locale.ROOT).contains(text.substring(TYPE_MATCH_PREFIX.length())); + }else{ + return getDisplayName().toLowerCase(Locale.ROOT).contains(text); + } + } + // ============================================ Sound methods ============================================== /** diff --git a/src/main/resources/assets/ebwizardry/lang/en_gb.lang b/src/main/resources/assets/ebwizardry/lang/en_gb.lang index 0ad6e088..c51e35cf 100644 --- a/src/main/resources/assets/ebwizardry/lang/en_gb.lang +++ b/src/main/resources/assets/ebwizardry/lang/en_gb.lang @@ -524,6 +524,11 @@ container.ebwizardry\:arcane_workbench.apply=Apply container.ebwizardry\:arcane_workbench.mana=Mana\: container.ebwizardry\:arcane_workbench.upgrades=Applied Upgrades\: +container.ebwizardry\:arcane_workbench.bookshelves=Bookshelves +container.ebwizardry\:arcane_workbench.sort_tier=Sort by Tier +container.ebwizardry\:arcane_workbench.sort_element=Sort by Element +container.ebwizardry\:arcane_workbench.sort_alphabetical=Sort Alphabetically + container.ebwizardry\:bookshelf=Bookshelf tier.novice=Novice diff --git a/src/main/resources/assets/ebwizardry/lang/en_us.lang b/src/main/resources/assets/ebwizardry/lang/en_us.lang index 6649b52c..6dee3005 100644 --- a/src/main/resources/assets/ebwizardry/lang/en_us.lang +++ b/src/main/resources/assets/ebwizardry/lang/en_us.lang @@ -524,6 +524,11 @@ container.ebwizardry\:arcane_workbench.apply=Apply container.ebwizardry\:arcane_workbench.mana=Mana\: container.ebwizardry\:arcane_workbench.upgrades=Applied Upgrades\: +container.ebwizardry\:arcane_workbench.bookshelves=Bookshelves +container.ebwizardry\:arcane_workbench.sort_tier=Sort by Tier +container.ebwizardry\:arcane_workbench.sort_element=Sort by Element +container.ebwizardry\:arcane_workbench.sort_alphabetical=Sort Alphabetically + container.ebwizardry\:bookshelf=Bookshelf tier.novice=Novice diff --git a/src/main/resources/assets/ebwizardry/textures/gui/arcane_workbench.png b/src/main/resources/assets/ebwizardry/textures/gui/arcane_workbench.png index 814ea32d5f16f547956eb97d2cc5f7516b6023bc..786a491b95d8b0de62fd33bb51933362fa83f6a3 100644 GIT binary patch literal 40318 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

4QJr#rRihi>^k^VrQN`*z)rQ+`qY;6HG?i*UB zF9X98PB^BxY)qWPV3ymzXZr2$M>8Ahf)Z8+ALtc6H?KU!Z}P8n5oYD-Vjq+ie%Wkb z?2zu5VfbLvk+&>N!e8gtW-i|U7(AH%R?lJT|BdPQuRZVn>GaS3+*|qO9oAfov!&Ow zHm2PE*QWV@-r1Sv)9gJJ&uroS!x}U#uA}PhK1TV6)7&0r{fm#;k#&jZ%#lmV3*&xd zUYGpdxzk^X+5F=9e16_`6TN2o_B62wx_-(WBY(hR($28agwoR363Y zOHY5@aVBTiX)C@(3=4nEQxW_3vhuM>hAzWxk#^}bhnr0{sE2&n{OzZC5R>Uk?w?i- zwc#!+^bSSFKG9HnrC!SX>UGQUnF<|u8KzukUGh1!?EaO1E1Mi|9asC!z4<$1&ZZyy zpp1}U_ayX>&$8Nc+rF~SwpQM4_Njl#`Mw{AJF6QX6z!fL$@G8Mi}~JV_4j>#zn<;& zr-~_YRmFGK+_ZfT9?ly&PW~0o;%ni4Z!ap_b+<$#?U&+nfM zLSY5dgE^n>?4R`S#DwjF>?xO+mqs;2s6Tkl-sAiIK*hhCe~o^d-8-jm1|ECb&TZhU z$I$C6y8GnsY&(mH|3a;f^H(Ua%=o?4_nyXuWcL*^i|$@|uOBJ5^XR91?LVhq@s+S0 zJmM?)<#5{}uO~Mc6%=ooGqs%k9U7>-Om@QC=kjK*3_IiM);`)ExL2f$@o$5|E&kS7 zi&dR!djDp7Gk}_jNIfFe_P6)VL;t3* z|DM71Kgc>}N8FP57pKcFR_Ck?o}?|%x$(i~=L>?g?=}3n5wE!Yt={bHe03hb#T+Z8 z1!F{K-?;vM`8DTP*YiByuze`yD0>)ar=a2Y@wC?OtGpb?UB1Qs+pi?l`|teg$&>a} z7#8Gl+~;a)`kUX{xQj7~^X~; zc}BddtG7~Lv{{AW#hebmW(f=K?}h4i%9Ab^{JV1JxrwdWJbUFu%b)FA{?KB(z<;Hd zeLoM{b6bK2PaOU*=d%C!apzyhtjd3KKj+lc?R+l7;Jo5mn7ZMk246;n^z%nADJNRD zZJ*!!WU9sH13DU6Z=`3mo!6W)jcMlJZ>pcJf4?=Y&7ie!qu7D9FH>djzJAW^VfRqq zo4JFJdy>_n=f&xtuQM%J_r`wyM5znA8ag+BSNHRfRCkDZTHpC0UDt2Z_T2r#;0&3- z_a%R?#oBpyHczY9Jih+w`)zyI&tIo}`Q3C*Mx$-^f!8j}>u0n09J!-B(WFs-+ryjd zn6~NGFAm5sH*<3PE_LH=+qO^lw=#-Fp5YRe{`*>Ck<)W#-a}tAgBNsovYMp*{vEhK zt=1s4^Gztri^^5{-U@ZgKJU^EaI4HxSjG}`P~r26cN`m9^6QU@9n8FU|Nf>+=6V62 zk{rs!{yH--Oy|q`&wLpSkRi)whA zZp`j-{$G2}P3Z2*1Uw-D(^bp1K zhipd6vMeh%P@2ylf!cHUxwSx{rWD;ppz-IP?{+u z{Qm8dHrxC@=G#vl@=OY4xJ2qsUD(O!^)J--kd4x`Kml{*$=|n&)q8Pv^#5qiI1$7e zqb0QEXI*jRv9EL_N%@QYKPUF5Ua$RB|64v~?)mK;^J*`LUpnbtSNrn#|5N#Olm1=% z|EGD+>FfW$<^SB)YxmDM|Ni9j^_fmSF8e<(PyTg2{=Ko_#q@u-=KXm%U2Wq(x8R&_ z34i9-TP@rFYnkHf+JB$Id7u3M{i#K&zRdFf%m3QNFaK}8H-A?D(@9O5HuZaK&%|U_ z>-N=8w!EYFaO=#BDEp0j`|I<}&ZTsHeZ`&AA8DiZ?dKUog++3&f3Ljnt-nwH+|9mD zmllhfb-%u#Z?@2+ZJ*uWqvCE`zHhCLxqfgd^O=-= z#frZ+>-W6qjo&W5{(qM_--|EjgBiE)`>+4^W5>QnXRD9CzW;OI`tIxP4;`XnjxW1= z*5}~ni3JLtivIuh{)x_AGjZ$UhElcte9tZ>*{YtBGcA5&_2Kx|e?MQJN9h0|ug_+!On?(lm5^ZH|xb@s3D+*ZE^c{lusZ2`!^fGmZC$sJR|J+=^{Kx0t`yBpkG~aIL zFppdQ`SnxV|HnUfsxP&FE+eS;&!hIA^uAp`XViP7f7yRxzkmJAf7!q0In3F8K>yDt zZ5Nj>=eGZ!$~JNR=bz7x%Kv#Nt|X|}JpZ@2{r)f6>tBBjKN!>h-}h0i(yuS^|F^fy zc+q}8;Oc8nyK*Vplb#Qp)fUz1heins@BMW&@XX`Azm66vX$K0e)Hk2BW#W{>{(|mn zww_4!Y&oO&eR;?Up%alsL67EPZ4Kn`P`asMp|R(C=C0mQg(Ke=ou9csp0EDQ z43&viPZzn)_g}W~T(y)$kMP9r5i6FbtY>QI_~mu#;l5u|%M)kw2wyZdTo_~j;tO|j zqS!0J%kuwDYRK(g-uUQ#!1RNcU--Kna{01LApBv2fgtak2fr@K_dfdm@2S0A|NY{n z`=uY+*8SxE`uCn7$A9zskNusUFSgr#Jbv@*-)Mc`RqEyL3;&)A`R;xH=0lsuF6&(8 za9#U-#pO|1>;}brskSeNZ*Veh{-A#AfAXpA|02a5q8WU@tl!UjY11jc9%g|wMvoa> z5&X;3+e?^{*3|Gvb#pQaC=Tfe^i zxc;d`zwfN4t8pjC-`V!wUv}~f{aq^0zo=p6KgGEh?U#zb$bMnJ z(EP&j&KJJkwG;B|z9&9^yZ`&^;|99x4gU4kf2=?Ax};$GgCCvoKQv{|oSuB`rkB)< z=zXtW@5+1cW~RPsX^0ojS@v_{+;!%L_G|yfw{lb` z9dWi}S>fk6!=%AOkMrvf^Dx2HU(auR8@R+|Zo!2+0UpN~6FB$&F6%sR5&HD^$-0!) zzu$^DIDeb<+v!{ zeqH@1_bkB=_diabR`+?{m-+R#Pak#udup}*hQ0cr<6B-kyx@{(?fQ3NlKL|7eI65@ z8Qs45KdA4IGUxKAHl8dI-207g|2dPDly~y?al3ENSR4$$)ra+8xW)A%o59Db<<~;r z4bwg1e}&|5F426txI*3V*Lk<^$0Gl>oeAYgITByQ%4N#%D`x4+u8(`pOj-QsYxK)w zcfb6Z9?Wq6JL{t7-#zcud40(>zodJ=tocd3z3Q+2yi1*(-*jKf%g9_078U)^fBzTplK;8vYp&04f4%vC^PHILm#_bC%DeaH)UDY6ZQCz>ulv!S zT2dGGZ++h9U%mey$LyJR`;k?Bb@uEHx1I*CI{Trh=ft=E?j<$5IIeR)SthgobZmOp zw*9xhiG-j3(%~!~Q4<^MrM)+8*MTKmRW`lGxvxwPOu4b=e+c)4cjEfOf}Z_ui-Tvq zdvDx+d;c@-_M%@)3-|QfU4QXs&a&#?HcREc9+sYx@O-u7UExKaFIw_``~LXr?`Fl& z$%T)1OU#{rxuAZ3#b5inAN*WO4~}|%eIob#^4~S8e%t=vpW0CJu6ygX{bzsvKC$2H zh~Bp8alhYe-L%gu>AF!x=SI zhrIAN-1OhlK)-*I_jqV3;tF0Yq!gn=fxBEPuex9w)4YYg%AC|pOwq6^JS@d@O!_{ z{;x0Nmwn&=K7Q%^|3|j#x&E8~^KNj}>FDn-`R&Xjx@zKo|8al0SN>1huch;UteZRG z|GK#U_BEIHAN!)Vh<&}CkkTUd{ogfiPdj%+MafKcs%nh?{5s8l?`>*-Eqze7E6LLR z1FvF2RrSuoy_Ici*k`13HGZ+m`S-8wyV@jMd)6f7{cCi!4W2Y*7?dQxV%YS2+MW%1 zW$n{za+i60^;ya1a4}iYFP?pFyA^}dqS?=44Fq}5xhsWS=dJm8GV+b3HE$`y`4+2& zdoN>P5F}6F?JM6W)xKlKr226|$e_M6?zWx)=!2KZ$^XsKf)SSQZzwJq`l*4q!Ozp&L zY#NnX3L-K_te>ubSDEzt)=mAX^V4p4ADx(Iz3|9U7nysnXBMg*+SkPPvs%!A>-*Ne z2Gx(7pRgR^uv@~g>CgT`7N_d?S5gwQ=TFIhryct7x7NLapG{By7PC9NtyfwUey;Q1 zH|frQ%l9k%vyPuSaex0O-G|kV0lU^b_xJOAQXF67|4sej_Mfj`R6mu!sQFh?aPAq` ze|D#~x4dU{e7R{}d^<Rk!|N4uo_s?^Ok98{;cL?m5 zP|BeHZ~gy-zLEpo&#z{Gw|KILTln9bh8Z4WlRV7U{Vm=3-7Py#q5kaC*B| znC-dZ9n*&=>+QY8_Pf3``!Cb~|5xXS`u}p%{x@~}H(pe~&QGW|b~OW3No@>BO?L-F z{%3u!fA^lnPx-U=?7rMjcfY=7KG5nGoBOWoUs9av)&`HC2hTB1NI0whNPj-l$>P*$ zqP)Jm4maWxZohxD#L0Sh!i)|(Z)=Nkr6}jB*z+87=j~jVK2LwmtE*F7ePVrl7?XeK zW z7~KC&JL8?n&~Ntp{%)rJ|HnEFmisl<%jq1HUpjwQ=I`Gb_b2ajo&EQHY-4`icg4Vr z+u4VI-~TTCC3^n9`WMXi|I30)STVK#+xL_@&Hs6~xa!?q^Ox7__HH-$x&M3fevkFF z|GvMdwf~~{>qx)fHotwl>uMQxyjaoA^uBLJq{yMHAIFP3HENdDr|Qk_s<&Qy-tY6| zgum&r43n=ouV-znvb!yu&@Op3&^q|UP2tw#HyPc`wl7Iam?gvWSI21Ko(4mnLV@rt z5^w63b+xFw%={ZaGwHyzkOqCeGhEE)H=7+?<8a|R`-#YRLLVysM&7#hH*M|jT&|{A z-`}&n88p1Mflf-?{98s|KW(PGy!_>d4-*dyR{Z&~@kZIfN~QYmb%&DQ>t~4HTMjyD z`LN)R3-^C>)ZYL8&w4HYzn}g!+I#=kx_}EK{+j>gIyt}pAAHXCW!iS3+GpkdFL##T zkGb*f|I+zC^s3&ocgBGVrCR$h3)fD5zb;;$L9dfz#j5M?=3P(ahJLX z|EK*izO*KYy@88y-P-@V%p7v-H}A68{4du!t~g`j4bh{8*X(C!Opo2aJ0MK?z{|bM z%bad!K4260*y5sfd8L3~uhRj}sjnDorl?32l_bXZ42(W|IhsV z`y<`rpUStMu(`KMUCGMECgx>pUtiygCr_6AxU>0z?(fn)^Y3kTcPR;~d8Zd4xWVV# z{jP@8qJPs`${it*C!+M=rUsMAyXiN4rVD!nGZZ9C`cIvIU5`OdN@=ZU{0Y(juG#m` zJlyW2uuf;&&MIXFBf(^u2Dk4`iuJ+U6;#sB7Cf~(uj0?Tql#f#fWQpF`r3W--k4{) z{fk`vK*OK;M=fLPxrSdMQ#<#r<(OdIdcgJc?{u4pu79F-_xEdgEqNcmS>&&F&A$53 zDIWim?SB^=%YXko|HrkZ-2XyYbfP~jSJ~qY$y};}j8PBev`$BwU!QyQb#}B>yq&V4 z(AVzFLq$>_pU}ZRvH}((5yYcmFQj)$4kGf870Z-wM~yer~BcsldKkzLrP) z-sHMzZ?+jL)k*a=@3ocf|5ah<`+a+N^_PmSdF4OrPWD^BuH<`iKS^f$x;Le)RuD23HA(U6q)k&h6H9=20t=VIjY6R z^YU|~Z$-=vkK=70)(D*N*yQqO+8^1>%dZ=Eob`-T=X+w97TPde@AY@hx%+2uLoi=V6h=>A%?U(!h-#Z_c zHCW2%aqNhVn&4)62e-89_V1E>3@fh;qte1cE+P;ThFm>2>v7W`R`PLovAe&@0w;V7x$VI7ct+wuWgr9 zq+-I<-3;3}E|jr+P|5k|-P{!9o$!{UVB4qbZhy+M9+;?CWhzz{y>o~Zh*A5L&(V;3(ae*eqVFSo?^Z@Kh%|KI3+z5D(~@5{~nxZzFm z*N^xAmj916U@vHOIneFol74ma?qK65?p#mq>#@BGvsXQpIO~si^&j8=`@{aY8(uh_ z#&D(h=VhLT9Y_7&SR|hk%Wx6AaHB@}8e6v~Ysc%9gxy6ILhn`^Gr!q($aBX%JtL#H z4Mxd62K}>EHns_5s8?%QFkZU%yZ&a!{!oUTT?`vkOr9ye@ZCRuozsDM+n;ln&MOvu ze!%YE-2DIA-tPZT+g;nmzW>wg`7U4h8D5t%yIq~Ud)xE-lj<^9w^$YlE2@hhSo>?K zV-d@VZ+~~+slRa{{Q1vjiwha?ucjTSYTq6EN_fWljLzAC$C6wRn8>HTiDukt8{lQi zP^Z@*FF40<&2Q!;=>87g((qcB;SlOnw z^`IX|#uxcm26JHrG236ZjAaHB=CUW8h(Ff$=IyzLtY_lNx#824{)_8>eg7cg=82ln zm?dTha;-q8X1lTYtWy7eX@N|k@TXa#pAXwu^-cZ1jM<^*sk|G5@z>WG_sbYw2rSsK z;ke)b*E2V4Pw!ZttGMkfXU1~p+^@w2Oe)Km)!YPHrnp^Xonhi9(-FU83Y)~lSh*#p zj6Tm3J11;;_jp?5)PL7rtT-PRcKiOK>uzUe3o&+Ili2d~#r4*0Qq8G$|3RH7>%T_x ztG|~lU;lrfeA7Y}hVJeL@ul^zRd>&DYyUIDk|9XyO|Zm*$G<-;-PfNo^=lem!;OWu zFKu35m~Wuo@OOejnR8u|_@UPiE93gVi(9H*yq;q0VeVc^vgZBz0O$dUi<%zcX-nuX{Ll|S%%O1u9^M*5?-qt%k$;m_rJ%^ zo%nCOzuGIm@^wo3lmEA#+k3tL`#}GZz7>PcbGDw9h9}yDC5^7Ddsp323QW>59b+&lS zQ$2WO`9Z-9w-29nJ|xyl$4fp6KQiI%x3{s1ufj*kIZ0~5gq1(epWFS%{(DD? zfSBl4-`n$-v1FZ&f5fzS-eRY7?2M6SSMTf((Be?J&G(|5@x~N~g>Mb7FdSLrzFTd_ z1|1I*QH5KY0Ub|{rW#wN{hF=TzS`}NEBk>Y;mn56dBwt+4eOrg6szw!yFd5SceDT7 zPTs%$N1>kKMvFkj##i^NPM+Uc{%yw!-FNJ-e|+4Z#<$Xr*A&b4eR7yiHLWbN7G%m4hjT*IXh-IO<9X2w+E=xq!cav;I*9J zT@~m3EH9_L(yG^V`|H{?J@WX!OW{BDRT%b&?$1*U==$gV?f>WV_WtYleB!#huXeY@ z#`Uv*?3Ur?zRR>iDdG0E{ds~Rf*W#g$8Tp?#li5C`9PS? z+kcjAtNeNWGe^uP-G<7y4vC-Rcf@hsW<6>zZm&CeuQ02QYG8nX)lE&GFWLdj+t+^0 zEoaYqRR1#SPaf~H&I|nf{4Za;$k4vHe^PyT%fBCw-!Hhg`E{jztSrOV>YA;JO!xlV z-HJT-pWn`W!S+2<%cgyXH4HhQ@H1EoFoj%a@99i+I@J7Y`HVgFFFvMAwY-ZGn#H@uAtc(}U zx4a#1^k{!x#)ft==35zmA@?;{rmCXF7CheFN`I_a6#|2>`itH|9r~%@%#7b zR~9yPe=NEhtp9(zZZgl^^?)ANzcm~;To29{Wdx<2R)Gpbj>g@K_x$KDWjoN&QkBN< za9-pO@25ldMNA5}IaWM5|C2#M-nM%-qrxMWgI9dmeE$Cb`u9!7V<*Q2^1M2eubiJR zsx;~SW&OpGU&>`W_g`kz=wy)I8l8QoyYW))w~e_^{9Pt~3FXjucYnV>znskpmxkV3 zYkS`xb$Ds^JHr28SjiL_25qLY&e)0jMHv|w-dqu!Ai&wb`ue-Chu{3J6Jg9`cbFeh z<*1|a@cZ3Q^Jo2;S;Cc|@A^0B!x`n%)7ltkmL3Qc@cI1lz#OIe%;<(Ei|fz7Qx&}6 z`tRk&>odQkb2T{Z`t#r*^T%m>x4*BQcjtatLBWL$f4!gBbKm3Cn7C8DMxW!$zJHcA zYa45A85kP4_1WgtZd6*ds;bD`=WBO&eU_rav>zw?8QvZDh&N$XaAY{5>M)0!p-`z| zt+0aSM{_r(+iM$^{$)rETHv$d&h+a}Z-)#HV`$7y1dXu#c6c>4lF#FUBo!idvtgK#uxlnq69^0l; z2A8LGR-N{*N_SrSXKue(Iw70kjF5_Ksf;=6xrqJIQD=f*y<~q`zHml!{nM%8n{4*T z3Ov#MH_7_KG^H8S|I{ij*q@_Zod0q9oyKh^+<2AemJSF4xbmW%q+`=ONa zvp_wkovOk6=kedZGB7ZhX>-hoeOkYeyJ2R8h3=V?PQ`}P|8_d1$h$bMVV)4Bye0B` zY-r8dL-qpyx|j|K?Gt6nJ#t-hzgW+=>#dPLfBpXcUi|2hWpVsV_!$nUin8td6tDch zXsPVvmhOv;FYZ?beri~&+of+eKUsX=C+5mBF6qMQi{799QTYWl3D4lr&b;B=3($Gx z3=Q523`{KTkG<;mgIWU@6gUJK|HtptpFY#2MgMj+8_2Ewawq=3di3$}@grw`6frU| zG_XlEgYHNv2wBGgnxig%cSkX8+VOsQOx|B%eb&;RnU{6B*_kZY!uGR&)fXDPGPyJ7V{o{W1-J-$_d zU9yGQ6?`xq)Q@=GgI#iibBP~Q&AXk?H}rr)k73;BEe( z-Q-sDj_ZGne70lyyyai!Y<>q?ROGWxB2f^ z>GOh?fIMUFf;bPvVPIeYEqP-AEwcq#!T@nT19;w?8j@*A7fK%^ol5|+WQPmWgC9R; z^!4|Lt9jb^fB!5aBlEx(yiQjgLmuA&1xoPEd&+PkrZg%bS^VY`m z`8zhxPOsZsnf~Q_?fmCAzk@CyVPpUw5{5=Ku$DeKA;``MN*yc=3<)`5r~YlYo98}j z+17X$S%w*l878DgrbLGA_FNSlr|u~<--Th8FvBOdQ1@BOCZ^7`QZ3zecb&fyLvSiT z*yo_=;Q(D3fX1uN$;-3i0L2<;0XP#RI-%6|2+iMz%XZ6V&bn47Sjv#l$K)_Abz*Ad zTeX#bm2*`*YlIjx{1{G1hsb8ma+{X=YRZ+DWxMS<8GNSNqL{^=~VG-VQ8@2^hm&9&Bo~`rR(Y+>;H%=0?alAMq-+2EUGzS5 zE&G9zNTvlF4Efi+{yzU|f7ZR!g!Z?Ck8V**jheHZV9G7M;7a|MxQYX^aeMr_~(3&G=%qHhqcgXvOlhPP$bmrU0FReE)1zUSPf{kLK`9GFo&t!8@o;Od{fztd-@dD zdgXP=8eaw$1}On1rKCmsSq)bHVhBm*Y*?87V)Bxo%p43RCzjOv-+yM$z}TQVhqK@r zzXHRB4>Lh7ZeVb5K7YygKl7P+_n8)KaQr^|h;M%j$VZkOEWW$q85x)ugoCyP?|+eG zm)hSwFI!mw6b#M|ff^dSX82!xyhw`S%sk%)9$RPqtbeKL-$Re_-Q(bBU^~aqll^(R z)n`ejE~)Ck0F7PS{y+H4zW>@EMkyJFO*-8=r?bpGOHaKv*(e$IbLOdO%qA5LmV6AA z&8w7sFQ3@tGk22J=RJq(E|v4MB)Bm$95ak&aM*l<1wEA&pUP*vP|;m=P?f=$Az;zv zmoBTX?s{7f%MC1`Ya$pJ#OB^-dLRal$0y~WBN-F=&V2Ig+#7dZn!$i|8Uw=to&)!c z4;IEWxWcl<+pTwMY$N7AES;qC(UWC?C8I)qKQ%HGsCh2atsUx%p1P@ z6ij=4@N^J6gOn)4tSxeTP7F&IOj9`-k>_W!&WgdOO%+^tHKYdYVljCA^+D=NW`y++3Z5E8Z0{CbTgs{GVS5FEBE1rR|KAn;p0Q`F^hk z%?-pw3p8awDYq!(QYtNed)D4a`PqKUAA?NHa6R(v+qW_omy+GF?kSCP?Cb56l&)RB zo?KkK*_7Y@^F(F$J%tRx37pXMkdXKE@_&Ya6ji0DwPD%S#l^vw1vnTYHc2*2I~(4e zSzBw{CvShRNQL2r`3;F}vXfft`xzCY%(v_HZZEZ{|V2}&E38BzNUToyF2@&;%6-@{PE#o#`fD=`LcvxZ;2{mV2F=CDP1%3^!qQ5 zPBL5f?miPOzel#;zGTa#9alH|hwOWI;M%pY`sDQ{|1K(-}j*9n(qabURdxG{bHt=c~?PuFYKJlZHeuVY8{ z^N&-X-rRulXo`)c5b3jUAig z-AhnZkM=W=KURo%6u{w z0akkQ!6s!v#thARbzh$Oov^G}^yO#hamE8qEDf8M+51E$zYjM{1Ihc^=D+yc|J|C8 zK}?O|jr+X|r)T|taKrKPJjNA5VhjlnnGgKF`?~Pw+=AT!0`(5YkR1aIf_Sn_6tAERxzm#n7d>hTsP(EyH^4Y&ZDQNxt%9WRP zytn^!cw+kJ=HCBh$JVc3zx%H&L&!|V9ZNIi_Zs^h%P(_2@NVYcup_V3``@;;EHq|N zK2~ZqH(Kh;H|_tOKQ5Y=$Nj%G{o=2evCX`DzvvegzdocJ|9@X`&iNUhcdp%d+Q>NL zHABJ6FF!k83#!}Sv}V4LpI-ZaZ$xcrdT#v&x%o)m;3Y z^}ICxuTs?cJG>QKDGC}_v~LQo7Ep(IVimJ?A})v3^UY?_X|BxiMjd1rcd?z`^uOrcUGSh zVL0H#+7KDb`N4m>zK;z{&!bNV7<6(OPDt0xth{4$-JUt%+Lh18_4s)X80}29_s{zE zZ0A4C|B09X|2<`9{H?e$fkDiSLFe%^%jxWF2{+g9nEkK3YqPy$wj^VM7NbJ`pT#DH zpYNkbI9trHVTm!r t_QTIC8D{uvo1KSrU_dQk(A`PFf8`&RwH{x5?N2U9$kWx&Wt~$(69Bga3!4A{ literal 31627 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