Пример #1
0
        public void AddHeal(RecoverEventArgs e)
        {
            this.HealAmount += e.Amount;
            if (Class == ClassType.NONE)
            {
                Class = SkillDictionary.GetClass(e.Skill);
            }
            this.HealLogList.Add(e.log);
            HealSkillEntity entity = null;

            foreach (HealSkillEntity hse in HealList)
            {
                if (hse.Target == e.Name)
                {
                    entity = hse;
                    break;
                }
            }
            if (entity == null)
            {
                entity        = new HealSkillEntity();
                entity.Target = e.Name;
                this.HealList.Add(entity);
            }
            entity.TotalRecover += e.Amount;
            entity.Count++;
        }
Пример #2
0
        // 순위, 클래스, 이름, dps, 총데, 딜시간, 최대데미지,
        // 공격횟수, 스킬비율, 평타비율, 치명타비율
        public void UpdataListView()
        {
            if (ListItem.SubItems[1].Text == "")
            {
                ListItem.SubItems[1].Text = SkillDictionary.GetClassString(Class);
            }

            ListItem.SubItems[3].Text = DPS + "";
            ListItem.SubItems[4].Text = TotalDamage + "";
            ListItem.SubItems[5].Text = TotalDealTime + "초";
            ListItem.SubItems[6].Text = HPRecover + "";
            ListItem.SubItems[7].Text = HealAmount + "";

            ListItem.SubItems[8].Text  = MaxDamage + "";
            ListItem.SubItems[9].Text  = TotalDealCount + "회";
            ListItem.SubItems[10].Text = percentSkill + "%";
            ListItem.SubItems[11].Text = percentNormal + "%";
            ListItem.SubItems[12].Text = percentCritical + "%";

            ListItem.SubItems[13].Text = NewTotalNormalDealCount + "회";
            ListItem.SubItems[14].Text = NewTotalSkillDealCount + "회";
            ListItem.SubItems[15].Text = NewTotalDealCount + "회";
            ListItem.SubItems[16].Text = TotalNormalCancelCount + "회";
            ListItem.SubItems[17].Text = PercentNormalCancel + "%";
            ListItem.SubItems[18].Text = MaxNormalCancelCount + "회";
            ListItem.SubItems[19].Text = CurrentNormalCancelCount + "회";
            ListItem.SubItems[20].Text = (NewTotalNormalDealCount == 0) ? "0" : (NewTotalNormalDamage / NewTotalNormalDealCount) + "";
            ListItem.SubItems[21].Text = (NewTotalSkillDealCount == 0) ? "0" : (NewTotalSkillDamage / NewTotalSkillDealCount) + "";
            ListItem.SubItems[22].Text = (NewTotalDealCount == 0) ? "0" : (TotalDamage / NewTotalDealCount) + "";

            ListItem.SubItems[23].Text = MPRecover + "";
        }
Пример #3
0
        public override String GetQuery()
        {
            String        url = "";
            StringBuilder sb  = new StringBuilder(url);

            sb.Append("?" + "starttime" + "=" + EventList[0].Time);
            sb.Append("&" + "endtime" + "=" + EventList[3].Time);
            sb.Append("&" + "cleartime" + "=" + ClearTime);
            sb.Append("&" + "totaldamage" + "=" + TotalDamage);

            // 2013-05-08 최대 유저수는 7을 안넘는다
            int tmp = UserList.Count;

            if (tmp > 7)
            {
                tmp = 7;
            }
            sb.Append("&" + "usercount" + "=" + tmp);
            sb.Append("&" + "userinfo" + "=");
            int    count      = 0;
            String userName   = "";
            String userServer = "";

            foreach (User u in UserList)
            {
                sb.Append(SkillDictionary.GetClassString(u.Class));
                String   playerName = u.Name;
                String[] temp       = playerName.Split('-');
                if (temp.Length == 1)
                {
                    // 통합서버가 아니다.
                    userName   = playerName;
                    userServer = (String)this.main.GetServer();
                }
                else
                {
                    // 통합서버다.
                    userName   = temp[0];
                    userServer = temp[1];
                }
                sb.Append(":" + userServer);
                sb.Append(":" + userName);
                sb.Append(":" + u.TotalDamage);
                sb.Append(":" + ((u.Name == LogParser.Myname) ? 1 : 0));
                sb.Append(":" + u.DPS);
                sb.Append(":" + u.PercentNormalCancel);
                sb.Append(":" + u.HPRecover);
                sb.Append(":" + u.HealAmount);
                sb.Append("|");
                count++;
                if (count == 7)
                {
                    break;
                }
            }
            sb.Append("&" + "version" + "=" + this.main.Version);
            return(sb.ToString());
        }
Пример #4
0
        protected void AppendUser()
        {
            int i = 0;

            foreach (User u in UserList)
            {
                sb.AppendLine("  " + (++i) + ". " + SkillDictionary.GetClassString(u.Class) + " " + u.Name + "(" + u.TotalDamage + " " + (100 * u.TotalDamage / TotalDamage) + "%)");
            }
        }
Пример #5
0
        public int SendDealRecord(bool my, String userserver, String username, User user, int dealtime, int recerdType)
        {
            String url = "";

            try
            {
                StringBuilder sb = new StringBuilder(url);
                sb.Append("?" + "programuser" + "=" + ((my) ? 1 : 0));
                sb.Append("&" + "userserver" + "=" + userserver);
                sb.Append("&" + "username" + "=" + username);
                sb.Append("&" + "userclass" + "=" + SkillDictionary.GetClassString(user.Class));
                sb.Append("&" + "dealtime" + "=" + dealtime);
                sb.Append("&" + "dps" + "=" + user.DPS);
                sb.Append("&" + "totaldamage" + "=" + user.TotalDamage);
                sb.Append("&" + "dealcount" + "=" + user.TotalDealCount);
                sb.Append("&" + "skillrate" + "=" + user.percentSkill);
                sb.Append("&" + "normalrate" + "=" + user.percentNormal);
                sb.Append("&" + "criticalrate" + "=" + user.percentCritical);
                sb.Append("&" + "type" + "=" + recerdType);
                sb.Append("&" + "target" + "=" + user.LastTarget);
                sb.Append("&" + "normalcancel" + "=" + user.PercentNormalCancel);
                sb.Append("&" + "version" + "=" + this.mainForm.Version);


                WebRequest   myWebRequest  = WebRequest.Create(sb.ToString());
                WebResponse  myWebResponse = myWebRequest.GetResponse();
                StreamReader reader        = new StreamReader(myWebResponse.GetResponseStream());
                string       temp          = reader.ReadToEnd();

                int ret = -1;
                try
                {
                    ret = Int32.Parse(temp);
                }
                catch { }
                return(ret);
            }
            catch (Exception ee)
            {
                ee.ToString();
                return(-1);
            }
        }
Пример #6
0
        public void AddDamage(PlayerDamageEventArgs e)
        {
            //5초간 딜이 없다면 마지막시간으로
            //int temp = DateTime.Compare(e.Time, lastDataTime);
            int temp = e.Time.Subtract(lastDataTime).Seconds;

#if TICK
            if (temp > 0)
            {
                totalDealTime++;
            }
#else
            if (temp < 5 && temp >= 0)
            {
                TotalDealTime += temp;
            }
            else
            {
                TotalDealTime++;
            }
#endif
            TimeSpan timeSpan = e.Time - lastDataTime;
            lastDataTime = e.Time;

            TotalDamage += e.Damage;
            if (e.Damage > MaxDamage)
            {
                MaxDamage = e.Damage;
            }

            this.TotalDealCount++;
            if (e.Skill != "")
            {
                this.totalSkillDealCount++;
                if (Class == ClassType.NONE)
                {
                    Class = SkillDictionary.GetClass(e.Skill);
                    if (Class == ClassType.NONE)
                    {
                    }
                }
            }
            else
            {
                e.Skill = "평타";
                this.totalNormalDealCount++;
            }


            // NewTotalDealCount TotalNormalCancelCount MaxNormalCancelCount CurrentNormalCancelCount
            // 2013-05-30
            if (e.Skill == "평타")
            {
                NewTotalNormalDamage += e.Damage;
            }
            else
            {
                NewTotalSkillDamage += e.Damage;
            }

            // 2013-05-21
            if (NewTotalDealCount == 0) // 첫타는..
            {
                NewTotalDealCount++;
                if (e.Skill == "평타")
                {
                    NewTotalNormalDealCount++;
                }
                else
                {
                    NewTotalSkillDealCount++;
                }
            }
            else
            {
                if (isLastSkill == true && e.Skill != "평타") //스킬 & 스킬
                {
                    NewTotalDealCount++;
                    CurrentNormalCancelCount = 0;
                    NewTotalSkillDealCount++;
                }
                else if ((isLastSkill == true && e.Skill == "평타") || (isLastSkill == false && e.Skill != "평타")) // 스킬 & 평타
                {
                    NewTotalDealCount++;
                    if (timeSpan.TotalSeconds <= 3)
                    {
                        TotalNormalCancelCount++;
                        CurrentNormalCancelCount++;
                    }
                    else
                    {
                        CurrentNormalCancelCount = 0;
                    }
                    if (e.Skill == "평타")
                    {
                        NewTotalNormalDealCount++;
                    }
                    else
                    {
                        NewTotalSkillDealCount++;
                    }
                }
                else if (isLastSkill == false && e.Skill == "평타") //평타 & 평타
                {
                    if (timeSpan.TotalSeconds > 0)
                    {
                        NewTotalDealCount++;
                        NewTotalNormalDealCount++;
                        CurrentNormalCancelCount = 0;
                    }
                }
            }
            isLastSkill = (e.Skill != "평타");

            MaxNormalCancelCount = (CurrentNormalCancelCount > MaxNormalCancelCount) ? CurrentNormalCancelCount : MaxNormalCancelCount;
            PercentNormalCancel  = (NewTotalDealCount > 1) ? (TotalNormalCancelCount * 100 / (NewTotalDealCount - 1)) : 0;

            SkillEntity skillEntity = null;
            foreach (SkillEntity skill in SkillList)
            {
                if (skill.SkillName == e.Skill)
                {
                    skillEntity = skill;
                    break;
                }
            }
            if (skillEntity == null)
            {
                SkillEntity se = new SkillEntity();
                se.SkillName = e.Skill;
                SkillList.Add(se);
                skillEntity = se;
            }
            skillEntity.TotalDamage += e.Damage;
            skillEntity.Count++;
            if (e.bCritical)
            {
                skillEntity.CriticalCount++;
            }


            this.TotalCriticalDealCount = this.TotalCriticalDealCount + ((e.bCritical) ? 1 : 0);
            DPS           = (TotalDealTime > 0) ? (TotalDamage / this.TotalDealTime) : 0;
            percentSkill  = (TotalDealCount > 0) ? (totalSkillDealCount * 100 / TotalDealCount) : 0;
            percentNormal = (TotalDealCount > 0) ? (totalNormalDealCount * 100 / TotalDealCount) : 0;
            // 2013-05-10 평타는 아예 빼기 때문에 스킬만 계산
            percentCritical = (totalSkillDealCount > 0) ? (TotalCriticalDealCount * 100 / totalSkillDealCount) : 0;

            LogList.Add(e.log);
            LastTarget = e.Target;
        }
Пример #7
0
        private void InitializeComponentManually()
        {
            this.topMostCheckbox           = new HostedCheckbox();
            this.statusToolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator();
            this.opacityTrackBar           = new ToolStripTrackBar();
            this.statusToolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator();
            this.oneClassCheckbox          = new HostedCheckbox();
            this.statusToolStripSeparator3 = new System.Windows.Forms.ToolStripSeparator();
            this.autoSortCheckbox          = new HostedCheckbox();

            //
            // topMostCheckbox
            //
            this.topMostCheckbox.Checked = true;
            this.topMostCheckbox.Name    = "topMostCheckbox";
            this.topMostCheckbox.Size    = new System.Drawing.Size(66, 22);
            this.topMostCheckbox.Text    = "항상 위";
            this.topMostCheckbox.Checked = this.TopMost;
            this.topMostCheckbox.Click  += new System.EventHandler(this.topMostCheckbox_Click);
            //
            // statusToolStripSeparator1
            //
            this.statusToolStripSeparator1.Name = "toolStripSeparator1";
            this.statusToolStripSeparator1.Size = new System.Drawing.Size(6, 25);
            //
            // opacityTrackBar
            //
            this.opacityTrackBar.AutoSize      = false;
            this.opacityTrackBar.Name          = "opacityTrackBar";
            this.opacityTrackBar.Size          = new System.Drawing.Size(100, 20);
            this.opacityTrackBar.Value         = 0;
            this.opacityTrackBar.ValueChanged += new System.EventHandler(this.opacityTrackBar_ValueChanged);
            //
            // statusToolStripSeparator2
            //
            this.statusToolStripSeparator2.Name = "toolStripSeparator1";
            this.statusToolStripSeparator2.Size = new System.Drawing.Size(6, 25);
            //
            // oneClassCheckbox
            //
            this.oneClassCheckbox.Checked = LogParser.OneClassFlag;
            this.oneClassCheckbox.Size    = new System.Drawing.Size(66, 22);
            this.oneClassCheckbox.Text    = "클래스별 1인";
            this.oneClassCheckbox.Click  += new System.EventHandler(this.oneClassCheckbox_Click);
            //
            // statusToolStripSeparator3
            //
            this.statusToolStripSeparator3.Size = new System.Drawing.Size(6, 25);
            //
            // autoSortCheckbox
            //
            this.autoSortCheckbox.Checked = LogParser.AutoSortFlag;
            this.autoSortCheckbox.Size    = new System.Drawing.Size(66, 22);
            this.autoSortCheckbox.Text    = "자동정렬";
            this.autoSortCheckbox.Click  += new System.EventHandler(this.autoSortCheckbox_Click);


            this.statusToolStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
                this.topMostCheckbox,
                this.statusToolStripSeparator1,
                this.opacityTrackBar,
                this.statusToolStripSeparator2,
                this.oneClassCheckbox,
                this.statusToolStripSeparator3,
                this.autoSortCheckbox
            });

            //2013-04-30
            this.labelVersion.Text += Version;
            //this.panelInformaion.Controls.Remove(this.panelUpdate);
            //this.panelUpdate.Controls.Clear();
            this.panelUpdate.Controls.Remove(this.progressBar1);


            toolStripClassViewItems            = new ToolStripMenuItem[12];
            toolStripClassViewItems[0]         = new ToolStripMenuItem("전체");
            toolStripClassViewItems[0].Checked = true;

            toolStripClassViewItems[1]  = new ToolStripMenuItem(SkillDictionary.GetClassString(ClassType.검성));
            toolStripClassViewItems[2]  = new ToolStripMenuItem(SkillDictionary.GetClassString(ClassType.수호성));
            toolStripClassViewItems[3]  = new ToolStripMenuItem(SkillDictionary.GetClassString(ClassType.살성));
            toolStripClassViewItems[4]  = new ToolStripMenuItem(SkillDictionary.GetClassString(ClassType.궁성));
            toolStripClassViewItems[5]  = new ToolStripMenuItem(SkillDictionary.GetClassString(ClassType.마도성));
            toolStripClassViewItems[6]  = new ToolStripMenuItem(SkillDictionary.GetClassString(ClassType.정령성));
            toolStripClassViewItems[7]  = new ToolStripMenuItem(SkillDictionary.GetClassString(ClassType.치유성));
            toolStripClassViewItems[8]  = new ToolStripMenuItem(SkillDictionary.GetClassString(ClassType.호법성));
            toolStripClassViewItems[9]  = new ToolStripMenuItem(SkillDictionary.GetClassString(ClassType.사격성));
            toolStripClassViewItems[10] = new ToolStripMenuItem(SkillDictionary.GetClassString(ClassType.음유성));
            toolStripClassViewItems[11] = new ToolStripMenuItem(SkillDictionary.GetClassString(ClassType.기갑성));
            foreach (ToolStripMenuItem item in toolStripClassViewItems)
            {
                item.Click += new EventHandler(item_Click);
            }
            this.toolStripClassView.DropDownItems.AddRange(toolStripClassViewItems);

            comboBoxSelectServer.Items.Add("");
            comboBoxSelectServer.Items.AddRange(ServerList.ServerName);

            this.panelPopup.Controls.Remove(this.progressBarBoss);
            HidePopup();

            //2013-09-30 분간측정 메뉴로 이동
            for (int i = 0; i < 10; i++)
            {
                ToolStripMenuItem ii = new ToolStripMenuItem((i + 1) + "분");
                this.분간측정ToolStripMenuItem.DropDownItems.Add(ii);
                ii.Click += new EventHandler(ii_Click);
            }

            if (this.tabControl1.Controls.Contains(hiddenTabPage))
            {
                this.tabControl1.Controls.Remove(this.hiddenTabPage);
            }
        }
Пример #8
0
        private void ParseLine(string line)
        {
            //bool matched = false;

            try
            {
                if (String.IsNullOrEmpty(line))
                {
                    return;
                }
                MatchCollection matches;//, matches2;

                //2013.09.27 22:03:05 : [charname:소주빵;0.6275 1.0000 0.6275] 님의 귓속말: 65레벨 호법성 [cmd:NhkYrLsNIUzA4S2H8bKZ80VRg5mfKVnkcIKURP7j+0JFUYOZnylZ5HCClET+4/tCMyFSf2E6oRjO/ARkAPeSAA==] [cmd:NhkYrLsNIUzA4S2H8bKZ80VRg5mfKVnkcIKURP7j+0JFUYOZnylZ5HCClET+4/tCBFIJJAvhQDR0YvSr04J+Hw==]
                //2013.09.27 22:05:35 : [charname:소주빵;0.6275 1.0000 0.6275] 님의 귓속말: 65레벨 호법성 [cmd:NhkYrLsNIUzA4S2H8bKZ80VRg5mfKVnkcIKURP7j+0JFUYOZnylZ5HCClET+4/tCU2f0SPAFix1Al20lxc5xrA==] [cmd:NhkYrLsNIUzA4S2H8bKZ80VRg5mfKVnkcIKURP7j+0JFUYOZnylZ5HCClET+4/tCb1i817SotrLkxDzVpR19Tg==]
                //2013.09.27 23:13:44 : [charname:양주오빠;0.6275 1.0000 0.6275] 님의 귓속말: 65레벨 마도성 [cmd:PRsw2mUTV6+xEJEbzsUmjUVRg5mfKVnkcIKURP7j+0JFUYOZnylZ5HCClET+4/tC+rENLG7oLuN2jKnfHei2Cg==] [cmd:PRsw2mUTV6+xEJEbzsUmjUVRg5mfKVnkcIKURP7j+0JFUYOZnylZ5HCClET+4/tCkf5+HgnjLItxN1XZDgINPQ=
                //2013.09.28 19:13:13 : 양맥-이스라펠 님의 귓속말: 65레벨 정령성 [cmd:QjDMbqN8fEG9MKRVzO8PGEVRg5mfKVnkcIKURP7j+0JFUYOZnylZ5HCClET+4/tC5MwvBuvh5IrzUzKexwiXyw==] [cmd:QjDMbqN8fEG9MKRVzO8PGEVRg5mfKVnkcIKURP7j+0JFUYOZnylZ5HCClET+4/tCxTXqOAN7CGj3YfYHyAkDrQ==]
                //파티지원포스지원Regex = new Regex(timeStampRegex + "\\[charname:(?<name>.+);(?<ignore>.+) 님의 귓속말: (?<level>.+) (?<class>.+) \\[cmd:(?<ignore2>.+) \\[cmd:(?<ignore3>.+)", RegexOptions.Compiled);
                matches = 티지원포스지원Regex.Matches(line);
                if (matches.Count > 0)
                {
                    DateTime time = matches[0].Groups["time"].Value.GetTime(LogTimeFormat);
                    String   name = matches[0].Groups["name"].Value;
                    ChatCommandEvent(this, new ChatCommandEventArgs(line, time, 6, name));
                    return;
                }

                matches = 통합파티지원포스지원Regex.Matches(line);
                if (matches.Count > 0)
                {
                    DateTime time = matches[0].Groups["time"].Value.GetTime(LogTimeFormat);
                    String   name = matches[0].Groups["name"].Value;
                    ChatCommandEvent(this, new ChatCommandEventArgs(line, time, 6, name));
                    return;
                }


                matches = 타인의채팅Regex.Matches(line);
                if (matches.Count > 0)
                {
                    return;
                }

                //도움말, 공지사항도 ?
                matches = 자신의채팅Regex.Matches(line);
                if (matches.Count > 0)
                {
                    DateTime time = matches[0].Groups["time"].Value.GetTime(LogTimeFormat);
                    String   name = matches[0].Groups["name"].Value;
                    String   chat = matches[0].Groups["chat"].Value;

                    if (name.IndexOf(' ') == -1) //채널창이 아니면..이름에 빈칸이 없다면
                    {
                        /*
                         * if (name != Myname)
                         * {// 내이름 세팅
                         *  ChatCommandEvent(this, new ChatCommandEventArgs(line, time, 0, name));
                         * }
                         */
                        if (chat.StartsWith("//이름"))
                        {
                            ChatCommandEvent(this, new ChatCommandEventArgs(line, time, 0, name));
                        }
                        else if (chat.StartsWith("//템"))
                        {
                            String searchName = chat.Split(' ')[1];
                            ChatCommandEvent(this, new ChatCommandEventArgs(line, time, 1, searchName));
                        }
                        else if (chat.StartsWith("//모두지우기"))
                        {
                            ChatCommandEvent(this, new ChatCommandEventArgs(line, time, 2, null));
                        }
                        else if (chat.StartsWith("//도움말 바센1"))
                        {
                            String where = chat.Split(' ')[1];
                            ChatCommandEvent(this, new ChatCommandEventArgs(line, time, 3, where));
                        }
                        else if (chat.StartsWith("//타이머"))
                        {
                            ChatCommandEvent(this, new ChatCommandEventArgs(line, time, 5, null));
                        }
                        else if (chat.StartsWith("//"))
                        {
                            String tmp  = chat.Substring(2);
                            int    step = 0;
                            try
                            {
                                step = Int32.Parse(tmp);
                                ChatCommandEvent(this, new ChatCommandEventArgs(line, time, 4, step + ""));
                            }
                            catch
                            {
                            }
                        }

                        /*
                         * else if (chat.Trim().Contains("사용 완료!"))
                         * {
                         * // 2013-07-15
                         * // 팻 18
                         * }
                         */
                        else if (name == "티아마트" || name == "마르쿠탄")
                        {
                            InstanceDungeonEvent(this, new InstanceDungeonEventArgs(line, time, 1, name, chat));
                        }
                        else
                        {
                            //if (name == "도움말" || name == "공지사항") return;
                            //2013-07-15
                            if (name.Trim() == "도움말" || name.Trim() == "공지사항")
                            {
                            }
                            else if (chat.Trim().EndsWith(".") || chat.Trim().EndsWith("!") || chat.Trim().EndsWith("?"))
                            {
                            }
                            else if (chat.Contains("니다"))
                            {
                            }
                            //2013-07-16 명령:

                            /*
                             * else if (name.Trim() == "명령" && chat.Contains("사용합니다")) ;
                             * else if (name.Trim() == "소환" && chat.Contains("소환했습니다")) ;
                             * else if (name.Trim() == "변신" && (chat.Contains("발생했습니다") || chat.Contains("변신했습니다") || chat.Contains("회복했습니다"))) ;
                             * else if (name.Trim() == "수면" && chat.EndsWith("니다.")) ;
                             */
                            else
                            {
                                // 2013-07-17 저주:
                                // 2013-07-15
                                // 여기까지 왔다면 이름을 세팅하자.
                                ChatCommandEvent(this, new ChatCommandEventArgs(line, time, 0, name));
                            }
                        }
                    }
                    else if (name.EndsWith("소환") || name.EndsWith("변신") || name.EndsWith("강화") || name.EndsWith("보호") || name.EndsWith("저주"))
                    {
                        //스킬에 : 가 포함되어져 있는 것들이다.
                    }
                    else
                    {
                        InstanceDungeonEvent(this, new InstanceDungeonEventArgs(line, time, 1, name, chat));
                    }
                }

                //도움말, 공지사항도 ?
                matches = 지역채널에입장했습니다Regex.Matches(line);
                if (matches.Count > 0)
                {
                    DateTime time = matches[0].Groups["time"].Value.GetTime(LogTimeFormat);
                    String where = matches[0].Groups["where"].Value;
                    InstanceDungeonEvent(this, new InstanceDungeonEventArgs(line, time, 0, where, null));
                    return;
                }



                matches = 대미지를줬습니다Regex.Matches(line);

                if (matches.Count > 0)
                {
                    DateTime time   = matches[0].Groups["time"].Value.GetTime(LogTimeFormat);
                    String   name   = matches[0].Groups["name"].Value;
                    String   skill  = matches[0].Groups["skill"].Value;
                    String   target = matches[0].Groups["target"].Value;

                    int  damage    = matches[0].Groups["damage"].Value.GetDigits();
                    bool bCritical = false;

                    // 2013-05-07 평타는 계산하지 않는다.
                    // if (line.IndexOf("치명타") != -1) bCritical = true;
                    if (line.IndexOf("치명타") != -1 && skill != "")
                    {
                        bCritical = true;
                    }


                    if (name == "")
                    {
                        name = Myname;
                        MyStatusEvent(this, new MyStatusEventArgs(line, time, MyStatus.Attack, ""));
                    }
                    else if (name.IndexOf("의 정령") != -1 || name.IndexOf("의 기운") != -1)
                    {
                        DamageInflicted(this, new PlayerDamageEventArgs(line, time, Noname, name + "-" + skill, target, damage, bCritical));
                        return;
                    }
                    else if (name.IndexOf(' ') != -1 && skill.IndexOf(name) != -1)
                    {
                        DamageInflicted(this, new PlayerDamageEventArgs(line, time, Noname, name + "-" + skill, target, damage, bCritical));
                        return;
                    }
                    else if (name == "빙판" && skill.StartsWith("빙판") && skill.EndsWith("효과"))
                    {
                        DamageInflicted(this, new PlayerDamageEventArgs(line, time, Noname, name + "-" + skill, target, damage, bCritical));
                        return;
                    }
                    //2013-09-27 이벤트때문에 이런 이름들이 존나 많아짐
                    else if (name == "티아마트" || name == "마르쿠탄" || name == "히페리온" || name == "카이시넬" || name == "카룬")
                    {// 이름에 빈칸이 없지만..
                        // 이미 유저목록에 이 이름이 있다면 패스하자
                        if (mainForm.data.GetPlayer(name) == null)
                        {
                            // 위의 이름이 들어오고 스킬목록에 없다면 추가하지 않는다.
                            if (SkillDictionary.GetClass(skill) == ClassType.NONE)
                            {
                                return;
                            }
                        }
                    }
                    else if ((name.IndexOf(" ")) != -1)
                    {
                        // 여기까지 왔다면 몹이다.
                        return;
                    }


                    DamageInflicted(this, new PlayerDamageEventArgs(line, time, name, skill, target, damage, bCritical));

                    //matched = true;
                    return;
                }

                matches = 대미지를받았습니다Regex.Matches(line);
                if (matches.Count > 0)
                {
                    DateTime time   = matches[0].Groups["time"].Value.GetTime(LogTimeFormat);
                    String   name   = matches[0].Groups["name"].Value;
                    String   skill  = matches[0].Groups["skill"].Value;
                    int      damage = matches[0].Groups["damage"].Value.GetDigits();
                    String   from   = matches[0].Groups["from"].Value;

                    if (name == "")
                    {
                        MyStatusEvent(this, new MyStatusEventArgs(line, time, MyStatus.BeBeaten1, damage + ""));
                    }
                    else
                    {
                        // 다른사람 피해, 중독 출혈 신석 도트
                        // 지연폭발류
                        bool bCritical = false;

                        // from은 없다.. 항상 효과
                        //2013.02.08 03:41:49 : 치명타! 땅의 정령이 시야랑에게서 564의 치명적인 대미지를 받았습니다.
                        if (line.IndexOf("치명타") != -1)
                        {
                            bCritical = true;
                        }

                        // 1818
                        if (line.IndexOf("어둠의 문양 파열") != -1)
                        {
                        }

                        if (name.EndsWith("어둠의 문양 파열 I 추"))
                        {
                            name  = name.Substring(0, name.Length - 15);
                            skill = "어둠의 문양 파열 I 추가 효과";
                        }

                        DamageInflicted(this, new PlayerDamageEventArgs(line, time, Noname, skill, name, damage, bCritical));

                        //matched = true;
                    }
                    return;
                }

                matches = 사용한영향으로대미지를받았습니다Regex.Matches(line);
                if (matches.Count > 0)
                {
                    DateTime time   = matches[0].Groups["time"].Value.GetTime(LogTimeFormat);
                    int      damage = matches[0].Groups["damage"].Value.GetDigits();
                    MyStatusEvent(this, new MyStatusEventArgs(line, time, MyStatus.BeBeaten2, damage + ""));
                }

                matches = 공격이반사되어대미지를받았습니다Regex.Matches(line);
                if (matches.Count > 0)
                {
                    DateTime time   = matches[0].Groups["time"].Value.GetTime(LogTimeFormat);
                    int      damage = matches[0].Groups["damage"].Value.GetDigits();
                    MyStatusEvent(this, new MyStatusEventArgs(line, time, MyStatus.BeBeaten3, damage + ""));
                    return;
                }

                //자힐.. 스킬..
                //만큼회복됐습니다Regex = new Regex(timeStampRegex + "(?<skill>.+)[을를] 사용해 (?<amount>[^a-zA-Z]+)만큼 (?<what>.+)[이가] 회복됐습니다", RegexOptions.Compiled);
                matches = 만큼회복됐습니다Regex.Matches(line);
                if (matches.Count > 0)
                {
                    DateTime time   = matches[0].Groups["time"].Value.GetTime(LogTimeFormat);
                    int      amount = matches[0].Groups["amount"].Value.GetDigits();
                    String   name   = LogParser.Myname;
                    String   skill  = matches[0].Groups["skill"].Value;

                    MyStatusEvent(this, new MyStatusEventArgs(line, time, MyStatus.Heal1, ""));

                    RecoverEvent(this, new RecoverEventArgs(line, time, name, null, skill, amount, (matches[0].Groups["what"].Value == "생명력")));
                    return;
                }

                // 사용해만큼회복했습니다... 내가 치유다.. 힐을한다
                // 2013.09.27 00:39:19 : 치유의 빛 VI을 사용해 소주전용풍이 1,615만큼 생명력을 회복했습니다.
                //만큼회복했습니다Regex = new Regex(timeStampRegex + "(?<skill>.+)[을를] 사용해 (?<name>.+)[이가] (?<amount>[^a-zA-Z]+)만큼 (?<what>.+)[을를] 회복했습니다", RegexOptions.Compiled);
                matches = 만큼회복했습니다Regex.Matches(line);
                if (matches.Count > 0)
                {
                    DateTime time   = matches[0].Groups["time"].Value.GetTime(LogTimeFormat);
                    int      amount = matches[0].Groups["amount"].Value.GetDigits();
                    String   who    = LogParser.Myname;
                    String   skill  = matches[0].Groups["skill"].Value;
                    String   name   = matches[0].Groups["name"].Value;
                    RecoverEvent(this, new RecoverEventArgs(line, time, name, who, skill, amount, (matches[0].Groups["what"].Value == "생명력")));
                    return;
                }



                //도트류? WHO가 없다.. 미분류 힐
                //효과로회복했습니다Regex = new Regex(timeStampRegex + "((?<name>.+)[이가] )?(?<skill>.+)의 효과로 (?<amount>[^a-zA-Z]+)의 (?<what>.+)을 회복했습니다", RegexOptions.Compiled);
                // 버그 : 2013.09.22 21:18:48 : 흑영귀-이스라펠이 고갈의 문양 폭발 III 추가 효과의 효과로 2,536의 생명력을 회복했습니다.
                matches = 추가효과의효과로회복했습니다Regex.Matches(line);
                if (matches.Count > 0)
                {
                    DateTime time   = matches[0].Groups["time"].Value.GetTime(LogTimeFormat);
                    int      amount = matches[0].Groups["amount"].Value.GetDigits();
                    String   name   = matches[0].Groups["name"].Value;
                    String   skill  = matches[0].Groups["skill"].Value;
                    if (name == "")
                    {
                        MyStatusEvent(this, new MyStatusEventArgs(line, time, MyStatus.Heal1, ""));
                        name = LogParser.Myname;
                    }
                    else if (name.IndexOf(" ") != -1)
                    {
                        return;
                    }

                    RecoverEvent(this, new RecoverEventArgs(line, time, name, null, skill, amount, (matches[0].Groups["what"].Value == "생명력")));
                    return;
                }

                matches = 효과로회복했습니다Regex.Matches(line);
                if (matches.Count > 0)
                {
                    DateTime time   = matches[0].Groups["time"].Value.GetTime(LogTimeFormat);
                    int      amount = matches[0].Groups["amount"].Value.GetDigits();
                    String   name   = matches[0].Groups["name"].Value;
                    String   skill  = matches[0].Groups["skill"].Value;
                    if (name == "")
                    {
                        MyStatusEvent(this, new MyStatusEventArgs(line, time, MyStatus.Heal1, ""));
                        name = LogParser.Myname;
                    }
                    else if (name.IndexOf(" ") != -1)
                    {
                        return;
                    }
                    RecoverEvent(this, new RecoverEventArgs(line, time, name, null, skill, amount, (matches[0].Groups["what"].Value == "생명력")));
                    return;
                }

                //사용해회복했습니다Regex = new Regex(timeStampRegex + "(?<name>.+)[이가] (?<skill>.+)[을를] 사용해 ((?<whom>.+)[이가] )?(?<amount>[^a-zA-Z]+)의 (?<what>.+)을 회복했습니다", RegexOptions.Compiled);
                //2013.09.22 21:11:40 : 나비가 온후한 울림 V을 사용해 에꾸가 1,778의 생명력을 회복했습니다.
                //2013.09.22 21:11:53 : 구라독종이 약초 치료 V을 사용해 818의 생명력을 회복했습니다.
                // 중요: 여기는 자기자신의 로그가 올수 없다. 자힐의 경우 만큼 회복이 된다
                // 치유의 기운이 소환: 치유의 기운 III을 사용해 깐따삐아가 394의 생명력을 회복했습니다.
                matches = 사용해회복했습니다Regex.Matches(line);
                if (matches.Count > 0)
                {
                    DateTime time   = matches[0].Groups["time"].Value.GetTime(LogTimeFormat);
                    int      amount = matches[0].Groups["amount"].Value.GetDigits();
                    String   skill  = matches[0].Groups["skill"].Value;
                    String   name   = matches[0].Groups["name"].Value;
                    String   who    = matches[0].Groups["whom"].Value;
                    // who가 있다면.. 실제회복한 사람은 who이다
                    if (String.IsNullOrEmpty(who) == false)
                    {
                        name = who;
                        who  = matches[0].Groups["name"].Value;
                    }

                    if (name.IndexOf(" ") != -1)
                    {
                        return;
                    }
                    RecoverEvent(this, new RecoverEventArgs(line, time, name, who, skill, amount, (matches[0].Groups["what"].Value == "생명력")));
                    return;
                }


                // 이것도 무조건 나만.. 사용해회복했습니다와 쌍을 이룬다.
                // 사용해회복했습니다 : 무조건 다른사람
                // 사용한영향으로회복됐습니다 : 무조건 나만
                //사용한영향으로회복됐습니다Regex = new Regex(timeStampRegex + "(?<name>.+)[이가] 사용한 (?<skill>.+)의 영향으로 (?<amount>[^a-zA-Z]+)의 (?<what>.+)[이가] 회복됐습니다", RegexOptions.Compiled);
                matches = 사용한영향으로회복됐습니다Regex.Matches(line);
                if (matches.Count > 0)
                {
                    DateTime time   = matches[0].Groups["time"].Value.GetTime(LogTimeFormat);
                    int      amount = matches[0].Groups["amount"].Value.GetDigits();
                    String   name   = LogParser.Myname;
                    String   skill  = matches[0].Groups["skill"].Value;
                    String   who    = matches[0].Groups["name"].Value;

                    MyStatusEvent(this, new MyStatusEventArgs(line, time, MyStatus.Heal2, ""));

                    RecoverEvent(this, new RecoverEventArgs(line, time, name, who, skill, amount, (matches[0].Groups["what"].Value == "생명력")));
                    return;
                }


                // 비약류?
                //방법없이회복했습니다Regex = new Regex(timeStampRegex + "((?<name>.+)[이가] )?(?<amount>[^a-zA-Z]+)의 (?<what>.+)을 회복했습니다", RegexOptions.Compiled);
                matches = 방법없이회복했습니다Regex.Matches(line);
                if (matches.Count > 0)
                {
                    DateTime time   = matches[0].Groups["time"].Value.GetTime(LogTimeFormat);
                    int      amount = matches[0].Groups["amount"].Value.GetDigits();
                    String   name   = matches[0].Groups["name"].Value;

                    if (String.IsNullOrEmpty(name))
                    {
                        MyStatusEvent(this, new MyStatusEventArgs(line, time, MyStatus.Heal3, ""));
                        name = LogParser.Myname;
                    }
                    RecoverEvent(this, new RecoverEventArgs(line, time, name, null, null, amount, (matches[0].Groups["what"].Value == "생명력")));
                    return;
                }



                matches = 속도를회복했습니다Regex.Matches(line);
                if (matches.Count > 0)
                {
                    DateTime time = matches[0].Groups["time"].Value.GetTime(LogTimeFormat);
                    String   name = matches[0].Groups["name"].Value;
                    String   what = matches[0].Groups["what"].Value;
                    if (matches[0].Groups["name"].Value == "")
                    {
                        MyStatusEvent(this, new MyStatusEventArgs(line, time, MyStatus.Repair1, what));
                    }
                    return;
                }


                matches = 사용한영향으로상태가됐습니다Regex.Matches(line);
                if (matches.Count > 0)
                {
                    DateTime time   = matches[0].Groups["time"].Value.GetTime(LogTimeFormat);
                    String   target = matches[0].Groups["target"].Value;
                    String   debuff = matches[0].Groups["debuff"].Value.Trim();
                    if (target == "")
                    {
                        MyStatusEvent(this, new MyStatusEventArgs(line, time, MyStatus.Debuff1, debuff));
                    }
                    return;
                }

                matches = 사용한영향으로기타등등Regex.Matches(line);
                if (matches.Count > 0)
                {
                    DateTime time   = matches[0].Groups["time"].Value.GetTime(LogTimeFormat);
                    String   debuff = matches[0].Groups["debuff"].Value.Trim();

                    MyStatusEvent(this, new MyStatusEventArgs(line, time, MyStatus.Status1, debuff));
                    return;
                }

                matches = 벗어났습니다Regex.Matches(line);
                if (matches.Count > 0)
                {
                    DateTime time   = matches[0].Groups["time"].Value.GetTime(LogTimeFormat);
                    String   name   = matches[0].Groups["name"].Value;
                    String   debuff = matches[0].Groups["debuff"].Value;

                    if (name == "")
                    {
                        MyStatusEvent(this, new MyStatusEventArgs(line, time, MyStatus.Repair2, debuff));
                    }
                    return;
                }

                matches = 사용해상태가됐습니다Regex.Matches(line);
                if (matches.Count > 0)
                {
                    DateTime time = matches[0].Groups["time"].Value.GetTime(LogTimeFormat);
                    if (matches[0].Groups["name"].Value == "")
                    {
                        MyStatusEvent(this, new MyStatusEventArgs(line, time, MyStatus.Status2, ""));
                    }
                    return;
                }

                matches = 내스킬을써서효과가발생했습니다Regex.Matches(line);
                if (matches.Count > 0)
                {
                    DateTime time = matches[0].Groups["time"].Value.GetTime(LogTimeFormat);
                    MyStatusEvent(this, new MyStatusEventArgs(line, time, MyStatus.Status3, ""));
                    return;
                }

                //효과가발동했습니다Regex
                matches = 효과가발동했습니다Regex.Matches(line);
                if (matches.Count > 0)
                {
                    DateTime time  = matches[0].Groups["time"].Value.GetTime(LogTimeFormat);
                    String   skill = matches[0].Groups["skill"].Value.Trim();

                    MyStatusEvent(this, new MyStatusEventArgs(line, time, MyStatus.Debuff2, skill));
                    return;
                }

                //2013-05-03
                matches = 사망했습니다Regex.Matches(line);
                if (matches.Count > 0)
                {
                    DateTime time   = matches[0].Groups["time"].Value.GetTime(LogTimeFormat);
                    String   name   = matches[0].Groups["name"].Value.Trim();
                    String   ignore = matches[0].Groups["ignore"].Value.Trim();
                    if (name == "")
                    {
                        MyStatusEvent(this, new MyStatusEventArgs(line, time, MyStatus.Die, null));
                    }
                    return;
                }

                //2013-05-24
                matches = 경험치를얻었습니다Regex.Matches(line);
                if (matches.Count > 0)
                {
                    DateTime time   = matches[0].Groups["time"].Value.GetTime(LogTimeFormat);
                    String   target = matches[0].Groups["target"].Value.Trim();
                    String   amount = matches[0].Groups["amount"].Value.Trim();
                    InstanceDungeonEvent(this, new InstanceDungeonEventArgs(line, time, 2, target, amount));
                    return;
                }


                matches = 삼자가자신의무엇가를변경했습니다Regex.Matches(line);
                if (matches.Count > 0)
                {
                    return;
                }

                matches = 무시Regex.Matches(line);
                if (matches.Count > 0)
                {
                    //tempEvent(this, new LogEventArgs(">>무시 " + line));
                    return;
                }

                matches = 명령표현Regex.Matches(line);
                if (matches.Count > 0)
                {
                    DateTime time   = matches[0].Groups["time"].Value.GetTime(LogTimeFormat);
                    String   name   = matches[0].Groups["name"].Value;
                    String   target = matches[0].Groups["target"].Value;

                    if (name == Myname && target != "" && target.IndexOf(" ") == -1)
                    {
                        ChatCommandEvent(this, new ChatCommandEventArgs(line, time, 1, target));
                    }
                    return;
                }


                matches = 감정표현Regex.Matches(line);
                if (matches.Count > 0)
                {
                    return;
                }
                tempEvent(this, new LogEventArgs(line));
            }
            catch
            {
            }
        }