protected override void LoadFromImg(NameSpaceDirectory imgDir) { var file = imgDir.GetChild(ProviderName.Split('.')[1] + ".img"); foreach (var item in file as WzFileProperty) { var commodityBlob = item.Value as WzProperty; var templateId = commodityBlob.GetInt32("SN"); InsertItem(new CashCommodityTemplate(templateId) { CommodityID = Convert.ToInt32(item.Key), Bonus = commodityBlob.GetInt32("Bonus"), Gender = commodityBlob.GetInt32("Gender"), Count = commodityBlob.GetInt32("Count"), Period = commodityBlob.GetInt32("Period"), Priority = commodityBlob.GetInt32("Priority"), //ReqPOP = commodityBlob.GetInt32(""), //ReqLVL = commodityBlob.GetInt32(""), //PbCash = commodityBlob.GetInt32(""), //PbGift = commodityBlob.GetInt32(""), //PbPoint = commodityBlob.GetInt32(""), CashItemSN = commodityBlob.GetInt32("SN"), ItemID = commodityBlob.GetInt32("ItemId"), Price = commodityBlob.GetInt32("Price"), OnSale = commodityBlob.GetInt32("OnSale") > 0, Classification = commodityBlob.GetInt32("Class"), }); } }
private static string BuildWZContentsMap(NameSpaceDirectory root) { void processDir(JsonWriter w, NameSpaceDirectory dir) { w.WriteStartObject(); foreach (var nsf in dir.Files) { w.WritePropertyName(nsf.Name); w.WriteValue(nsf.Checksum); } foreach (var nsd in dir.SubDirectories) { w.WritePropertyName(nsd.Name); processDir(w, nsd); } w.WriteEndObject(); } var sb = new StringBuilder(); using (var sw = new StringWriter(sb)) using (var writer = new JsonTextWriter(sw)) { processDir(writer, root); } return(sb.ToString()); }
private void LoadInstall(NameSpaceDirectory nameSpaceDir) { if (nameSpaceDir is null) { throw new ArgumentNullException(nameof(nameSpaceDir)); } if (nameSpaceDir.Files.Count <= 0) { throw new ArgumentException("No files in directory.", nameof(nameSpaceDir)); } foreach (var itemTypeBlob in nameSpaceDir.Files) { foreach (var itemBlob in (WzFileProperty)itemTypeBlob.Object) { var infoProp = ((WzProperty)itemBlob.Value)["info"] as WzProperty; var itemTemplate = new InstallItemTemplate(Convert.ToInt32(itemBlob.Key)) { RecoveryHP = infoProp.GetInt32("recoveryMP"), RecoveryMP = infoProp.GetInt32("recoveryHP"), ReqLevel = infoProp.GetInt32("reqLevel"), TamingMob = infoProp.GetInt32("tamingMob"), }; FinishTemplate(itemTemplate, infoProp); InsertItem(itemTemplate); } } }
private static IEnumerable <Task> ExtractWZDir(NameSpaceDirectory dir, DirectoryInfo currentOutputDirectory) { foreach (var nsf in dir.Files) { yield return(Task.Run(() => { try { ExtractFile(nsf, currentOutputDirectory); } catch (Exception ex) { Console.WriteLine("ERROR {0}", ex); } })); } foreach (var nsd in dir.SubDirectories) { foreach (var task in ExtractWZDir(nsd, currentOutputDirectory.CreateSubdirectory(nsd.Name))) { yield return(task); } } }
protected override void LoadFromImg(NameSpaceDirectory imgDir) { foreach (var file in imgDir.Files) { switch (file.Name.Split('.')[0]) { case "Cash": case "Consume": case "Eqp": case "Etc": case "Ins": case "Pet": ProcessStringNameSpaceFile(StringDataType.Item, file); break; case "Map": ProcessStringNameSpaceFile(StringDataType.Map, file); break; case "Mob": ProcessStringNameSpaceFile(StringDataType.Mob, file); break; case "Npc": ProcessStringNameSpaceFile(StringDataType.Npc, file); break; case "Skill": ProcessStringNameSpaceFile(StringDataType.Skill, file); break; } } }
private void InsertDirectories(WZTreeNode parentNode, NameSpaceDirectory folder) { foreach (var dir in folder.SubDirectories) { var name = dir.Name; WZTreeNode node; if (parentNode.Nodes.ContainsKey(name)) { node = parentNode.Nodes[name] as WZTreeNode; } else { node = new WZTreeNode(); node.Name = name; node.Text = name; node.Tag = folder; parentNode.Nodes.Add(node); } InsertDirectories(node, dir); } InsertFiles(parentNode, folder); }
private void ProcessDirectory(NameSpaceDirectory currentDirectory) { var nodes = ReadCompressedInt(); for (var i = 0; i < nodes; i++) { var tmp = (int)Reader.BaseStream.Position; var type = Reader.ReadByte(); if (type > 4) { throw new Exception("Invalid type found while parsing directory."); } var isDir = (type & 1) == 1; NameSpaceNode node = isDir ? new NameSpaceDirectory() : (NameSpaceNode) new WzFile(this, currentDirectory); node.BeginParsePos = tmp; node.Name = Reader.ReadString(type <= 2, ContentsStart + 1); node.Size = ReadCompressedInt(); node.Checksum = ReadCompressedInt(); if (ReadLike_deMSwZ) { Reader.ReadUInt32(); // Ignore offset } else { node.OffsetInFile = ReadOffset(); if (node.OffsetInFile < 0) { throw new ArgumentOutOfRangeException("Offset not in file."); } } tmp = (int)Reader.BaseStream.Position; node.EndParsePos = tmp; currentDirectory.Add(node); #if DEBUG_ Console.Write(isDir ? "D" : "F"); Console.Write($" {node.Name,-30}: {node.BeginParsePos,-10} - {node.EndParsePos,-10} -"); Console.WriteLine(!isDir ? node.OffsetInFile.ToString() : ""); #endif } foreach (var subDirectory in currentDirectory.SubDirectories) { if (ReadLike_deMSwZ) { ProcessDirectory(subDirectory); } else { JumpAndReturn(subDirectory.OffsetInFile, () => ProcessDirectory(subDirectory)); } } }
protected override void LoadFromImg(NameSpaceDirectory imgDir) { foreach (var questBlob in imgDir.SubDirectories.First(item => item.Name.Equals("QuestData")).Files) { ProcessQuestData(questBlob.Object as WzFileProperty); } RegisterQuestDemand(imgDir.Files.First(item => item.Name.Equals("QuestInfo.img")).Object as WzFileProperty); }
private void IterateCashBundleItem(NameSpaceDirectory nameSpaceDir) { if (nameSpaceDir is null) { throw new ArgumentNullException(nameof(nameSpaceDir)); } if (nameSpaceDir.Files.Count <= 0) { throw new ArgumentException("No files in directory.", nameof(nameSpaceDir)); } foreach (var itemTypeBlob in nameSpaceDir.Files) { foreach (var item in (WzFileProperty)itemTypeBlob.Object) { var templateId = Convert.ToInt32(item.Key); var itemBlob = item.Value as WzProperty; var infoProp = itemBlob["info"] as WzProperty; var specProp = itemBlob["spec"] as WzProperty; CashItemTemplate itemTemplate; switch (templateId / 10_000) { case 524: itemTemplate = RegisterPetFoodItem(templateId, itemBlob); break; case 566: itemTemplate = new QuestDeliveryItemTemplate(templateId); // TODO break; case 530: itemTemplate = new MorphItemTemplate(templateId) { Price = infoProp.GetInt32("price"), HP = infoProp.GetInt32("hp"), Morph = infoProp.GetInt32("morph"), Time = infoProp.GetInt32("time"), }; break; default: { if (templateId / 1_000 == 5281) { itemTemplate = new AreaBuffItemTemplate(templateId) { RB = infoProp.Get("rb") as WzVector2D, LT = infoProp.Get("lt") as WzVector2D, Time = infoProp.GetInt32("time"), // TODO rest of prop stuff }; }
protected override void LoadFromImg(NameSpaceDirectory imgDir) { foreach (var npcNode in imgDir.Files) { var npcData = npcNode.Object as WzFileProperty; var pEntry = new NpcTemplate(Convert.ToInt32(npcNode.Name.Substring(0, 7))); AssignProviderAttributes(pEntry, npcData); InsertItem(pEntry); } }
// FixOffsets fills in the deMSwZ required offsets private void FixOffsets(ref int currentOffset, NameSpaceDirectory nsd) { foreach (var nameSpaceFile in nsd.Files) { nameSpaceFile.OffsetInFile = currentOffset; currentOffset += nameSpaceFile.Size; } foreach (var nameSpaceDirectory in nsd.SubDirectories) { FixOffsets(ref currentOffset, nameSpaceDirectory); } }
public void ExtractDirectory(NameSpaceDirectory pd, string currentOutputFolder) { var dir = Path.Combine(currentOutputFolder, pd.Name); if (!Directory.Exists(dir)) { Directory.CreateDirectory(dir); } foreach (var subDirectory in pd.SubDirectories) { ExtractDirectory(subDirectory, dir); } foreach (var file in pd.Files) { Reader.BaseStream.Position = file.OffsetInFile; using (var fs = new FileStream(Path.Combine(dir, file.Name), FileMode.Create)) { if (extractBuffer.Length < MaxBufferSize && file.Size > extractBuffer.Length) { // Figure out if we can expand the size var len = extractBuffer.Length; while (len > file.Size) { if (len >= MaxBufferSize) { break; } len *= 2; } if (len > extractBuffer.Length) { Array.Resize(ref extractBuffer, len); } } var bufferSize = Math.Min(file.Size, extractBuffer.Length); for (var pos = 0; pos < file.Size; pos += bufferSize) { var blobSize = Math.Min(file.Size - pos, bufferSize); Reader.Read(extractBuffer, 0, blobSize); fs.Write(extractBuffer, 0, blobSize); } } } }
protected override void LoadFromImg(NameSpaceDirectory imgDir) { var file = imgDir.GetChild(ProviderName.Split('.')[1] + ".img"); foreach (var item in file as WzFileProperty) { var packageBlob = item.Value as WzProperty; var templateId = Convert.ToInt32(item.Key); InsertItem(new CashPackageTemplate(templateId) { SNList = ((WzProperty)packageBlob["SN"]).GetAllChildren().Values.Select(Convert.ToInt64).ToArray() }); } }
// CItemInfo::IterateItemInfo protected override void LoadFromImg(NameSpaceDirectory imgDir) { IterateCashBundleItem(imgDir.SubDirectories.FirstOrDefault( dir => dir.Name.Equals("Cash"))); LoadPets(imgDir.SubDirectories.FirstOrDefault( dir => dir.Name.Equals("Pet"))); LoadInstall(imgDir.SubDirectories.FirstOrDefault( dir => dir.Name.Equals("Install"))); LoadEtc(imgDir.SubDirectories.FirstOrDefault( dir => dir.Name.Equals("Etc"))); LoadConsume(imgDir.SubDirectories.FirstOrDefault( dir => dir.Name.Equals("Consume"))); }
private void InsertFiles(TreeNode parentNode, NameSpaceDirectory folder) { var files = folder.Files.Where(x => x.Name.EndsWith(".img")).ToDictionary(x => x.Name, x => x); foreach (var kvp in files) { var name = kvp.Key; var node = new WZTreeNode(); node.Name = name; node.Text = name; node.Tag = kvp.Value; kvp.Value.TreeNode = node; node.SetNotLoaded(); parentNode.Nodes.Add(node); } }
private void LoadPets(NameSpaceDirectory nameSpaceDir) { if (nameSpaceDir is null) { throw new ArgumentNullException(nameof(nameSpaceDir)); } if (nameSpaceDir.Files.Count <= 0) { throw new ArgumentException("No files in directory.", nameof(nameSpaceDir)); } foreach (var itemBlob in nameSpaceDir.Files) { var infoProp = ((WzFileProperty)itemBlob.Object)["info"] as WzProperty; var itemTemplate = new PetItemTemplate(Convert.ToInt32(itemBlob.Name.Split('.')[0])) { Hungry = infoProp.GetInt32("hungry"), Life = infoProp.GetInt32("life"), NameTag = infoProp.GetInt32("nameTag"), ChatBalloon = infoProp.GetInt32("chatBalloon"), EvolReqItemID = infoProp.GetInt32("evolReqItemID"), EvolNo = infoProp.GetInt32("evolNo"), EvolReqPetLvl = infoProp.GetInt32("evolReqPetLvl"), LimitedLife = infoProp.GetInt32("limitedLife"), Permanent = infoProp.GetInt32("permanent") > 0, AutoReact = infoProp.GetInt32("autoReact") > 0, NoRevive = infoProp.GetInt32("noRevive") > 0, NoMoveToLocker = infoProp.GetInt32("noMoveToLocker") > 0, InteractByUserAction = infoProp.GetInt32("interactByUserAction") > 0, }; itemTemplate.Evol = new int[itemTemplate.EvolNo]; itemTemplate.EvolProb = new int[itemTemplate.EvolNo]; for (var i = 0; i < itemTemplate.Evol.Length; i++) { var num = i + 1; itemTemplate.Evol[i] = infoProp.GetInt32("evol" + num); itemTemplate.EvolProb[i] = infoProp.GetInt32("evolProb" + num); } FinishTemplate(itemTemplate, infoProp); InsertItem(itemTemplate); } }
private void InsertFiles(TreeNode parentNode, NameSpaceDirectory folder) { var files = folder.Files.Where(x => x.Name.EndsWith(".img")).OrderBy(x => x.Name); foreach (var file in files) { var name = file.Name; var node = new WZTreeNode(); node.Name = name; node.Text = name; node.Tag = file; node.SetNotLoaded(); parentNode.Nodes.Add(node); } parentNode.ToolTipText = $"Subnodes: {parentNode.Nodes.Count}"; }
private static void LoadFiles(NameSpaceDirectory parentNode, DirectoryInfo folder) { var files = folder.GetFiles("*.img") .AsParallel() .Where(x => !parentNode.Files.Exists(y => y.Name == x.Name)) .Select(file => { var name = file.Name; var node = new FSFile(); node.Size = (int)file.Length; node.Name = name; node.OffsetInFile = 0; node.RealPath = file.FullName; return(node); } ); parentNode.AddFiles(files.ToList()); }
public WzPackage(string packagePath, string packageKey, NameSpaceDirectory parent = null) { Selftest(); PackagePath = packagePath; PackageKey = packageKey ?? ""; CalculateOffset = DecodeOffset; Name = Path.GetFileNameWithoutExtension(packagePath); OffsetInFile = 0; Checksum = 0; Parent = parent ?? new NameSpaceDirectory() { // Root Name = "", Parent = null, SubDirectories = new List <NameSpaceDirectory> { }, }; ((NameSpaceDirectory)Parent).SubDirectories.Add(this); }
private static void LoadDirectories(NameSpaceDirectory parentNode, DirectoryInfo folder) { // Build structure out of dirs var dirNodes = folder.GetDirectories() .Where(x => !parentNode.SubDirectories.Exists(y => y.Name == x.Name)) .Select(dir => { var name = dir.Name; var node = new FSDirectory(); node.Size = 0; node.Name = name; node.OffsetInFile = 0; node.RealPath = folder.FullName; LoadDirectories(node, dir); return(node); } ); parentNode.AddDirectories(dirNodes); LoadFiles(parentNode, folder); }
protected override void LoadFromImg(NameSpaceDirectory imgDir) { const int mobIdLen = 7; foreach (var mobNode in imgDir.Files) { if (!mobNode.Name.EndsWith(".img")) { continue; // two entries are not mobs } var mobData = mobNode.Object as WzFileProperty; var nMobId = Convert.ToInt32(mobNode.Name.Substring(0, mobIdLen)); var infoData = mobData.GetChild("info") as WzProperty; var pEntry = new MobTemplate(nMobId) { //Exp = infoData.GetInt32(""), Level = infoData.GetInt8("level"), MaxHP = infoData.GetInt32("maxHP"), MaxMP = infoData.GetInt32("maxMP"), HpRecovery = infoData.GetInt32("hpRecovery"), MpRecovery = infoData.GetInt32("mpRecovery"), PAD = infoData.GetInt32("PADamage"), PDD = infoData.GetInt32("PDDamage"), MAD = infoData.GetInt32("MADamage"), MDD = infoData.GetInt32("MDDamage"), MDR = infoData.GetInt32("MDRate"), PDR = infoData.GetInt32("PDRate"), EVA = infoData.GetInt32("eva"), ACC = infoData.GetInt32("acc"), Exp = infoData.GetInt32("exp"), Boss = infoData.GetInt32("boss") > 0, DeadBuff = infoData.GetInt32("buff"), HPGaugeHide = infoData.GetInt32("hpGaugeHide") > 0, RemoveAfter = infoData.GetInt32("removeAfter"), HpTagBgColor = infoData.GetInt32("hpTagBgcolor"), HpTagColor = infoData.GetInt32("hpTagColor"), Invincible = infoData.GetInt32("invincible") > 0, Speed = infoData.GetInt32("speed") + 100, FlySpeed = infoData.GetInt32("flySpeed") + 100, ChaseSpeed = infoData.GetInt32("chaseSpeed") + 100, FixedDamage = infoData.GetInt32("fixedDamage"), DoNotRemove = infoData.GetInt32("doNotRemove") > 0 || infoData.GetInt32("HPgaugeHide") > 0, SelfDestructActionType = (infoData.GetChild("selfDestruction") as WzProperty)?.GetInt32("action") ?? 0, SelfDestructRemoveAfter = (infoData.GetChild("selfDestruction") as WzProperty)?.GetInt32("removeAfter") ?? 0, CannotEvade = infoData.GetInt32("cannotEvade") > 0, }; var link = infoData.GetInt32("link"); var linkProp = mobData; if (link > 0) // TODO { //var linkString = $"{link.ToString().PadLeft(7, '0')}.img"; //linkProp = imgDir.Files // .FirstOrDefault(f => f.Name.Equals(linkString)) // ?.Object as WzFileProperty; } if (linkProp.HasChild("fly")) { pEntry.MoveAbility = Common.Types.MobMoveType.Fly; } else { if (linkProp.HasChild("jump") && !linkProp.HasChild("move")) { pEntry.MoveAbility = Common.Types.MobMoveType.Jump; } else { pEntry.MoveAbility = linkProp.HasChild("move") ? Common.Types.MobMoveType.Move : Common.Types.MobMoveType.Stop; } } if (linkProp.GetChild("regen") is WzProperty regen) { pEntry.tRegenInterval = regen.GetAllChildren() .Values .Cast <WzProperty>() .Sum(item => item.GetInt32("delay")); } if (infoData.GetChild("revive") is WzProperty revive) { pEntry.Revive = revive.GetAllChildren() .Values .Select(Convert.ToInt32) .ToArray(); } if (infoData.GetChild("skill") is WzProperty skill) { pEntry.Skill = skill.GetAllChildren() .Values .Cast <WzProperty>() .Select(item => new MobTemplate.MobDataSkillTemplate { Action = item.GetInt32("action"), EffectAfter = item.GetInt32("effectAfter"), Skill = item.GetInt32("skill"), Level = item.GetInt32("level"), }) .ToArray(); } pEntry.DamagedElemAttr = new int[8]; var sElemAttr = infoData.GetString("elemAttr").ToLowerInvariant(); if (sElemAttr.Length > 0) { if (sElemAttr.Length % 2 != 0) { throw new InvalidOperationException("Wrong elemental attribute length for skill " + pEntry.TemplateId); } for (var i = 0; i < sElemAttr.Length; i += 2) { var aChars = sElemAttr.ToCharArray(); var nVal = aChars[i + 1]; switch (aChars[i]) { case 'd': pEntry.DamagedElemAttr[6] = int.Parse(nVal.ToString()); break; case 'f': pEntry.DamagedElemAttr[2] = int.Parse(nVal.ToString()); break; case 'h': pEntry.DamagedElemAttr[5] = int.Parse(nVal.ToString()); break; case 'i': pEntry.DamagedElemAttr[1] = int.Parse(nVal.ToString()); break; case 'l': pEntry.DamagedElemAttr[3] = int.Parse(nVal.ToString()); break; case 'p': pEntry.DamagedElemAttr[0] = int.Parse(nVal.ToString()); break; case 's': pEntry.DamagedElemAttr[4] = int.Parse(nVal.ToString()); break; case 'u': pEntry.DamagedElemAttr[7] = int.Parse(nVal.ToString()); break; } } } mobNode.Unload(); InsertItem(pEntry); } }
public WzFile(WzPackage package, NameSpaceDirectory parent) { _package = package; Parent = parent; }
protected override void LoadFromImg(NameSpaceDirectory imgDir) { foreach (var jobNode in imgDir.Files) { if (!int.TryParse(jobNode.Name.Split('.')[0], out _)) { continue; } var blob = jobNode.Object as WzFileProperty; var skillBlob = blob.GetChild("skill") as WzProperty; foreach (var rawSkillBlob in skillBlob) { var nSkillID = int.Parse(rawSkillBlob.Key); var skillData = rawSkillBlob.Value as WzProperty; var entry = new SkillTemplate(nSkillID) { IsWeaponBoosterSkill = SkillLogic.IsWeaponBoosterSkill(nSkillID), IsPartyBuff = SkillLogic.IsPartyBuff(nSkillID), IsWeaponChargeSkill = SkillLogic.IsWeaponChargeSkill(nSkillID), IsSharpEyesSkill = SkillLogic.IsSharpEyesSkill(nSkillID), IsStanceSkill = SkillLogic.get_stance_skill_id(nSkillID / 10000) == nSkillID, IsHyperBodySkill = SkillLogic.IsHyperBodySkill(nSkillID), IsDashSkill = SkillLogic.IsDashSkill(nSkillID), IsMapleWarriorSkill = SkillLogic.IsMapleWarriorSkill(nSkillID), IsNotBuff = SkillLogic.IsNotBuff(nSkillID), is_skill_need_master_level = SkillLogic.is_skill_need_master_level(nSkillID), is_heros_will_skill = SkillLogic.is_heros_will_skill(nSkillID), is_shoot_skill_not_consuming_bullet = SkillLogic.is_shoot_skill_not_consuming_bullet(nSkillID), is_keydown_skill = SkillLogic.is_keydown_skill(nSkillID), is_event_vehicle_skill = SkillLogic.is_event_vehicle_skill(nSkillID), is_antirepeat_buff_skill = SkillLogic.is_antirepeat_buff_skill(nSkillID), get_required_combo_count = SkillLogic.get_required_combo_count(nSkillID), HasAffected = skillData.HasChild("affected"), HasSpecial = skillData.HasChild("special"), Invisible = skillData.HasChild("invisible"), MasterLevel = skillData.GetInt32("masterLevel"), SkillType = skillData.GetInt32("skillType"), Weapon = skillData.GetInt32("weapon"), PsdSkill = skillData.GetInt32("psd"), IsPrepareAttackSkill = skillData.HasChild("prepare"), CanFinalAttack = skillData.HasChild("finalAttack") }; if (entry.TemplateId != (int)Skills.KNIGHT_COMBAT_ORDERS && !SkillLogic.IsBeginnerSkill(nSkillID)) { entry.CombatOrders = 2; } // verified if (skillData["summon"] is WzProperty summonProp) { entry.IsSummonSkill = true; if (summonProp["fly"] is WzProperty) { entry.IsFlySummonSkill = true; } if (summonProp["die"] is WzProperty summonDieProp) { if (summonDieProp["info"] is WzProperty summonDieInfoProp) { entry.SummonSkillDieAttackAfter = summonDieInfoProp.GetInt32("attackAfter"); entry.SummonSkillDieMobCount = summonDieInfoProp.GetInt32("mobCount"); entry.IsAttackOnDieSummonSkill = entry.SummonSkillDieMobCount != default; } } // in v95 there is one skill that has attack2 but it has the same values as attack1 so im not gonna bother parsing it if (summonProp["attack1"] is WzProperty summonAttackProp) { if (summonAttackProp["info"] is WzProperty summonAttackInfoProp) { entry.SummonSkillAttackAttackAfter = summonAttackInfoProp.GetInt32("attackAfter"); entry.SummonSkillAttackMobCount = summonAttackInfoProp.GetInt32("mobCount"); } } } // verified if (skillData["psdSkill"] is WzProperty psdSkills) { entry.AdditionPsd = psdSkills.GetAllChildren() .Values .Cast <WzProperty>() .Select(item => Convert.ToInt32(item.Name)) .ToArray(); } // verified if (skillData.HasChild("req")) { foreach (var skillId in skillData["req"] as WzProperty) { int nslv; if (skillId.Value is string) // some are strings some are int64 smh { nslv = int.Parse(skillId.Value.ToString()); } else { nslv = (int)skillId.Value; } entry.Req.Add(int.Parse(skillId.Key), nslv); // skill id, skill level } } // verified switch ((Skills)entry.TemplateId) { case Skills.WILDHUNTER_MINE_DUMMY_SUMMONED: case Skills.WILDHUNTER_SWALLOW_DUMMY_ATTACK: case Skills.WILDHUNTER_SWALLOW_DUMMY_BUFF: case Skills.MECHANIC_GATLING_UP: case Skills.MECHANIC_FLAMETHROWER_UP: case Skills.MECHANIC_ROBOROBO_DUMMY: entry.IsHiddenSkill = true; break; default: entry.IsHiddenSkill = skillData.GetString("info").TrimStart().StartsWith("(hid"); break; } // verified switch (skillData.GetString("elemAttr").ToLowerInvariant()) { case "f": entry.ElemAttr = ElemAttrType.Fire; break; case "i": entry.ElemAttr = ElemAttrType.Ice; break; case "s": entry.ElemAttr = ElemAttrType.Poison; break; case "h": entry.ElemAttr = ElemAttrType.Holy; break; case "l": entry.ElemAttr = ElemAttrType.Light; break; case "p": entry.ElemAttr = ElemAttrType.Physical; break; case "d": entry.ElemAttr = ElemAttrType.Dark; break; } if (skillData.HasChild("level")) { // verified var levelData = skillData["level"] as WzProperty; entry.MaxLevel = levelData.GetAllChildren().Count; ProcessSkillData(skillData["level"] as WzProperty, entry); } else { // verified var commonData = skillData["common"] as WzProperty; entry.MaxLevel = commonData.GetInt32("maxLevel"); ProcessSkillData(commonData, entry); } InsertItem(entry); } } }
protected override void LoadFromImg(NameSpaceDirectory imgDir) { foreach (var optionFile in imgDir.Files) { foreach (var optionNode in (WzFileProperty)optionFile.Object) { var templateId = Convert.ToInt32(optionNode.Key); // face expressions on hit if (templateId % 10_000 >= 901 && templateId % 10_000 <= 905) { continue; } switch (templateId) { case 20366: // invincible duration increase case 30366: // invincible duration increase case 30371: // invincible activate continue; } var optionProp = optionNode.Value as WzProperty; if (optionProp is null) { throw new NullReferenceException("Unexpected null option node."); } var itemOptionTemplate = new ItemOptionTemplate(templateId); if (optionProp["info"] is WzProperty infoProp) { itemOptionTemplate.ReqLevel = infoProp.GetInt32("reqLevel"); itemOptionTemplate.OptionType = infoProp.GetInt32("optionType"); } if (optionProp["level"] is WzProperty levelProp) { var itemOptionLevels = new List <ItemOptionLevelData>(); foreach (var levelNode in levelProp) { levelProp = levelNode.Value as WzProperty; var levelEntry = new ItemOptionLevelData { nIdx = Convert.ToInt32(levelProp.Name), nOptionType = itemOptionTemplate.TemplateId % 10_000, Prop = levelProp.GetInt32("prop"), Time = levelProp.GetInt32("time"), iSTR = levelProp.GetInt32("incSTR"), iDEX = levelProp.GetInt32("incDEX"), iINT = levelProp.GetInt32("incINT"), iLUK = levelProp.GetInt32("incLUK"), iHP = levelProp.GetInt32("HP"), iMP = levelProp.GetInt32("MP"), iMaxHP = levelProp.GetInt32("incMHP"), iMaxMP = levelProp.GetInt32("incMMP"), iACC = levelProp.GetInt32("incACC"), iEVA = levelProp.GetInt32("incEVA"), iSpeed = levelProp.GetInt32("incSpeed"), iJump = levelProp.GetInt32("incJump"), iPAD = levelProp.GetInt32("incPAD"), iMAD = levelProp.GetInt32("incMAD"), iPDD = levelProp.GetInt32("incPDD"), iMDD = levelProp.GetInt32("incMDD"), iSTRr = levelProp.GetInt32("incSTRr"), iDEXr = levelProp.GetInt32("incDEXr"), iINTr = levelProp.GetInt32("incINTr"), iLUKr = levelProp.GetInt32("incLUKr"), iMaxHPr = levelProp.GetInt32("incMHPr"), iMaxMPr = levelProp.GetInt32("incMMPr"), iACCr = levelProp.GetInt32("incACCr"), iEVAr = levelProp.GetInt32("incEVAr"), iPADr = levelProp.GetInt32("incPADr"), iMADr = levelProp.GetInt32("incMADr"), iPDDr = levelProp.GetInt32("incPDDr"), iMDDr = levelProp.GetInt32("incMDDr"), iCr = levelProp.GetInt32("incCr"), // these dont exist //iCDr = levelProp.GetInt32("reduceCooltime"), //iMAMr = levelProp.GetInt32("incMAMr"), iAllSkill = levelProp.GetInt32("incAllskill"), RecoveryHP = levelProp.GetInt32("RecoveryHP"), RecoveryMP = levelProp.GetInt32("RecoveryMP"), RecoveryUP = levelProp.GetInt32("RecoveryUP"), MPConReduce = levelProp.GetInt32("mpconReduce"), MPConRestore = levelProp.GetInt32("mpRestore"), IgnoreTargetDEF = levelProp.GetInt32("ignoreTargetDEF"), IgnoreDAM = levelProp.GetInt32("ignoreDAM"), IgnoreDAMr = levelProp.GetInt32("ignoreDAMr"), iDAMr = levelProp.GetInt32("incDAMr"), DAMReflect = levelProp.GetInt32("DAMreflect"), AttackType = levelProp.GetInt32("attackType"), iMesoProb = levelProp.GetInt32("incMesoProp"), iRewardProb = levelProp.GetInt32("incRewardProp"), Level = levelProp.GetInt32("level"), Boss = levelProp.GetInt32("boss"), // removing these cuz i dont want them // Emotion_angry = levelProp.GetString("face").ToLowerInvariant().Equals("angry"), // Emotion_cheer = levelProp.GetString("face").ToLowerInvariant().Equals("cheer"), // Emotion_love = levelProp.GetString("face").ToLowerInvariant().Equals("love"), // Emotion_blaze = levelProp.GetString("face").ToLowerInvariant().Equals("blaze"), // Emotion_glitter = levelProp.GetString("face").ToLowerInvariant().Equals("glitter"), }; itemOptionLevels.Add(levelEntry); } itemOptionTemplate.LevelData = itemOptionLevels.ToArray(); } InsertItem(itemOptionTemplate); } } }
protected override void LoadFromImg(NameSpaceDirectory imgDir) { var mapDir = imgDir.GetChild(ProviderName) as NameSpaceDirectory; foreach (var mapCatDir in mapDir.SubDirectories) { foreach (var imgFile in mapCatDir.Files) { var nMapId = int.Parse(imgFile.Name.Substring(0, 9)); var pEntry = new MapTemplate(nMapId); // get info node data if (imgFile.GetChild("info") is WzProperty infoNode) { pEntry.ForcedReturn = infoNode.GetInt32("forcedReturn"); pEntry.ReturnMap = infoNode.GetInt32("returnMap"); pEntry.FlyMap = infoNode.GetInt32("fly") > 0; pEntry.Town = infoNode.GetInt32("town") > 0; pEntry.OnFirstUserEnter = infoNode.GetString("onFirstUserEnter"); pEntry.OnUserEnter = infoNode.GetString("onUserEnter"); pEntry.DecHP = infoNode.GetInt32("decHP"); pEntry.DecMP = infoNode.GetInt32("decMP"); pEntry.DecInterval = infoNode.GetInt32("decInterval"); pEntry.ProtectItem = infoNode.GetInt32("protectItem"); pEntry.TimeLimit = infoNode.GetInt32("timeLimit"); pEntry.FieldLimit = (FieldOpt)infoNode.GetInt32("fieldLimit"); pEntry.FieldType = (FieldType)infoNode.GetInt32("fieldType"); } // get foothold node data if (imgFile.GetChild("foothold") is WzProperty fhNode) { var fhs = new List <MapFootholdTemplate>(); foreach (var fhNodeKvp in fhNode.GetAllChildren()) { var page = fhNodeKvp.Value as WzProperty; foreach (var mass in page.GetAllChildren()) { fhs.AddRange(((WzProperty)mass.Value).GetAllChildren() .Values .Cast <WzProperty>() .Select(fhImgData => new MapFootholdTemplate(Convert.ToInt32(fhImgData.Name)) { Next = fhImgData.GetInt8("next"), Prev = fhImgData.GetInt8("prev"), X1 = fhImgData.GetInt16("x1"), X2 = fhImgData.GetInt16("x2"), Y1 = fhImgData.GetInt16("y1"), Y2 = fhImgData.GetInt16("y2") })); } } pEntry.Footholds = fhs.ToArray(); } // get portal node data if (imgFile.GetChild("portal") is WzProperty portalNodes) { pEntry.Portals = portalNodes.GetAllChildren() .Values .Cast <WzProperty>() .Select(portalData => new MapPortalTemplate(Convert.ToInt32(portalData.GetName())) { nIndex = Convert.ToInt32(portalData.GetName()), sPortalName = portalData.GetString("pn"), sTargetName = portalData.GetString("tn"), Script = portalData.GetString("script"), nPortalType = portalData.GetInt32("pt"), nTargetMap = portalData.GetInt32("tm"), nX = portalData.GetInt16("x"), nY = portalData.GetInt16("y") }) .ToArray(); } // get life node data if (imgFile.GetChild("life") is WzProperty lifeNodes) { pEntry.Life = lifeNodes.GetAllChildren() .Values .Cast <WzProperty>() .Select(lifeData => new MapLifeTemplate(lifeData.GetInt32("id")) { CY = lifeData.GetInt16("cy"), Hide = lifeData.GetInt32("hide") > 0, F = lifeData.GetInt32("f") > 0, Foothold = lifeData.GetInt16("fh"), MobTime = lifeData.GetInt32("mobTime"), Type = lifeData.GetString("type"), RX0 = lifeData.GetInt16("rx0"), RX1 = lifeData.GetInt16("rx1"), X = lifeData.GetInt16("x"), Y = lifeData.GetInt16("y"), }) .ToArray(); } // get reactor node data if (imgFile.GetChild("reactor") is WzProperty reactorNodes) { pEntry.Reactors = reactorNodes.GetAllChildren() .Values .Cast <WzProperty>() .Where(item => !item.Name.Equals("trashremove") && !item.Name.Equals("endevent")) .Select(reactorData => new MapReactorTemplate(reactorData.GetInt32("id")) { SpawnIndex = Convert.ToInt32(reactorData.Name), Name = reactorData.GetString("name"), F = reactorData.GetInt32("f") > 0, ReactorTime = reactorData.GetInt32("reactorTime"), X = reactorData.GetInt16("x"), Y = reactorData.GetInt16("y") }) .ToArray(); } InsertItem(pEntry); imgFile.Unload(); } } }
/// <summary> /// All the img loading logic goes in here. This is called from the base class constructor. /// </summary> /// <param name="imgDir"></param> protected abstract void LoadFromImg(NameSpaceDirectory imgDir);
/// <summary> /// Calls LoadFromImg and then LockCollection. Outputs metrics to console. /// Requires an initialized WFileSystem object. /// </summary> /// <param name="baseFileSystem"></param> protected AbstractProvider(WzFileSystem baseFileSystem) { if (ProviderName is null || ProviderName.Length <= 0) { throw new ArgumentNullException(nameof(ProviderName)); } if (baseFileSystem is null) { throw new ArgumentNullException(nameof(baseFileSystem)); } if (baseFileSystem.SubDirectories.Count <= 0 && baseFileSystem.Files.Count <= 0) { throw new ArgumentException("No sub directories or files exist. Verify the file system has been initialized."); } var watch = new Stopwatch(); watch.Start(); _templates = new Dictionary <int, TItem>(); var jsonFileName = baseFileSystem.BaseDir + @"json\" + ProviderName + ".json"; var loadFromJson = LoadFromJSON && File.Exists(jsonFileName); #if DEBUG if (loadFromJson) { RetrieveJsonCache(jsonFileName); } else { #endif if (LoadFromJSON) { Log.Warn($"Unable to find {ProviderName} JSON. Fetching data from img instead."); } var dirs = ProviderName.Split('.'); if (dirs.Length <= 0) { throw new NullReferenceException("ProviderName is empty."); } NameSpaceDirectory baseImgDir = baseFileSystem.SubDirectories .FirstOrDefault(item => item.Name.Equals(dirs[0])) ?? throw new NullReferenceException($"Unable to find '{dirs[0]}' sub directory."); LoadFromImg(baseImgDir); SaveToJson(jsonFileName); baseImgDir.Files.ForEach(item => item.Unload()); #if DEBUG } #endif ProcessAdditionalData(); LockCollection(_templates.Values.ToList()); watch.Stop(); var time = $"{Math.Floor(watch.ElapsedMilliseconds * 0.001)}.{watch.ElapsedMilliseconds % 1000}"; var type = loadFromJson ? "json" : "img"; var nameSplit = ProviderName.Split('.'); Log.Info($"{nameSplit[nameSplit.Length - 1] + "Provider",-20} -> Loaded {Count,5} items from {type,4} in {time,5} seconds."); }
private void LoadConsume(NameSpaceDirectory nameSpaceDir) { if (nameSpaceDir is null) { throw new ArgumentNullException(nameof(nameSpaceDir)); } if (nameSpaceDir.Files.Count <= 0) { throw new ArgumentException("No files in directory.", nameof(nameSpaceDir)); } foreach (var itemTypeBlob in nameSpaceDir.Files) { foreach (var itemBlob in (WzFileProperty)itemTypeBlob.Object) { var itemBlobValue = (WzProperty)itemBlob.Value; var infoProp = itemBlobValue["info"] as WzProperty; var specProp = itemBlobValue["spec"] as WzProperty; var templateId = Convert.ToInt32(itemBlob.Key); var itemTemplate = new ConsumeItemTemplate(templateId); var inc = infoProp.GetInt32("inc"); itemTemplate.PetfoodInc = inc == 0 ? 100 : inc; itemTemplate.UnitPrice = Convert.ToDouble(infoProp.Get("unitPrice")); if (infoProp["skill"] is WzProperty skillProp) { itemTemplate.SkillData = skillProp .GetAllChildren() .Values .Cast <int>() .ToArray(); } itemTemplate.InfoType = infoProp.GetInt32("type"); if (itemBlobValue["mob"] is WzProperty mobProp) { itemTemplate.SummoningSackIDs = mobProp .GetAllChildren() .Values .Cast <WzProperty>() .Select(item => item.GetInt32("id")) .ToArray(); itemTemplate.SummoningSackProbs = mobProp .GetAllChildren() .Values .Cast <WzProperty>() .Select(item => item.GetInt32("prob")) .ToArray(); } itemTemplate.MasterLevel = infoProp.GetInt32("masterLevel"); itemTemplate.ReqSkillLevel = infoProp.GetInt32("reqSkillLevel"); itemTemplate.SuccessRate = infoProp.GetInt32("success"); itemTemplate.MonsterBook = infoProp.GetInt32("monsterBook") > 0; itemTemplate.CursedRate = infoProp.GetInt32("cursed"); itemTemplate.SuccessRate = infoProp.GetInt32("success"); itemTemplate.IncMHP = infoProp.GetInt32("incMHP"); itemTemplate.IncMMP = infoProp.GetInt32("incMMP"); itemTemplate.IncPAD = infoProp.GetInt32("incPAD"); itemTemplate.IncMAD = infoProp.GetInt32("incMAD"); itemTemplate.IncPDD = infoProp.GetInt32("incPDD"); itemTemplate.IncMDD = infoProp.GetInt32("incMDD"); itemTemplate.IncACC = infoProp.GetInt32("incACC"); itemTemplate.IncEVA = infoProp.GetInt32("incEVA"); itemTemplate.IncINT = infoProp.GetInt32("incINT"); itemTemplate.IncDEX = infoProp.GetInt32("incDEX"); itemTemplate.IncSTR = infoProp.GetInt32("incSTR"); itemTemplate.IncLUK = infoProp.GetInt32("incLUK"); itemTemplate.IncSpeed = infoProp.GetInt32("incSpeed"); itemTemplate.IncJump = infoProp.GetInt32("incJump"); itemTemplate.PreventSlip = infoProp.GetInt32("preventslip") > 0; itemTemplate.WarmSupport = infoProp.GetInt32("warmsupport") > 0; itemTemplate.IncCraft = infoProp.GetInt32("incCraft"); itemTemplate.Recover = infoProp.GetInt32("recover"); itemTemplate.RandStat = infoProp.GetInt32("randstat") > 0; itemTemplate.IncRandVol = infoProp.GetInt32("incRandVol"); if (specProp != null) { itemTemplate.HP = specProp.GetInt32("hp"); itemTemplate.MP = specProp.GetInt32("mp"); itemTemplate.HPR = specProp.GetInt32("hpR"); itemTemplate.MPR = specProp.GetInt32("mpR"); itemTemplate.EXP = specProp.GetInt32("exp"); itemTemplate.MHPR = specProp.GetInt32("mhpR"); itemTemplate.MMPR = specProp.GetInt32("mmpR"); itemTemplate.PAD = specProp.GetInt32("pad"); itemTemplate.MAD = specProp.GetInt32("mad"); itemTemplate.PDD = specProp.GetInt32("pdd"); itemTemplate.MDD = specProp.GetInt32("mdd"); itemTemplate.PADRate = specProp.GetInt32("padRate"); itemTemplate.MADRate = specProp.GetInt32("madRate"); itemTemplate.PDDRate = specProp.GetInt32("pddRate"); itemTemplate.MDDRate = specProp.GetInt32("mddRate"); itemTemplate.ACC = specProp.GetInt32("acc"); itemTemplate.EVA = specProp.GetInt32("eva"); itemTemplate.ACCRate = specProp.GetInt32("accR"); itemTemplate.EVARate = specProp.GetInt32("evaR"); itemTemplate.Speed = specProp.GetInt32("speed"); itemTemplate.Jump = specProp.GetInt32("jump"); itemTemplate.SpeedRate = specProp.GetInt32("speedRate"); itemTemplate.JumpRate = specProp.GetInt32("jumpRate"); itemTemplate.MoveTo = specProp.GetInt32("moveTo"); itemTemplate.IgnoreContinent = specProp.GetInt32("ignoreContinent") > 0; itemTemplate.Prob = specProp.GetInt32("prob"); itemTemplate.CP = specProp.GetInt32("cp"); itemTemplate.CPSkill = specProp.GetInt32("nuffSkill"); itemTemplate.Cure_Seal = specProp.GetInt32("seal") > 0; itemTemplate.Cure_Curse = specProp.GetInt32("curse") > 0; itemTemplate.Cure_Poison = specProp.GetInt32("poison") > 0; itemTemplate.Cure_Weakness = specProp.GetInt32("weakness") > 0; itemTemplate.Cure_Darkness = specProp.GetInt32("darkness") > 0; itemTemplate.ConsumeOnPickup = specProp.GetInt32("consumeOnPickup") > 0; // important to keep this check here to keep default value if attribute doesn't exist if (specProp.HasChild("BFSkill")) { itemTemplate.BFSkill = specProp.GetInt32("BFSkill"); } else { itemTemplate.BFSkill = -1; } itemTemplate.DojangShield = specProp.GetInt32("dojangshield"); itemTemplate.ExpInc = specProp.GetInt32("expinc"); itemTemplate.Morph = specProp.GetInt32("morph"); itemTemplate.ExpUpByItem = specProp.GetInt32("expBuff") > 0; itemTemplate.MesoUpByItem = specProp.GetInt32("mesoupbyitem") > 0; itemTemplate.ItemUpByItem = specProp.GetInt32("itemupbyitem") > 0; itemTemplate.ExpBuffRate = specProp.GetInt32("expBuff"); itemTemplate.ItemScript = specProp.GetString("script"); itemTemplate.Time = specProp.GetInt32("time"); // may collide with FinishTemplate?? } FinishTemplate(itemTemplate, infoProp); InsertItem(itemTemplate); } } }
private void LoadEtc(NameSpaceDirectory nameSpaceDir) { if (nameSpaceDir is null) { throw new ArgumentNullException(nameof(nameSpaceDir)); } if (nameSpaceDir.Files.Count <= 0) { throw new ArgumentException("No files in directory.", nameof(nameSpaceDir)); } foreach (var itemTypeBlob in nameSpaceDir.Files) { foreach (var itemBlob in (WzFileProperty)itemTypeBlob.Object) { var infoProp = ((WzProperty)itemBlob.Value)["info"] as WzProperty; var templateId = Convert.ToInt32(itemBlob.Key); AbstractItemTemplate itemTemplate; switch (templateId / 10_000) { case 425: itemTemplate = new GemEffectTemplate(templateId) { RandOption = infoProp.GetInt8("randOption"), RandStat = infoProp.GetInt8("randStat"), incReqLevel = infoProp.GetInt8("incReqLevel"), incDEX = infoProp.GetInt8("incDEX"), incSTR = infoProp.GetInt8("incSTR"), incLUK = infoProp.GetInt8("incLUK"), incINT = infoProp.GetInt8("incINT"), incPDD = infoProp.GetInt8("incPDD"), incMDD = infoProp.GetInt8("incMDD"), incPAD = infoProp.GetInt8("incPAD"), incMAD = infoProp.GetInt8("incMAD"), incEVA = infoProp.GetInt8("incEVA"), incACC = infoProp.GetInt8("incACC"), incMaxHP = infoProp.GetInt8("incMaxHP"), incMaxMP = infoProp.GetInt8("incMaxMP"), incSpeed = infoProp.GetInt8("incSpeed"), incJump = infoProp.GetInt8("incJump"), }; break; case 426: itemTemplate = new MonsterCrystalLevelTemplate(templateId) { lvMax = infoProp.GetInt32("lvMax"), lvMin = infoProp.GetInt32("lvMin"), }; break; default: { var consumeItems = new List <int>(); var consumeCounts = new List <int>(); var consumeItemNode = infoProp["consumeItem"] as WzProperty; if (consumeItemNode != null) { foreach (var node in consumeItemNode) { if (node.Value is WzProperty nodeValues) { consumeItems.Add(nodeValues.GetInt32("0")); consumeCounts.Add(nodeValues.GetInt32("1")); } else if (node.Key.Length <= 2) // pretty safe bet its a consume item { consumeItems.Add((int)node.Value); } } } itemTemplate = new EtcItemTemplate(templateId) { lv = infoProp.GetInt32("lv"), Exp = infoProp.GetInt32("exp"), Grade = infoProp.GetInt32("grade"), QuestID = infoProp.GetInt32("questId"), PickupBlock = infoProp.GetInt32("pickUpBlock") > 0, PQuest = infoProp.GetInt32("pquest") > 0, Hybrid = infoProp.GetInt32("hybrid") > 0, ConsumeItem = consumeItems.ToArray(), ConsumeItemExpGain = consumeCounts.ToArray(), ConsumeCount = consumeItemNode?.GetInt32("consumeCount") ?? 0, ConsumeMessage = consumeItemNode?.GetString("consumeCountMessage") ?? "", ShopCoin = infoProp.GetInt32("shopCoin") > 0, BigSize = infoProp.GetInt32("bigSize") > 0, }; } break; } FinishTemplate(itemTemplate, infoProp); InsertItem(itemTemplate); } } }
protected override void LoadFromImg(NameSpaceDirectory imgDir) { var tasks = new List <Task>(); foreach (var equipTypeDir in imgDir.SubDirectories) { if (equipTypeDir.Name.Equals("Afterimage")) { continue; } tasks.Add(Task.Run(() => { foreach (var equipFile in equipTypeDir.Files) { var templateId = Convert.ToInt32(equipFile.Name.Split('.')[0]); var equipBlob = equipFile.Object as WzFileProperty; var infoProp = equipBlob["info"] as WzProperty; var equipTemplate = new EquipTemplate(templateId) { Cash = infoProp.GetInt32("cash") > 0, Price = infoProp.GetInt32("price"), TradeBlock = infoProp.GetInt32("tradeBlock") > 0, NotSale = infoProp.GetInt32("notSale") > 0, Only = infoProp.GetInt32("only") > 0, TimeLimited = infoProp.GetInt32("timeLimited") > 0, ExpireOnLogout = infoProp.GetInt32("expireOnLogout") > 0, NotExtend = infoProp.GetInt32("notExtend") > 0, EquipTradeBlock = infoProp.GetInt32("equipTradeBlock") > 0, ReqLevel = infoProp.GetInt32("reqLevel"), TUC = infoProp.GetInt32("tuc"), incSTR = infoProp.GetInt32("incSTR"), incDEX = infoProp.GetInt32("incDEX"), incINT = infoProp.GetInt32("incINT"), incLUK = infoProp.GetInt32("incLUK"), incMHP = infoProp.GetInt32("incMHP"), incMMP = infoProp.GetInt32("incMMP"), incPAD = infoProp.GetInt32("incPAD"), incMAD = infoProp.GetInt32("incMAD"), incPDD = infoProp.GetInt32("incPDD"), incMDD = infoProp.GetInt32("incMDD"), incACC = infoProp.GetInt32("incACC"), incEVA = infoProp.GetInt32("incEVA"), incCraft = infoProp.GetInt32("incCraft"), incSpeed = infoProp.GetInt32("incSpeed"), incJump = infoProp.GetInt32("incJump"), }; InsertItem(equipTemplate); } })); } Task.WaitAll(tasks.ToArray()); //var tasks = new List<Task>(); //foreach (var equipTypeDir in imgDir.SubDirectories) //{ // if (equipTypeDir.Name.Equals("Afterimage")) continue; // //tasks.Add(Task.Run(() => // //{ // //})); // foreach (var equipFile in equipTypeDir.Files) // { // var templateId = Convert.ToInt32(equipFile.Name.Split('.')[0]); // var equipBlob = equipFile.Object as WzFileProperty; // var equipTemplate = new EquipTemplate(templateId); // AssignProviderAttributes(equipTemplate, equipBlob); // if (equipTemplate.TemplateId == 01032082) // { // ; // } // InsertItem(equipTemplate); // equipFile.Unload(); // } //} //Task.WaitAll(tasks.ToArray()); }