package codechicken.nei; import codechicken.lib.render.CCRenderState; import net.minecraft.client.gui.Gui; import net.minecraft.client.renderer.GlStateManager; import net.minecraft.enchantment.Enchantment; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.inventory.ContainerEnchantment; import net.minecraft.inventory.IInventory; import net.minecraft.inventory.Slot; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagList; import net.minecraft.util.BlockPos; import net.minecraft.world.World; import java.util.ArrayList; /** * This is crap code, don't ever do this. */ public class ContainerEnchantmentModifier extends ContainerEnchantment { public static class EnchantmentHash { public EnchantmentHash(Enchantment e, int i, int l) { enchantment = e; state = i; level = l; } Enchantment enchantment; int state; int level; } public ArrayList<EnchantmentHash> slotEnchantment = new ArrayList<EnchantmentHash>(); int level = 5; public int scrollclicky = -1; public float scrollpercent; public int scrollmousey; public float percentscrolled; public int relx = 60; public int rely = 14; public int height = 57; public int cwidth = 101; public int slotheight = 19; public GuiEnchantmentModifier parentscreen; public ContainerEnchantmentModifier(InventoryPlayer inventoryplayer, World world) { super(inventoryplayer, world, new BlockPos(0, 0, 0)); } public int getNumSlots() { return slotEnchantment.size(); } public int getScrollBarHeight() { int sbarh = (int) ((height / (float) getContentHeight()) * height); if (sbarh > height) { return height; } else if (sbarh < height / 15) { return height / 15; } else { return sbarh; } } public int getScrollBarWidth() { return 7; } public int getContentHeight() { return slotheight * getNumSlots(); } public int getScrolledSlots() { int slots = getNumSlots(); int shownslots = height / slotheight; return (int) (percentscrolled * (slots - shownslots) + 0.5F); } private int getClickedSlot(int mousey) { return ((mousey - rely) / slotheight) + getScrolledSlots(); } public void calculatePercentScrolled() { int barempty = height - getScrollBarHeight(); if (scrollclicky >= 0) { int scrolldiff = scrollmousey - scrollclicky; percentscrolled = scrolldiff / (float) barempty + scrollpercent; } if (percentscrolled < 0) { percentscrolled = 0; } if (percentscrolled > 1) { percentscrolled = 1; } int sbary = rely + (int) (barempty * percentscrolled + 0.5); percentscrolled = (sbary - rely) / (float) barempty; } public boolean clickScrollBar(int mousex, int mousey, int button) { mousex -= parentscreen.guiLeft; mousey -= parentscreen.guiTop; int barempty = height - getScrollBarHeight(); int sbary = rely + (int) (barempty * percentscrolled + 0.5); if (button == 0 && getScrollBarHeight() < height && //the scroll bar can move (not full length) mousex >= relx + cwidth && mousex < relx + cwidth + getScrollBarWidth() && mousey >= rely && mousey < rely + height)//in the scroll pane { if (mousey < sbary) { percentscrolled = (mousey - rely) / (float) barempty; calculatePercentScrolled(); } else if (mousey > sbary + getScrollBarHeight()) { percentscrolled = (mousey - rely - getScrollBarHeight() + 1) / (float) barempty; calculatePercentScrolled(); } else { scrollclicky = mousey; scrollpercent = percentscrolled; scrollmousey = mousey; } return true; } return false; } public void mouseUp(int mousex, int mousey, int button) { if (scrollclicky >= 0 && button == 0)//we were scrolling and we released mouse { scrollclicky = -1; } } public boolean clickButton(int mousex, int mousey, int button) { mousex -= parentscreen.guiLeft; mousey -= parentscreen.guiTop; if (mousex >= relx && mousex < relx + cwidth && mousey >= rely && mousey <= rely + height)//in the box { int slot = getClickedSlot(mousey); if (slot >= getNumSlots()) { return false; } toggleSlotEnchantment(slot); return true; } return false; } private void toggleSlotEnchantment(int slot) { EnchantmentHash e = slotEnchantment.get(slot); if (e.state == 2) { NEICPH.sendModifyEnchantment(e.enchantment.effectId, 0, false); e.state = 0; } else if (e.state == 1) { return; } else { NEICPH.sendModifyEnchantment(e.enchantment.effectId, level, true); e.state = 2; } updateEnchantmentOptions(GuiEnchantmentModifier.validateEnchantments()); } public boolean addEnchantment(int e, int level) { if (e < Enchantment.enchantmentsList.length && Enchantment.enchantmentsList[e] != null) { ((Slot) inventorySlots.get(0)).getStack().addEnchantment(Enchantment.enchantmentsList[e], level); return true; } return false; } public void removeEnchantment(int e) { ItemStack stack = ((Slot) inventorySlots.get(0)).getStack(); NBTTagList nbttaglist = stack.getEnchantmentTagList(); if (nbttaglist != null) { for (int i = 0; i < nbttaglist.tagCount(); i++) { int ID = nbttaglist.getCompoundTagAt(i).getShort("id"); if (ID == e) { nbttaglist.removeTag(i); if (nbttaglist.tagCount() == 0) { stack.getTagCompound().removeTag("ench"); } if (stack.getTagCompound().hasNoTags()) { stack.setTagCompound(null); } return; } } } } public boolean canInteractWith(EntityPlayer entityplayer) { return true; } public void onCraftMatrixChanged(IInventory iinventory) { if (parentscreen != null) { updateEnchantmentOptions(GuiEnchantmentModifier.validateEnchantments()); } } public void updateEnchantmentOptions(boolean validate) { int numoptions = slotEnchantment.size(); slotEnchantment.clear(); ItemStack toolstack = getSlot(0).getStack(); if (toolstack == null) { percentscrolled = 0; return; } Item item = toolstack.getItem(); int enchantablity = item.getItemEnchantability(); if (enchantablity == 0 && validate) { percentscrolled = 0; return; } for (Enchantment e : Enchantment.enchantmentsList) { if (e == null || e.type == null || (!e.type.canEnchantItem(item) && validate)) { continue; } int state = 0; int level = -1; if (NEIServerUtils.stackHasEnchantment(toolstack, e.effectId)) { state = 2; level = NEIServerUtils.getEnchantmentLevel(toolstack, e.effectId); } else if (NEIServerUtils.doesEnchantmentConflict(NEIServerUtils.getEnchantments(toolstack), e) && validate) { state = 1; } slotEnchantment.add(new EnchantmentHash(e, state, level)); } if (numoptions != slotEnchantment.size()) { percentscrolled = 0; } } public void drawSlots(GuiEnchantmentModifier gui) { for (int slot = 0; slot < 3; slot++) { int shade = 0; String text = ""; int containerslot = slot + getScrolledSlots(); if (containerslot + 1 > slotEnchantment.size()) { shade = 1; } else { EnchantmentHash e = slotEnchantment.get(containerslot); shade = e.state; text = e.enchantment.getTranslatedName(e.level == -1 ? level : e.level); if (gui.mc.fontRendererObj.getStringWidth(text) > 95 && text.contains("Projectile")) { text = text.replace("Projectile", "Proj"); } if (gui.mc.fontRendererObj.getStringWidth(text) > 95 && text.contains("Protection")) { text = text.replace("Protection", "Protect"); } if (gui.mc.fontRendererObj.getStringWidth(text) > 95 && text.contains("Bane of")) { text = text.replace("Bane of ", ""); } } CCRenderState.changeTexture("textures/gui/container/enchanting_table.png"); GlStateManager.color(1, 1, 1); if (hasScrollBar()) { gui.drawTexturedModalRect(relx, rely + slot * slotheight, 0, gui.ySize + slotheight * shade, cwidth - 30, slotheight); gui.drawTexturedModalRect(relx + cwidth - 30, rely + slot * slotheight, cwidth - 23, gui.ySize + slotheight * shade, 30, slotheight); } else { gui.drawTexturedModalRect(relx, rely + slot * slotheight, 0, gui.ySize + slotheight * shade, cwidth + 7, slotheight); } gui.getFontRenderer().drawString(text, relx + 4, rely + slot * slotheight + 5, textColourFromState(shade)); } } private boolean hasScrollBar() { return getNumSlots() > 3; } public void drawScrollBar(GuiEnchantmentModifier gui) { if (!hasScrollBar()) { return; } int sbary = rely + (int) ((height - getScrollBarHeight()) * percentscrolled + 0.5); int sbarx = relx + cwidth; Gui.drawRect(sbarx, rely, sbarx + getScrollBarWidth(), rely + height, 0xFF202020);//background Gui.drawRect(sbarx, sbary, sbarx + getScrollBarWidth(), sbary + getScrollBarHeight(), 0xFF8B8B8B);//corners Gui.drawRect(sbarx, sbary, sbarx + getScrollBarWidth() - 1, sbary + getScrollBarHeight() - 1, 0xFFF0F0F0);//topleft up Gui.drawRect(sbarx + 1, sbary + 1, sbarx + getScrollBarWidth() - 1, sbary + getScrollBarHeight() - 1, 0xFF555555);//bottom right down Gui.drawRect(sbarx + 1, sbary + 1, sbarx + getScrollBarWidth() - 2, sbary + getScrollBarHeight() - 2, 0xFFC6C6C6);//scrollbar } private int textColourFromState(int shade) { switch (shade) { case 0: return 0x685e4a; case 1: return 0x407f10; default: return 0xffff80; } } public void onUpdate(int mousex, int mousey) { processScrollMouse(mousey); } public void processScrollMouse(int mousey) { mousey -= parentscreen.guiTop; if (scrollclicky >= 0) { int scrolldiff = mousey - scrollclicky; int barupallowed = (int) ((height - getScrollBarHeight()) * scrollpercent + 0.5); int bardownallowed = (height - getScrollBarHeight()) - barupallowed; if (-scrolldiff > barupallowed) { scrollmousey = scrollclicky - barupallowed; } else if (scrolldiff > bardownallowed) { scrollmousey = scrollclicky + bardownallowed; } else { scrollmousey = mousey; } calculatePercentScrolled(); } } }