diff --git a/src/org/rev317/Loader.java b/src/org/rev317/Loader.java
index 58b539d..b6d56c8 100644
--- a/src/org/rev317/Loader.java
+++ b/src/org/rev317/Loader.java
@@ -4,12 +4,18 @@ import java.applet.Applet;
import java.io.File;
import java.net.URL;
+import javax.swing.JMenuBar;
+
import org.parabot.core.Context;
import org.parabot.core.asm.ASMClassLoader;
+import org.parabot.core.asm.adapters.AddInterfaceAdapter;
+import org.parabot.environment.scripts.Script;
import org.parabot.environment.servers.ServerManifest;
import org.parabot.environment.servers.ServerProvider;
import org.parabot.environment.servers.Type;
import org.rev317.accessors.Client;
+import org.rev317.script.ScriptEngine;
+import org.rev317.ui.BotMenu;
/**
*
@@ -48,5 +54,27 @@ public class Loader extends ServerProvider {
public static Client getClient() {
return (Client) Context.getInstance().getClient();
}
+
+ @Override
+ public void addMenuItems(JMenuBar bar) {
+ new BotMenu(bar);
+ }
+
+ @Override
+ public void injectHooks() {
+ AddInterfaceAdapter.setAccessorPackage("org/rev317/accessors/");
+ // default injection is done by bot, it basically parses the hooks file
+ super.injectHooks();
+ }
+
+ @Override
+ public void initScript(Script script) {
+ ScriptEngine.getInstance().setScript(script);
+ ScriptEngine.getInstance().init();
+ }
+
+ public void unloadScript(Script script) {
+ ScriptEngine.getInstance().unload();
+ }
}
diff --git a/src/org/rev317/accessors/Client.java b/src/org/rev317/accessors/Client.java
index 41d57f8..88a7a59 100644
--- a/src/org/rev317/accessors/Client.java
+++ b/src/org/rev317/accessors/Client.java
@@ -28,6 +28,8 @@ public interface Client {
public int getBackDialogId();
+ public int getPlane();
+
public CollisionMap[] getCollisionMap();
// args switched
diff --git a/src/org/rev317/api/methods/Game.java b/src/org/rev317/api/methods/Game.java
index 1359f57..f1f1f94 100644
--- a/src/org/rev317/api/methods/Game.java
+++ b/src/org/rev317/api/methods/Game.java
@@ -54,7 +54,15 @@ public class Game {
* @return collision flags
*/
public static int[][] getCollisionFlags() {
- return Loader.getClient().getCollisionMap()[0].getFlags();
+ return Loader.getClient().getCollisionMap()[Game.getPlane()].getFlags();
+ }
+
+ /**
+ * Gets current plane
+ * @return current plane
+ */
+ public static int getPlane() {
+ return Loader.getClient().getPlane();
}
}
diff --git a/src/org/rev317/api/wrappers/Tile.java b/src/org/rev317/api/wrappers/Tile.java
index 17da420..2001aa6 100644
--- a/src/org/rev317/api/wrappers/Tile.java
+++ b/src/org/rev317/api/wrappers/Tile.java
@@ -1,5 +1,6 @@
package org.rev317.api.wrappers;
+import org.rev317.api.interfaces.Locatable;
import org.rev317.api.interfaces.TileFlags;
import org.rev317.api.methods.Calculations;
import org.rev317.api.methods.Game;
@@ -13,7 +14,7 @@ import org.rev317.api.methods.Walking;
* @author Everel
*
*/
-public final class Tile implements TileFlags {
+public final class Tile implements TileFlags, Locatable {
private int x;
private int y;
private int z;
@@ -47,10 +48,18 @@ public final class Tile implements TileFlags {
return y;
}
+ /**
+ * Gets region x
+ * @return region x
+ */
public final int getRegionX() {
return x - Game.getBaseX();
}
+ /**
+ * Gets region y
+ * @return region y
+ */
public final int getRegionY() {
return y - Game.getBaseY();
}
@@ -64,6 +73,11 @@ public final class Tile implements TileFlags {
return z;
}
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
public final int distanceTo() {
return (int) Calculations.distanceTo(this);
}
@@ -114,28 +128,44 @@ public final class Tile implements TileFlags {
/**
* Determines if this tile is walkable
- * @return true if this tile is walkable, otherwise false.
+ * @return true if this tile is walkable, otherwise false
*/
public boolean isWalkable() {
return (Game.getCollisionFlags()[getRegionX()][getRegionY()] & 256) == 0;
}
/**
- *
- * @param isObject
- * @return
+ * Determines if this tile is reachable
+ * @param isObject whether this tile is an object tile
+ * @return true if this tile is reachable, otherwise false
*/
public boolean isReachable(boolean isObject) {
Tile current = Players.getMyPlayer().getLocation();
return Calculations.dijkstraDist(current.getRegionX(), current.getRegionY(), getRegionX(), getRegionY(), isObjectTile()) > -1;
}
+ /**
+ * Determines if this tile is reachable
+ * @return true if this tile is reachable, otherwise false
+ */
public boolean isReachable() {
return isReachable(isObjectTile());
}
+ /**
+ * Determines if this tile is an object tile
+ * @return true if this tile is an object tile, otherwise false
+ */
public boolean isObjectTile() {
return (Game.getCollisionFlags()[getRegionX()][getRegionY()] & OBJECT_TILE) != 0;
}
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public Tile getLocation() {
+ return this;
+ }
+
}
diff --git a/src/org/rev317/debug/DActions.java b/src/org/rev317/debug/DActions.java
new file mode 100644
index 0000000..909d5cb
--- /dev/null
+++ b/src/org/rev317/debug/DActions.java
@@ -0,0 +1,28 @@
+package org.rev317.debug;
+
+import java.awt.Graphics;
+
+import org.parabot.core.paint.AbstractDebugger;
+
+public class DActions extends AbstractDebugger {
+ private static boolean enabled;
+
+ @Override
+ public void paint(Graphics g) {
+ }
+
+ @Override
+ public boolean isEnabled() {
+ return false;
+ }
+
+ @Override
+ public void toggle() {
+ enabled = !enabled;
+ }
+
+ public static boolean debugActions() {
+ return enabled;
+ }
+
+}
diff --git a/src/org/rev317/debug/DAnimation.java b/src/org/rev317/debug/DAnimation.java
new file mode 100644
index 0000000..d9ffb7a
--- /dev/null
+++ b/src/org/rev317/debug/DAnimation.java
@@ -0,0 +1,27 @@
+package org.rev317.debug;
+
+import java.awt.Graphics;
+
+import org.parabot.core.Context;
+import org.parabot.core.paint.AbstractDebugger;
+import org.rev317.api.methods.Players;
+
+public class DAnimation extends AbstractDebugger {
+ private boolean enabled;
+
+ @Override
+ public void paint(Graphics g) {
+ Context.getInstance().getPaintDebugger().addLine("Animation: " + Players.getMyPlayer().getAnimation());
+ }
+
+ @Override
+ public boolean isEnabled() {
+ return enabled;
+ }
+
+ @Override
+ public void toggle() {
+ enabled = !enabled;
+ }
+
+}
diff --git a/src/org/rev317/debug/DCollisionFlags.java b/src/org/rev317/debug/DCollisionFlags.java
new file mode 100644
index 0000000..b02e40c
--- /dev/null
+++ b/src/org/rev317/debug/DCollisionFlags.java
@@ -0,0 +1,39 @@
+package org.rev317.debug;
+
+import java.awt.Graphics;
+
+import org.parabot.core.Context;
+import org.parabot.core.paint.AbstractDebugger;
+import org.parabot.core.paint.PaintDebugger;
+import org.rev317.api.methods.Game;
+import org.rev317.api.methods.Players;
+import org.rev317.api.wrappers.Tile;
+
+public class DCollisionFlags extends AbstractDebugger {
+ private boolean enabled;
+
+ @Override
+ public void paint(Graphics g) {
+ PaintDebugger p = Context.getInstance().getPaintDebugger();
+ Tile location = Players.getMyPlayer().getLocation();
+ Tile north = new Tile(location.getX(), location.getY() + 1);
+ Tile south = new Tile(location.getX(), location.getY() - 1);
+ Tile west = new Tile(location.getX() - 1, location.getY());
+ Tile east = new Tile(location.getX() + 1, location.getY());
+ int flag = Game.getCollisionFlags()[location.getRegionX()][location.getRegionY()];
+ p.addLine("Collision flag: 0x" + String.format("%X", flag));
+ p.addLine("Reachable: [ cur: " + location.isReachable() + ", north: " + north.isReachable() + ", south: " + south.isReachable() + ", east: " + east.isReachable() + ", west: " + west.isReachable() + " ]");
+ p.addLine("Walkable: [ cur: " + location.isWalkable() + ", north: " + north.isWalkable() + ", south: " + south.isWalkable() + ", east: " + east.isWalkable() + ", west: " + west.isWalkable() + " ]");
+ }
+
+ @Override
+ public boolean isEnabled() {
+ return enabled;
+ }
+
+ @Override
+ public void toggle() {
+ enabled = !enabled;
+ }
+
+}
diff --git a/src/org/rev317/debug/DGroundItems.java b/src/org/rev317/debug/DGroundItems.java
new file mode 100644
index 0000000..84a64f2
--- /dev/null
+++ b/src/org/rev317/debug/DGroundItems.java
@@ -0,0 +1,32 @@
+package org.rev317.debug;
+
+import java.awt.Graphics;
+
+import org.parabot.core.paint.AbstractDebugger;
+import org.rev317.api.methods.GroundItems;
+import org.rev317.api.wrappers.GroundItem;
+
+public class DGroundItems extends AbstractDebugger {
+
+ @Override
+ public void paint(Graphics g) {
+
+ }
+
+ @Override
+ public boolean isEnabled() {
+ return false;
+ }
+
+ @Override
+ public void toggle() {
+ GroundItem[] items = GroundItems.getNearest();
+ if(items == null || items.length == 0) {
+ return;
+ }
+ for(GroundItem item : items) {
+ System.out.println("ID: " + item.getId() + " Location: " + item.getLocation());
+ }
+ }
+
+}
diff --git a/src/org/rev317/debug/DInterfaces.java b/src/org/rev317/debug/DInterfaces.java
new file mode 100644
index 0000000..d60044a
--- /dev/null
+++ b/src/org/rev317/debug/DInterfaces.java
@@ -0,0 +1,30 @@
+package org.rev317.debug;
+
+import java.awt.Graphics;
+
+import org.parabot.core.Context;
+import org.parabot.core.paint.AbstractDebugger;
+import org.parabot.core.paint.PaintDebugger;
+import org.rev317.api.methods.Game;
+
+public class DInterfaces extends AbstractDebugger {
+ private boolean enabled;
+
+ @Override
+ public void paint(Graphics g) {
+ PaintDebugger p = Context.getInstance().getPaintDebugger();
+ p.addLine("Open interface: " + Game.getOpenInterfaceId());
+ p.addLine("Open back dialog: " + Game.getOpenBackDialogId());
+ }
+
+ @Override
+ public boolean isEnabled() {
+ return enabled;
+ }
+
+ @Override
+ public void toggle() {
+ enabled = !enabled;
+ }
+
+}
diff --git a/src/org/rev317/debug/DMap.java b/src/org/rev317/debug/DMap.java
new file mode 100644
index 0000000..2cf5921
--- /dev/null
+++ b/src/org/rev317/debug/DMap.java
@@ -0,0 +1,31 @@
+package org.rev317.debug;
+
+import java.awt.Graphics;
+
+import org.parabot.core.Context;
+import org.parabot.core.paint.AbstractDebugger;
+import org.parabot.core.paint.PaintDebugger;
+import org.rev317.api.methods.Game;
+import org.rev317.api.methods.Players;
+
+public class DMap extends AbstractDebugger {
+ private boolean enabled;
+
+ @Override
+ public void paint(Graphics g) {
+ PaintDebugger p = Context.getInstance().getPaintDebugger();
+ p.addLine("Location: " + Players.getMyPlayer().getLocation());
+ p.addLine("Plane: " + Game.getPlane());
+ }
+
+ @Override
+ public boolean isEnabled() {
+ return enabled;
+ }
+
+ @Override
+ public void toggle() {
+ enabled = !enabled;
+ }
+
+}
diff --git a/src/org/rev317/debug/DNpcs.java b/src/org/rev317/debug/DNpcs.java
new file mode 100644
index 0000000..210dabb
--- /dev/null
+++ b/src/org/rev317/debug/DNpcs.java
@@ -0,0 +1,29 @@
+package org.rev317.debug;
+
+import java.awt.Graphics;
+
+import org.parabot.core.paint.AbstractDebugger;
+import org.rev317.api.methods.Npcs;
+import org.rev317.api.wrappers.Npc;
+
+public class DNpcs extends AbstractDebugger {
+
+ @Override
+ public void paint(Graphics g) {
+
+ }
+
+ @Override
+ public boolean isEnabled() {
+ return false;
+ }
+
+ @Override
+ public void toggle() {
+ for(Npc n : Npcs.getNearest()) {
+ System.out.println("ID: " + n.getDef().getId() + " Distance: " + n.distanceTo() + " Location: " + n.getLocation().toString());
+ }
+
+ }
+
+}
diff --git a/src/org/rev317/debug/DSceneObjects.java b/src/org/rev317/debug/DSceneObjects.java
new file mode 100644
index 0000000..dca5d0d
--- /dev/null
+++ b/src/org/rev317/debug/DSceneObjects.java
@@ -0,0 +1,29 @@
+package org.rev317.debug;
+
+import java.awt.Graphics;
+
+import org.parabot.core.paint.AbstractDebugger;
+import org.rev317.api.methods.SceneObjects;
+import org.rev317.api.wrappers.SceneObject;
+
+public class DSceneObjects extends AbstractDebugger {
+
+ @Override
+ public void paint(Graphics g) {
+
+ }
+
+ @Override
+ public boolean isEnabled() {
+ return false;
+ }
+
+ @Override
+ public void toggle() {
+ SceneObject[] objects = SceneObjects.getNearest();
+ for(SceneObject object : objects) {
+ System.out.println("ID: " + object.getId() + " UID: " + object.getHash() + " Location: " + object.getLocation() + " Distance: " + object.distanceTo());
+ }
+ }
+
+}
diff --git a/src/org/rev317/script/ScriptEngine.java b/src/org/rev317/script/ScriptEngine.java
new file mode 100644
index 0000000..f144fe6
--- /dev/null
+++ b/src/org/rev317/script/ScriptEngine.java
@@ -0,0 +1,155 @@
+package org.rev317.script;
+
+import java.awt.AWTEvent;
+import java.awt.event.MouseEvent;
+import java.awt.event.MouseListener;
+import java.awt.event.MouseMotionListener;
+import java.util.ArrayList;
+import java.util.HashMap;
+
+import org.parabot.core.Context;
+import org.parabot.environment.api.interfaces.Paintable;
+import org.parabot.environment.scripts.Script;
+
+/**
+ *
+ * @author Everel
+ *
+ */
+public class ScriptEngine {
+ private static HashMap instances = new HashMap();
+ private ArrayList mouseListeners;
+ private ArrayList mouseMotionListeners;
+ //private ArrayList messageListeners;
+
+ private Script script = null;
+
+ private ScriptEngine() {
+ this.mouseListeners = new ArrayList();
+ this.mouseMotionListeners = new ArrayList();
+ //this.messageListeners = new ArrayList();
+ instances.put(Context.getInstance(), this);
+ }
+
+ public static ScriptEngine getInstance() {
+ final ScriptEngine engine = instances.get(Context.getInstance());
+ if(engine != null) {
+ return engine;
+ }
+ return new ScriptEngine();
+ }
+
+ public void addMouseListener(MouseListener mouseListener) {
+ mouseListeners.add(mouseListener);
+ }
+
+ public void removeMouseListener(MouseListener mouseListener) {
+ mouseListeners.remove(mouseListener);
+ }
+
+ public void clearMouseListeners() {
+ mouseListeners.clear();
+ }
+
+ public void addMouseMotionListener(MouseMotionListener mouseMotionListener) {
+ mouseMotionListeners.add(mouseMotionListener);
+ }
+
+ public void removeMouseMotionListener(MouseMotionListener mouseMotionListener) {
+ mouseMotionListeners.remove(mouseMotionListener);
+ }
+
+ public void clearMouseMotionListeners() {
+ mouseMotionListeners.clear();
+ }
+
+ /*public void addMessageListener(MessageListener messageListener) {
+ messageListeners.add(messageListener);
+ }
+
+ public void removeMessageListener(MessageListener messageListener) {
+ messageListeners.remove(messageListener);
+ }
+
+ public void clearMessageListeners() {
+ messageListeners.clear();
+ }*/
+
+ public void setScript(final Script script) {
+ this.script = script;
+ }
+
+ public void unload() {
+ clearMouseListeners();
+ clearMouseMotionListeners();
+ //clearMessageListeners();
+ if(script instanceof Paintable) {
+ Context.getInstance().removePaintable((Paintable)script);
+ }
+ this.script = null;
+ }
+
+ public void init() {
+ if(script == null) {
+ throw new RuntimeException("Script is null");
+ }
+ if(script instanceof MouseListener) {
+ addMouseListener((MouseListener)script);
+ }
+ if(script instanceof MouseMotionListener) {
+ addMouseMotionListener((MouseMotionListener)script);
+ }
+ /*if(script instanceof MessageListener) {
+ addMessageListener((MessageListener)script);
+ }*/
+ if(script instanceof Paintable) {
+ Context.getInstance().addPaintable((Paintable)script);
+ }
+ }
+
+ public void dispatch(AWTEvent event) {
+ if(this.script == null) {
+ return;
+ }
+ if(!(event instanceof MouseEvent)) {
+ return;
+ }
+ final MouseEvent e = (MouseEvent) event;
+ for(final MouseListener m : mouseListeners) {
+ switch(e.getID()) {
+ case MouseEvent.MOUSE_CLICKED:
+ m.mouseClicked(e);
+ break;
+ case MouseEvent.MOUSE_ENTERED:
+ m.mouseEntered(e);
+ break;
+ case MouseEvent.MOUSE_EXITED:
+ m.mouseExited(e);
+ break;
+ case MouseEvent.MOUSE_PRESSED:
+ m.mousePressed(e);
+ break;
+ case MouseEvent.MOUSE_RELEASED:
+ m.mouseReleased(e);
+ }
+ }
+ for(final MouseMotionListener m : mouseMotionListeners) {
+ switch(e.getID()) {
+ case MouseEvent.MOUSE_MOVED:
+ m.mouseMoved(e);
+ break;
+ case MouseEvent.MOUSE_DRAGGED:
+ m.mouseDragged(e);
+ break;
+ }
+ }
+ }
+
+ /*public void dispatch(MessageEvent event) {
+ for(final MessageListener messageListener : messageListeners) {
+ messageListener.messageReceived(event);
+ }
+ }*/
+
+}
+
diff --git a/src/org/rev317/ui/BotMenu.java b/src/org/rev317/ui/BotMenu.java
new file mode 100644
index 0000000..784bdc1
--- /dev/null
+++ b/src/org/rev317/ui/BotMenu.java
@@ -0,0 +1,65 @@
+package org.rev317.ui;
+
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import javax.swing.JCheckBoxMenuItem;
+import javax.swing.JMenu;
+import javax.swing.JMenuBar;
+import javax.swing.JMenuItem;
+
+import org.rev317.debug.*;
+
+import org.parabot.core.Context;
+import org.parabot.core.paint.PaintDebugger;
+
+
+public class BotMenu implements ActionListener {
+
+ public BotMenu(JMenuBar bar) {
+ PaintDebugger debugger = Context.getInstance().getPaintDebugger();
+
+ JMenu debug = new JMenu("Debug");
+
+ JMenuItem map = newItem("Map");
+ JMenuItem animation = newItem("Animation");
+ JMenuItem objects = newItem("Objects");
+ JMenuItem npcs = newItem("Npcs");
+ JMenuItem items = newItem("GroundItems");
+ JMenuItem interfaces = newItem("Interfaces");
+ JMenuItem flags = newItem("Collision flags");
+ JMenuItem actions = newItem("Actions");
+
+ debugger.addDebugger("Actions", new DActions());
+ debugger.addDebugger("Animation", new DAnimation());
+ debugger.addDebugger("Map", new DMap());
+ debugger.addDebugger("Objects", new DSceneObjects());
+ debugger.addDebugger("Npcs", new DNpcs());
+ debugger.addDebugger("GroundItems", new DGroundItems());
+ debugger.addDebugger("Interfaces", new DInterfaces());
+ debugger.addDebugger("Collision flags", new DCollisionFlags());
+
+ debug.add(actions);
+ debug.add(map);
+ debug.add(animation);
+ debug.add(objects);
+ debug.add(npcs);
+ debug.add(items);
+ debug.add(interfaces);
+ debug.add(flags);
+
+ bar.add(debug);
+ }
+
+ private JMenuItem newItem(String name) {
+ JMenuItem item = new JCheckBoxMenuItem(name);
+ item.addActionListener(this);
+ return item;
+ }
+
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ Context.getInstance().getPaintDebugger().toggle(e.getActionCommand());
+ }
+
+}
+