Jump to content
View in the app

A better way to browse. Learn more.

OSBot :: 2007 OSRS Botting

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Model Convexhaulgorithm

Featured Replies

This algorithm will extract the bounding points of a given Entities model. This could be used for a more precise interacting, Triangulation, Notification, and just plain looking cool. :^)

Disclaimers: The utilities methods for model to points is not working perfectly right now, and it'll cause some weird issues, but its stable.


Example:

ss%20%282013-04-14%20at%2006.37.00%29.jpg

The Code:

import org.osbot.script.Script;import org.osbot.script.ScriptManifest;import org.osbot.script.rs2.model.Entity;import org.osbot.script.rs2.model.Model;import org.osbot.script.rs2.model.Player;import org.osbot.script.rs2.utility.Utilities;import java.awt.*;import java.util.Arrays;import java.util.HashSet;import java.util.Iterator;@ScriptManifest(author = "Brainfree", version = 1.0D, name = "OSModelHaulgorithm",        info = "Constructs a Convex Haul around a Entities model.")public class OSModelHaulgorithm extends Script {    public void onPaint(Graphics g) {        for (Player current_player : client.getLocalPlayers()) {            Polygon haul = buildEntityConvexPolygon(current_player);            if(haul == null) return;            ((Graphics2D) g).draw(haul);        }    }    public Polygon buildEntityConvexPolygon(Entity gameObject) {        PointSeries structure = buildModelConvexHaul(                gameObject.getModel(),                gameObject.getGridX(),                gameObject.getGridY()        );        if (structure == null) return null;        return new Polygon(structure.x_points, structure.y_points, structure.num_points);    }    public PointSeries buildModelConvexHaul(Model model, int gridX, int gridY) {        try {            Point[] points = Utilities.getModelScreenPoints(this.getBot(), gridX, gridY, model);            if (points == null || points.length <= 2) return null; //can't do much with a line.            int[][] data = reflectClean(points);            int[] x_cluster = new int[data.length], y_cluster = new int[data.length];            for (int i = 0; i < data.length; i++) {                x_cluster[i] = data[i][0];                y_cluster[i] = data[i][1];            }            PointSeries data_destination = new PointSeries();            reflectHaul(x_cluster, y_cluster, data.length, data_destination);            data_destination.filter(0); //empty element slots.            return data_destination;        } catch (Exception ignored) {} //Utility errors.        return null;    }    public int[][] reflectClean(Point[] points) {        HashSet<Point> nodes = new HashSet<Point>(Arrays.asList(points)); //cheaper then clear.        int[][] data_matrix = new int[nodes.size()][2];        Iterator<Point> data = nodes.iterator();        Point cur;        for (int i = 0; i < nodes.size(); i++) {            cur = data.next();            data_matrix[i][0] = cur.x;            data_matrix[i][1] = cur.y;        }        return data_matrix;    }    public static class PointSeries {        private int[] x_points;        private int[] y_points;        private int num_points = 0;        public PointSeries(int initialCapacity) {            this.x_points = new int[initialCapacity];            this.y_points = new int[initialCapacity];        }        public PointSeries() {            this(10);        }        public void filter(int invalid) {            int valid_size = 0;            for (int i = 0; i < num_points; i++)                if (x_points[i] != invalid && y_points[i] != invalid) valid_size++;            int[] x_dest = new int[valid_size], y_dest = new int[valid_size];            int x, y;            for (int i = 0; i < num_points; i++) {                if ((x = x_points[i]) != invalid && (y = y_points[i]) != invalid) {                    x_dest[i] = x;                    y_dest[i] = y;                }            }            x_points = x_dest;            y_points = y_dest;            num_points = valid_size;        }        private void expand(int newCapacity) {            x_points = Arrays.copyOf(x_points, newCapacity);            y_points = Arrays.copyOf(y_points, newCapacity);        }        public void addPoint(int x, int y) {            if (num_points + 1 > x_points.length)                expand(((num_points * 3) / 2) + 1);            x_points[num_points] = x;            y_points[num_points] = y;            num_points++;        }    }    public boolean small(int[] xPoints, int[] yPoints, int current, int smallest, int i) {        int xa, ya, xb, yb, val;        xa = xPoints[smallest] - xPoints[current];        xb = xPoints[i] - xPoints[current];        ya = yPoints[smallest] - yPoints[current];        yb = yPoints[i] - yPoints[current];        val = xa * yb - xb * ya;        if (val > 0)            return true;        else if (val < 0)            return false;        else {            if (xa * xb + ya * yb < 0)                return false;            else {                if (xa * xa + ya * ya > xb * xb + yb * yb)                    return true;                else                    return false;            }        }    }    public void reflectHaul(            int[] x_cluster, int[] y_cluster, int numPoints, PointSeries destination) {        int min = 0, smallest;        for (int i = 1; i < numPoints; i++) {            if (y_cluster[i] == y_cluster[min]) {                if (x_cluster[i] < x_cluster[min])                    min = i;            } else if (y_cluster[i] < y_cluster[min])                min = i;        }        int current = min;        do {            destination.addPoint(x_cluster[current], y_cluster[current]);            smallest = 0;            if (smallest == current)                smallest = 1;            for (int i = 0; i < numPoints; i++) {                if ((current == i) || (smallest == i))                    continue;                if (small(x_cluster, y_cluster, current, smallest, i))                    smallest = i;            }            current = smallest;        } while (current != min);    }}

 

 

Have fun!

Edited by Brainfree

Guest
This topic is now closed to further replies.

Recently Browsing 0

  • No registered users viewing this page.

Account

Navigation

Search

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.