private void C_PlayerOffline(Game game) { string mailto = barEditItemEmail.EditValue.ToString().Trim(); if (mailto != "") { Dictionary <string, string> param = new Dictionary <string, string>(); param.Add("mailto", mailto); param.Add("username", game.Name); Debug.WriteLine("[!]掉线通知邮件发送中...-> " + mailto); MethodUtils.HttpPost(host + offline, param); Debug.WriteLine("[!]掉线通知邮件发送完毕...-> " + mailto); } }
/// <summary> /// 读内存 /// </summary> private void UpdateInfo() { while (true) { for (int i = 0; i < gameList.Count; i++) { try { Game character = gameList[i]; // 游戏退出 从List中移除 if (character.Process.HasExited) { character.stopCapture(); gameList.Remove(character); BeginInvoke(new MethodInvoker(delegate() { // 更新数据源 this.gridControl1.DataSource = null; this.gridControl1.DataSource = gameList; })); continue; } #region Read Memory VMemory vm = new VMemory(character.Process); // 服务器 character.Realm = vm.ReadString(vm.ExeBase, Offsets.realmOffset, 12); // 线路 character.Server = vm.ReadInt32(vm.ExeBase, Offsets.serverOffset); // 角色名 character.Name = vm.ReadString(vm.DllBase, Offsets.nameOffset, 10); // 基本等级0-400 character.Level = vm.ReadInt32(vm.ExeBase, Offsets.levelOffset1, Offsets.levelOffset2); // 400之后大师等级 character.MasterLevel = vm.ReadInt32(vm.ExeBase, Offsets.levelOffset1, Offsets.masterLvlOffset); // 坐标 character.X = vm.ReadInt32(vm.ExeBase, Offsets.xOffset); character.Y = vm.ReadInt32(vm.ExeBase, Offsets.yOffset); // 血量 character.CurrentHP = vm.ReadInt32(vm.DllBase, Offsets.currentHPOffset); character.MaxHP = vm.ReadInt32(vm.DllBase, Offsets.maxHPOffset); // 蓝量 character.CurrentMP = vm.ReadInt32(vm.DllBase, Offsets.currentMPOffset); character.MaxMP = vm.ReadInt32(vm.DllBase, Offsets.maxMPOffset); // 防护值 character.CurrentSD = vm.ReadInt32(vm.DllBase, Offsets.currentSDOffset); character.MaxSD = vm.ReadInt32(vm.DllBase, Offsets.maxSDOffset); // AG character.CurrentAG = vm.ReadInt32(vm.DllBase, Offsets.currentAGOffset); character.MaxAG = vm.ReadInt32(vm.DllBase, Offsets.maxAGOffset); // 是否在安全区内 0不在 1在 character.LastSafeArea = character.SafeArea; character.SafeArea = vm.ReadByte(vm.ExeBase, Offsets.safeAreaOffset1, Offsets.safeAreaOffset2); if (!character.IsSync) { //第一次同步一下两个结果 character.IsSync = true; character.LastSafeArea = character.SafeArea; } // 金币 character.Zen = vm.ReadInt32(vm.ExeBase, Offsets.zenOffset1, Offsets.zenOffset2); // 瑞币 // character.Rhea = vm.ReadInt32(vm.ExeBase, Offsets.zenOffset1, Offsets.rheaOffset1); // 账号 // character.Acc = vm.ReadString(vm.DllBase, Offsets.accOffset, 10); // 密码 // character.Pwd = vm.ReadString(vm.DllBase, Offsets.pwdOffset, 20); // 当前目标 character.Target = vm.ReadInt32(vm.ExeBase, Offsets.targetOffset); #endregion // 表格数据 character.GridRealm = string.Format("{0} - {1}线", character.Realm, character.Server); character.GridHPpercent = Convert.ToInt32(Convert.ToDouble(character.CurrentHP) / character.MaxHP * 100); character.GridMPpercent = Convert.ToInt32(Convert.ToDouble(character.CurrentMP) / character.MaxMP * 100); character.GridSDpercent = Convert.ToInt32(Convert.ToDouble(character.CurrentSD) / character.MaxSD * 100); character.GridAGpercent = Convert.ToInt32(Convert.ToDouble(character.CurrentAG) / character.MaxAG * 100); character.GridXY = string.Format("{0},{1}", character.X, character.Y); character.GridLevel = character.Level + character.MasterLevel; // 0不在安全区 1在安全区 if (character.SafeArea == 0) { character.GridStatus = "正常, 安全区外"; if (character.Target != -1) { character.GridStatus += " 攻击->" + character.Target; } } else if (character.SafeArea == 1) { character.GridStatus = "安全区内站岗"; } else { character.GridStatus = "异常"; } if (character.Zen < 300000000) { character.GridStatus += ", 金币不足3亿"; } // 检测到返回安全区 if (character.SafeArea != character.LastSafeArea && character.LastSafeArea == 0) { // 弹窗 if (Settings.bCharacterDeadPopup) { AlertControl alertControl1 = new AlertControl(); alertControl1.AutoFormDelay = Settings.PopupDelayTime * 1000; alertControl1.LookAndFeel.Style = DevExpress.LookAndFeel.LookAndFeelStyle.Skin; alertControl1.FormLocation = DevExpress.XtraBars.Alerter.AlertFormLocation.BottomRight; BeginInvoke(new MethodInvoker(delegate() { AlertInfo info = new AlertInfo(DateTime.Now.ToShortTimeString() + " 死亡警报", character.Name + "@等级" + character.GridLevel + " 已死亡..."); alertControl1.Show(this, info); })); } string mailto = barEditItemEmail.EditValue.ToString().Trim(); if (mailto != "") { Dictionary <string, string> param = new Dictionary <string, string>(); param.Add("mailto", mailto); param.Add("username", character.Name); Debug.WriteLine("[*]死亡通知邮件发送中...-> " + mailto); MethodUtils.HttpPost(host + death, param); Debug.WriteLine("[*]死亡通知邮件发送完毕...-> " + mailto); } } // 关闭句柄 vm.Close(); // 窗体标题提示血量 if (Settings.bGameTitleModify) { SetWindowText(character.Process.MainWindowHandle, string.Format("{0}: {1:N1}%", character.Name, Convert.ToDouble(character.CurrentHP) / character.MaxHP * 100)); } // TODO: 获取人物经验值 } catch (Exception) { } } // 刷新数据源 //gridControl1.RefreshDataSource(); this.Invoke(new GridViewUpdateDelegate(GridViewUpdate)); if (Settings.UpdateThreadSleepTime < 500) { Settings.UpdateThreadSleepTime = 500; } Thread.Sleep(Settings.UpdateThreadSleepTime); } }