Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@
import net.runelite.api.Actor;
import net.runelite.api.coords.WorldPoint;
import net.runelite.api.gameval.ItemID;
import net.runelite.api.gameval.VarPlayerID;
import net.runelite.client.plugins.microbot.Microbot;
import net.runelite.client.plugins.microbot.Script;
import net.runelite.client.plugins.microbot.aiofighter.AIOFighterConfig;
Expand All @@ -18,6 +17,7 @@
import net.runelite.client.plugins.microbot.util.antiban.Rs2AntibanSettings;
import net.runelite.client.plugins.microbot.util.antiban.enums.ActivityIntensity;
import net.runelite.client.plugins.microbot.util.camera.Rs2Camera;
import net.runelite.client.plugins.microbot.util.combat.Rs2Combat;
import net.runelite.client.plugins.microbot.util.coords.Rs2WorldArea;
import net.runelite.client.plugins.microbot.util.inventory.Rs2Inventory;
import net.runelite.client.plugins.microbot.util.npc.Rs2Npc;
Expand Down Expand Up @@ -162,11 +162,19 @@ public void run(AIOFighterConfig config) {
}
messageShown = false;


if (Rs2AntibanSettings.actionCooldownActive) {
AIOFighterPlugin.setState(State.COMBAT);
handleItemOnNpcToKill(config);
return;
if(Rs2AntibanSettings.antibanEnabled && Rs2AntibanSettings.actionCooldownChance > 0){
if (Rs2AntibanSettings.actionCooldownActive) {
AIOFighterPlugin.setState(State.COMBAT);
handleItemOnNpcToKill(config);
return;
}
}
else {
if (Rs2Combat.inCombat()) {
AIOFighterPlugin.setState(State.COMBAT);
handleItemOnNpcToKill(config);
return;
}
}

if (!attackableNpcs.isEmpty()) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -173,7 +173,7 @@ public void resetLastAttack(boolean forceReset) {
AttackStyle attackStyle = AttackStyleMapper.mapToAttackStyle(style);

if (m != null) {
if (forceReset && m.lastAttack <= 0) {
if (forceReset && (m.lastAttack <= 0 || npc.getAnimation() != -1)) {
m.lastAttack = m.rs2NpcStats.getAttackSpeed();
}
if ((!npc.isDead() && m.lastAttack <= 0) ||
Expand Down
Original file line number Diff line number Diff line change
@@ -1,63 +1,59 @@
package net.runelite.client.plugins.microbot.aiofighter.loot;

import lombok.extern.slf4j.Slf4j;
import net.runelite.client.plugins.grounditems.GroundItem;
import net.runelite.client.plugins.microbot.Microbot;
import net.runelite.client.plugins.microbot.Script;
import net.runelite.client.plugins.microbot.aiofighter.AIOFighterConfig;
import net.runelite.client.plugins.microbot.aiofighter.AIOFighterPlugin;
import net.runelite.client.plugins.microbot.aiofighter.enums.DefaultLooterStyle;
import net.runelite.client.plugins.microbot.aiofighter.enums.State;
import net.runelite.client.plugins.microbot.util.antiban.Rs2AntibanSettings;
import net.runelite.client.plugins.microbot.util.grounditem.LootingParameters;
import net.runelite.client.plugins.microbot.util.grounditem.Rs2GroundItem;
import net.runelite.client.plugins.microbot.util.inventory.Rs2Inventory;
import net.runelite.client.plugins.microbot.util.inventory.Rs2RunePouch;
import net.runelite.client.plugins.microbot.util.magic.Runes;
import net.runelite.client.plugins.microbot.util.player.Rs2Player;

import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.function.Predicate;
import java.util.stream.Collectors;

import static net.runelite.api.TileItem.OWNERSHIP_SELF;
import static net.runelite.client.plugins.microbot.util.grounditem.Rs2GroundItem.*;

@Slf4j
public class LootScript extends Script {
int minFreeSlots = 0;

public LootScript() {

}


public boolean run(AIOFighterConfig config) {

mainScheduledFuture = scheduledExecutorService.scheduleWithFixedDelay(() -> {
try {
minFreeSlots = config.bank() ? config.minFreeSlots() : 0;
if (!super.run()) return;
if (!Microbot.isLoggedIn()) return;
if (!config.toggleLootItems()) return;
if (Rs2AntibanSettings.actionCooldownActive) return;
if (AIOFighterPlugin.getState().equals(State.BANKING) || AIOFighterPlugin.getState().equals(State.WALKING)) {
return;
}
if (Rs2Player.isInCombat() && !config.toggleForceLoot() && !AIOFighterPlugin.isWaitingForLoot()) {
if (AIOFighterPlugin.getState().equals(State.BANKING) || AIOFighterPlugin.getState().equals(State.WALKING)) return;
if (((Rs2Inventory.isFull() || Rs2Inventory.getEmptySlots() <= minFreeSlots) && !config.eatFoodForSpace()) || (Rs2Player.isInCombat() && !config.toggleForceLoot() && !AIOFighterPlugin.isWaitingForLoot())) {
return;
}


String[] itemNamesToLoot = lootItemNames(config);
final Predicate<GroundItem> filter = groundItem ->
groundItem.getLocation().distanceTo(Microbot.getClient().getLocalPlayer().getWorldLocation()) < config.attackRadius() &&
(!config.toggleOnlyLootMyItems() || groundItem.getOwnership() == OWNERSHIP_SELF) &&
(shouldLootBasedOnName(groundItem, itemNamesToLoot) || shouldLootBasedOnValue(groundItem, config));
List<GroundItem> groundItems = getGroundItems().values().stream()
.filter(filter)
.collect(Collectors.toList());

if (groundItems.isEmpty()) {
return;
if (config.looterStyle().equals(DefaultLooterStyle.MIXED) || config.looterStyle().equals(DefaultLooterStyle.ITEM_LIST)) {
lootItemsOnName(config);
}
if (config.toggleDelayedLooting()) {
groundItems.sort(Comparator.comparingInt(Rs2GroundItem::calculateDespawnTime));


if (config.looterStyle().equals(DefaultLooterStyle.GE_PRICE_RANGE) || config.looterStyle().equals(DefaultLooterStyle.MIXED)) {
lootItemsByValue(config);
}

lootBones(config);
lootAshes(config);
lootRunes(config);
lootCoins(config);
lootUntradeableItems(config);
lootArrows(config);

} catch(Exception ex) {
// Defer clearing wait-for-loot until we successfully pick at least one item
//Pause other scripts before looting and always release
boolean previousPauseState = Microbot.pauseAllScripts.getAndSet(true);
Expand Down Expand Up @@ -101,54 +97,147 @@ public boolean run(AIOFighterConfig config) {
return true;
}

private boolean canStackItem(GroundItem groundItem) {
if (!groundItem.isStackable()) {
return false;
}
int runePouchRunes = Rs2RunePouch.getQuantity(groundItem.getItemId());
if (runePouchRunes > 0 && runePouchRunes <= 16000 - groundItem.getQuantity()) {
return true;
private void lootArrows(AIOFighterConfig config) {
if (config.toggleLootArrows()) {
LootingParameters arrowParams = new LootingParameters(
config.attackRadius(),
1,
10,
minFreeSlots,
config.toggleDelayedLooting(),
config.toggleOnlyLootMyItems(),
"arrow"
);
arrowParams.setEatFoodForSpace(config.eatFoodForSpace());
if (Rs2GroundItem.lootItemsBasedOnNames(arrowParams)) {
Microbot.pauseAllScripts.compareAndSet(true, false);
}
}
//TODO("Coal bag, Herb Sack, Seed pack")
return Rs2Inventory.contains(groundItem.getItemId());
}

private boolean shouldLootBasedOnValue(GroundItem groundItem, AIOFighterConfig config) {
if (config.looterStyle() != DefaultLooterStyle.GE_PRICE_RANGE && config.looterStyle() != DefaultLooterStyle.MIXED)
return false;
int price = groundItem.getGePrice();
return config.minPriceOfItemsToLoot() <= price && price / groundItem.getQuantity() <= config.maxPriceOfItemsToLoot();
}

private boolean shouldLootBasedOnName(GroundItem groundItem, String[] itemNamesToLoot) {
return Arrays.stream(itemNamesToLoot).anyMatch(name -> groundItem.getName().trim().toLowerCase().contains(name.trim().toLowerCase()));
}

private String[] lootItemNames(AIOFighterConfig config) {
ArrayList<String> itemNamesToLoot = new ArrayList<>();
if (config.toggleLootArrows()) {
itemNamesToLoot.add("arrow");
}
private void lootBones(AIOFighterConfig config) {
if (config.toggleBuryBones()) {
itemNamesToLoot.add("bones");
LootingParameters bonesParams = new LootingParameters(
config.attackRadius(),
1,
1,
minFreeSlots,
config.toggleDelayedLooting(),
config.toggleOnlyLootMyItems(),
"bones"
);
bonesParams.setEatFoodForSpace(config.eatFoodForSpace());
if (Rs2GroundItem.lootItemsBasedOnNames(bonesParams)) {
Microbot.pauseAllScripts.compareAndSet(true, false);
}
}
}

private void lootAshes(AIOFighterConfig config) {
if (config.toggleScatter()) {
itemNamesToLoot.add(" ashes");
LootingParameters ashesParams = new LootingParameters(
config.attackRadius(),
1,
1,
minFreeSlots,
config.toggleDelayedLooting(),
config.toggleOnlyLootMyItems(),
" ashes"
);
ashesParams.setEatFoodForSpace(config.eatFoodForSpace());
if (Rs2GroundItem.lootItemsBasedOnNames(ashesParams)) {
Microbot.pauseAllScripts.compareAndSet(true, false);
}
}
}

// loot runes
private void lootRunes(AIOFighterConfig config) {
if (config.toggleLootRunes()) {
itemNamesToLoot.add(" rune");
LootingParameters runesParams = new LootingParameters(
config.attackRadius(),
1,
1,
minFreeSlots,
config.toggleDelayedLooting(),
config.toggleOnlyLootMyItems(),
" rune"
);
runesParams.setEatFoodForSpace(config.eatFoodForSpace());
if (Rs2GroundItem.lootItemsBasedOnNames(runesParams)) {
Microbot.pauseAllScripts.compareAndSet(true, false);
}
}
}

// loot coins
private void lootCoins(AIOFighterConfig config) {
if (config.toggleLootCoins()) {
itemNamesToLoot.add("coins");
LootingParameters coinsParams = new LootingParameters(
config.attackRadius(),
1,
1,
minFreeSlots,
config.toggleDelayedLooting(),
config.toggleOnlyLootMyItems(),
"coins"
);
coinsParams.setEatFoodForSpace(config.eatFoodForSpace());
if (Rs2GroundItem.lootCoins(coinsParams)) {
Microbot.pauseAllScripts.compareAndSet(true, false);
}
}
}

// loot untradeable items
private void lootUntradeableItems(AIOFighterConfig config) {
if (config.toggleLootUntradables()) {
itemNamesToLoot.add("untradeable");
itemNamesToLoot.add("scroll box");
LootingParameters untradeableItemsParams = new LootingParameters(
config.attackRadius(),
1,
1,
minFreeSlots,
config.toggleDelayedLooting(),
config.toggleOnlyLootMyItems(),
"untradeable"
);
untradeableItemsParams.setEatFoodForSpace(config.eatFoodForSpace());
if (Rs2GroundItem.lootUntradables(untradeableItemsParams)) {
Microbot.pauseAllScripts.compareAndSet(true, false);
}
}
if (config.looterStyle().equals(DefaultLooterStyle.MIXED) || config.looterStyle().equals(DefaultLooterStyle.ITEM_LIST)) {
itemNamesToLoot.addAll(Arrays.asList(config.listOfItemsToLoot().trim().split(",")));
}

private void lootItemsByValue(AIOFighterConfig config) {
LootingParameters valueParams = new LootingParameters(
config.minPriceOfItemsToLoot(),
config.maxPriceOfItemsToLoot(),
config.attackRadius(),
1,
minFreeSlots,
config.toggleDelayedLooting(),
config.toggleOnlyLootMyItems()
);
valueParams.setEatFoodForSpace(config.eatFoodForSpace());
if (Rs2GroundItem.lootItemBasedOnValue(valueParams)) {
Microbot.pauseAllScripts.compareAndSet(true, false);
}
}

private void lootItemsOnName(AIOFighterConfig config) {
LootingParameters valueParams = new LootingParameters(
config.attackRadius(),
1,
1,
minFreeSlots,
config.toggleDelayedLooting(),
config.toggleOnlyLootMyItems(),
config.listOfItemsToLoot().trim().split(",")
);
valueParams.setEatFoodForSpace(config.eatFoodForSpace());
if (Rs2GroundItem.lootItemsBasedOnNames(valueParams)) {
Microbot.pauseAllScripts.compareAndSet(true, false);
}
return itemNamesToLoot.toArray(new String[0]);
}

public void shutdown() {
Expand Down
Loading
Loading