[vworld-tech] Modern MUD server design
Brian Hook
hook_l at pyrogon.com
Wed Jan 21 14:16:07 PST 2004
I've been dorking around with an experimental MUD server design,
nothing genius, just trying different kinds of technology, and was
curious what others had to say on it.
NOTE: I have never seen Diku or LPC code bases, so there is a good
chance that I'm doing things A.) stupidly or B.) reinventing the
wheel, but that's fine, since I'm doing this for educational purposes.
The server is divided into three main components:
* kernel (written in a standard compiled language)
* game logic (written in an embeddeded scripting language)
* database
The kernel is basically the glue, and has no game logic in it
whatsoever. All logic is embedded in the scripting language
(currently Lua), which in turn communicates indirectly to the database
via the kernel.
MySQL DB <=> kernel <=> game scripts
The kernel manages MySQL communication and TCP socket connections.
I'm currently using telnet as my protocol, however I'm thinking about
either embellishing it with suboption negotiation for richer data
and/or encryption or possibly ditching it altogether and requiring the
use of a custom client.
What are people currently using for secure communications to MUD
servers? I'm thinking of either layering my own protocol on telnet
using (sub)option negotiation and/or requiring a custom client and/or
using something else like SSL/stunnel. Key issue being that telnet
isn't particularly secure.
This is written portably and runs on Windows, OS X and Linux (and
presumably FreeBSD and other variants as well).
The main loop is pretty generic. The kernel gathers up all incoming
socket data, strips off IAC data and adjusts state accordingly,
buffers until newline (for sucky clients that don't do linemode
operation), and for any completed lines dispatches them to the script
engine, e.g.:
script_do_input( buf, socket_received_from );
When all input processing is done, then the world gets a 'tick' to
advance, which is handled as a message to the script subsystem:
script_tick();
And it does all its gnarly internal updates for mobs, rooms, etc. that
it needs to do.
Some of the rationales:
- Lua: fast, will have an incremental garbage collector by the time
I'm done, easy to embed
- Why not Ruby? Heavyweight and SLOW.
- Why not Python? No good reason, just bigger than Lua and not as
fast.
- Why not 100% in Lua/Ruby/Perl/Python and just call out to C?
Because I'm a wuss and didn't feel like committing that heavily to a
language at this point =)
- Why not postgreSQL? Because MySQL is better documented and more
ubiquitous, however I can easily change this later.
- Why a database instead of flat-file/in-memory? Transaction
oriented, fast access, much better persistency, SQL is powerful as
hell, access to third party tools, remote modifications.
- Why C? Actually, I'm suing .cpp files, however I really don't care
for C++ as a language (something I really don't want to get into an
argument about...again), but there are some elements of C++ that I
like that C89 doesn't support (specifically, declare-anywhere).
Any comments/criticisms are welcome and appreciated.
Brian
More information about the vworld-tech
mailing list