コード例 #1
0
        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"),
                });
            }
        }
コード例 #2
0
ファイル: Program.cs プロジェクト: phantomeis/MapleManager
        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());
        }
コード例 #3
0
        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);
                }
            }
        }
コード例 #4
0
ファイル: Program.cs プロジェクト: phantomeis/MapleManager
        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);
                }
            }
        }
コード例 #5
0
        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;
                }
            }
        }
コード例 #6
0
ファイル: Form1.cs プロジェクト: xzkmxd/MapleManager
        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);
        }
コード例 #7
0
        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));
                }
            }
        }
コード例 #8
0
        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);
        }
コード例 #9
0
        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
                            };
                        }
コード例 #10
0
        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);
            }
        }
コード例 #11
0
        // 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);
            }
        }
コード例 #12
0
ファイル: WzPackage.cs プロジェクト: xzkmxd/MapleManager
        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);
                    }
                }
            }
        }
コード例 #13
0
        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()
                });
            }
        }
コード例 #14
0
        // 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")));
        }
コード例 #15
0
ファイル: Form1.cs プロジェクト: xzkmxd/MapleManager
        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);
            }
        }
コード例 #16
0
        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);
            }
        }
コード例 #17
0
ファイル: MainForm.cs プロジェクト: phantomeis/MapleManager
        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}";
        }
コード例 #18
0
        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());
        }
コード例 #19
0
        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);
        }
コード例 #20
0
        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);
        }
コード例 #21
0
        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);
            }
        }
コード例 #22
0
 public WzFile(WzPackage package, NameSpaceDirectory parent)
 {
     _package = package;
     Parent   = parent;
 }
コード例 #23
0
        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);
                }
            }
        }
コード例 #24
0
        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);
                }
            }
        }
コード例 #25
0
        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();
                }
            }
        }
コード例 #26
0
 /// <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);
コード例 #27
0
        /// <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.");
        }
コード例 #28
0
        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);
                }
            }
        }
コード例 #29
0
        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);
                }
            }
        }
コード例 #30
0
        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());
        }