Just found this thread. I must say, this looks awesome. Reminds me of an ancient game called "Times of Lore", which I loved to play a gazillion years ago.
As for npc's, monsters, items and likewise, it seems you would be very well off with the typical LPMud-based approach. Start with a basic "GameObject" class, which has basic properties (name, weight, etc), subclass it to "Living", and "Item", and subclass further to "Weapon/Armour", "Player/Animal/Monster".
Beginning at "GameObject" you can introduce a set of object-specific properties, with identifiers defined globally in an interface. This is really handy, you can introduce new properties as you go along, and it gives the entire object hierarchy a very seamless feel to it.
// for instance, when someone get poisoned,
// when someone starts casting a spell (assuming spells
// have casting time
// and when casting is finished
Well, I am sure you get the idea. It is only a suggestion of course, but from past experience (I've been developing and administrating LPMud's since the mid 1990's), this is a system that works nicely. It's not the fastest car in the park, but it makes it worthwhile in understandability, and easy maintainance (which is important for such a big-world type of game).
Good luck to you guys.