示例#1
0
        public override IRedHandle <T> ReadCHandle <T>()
        {
            var handle = new CHandle <T>();

            int pointer;

            if (header.version == 2)
            {
                pointer = _reader.ReadInt16();
            }
            else if (header.version == 3 || header.version == 04)
            {
                pointer = _reader.ReadInt32();
            }
            else
            {
                throw new NotImplementedException(nameof(ReadCHandle));
            }

            if (!HandleQueue.ContainsKey(pointer))
            {
                HandleQueue.Add(pointer, new List <IRedBaseHandle>());
            }

            HandleQueue[pointer].Add(handle);

            return(handle);
        }
示例#2
0
文件: Plugin.cs 项目: ondax/Sitrep
 public override void Enable()
 {
     Singleton     = this;
     NetworkThread = new Thread(Network.Init);
     NetworkThread.Start();
     Timing.RunCoroutine(HandleQueue.Handle());
     Timing.RunCoroutine(Methods.UpdateStatus());
     AddEventHandler(new Events());
     Events            = Config.GetStringList("enabled_events");
     CustomChannelIds  = GetStringULongDictionary(Config.GetStringDictionary("custom_channel_ids"));
     CommandsChannelId = Config.GetULong("commands_channel_id");
     EventsId          = Config.GetULong("events_channel_id");
     Info("Succesfully enabled!");
 }
示例#3
0
        public override IRedWeakHandle <T> ReadCWeakHandle <T>()
        {
            var handle = new CWeakHandle <T>();

            var pointer = _reader.ReadInt32();

            if (!HandleQueue.ContainsKey(pointer))
            {
                HandleQueue.Add(pointer, new List <IRedBaseHandle>());
            }

            HandleQueue[pointer].Add(handle);

            return(handle);
        }
        public DataQueueWriter()
        {
            Q = new ManagedQueue<Expression<Action>>();
            LocateDataService();

            locked = false;

            Q.Changed += new EventHandler(delegate(object s, EventArgs ex)
            {
                if (Q.Count > 0)
                {
                    var handle = new HandleQueue(HQueue);
                    handle.BeginInvoke(null, null);
                }
            });
        }
示例#5
0
        public EFileReadErrorCodes ReadBuffer(RedBuffer buffer, Type fileRootType)
        {
            _hashService = Locator.Current.GetService <IHashService>();

            var _chunks = new List <RedBaseClass>();

            var result = new Package04();

            _outputFile = result;

            header.version = BaseReader.ReadUInt16();
            if (header.version < 2 || header.version > 4)
            {
                return(EFileReadErrorCodes.UnsupportedVersion);
            }

            header.numSections = _reader.ReadUInt16();
            if (header.numSections < 6 || header.numSections > 7)
            {
                return(EFileReadErrorCodes.UnsupportedVersion);
            }

            result.Version  = header.version;
            result.Sections = header.numSections;

            header.numComponents = _reader.ReadUInt32();

            if (header.numSections == 7)
            {
                header.refPoolDescOffset = _reader.ReadUInt32();
                header.refPoolDataOffset = _reader.ReadUInt32();
            }

            header.namePoolDescOffset = _reader.ReadUInt32();
            header.namePoolDataOffset = _reader.ReadUInt32();

            header.chunkDescOffset = _reader.ReadUInt32();
            header.chunkDataOffset = _reader.ReadUInt32();

            if (header.numSections == 7 && header.refPoolDescOffset != 0)
            {
                return(EFileReadErrorCodes.NoCr2w);
            }

            if (header.refPoolDescOffset != 0)
            {
                return(EFileReadErrorCodes.NoCr2w);
            }

            if (fileRootType == typeof(gamePersistentStateDataResource))
            {
                var numCruids = _reader.ReadUInt32();
                for (var i = 0; i < numCruids; i++)
                {
                    result.RootCruids.Add(_reader.ReadUInt64());
                }
            }
            else if (fileRootType != typeof(inkWidgetLibraryResource))
            {
                result.CruidIndex = _reader.ReadInt16();
                var numCruids = _reader.ReadUInt16();

                for (var i = 0; i < numCruids; i++)
                {
                    result.RootCruids.Add(_reader.ReadUInt64());
                }
            }

            var baseOff = BaseStream.Position;

            // read refs
            var refCount = (header.refPoolDataOffset - header.refPoolDescOffset) / 4;

            BaseStream.Position = baseOff + header.refPoolDescOffset;
            var refDesc = BaseStream.ReadStructs <Package04ImportHeader>(refCount);

            var readAsHash = fileRootType == typeof(appearanceAppearanceResource);

            foreach (var r in refDesc)
            {
                BaseStream.Position = baseOff + r.offset;
                importsList.Add(ReadImport(r, readAsHash));
            }

            // read strings
            var nameCount = (header.namePoolDataOffset - header.namePoolDescOffset) / 4;

            BaseStream.Position = baseOff + header.namePoolDescOffset;
            var nameDesc = BaseStream.ReadStructs <Package04NameHeader>(nameCount);

            foreach (var s in nameDesc)
            {
                BaseStream.Position = baseOff + s.offset;
                _namesList.Add(ReadName(s));
            }

            // read chunks
            var chunkCount = (header.chunkDataOffset - header.chunkDescOffset) / 8;

            BaseStream.Position = baseOff + header.chunkDescOffset;
            var chunkDesc = BaseStream.ReadStructs <Package04ChunkHeader>(chunkCount);

            for (var i = 0; i < chunkDesc.Length; i++)
            {
                _chunks.Add(ReadChunk(chunkDesc[i]));
            }

            var newChunks = new List <RedBaseClass>();

            for (var i = 0; i < _chunks.Count; i++)
            {
                if (!HandleQueue.ContainsKey(i))
                {
                    newChunks.Add(_chunks[i]);
                    continue;
                }

                foreach (var handle in HandleQueue[i])
                {
                    handle.SetValue(_chunks[i]);
                }
            }

            result.Chunks = newChunks;

            buffer.Data = result;

            return(EFileReadErrorCodes.NoError);
        }