/** * To be called everytime a stack has been picked up. Moves the picked up item in another slot * that matches best the current configuration. */ public void onItemPickup() { if (!cfgManager.makeSureConfigurationIsLoaded()) { return; } InvTweaksConfig config = cfgManager.getConfig(); // Handle option to disable this feature if (cfgManager .getConfig() .getProperty(InvTweaksConfig.PROP_ENABLE_SORTING_ON_PICKUP) .equals("false")) { return; } try { InvTweaksContainerSectionManager containerMgr = new InvTweaksContainerSectionManager(mc, InvTweaksContainerSection.INVENTORY); // Find stack slot (look in hotbar only). // We're looking for a brand new stack in the hotbar // (not an existing stack whose amount has been increased) int currentSlot = -1; for (int i = 0; i < InvTweaksConst.INVENTORY_HOTBAR_SIZE; i++) { rj currentHotbarStack = containerMgr.getItemStack(i + 27); // Don't move already started stacks if (currentHotbarStack != null && getAnimationsToGo(currentHotbarStack) == 5 && hotbarClone[i] == null) { currentSlot = i + 27; } } if (currentSlot != -1) { itemPickupPending = false; // Find preffered slots List<Integer> prefferedPositions = new LinkedList<Integer>(); InvTweaksItemTree tree = config.getTree(); rj stack = containerMgr.getItemStack(currentSlot); List<InvTweaksItemTreeItem> items = tree.getItems(getItemID(stack), getItemDamage(stack)); for (InvTweaksConfigSortingRule rule : config.getRules()) { if (tree.matches(items, rule.getKeyword())) { for (int slot : rule.getPreferredSlots()) { prefferedPositions.add(slot); } } } // Find best slot for stack boolean hasToBeMoved = true; if (prefferedPositions != null) { for (int newSlot : prefferedPositions) { try { // Already in the best slot! if (newSlot == currentSlot) { hasToBeMoved = false; break; } // Is the slot available? else if (containerMgr.getItemStack(newSlot) == null) { // TODO: Check rule level before to move if (containerMgr.move(currentSlot, newSlot)) { break; } } } catch (TimeoutException e) { logInGameError("Failed to move picked up stack", e); } } } // Else, put the slot anywhere if (hasToBeMoved) { for (int i = 0; i < containerMgr.getSize(); i++) { if (containerMgr.getItemStack(i) == null) { if (containerMgr.move(currentSlot, i)) { break; } } } } } } catch (Exception e) { logInGameError("Failed to move picked up stack", e); } }