You guys waited for long enough, I think. This mod is not finished, but for those of you who want to playtest it here and now - this is for you.
I've been inspired to make this mod by the fascinating Minecraft mod pack called The Mining Dead. Similarly to that mod pack, I didn't make this mod the shoot 'em up, wave after wave deathmatch kind of mod. Instead, I went with a post-apocalyptic survival scenario, where resources are scarce and the world is harsh.
I made this mod as lightweight as possible, having active multiplayer gaming in mind. It won't be heavy on the server and it won't lag the players. And yet, despite its light weight, it's got plenty of interesting features - at least, I hope so.
This is also a mod that is highly customizable - almost every aspect of it can be changed to configure it to your liking and to make your edition unique and different from others.
More information about features is available in the
forum thread.
IMPORTANT POINTS:

I chose to upload the mod early, which means that it might be unpolished in some regards. There may be bugs, including major ones. Please understand this and don't panic if you do encounter one (or a few). Instead, report to me. Try to include how you encountered the bug and how I can reproduce it, if possible.

There is currently no way to trade items between players. This is item #1 on my to-do list.

Player towns are
not finished. The mechanisms are there, but it's not very well tested and integrated yet.

This description is subject to change. As the mod progresses, anything here might be changed or removed.
Important info:

To see your mod rank, type "!kills" into the chat.

To open the inventory, press F2.

To open crafting, press F3.

The valve near the water tank on the test map replenishes your thirst; use it to refill your thirst when at base.

If you plan on running a server, you are encouraged to run it in USGN-only mode; all players that are not logged in will share all data.
Your suggestions are most welcome. To those of you who have already made suggestions and can't see them - there are three possibilities.

The customization tools already allow you to implement your suggestion yourself,

I delayed their implementation until more urgent matters are dealt with,

I forgot.
In any case, remind me
gently if you must - by that I mean don't angrily write me about how much of a bastard I am for not including your suggestion(s).
The script comes with a map I quickly drew up for testing - you might have seen it featured in videos about the mod. It's designed to showcase all the mod features, so to those of you who want to try it out for themselves - feel free to muck around on it. If you are a mapper who wants to create a map for the mod - I welcome your contribution. You can drop me a note and perhaps I'll include it into the official package, along with official support when it comes to NPCs and in-game objects.
Known issues 

All players that are not logged in share stats and items
Temporary solution: enable USGN-only mode
Changelog 
0.7.2

Added a salvaging system - players can attack in a certain region to salvage materials; every X attacks players have a chance of getting certain items

Added a radiation system - the world now has ambient radiation that affects players; the player receives damage and the player's stats are decreased depending on the radiation levels for the player

Chests can now have their contents reset every X seconds

Added a second default monster archetype, uses the headcrab image, has much less health and deals much less damage, drops Irradiated Meat

A menu is displayed when an item is selected, with options to use it, drop it, trade it or put into a chest

Added an !afk chat command that prevents you from losing stats and health while away, away mode is disabled automatically on most actions (move, attack, etc.)

A new test map, hopefully it's better than the original one

Chest creation now takes in a table of arguments

Zombies can no longer walk into a safe zone

Zombies can no longer damage players that are inside safe zones

All customization values are now contained in config.lua

Map-dependant customization (NPCs, beds, safe zones etc.) is now contained in respective map Lua scripts

Zombies now follow one player at a time

Monster drops should now be more reasonable

Fixed a bug where players couldn't open their inventories after sleeping
0.7.1

The owner (and members, if a flag is set) of a town can now invite others to the town (untested)

The owner (and members, if a flag is set) of a town can now edit the town's flags

The owner of a town can now change the town's owner

The owner of a town can now rename the town

Reduced default max zombies to 250

Inventory and crafting can no longer be opened while sleeping

All monsters are removed on round restart

Zombies shouldn't spawn in walls anymore

Major bug with weapons table; expect moderately less errors

Number of zombies on the map should now be properly displayed

NPCs should now be redrawn properly on round restart

Removed some debug messages
0.7.0
Initial release.
Administration commands 
At this stage, admin commands were not my highest priority. Still, there are a few that should make administration easier for you.
!cmd give id iid n - gives n of item iid to player id.
!cmd god id - gives god mode to player id (immunity to all damage, stats are frozen)
!cmd reset id - resets all stats of player id.
Towns 
The following is a description of the chat commands used for the towns module. As stated earlier, the towns system is not very well tested and integrated, so expect bugs and unexpected behaviour.
!towns claim name - claims the plot you're currently standing on. Requires you to be at least a certain rank (Lieutenant by default, 250 zombie kills), as well as to have the required items in your inventory (by default these are 20 silver coins). name is the name of the town you're founding.
!towns build - opens the building menu. Allows you to place buildings in your town. Each building requires certain materials.
!towns change property value - changes the flag property to value. A list of properties and their description can be found in the documentation below. Special cases are "owner", which is the owner of the town, and "name", which is its name.
!towns invite id - invites player id to your town. The player receives a notification, and they must type either "y" or "n" into the chat to accept or to decline the invitation, respectively.
Customization 
There is so much of it that I might not have documented everything there was. Let me know if there's something I missed and I'll add it to the documentation. Many of the documented variables are commented in the files themselves.
This documentation does not explain internal functions, only those that are
designed to be used outside of the core code. Modify and use internal functions at your own risk.
zombies.lua 
zombies.admins - your usual list of administrators.
zombies.mapamount - maximum amount of monsters there can be at any given time on the map
zombies.safezones - safe zones, players in them receive no damage at all
zombies.cover - cover, players in cover receive no damage from solar flares
zombies.maxhunger, zombies.maxthirst, zombies.maxfatigue, zombies.maxhealth - maximum amounts of each stat a player can have
zombies.drops - what different monsters drop and how often
zombies.spawnchances - chances for monsters to spawn each second
zombies.ranks - player ranks (kills, name, suffix)
zombies.statsper* - hunger, thirst and fatigue added every action (action depends on *)
zombies.flashchance, zombies.flashtime, zombies.flashdamage - the chance of a flare happening, a flare's duration and damage
zombies.townprice - the required items to create a player town
zombies.buildingprice - the required items to construct a building
items.lua 
items.defaultlimit - default inventory size
items.starterkit - items that players start with when they first join the server
crafting.lua 
crafting.displayunlearnt - display all recipes in the menu, including those that the player doesn't know
crafting.successchance - default success rate for recipes if there isn't one for a specific recipe
towns.lua 
towns.plots - areas designated as purchasable to build towns in
towns.townrank - the minimum rank required to found a town
Documentation 
There are even more functions than customization values, so again, excuse me and let me know if I forgot something.
zombies.lua 
zombies.addHunger(id,hunger) - add hunger hunger to player id. Specify negative hunger to subtract. Exactly the same for zombies.addThirst(id,thirst), zombies.addFatigue(id,fatigue), zombies.addHealth(id,health).
zombies.damage(id,dmg) - deal dmg damage player id, taking the player's defence value in consideration. If you want to deal raw damage, use zombies.addHealth(id,health) with a negative health value.
zombies.createBuff(buff,name,funcstable) - create a buff (or a debuff). buff is the effect ID, name is its name, funcstable is a table that contains functions that will be executed on certain actions. The actions are ms100(id), second(id), minute(id), dmgrecv(src,id), dmgdeal(id,src), movetile(id,x,y), add(id,buff,duration), remove(id,buff), zombiekill(id,zid), zombiedmg(id,zid,dmg). The key in the table must be one of the names listed, the value must be a function to which the arguments will be passed.
zombies.addBuff(id,buff,[duration]) - add the effect buff to player id for duration seconds or until removed manually.
zombies.removeBuff(id,buff) - remove the effect buff from player id.
zombies.getHunger(id) - get player id's hunger value. Exactly the same for zombies.getThirst(id), zombies.getFatigue(id), zombies.getHealth(id)
zombies.addAction(x,y,func) - tile x|y becomes interactable, and function func will be called when a player presses E while on the tile.
zombies.createBed(x,y,rx,ry,img,rot) - places a bed on pixel coordinates x;y of size rx x ry. img specifies the image of the bed that will be drawn on x;y, and rot specifies the rotation of the bed and image.
crafting.lua 
crafting.createRecipe(results,ingredients,learnable,[successchance]) - creates a crafting recipe. results is a table that contains crafting results in the format {itemid,amount}. ingredients is a table that contains crafting materials in the same format. learnable is a boolean value that defines whether the recipe needs to be learnt before it can be used. successchance is an optional argument that overrides the default success rate of crafting.
crafting.learnRecipe(id,recipe) - unlocks the crafting recipe recipe for player id.
customnpcs.lua 
customnpcs.createNPC(name,x,y,rot,[imgpath]) - creates an NPC. name specifies the NPC name that will be displayed above it, x and y are the coordinates of the NPC in tiles and rot specifies the rotation. imgpath is an optional argument that specifies the path to the image of the NPC. Defaults to "gfx/customnpcs/npc1.png" if not specified.
customnpcs.setAction(npc,action,actionradius) - sets the action for NPC npc. action can be either "trade" or "talk", and actionradius is the maximum distance at which the action will be triggered.
customnpcs.addTrade(npc,givet,taket) - adds a trading option to NPC npc. givet is a table containing what the NPC will give, in the format {itemid,amount}. taket is a table containing what the NPC will take in the same format.
customnpcs.addLine(npc,lid,lname,lines,next) - adds a dialogue option to NPC npc. lid is the ID of the dialogue option, lname is the name of the option that will be displayed to players, lines is a table containing strings that will be printed as the NPC's lines, and next is a table containing the IDs of dialogue options the player can go to from this point in the discussion.
items.lua 
items.addItem(iid,name,description,func,stackable,[stacksize]) - creates an item. iid is the item ID, name is the item name as seen in the inventory, trading and elsewhere, description is the description of the item, func is the function that will be executed when the item is clicked on in the inventory. stackable is a boolean value that determines whether the item can stack, and stacksize is a number that specifies the maximum amount of this item in a stack before a new one begins. If stacksize is not specified, the item can be stacked indefinitely.
items.addToInventory(id,iid,n) - adds n of item iid to player id's inventory. Returns true if the item has been added. Fails and returns false if the player doesn't have enough inventory space to accommodate all n instances of the item.
items.removeItem(id,iid,n) - removes n of item iid from player id's inventory. Returns true if the item has been removed. Fails and returns false if n instances of the item were not found in the player's inventory.
items.clearInventory(id) - clears player id's inventory completely.
monsters.lua 
List of monster properties 
image - monster image (path)
health - monster health (number)
dmg - monster damage (number)
speed - monster speed in pixels per second (number)
hzox - hitzone x offset in pixels, generally should be half the image width (number)
hzoy - hitzone y offset in pixels, generally should be half the image height (number)
behav - monster behaviour ("attack", "flee" and "roam", or combinations - separate with "+")
reactdist - maximum distance to player in pixels at which the monster sees the player (number)
atktime - cooldown period in seconds until the monster can attack again (number)
atkdist - maximum distance to player in pixels at which the monster can attack (number)
dmgfunc - function that gets called when a monster attacks a player. Arguments are: player ID, damage. Generally should be zombies.damage (function)
killfunc - function that gets called when a monster is killed. Arguments are: killer ID. Generally should be zombies.killZombie (function)
minroam - minimum distance in tiles a monster can roam, if the monster's behaviour property has the "roam" flag. (number)
minroam - maximum distance in tiles a monster can roam, if the monster's behaviour property has the "roam" flag. (number)
monsters.createArchetype(id,properties) - creates a monster archetype
id.
properties is a table containing the monster's properties.
monsters.setProperty(id,property,value) - modifies a monster archetype
id by changing property
property to
value.
monsters.spawnMonster(id,x,y,rot,[properties]) - spawns a monster of archetype
id on pixel coordinates
x and
y with initial rotation
rot. If specified,
properties is a table containing monster properties that will override the archetype values for this monster only.
towns.lua 
Town properties 
membersbuild - allow town members to build inside it (boolean)
buildrank - minimum player rank at which a player can build inside a town (number)
memberdestroy - allow town members to destroy buildings (boolean)
membersinvite - allow town members to invite others (boolean)
membersedit - allow town members to edit town flags (boolean)
safezone - make the town a safe zone (boolean)
cover - make the town flare cover (boolean)
towns.createTown(plot,owner,name,properties) - creates a settlement on plot
plot, owned by USGN ID
owner.
name specifies the name of the town as displayed to players who enter it.
towns.setProperty(town,property,value) - change property
property of town
town to
value
Licensed under the Creative Commons Attribution 3.0 Licence