Welcome!

By registering with us, you'll be able to discuss, share and private message with other members of our community.

Sign up now!

Bug RS3 Action Bar Activation slow on Revolution Mode

Joined
Sep 30, 2015
Messages
86
When in Combat, action bar activation is incredibly slow on Revolution mode with Basic Abilities in the Action Bar

Code:
ActionBar.newQuery().names("Hurricane", "Quake", "Meteor Strike").ready(true).results().first().activate;

in a 500 ms loop would only properly activate one of the abilities maybe once every minute.

It seems like .ready is affected by the global 2-3 second cool down after casting an ability.
 
Hexis bots go brrr
Joined
Dec 9, 2016
Messages
4,427
I've found that filtering if it's cooling down or not is the best way to do it for me
Code:
ability = ActionBar.newQuery().names(Utilities.ADRENALINE_ABILITIES).filter(o -> !o.isCoolingDown()).results().random();
 
Engineer
Joined
Jul 28, 2013
Messages
2,776
When in Combat, action bar activation is incredibly slow on Revolution mode with Basic Abilities in the Action Bar

Code:
ActionBar.newQuery().names("Hurricane", "Quake", "Meteor Strike").ready(true).results().first().activate;

in a 500 ms loop would only properly activate one of the abilities maybe once every minute.

It seems like .ready is affected by the global 2-3 second cool down after casting an ability.
It may be because of .ready(true), it's a combination of isActivatable and !isCoolingDown. The next release has both of those individually in the query builder so when that's out play around with it and let me know what you find out.
 
Joined
Sep 30, 2015
Messages
86
It may be because of .ready(true), it's a combination of isActivatable and !isCoolingDown. The next release has both of those individually in the query builder so when that's out play around with it and let me know what you find out.

I think .ready is part of it, but the core root of the issue is .isCoolingDown, since it appears to take into account the global cooldown after an ability is cast.

I'd suggest adding an option to isCoolingDown to check if it's on global cooldown, or regular cooldown (Global Cooldown is 2 seconds, anything more than 2 seconds of cooldown is ability cooldown) if that's even possible, without using interface components like I do, which in itself requires visual cooldown timers.

Code:
public boolean isActivatable(ActionBar.Slot slot){
        return slot.isActivatable() && isOffGlobal(slot);
    }

    public boolean isOffGlobal(ActionBar.Slot slot) {
        return getCooldown(slot)<=2;
    }


    public int getCooldown(ActionBar.Slot slot) {
        Abilities.ActionBarSlotCds slotCd = getAbByIndex(slot.getIndex());
        if (slotCd != null) {
            String cdText = Interfaces.getAt(slotCd.container, slotCd.child).getText();
            if (cdText.isEmpty())
                cdText = "0";
            return Integer.parseInt(cdText);
        }
        return -1;
    }

This works perfectly, but requires both visual timers and ability queuing to work as intended.
 
Engineer
Joined
Jul 28, 2013
Messages
2,776
I think .ready is part of it, but the core root of the issue is .isCoolingDown, since it appears to take into account the global cooldown after an ability is cast.

I'd suggest adding an option to isCoolingDown to check if it's on global cooldown, or regular cooldown (Global Cooldown is 2 seconds, anything more than 2 seconds of cooldown is ability cooldown) if that's even possible, without using interface components like I do, which in itself requires visual cooldown timers.

Code:
public boolean isActivatable(ActionBar.Slot slot){
        return slot.isActivatable() && isOffGlobal(slot);
    }

    public boolean isOffGlobal(ActionBar.Slot slot) {
        return getCooldown(slot)<=2;
    }


    public int getCooldown(ActionBar.Slot slot) {
        Abilities.ActionBarSlotCds slotCd = getAbByIndex(slot.getIndex());
        if (slotCd != null) {
            String cdText = Interfaces.getAt(slotCd.container, slotCd.child).getText();
            if (cdText.isEmpty())
                cdText = "0";
            return Integer.parseInt(cdText);
        }
        return -1;
    }

This works perfectly, but requires both visual timers and ability queuing to work as intended.
I glanced in the past and couldn't find a way to detect cooldowns smoothly without the user having a specific setup which can't be depended on.
 
Niche bots at your disposal
Joined
Dec 23, 2015
Messages
1,104
I think .ready is part of it, but the core root of the issue is .isCoolingDown, since it appears to take into account the global cooldown after an ability is cast.

I'd suggest adding an option to isCoolingDown to check if it's on global cooldown, or regular cooldown (Global Cooldown is 2 seconds, anything more than 2 seconds of cooldown is ability cooldown) if that's even possible, without using interface components like I do, which in itself requires visual cooldown timers.

Code:
public boolean isActivatable(ActionBar.Slot slot){
        return slot.isActivatable() && isOffGlobal(slot);
    }

    public boolean isOffGlobal(ActionBar.Slot slot) {
        return getCooldown(slot)<=2;
    }


    public int getCooldown(ActionBar.Slot slot) {
        Abilities.ActionBarSlotCds slotCd = getAbByIndex(slot.getIndex());
        if (slotCd != null) {
            String cdText = Interfaces.getAt(slotCd.container, slotCd.child).getText();
            if (cdText.isEmpty())
                cdText = "0";
            return Integer.parseInt(cdText);
        }
        return -1;
    }

This works perfectly, but requires both visual timers and ability queuing to work as intended.

you mind if I use this! didn't think of the option to actually enable the visual timer.

Currently I'm using this setup: which also works pretty good, it does sometimes keep clicking on thresholds on cooldown but it look quite naturally

Code:
  ability = ActionBar.newQuery().names(rangedAbilities).filter(ab -> ab.isActivatable() && !ab.toString().equals(previousAbility)).results().random();
                if (ability == null) {
                    bot.getLogger().info("ability is null");
                    return;
                }
                if (Execution.delayUntil(ability::isReady, 2000, 3000)) {
                    if (ability.getComponent().click()) {
                        Execution.delayUntil(() -> ability.isReady(), Mouse::isMoving, 1300, 1500);
                        previousAbility = ability.toString();
                    }
                }
 
Top