'We make sure to store the most important object defaults here, so
we can catch if they change and update them on-objects automatically.
This allows for changing default cmdset locations and default
typeclasses in the settings file and have them auto-update all
already existing objects.'

def update_defaults(self):

    settings_names = ('CMDSET_CHARACTER', 'CMDSET_PLAYER', 'BASE_PLAYER_TYPECLASS', 'BASE_OBJECT_TYPECLASS', 'BASE_CHARACTER_TYPECLASS', 'BASE_ROOM_TYPECLASS', 'BASE_EXIT_TYPECLASS', 'BASE_SCRIPT_TYPECLASS', 'BASE_CHANNEL_TYPECLASS')
    settings_compare = zip([ServerConfig.objects.conf(name) for name in settings_names], [settings.__getattr__(name) for name in settings_names])
    mismatches = [i for (i, tup) in enumerate(settings_compare) if (tup[0] and tup[1] and (tup[0] != tup[1]))]
    if len(mismatches):
        from evennia.objects.models import ObjectDB
        from evennia.comms.models import ChannelDB
        for (i, prev, curr) in ((i, tup[0], tup[1]) for (i, tup) in enumerate(settings_compare) if (i in mismatches)):
            print(("    %s:\n    '%s'    changed    to    '%s'.    Updating    unchanged    entries    in    database    ..." % (settings_names[i], prev, curr)))
            if (i == 0):
                ObjectDB.objects.filter(db_cmdset_storage__exact=prev).update(db_cmdset_storage=curr)
            if (i == 1):
                PlayerDB.objects.filter(db_cmdset_storage__exact=prev).update(db_cmdset_storage=curr)
            if (i == 2):
                PlayerDB.objects.filter(db_typeclass_path__exact=prev).update(db_typeclass_path=curr)
            if (i in (3, 4, 5, 6)):
                ObjectDB.objects.filter(db_typeclass_path__exact=prev).update(db_typeclass_path=curr)
            if (i == 7):
                ScriptDB.objects.filter(db_typeclass_path__exact=prev).update(db_typeclass_path=curr)
            if (i == 8):
                ChannelDB.objects.filter(db_typeclass_path__exact=prev).update(db_typeclass_path=curr)
            ServerConfig.objects.conf(settings_names[i], curr)
            ObjectDB.flush_instance_cache()
            PlayerDB.flush_instance_cache()
            ScriptDB.flush_instance_cache()
            ChannelDB.flush_instance_cache()
    [ServerConfig.objects.conf(settings_names[i], tup[1]) for (i, tup) in enumerate(settings_compare) if (not tup[0])]
