← ClaudeAtlas

osrslisted

Play Old School RuneScape with Alex as MIST -- an embodied, agentic character on the Alora private server, controlled fully in the background so the shared Mac stays usable. Canonical reference for launching/logging in the client, reading live game state (player coords, on-screen NPCs), and acting (move, click NPCs/objects, type in chat) via the in-process agent. Use when Alex says "play OSRS", "log MIST into Alora", "let's play RuneScape", "go to / talk to <NPC>", "MIST come play", references her OSRS character (MISTci), or wants MIST to do something in the game world.
BaesTheorem/exobrain-harness · ★ 1 · AI & Automation · score 67
Install: claude install-skill BaesTheorem/exobrain-harness
# osrs -- MIST embodied in Old School RuneScape (Alora) MIST plays as her own character **MISTci** on **Alora** (an OSRS private server) so Alex can play *alongside* her. Everything runs **fully in the background**: MIST never steals the cursor, focus, or screen, so Alex can use the Mac (or play his own client) at the same time. This was a hard requirement -- see the architecture below for why it's built this way. ## Architecture (why it works on a shared 8GB M1) Three channels, all background, validated live: - **Eyes** -- `screencapture -l<windowID> out.png` captures the client window even when it's occluded/unfocused. Find the window via Quartz `kCGWindowListOptionAll` (owner `RuneLite`, title contains "Powered by RuneLite") -- *not* `OnScreenOnly`, which misses occluded windows. - **Hands + voice** -- a tiny **launch-time Java agent** (`-javaagent`) runs *inside the client JVM* and dispatches AWT mouse/key events straight to the game canvas, bypassing macOS focus routing. This is the key trick: macOS only delivers synthetic *keyboard* to the focused window, but an in-process agent doesn't care about focus, so **MIST can type in chat in the background**. (`-XX:+DisableAttachMechanism` only blocks *late* attach, not launch-time agents.) - **Brain** -- the same agent reads **RuneLite's live game state via reflection** (`net.runelite.client.RuneLite.getInjector().getInstance(Client.class)`): player world coords, game state, and every on-screen NPC's name +