Back to Chat Toys

Chat Toys

One overlay. Follows, subs, and the other stream events either put an animated character on the bottom of the screen, toss an emote into a bouncing wall, or do both. A chat message puts a speech bubble on a walker who is already there. Chat can dress their own walker, and that look is kept for the next stream.

Setup

  1. In Streamer.bot, turn on the WebSocket Server. YouTube and Kick only arrive as Streamer.bot events, so those platforms have to be connected there.
  2. Open the customizer, copy the import string, then Streamer.bot → Actions → Import. The action is “ZeMaxi - Chat Toys”.
  3. Set the mode, platforms, lifetimes, and the toss reward. Click Generate and copy the overlay URL.
  4. In OBS, add a Browser Source at 1920×1080 with a transparent background. Paste the URL.
  5. Optional: add the dock URL as another browser source, or open it on a second screen.

Modes

The URL carries mode=walk, mode=wall, or mode=both.

Speech bubbles

A chat message puts a pixel speech bubble over that person’s walker when they are already on screen. The bubble follows them, jumps with them, starts small, and pops up to full size. Emotes in the line show as pictures, so “Hello there zemaxiCool” keeps the words and the emote. It stays for the number of seconds you set, then shrinks away. A newer message from the same person replaces it. Commands such as !skin do not get a bubble. Wall-only mode has no walkers, so it has no bubbles. Colours: white, sky, pink, gold, mint, lilac, and ink. White is the pixel bubble with a blue edge.

Chat commands

Each command can be turned off in the customizer. !jump is always accepted alongside whatever you type in the jump-command box. !colour works the same as !color.

The choice is stored on that person’s platform id inside the persisted global zmx.chat-toys.state, under looks. It survives the walker leaving and the overlay closing. A copy is also kept in this browser’s localStorage, and the two are merged, newest edit first. Nothing is sent to a database. Chat replies need the Streamer.bot websocket password, the same as the other tools. Turn replies off in the customizer if you want the change with no message.

Mods still clear the wall with !clearwall (or the command you set).

Skins and groups

The customizer lists skins in sections, one per source. Every one is free CC0 pixel art:

Turn a whole group off, or one skin, and click Generate. !skin random and !walker random use whatever is still on. A look someone already saved keeps working when that skin is still on. A saved skin that no longer exists falls back to the channel default. The Pixel Adventure 2 mushroom is mush. Every character faces the way it walks; the Pixel Frog enemies were drawn facing left and are mirrored.

Adding a sprite sheet

Skins are listed in sprites/manifest.json. Every sheet uses the manifest frame size, which is 32×32. A strip is a horizontal row of that many square cells, left to right, no padding between cells. The character faces right. The feet stand on the bottom row of the cell so every skin shares one floor line. walk is required. idle, jump, fall, and wave are optional and fall back to the walk strip. Put the files under sprites/, add the skin, and reload the overlay. Hats are separate images; the manifest lift value drops or raises one on the head. Art credits and licences are in CREDITS.md.

Give your own art its own group. fps is per animation. Optional motion is float (a small bob above the floor while walking or idling) or squash (alternate walk frames flatten, feet staying down). Raise the manifest version when you redraw a sheet under the same file name, so browsers and OBS fetch the new picture. This is the whole entry:

{
  "id": "mio",
  "name": "Mio",
  "group": "custom",
  "pack": "Custom",
  "aliases": ["mio"],
  "motion": "float",
  "animations": {
    "idle": {"file": "sprites/custom/mio/idle.png", "frames": 8, "fps": 10},
    "walk": {"file": "sprites/custom/mio/walk.png", "frames": 8, "fps": 12},
    "jump": {"file": "sprites/custom/mio/jump.png", "frames": 1, "fps": 1},
    "fall": {"file": "sprites/custom/mio/fall.png", "frames": 1, "fps": 1},
    "wave": {"file": "sprites/custom/mio/wave.png", "frames": 6, "fps": 12}
  }
}

Add the group to groups in the manifest:

{ "id": "custom", "name": "Custom" }

Platforms

Choose All, one platform, or any pair. A Twitch simulcast that is not allowed to show other platforms on screen can be set to Twitch only. Walkers are the sprite characters, not profile photos. The wall still uses an emote from the message when there is one. Chat Toys does not call the Twitch API.

Events

Follows, subs, gift subs, Kick subs, Kicks, Super Chats, Super Stickers, Jewels, memberships, Twitch raids, and Twitch channel-point or Kick reward redemptions. Each one can be turned off. A raid rains balls with the raider’s Twitch picture, one for every five viewers (3 to 12), and the raider’s walker jumps in. A chat message does not spawn a toy. The toss command and the named reward still jump a walker when reward spawn is off.

Dock

Clear wall, pause spawn, test toss, shake, and test rain. Shake does what !shake does. Test rain drops a raid’s worth of balls. Pause stops new toys from events. Toys already on screen finish their lifetime. Test toss still jumps a walker so you can see the overlay without waiting for chat.

Where it is saved

The overlay and the dock share one persisted Streamer.bot global, zmx.chat-toys.state, written by the imported action with CPH.SetGlobalVar(..., true) and broadcast with CPH.WebsocketBroadcastJson. Walker looks live in that same global. You do not need a new import if “ZeMaxi - Chat Toys” is already there. Nothing is stored in an outside database. The customizer remembers the form in this browser only. That form is not the show.

Preview

The customizer preview uses ?preview=1. It does not connect to Streamer.bot. It keeps a demo cast walking and listens for the test buttons. Live overlays still despawn idle chatters on the timer you set. The real overlay shows “Streamer.bot disconnected” and hides that note after 5 seconds.