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; }
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); }
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; }
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); }
public Character(uint id, RaceGenderClass raceGenderClass, uint level, string name, int guildId) { Id = id; RaceGenderClass = raceGenderClass; Level = level; Name = name; GuildId = guildId; }
internal LoginServerMessage(TeraMessageReader reader) : base(reader) { reader.Skip(10); RaceGenderClass = new RaceGenderClass(reader.ReadInt32()); Id = reader.ReadEntityId(); reader.Skip(268); Name = reader.ReadTeraString(); }
public override bool Equals(object obj) { var other = obj as UserSkill; if (other == null) { return(false); } return((Id == other.Id) && (RaceGenderClass.Equals(other.RaceGenderClass))); }
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(); }
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(); }
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))); }
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; }
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))); }
// 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); }
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(); }
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))); }
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); } } }
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); }
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); }
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); }
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); }
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}")); }
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}")); }
public UserSkill(int id, RaceGenderClass raceGenderClass, string name) : base(id, name) { RaceGenderClass = raceGenderClass; }
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}"); }
public override int GetHashCode() { return(Id + RaceGenderClass.GetHashCode()); }
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); } }
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}"); }