Welcome to TRiBot Forums

Register now to gain access to all of our features. Once registered and logged in, you will be able to contribute to this site by submitting your own content or replying to existing content. You'll be able to customize your profile, receive reputation points as a reward for submitting content, while also communicating with other members via your own private inbox, plus much more! This message will be removed once you have signed in.

TRiLeZ

Anti-Ban Compliance

13 posts in this topic

Anti-Ban Compliance

  • Basically, the idea is this:
    • TRiBot's character randomization class store unique values for determining each RuneScape character's behavior patterns. We will use this class to additionally store characteristics such as:
      • Preference to use the banker to bank, the bank booth to bank, or both.
      • Item dropping patterns: left-to-right row-by-row, zigzag, top to bottom, etc.
      • Switching tabs via key/mouse.
      • Hover the next object/NPC while waiting for an action to finish, or to not.
      • Choosing to switch objects if there are too many players on the current object.
      • Response time/delay in switching objects/NPCs after one object/NPC has had its resources drained.
      • Response time/delay when going to a new resource while waiting for it to spawn.
      • Whether to use the closest available resource, or to pick a different one.
      • Percent at which run should be turned on while run energy is recovering.
      • How often to check the training skill XP (if ever).
      • How often to examine a random object (if ever).
      • How often to randomly rotate the camera (if ever).
      • Whether to go to the next anticipated object location while waiting for an object to spawn, or to just stay at the current location (location of the last resource).
      • The list goes on.
    • I'll likely write an API to handle most of this. Some characteristics are too specific and must be implemented by scripts themselves.
    • Now, the more the script implements these characteristics/patterns/API, the higher the Anti-Ban Compliance Level (ABCL) will be. The ABCL will be a scale from zero to ten. Zero would mean that script implements none of the anti-ban measures. Five would mean that the script implements half of the anti-ban measures which can be possibly addressed by the script. Ten would mean that the script implements all of the anti-ban measures possible.
    • To point of this would be to reduce bans. I think one of the things Jagex looks for is player action patterns (which they would compare to other people whom are doing the same thing). If 10 people in the same area were doing the exact same actions, using the exact same patterns, it would be too obvious that they were bots. But if the script were to implement this, then the bots wouldn't all be following the exact same pattern. The patterns would be slightly similar, but they'd be different to an extent.
    • We can also let scripters market this idea. We would promote this idea and how much of a benefit there would be to using a script with an ABCL of ten. In turn, the users would then search for scripts with an ABCL of ten. Scripters will respond by complying by these measures in hopes of beating their competition.
4 people like this

Share this post


Link to post
Share on other sites

Check clan chat, check prayer points in tab, banking patterns (From Left to Right, random order, right click everything, left click if < #)

Share this post


Link to post
Share on other sites

Detect what gains are being made by the script and check the gains periodically 

That is what I do in my script to check xp. Another important thing is not to randomly select one of the skills that you are gaining xp in, but making a weighted choice based on the xp gains.

 

For example: I gained 60.000 ranged xp, 20.000 hp xp and 2.000 magic xp (alching) so the xp checking should occur as:

60:20:2 = 30:10:1 = 30/41 : 10/41 : 1/41 =~ 74% : 24% : 2%

 

I've been working on a new script that tracks all actions a user does such as clicking a npc, object, selecting a choose option item, clicking an inventory item etc. perhaps something similar could be use to store statistics.

Share this post


Link to post
Share on other sites

 

    • We can also let scripters market this idea. We would promote this idea and how much of a benefit there would be to using a script with an ABCL of ten. In turn, the users would then search for scripts with an ABCL of ten. Scripters will respond by complying by these measures in hopes of beating their competition.

 

 

Tread carefully with this idea. It's not that black and white. 

 

What about scripts that do methods that can't support high ACBLs? After all, do legit players buying from a shop check XP? Might be misleading to consumers if we focus too much on it. 

 

Also, what if we don't want to use the API anti-ban methods, and prefer our own? How will our ACBL factor?

 

What if scripters implement all the anti-ban to get a high score, then completely misuse them or not use them? 

 

 

I like the idea of this. It would be helpful as tool. But be careful with it or all you'll do is confuse consumers and give scripters headaches by turning a simple goal into a marketing scheme.

1 person likes this

Share this post


Link to post
Share on other sites

Tread carefully with this idea. It's not that black and white. 

 

What about scripts that do methods that can't support high ACBLs? After all, do legit players buying from a shop check XP? Might be misleading to consumers if we focus too much on it. 

 

Also, what if we don't want to use the API anti-ban methods, and prefer our own? How will our ACBL factor?

 

What if scripters implement all the anti-ban to get a high score, then completely misuse them or not use them? 

 

 

I like the idea of this. It would be helpful as tool. But be careful with it or all you'll do is confuse consumers and give scripters headaches by turning a simple goal into a marketing scheme.

 

A shop buying script would not need to check XP since nothing is being trained. Therefore, scripters should not implement the XP checking code. In this situation, doing so will not lower the ABCL.

 

As for using your own anti-ban methods... well, let's say your anti ban is like this:

 

switch (General.random(0, 99) {case 0: doAction1(); break;case 1:case 2: doAction2(); break;case 3: do Action3(); break;default://Do nothing for the other cases.}

 

After a few hours of running the script, a noticeable pattern will form. doAction1 is called 1% of the time the anti-ban method is called. doAction2() is called 2% of the time. doAction3() is called 1% of the time. A noticeable pattern is formed.

 

This isn't so bad if the script is only being ran by one user. However, if the script is being ran by hundreds of users, then all of those users would be following the same pattern. Are humans that programmatic that they follow the exact same patterns as other humans do? No. Humans have certain characteristics about doing things. So Jagex can just compare the patterns of one bot to all of the other bots in the area training the same skill. If they find that the botters are all have the same patterns in their actions, they can conclude that the players are botting.

 

What's different with the Anti-Ban system I'm developing is that all individual RuneScape players will be assigned different characteristics. Example of these characteristics: frequency of checking XP; delay in moving to a new object; preference over using a banker vs using a booth; if the player/bot hovers over the next object while waiting for the current to be drained; if the player/bot moves to the next anticipated location while waiting for a new object to spawn; etc.

 

These characteristics will remain relatively constant to each individual RuneScape character. This will essentially help the script derive from the patterns which regular scripts make.

 

Comparisons Using Examples:

 

Using traditional anti-ban and traditional sleeping methods/times:

Player_A: 8-10 minutes between every XP check, 2-3 minutes between every random camera movement, sleeps 100-300ms between switching to a new object, all using left-to-right dropping pattern.

Player_B: 8-10 minutes between every XP check, 2-3 minutes between every random camera movement, sleeps 100-300ms between switching to a new object, all using left-to-right dropping pattern.

Player_C: 8-10 minutes between every XP check, 2-3 minutes between every random camera movement, sleeps 100-300ms between switching to a new object, all using left-to-right dropping pattern.

 

Using the new system with player assigned characteristics:

Player_A: 12-16 minutes between every XP check, never performs any random camera movement, sleeps 300-700ms between switching to a new object, prefers to use left-to-right dropping pattern.

Player B: 4-7 minutes between every XP check, 20-30 minutes between every random camera movement, sleeps 200-400ms between switching to a new object, prefers top-to-bottom dropping pattern.

Player B: 40-60 minutes between every XP check, 60-80 minutes between every random camera movement, sleeps 600-1000ms between switching to a new object, prefers zigzag dropping pattern.

 

With the new system, botting patterns will be very unique for every new RuneScape character which uses TRiBot.

 

One more example of what I'm saying...

 

	public static void main(final String... args) {		int _0 = 0;		int _1 = 0;		int _2 = 0;		int _3 = 0;		int _4 = 0;		int _5 = 0;		int _6 = 0;		int _7 = 0;		int _8 = 0;		int _9 = 0;		for (int i = 0; i < 10_000_000; i++) {			final int rand = General.random(0, 9);			if (rand == 0)				_0++;			else if (rand == 1)				_1++;			else if (rand == 2)				_2++;			else if (rand == 3)				_3++;			else if (rand == 4)				_4++;			else if (rand == 5)				_5++;			else if (rand == 6)				_6++;			else if (rand == 7)				_7++;			else if (rand == 8)				_8++;			else if (rand == 9)				_9++;		}		System.out.println(_0 + " " + _1 + " " + _2 + " " + _3 + " " + _4 + " "				+ _5 + " " + _6 + " " + _7 + " " + _8 + " " + _9);	}

10 million random integers with a range of 0-9. What do I predict? Each number from 0-9 will be hit around 1 million times (10 milion random integers divided by 10 possible values equals 1 million hits per value).

 

Running the test a few times:

999900 999910 999452 1001217 1000096 998725 1000579 999093 999819 1001209

999883 999394 1000146 998328 1000829 1000396 999534 1000672 999663 1001155

1000533 1000903 999198 999469 999469 1000298 1000374 1000019 1000463 999274

1002129 1001035 1000365 999426 998753 997907 998949 1000975 999944 1000517

 

My prediction is correct. Each value from 0-9 is hit about 1 million times. This essentially proves why using a random number generator alone to determine actions is predictable.

 

tldr; don't use traditional anti-ban methods as they are detectable.

2 people like this

Share this post


Link to post
Share on other sites

One thing you could add is just randomly moving the mouse- not necessarily to hovering over the next object but sometime you would just move the mouse a bit when playing the game. Hope you know what I am referring to? Basically just randomised mouse movement, perhaps while you are waiting for your character to finish animating?

Share this post


Link to post
Share on other sites
package scripts;import java.awt.Color;import java.awt.Font;import java.awt.Graphics;import java.awt.Point;import java.awt.RenderingHints;import java.awt.event.KeyEvent;import java.awt.event.MouseEvent;import java.text.DecimalFormat;import java.util.Map;import org.tribot.api.Clicking;import org.tribot.api.DynamicClicking;import org.tribot.api.General;import org.tribot.api.Timing;import org.tribot.api.input.Mouse;import org.tribot.api.interfaces.Positionable;import org.tribot.api.types.generic.Condition;import org.tribot.api.types.generic.CustomRet_0P;import org.tribot.api.types.generic.Filter;import org.tribot.api.util.ABCUtil;import org.tribot.api2007.Banking;import org.tribot.api2007.Camera;import org.tribot.api2007.ChooseOption;import org.tribot.api2007.Game;import org.tribot.api2007.GameTab;import org.tribot.api2007.Inventory;import org.tribot.api2007.NPCs;import org.tribot.api2007.Objects;import org.tribot.api2007.Options;import org.tribot.api2007.PathFinding;import org.tribot.api2007.Player;import org.tribot.api2007.Projection;import org.tribot.api2007.Skills;import org.tribot.api2007.Walking;import org.tribot.api2007.types.RSModel;import org.tribot.api2007.types.RSNPC;import org.tribot.api2007.types.RSObject;import org.tribot.api2007.types.RSObjectDefinition;import org.tribot.api2007.types.RSTile;import org.tribot.script.EnumScript;import org.tribot.script.ScriptManifest;import org.tribot.script.interfaces.EventBlockingOverride;import org.tribot.script.interfaces.Painting;import scripts.triscripts.UIManager;import scripts.triscripts.ui.BasicHideButton;import scripts.triscripts.ui.Text;import scripts.triscripts.ui.URLBackground;import scripts.triscripts.ui.XPBar;/** * ABC Overview: *  * Opening Banks: 10/10<br> * Dropping Items: 12/12<br> * Switching Game Tabs: 8/8<br> * Checking XP: 15/15<br> * Examining Random Objects: 6/6<br> * Randomly Rotating Camera: 8/8<br> * Activating Run: 20/20<br> * Responding to Switching Objects: 20/20<br> * Responding to New Objects: N/A<br> * Hovering Objects: 16/16<br> * Using Closest Objects vs Using Objects Which Aren't the Closest: N/A<br> * Moving to the Anticipated Next Object Location: N/A<br> * Switching Resources Upon Too Many Players: 4/4<br> *  * ABCL: 119/119 = ABCL 10 [email protected](authors = { "TRiLeZ" }, category = "Runecrafting", name = "TRiCraft")public final class TRiCraft extends EnumScript<TRiCraft.STATE> implements		Painting, EventBlockingOverride {	enum STATE {		CHECK, WALK_TO_BANK, WALK_TO_RUINS, ENTER_ALTER, EXIT_ALTER, CRAFT_RUNES, BANK	}	enum ALTER {		AIR	}	ALTER SELECTED_ALTER = ALTER.AIR;	RSTile[] PATH_TO_BANK;	RSTile[] PATH_TO_RUINS;	final String[] ESSENCE_ID = { "Rune essence", "Pure essence" };	final String[] TALISMAN_ID = { "Air talisman" };	final String[] RUNES_ID = { "Air rune" };	final String[] BANKER_ID = { "Banker" };	final String[] BANK_BOOTH_ID = { "Bank booth" };	// final int[] RUINS_ID = { 26179 };	final String[] ALTER_ID = { "Altar" };	final String[] PORTAL_ID = { "Portal" };	final UIManager UI_MANAGER = new UIManager();	int start_xp = -1;	int start_level = -1;	int trips = 0;	int runes_made = 0;	boolean stop_script = false;	ABCUtil abc_util = null;	public void init() {		General.useAntiBanCompliance(true);		this.abc_util = new ABCUtil();		switch (SELECTED_ALTER) {		case AIR:			this.PATH_TO_BANK = new RSTile[] { new RSTile(2987, 3293),					new RSTile(2991, 3296), new RSTile(2998, 3304),					new RSTile(3005, 3313), new RSTile(3006, 3321),					new RSTile(3007, 3330), new RSTile(3007, 3340),					new RSTile(3007, 3351), new RSTile(3012, 3355) };			this.PATH_TO_RUINS = Walking					.invertPath((Positionable[]) this.PATH_TO_BANK);		}		Map<?, ?> hints = new RenderingHints(RenderingHints.KEY_ANTIALIASING,				RenderingHints.VALUE_ANTIALIAS_ON);		this.UI_MANAGER.addElement(0, new URLBackground(				"http://i.imgur.com/pS2mU.png", 7, 345));		this.UI_MANAGER.addElement(1, new Text("TRiCraft", 12, 370, new Color(				0, 128, 192, 50), new Font("Segoe UI", Font.PLAIN, 24), hints,				false));		this.UI_MANAGER.addElement(1, new Text("TRiCraft", 12 + 1, 370 + 1,				new Color(0, 128, 192), new Font("Segoe UI", Font.PLAIN, 24),				hints, false));		this.UI_MANAGER.addElement(1, new Text("by TRiLeZ", 103 + 1, 370 + 1,				new Color(0, 128, 192), new Font("Segoe UI", Font.BOLD, 12),				hints, false));		this.UI_MANAGER.addElement(1, new Text(new CustomRet_0P<String>() {			@Override			public String ret() {				DecimalFormat twoDForm = new DecimalFormat("#.##");				double mult = 3600000.0000D / getRunningTime();				String PH = twoDForm.format(mult * trips);				return "Trips: " + trips + "(" + PH + "/hr)";			}		}, 12, 390, new Color(0, 128, 192),				new Font("Segoe UI", Font.PLAIN, 12), null, false));		this.UI_MANAGER.addElement(1, new Text(new CustomRet_0P<String>() {			@Override			public String ret() {				DecimalFormat twoDForm = new DecimalFormat("#.##");				double mult = 3600000.0000D / getRunningTime();				String PH = twoDForm.format(mult * runes_made);				return "Runes Made: " + runes_made + "(" + PH + "/hr)";			}		}, 12, 404, new Color(0, 128, 192),				new Font("Segoe UI", Font.PLAIN, 12), null, false));		this.UI_MANAGER.addElement(				1,				new Text(new CustomRet_0P<String>() {					@Override					public String ret() {						return "Levels Gained: "								+ (Skills.SKILLS.RUNECRAFTING.getActualLevel() - start_level);					}				}, 12, 418, new Color(0, 128, 192), new Font("Segoe UI",						Font.PLAIN, 12), null, false));		this.UI_MANAGER.addElement(1, new Text(new CustomRet_0P<String>() {			@Override			public String ret() {				DecimalFormat twoDForm = new DecimalFormat("#.##");				double mult = 3600000.0000D / getRunningTime();				int xp = (Skills.SKILLS.RUNECRAFTING.getXP() - start_xp);				String PH = twoDForm.format(mult * xp);				return "XP Gained: " + xp + "(" + PH + "/hr)";			}		}, 12, 432, new Color(0, 128, 192),				new Font("Segoe UI", Font.PLAIN, 12), null, false));		XPBar xpbar = new XPBar(12, 445, 496, 20, "runecrafting");		xpbar.green_colour = new Color(0, 128, 192);		xpbar.red_colour = new Color(0, 159, 236);		this.UI_MANAGER.addElement(1, xpbar);		this.UI_MANAGER.addElement(1, new BasicHideButton(this.UI_MANAGER, 491,				350, 16, 16, new Color(0, 128, 192)));	}	public boolean isAtBank() {		final RSNPC[] bankers = NPCs.find(this.BANKER_ID);		for (final RSNPC banker : bankers)			if (banker.isOnScreen())				return true;		final RSObject[] booths = Objects.find(10, this.BANK_BOOTH_ID);		for (final RSObject booth : booths)			if (booth.isOnScreen())				return true;		return false;	}	public boolean isAtRuins() {		final RSObject ruins = findRuins();		if (ruins == null)			return false;		return ruins.isOnScreen();	}	public boolean isAtAlter() {		final RSObject[] booths = Objects.find(10, this.ALTER_ID);		for (final RSObject booth : booths)			if (booth.isOnScreen())				return true;		return false;	}	public boolean craftRunes() {		final RSObject[] alter = Objects.findNearest(15, this.ALTER_ID);		if (alter.length == 0)			return false;		if (!alter[0].isOnScreen()) {			PathFinding.aStarWalk(alter[0].getPosition());			Timing.waitCondition(new Condition() {				@Override				public boolean active() {					return alter[0].isOnScreen();				}			}, 4000);			General.sleep(400, 600);		}		if (!alter[0].isOnScreen())			return false;		if (Game.isUptext("Use")) {			Mouse.click(3);			Timing.waitMenuOpen(3000);			ChooseOption.select("Cancel");		}		boolean clicked = false;		if (Player.isMoving())			clicked = DynamicClicking.clickRSObject(alter[0], "Craft");		else			clicked = alter[0].click("Craft");		if (Game.isUptext("Use")) {			Mouse.click(3);			Timing.waitMenuOpen(3000);			ChooseOption.select("Cancel");		}		if (!clicked)			return false;		Timing.waitCondition(new Condition() {			@Override			public boolean active() {				return Player.getAnimation() > 0;			}		}, 5000);		if (Timing.waitCondition(new Condition() {			@Override			public boolean active() {				return Inventory.getCount(ESSENCE_ID) == 0;			}		}, 6000)) {			General.sleep(400, 600);			// ABC: Hovering Objects			final boolean hover = this.abc_util.BOOL_TRACKER.HOVER_NEXT.next();			if (hover) {				exitAlter(true);				this.abc_util.BOOL_TRACKER.HOVER_NEXT.reset();			}			this.abc_util.BOOL_TRACKER.HOVER_NEXT.reset();			Timing.waitCondition(new Condition() {				@Override				public boolean active() {					return Player.getAnimation() < 1;				}			}, General.random(4000, 5000));			// ABC: Responding to Switching Objects			final long delay = this.abc_util.DELAY_TRACKER.SWITCH_OBJECT.next();			sleep(delay);			this.abc_util.DELAY_TRACKER.SWITCH_OBJECT.reset();			return true;		}		return false;	}	public boolean exitAlter(final boolean only_hover) {		final RSObject[] portal = Objects.findNearest(15, this.PORTAL_ID);		if (portal.length == 0)			return false;		if (!portal[0].isOnScreen()) {			if (only_hover)				return false;			PathFinding.aStarWalk(portal[0].getPosition());			Timing.waitCondition(new Condition() {				@Override				public boolean active() {					return portal[0].isOnScreen();				}			}, 4000);			General.sleep(400, 600);		}		if (!portal[0].isOnScreen())			return false;		if (only_hover)			return DynamicClicking.clickRSObject(portal[0], 0);		if (!DynamicClicking.clickRSObject(portal[0], "Use Portal"))			return false;		// ABC: Check XP		final long check_xp = this.abc_util.TIME_TRACKER.CHECK_XP.next();		if (check_xp > 0 && System.currentTimeMillis() > check_xp) {			if (GameTab.TABS.STATS.open()) {				General.sleep(100, 300);				Mouse.moveBox(555, 400, 600, 414);				sleep(800, 2000);				this.abc_util.TIME_TRACKER.CHECK_XP.reset();			}		}		return Timing.waitCondition(new Condition() {			@Override			public boolean active() {				return !isAtAlter();			}		}, 5000);	}	public RSObject findRuins() {		final RSObject[] objects = Objects.getAll(10);		for (final RSObject object : objects) {			RSObjectDefinition def = object.getDefinition();			if (def == null)				continue;			String name = def.getName();			def = null;			if (name != null && !name.equals("null"))				continue;			RSModel model = object.getModel();			if (model == null)				continue;			int len = 0;			Point[] ps = model.getPoints();			if (ps != null)				len = ps.length;			ps = null;			model = null;			if (len == 2073)				return object;		}		return null;	}	public boolean enterAlter() {		final RSObject ruins = findRuins();		if (ruins == null)			return false;		String action = null;		if (Inventory.getCount(this.TALISMAN_ID) > 0) {			if (!Game.isUptext("->")) {				Clicking.click("Use", Inventory.find(this.TALISMAN_ID));				General.sleep(150, 250);				action = "-> Mysterious ruins";			}		}		if (!DynamicClicking.clickRSObject(ruins, action)) {			println("Failed to click ruins.");			return false;		}		println("Waiting to enter alter.");		return Timing.waitCondition(new Condition() {			@Override			public boolean active() {				return isAtAlter();			}		}, 6000);	}	public boolean bank() {		if (!Banking.isBankScreenOpen()) {			if (!Banking.openBank())				return false;		}		if (!Banking.isBankScreenOpen())			return false;		Banking.depositAllExcept(this.TALISMAN_ID);		General.sleep(300, 450);		if (!Timing.waitCondition(new Condition() {			@Override			public boolean active() {				return Banking.find(ESSENCE_ID).length > 0;			}		}, 4000)) {			println("We are out of essence. Stopping script.");			this.stop_script = true;			return false;		}		Banking.withdraw(0, this.ESSENCE_ID);		return Timing.waitCondition(new Condition() {			@Override			public boolean active() {				return Inventory.getCount(ESSENCE_ID) > 0;			}		}, 4000);	}	public boolean examineObject() {		final RSObject[] obj = Objects.findNearest(10, new Filter<RSObject>() {			@Override			public boolean accept(RSObject o) {				return Projection.isInViewport(Projection.tileToScreen(o, 0));			}		});		if (obj.length < 1)			return false;		if (DynamicClicking.clickRSObject(				obj[General.random(0, obj.length - 1)], "Examine")) {			this.abc_util.TIME_TRACKER.EXAMINE_OBJECT.reset();			return true;		}		return false;	}	@Override	public STATE getInitialState() {		super.setSleepTime(100);		init();		return STATE.CHECK;	}	@Override	public STATE handleState(STATE t) {		if (this.stop_script)			return null;		if (Camera.getCameraAngle() < 90)			Camera.setCameraAngle(100);		if (this.start_level == -1)			this.start_level = Skills.SKILLS.RUNECRAFTING.getActualLevel();		if (this.start_xp == -1)			this.start_xp = Skills.SKILLS.RUNECRAFTING.getXP();		switch (t) {		case CHECK:			if (Inventory.getCount(this.ESSENCE_ID) > 0) {				if (isAtAlter())					return STATE.CRAFT_RUNES;				else if (isAtRuins())					return STATE.ENTER_ALTER;				else					return STATE.WALK_TO_RUINS;			} else {				if (isAtAlter())					return STATE.EXIT_ALTER;				else if (isAtBank())					return STATE.BANK;				else					return STATE.WALK_TO_BANK;			}		case CRAFT_RUNES:			if (craftRunes())				return STATE.EXIT_ALTER;			break;		case EXIT_ALTER:			if (exitAlter(false))				this.runes_made += Inventory.getCount(this.RUNES_ID);			return STATE.CHECK;		case WALK_TO_BANK:			// ABC: Activating Run			int run_at = this.abc_util.INT_TRACKER.NEXT_RUN_AT.next();			if (run_at > 0 && Game.getRunEnergy() > run_at) {				Options.setRunOn(true);				this.abc_util.INT_TRACKER.NEXT_RUN_AT.reset();			}			Walking.walkPath((Positionable[]) this.PATH_TO_BANK);			// ABC: Examining Random Objects			long next_examine = this.abc_util.TIME_TRACKER.EXAMINE_OBJECT					.next();			if (next_examine > 0 && System.currentTimeMillis() > next_examine)				examineObject();			// ABC: Randomly Rotating Camera			long next_camera = this.abc_util.TIME_TRACKER.ROTATE_CAMERA.next();			if (next_camera > 0 && System.currentTimeMillis() > next_camera) {				final int rotation = Camera.getCameraRotation()						+ General.random(-20, 20) % 360;				Camera.setCameraRotation(rotation);				this.abc_util.TIME_TRACKER.ROTATE_CAMERA.reset();			}			Timing.waitCondition(new Condition() {				@Override				public boolean active() {					return isAtBank();				}			}, 8000);			return STATE.CHECK;		case WALK_TO_RUINS:			// ABC: Activating Run			run_at = this.abc_util.INT_TRACKER.NEXT_RUN_AT.next();			if (run_at > 0 && Game.getRunEnergy() > run_at) {				Options.setRunOn(true);				this.abc_util.INT_TRACKER.NEXT_RUN_AT.reset();			}			Walking.walkPath((Positionable[]) this.PATH_TO_RUINS);			// ABC: Examining Random Objects			next_examine = this.abc_util.TIME_TRACKER.EXAMINE_OBJECT.next();			if (next_examine > 0 && System.currentTimeMillis() > next_examine)				examineObject();			// ABC: Randomly Rotating Camera			next_camera = this.abc_util.TIME_TRACKER.ROTATE_CAMERA.next();			if (next_camera > 0 && System.currentTimeMillis() > next_camera) {				final int rotation = Camera.getCameraRotation()						+ General.random(-20, 20) % 360;				Camera.setCameraRotation(rotation);				this.abc_util.TIME_TRACKER.ROTATE_CAMERA.reset();			}			Timing.waitCondition(new Condition() {				@Override				public boolean active() {					return isAtRuins();				}			}, 8000);			return STATE.CHECK;		case BANK:			if (bank()) {				this.trips++;				return STATE.WALK_TO_RUINS;			}			break;		case ENTER_ALTER:			if (enterAlter())				return STATE.CRAFT_RUNES;			break;		}		return STATE.CHECK;	}	@Override	public void onPaint(Graphics g) {		this.UI_MANAGER.paint(g);	}	@Override	public OVERRIDE_RETURN overrideMouseEvent(MouseEvent e) {		return this.UI_MANAGER.overrideMouseEvent(e);	}	@Override	public OVERRIDE_RETURN overrideKeyEvent(KeyEvent e) {		println(System.currentTimeMillis() + ": " + e);		return this.UI_MANAGER.overrideKeyEvent(e);	}}

TRiCraft w/ ABC. Took about 10 minutes to implement.

1 person likes this

Share this post


Link to post
Share on other sites

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.