Home Page

About Me


Projects - UOX

A number of years ago, I worked on UOX, the first Ultima Online server emulator just after the source was released to the public. I ended up writing quite a bit of code to add functionality, and packaged my changes together with others to release new versions to the public. I went and found an old changelog, and copied the listings of all the versions I released here:

Jerrith - ars@nwu.edu - 0.67d
  -Rewrite of walking to take a character, not a socket as a parameter.  This
   results in the deletion of npcWalking as it is no longer needed.
  -Rewrite of teleport, to take a character, not a socket as a parameter.  NPCs can be
   teleported now.
  -Addition of the following parameters to char_st: 
                npcWander: 0=no movement, 1=follow target, 2=wander freely, 3=wander in box, 
                                   4=wander in radius
                ftarg1-4 : Serial number of target being followed for mode 1
                fx1, fy1, fz1: Point #1 for wander in box, center point for wander in radius
                fx2, fy2 : Point #2 for wander in box, fx2=radius for wander in radius, fy2 is unused.
                                   fy2 is also used in follow mode, to store range to target.  Basically,
                                   if something is following you, and you walk into a teleporter, it will 
                                   take 1 more step in the direction it last went, hoping it will end up on the
                                   teleporter as well. 
  -Function tileBlock: takes a tile number as a parameter, returns non-zero if it's
   blocking tile.
  -Function staBlock(x, y, z): takes a coordinate, returns non-zero if there is an 
   impassible static in the way.
  -Function calcSocketFromChar: takes a character index( the s, from chars[s] ) and returns 
   socket( the i from chars[currchar[i]] ).  Returns -1 if there's no match. (NPC or offline)
  -Modified mount and unmount horse to preserve NPC wandering data
  -checkBoundingBox and checkBoundingCircle functions
  -ownership and visibility variables added to item_st for upcoming features.
  -Fixes for a few misc bugs.
  -Shoving take 10 stamina

Jerrith - ars@nwu.edu - 0.67f
  -Improvements to stablock.  Still not perfect, cliff avoidance is MUCH better. 
  -Implemented visibility / basic ownership:
    visible: 0=visible to all.  1=visible to owner & GMs, 2=visible to GMs only
  -Added the following to the magic(movable) parameter:
    magic: 3=movable by owner (or someone with allmoveon) only.
  -Fixed bug where you had to shove to change directions when on top of another character.
  -Added Morac's two bug fixes (hey, I'm not perfect) to the published source.
  -Added /setvisible command.  Works just like /setmovable
  -Added item capability to /setowner.  Now works for both NPCs and object.
  -Circle bounded NPCs will pop back to their center locations if they would move in circle 
   wander mode, and are outside of the circle.

Jerrith - ars@nwu.edu - 0.67g
  -Improvements to checkskill.  Now takes two additional parameters, low and high, the 
   skill values at which you will fail 100% of the time, and succeed 100% of the time.
  -Fully functional spellbooks.   Spellbooks will only let spell scrolls be dropped on them.
   There's a special scroll (the one after Water elemental) which will give you book ever spell.
  -Necromantic entries in spell book.  5 spells, S, R, I P, S, E.  (Speak, Raise, Ingest Poison, 
   Summon, EVIL).   They don't do anything yet, but if you get them, you can cast them by clicking
   where their icon would be in the book.  They aren't indexed either, just go to the end of the book.
  -Removal of scroll item types.  Scrolls now cast their spell, if they have the code to do it, based
   on their ID.  
  -Addition of all scrolls to script file (uox3.scp). You'll probably want to use this. :)

Jerrith - ars@nwu.edu - 0.67i
  -Another dramatic speedup to spellbook opening.  (My first went through 140 loops, Cironian's had 70, this has 2)
  -Caching for the stablock function. (Used in NPC movement).  
  -/cachestats - Find out how many hits, misses and access to the cache there have been.
  -First pass at dungeon blackness avoidance.  They won't go in it, but they still walk on the edges.
  -Script fixes (for scrolls) and new NPCs by Gitchigoomi. (verrice2@aol.com)
  -NPC add scripts now let you set NPCWANDER, FX1, FX2, FY1, FY2, FZ1
  -NPC 1 (whoever the orc) changed to wander mode 2 by default.
  -Item spawner added at item type 61.  Item will respawn when it is taken off it's spawn location.  Set morex of
   the spawner to the # of the item from the script file that you want.
  -NPC spawner added at item type 62.  NPC will respawn when killed.  Set morex to the # of the NPC from the 
   script file you want.
  -Fixes for readscript and readwscline by Monte Cristo (no email address)
  -Script fixes (for scrolls) and new NPCs by Gitchigoomi. (verrice2@aol.com)
  -Container Gumps Code by Okaria Dragon. (okdragon@dreamwrld.com)

Jerrith - ars@nwu.edu 0.67l
  -Many fixes to make UOX3 compile on Linux, Watcom, and MSVC++ systems without requiring changes.
  -Bug fixes in deathstuff, and backpack2, to significantly reduce the number of corpse crashes.
  -Fixes in checkmessage
  -Modified version of Zarn's House Icon code - Zarn (zarn@mailcity.com)
    -Uses /hidehs and /showhs commands and bit 0x04 on priv2.
  -/setmorex, /setmorey, /setmorez, and /setmorexyz commands.
  -GNDN fix for getmsg - Crimson Guard (smorey@igate.sprint.com)
  -Various script file fixes for NPCs.

  The following items in 0.67k are implemented in 0.67l:
  -Took history out of uox3.cpp (why have it in 2 places?)
  -/setmorex - To set the morex value of an item.
  -Add "GM" or "Counselor" to name when making someone a GM or Counselor.
  -fixed bug with checkskill (another socket/char screwup :) )

Jerrith - ars@nwu.edu 0.67n
  -Corpse crashes finally totally fixed by Drylock (erwin@andreasen.com)
  -Fixes for dragging scrolls in to spellbookx sitting on the ground in pack_item.
  -Setting fx1 to -1 in NPC scripts results in the NPC using its add location as
   it's center point, for radius based wander mode only.
  -Big update to the cast spell part of getmsg, and the castspell function.
  -Bug fix to checkBook
  -inititem function to initialize items. 
  -Female character now start (randomly) a kilt or a skirt, by Ash (defiant@eisa.net.au)
  -Visible mode 2 was changed earlier by Cironian.  Only GM bodies can see it.
  -Visible mode 3 added, to behave like the old visible mode 2. (checks priv bit 1)
  -Bug fix for Morac's spellbook fix.
  -Added Okaria_Dragon's wisp npc. (okdragon@dreamwrld.com)
  -Fixed a few sound effects for spells.
  -npctalkall function.  Send text to all in range.
  -Added words of power to working spells.

Jerrith - ars@nwu.edu 0.67o
  -Removed spellcasting action from invistarget
  -Changes to summonmonster
  -Blade Spirits spell added, Energy Vortex now targeted.
  -New functions staticeffect, movingeffect, and bolteffect for visual
   special effects.
  -Explosion and Flame Strike by Ash (defiant@eisa.net.au)
  -Makefile for linux by Drylock (erwin@andreasen.com)
  -Lightning Bolt and Magic Arrow spells.
  -Fixes for clock() to get the timer working correctly in Linux again.
  -Script fixes for first circle scrolls & wisps
  -Signs added to script file by Gitchigoomi (verrice2@aol.com)
  -Musicianship skill by El_Barto (elbarto@provide.net)

Jerrith - ars@nwu.edu 0.67s
  -The following 0.67r+ features are present, through taking code from 0.67r+ and 
   applying it to my (almost finished) 0.67s.  I think I got everything important
   except npcs trying another direction if they're blocked.
     - /SBOPEN command
	 - hunger code
	 - initchar function
	 - backpack no longer automatically opening.
	 - npcboundingbox change
  -The following were present in 0.67r+, but not listed or credited:
     - Clock code by TMB
	 - Swordtarget code by Ash 
  -Cleaned the following functions: axetarget, carvetarget, lightningtarget, 
   explosiontarget, flamestriketarget, gatedestruction, unmounthorse,
   bolttarget, ghosttarget, killtarget, removetarget, teletarget and npcMovement
  -Fixed bug in npcwalk where NPCs in wander modes 3 and 4 didn't avoid walls.
  -Fixed bug with opening spellbooks (spellbook, backpack2, send_item) 
   that would make all but your spellbook and gold disappear from your backpack.
  -Fixed bug in pack_item where dropping a spell on a spellbook would result in 
   the opening of a strange container showing you all your spell scrolls.
   (Make sure the code you rewrite works, Morac! ;-) )
  -Peacemaking skill (skilluse and peacemaking)
  -Added functions for calcCharFromSer and calcSerFromChar (both taking an int as
   a parameter.)
  -Provocation and Enticement skills (skilluse, multitarget, provocationtarget1 & 2,
   enticementtarget1 & 2).
  -Fixed bug in that attacker stored the index representing an attacker, not the
   serial number. (A couple functions.  Just search for attacker.)
  -Fixed deathstuff so that any NPCs attacking something that dies stop attacking.
  -Added /heal command to fully heal targeted character.
  -Added/Changed Heal and Greater Heal spells, to heal appropriate amounts of damage.
  -Added Harm spell.
  -spellfail function by El_BaRtO (elbarto@provide.net)
  -changes to castspell to indicate if you are casting via spellbook, scroll, or wand.
  -Added skill checks to castspell.  2 circles easier, if from scroll.  
  -Fixed bug in 0.67r+'s summonmonster code. (Didn't set npc property). 
  -Wands are available.  Set the type of the item to 15, set the morex to the circle 
   of the spell you want it to cast (1-8, 9 for necro), and set the morey to the 
   spell within the circle (1-8).  Set the morez to the number of charges on the 
   wand object.
  -Removed double action in resurrect.
  -Items of type 16 are resurrection objects.  If you are a ghost, doubleclick one to
   resurrect.  Based on code from Okaria Dragon (okdragon@dreamwrld.com)
  -MOREX, MOREY, and MOREZ cam now be set in additem scripts.  This means you can
   create wands, recall runes, spawners and other items from the /add menu now.
   I've done some wands as examples. :)

Jerrith - ars@nwu.edu 0.67t
  -Fixed bug in deathstuff regarding deleting of corpses that don't exist.
  -Fixed bug that prevented containers from being placed on corpses. (deathstuff)
  -Note, to clean up world files that are buggy because of this bug, you'll
	 need to kill each character who has ever died.  This should also hopefully 
	 fix the problem where a player had a full spellbook, but couldn't cast any 
	 spells from it.  (You can also just delete characters, and make everyone recreate.)
  -Fixed bug in doubleclick regarding sword targeting.
  -Added "Removing item" message to removetarget.
  -Added updateskill function, to send skill changes to the client. (allsettarget,
  -Change to spellfail visual effect, to make it more OSI-like in speed and duration.
  -Fixed bug regarding range for walking, and addition of items at the edge of range.
  The next 3 at Morac's suggestion:
  -Change to provocation2target to stop suicidal NPCs.
  -Change to peacemaking to make it affect players as well.
  -Change to getmsg regarding spellcasting, so it finds the spellbook.
  -Changed send_item function.  Fixing bugs and adding features.
  -Added dir variable to objects, for rotation and light source selection.  Only
   works with light sources right now.
  -/setdir command works on objects and players.
  -Improvement for walking function.
  -Added support for respawn delay.  Set morey to the minimum # of minutes you want
   the respawn to wait, and set morez to the maximum # of minutes. 
  -Widened the z range of object teleporters.  Should work with more items now.

Jerrith - ars@nwu.edu 0.67v
  -Swordtarget fix by Ash. (defiant@eisa.net.au)
  -Change to senditem to let you /setdir any object, mainly other lights.
  -Added priv to item_st.  Bit 0=object decay.  Bit 1=newbie equipment.
   Bit 2=dispellable
  -Specify DECAY or NEWBIE on an item to give it that property in the SCP file.
  -Spawned items can now have item direction set.
  -Note, old spellbooks are not marked NEWBIE by default.  You'll have to set 
   them manually, with /setpriv 2, followed by clicking on the object.
  -You can now specify the str, dex, and int of npcs by using any of the following
   keywords in the script file:  STR, DEX, INT, STRENGTH, DEXTERITY, INTELLIGENCE
  -Fixed a bug with the reactive armor spell scroll.  Now works correctly.
  -New priv2 bit used on chars (priv2&0x10), for spellcasting without using mana.
  -New priv2 bit used on chars (priv2&0x20), for dispellable.  
  -New priv2 bit used on chars (priv2&0x40), for magic reflection.  
  -impaction function for spellcasting action.
  -Removed incorrect animations from recall and mark.
  -Fixed bug in unmounthorse.
  -Added spells: Magic Reflection, dispell, fire field, wall of stone, para field,
   energy field, dispel field, paralyze, mind blast, and poison field. (some visual
   and sound effects not complete on the non-field spells).  (No damage)

Jerrith - ars@nwu.edu 0.67w
  -Change for fishing sound effect by Ash. (defiant@eisa.net.au)
  -Fixed light types for field spells
  -Added DISPELLABLE parameter for items in the script file.
  -Fix for incorrect backpack sound by Morac (mkraft@writeme.com)
  -Added temporary effects support.
  -Added temporary paralyze effect.
  -Added resendweathertime, and code to checkauto to make weather repeat, not stop.
   Changed command, scriptcommand, and weather as part of this.
  -Updated fire field sound effect.
  -Fix for blood decay by Morac (mkraft@writeme.com)
  -/darklight, /brightlight, /dungeonlight, sets the standard levels for these 
   places/times.  Can range from 0x00 to 0x1B on the first two, 0x00 to 0x1F on
   the /dungeonlight.
  -/secondsperuominute.  Set how fast time passes.  Default is 5.
  -Using /light disables day/night lighting, and sets a fixed level.  Type
   /light -1 to change back to day/night lighting.
  -The time system now also keeps track of the day, and two moons.
  -The two moons affect the lighting level (darkening it by 2, if both are empty).
  -The night & day system now smoothly transitions between the set light levels.
  -If you are hit while paralyzed, you are freed.
  -Dread Lord title fix by Morac (mkraft@writeme.com)
  -Added spells: Clumsy, Feeblemind, Weaken, Agility, Cunning, and Strength.
  -System Broadcast from console snippet by Maytrix(mshulman@ohc.com)
  -Fixed bug in fielddir function.
  -Object limit raised to 8192, by popular demand.

Jerrith - ars@nwu.edu 0.67x
  -Included uox3d.exe, a version of the executable built in debug mode.  If you
   experience server crashes, try this version.  Let me know if it helps.
  -0.67w+ fix for not seeing other people's pack's update when items move in them
   removed due to the 100's of other bugs it caused.
  -More fixes by Morac to: wearitem, command, npctalkall, npcemoteall, talking
   mounthorse, getmsg, and provocationtarget2.  (mkraft@writeme.com)
  -statwindow function changed, to take destination socket, and player whose status
   to send as parameters
  -checktempeffects and tempeffect rewritten to take advantage of new statwindow
  -Shortened magic reflection visual effect.
  -checkmagicreflect function, takes off magic reflect and returns 1 if it was present.
  -npcattacktarget function, called when an attack spell is cast.
  -Added Pug's change to summoned monsters, to give them combat power (jcpirate@bsc.net)
  -Added dispelable wall spawner and wall in scp, items 2001 and 2002 by 
  -Added checkresist, and magicdamage functions.
  -Added magic resistance checks to all spells where appropriate.
  -Added magic reflection checks to all spells where appropriate.
  -Added damage to all spells, where appropriate. (Poison field has no effect)
  -Added field spell effects
  -Bug fixes for resurrecttarget.
  -Added npcresurrecttarget function.
  -Added npcaitype parameter to char_st:
    0x01 = healer (resurrects dead players within range) 
	0x02 = evil monster (attacks all non-evil monsters & all players)
	0x04 = guard (attacks all evil monsters)
	Note: you can combine these...  Make a healer/guard, for instance.
    Note 2: They won't attack invulnerable players.
  -Added /setnpcai function.
  -Added basic NPC AI.  Types listed above.
  -Made decay take less processor time.
  -NPC AI can be set in the script file.  The female guard is set as a guard, 
   the orc is set as an evil monster, and the basic female is set as a healer
   in the included script file.
  -Current list of working spells, by circle: (41 total out of UO's 64)
   1: Clumsy, Create Food, Feeblemind, Heal, Magic Arrow, Night Sight, Weaken
   2: Agility, Cunning, Harm, Strength
   3: Fireball, Teleport, Wall of Stone
   4: Fire Field, Greater Heal, Lightning, Recall
   5: Blade Spirits, Dispel Field, Magic Reflect, Mind Blast, Paralyze, Poison Field
   6: Dispel, Energy Bolt, Explosion, Invisiblity, Mark, Paralyze Field, Reveal
   7: Energy Field, Flamestrike, Gate Travel
   8: Energy Vortex, Resurrect, Summon Air Ele, Summon Daemon, Summon Earth Ele,
      Summon Fire Ele, Summon Water Ele

Jerrith - ars@nwu.edu 0.67x+ (somehow lost from 0.67y)
  -Rewrote NPC AI attack functions so they would attack the closest target, not
   the last valid target in the character array.
  -Rewrote subtract mana function to work correctly, and update status window.
  -Really did: Added Pug's change to summoned monsters, to give them combat power (jcpirate@bsc.net)
  -Bug fix for NPCs gettting incorrect fx1, fy1, and fz1 values from script.

Jerrith - ars@nwu.edu 0.67.026 (0.67z)
  -Added EOF error checking to readstring().
  -Integrated banker code written by Ashran. (amir@tirol.com)
  -Fixed another flaw in fz1 readin from script file on NPCs.
  -Increased door range to 2.
  -Increased key range to 2.
  -Increased horse range to 2.
  -Added death animations with much help from Beosil. (unlisted)
  -Fixed death bug with resurrection robe.
  -Added fade to black, and res choices. (Note, you must choose ghost at this time.)
  -Type 17 = full mortar.
  -Started to integrate alchemy code written by Ashran (amir@tirol.com)
   (does everything but make the finished potion at the moment.)
  -/movetobag and /dupe by Ashran.
  -NPC spawn amount, set the amount on a NPC spawner, and it will spawn up to 
   that many of the NPC in morex. (100 orcs in LB's courtyard is fun.:) )
  -Note the itemmenus added to the script file.  These are required for alchemy to work.

Jerrith - ars@nwu.edu 0.67.028
  -Removed most of Tal Strake's 0.67.027 code as it was redundant.  Modified
   current code to have its added features.
  -Error checking for functions called from multitarget that require an x-y location.
  -/newz now works on characters as well.
  -/makegm and /makecns only give their titles once (no more "GM GM GM Blah")
  -Changed multitarget to move xy checking to appropriate subfunctions.  Fixes
   problems with functions that target objects or characters that aren't at XY
  -tempeffect2, takes an player and an object instead of 2 players.
  -changes to most alchemy functions to track the mortar.
  -SAYCOLOR and EMOTECOLOR properties now available for NPCs in scripts.
  -Bug fix for pack updating by Morac. (mkraft@writeme.com)
  -Alchemy now produces potions, type 19.  Potions have three properties, 
   morex=skill of maker(0 to 1000), more1=potion type, more2=potion subtype.
   potion type is like healing, or strength.  subtype is like greater, or 
   lesser, or deadly.
  -Included the script team's 0.090
  -Nice new item id code.  The better your skill, the more you learn.
  -Added a check to hopefully prevent some spawning problems in respawn().
  -Added very basic highlighting for combat.  Bankers, Guards, and Healers 
   should appear blue.  Evil monsters should appear red. (May not always work yet)

Jerrith - ars@nwu.edu 0.67.030
  -Shortened Krozy's 0.67.029 update listing.  This file is not the place for
   script examples, it's already long enough.
  -Fixed dungeon lighting bug.
  -Potion info is now stored in morex, morey, and morez on the potion.
  -Wrote function impowncreate, replaces the owncreate and wornitem messages with
   one more efficient owncreate, needed for shopkeepers.
  -Rewrite of read2 and readscript, and changes to str2num to (hopefully) prevent
   script crashes.
  -Changed crystal ball code to work on objects set to type 18 instead of just
   crystal ball objects.  Changed some messages to be more generic as a result.
  -Added functionality to GOLD tag.  If you specify one number, it works the same
   as before.  Specify two numbers, and you are saying the min amount, and the 
   max amount.  (GOLD 150 200) would generate between 150 and 200 gold.
  -You no longer need to specify RANDOM or RANDOMNPC to get the random name or
   random npc effect, just add appropriate NAMELIST or NPCLIST tag.
  -NPC declarations can now be recursive.  The simple example is, setup a random
   NPC. After the NPCLIST tag, put in the normal things you want, overriding the
   random npc's values.  This can be used to do say, a random npc, and the same
   random npc who always carries 2000 gold, in addition.
  -deathstuff and resurrection handling of items rewritten to prevent having
   multiple layer 0 objects on a character.
  -Some cleanup on the above mentioned function areas.
  -Beginnings of code for recursive items.
Missing from original 0.67.030 update file, but present:
  -BACKPACK tag for NPCs in scripts.  Give the NPC a BACKPACK for his loot and gold.
  -PACKITEM tag for NPCS in scripts.  If the item isn't something that is being
   equipped (weapon, armor, clothing), create it with PACKITEM instead of ITEM.

Jerrith - ars@nwu.edu 0.67.032
  -Added Zarn's improved code for multitarget and checkkey using switches to 
   increase speed.  (zarn@mailcity.com)
  -Items created in packs by using the PACKITEM tag will now have proper random
   xy positions in packs.
  -BACKPACK tracking in monster spawning has improved, no duplicate packs.
  -Gold spawned with the GOLD tag will now decay.
  -/GMOPEN - open the backpack of the character you click on.  Note, if the 
   character has other containers on him at different layers, you can specify the
   layer as a parameter for this command and open that container instead.
  -/TILEDATA command is always available, instead of just in releases compiled 
  -/MANA command by Krozy.  Click on the character to restore all mana to.
  -/STAMINA command by Krozy.  Click on the character to refresh.
  -Added value to item_st.
  -/makeshop command to add shopkeeper buy containers to a NPC.
  -Quick shop test/demo instructions.  Make a jar of honey (0x09EC), Make a NPC, 
   use /makeshop on the NPC, use /gmopen 1A on the NPC.  Put the jar of honey in
   the container that opens.  Close the container, use the command /testtarget, 
   and click on the NPC.

Jerrith - ars@nwu.edu 0.67.034
  -Changed the GM page functions to use getclock().
  -Reformatted new code written by Ashran.
  -Replaced _strtime function with a set of calls that are compatible on both 
   Windows and Linux platforms.  Written by Drylock (erwin@andreasen.com)
  -You can now BUY from NPC shopkeepers! :) :) :)
  -/setshoprestockrate.  Number of minutes between shop restocks. (default 5)
  -/restockall.  Restock all shops to max instantly.
  -/restock.  Do a normal restock (recover roughly 1/2 of all restock items sold).
  -/setrestock.  Set the number of restocks to be added to the current amount, over
  -/setvalue.  Set the price an object can be bought at.
  -/buy command.  Open the buy window of a NPC shopkeeper.
  -Items put in the container opened by /gmopen 1a on a npc shopkeeper will 
   automatically restock over time.  Items put in the container opened by
   /gmopen 1b will never restock.
  -New script tags for NPCs:
   -SHOPKEEPER - Give them the containers they need to be a shopkeeper.
   -RSHOPITEM #- A shop item that will respawn. (fill in # like for ITEM or PACKITEM)
   -SHOPITEM #- A shop item that will not respawn.
  -New script tags for Items:
   -VALUE - Set the price/value of an item.
   -RESTOCK - Set the number of restocks this starts with.  (Basically, you could 
    setup a shop to start with 10 of something, and 10 restocks, and it would 
	gradually work up to having 20 of the item in stock, but wouldn't instantly.)
  -Object teleporter collision detection fix by Krozy. (krozy@axiomstudios.com)
  -New sendbpitem code by Morac (mkraft@writeme.com)
  -You can say any of the following words to get a shopkeeper's attention: vendor,
   shopkeeper, npc.  Include "buy" in the same line of text, and he will open 
   his shop window.  (Just say "vendor buy" or "npc buy", etc.)
  -/who command to list all connected users by Maytrix (maytrix@uox3.com)
  -/gms command to list all connected GMs and counselors 

Jerrith - ars@nwu.edu 0.67.035
  -Fixed bug in shops where item names didn't match up with the rest of the item.
  -Fixed bug in shops where buying more than one of a non-stackable object gave 
   you one of the object, sorta stacked.
  -Fixed bug where no matter what you said to a vendor, he would interpret it as
   a buy request.
  -Fixed bug where shopkeepers would have their inventory on their corpses.
  -Fixed bug regarding value and restock being read from scripts.
  -Fixed bug where you'd crash if you killed the shopkeeper you were buying from.
  -Fixed bug regarding putting items on a shopkeeper from a script.
  -Fixed bug in that you could /setshoprestockrate without value.
  -Fixed bug regarding not saving script position with LOOT tag in scripts.
  -Fixed bug preventing multiple LOOT tags on one script.
  -Added handling message 0x69 from the client, sent when the client changes 
   text or emote colors.

Jerrith - ars@nwu.edu 0.67.036
  -Calculated new gold key for client!  You must use the new UO client 
   (version 1.25.34) to connect to UOX.
  -Telltime fixes by Krozy. (krozy@axiomstudios.com)
  -Some server freeze up fixes in height/z positioning functions.
  -Fixed restock tag for scripts.
  -Removed buytest and testtarget, as they aren't needed and can only cause
   crashes... :)
  -Banks are now stored at layer 0x1D on each player.  No more bank boxes on 
   the ground.  By Morac.  (mkraft@writeme.com)
  -Items dropped into pack are now placed at random xy locations, instead of 
   the same spot each time.  By Morac.  (mkraft@writeme.com)

Jerrith - ars@nwu.edu 0.67.037
  -Turned off #define DEBUG.  No more console trace messages.
  -Changed type in /istats to display in decimal, not hex.
  -Added missing doors to dooruse function.  (Inward opening doors for the 
   currently working doors, and all the secret doors.)
  -Changed fireball spell effect sound.
  -Bank fix by Morac.
  -Reagent use code based on code by Krozy
  -Use priv2 bit 0x80 to specify spellcasting without reagents.
  -Non-GMs can now put spells in the spellbooks while the spellbook is in their
   main backpack in addition to when it is in their hands.
  -Doors are now updated on all client screens.
  -Added automatic door closing for all doors.
  -Fixed gold total in buy window
  -Fixed starting lighting level being wrong.
  -Fixed recall rune naming.
  -Added npcwander and npcai to /cstats
  -Added priv to /istats
  -Flamestrike damage fixed.  No longer an insta-death spell. :)
  -Monsters now make appropriate sound effects in combat and on death.  Code
   by El_Barto (elbarto@provide.net)

Jerrith - ars@nwu.edu 0.67.038
  -Added selling to NPC shopkeepers.  Use vendor sell, instead of vendor buy, etc,
   or the /sell command to use one.  Items in the container at /gmopen 1C are the
   items the vendor will consider buying.  He will offer the price the item in 
   the 1C container has as its value.
   -Note: Only items in your main pack will be checked to see if the vendor will
    buy them, and only the first 75 he will consider buying will be displayed.
  -Added SELLITEM tag for scripts.  NPCs will put this item in their 1C sell 
   containers.  Note, the value of the object is automatically divided by two.
   (So if you put the same item in the buy and sell bags, the npc will by 
   default offer to pay half price to buy it back.)
  -Added VALUE tag to NPCs.  This tag lets you change the value of the last
   item added to the NPC with PACKITEM, ITEM, SELLITEM, etc.
  -Fixed bug with scrolls in doubleclick.

Jerrith - ars@nwu.edu 0.67.039
  -Added more text about readstring EOF stuff.
  -Added more text for heartbeat and broadcast messages
  -Removed line of debugging code from selling items. (Noticed by Morac)
  -Fixed items dropped on players going to bank boxes instead of backpacks, 
   by Morac. (mkraft@writeme.com)
  -Field effects should no longer hit logged out players.
  -Fix for stackable items being dragged into packs by Morac(mkraft@writeme.com)
  -Fixed bug where you couldn't buy if you had the exact amount of gold that
   was needed.  (Noticed by Krozy)
  -/midi # # command.  Plays the midi file specified by the two numbers on your
   system.  (from 0 0 to about 0 50, I think...)
  -/tradetest.  Test of bringing up the trade system.  Doesn't work yet, be sure
   to close it before walking away from the NPC you opened it on. :)
  -Monster NPCs should no longer attack logged out players. 
  -Added Krozy's improved code for corpses.
  -Fixed alchemy bug where canceling would display the not enough reagents message.
   (Noticed by Krozy)
  -Doing /cstats will automatically open the status window for the character.
  -added Basic potion use.  
  -/tradetest and /gumpopen testing commands....
  -calcValue function designed to handle price/value modifiers for objects.  
   Basically, any object should be assigned it's value as if it were normal, 
   nonmagical, and the price change should be calculated in calcValue.

Jerrith - ars@nwu.edu 0.67.042
  -Added 0.67.041 information to update file.
  -Removed notes on secure trading from goldkey.h (Oops!) :)
  -New UOX3 file, regions.scp.  Use this combination script/ini file to specify in game
   regions, and their properties.  See sample included file.  Note, in this release, 
   regional weather is not yet implemented, and guards are not summoned in guarded 
   areas...   Those features are coming soon. :)
  -Sample regions.scp file provided by Anthracks. (fred1117@tiac.net)
  -Dropping an item on a NPC no longer brings up the secure trading window.
  -Removed Maytrix's 0.67.041 combat code changes.  Code is both incorrect, as 
   not all weapons use swordsmanship, and tactics does not add a damage bonus, and
   also buggy, as it adds a character's index to it's chance of hitting. (Basically, the
   200th monster in the game, regardless of it's dex, would hit 100% of the time.)
  -Removed Maytrix's 0.67.041 deathstuff fix by Krozy.  Krozy and I had talked and agreed
   the fix he posted would not actually work correctly all the time.
  -New deathstuff fix to cut down on lag caused by deaths, written by myself and Krozy.
  -Removed Maytrix's 0.67.041 skill and stat increase changes.  Again, bugs and incorrectly
   implemented features.  Stats should not go down when a skill fails, no advancement curve
   present at all from 50.0 skill to 100.0 skill, current hp, mana, and stamina can rise
   above maximum, skill and stats increase delay timers are not present in UO and a bad idea
   as well.
  -Added bug fix to checkskill function so that it will correctly update the client's 
   display of skills when a skill under 30.0 increases on a failed attempt of use.
  -Fixed bug in skill delay not being initialized for characters.  Could prevent a 
   character from ever using skills.

Jerrith - ars@nwu.edu 0.67.043
  -Bug fix to fix region display on startup.
  -Combat now checks Tactics for a hit 50% of the time, and Swordsmanship 50% of 
   the time (basically what it does in UO for sword weapons...)  Skill check 
   difficulty varies based on opponents tactics score.  Two GM tactics people
   would hit each other roughly every 2 out of 3 swings.
  -NPC skills can now be set in the script file.  SKILL # AMOUNT.  So for say,
   tactics, SKILL 27 1000 for 100.0 tactics.  uox3.h has a list of the skills and
   their numbers.
  -Blacksmithing changed to subtract appropriate amounts of ingots.  Set with 
   INGOTS in blacksmithing script file.
  -Skill needed to smith an item now set in the script with MINSKILL MAXSKILL, 
   the skill you will always fail at, and the skill you should always succeed at.
  -Updated uox3.bss to use new parameters.
  -Summoned monsters are weaker, but now have tactics, swordsmanship, and 
   magic resistance skill scores.
  -Fixed bug causing corpse update problem on the death of monsters.
  -/kick command works again.
  -Added all shovels, pickaxes, and smithing tools to doubleclick, written by
  -Added new UOX file, skills.scp.  Use this to specify skill and stat advancement
   curves.  Values after SKILLPOINT are: #1 base skill this curve point takes effect
   at, #2 skill gain for a success, #3, skill gain for a failure.  failure value
   is not use for stat advancement.
  -Default skills.scp by Anthracks.
  -New checkskill function and subfunctions to handle skill advancement.