Guest User

Untitled

a guest
Jan 22nd, 2019
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 13.21 KB | None | 0 0
  1. package org.rsbot.script.methods;
  2.  
  3. import org.rsbot.script.background.WebData;
  4. import org.rsbot.script.internal.ScriptHandler;
  5. import org.rsbot.script.web.*;
  6. import org.rsbot.script.wrappers.RSTile;
  7. import org.rsbot.script.wrappers.RSWeb;
  8.  
  9. import java.util.*;
  10.  
  11. /**
  12. * The web class.
  13. *
  14. * @author Timer
  15. */
  16. public class Web extends MethodProvider {
  17. public static final HashMap<RSTile, Integer> rs_map = new HashMap<RSTile, Integer>();
  18. public static boolean webScriptsLoaded = false;
  19. private long lastLocalAccess = 0;
  20. public int webDataId = 0;
  21. private boolean forceLoad = false;
  22. public static final int WEB_SCRIPT_COUNT = 1;
  23.  
  24. Web(final MethodContext ctx) {
  25. super(ctx);
  26. }
  27.  
  28. /**
  29. * Gets the closest supported bank that is usable.
  30. *
  31. * @param tile The tile to look off of.
  32. * @return The closest bank's tile.
  33. */
  34. public RSTile getNearestBank(final RSTile tile) {
  35. double dist = -1.0D;
  36. RSTile finalTile = null;
  37. final RSTile[] BANKS = {
  38. new RSTile(2330, 3688), new RSTile(2337, 3807),
  39. new RSTile(2416, 3801), new RSTile(2100, 3919),
  40. new RSTile(2620, 3895), new RSTile(2725, 3492),
  41. new RSTile(2842, 3539), new RSTile(3093, 3494),
  42. new RSTile(3163, 3486), new RSTile(3254, 3420),
  43. new RSTile(3187, 3437), new RSTile(3511, 3478),
  44. new RSTile(3689, 3467), new RSTile(3495, 3212),
  45. new RSTile(3382, 3270), new RSTile(3269, 3167),
  46. new RSTile(3305, 3123), new RSTile(3427, 2892),
  47. new RSTile(3091, 3243), new RSTile(3013, 3355),
  48. new RSTile(2946, 3367), new RSTile(2809, 3441),
  49. new RSTile(2617, 3334), new RSTile(2655, 3283),
  50. new RSTile(2351, 3167), new RSTile(2443, 3085),
  51. new RSTile(2611, 3093), new RSTile(2403, 2841),
  52. new RSTile(2554, 2839), new RSTile(2851, 2955),
  53. new RSTile(3680, 2982), new RSTile(3448, 3720),
  54. new RSTile(2584, 3421), new RSTile(3209, 3219, 2)
  55. };
  56. for (RSTile bank : BANKS) {
  57. double cdist = methods.calc.distanceBetween(tile, bank);
  58. if ((dist > cdist || dist == -1.0D) && (tile.getZ() == bank.getZ())) {
  59. dist = cdist;
  60. finalTile = bank;
  61. }
  62. }
  63. return finalTile;
  64. }
  65.  
  66. /**
  67. * Gets the closest supported bank that is usable.
  68. *
  69. * @return The closest bank's tile.
  70. */
  71. public RSTile getNearestBank() {
  72. return getNearestBank(methods.players.getMyPlayer().getLocation());
  73. }
  74.  
  75. /**
  76. * Generates a path between two nodes.
  77. *
  78. * @param start The starting tile.
  79. * @param end The ending tile.
  80. * @return The path.
  81. */
  82. public RSTile[] generateTilePath(final RSTile start, final RSTile end) {
  83. if (start.getZ() != end.getZ()) {
  84. return null;
  85. }
  86. if (start.equals(end)) {
  87. return new RSTile[]{};
  88. }
  89. if (!areScriptsLoaded()) {
  90. loadWebScripts();
  91. }
  92. lastLocalAccess = System.currentTimeMillis();
  93. final HashSet<Node> open = new HashSet<Node>();
  94. final HashSet<Node> closed = new HashSet<Node>();
  95. Node curr = new Node(start.getX(), start.getY(), start.getZ());
  96. final Node dest = new Node(end.getX(), end.getY(), end.getZ());
  97. curr.f = Heuristic(curr, dest);
  98. open.add(curr);
  99. while (!open.isEmpty()) {
  100. curr = Lowest_f(open);
  101. if (curr.equals(dest)) {
  102. return Path(curr);
  103. }
  104. open.remove(curr);
  105. closed.add(curr);
  106. for (final Node next : Web.Successors(curr)) {
  107. if (!closed.contains(next)) {
  108. final double t = curr.g + Dist(curr, next);
  109. boolean use_t = false;
  110. if (!open.contains(next)) {
  111. open.add(next);
  112. use_t = true;
  113. } else if (t < next.g) {
  114. use_t = true;
  115. }
  116. if (use_t) {
  117. next.prev = curr;
  118. next.g = t;
  119. next.f = t + Heuristic(next, dest);
  120. }
  121. }
  122. }
  123. }
  124. return null;
  125. }
  126.  
  127. /**
  128. * Generates routes between two tiles.
  129. *
  130. * @param start The start tile.
  131. * @param end The ending tile.
  132. * @param lastRoute The last plane route.
  133. * @return The generated route.
  134. */
  135. private Route[] generateRoutes(final RSTile start, final RSTile end, final Route lastRoute) {
  136. if (start.getZ() == end.getZ()) {
  137. Route route = planeRoute(start, end, null);
  138. if (route == null) {
  139. return null;
  140. } else {
  141. route.parent = lastRoute;
  142. }
  143. if (route.parent == null) {
  144. return new Route[]{route};
  145. }
  146. LinkedList<Route> finalRouting = new LinkedList<Route>();
  147. while (route.parent != null) {
  148. finalRouting.addLast(route);
  149. route = route.parent;
  150. }
  151. return finalRouting.toArray(new Route[finalRouting.size()]);
  152. }
  153. PlaneHandler planeHandler = new PlaneHandler(methods);
  154. PlaneTraverse[] traverses = planeHandler.get(methods.game.getPlane());
  155. double dist = Double.MAX_VALUE;
  156. PlaneTraverse finalTraverse = null;
  157. for (PlaneTraverse traverse : traverses) {
  158. if (traverse.destPlane() == end.getZ() && traverse.applicable()) {
  159. final double tempDist = traverse.getRoute().getDistance();
  160. if (tempDist < dist) {
  161. dist = tempDist;
  162. finalTraverse = traverse;
  163. }
  164. }
  165. }
  166. if (finalTraverse != null) {
  167. final Route route = planeRoute(start, end, finalTraverse);
  168. route.parent = lastRoute;
  169. return generateRoutes(finalTraverse.dest(), end, route);
  170. }
  171. return null;//No applicable plane transfers.
  172. }
  173.  
  174. public Route planeRoute(final RSTile start, final RSTile end, final PlaneTraverse transfer) {
  175. if (!areScriptsLoaded()) {
  176. loadWebScripts();
  177. }
  178. lastLocalAccess = System.currentTimeMillis();
  179. if (transfer != null) {
  180. final Route walkRoute = planeRoute(start, transfer.walkTo(), null);
  181. if (walkRoute == null) {
  182. return null;
  183. }
  184. walkRoute.add(new RouteStep(methods, transfer.getInteractionTile()));
  185. return walkRoute;
  186. }
  187. //TODO Special path generation (teleports, npcs, objects).
  188. RSTile[] path = generateTilePath(start, end);
  189. if (path == null) {
  190. return null;
  191. }
  192. return new Route(new RouteStep[]{new RouteStep(methods, path)});
  193. }
  194.  
  195. /**
  196. * Returns a web instance to traverse.
  197. *
  198. * @param start The starting tile.
  199. * @param end The end tile.
  200. * @return The web constructed. <code>null</code> if it cannot be done.
  201. */
  202. public RSWeb getWeb(RSTile start, final RSTile end) {
  203. Route[] routes = generateRoutes(start, end, null);
  204. if (routes == null) {
  205. return null;
  206. }
  207. return new RSWeb(routes, start, end);
  208. }
  209.  
  210. /**
  211. * Returns a web instance to traverse.
  212. *
  213. * @param end The end tile.
  214. * @return The web constructed. <code>null</code> if it cannot be done.
  215. */
  216. public RSWeb getWeb(final RSTile end) {
  217. return getWeb(methods.players.getMyPlayer().getLocation(), end);
  218. }
  219.  
  220. /**
  221. * Node class.
  222. */
  223. private static class Node {
  224. public final int x, y, z;
  225. public Node prev;
  226. public double g, f;
  227.  
  228. public Node(final int x, final int y, final int z) {
  229. this.x = x;
  230. this.y = y;
  231. this.z = z;
  232. g = f = 0;
  233. }
  234.  
  235. @Override
  236. public int hashCode() {
  237. return x << 4 | y;
  238. }
  239.  
  240. @Override
  241. public boolean equals(final Object o) {
  242. if (o instanceof Node) {
  243. final Node n = (Node) o;
  244. return x == n.x && y == n.y && z == n.z;
  245. }
  246. return false;
  247. }
  248.  
  249. @Override
  250. public String toString() {
  251. return "(" + x + "," + y + "," + z + ")";
  252. }
  253.  
  254. public RSTile toRSTile() {
  255. return new RSTile(x, y, z);
  256. }
  257. }
  258.  
  259. /**
  260. * Gets the heuristic distance.
  261. *
  262. * @param start Start node.
  263. * @param end End node.
  264. * @return The distance.
  265. */
  266. private static double Heuristic(final Node start, final Node end) {
  267. /*double dx = start.x - end.x;
  268. double dy = start.y - end.y;
  269. if (dx < 0) {
  270. dx = -dx;
  271. }
  272. if (dy < 0) {
  273. dy = -dy;
  274. }
  275. return dx < dy ? dy : dx;*/
  276. return Dist(start, end) * Math.sqrt(Math.pow(start.x - end.x, 2) + Math.pow(start.y - end.y, 2));
  277. }
  278.  
  279. /**
  280. * The distance between two tiles.
  281. *
  282. * @param start The start tile.
  283. * @param end The end tile.
  284. * @return The distance.
  285. */
  286. private static double Dist(final Node start, final Node end) {
  287. if (start.x != end.x && start.y != end.y) {
  288. return 1.41421356;
  289. } else {
  290. return 1.0;
  291. }
  292. }
  293.  
  294. /**
  295. * Gets the lowest f score of a set.
  296. *
  297. * @param open The set.
  298. * @return The node that has the lowest f score.
  299. */
  300. private static Node Lowest_f(final Set<Node> open) {
  301. Node best = null;
  302. for (final Node t : open) {
  303. if (best == null || t.f < best.f) {
  304. best = t;
  305. }
  306. }
  307. return best;
  308. }
  309.  
  310. /**
  311. * Constructs a path from a node.
  312. *
  313. * @param end The end node.
  314. * @return The constructed path.
  315. */
  316. private static RSTile[] Path(final Node end) {
  317. final LinkedList<RSTile> path = new LinkedList<RSTile>();
  318. Node p = end;
  319. while (p != null) {
  320. path.addFirst(p.toRSTile());
  321. p = p.prev;
  322. }
  323. return path.toArray(new RSTile[path.size()]);
  324. }
  325.  
  326. /**
  327. * Gets successors of a tile.
  328. *
  329. * @param t The node.
  330. * @return The nodes.
  331. */
  332. private static List<Node> Successors(final Node t) {
  333. final LinkedList<Node> tiles = new LinkedList<Node>();
  334. final int x = t.x, y = t.y;
  335. final RSTile here = t.toRSTile();
  336. if (!Flag(here, RSTile.Flag.W_S) &&
  337. !Flag(here.getX(), here.getY() - 1, here.getZ(), RSTile.Flag.BLOCKED | RSTile.Flag.WATER)) {
  338. tiles.add(new Node(x, y - 1, here.getZ()));
  339. }
  340. if (!Flag(here, RSTile.Flag.W_W) &&
  341. !Flag(here.getX() - 1, here.getY(), here.getZ(), RSTile.Flag.BLOCKED | RSTile.Flag.WATER)) {
  342. tiles.add(new Node(x - 1, y, here.getZ()));
  343. }
  344. if (!Flag(here, RSTile.Flag.W_N) &&
  345. !Flag(here.getX(), here.getY() + 1, here.getZ(), RSTile.Flag.BLOCKED | RSTile.Flag.WATER)) {
  346. tiles.add(new Node(x, y + 1, here.getZ()));
  347. }
  348. if (!Flag(here, RSTile.Flag.W_E) &&
  349. !Flag(here.getX() + 1, here.getY(), here.getZ(), RSTile.Flag.BLOCKED | RSTile.Flag.WATER)) {
  350. tiles.add(new Node(x + 1, y, here.getZ()));
  351. }
  352. if (!Flag(here, RSTile.Flag.W_SW | RSTile.Flag.W_S | RSTile.Flag.W_W) &&
  353. !Flag(here.getX() - 1, here.getY() - 1, here.getZ(), RSTile.Flag.BLOCKED | RSTile.Flag.WATER) &&
  354. !Flag(here.getX(), here.getY() - 1, here.getZ(), RSTile.Flag.BLOCKED | RSTile.Flag.WATER | RSTile.Flag.W_W) &&
  355. !Flag(here.getX() - 1, here.getY(), here.getZ(), RSTile.Flag.BLOCKED | RSTile.Flag.WATER | RSTile.Flag.W_S)) {
  356. tiles.add(new Node(x - 1, y - 1, here.getZ()));
  357. }
  358. if (!Flag(here, RSTile.Flag.W_NW | RSTile.Flag.W_N | RSTile.Flag.W_W) &&
  359. !Flag(here.getX() - 1, here.getY() + 1, here.getZ(), RSTile.Flag.BLOCKED | RSTile.Flag.WATER) &&
  360. !Flag(here.getX(), here.getY() + 1, here.getZ(), RSTile.Flag.BLOCKED | RSTile.Flag.WATER | RSTile.Flag.W_W) &&
  361. !Flag(here.getX() - 1, here.getY(), here.getZ(), RSTile.Flag.BLOCKED | RSTile.Flag.WATER | RSTile.Flag.W_N)) {
  362. tiles.add(new Node(x - 1, y + 1, here.getZ()));
  363. }
  364. if (!Flag(here, RSTile.Flag.W_SE | RSTile.Flag.W_S | RSTile.Flag.W_E) &&
  365. !Flag(here.getX() + 1, here.getY() - 1, here.getZ(), RSTile.Flag.BLOCKED | RSTile.Flag.WATER) &&
  366. !Flag(here.getX(), here.getY() - 1, here.getZ(), RSTile.Flag.BLOCKED | RSTile.Flag.WATER | RSTile.Flag.W_E) &&
  367. !Flag(here.getX() + 1, here.getY(), here.getZ(), RSTile.Flag.BLOCKED | RSTile.Flag.WATER | RSTile.Flag.W_S)) {
  368. tiles.add(new Node(x + 1, y - 1, here.getZ()));
  369. }
  370. if (!Flag(here, RSTile.Flag.W_NE | RSTile.Flag.W_N | RSTile.Flag.W_E) &&
  371. !Flag(here.getX() + 1, here.getY() + 1, here.getZ(), RSTile.Flag.BLOCKED | RSTile.Flag.WATER) &&
  372. !Flag(here.getX(), here.getY() + 1, here.getZ(), RSTile.Flag.BLOCKED | RSTile.Flag.WATER | RSTile.Flag.W_E) &&
  373. !Flag(here.getX() + 1, here.getY(), here.getZ(), RSTile.Flag.BLOCKED | RSTile.Flag.WATER | RSTile.Flag.W_N)) {
  374. tiles.add(new Node(x + 1, y + 1, here.getZ()));
  375. }
  376. return tiles;
  377. }
  378.  
  379. /**
  380. * Gets the TileFlags of a tile.
  381. *
  382. * @param tile The tile.
  383. * @return The <code>TileFlags</code>.
  384. */
  385. public static int GetTileFlag(final RSTile tile) {
  386. return BypassFlags.getKey(tile);
  387. }
  388.  
  389. /**
  390. * Checks the flags of a tile.
  391. *
  392. * @param tile The tile to check.
  393. * @param key Keys to look for.
  394. * @return <tt>true</tt> if the tile contains flags.
  395. */
  396. public static boolean Flag(final RSTile tile, final int key) {
  397. int theFlag = 0;
  398. if ((theFlag = BypassFlags.getKey(tile)) != -1) {
  399. return (theFlag & key) != 0;
  400. }
  401. return false;
  402. }
  403.  
  404. /**
  405. * Checks the flags of a tile.
  406. *
  407. * @param x The tile to check (x).
  408. * @param y The tile to check (y).
  409. * @param z The tile to check (z).
  410. * @param key Keys to look for.
  411. * @return <tt>true</tt> if the tile contains flags.
  412. */
  413. public static boolean Flag(final int x, final int y, final int z, final int key) {
  414. return Flag(new RSTile(x, y, z), key);
  415. }
  416.  
  417. public boolean areScriptsLoaded() {
  418. return webScriptsLoaded;
  419. }
  420.  
  421. public boolean areScriptsInActive() {
  422. return webScriptsLoaded && System.currentTimeMillis() - lastLocalAccess > (1000 * 60 * 5) && !forceLoad;
  423. }
  424.  
  425. public void loadWebScripts() {
  426. if (!webScriptsLoaded) {
  427. final ScriptHandler bsh = methods.bot.getScriptHandler();
  428. webDataId = bsh.runDaemonScript(new WebData());
  429. webScriptsLoaded = true;
  430. }
  431. }
  432.  
  433. public void unloadWebScripts() {
  434. if (webScriptsLoaded && !forceLoad) {
  435. final ScriptHandler bsh = methods.bot.getScriptHandler();
  436. bsh.stopDaemonScript(webDataId);
  437. webScriptsLoaded = false;
  438. }
  439. }
  440.  
  441. public void setForceLoad(final boolean forceLoad) {
  442. this.forceLoad = forceLoad;
  443. if (forceLoad) {
  444. loadWebScripts();
  445. }
  446. }
  447. }
Add Comment
Please, Sign In to add comment