Jump to content
Sign in to follow this  
marceluxd

Struggling to collect item! Help!

Recommended Posts

This script is supposed to kill the closest Chaos druid that is not fighting and collect the drops. The problem is that it just clicks on the drop and very shortly after it tries to attack another druid, i mean, it cancels the collecting action and start to attack. Please help!

Obs: Is it possible to use the glory amulet teleport to edgeville?

@ScriptManifest(author = "Marcelo", info = "Kill druids and collect herbs", name = "DruidMassacre", version = 0, logo = "")
public class DruidKiller extends Script {

	@Override
	public void onStart() {
		log("Let's get started!");
	}
	private enum State{
		ATTACK, COLLECT, TELEPORT, EAT, NOTHING;
	}
	
	private State getState() {
		GroundItem weed = getGroundItems().closest("Loop half of key", "Tooth half of key", "Rune spear","Dragon spear", "Shield left half", "Ensouled chaos druid head", "Grimy ranarr weed", "Grimy lantadyme", "Grimy dwarf weed", "Grimy cadantine", "Grimy avantoe", "Grimy kwuarm");	
		NPC druid = getNpcs().closest(npc -> npc.getName().startsWith("Chaos druid") && npc.isAttackable());

		if(myPlayer().getHealthPercent() <= 70) {
			if (getInventory().contains("Swordfish")){
				return State.EAT;
			}
			else {
				return State.TELEPORT;
			}
		}
		
		if(weed != null) {
			return State.COLLECT;
		}
		
		if(!getCombat().isFighting() && myPlayer().isAttackable() && !myPlayer().isAnimating() && !myPlayer().isMoving() && druid != null) {
			return State.ATTACK;
		}

		return State.NOTHING;
	}
	@Override
	public int onLoop() throws InterruptedException {
		GroundItem weed = getGroundItems().closest("Nature rune", "Loop half of key", "Tooth half of key", "Rune spear","Dragon spear", "Shield left half", "Ensouled chaos druid head", "Grimy ranarr weed", "Grimy lantadyme", "Grimy dwarf weed", "Grimy cadantine", "Grimy avantoe", "Grimy kwuarm");	
		NPC druid = getNpcs().closest(npc -> npc.getName().startsWith("Chaos druid") && npc.isAttackable());
	
		switch(getState()) {
		case EAT:
			log("Eat");
			getInventory().interact("Eat", "Swordfish");
		
		case TELEPORT:
			log("Teleport!");
		
		case COLLECT:
			log("Collecting weed");
			if(!myPlayer().isMoving() && !myPlayer().isAnimating()) {
				weed.interact("Take");
			}
		
		case ATTACK:
			log("Attacking");
			druid.interact("Attack");
			sleep(random(1497, 4923));
		
		case NOTHING:
			log("Nothing");
		}
		
		return random(300, 700);
	}

	@Override
	public void onExit() {
		log("terminou porra");
	}

	@Override
	public void onPaint(Graphics2D g) {

	}

}

 

Share this post


Link to post
Share on other sites

You're supposed to break; in your switch statements so that would be why for that.

 

A couple things I want to point out though,

First thing is that imo you're creating your local variables a lot earlier than you need to be. Also for the weed imo you should declare what the loot is.

    private final String[] loot = { "Loop half of key", "Tooth half of key", "Rune spear", "Dragon spear", "Shield left half", "Ensouled chaos druid head", "Grimy ranarr weed", "Grimy lantadyme", "Grimy dwarf weed", "Grimy cadantine",
            "Grimy avantoe", "Grimy kwuarm" };
    @SuppressWarnings("unchecked")
    private State getState() {

        if (myPlayer().getHealthPercent() <= 70) {
            if (getInventory().contains("Swordfish")) {
                return State.EAT;
            } else {
                return State.TELEPORT;
            }
        } else {
            GroundItem weed = getGroundItems().closest(loot);
            if (weed != null) {
                return State.COLLECT;
            } else if (!getCombat().isFighting() && myPlayer().isAttackable() && !myPlayer().isAnimating() && !myPlayer().isMoving()) {
                NPC druid = getNpcs().closest(npc -> npc.getName().startsWith("Chaos druid") && npc.isAttackable());

                if (druid != null) {
                    return State.ATTACK;
                }
            }
        }

        return State.NOTHING;
    }

 

Yeah just make sure you use break; in your switch statement. Another thing I'd point out is that the interact methods are boolean methods so they should be checked with an if statement and then use a conditional sleep.

        case EAT:
            log("Eat");
            if (getInventory().interact("Eat", "Swordfish")) {
                // conditional sleep
            }
            break;
        case COLLECT:
            log("Collecting weed");
            if (!myPlayer().isMoving() && !myPlayer().isAnimating()) {
                if (weed.interact("Take")) {
                    //conditional sleep
                }
            }
            break;

 

  • Like 1

Share this post


Link to post
Share on other sites
Posted (edited)
9 hours ago, Malcolm said:
9 hours ago, Malcolm said:

You're supposed to break; in your switch statements so that would be why for that.

 

A couple things I want to point out though,

First thing is that imo you're creating your local variables a lot earlier than you need to be. Also for the weed imo you should declare what the loot is.



    private final String[] loot = { "Loop half of key", "Tooth half of key", "Rune spear", "Dragon spear", "Shield left half", "Ensouled chaos druid head", "Grimy ranarr weed", "Grimy lantadyme", "Grimy dwarf weed", "Grimy cadantine",
            "Grimy avantoe", "Grimy kwuarm" };

 

 

 

Thanks for the reply. Where should i declare the variable loot?

Edited by marceluxd

Share this post


Link to post
Share on other sites
On 3/31/2020 at 10:23 AM, marceluxd said:

Thanks for the reply. Where should i declare the variable loot?

You would declare that variable in the class. Outside of any method body. So that the entire class will be able to use it.

You could also declare it static and will be able to use it throughout all your classes.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...