The builders for Thain have, in recent history, consolidated many of the city interiors into one area (for each city). It's worked well for us, and certainly makes browsing the area list in the toolset easier.
For merchants, we have a script set to OnOpenStore that destroys duplicate items; this keeps the inventory somewhat tidy(er) but still allows other people to buy things other players have sold. We also have one particular shop that saves part of it's inventory over restarts since it's pretty much just a dump for loot and doesn't sell anything by default.
Here is the code (DISCLAIMER: I don't know if this is optimal. It's probably not! I didn't do it, I swear!)
// file name: merch_trim_inv
// Trim duplicate items from the merchant object if over the duplicate threshold
void main()
{
// Bill Jones 20-Jun-2006; Reduced allowable duplicates from 5 to 3
int iNumAllowedDupes = 3;
int iItemCount;
string sItemTag;
object oCurrentItem = GetFirstItemInInventory();
while (oCurrentItem != OBJECT_INVALID)
{
sItemTag = GetTag(oCurrentItem);
iItemCount = GetLocalInt(OBJECT_SELF, "count_"+sItemTag);
if (iItemCount >= iNumAllowedDupes)
{
DestroyObject(oCurrentItem);
}
// Bill Jones 24-Mar-2008; Don't count items with the tag "aly_throwweapons"
else if (sItemTag != "aly_throwweapons")
{
iItemCount++;
SetLocalInt(OBJECT_SELF, "count_"+sItemTag, iItemCount);
}
oCurrentItem = GetNextItemInInventory();
}
// Reset all the counts in preparation for the next store opening
oCurrentItem = GetFirstItemInInventory();
while (oCurrentItem != OBJECT_INVALID)
{
SetLocalInt(OBJECT_SELF, "count_"+GetTag(oCurrentItem), 0);
oCurrentItem = GetNextItemInInventory();
}
}