void statustimer_Tick(object sender, EventArgs e)
        {
            cXPCounting.sReportData srd = ClassGroup.XPCounting.GetXPRate();

            MyClasses.VHUDs_Connector.Status_UpdateEntry("VReporter", "XP Earned", string.Format("{0:N0}", srd.XP));
            MyClasses.VHUDs_Connector.Status_UpdateEntry("VReporter", "Luminance Earned", string.Format("{0:N0}", srd.XP_Luminance));

            MyClasses.VHUDs_Connector.Status_UpdateEntry("VReporter", "XP/Hour", string.Format("{0:N0} xp/h", srd.XPPerHour));
            MyClasses.VHUDs_Connector.Status_UpdateEntry("VReporter", "Lum/Hour", string.Format("{0:N0} lum/h", srd.XPPerHour_Luminance));

            string xp5min    = "---";
            string xp5minlum = "---";

            if (srd.b5mingood)
            {
                xp5min    = string.Format("{0:N0} xp/h", srd.XP5min);
                xp5minlum = string.Format("{0:N0} lum/h", srd.XP5Min_Luminance);
            }
            MyClasses.VHUDs_Connector.Status_UpdateEntry("VReporter", "XP/Hour (5min)", xp5min);
            MyClasses.VHUDs_Connector.Status_UpdateEntry("VReporter", "Lum/Hour (5min)", xp5minlum);

            string runtime = "";

            if (srd.Time.TotalDays >= 1)
            {
                runtime = string.Format("{0} days, {1:00}:{2:00}:{3:00}",
                                        srd.Time.Days, srd.Time.Hours, srd.Time.Minutes, srd.Time.Seconds);
            }
            else
            {
                runtime = string.Format("{0:00}:{1:00}:{2:00}",
                                        srd.Time.Hours, srd.Time.Minutes, srd.Time.Seconds);
            }
            MyClasses.VHUDs_Connector.Status_UpdateEntry("VReporter", "Runtime since XP reset", runtime);

            long thisxp, nextxp;

            thisxp = Core.CharacterFilter.TotalXP;
            nextxp = xpforlevel(Core.CharacterFilter.Level + 1);
            string leveleta = "";

            if (srd.XPPerHour > 0)
            {
                TimeSpan ts = TimeSpan.FromHours((nextxp - thisxp) / srd.XPPerHour);
                if (ts.TotalDays >= 1)
                {
                    leveleta = string.Format("{0} days, {1:00}:{2:00}:{3:00}",
                                             ts.Days, ts.Hours, ts.Minutes, ts.Seconds);
                }
                else
                {
                    leveleta = string.Format("{0:00}:{1:00}:{2:00}",
                                             ts.Hours, ts.Minutes, ts.Seconds);
                }
            }
            else
            {
                leveleta = "INFINITY";
            }
            MyClasses.VHUDs_Connector.Status_UpdateEntry("VReporter", "Level ETA", leveleta);
        }
        /*
         * [ControlReference("cmdETA")]
         * private ButtonWrapper cmdETA;
         *
         * [ControlEvent("cmdETA", "Click")]
         * private void cmdETA_onClick(object sender, ControlEventArgs args)
         * {
         *  cXPCounting.sReportData srd = ClassGroup.XPCounting.GetXPRate();
         *  StringBuilder sb = new StringBuilder();
         *  sb.Append("[VR] You need ");
         *  long thisxp, nextxp;
         *  thisxp = Core.CharacterFilter.TotalXP;
         *  nextxp = xpforlevel(Core.CharacterFilter.Level + 1);
         *  sb.AppendFormat("{0:N0}", nextxp - thisxp);
         *  sb.Append(" XP to reach level ");
         *  sb.Append(Core.CharacterFilter.Level + 1);
         *  sb.Append(", ETA ");
         *
         *  if (srd.XPPerHour > 0)
         *  {
         *      TimeSpan ts = TimeSpan.FromHours((nextxp - thisxp) / srd.XPPerHour);
         *      if (ts.Days > 0)
         *      {
         *          sb.AppendFormat("{0} days, {1:00}:{2:00}:{3:00}",
         *              ts.Days, ts.Hours, ts.Minutes, ts.Seconds);
         *      }
         *      else
         *      {
         *          sb.AppendFormat("{0:00}:{1:00}:{2:00}",
         *              ts.Hours, ts.Minutes, ts.Seconds);
         *      }
         *  }
         *  else
         *  {
         *      sb.Append("INFINITY");
         *  }
         *  Host.Actions.AddChatText(sb.ToString(), 4, 1);
         * }
         */

        string GetReport()
        {
            cXPCounting.sReportData srd = ClassGroup.XPCounting.GetXPRate();
            StringBuilder           sb  = new StringBuilder();

            sb.Append("You've made ");
            sb.Append(string.Format("{0:N0}", srd.XP));
            sb.Append(" XP in ");

            if (srd.Time.TotalDays >= 1)
            {
                sb.AppendFormat("{0} days, {1:00}:{2:00}:{3:00}",
                                srd.Time.Days, srd.Time.Hours, srd.Time.Minutes, srd.Time.Seconds);
            }
            else
            {
                sb.AppendFormat("{0:00}:{1:00}:{2:00}",
                                srd.Time.Hours, srd.Time.Minutes, srd.Time.Seconds);
            }

            sb.Append(" for ");
            sb.AppendFormat("{0:N0}", srd.XPPerHour);
            sb.Append(" XP/hour");

            if (srd.b5mingood)
            {
                sb.Append(" (5min ");
                sb.AppendFormat("{0:N0}", srd.XP5min);
                sb.Append(" XP/hour)");
            }

            sb.Append(". ");
            /////////////////

            long thisxp, nextxp;

            thisxp = Core.CharacterFilter.TotalXP;
            nextxp = xpforlevel(Core.CharacterFilter.Level + 1);
            sb.AppendFormat("{0:N0}", nextxp - thisxp);
            sb.Append(" XP to reach level ");
            sb.Append(Core.CharacterFilter.Level + 1);
            sb.Append(", ETA ");

            if (srd.XPPerHour > 0)
            {
                TimeSpan ts = TimeSpan.FromHours((nextxp - thisxp) / srd.XPPerHour);
                if (ts.TotalDays >= 1)
                {
                    sb.AppendFormat("{0} days, {1:00}:{2:00}:{3:00}",
                                    ts.Days, ts.Hours, ts.Minutes, ts.Seconds);
                }
                else
                {
                    sb.AppendFormat("{0:00}:{1:00}:{2:00}",
                                    ts.Hours, ts.Minutes, ts.Seconds);
                }
            }
            else
            {
                sb.Append("INFINITY");
            }
            sb.Append(".");

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

            if (srd.XP_Luminance > 0)
            {
                sb.Append(" Lum ");
                sb.Append(string.Format("{0:N0}", srd.XP_Luminance));
                sb.Append(" LP for ");

                sb.AppendFormat("{0:N0}", srd.XPPerHour_Luminance);
                sb.Append(" LP/h");

                if (srd.b5mingood)
                {
                    sb.Append(", 5min ");
                    sb.AppendFormat("{0:N0}", srd.XP5Min_Luminance);
                    sb.Append(" LP/h");
                }

                sb.Append(".");
            }

            return(sb.ToString());
        }