From dfaca9d238bef0d526c043f4f19963153b44034c Mon Sep 17 00:00:00 2001 From: rfi Date: Wed, 18 Oct 2023 21:45:13 +0700 Subject: [PATCH] uniniform anomaly table fix --- AscNet.Common/AscNet.Common.csproj | 5 +- AscNet.Common/Common.cs | 34 +++++++++++- AscNet.Common/Database/Character.cs | 81 +++++++++++++++++++++++++++++ AscNet.Common/MsgPack/Types.cs | 66 +++++++++++------------ AscNet.Common/Util/TableReader.cs | 4 +- AscNet.Table/TableGenerator.cs | 30 +++++++++-- AscNet/Program.cs | 1 + 7 files changed, 177 insertions(+), 44 deletions(-) create mode 100644 AscNet.Common/Database/Character.cs diff --git a/AscNet.Common/AscNet.Common.csproj b/AscNet.Common/AscNet.Common.csproj index f2442b7..cf41343 100644 --- a/AscNet.Common/AscNet.Common.csproj +++ b/AscNet.Common/AscNet.Common.csproj @@ -11,11 +11,10 @@ + - + diff --git a/AscNet.Common/Common.cs b/AscNet.Common/Common.cs index 1ca30dc..019767c 100644 --- a/AscNet.Common/Common.cs +++ b/AscNet.Common/Common.cs @@ -1,5 +1,7 @@ -using MongoDB.Driver; +using System.Reflection; +using MongoDB.Driver; using Config.Net; +using Newtonsoft.Json; namespace AscNet.Common { @@ -21,5 +23,35 @@ namespace AscNet.Common ); db = mongoClient.GetDatabase(config.Database.Name); } + + public static void DumpTables() + { + IEnumerable tableTypes = Assembly.GetAssembly(typeof(Table.client.activity.ActivityGroupTable))!.GetTypes().Where(t => t.BaseType?.Name == "TableReader`2"); + string baseSavePath = "/PGR_Data/"; + + foreach (Type type in tableTypes) + { + try + { + object? readerInstance = Activator.CreateInstance(type); + readerInstance?.GetType().GetMethod("Load", BindingFlags.Instance | BindingFlags.Public)?.Invoke(readerInstance, null); + object? values = type.GetProperty("All", BindingFlags.Instance | BindingFlags.Public)?.GetValue(readerInstance); + if (values is not null) + { + // this will create the folder on ur drive root sorry + string savePath = baseSavePath + string.Join("/", type.FullName!.Split(".").Skip(2)); + if (!Directory.Exists(Path.GetDirectoryName(savePath))) + Directory.CreateDirectory(Path.GetDirectoryName(savePath)!); + File.WriteAllText(new string(savePath.Take(savePath.Length - 11).ToArray()) + ".json", JsonConvert.SerializeObject(values, Formatting.Indented)); + Console.WriteLine(type.FullName); + } + + } + catch (Exception ex) + { + Console.WriteLine($"{type.FullName} failed!, {ex.Message}"); + } + } + } } } diff --git a/AscNet.Common/Database/Character.cs b/AscNet.Common/Database/Character.cs new file mode 100644 index 0000000..f5571e4 --- /dev/null +++ b/AscNet.Common/Database/Character.cs @@ -0,0 +1,81 @@ +using MongoDB.Bson; +using MongoDB.Bson.Serialization.Attributes; +using MongoDB.Driver; +using AscNet.Table.share.character; +using AscNet.Table.share.character.skill; +using AscNet.Common.MsgPack; + +namespace AscNet.Common.Database +{ +#pragma warning disable CS8618 // Non-nullable field must contain a non-null value when exiting constructor. Consider declaring as nullable. + public class Character + { + public static readonly IMongoCollection collection = Common.db.GetCollection("characters"); + + public static Character FromUid(long uid) + { + return collection.AsQueryable().FirstOrDefault(x => x.Uid == uid) ?? Create(uid); + } + + private static Character Create(long uid) + { + Character character = new() + { + Uid = uid, + Characters = new() + }; + character.AddCharacter(1021001); + + collection.InsertOne(character); + + return character; + } + + public void AddCharacter(uint id) + { + CharacterTable? character = CharacterTableReader.Instance.FromId((int)id); + CharacterSkillTable? characterSkill = CharacterSkillTableReader.Instance.FromCharacterId((int)id); + if (character is null || characterSkill is null) + throw new ArgumentException("Invlid character id!", nameof(id)); + NotifyCharacterDataList.NotifyCharacterDataListCharacterData characterData = new() + { + Id = (uint)character.Id, + Level = 1, + Exp = 0, + Quality = 1, + InitQuality = 1, + Star = 0, + Grade = 1, + FashionId = (uint)character.DefaultNpcFashtionId, + CreateTime = DateTimeOffset.Now.ToUnixTimeSeconds(), + TrustLv = 1, + TrustExp = 0, + Ability = 0, + LiberateLv = 1, + CharacterHeadInfo = new() + { + HeadFashionId = (uint)character.DefaultNpcFashtionId, + HeadFashionType = 0 + } + }; + characterData.SkillList.AddRange(characterSkill.SkillGroupId.Take(8).Select(x => new NotifyCharacterDataList.NotifyCharacterDataListCharacterData.NotifyCharacterDataListCharacterDataSkill() + { + Id = uint.Parse(x.ToString().Take(6).ToArray()), + Level = 1 + })); + + Characters.Add(characterData); + } + + [BsonId] + public ObjectId Id { get; set; } + + [BsonElement("uid")] + [BsonRequired] + public long Uid { get; set; } + + [BsonElement("uid")] + [BsonRequired] + public List Characters { get; set; } + } +} diff --git a/AscNet.Common/MsgPack/Types.cs b/AscNet.Common/MsgPack/Types.cs index 001474d..cab56c4 100644 --- a/AscNet.Common/MsgPack/Types.cs +++ b/AscNet.Common/MsgPack/Types.cs @@ -54,8 +54,8 @@ namespace AscNet.Common.MsgPack [MessagePackObject(true)] public partial class BaseEquipLoginData { - public object[] BaseEquipList { get; set; } - public object[] DressedList { get; set; } + public List BaseEquipList { get; set; } = new(); + public List DressedList { get; set; } = new(); } @@ -75,8 +75,8 @@ namespace AscNet.Common.MsgPack public long InitQuality { get; set; } public long Star { get; set; } public long Grade { get; set; } - public SkillList[] SkillList { get; set; } - public object[] EnhanceSkillList { get; set; } + public List SkillList { get; set; } = new(); + public List EnhanceSkillList { get; set; } = new(); public long FashionId { get; set; } public long CreateTime { get; set; } public long TrustLv { get; set; } @@ -109,9 +109,9 @@ namespace AscNet.Common.MsgPack public long Level { get; set; } public long Exp { get; set; } public long Breakthrough { get; set; } - public ResonanceInfo[] ResonanceInfo { get; set; } - public object[] UnconfirmedResonanceInfo { get; set; } - public object[] AwakeSlotList { get; set; } + public List ResonanceInfo { get; set; } = new(); + public List UnconfirmedResonanceInfo { get; set; } = new(); + public List AwakeSlotList { get; set; } = new(); public bool IsLock { get; set; } public long CreateTime { get; set; } public bool IsRecycle { get; set; } @@ -136,9 +136,9 @@ namespace AscNet.Common.MsgPack [MessagePackObject(true)] public partial class FubenLoginData { - public object[] TreasureData { get; set; } - public object[] LastPassStage { get; set; } - public object[] ChapterEventInfos { get; set; } + public List TreasureData { get; set; } = new(); + public List LastPassStage { get; set; } = new(); + public List ChapterEventInfos { get; set; } = new(); } [MessagePackObject(true)] @@ -146,8 +146,8 @@ namespace AscNet.Common.MsgPack { public Dictionary StageData { get; set; } public FubenBaseData FubenBaseData { get; set; } - public object[] UnlockHideStages { get; set; } - public object[] StageDifficulties { get; set; } + public List UnlockHideStages { get; set; } = new(); + public List StageDifficulties { get; set; } = new(); } [MessagePackObject(true)] @@ -183,16 +183,16 @@ namespace AscNet.Common.MsgPack public long CreateTime { get; set; } public long BestRecordTime { get; set; } public long LastRecordTime { get; set; } - public long[] BestCardIds { get; set; } - public long[] LastCardIds { get; set; } + public List BestCardIds { get; set; } = new(); + public List LastCardIds { get; set; } = new(); } [MessagePackObject(true)] public partial class FubenMainLineData { - public long[] TreasureData { get; set; } + public List TreasureData { get; set; } = new(); public Dictionary LastPassStage { get; set; } - public object[] MainChapterEventInfos { get; set; } + public List MainChapterEventInfos { get; set; } = new(); } [MessagePackObject(true)] @@ -277,7 +277,7 @@ namespace AscNet.Common.MsgPack public partial class SharePlatformConfigList { public long Id { get; set; } - public long[] SdkId { get; set; } + public List SdkId { get; set; } = new(); } [MessagePackObject(true)] @@ -313,27 +313,27 @@ namespace AscNet.Common.MsgPack public partial class NotifyLogin { public PlayerData PlayerData { get; set; } - public TimeLimitCtrlConfigList[] TimeLimitCtrlConfigList { get; set; } - public SharePlatformConfigList[] SharePlatformConfigList { get; set; } - public ItemList[] ItemList { get; set; } - public Dictionary ItemRecycleDict { get; set; } - public LoginCharacterList[] CharacterList { get; set; } - public EquipList[] EquipList { get; set; } - public FashionList[] FashionList { get; set; } - public HeadPortraitList[] HeadPortraitList { get; set; } + public List TimeLimitCtrlConfigList { get; set; } = new(); + public List SharePlatformConfigList { get; set; } = new(); + public List ItemList { get; set; } = new(); + public Dictionary> ItemRecycleDict { get; set; } = new(); + public List CharacterList { get; set; } = new(); + public List EquipList { get; set; } = new(); + public List FashionList { get; set; } = new(); + public List HeadPortraitList { get; set; } = new(); public BaseEquipLoginData BaseEquipLoginData { get; set; } public FubenData FubenData { get; set; } public FubenMainLineData FubenMainLineData { get; set; } public FubenLoginData FubenChapterExtraLoginData { get; set; } public FubenUrgentEventData FubenUrgentEventData { get; set; } - public object[] AutoFightRecords { get; set; } + public List AutoFightRecords { get; set; } = new(); public Dictionary TeamGroupData { get; set; } - public object TeamPrefabData { get; set; } - public SignInfo[] SignInfos { get; set; } - public object[] AssignChapterRecord { get; set; } - public object[] WeaponFashionList { get; set; } - public object[] PartnerList { get; set; } - public object[] ShieldedProtocolList { get; set; } + public dynamic TeamPrefabData { get; set; } + public List SignInfos { get; set; } = new(); + public List AssignChapterRecord { get; set; } = new(); + public List WeaponFashionList { get; set; } = new(); + public List PartnerList { get; set; } = new(); + public List ShieldedProtocolList { get; set; } = new(); public object LimitedLoginData { get; set; } public long UseBackgroundId { get; set; } public FubenLoginData FubenShortStoryLoginData { get; set; } @@ -2559,7 +2559,7 @@ namespace AscNet.Common.MsgPack public List SkillList { get; set; } = new(); public List EnhanceSkillList { get; set; } = new(); public UInt32 FashionId { get; set; } - public UInt32 CreateTime { get; set; } + public Int64 CreateTime { get; set; } public Int32 TrustLv { get; set; } public Int32 TrustExp { get; set; } public Int32 Ability { get; set; } diff --git a/AscNet.Common/Util/TableReader.cs b/AscNet.Common/Util/TableReader.cs index f39d28b..969fd8b 100644 --- a/AscNet.Common/Util/TableReader.cs +++ b/AscNet.Common/Util/TableReader.cs @@ -6,8 +6,8 @@ namespace AscNet.Common.Util public abstract class TableReader { public List All { get; set; } - private readonly Logger c = new(typeof(TableReader), nameof(TableReader), LogLevel.DEBUG, LogLevel.DEBUG); protected abstract string FilePath { get; } + private readonly Logger c = new(typeof(TableReader), nameof(TableReader), LogLevel.DEBUG, LogLevel.DEBUG); private static TSelf _instance; public static TSelf Instance @@ -26,7 +26,7 @@ namespace AscNet.Common.Util } } - protected abstract void Load(); + public abstract void Load(); } } diff --git a/AscNet.Table/TableGenerator.cs b/AscNet.Table/TableGenerator.cs index b6f2901..9881b4f 100644 --- a/AscNet.Table/TableGenerator.cs +++ b/AscNet.Table/TableGenerator.cs @@ -79,6 +79,7 @@ namespace AscNet.Table string file = $@"// namespace AscNet.Table{ns} {{ +#nullable enable public class {Path.GetFileName(table.Path).Split('.').First()}Table {{ {string.Join("\r\n\t\t", properties.Values)} @@ -87,14 +88,34 @@ namespace AscNet.Table{ns} public class {Path.GetFileName(table.Path).Split('.').First()}TableReader : global::AscNet.Common.Util.TableReader<{Path.GetFileName(table.Path).Split('.').First()}TableReader, {Path.GetFileName(table.Path).Split('.').First()}Table> {{ protected override string FilePath {{ get {{ return ""{string.Join("", table.Path.Replace("\\", "/").Split(new string[] {"/Resources/"}, StringSplitOptions.None).Skip(1))}""; }} }} - protected override void Load() + + public override void Load() {{ string tsvStr = global::System.Text.Encoding.UTF8.GetString(global::System.IO.File.ReadAllBytes(FilePath).Skip(128).ToArray()); - using var reader = new global::System.IO.StringReader(tsvStr.Replace(""\t"", "","")); + string[] tsvValues = tsvStr.Split('\t'); + string[] csvValues = new string[tsvValues.Length]; + for (int i = 0; i < tsvValues.Length; i++) + {{ + if (tsvValues[i].Contains("","")) + {{ + csvValues[i] = ""\"""" + tsvValues[i].Replace(""\"""", ""\""\"""") + ""\""""; + }} + else + {{ + csvValues[i] = tsvValues[i]; + }} + }} + using var reader = new global::System.IO.StringReader(string.Join("","", csvValues)); using var csv = new global::CsvHelper.CsvReader(reader, new global::CsvHelper.Configuration.CsvConfiguration(global::System.Globalization.CultureInfo.InvariantCulture) {{ BadDataFound = null, HeaderValidated = null, MissingFieldFound = null }}); csv.Context.RegisterClassMap<{Path.GetFileName(table.Path).Split('.').First()}TableMap>(); All = csv.GetRecords<{Path.GetFileName(table.Path).Split('.').First()}Table>().ToList(); }} +{string.Join("\r\n", properties.Values.Select(x => x.Split(' ')).Where(x => !x[1].Contains("<")).Select(property => $@" + public {Path.GetFileName(table.Path).Split('.').First()}Table? From{property[2]}({property[1]} val) + {{ + return All.FirstOrDefault(x => x.{property[2]} == val); + }} +"))} }} public sealed class {Path.GetFileName(table.Path).Split('.').First()}TableMap : global::CsvHelper.Configuration.ClassMap<{Path.GetFileName(table.Path).Split('.').First()}Table> @@ -106,10 +127,9 @@ namespace AscNet.Table{ns} Map(m => m.{x}).Convert(args => {{ {properties[x].Split(' ')[1]} tags = new {properties[x].Split(' ')[1]}(); - - for (int i = 1; i <= {listCount[x]}; i++) + {(nameList.Contains($"{x}[0]") ? $"for (int i = 0; i < {listCount[x]}; i++)" : $"for (int i = 1; i <= {listCount[x]}; i++)")} {{ - string tagValue = args.Row.GetField($""{x}[{{i}}]""); + string? tagValue = args.Row.GetField($""{x}[{{i}}]""); if (!string.IsNullOrEmpty(tagValue)) {{ {(properties[x].Split('<')[1].StartsWith("global::System.Int32") ? @" diff --git a/AscNet/Program.cs b/AscNet/Program.cs index 6f89188..5e669c1 100644 --- a/AscNet/Program.cs +++ b/AscNet/Program.cs @@ -18,6 +18,7 @@ namespace AscNet PacketFactory.LoadPacketHandlers(); Task.Run(Server.Instance.Start); SDKServer.SDKServer.Main(args); + Common.Common.DumpTables(); } } } \ No newline at end of file