Пример #1
0
        internal static unsafe NXNode ParseNode(NodeData *ptr, NXNode parent, NXFile file)
        {
            NXNode ret;

            switch (ptr->Type)
            {
            case 0:
                ret = new NXNode(ptr, file);
                break;

            case 1:
                ret = new NXInt64Node(ptr, file);
                break;

            case 2:
                ret = new NXDoubleNode(ptr, file);
                break;

            case 3:
                ret = new NXStringNode(ptr, file);
                break;

            case 4:
                ret = new NXPointNode(ptr, file);
                break;

            case 5:
                ret = new NXBitmapNode(ptr, file);
                break;

            case 6:
                ret = new NXAudioNode(ptr, file);
                break;

            default:
                return(Util.Die <NXNode>(string.Format("NX node has invalid type {0}; dying", ptr->Type)));
            }

            if ((file._flags & NXReadSelection.EagerParseFile) == NXReadSelection.EagerParseFile)
            {
                ret.CheckChild();
            }

            return(ret);
        }
Пример #2
0
        internal static unsafe NXNode ParseNode(NodeData *ptr, NXFile file)
        {
            NXNode ret;

            switch (ptr->Type)
            {
            case NXNodeType.Nothing:
                ret = new NXNode(ptr, file);
                break;

            case NXNodeType.Int64:
                ret = new NXInt64Node(ptr, file);
                break;

            case NXNodeType.Double:
                ret = new NXDoubleNode(ptr, file);
                break;

            case NXNodeType.String:
                ret = new NXStringNode(ptr, file);
                break;

            case NXNodeType.Point:
                ret = new NXPointNode(ptr, file);
                break;

            case NXNodeType.Bitmap:
                ret = new NXBitmapNode(ptr, file);
                break;

            case NXNodeType.Audio:
                ret = new NXAudioNode(ptr, file);
                break;

            default:
                return(Util.Die <NXNode>($"NX node has invalid type {ptr->Type}"));
            }

            if (file.HasFlag(NXReadSelection.EagerParseFile))
            {
                ret.InitialiseMap();
            }

            return(ret);
        }
Пример #3
0
        private void openToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (openFileDialog.ShowDialog() == DialogResult.OK)
            {
                try
                {
                    NXFile nx = new NXFile(openFileDialog.FileName);

                    TreeNode baseTreeNode = new TreeNode(openFileDialog.SafeFileName);
                    baseTreeNode.Tag = nx;
                    treeView.Nodes.Add(baseTreeNode);

                    IterateNodes(baseTreeNode, nx.BaseNode);
                }
                catch (Exception ex)
                {
                    string msg = string.Format("Unable to load {0}{1}{1}{2}", openFileDialog.SafeFileName, Environment.NewLine, ex.ToString());
                    MessageBox.Show(msg, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
        }
Пример #4
0
        private static void ExportItemNames(NXFile nxFile)
        {
            var sb = new StringBuilder();

            void printItemName(NXNode item)
            {
                var  hasName = item.ContainsChild("name");
                byte level   = 0;
                var  itemid  = int.Parse(item.Name.TrimStart('0'));

                if (Constants.isEquip(itemid))
                {
                    if (DataProvider.Equips.TryGetValue(itemid, out var ed))
                    {
                        level = ed.RequiredLevel;
                    }
                }

                sb.AppendFormat("{0}\t{1}\t{2}\r\n", itemid, hasName ? item["name"].ValueString() : "-- NO NAME --", level);
            }

            foreach (var cat in nxFile.BaseNode["String"]["Item.img"]["Eqp"])
            {
                foreach (var item in cat)
                {
                    printItemName(item);
                }
            }
            foreach (var cat in nxFile.BaseNode["String"]["Item.img"].Where(x => x.Name != "Eqp"))
            {
                foreach (var item in cat)
                {
                    printItemName(item);
                }
            }

            File.WriteAllText("ids-of-items.tsv", sb.ToString());
        }
Пример #5
0
    public static KeyValuePair <NXFile, List <NXFile> > GetMergedDatafiles()
    {
        var mainFile       = new NXFile(Path.Combine(Environment.CurrentDirectory, "..", "DataSvr", "Data.nx"));
        var overrideFolder = Path.Combine(Environment.CurrentDirectory, "..", "DataSvr", "data");
        var otherFiles     = new List <NXFile>();

        if (Directory.Exists(overrideFolder))
        {
            otherFiles.AddRange(Directory
                                .GetFiles(overrideFolder)
                                .Where(f => f.EndsWith(".nx"))
                                .Select(nxPath => new NXFile(nxPath))
                                );

            foreach (var nxFile in otherFiles)
            {
                Console.WriteLine("Importing " + nxFile.FilePath);
                mainFile.Import(nxFile);
            }
        }

        return(new KeyValuePair <NXFile, List <NXFile> >(mainFile, otherFiles));
    }
Пример #6
0
        public CachedMobs(NXFile dataFile)
        {
            foreach (NXNode mobNode in dataFile.ResolvePath("/Mob"))
            {
                MapleData.InfoNode = mobNode["info"];

                Mob mob = new Mob();

                mob.MapleID      = int.Parse(mobNode.Name.Replace(".img", ""));
                mob.Level        = MapleData.GetShort("level");
                mob.MaxHP        = MapleData.GetUInt("maxHP");
                mob.MaxMP        = MapleData.GetUInt("maxMP");
                mob.CurrentHP    = mob.MaxHP;
                mob.CurrentMP    = mob.MaxMP;
                mob.HpRecovery   = MapleData.GetUInt("hpRecovery");
                mob.MpRecovery   = MapleData.GetUInt("mpRecovery");
                mob.Experience   = MapleData.GetUInt("exp");
                mob.SummonType   = MapleData.GetShort("summonType");
                mob.Speed        = MapleData.GetShort("speed");
                mob.Accuracy     = MapleData.GetShort("acc");
                mob.Avoidability = MapleData.GetShort("eva");

                if (mobNode["info"].ContainsChild("revive"))
                {
                    mob.DeathSummons = new List <int>();

                    foreach (NXNode reviveNode in mobNode["info"]["revive"])
                    {
                        mob.DeathSummons.Add(int.Parse(reviveNode.Name));
                    }
                }

                // TODO: Skills, Attacks and Loots.

                this.Add(mob);
            }
        }
Пример #7
0
 public NXDataDirectory(NXFile file)
 => _file = file;
Пример #8
0
 public NXPointNode(NodeData *ptr, NXFile file) : base(ptr, file)
 {
 }
Пример #9
0
 public NXStringNode(NodeData *ptr, NXFile file) : base(ptr, file)
 {
 }
Пример #10
0
 public NXDoubleNode(NodeData *ptr, NXFile file) : base(ptr, file)
 {
 }
Пример #11
0
 public NXInt64Node(NodeData *ptr, NXFile file) : base(ptr, file)
 {
 }
Пример #12
0
        public void Load(string pPath)
        {
            DateTime Start = DateTime.Now;
            Logger.WriteLog(Logger.LogTypes.NX, "Caching NX files...");

            Equips = new Dictionary<int, EquipData>();
            Maps = new Dictionary<int, Map>();
            Mobs = new Dictionary<int, MobData>();
            TamingMobs = new Dictionary<int, TamingMobData>();

            CharacterNX = new NXFile(pPath + "\\Character.NX");
            //EtcNX = new NXFile("\\Etc.NX");
            //ItemNX = new NXFile("\\Item.NX");
            MobNX = new NXFile(pPath + "\\Mob.NX");
            MapNX = new NXFile(pPath + "\\Map.NX");
            //QuestNX = new NXFile("\\Quest.NX");
            //ReactorNX = new NXFile("\\Reactor.NX");
            //SkillNX = new NXFile("\\Skill.NX");
            //StringNX = new NXFile("\\String.NX");
            //TamingMobNX = new NXFile("\\TamingMob.NX");

            LoadMobs();
            LoadMaps();
            LoadEquips();
            LoadTamingMobs();

            CharacterNX.Dispose();
            MapNX.Dispose();
            MobNX.Dispose();

            DateTime Finish = DateTime.Now;

            Logger.WriteLog(Logger.LogTypes.NX, "Cached NX files in {0}ms.", (Finish-Start).Milliseconds);
        }
Пример #13
0
 public void LoadFile()
 {
     _nxFile = new NXFile(TestFileLoader.LoadTestFile());
 }
Пример #14
0
 internal unsafe NXNode(NodeData *ptr, NXFile file)
 {
     _nodeData = ptr;
     _file     = file;
 }
Пример #15
0
 public void DisposeFile()
 {
     _nxFile.Dispose();
     _nxFile = null;
 }
Пример #16
0
 public void LoadFile()
 {
     _nxFile = new NXFile(TestFileLoader.LoadTestFile());
 }
Пример #17
0
 internal unsafe NXNode(NodeData *ptr, NXFile file)
 {
     _nodeData  = ptr;
     _file      = file;
     _childinit = _nodeData->ChildCount == 0;
 }
Пример #18
0
 internal unsafe NXLazyValuedNode(NodeData *ptr, NXFile file) : base(ptr, file)
 {
 }
Пример #19
0
 internal NXValuedNode(string name, NXNode parent, NXFile file, T value, ushort childCount, uint firstChildId) : base(name, parent, file, childCount, firstChildId)
 {
     _value = value;
 }
Пример #20
0
 private static void LoadNX()
 {
     MapNx = new NXFile(@"C:\Nexon\NX 83\Map.nx");
 }
Пример #21
0
 public void DisposeFile()
 {
     _nxFile.Dispose();
     _nxFile = null;
 }
Пример #22
0
        public CachedItems(NXFile dataFile)
            : base()
        {
            foreach (NXNode categoryNode in dataFile.ResolvePath("/Character"))
            {
                if (categoryNode.Name == "Afterimage" || categoryNode.Name == "Face" || categoryNode.Name == "Hair" || categoryNode.Name.Contains(".img"))
                {
                    continue;
                }

                foreach (NXNode equipNode in categoryNode)
                {
                    MapleData.InfoNode = equipNode["info"];

                    Item item = new Item();

                    item.MapleID   = int.Parse(equipNode.Name.Replace(".img", ""));
                    item.IsCash    = MapleData.GetBool("cash");
                    item.SalePrice = MapleData.GetInt("price");

                    item.MaxUpgradesAvailable = MapleData.GetByte("tuc");

                    item.RequiredLevel        = MapleData.GetShort("reqLevel");
                    item.RequiredJob          = MapleData.GetShort("reqJob");
                    item.RequiredStrength     = MapleData.GetShort("reqSTR");
                    item.RequiredDexterity    = MapleData.GetShort("reqDEX");
                    item.RequiredIntelligence = MapleData.GetShort("reqINT");
                    item.RequiredLuck         = MapleData.GetShort("reqLUK");

                    item.Strength      = MapleData.GetShort("incSTR");
                    item.Dexterity     = MapleData.GetShort("incDEX");
                    item.Intelligence  = MapleData.GetShort("incINT");
                    item.Luck          = MapleData.GetShort("incLUK");
                    item.MP            = MapleData.GetShort("incHP");
                    item.MP            = MapleData.GetShort("incMP");
                    item.WeaponAttack  = MapleData.GetShort("incPAD");
                    item.WeaponDefense = MapleData.GetShort("incPDD");
                    item.MagicAttack   = MapleData.GetShort("incMAD");
                    item.MagicDefense  = MapleData.GetShort("incMDD");
                    item.Speed         = MapleData.GetShort("incSpeed");
                    item.Jump          = MapleData.GetShort("incJump");
                    item.Accuracy      = MapleData.GetShort("incACC");
                    item.Avoidability  = MapleData.GetShort("incEVA");

                    this.Add(item);
                }
            }

            foreach (NXNode categoryNode in dataFile.ResolvePath("/Item"))
            {
                if (categoryNode.Name == "Pet" || categoryNode.Name == "Special")
                {
                    continue;
                }

                foreach (NXNode containNode in categoryNode)
                {
                    foreach (NXNode itemNode in containNode)
                    {
                        Item item = new Item();

                        item.MapleID = int.Parse(itemNode.Name
                                                 .Replace(".img", ""));

                        if (!itemNode.ContainsChild("info"))
                        {
                            item.MaxPerStack = 1;
                            item.IsCash      = false;

                            this.Add(item);
                        }
                        else
                        {
                            MapleData.InfoNode = itemNode["info"];

                            item.MesoReward  = MapleData.GetInt("meso");
                            item.IsCash      = MapleData.GetBool("cash");
                            item.MaxPerStack = MapleData.GetShort("maxSlot");
                            item.SalePrice   = MapleData.GetInt("price");

                            item.Success        = MapleData.GetInt("success");
                            item.BreakItem      = MapleData.GetInt("cursed");
                            item.IStrength      = MapleData.GetShort("incSTR");
                            item.IDexterity     = MapleData.GetShort("incDEX");
                            item.IIntelligence  = MapleData.GetShort("incINT");
                            item.ILuck          = MapleData.GetShort("incLUK");
                            item.IHP            = MapleData.GetShort("incMHP");
                            item.IMP            = MapleData.GetShort("incMMP");
                            item.IWeaponAttack  = MapleData.GetShort("incPAD");
                            item.IMagicAttack   = MapleData.GetShort("incMAD");
                            item.IWeaponDefense = MapleData.GetShort("incPDD");
                            item.IMagicDefense  = MapleData.GetShort("incMDD");
                            item.IAccuracy      = MapleData.GetShort("incACC");
                            item.IAvoidability  = MapleData.GetShort("incEVA");
                            item.IJump          = MapleData.GetShort("incJump");
                            item.ISpeed         = MapleData.GetShort("incSpeed");

                            if (itemNode.ContainsChild("spec"))
                            {
                                MapleData.InfoNode = itemNode["spec"];

                                item.CMoveTo = MapleData.GetInt("moveTo");

                                byte cureFlags = 0x00;

                                if (itemNode["spec"].ContainsChild("curse"))
                                {
                                    cureFlags += 0x01;
                                }
                                if (itemNode["spec"].ContainsChild("seal"))
                                {
                                    cureFlags += 0x02;
                                }
                                if (itemNode["spec"].ContainsChild("weakness"))
                                {
                                    cureFlags += 0x04;
                                }
                                if (itemNode["spec"].ContainsChild("darkness"))
                                {
                                    cureFlags += 0x08;
                                }
                                if (itemNode["spec"].ContainsChild("poison"))
                                {
                                    cureFlags += 0x10;
                                }

                                item.CFlags = cureFlags;

                                item.CHP           = MapleData.GetShort("hp");
                                item.CMP           = MapleData.GetShort("mp");
                                item.CHPPercentage = MapleData.GetShort("hpR");
                                item.CMPPercentage = MapleData.GetShort("mpR");
                                item.CSpeed        = MapleData.GetShort("speed");
                                item.CAvoid        = MapleData.GetShort("eva");
                                item.CAccuracy     = MapleData.GetShort("acc");
                                item.CWeaponAttack = MapleData.GetShort("pad");
                                item.CMagicAttack  = MapleData.GetShort("mad");
                                item.CBuffTime     = MapleData.GetInt("time");
                            }

                            if (itemNode.ContainsChild("mob"))
                            {
                                item.CSummons = new List <MobSummon>();

                                foreach (NXNode summonNode in itemNode["mob"])
                                {
                                    MapleData.InfoNode = summonNode;

                                    MobSummon summon = new MobSummon();

                                    summon.MapleID     = MapleData.GetInt("id");
                                    summon.Probability = MapleData.GetByte("prob");

                                    item.CSummons.Add(summon);
                                }
                            }

                            this.Add(item);
                        }
                    }
                }
            }
        }
Пример #23
0
        public CachedFields(NXFile dataFile)
            : base()
        {
            foreach (NXNode categoryNode in dataFile.ResolvePath("/Map/Map"))
            {
                if (categoryNode.Name == "AreaCode.img")
                {
                    continue;
                }

                foreach (NXNode mapNode in categoryNode)
                {
                    MapleData.InfoNode = mapNode["info"];

                    Field map = new Field();

                    map.MapleID           = int.Parse(mapNode.Name.Replace(".img", ""));
                    map.ForcedReturnMapID = MapleData.GetInt("forcedReturn");
                    map.ReturnMapID       = MapleData.GetInt("returnMap");
                    map.SpawnRate         = MapleData.GetFloat("mobRate");
                    map.IsTown            = MapleData.GetBool("town");
                    map.HasClock          = MapleData.GetBool("clock");

                    if (mapNode.ContainsChild("portal"))
                    {
                        foreach (NXNode portalNode in mapNode["portal"])
                        {
                            MapleData.InfoNode = portalNode;

                            Portal portal = new Portal();

                            portal.ID    = byte.Parse(portalNode.Name);
                            portal.Label = MapleData.GetString("pn");

                            portal.DestinationFieldID = MapleData.GetInt("tm");
                            portal.DestinationLabel   = MapleData.GetString("tn");

                            portal.Position = new Position(MapleData.GetInt("x"), MapleData.GetInt("y"));

                            map.Portals.Add(portal);
                        }
                    }

                    if (mapNode.ContainsChild("life"))
                    {
                        int count = -1;

                        foreach (NXNode lifeNode in mapNode["life"])
                        {
                            count++;

                            MapleData.InfoNode = lifeNode;

                            string type = MapleData.GetString("type");

                            int      mapleId       = int.Parse(MapleData.GetString("id"));
                            Position position      = new Position(MapleData.GetInt("x"), MapleData.GetInt("y"));
                            short    foothold      = MapleData.GetShort("fh");
                            short    minimumClickX = MapleData.GetShort("rx0");
                            short    maximumClickX = MapleData.GetShort("rx1");
                            int      respawnTime   = MapleData.GetInt("respawnTime");
                            bool     facesLeft     = MapleData.GetBool("f");

                            switch (type)
                            {
                            case "n":

                                map.Npcs.Add(new Npc(type, count, mapleId, position, foothold, minimumClickX, maximumClickX, respawnTime, facesLeft));

                                break;

                            case "m":
                            case "r":

                                map.SpawnPoints.Add(new SpawnPoint(type, count, mapleId, position, foothold, minimumClickX, maximumClickX, respawnTime, facesLeft));

                                break;
                            }
                        }
                    }

                    this.Add(map);
                }
            }
        }
Пример #24
0
 /// <summary>
 ///   Constructs a lazily-loaded node.
 /// </summary>
 /// <param name="name"> The name of the lazily-loaded node. </param>
 /// <param name="parent"> The parent node of the lazily-loaded node. </param>
 /// <param name="file"> The containing file of the lazily-loaded node. </param>
 /// <param name="childCount"> The number of children this lazily-loaded node contains. </param>
 /// <param name="firstChildId"> The Node ID of the first child of this node. </param>
 protected NXLazyValuedNode(string name, NXNode parent, NXFile file, ushort childCount, uint firstChildId) : base(name, parent, file, childCount, firstChildId)
 {
 }