internal void Unload()
        {
            UnloadSpriteProvider();
            m_SpritesProvider = null;

            m_ObjectTypes?.Clear();
            m_EffectTypes?.Clear();
            m_MissileTypes?.Clear();
            m_OutfitTypes?.Clear();
            m_ProtoAppearances = null;
        }
Esempio n. 2
0
        public void Unload()
        {
            UnloadSpriteProvider();
            _spritesProvider = null;

            _objectTypes?.Clear();
            _effectTypes?.Clear();
            _missileTypes?.Clear();
            _outfitTypes?.Clear();
            _protoAppearances = null;
        }
        internal void SetProtoAppearances(Protobuf.Appearances.Appearances appearances)
        {
            m_ProtoAppearances = appearances;

            m_ObjectTypes       = new List <AppearanceType>(m_ProtoAppearances.Objects.Count);
            m_MarketObjectTypes = new List <AppearanceType>();
            foreach (var appearance in m_ProtoAppearances.Objects)
            {
                var type = new AppearanceType(appearance.ID, appearance, AppearanceCategory.Object);
                m_ObjectTypes.Add(type);
                if (type.IsMarket)
                {
                    m_MarketObjectTypes.Add(type);
                }
            }

            m_ObjectTypes.Sort((a, b) => {
                return(a.ID.CompareTo(b.ID));
            });

            m_EffectTypes = new List <AppearanceType>(m_ProtoAppearances.Effects.Count);
            foreach (var appearance in m_ProtoAppearances.Effects)
            {
                m_EffectTypes.Add(new AppearanceType(appearance.ID, appearance, AppearanceCategory.Effect));
            }

            m_MissileTypes = new List <AppearanceType>(m_ProtoAppearances.Missles.Count);
            foreach (var appearance in m_ProtoAppearances.Missles)
            {
                m_MissileTypes.Add(new AppearanceType(appearance.ID, appearance, AppearanceCategory.Missile));
            }

            m_OutfitTypes = new List <AppearanceType>(m_ProtoAppearances.Outfits.Count);
            foreach (var appearance in m_ProtoAppearances.Outfits)
            {
                m_OutfitTypes.Add(new AppearanceType(appearance.ID, appearance, AppearanceCategory.Outfit));
            }

            m_InvisibleOutfitType = m_EffectTypes[13 - 1];
        }
Esempio n. 4
0
        public void SetProtoAppearances(Protobuf.Appearances.Appearances appearances)
        {
            _protoAppearances = appearances;

            _objectTypes       = new List <AppearanceType>(_protoAppearances.Objects.Count);
            _marketObjectTypes = new List <AppearanceType>();
            foreach (var appearance in _protoAppearances.Objects)
            {
                var type = new AppearanceType(appearance.ID, appearance, AppearanceCategory.Object);
                _objectTypes.Add(type);
                if (type.IsMarket)
                {
                    _marketObjectTypes.Add(type);
                }
            }

            _objectTypes.Sort((a, b) => {
                return(a._id.CompareTo(b._id));
            });

            _effectTypes = new List <AppearanceType>(_protoAppearances.Effects.Count);
            foreach (var appearance in _protoAppearances.Effects)
            {
                _effectTypes.Add(new AppearanceType(appearance.ID, appearance, AppearanceCategory.Effect));
            }

            _missileTypes = new List <AppearanceType>(_protoAppearances.Missles.Count);
            foreach (var appearance in _protoAppearances.Missles)
            {
                _missileTypes.Add(new AppearanceType(appearance.ID, appearance, AppearanceCategory.Missile));
            }

            _outfitTypes = new List <AppearanceType>(_protoAppearances.Outfits.Count);
            foreach (var appearance in _protoAppearances.Outfits)
            {
                _outfitTypes.Add(new AppearanceType(appearance.ID, appearance, AppearanceCategory.Outfit));
            }

            _invisibleOutfitType = _effectTypes[13 - 1];
        }
Esempio n. 5
0
        public async Task <bool> BeginProcessing()
        {
            await Task.Yield();

            var defaultPath = Path.Combine(m_ClientVersion.ToString(), m_BuildVersion.ToString(), "assets");

            string catalogContentFile = Path.Combine(defaultPath, "catalog-content.json");

            if (!File.Exists(catalogContentFile))
            {
                Console.WriteLine("catalog-content.json not found at {0}", catalogContentFile);
                return(false);
            }

            ParseCatalogContent(catalogContentFile);

            string datFile = Path.Combine(m_ClientVersion.ToString(), m_BuildVersion.ToString(), "assets", m_AppearancesFile);

            if (!File.Exists(datFile))
            {
                Console.WriteLine("appearances.dat not found at {0}", datFile);
                return(false);
            }

            var bytes            = File.ReadAllBytes(datFile);
            var tibiaAppearances = Tibia.Protobuf.Appearances.Appearances.Parser.ParseFrom(bytes);

            var openTibiaAppearances = new Protobuf.Appearances.Appearances();

            foreach (var tibiaAppearance in tibiaAppearances.Object)
            {
                openTibiaAppearances.Objects.Add(ConvertAppearance(tibiaAppearance));
            }
            foreach (var tibiaAppearance in tibiaAppearances.Outfit)
            {
                openTibiaAppearances.Outfits.Add(ConvertAppearance(tibiaAppearance));
            }
            foreach (var tibiaAppearance in tibiaAppearances.Effect)
            {
                openTibiaAppearances.Effects.Add(ConvertAppearance(tibiaAppearance));
            }
            foreach (var tibiaAppearance in tibiaAppearances.Missile)
            {
                openTibiaAppearances.Missles.Add(ConvertAppearance(tibiaAppearance));
            }

            if (tibiaAppearances.SpecialMeaningAppearanceIds != null)
            {
                openTibiaAppearances.SpecialMeaningAppearanceIDs                 = new Protobuf.Appearances.SpecialMeaningAppearanceIds();
                openTibiaAppearances.SpecialMeaningAppearanceIDs.GoldCoinId      = tibiaAppearances.SpecialMeaningAppearanceIds.GoldCoinId;
                openTibiaAppearances.SpecialMeaningAppearanceIDs.PlatinumCoinId  = tibiaAppearances.SpecialMeaningAppearanceIds.PlatinumCoinId;
                openTibiaAppearances.SpecialMeaningAppearanceIDs.CrystalCoinId   = tibiaAppearances.SpecialMeaningAppearanceIds.CrystalCoinId;
                openTibiaAppearances.SpecialMeaningAppearanceIDs.TibiaCoinId     = tibiaAppearances.SpecialMeaningAppearanceIds.TibiaCoinId;
                openTibiaAppearances.SpecialMeaningAppearanceIDs.StampedLetterId = tibiaAppearances.SpecialMeaningAppearanceIds.StampedLetterId;
                openTibiaAppearances.SpecialMeaningAppearanceIDs.SupplyStashId   = tibiaAppearances.SpecialMeaningAppearanceIds.SupplyStashId;
            }

            m_JsonTokens.Add(new AppearancesToken()
            {
                file = "appearances.dat"
            });

            Directory.CreateDirectory(Path.Combine(m_ClientVersion.ToString(), m_BuildVersion.ToString(), "result"));

            // saving appearances.dat (with the respective version)
            using (var stream = File.Create(Path.Combine(m_ClientVersion.ToString(), m_BuildVersion.ToString(), "result", "appearances.dat"))) {
                openTibiaAppearances.WriteTo(stream);
            }

            Console.Write("Processing Spritesheets...");
            Directory.CreateDirectory(Path.Combine(m_ClientVersion.ToString(), m_BuildVersion.ToString(), "result", "sprites"));

            var spriteBuffer = new MemoryStream();

            foreach (var spriteType in m_SpriteSheet)
            {
                var spriteFile = Path.Combine(defaultPath, spriteType.File);
                if (!File.Exists(spriteFile))
                {
                    continue;
                }

                var decoder = new SevenZip.Compression.LZMA.Decoder();
                using (BinaryReader reader = new BinaryReader(File.OpenRead(spriteFile))) {
                    var input = reader.BaseStream;

                    while (reader.ReadByte() == 0)
                    {
                    }
                    reader.ReadUInt32();

                    while ((reader.ReadByte() & 0x80) == 0x80)
                    {
                    }                                              // LZMA size, 7-bit integer where MSB = flag for next byte used

                    // LZMA file
                    decoder.SetDecoderProperties(reader.ReadBytes(5));
                    reader.ReadUInt64(); // Should be the decompressed size but CIP writes the compressed sized, so just use a large buffer size

                    // Disabled arithmetic underflow/overflow check in debug mode so this won't cause an exception
                    spriteBuffer.Position = 0;
                    decoder.Code(input, spriteBuffer, input.Length - input.Position, 0x100000, null);

                    spriteBuffer.Position = 0;
                    var image = Image.FromStream(spriteBuffer);

                    var filename = string.Format("sprites-{0}-{1}.png", spriteType.FirstSpriteID, spriteType.LastSpriteID);
                    var path     = Path.Combine(m_ClientVersion.ToString(), m_BuildVersion.ToString(), "result", "sprites", filename);
                    image.Save(path, ImageFormat.Png);

                    m_JsonTokens.Add(new SpritesToken()
                    {
                        file          = filename,
                        spritetype    = spriteType.SpriteType,
                        firstspriteid = (int)spriteType.FirstSpriteID,
                        lastspriteid  = (int)spriteType.LastSpriteID,
                    });
                }
            }

            spriteBuffer.Dispose();
            Console.WriteLine("\rProcessing Spritesheets: Done!");

            // saving spritesheets information (catalog-content)
            using (FileStream file = File.Create(Path.Combine(m_ClientVersion.ToString(), m_BuildVersion.ToString(), "result", "catalog-content.json"))) {
                var catalogJson = new JArray();
                foreach (var token in m_JsonTokens)
                {
                    catalogJson.Add(token.GetJObject());
                }

                string str = catalogJson.ToString();
                file.Write(Encoding.ASCII.GetBytes(str), 0, str.Length);
            }

            return(true);
        }
        public async Task <bool> BeginProcessing()
        {
            await Task.Yield();

            var loadPath   = Path.Combine(m_ClientVersion.ToString(), m_BuildVersion.ToString(), "assets");
            var resultPath = Path.Combine(m_ClientVersion.ToString(), m_BuildVersion.ToString(), "result");

            string catalogContentFile = Path.Combine(loadPath, "catalog-content.json");

            if (!File.Exists(catalogContentFile))
            {
                Console.WriteLine("catalog-content.json not found at {0}", catalogContentFile);
                return(false);
            }

            ParseCatalogContent(catalogContentFile);

            string datFile = Path.Combine(loadPath, m_AppearancesFile);

            if (!File.Exists(datFile))
            {
                Console.WriteLine("appearances.dat not found at {0}", datFile);
                return(false);
            }

            var bytes            = File.ReadAllBytes(datFile);
            var tibiaAppearances = Tibia.Protobuf.Appearances.Appearances.Parser.ParseFrom(bytes);

            var openTibiaAppearances = new Protobuf.Appearances.Appearances();

            foreach (var tibiaAppearance in tibiaAppearances.Object)
            {
                openTibiaAppearances.Objects.Add(ConvertAppearance(tibiaAppearance));
            }
            foreach (var tibiaAppearance in tibiaAppearances.Outfit)
            {
                openTibiaAppearances.Outfits.Add(ConvertAppearance(tibiaAppearance));
            }
            foreach (var tibiaAppearance in tibiaAppearances.Effect)
            {
                openTibiaAppearances.Effects.Add(ConvertAppearance(tibiaAppearance));
            }
            foreach (var tibiaAppearance in tibiaAppearances.Missile)
            {
                openTibiaAppearances.Missles.Add(ConvertAppearance(tibiaAppearance));
            }

            if (tibiaAppearances.SpecialMeaningAppearanceIds != null)
            {
                openTibiaAppearances.SpecialMeaningAppearanceIDs                 = new Protobuf.Appearances.SpecialMeaningAppearanceIds();
                openTibiaAppearances.SpecialMeaningAppearanceIDs.GoldCoinId      = tibiaAppearances.SpecialMeaningAppearanceIds.GoldCoinId;
                openTibiaAppearances.SpecialMeaningAppearanceIDs.PlatinumCoinId  = tibiaAppearances.SpecialMeaningAppearanceIds.PlatinumCoinId;
                openTibiaAppearances.SpecialMeaningAppearanceIDs.CrystalCoinId   = tibiaAppearances.SpecialMeaningAppearanceIds.CrystalCoinId;
                openTibiaAppearances.SpecialMeaningAppearanceIDs.TibiaCoinId     = tibiaAppearances.SpecialMeaningAppearanceIds.TibiaCoinId;
                openTibiaAppearances.SpecialMeaningAppearanceIDs.StampedLetterId = tibiaAppearances.SpecialMeaningAppearanceIds.StampedLetterId;
                openTibiaAppearances.SpecialMeaningAppearanceIDs.SupplyStashId   = tibiaAppearances.SpecialMeaningAppearanceIds.SupplyStashId;
            }

            Directory.CreateDirectory(resultPath);

            // saving appearances.dat (with the respective version)
            using (var stream = File.Create(Path.Combine(resultPath, "appearances.otud"))) {
                openTibiaAppearances.WriteTo(stream);
            }

            Console.Write("Processing Spritesheets...");

            using (var spriteStream = new FileStream(Path.Combine(resultPath, "assets.otus"), FileMode.Create))
                using (var binaryWriter = new BinaryWriter(spriteStream)) {
                    binaryWriter.Write((uint)m_SpriteSheet.Count);

                    var spriteBuffer = new MemoryStream();
                    foreach (var spriteType in m_SpriteSheet)
                    {
                        var spriteFile = Path.Combine(loadPath, spriteType.File);
                        if (!File.Exists(spriteFile))
                        {
                            continue;
                        }

                        var decoder = new SevenZip.Compression.LZMA.Decoder();
                        using (BinaryReader reader = new BinaryReader(File.OpenRead(spriteFile))) {
                            binaryWriter.Write(spriteType.AtlasID);
                            binaryWriter.Write((ushort)spriteType.SpriteType);
                            binaryWriter.Write(spriteType.FirstSpriteID);
                            binaryWriter.Write(spriteType.LastSpriteID);

                            while (reader.ReadByte() == 0)
                            {
                            }
                            reader.ReadUInt32();

                            while ((reader.ReadByte() & 0x80) == 0x80)
                            {
                            }
                            decoder.SetDecoderProperties(reader.ReadBytes(5));
                            reader.ReadUInt64();

                            spriteBuffer.Position = 0;
                            var input = reader.BaseStream;
                            decoder.Code(input, spriteBuffer, input.Length - input.Position, 0x100000, null);

                            spriteBuffer.Position = 0;
                            var image = Image.FromStream(spriteBuffer);

                            using (MemoryStream tmpStream = new MemoryStream()) {
                                image.Save(tmpStream, ImageFormat.Png);

                                uint length = (uint)tmpStream.Length;
                                tmpStream.Position = 0;

                                byte[] buffer = new byte[length];
                                tmpStream.Read(buffer, 0, (int)length);

                                binaryWriter.Write(length);
                                binaryWriter.Write(buffer);
                            }
                        }
                    }

                    spriteBuffer.Dispose();
                }

            Console.WriteLine("\rProcessing Spritesheets: Done!");
            return(true);
        }