mirror of
https://github.com/bdnugget/rs-sdk.git
synced 2026-11-07 09:07:30 +00:00
learnigns
This commit is contained in:
1 parent
2bf1f5ad90
commit
16676bd20e
10 files changed
+117
-99
No files matched your search
+2
-2
@@ -56,9 +56,9 @@ const isAttacking = state.player?.animId !== -1;
|
||||
| Location | Coordinates | Targets | Notes |
|
||||
|----------|-------------|---------|-------|
|
||||
| Lumbridge cows | (3253, 3290) | Cows | Safe, good for all levels. Gate at (3253, 3270) |
|
||||
| Lumbridge goblins | (3240, 3220) | Goblins, rats | Mixed enemies |
|
||||
| Lumbridge goblins | (3252, 3230) | Goblins, rats | Mixed enemies. Cluster runs NE from here — nothing at the old (3240, 3220) waypoint |
|
||||
| Lumbridge chickens | (3237, 3295) | Chickens | Very safe, feathers drop |
|
||||
| Al Kharid warriors | (3293, 3175) | Warriors (lvl 9) | Faster XP, kebabs nearby for food, can hit hard via multicombat vs low combat levels. |
|
||||
| Al Kharid warriors | ~(3293, 3170) | `Al-Kharid warrior` (lvl 9) | Faster XP, kebabs nearby for food, can hit hard via multicombat vs low combat levels. |
|
||||
|
||||
## Cow Field Details (Proven from 200+ kills)
|
||||
|
||||
|
||||
+14
-5
@@ -14,9 +14,18 @@ if (raw && range) {
|
||||
|
||||
## Range Locations
|
||||
|
||||
| Location | Coordinates | Notes |
|
||||
|----------|-------------|-------|
|
||||
| **Lumbridge (near Bob's Axes)** | **(3211, 3215)** | **USE THIS.** Accessible without any quests. |
|
||||
| Lumbridge Castle kitchen | (3211, 3256) | **REQUIRES Cook's Assistant quest completion.** Will not let you use it without the quest. |
|
||||
| Location | Coordinates | Loc name | Notes |
|
||||
|----------|-------------|----------|-------|
|
||||
| **Lumbridge (near Bob's Axes)** | **(3230, 3196)** | `Range` | **USE THIS.** No quest needed. Just south of Bob's Axes (3232, 3203). |
|
||||
| Lumbridge Castle kitchen | (3212, 3215) | `Cooking range` | **REQUIRES Cook's Assistant quest completion.** The Cook stands next to it at (3209, 3215). |
|
||||
| Al Kharid (Karim's kebab shop) | (3271, 3180) | `Range` | No quest needed, but 10gp toll gate to get there. |
|
||||
|
||||
**COMMON MISTAKE**: The range inside Lumbridge Castle kitchen (ground floor, north side) is locked behind the Cook's Assistant quest. If you haven't completed it, the game will not allow you to cook there. Use the range near Bob's Brilliant Axes shop south of the castle instead.
|
||||
**COMMON MISTAKE**: The range inside Lumbridge Castle kitchen — **(3212, 3215)**, ground floor, SW corner where the Cook stands — is locked behind the Cook's Assistant quest. Without the quest the Cook says *"Hey! Who said you could use that?"* and nothing cooks. Use the Range at (3230, 3196), south of Bob's Brilliant Axes, instead.
|
||||
|
||||
**Name gotcha**: the quest-gated castle range is named `Cooking range`, not `Range`, so `/^range$/i` deliberately skips it. Usable cooking sources are `Range` (loc 2728-2731), `Fireplace` (2724-2726), `Cooking pot` (2727), and `Fire` (2732) — a wider match is:
|
||||
|
||||
```typescript
|
||||
const source = sdk.findNearbyLoc(/^(range|fireplace|fire|cooking pot)$/i);
|
||||
```
|
||||
|
||||
Nearest usable sources elsewhere: Fireplace (3205, 3220) in Lumbridge castle, Cooking pot (3232, 3238), Fire (3245, 3246), Fireplace (3100, 3256) near Draynor.
|
||||
+46
-42
@@ -8,8 +8,8 @@ Level-up dialogs block all actions. Dismiss them immediately:
|
||||
|
||||
```typescript
|
||||
if (state.dialog.isOpen) {
|
||||
await ctx.sdk.sendClickDialog(0);
|
||||
continue; // Skip rest of loop iteration
|
||||
await ctx.sdk.sendClickDialog(0);
|
||||
continue; // Skip rest of loop iteration
|
||||
}
|
||||
```
|
||||
|
||||
@@ -45,22 +45,22 @@ For NPC conversations with choices:
|
||||
```typescript
|
||||
// Click through until specific option appears
|
||||
for (let i = 0; i < 20; i++) {
|
||||
const s = ctx.sdk.getState();
|
||||
if (!s?.dialog.isOpen) {
|
||||
await new Promise(r => setTimeout(r, 150));
|
||||
continue;
|
||||
}
|
||||
const s = ctx.sdk.getState();
|
||||
if (!s?.dialog.isOpen) {
|
||||
await new Promise((r) => setTimeout(r, 150));
|
||||
continue;
|
||||
}
|
||||
|
||||
// Look for target option
|
||||
const targetOpt = s.dialog.options.find(o => /yes/i.test(o.text));
|
||||
if (targetOpt) {
|
||||
await ctx.sdk.sendClickDialog(targetOpt.index);
|
||||
break;
|
||||
}
|
||||
// Look for target option
|
||||
const targetOpt = s.dialog.options.find((o) => /yes/i.test(o.text));
|
||||
if (targetOpt) {
|
||||
await ctx.sdk.sendClickDialog(targetOpt.index);
|
||||
break;
|
||||
}
|
||||
|
||||
// Otherwise click to continue
|
||||
await ctx.sdk.sendClickDialog(0);
|
||||
await new Promise(r => setTimeout(r, 200));
|
||||
// Otherwise click to continue
|
||||
await ctx.sdk.sendClickDialog(0);
|
||||
await new Promise((r) => setTimeout(r, 200));
|
||||
}
|
||||
```
|
||||
|
||||
@@ -86,48 +86,52 @@ Always use `0` as fallback for "Click here to continue" screens.
|
||||
Requires 10gp. Position west of gate: (3267, 3228).
|
||||
|
||||
```typescript
|
||||
const gate = ctx.sdk.getState()?.nearbyLocs.find(l => /gate/i.test(l.name));
|
||||
const gate = ctx.sdk.getState()?.nearbyLocs.find((l) => /gate/i.test(l.name));
|
||||
await ctx.sdk.sendInteractLoc(gate.x, gate.z, gate.id, 1);
|
||||
await sleep(1000);
|
||||
|
||||
// Click through dialog: 0 = continue, or pick "Yes" when available
|
||||
for (let i = 0; i < 10; i++) {
|
||||
const yesOpt = ctx.sdk.getState()?.dialog?.options.find(o => /yes/i.test(o.text));
|
||||
await ctx.sdk.sendClickDialog(yesOpt?.index ?? 0);
|
||||
await sleep(300);
|
||||
const yesOpt = ctx.sdk
|
||||
.getState()
|
||||
?.dialog?.options.find((o) => /yes/i.test(o.text));
|
||||
await ctx.sdk.sendClickDialog(yesOpt?.index ?? 0);
|
||||
await sleep(300);
|
||||
}
|
||||
|
||||
await ctx.bot.walkTo(3277, 3227); // Walk through to Al Kharid
|
||||
await ctx.bot.walkTo(3277, 3227); // Walk through to Al Kharid
|
||||
```
|
||||
|
||||
## Buying Kebabs from Karim (Al Kharid)
|
||||
## Buying Kebabs from the Kebab Seller (Al Kharid)
|
||||
|
||||
Karim sells kebabs via dialog (not a shop interface). Location: (3273, 3180)
|
||||
Sells kebabs via dialog (not a shop interface). Location: (3273, 3180), spawns at (3272, 3182).
|
||||
|
||||
```typescript
|
||||
// Walk to kebab seller
|
||||
await ctx.bot.walkTo(3273, 3180);
|
||||
|
||||
// Find Karim
|
||||
const seller = ctx.sdk.getState()?.nearbyNpcs.find(n => /kebab/i.test(n.name));
|
||||
const talkOpt = seller.optionsWithIndex.find(o => /talk/i.test(o.text));
|
||||
// Find the kebab seller
|
||||
const seller = ctx.sdk
|
||||
.getState()
|
||||
?.nearbyNpcs.find((n) => /kebab/i.test(n.name));
|
||||
const talkOpt = seller.optionsWithIndex.find((o) => /talk/i.test(o.text));
|
||||
await ctx.sdk.sendInteractNpc(seller.index, talkOpt.opIndex);
|
||||
await new Promise(r => setTimeout(r, 1000));
|
||||
await new Promise((r) => setTimeout(r, 1000));
|
||||
|
||||
// Handle dialog to buy kebab (1gp each)
|
||||
for (let i = 0; i < 15; i++) {
|
||||
const s = ctx.sdk.getState();
|
||||
if (!s?.dialog.isOpen) {
|
||||
await new Promise(r => setTimeout(r, 200));
|
||||
continue;
|
||||
}
|
||||
const buyOpt = s.dialog.options.find(o => /yes/i.test(o.text));
|
||||
if (buyOpt) {
|
||||
await ctx.sdk.sendClickDialog(buyOpt.index);
|
||||
break;
|
||||
}
|
||||
await ctx.sdk.sendClickDialog(0);
|
||||
await new Promise(r => setTimeout(r, 300));
|
||||
const s = ctx.sdk.getState();
|
||||
if (!s?.dialog.isOpen) {
|
||||
await new Promise((r) => setTimeout(r, 200));
|
||||
continue;
|
||||
}
|
||||
const buyOpt = s.dialog.options.find((o) => /yes/i.test(o.text));
|
||||
if (buyOpt) {
|
||||
await ctx.sdk.sendClickDialog(buyOpt.index);
|
||||
break;
|
||||
}
|
||||
await ctx.sdk.sendClickDialog(0);
|
||||
await new Promise((r) => setTimeout(r, 300));
|
||||
}
|
||||
```
|
||||
|
||||
@@ -140,8 +144,8 @@ If your script makes no progress, check for stuck dialogs:
|
||||
```typescript
|
||||
// In your main loop
|
||||
if (state.dialog.isOpen) {
|
||||
console.log('Dialog open, dismissing...');
|
||||
await ctx.sdk.sendClickDialog(0);
|
||||
continue;
|
||||
console.log("Dialog open, dismissing...");
|
||||
await ctx.sdk.sendClickDialog(0);
|
||||
continue;
|
||||
}
|
||||
```
|
||||
+32
-30
@@ -7,33 +7,33 @@ Successful patterns for fishing automation.
|
||||
Fishing spots are **NPCs**, not locations:
|
||||
|
||||
```typescript
|
||||
const spot = state.nearbyNpcs.find(npc => /fishing\s*spot/i.test(npc.name));
|
||||
const spot = state.nearbyNpcs.find((npc) => /fishing\s*spot/i.test(npc.name));
|
||||
```
|
||||
|
||||
## Spot Types Matter
|
||||
|
||||
Different spots have different level requirements:
|
||||
|
||||
| Spot Options | Fish Type | Level |
|
||||
|--------------|-----------|-------|
|
||||
| Net, Bait | Shrimp, anchovies | 1+ |
|
||||
| Net, Harpoon | Mackerel, cod, bass | 16+ |
|
||||
| Lure, Bait | Trout, salmon | 20+ |
|
||||
| Spot Options | Fish Type | Level |
|
||||
| ------------ | ------------------- | ----- |
|
||||
| Net, Bait | Shrimp, anchovies | 1+ |
|
||||
| Net, Harpoon | Mackerel, cod, bass | 16+ |
|
||||
| Lure, Bait | Trout, salmon | 20+ |
|
||||
|
||||
Filter for the right spot type:
|
||||
|
||||
```typescript
|
||||
// Level 1 fishing - need "Bait" option (indicates small net spot)
|
||||
const smallNetSpots = fishingSpots.filter(npc =>
|
||||
npc.options.some(opt => /^bait$/i.test(opt))
|
||||
const smallNetSpots = fishingSpots.filter((npc) =>
|
||||
npc.options.some((opt) => /^bait$/i.test(opt)),
|
||||
);
|
||||
```
|
||||
|
||||
## Fishing Action
|
||||
|
||||
```typescript
|
||||
const spot = state.nearbyNpcs.find(npc => /fishing\s*spot/i.test(npc.name));
|
||||
const netOpt = spot.optionsWithIndex.find(o => /^net$/i.test(o.text));
|
||||
const spot = state.nearbyNpcs.find((npc) => /fishing\s*spot/i.test(npc.name));
|
||||
const netOpt = spot.optionsWithIndex.find((o) => /^net$/i.test(o.text));
|
||||
await ctx.sdk.sendInteractNpc(spot.index, netOpt.opIndex);
|
||||
```
|
||||
|
||||
@@ -43,32 +43,34 @@ Don't over-engineer wait conditions. Just keep clicking:
|
||||
|
||||
```typescript
|
||||
while (true) {
|
||||
// Dismiss any dialogs (level-ups)
|
||||
if (state.dialog.isOpen) {
|
||||
await ctx.sdk.sendClickDialog(0);
|
||||
continue;
|
||||
}
|
||||
// Dismiss any dialogs (level-ups)
|
||||
if (state.dialog.isOpen) {
|
||||
await ctx.sdk.sendClickDialog(0);
|
||||
continue;
|
||||
}
|
||||
|
||||
const spot = state.nearbyNpcs.find(npc => /fishing\s*spot/i.test(npc.name));
|
||||
if (spot) {
|
||||
const netOpt = spot.optionsWithIndex.find(o => /^net$/i.test(o.text));
|
||||
await ctx.sdk.sendInteractNpc(spot.index, netOpt.opIndex);
|
||||
}
|
||||
const spot = state.nearbyNpcs.find((npc) => /fishing\s*spot/i.test(npc.name));
|
||||
if (spot) {
|
||||
const netOpt = spot.optionsWithIndex.find((o) => /^net$/i.test(o.text));
|
||||
await ctx.sdk.sendInteractNpc(spot.index, netOpt.opIndex);
|
||||
}
|
||||
|
||||
await new Promise(r => setTimeout(r, 1000));
|
||||
await new Promise((r) => setTimeout(r, 1000));
|
||||
}
|
||||
```
|
||||
|
||||
## Safe Fishing Locations
|
||||
|
||||
| Location | Coordinates | Spot Type | Notes |
|
||||
|----------|-------------|-----------|-------|
|
||||
| **Draynor Village** | **(3087, 3230)** | **Net/Bait** | **USE THIS for level 1.** Shrimp/anchovies. Dark wizards north - stay south if you are low combat level! |
|
||||
| Lumbridge Swamp | (3239, 3147) | Lure/Bait | **WARNING: Fly fishing only (level 20+), NO small net spots!** |
|
||||
| Barbarian Village | (3104, 3432) | Lure/Bait | Fly fishing (level 20+) |
|
||||
| Location | Coordinates | Spot Type | Notes |
|
||||
| ------------------- | ---------------- | ------------ | ----------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| **Draynor Village** | **(3087, 3230)** | **Net/Bait** | **USE THIS for level 1.** Shrimp/anchovies. Dark wizards at (3084, 3236)/(3085, 3238) — stay south of z≈3232 if you are low combat level! |
|
||||
| Al Kharid river | (3267, 3148) | Lure/Bait | Fly fishing (level 20+). 10gp toll gate to reach. Watch for a lvl 14 scorpion. |
|
||||
| Barbarian Village | (3110, 3434) | Lure/Bait | Fly fishing (level 20+). Second spot at (3104, 3424). |
|
||||
|
||||
**COMMON MISTAKE**: Lumbridge area (3238, 3251) has NO level-1 fishing spots. Use Draynor!
|
||||
|
||||
**COMMON MISTAKE**: Lumbridge Swamp **(3239, 3147)** has NO fishing spots _at all_ — not net, not lure/bait. Verified against map spawn data: nearest spot is 28 tiles east at (3267, 3148) across the toll gate. Do not walk here to fish.
|
||||
|
||||
## Handling Drift
|
||||
|
||||
Fishing spots move. Check distance and walk back if needed:
|
||||
@@ -79,12 +81,12 @@ const MAX_DRIFT = 15;
|
||||
|
||||
const player = state.player;
|
||||
const drift = Math.sqrt(
|
||||
Math.pow(player.worldX - START_AREA.x, 2) +
|
||||
Math.pow(player.worldZ - START_AREA.z, 2)
|
||||
Math.pow(player.worldX - START_AREA.x, 2) +
|
||||
Math.pow(player.worldZ - START_AREA.z, 2),
|
||||
);
|
||||
|
||||
if (drift > MAX_DRIFT) {
|
||||
console.log(`Drifted ${drift.toFixed(0)} tiles, walking back`);
|
||||
await ctx.bot.walkTo(START_AREA.x, START_AREA.z);
|
||||
console.log(`Drifted ${drift.toFixed(0)} tiles, walking back`);
|
||||
await ctx.bot.walkTo(START_AREA.x, START_AREA.z);
|
||||
}
|
||||
```
|
||||
@@ -58,8 +58,8 @@ const result = await bot.craftJewelry();
|
||||
### Furnace Locations
|
||||
| Location | Coordinates | Notes |
|
||||
|----------|-------------|-------|
|
||||
| Lumbridge | (3225, 3256) | Near spawn, furnace id=2785 |
|
||||
| Al Kharid | TBD | 10gp toll gate |
|
||||
| Lumbridge | (3225, 3256) | Near spawn, furnace id=2785 (second furnace id=2781 at 3226, 3255) |
|
||||
| Al Kharid | (3273, 3184) | 10gp toll gate. Furnace ids 2785 / 2781, next to the Kebab seller |
|
||||
|
||||
### Confirmed XP Values
|
||||
| Product | XP |
|
||||
|
||||
+1
-1
@@ -28,7 +28,7 @@ Cowhides are worth ~100 GP each normally, but the Lumbridge general store pays *
|
||||
| Shop | Location | Coordinates | What They Sell |
|
||||
|------|----------|-------------|----------------|
|
||||
| Lumbridge General Store | Lumbridge | (3212, 3247) | Basic supplies, tools |
|
||||
| Varrock Sword Shop | Varrock | (3204, 3417) | Bronze to steel swords |
|
||||
| Varrock Sword Shop | Varrock | (3204, 3398) | Bronze to steel swords. Shop keeper (3203, 3397), Shop assistant (3205, 3399) |
|
||||
| Bob's Axes | Lumbridge | (3230, 3203) | Axes (bronze 16gp), Pickaxes (bronze 1gp) |
|
||||
| Lumbridge General Store | Lumbridge | (3210, 3244) | Hammer (1gp), Pot, Jug, Bucket, Tinderbox, Chisel, Shears |
|
||||
| Gerrant's Fishy Business | Port Sarim | (3014, 3224) | Small fishing net (5gp), fishing gear |
|
||||
|
||||
@@ -23,15 +23,16 @@ await new Promise(r => setTimeout(r, 2500));
|
||||
### Furnace Locations
|
||||
| Location | Coordinates | Furnace IDs | Notes |
|
||||
|----------|-------------|-------------|-------|
|
||||
| Lumbridge smithy | (3225, 3256) | 2785, 2781 | Right next to spawn, reliable |
|
||||
| Al Kharid | TBD | | Needs 10gp toll gate |
|
||||
| Lumbridge furnace | (3225, 3256) | 2785, 2781 | Right next to spawn, reliable.
|
||||
| Al Kharid furnace | (3273, 3184) | 2785, 2781 | Needs 10gp toll gate.
|
||||
|
||||
|
||||
### Anvil Locations
|
||||
| Location | Coordinates | Anvil ID | Notes |
|
||||
|----------|-------------|----------|-------|
|
||||
| Varrock (west) | (3188, 3421) | 2783 | Multiple anvils in smithy, near west bank |
|
||||
|
||||
Also anvils at (3188, 3424) and (3188, 3426) — same building.
|
||||
Also anvils at (3188, 3424) and (3188, 3426) — same building, same id 2783.
|
||||
|
||||
### How to Smith at Anvil
|
||||
|
||||
|
||||
+11
-9
@@ -122,8 +122,9 @@ Al Kharid is excellent for sustained thieving because kebabs cost only 1gp and c
|
||||
### Location
|
||||
| Target | Coordinates | Notes |
|
||||
|--------|-------------|-------|
|
||||
| Men near palace | (3293, 3175) | Multiple men, good density |
|
||||
| Karim (kebabs) | (3273, 3180) | 1gp per kebab (dialog shop) |
|
||||
| Al-Kharid warriors near palace | ~(3293, 3170) | Good density. NPC name is `Al-Kharid warrior` (id 18) — **not** "Man". Has a Pickpocket option |
|
||||
| Al Kharid men | ~(3277, 3187), (3294, 3196) | NPC name `Man` (id 16), also pickpocketable, but scattered — 15+ tiles north of the warriors |
|
||||
| Kebab seller (kebabs) | (3273, 3180) | 1gp per kebab (dialog shop).
|
||||
|
||||
### Thieving + Kebab Loop
|
||||
|
||||
@@ -146,18 +147,18 @@ if (hp.current <= EAT_HP_THRESHOLD) {
|
||||
|
||||
// Restock kebabs if low
|
||||
if (kebabCount < MIN_KEBABS && getCoins(ctx) >= 3) {
|
||||
await ctx.bot.walkTo(3273, 3180); // Karim
|
||||
await ctx.bot.walkTo(3273, 3180); // Kebab seller
|
||||
// ... buy kebab dialog (see dialogs.md)
|
||||
}
|
||||
|
||||
// Walk to men if not nearby
|
||||
const distToMen = /* calculate distance to (3293, 3175) */;
|
||||
if (distToMen > 15) {
|
||||
await ctx.bot.walkTo(3293, 3175);
|
||||
// Walk to the warriors if not nearby
|
||||
const distToTargets = /* calculate distance to (3293, 3170) */;
|
||||
if (distToTargets > 15) {
|
||||
await ctx.bot.walkTo(3293, 3170);
|
||||
}
|
||||
|
||||
// Pickpocket
|
||||
const man = ctx.sdk.getState()?.nearbyNpcs.find(n => /^man$/i.test(n.name));
|
||||
// Pickpocket - match the actual NPC name, /^man$/i finds nothing here
|
||||
const target = ctx.sdk.getState()?.nearbyNpcs.find(n => /^al-kharid warrior$/i.test(n.name));
|
||||
// ... standard pickpocket pattern
|
||||
```
|
||||
|
||||
@@ -173,6 +174,7 @@ const man = ctx.sdk.getState()?.nearbyNpcs.find(n => /^man$/i.test(n.name));
|
||||
|
||||
Stand on **(2669, 3310)** to steal from the **east** Baker's stall at (2667, 3310) without guards aggroing. This is a safe spot — guards don't path here.
|
||||
|
||||
- **Heads up on the stand tile**: (2669, 3310) is the Baker's own spawn tile, and Baker (id 571) is `blockwalk=yes`. You can only stand there once he has wandered off it — expect the walk to fail or stop short while he's home. Retry, or accept an adjacent tile.
|
||||
- **Only use the east stall** — the west stall at (2655, 3311) has no safe spot and guards will attack.
|
||||
- Stall id: 2561, steal opIndex: 2
|
||||
- Gives cakes, bread, chocolate slices (all heal HP)
|
||||
|
||||
@@ -142,9 +142,9 @@ await ctx.bot.walkTo(3092, 3243); // May path through (3220, 3220)
|
||||
| Toll gate (Lumbridge side) | (3268, 3228) | Pay 10gp to enter |
|
||||
| Toll gate (Al Kharid side) | (3277, 3227) | Walk here after paying |
|
||||
| Al Kharid bank | (3269, 3167) | x=3269 is 1 tile west of typical "in Al Kharid" check |
|
||||
| Kebab seller (Karim) | (3273, 3180) | Dialog-based shop, 1gp per kebab |
|
||||
| Kebab seller | (3273, 3180) | Dialog-based shop, 1gp per kebab.
|
||||
| Scimitar shop (Zeke) | (3287, 3186) | Bronze to Mithril scimitars |
|
||||
| Warriors/Men (palace) | (3293, 3175) | Good thieving/combat training |
|
||||
| Al-Kharid warriors (palace) | ~(3293, 3170) | Good thieving/combat training.
|
||||
| Fishing spots | (3267, 3148) | Safe shrimp fishing (there is a lvl 14 scorpion)
|
||||
|
||||
### Al Kharid Detection
|
||||
|
||||
@@ -28,8 +28,8 @@ await ctx.sdk.sendInteractLoc(tree.x, tree.z, tree.id, chopOpt.opIndex);
|
||||
|
||||
| Location | Coordinates | Tree Types |
|
||||
|----------|-------------|------------|
|
||||
| Lumbridge trees | (3200, 3220) | Regular trees |
|
||||
| Draynor willows | (3087, 3235) | Willow (level 30+) |
|
||||
| Lumbridge trees | (3195, 3220) | Regular trees. Large cluster spreading west/south from here |
|
||||
| Draynor willows | (3087, 3235) | Willow (level 30+). **DANGER: Dark wizards spawn at (3084, 3236)/(3085, 3238)** — right in the willows. Avoid under combat level 20 |
|
||||
| Varrock oaks | (3190, 3458) | Oak (level 15+) |
|
||||
|
||||
## Handling Drift
|
||||
@@ -37,7 +37,7 @@ await ctx.sdk.sendInteractLoc(tree.x, tree.z, tree.id, chopOpt.opIndex);
|
||||
Stay within a reasonable area:
|
||||
|
||||
```typescript
|
||||
const TREE_AREA = { x: 3200, z: 3220 };
|
||||
const TREE_AREA = { x: 3195, z: 3220 };
|
||||
const MAX_DRIFT = 15;
|
||||
|
||||
const player = state.player;
|
||||
|
||||
Reference in new issue
Block a user