@@ -217,58 +217,38 @@ public Chunk getChunk(Vector2i chunkPos) throws IOException {
217217 private Chunk loadChunk (Vector2i chunkPos ) throws IOException {
218218 Vector2i regionPos = chunkToRegion (chunkPos );
219219 Path regionPath = getMCAFilePath (regionPos );
220+
221+ try (RandomAccessFile raf = new RandomAccessFile (regionPath .toFile (), "r" )) {
220222
221- Throwable exception = null ;
222-
223- for (int tries = 1 ; tries <= 5 ; tries ++) {
224- if (tries > 1 ) {
225- try {
226- Thread .sleep (200 );
227- } catch (InterruptedException interrupt ) {
228- throw new IOException ("Interrupted while waiting for the " + tries + "th try to load a chunk.." );
229- }
230- }
223+ int xzChunk = Math .floorMod (chunkPos .getY (), 32 ) * 32 + Math .floorMod (chunkPos .getX (), 32 );
231224
232- try (RandomAccessFile raf = new RandomAccessFile (regionPath .toFile (), "r" )) {
225+ raf .seek (xzChunk * 4 );
226+ int offset = raf .read () << 16 ;
227+ offset |= (raf .read () & 0xFF ) << 8 ;
228+ offset |= raf .read () & 0xFF ;
229+ offset *= 4096 ;
233230
234- int xzChunk = Math .floorMod (chunkPos .getY (), 32 ) * 32 + Math .floorMod (chunkPos .getX (), 32 );
235-
236- raf .seek (xzChunk * 4 );
237- int offset = raf .read () << 16 ;
238- offset |= (raf .read () & 0xFF ) << 8 ;
239- offset |= raf .read () & 0xFF ;
240- offset *= 4096 ;
241-
242- int size = raf .readByte () * 4096 ;
243- if (size == 0 ) {
244- return Chunk .empty (this , chunkPos );
245- }
246-
247- raf .seek (offset + 4 ); // +4 skip chunk size
248-
249- byte compressionTypeByte = raf .readByte ();
250- CompressionType compressionType = CompressionType .getFromID (compressionTypeByte );
251- if (compressionType == null ) {
252- throw new IOException ("invalid compression type " + compressionTypeByte );
253- }
254-
255- DataInputStream dis = new DataInputStream (new BufferedInputStream (compressionType .decompress (new FileInputStream (raf .getFD ()))));
256- Tag <?> tag = Tag .deserialize (dis , Tag .DEFAULT_MAX_DEPTH );
257- if (tag instanceof CompoundTag ) {
258- return Chunk .create (this , (CompoundTag ) tag );
259- } else {
260- throw new IOException ("invalid data tag: " + (tag == null ? "null" : tag .getClass ().getName ()));
261- }
262-
263- } catch (FileNotFoundException ex ) {
231+ int size = raf .readByte () * 4096 ;
232+ if (size == 0 ) {
264233 return Chunk .empty (this , chunkPos );
265- } catch (Throwable ex ) {
266- exception = ex ;
234+ }
235+
236+ raf .seek (offset + 4 ); // +4 skip chunk size
237+
238+ byte compressionTypeByte = raf .readByte ();
239+ CompressionType compressionType = CompressionType .getFromID (compressionTypeByte );
240+ if (compressionType == null ) {
241+ throw new IOException ("invalid compression type " + compressionTypeByte );
242+ }
243+
244+ DataInputStream dis = new DataInputStream (new BufferedInputStream (compressionType .decompress (new FileInputStream (raf .getFD ()))));
245+ Tag <?> tag = Tag .deserialize (dis , Tag .DEFAULT_MAX_DEPTH );
246+ if (tag instanceof CompoundTag ) {
247+ return Chunk .create (this , (CompoundTag ) tag );
248+ } else {
249+ throw new IOException ("invalid data tag: " + (tag == null ? "null" : tag .getClass ().getName ()));
267250 }
268251 }
269-
270- if (exception == null ) throw new IOException ("Failed to load chunk after multiple attempts!" );
271- throw new IOException ("Failed to load chunk after multiple attempts!" , exception );
272252 }
273253
274254 @ Override
0 commit comments