예제 #1
0
        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);
            }
        }
예제 #2
0
        /// <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);
            }
        }