From 9e5e3b8488b900688aea83e5c619f34d42ce5af8 Mon Sep 17 00:00:00 2001 From: LordMZTE Date: Sat, 20 May 2023 19:50:11 +0200 Subject: [PATCH] feat: implement crystallizer --- .../net/anvilcraft/thaummach/ClientProxy.java | 4 + .../net/anvilcraft/thaummach/CommonProxy.java | 4 + .../java/net/anvilcraft/thaummach/GuiID.java | 3 +- ...{SlotInventory.java => InventorySlot.java} | 4 +- .../net/anvilcraft/thaummach/OutputSlot.java | 18 ++ .../net/anvilcraft/thaummach/TMItems.java | 6 + .../thaummach/container/ContainerBore.java | 6 +- .../container/ContainerCrystallizer.java | 118 ++++++++++++ .../thaummach/gui/GuiCrystallizer.java | 59 ++++++ .../thaummach/items/ItemRunicEssence.java | 10 +- .../thaummach/items/ItemUpgrade.java | 154 +++++++++++++++ .../apparatus/ApparatusRenderingHelper.java | 181 ------------------ .../render/tile/TileBoreRenderer.java | 4 +- .../thaummach/tiles/TileCrucible.java | 2 +- .../thaummach/tiles/TileCrystallizer.java | 111 +++++++++-- .../assets/thaummach/lang/en_US.lang | 8 + .../resources/assets/thaummach/sounds.json | 9 + .../assets/thaummach/sounds/upgrade.ogg | Bin 0 -> 14824 bytes .../thaummach/textures/guis/crystallizer.png | Bin 0 -> 29123 bytes .../thaummach/textures/items/upgrade_0.png | Bin 0 -> 765 bytes .../thaummach/textures/items/upgrade_1.png | Bin 0 -> 788 bytes .../thaummach/textures/items/upgrade_2.png | Bin 0 -> 767 bytes .../thaummach/textures/items/upgrade_3.png | Bin 0 -> 715 bytes .../thaummach/textures/items/upgrade_4.png | Bin 0 -> 774 bytes .../thaummach/textures/items/upgrade_5.png | Bin 0 -> 768 bytes .../thaummach/textures/items/upgrade_6.png | Bin 0 -> 770 bytes 26 files changed, 489 insertions(+), 212 deletions(-) rename src/main/java/net/anvilcraft/thaummach/{SlotInventory.java => InventorySlot.java} (76%) create mode 100644 src/main/java/net/anvilcraft/thaummach/OutputSlot.java create mode 100644 src/main/java/net/anvilcraft/thaummach/container/ContainerCrystallizer.java create mode 100644 src/main/java/net/anvilcraft/thaummach/gui/GuiCrystallizer.java create mode 100644 src/main/java/net/anvilcraft/thaummach/items/ItemUpgrade.java create mode 100644 src/main/resources/assets/thaummach/sounds/upgrade.ogg create mode 100644 src/main/resources/assets/thaummach/textures/guis/crystallizer.png create mode 100644 src/main/resources/assets/thaummach/textures/items/upgrade_0.png create mode 100644 src/main/resources/assets/thaummach/textures/items/upgrade_1.png create mode 100644 src/main/resources/assets/thaummach/textures/items/upgrade_2.png create mode 100644 src/main/resources/assets/thaummach/textures/items/upgrade_3.png create mode 100644 src/main/resources/assets/thaummach/textures/items/upgrade_4.png create mode 100644 src/main/resources/assets/thaummach/textures/items/upgrade_5.png create mode 100644 src/main/resources/assets/thaummach/textures/items/upgrade_6.png diff --git a/src/main/java/net/anvilcraft/thaummach/ClientProxy.java b/src/main/java/net/anvilcraft/thaummach/ClientProxy.java index 7ebbfdd..369f939 100644 --- a/src/main/java/net/anvilcraft/thaummach/ClientProxy.java +++ b/src/main/java/net/anvilcraft/thaummach/ClientProxy.java @@ -6,6 +6,7 @@ import cpw.mods.fml.common.FMLCommonHandler; import cpw.mods.fml.common.registry.GameRegistry; import net.anvilcraft.thaummach.entities.EntitySingularity; import net.anvilcraft.thaummach.gui.GuiBore; +import net.anvilcraft.thaummach.gui.GuiCrystallizer; import net.anvilcraft.thaummach.gui.GuiVoidChest; import net.anvilcraft.thaummach.gui.GuiVoidInterface; import net.anvilcraft.thaummach.render.BlockApparatusRenderer; @@ -95,6 +96,9 @@ public class ClientProxy extends CommonProxy { case VOID_INTERFACE: return new GuiVoidInterface(player.inventory, (TileVoidInterface) te); + case CRYSTALLIZER: + return new GuiCrystallizer(player.inventory, (TileCrystallizer) te); + default: throw new IllegalArgumentException("ALEC"); } diff --git a/src/main/java/net/anvilcraft/thaummach/CommonProxy.java b/src/main/java/net/anvilcraft/thaummach/CommonProxy.java index 5f312d3..0976bbb 100644 --- a/src/main/java/net/anvilcraft/thaummach/CommonProxy.java +++ b/src/main/java/net/anvilcraft/thaummach/CommonProxy.java @@ -3,6 +3,7 @@ package net.anvilcraft.thaummach; import cpw.mods.fml.common.network.IGuiHandler; import cpw.mods.fml.common.registry.GameRegistry; import net.anvilcraft.thaummach.container.ContainerBore; +import net.anvilcraft.thaummach.container.ContainerCrystallizer; import net.anvilcraft.thaummach.container.ContainerVoidChest; import net.anvilcraft.thaummach.container.ContainerVoidInterface; import net.anvilcraft.thaummach.tiles.TileBore; @@ -63,6 +64,9 @@ public class CommonProxy implements IGuiHandler { player.inventory, (TileVoidInterface) te ); + case CRYSTALLIZER: + return new ContainerCrystallizer(player.inventory, (TileCrystallizer) te); + default: throw new IllegalArgumentException("ALEC"); } diff --git a/src/main/java/net/anvilcraft/thaummach/GuiID.java b/src/main/java/net/anvilcraft/thaummach/GuiID.java index ec8b2c4..d643031 100644 --- a/src/main/java/net/anvilcraft/thaummach/GuiID.java +++ b/src/main/java/net/anvilcraft/thaummach/GuiID.java @@ -3,7 +3,8 @@ package net.anvilcraft.thaummach; public enum GuiID { BORE, VOID_CHEST, - VOID_INTERFACE; + VOID_INTERFACE, + CRYSTALLIZER; public static GuiID get(int id) { if (id >= 0 && id < GuiID.values().length) { diff --git a/src/main/java/net/anvilcraft/thaummach/SlotInventory.java b/src/main/java/net/anvilcraft/thaummach/InventorySlot.java similarity index 76% rename from src/main/java/net/anvilcraft/thaummach/SlotInventory.java rename to src/main/java/net/anvilcraft/thaummach/InventorySlot.java index 4735271..d3ad278 100644 --- a/src/main/java/net/anvilcraft/thaummach/SlotInventory.java +++ b/src/main/java/net/anvilcraft/thaummach/InventorySlot.java @@ -4,8 +4,8 @@ import net.minecraft.inventory.IInventory; import net.minecraft.inventory.Slot; import net.minecraft.item.ItemStack; -public class SlotInventory extends Slot { - public SlotInventory(IInventory inv, int idx, int x, int y) { +public class InventorySlot extends Slot { + public InventorySlot(IInventory inv, int idx, int x, int y) { super(inv, idx, x, y); } diff --git a/src/main/java/net/anvilcraft/thaummach/OutputSlot.java b/src/main/java/net/anvilcraft/thaummach/OutputSlot.java new file mode 100644 index 0000000..e1170eb --- /dev/null +++ b/src/main/java/net/anvilcraft/thaummach/OutputSlot.java @@ -0,0 +1,18 @@ +package net.anvilcraft.thaummach; + +import net.minecraft.inventory.IInventory; +import net.minecraft.inventory.Slot; +import net.minecraft.item.ItemStack; + +public class OutputSlot extends Slot { + public OutputSlot( + IInventory p_i1824_1_, int p_i1824_2_, int p_i1824_3_, int p_i1824_4_ + ) { + super(p_i1824_1_, p_i1824_2_, p_i1824_3_, p_i1824_4_); + } + + @Override + public boolean isItemValid(ItemStack p_75214_1_) { + return false; + } +} diff --git a/src/main/java/net/anvilcraft/thaummach/TMItems.java b/src/main/java/net/anvilcraft/thaummach/TMItems.java index e2025fa..77b383a 100644 --- a/src/main/java/net/anvilcraft/thaummach/TMItems.java +++ b/src/main/java/net/anvilcraft/thaummach/TMItems.java @@ -5,6 +5,7 @@ import net.anvilcraft.thaummach.items.ItemCrystallineBell; import net.anvilcraft.thaummach.items.ItemFocus; import net.anvilcraft.thaummach.items.ItemRunicEssence; import net.anvilcraft.thaummach.items.ItemSingularity; +import net.anvilcraft.thaummach.items.ItemUpgrade; import net.minecraft.item.Item; public class TMItems { @@ -16,6 +17,7 @@ public class TMItems { public static Item focus4; public static Item runicEssence; public static Item singularity; + public static Item upgrade; public static void init() { crystallineBell = new ItemCrystallineBell(); @@ -30,6 +32,8 @@ public class TMItems { singularity = new ItemSingularity(); + upgrade = new ItemUpgrade(); + GameRegistry.registerItem(crystallineBell, "crystalline_bell"); GameRegistry.registerItem(focus0, "focus0"); @@ -41,5 +45,7 @@ public class TMItems { GameRegistry.registerItem(runicEssence, "runic_essence"); GameRegistry.registerItem(singularity, "singularity"); + + GameRegistry.registerItem(upgrade, "upgrade"); } } diff --git a/src/main/java/net/anvilcraft/thaummach/container/ContainerBore.java b/src/main/java/net/anvilcraft/thaummach/container/ContainerBore.java index 3413960..4c3282d 100644 --- a/src/main/java/net/anvilcraft/thaummach/container/ContainerBore.java +++ b/src/main/java/net/anvilcraft/thaummach/container/ContainerBore.java @@ -1,6 +1,6 @@ package net.anvilcraft.thaummach.container; -import net.anvilcraft.thaummach.SlotInventory; +import net.anvilcraft.thaummach.InventorySlot; import net.anvilcraft.thaummach.items.ItemFocus; import net.anvilcraft.thaummach.items.ItemSingularity; import net.anvilcraft.thaummach.tiles.TileBore; @@ -15,8 +15,8 @@ public class ContainerBore extends Container { public ContainerBore(InventoryPlayer inventoryplayer, TileBore tileBore) { this.arcaneBore = tileBore; - this.addSlotToContainer(new SlotInventory(tileBore, 0, 65, 17)); - this.addSlotToContainer(new SlotInventory(tileBore, 1, 65, 55)); + this.addSlotToContainer(new InventorySlot(tileBore, 0, 65, 17)); + this.addSlotToContainer(new InventorySlot(tileBore, 1, 65, 55)); int j; for (j = 0; j < 3; ++j) { diff --git a/src/main/java/net/anvilcraft/thaummach/container/ContainerCrystallizer.java b/src/main/java/net/anvilcraft/thaummach/container/ContainerCrystallizer.java new file mode 100644 index 0000000..be8dd37 --- /dev/null +++ b/src/main/java/net/anvilcraft/thaummach/container/ContainerCrystallizer.java @@ -0,0 +1,118 @@ +package net.anvilcraft.thaummach.container; + +import net.anvilcraft.thaummach.OutputSlot; +import net.anvilcraft.thaummach.tiles.TileCrystallizer; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.inventory.Slot; +import net.minecraft.item.ItemStack; + +public class ContainerCrystallizer extends Container { + private TileCrystallizer crystallizer; + private int lastCookTime = 0; + + public ContainerCrystallizer( + InventoryPlayer inventoryplayer, TileCrystallizer tileCrystallizer + ) { + this.crystallizer = tileCrystallizer; + this.addSlotToContainer(new Slot(tileCrystallizer, 6, 80, 70)); + + // Air + this.addSlotToContainer(new OutputSlot(tileCrystallizer, 0, 131, 41)); + + // Fire + this.addSlotToContainer(new OutputSlot(tileCrystallizer, 1, 131, 100)); + + // Water + this.addSlotToContainer(new OutputSlot(tileCrystallizer, 2, 30, 41)); + + // Earth + this.addSlotToContainer(new OutputSlot(tileCrystallizer, 3, 30, 100)); + + // Magic + this.addSlotToContainer(new OutputSlot(tileCrystallizer, 4, 80, 12)); + + // Taint + this.addSlotToContainer(new OutputSlot(tileCrystallizer, 5, 80, 129)); + + int j; + for (j = 0; j < 3; ++j) { + for (int k = 0; k < 9; ++k) { + this.addSlotToContainer( + new Slot(inventoryplayer, k + j * 9 + 9, 8 + k * 18, 158 + j * 18) + ); + } + } + + for (j = 0; j < 9; ++j) { + this.addSlotToContainer(new Slot(inventoryplayer, j, 8 + j * 18, 216)); + } + } + + // TODO: WTF + //@Override + //public void updateCraftingResults() { + // super.updateCraftingResults(); + + // for (int i = 0; i < super.inventorySlots.size(); ++i) { + // ICrafting icrafting = (ICrafting) super.inventorySlots.get(i); + // if ((float) this.lastCookTime != this.crystallizer.crystalTime) { + // icrafting.updateCraftingInventoryInfo( + // this, 0, Math.round(this.crystallizer.crystalTime) + // ); + // } + // } + + // this.lastCookTime = Math.round(this.crystallizer.crystalTime); + //} + + @Override + public void updateProgressBar(int i, int j) { + if (i == 0) { + this.crystallizer.crystalTime = (float) j; + } + } + + @Override + public boolean canInteractWith(EntityPlayer entityplayer) { + return this.crystallizer.canInteractWith(entityplayer); + } + + @Override + public ItemStack transferStackInSlot(EntityPlayer player, int i) { + ItemStack itemstack = null; + Slot slot = (Slot) super.inventorySlots.get(i); + if (slot != null && slot.getHasStack()) { + ItemStack itemstack1 = slot.getStack(); + itemstack = itemstack1.copy(); + if (i < 7) { + if (!this.mergeItemStack(itemstack1, 7, 34, true)) { + return null; + } + } else if (i >= 7 && i <= 34) { + if (!this.mergeItemStack(itemstack1, 0, 1, false)) { + return null; + } + } else if (i > 34 && i <= 43) { + if (!this.mergeItemStack(itemstack1, 7, 34, false)) { + return null; + } + } else if (!this.mergeItemStack(itemstack1, 7, 43, false)) { + return null; + } + + if (itemstack1.stackSize == 0) { + slot.putStack((ItemStack) null); + } else { + slot.onSlotChanged(); + } + + if (itemstack1.stackSize == itemstack.stackSize) { + return null; + } + } + + return itemstack; + } +} diff --git a/src/main/java/net/anvilcraft/thaummach/gui/GuiCrystallizer.java b/src/main/java/net/anvilcraft/thaummach/gui/GuiCrystallizer.java new file mode 100644 index 0000000..a9351ea --- /dev/null +++ b/src/main/java/net/anvilcraft/thaummach/gui/GuiCrystallizer.java @@ -0,0 +1,59 @@ +package net.anvilcraft.thaummach.gui; + +import net.anvilcraft.thaummach.TMItems; +import net.anvilcraft.thaummach.container.ContainerCrystallizer; +import net.anvilcraft.thaummach.tiles.TileCrystallizer; +import net.minecraft.client.gui.inventory.GuiContainer; +import net.minecraft.client.renderer.texture.TextureMap; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.util.IIcon; +import net.minecraft.util.ResourceLocation; +import org.lwjgl.opengl.GL11; + +public class GuiCrystallizer extends GuiContainer { + private TileCrystallizer crystallizerInventory; + + public GuiCrystallizer( + InventoryPlayer inventoryplayer, TileCrystallizer tileInfuser + ) { + super(new ContainerCrystallizer(inventoryplayer, tileInfuser)); + this.crystallizerInventory = tileInfuser; + super.ySize = 239; + } + + @Override + protected void drawGuiContainerForegroundLayer(int alec1, int alec2) { + super.fontRendererObj.drawString("Crystallizer", 5, 5, 0x404040); + } + + @Override + protected void drawGuiContainerBackgroundLayer(float f, int qq, int ww) { + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + super.mc.renderEngine.bindTexture( + new ResourceLocation("thaummach", "textures/guis/crystallizer.png") + ); + int j = (super.width - super.xSize) / 2; + int k = (super.height - super.ySize) / 2; + this.drawTexturedModalRect(j, k, 0, 0, super.xSize, super.ySize); + int i1; + if (this.crystallizerInventory.isCooking()) { + i1 = this.crystallizerInventory.getCookProgressScaled(46); + this.drawTexturedModalRect(j + 160, k + 151 - i1, 176, 46 - i1, 9, i1); + } + + if (this.crystallizerInventory.boost > 0) { + i1 = this.crystallizerInventory.getBoostScaled(); + this.drawTexturedModalRect(j + 161, k + 38 - i1, 192, 30 - i1, 7, i1); + } + + if (this.crystallizerInventory.getUpgrades()[0] >= 0) { + IIcon itemIcon = TMItems.upgrade.getIconFromDamage( + this.crystallizerInventory.getUpgrades()[0] + ); + + this.mc.renderEngine.bindTexture(TextureMap.locationItemsTexture); + + this.drawTexturedModelRectFromIcon(j + 8, k + 128, itemIcon, 16, 16); + } + } +} diff --git a/src/main/java/net/anvilcraft/thaummach/items/ItemRunicEssence.java b/src/main/java/net/anvilcraft/thaummach/items/ItemRunicEssence.java index 3cfe0f0..bc372d5 100644 --- a/src/main/java/net/anvilcraft/thaummach/items/ItemRunicEssence.java +++ b/src/main/java/net/anvilcraft/thaummach/items/ItemRunicEssence.java @@ -1,6 +1,7 @@ package net.anvilcraft.thaummach.items; import java.util.List; +import java.util.stream.IntStream; import net.anvilcraft.thaummach.TMBlocks; import net.anvilcraft.thaummach.TMTab; @@ -15,7 +16,7 @@ import net.minecraft.util.IIcon; import net.minecraft.world.World; public class ItemRunicEssence extends Item { - private IIcon[] icons = new IIcon[6]; + private IIcon[] icons; public ItemRunicEssence() { super(); @@ -27,9 +28,10 @@ public class ItemRunicEssence extends Item { @Override public void registerIcons(IIconRegister reg) { - for (int i = 0; i < 6; i++) { - this.icons[i] = reg.registerIcon("thaummach:runic_essence_" + i); - } + this.icons + = IntStream.range(0, 6) + .mapToObj((i) -> reg.registerIcon("thaummach:runic_essence_" + i)) + .toArray(IIcon[] ::new); } @Override diff --git a/src/main/java/net/anvilcraft/thaummach/items/ItemUpgrade.java b/src/main/java/net/anvilcraft/thaummach/items/ItemUpgrade.java new file mode 100644 index 0000000..a7620ba --- /dev/null +++ b/src/main/java/net/anvilcraft/thaummach/items/ItemUpgrade.java @@ -0,0 +1,154 @@ +package net.anvilcraft.thaummach.items; + +import java.util.List; +import java.util.stream.IntStream; + +import dev.tilera.auracore.api.machine.IUpgradable; +import net.anvilcraft.thaummach.TMTab; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.EnumRarity; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.IIcon; +import net.minecraft.world.World; + +public class ItemUpgrade extends Item { + public IIcon[] icons; + + public ItemUpgrade() { + super(); + this.maxStackSize = 16; + this.setHasSubtypes(true); + this.setMaxDamage(0); + this.setCreativeTab(TMTab.INSTANCE); + } + + @Override + public void registerIcons(IIconRegister reg) { + this.icons = IntStream.rangeClosed(0, 6) + .mapToObj((i) -> reg.registerIcon("thaummach:upgrade_" + i)) + .toArray(IIcon[] ::new); + } + + @Override + public EnumRarity getRarity(ItemStack itemstack) { + return EnumRarity.uncommon; + } + + @Override + public String getUnlocalizedName(ItemStack stack) { + return "item.thaummach:upgrade_" + stack.getItemDamage(); + } + + @Override + @SuppressWarnings({ "unchecked", "rawtypes" }) + public void + addInformation(ItemStack stack, EntityPlayer alec1, List list, boolean alec2) { + switch (stack.getItemDamage()) { + case 0: + list.add("Improves speed"); + break; + case 1: + list.add("Improves efficiency"); + break; + case 2: + list.add("Increases aggression and damage"); + break; + case 3: + list.add("Unlocks functions that involve taint"); + break; + case 4: + list.add("Upgrades?"); + break; + case 5: + list.add("Increases capacity"); + break; + case 6: + list.add("Increases mystical capacity or knowledge"); + } + } + + @Override + public IIcon getIconFromDamage(int meta) { + return this.icons[meta]; + } + + @Override + public IIcon getIcon(ItemStack stack, int pass) { + return this.getIconFromDamage(stack.getItemDamage()); + } + + @Override + @SuppressWarnings({ "unchecked", "rawtypes" }) + public void getSubItems(Item p_150895_1_, CreativeTabs p_150895_2_, List list) { + IntStream.rangeClosed(0, 6).forEach((i) -> list.add(new ItemStack(this, 1, i))); + } + + @Override + public boolean onItemUseFirst( + ItemStack ist, + EntityPlayer player, + World world, + int x, + int y, + int z, + int l, + // useless parameters + float alec1, + float alec2, + float alec3 + ) { + System.out.println("ALEC"); + TileEntity ent = world.getTileEntity(x, y, z); + if (ent != null && ent instanceof IUpgradable) { + IUpgradable ue = (IUpgradable) ent; + + for (int a = 0; a < ue.getUpgradeLimit(); ++a) { + if (ue.getUpgrades()[a] < 0 + && ue.canAcceptUpgrade((byte) ist.getItemDamage())) { + if (!world.isRemote && ue.setUpgrade((byte) ist.getItemDamage())) { + world.markBlockForUpdate(x, y, z); + ist.stackSize--; + world.playSoundEffect( + (double) x + 0.5, + (double) y + 0.5, + (double) z + 0.5, + "thaummach:upgrade", + 0.4F, + 1.0F + ); + return true; + } + } + } + + return false; + } + return super.onItemUseFirst(ist, player, world, x, y, z, l, alec1, alec2, alec3); + } + + // TODO: WTF + //@Override + //public void useItemOnEntity(ItemStack ist, EntityLiving ent) { + // if (ent != null && ent instanceof IUpgradable) { + // IUpgradable ue = (IUpgradable) ent; + + // for (int a = 0; a < ue.getUpgradeLimit(); ++a) { + // if (ue.getUpgrades()[a] < 0 + // && ue.canAcceptUpgrade((byte) ist.getItemDamage()) + // && ue.setUpgrade((byte) ist.getItemDamage())) { + // --ist.stackSize; + // ModLoader.getMinecraftInstance().theWorld.playSoundAtEntity( + // ent, "thaumcraft.upgrade", 0.4F, 1.0F + // ); + // return; + // } + // } + // } + + // super.useItemOnEntity(ist, ent); + //} +} diff --git a/src/main/java/net/anvilcraft/thaummach/render/apparatus/ApparatusRenderingHelper.java b/src/main/java/net/anvilcraft/thaummach/render/apparatus/ApparatusRenderingHelper.java index 135c1fa..8db3247 100644 --- a/src/main/java/net/anvilcraft/thaummach/render/apparatus/ApparatusRenderingHelper.java +++ b/src/main/java/net/anvilcraft/thaummach/render/apparatus/ApparatusRenderingHelper.java @@ -59,185 +59,4 @@ public class ApparatusRenderingHelper { tessellator.draw(); GL11.glTranslatef(0.5F, 0.5F, 0.5F); } - - public static void renderItemIn2D( - Tessellator tes, - float p_78439_1_, - float p_78439_2_, - float p_78439_3_, - float p_78439_4_, - int p_78439_5_, - int p_78439_6_, - float p_78439_7_, - int brightness - ) { - tes.startDrawingQuads(); - tes.setBrightness(brightness); - tes.setNormal(0.0F, 0.0F, 1.0F); - tes.addVertexWithUV(0.0D, 0.0D, 0.0D, (double) p_78439_1_, (double) p_78439_4_); - tes.addVertexWithUV(1.0D, 0.0D, 0.0D, (double) p_78439_3_, (double) p_78439_4_); - tes.addVertexWithUV(1.0D, 1.0D, 0.0D, (double) p_78439_3_, (double) p_78439_2_); - tes.addVertexWithUV(0.0D, 1.0D, 0.0D, (double) p_78439_1_, (double) p_78439_2_); - tes.draw(); - tes.startDrawingQuads(); - tes.setBrightness(brightness); - tes.setNormal(0.0F, 0.0F, -1.0F); - tes.addVertexWithUV( - 0.0D, - 1.0D, - (double) (0.0F - p_78439_7_), - (double) p_78439_1_, - (double) p_78439_2_ - ); - tes.addVertexWithUV( - 1.0D, - 1.0D, - (double) (0.0F - p_78439_7_), - (double) p_78439_3_, - (double) p_78439_2_ - ); - tes.addVertexWithUV( - 1.0D, - 0.0D, - (double) (0.0F - p_78439_7_), - (double) p_78439_3_, - (double) p_78439_4_ - ); - tes.addVertexWithUV( - 0.0D, - 0.0D, - (double) (0.0F - p_78439_7_), - (double) p_78439_1_, - (double) p_78439_4_ - ); - tes.draw(); - float f5 = 0.5F * (p_78439_1_ - p_78439_3_) / (float) p_78439_5_; - float f6 = 0.5F * (p_78439_4_ - p_78439_2_) / (float) p_78439_6_; - tes.startDrawingQuads(); - tes.setBrightness(brightness); - tes.setNormal(-1.0F, 0.0F, 0.0F); - int k; - float f7; - float f8; - - for (k = 0; k < p_78439_5_; ++k) { - f7 = (float) k / (float) p_78439_5_; - f8 = p_78439_1_ + (p_78439_3_ - p_78439_1_) * f7 - f5; - tes.addVertexWithUV( - (double) f7, - 0.0D, - (double) (0.0F - p_78439_7_), - (double) f8, - (double) p_78439_4_ - ); - tes.addVertexWithUV( - (double) f7, 0.0D, 0.0D, (double) f8, (double) p_78439_4_ - ); - tes.addVertexWithUV( - (double) f7, 1.0D, 0.0D, (double) f8, (double) p_78439_2_ - ); - tes.addVertexWithUV( - (double) f7, - 1.0D, - (double) (0.0F - p_78439_7_), - (double) f8, - (double) p_78439_2_ - ); - } - - tes.draw(); - tes.startDrawingQuads(); - tes.setBrightness(brightness); - tes.setNormal(1.0F, 0.0F, 0.0F); - float f9; - - for (k = 0; k < p_78439_5_; ++k) { - f7 = (float) k / (float) p_78439_5_; - f8 = p_78439_1_ + (p_78439_3_ - p_78439_1_) * f7 - f5; - f9 = f7 + 1.0F / (float) p_78439_5_; - tes.addVertexWithUV( - (double) f9, - 1.0D, - (double) (0.0F - p_78439_7_), - (double) f8, - (double) p_78439_2_ - ); - tes.addVertexWithUV( - (double) f9, 1.0D, 0.0D, (double) f8, (double) p_78439_2_ - ); - tes.addVertexWithUV( - (double) f9, 0.0D, 0.0D, (double) f8, (double) p_78439_4_ - ); - tes.addVertexWithUV( - (double) f9, - 0.0D, - (double) (0.0F - p_78439_7_), - (double) f8, - (double) p_78439_4_ - ); - } - - tes.draw(); - tes.startDrawingQuads(); - tes.setBrightness(brightness); - tes.setNormal(0.0F, 1.0F, 0.0F); - - for (k = 0; k < p_78439_6_; ++k) { - f7 = (float) k / (float) p_78439_6_; - f8 = p_78439_4_ + (p_78439_2_ - p_78439_4_) * f7 - f6; - f9 = f7 + 1.0F / (float) p_78439_6_; - tes.addVertexWithUV( - 0.0D, (double) f9, 0.0D, (double) p_78439_1_, (double) f8 - ); - tes.addVertexWithUV( - 1.0D, (double) f9, 0.0D, (double) p_78439_3_, (double) f8 - ); - tes.addVertexWithUV( - 1.0D, - (double) f9, - (double) (0.0F - p_78439_7_), - (double) p_78439_3_, - (double) f8 - ); - tes.addVertexWithUV( - 0.0D, - (double) f9, - (double) (0.0F - p_78439_7_), - (double) p_78439_1_, - (double) f8 - ); - } - - tes.draw(); - tes.startDrawingQuads(); - tes.setBrightness(brightness); - tes.setNormal(0.0F, -1.0F, 0.0F); - - for (k = 0; k < p_78439_6_; ++k) { - f7 = (float) k / (float) p_78439_6_; - f8 = p_78439_4_ + (p_78439_2_ - p_78439_4_) * f7 - f6; - tes.addVertexWithUV( - 1.0D, (double) f7, 0.0D, (double) p_78439_3_, (double) f8 - ); - tes.addVertexWithUV( - 0.0D, (double) f7, 0.0D, (double) p_78439_1_, (double) f8 - ); - tes.addVertexWithUV( - 0.0D, - (double) f7, - (double) (0.0F - p_78439_7_), - (double) p_78439_1_, - (double) f8 - ); - tes.addVertexWithUV( - 1.0D, - (double) f7, - (double) (0.0F - p_78439_7_), - (double) p_78439_3_, - (double) f8 - ); - } - - tes.draw(); - } } diff --git a/src/main/java/net/anvilcraft/thaummach/render/tile/TileBoreRenderer.java b/src/main/java/net/anvilcraft/thaummach/render/tile/TileBoreRenderer.java index 0f0d388..f2dea59 100644 --- a/src/main/java/net/anvilcraft/thaummach/render/tile/TileBoreRenderer.java +++ b/src/main/java/net/anvilcraft/thaummach/render/tile/TileBoreRenderer.java @@ -1,7 +1,7 @@ package net.anvilcraft.thaummach.render.tile; -import net.anvilcraft.thaummach.render.apparatus.ApparatusRenderingHelper; import net.anvilcraft.thaummach.tiles.TileBore; +import net.anvilcraft.thaummach.utils.UtilsFX; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.Tessellator; import net.minecraft.client.renderer.texture.TextureMap; @@ -50,7 +50,7 @@ public class TileBoreRenderer extends TileEntitySpecialRenderer { if (cr.boreItemStacks[0] != null) { mc.renderEngine.bindTexture(TextureMap.locationItemsTexture); IIcon icon = cr.boreItemStacks[0].getIconIndex(); - ApparatusRenderingHelper.renderItemIn2D( + UtilsFX.renderItemIn2D( Tessellator.instance, icon.getMaxU(), icon.getMinV(), diff --git a/src/main/java/net/anvilcraft/thaummach/tiles/TileCrucible.java b/src/main/java/net/anvilcraft/thaummach/tiles/TileCrucible.java index b84b2d7..1f3b288 100644 --- a/src/main/java/net/anvilcraft/thaummach/tiles/TileCrucible.java +++ b/src/main/java/net/anvilcraft/thaummach/tiles/TileCrucible.java @@ -308,7 +308,7 @@ public class TileCrucible extends TileEntity implements IConnection { (double) ((float) super.xCoord + 0.5F), (double) ((float) super.yCoord + 0.5F), (double) ((float) super.zCoord + 0.5F), - "thaumcraft.bubbling", + "thaumcraft:bubble", 0.25F, 0.9F + super.worldObj.rand.nextFloat() * 0.2F ); diff --git a/src/main/java/net/anvilcraft/thaummach/tiles/TileCrystallizer.java b/src/main/java/net/anvilcraft/thaummach/tiles/TileCrystallizer.java index 923b064..8572348 100644 --- a/src/main/java/net/anvilcraft/thaummach/tiles/TileCrystallizer.java +++ b/src/main/java/net/anvilcraft/thaummach/tiles/TileCrystallizer.java @@ -1,22 +1,30 @@ package net.anvilcraft.thaummach.tiles; +import java.util.HashMap; +import java.util.Map; import java.util.stream.IntStream; import dev.tilera.auracore.api.machine.IUpgradable; import dev.tilera.auracore.api.machine.TileVisUser; import dev.tilera.auracore.aura.AuraManager; +import net.anvilcraft.thaummach.GuiID; +import net.anvilcraft.thaummach.ITileGui; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.ISidedInventory; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; +import net.minecraft.network.NetworkManager; +import net.minecraft.network.Packet; +import net.minecraft.network.play.server.S35PacketUpdateTileEntity; import net.minecraftforge.common.util.ForgeDirection; import thaumcraft.api.aspects.Aspect; import thaumcraft.api.aspects.AspectList; import thaumcraft.common.config.ConfigItems; +import thaumcraft.common.lib.world.biomes.BiomeHandler; public class TileCrystallizer - extends TileVisUser implements ISidedInventory, IUpgradable { + extends TileVisUser implements ISidedInventory, IUpgradable, ITileGui { private ItemStack[] crystalizerItemStacks = new ItemStack[10]; public float crystalTime = 0.0F; public float maxTime = 30.0F; @@ -25,10 +33,23 @@ public class TileCrystallizer private byte[] upgrades = new byte[] { -1 }; int boostDelay = 20; - // TODO: GUIs - //public GuiScreen getGui(EntityPlayer player) { - // return new GuiCrystalizer(player.inventory, this); - //} + private static Map CRYSTAL_MAP = new HashMap<>(); + + static { + CRYSTAL_MAP.put(Aspect.AIR, 0); + CRYSTAL_MAP.put(Aspect.FIRE, 1); + CRYSTAL_MAP.put(Aspect.WATER, 2); + CRYSTAL_MAP.put(Aspect.EARTH, 3); + CRYSTAL_MAP.put(Aspect.MAGIC, 4); + CRYSTAL_MAP.put(Aspect.ORDER, 4); + CRYSTAL_MAP.put(Aspect.TAINT, 5); + CRYSTAL_MAP.put(Aspect.ENTROPY, 5); + } + + @Override + public GuiID getGuiID() { + return GuiID.CRYSTALLIZER; + } @Override public int getSizeInventory() { @@ -138,6 +159,7 @@ public class TileCrystallizer + (this.hasUpgrade((byte) 0) ? 0.025F : 0.0F); this.sucked = this.getAvailablePureVis(sa); this.crystalTime -= this.sucked; + this.worldObj.markBlockForUpdate(this.xCoord, this.yCoord, this.zCoord); } else { this.sucked = 0.0F; } @@ -159,13 +181,25 @@ public class TileCrystallizer if (this.crystalTime < 0.0F && this.crystalizerItemStacks[6] != null && this.crystalizerItemStacks[6].getItem() == ConfigItems.itemShard) { - // TODO: WTF - //this.addCrystal(ThaumCraftCore.getCrystalByBiome( - // super.worldObj, - // super.xCoord, - // super.zCoord, - // this.hasUpgrade((byte) 3) ? 3 : 0 - //)); + + int rand = this.worldObj.rand.nextInt(11); + + int crystalN = -1; + + if (rand > 5) { + Aspect biomeAspect = BiomeHandler.getRandomBiomeTag( + this.worldObj.getBiomeGenForCoords(this.xCoord, this.zCoord) + .biomeID, + this.worldObj.rand + ); + + crystalN = CRYSTAL_MAP.getOrDefault(biomeAspect, -1); + } + + if (crystalN == -1) + crystalN = rand % 6; + + this.addCrystal(crystalN); this.crystalTime = 0.0F; AuraManager.addFluxToClosest( this.worldObj, @@ -174,14 +208,13 @@ public class TileCrystallizer this.zCoord, new AspectList().add(Aspect.CRYSTAL, 5) ); + + this.markDirty(); } - if (this.crystalTime == 0.0F && this.crystalizerItemStacks[6] != null + if (this.crystalTime <= 0.0F && this.crystalizerItemStacks[6] != null && this.crystalizerItemStacks[6].getItem() == ConfigItems.itemShard) { - if (this.crystalizerItemStacks[6].isItemEqual( - // TODO: definetely wrong meta - new ItemStack(ConfigItems.itemShard, 1, 6) - )) { + if (this.crystalizerItemStacks[6].getItemDamage() == 8) { this.crystalTime = this.maxTime; } else { this.crystalTime = this.maxTime * 2.0F / 3.0F; @@ -212,7 +245,25 @@ public class TileCrystallizer } private void addCrystal(int type) { - ItemStack itemstack = new ItemStack(ConfigItems.itemShard, 1, type); + int meta = -1; + switch (type) { + case 0: + case 1: + case 2: + case 3: + meta = type; + break; + + case 4: + meta = 7; + break; + + case 5: + meta = 9; + break; + } + + ItemStack itemstack = new ItemStack(ConfigItems.itemShard, 1, meta); if (this.crystalizerItemStacks[type] == null) { this.crystalizerItemStacks[type] = itemstack.copy(); } else if (this.crystalizerItemStacks[type].isItemEqual(itemstack) && this.crystalizerItemStacks[type].stackSize < itemstack.getMaxStackSize()) { @@ -358,4 +409,28 @@ public class TileCrystallizer // TODO: WTF return true; } + + @Override + public Packet getDescriptionPacket() { + NBTTagCompound nbt = new NBTTagCompound(); + + nbt.setFloat("crystalTime", this.crystalTime); + nbt.setFloat("maxTime", this.maxTime); + nbt.setInteger("boost", this.boost); + nbt.setByteArray("upgrades", this.upgrades); + + return new S35PacketUpdateTileEntity( + this.xCoord, this.yCoord, this.zCoord, this.getBlockMetadata(), nbt + ); + } + + @Override + public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity pkt) { + NBTTagCompound nbt = pkt.func_148857_g(); + + this.crystalTime = nbt.getFloat("crystalTime"); + this.maxTime = nbt.getFloat("maxTime"); + this.boost = nbt.getInteger("boost"); + this.upgrades = nbt.getByteArray("upgrades"); + } } diff --git a/src/main/resources/assets/thaummach/lang/en_US.lang b/src/main/resources/assets/thaummach/lang/en_US.lang index 314e78a..f02a949 100644 --- a/src/main/resources/assets/thaummach/lang/en_US.lang +++ b/src/main/resources/assets/thaummach/lang/en_US.lang @@ -39,6 +39,14 @@ item.thaummach:focus_2.name=Arcane Focus: Water item.thaummach:focus_3.name=Arcane Focus: Earth item.thaummach:focus_4.name=Arcane Focus: Fire +item.thaummach:upgrade_0.name=Quicksilver Core +item.thaummach:upgrade_1.name=Stabilized Singularity +item.thaummach:upgrade_2.name=Harnessed Rage +item.thaummach:upgrade_3.name=Concentrated Evil +item.thaummach:upgrade_4.name=Infinite Sadness +item.thaummach:upgrade_5.name=Contained Emptiness +item.thaummach:upgrade_6.name=Collected Wisdom + item.thaummach:singularity.name=Arcane Singularity item.thaummach:crystalline_bell.name=Crystalline Bell diff --git a/src/main/resources/assets/thaummach/sounds.json b/src/main/resources/assets/thaummach/sounds.json index 9050da7..e9a2f84 100644 --- a/src/main/resources/assets/thaummach/sounds.json +++ b/src/main/resources/assets/thaummach/sounds.json @@ -43,5 +43,14 @@ "stream": false } ] + }, + "upgrade": { + "category": "master", + "sounds": [ + { + "name": "upgrade", + "stream": false + } + ] } } diff --git a/src/main/resources/assets/thaummach/sounds/upgrade.ogg b/src/main/resources/assets/thaummach/sounds/upgrade.ogg new file mode 100644 index 0000000000000000000000000000000000000000..ec83c85f8ecbe1ddfaf49aedd908948b79dbffb5 GIT binary patch literal 14824 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/thaummach/textures/items/upgrade_0.png b/src/main/resources/assets/thaummach/textures/items/upgrade_0.png new file mode 100644 index 0000000000000000000000000000000000000000..712eb41a00fbb3eca81202ba162345d56bb9cfdc GIT binary patch literal 765 zcmVPp-S`5OiTL5p-{+E8q*5HSyxM2V?MuEd(h zjh)Ung-F*9%;nB7-RwxuuDwS|^a|6HMkFl{aNRkA*-43(a zj8rOxy}dmIgFyrW0eHP$Y;A2x0^t1o9P8`rqIhFt1NC|xdc7Xg)6;OdTsS>FMLwU0 z)oR7&=B5BxSy_2xaB*<~VnDahf4kjAJRTQo0xFlws8lL2nM_C|66o*m7iVZltf8+4*JC>K11rr)N`jAORqY*Zn4GzVLiE$4O4zkGQTVQ`Q)YS@{P7C__ z7-!YWEHf(1Kzv!KRpCFdES5bi|90sXYLT#e(bW zYvFe3s*GQ?7G8~8QM^*2b!GTp2DqFCn$0e%)haG8FGWocAeYMt8D!$u^fx#ic6|Ks z4hwIhxYuM9@(0-2`Glh%N9cCD*xlX5$jHd!GY$<6F*1?@mC0ltgWrFbUH1Xhhj>5lzUCn vcp3)WP)Cz+V2`IunR zd|0E<5Yh(IPy|a?P3@wKfXkLHTu7l(gwU>pZW*Az3B$v~ z7#bRaAPA6U8G5}QJ3Bkr*w}#I?}yjxh1>1M;^Lyf0Wz5kVzC&1JU2Ioa=8pq6cG#t z(cj;XgM$MklSvqjMl38WaDeIQ=?;TzHVa}vf1$miC|Frp;W+^v9UY-qEJCN#VRdyC z8jXhEp%6%efq?-=bkEMt(B0k5*S~rfe2!c2wwiD&70jRhK(%^~cDoIm%?6*(ht17R z;R>OI!(kW<29BuJYT+9U;mM0vc)9!r6CdXhmqolAwWGJ!$nR9ERlX=Vz}VOrCMPFh zwOUnrGBg$oM(>4jbI^vLnG?v83!b|TyuU4SO`_2##>dAy8jwgXmkVaI8TBp$Bz6Dw z(-(Zs?;*FB!h|Uad&q#U%sH+WufyZ-ol^l1Wr#y z6bgk4%{ai};UO=Bx+5hjot-w??RG{& zlA-qZ_tDd%$6JpRH=g=o>dT^7C?gy@L8VgRUXUb-ccIm43B2}DD8y6-ERjeswZAkR z%wn-H)wXP8WQ3{8^D|mx`?a+-76=3wz2zkk9daVg0C}BCAx4xt91f(@X)G-*@h(Lo z5k4nm=Zg|%XJ=VF9_PbDHl;K2eY4qA&C|;%lf`Sb8n-s(1VFdAI4u_#A3fyit ztX3=1=`?nCcQH9RiAW@Zv9U3%t*t2xaB^~j<>h5gURhbe#l;1TMkA)Crr_~-aCCHp zd_E7S(}~s9RR&mGTzp_qEEYiw=oQ*`Ivs3nZSk3a&d$zItyW<+o3XvU4U@^lcPJFn zAQ%h^qT6gXVX;^^>DA>W42p`N-Hx_AfBRd8s;cPs`|x_bh(@DGrBd>SjM>>)*ladN zB;+Tx8bY3@_&7I*Pw(I1#jqW39S-@j#&=q+7Oz1Gi9~`CH#Ro#y4^wVrj2Z~j-bhi z;_WS3r6OKxW?U&!FR97G!U8iH0FX$5Kmab63&Yjl(EB}DWnx*@D|&sXa$o6m;g)4~ zMn@3}g|NTB{{T=bl|Wh${fSW@EM5=3?xkV9x<*aD)VRCD2ZMr^1o+H#fOU^YimOCuHY=2FYYnWHK2Z9;%W4k?(a~ xhg~{xXlRHn-fp+qrF13$8Ybnj!fhejWEHX%{1JgdARtMiC4KaddPfX$j@>@)G;|`&@i*Z~#S7pw()TOeW#+cyMuXfo8J_yWNh% z!$Stx-Q8sd3~+UI1!6#dq5W(&!^z1Bs?{n3jYcE%`+XRVMx36WLZ{R5H~f%<6&(=@ zg@nao5pK6zMC2D_%zsO-HwcYJ!+WpSE7Iw-pxQM8$z(Dxo6Ua_fo7}m$gKH%2AkE! z``g=FUaEvtDuu1BEffj`_QPUyBjAjqt9-+F+E+o8k;0zjayi`J-}4Dv_{hlM#RR7RR4IU^1DY)9I+5F+iiyU>U>V5RMIj z;iQ8d`8}+b4K`J|>!IHLgf+u2ESC=`m&*tQ0{@ce^Z5iBNe0&Ib?CHuIE^o1HEmL# zq5SM(^3cI}e8*WJzsQ5-aw%~Rwzs#%ih(#kKNqWRaIc+Cr&vW=#9}eAa$d~?#lBQ3 zi9{m7IbaDyhmuG$Kv^d##E8y*zaQ;(8^vOgJCMz0c}^(Ks)W70J#lt+#=}D~r8~;~ xVzGeLYGuk4@#%ER(WWy2&@f3)9p~Qy3;?OAD?=IrIL!b6002ovPDHLkV1mi5L~#HB literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/thaummach/textures/items/upgrade_4.png b/src/main/resources/assets/thaummach/textures/items/upgrade_4.png new file mode 100644 index 0000000000000000000000000000000000000000..81623fa8b4b63cd0c173d988cf84dbc325540c88 GIT binary patch literal 774 zcmV+h1Nr=kP)c=uf#HxuUU-Vk05j@EV(F^O4!@mYv>^W>2zAk zI6ORr)oR7JS1)mG@D^?auAuW~Km6DG5r4ZV_MM%bVP$0n9*^grjcm)<*chq7A=PWL zx}0?HS(Kg^^7P_Qksici=TIu1%p8WkP?^ltJPq!Sj1wEI19|t=5GezW>PNN&VL0M00lTnI|V(JEdT%j07*qoM6N<$ Ef?vp9bN~PV literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/thaummach/textures/items/upgrade_5.png b/src/main/resources/assets/thaummach/textures/items/upgrade_5.png new file mode 100644 index 0000000000000000000000000000000000000000..231a3b940f34276af4ee272ad17203ebc580c5f5 GIT binary patch literal 768 zcmV+b1ONPqP)}q>Dfsp*_q7u_PzJLk8#fNl*I^OadDC7ayguzpQBtZV{B{;fj|I^F=(0whr@y0 z-Cb;NZzCKIBNz-~WMl+uYimp*lzcvq<>h5jyt1+aUDqK=5+acZTrL-mkB^bfW}zqw zR##UAz{0|UU?2brg#w5H{e`|8jRq2l1X8J#0J^)oL$O#yZ*MO)H#cFk*~FW!gwfGa zPIPZ?Zz0Pv2HdYv>zjeBy+W(;fZFK+jM5LZs=v@~x8ZiX5ekK{v$Ml2gc6Iz;B-3w zy5b1I_Vy!&C+E;pJ3t@1L}2b6hTeR_z_X}$QmItL?n;P8qXKb#eI3@hIMnbsuD>T> zRIRXBE^)7agKPRd>W(<9#u4K2xL`s{Fd&occDtajO^>5z*a~h}P|7BuUtK{`yl7T_ z!lHSgsw(_`|Njim&dxwykTGuA3Y&$Yd4Gx?rx&v7LgRM{>Wd&av*DrH6dfT`y9`MG z&CQK)yS#sdM=nEh4tEMn7}psXdJfF`6174e^?Dr_7Z+X61cOW_BVVd1j^(Gn35BZEdy=6 z0zLB;_2RzB0{KNAn5M~u_SxB4-eJHG4-a{#8#EkzaBz@!BF!fzCU_@};*K`OKABAN zsi`SWwL${Xp(N4_P}WHbF`~2A>&3~*2{tx1LQ=f#{*oVya1mX`S5-kum9iYeVu y?pv)E`uqC@Ws10A7$VwqCIA{H_SA9yBftR17ec?G-Bf7+0000WQ540`zyKnVZ^1yJ zRb$Z7&`{eAi^hdz)1>?XU6FKW8WZAG7^CoZ3ocFuuNe5C{aYxw$E^z}eXu*4Nkh<4h)lMxy~)mJy9c;qiD- zC=_sVasr#phK-F47FbzXxp7b`l|T;YFZ6tUeT|)+9qjM#vrx0yM73JQ*w`4d*(?kO z1Mi_B5rbebD9Em&C@`DNu-omZ)oK_HhdlfJKHq5%-MwBf78Vw;x3?$hNM(6>85WC$ z6;)Nmq_K||5g$IheughwDXcwzfcrt`Xiuxv;z@%AVzC&K$t2uvH^TQ^`1t-U5|1=c za}Uv})G+7sApPno?zoK1B$Y}b9*^G$5G0ey#P;93jN{YRJ9uMHaD{&`hyAcT4xu^e zMI`2j!{Na6^z_I9LoAoeAQl8h>9z1pTU&npK&|o{h3*wpoetK!4h+;Ddc7W3grJTD z=xmplmrVQf*YEh*?!c{7(APGXl)sQndid)y>cu8HogpqRE=D}K3QJ2%f{szCRA9AQ z5%8H%Q`)c_br?<>ARBa$+e7@R3iMPNMxzmazaNK(hY|}+O-%^`Nr5^#I)YBKtk>(g z-d3A{UMpR@qoUsIau$deF&GR65}$o>agiK|IGs+RMOw_y&kKz_zoSX9 z&*gF=5{U@=j%e-k`EYuAitX)fu0SG@;69-^j~JxWX>o9Hz)2(9 z^p0{*37nXiV9ONoZnw+PrZovrGfB5?=l=o>0C9mrW2yKb`~Uy|07*qoM6N<$f;U`b A;{X5v literal 0 HcmV?d00001