示例#1
0
        /// <summary>
        /// Gets the model info from the modelchara exd data
        /// </summary>
        /// <param name="modelCharaEx">The modelchara ex data</param>
        /// <param name="index">The index of the data</param>
        /// <returns>The XivModelInfo data</returns>
        public static XivModelInfo GetModelInfo(Dictionary <int, byte[]> modelCharaEx, int index)
        {
            var xivModelInfo = new XivMonsterModelInfo();

            // These are the offsets to relevant data
            // These will need to be changed if data gets added or removed with a patch
            const int modelDataOffset = 4;

            // Big Endian Byte Order
            using (var br = new BinaryReaderBE(new MemoryStream(modelCharaEx[index])))
            {
                xivModelInfo.PrimaryID = br.ReadInt16();

                br.BaseStream.Seek(modelDataOffset, SeekOrigin.Begin);
                var modelType = br.ReadByte();
                xivModelInfo.SecondaryID = br.ReadByte();
                xivModelInfo.ImcSubsetID = br.ReadByte();

                if (modelType == 2)
                {
                    xivModelInfo.ModelType = XivItemType.demihuman;
                }
                else if (modelType == 3)
                {
                    xivModelInfo.ModelType = XivItemType.monster;
                }
                else
                {
                    xivModelInfo.ModelType = XivItemType.unknown;
                }
            }

            return(xivModelInfo);
        }
示例#2
0
        public static byte[] DecompressRLE(byte[] bytes)
        {
            List <byte> newBytes = new List <byte>();

            using (var reader = new BinaryReaderBE(new MemoryStream(bytes)))
            {
                while (reader.BaseStream.Position < reader.BaseStream.Length)
                {
                    int  n   = reader.ReadByte();
                    bool alt = n >= 129 ? true : false;

                    if (alt)
                    {
                        n -= 127;
                    }
                    else if (n == 0)
                    {
                        break;
                    }

                    byte content = reader.ReadByte();

                    for (int i = 0; i < n; i++)
                    {
                        newBytes.Add(alt ? content : (i == 0 ? content : reader.ReadByte()));
                    }
                }
            }

            return(newBytes.ToArray());
        }
示例#3
0
            public void Load(BinaryReaderBE reader)
            {
                Flags = reader.ReadByte();
                Value = reader.ReadByte();

                Red   = reader.ReadUInt16();
                Green = reader.ReadUInt16();
                Blue  = reader.ReadUInt16();
            }
示例#4
0
        public void Load(BinaryReaderBE reader)
        {
            Width       = reader.ReadInt16();
            Height      = reader.ReadInt16();
            bytesPerRow = reader.ReadInt16();
            flags       = (BitmapFlags)reader.ReadUInt16();
            BitDepth    = reader.ReadInt16();

            int scanlines = ColumnOrder ? Width : Height;

            reader.BaseStream.Seek(20 + scanlines * 4, SeekOrigin.Current);

            data = new byte[Width * Height];
            if (bytesPerRow > -1)
            {
                // not compressed
                if (ColumnOrder)
                {
                    // rotate
                    short temp = Width;
                    Width  = Height;
                    Height = temp;
                    for (int y = Height - 1; y >= 0; --y)
                    {
                        for (int x = 0; x < Width; ++x)
                        {
                            data[x + y * Width] = reader.ReadByte();
                        }
                    }
                }
                else
                {
                    reader.Read(data, 0, Width * Height);
                }
            }
            else
            {
                for (int x = 0; x < Width; ++x)
                {
                    short start = reader.ReadInt16();
                    short end   = reader.ReadInt16();
                    for (int y = start; y < end; ++y)
                    {
                        data[x + y * Width] = reader.ReadByte();
                    }
                }
            }
        }
示例#5
0
 public void Read(BinaryReaderBE Reader)
 {
     Magic    = Reader.ReadBytes(16);
     ServerId = Reader.ReadBytes(8);
     Security = Reader.ReadByte();
     MTU      = Reader.ReadUInt16BE();
 }
示例#6
0
        public void Read(BinaryReaderBE Reader)
        {
            SequenceNumbers = new List <SequenceNumber>();
            UInt16 numAcks = Reader.ReadUInt16BE();

            for (var i = 0; i < numAcks; i++)
            {
                Byte type = Reader.ReadByte();
                if (type == 0)
                {
                    SequenceNumber first = new SequenceNumber(),
                                   last  = new SequenceNumber();
                    first.Read(Reader);
                    last.Read(Reader);
                    for (UInt32 seq = first.Number; seq < last.Number; seq++)
                    {
                        SequenceNumber num = new SequenceNumber();
                        num.Number = seq;
                        SequenceNumbers.Add(num);
                    }
                }
                else
                {
                    SequenceNumber num = new SequenceNumber();
                    num.Read(Reader);
                    SequenceNumbers.Add(num);
                }
            }
        }
示例#7
0
 public void Read(BinaryReaderBE Reader)
 {
     ClientId = Reader.ReadBytes(8);
     Reader.ReadUInt32(); // Unknown
     Time     = Reader.ReadUInt32BE();
     Security = Reader.ReadByte();
 }
示例#8
0
        public void Read(BinaryReaderBE Reader)
        {
            var type = Reader.ReadByte();

            if (type != 4)
            {
                throw new InvalidDataException("Only IPv4 addresses are supported");
            }
            Address = ~Reader.ReadUInt32();
            Port    = Reader.ReadUInt16BE();
        }
        /// <summary>
        /// Gets the model info from the modelchara exd file
        /// </summary>
        /// <param name="gameDirectory">The game directory</param>
        /// <param name="index">The index of the data</param>
        /// <returns>The XivModelInfo data</returns>
        public static async Task <XivModelInfo> GetModelInfo(DirectoryInfo gameDirectory, int index)
        {
            var xivModelInfo = new XivMonsterModelInfo();

            // These are the offsets to relevant data
            // These will need to be changed if data gets added or removed with a patch
            int startOffset     = 8;
            int modelDataOffset = 12;

            var ex           = new Ex(gameDirectory);
            var modelCharaEx = await ex.ReadExData(XivEx.modelchara);

            // Big Endian Byte Order
            using (var br = new BinaryReaderBE(new MemoryStream(modelCharaEx[index])))
            {
                br.BaseStream.Seek(startOffset, SeekOrigin.Begin);
                xivModelInfo.PrimaryID = br.ReadInt16();

                br.BaseStream.Seek(modelDataOffset, SeekOrigin.Begin);
                var modelType = br.ReadByte();
                xivModelInfo.SecondaryID = br.ReadByte();
                xivModelInfo.ImcSubsetID = br.ReadByte();

                if (modelType == 2)
                {
                    xivModelInfo.ModelType = XivItemType.demihuman;
                }
                else if (modelType == 3)
                {
                    xivModelInfo.ModelType = XivItemType.monster;
                }
                else
                {
                    xivModelInfo.ModelType = XivItemType.unknown;
                }
            }

            return(xivModelInfo);
        }
示例#10
0
        public void Load(BinaryReaderBE reader)
        {
            Width       = reader.ReadInt16();
            Height      = reader.ReadInt16();
            bytesPerRow = reader.ReadInt16();
            flags       = (BitmapFlags)reader.ReadUInt16();
            BitDepth    = reader.ReadInt16();

            int scanlines = ColumnOrder ? Width : Height;

            reader.BaseStream.Seek(20 + scanlines * 4, SeekOrigin.Current);

            data = new byte[Width * Height];
            if (bytesPerRow > -1)
            {
                // not compressed
                // if (ColumnOrder) {
                //     // rotate
                //     short temp = Width;
                //     Width = Height;
                //     Height = temp;
                //     for (int y = Height - 1; y >= 0; --y) {
                //  for (int x = 0; x < Width; ++x) {
                //      data[x + y * Width] = reader.ReadByte();
                //  }
                //     }
                // } else {
                reader.Read(data, 0, Width * Height);
                // }
            }
            else
            {
                ColumnOrder = false;
                for (int x = 0; x < Width; x++)
                {
                    short start = reader.ReadInt16();
                    short end   = reader.ReadInt16();

                    for (int y = start; y < end; y++)
                    {
                        data[x + y * Width] = reader.ReadByte();
                    }
                    // int dstp = x + start * Width;
                    // while (start != end) {
                    //  data[dstp] = reader.ReadByte();
                    //  dstp += Width;
                    //  start++;
                    // }
                }
            }
        }
示例#11
0
        public void Read(BinaryReaderBE Reader)
        {
            var lines = Reader.ReadUInt32();

            Lines = new ConsoleLine[lines];
            for (var i = 0; i < lines; i++)
            {
                var consoleLine = new ConsoleLine();
                var length      = Reader.ReadUInt32();
                var unknown     = Reader.ReadByte();
                var length2     = Reader.ReadUInt32();
                var line        = Reader.ReadBytes((int)length);
                consoleLine.Level = Reader.ReadUInt32();
                consoleLine.Line  = Encoding.UTF8.GetString(line);
                Lines[i]          = consoleLine;
            }
        }
示例#12
0
        private int readVLV(BinaryReaderBE binaryReader)
        {
            int delta = 0;

            while (true)
            {
                delta += binaryReader.ReadByte();
                if ((delta & 0x80) == 0x80)
                {
                    delta <<= 8;
                }
                else
                {
                    break;
                }
            }

            return(delta);
        }
示例#13
0
        public void Read(BinaryReaderBE Reader)
        {
            Enumerations = new List <DosEnumeration>();
            var numEnums = Reader.ReadUInt32();

            for (var i = 0; i < numEnums; i++)
            {
                var enumeration = new DosEnumeration();
                enumeration.Name   = ReadString(Reader);
                enumeration.Type   = Reader.ReadByte();
                enumeration.Values = new List <String>();

                var numElems = Reader.ReadUInt32();
                for (var j = 0; j < numElems; j++)
                {
                    enumeration.Values.Add(ReadString(Reader));
                }

                Enumerations.Add(enumeration);
            }
        }
示例#14
0
        /// <summary>
        /// Gets the list of action UI elements
        /// </summary>
        /// <remarks>
        /// The actions are obtained from different sources, but is not all inclusive
        /// There may be some actions that are missing
        /// </remarks>
        /// <returns>A list containing XivUi data</returns>
        public async Task <List <XivUi> > GetActionList()
        {
            var actionLock = new object();

            // Data from the action_0 exd
            var actionExData = await _ex.ReadExData(XivEx.action);

            var actionCategoryExData = await _ex.ReadExData(XivEx.actioncategory);

            var actionList = new List <XivUi>();

            var actionNames = new List <string>();

            await Task.Run(() => Parallel.ForEach(actionExData.Values, (action) =>
            {
                var xivUi = new XivUi()
                {
                    PrimaryCategory   = "UI",
                    SecondaryCategory = XivStrings.Actions
                };

                int actionCategory;

                // Big Endian Byte Order
                using (var br = new BinaryReaderBE(new MemoryStream(action)))
                {
                    br.BaseStream.Seek(8, SeekOrigin.Begin);
                    var iconNumber = br.ReadUInt16();

                    if (iconNumber == 0)
                    {
                        return;
                    }

                    var dataOffset = 28;
                    var dataLength = 60;

                    br.BaseStream.Seek(dataOffset, SeekOrigin.Begin);
                    actionCategory = br.ReadByte();

                    br.BaseStream.Seek(dataLength, SeekOrigin.Begin);
                    var nameLength = action.Length - dataLength;
                    var name       = Encoding.UTF8.GetString(br.ReadBytes(nameLength)).Replace("\0", "");

                    xivUi.Name       = name;
                    xivUi.IconNumber = iconNumber;
                }

                if (xivUi.Name.Equals(string.Empty))
                {
                    return;
                }
                if (actionNames.Contains(xivUi.Name))
                {
                    return;
                }

                var actionCategoryData = actionCategoryExData[actionCategory];

                // Big Endian Byte Order
                using (var br = new BinaryReaderBE(new MemoryStream(actionCategoryData)))
                {
                    br.BaseStream.Seek(4, SeekOrigin.Begin);

                    var nameLength = actionCategoryData.Length - 4;
                    var name       = Encoding.UTF8.GetString(br.ReadBytes(nameLength)).Replace("\0", "");

                    if (name.Equals(string.Empty))
                    {
                        xivUi.TertiaryCategory = XivStrings.None;
                    }
                    else
                    {
                        xivUi.TertiaryCategory = name;
                    }
                }

                lock (actionLock)
                {
                    actionNames.Add(xivUi.Name);
                    actionList.Add(xivUi);
                }
            }));

            // Data from generalaction_0
            var generalActionExData = await _ex.ReadExData(XivEx.generalaction);

            await Task.Run(() => Parallel.ForEach(generalActionExData.Values, (action) =>
            {
                var xivUi = new XivUi()
                {
                    PrimaryCategory   = "UI",
                    SecondaryCategory = XivStrings.Actions,
                    TertiaryCategory  = XivStrings.General
                };

                // Big Endian Byte Order
                using (var br = new BinaryReaderBE(new MemoryStream(action)))
                {
                    br.BaseStream.Seek(6, SeekOrigin.Begin);

                    var nameLength = br.ReadInt16();

                    br.BaseStream.Seek(10, SeekOrigin.Begin);

                    var iconNumber = br.ReadUInt16();

                    if (iconNumber == 0)
                    {
                        return;
                    }

                    br.BaseStream.Seek(20, SeekOrigin.Begin);

                    var name = Encoding.UTF8.GetString(br.ReadBytes(nameLength)).Replace("\0", "");

                    xivUi.Name       = name;
                    xivUi.IconNumber = iconNumber;
                }

                lock (actionLock)
                {
                    actionNames.Add(xivUi.Name);
                    actionList.Add(xivUi);
                }
            }));

            // Data from buddyaction_0
            var buddyActionExData = await _ex.ReadExData(XivEx.buddyaction);

            await Task.Run(() => Parallel.ForEach(buddyActionExData.Values, (action) =>
            {
                var xivUi = new XivUi()
                {
                    PrimaryCategory   = "UI",
                    SecondaryCategory = XivStrings.Actions,
                    TertiaryCategory  = XivStrings.Buddy
                };

                // Big Endian Byte Order
                using (var br = new BinaryReaderBE(new MemoryStream(action)))
                {
                    br.BaseStream.Seek(6, SeekOrigin.Begin);

                    var nameLength = br.ReadInt16();

                    br.BaseStream.Seek(10, SeekOrigin.Begin);

                    var iconNumber = br.ReadUInt16();

                    if (iconNumber == 0)
                    {
                        return;
                    }

                    br.BaseStream.Seek(20, SeekOrigin.Begin);

                    var name = Encoding.UTF8.GetString(br.ReadBytes(nameLength)).Replace("\0", "");

                    xivUi.Name       = name;
                    xivUi.IconNumber = iconNumber;
                }

                if (actionNames.Contains(xivUi.Name))
                {
                    return;
                }

                lock (actionLock)
                {
                    actionNames.Add(xivUi.Name);
                    actionList.Add(xivUi);
                }
            }));

            // Data from companyaction_0
            var companyActionExData = await _ex.ReadExData(XivEx.companyaction);

            await Task.Run(() => Parallel.ForEach(companyActionExData.Values, (action) =>
            {
                var xivUi = new XivUi()
                {
                    PrimaryCategory   = "UI",
                    SecondaryCategory = XivStrings.Actions,
                    TertiaryCategory  = XivStrings.Company
                };

                // Big Endian Byte Order
                using (var br = new BinaryReaderBE(new MemoryStream(action)))
                {
                    br.BaseStream.Seek(6, SeekOrigin.Begin);

                    var nameLength = br.ReadInt16();

                    br.BaseStream.Seek(14, SeekOrigin.Begin);

                    var iconNumber = br.ReadUInt16();

                    if (iconNumber == 0)
                    {
                        return;
                    }

                    br.BaseStream.Seek(20, SeekOrigin.Begin);

                    var name = Encoding.UTF8.GetString(br.ReadBytes(nameLength)).Replace("\0", "");

                    xivUi.Name       = name;
                    xivUi.IconNumber = iconNumber;
                }

                if (actionNames.Contains(xivUi.Name))
                {
                    return;
                }

                lock (actionLock)
                {
                    actionNames.Add(xivUi.Name);
                    actionList.Add(xivUi);
                }
            }));

            // Data from craftaction_100000
            var craftActionExData = await _ex.ReadExData(XivEx.craftaction);

            await Task.Run(() => Parallel.ForEach(craftActionExData.Values, (action) =>
            {
                var xivUi = new XivUi()
                {
                    PrimaryCategory   = "UI",
                    SecondaryCategory = XivStrings.Actions,
                    TertiaryCategory  = XivStrings.Craft
                };

                // Big Endian Byte Order
                using (var br = new BinaryReaderBE(new MemoryStream(action)))
                {
                    br.BaseStream.Seek(6, SeekOrigin.Begin);

                    var nameLength = br.ReadInt16();

                    br.BaseStream.Seek(48, SeekOrigin.Begin);

                    var iconNumber = br.ReadUInt16();

                    if (iconNumber == 0)
                    {
                        return;
                    }

                    br.BaseStream.Seek(60, SeekOrigin.Begin);

                    var name = Encoding.UTF8.GetString(br.ReadBytes(nameLength)).Replace("\0", "");

                    xivUi.Name       = name;
                    xivUi.IconNumber = iconNumber;
                }

                if (actionNames.Contains(xivUi.Name))
                {
                    return;
                }

                lock (actionLock)
                {
                    actionNames.Add(xivUi.Name);
                    actionList.Add(xivUi);
                }
            }));

            // Data from eventaction_0
            var eventActionExData = await _ex.ReadExData(XivEx.eventaction);

            await Task.Run(() => Parallel.ForEach(eventActionExData.Values, (action) =>
            {
                var xivUi = new XivUi()
                {
                    PrimaryCategory   = "UI",
                    SecondaryCategory = XivStrings.Actions,
                    TertiaryCategory  = XivStrings.Event
                };

                // Big Endian Byte Order
                using (var br = new BinaryReaderBE(new MemoryStream(action)))
                {
                    br.BaseStream.Seek(4, SeekOrigin.Begin);

                    var iconNumber = br.ReadUInt16();

                    if (iconNumber == 0)
                    {
                        return;
                    }

                    br.BaseStream.Seek(16, SeekOrigin.Begin);

                    var nameLength = action.Length - 16;

                    var name = Encoding.UTF8.GetString(br.ReadBytes(nameLength)).Replace("\0", "");

                    xivUi.Name       = name;
                    xivUi.IconNumber = iconNumber;
                }

                if (actionNames.Contains(xivUi.Name))
                {
                    return;
                }

                lock (actionLock)
                {
                    actionNames.Add(xivUi.Name);
                    actionList.Add(xivUi);
                }
            }));

            // Data from emote_0
            var emoteExData = await _ex.ReadExData(XivEx.emote);

            await Task.Run(() => Parallel.ForEach(emoteExData.Values, (action) =>
            {
                var xivUi = new XivUi()
                {
                    PrimaryCategory   = "UI",
                    SecondaryCategory = XivStrings.Actions,
                    TertiaryCategory  = XivStrings.Emote
                };

                // Big Endian Byte Order
                using (var br = new BinaryReaderBE(new MemoryStream(action)))
                {
                    br.BaseStream.Seek(28, SeekOrigin.Begin);

                    var iconNumber = br.ReadUInt16();

                    if (iconNumber == 0)
                    {
                        return;
                    }

                    br.BaseStream.Seek(40, SeekOrigin.Begin);

                    var nameLength = action.Length - 40;

                    var name = Encoding.UTF8.GetString(br.ReadBytes(nameLength)).Replace("\0", "");


                    xivUi.Name       = name;
                    xivUi.IconNumber = iconNumber;
                }

                if (actionNames.Contains(xivUi.Name))
                {
                    return;
                }

                lock (actionLock)
                {
                    actionNames.Add(xivUi.Name);
                    actionList.Add(xivUi);
                }
            }));

            // Data from marker_0
            var markerExData = await _ex.ReadExData(XivEx.marker);

            await Task.Run(() => Parallel.ForEach(markerExData.Values, (action) =>
            {
                var xivUi = new XivUi()
                {
                    PrimaryCategory   = "UI",
                    SecondaryCategory = XivStrings.Actions,
                    TertiaryCategory  = XivStrings.Marker
                };

                // Big Endian Byte Order
                using (var br = new BinaryReaderBE(new MemoryStream(action)))
                {
                    br.BaseStream.Seek(6, SeekOrigin.Begin);

                    var iconNumber = br.ReadUInt16();

                    if (iconNumber == 0)
                    {
                        return;
                    }

                    var nameLength = action.Length - 6;

                    var name = Encoding.UTF8.GetString(br.ReadBytes(nameLength)).Replace("\0", "");

                    xivUi.Name       = name;
                    xivUi.IconNumber = iconNumber;
                }

                if (actionNames.Contains(xivUi.Name))
                {
                    return;
                }

                lock (actionLock)
                {
                    actionNames.Add(xivUi.Name);
                    actionList.Add(xivUi);
                }
            }));

            // Data from fieldmarker_0
            var fieldMarkerExData = await _ex.ReadExData(XivEx.fieldmarker);

            await Task.Run(() => Parallel.ForEach(fieldMarkerExData.Values, (action) =>
            {
                var xivUi = new XivUi()
                {
                    PrimaryCategory   = "UI",
                    SecondaryCategory = XivStrings.Actions,
                    TertiaryCategory  = XivStrings.FieldMarker
                };

                // Big Endian Byte Order
                using (var br = new BinaryReaderBE(new MemoryStream(action)))
                {
                    br.BaseStream.Seek(8, SeekOrigin.Begin);

                    var iconNumber = br.ReadUInt16();

                    if (iconNumber == 0)
                    {
                        return;
                    }

                    br.BaseStream.Seek(12, SeekOrigin.Begin);

                    var nameLength = action.Length - 12;

                    var name = Encoding.UTF8.GetString(br.ReadBytes(nameLength)).Replace("\0", "");

                    xivUi.Name       = name;
                    xivUi.IconNumber = iconNumber;
                }

                if (actionNames.Contains(xivUi.Name))
                {
                    return;
                }

                lock (actionLock)
                {
                    actionNames.Add(xivUi.Name);
                    actionList.Add(xivUi);
                }
            }));

            actionList.Sort();

            return(actionList);
        }
示例#15
0
        /// <summary>
        /// A getter for available gear in the Item exd files
        /// </summary>
        /// <returns>A list containing XivGear data</returns>
        public async Task <List <XivGear> > GetUnCachedGearList()
        {
            // These are the offsets to relevant data
            // These will need to be changed if data gets added or removed with a patch
            const int modelDataCheckOffset = 30;
            int       dataLength           = 160;
            const int nameDataOffset       = 14;
            const int modelDataOffset      = 24;
            const int iconDataOffset       = 136;
            int       slotDataOffset       = 154;

            if (_xivLanguage == XivLanguage.Chinese)
            {
                dataLength     = 168;
                slotDataOffset = 156;
            }

            if (_xivLanguage == XivLanguage.Korean)
            {
                dataLength     = 160;
                slotDataOffset = 154;
            }

            var xivGearList = new List <XivGear>();

            xivGearList.AddRange(GetMissingGear());

            var ex             = new Ex(_gameDirectory, _xivLanguage);
            var itemDictionary = await ex.ReadExData(XivEx.item);

            // Loops through all the items in the item exd files
            // Item files start at 0 and increment by 500 for each new file
            // Item_0, Item_500, Item_1000, etc.
            await Task.Run(() => Parallel.ForEach(itemDictionary, (item) =>
            {
                try
                {
                    // This checks whether there is any model data present in the current item
                    if (item.Value[modelDataCheckOffset] <= 0 && item.Value[modelDataCheckOffset + 1] <= 0)
                    {
                        return;
                    }

                    var primaryMi    = new XivGearModelInfo();
                    var secondaryMi  = new XivGearModelInfo();
                    var hasSecondary = false;

                    var xivGear = new XivGear
                    {
                        ExdID           = item.Key,
                        PrimaryCategory = XivStrings.Gear,
                        ModelInfo       = primaryMi,
                    };

                    /* Used to determine if the given model is a weapon
                     * This is important because the data is formatted differently
                     * The model data is a 16 byte section separated into two 8 byte parts (primary model, secondary model)
                     * Format is 8 bytes in length with 2 bytes per data point [short, short, short, short]
                     * Gear: primary model [blank, blank, variant, ID] nothing in secondary model
                     * Weapon: primary model [blank, variant, body, ID] secondary model [blank, variant, body, ID]
                     */
                    var isWeapon = false;

                    // Big Endian Byte Order
                    using (var br = new BinaryReaderBE(new MemoryStream(item.Value)))
                    {
                        br.BaseStream.Seek(nameDataOffset, SeekOrigin.Begin);
                        var nameOffset = br.ReadInt16();

                        // Model Data
                        br.BaseStream.Seek(modelDataOffset, SeekOrigin.Begin);

                        // Primary Model Key
                        primaryMi.ModelKey = Quad.Read(br.ReadBytes(8), 0);
                        br.BaseStream.Seek(-8, SeekOrigin.Current);

                        // Primary Blank
                        var unused = br.ReadInt16();

                        // Primary Variant for weapon, blank otherwise
                        var weaponVariant = br.ReadInt16();

                        if (weaponVariant != 0)
                        {
                            primaryMi.ImcSubsetID = weaponVariant;
                            primaryMi.IsWeapon    = true;
                            isWeapon = true;
                        }

                        // Primary Body if weapon, Variant otherwise
                        if (isWeapon)
                        {
                            primaryMi.SecondaryID = br.ReadInt16();
                        }
                        else
                        {
                            primaryMi.ImcSubsetID = br.ReadInt16();
                        }

                        // Primary Model ID
                        primaryMi.PrimaryID = br.ReadInt16();

                        // Secondary Model Key
                        isWeapon             = false;
                        secondaryMi.ModelKey = Quad.Read(br.ReadBytes(8), 0);
                        br.BaseStream.Seek(-8, SeekOrigin.Current);

                        // Secondary Blank
                        var unused2 = br.ReadInt16();

                        // Secondary Variant for weapon, blank otherwise
                        weaponVariant = br.ReadInt16();

                        if (weaponVariant != 0)
                        {
                            secondaryMi.ImcSubsetID = weaponVariant;
                            secondaryMi.IsWeapon    = true;
                            isWeapon = true;
                        }

                        // Secondary Body if weapon, Variant otherwise
                        if (isWeapon)
                        {
                            secondaryMi.SecondaryID = br.ReadInt16();
                        }
                        else
                        {
                            secondaryMi.ImcSubsetID = br.ReadInt16();
                        }

                        // Secondary Model ID
                        secondaryMi.PrimaryID = br.ReadInt16();

                        // Icon
                        br.BaseStream.Seek(iconDataOffset, SeekOrigin.Begin);
                        xivGear.IconNumber = br.ReadUInt16();

                        // Gear Slot/Category
                        br.BaseStream.Seek(slotDataOffset, SeekOrigin.Begin);
                        int slotNum = br.ReadByte();

                        // Waist items do not have texture or model data
                        if (slotNum == 6)
                        {
                            return;
                        }

                        xivGear.EquipSlotCategory = slotNum;
                        xivGear.SecondaryCategory = _slotNameDictionary.ContainsKey(slotNum) ? _slotNameDictionary[slotNum] : "Unknown";

                        // Gear Name
                        var gearNameOffset = dataLength + nameOffset;
                        var gearNameLength = item.Value.Length - gearNameOffset;
                        br.BaseStream.Seek(gearNameOffset, SeekOrigin.Begin);
                        var nameString = Encoding.UTF8.GetString(br.ReadBytes(gearNameLength)).Replace("\0", "");
                        xivGear.Name   = new string(nameString.Where(c => !char.IsControl(c)).ToArray());
                        xivGear.Name   = xivGear.Name.Trim();

                        // If we have a secondary model

                        XivGear secondaryItem = null;
                        if (secondaryMi.PrimaryID != 0)
                        {
                            // Make a new item for it.
                            secondaryItem                   = (XivGear)xivGear.Clone();
                            secondaryItem.ModelInfo         = secondaryMi;
                            xivGear.Name                   += " - " + XivStrings.Main_Hand;
                            secondaryItem.Name             += " - " + XivStrings.Off_Hand;
                            xivGear.PairedItem              = secondaryItem;
                            secondaryItem.PairedItem        = xivGear;
                            xivGear.SecondaryCategory       = XivStrings.Dual_Wield;
                            secondaryItem.SecondaryCategory = XivStrings.Dual_Wield;
                        }

                        lock (_gearLock)
                        {
                            xivGearList.Add(xivGear);
                            if (secondaryItem != null)
                            {
                                xivGearList.Add(secondaryItem);
                            }
                        }
                    }
                } catch (Exception ex)
                {
                    throw;
                }
            }));

            xivGearList.Sort();

            return(xivGearList);
        }
示例#16
0
 internal Meta(BinaryReaderBE binaryReader)
 {
     type   = binaryReader.ReadByte();
     length = binaryReader.ReadByte();
     data   = binaryReader.ReadBytes(length);
 }
示例#17
0
        public virtual void Load(string filename)
        {
            BinaryReaderBE reader = new BinaryReaderBE(File.Open(filename, FileMode.Open));

            try {
                // is it MacBinary?
                int fork_start     = 0;
                int resourceOffset = MacBinaryHeader(reader.ReadBytes(128));
                if (resourceOffset > 0)
                {
                    fork_start     = 128;
                    resourceOffset = 128 + ((resourceOffset + 0x7f) & ~0x7f);
                }
                reader.BaseStream.Seek(fork_start, SeekOrigin.Begin);

                // read the header
                version         = reader.ReadInt16();
                DataVersion     = reader.ReadInt16();
                Filename        = reader.ReadMacString(maxFilename);
                checksum        = reader.ReadUInt32();
                directoryOffset = reader.ReadInt32();
                short wadCount = reader.ReadInt16();
                applicationSpecificDirectoryDataSize = reader.ReadInt16();
                entryHeaderSize = reader.ReadInt16();

                directoryEntryBaseSize = reader.ReadInt16();

                // sanity check the map
                if (Version < 2 || entryHeaderSize != 16 || directoryEntryBaseSize != 10)
                {
                    throw new BadMapException("Only Marathon 2 and higher maps are supported");
                }

                ParentChecksum = reader.ReadUInt32();
                reader.ReadBytes(2 * 20); // unused

                // load the directory
                reader.BaseStream.Seek(directoryOffset + fork_start, SeekOrigin.Begin);
                for (int i = 0; i < wadCount; ++i)
                {
                    DirectoryEntry entry = new DirectoryEntry();
                    entry.LoadEntry(reader);
                    Directory[entry.Index] = entry;

                    LoadApplicationSpecificDirectoryData(reader, entry.Index);
                }

                // load all the wads(!)
                foreach (KeyValuePair <int, DirectoryEntry> kvp in Directory)
                {
                    reader.BaseStream.Seek(kvp.Value.Offset + fork_start, SeekOrigin.Begin);
                    kvp.Value.LoadChunks(reader);
                }

                if (resourceOffset > 0)
                {
                    reader.BaseStream.Seek(resourceOffset, SeekOrigin.Begin);
                    UInt32 dataOffset = reader.ReadUInt32();
                    UInt32 mapOffset  = reader.ReadUInt32();
                    UInt32 dataLength = reader.ReadUInt32();
                    UInt32 mapLength  = reader.ReadUInt32();
                    Debug.Log(resourceOffset);

                    Debug.Log(dataOffset);
                    Debug.Log(mapOffset);
                    Debug.Log(dataLength);
                    Debug.Log(mapLength);

                    dataOffset += (UInt32)resourceOffset;
                    mapOffset  += (UInt32)resourceOffset;


                    ResourceMap resourceMap = new ResourceMap();
                    resourceMap.load(ref reader, mapOffset);

                    for (int i = 0; i < resourceMap.refs.Count; i++)
                    {
                        string name = "";
                        if (resourceMap.refs[i].nameListOffset > 0)
                        {
                            reader.BaseStream.Seek(resourceMap.refs[i].nameListOffset + resourceMap.nameListOffset + mapOffset, SeekOrigin.Begin);
                            int nameLength = reader.ReadByte();
                            name = reader.ReadMacString(nameLength);
                        }
                        if (resourceMap.refs[i].type == Pict.Tag || resourceMap.refs[i].type == Pict.Tag2)
                        {
                            Pict pict = new Pict();
                            reader.BaseStream.Seek(resourceMap.refs[i].dataOffset + dataOffset, SeekOrigin.Begin);
                            pict.LoadWithName(reader, name);
                            pictResources.Add(pict);
                        }
                        if (resourceMap.refs[i].type == Clut.Tag)
                        {
                            Clut clut = new Clut();
                            reader.BaseStream.Seek(resourceMap.refs[i].dataOffset + dataOffset, SeekOrigin.Begin);
                            clut.Load(reader);
                            clutResources.Add(clut);
                        }
                        if (resourceMap.refs[i].type == SoundResource.Tag)
                        {
                            SoundResource snd = new SoundResource();
                            reader.BaseStream.Seek(resourceMap.refs[i].dataOffset + dataOffset, SeekOrigin.Begin);
                            snd.Load(reader);
                            soundResources.Add(snd);
                        }
                        if (resourceMap.refs[i].type == TextResource.Tag || resourceMap.refs[i].type == TextResource.Tag2)
                        {
                            TextResource txt = new TextResource();
                            reader.BaseStream.Seek(resourceMap.refs[i].dataOffset + dataOffset, SeekOrigin.Begin);
                            txt.Load(reader);
                            textResources.Add(txt);
                        }
                    }
                }
            } finally {
                reader.Close();
            }
        }
示例#18
0
 internal Pressure(BinaryReaderBE binaryReader, int channel)
 {
     this.Channel = (byte)channel;
     pressure     = binaryReader.ReadByte();
 }
示例#19
0
 internal PitchBend(BinaryReaderBE binaryReader, int channel)
 {
     this.Channel = (byte)channel;
     lsb          = binaryReader.ReadByte();
     msb          = binaryReader.ReadByte();
 }
示例#20
0
 internal Patch(BinaryReaderBE binaryReader, int channel)
 {
     this.Channel = (byte)channel;
     instrument   = binaryReader.ReadByte();
 }
示例#21
0
        public override GameFile[] Unpack()
        {
            this.file.BaseStream.Position = this.file.Position;
            BinaryReaderBE reader = new BinaryReaderBE(this.file.BaseStream);

            /** PART 1 **/
            // Read header
            uint numEntries   = reader.ReadUInt32();
            uint strSecOffset = reader.ReadUInt32();
            uint strSecSize   = reader.ReadUInt32();
            uint numStr       = reader.ReadUInt32();

            /** PART 2 **/
            reader.BaseStream.Position = this.file.Position + strSecOffset + strSecSize;
            if ((reader.BaseStream.Position - this.file.Position) % 0x10 != 0)
            {
                reader.BaseStream.Position += 0x10 - ((reader.BaseStream.Position - this.file.Position) % 0x10);
            }

            long part2Offset = reader.BaseStream.Position;

            // Read header
            uint signSecOffset  = reader.ReadUInt32();
            uint numNames       = reader.ReadUInt32();
            uint namesSecOffset = reader.ReadUInt32();
            uint namesSecSize   = reader.ReadUInt32();

            // Read names
            Dictionary <uint, string> entriesName = new Dictionary <uint, string>();

            for (int i = 0; i < numNames; i++)
            {
                reader.BaseStream.Position = part2Offset + 0x10 + i * 8;
                uint id = reader.ReadUInt32();

                reader.BaseStream.Position = part2Offset + namesSecOffset + reader.ReadUInt32();
                entriesName.Add(id, reader.ReadString());
            }

            // Read signature
            // Specially, the contextuality
            reader.BaseStream.Position = part2Offset + signSecOffset + 6;
            byte context = reader.ReadByte();

            /** PART 1 **/
            // At last, read config entries
            reader.BaseStream.Position = this.file.Position + 0x10;
            ConfigEntry[] entries = new ConfigEntry[numEntries];
            for (int i = 0; i < numEntries; i++)
            {
                entries[i].Id   = reader.ReadUInt32();
                entries[i].Name = entriesName[entries[i].Id];

                byte numValues = reader.ReadByte();
                reader.BaseStream.Position--;

                uint[] types = reader.ReadUInt32s(1 + (numValues + 3) / 16);
                types[0] <<= 8;        // Remove numValues data


                // Get the data
                entries[i].Data = new ConfigValue[numValues];
                long dataOffset = reader.BaseStream.Position;
                for (int j = 0; j < numValues; j++)
                {
                    reader.BaseStream.Position = dataOffset + j * 4;
                    entries[i].Data[j]         = this.GetValue(j, types, strSecOffset);
                }

                // Offset to next entry.
                reader.BaseStream.Position = dataOffset + numValues * 4;
            }

            // Write everything to a text file.
            //Stream txtStream = WriteText(entries, (context == 0));
            Stream txtStream = WriteInfo(entries);

            if (txtStream == null)
            {
                txtStream = WriteText(entries, (context == 0));
            }

            // Create the virtual file
            GameFile textFile = new GameFile(txtStream);

            textFile.Position = 0;
            textFile.Size     = txtStream.Length;
            textFile.FileName = this.file.FileName + ".txt";
            textFile.FilePath = this.file.FilePath;
            textFile.Parent   = null;

            reader = null;
            return(new GameFile[] { textFile });
        }
示例#22
0
        public void Load(BinaryReaderBE reader)
        {
            samples.Clear();

            int  depth       = 8;
            bool signed_8bit = false;
            uint frames      = 0;

            long origin = reader.BaseStream.Position;

            reader.BaseStream.Seek(20, SeekOrigin.Current);
            byte headerType = reader.ReadByte();

            reader.BaseStream.Seek(origin, SeekOrigin.Begin);

            switch (headerType)
            {
            case StandardSoundHeader:
                depth       = 8;
                signed_8bit = false;
                channels    = 1;

                reader.ReadUInt32(); // sample pointer
                frames     = reader.ReadUInt32();
                sampleRate = reader.ReadFixed();
                loopStart  = reader.ReadUInt32();
                loopEnd    = reader.ReadUInt32();
                reader.ReadByte();             // type
                frequency = reader.ReadByte(); // I think this is a MIDI note?
                break;

            case ExtendedSoundHeader:
            case CompressedSoundHeader:
                reader.ReadUInt32(); // sample pointer
                channels   = reader.ReadUInt32() == 2 ? 2 : 1;
                sampleRate = reader.ReadFixed();
                loopStart  = reader.ReadUInt32();
                loopEnd    = reader.ReadUInt32();

                reader.ReadByte();             // type
                frequency = reader.ReadByte(); // I think this is MIDI?

                frames = reader.ReadUInt32();

                if (headerType == CompressedSoundHeader)
                {
                    reader.BaseStream.Seek(10, SeekOrigin.Current);
                    reader.ReadUInt32(); // marker chunk
                    uint format = reader.ReadUInt32();
                    reader.ReadUInt32(); // future use
                    reader.ReadUInt32(); // stateVars
                    reader.ReadUInt32(); // leftOverSamples
                    short compressionId = reader.ReadInt16();
                    if (format != SoundsFile.FourCharsToInt('t', 'w', 'o', 's') || compressionId != -1)
                    {
                        // fail somehow
                        return;
                    }
                    signed_8bit = true;
                    reader.ReadInt16(); // packet size
                    reader.ReadInt16(); // unused
                    depth = (reader.ReadInt16() == 16 ? 16 : 8);
                }
                else
                {
                    signed_8bit = false;
                    reader.BaseStream.Seek(22, SeekOrigin.Current);
                    depth = (reader.ReadInt16() == 16 ? 16 : 8);
                    reader.BaseStream.Seek(14, SeekOrigin.Current);
                }
                break;
            }

            for (int i = 0; i < frames; ++i)
            {
                for (int j = 0; j < channels; ++j)
                {
                    float sample;
                    if (depth == 16)
                    {
                        sample = (reader.ReadInt16() + 0.5f) / 32767.5f;
                    }
                    else if (signed_8bit)
                    {
                        sample = (reader.ReadSByte() + 0.5f) / 127.5f;
                    }
                    else
                    {
                        sample = reader.ReadByte() / 127.5f - 1.0f;
                    }

                    samples.Add(sample);
                }
            }
        }
示例#23
0
        /// <summary>
        /// Gets the list of status effect UI elements
        /// </summary>
        /// <returns>A list containing XivUi data</returns>
        public List <XivUi> GetStatusList()
        {
            var statusList = new List <XivUi>();

            // These are the offsets to relevant data
            // These will need to be changed if data gets added or removed with a patch
            const int nameLengthDataOffset = 6;
            const int typeDataOffset       = 13;
            const int dataLength           = 24;

            var ex           = new Ex(_gameDirectory, _xivLanguage);
            var statusExData = ex.ReadExData(XivEx.status);

            foreach (var status in statusExData.Values)
            {
                var xivUi = new XivUi()
                {
                    Category     = "UI",
                    ItemCategory = XivStrings.Status
                };

                // Big Endian Byte Order
                using (var br = new BinaryReaderBE(new MemoryStream(status)))
                {
                    br.BaseStream.Seek(nameLengthDataOffset, SeekOrigin.Begin);

                    var nameLength = br.ReadInt16();

                    var iconNumber = br.ReadUInt16();

                    if (iconNumber == 0)
                    {
                        continue;
                    }

                    br.BaseStream.Seek(typeDataOffset, SeekOrigin.Begin);

                    var type = br.ReadByte();

                    br.BaseStream.Seek(dataLength, SeekOrigin.Begin);

                    var name = Encoding.UTF8.GetString(br.ReadBytes(nameLength)).Replace("\0", "");

                    xivUi.IconNumber = iconNumber;
                    xivUi.Name       = name;

                    if (name.Equals(string.Empty))
                    {
                        continue;
                    }

                    //Status effects have a byte that determines whether the effect is detrimental or beneficial
                    if (type == 1)
                    {
                        xivUi.ItemSubCategory = XivStrings.Beneficial;
                    }
                    else if (type == 2)
                    {
                        xivUi.ItemSubCategory = XivStrings.Detrimental;
                    }
                    else
                    {
                        xivUi.ItemSubCategory = XivStrings.None;
                        xivUi.Name            = xivUi.Name + " " + type;
                    }
                }

                statusList.Add(xivUi);
            }

            statusList.Sort();

            return(statusList);
        }
示例#24
0
        /// <summary>
        /// Gets the list of status effect UI elements
        /// </summary>
        /// <returns>A list containing XivUi data</returns>
        public async Task <List <XivUi> > GetStatusList()
        {
            var statusLock = new object();
            var statusList = new List <XivUi>();

            // These are the offsets to relevant data
            // These will need to be changed if data gets added or removed with a patch
            const int nameLengthDataOffset = 6;
            var       typeDataOffset       = 13;
            var       dataLength           = 24;

            if (_xivLanguage != XivLanguage.Korean)
            {
                typeDataOffset = 16;
                dataLength     = 28;
            }

            var statusExData = await _ex.ReadExData(XivEx.status);

            await Task.Run(() => Parallel.ForEach(statusExData.Values, (status) =>
            {
                var xivUi = new XivUi()
                {
                    PrimaryCategory   = "UI",
                    SecondaryCategory = XivStrings.Status
                };

                // Big Endian Byte Order
                using (var br = new BinaryReaderBE(new MemoryStream(status)))
                {
                    br.BaseStream.Seek(nameLengthDataOffset, SeekOrigin.Begin);

                    var nameLength = br.ReadInt16();

                    var iconNumber = br.ReadUInt16();

                    if (iconNumber == 0)
                    {
                        return;
                    }

                    br.BaseStream.Seek(typeDataOffset, SeekOrigin.Begin);

                    var type = br.ReadByte();

                    br.BaseStream.Seek(dataLength, SeekOrigin.Begin);

                    var name = Encoding.UTF8.GetString(br.ReadBytes(nameLength)).Replace("\0", "");

                    xivUi.IconNumber = iconNumber;
                    xivUi.Name       = name;

                    if (name.Equals(string.Empty))
                    {
                        return;
                    }

                    //Status effects have a byte that determines whether the effect is detrimental or beneficial
                    if (type == 1)
                    {
                        xivUi.TertiaryCategory = XivStrings.Beneficial;
                    }
                    else if (type == 2)
                    {
                        xivUi.TertiaryCategory = XivStrings.Detrimental;
                    }
                    else
                    {
                        xivUi.TertiaryCategory = XivStrings.None;
                        xivUi.Name             = xivUi.Name + " " + type;
                    }
                }

                lock (statusLock)
                {
                    statusList.Add(xivUi);
                }
            }));

            statusList.Sort();

            return(statusList);
        }
示例#25
0
        /// <summary>
        /// Gets the list of action UI elements
        /// </summary>
        /// <remarks>
        /// The actions are obtained from different sources, but is not all inclusive
        /// There may be some actions that are missing
        /// </remarks>
        /// <returns>A list containing XivUi data</returns>
        public List <XivUi> GetActionList()
        {
            var ex = new Ex(_gameDirectory, _xivLanguage);

            // Data from the action_0 exd
            var actionExData         = ex.ReadExData(XivEx.action);
            var actionCategoryExData = ex.ReadExData(XivEx.actioncategory);

            var actionList = new List <XivUi>();

            var actionNames = new List <string>();

            foreach (var action in actionExData.Values)
            {
                var xivUi = new XivUi()
                {
                    Category     = "UI",
                    ItemCategory = XivStrings.Actions
                };

                int actionCategory;

                // Big Endian Byte Order
                using (var br = new BinaryReaderBE(new MemoryStream(action)))
                {
                    br.BaseStream.Seek(8, SeekOrigin.Begin);
                    var iconNumber = br.ReadUInt16();

                    if (iconNumber == 0)
                    {
                        continue;
                    }

                    br.BaseStream.Seek(26, SeekOrigin.Begin);
                    actionCategory = br.ReadByte();

                    br.BaseStream.Seek(56, SeekOrigin.Begin);
                    var nameLength = action.Length - 56;
                    var name       = Encoding.UTF8.GetString(br.ReadBytes(nameLength)).Replace("\0", "");

                    xivUi.Name       = name;
                    xivUi.IconNumber = iconNumber;
                }

                if (actionNames.Contains(xivUi.Name))
                {
                    continue;
                }
                actionNames.Add(xivUi.Name);

                var actionCategoryData = actionCategoryExData[actionCategory];

                // Big Endian Byte Order
                using (var br = new BinaryReaderBE(new MemoryStream(actionCategoryData)))
                {
                    br.BaseStream.Seek(4, SeekOrigin.Begin);

                    var nameLength = actionCategoryData.Length - 4;
                    var name       = Encoding.UTF8.GetString(br.ReadBytes(nameLength)).Replace("\0", "");

                    if (name.Equals(string.Empty))
                    {
                        xivUi.ItemSubCategory = XivStrings.None;
                    }
                    else
                    {
                        xivUi.ItemSubCategory = name;
                    }
                }

                actionList.Add(xivUi);
            }

            // Data from generalaction_0
            var generalActionExData = ex.ReadExData(XivEx.generalaction);

            foreach (var action in generalActionExData.Values)
            {
                var xivUi = new XivUi()
                {
                    Category        = "UI",
                    ItemCategory    = XivStrings.Actions,
                    ItemSubCategory = XivStrings.General
                };

                // Big Endian Byte Order
                using (var br = new BinaryReaderBE(new MemoryStream(action)))
                {
                    br.BaseStream.Seek(8, SeekOrigin.Begin);

                    var nameLength = br.ReadInt16();

                    br.BaseStream.Seek(10, SeekOrigin.Begin);

                    var iconNumber = br.ReadUInt16();

                    if (iconNumber == 0)
                    {
                        continue;
                    }

                    br.BaseStream.Seek(20, SeekOrigin.Begin);

                    var name = Encoding.UTF8.GetString(br.ReadBytes(nameLength)).Replace("\0", "");

                    xivUi.Name       = name;
                    xivUi.IconNumber = iconNumber;
                }

                if (actionNames.Contains(xivUi.Name))
                {
                    continue;
                }
                actionNames.Add(xivUi.Name);

                actionList.Add(xivUi);
            }

            // Data from buddyaction_0
            var buddyActionExData = ex.ReadExData(XivEx.buddyaction);

            foreach (var action in buddyActionExData.Values)
            {
                var xivUi = new XivUi()
                {
                    Category        = "UI",
                    ItemCategory    = XivStrings.Actions,
                    ItemSubCategory = XivStrings.Buddy
                };

                // Big Endian Byte Order
                using (var br = new BinaryReaderBE(new MemoryStream(action)))
                {
                    br.BaseStream.Seek(6, SeekOrigin.Begin);

                    var nameLength = br.ReadInt16();

                    br.BaseStream.Seek(10, SeekOrigin.Begin);

                    var iconNumber = br.ReadUInt16();

                    if (iconNumber == 0)
                    {
                        continue;
                    }

                    br.BaseStream.Seek(20, SeekOrigin.Begin);

                    var name = Encoding.UTF8.GetString(br.ReadBytes(nameLength)).Replace("\0", "");

                    xivUi.Name       = name;
                    xivUi.IconNumber = iconNumber;
                }

                if (actionNames.Contains(xivUi.Name))
                {
                    continue;
                }
                actionNames.Add(xivUi.Name);

                actionList.Add(xivUi);
            }

            // Data from companyaction_0
            var companyActionExData = ex.ReadExData(XivEx.companyaction);

            foreach (var action in companyActionExData.Values)
            {
                var xivUi = new XivUi()
                {
                    Category        = "UI",
                    ItemCategory    = XivStrings.Actions,
                    ItemSubCategory = XivStrings.Company
                };

                // Big Endian Byte Order
                using (var br = new BinaryReaderBE(new MemoryStream(action)))
                {
                    br.BaseStream.Seek(6, SeekOrigin.Begin);

                    var nameLength = br.ReadInt16();

                    br.BaseStream.Seek(14, SeekOrigin.Begin);

                    var iconNumber = br.ReadUInt16();

                    if (iconNumber == 0)
                    {
                        continue;
                    }

                    br.BaseStream.Seek(20, SeekOrigin.Begin);

                    var name = Encoding.UTF8.GetString(br.ReadBytes(nameLength)).Replace("\0", "");

                    xivUi.Name       = name;
                    xivUi.IconNumber = iconNumber;
                }

                if (actionNames.Contains(xivUi.Name))
                {
                    continue;
                }
                actionNames.Add(xivUi.Name);

                actionList.Add(xivUi);
            }

            // Data from craftaction_100000
            var craftActionExData = ex.ReadExData(XivEx.craftaction);

            foreach (var action in craftActionExData.Values)
            {
                var xivUi = new XivUi()
                {
                    Category        = "UI",
                    ItemCategory    = XivStrings.Actions,
                    ItemSubCategory = XivStrings.Craft
                };

                // Big Endian Byte Order
                using (var br = new BinaryReaderBE(new MemoryStream(action)))
                {
                    br.BaseStream.Seek(6, SeekOrigin.Begin);

                    var nameLength = br.ReadInt16();

                    br.BaseStream.Seek(48, SeekOrigin.Begin);

                    var iconNumber = br.ReadUInt16();

                    if (iconNumber == 0)
                    {
                        continue;
                    }

                    br.BaseStream.Seek(60, SeekOrigin.Begin);

                    var name = Encoding.UTF8.GetString(br.ReadBytes(nameLength)).Replace("\0", "");

                    xivUi.Name       = name;
                    xivUi.IconNumber = iconNumber;
                }

                if (actionNames.Contains(xivUi.Name))
                {
                    continue;
                }
                actionNames.Add(xivUi.Name);

                actionList.Add(xivUi);
            }

            // Data from eventaction_0
            var eventActionExData = ex.ReadExData(XivEx.eventaction);

            foreach (var action in eventActionExData.Values)
            {
                var xivUi = new XivUi()
                {
                    Category        = "UI",
                    ItemCategory    = XivStrings.Actions,
                    ItemSubCategory = XivStrings.Event
                };

                // Big Endian Byte Order
                using (var br = new BinaryReaderBE(new MemoryStream(action)))
                {
                    br.BaseStream.Seek(4, SeekOrigin.Begin);

                    var iconNumber = br.ReadUInt16();

                    if (iconNumber == 0)
                    {
                        continue;
                    }

                    br.BaseStream.Seek(16, SeekOrigin.Begin);

                    var nameLength = action.Length - 16;

                    var name = Encoding.UTF8.GetString(br.ReadBytes(nameLength)).Replace("\0", "");

                    xivUi.Name       = name;
                    xivUi.IconNumber = iconNumber;
                }

                if (actionNames.Contains(xivUi.Name))
                {
                    continue;
                }
                actionNames.Add(xivUi.Name);

                actionList.Add(xivUi);
            }

            // Data from emote_0
            var emoteExData = ex.ReadExData(XivEx.emote);

            foreach (var action in emoteExData.Values)
            {
                var xivUi = new XivUi()
                {
                    Category        = "UI",
                    ItemCategory    = XivStrings.Actions,
                    ItemSubCategory = XivStrings.Emote
                };

                // Big Endian Byte Order
                using (var br = new BinaryReaderBE(new MemoryStream(action)))
                {
                    br.BaseStream.Seek(26, SeekOrigin.Begin);

                    var iconNumber = br.ReadUInt16();

                    if (iconNumber == 0)
                    {
                        continue;
                    }

                    br.BaseStream.Seek(36, SeekOrigin.Begin);

                    var nameLength = action.Length - 36;

                    var name = Encoding.UTF8.GetString(br.ReadBytes(nameLength)).Replace("\0", "");

                    xivUi.Name       = name;
                    xivUi.IconNumber = iconNumber;
                }

                if (actionNames.Contains(xivUi.Name))
                {
                    continue;
                }
                actionNames.Add(xivUi.Name);

                actionList.Add(xivUi);
            }

            // Data from marker_0
            var markerExData = ex.ReadExData(XivEx.marker);

            foreach (var action in markerExData.Values)
            {
                var xivUi = new XivUi()
                {
                    Category        = "UI",
                    ItemCategory    = XivStrings.Actions,
                    ItemSubCategory = XivStrings.Marker
                };

                // Big Endian Byte Order
                using (var br = new BinaryReaderBE(new MemoryStream(action)))
                {
                    br.BaseStream.Seek(6, SeekOrigin.Begin);

                    var iconNumber = br.ReadUInt16();

                    if (iconNumber == 0)
                    {
                        continue;
                    }

                    var nameLength = action.Length - 6;

                    var name = Encoding.UTF8.GetString(br.ReadBytes(nameLength)).Replace("\0", "");

                    xivUi.Name       = name;
                    xivUi.IconNumber = iconNumber;
                }

                if (actionNames.Contains(xivUi.Name))
                {
                    continue;
                }
                actionNames.Add(xivUi.Name);

                actionList.Add(xivUi);
            }

            // Data from fieldmarker_0
            var fieldMarkerExData = ex.ReadExData(XivEx.fieldmarker);

            foreach (var action in fieldMarkerExData.Values)
            {
                var xivUi = new XivUi()
                {
                    Category        = "UI",
                    ItemCategory    = XivStrings.Actions,
                    ItemSubCategory = XivStrings.FieldMarker
                };

                // Big Endian Byte Order
                using (var br = new BinaryReaderBE(new MemoryStream(action)))
                {
                    br.BaseStream.Seek(8, SeekOrigin.Begin);

                    var iconNumber = br.ReadUInt16();

                    if (iconNumber == 0)
                    {
                        continue;
                    }

                    br.BaseStream.Seek(12, SeekOrigin.Begin);

                    var nameLength = action.Length - 12;

                    var name = Encoding.UTF8.GetString(br.ReadBytes(nameLength)).Replace("\0", "");

                    xivUi.Name       = name;
                    xivUi.IconNumber = iconNumber;
                }

                if (actionNames.Contains(xivUi.Name))
                {
                    continue;
                }
                actionNames.Add(xivUi.Name);

                actionList.Add(xivUi);
            }

            actionList.Sort();

            return(actionList);
        }
示例#26
0
 internal NoteOff(BinaryReaderBE binaryReader, int channel)
 {
     this.Channel = (byte)channel;
     note         = binaryReader.ReadByte();
     velocity     = binaryReader.ReadByte();
 }
示例#27
0
        /// <summary>
        /// Gets the list of indoor furniture
        /// </summary>
        /// <remarks>
        /// Housing items can be obtained one of two ways
        /// One: checking the housingfurniture exd for the item index, and going to that item to grab the data
        /// Two: iterating through the entire item list seeing if the item contains an index to a housing item (offset 112, 4 bytes)
        /// This method does option one
        /// </remarks>
        /// <returns>A list of XivFurniture objects containing indoor furniture item info</returns>
        private async Task <List <XivFurniture> > GetIndoorFurniture()
        {
            var indoorLock = new object();
            // These are the offsets to relevant data
            // These will need to be changed if data gets added or removed with a patch
            const int itemIndexOffset    = 10;
            const int modelNumberOffset  = 12;
            const int itemCategoryOffset = 14;

            const int itemNameDataOffset = 14;
            int       itemDataLength     = DataLengthByPatch["5.5"];
            const int itemIconDataOffset = 136;

            if (_xivLanguage == XivLanguage.Korean)
            {
                itemDataLength = DataLengthByPatch["5.4"];
            }
            else if (_xivLanguage == XivLanguage.Chinese)
            {
                itemDataLength = DataLengthByPatch["5.4"];
            }

            var ex = new Ex(_gameDirectory, _xivLanguage);
            var housingDictionary = await ex.ReadExData(XivEx.housingfurniture);

            var itemDictionary = await ex.ReadExData(XivEx.item);

            var furnitureList = new List <XivFurniture>();

            await Task.Run(() => Parallel.ForEach(housingDictionary.Values, (housingItem) =>
            {
                try
                {
                    var item = new XivFurniture
                    {
                        PrimaryCategory   = XivStrings.Housing,
                        SecondaryCategory = XivStrings.Furniture_Indoor,
                        ModelInfo         = new XivModelInfo()
                    };

                    using (var br = new BinaryReaderBE(new MemoryStream(housingItem)))
                    {
                        br.BaseStream.Seek(itemIndexOffset, SeekOrigin.Begin);
                        var itemIndex = br.ReadUInt16();

                        br.BaseStream.Seek(modelNumberOffset, SeekOrigin.Begin);
                        item.ModelInfo.PrimaryID = br.ReadInt16();

                        br.BaseStream.Seek(itemCategoryOffset, SeekOrigin.Begin);
                        var housingCategory = br.ReadByte();

                        using (var br1 = new BinaryReaderBE(new MemoryStream(itemDictionary[itemIndex])))
                        {
                            br1.BaseStream.Seek(itemNameDataOffset, SeekOrigin.Begin);
                            var nameOffset = br1.ReadInt16();

                            br1.BaseStream.Seek(itemIconDataOffset, SeekOrigin.Begin);
                            item.IconNumber = br1.ReadUInt16();

                            var gearNameOffset = itemDataLength + nameOffset;
                            var gearNameLength = itemDictionary[itemIndex].Length - gearNameOffset;
                            br1.BaseStream.Seek(gearNameOffset, SeekOrigin.Begin);
                            var nameString = Encoding.UTF8.GetString(br1.ReadBytes(gearNameLength)).Replace("\0", "");
                            item.Name      = new string(nameString.Where(c => !char.IsControl(c)).ToArray());
                        }
                    }

                    if (!item.Name.Equals(string.Empty))
                    {
                        lock (indoorLock)
                        {
                            furnitureList.Add(item);
                        }
                    }
                } catch (Exception ex)
                {
                    throw;
                }
            }));

            furnitureList.Sort();

            return(furnitureList);
        }
示例#28
0
 internal AfterTouch(BinaryReaderBE binaryReader, int channel)
 {
     this.Channel = (byte)channel;
     note         = binaryReader.ReadByte();
     touch        = binaryReader.ReadByte();
 }
示例#29
0
        public bool GetNextMessage(QHFMessage msg)
        {
            if (fs.Position >= fs.Length - 24)
            {
                return(false);
            }

            byte[] msgBytes = null;
            //Trace.WriteLine("Block start: " + fs.Position);
            msg.Signature = br.ReadInt16();
            if (msg.SignatureMismatch)
            {
                if (br.ReadByte() == 1)
                {
                    // В предыдущем сообщении были ошибки и структура съехала.
                    msg.Signature = 1;
                }
                else
                {
                    // Сдвигаем позицию на исходную для достоверности отладки.
                    fs.Position -= 1;
                    Trace.WriteLine($"{Uin} ({Nick}). Signature mismatch. (sign={msg.Signature})");
                    return(true);
                }
            }
            var size       = br.ReadInt32();
            var endOfBlock = size + fs.Position;

            try
            {
                msg.ID   = GetNextBlock();
                msg.Time = UnixTimeStampToDateTime(GetNextBlock());
                msg.IsMy = GetNextBlock() > 0;
                var msgLength = GetNextBlock();
                if (msgLength < 0)
                {
                    fs.Position -= 4;
                    msgBytes     = ReadBytesUntilNextMessage(msg.ID + 1);
                    msgLength    = msgBytes.Length;
                }
                else
                {
                    if (msgLength > size)
                    {
                        fs.Position -= 4;
                        msgLength    = br.ReadInt16();
                        if (msgLength > size)
                        {
                            fs.Position -= 2;
                            msgLength    = br.ReadByte();
                        }
                    }

                    msgBytes = br.ReadBytes(msgLength);
                }

                msg.Text = encoding.GetString(DecodeBytes(msgBytes));

                return(true);
            }
            catch (ArgumentException ex)
            {
                Trace.WriteLine(ex.Message);
                if (fs.Position == fs.Length)
                {
                    msg.Text = "Сообщение потеряно.";
                }
                return(true);
            }
        }
示例#30
0
 internal Controller(BinaryReaderBE binaryReader, int channel)
 {
     this.Channel = (byte)channel;
     type         = (ControllerType)binaryReader.ReadByte();
     value        = binaryReader.ReadByte();
 }