Imthabawse Posted March 19, 2019 Share Posted March 19, 2019 (edited) Title says it all. Grab you're gear and select between 3 foods: Tuna, Lobsters, or Swordfish. Still working on banking method. Just messing around on pure account trying out random scripts. The scripts cluttered with IF's but for me and my low level of script knowledge it's easier to understand and also works. With that being said always looking for feedback, love the community discussion and how everyone's getting more involved and curious about scripting like myself. Thanks for the read. CODE: *Edited (Added banking support) looking into teleing to lumby then banking instead of walking if required level to tele and have runes import org.osbot.rs07.api.map.Area; import org.osbot.rs07.api.map.constants.Banks; import org.osbot.rs07.api.model.NPC; import org.osbot.rs07.script.Script; import org.osbot.rs07.script.ScriptManifest; import org.osbot.rs07.utility.ConditionalSleep; @ScriptManifest(name = "Frogkiller", logo = "", version = 1, author = "Imthabawse", info = "Slaughters frogs for gains!") public class Frogkiller extends Script { private void killFrog() { if (!myPlayer().isAnimating()) { if (!myPlayer().isUnderAttack()) { NPC giantfrog = getNpcs().closest("Giant frog", "Big frog"); if (giantfrog != null) { if (giantfrog.getHealthPercent() > 10) { giantfrog.interact("Attack"); log("Slaughter time!"); new ConditionalSleep(5000) { @Override public boolean condition() { return myPlayer().isUnderAttack(); } }.sleep(); } } } } } private void eatFood() { if (myPlayer().getHealthPercent() < 48) { if(getInventory().contains("Tuna")) { log("Damn frogs fked me up.. let's eat!"); getInventory().interact("Eat", "Tuna", "Lobster", "Swordfish"); } } } private void bank() throws InterruptedException { if(getInventory().isEmptyExcept("Air rune","Earth rune")) { log("Inventory contains no food, banking."); getWalking().webWalk(Banks.LUMBRIDGE_UPPER); getBank().open(); bank.withdrawAll("Tuna"); new ConditionalSleep(2500) { @Override public boolean condition() { return getInventory().isFull(); } }.sleep(); } } private Area killArea = new Area(3186, 3187, 3209, 3160); @Override public void onStart() { log("Let's kill some frogs!"); } @Override public int onLoop() throws InterruptedException { if(!killArea.contains(myPlayer())) { log("Not in kill area.. lets get there and slaughter more frogs!"); getWalking().webWalk(killArea); }else { if (killArea.contains(myPlayer())) { killFrog(); eatFood(); bank(); } } return 1200; } } Edited March 24, 2019 by Imthabawse Quote Link to comment Share on other sites More sharing options...
Imthabawse Posted March 19, 2019 Author Share Posted March 19, 2019 Added to the eatFood method with an else to logout for now. else { if (!getInventory().contains("Lobster", "Tuna", "Swordfish")) { log("No food stopping script.."); stop(); } } Quote Link to comment Share on other sites More sharing options...
Xx pk xX Posted March 20, 2019 Share Posted March 20, 2019 (edited) Sorry for some grammar "features" Just a few fast suggestions : import org.osbot.rs07.api.map.Area; import org.osbot.rs07.api.model.NPC; import org.osbot.rs07.script.Script; import org.osbot.rs07.script.ScriptManifest; import org.osbot.rs07.utility.ConditionalSleep; import java.util.Arrays; @ScriptManifest(name = "Frogkiller", logo = "", version = 1, author = "Imthabawse", info = "Slaughters frogs for gains!") public class FrogKiller extends Script { //Change to FrogKiller private String[] frogName = { "Giant frog", "Big frog" }; //words "Tuna", "Lobster", "Swordfish" were used in 2 different places/lines - it's better to make a variable for them to avoid duplicitions in code //a lot of duplicitions will make it harder to make changes in the code or to fix bugs in bigger projects private String[] foodNames = { "Tuna", "Lobster", "Swordfish" }; private void killFrog() { if (!myPlayer().isAnimating() && !myPlayer().isMoving() && !myPlayer().isUnderAttack()) { NPC giantFrog = getNpcs().closest(npc -> Arrays.asList(frogName).contains(npc.getName()) && !npc.isHitBarVisible() && !npc.isUnderAttack()); //No need to check again for "if (!myPlayer().isAnimating() && !myPlayer().isMoving() && !myPlayer().isUnderAttack())", you can remove those 3 conditions after finding frog if (giantFrog != null) { log("Condition met.. found targets!"); //targets are found ONLY if giantFrog is not NULL, not before if (giantFrog.interact("Attack")) //check IF giant frog was Attacked succesfully, and then use ConditionalSleep { log("Slaughter time!"); new ConditionalSleep(5000, 1000) { @Override public boolean condition() { return !myPlayer().isUnderAttack() && !myPlayer().isMoving() && !myPlayer().isAnimating(); } }.sleep(); } } } } private void bank() { } private void eatFood() { if(myPlayer().getHealthPercent() < 44) { log("Damn frogs fked me up.. let's eat!"); if (getInventory().contains(foodNames)) //this is uselles call without a condition (IF condition in this case). { if (getInventory().interact("Eat", foodNames)) { //you could put a ConditionalSleep here, maybe attack frog again after eating or something like that } } else //else in this case means inventory does not contain food { log("No food stopping script.."); stop(); } } } private Area killArea = new Area(3187, 3183, 3213, 3157); @Override public void onStart() { log("Let's kill some frogs!"); } @Override public int onLoop() { if(!killArea.contains(myPlayer())) { log("Not in kill area.. lets get there and slaughter more frogs!"); getWalking().webWalk(killArea); }else { if (killArea.contains(myPlayer())) { killFrog(); eatFood(); } } return 1200; } } In Java, you should use following Naming Conventions: for Class name you should use "FrogKiller", with capital "K" (change file name to "FrogKiller" as well if you want to use/compile it) same goes for variable names, e.g. you should use "giantFrog", instead of "giantfrog" First 3 "if" conditions in your "killFrog()" method can be combined to following one line: if (!myPlayer().isAnimating() && !myPlayer().isMoving() && !myPlayer().isUnderAttack()) && operator in a Java condition (and a lot other programming languages) means AND You could use || operator as well, which means OR. However, probably you don't need it yet in your script. Line below is an example of getting a NPC with more conditions in a single call. NPC giantFrog = getNpcs().closest(npc -> Arrays.asList(frogName).contains(npc.getName()) && !npc.isHitBarVisible()); ^^ could contain a lot more conditions that you might want to use for whatever reason, e.g. npc.isUnderAttack() && npc.hasAction("Attack") && //some other conditions I will not go into depth with following condition, however, shortly it means that it will return only NPC with name that is in "frogName" array. Arrays.asList(frogName).contains(npc.getName()) One last thing - you might noticed that I'm putting "{" in new lines. That's the way I'm usually using those "Special brackets" (No idea what's their name) while programming, because in my opinion code is then easier to read. However, standards accept both ways - "{" in new line, or same as you did - in the end of the line before. Hopefully this paragraph make sense lol. I didn't try code in the top of my reply, but is should work. However looks good, for a first working script, keep up good work. Edited March 20, 2019 by Xx pk xX 1 Quote Link to comment Share on other sites More sharing options...
Imthabawse Posted March 20, 2019 Author Share Posted March 20, 2019 @Xx pk xX Thanks for the feedback! Quote Link to comment Share on other sites More sharing options...
Imthabawse Posted March 23, 2019 Author Share Posted March 23, 2019 (edited) Update: Added a banking method and added into onLoop. Only works for Tuna for now till I play around with it. Also the Air rune and Earth rune are only there cause I was testing and had in my inv. private void bank() throws InterruptedException { if(getInventory().isEmptyExcept("Air rune","Earth rune")) { log("Inventory contains no food, banking."); getWalking().webWalk(Banks.LUMBRIDGE_UPPER); getBank().open(); bank.withdrawAll("Tuna"); } } onLoop @Override public int onLoop() throws InterruptedException { if(!killArea.contains(myPlayer())) { log("Not in kill area.. lets get there and slaughter more frogs!"); getWalking().webWalk(killArea); }else { if (killArea.contains(myPlayer())) { killFrog(); eatFood(); bank(); } } return 1200; } } Needs improvement and will mess around with it over time but gets the job done and gets some good levels for F2P pure accounts. Edited March 23, 2019 by Imthabawse Quote Link to comment Share on other sites More sharing options...
Imthabawse Posted March 24, 2019 Author Share Posted March 24, 2019 *Edited original post above with updated code Quote Link to comment Share on other sites More sharing options...