New User Guide

(edit: Due to popular refusal to read this guide, many of the things that this guide tells you how to set up have already been set up.)

After you get Lich installed and logged in, this page might help you figure out what to do next.

The usefulness of Lich comes from the scripts that it runs. With these scripts, the features of Lich are virtually endless. For new users, this can make the commands to control Lich also seem endless and mysterious. However, Lich only has a handful of built-in commands. These commands are used to start, stop, pause, unpause, list, trust, and distrust scripts; and a help command. Let's take a look at the help command.

>;help Lich v4.6.10 built-in commands: ;<script name> start a script ;force <script name> start a script even if it's already running ;pause <script name> pause a script ;p <script name> '' ;unpause <script name> unpause a script ;u <script name> '' ;kill <script name> kill a script ;k <script name> '' ;pause pause the most recently started script that isn't aready paused ;p '' ;unpause unpause the most recently started script that is paused ;u '' ;kill kill the most recently started script ;k '' ;list show running scripts (except hidden ones) ;l '' ;pause all pause all scripts ;pa '' ;unpause all unpause all scripts ;ua '' ;kill all kill all scripts ;ka '' ;list all show all running scripts ;la '' ;exec <code> executes the code as if it was in a script ;e <code> '' ;execq <code> same as ;exec but without the script active and exited messages ;eq <code> '' ;trust <script name> let the script do whatever it wants ;distrust <script name> restrict the script from doing things that might harm your computer ;list trusted show what scripts are trusted ;lt '' ;send <line> send a line to all scripts as if it came from the game ;send to <script> <line> send a line to a specific script If you liked this help message, you might also enjoy: ;lnet help ;magic help (infomon must be running) ;go2 help ;repository help ;alias help ;vars help ;autostart help

For now, you can ignore the ;exec, ;e, ;execq, and ;eq commands. They may be useful to you when you start writing your own scripts, but this tutorial won't cover writing scripts. You can also ingore the ;send commands, since they're rarely used.

That leaves us with only ;force, ;pause, ;unpause, ;list, ;kill, ;trust, ;distrust, and their variations. Any other command that starts with a semi-colon is assumed to be the name of a script that you want to start.

When you download Lich, it comes with only a few scripts; the most import of which is probably the repository script, since it allows you to download all the other scritps. Lets get started by trying to use the repository script.

>;repository list --- Lich: repository active. [repository: this script must be trusted to work (;trust repository)] --- Lich: repository has exited.

That's probably not what you expected to happen, but here's a good time to explain the trusted script system. Anyone using Lich can write a script and upload it to the repository, and Lich scripts can do basically anything any other program on your computer can do. While you can (and should) read each script you download to make sure it won't try to do bad things to your computer, most users are either unwilling to do this or unable to understand the code well enough to know if it's going to do something good or bad. That's where the trusted script system comes in. By default, no scripts are trusted until you indicate that you trust them by typing ";trust scripename". A script that is not trusted is limited in what it can do. For example, it cannot read or write to any file on your computer that it wants, and it can't create internet connections. It can, hovever, do whatever it wants with your character in game. While there haven't been any malicious scripts on the repository yet, I still recommend reading scripts before you use them (they're stored in plain text in the scripts directory where ever you extracted the Lich zip file).

The repository script needs to connect to the Lich server to function, so it needs to be trusted.

>;trust repository --- Lich: 'repository' is now a trusted script.

Now we can get a list of files in the repository. Any command that starts witha semi-colon and isn't a built-in Lich command is assumed to be a script name. Anything that comes after that script name is passed to the script that's being started, and it's up to that script what it does with it. In this case, we'll pass "list" to the repository script, and it should show us a list of scripts.

>;repository list --- Lich: repository active. file size last update author DLs rating ------------------------ ------ ------------------ ------- --- -------- oldrepo.lic 2.4k 2014-09-27 10:08pm Tillmen 210 5.0 (1) repository.lic 71.3k 2014-11-06 2:10pm Tillmen 163 10.0 (1) go2.lic 33.8k 2014-10-07 10:11pm Tillmen 78 10.0 (2) waggle.lic 42.0k 2014-10-16 8:03pm Tillmen 97 alias.lic 6.4k 2014-11-07 9:08pm Tillmen 16 autostart.lic 4.1k 2014-08-24 2:00pm Tillmen 6 sorter.lic 2.0k 2014-09-27 10:01pm Tillmen 99 10.0 (1) narost.lic 11.2k 2014-08-24 2:19pm Tillmen 90 10.0 (1) spell-list.xml 183.5k 2014-11-08 11:32am Tillmen 58 vars.lic 1.4k 2014-08-25 3:08pm Tillmen 9 gameobj-data.xml 33.4k 2014-10-23 5:30pm Tillmen 67 infomon.lic 14.8k 2014-09-27 9:53pm Tillmen 56 lnet.lic 67.7k 2014-10-01 4:50pm Tillmen 53 (lots more scripts) --- Lich: repository has exited.

There are too many scripts, so I've only shown a few here. You might be wondering how you're supposed to know that you can pass "list" to the script, or what other things you can tell the script to do. Most scripts have their own help message that you can read by passing "help" to the script.

>;repository help --- Lich: repository active. usage: ;repository COMMAND OPTIONS commands: list show files you can download list-updates show files that you have and there's an update for list-new show files that you don't have list-tags show all the tags currently in use info FILENAME show information about a file download FILENAME download a file rate FILENAME NUMBER rate a file upload FILENAME upload a file to the server delete FILENAME delete a file from the server change-password NEWPASS change your repository password download-lich download the latest version of Lich download-mapdb download the latest map database checkout-mapdb must be done before editing the map database release-mapdb if you checkout-mapdb and change your mind upload-mapdb upload your changes to the map database download-updates downloads any available updates to scripts/lich/mapdb if set as updatable with the set-updatable commands show-updatable shows your current settings for download-updates set-updatable FILENAME download updates for FILENAME (when using download-updates) set-lich-updatable download updates for Lich (download-updates) set-mapdb-updatable download updates for the map database (download-updates) unset-updatable FILENAME ignore updates to FILENAME unset-lich-updatable ignore updates to Lich unset-mapdb-updatable ignore updates to the map database options: --name=TEXT[,TEXT] only list files whose name contain TEXT --game=CODE[,CODE] complicated --sort=TEXT sort list by name,age,size,downloads,rating --reverse show the list in reverse order --limit=NUMBER show at most NUMBER files in the list --limit=OFFSET,NUMBER show at most NUMBER files after skipping OFFSET files --author=TEXT specify the author of the file for uploading or listing --password=TEXT specify the password for the author for uploading --size>NUMBER[k|m|g] only list files larger than NUMBER bytes (or specified unit) --size<NUMBER[k|m|g] only list files smaller than NUMBER bytes (or specified unit) --age>NUMBER[m|h|d|w|y] only list files updated less than NUMBER seconds (or specified unit) ago --age<NUMBER[m|h|d|w|y] only list files updated more than NUMBER seconds (or specified unit) ago --downloads>NUMBER only list files with more than NUMBER downloads --downloads<NUMBER only list files with less than NUMBER downloads --downloads=NUMBER only list files with exactly NUMBER downloads --rating>NUMBER only list files with a rating higher than NUMBER --rating<NUMBER only list files with a rating lower than NUMBER --rating=NUMBER only list files with a rating equal to NUMBER --tags=TEXT[,TEXT] only list files with the specified tags --force ignore md5sum checks and script requirements --show-tags show tags in the list --hide-last-update hide last update in the list --hide-size hide file size in the list --hide-author hide author in the list --hide-downloads hide downloads in the list --hide-rating hide rating in the list --- Lich: repository has exited.

Another way to learn about scripts is using the repository info command. For example, if we see go2.lic on the repository and wonder what it does:

>;repository info go2.lic --- Lich: repository active. file game size last update author DLs rating ------- ---- ----- ------------------ ------- --- -------- go2.lic any 33.8k 2014-10-07 10:11pm Tillmen 78 10.0 (2) movement script based on Shaelun's goto.lic attempts to find the shortest route between any two rooms in the game requires a map database (;repository download-mapdb) ;go2 help author: Tillmen (tillmen@lichproject.org) original author: Shaelun game: any tags: core, movement version: 1.1 changelog: 1.1 (2014-10-07): only automatically reduce typeahead setting if there's a typeahead message in the buffer --- Lich: repository has exited.

This sounds like a useful script, so lets download it. We know from the repository help message that we can download scripts using ;repository download FILENAME.

>;repository download go2.lic --- Lich: repository active. [repository: downloading go2.lic in 3 seconds... (;k repository to cancel)] [repository: done] --- Lich: repository has exited.

Now we can start the go2 script, but we don't know how to tell it to do what we want it to do, so we'll start with ;go2 help

>;go2 help --- Lich: go2 active. ;go2 <target> Takes you where you want to go using your saved options. ;go2 <options> <target> Takes you where you want to go, using the given options instead of your saved options. ;go2 <options> Saves the given options. target: <target> may be a room number, a custom target, a built-in target, or part of a room title or room description. options: --typeahead=<#> Sets the number of typeahead lines to use. --get-silvers=<on|off> Sets if go2 has permission to access your bank account. --shortcut=<on|off> Sets if the shortcut to Ta'Vaalor should be used. (climbing and/or simming needed) --ice-mode=<auto|wait|run> Sets how go2 should deal with room the make you slip and fall. --get-return-trip-silvers=<on|off> Sets if go2 should withdraw enough silvers to return from your destination room to your starting room. --use-seeking=<on|off> Sets if go2 should use Voln symbol of seeking when it will shorten your trip. --portals=<on|off> Sets if portals should be used. other commands: ;go2 save <new name>=<target> Saves a custom target. <target> can be the same as before, or 'current' for your current room ;go2 delete <custom target> Deletes a saved custom target. ;go2 list Shows your custom targets. ;go2 targets Shows the built-in targets. --- Lich: go2 has exited.

One of the built-in targets for go2 is "bank" (which you could find using the ";go2 targets" command). Lets go to the bank.

>;go2 bank --- Lich: go2 active. --- Lich: error: no map database found [go2: error: your current room was not found in the map database] --- Lich: go2 has exited.

Foiled again! As you may have noticed in the ";repository info go2.lic" message, go2 requires a map database. The map database isn't included with Lich by default because it's fairly large, changes often, and there's four of them (one for each game instance). You may already know how to get the map database from the ";repository help" message or the ";repository info go2.lic" message.

>;repository download-mapdb --- Lich: repository active. [repository: downloading map database...] [repository: loading map database...] [repository: done] --- Lich: repository has exited.

Now, lets try to go to the bank again.

>;go2 bank --- Lich: go2 active. [go2: ETA: 0:00:01 (8 rooms to move through)] (lots of screen scroll) [go2: travel time: 0:00:01] --- Lich: go2 has exited.

There's more than one bank in the game, so how did go2 know which one we wanted to go to? When using a built-in target, go2 just goes to the closest one.

Suppose we wanted to take a longer trip, like from Wehnimer's Landing to Ta'Illistim. There's a built-in target "town", but that will only take us to Town Square Central in Wehnimer's Landing, since that's the closest one. We have a few options here to get us to Ta'Illistim. If we already know the room number (188 for Ta'Illistim, Hanging Gardens), we can use that (;go2 188). However, you don't actually need to memorize any room numbers for go2. If you were in Ta'Illistim previously and saved a custom target (;go2 save illistim=current), you could use that (;go2 illistim). You could use ";go2 targets" and look though the built-in targets to find the room number there. You could look up the room number using narost (more on narost later). Or, when in doubt, you can just type ";go2" and put where you want to go after that.

>;go2 Ta'Illistim --- Lich: go2 active. 283 matching rooms found: 1: [Ta'Illistim, BriarStone Court] (7) 2: [Ta'Illistim, BriarStone Court] (8) 3: [Bank of Ta'Illistim, Lobby] (9) 4: [Bank of Ta'Illistim, Lobby] (10) 5: [Bank of Ta'Illistim, Lobby] (12) 6: [Ta'Illistim, Erissian Var] (13) 7: [Ta'Illistim, Erissian Var] (14) 8: [Ta'Illistim, Erissian Var] (15) 9: [Ta'Illistim, Erissian Var] (16) 10: [Ta'Illistim, Erissian Var] (17) 11: [Ta'Illistim, Erissian Var] (18) 12: [Ta'Illistim, Sylvar Wey] (19) 13: [Ta'Illistim, Glamesine Var] (20) 14: [Ta'Illistim, Glamesine Var] (21) 15: [Ta'Illistim, Glamesine Var] (22) 16: [Ta'Illistim, Glamesine Var] (23) 17: [Ta'Illistim, Glaendier Wey] (24) 18: [Ta'Illistim, Glaendier Wey] (25) 19: [Ta'Illistim, Glaendier Wey] (26) 20: [Ta'Illistim, Shimmarglin Court] (27) select a room (;send <1-20>) or ';send next' for more

Since Ta'Illistim isn't a built-in or custom target, go2 searches the room title and description of every room in the database, and gives you a list of any matching rooms. If you see Ta'Illistim, BriarStone Court on the list and decided that's the place to be, just type ";send 1". However, if you don't like any of those options, you'll need to kill the script using ";kill go2", or ";k go2" for short, or ";k" for ever shorter since go2 was the last script started.

Lets move onto the Lich chat script, lnet. This script will also need to be trusted, because it connects to the Lich server.

>;repository download lnet --- Lich: repository active. [repository: downloading lnet.lic in 3 seconds... (;k repository to cancel)] [repository: done] --- Lich: repository has exited. >;trust lnet --- Lich: 'lnet' is now a trusted script. >;lnet help ;chat <message> send a message to your default channel ;,<message> '' ;chat on <channel name> <message> send a message to the given channel ;chat :<channel name> <message> '' ;chat to <name> <message> send a private message ;chat ::<name> <message> '' ;<name>:<message> '' ;who list who's connected ;who <channel> list who's tuned into the given channel ;who <name> tells if a user is connected ;channels list the 15 most populated channels ;channels full list all available channels ;tune <channel name> listen to the given channel, or set as default if already tuned ;untune <channel name> stop listening to the given channel ;locate <name> show someone's current room ;spells <name> show someone's active spells and time remaining ;skills <name> show someone's skills ;info <name> show someone's stats ;health <name> show someone's health, spirit, stamina and injuries ;bounty <name> show someone's current adventurer's guild task ;lnet stats unhelpful information ;lnet timestamps=<on/off> turn on/off all chats having a timestamp ;lnet famwindow=<on/off> turn on/off sending chats to your familiar window ;lnet greeting=<on/off> turn on/off showing a server greeting at logon ;lnet friends list friends ;lnet add friend <name> add a name to your friend list ;lnet del friend <name> delete a name from your friend list ;lnet enemies list enemies ;lnet add enemy <name> add a name to your enemy list ;lnet del enemy <name> delete a name from your enemy list ;lnet allow list your current permissions ;lnet allow <action> <group> set permissions <action> can be one of: locate, spells, skills, info, health, bounty, all <group> can be one of: all, friends, non-enemies, none ;lnet ignore list names currently being ignored ;lnet ignore <name> ignore chats/private chats/data requests from a person ;lnet unignore <name> unignore a person ;lnet password=<password> protect your character name on the server with a password ;lnet password=nil remove password protection ;lnet create [hidden] [private] channel <name> <description> hidden channels don't show up in the channel list private channels ban everyone by default, and the owner (or moderator) must unban anyone he wants to allow in ;lnet delete channel <name> ;lnet ban <character> on <channel> for <time> ;lnet unban <character> on <channel> ;lnet gag <character> on <channel> for <time> ;lnet ungag <character> on <channel> ;lnet mod <character> on <channel> ;lnet unmod <character> on <channel> <time> should be a number followed by one of: seconds, minutes, hours, days, or years (may be abbreviated to one letter) if "for <time>" is omitted, the ban or gag will last until undone with unban or ungag >;lnet --- Lich: lnet active. LichNet welcomes you, Tillmen www.lichproject.org - http://www.topmudsites.com/vote-gemstone.html >;chat Hello world! [Prime]-You: "Hello world!" [Prime]-GSIV:Noob: "Ohai."

LNet can be a great source of help to new users, but its mostly unmoderated nature can also be pretty harsh for new users. Your first time starting the LNet script, you'll be tuned to only one channel depending on which game you're playing (Prime, Platinum, Shattered, or DRPrime). These channels are generally pretty tame. The LNet channel is much more active, and at times is much more offensive.

One thing you may have noticed is that most of the LNet commands don't start with ;lnet. This seems to go against what we learned earlier, since ;chat isn't a built-in Lich command and it doesn't start a script named chat. Even the commands that do start with ";lnet" don't actually start a script, because the lnet script is already running. While the LNet script is running, it makes these commands work. If the LNet script isn't running, you'll see Lich trying to start a script named "chat" (or whatever) and failing to find one.

The LNet script provides more features than just chat. You can use it to locate other players and see their room number. If you use a spellup script like waggle to spell up other people, it will try to use LNet to see what spells the other person currently has and how much time they have left. By default, LNet rejects requests for location, spells, skills, info, health, and curent bounty. If you would like to allow these things, use the ";lnet allow" command.

>;lnet allow locate all [lnet: You are now allowing everyone to locate you.] >;lnet add enemy Jeril [lnet: Jeril was added to your enemy list.] >;lnet allow spells non-enemies [lnet: You are now allowing everyone except your enemies to view your active spells.] >;lnet add friend Tillmen [lnet: Tillmen was added to your friend list.] >;lnet allow skills friends [lnet: You are now allowing only your friends to view your skills.] >;lnet friends [lnet: friends: Tillmen] >;lnet enemies [lnet: enemies: Jeril] >;lnet allow You are allowing everyone to locate you. You are allowing everyone except your enemies to view your active spells. You are allowing only your friends to view your skills. You are allowing no one to view your stats. You are allowing no one to view your health. You are allowing no one to view your bounties.

You don't have to be tuned to any channels to use these features or private chats.

Most people want LNet to be running all the time, and they don't want to have to start it themselves every time they log in. Luckily, there's a script for that. When you log in, Lich will look for a script named 'autostart', and if it exists, Lich will start it. Lich happens to come with one such script whose purpose is to start any scripts you tell it to start.

>;autostart help Usage: ;autostart add <script name> <args> ;autostart add --global <script name> <args> ;autostart remove <script name> ;autostart remove --global <script name> ;autostart list >;autostart add --global lnet --- lnet will now start at login for all characters

If you want a script to start on only one character, just omit the "--global" option.

Another script you'll likely want to autostart is the repository with "download-updates" passed to it.

>;autostart add --global repository download-updates --- repository will now start at login for all characters

Now the repository script will start at login and know we want to download updates, but we're not done yet. We have to tell it what updates we're interested in. It's a good idea to have the repository script update itself, since that's where all the other updates will come from. It's also a good idea to keep the map database up-to-date since the game often changes and can break the map database. For the same reason, data files like spell-list.xml and gameobj-data.xml should be updated. You can also have the repository update the main Lich program and any scripts you like.

>;repository set-updatable repository [repository: the download-updates command will download repository.lic when there's an update] >;repository set-mapdb-updatable [repository: the download-updates command will download the GSIV map database when there's an update] >;repository set-lich-updatable [repository: the download-updates command will download Lich when there's an update] >;repository set-updatable spell-list.xml [repository: the download-updates command will download spell-list.xml when there's an update] >;repository set-updatable gameobj-data.xml [repository: the download-updates command will download gameobj-data.xml when there's an update] >;repository set-updatable alias [repository: the download-updates command will download alias.lic when there's an update] >;repository set-updatable lnet [repository: the download-updates command will download lnet.lic when there's an update] >;repository set-updatable go2.lic [repository: the download-updates command will download go2.lic when there's an update] >;repository set-updatable narost [repository: the download-updates command will download narost.lic when there's an update] >;repository set-updatable infomon [repository: the download-updates command will download infomon.lic when there's an update]

The last script there is infomon, which I haven't talked about yet. The infomon script keeps track of a lot of things about your character such as: spells, stats, skills, banks, and more. The ;magic and ;banks commands won't work without infomon running. Actually, most scripts won't function without infomon running. It really should be part of the main Lich program, and will be eventually. For now, it's a good idea to keep it running and updated.

The other script we haven't talked about is alias. The alias script, as you might except, allows you to create aliases. For instance, instead of typing out ";chat on code " and then typing a message to send to the code channel on LNet, you could create an alias so you only have to type "code " and your message. The alias script must be started before any aliases work, so it's another script that should be started at login.

>;autostart add --global alias --- alias will now start at login for all characters >;alias --- Lich: alias service started >;alias help | Usage: | ;alias add <trigger> = <target> ;alias add --global <trigger> = <target> Creates a new alias. When you send a command that starts with <trigger>, it will be replaced with <target>. If --global is specified, the alias will be active for all characters. \r and \? in the target are treated special. ;alias remove <trigger> ;alias remove --global <trigger> Deletes the given alias ;alias list Lists the currently active aliases Examples: ;alias add zap = ;eq cast(901, "\?") ;alias add --global ;code = ;lnet chat on code ;alias add --global ls = look >;alias add --global code=;chat on code --- Alias saved >code Pie are round. [code]-You: "Pie are round."

And now, on to narost. The narost script pops up a window and shows your current position on map images, if there is one. This script needs to be trusted so it can load the images from your hard drive.

>;trust narost --- Lich: 'narost' is now a trusted script. >;narost --- Lich: narost active.

If there is a map image for your current location, narost should have found it and showed it to you with a circle around the room that you're in. As you move around, the image and circle will follow you. You can look at the title bar of the window to see the room number of the room you're in. If you click on a room on the map, narost will start the go2 script and tell it to go there. You can right-click for some options, such as showing other maps.

You can also pass a search string to narost when you start it, just like go2. While go2 will give you a list of matching rooms, narost will just show the map for the first matching room. This is often good enough to answer the common question "What map is so and so on?"

By now, you should have a pretty good idea of how to find new scripts, download them, figure out what they do, and how they're used. For more help, you can ask questions on LNet or the forum.