Feature Reference
Every menu control and settings toggle in Banshee's manual, sorted, with the code behind it — the 13 Session Saver controls and the 92 settings-menu functions.
This page catalogs the two menu sections of BansheeFunctions.txt — [13] The
Main Menu (the homepage Session Saver control panel) and [92] The Main Functions
(everything in the in-game Settings menu, across the Render, Localhost, Sessions, and Statistics tabs). Each
entry is paired with its implementing code. For the chat-command equivalents of many of these toggles, see
the Command Reference.
[13] The Main Menu — Session Saver controls
The homepage's left/right panels are a thin UI over one idea: each button calls a small handler that sends a
comma-delimited text message to the Session Saver over the authenticated
User WebSocket. The handlers live in client.html; the receiving switch lives in
zombsSessions.js (documented on the Session Saver control
panel). Every control reads its parameters from the panel's input fields by class name:
const enableAutoBreakIn = () => {
user.sendMessage(`eabi, ;${document.getElementsByClassName("sessionsid")[0].value}, ;${document.getElementsByClassName("sessionsessionname")[0].value}, ;${document.getElementsByClassName("sessionname")[0].value}, ;${document.getElementsByClassName("sessionpsk")[0].value}`);
sendSession();
}
const enableAutoRefiller = () => user.sendMessage(`esrf, ;${document.getElementsByClassName("sessionsid")[0].value}`);
const enableAutoReconnect = () => user.sendMessage(`earc, ;${document.getElementsByClassName("sessionsid")[0].value}`);
const enableAutoFarm = () => user.sendMessage(`eafr, ;${document.getElementsByClassName("sessionsid")[0].value}`);
const enablePartyRefiller = () => user.sendMessage(`eafp, ;${document.getElementsByClassName("prfsid")[0].value}`);
const addPartyRefillerKey = () => {
user.sendMessage(`addafpsk, ;${document.getElementsByClassName("prfpsk")[0].value}, ;${document.getElementsByClassName("prfsid")[0].value}`);
changeServer();
}
The Session-creation and password/server controls go through dedicated User methods rather than
raw messages — these wrap the same sendMessage but exist as named methods because they're called
from several places (the big homepage Play button reuses createSession, for instance):
createSession(sessionname, name, sid, psk) {
this.sendMessage(`createsession, ;${sessionname}, ;${name}, ;${sid}, ;${psk}`);
}
closeSession(id) { this.sendMessage("closesession, ;" + id); }
changePassword(password) { this.sendMessage(`changehasaccess, ;${password}`); }
reconnect(closed) { // used by "Change Server"
if (!closed) this.reconnecting = true;
this.disconnect();
this.ws = new User().ws;
this.ws.onopen = this.onOpen.bind(this);
this.ws.onmessage = this.onMessage.bind(this);
this.ws.onclose = this.onClose.bind(this);
}
| Control | Panel | Handler → wire message | How it works |
|---|---|---|---|
| Auto Break In | Left | eabi / dabi | Server re-requests a full server every 15s until it gets in; carries session name, player name, server id, PSK |
| Auto Refiller | Left | esrf / dsrf | Refills the server with one Session at a time when it isn't full (≤9 Sessions) |
| Auto Reconnecting | Left | earc / darc | Re-queues closed Sessions to reconnect every 5s (see the reconnect queue) |
| Auto Farm | Left | eafr / dafr | New Sessions farm a tree/stone — purely to dodge AFK-kick checks |
| Party Refiller Key | Left | addafpsk / removeafpsk | Registers/removes a 20-char PSK into server.keys for the party refiller to use |
| Party Refiller | Left | eafp / dafp | Sessions auto-rejoin the configured party when it unfills — protects bases from raiders |
| Close Session | Left | closesession | user.closeSession(id) — closes the picked Session |
| Change Password | Left | changehasaccess | Rotates the Session Saver's salt (stored in localStorage.salt) |
| Reset Password | Left | changehasaccess | Sets the password back to the script's defaultPassword |
| Send Session | Left | createsession | user.createSession(...) — spawns a new headless Bot with the panel's fields |
| Change Session Name | Right | changesessionname | Renames a Session by id |
| Change Session ID | Right | changesessionid | Reorders Sessions by changing the second (display) id |
| Change Server | Right | (local) reconnect() | Repoints the User socket at a different Session Saver URL (yours = Localhost, or someone else's) |
[92] The Main Functions — the Settings menu
The in-game Settings menu is generated from a single declarative tabs array in
createScriptMenu(). Each tab holds sections, each section holds items, and the renderer turns
every item into a button whose data-* attributes encode how it behaves. This one data structure
is why the menu, the toggle system, and the Session relay all stay in sync — they're all reading the same
schema. The three relevant button types:
${(section.items || []).map(([key, label, onCommand, offCommand]) => tab.session
? `<a class="btn hud-session-toggle" data-session-script="${key}" data-session-on="${onCommand}" data-session-off="${offCommand}">${label}</a>`
: `<a class="btn hud-script-toggle" data-script="${key}">${label}</a>`).join("")}
${(section.actions || []).map(([label, command]) =>
`<a class="btn hud-session-action" data-session-command="${command}">${label}</a>`).join("")}
- Localhost toggle (
hud-script-toggle,data-script="key") — flipsthis.scripts[key]locally. This is the toggle system that drives your player and Sockets. - Session toggle (
hud-session-toggle,data-session-on/off) — sends the samee…/d…relay codes documented in the Command Reference, so a menu button and a chat command are literally interchangeable. - Session action (
hud-session-action,data-session-command) — sends a bare fire-once verb (lock,wlock1,ping…).
Render tab — Entity, Grids, Textures
The Render tab is special: instead of this.scripts flags, it proxies the game's own built-in
"FPS / walkthrough" debug buttons. getRenderActions() declares each toggle as a descriptor that
knows how to find the matching native button by its text, and the states are persisted to
localStorage so your render preferences survive a reload (the manual: "This category saves
your toggles upon exiting the game."):
getRenderActions() {
return [
{ id: "tower-entity", label: "Disable Tower Entity", section: "Entity", includes: ["Tower Entity"], excludes: ["Sprite"] },
{ id: "projectile-entity",label: "Disable Projectile Entity", section: "Entity", includes: ["Projectile Entity"] },
{ id: "zombie-sprite", label: "Disable Zombie Sprite Entity", section: "Entity", includes: ["Zombie Sprite Entity"] },
{ id: "zombie-entity", label: "Disable Zombie Entity", section: "Entity", includes: ["Zombie Entity"], excludes: ["Sprite"] },
{ id: "rendering", label: "Stop Rendering", section: "Entity", includes: ["Rendering"] },
{ id: "grid-200", label: "Show 200x200 Grid", section: "Grids", includes: ["200x200 Grid"] },
{ id: "ground", label: "Hide Ground", section: "Grids", includes: ["Ground"] },
{ id: "grid-7", label: "Show 7x7 Grid", section: "Grids", includes: ["7x7 Grid"] },
{ id: "stash-placement", label: "Show Stash Placement", section: "Grids", includes: ["Stash Placement"] },
{ id: "stash-range", label: "Show Stash Range", section: "Grids", includes: ["Stash Range"] },
{ id: "spawn-circle", label: "Show Spawn Circle", section: "Grids", includes: ["Spawn Circle"] },
{ id: "blocked-areas", label: "Show Blocked Areas", section: "Grids", includes: ["Blocked Areas"] },
{ id: "t6-textures", label: "Use Blue T6 Textures", section: "Textures", includes: ["T6 Textures"] },
{ id: "default-zombies", label: "Use Default Zombies", section: "Textures", includes: ["Zombies"] }
];
}
When you click a Render button, handleRenderAction either calls a registered
window.zombsRenderActions API (Banshee's custom render hooks) or falls back to
clicking the native game button it located by text, then saves the resulting state:
handleRenderAction(button) {
const actionId = button.dataset.renderAction;
const api = window.zombsRenderActions && window.zombsRenderActions[actionId];
if (api && api.toggle) {
api.toggle();
this.saveRenderActionState(actionId); // → localStorage.zombsRenderStates
this.syncRenderButtons();
return;
}
const source = this.findFpsRenderButton(actionId); // locate native button by includes/excludes text
if (!source) return;
source.click();
this.saveRenderActionState(actionId);
this.syncRenderButtons();
}
findFpsRenderButton is the clever part: it scans the game's
#hud-menu-FPS .hud-FPS-restart-walkthrough buttons and matches the one whose text contains every
includes term and none of the excludes terms — which is how "Tower Entity"
and "Zombie Entity" avoid matching the "…Sprite Entity" buttons.
| Toggle | Section | How it works (per manual) |
|---|---|---|
| Tower / Projectile / Zombie Sprite / Zombie Entity | Entity | Toggle rendering of that entity class (buildings except stash / projectiles / zombie textures / zombies as a whole) |
| Rendering | Entity | Starts/stops the engine itself — "You won't disconnect when it's disabled" |
| 200x200 Grid | Grids | Tower-grouping grid for checking ranges; used for low-tier ENVs and Score Bases |
| Ground | Grids | Shows/hides the four-biome ground (and base borders/ranges) |
| 7x7 Grid | Grids | Where harvesters can be placed — can't place near enemy bases; used for Pressure-Bug raiding |
| Stash Placement | Grids | 53-tile minimum square between two gold stashes (on by default) |
| Stash Range | Grids | 18-tile build radius around the stash (on by default) |
| Spawn Circle | Grids | Zombie-spawn ring (18·√2 tiles); also toggles tower/heal range indicators (on by default) |
| Blocked Areas | Grids | Zombie-pathing block zones, offset one 48px grid to the bottom-right |
| Purple/Blue T6 Textures | Textures | Switch Tier-6 between Amethyst and Diamond skins |
| Default/Themed Zombies | Textures | Switch zombies between default and biome-themed textures |
Localhost tab — your player & Sockets
Every Localhost item is a plain this.scripts[key] flag (with mutual-exclusion enforced for the
wall/harvester families). The full schema, straight from createScriptMenu:
{ title: "Defense", items: [["autoheal","Auto Heal"],["autobow","Auto Bow"],["autospear","Auto Spear"],["autoshield","Auto Shield"],["autoaim","Auto Aim"],["autotimeout","Auto Timeout"]] },
{ title: "Pets", items: [["autopetpotion","Buy Pet Potion"],["autopetheal","Pet Heal"],["autorevivepets","Revive Pet"],["autoevolvepets","Evolve Pet"]] },
{ title: "Base", items: [["autobuild","Auto Build"],["autoupgrade","Auto Upgrade"],["upgradeall","Upgrade All"],["sellall","Sell All"],["uth","UTH"],["towerheal","Tower Heal"],["autorefiller","Auto Refiller"]] },
{ title: "Placement", items: [["walls3x3","Walls 3x3"],["walls5x5","Walls 5x5"],["walls7x7","Walls 7x7"],["walls9x9","Walls 9x9"],["harvs4x4","Harvs 4x4"],["harvs8x8","Harvs 8x8"]] },
{ title: "Multibox", items: [["mousemove","Mouse Move"],["positionlock","Position Lock"],["wasd","WASD"],["autofollow","Auto Follow"]] },
{ title: "Tools", items: [["showrss","Player Info"],["clearchat","Clear Chat"],["chatspam","Chat Spam"],["xkey","X Key"],["scorelogger","Score Logger"],["autorespawn","Auto Respawn"],["autoaltjoin","Auto Alt Join"],["joindelay","Join Delay"],["sesswitcher","Ses Switcher"],["singlescorelogger","1P Score Logger"]] }
| Section | Toggles & what each does |
|---|---|
| Defense | Auto Heal (potion below low HP) · Auto Bow (auto-attack) · Auto Spear (buy Spear on Sockets to raid) · Auto Shield (T1 ZombieShield) · Auto Aim (player+Socket aimbot) · Auto Timeout (buy Pause → AITO). Code on Defense automations. |
| Pets | Buy Pet Potion · Pet Heal (below low HP) · Revive Pet (when dead) · Evolve Pet (token-gated ladder — see Pets) |
| Base | Auto Build/Auto Upgrade (replay a recorded base — needs !record+!arb/!aru) · Upgrade All · Sell All · UTH (upgrade low-HP towers to tank) · Tower Heal (heal-spell low-HP towers) · Auto Refiller (spawn Alts to 40 players — see Base automations) |
| Placement | Walls 3x3 → 9x9 & Harvs 4x4 / 8x8 — mutually-exclusive placement-spam interceptors that trap players; full code on Chat Commands |
| Multibox | Mouse Move · Position Lock · WASD · Auto Follow — drive how Sockets move; see the Multibox tab |
| Tools | Player Info · Clear Chat · Chat Spam · X Key · Score Logger · Auto Respawn · Auto Alt Join · Join Delay (stage Sockets — see Join Delay) · Ses Switcher · 1P Score Logger |
Sessions tab — control the headless Bot
The Sessions tab is marked session: true, so every item carries its e…/d…
relay codes inline in the schema — clicking a button sends the exact same message as the matching chat
command. This is the menu face of the Session command relay:
{ title: "Defense", items: [
["sessionAutobow","Auto Bow","eatb","datb"], ["sessionAutoaim","Auto Aim","eaa","daa"],
["sessionAimZombies","Aim Zombies","eaaz","daaz"], ["sessionAimDemons","Aim Demons","eaad","daad"],
["sessionTimeout","Auto Timeout","eat","dat"], ["sessionAutoWeapon","Weapon Switch","eaws","daws"],
["sessionClearZombies","Clear Zombies","eacz","dacz"], ["sessionChatSpam","Chat Spam","esp","dsp"] ] },
{ title: "Base", items: [
["sessionAutobuild","Auto Build","eab","dab"], ["sessionAutoupgrade","Auto Upgrade","eau","dau"],
["sessionUpgradeAll","Upgrade All","eua","dua"], ["sessionSellAll","Sell All","esa","dsa"],
["sessionUpgradeHealth","UTH","euth","duth"], ["sessionTowerHeal","Tower Heal","eth","dth"],
["sessionAhrc","AHRC","eahrc","dahrc"], ["sessionAntiArrow","Anti Arrow","eaar","daar"],
["sessionRevert","Revert Towers","erev","drev"], ["sessionReturnItems","Return Items","erit","drit"] ] },
{ title: "Misc", items: [
["sessionPositionLock","Position Lock","epl","dpl"], ["sessionFollow","Auto Follow","epf","dpf"],
["sessionAutoMove","Auto Move","eatm","datm"], ["sessionAimLock","Aim Lock","eal","dal"],
["sessionWallBounce","Wall Bounce","ewb","dwb"], ["sessionPlayerTrick","Player Trick","ept","dpt"],
["sessionReverseTrick","Reverse Trick","erpt","drpt"], ["sessionBossReverse","Boss Reverse","ebrpt","dbrpt"],
["sessionTokenReverse","Token Reverse","etrpt","dtrpt"], ["sessionAutoSell","Auto Sell","easl","dasl"] ] },
{ title: "Actions", actions: [
["Lock Position","lock"], ["Second Lock","2lock"], ["Aim Lock Pos","alock"],
["Horizontal WB","hor"], ["Vertical WB","ver"], ["Wall Lock 1","wlock1"],
["Wall Lock 2","wlock2"], ["Ping","ping"], ["Uptime","uptime"] ] }
Because the toggle codes are identical to the chat-command relay codes, the per-item behavior is exactly the
one documented in the Command Reference table — Defense, Pets,
Base, and Misc are all enable/disable pairs that flip a bot.scripts.* flag, while the
Actions group (Lock Position, the two Wall Locks, Aim Lock Pos, Horizontal/Vertical WB, Ping,
Uptime) fire the bare one-shot verbs. The handful of Sessions features the manual lists that have no
chat-command twin — Clear Zombies, Weapon Switch, Anti Arrow,
Revert Towers, Return Items, and the trick variants — are reachable both
ways (e.g. !acz, !aws, !aar, !rev, !rit) since
they share the same codes.
Why the duplication is intentional: a Session is headless, so there's no in-game menu
running inside it. The menu you see is in your browser, attached to the Session — so a "menu
toggle" and a "chat command" are just two front-ends emitting the same e…/d…
message to the same Bot. That's the whole reason the schema stores the relay codes as data rather than
hard-coding handlers.
Statistics tab
The Statistics tab (statistics: true) is a read-out panel, not a set of toggles. Its markup is
a grid of data-stat cells that an auto-updater fills every 0.5s — CPU%, memory, heap, ZOMBS
ping, server id, session count, and uptimes — plus a manual Refresh Stats button:
<div class="hud-statistic"><span>Process CPU</span><strong data-stat="cpuPercent">--</strong><small>%</small></div>
<div class="hud-statistic"><span>ZOMBS Ping</span><strong data-stat="zombsPingMs">--</strong><small>ms</small></div>
<div class="hud-statistic"><span>Sessions</span><strong data-stat="sessionsCount">--</strong><small>active</small></div>
<div class="hud-statistic"><span>Session Uptime</span><strong data-stat="sessionUptime">--</strong></div>
<a class="btn hud-statistics-refresh">Refresh Stats</a>
Per the manual, Refresh Stats "manually updates the Statistics that are auto updated
every 0.5 seconds. This also updates your Ping, which isn't auto measured" — the stats stream comes from
the Session Saver (sendSessionStats), while ping is the one value the client must actively probe.
The Sessions-tab Ping and Uptime actions feed into the same panel.