рдкрд░рд┐рдЪрдп
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд▓рдЧрднрдЧ рд╕рднреА рд╣рдмреНрд░ рдХреЗ рдкрд╛рдардХреЛрдВ рдиреЗ рдорд╛рдЗрдирдХреНрд░рд╛рдлреНрдЯ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реБрдирд╛, рдХрд┐рд╕реА рдиреЗ рдПрдХрд▓ рдореЗрдВ рдЦреЗрд▓рд╛, рдХрд┐рд╕реА рдиреЗ рдХрдИ рд╕рд░реНрд╡рд░реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдПрдХ рд╣рдмреНрд░рдпреВрдЬрд╝рд░реНрд╕ рдХреЗ рдкрд╛рд╕ рдПрдХ рдЫреЛрдЯрд╛ рд╕рд░реНрд╡рд░ рдерд╛ред рджреЛ рдорд╣реАрдиреЗ рдЦреЗрд▓рдиреЗ рдХреЗ рдмрд╛рдж, рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реБрдЖ - рдХреНрдпрд╛ рдореЗрд░рд╛ рдЕрдкрдирд╛ рдореИрдк рдЬрдирд░реЗрдЯрд░ рд▓рд┐рдЦрдирд╛ рд╕рдВрднрд╡ рд╣реИ? рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рдирд┐рдХрд▓рд╛, рдпрд╣ рдХреБрдЫ рджрд┐рдиреЛрдВ рдХреЗ рдЗрддреНрдореАрдирд╛рди рд╕реЗ рдЧреБрдЧрд▓реА рдФрд░ рдХреЛрдбрд┐рдВрдЧ рдореЗрдВ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИред
рдереЛрдбрд╝рд╛ рддрдХрдиреАрдХреА рд╣рд┐рд╕реНрд╕рд╛
рдЦрджрд╛рди
рд╡рд┐рдХреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдирдХреНрд╢реЗ рдХреНрд╖реЗрддреНрд░реАрдп рдлрд╝рд╛рдЗрд▓реЛрдВ (16x16x128 рдХреНрдпреВрдмреНрд╕ рдХреЗ 32x32 рдмреНрд▓реЙрдХ, рдХреБрд▓ 262144 рд╡рд░реНрдЧ рдмреНрд▓реЙрдХ рдкреНрд░рддрд┐ рдХреНрд╖реЗрддреНрд░) рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдЬрд┐рдирдХреА рдирд┐рдореНрди рд╕рдВрд░рдЪрдирд╛ рд╣реИ:
- 4096 рдмрд╛рдЗрдЯреНрд╕ рдЬрд┐рдирдореЗрдВ рдЪреЛрдХ рдСрдлрд╝рд╕реЗрдЯ (рддрдерд╛рдХрдерд┐рдд 16x16x128 рдмреНрд▓реЙрдХ) рдФрд░ 4kb рдХреЗ рдмреНрд▓реЙрдХ рдореЗрдВ рдЙрдирдХрд╛ рдЖрдХрд╛рд░, рдЧреЛрд▓ рдЖрдХрд╛рд░, 3 рдмрд╛рдЗрдЯреНрд╕ рдСрдлрд╝рд╕реЗрдЯ, 1 - рдЖрдХрд╛рд░
- рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк рд╡рд┐рдЦрдВрдбреВ рдХреЗ 4096 рдмрд╛рдЗрдЯреНрд╕, рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рддрд┐ 4 рдмрд╛рдЗрдЯреНрд╕
- рдлрд╝рд╛рдЗрд▓ рдХреЗ рдЕрдВрдд рддрдХ рд╢реЗрд╖ рд╕реНрдерд╛рди, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЬрд╝реНрд▓рд┐рдм рджреНрд╡рд╛рд░рд╛ рд╕рдВрдкреАрдбрд╝рд┐рдд рдбреЗрдЯрд╛ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИред 4 рдмрд╛рдЗрдЯреНрд╕ - рд╕рдВрдкреАрдбрд╝рд┐рдд рдбреЗрдЯрд╛ рдХрд╛ рдЖрдХрд╛рд░, 1 - рд╕рдВрдкреАрдбрд╝рди рд╡рд┐рдзрд┐ (рдбрд┐рдлрд╝реЙрд▓реНрдЯ 2, Zlib (RFC1950)), рдЖрдХрд╛рд░ -1 NBT рд╕рдВрд░рдЪрдирд╛ zlib рдХреЗ рд╕рд╛рде рдкреИрдХ рдХреА рдЬрд╛рддреА рд╣реИ, рдЕрд░реНрдерд╛рдд рдХреНрдпреВрдм рдХрдВрдЯреЗрдирд░ рд╕реНрд╡рдпрдВ
рдпрджрд┐ рдкреИрдХ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдбреЗрдЯрд╛ 4 рдХреЗрдмреА рдХреЗ рд╕реЗрдХреНрдЯрд░реЛрдВ рдХреЗ рдкреВрд░реНрдгрд╛рдВрдХ рд╕рдВрдЦреНрдпрд╛ рд╕реЗ рдХрдо рд╣реЛрддрд╛ рд╣реИ, рддреЛ рд╢реЗрд╖ рд╕реЗрдХреНрдЯрд░ рд╢реВрдиреНрдп рд╕реЗ рднрд░ рдЬрд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдмрдВрдХ рдХреЛ рдСрдлрд╕реЗрдЯ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬрд┐рд╕реЗ 4096 рдмрд╛рдЗрдЯреНрд╕ рдХреЗ рд╕реЗрдХреНрдЯрд░реЛрдВ рдХреЗ рдкреВрд░реНрдгрд╛рдВрдХ рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рд╡реНрдпрдХреНрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рднрд╛рд╖рд╛ рдЪрдпрди
рдЖрдк рдХрд┐рд╕реА рднреА рднрд╛рд╖рд╛ рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХреА рд╕рдВрд░рдЪрдирд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдореИрдВрдиреЗ рдбреЗрд▓реНрдлреА 7. рдмрдВрдж рдХрд░ рджрд┐рдпрд╛ред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдпрд╣ рдПрдХрдорд╛рддреНрд░ рдРрд╕реА рднрд╛рд╖рд╛ рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВ рдЬрд╛рдирддрд╛ рд╣реВрдВ, рдФрд░ рджреВрд╕рд░реА рдмрд╛рдд, рдпрд╣ 4 рд╕рд╛рд▓ рдкрд╣рд▓реЗ рдХреЗ рд╕рдВрд╕реНрдХрд░рдг 7 рдкрд░ рдереА рдХрд┐ рдореИрдВрдиреЗ рдЬреБрдЖ рд╕реЗ рдореИрдиреБрдЕрд▓ рдкрд░ рдиреЛрдЯрдмреБрдХ рд▓рд┐рдЦрдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛ рдерд╛ред
рдХреЛрдб
рдЪреВрдВрдХрд┐ рдбреЗрдЯрд╛ рд╕рдВрдкреАрдбрд╝рд┐рдд рд░реВрдк рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ
zlib рдореЙрдбреНрдпреВрд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред
рдореИрдВрдиреЗ
ZlibEx рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдПрдХ рдЪрдВрдХ рдХреНрд▓рд╛рд╕ рдмрдирд╛рдПрдВ, рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдмрд╛рдж рдореЗрдВ рдбреЗрдЯрд╛ рд▓рд┐рдЦреЗрдВрдЧреЗ
Tchunk = class(TObject) private public Data: tmemorystream; c_data: tmemorystream; c_stream: tzcompressionstream; constructor Create; procedure writeblock(x, y, z, block: integer); overload; procedure writeblock(x, y, z, block, color: integer); overload; procedure compress; end;
рдЗрд╕ рд╡рд░реНрдЧ рдХреЗ рд▓рд┐рдП рдХреЛрдб рд╣реИ:
constructor tchunk.Create; begin Data := TMemoryStream.Create; Data.size := 82360; Data.LoadFromFile('data.bin'); c_data := TMemoryStream.Create; c_stream := tzcompressionstream.Create(c_data, zcdefault, 15, 8, zsdefault); end; procedure tchunk.writeblock(x, y, z, block: integer); begin Data.Seek(form1.getoffset(x, y, z) + 16487, 0); Data.Write(block, 1); end; procedure tchunk.compress; var buffer: array [0..82360] of byte; begin c_data.Position := 0; Data.Position := 0; Data.Read(buffer, 82360); c_stream.writebuffer(buffer, 82360); c_stream.Free; c_data.SaveToFile('file' + IntToStr(n)); end;
рдЧреЗрдЯрдСрдлрд╝рд╕реЗрдЯ рдлрд╝рдВрдХреНрд╢рди рдлреЙрд░реНрдореВрд▓рд╛
y + ( z *128 + ( x * 128 * 16 ) )
рджреНрд╡рд╛рд░рд╛ рд╡рд╛рдВрдЫрд┐рдд рдСрдлрд╕реЗрдЯ
рд▓реМрдЯрд╛рддрд╛ рд╣реИ y + ( z *128 + ( x * 128 * 16 ) )
function tform1.getoffset(x, y, z: integer): integer; begin Result := y + (z * 128 + (x * 128 * 16)); end;
рдЪрд░ рдореЗрдВ рдЬреЛрдбрд╝реЗ рдХреЗ рдХреБрдЫ рдЬреЛрдбрд╝реЗ:
chunks:array[0..32] of array[0..32] of tchunk; n: integer=0;
рддреИрдпрд╛рд░ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕рднреА рд╡рд┐рдЦрдВрдбреВ рдХреЛ рд╕рдореНтАНрдорд┐рд▓рд┐рдд рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛:
procedure tform1.SwapEndiannessOfBytes(var Value: cardinal); var tmp: cardinal; i: integer; begin tmp := 0; for i := 0 to sizeof(Value) - 1 do Inc(tmp, ((Value shr (8 * i)) and $FF) shl (8 * (sizeof(Value) - i - 1))); Value := tmp; end; procedure tform1.generatefile; var fileoffset: integer; time, compressiontype, counter: integer; filename: string; regionfile: tfilestream; tmp: cardinal; size: integer; n_x, n_z: integer; bu: array[0..99999] of byte; n: integer; roundedsize: integer; neededsize: integer; d: byte; begin fileoffset := 2; time := $d8de2f4e; compressiontype := $02; filename := GetVar('Appdata') + '\.minecraft\saves\NewWorld\region\r.0.0.mcr'; regionfile := tfilestream.Create(filename, fmcreate); n := 0; for n_x := 0 to 31 do for n_z := 0 to 31 do begin chunks[n_x][n_z].compress; roundedsize := ((chunks[n_x][n_z].c_data.Size) div 4096); if (((chunks[n_x][n_z].c_data.Size) mod 4096) > 0) then Inc(roundedsize); regionfile.seek((4 * ((n_x mod 32) + (n_z mod 32) * 32)), 0); tmp := fileoffset; SwapEndiannessOfBytes(tmp); tmp := tmp shr 8; regionfile.Write(tmp, 4); regionfile.seek(4 * ((n_x mod 32) + (n_z mod 32) * 32) + 3, 0); regionfile.Write(roundedsize, 1); size := chunks[n_x][n_z].c_data.Size + 1; regionfile.seek(fileoffset * 4096, 0); tmp := size; SwapEndiannessOfBytes(tmp); regionfile.Write(tmp, 4); regionfile.Write(compressiontype, 1); chunks[n_x][n_z].c_data.Position := 0; chunks[n_x][n_z].c_data.readbuffer(bu, chunks[n_x][n_z].c_data.size); regionfile.Writebuffer(bu, chunks[n_x][n_z].c_data.size); regionfile.seek((n) * 4 + 4096, 0); regionfile.Write(time, 4); fileoffset := fileoffset + ((chunks[n_x][n_z].c_data.Size) div 4096); if (((chunks[n_x][n_z].c_data.Size) mod 4096) > 0) then fileoffset := fileoffset + 1; Inc(n); end; neededsize := 4096 * fileoffset - regionfile.Size - 1; regionfile.Seek(regionfile.Size, 0); d := 00; for n := 0 to neededsize do regionfile.Write(d, 1); regionfile.Free; end;
рдпрд╣реА рд╣реИ, рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреНрд╖реЗрддреНрд░ рдХреЗ рднреАрддрд░ рдХрд┐рд╕реА рднреА рд╕рдордиреНрд╡рдп рджреНрд╡рд╛рд░рд╛ рдХрд┐рд╕реА рднреА рдмреНрд▓реЙрдХ рдХреЛ рд░рд┐рдХреЙрд░реНрдб рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реИред рдпрджрд┐ рд╡рд╛рдВрдЫрд┐рдд рд╣реИ, рддреЛ рдмрд╛рдХреА рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рджреЛрд╣рд░рд╛рдирд╛ рдЖрд╕рд╛рди рд╣реИ, рдЖрдкрдХреЛ рдХреЛрдб 10 рдХреА рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд▓рдкреЗрдЯреЗрдВ:
procedure tform1.writeworld(x, y, z, block: integer); var xw, zw: integer; begin xw := (x div 16); zw := (z div 16); chunks[xw][zw].writeblock(x mod 16, y, z mod 16, block); end;
рджреБрдирд┐рдпрд╛ рдХреА рдкреАрдврд╝реА, рдЗрд╕рдХреЗ рд╕рдВрдкреАрдбрд╝рди рдФрд░ рд╕рдВрд░рдХреНрд╖рдгред
procedure TForm1.Button4Click(Sender: TObject); var x, y, z: integer; xx, zz: integer; image: tbitmap; begin for xx := 0 to 31 do for zz := 0 to 31 do begin chunks[xx][zz] := tchunk.Create; end; image := tbitmap.Create; image.LoadFromFile('image.bmp'); for x:=0 to 127 do for y:=0 to 116 do begin if image.Canvas.Pixels[x,y]=clblack then form1.writeworld(x,117-y,0,49); if image.Canvas.Pixels[x,117-y]=clwhite then form1.writeworld(x,y,0,80); end; form1.generatefile;
рдкрд░рд┐рдгрд╛рдо:


рдЖрдк рди рдХреЗрд╡рд▓ рдкрд┐рдХреНрд╕реЗрд▓ рдХрд▓рд╛, рдмрд▓реНрдХрд┐ рдордирдорд╛рдиреЗ рдЖрдХрд╛рд░ рдЙрддреНрдкрдиреНрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣ рд╕рдм рдХрд┐рд╕реА рднреА рд╕реВрддреНрд░ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рд╕рд╛рдЗрдирд╕реЙрдЗрдб рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд┐рдВрдЧ:

рдпрд╣рд╛рдВ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛
рд╣реИ ред
рдЬреНрдЮрд╛рдд рдХреАрдбрд╝реЗ:
- рдЙрддреНрдкрдиреНрди рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рд╕рд╣реЗрдЬрдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИ (рд╕рдВрднрд╡рддрдГ рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рдХрд┐ рдЙрд╕реА рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк рдХреЛ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ, рдЬреЛ level.dat рдореЗрдВ рдЕрдВрддрд┐рдо рдмрдЪрдд рдХреЗ рд╕рдордп рдХреЗ рд╕рд╛рде рдореЗрд▓ рдирд╣реАрдВ рдЦрд╛рддрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВ рдмрд╛рдж рдХреЗ рдкреНрд░рд╛рд░реВрдк рдХреЗ рд╕рд╛рде рдЗрд╕рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рддрд╛ рд╣реВрдВ - рдореИрдВ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реВрдВрдЧрд╛)
- рдореИрдХрдПрдбрд┐рдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реНрдкреЙрди рдХреЛ рдлрд┐рд░ рд╕реЗ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдХрд╛рдлреА рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рдкреАрдврд╝реА рдХреЗ рдмрд╛рдж рдпрд╣ рдЬрдореАрди рдХреЗ рдКрдкрд░ рдПрдХ рд╕реМ рдмреНрд▓реЙрдХ рд╣реЛрдЧрд╛, рдЬреЛ рдореМрдд рд╕реЗ рднрд░рд╛ рд╣реБрдЖ рд╣реИ (рдЗрд╕реЗ рд▓реЗрд╡рд▓рдЯреИрдЯ рдореЗрдВ рднреА рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ)
- рдХреЛрдИ рдкреНрд░рдХрд╛рд╢ рдкреАрдврд╝реА рдирд╣реАрдВ рд╣реИ, рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рд╕рднреА рдмреНрд▓реЙрдХреЛрдВ рдХреЛ рд░реЛрд╢рди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рднреВрдорд┐рдЧрдд (рдкреНрд░рдХрд╛рд╢ рдЧрдгрдирд╛ рдПрдХ рдЕрд▓рдЧ рдЧрдВрднреАрд░ рдХрд╛рд░реНрдп рд╣реИ рдЬрдм рддрдХ рдХрд┐ рдЗрд╕реЗ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рди рд╣реЛ)
рдЯреВрдбреВ:
- рд╕реЗрд╡ рдХреА рдорд░рдореНрдордд рдХрд░реЗрдВ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХреЗ рдмрд┐рдирд╛, рдЖрдзрд╛ рдЕрд░реНрде рдЦреЛ рдЬрд╛рддрд╛ рд╣реИ
- рдЕрддрд┐рд░рд┐рдХреНрдд рдЬрд╛рдирдХрд╛рд░реА рд░рд┐рдХреЙрд░реНрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдХрд░реЗрдВ (рдКрди рдХрд╛ рд░рдВрдЧ, рдкрддреНрддреЗ, рд╕реНрдЯреЛрд╡ рдХрд╛ рдЙрдиреНрдореБрдЦреАрдХрд░рдг, рдЖрджрд┐) // рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рддреИрдпрд╛рд░
- рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкрд░рд┐рджреГрд╢реНрдп (рдкрд╣рд╛рдбрд╝рд┐рдпрд╛рдБ / рдШрд░ / рдЭреАрд▓реЗрдВ)
рдЕрдкрдбреЗрдЯ:- рд╕рдВрд╢реЛрдзрд┐рдд
generatefile
, рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рд╕рд╛рд░ рдХрд┐рдпрд╛ - рдХреЛрдб рд╕реНрд╡рд░реВрдкрдг
- рдПрдХ
dditional block data
рд░реЗрдЦрд╛рдВрдХрд┐рдд dditional block data
, рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рджреЗрдЦреЗрдВ, рд▓рд┐рдВрдХ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛
рд╕рдВрджрд░реНрдн: