/// <summary>
        /// Creates the world account if needed and sets it.
        /// </summary>
        public async Task EnsureWorldAccountExistsAsync()
        {
            //World account matches the current world, ignore.
            if (SEconomyPlugin.WorldAccount != null && SEconomyPlugin.WorldAccount.WorldID == Terraria.Main.worldID)
            {
                return;
            }

            if (Terraria.Main.worldID > 0)
            {
                int bankAccountK = 0;
                DatabaseObjects.BankAccount worldAccount = await(from i in AsyncConnection.Table <DatabaseObjects.BankAccount>()
                                                                 where (i.Flags & DatabaseObjects.BankAccountFlags.SystemAccount) == DatabaseObjects.BankAccountFlags.SystemAccount &&
                                                                 (i.Flags & DatabaseObjects.BankAccountFlags.PluginAccount) == 0 &&
                                                                 i.WorldID == Terraria.Main.worldID
                                                                 select i).FirstOrDefaultAsync();

                if (worldAccount == null)
                {
                    //world account does not exist for this world ID, create one
                    worldAccount = new DatabaseObjects.BankAccount();
                    worldAccount.UserAccountName = "SYSTEM";
                    worldAccount.WorldID         = Terraria.Main.worldID;
                    worldAccount.Description     = "World account for world " + Terraria.Main.worldName;
                    //This account is always enabled, locked to the world it's in and a system account (ie. can run into deficit) but not a plugin account
                    worldAccount.Flags = DatabaseObjects.BankAccountFlags.Enabled | DatabaseObjects.BankAccountFlags.LockedToWorld | DatabaseObjects.BankAccountFlags.SystemAccount;

                    bankAccountK = await AsyncConnection.InsertAsync(worldAccount);

                    worldAccount.BankAccountK = bankAccountK;
                }

                if (worldAccount != null && worldAccount.BankAccountK > 0)
                {
                    //Is this account listed as enabled?
                    bool accountEnabled = (worldAccount.Flags & DatabaseObjects.BankAccountFlags.Enabled) == DatabaseObjects.BankAccountFlags.Enabled;

                    if (!accountEnabled)
                    {
                        TShockAPI.Log.ConsoleError("The world account for world " + Terraria.Main.worldName + " is disabled.  Currency will not work for this game.");
                    }
                    else
                    {
                        SEconomyPlugin.WorldAccount = new Economy.BankAccount(worldAccount);
                    }
                }
                else
                {
                    Log.ConsoleError("There was an error loading the bank account for this world.  Currency will not work for this game.");
                }



                /*
                 * See how much easier this shit is?
                 *
                 *
                 * return AsyncConnection.Table<DatabaseObjects.BankAccount>().Where(i => (i.Flags & DatabaseObjects.BankAccountFlags.SystemAccount) == DatabaseObjects.BankAccountFlags.SystemAccount
                 *      && (i.Flags & DatabaseObjects.BankAccountFlags.PluginAccount) == 0
                 *      && i.WorldID == Terraria.Main.worldID).FirstOrDefaultAsync().ContinueWith((worldAccountResult) => {
                 *
                 *  if (worldAccountResult.Result == null) {
                 *      //world account does not exist for this world ID, create one
                 *      DatabaseObjects.BankAccount worldAccount = new DatabaseObjects.BankAccount();
                 *      worldAccount.UserAccountName = "SYSTEM";
                 *      worldAccount.WorldID = Terraria.Main.worldID;
                 *      worldAccount.Description = "World account for world " + Terraria.Main.worldName;
                 *
                 *      //This account is always enabled, locked to the world it's in and a system account (ie. can run into deficit) but not a plugin account
                 *      worldAccount.Flags = DatabaseObjects.BankAccountFlags.Enabled | DatabaseObjects.BankAccountFlags.LockedToWorld | DatabaseObjects.BankAccountFlags.SystemAccount;
                 *
                 *      AsyncConnection.InsertAsync(worldAccount).ContinueWith((newPrimaryKey) => {
                 *          int bankAccountK = newPrimaryKey.Result;
                 *
                 *          if (bankAccountK > 0) {
                 *
                 *              //Retrieve the new world account from the database
                 *              AsyncConnection.Table<DatabaseObjects.BankAccount>().Where(i => i.BankAccountK == bankAccountK).FirstOrDefaultAsync().ContinueWith((newWorldAccountResult) => {
                 *                  if (newWorldAccountResult.Result != null) {
                 *
                 *                      //override world account inserter with the new one.
                 *                      worldAccount = newWorldAccountResult.Result;
                 *
                 *                      //Is this account listed as enabled?
                 *                      bool accountEnabled = (worldAccount.Flags & DatabaseObjects.BankAccountFlags.Enabled) == DatabaseObjects.BankAccountFlags.Enabled;
                 *
                 *                      if (!accountEnabled) {
                 *                          TShockAPI.Log.ConsoleError("The world account for world " + Terraria.Main.worldName + " is disabled.  Currency will not work for this game.");
                 *                      }
                 *
                 *                      //Push it back to the main instance.
                 *                      SEconomyPlugin.WorldAccount = new Economy.BankAccount(worldAccount);
                 *                  }
                 *              });
                 *
                 *          } else {
                 *              Log.ConsoleError(string.Format("SEconomy: error: create world account for {0} failed.", Terraria.Main.worldName));
                 *          }
                 *      });
                 *
                 *  } else {
                 *      DatabaseObjects.BankAccount worldAccount = worldAccountResult.Result;
                 *
                 *      //Is this account listed as enabled?
                 *      bool accountEnabled = (worldAccount.Flags & DatabaseObjects.BankAccountFlags.Enabled) == DatabaseObjects.BankAccountFlags.Enabled;
                 *
                 *      if (!accountEnabled) {
                 *          TShockAPI.Log.ConsoleError("The world account for world " + Terraria.Main.worldName + " is disabled.  Currency will not work for this game.");
                 *      }
                 *
                 *      //Assign the world account to the running world.
                 *      SEconomyPlugin.WorldAccount = new Economy.BankAccount(worldAccount);
                 *  }
                 * });
                 *
                 * } else {
                 * return Task.Factory.StartNew(() => {
                 *  TShockAPI.Log.ConsoleError("SEconomy: EnsureBankAccountExists called but no world has been loaded yet.");
                 * });
                 */
            }
        }
        /// <summary>
        /// Creates the world account if needed and sets it.
        /// </summary>
        public async Task EnsureWorldAccountExistsAsync() {

            //World account matches the current world, ignore.
            if (SEconomyPlugin.WorldAccount != null && SEconomyPlugin.WorldAccount.WorldID == Terraria.Main.worldID) {
                return;
            }

            if (Terraria.Main.worldID > 0) {
                int bankAccountK = 0;
                DatabaseObjects.BankAccount worldAccount = await (from i in AsyncConnection.Table<DatabaseObjects.BankAccount>()
                                                                  where (i.Flags & DatabaseObjects.BankAccountFlags.SystemAccount) == DatabaseObjects.BankAccountFlags.SystemAccount
                                                                     && (i.Flags & DatabaseObjects.BankAccountFlags.PluginAccount) == 0
                                                                     && i.WorldID == Terraria.Main.worldID
                                                                  select i).FirstOrDefaultAsync();

                if (worldAccount == null) {
                    //world account does not exist for this world ID, create one
                    worldAccount = new DatabaseObjects.BankAccount();
                    worldAccount.UserAccountName = "SYSTEM";
                    worldAccount.WorldID = Terraria.Main.worldID;
                    worldAccount.Description = "World account for world " + Terraria.Main.worldName;
                    //This account is always enabled, locked to the world it's in and a system account (ie. can run into deficit) but not a plugin account
                    worldAccount.Flags = DatabaseObjects.BankAccountFlags.Enabled | DatabaseObjects.BankAccountFlags.LockedToWorld | DatabaseObjects.BankAccountFlags.SystemAccount;

                    bankAccountK = await AsyncConnection.InsertAsync(worldAccount);
                    worldAccount.BankAccountK = bankAccountK;
                }

                if (worldAccount != null && worldAccount.BankAccountK > 0) {
                    //Is this account listed as enabled?
                    bool accountEnabled = (worldAccount.Flags & DatabaseObjects.BankAccountFlags.Enabled) == DatabaseObjects.BankAccountFlags.Enabled;

                    if (!accountEnabled) {
                        TShockAPI.Log.ConsoleError("The world account for world " + Terraria.Main.worldName + " is disabled.  Currency will not work for this game.");
                    } else {
                        SEconomyPlugin.WorldAccount = new Economy.BankAccount(worldAccount);
                    }
                } else {
                    Log.ConsoleError("There was an error loading the bank account for this world.  Currency will not work for this game.");
                }



                /*
                 * See how much easier this shit is?
                 * 
                 * 
                return AsyncConnection.Table<DatabaseObjects.BankAccount>().Where(i => (i.Flags & DatabaseObjects.BankAccountFlags.SystemAccount) == DatabaseObjects.BankAccountFlags.SystemAccount
                        && (i.Flags & DatabaseObjects.BankAccountFlags.PluginAccount) == 0
                        && i.WorldID == Terraria.Main.worldID).FirstOrDefaultAsync().ContinueWith((worldAccountResult) => {

                    if (worldAccountResult.Result == null) {
                        //world account does not exist for this world ID, create one
                        DatabaseObjects.BankAccount worldAccount = new DatabaseObjects.BankAccount();
                        worldAccount.UserAccountName = "SYSTEM";
                        worldAccount.WorldID = Terraria.Main.worldID;
                        worldAccount.Description = "World account for world " + Terraria.Main.worldName;

                        //This account is always enabled, locked to the world it's in and a system account (ie. can run into deficit) but not a plugin account
                        worldAccount.Flags = DatabaseObjects.BankAccountFlags.Enabled | DatabaseObjects.BankAccountFlags.LockedToWorld | DatabaseObjects.BankAccountFlags.SystemAccount;

                        AsyncConnection.InsertAsync(worldAccount).ContinueWith((newPrimaryKey) => {
                            int bankAccountK = newPrimaryKey.Result;

                            if (bankAccountK > 0) {

                                //Retrieve the new world account from the database
                                AsyncConnection.Table<DatabaseObjects.BankAccount>().Where(i => i.BankAccountK == bankAccountK).FirstOrDefaultAsync().ContinueWith((newWorldAccountResult) => {
                                    if (newWorldAccountResult.Result != null) {

                                        //override world account inserter with the new one.
                                        worldAccount = newWorldAccountResult.Result;

                                        //Is this account listed as enabled?
                                        bool accountEnabled = (worldAccount.Flags & DatabaseObjects.BankAccountFlags.Enabled) == DatabaseObjects.BankAccountFlags.Enabled;

                                        if (!accountEnabled) {
                                            TShockAPI.Log.ConsoleError("The world account for world " + Terraria.Main.worldName + " is disabled.  Currency will not work for this game.");
                                        }

                                        //Push it back to the main instance.
                                        SEconomyPlugin.WorldAccount = new Economy.BankAccount(worldAccount);
                                    }
                                });

                            } else {
                                Log.ConsoleError(string.Format("SEconomy: error: create world account for {0} failed.", Terraria.Main.worldName));
                            }
                        });

                    } else {
                        DatabaseObjects.BankAccount worldAccount = worldAccountResult.Result;

                        //Is this account listed as enabled?
                        bool accountEnabled = (worldAccount.Flags & DatabaseObjects.BankAccountFlags.Enabled) == DatabaseObjects.BankAccountFlags.Enabled;

                        if (!accountEnabled) {
                            TShockAPI.Log.ConsoleError("The world account for world " + Terraria.Main.worldName + " is disabled.  Currency will not work for this game.");
                        }

                        //Assign the world account to the running world.
                        SEconomyPlugin.WorldAccount = new Economy.BankAccount(worldAccount);
                    }
                });

            } else {
                return Task.Factory.StartNew(() => { 
                    TShockAPI.Log.ConsoleError("SEconomy: EnsureBankAccountExists called but no world has been loaded yet.");
                });
            */
            }
        }