Jump to content

Inventory Listener


Recommended Posts

Posted (edited)

I wasn't happy with existing Inventory Listener snippets here so I converted one over from elsewhere. 

import org.osbot.rs07.api.Client;
import org.osbot.rs07.api.model.Item;
import org.osbot.rs07.script.Script;
import org.osbot.rs07.utility.Condition;

import java.util.ArrayList;
import java.util.HashMap;

public class InventoryObserver extends Thread {
    private ArrayList<InventoryListener> listeners;
    private Condition condition;

    private Script theScript;
    private Client client;
    public InventoryObserver(Condition condition, Script script) {
        this.listeners = new ArrayList<>();
        this.condition = condition;
        this.theScript = script;
        this.client = script.client;
    }

    @[member=Override]
    public void run() {
        while (!client.isLoggedIn()) {
            try {
                theScript.sleep(500);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        HashMap<Integer, Integer> map = inventoryHashMap();
        while (true) {
            try {
                theScript.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            if (!client.isLoggedIn())
                continue;
            if (!condition.evaluate()) {
                map = inventoryHashMap();
                continue;
            }
            HashMap<Integer, Integer> updatedMap = inventoryHashMap();
            for (Integer i : updatedMap.keySet()) {
                int countInitial = map.containsKey(i) ? map.get(i) : 0, countFinal = updatedMap.get(i);
                if (countFinal > countInitial) {
                    addTrigger(i, countFinal - countInitial);
                } else if (countFinal < countInitial) {
                    subtractedTrigger(i, countInitial - countFinal);
                }
                map.remove(i);
            }
            for (Integer i : map.keySet())
                if (!updatedMap.containsKey(i))
                    subtractedTrigger(i, map.get(i));
            map = updatedMap;
        }
    }

    public HashMap<Integer, Integer> inventoryHashMap() {
        HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
        for (Item item : theScript.inventory.getItems()) {
            if(item != null) {
                map.put(item.getId(), Integer.valueOf((int) theScript.inventory.getAmount(item.getId())));
            }
        }
        return map;
    }

    public void addListener(InventoryListener inventoryListener) {
        listeners.add(inventoryListener);
    }

    public void addTrigger(int id, int count) {
        for (InventoryListener l : listeners)
            l.inventoryItemGained(id, count);
    }

    public void subtractedTrigger(int id, int count) {
        for (InventoryListener l : listeners)
            l.inventoryItemLost(id, count);
    }
}

public interface InventoryListener {
    void inventoryItemGained(int id, int count);

    void inventoryItemLost(int id, int count);
}

Usage: Implement InventoryListener in your main class, and implement the methods your IDE suggested. In your onStart method, declare a new InventoryObserver object, including the condition under which you want the observer to run (i.e. make it not run while a bank is open). From there, call addListener(this) on your object and then call .start() on it. From there it should be fairly straight-forward to use.

Edited by Night
  • Like 1
Posted

Feel free to modify it.

 

Okay. Gimme a few minutes

I don't want to spoon feed everything, but this should be a good basis.

Also note that this class extends the API so you wont have to use script.client or script.inventory.

 

The thread will automatically stop after a script has stopped. 

import org.osbot.rs07.Bot;
import org.osbot.rs07.script.API;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by Xerion on 16-1-2017.
 */
public class InventoryObserver extends API {

    private List<InventoryListener> listeners = new ArrayList<>();    

    /**
     *
     * @param bot
     */
    public InventoryObserver(Bot bot){
        this.exchangeContext(bot);
        new Thread(() -> {
            logger.debug("Started: InventoryWatcher");
            while (isRunning()) {
                try {
                    sleep(loop());
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            logger.debug("Stopped: InventoryWatcher");
        }).start();
    }

    @[member=Override]
    public void initializeModule() {

    }

    /**
     *
     * @[member=Return]
     */
    private int loop(){
        /**
         * Add your code here to check if item is added/removed
         */
        return 100;
    }

    /**
     *
     * @[member=Return] True if a script is running
     */
    private boolean isRunning(){
        return bot.getScriptExecutor().getCurrent() != null;
    }
    
    /**
     *
     * @param listener
     */
    public void addListener(InventoryListener listener) {
        listeners.add(listener);
    }

    /**
     *
     * @param listener
     */
    public void removeListener(InventoryListener listener) {
        if(listener != null && listeners.contains(listener)) {
            listeners.remove(listener);
        }
    }
}
 
  • Like 6

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...