Exemplo n.º 1
0
        public void Load(int findex, byte[] payload)
        {
            var s = new DefaultJagexBuffer(payload);

            s.Position(payload.Length - 8);

            int flagPos = s.ReadUShort();
            int modPos  = s.ReadUShort();
            int lenPos  = s.ReadUShort();
            int skinPos = s.ReadUShort();

            int position   = 0;
            var infoStream = new DefaultJagexBuffer(payload);

            infoStream.Position(position);

            position += flagPos + 2;
            var flagStream = new DefaultJagexBuffer(payload);

            flagStream.Position(position);

            position += modPos;
            var modifierStream = new DefaultJagexBuffer(payload);

            modifierStream.Position(position);

            position += lenPos;
            var lengthStream = new DefaultJagexBuffer(payload);

            lengthStream.Position(position);

            position += skinPos;
            var skinStream = new DefaultJagexBuffer(payload);

            skinStream.Position(position);

            var sl = new SkinList(skinStream);

            var count = infoStream.ReadUShort();
            var skins = new int[500];
            var vertX = new int[500];
            var vertY = new int[500];
            var vertZ = new int[500];

            for (var i = 0; i < count; i++)
            {
                var id = infoStream.ReadUShort();
                if (id >= instance.Length)
                {
                    continue;
                }

                var a = instance[id] = new SequenceFrame();
                a.Length   = lengthStream.ReadUByte();
                a.Skinlist = sl;

                var frameCount = infoStream.ReadUByte();
                var lastIdx    = -1;
                var frameIdx   = 0;
                for (var index = 0; index < frameCount; index++)
                {
                    var vertex_mask = flagStream.ReadUByte();
                    if (vertex_mask > 0)
                    {
                        if (sl.Opcodes[index] != 0)
                        {
                            for (var opp = index - 1; opp > lastIdx; opp--)
                            {
                                if (sl.Opcodes[opp] == 0)
                                {
                                    skins[frameIdx] = opp;
                                    vertX[frameIdx] = 0;
                                    vertY[frameIdx] = 0;
                                    vertZ[frameIdx] = 0;
                                    frameIdx++;
                                    break;
                                }
                            }
                        }

                        skins[frameIdx] = index;
                        var vertex = 0;
                        if (sl.Opcodes[index] == 3)
                        {
                            vertex = 128;
                        }

                        if ((vertex_mask & 1) != 0)
                        {
                            vertX[frameIdx] = modifierStream.ReadSmart();
                        }
                        else
                        {
                            vertX[frameIdx] = vertex;
                        }

                        if ((vertex_mask & 2) != 0)
                        {
                            vertY[frameIdx] = modifierStream.ReadSmart();
                        }
                        else
                        {
                            vertY[frameIdx] = vertex;
                        }

                        if ((vertex_mask & 4) != 0)
                        {
                            vertZ[frameIdx] = modifierStream.ReadSmart();
                        }
                        else
                        {
                            vertZ[frameIdx] = vertex;
                        }

                        lastIdx = index;
                        frameIdx++;
                    }
                }

                a.FrameCount = frameIdx;
                a.Vertices   = new int[frameIdx];
                a.VertexX    = new int[frameIdx];
                a.VertexY    = new int[frameIdx];
                a.VertexZ    = new int[frameIdx];
                for (var j = 0; j < frameIdx; j++)
                {
                    a.Vertices[j] = skins[j];
                    a.VertexX[j]  = vertX[j];
                    a.VertexY[j]  = vertY[j];
                    a.VertexZ[j]  = vertZ[j];
                }
            }
        }