func (o *ObjectData) ReadFrom(r io.Reader) (n int64, err error) { var rw must.ReadWriter o.Data = rw.ReadInt32(r) if o.Data != 0 { o.SpeedX = rw.ReadInt16(r) o.SpeedY = rw.ReadInt16(r) o.SpeedZ = rw.ReadInt16(r) } return rw.Result() }
func (re *Region) ReadFrom(r io.Reader) (n int64, err error) { var rw must.ReadWriter // Copy everything to a buffer. Max size: 4MB + 8KB var all bytes.Buffer rw.Must(io.Copy(&all, r)) // Read chunk positions. for i := 0; i < len(re.Pos); i++ { // Read 4KB offset from file start. Only first 3 bytes needed. re.Pos[i] = rw.ReadInt32(&all) >> 8 // Fourth byte is a 4KB section counter which is ignored because we // already know the length of chunk data. // // More info here: // http://www.minecraftwiki.net/wiki/Region_file_format#Structure // // " The remainder of the file consists of data for up to 1024 chunks, // interspersed with an arbitrary amount of unused space. " // // TLDR: Just another idiotic/bad designed spec. } // Read chunk timestamps. // // Last modification time of a chunk. Unit: unknown, seconds? // // NOTE: Does something use this? MCEdit maybe? for i := 0; i < len(re.Mod); i++ { re.Mod[i] = rw.ReadInt32(&all) } // Read chunk data. for i := 0; i < len(re.Data); i++ { re.Data[i].Length = rw.ReadInt32(&all) re.Data[i].Compression = byte(rw.ReadInt8(&all)) var buf bytes.Buffer io.CopyN(&buf, &all, length-1) switch scheme { case Gzip: panic("Alpha chunk format not implemented.") case Zlib: zr := zlib.NewReader(&all) io.Copy(&buf, zr) } re.Data[i].Chunk = buf.Bytes() } return rw.Result() }