Removed unused variable
Implemented WIZ_CHANGE_HAIR packet (CHANGE_HAIR procedure's on the forums) & removed deprecated method CSharedMemQueue::GetData(char *).
Fixed a bug with notices/announcements not being formed correctly after the Packet switchover.
Updated CUser::SendNotice() & CUser::CountConcurrentUser().
Hid a horrible signed/unsigned mismatch warning (surely you're better than that, VC++?).
3,000 coins are now required/taken (server-side) for all shouts from players under level 35 (who aren't a GM :p). NOTE: the client handles the error.
Fixed a bug with clan names (they should be single byte lengths).
Player socket IDs are now 2 bytes, so we don't have to keep casting them down from 4 anymore.
Sped up Ebenezer's load time (and saved a bit of memory) by switching from an array of pointers for each map tile to a single array (which means only 1 read call per map [for terrain data] now, as opposed to 1 per tile!). Removed some useless log writes from here, too.
C3DMap is now a friend of CEbenezerDlg (until it can be better organised), so C3DMap::LoadEvent() doesn't need to open a new database connection for each map -- faster! Also removed virtually all of the now useless logging before each load task.
Removed m_bDropRate from _ITEM_TABLE (it's useless!).
SMD files are now loaded only once, each (saving quite a bit of memory on a typical server, and server load time!); generally cleaned up Ebenezer's map code -- AI's still needs doing, but I'll just look into merging them anyway. Note: SMDFile instances still need to be freed on shutdown (eek memory leak!).
Ebenezer's a lot more responsive without AI now that it's not hammering away trying to connect constantly (geez, give it a rest!).
SMDFiles are now reference-based (seems to be the easiest way of making this work with their system as it is).
Loaded table data should be being freed now (need to investigate why it stopped calling the destructor, this was behaving correctly which is why the explicit calls were removed...).
Removed unused maps from C3DMap & added more explicit DeleteAllData() calls (temporarily).
Explicitly closing the game DB connection (shouldn't have to, MFC ordinarily handles this automatically when the destructor's called -- which it isn't right now). Shared memory queues is sped up slightly (no need to keep creating new buffer instances).
Reverted explicit DeleteAllData() calls, it's behaving correctly after all.
getStatTotal() is neater.
These checks are just straight up dumb, but at least there's no magic numbers now (really need to fix all this up though).