////////////////

        /// <summary>
        /// Dumps the outputs to a dump file.
        /// </summary>
        /// <param name="fileName"></param>
        /// <returns></returns>
        public static bool DumpToFile(out string fileName)
        {
            string data;
            IDictionary <string, Func <string> > dumpables = DataDumper.GetDumpables();

            Func <KeyValuePair <string, Func <string> >, string> getKey = kv => {
                try { return(kv.Value()); }
                catch (Exception e) { return("ERROR: " + e.Message); }
            };

            lock (DataDumper.MyLock) {
                data = string.Join("\r\n", dumpables
                                   .ToDictionary(kv => kv.Key, getKey)
                                   .SafeSelect(kv => kv.Key + ":\r\n" + kv.Value)
                                   );
            }

            bool success = DataDumper.DumpToLocalFile(data, out fileName);

            if (success)
            {
                // Allow admins to dump on behalf of server, also
                if (Main.netMode == 1)
                {
                    if (ModHelpersMod.Config.DebugModeDumpAlsoServer || UserHelpers.HasBasicServerPrivilege(Main.LocalPlayer))
                    {
                        DataDumpProtocol.QuickRequest();
                    }
                }
            }

            return(success);
        }
        ////////////////

        /// <summary>
        /// Sets a callback as a data source to output within the dump file with the given label (`name`).
        /// </summary>
        /// <param name="name"></param>
        /// <param name="dump"></param>
        public static void SetDumpSource(string name, Func <string> dump)
        {
            var dumpables = DataDumper.GetDumpables();

            lock (DataDumper.MyLock) {
                dumpables[name] = dump;
            }
        }