View difference between Paste ID: GxtM3Nb4 and H364yNYm
SHOW: | | - or go back to the newest paste.
1
import java.awt.Color;
2
import java.awt.Graphics;
3
import java.awt.Point;
4
import java.awt.Polygon;
5
import java.util.HashSet;
6
import java.util.Set;
7
8
import org.rsbot.event.events.MessageEvent;
9
import org.rsbot.event.listeners.MessageListener;
10
import org.rsbot.event.listeners.PaintListener;
11
import org.rsbot.script.Script;
12
import org.rsbot.script.ScriptManifest;
13
import org.rsbot.script.methods.Game;
14
import org.rsbot.script.methods.Skills;
15
import org.rsbot.script.util.Filter;
16
import org.rsbot.script.util.Timer;
17
import org.rsbot.script.wrappers.RSArea;
18
import org.rsbot.script.wrappers.RSItem;
19
import org.rsbot.script.wrappers.RSModel;
20
import org.rsbot.script.wrappers.RSNPC;
21
import org.rsbot.script.wrappers.RSObject;
22
import org.rsbot.script.wrappers.RSPath;
23
import org.rsbot.script.wrappers.RSTile;
24
import org.rsbot.script.wrappers.RSTilePath;
25
26
@ScriptManifest(authors = "Aion, Tak",
27
        name = "Tak's Modified Air Crafter",
28
        version = 0.1,
29
        description = "Modified Aion Air Crafter Supports Pure Essance.")
30
public class TaksAirCrafter extends Script implements PaintListener, MessageListener {
31
32
    public static interface Constants {
33
34
        int ITEM_AIR_RUNE = 556;
35
36
        int ITEM_AIR_TALISMAN = 1438;
37
38
        int ITEM_RUNE_ESS = 1436;
39
        
40
        int ITEM_PRUNE_ESS = 7936;
41
42
        int OBJECT_ALTAR = 2478;
43
44
        int OBJECT_PORTAL = 2465;
45
46
        int OBJECT_RUINS = 2452;
47
48
        int NPC_BANKER = 5912;
49
50
        double VERSION = TaksAirCrafter.class.getAnnotation(ScriptManifest.class).version();
51
52
        Filter<RSNPC> FILTER_NPC = new Filter<RSNPC>() {
53
            public boolean accept(RSNPC t) {
54
                return t != null && t.getID() == Constants.NPC_BANKER;
55
            }
56
        };
57
58
        RSTile[] PATH = {
59
                new RSTile(3185, 3434), new RSTile(3173, 3428),
60
                new RSTile(3159, 3423), new RSTile(3147, 3415),
61
                new RSTile(3135, 3407), new RSTile(3129, 3405)
62
        };
63
64
        RSArea AREA_ALTAR = new RSArea(new RSTile(2835, 4823), new RSTile(2851, 4843));
65
66
        RSArea AREA_BANK = new RSArea(new RSTile(3178, 3431), new RSTile(3195, 3447));
67
68
        RSArea AREA_RUINS = new RSArea(new RSTile(3122, 3401), new RSTile(3132, 3409));
69
70
        RSArea AREA_MUSICIAN = new RSArea(new RSTile(3149, 3419), new RSTile(3157, 3424));
71
    }
72
73
    public static abstract class Action {
74
75
        public abstract String getDesc();
76
77
        public abstract boolean isValid();
78
79
        public abstract void process();
80
    }
81
82
    public class BankAction extends Action {
83
84
        public String getDesc() {
85
            if (!bank.isOpen()) {
86
                return "Opening bank.";
87
            } else if (inventory.contains(Constants.ITEM_AIR_RUNE)) {
88
                return "Depositing items.";
89
            }
90
            return "Withdrawing items.";
91
        }
92
93
        public boolean isValid() {
94
            return !canCraft() && inBank();
95
        }
96
97
        public void process() {
98
            if (bank.isOpen()) {
99
                if (inventory.contains(Constants.ITEM_AIR_RUNE)) {
100
                    if (inventory.containsOneOf(Constants.ITEM_AIR_TALISMAN, Constants.ITEM_RUNE_ESS, Constants.ITEM_PRUNE_ESS)) {
101
                        bank.depositAllExcept(Constants.ITEM_AIR_TALISMAN, Constants.ITEM_RUNE_ESS, Constants.ITEM_PRUNE_ESS);
102
                    } else {
103
                        bank.depositAll();
104
                    }
105
                } else if (!inventory.contains(Constants.ITEM_RUNE_ESS) || !inventory.contains(Constants.ITEM_PRUNE_ESS)) {
106
                    int runeCount = bank.getCount(Constants.ITEM_RUNE_ESS);
107
                    int pruneCount = bank.getCount(Constants.ITEM_PRUNE_ESS);
108
                    if (runeCount < 1) {
109
                        log("You are out of rune essences!");
110
                    } else {
111
                        bank.withdraw(Constants.ITEM_RUNE_ESS, 0);
112
                    }
113
                    
114
                    if(pruneCount < 1) {
115
                        log("You are out of pure rune essences!");
116
                    } else {
117
                        bank.withdraw(Constants.ITEM_PRUNE_ESS, 0);
118
                    }
119
                }
120
                sleep(600, 800);
121
            } else {
122
                RSNPC banker = npcs.getNearest(Constants.FILTER_NPC);
123
                if (banker != null) {
124
                    while (!bank.isOpen()) {
125
                        camera.setAngle(random(1, 359));
126
127
                        mouse.move(banker.getModel().getPoint(), 1, 1);
128
                        mouse.click(false);
129
                        menu.doAction("Bank banker");
130
                        sleep(random(600, 800));
131
                            
132
                        if (!bank.isOpen()) {
133
                            bank.open();
134
                        }
135
                    }
136
                }
137
            }
138
        }
139
    }
140
141
    public abstract class ObjectAction extends Action {
142
143
        private String action;
144
        private int id;
145
146
        public ObjectAction(String action, int id) {
147
            this.action = action;
148
            this.id = id;
149
        }
150
151
        public String getDesc() {
152
            return "Interacting with object.";
153
        }
154
155
        public void process() {
156
            RSObject object = objects.getNearest(id);
157
            if (object != null) {
158
                if (object.isOnScreen()) {
159
                    object.doAction(action);
160
                    if (calc.distanceTo(object) > 1) {
161
                        waitToMove(random(600, 900));
162
                    }
163
                } else {
164
                    camera.turnToObject(object);
165
                    if (!object.isOnScreen()) {
166
                        walking.getPath(object.getLocation()).traverse();
167
                    }
168
                }
169
            }
170
        }
171
    }
172
173
    public abstract class WalkToArea extends Action {
174
175
        private RSPath path;
176
177
        public WalkToArea(RSPath path) {
178
            this.path = path;
179
        }
180
181
        protected abstract boolean canRest();
182
183
        protected abstract boolean isTargetValid();
184
185
        public boolean isValid() {
186
            return isTargetValid();
187
        }
188
189
        public void process() {
190
            if (walking.getEnergy() < 20) {
191
                if (canRest() && inMusician()) {
192
                    RSTilePath tilePath = walking.newTilePath(Constants.AREA_MUSICIAN.getTileArray());
193
                    if (!tilePath.traverse()) {
194
                        walking.newTilePath(new RSTile[]{Constants.AREA_MUSICIAN.getCentralTile()}).traverse();
195
                    }
196
                    waitToMove(random(600, 900));
197
                    walking.rest(100);
198
                }
199
            } else if (!walking.isRunEnabled()) {
200
                walking.setRun(true);
201
            }
202
            path.traverse();
203
        }
204
    }
205
206
    private int runesCrafted;
207
208
    private int startExp;
209
    private int startLvl;
210
211
    private Set<Action> actions;
212
    private Action action;
213
214
    private Timer timer;
215
216
    @Override
217
    public boolean onStart() {
218
        timer = new Timer(0);
219
220
        actions = new HashSet<Action>();
221
222
        actions.add(new BankAction());
223
224
        actions.add(new ObjectAction("Enter", Constants.OBJECT_RUINS) {
225
226
            @Override
227
            public String getDesc() {
228
                return "Entering mysterious ruins.";
229
            }
230
231
            public boolean isValid() {
232
                return canCraft() && inRuins();
233
            }
234
235
            public void process() {
236
                if (inventory.contains(Constants.ITEM_AIR_TALISMAN)) {
237
                    if (!inventory.isItemSelected()) {
238
                        inventory.getItem(Constants.ITEM_AIR_TALISMAN).doClick(true);
239
                    } else {
240
                        RSItem selItem = inventory.getSelectedItem();
241
                        if (selItem.getID() != Constants.ITEM_AIR_TALISMAN) {
242
                            selItem.doClick(true);
243
                            return;
244
                        }
245
                    }
246
                    RSObject obj = objects.getNearest(Constants.OBJECT_ALTAR);
247
                    if (obj != null) {
248
                        Point toClick = getScreenPoint(obj);
249
                        if (toClick.x != -1 && toClick.y != -1) {
250
                            mouse.click(toClick, true);
251
                            if (calc.distanceTo(obj) > 1) {
252
                                waitToMove(random(600, 900));
253
                            }
254
                            return;
255
                        } else if (obj.isOnScreen()) {
256
                            obj.doClick(true);
257
                            if (calc.distanceTo(obj) > 1) {
258
                                waitToMove(random(600, 900));
259
                            }
260
                        } else {
261
                            camera.turnToObject(obj);
262
                            if (!obj.isOnScreen())
263
                                walking.getPath(obj.getLocation()).traverse();
264
                        }
265
                    }
266
                } else {
267
                    super.process();
268
                }
269
                waitToStop();
270
            }
271
        });
272
273
        actions.add(new ObjectAction("Craft-rune", Constants.OBJECT_ALTAR) {
274
275
            @Override
276
            public String getDesc() {
277
                return "Crafting runes.";
278
            }
279
280
            public boolean isValid() {
281
                return canCraft() && inAltar();
282
            }
283
284
            public void process() {
285
                super.process();
286
                sleep(200, 400);
287
                waitForAnim(random(900, 1200));
288
                if (random(1, 6) == 3) {
289
                    RSObject portal = objects.getNearest(Constants.OBJECT_PORTAL);
290
                    if (portal != null) {
291
                        Point toClick = getScreenPoint(portal);
292
                        if (toClick.x != -1 && toClick.y != -1) {
293
                            mouse.click(toClick, true);
294
                        } else {
295
                            portal.doClick(false);
296
                        }
297
                        if (menu.isOpen()) {
298
                            if (!menu.contains("Enter")) {
299
                                while (menu.isOpen()) {
300
                                    mouse.moveRandomly(750);
301
                                }
302
                            }
303
                        }
304
                    }
305
                }
306
            }
307
        });
308
309
        actions.add(new ObjectAction("Enter", Constants.OBJECT_PORTAL) {
310
311
            public String getDesc() {
312
                return "Leaving mysterious ruins";
313
            }
314
315
            public boolean isValid() {
316
                return !canCraft() && inAltar();
317
            }
318
319
            public void process() {
320
                if (menu.isOpen()) {
321
                    if (menu.contains("Enter")) {
322
                        menu.doAction("Enter");
323
                        waitToMove(random(600, 900));
324
                    } else {
325
                        mouse.moveSlightly();
326
                    }
327
                } else {
328
                    super.process();
329
                }
330
                waitToStop();
331
            }
332
        });
333
334
        actions.add(new WalkToArea(walking.newTilePath(Constants.PATH).reverse()) {
335
336
            protected boolean canRest() {
337
                return true;
338
            }
339
340
            protected boolean isTargetValid() {
341
                return !canCraft() && !inAltar() && !inBank();
342
            }
343
344
            public String getDesc() {
345
                return "Heading to bank";
346
            }
347
        });
348
349
        actions.add(new WalkToArea(walking.newTilePath(Constants.PATH)) {
350
351
            protected boolean canRest() {
352
                return true;
353
            }
354
355
            protected boolean isTargetValid() {
356
                return canCraft() && !inRuins() && !inAltar();
357
            }
358
359
            public String getDesc() {
360
                return "Heading to mysterious ruins";
361
            }
362
        });
363
364
        startExp = skills.getCurrentExp(Skills.RUNECRAFTING);
365
        startLvl = skills.getCurrentLevel(Skills.RUNECRAFTING);
366
        return true;
367
    }
368
369
    public int loop() {
370
        if (interfaces.get(741).isValid()) {
371
            interfaces.getComponent(741, 9).doClick();
372
            return random(300, 500);
373
        } else if (interfaces.get(740).isValid()) {
374
            env.saveScreenshot(false);
375
            interfaces.getComponent(740, 3).doClick();
376
            sleep(600, 700);
377
            if (game.getCurrentTab() != Game.TAB_STATS) {
378
                game.openTab(Game.TAB_STATS);
379
                sleep(800, 1200);
380
            }
381
            skills.doHover(Skills.INTERFACE_RUNECRAFTING);
382
            sleep(150, 300);
383
            mouse.click(true);
384
            return random(random(1000, 1300), 2000);
385
        }
386
387
        if (action != null) {
388
            if (action.isValid()) {
389
                action.process();
390
            } else {
391
                action = null;
392
            }
393
        } else {
394
            for (Action a : actions) {
395
                if (a.isValid()) {
396
                    action = a;
397
                    break;
398
                }
399
            }
400
        }
401
        if (random(1, 10) == random(1, 6)) {
402
            antiban();
403
        }
404
        return random(200, 400);
405
    }
406
407
    public void onRepaint(Graphics g) {
408
        if (game.isLoggedIn() && !game.isLoginScreen()) {
409
            g.setColor(new Color(16, 16, 16, 123));
410
            g.fillRoundRect(8, 179, 243, 153, 15, 15);
411
412
            g.setColor(Color.RED);
413
            g.draw3DRect(13, 291, 231, 15, true);
414
415
            g.setColor(new Color(48, 225, 48, 170));
416
            g.fill3DRect(14, 292, (getPercentToLvl() * 229 / 100), 14, true);
417
418
            g.setColor(Color.WHITE);
419
            g.drawString("Aion's Air Crafter v" + getVersion(), 65, 192);
420
            g.drawString("Runtime: " + getRuntime(), 13, 206);
421
422
            g.drawString("Crafted " + format(getRunesCrafted()) + " air runes", 13, 225);
423
            g.drawString("Gained " + format(getExpGained()) + " exp", 13, 239);
424
            g.drawString("Runes/Hour: " + format((int) getRunesHour()), 140, 225);
425
            g.drawString("Exp/Hour: " + format((int) getExpHour()), 140, 239);
426
427
            int lvlGained = getLvlGained();
428
            String text = lvlGained == 0 ? "runecrafting" : "";
429
            g.drawString("Current " + text + " level: " + getRunecraftLvl(), 13, 258);
430
            if (lvlGained != 0) {
431
                text = lvlGained == 1 ? "" : "s";
432
                g.drawString("Gained " + lvlGained + " level" + text, 140, 258);
433
            }
434
435
            g.drawString("Exp left: " + format(getExpToLvl()), 13, 272);
436
            g.drawString("Runes left: " + format(getRunesLeft()), 140, 272);
437
            g.drawString("Estimated time to level: " + getTimeToLvl(), 13, 286);
438
            g.drawString(getPercentToLvl() + "%", 113, 303);
439
440
            if (action != null) {
441
                g.drawString("Status: " + action.getDesc(), 13, 325);
442
            }
443
444
        }
445
446
        Point mPoint = mouse.getLocation();
447
        Point pPoint = mouse.getPressLocation();
448
        long mpt = System.currentTimeMillis() - mouse.getPressTime();
449
450
        if (mpt < 1000) {
451
            g.setColor(Color.red);
452
            g.drawOval(pPoint.x - 2, pPoint.y - 2, 4, 4);
453
            g.drawOval(pPoint.x - 9, pPoint.y - 9, 18, 18);
454
        }
455
456
        g.setColor(Color.YELLOW);
457
        g.drawOval(mPoint.x - 2, mPoint.y - 2, 4, 4);
458
        g.drawOval(mPoint.x - 9, mPoint.y - 9, 18, 18);
459
    }
460
461
    public void messageReceived(MessageEvent e) {
462
        String message = e.getMessage().toLowerCase();
463
        if (message.contains("bind the temple")) {
464
            runesCrafted += inventory.getCount(Constants.ITEM_RUNE_ESS);
465
            runesCrafted += inventory.getCount(Constants.ITEM_PRUNE_ESS);
466
        } else if (message.contains("you've just")) {
467
            log(message);
468
        }
469
    }
470
471
    private void antiban() {
472
        switch (random(1, 50)) {
473
            case 2:
474
                if (random(1, 5) != 1) {
475
                    break;
476
                }
477
                mouse.moveSlightly();
478
                break;
479
            case 6:
480
                if (random(1, 18) != 7) {
481
                    break;
482
                }
483
                if (game.getCurrentTab() != Game.TAB_STATS) {
484
                    game.openTab(Game.TAB_STATS);
485
                    sleep(500, 900);
486
                }
487
                skills.doHover(Skills.INTERFACE_RUNECRAFTING);
488
                sleep(random(1400, 2000), 3000);
489
                if (random(0, 5) != 3) {
490
                    break;
491
                }
492
                mouse.moveSlightly();
493
                break;
494
            case 9:
495
            case 14:
496
            case 17:
497
            case 25:
498
                camera.setAngle(random(-360, 360));
499
                break;
500
            case 30:
501
            case 34:
502
            case 37:
503
            case 40:
504
                camera.setPitch(camera.getPitch() >= random(65, 101) ? random(0, 61) : random(61, 101));
505
        }
506
    }
507
508
    private boolean canCraft() {
509
        return inventory.contains(Constants.ITEM_RUNE_ESS) || inventory.contains(Constants.ITEM_PRUNE_ESS);
510
    }
511
512
    private String format(int number) {
513
        return format(String.valueOf(number));
514
    }
515
516
    private String format(String number) {
517
        if (number.length() < 4) {
518
            return number;
519
        }
520
        return format(number.substring(0, number.length() - 3)) + ","
521
                + number.substring(number.length() - 3, number.length());
522
    }
523
524
    private int getExpGained() {
525
        if (startExp == -1) {
526
            if (game.getClientState() == 10) {
527
                startExp = skills.getCurrentExp(Skills.RUNECRAFTING);
528
            }
529
        }
530
        return skills.getCurrentExp(Skills.RUNECRAFTING) - startExp;
531
    }
532
533
    private double getExpHour() {
534
        int xpGained = getExpGained();
535
        long start = System.currentTimeMillis() - timer.getElapsed();
536
        return xpGained * 3600000D / (System.currentTimeMillis() - start);
537
    }
538
539
    private int getExpToLvl() {
540
        return skills.getExpToNextLevel(Skills.RUNECRAFTING);
541
    }
542
543
    private int getLvlGained() {
544
        if (startLvl == -1) {
545
            if (game.getClientState() == 10) {
546
                startLvl = skills.getCurrentLevel(Skills.RUNECRAFTING);
547
            }
548
        }
549
        return skills.getCurrentLevel(Skills.RUNECRAFTING) - startLvl;
550
    }
551
552
    private int getPercentToLvl() {
553
        return skills.getPercentToNextLevel(Skills.RUNECRAFTING);
554
    }
555
556
    private int getRunecraftLvl() {
557
        return skills.getCurrentLevel(Skills.RUNECRAFTING);
558
    }
559
560
    private int getRunesCrafted() {
561
        return runesCrafted;
562
    }
563
564
    private double getRunesHour() {
565
        int runes = getRunesCrafted();
566
        long start = System.currentTimeMillis() - timer.getElapsed();
567
        return runes * 3600000D / (System.currentTimeMillis() - start);
568
    }
569
570
    private int getRunesLeft() {
571
        return getExpToLvl() / 5;
572
    }
573
574
    private String getRuntime() {
575
        return timer.toElapsedString();
576
    }
577
578
    private Point getScreenPoint(RSObject obj) {
579
        if (obj != null) {
580
            RSModel model = obj.getModel();
581
            if (model != null) {
582
                for (Polygon pol : model.getTriangles()) {
583
                    for (int i = 0; i < pol.npoints; i++) {
584
                        Point p = new Point(pol.xpoints[i], pol.ypoints[i]);
585
                        if (calc.pointOnScreen(p)) {
586
                            return p;
587
                        }
588
                    }
589
                }
590
            }
591
        }
592
        return new Point(-1, -1);
593
    }
594
595
    private String getTimeFormat(long time) {
596
        return Timer.format(time);
597
    }
598
599
    private String getTimeToLvl() {
600
        return getTimeFormat((long) (getExpToLvl() / getExpHour() * 3600000D));
601
    }
602
603
    private double getVersion() {
604
        return Constants.VERSION;
605
    }
606
607
    private boolean inAltar() {
608
        return Constants.AREA_ALTAR.contains(getMyPlayer().getLocation());
609
    }
610
611
    private boolean inBank() {
612
        return Constants.AREA_BANK.contains(getMyPlayer().getLocation());
613
    }
614
615
    private boolean inRuins() {
616
        return Constants.AREA_RUINS.contains(getMyPlayer().getLocation());
617
    }
618
619
    private boolean inMusician() {
620
        return Constants.AREA_MUSICIAN.contains(getMyPlayer().getLocation());
621
    }
622
623
    private void waitForAnim(int timeout) {
624
        long endTime = System.currentTimeMillis() + timeout;
625
        while (System.currentTimeMillis() < endTime) {
626
            if (getMyPlayer().getAnimation() != -1) {
627
                break;
628
            }
629
            sleep(5, 15);
630
        }
631
    }
632
633
    private void waitForIface(int iface, int timeout) {
634
        long endTime = System.currentTimeMillis() + timeout;
635
        while (System.currentTimeMillis() < endTime) {
636
            if (interfaces.get(iface).isValid()) {
637
                break;
638
            }
639
            sleep(5, 15);
640
        }
641
    }
642
643
    private boolean waitToMove(int timeout) {
644
        long endTime = System.currentTimeMillis() + timeout;
645
        while (System.currentTimeMillis() < endTime) {
646
            if (getMyPlayer().isMoving()) {
647
                return true;
648
            }
649
            sleep(5, 15);
650
        }
651
        return false;
652
    }
653
654
    private void waitToStop() {
655
        do {
656
            sleep(5, 15);
657
        } while (getMyPlayer().isMoving());
658
    }