'Shuts down the server from inside it.
mode - sets the server restart mode.
\'reload\' - server restarts, no "persistent" scripts
are stopped, at_reload hooks called.
\'reset\' - server restarts, non-persistent scripts stopped,
at_shutdown hooks called but sessions will not
be disconnected.
\'shutdown\' - like reset, but server will not auto-restart.
None - keep currently set flag from flag file.
_reactor_stopping - this is set if server is stopped by a kill
command OR this method was already called
once - in both cases the reactor is
dead/stopping already.'

@defer.inlineCallbacks
def shutdown(self, mode=None, _reactor_stopping=False):

    if (_reactor_stopping and hasattr(self, 'shutdown_complete')):
        defer.returnValue(None)
    mode = self.getset_restart_mode(mode)
    from evennia.objects.models import ObjectDB
    from evennia.server.models import ServerConfig
    from evennia.utils import gametime as _GAMETIME_MODULE
    if (mode == 'reload'):
        ServerConfig.objects.conf('server_restart_mode', 'reload')
        (yield [o.at_server_reload() for o in ObjectDB.get_all_cached_instances()])
        (yield [p.at_server_reload() for p in PlayerDB.get_all_cached_instances()])
        (yield [(s.pause(manual_pause=False), s.at_server_reload()) for s in ScriptDB.get_all_cached_instances() if s.is_active])
        (yield self.sessions.all_sessions_portal_sync())
        self.at_server_reload_stop()
        from evennia.scripts.monitorhandler import MONITOR_HANDLER
        MONITOR_HANDLER.save()
    else:
        if (mode == 'reset'):
            (yield [o.at_server_shutdown() for o in ObjectDB.get_all_cached_instances()])
            (yield [p.at_server_shutdown() for p in PlayerDB.get_all_cached_instances()])
            if self.amp_protocol:
                (yield self.sessions.all_sessions_portal_sync())
        else:
            (yield [_SA(p, 'is_connected', False) for p in PlayerDB.get_all_cached_instances()])
            (yield [o.at_server_shutdown() for o in ObjectDB.get_all_cached_instances()])
            (yield [(p.unpuppet_all(), p.at_server_shutdown()) for p in PlayerDB.get_all_cached_instances()])
            (yield ObjectDB.objects.clear_all_sessids())
        (yield [(s.pause(manual_pause=False), s.at_server_shutdown()) for s in ScriptDB.get_all_cached_instances()])
        ServerConfig.objects.conf('server_restart_mode', 'reset')
        self.at_server_cold_stop()
    from evennia.scripts.tickerhandler import TICKER_HANDLER
    TICKER_HANDLER.save()
    self.at_server_stop()
    if ((os.name == 'nt') and os.path.exists(SERVER_PIDFILE)):
        os.remove(SERVER_PIDFILE)
    if hasattr(self, 'web_root'):
        (yield self.web_root.empty_threadpool())
    if (not _reactor_stopping):
        self.shutdown_complete = True
        reactor.callLater(1, reactor.stop)
    ServerConfig.objects.conf('runtime', _GAMETIME_MODULE.runtime())
