
    d{Ig7                     (   d Z ddlmZ ddlmZ ddlmZ ddlZi ddddd	d
dddddddddddddddddddddd d!d"d#d$d%d&i d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdDdFdGi dHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`d_dadbdcdddedfdgdhdidjdkdkdldmdndodpdqdrdsdtdudvZdw Z	 G dx dye
          Z G dz d{e          Z G d| d}e
          Z G d~ de          Z G d de
          ZdS )z
Handles a single chunk of data (16x16x128 blocks) from a Minecraft save.

For more information about the chunck format:
https://minecraft.gamepedia.com/Chunk_format
    )BytesIO)pack)ceilNair   stone   grass_block   dirt   cobblestone   
oak_planks   sapling   bedrock   flowing_water	   water
   flowing_lava   lava   sand   gravel   gold_ore   iron_ore   coal_ore   oak_log   
oak_leaves   sponge   glass   	lapis_ore   	sandstone   cobweb   grass    	dead_bush#   
white_wool%   	dandelion&   poppy'   brown_mushroom(   red_mushroom+   
stone_slab,   /   	bookshelf0   mossy_cobblestone1   obsidian2   torch3   fire4   spawner5   
oak_stairs6   chest8   diamond_ore:   crafting_table;   wheat<   farmland=   furnace>   ?   sign@   oak_doorA   ladderB   railcobblestone_stairsoak_pressure_plateredstone_oresnowicecactusclay
sugar_cane	oak_fencepumpkinlit_pumpkin	iron_bars
glass_pane)C   H   I   J   N   O   Q   R   S   U   V   [   e   f   c                     	 t           |          }n7# t          $ r* d| fz  }t          d| z             t          d           Y nw xY w|S )Nz
unknown_%dzwarning: unknown block id %iz+hint: add that block to the 'block_ids' map)	block_idsKeyErrorprint)bidnames     K/var/www/CMSBlueprintStation/venv/lib/python3.11/site-packages/nbt/chunk.pyblock_id_to_namer   X   si    =~ = = =sf$,s2333;<<<<<= Ks    1AAc                   $    e Zd ZdZd Zd Zd ZdS )Chunkz&Class for representing a single chunk.c                 ^    |d         | _         | j         d         | j         d         f| _        d S )NLevelxPoszPos)
chunk_datacoordsselfnbts     r   __init__zChunk.__init__f   s+    g,of-dof.EE    c                 J    | j         d         j        | j         d         j        fS )z%Return the coordinates of this chunk.r   r   )r   valuer   s    r   
get_coordszChunk.get_coordsj   s    A$T[^%9::r   c                 ~    dt          | j        d                   z   dz   t          | j        d                   z   dz   S )z&Return a representation of this Chunk.zChunk(r   ,r   ))strr   r   s    r   __repr__zChunk.__repr__n   s8    DKN+++C/DKN0C0CCCGGr   N)__name__
__module____qualname____doc__r   r   r    r   r   r   r   d   sO        00F F F; ; ;H H H H Hr   r   c                   &    e Zd Zd Zd Zd Zd ZdS )McRegionChunkc                     t                               | |           t          | j        d         j        | j        d         j                  | _        d S )NBlocksData)r   r   
BlockArrayr   r   blocksr   s     r   r   zMcRegionChunk.__init__w   s@    tS!!! !:!@$/RXBYB_``r   c                     dS )N   r   r   s    r   get_max_heightzMcRegionChunk.get_max_height{   s    sr   c                 X    t          | j                            |||                    }|S N)r   r   	get_block)r   xyzr   s        r   r   zMcRegionChunk.get_block~   s(     5 5aA > >??r   c              #      K   t          dd          D ]A}t          dd          D ].}t          dd          D ]}|                     |||          V  /Bd S )Nr      r%   )ranger   )r   r   r   r   s       r   
iter_blockzMcRegionChunk.iter_block   s~      q# 	2 	2A1b\\ 2 2q" 2 2A..Aq11111122	2 	2r   N)r   r   r   r   r   r   r   r   r   r   r   r   u   sS        a a a    2 2 2 2 2r   r   c                   2    e Zd Zd Zd Zd Zd Zd Zd ZdS )AnvilSectionc                 >   g | _         g | _        |dk    s|dk    r|                     |           nR|dk    r|dk    r|                     |           n0|dk    r|dk    r|                     |           nt                      t          | j                  dk    sJ d S )Nr   ?  _  i  i
  
     )namesindexes_init_array_init_index_unpadded_init_index_paddedNotImplementedErrorlen)r   r   versions      r   r   zAnvilSection.__init__   s    

 a<<7d??S!!!!__D%%c****__D##C((((%''' 4<  D((((((r   c                 V   g }|d         j         D ]j}	 |                    |          }n7# t          $ r* |                    |           t	          |          dz
  }Y nw xY w| j                            |           k|D ]+}t          |          }| j                            |           ,d S )Nr   r   )r   index
ValueErrorappendr   r   r   r   )r   r   bidsr   ibnames         r   r   zAnvilSection._init_array   s    x=& 	# 	#C"JJsOO " " "C   IIM" L"""" 	% 	%C$S))EJe$$$$	% 	%s   )1AAc                    |d         D ])}|d         j         }| j                            |           *|d         j         }t          | j                  dz
                                  }|dk     rd}|t          |          dz  dz  k    sJ t          d|          dz
  }d	}d}|d	         }	t          d	d          D ]}
|d	k    r|dz   }||         }	d}||k    r(| j                            |	|z             |	|z	  }	||z
  }E|dz   }||         }||z
  }|t          d|          dz
  z  |z  }|	t          d|          dz
  z  }	| j                            ||	z             ||         }	|	|z	  }	d|z
  }d S )
NPaletteNameBlockStatesr   r   rc   r   r	   r   )r   r   r   r   
bit_lengthpowr   r   )r   r   pr   statesnum_bitsmaskr   	bits_left	curr_long_	next_longremaining_bitss                r   r   z!AnvilSection._init_index_unpadded   s   Y 	$ 	$AV9?DJd####]#)
 
OOa'3355a<<A3v;;+d222221h!#	1I	q 	0 	0AA~~E"1I		9$$##I$4555%1	%0		E"1I	!)I!5&#a*@*@1*DE)S	&#a*;*;a*?@	##I	$9:::"1I	%7	/		+	0 	0r   c                    |d         D ])}|d         j         }| j                            |           *|d         j         }t          | j                  dz
                                  }|dk     rd}d|z  dz
  }d|z  }d|z  }|d	k    r|}t          |          t          d|z            k    sJ t          t          |          dz
            D ]>}	||	         }
t          |          D ]$}| j                            |
|z             |
|z	  }
%?|d
         }
t          |          D ]$}| j                            |
|z             |
|z	  }
%d S )Nr   r   r   r   r   r	   rc   r   r   )r   r   r   r   r   r   r   r   )r   r   r   r   r   r   r   indexes_per_elementlast_state_elementsr   longr   s               r   r   zAnvilSection._init_index_padded   s   Y 	$ 	$AV9?DJd####]#)
OOa'3355a<<A({Q Hn"%88!##;N%86{{d4*=#=>>>>>>s6{{1}%% 	( 	(A!9D.// ( (##D4K000x'(
 bz*++ 	$ 	$ALt,,,8#DD	$ 	$r   c                 R    |dz  |dz  z   |z   }| j         |         }| j        |         S )N   r%   )r   r   )r   r   r   r   r   r   s         r   r   zAnvilSection.get_block  s0    Ga"fq LOz!}r   c              #   h   K   t          dd          D ]}| j        |         }| j        |         V  d S )Nr   r   )r   r   r   )r   r   r   s      r   r   zAnvilSection.iter_block  sG      q$ 	  	 AQA*Q-	  	 r   N)	r   r   r   r   r   r   r   r   r   r   r   r   r   r      sp        ) ) )0% % %$)0 )0 )0^$ $ $@           r   r   c                   ,    e Zd Zd Zd Zd Zd Zd ZdS )
AnvilChunkc                 ~   t                               | |           	 |d         j        }|dk    r|dk    s|dk    st          d|fz            n# t          $ r d}Y nw xY wi | _        d| j        v rI| j        d         D ]=}d|                                v r#t          ||          | j        |d	         j        <   <d S d S )
NDataVersionr   r   r   zDataVersion %d not implementedr   Sectionsr   Y)	r   r   r   r   r   sectionsr   keysr   )r   r   r   ss       r   r   zAnvilChunk.__init__  s    tS!!!	-(.G$47d??)*JgZ*WXXX 	 	 	GGG	
 ((_Z0 K K AFFHH,,2>q'2J2JDM!C&,/ )(K Ks   2A AAc                 2    || j         v r| j         |         S dS )zGet a section from Y index.N)r   )r   r   s     r   get_sectionzAnvilChunk.get_section/  s!    =##tr   c                 ^    d}| j                                         D ]
}||k    r|}|dz  dz   S )Nr   r%   r#   )r   r   )r   ymaxr   s      r   r   zAnvilChunk.get_max_height7  s@    ##%% 	" 	"A4xxby2~r   c                     t          |d          \  }}|                     |          }|dk    rdS |                    |||          S )z Get a block from relative x,y,z.r%   N)divmodr   r   )r   r   r   r   sybysections          r   r   zAnvilChunk.get_block>  sL    q"2""2&&d??4  B***r   c              #   x   K   | j                                         D ]}|                                D ]}|V  d S r   )r   valuesr   )r   r   bs      r   r   zAnvilChunk.iter_blockH  sT      %%'' 	 	A\\^^  	 	r   N)r   r   r   r   r   r   r   r   r   r   r   r   r     sb        K K K0    + + +    r   r   c                   P    e Zd ZdZddZd ZddZddZddZdd	Z	ddZ
ddZdS )r   z;Convenience class for dealing with a Block/data byte array.Nc                    t          |t          t          j        f          rt          |          | _        ndgdz  | _        t          |t          t          j        f          rt          |          | _        dS dgdz  | _        dS )z>Create a new BlockArray, defaulting to no block or data bytes.r   i   i @  N)
isinstance	bytearrayarraylist
blocksListdataList)r   blocksBytes	dataBytess      r   r   zBlockArray.__init__P  st    kIu{#;<< 	(";//DOO c%iDOi)U[!9:: 	& OODMMMCIDMMMr   c                 x    d}d}d}i }| j         D ])}|||||f<   |dz  }|dk    rd}|dz  }|dk    rd}|dz  }*|S )z6Return a dictionary with block ids keyed to (x, y, z).r   r   r   r#   r  )r   cur_xcur_ycur_zr   block_ids         r   get_blocks_structzBlockArray.get_blocks_struct\  su     	 	H*2FE%&'QJE
BJJEQJEr   Fc                     |rFt          | j                  }t          t          d|          |                                 z             S t          j        d| j                                                  S )z*Return a list of all blocks in this chunk.>iB)r   r  r   r   get_blocks_byte_arrayr  tostringr   bufferlengths      r   r  z BlockArray.get_blocks_byte_arrayn  sc     	@))F4f--d.H.H.J.JJKKK;sDO44==???r   c                     |rFt          | j                  }t          t          d|          |                                 z             S t          j        d| j                                                  S )z3Return a list of data for all blocks in this chunk.r  r  )r   r  r   r   get_data_byte_arrayr  r  r  s      r   r  zBlockArray.get_data_byte_arrayv  sb     	>''F4f--d.F.F.H.HHIII;sDM22;;===r   c                    g d}|r2t          t          dd          |                                 z             S g }t          d          D ]h}t          d          D ]V}t          ddd          D ]B}||dz  z   |dz  dz  z   }| j        |         |vs|dk    r|                    |d	z               nCWi|r|S t          j        d
|                                          S )zHReturn a heightmap, representing the highest solid blocks in this chunk.)	r   r   r   r   r   r=   r;   r7   r5   r  r   r%   r   r   r   r   r   r  )r   r   generate_heightmapr   r  r   r  r  )	r   r  as_array
non_solidsbytesr   r   r   offsets	            r   r  zBlockArray.generate_heightmap~  s   666
 	:4c??4+B+B+D+DDEEEE2YY " "r " "A"3B// " "!"QsUQsU2X!5 OF3:EEa!LL1---!E JP"  :{3..77999r   c                    |r|| _         n|rg }t          d          D ]}t          d          D ]}t          d          D ]}}|||f}||dz  z   |dz  dz  z   }||v r|                    ||                    8| j         |         r#|s!|                    | j         |                    h|                    d           ~|| _         ndS dS )z
        Sets all blocks in this chunk, using either a list or dictionary.  
        Blocks not explicitly set can be filled to air by setting fill_air to True.
        r%   r   r   FT)r  r   r   )	r   r  dictfill_airr   r   r   coordr  s	            r   
set_blockszBlockArray.set_blocks  s   
  	"DOO 	D2YY / /r 
/ 
/A"3ZZ 	/ 	/ !!A!"QsUQsU2X!5!TMM KKU4444 $ 7 / / $DOF,C D D D D $A	/
/ #DOO 5tr   r   c                     ||dz  z   |dz  dz  z   }|| j         |<   |dz  dk    r*|dz
  dz  }| j        |         }|dz  |dz  z   | j        |<   dS |dz  }| j        |         }|dz  |dz  dz  z   | j        |<   dS )	zBSets the block a x, y, z to the specified id, and optionally data.r   r%   r	   r      r#   r   N)r  r  )	r   r   r   r   iddatar  r   r   s	            r   	set_blockzBlockArray.set_block  s    QsUQsU2X%"$QJ!OOAXMEe$A$%Gr	#:DM%    AIEe$A$%Ftqy3#?DM%   r   c                     	 |dk    r||dz  z   |dz  dz  z   n"|d         |d         dz  z   |d         dz  dz  z   }| j         |         S )z&Return the id of the block at x, y, z.Fr   r%   r   r	   r   r  )r   r   r   r   r!  r  s         r   r   zBlockArray.get_block  sh    	 +05..QsUQsU2X%%uQx%PQ(SV,?VY^_`YabeYefhYh?hv&&r   )NN)F)FF)NNF)r   )r   r   r   r   r   r  r  r  r  r"  r'  r   r   r   r   r   r   N  s        EE
& 
& 
& 
&  $@ @ @ @> > > >: : : :&   :@ @ @ @ ' ' ' ' ' 'r   r   )r   ior   structr   mathr   r  r   r   objectr   r   r   r   r   r   r   r   <module>r-     sv                      BBB B 	B
 B B B B B B B B B B B  !B" #B B$ %B& 'B( )B* +B, -B. /B0 1B2 3B4 5B6 7B8 9B: ;B< 	=B> ?B@ ABB CBD EB B BF 	GBH IBJ KBL MBN OBP QBR SBT UBV 	WBX YBZ [B\ ]B^ _B` aBb cBd eBf gB Bh 
													CB B B	J  H H H H HF H H H"2 2 2 2 2E 2 2 2,E  E  E  E  E 6 E  E  E T6 6 6 6 6 6 6 6r@' @' @' @' @' @' @' @' @' @'r   