コード例 #1
0
 public UserSkill(int id, RaceGenderClass raceGenderClass, string name, bool?isChained = null, string detail = "")
     : base(id, name, isChained, detail)
 {
     RaceGenderClass = raceGenderClass;
     PlayerClass     = raceGenderClass.Class;
     Hit             = detail;
 }
コード例 #2
0
        internal SpawnUserServerMessage(TeraMessageReader reader)
            : base(reader)
        {
            reader.Skip(8);
            var nameOffset = reader.ReadUInt16();

            if (reader.Version > 306637)
            {
                reader.Skip(14);
            }
            else
            {
                reader.Skip(16);
            }
            ServerId = reader.ReadUInt32();
            // not sure, whether full uint32 is serverid, or only first 2 bytes and the rest part of it is actualy a part of PlayerId, or something else, but it always come along with PlayerID as complex player id
            PlayerId = reader.ReadUInt32();
            Id       = reader.ReadEntityId();
            Position = reader.ReadVector3f();
            Heading  = reader.ReadAngle();
            reader.Skip(4);
            RaceGenderClass = new RaceGenderClass(reader.ReadInt32());
            reader.Skip(11);
            Dead = (reader.ReadByte() & 1) == 0;
            reader.Skip(121);
            Level = reader.ReadInt16();
            reader.BaseStream.Position = nameOffset - 4;
            Name      = reader.ReadTeraString();
            GuildName = reader.ReadTeraString();
            //Debug.WriteLine(Name + ":" + BitConverter.ToString(BitConverter.GetBytes(Id.Id))+ ":"+ ServerId.ToString()+" "+ BitConverter.ToString(BitConverter.GetBytes(PlayerId))+" "+Dead);
        }
コード例 #3
0
 public UserSkill(int id, PlayerClass playerClass, string name, string hit, bool?ischained)
     : base(id, name, ischained, hit)
 {
     PlayerClass     = playerClass;
     RaceGenderClass = new RaceGenderClass(Race.Common, Gender.Common, playerClass);
     Hit             = hit;
 }
コード例 #4
0
        public Skill GetSkillByPetName(string name, RaceGenderClass rgc)
        {
            if (string.IsNullOrEmpty(name))
            {
                return(null);
            }
            foreach (var rgc2 in rgc.Fallbacks())
            {
                if (!_userSkilldata.ContainsKey(rgc2))
                {
                    continue;
                }

                var skill = _userSkilldata[rgc2].FirstOrDefault(x => x.Value.Name.Contains(name)).Value;
                if (skill == null)
                {
                    skill = _userSkilldata[rgc2].FirstOrDefault(x => name.Contains(x.Value.Name)).Value; //keen hb-7
                }
                if (skill == null)
                {
                    continue;
                }
                return(skill);
            }
            return(null);
        }
コード例 #5
0
 public Character(uint id, RaceGenderClass raceGenderClass, uint level, string name, int guildId)
 {
     Id = id;
     RaceGenderClass = raceGenderClass;
     Level           = level;
     Name            = name;
     GuildId         = guildId;
 }
コード例 #6
0
 internal LoginServerMessage(TeraMessageReader reader)
     : base(reader)
 {
     reader.Skip(10);
     RaceGenderClass = new RaceGenderClass(reader.ReadInt32());
     Id = reader.ReadEntityId();
     reader.Skip(268);
     Name = reader.ReadTeraString();
 }
コード例 #7
0
 internal LoginServerMessage(TeraMessageReader reader)
     : base(reader)
 {
     reader.Skip(10);
     RaceGenderClass = new RaceGenderClass(reader.ReadInt32());
     Id = reader.ReadEntityId();
     reader.Skip(268);
     Name = reader.ReadTeraString();
 }
コード例 #8
0
        public override bool Equals(object obj)
        {
            var other = obj as UserSkill;

            if (other == null)
            {
                return(false);
            }
            return((Id == other.Id) && (RaceGenderClass.Equals(other.RaceGenderClass)));
        }
コード例 #9
0
 internal SpawnUserServerMessage(TeraMessageReader reader)
     : base(reader)
 {
     reader.Skip(0x22);
     Id = reader.ReadEntityId();
     reader.Skip(18);
     RaceGenderClass = new RaceGenderClass(reader.ReadInt32());
     reader.Skip(208);
     Name      = reader.ReadTeraString();
     GuildName = reader.ReadTeraString();
 }
コード例 #10
0
 internal SpawnUserServerMessage(TeraMessageReader reader)
     : base(reader)
 {
     reader.Skip(0x22);
     Id = reader.ReadEntityId();
     reader.Skip(18);
     RaceGenderClass=new RaceGenderClass(reader.ReadInt32());
     reader.Skip(208);
     Name = reader.ReadTeraString();
     GuildName = reader.ReadTeraString();
 }
コード例 #11
0
        internal LoginServerMessage(TeraMessageReader reader)
            : base(reader)
        {
            int nameOffset = reader.ReadInt16();

            reader.Skip(8);
            RaceGenderClass = new RaceGenderClass(reader.ReadInt32());
            Id       = reader.ReadEntityId();
            ServerId = reader.ReadUInt32();// not sure, whether full uint32 is serverid, or only first 2 bytes and the rest part of it is actualy a part of PlayerId, or something else, but it always come along with PlayerID as complex player id
            PlayerId = reader.ReadUInt32();
            reader.Skip(nameOffset - 34);
            Name = reader.ReadTeraString();
//            Console.WriteLine(Name + ":" + BitConverter.ToString(BitConverter.GetBytes(Id.Id)) + ":" + ServerId.ToString() + " " + BitConverter.ToString(BitConverter.GetBytes(PlayerId)));
        }
コード例 #12
0
        public new void Process(ParsedMessage message)
        {
            base.Process(message);
            if (IsKnown || OpcodeFinder.Instance.IsKnown(message.OpCode))
            {
                if (OpcodeFinder.Instance.GetOpcode(OPCODE) == message.OpCode)
                {
                    Parse();
                }
                return;
            }
            if (message.Payload.Count < 2 + 1 + 4 + 2 + 2 + 2 + 2 + 1 + 4)
            {
                return;
            }
            var nameOffset = Reader.ReadUInt16();
            var unk        = Reader.ReadByte();
            var playerId   = Reader.ReadUInt32();
            var clas       = Reader.ReadUInt16();
            var race       = Reader.ReadUInt16();
            var gender     = Reader.ReadUInt16();
            var level      = Reader.ReadUInt16();
            var unk2       = Reader.ReadByte();

            if (level > 65)
            {
                return;
            }
            try
            {
                var rgc = new RaceGenderClass((Race)race, (Gender)gender, (PlayerClass)clas);
            }
            catch (Exception e) { return; }
            try
            {
                if (nameOffset != Reader.BaseStream.Position + 4)
                {
                    return;
                }
                var name = Reader.ReadTeraString();
            }
            catch (Exception e) { return; }
            if (Reader.BaseStream.Position != message.Payload.Count)
            {
                return;                                                     //TODO: test this
            }
            OpcodeFinder.Instance.SetOpcode(message.OpCode, OPCODE);
            LastApply = playerId;
        }
コード例 #13
0
        internal LoginServerMessage(TeraMessageReader reader)
            : base(reader)
        {
            int nameOffset = reader.ReadInt16();

            reader.Skip(8);
            RaceGenderClass = new RaceGenderClass(reader.ReadInt32());
            Id       = reader.ReadEntityId();
            ServerId = reader.ReadUInt32();
            PlayerId = reader.ReadUInt32();
            reader.Skip(27);
            Level = reader.ReadInt16();
            reader.BaseStream.Position = nameOffset - 4;
            Name = reader.ReadTeraString();
//            Debug.WriteLine(Name + ":" + BitConverter.ToString(BitConverter.GetBytes(Id.Id)) + ":" + ServerId.ToString() + " " + BitConverter.ToString(BitConverter.GetBytes(PlayerId)));
        }
コード例 #14
0
        // skillIds are reused across races and class, so we need a RaceGenderClass to disambiguate them
        public Skill GetOrNull(RaceGenderClass raceGenderClass, int skillId)
        {
            foreach (var rgc2 in raceGenderClass.Fallbacks())
            {
                if (!_userSkilldata.ContainsKey(rgc2))
                {
                    continue;
                }

                UserSkill skill;
                if (!_userSkilldata[rgc2].TryGetValue(skillId, out skill))
                {
                    continue;
                }
                return(skill);
            }
            return(null);
        }
コード例 #15
0
        internal LoginServerMessage(TeraMessageReader reader)
            : base(reader)
        {
            reader.Skip(10);
            RaceGenderClass = new RaceGenderClass(reader.ReadInt32());
            Id = reader.ReadEntityId();
            reader.Skip(4);
            PlayerId = reader.ReadUInt32();


            /*
             * reader.Skip(260);
             * Console.WriteLine(BitConverter.ToString(reader.ReadBytes(12)));
             */

            /*
             *  This network message doesn't have a fixed size between different region
             *
             */
            reader.Skip(220);

            var nameFirstBit = false;

            while (true)
            {
                var b = reader.ReadByte();
                if (b == 0x80)
                {
                    nameFirstBit = true;
                    continue;
                }
                if (b == 0x3F && nameFirstBit)
                {
                    break;
                }
                nameFirstBit = false;
            }

            reader.Skip(9);

            Name = reader.ReadTeraString();
        }
コード例 #16
0
ファイル: LoginServerMessage.cs プロジェクト: tuita520/Tera
        internal LoginServerMessage(TeraMessageReader reader)
            : base(reader)
        {
            if (reader.Factory.ReleaseVersion >= 8100 && reader.Factory.Version != 344895)
            {
                reader.Skip(4);                                                                            //ugly fix for both KR and EU/RU have 9901 releaseversion at the same time
            }
            int nameOffset = reader.ReadInt16();

            reader.Skip(8);
            RaceGenderClass = new RaceGenderClass(reader.ReadInt32());
            Id       = reader.ReadEntityId();
            ServerId = reader.ReadUInt32();
            PlayerId = reader.ReadUInt32();
            reader.Skip(27);
            Level = reader.ReadInt16();
            reader.BaseStream.Position = nameOffset - 4;
            Name = reader.ReadTeraString();
//            Debug.WriteLine(Name + ":" + BitConverter.ToString(BitConverter.GetBytes(Id.Id)) + ":" + ServerId.ToString() + " " + BitConverter.ToString(BitConverter.GetBytes(PlayerId)));
        }
コード例 #17
0
        public SkillDatabase(string directory, string reg_lang)
        {
            InitializeSkillDatabase(Path.Combine(directory, $"skills\\skills-override-{reg_lang}.tsv"));
            InitializeSkillDatabase(Path.Combine(directory, $"skills\\skills-{reg_lang}.tsv"));
            var gunner = new RaceGenderClass(Race.Common, Gender.Common, PlayerClass.Gunner);
            var bf     = GetOrNull(gunner, 51001);

            if (bf == null)
            {
                return;
            }
            for (int i = 1; i <= 5; i++)
            {
                var skill = new UserSkill(bf.Id + i, gunner, i == 5 ? bf.Name + "!" : bf.Name, bf.IsChained, i.ToString(), bf.IconName);
                if (!_userSkilldata[skill.RaceGenderClass].ContainsKey(skill.Id))
                {
                    _userSkilldata[skill.RaceGenderClass].Add(skill.Id, skill);
                }
            }
        }
コード例 #18
0
        public static void LoadStrSheetUserSkill()
        {
            int count = 0;

            foreach (var o in DC.GetMainObjectsByName("StrSheet_UserSkill"))
            {
                foreach (var data in (List <Dictionary <string, object> >)DC.GetValues(o)["String"])
                {
                    var rgc = new RaceGenderClass((string)data["race"], (string)data["gender"], (string)data["class"]);
                    int id  = int.Parse(data["id"].ToString());

                    if (!Strings.ContainsKey(rgc))
                    {
                        Strings.Add(rgc, new Dictionary <int, Dictionary <string, object> >());
                    }

                    Strings[rgc].Add(id, data);
                    count++;
                }
            }

            Console.WriteLine("Load {0} skill names...", count);
        }
コード例 #19
0
        internal SpawnUserServerMessage(TeraMessageReader reader)
            : base(reader)
        {
            reader.Skip(reader.Factory.ReleaseVersion >= 4500 ? 8 : 4);//not sure when account benefits array appeared there
            var nameOffset = reader.ReadUInt16();

            reader.Skip(reader.Factory.ReleaseVersion >= 4500 ? 14 : 16); //not sure when they deleted guild title
            ServerId = reader.ReadUInt32();
            PlayerId = reader.ReadUInt32();
            Id       = reader.ReadEntityId();
            Position = reader.ReadVector3f();
            Heading  = reader.ReadAngle();
            reader.Skip(4);                                                 //relation
            RaceGenderClass = new RaceGenderClass(reader.ReadInt32());
            reader.Skip(11);                                                // huntingZoneId, walkSpeed, runSpeed, actionMode, status, bool visible
            Dead = (reader.ReadByte() & 1) == 0;
            reader.Skip(reader.Factory.ReleaseVersion >= 4500 ? 121 : 105); // not sure when they added dye colors
            Level = reader.ReadInt16();
            reader.BaseStream.Position = nameOffset - 4;
            Name      = reader.ReadTeraString();
            GuildName = reader.ReadTeraString();
            //Debug.WriteLine(Name + ":" + BitConverter.ToString(BitConverter.GetBytes(Id.Id))+ ":"+ ServerId.ToString()+" "+ BitConverter.ToString(BitConverter.GetBytes(PlayerId))+" "+Dead);
        }
コード例 #20
0
        internal SpawnUserServerMessage(TeraMessageReader reader)
            : base(reader)
        {
            reader.Skip(8);
            var nameOffset = reader.ReadUInt16();

            reader.Skip(14);
            ServerId        = reader.ReadUInt32();
            PlayerId        = reader.ReadUInt32();
            Id              = reader.ReadEntityId();
            Position        = reader.ReadVector3f();
            Heading         = reader.ReadAngle();
            Relation        = (RelationType)reader.ReadInt32();
            RaceGenderClass = new RaceGenderClass(reader.ReadInt32());
            reader.Skip(11);
            Dead = reader.ReadByte() == 0;
            reader.Skip(121);
            Level = reader.ReadInt16();
            reader.BaseStream.Position = nameOffset - 4;
            Name      = reader.ReadTeraString();
            GuildName = reader.ReadTeraString();
            //Trace.WriteLine(Name + ":" + BitConverter.ToString(BitConverter.GetBytes(Id.Id))+ ":"+ ServerId.ToString()+" "+ BitConverter.ToString(BitConverter.GetBytes(PlayerId))+" "+Dead);
        }
コード例 #21
0
        public new void Process(ParsedMessage message)
        {
            base.Process(message);
            if (IsKnown || OpcodeFinder.Instance.IsKnown(message.OpCode))
            {
                return;
            }

            if (message.Payload.Count < 2 + 2 + 2 + 4 + 4 + 4 + 4 + 4 + 4 + 4 + 4 + 4 + 1 + 2 + 8 + 4)
            {
                return;
            }

            var count = Reader.ReadUInt16();

            if (count != 1)
            {
                return;
            }

            var offset = Reader.ReadUInt16();

            if (offset > 8)
            {
                return;
            }

            Reader.BaseStream.Position = offset;
            var nameOffset = Reader.ReadUInt16();
            var playerId   = Reader.ReadUInt32();
            var level      = Reader.ReadUInt32();

            if (level == 0 || level > 65)
            {
                return;
            }
            var race   = Reader.ReadUInt32();
            var clas   = Reader.ReadUInt32();
            var gender = Reader.ReadUInt32();

            try
            {
                var rgc = new RaceGenderClass((Race)race, (Gender)gender, (PlayerClass)clas);
            }
            catch (Exception e) { return; }
            var status = Reader.ReadUInt32();

            if (status != 0 && status != 2)
            {
                return;
            }
            var loc1       = Reader.ReadUInt32();
            var loc2       = Reader.ReadUInt32();
            var loc3       = Reader.ReadUInt32();
            var unk4       = Reader.ReadByte();
            var unk5       = Reader.ReadUInt16();
            var lastOnline = Reader.ReadUInt64();

            if (Reader.BaseStream.Position != nameOffset - 4)
            {
                return;
            }

            try
            {
                var name = Reader.ReadTeraString();
            }
            catch (Exception e) { return; }
            //maybe add checks for friend list
            OpcodeFinder.Instance.SetOpcode(message.OpCode, OPCODE);
        }
コード例 #22
0
ファイル: ExcelExport.cs プロジェクト: gkfnaleks/ShinraMeter
        private static ExcelHyperLink CreateUserSheet(ExcelWorkbook wb, Members user)
        {
            ExcelWorksheet ws  = wb.Worksheets.Add($"{user.playerName}");
            var            rgc = new RaceGenderClass("Common", "Common", user.playerClass);

            ws.DefaultRowHeight      = 30;
            ws.Cells.Style.Font.Size = 14;
            ws.Cells.Style.Font.Name = "Arial";
            AddImage(ws, 1, 1, ClassIcons.Instance.GetBitmap((PlayerClass)Enum.Parse(typeof(PlayerClass), user.playerClass)));
            ws.Cells[1, 2].Value                  = $"{user.playerServer}: {user.playerName}";
            ws.Cells[1, 2, 1, 10].Merge           = true;
            ws.Cells[1, 2, 1, 10].Style.Font.Bold = true;
            ws.Cells[2, 2].Value                  = "Skill";
            ws.Cells[2, 3].Value                  = "Damage %";
            ws.Cells[2, 4].Value                  = "Damage";
            ws.Cells[2, 5].Value                  = "Crit %";
            ws.Cells[2, 6].Value                  = "Hits";
            ws.Cells[2, 7].Value                  = "Max Crit";
            ws.Cells[2, 8].Value                  = "Min Crit";
            ws.Cells[2, 9].Value                  = "Avg Crit";
            ws.Cells[2, 10].Value                 = "Avg White";
            int i = 2;

            foreach (var stat in user.skillLog.OrderByDescending(x => long.Parse(x.skillTotalDamage)))
            {
                i++;
                var skill = BTD.SkillDatabase.GetOrNull(rgc, int.Parse(stat.skillId));
                if (skill == null)
                {
                    ws.Cells[i, 1].Value = i - 2;
                    ws.Cells[i, 2].Value = "Some pet skill";
                }
                else
                {
                    ws.Cells[i, 1].Value = i - 2;
                    AddImage(ws, i, 1, BTD.Icons.GetBitmap(skill.IconName));
                    ws.Cells[i, 2].Value = skill.Name;
                }
                ws.Cells[i, 3].Value = double.Parse(stat.skillDamagePercent) / 100;
                ws.Cells[i, 3].Style.Numberformat.Format = "0.0%";
                ws.Cells[i, 4].Value = long.Parse(stat.skillTotalDamage);
                ws.Cells[i, 4].Style.Numberformat.Format = @"#,#0,\k";
                ws.Cells[i, 5].Value = double.Parse(stat.skillCritRate) / 100;
                ws.Cells[i, 5].Style.Numberformat.Format = "0.0%";
                ws.Cells[i, 6].Value = long.Parse(stat.skillHits);
                ws.Cells[i, 7].Value = long.Parse(stat.skillHighestCrit);
                ws.Cells[i, 7].Style.Numberformat.Format = @"#,#0,\k";
                ws.Cells[i, 8].Value = long.Parse(stat.skillLowestCrit);
                ws.Cells[i, 8].Style.Numberformat.Format = @"#,#0,\k";
                ws.Cells[i, 9].Value = long.Parse(stat.skillAverageCrit);
                ws.Cells[i, 9].Style.Numberformat.Format = @"#,#0,\k";
                ws.Cells[i, 10].Value = long.Parse(stat.skillAverageWhite);
                ws.Cells[i, 10].Style.Numberformat.Format = @"#,#0,\k";
            }
            var border = ws.Cells[1, 1, i, 10].Style.Border;

            border.Bottom.Style = border.Top.Style = border.Left.Style = border.Right.Style = ExcelBorderStyle.Thick;
            ws.Cells[2, 1, i, 10].AutoFilter = true;

            int j = i + 3;

            ws.Cells[j, 2].Value                  = "Buff name";
            ws.Cells[j, 2, j, 9].Merge            = true;
            ws.Cells[j, 10].Value                 = "%";
            ws.Cells[j, 2, j, 10].Style.Font.Bold = true;
            foreach (var buf in user.buffUptime)
            {
                j++;
                var hotdot = BTD.HotDotDatabase.Get(int.Parse(buf.Key));
                ws.Cells[j, 1].Value = j - i - 3;
                AddImage(ws, j, 1, BTD.Icons.GetBitmap(hotdot.IconName));
                ws.Cells[j, 2].Value = hotdot.Name;
                if (!string.IsNullOrEmpty(hotdot.Tooltip))
                {
                    ws.Cells[j, 2].AddComment("" + hotdot.Tooltip, "info");
                }
                ws.Cells[j, 2, j, 9].Merge = true;
                ws.Cells[j, 10].Value      = double.Parse(buf.Value) / 100;
                ws.Cells[j, 10].Style.Numberformat.Format = "0%";
                if (!string.IsNullOrEmpty(hotdot.ItemName))
                {
                    ws.Cells[j, 10].AddComment("" + hotdot.ItemName, "info");
                }
            }
            border = ws.Cells[i + 3, 1, j, 10].Style.Border;
            border.Bottom.Style = border.Top.Style = border.Left.Style = border.Right.Style = ExcelBorderStyle.Thick;

            ws.Column(1).Width = 5.6;
            ws.Column(2).AutoFit();
            ws.Column(3).AutoFit();
            ws.Column(4).AutoFit();
            ws.Column(5).AutoFit();
            ws.Column(6).AutoFit();
            ws.Column(7).AutoFit();
            ws.Column(8).AutoFit();
            ws.Column(9).AutoFit();
            ws.Column(10).AutoFit();
            ws.Cells[1, 1, j, 10].Style.VerticalAlignment   = ExcelVerticalAlignment.Center;
            ws.Cells[1, 1, j, 10].Style.HorizontalAlignment = ExcelHorizontalAlignment.Center;
            ws.PrinterSettings.FitToPage = true;
            return(new ExcelHyperLink($"{user.playerName}!A1", $"{user.playerServer}: {user.playerName}"));
        }
コード例 #23
0
        private static ExcelHyperLink CreateUserSheet(ExcelWorkbook wb, Members user, ExtendedStats exdata,
                                                      ExcelWorksheet details)
        {
            var ws  = wb.Worksheets.Add($"{user.playerServer}_{user.playerName}");
            var rgc = new RaceGenderClass("Common", "Common", user.playerClass);

            ws.DefaultRowHeight      = 30;
            ws.Cells.Style.Font.Size = 14;
            ws.Cells.Style.Font.Name = "Arial";
            AddImage(ws, 1, 1,
                     ClassIcons.Instance.GetBitmap((PlayerClass)Enum.Parse(typeof(PlayerClass), user.playerClass)));
            ws.Cells[1, 2].Value                  = $"{user.playerServer}: {user.playerName}";
            ws.Cells[1, 2, 1, 11].Merge           = true;
            ws.Cells[1, 2, 1, 11].Style.Font.Bold = true;
            ws.Cells[2, 2].Value                  = LP.SkillName;
            ws.Cells[2, 3].Value                  = LP.DamagePercent;
            ws.Cells[2, 4].Value                  = LP.Damage;
            ws.Cells[2, 5].Value                  = LP.CritPercent;
            ws.Cells[2, 6].Value                  = LP.Hits;
            ws.Cells[2, 7].Value                  = LP.Crits;
            ws.Cells[2, 8].Value                  = LP.MaxCrit;
            ws.Cells[2, 9].Value                  = LP.MinCrit;
            ws.Cells[2, 10].Value                 = LP.AverageCrit;
            ws.Cells[2, 11].Value                 = LP.AvgWhite;
            var i = 2;

            foreach (var stat in exdata.PlayerSkillsAggregated[user.playerServer + "/" + user.playerName].OrderByDescending(x => x.Amount()))
            {
                i++;
                ws.Cells[i, 1].Value = i - 2;
                foreach (var skillInfo in stat.Skills)
                {
                    if (string.IsNullOrEmpty(skillInfo.Key.IconName))
                    {
                        continue;
                    }
                    AddImage(ws, i, 1, BTD.Icons.GetBitmap(skillInfo.Key.IconName));
                    break;
                }

                ws.Cells[i, 2].Value = stat.Name;
                ws.Cells[i, 3].Value = stat.DamagePercent() / 100;
                ws.Cells[i, 3].Style.Numberformat.Format = "0.0%";
                ws.Cells[i, 4].Value = stat.Amount();
                ws.Cells[i, 4].Style.Numberformat.Format = @"#,#0,\k";
                ws.Cells[i, 5].Value = stat.CritRate() / 100;
                ws.Cells[i, 5].Style.Numberformat.Format = "0.0%";
                ws.Cells[i, 6].Value = stat.Hits();
                ws.Cells[i, 7].Value = stat.Crits();
                ws.Cells[i, 8].Value = stat.BiggestCrit();
                ws.Cells[i, 8].Style.Numberformat.Format = @"#,#0,\k";
                ws.Cells[i, 9].Value = stat.LowestCrit();
                ws.Cells[i, 9].Style.Numberformat.Format = @"#,#0,\k";
                ws.Cells[i, 10].Value = stat.AvgCrit();
                ws.Cells[i, 10].Style.Numberformat.Format = @"#,#0,\k";
                ws.Cells[i, 11].Value = stat.AvgWhite();
                ws.Cells[i, 11].Style.Numberformat.Format = @"#,#0,\k";
            }
            var border = ws.Cells[1, 1, i, 11].Style.Border;

            border.Bottom.Style = border.Top.Style = border.Left.Style = border.Right.Style = ExcelBorderStyle.Thick;
            ws.Cells[2, 1, i, 11].AutoFilter = true;

            var j = i + 3;

            ws.Cells[j, 2].Value                  = LP.Name;
            ws.Cells[j, 2, j, 10].Merge           = true;
            ws.Cells[j, 11].Value                 = "%";
            ws.Cells[j, 2, j, 11].Style.Font.Bold = true;
            foreach (var buf in user.buffUptime)
            {
                j++;
                var hotdot = BTD.HotDotDatabase.Get(int.Parse(buf.Key));
                ws.Cells[j, 1].Value = j - i - 3;
                AddImage(ws, j, 1, BTD.Icons.GetBitmap(hotdot.IconName));
                ws.Cells[j, 2].Value = hotdot.Name;
                if (!string.IsNullOrEmpty(hotdot.Tooltip))
                {
                    ws.Cells[j, 2].AddComment("" + hotdot.Tooltip, "info");
                }
                ws.Cells[j, 2, j, 10].Merge = true;
                ws.Cells[j, 11].Value       = double.Parse(buf.Value) / 100;
                ws.Cells[j, 11].Style.Numberformat.Format = "0%";
                if (!string.IsNullOrEmpty(hotdot.ItemName))
                {
                    ws.Cells[j, 10].AddComment("" + hotdot.ItemName, "info");
                }
            }
            border = ws.Cells[i + 3, 1, j, 11].Style.Border;
            border.Bottom.Style = border.Top.Style = border.Left.Style = border.Right.Style = ExcelBorderStyle.Thick;

            AddCharts(ws, exdata, details, j);

            ws.Column(1).Width = 5.6;
            ws.Column(2).AutoFit();
            ws.Column(3).AutoFit();
            ws.Column(4).AutoFit();
            ws.Column(5).AutoFit();
            ws.Column(6).AutoFit();
            ws.Column(7).AutoFit();
            ws.Column(8).AutoFit();
            ws.Column(9).AutoFit();
            ws.Column(10).AutoFit();
            ws.Column(11).AutoFit();
            ws.Column(2).Width  = GetTrueColumnWidth(ws.Column(2).Width);
            ws.Column(3).Width  = GetTrueColumnWidth(ws.Column(3).Width);
            ws.Column(4).Width  = GetTrueColumnWidth(ws.Column(4).Width);
            ws.Column(5).Width  = GetTrueColumnWidth(ws.Column(5).Width);
            ws.Column(6).Width  = GetTrueColumnWidth(ws.Column(6).Width);
            ws.Column(7).Width  = GetTrueColumnWidth(ws.Column(7).Width);
            ws.Column(8).Width  = GetTrueColumnWidth(ws.Column(8).Width);
            ws.Column(9).Width  = GetTrueColumnWidth(ws.Column(9).Width);
            ws.Column(10).Width = GetTrueColumnWidth(ws.Column(10).Width);
            ws.Column(11).Width = GetTrueColumnWidth(ws.Column(11).Width);
            ws.Cells[1, 1, j, 11].Style.VerticalAlignment   = ExcelVerticalAlignment.Center;
            ws.Cells[1, 1, j, 11].Style.HorizontalAlignment = ExcelHorizontalAlignment.Center;
            ws.PrinterSettings.FitToPage = true;

            // I don't know why, but sometimes column height setting is lost.
            for (var x = 1; x < j; ++x)
            {
                ws.Row(x).CustomHeight = true;
                ws.Row(x).Height       = 30;
            }

            // If sheet name contains space character, name should be enclosed in single quotes.
            return(new ExcelHyperLink($"'{user.playerServer}_{user.playerName}'!A1",
                                      $"{user.playerServer}: {user.playerName}"));
        }
コード例 #24
0
ファイル: Skill.cs プロジェクト: kuko0411/TeraDamageMeter
 public UserSkill(int id, RaceGenderClass raceGenderClass, string name)
     : base(id, name)
 {
     RaceGenderClass = raceGenderClass;
 }
コード例 #25
0
ファイル: ExcelExport.cs プロジェクト: lunyx/CasualMeter
        private static ExcelHyperLink CreateUserSheet(ExcelWorkbook wb, Members user, TeraData teraData)
        {
            ExcelWorksheet ws = wb.Worksheets.Add($"{user.playerServer}_{user.playerName}");
            var rgc = new RaceGenderClass("Common", "Common", user.playerClass);
            ws.DefaultRowHeight = 30;
            ws.Cells.Style.Font.Size = 14;
            ws.Cells.Style.Font.Name = "Arial";
            AddImage(ws, 1, 1, Invert(new Bitmap(SettingsHelper.Instance.GetImage((PlayerClass)Enum.Parse(typeof(PlayerClass), user.playerClass)))));
            ws.Cells[1, 2].Value = $"{user.playerServer}: {user.playerName}";
            ws.Cells[1, 2, 1, 10].Merge = true;
            ws.Cells[1, 2, 1, 10].Style.Font.Bold = true;
            ws.Cells[2, 2].Value = "Skill";
            ws.Cells[2, 3].Value = "Damage %";
            ws.Cells[2, 4].Value = "Damage";
            ws.Cells[2, 5].Value = "Crit %";
            ws.Cells[2, 6].Value = "Hits";
            ws.Cells[2, 7].Value = "Max Crit";
            ws.Cells[2, 8].Value = "Min Crit";
            ws.Cells[2, 9].Value = "Avg Crit";
            ws.Cells[2, 10].Value = "Avg White";
            int i = 2;
            foreach (var stat in user.skillLog.OrderByDescending(x => long.Parse(x.skillTotalDamage)))
            {
                i++;
                var skill = teraData.SkillDatabase.GetOrNull(rgc, int.Parse(stat.skillId));
                if (skill == null)
                {
                    ws.Cells[i, 1].Value = i-2;
                    ws.Cells[i, 2].Value = "Some pet skill";
                }
                else
                {
                    ws.Cells[i, 1].Value = i - 2;
                    AddImage(ws, i, 1, BTD.Icons.GetBitmap(skill.IconName));
                    ws.Cells[i, 2].Value = skill.Name;
                }
                ws.Cells[i, 3].Value = double.Parse(stat.skillDamagePercent) / 100;
                ws.Cells[i, 3].Style.Numberformat.Format = "0.0%";
                ws.Cells[i, 4].Value = long.Parse(stat.skillTotalDamage);
                ws.Cells[i, 4].Style.Numberformat.Format = @"#,#0,\k";
                ws.Cells[i, 5].Value = double.Parse(stat.skillCritRate) / 100;
                ws.Cells[i, 5].Style.Numberformat.Format = "0.0%";
                ws.Cells[i, 6].Value = long.Parse(stat.skillHits);
                ws.Cells[i, 7].Value = long.Parse(stat.skillHighestCrit);
                ws.Cells[i, 7].Style.Numberformat.Format = @"#,#0,\k";
                ws.Cells[i, 8].Value = long.Parse(stat.skillLowestCrit);
                ws.Cells[i, 8].Style.Numberformat.Format = @"#,#0,\k";
                ws.Cells[i, 9].Value = long.Parse(stat.skillAverageCrit);
                ws.Cells[i, 9].Style.Numberformat.Format = @"#,#0,\k";
                ws.Cells[i, 10].Value = long.Parse(stat.skillAverageWhite);
                ws.Cells[i, 10].Style.Numberformat.Format = @"#,#0,\k";
            }
            var border = ws.Cells[1, 1, i, 10].Style.Border;
            border.Bottom.Style = border.Top.Style = border.Left.Style = border.Right.Style = ExcelBorderStyle.Thick;
            ws.Cells[2, 1, i, 10].AutoFilter = true;

            int j = i + 3;
            ws.Cells[j, 2].Value = "Buff name";
            ws.Cells[j, 2, j, 9].Merge = true;
            ws.Cells[j, 10].Value = "%";
            ws.Cells[j, 2, j, 10].Style.Font.Bold = true;
            foreach (var buf in user.buffUptime)
            {
                j++;
                var hotdot = teraData.HotDotDatabase.Get(int.Parse(buf.Key));
                ws.Cells[j, 1].Value = j - i - 3;
                AddImage(ws, j, 1, BTD.Icons.GetBitmap(hotdot.IconName));
                ws.Cells[j, 2].Value = hotdot.Name;
                if (!string.IsNullOrEmpty(hotdot.Tooltip)) ws.Cells[j, 2].AddComment("" + hotdot.Tooltip, "info");
                ws.Cells[j, 2, j, 9].Merge = true;
                ws.Cells[j, 10].Value = double.Parse(buf.Value) / 100;
                ws.Cells[j, 10].Style.Numberformat.Format = "0%";
                if (!string.IsNullOrEmpty(hotdot.ItemName)) ws.Cells[j, 10].AddComment("" + hotdot.ItemName, "info");
            }
            border = ws.Cells[i + 3, 1, j, 10].Style.Border;
            border.Bottom.Style = border.Top.Style = border.Left.Style = border.Right.Style = ExcelBorderStyle.Thick;

            ws.Column(1).Width = 5.6;
            ws.Column(2).AutoFit();
            ws.Column(3).AutoFit();
            ws.Column(4).AutoFit();
            ws.Column(5).AutoFit();
            ws.Column(6).AutoFit();
            ws.Column(7).AutoFit();
            ws.Column(8).AutoFit();
            ws.Column(9).AutoFit();
            ws.Column(10).AutoFit();
            ws.Column(2).Width = GetTrueColumnWidth(ws.Column(2).Width);
            ws.Column(3).Width = GetTrueColumnWidth(ws.Column(3).Width);
            ws.Column(4).Width = GetTrueColumnWidth(ws.Column(4).Width);
            ws.Column(5).Width = GetTrueColumnWidth(ws.Column(5).Width);
            ws.Column(6).Width = GetTrueColumnWidth(ws.Column(6).Width);
            ws.Column(7).Width = GetTrueColumnWidth(ws.Column(7).Width);
            ws.Column(8).Width = GetTrueColumnWidth(ws.Column(8).Width);
            ws.Column(9).Width = GetTrueColumnWidth(ws.Column(9).Width);
            ws.Column(10).Width = GetTrueColumnWidth(ws.Column(10).Width);
            ws.Cells[1, 1, j, 10].Style.VerticalAlignment = ExcelVerticalAlignment.Center;
            ws.Cells[1, 1, j, 10].Style.HorizontalAlignment = ExcelHorizontalAlignment.Center;
            ws.PrinterSettings.FitToPage = true;
            return new ExcelHyperLink($"'{user.playerServer}_{user.playerName}'!A1", $"{user.playerServer}: {user.playerName}");
        }
コード例 #26
0
 public override int GetHashCode()
 {
     return(Id + RaceGenderClass.GetHashCode());
 }
コード例 #27
0
ファイル: S_FRIEND_LIST.cs プロジェクト: RatedNoob/REEEEE
        public new void Process(ParsedMessage message)
        {
            base.Process(message);
            if (IsKnown || OpcodeFinder.Instance.IsKnown(message.OpCode))
            {
                if (OpcodeFinder.Instance.GetOpcode(OPCODE) == message.OpCode)
                {
                    Parse();
                }
                return;
            }
            if (message.Payload.Count < 2 + 2 + 2 + 4 + elementLength)
            {
                return;
            }
            var count = Reader.ReadUInt16();

            if (message.Payload.Count < 2 + 2 + 2 + 4 + elementLength * count)
            {
                return;
            }

            var offset             = Reader.ReadUInt16();
            var personalNoteOffset = Reader.ReadUInt16();

            if (Reader.BaseStream.Position != personalNoteOffset - 4)
            {
                return;
            }
            try { var personalNote = Reader.ReadTeraString(); }
            catch (Exception e) { return; }
            var list = new Dictionary <uint, string>();

            for (int i = 0; i < count; i++)
            {
                if (offset != Reader.BaseStream.Position + 4)
                {
                    return;
                }
                var currentOffset = Reader.ReadUInt16();
                if (currentOffset != offset)
                {
                    return;
                }
                var nextOffset      = Reader.ReadUInt16();
                var nameOffset      = Reader.ReadUInt16();
                var myNoteOffset    = Reader.ReadUInt16();
                var theirNoteOffset = Reader.ReadUInt16();
                var playerId        = Reader.ReadUInt32();
                var group           = Reader.ReadUInt32();
                var level           = Reader.ReadUInt32();
                if (level > 65)
                {
                    return;
                }
                var race   = Reader.ReadUInt32();
                var clas   = Reader.ReadUInt32();
                var gender = Reader.ReadUInt32();
                try { var rcg = new RaceGenderClass((Race)race, (Gender)gender, (PlayerClass)clas); }
                catch (Exception e) { return; }
                var loc1       = Reader.ReadUInt32();
                var loc2       = Reader.ReadUInt32();
                var loc3       = Reader.ReadUInt32();
                var unk1       = Reader.ReadByte();
                var lastOnline = Reader.ReadUInt64();
                var unk2       = Reader.ReadUInt32();
                var bonds      = Reader.ReadUInt32();
                if (bonds > 9999)
                {
                    return;
                }
                if (Reader.BaseStream.Position + 4 != nameOffset)
                {
                    return;
                }
                string name;
                try { name = Reader.ReadTeraString(); }
                catch (Exception e) { return; }
                if (Reader.BaseStream.Position + 4 != myNoteOffset)
                {
                    return;
                }
                try { var myNote = Reader.ReadTeraString(); }
                catch (Exception e) { return; }
                if (Reader.BaseStream.Position + 4 != theirNoteOffset)
                {
                    return;
                }
                try { var theirNote = Reader.ReadTeraString(); }
                catch (Exception e) { return; }
                offset = nextOffset;
                list.Add(playerId, name);
            }
            OpcodeFinder.Instance.SetOpcode(message.OpCode, OPCODE);
            Friends.Clear();
            foreach (var u in list)
            {
                Friends.Add(u.Key, u.Value);
            }
        }
コード例 #28
0
ファイル: ExcelExport.cs プロジェクト: neowutran/ShinraMeter
        private static ExcelHyperLink CreateUserSheet(ExcelWorkbook wb, Members user, ExtendedStats exdata,
            ExcelWorksheet details)
        {
            var ws = wb.Worksheets.Add($"{user.playerServer}_{user.playerName}");
            var rgc = new RaceGenderClass("Common", "Common", user.playerClass);
            ws.DefaultRowHeight = 30;
            ws.Cells.Style.Font.Size = 14;
            ws.Cells.Style.Font.Name = "Arial";
            AddImage(ws, 1, 1,
                ClassIcons.Instance.GetBitmap((PlayerClass) Enum.Parse(typeof(PlayerClass), user.playerClass)));
            ws.Cells[1, 2].Value = $"{user.playerServer}: {user.playerName}";
            ws.Cells[1, 2, 1, 11].Merge = true;
            ws.Cells[1, 2, 1, 11].Style.Font.Bold = true;
            ws.Cells[2, 2].Value = LP.SkillName;
            ws.Cells[2, 3].Value = LP.DamagePercent;
            ws.Cells[2, 4].Value = LP.Damage;
            ws.Cells[2, 5].Value = LP.CritPercent;
            ws.Cells[2, 6].Value = LP.Hits;
            ws.Cells[2, 7].Value = LP.Crits;
            ws.Cells[2, 8].Value = LP.MaxCrit;
            ws.Cells[2, 9].Value = LP.MinCrit;
            ws.Cells[2, 10].Value = LP.AverageCrit;
            ws.Cells[2, 11].Value = LP.AvgWhite;
            var i = 2;

            foreach (var stat in exdata.PlayerSkillsAggregated[user.playerServer+"/"+user.playerName].OrderByDescending(x => x.Amount()))
            {
                i++;
                ws.Cells[i, 1].Value = i - 2;
                foreach (var skillInfo in stat.Skills)
                {
                    if (string.IsNullOrEmpty(skillInfo.Key.IconName)) continue;
                    AddImage(ws, i, 1, BTD.Icons.GetBitmap(skillInfo.Key.IconName));
                    break;
                }

                ws.Cells[i, 2].Value = stat.Name;
                ws.Cells[i, 3].Value = stat.DamagePercent() / 100;
                ws.Cells[i, 3].Style.Numberformat.Format = "0.0%";
                ws.Cells[i, 4].Value = stat.Amount();
                ws.Cells[i, 4].Style.Numberformat.Format = @"#,#0,\k";
                ws.Cells[i, 5].Value = stat.CritRate() / 100;
                ws.Cells[i, 5].Style.Numberformat.Format = "0.0%";
                ws.Cells[i, 6].Value = stat.Hits();
                ws.Cells[i, 7].Value = stat.Crits();
                ws.Cells[i, 8].Value = stat.BiggestCrit();
                ws.Cells[i, 8].Style.Numberformat.Format = @"#,#0,\k";
                ws.Cells[i, 9].Value = stat.LowestCrit();
                ws.Cells[i, 9].Style.Numberformat.Format = @"#,#0,\k";
                ws.Cells[i, 10].Value = stat.AvgCrit();
                ws.Cells[i, 10].Style.Numberformat.Format = @"#,#0,\k";
                ws.Cells[i, 11].Value = stat.AvgWhite();
                ws.Cells[i, 11].Style.Numberformat.Format = @"#,#0,\k";
            }
            var border = ws.Cells[1, 1, i, 11].Style.Border;
            border.Bottom.Style = border.Top.Style = border.Left.Style = border.Right.Style = ExcelBorderStyle.Thick;
            ws.Cells[2, 1, i, 11].AutoFilter = true;

            var j = i + 3;
            ws.Cells[j, 2].Value = LP.Name;
            ws.Cells[j, 2, j, 10].Merge = true;
            ws.Cells[j, 11].Value = "%";
            ws.Cells[j, 2, j, 11].Style.Font.Bold = true;
            foreach (var buf in user.buffUptime)
            {
                j++;
                var hotdot = BTD.HotDotDatabase.Get(int.Parse(buf.Key));
                ws.Cells[j, 1].Value = j - i - 3;
                AddImage(ws, j, 1, BTD.Icons.GetBitmap(hotdot.IconName));
                ws.Cells[j, 2].Value = hotdot.Name;
                if (!string.IsNullOrEmpty(hotdot.Tooltip)) ws.Cells[j, 2].AddComment("" + hotdot.Tooltip, "info");
                ws.Cells[j, 2, j, 10].Merge = true;
                ws.Cells[j, 11].Value = double.Parse(buf.Value) / 100;
                ws.Cells[j, 11].Style.Numberformat.Format = "0%";
                if (!string.IsNullOrEmpty(hotdot.ItemName)) ws.Cells[j, 10].AddComment("" + hotdot.ItemName, "info");
            }
            border = ws.Cells[i + 3, 1, j, 11].Style.Border;
            border.Bottom.Style = border.Top.Style = border.Left.Style = border.Right.Style = ExcelBorderStyle.Thick;

            AddCharts(ws, exdata, details, j);

            ws.Column(1).Width = 5.6;
            ws.Column(2).AutoFit();
            ws.Column(3).AutoFit();
            ws.Column(4).AutoFit();
            ws.Column(5).AutoFit();
            ws.Column(6).AutoFit();
            ws.Column(7).AutoFit();
            ws.Column(8).AutoFit();
            ws.Column(9).AutoFit();
            ws.Column(10).AutoFit();
            ws.Column(11).AutoFit();
            ws.Column(2).Width = GetTrueColumnWidth(ws.Column(2).Width * scale);
            ws.Column(3).Width = GetTrueColumnWidth(ws.Column(3).Width * scale);
            ws.Column(4).Width = GetTrueColumnWidth(ws.Column(4).Width * scale);
            ws.Column(5).Width = GetTrueColumnWidth(ws.Column(5).Width * scale);
            ws.Column(6).Width = GetTrueColumnWidth(ws.Column(6).Width * scale);
            ws.Column(7).Width = GetTrueColumnWidth(ws.Column(7).Width * scale);
            ws.Column(8).Width = GetTrueColumnWidth(ws.Column(8).Width * scale);
            ws.Column(9).Width = GetTrueColumnWidth(ws.Column(9).Width * scale);
            ws.Column(10).Width = GetTrueColumnWidth(ws.Column(10).Width * scale);
            ws.Column(11).Width = GetTrueColumnWidth(ws.Column(11).Width * scale);
            ws.Cells[1, 1, j, 11].Style.VerticalAlignment = ExcelVerticalAlignment.Center;
            ws.Cells[1, 1, j, 11].Style.HorizontalAlignment = ExcelHorizontalAlignment.Center;
            ws.PrinterSettings.FitToPage = true;

            // I don't know why, but sometimes column height setting is lost.
            for (var x = 1; x <= j; ++x)
            {
                ws.Row(x).CustomHeight = true;
                ws.Row(x).Height = 30;
            }

            // If sheet name contains space character, name should be enclosed in single quotes.
            return new ExcelHyperLink($"'{user.playerServer}_{user.playerName}'!A1",
                $"{user.playerServer}: {user.playerName}");
        }
コード例 #29
0
 public UserSkill(int id, RaceGenderClass raceGenderClass, string name)
     : base(id, name)
 {
     RaceGenderClass = raceGenderClass;
 }