How it fits together

Worlds is not one server. It is four independent services, and a world server on its own does not give you a working client. This trips up everyone at the start, so it goes first.

WorldsPlayer the client worldserver:// TCP binary, port 6650 HTTP WorldServer presence, chat, rooms this project Upgrade server worlds, avatars, textures Script server cgi-bin/*.pl the avatar list WebWalls web pages drawn on surfaces in-world Four services, not one. A world server on its own does not give you a working client.
Worlds is four services. The client talks to all of them, over two different transports. Miss one and something breaks in a way that looks like something else — a dead script server, for instance, turns every custom avatar into the default one.

The four services

  1. WorldServer — TCP, a proprietary binary protocol. Presence, chat, movement, rooms and properties. Historic port 6650. This is the part this project implements, and the one the protocol page is about.
  2. The upgrade server — HTTP. Worlds, avatars and textures are downloaded from here. Both servers in this project have one built in.
  3. The script server — the Perl CGIs. This is where the permitted-avatar list lives. If the client cannot fetch it, every custom avatar in the room silently becomes the default figure — the single most confusing failure in Worlds, and it is not a broken avatar.
  4. WebWalls — actual web pages rendered on surfaces inside the world. Very much of its decade, and still a good idea.

Why there are two servers

Because they are for two different jobs, and mixing them would spoil both.

WorldServer: the reference

It exists to keep Worlds.com as it was. It speaks the protocol the original client speaks and adds nothing. A client from 2012, or any other implementation written against the original, behaves exactly as it always did. It is the reference and it stays that way.

AikoWorlds: where things happen

The same code with room to grow: persistence in SQLite, a capability announcement, extensions. It stays compatible on the wire, and it tells an older client, once, that it might see something it cannot draw.

If you want the original behaviour exactly, either server gives it to you — set ANNOUNCE=0 on AikoWorlds and not one extra byte goes out.

How the client knows which is which

WorldsClient one viewer no configuration server announced itself → extended server said nothing → legacy, behave as the original AikoWorlds announces caps=… extensions available WorldServer announces nothing the original protocol The server speaks first. The client only answers what it heard. A server that never announced anything therefore never receives anything unusual.
How the client tells them apart. Nothing is configured and nothing is guessed: the order of the conversation is what makes an extended client safe to point at any server.

Nothing is configured and nothing is guessed. The order of the conversation does the work: the server speaks first, and a client only sends its own capabilities after it has seen the server's. A server that never announced anything therefore never receives anything unusual — which is exactly what makes it safe to point an extended client at any other Worlds server, at the original servers if they ever came back, or at something built later.

Same arrangement Second Life and OpenSimulator arrived at: one viewer, two kinds of world.

What you need to run it

ForYou needGuide
Playing Windows, or Wine with a 32-bit JRE. The renderer is a native 32-bit DLL and there is no way round it. Using the client
The modified client Your own copy of the WorldsPlayer, JDK 8, a Java 17+ runtime for the decompiler, and a Wine prefix with a 32-bit JRE 1.6. The modified client
Running a server A C++20 compiler. Nothing else — there are no external dependencies. Running a server
Content Whatever worlds, avatars and textures you supply. The servers serve what you give them. RWX avatars · The Shaper