<s> """<STR_LIT>""" <EOL> import locale , os , sys <EOL> import re , math <EOL> from struct import pack , unpack <EOL> try : <EOL> import nbt <EOL> except ImportError : <EOL> extrasearchpath = os . path . realpath ( os . path . join ( __file__ , os . pardir , os . pardir ) ) <EOL> if not os . path . exists ( os . path . join ( extrasearchpath , '<STR_LIT>' ) ) : <EOL> raise <EOL> sys . path . append ( extrasearchpath ) <EOL> from nbt . region import RegionFile <EOL> from nbt . chunk import Chunk <EOL> from nbt . world import WorldFolder , McRegionWorldFolder <EOL> try : <EOL> from PIL import Image <EOL> except ImportError : <EOL> sys . stderr . write ( "<STR_LIT>" ) <EOL> sys . exit ( <NUM_LIT> ) <EOL> def get_heightmap_image ( chunk , buffer = False , gmin = False , gmax = False ) : <EOL> points = chunk . blocks . generate_heightmap ( buffer , True ) <EOL> hmin = min ( points ) if ( gmin == False ) else gmin <EOL> hmax = max ( points ) if ( gmax == False ) else gmax <EOL> hdelta = hmax - hmin + <NUM_LIT:0.0> <EOL> pixels = "<STR_LIT>" <EOL> for y in range ( <NUM_LIT:16> ) : <EOL> for x in range ( <NUM_LIT:16> ) : <EOL> offset = ( <NUM_LIT:15> - x ) * <NUM_LIT:16> + y <EOL> height = int ( ( points [ offset ] - hmin ) / hdelta * <NUM_LIT:255> ) <EOL> if ( height < <NUM_LIT:0> ) : height = <NUM_LIT:0> <EOL> if ( height > <NUM_LIT:255> ) : height = <NUM_LIT:255> <EOL> pixels += pack ( "<STR_LIT>" , height ) <EOL> im = Image . fromstring ( '<STR_LIT:L>' , ( <NUM_LIT:16> , <NUM_LIT:16> ) , pixels ) <EOL> return im <EOL> def get_map ( chunk ) : <EOL> pixels = b"<STR_LIT>" <EOL> block_colors = { <EOL> <NUM_LIT:0> : { '<STR_LIT:h>' : <NUM_LIT:0> , '<STR_LIT:s>' : <NUM_LIT:0> , '<STR_LIT:l>' : <NUM_LIT:0> } , <EOL> <NUM_LIT:1> : { '<STR_LIT:h>' : <NUM_LIT:0> , '<STR_LIT:s>' : <NUM_LIT:0> , '<STR_LIT:l>' : <NUM_LIT:32> } , <EOL> <NUM_LIT:2> : { '<STR_LIT:h>' : <NUM_LIT> , '<STR_LIT:s>' : <NUM_LIT> , '<STR_LIT:l>' : <NUM_LIT:32> } , <EOL> <NUM_LIT:3> : { '<STR_LIT:h>' : <NUM_LIT> , '<STR_LIT:s>' : <NUM_LIT> , '<STR_LIT:l>' : <NUM_LIT:15> } , <EOL> <NUM_LIT:4> : { '<STR_LIT:h>' : <NUM_LIT:0> , '<STR_LIT:s>' : <NUM_LIT:0> , '<STR_LIT:l>' : <NUM_LIT> } , <EOL> <NUM_LIT:8> : { '<STR_LIT:h>' : <NUM_LIT> , '<STR_LIT:s>' : <NUM_LIT:50> , '<STR_LIT:l>' : <NUM_LIT> } , <EOL> <NUM_LIT:9> : { '<STR_LIT:h>' : <NUM_LIT> , '<STR_LIT:s>' : <NUM_LIT:50> , '<STR_LIT:l>' : <NUM_LIT> } , <EOL> <NUM_LIT:10> : { '<STR_LIT:h>' : <NUM_LIT:16> , '<STR_LIT:s>' : <NUM_LIT:100> , '<STR_LIT:l>' : <NUM_LIT> } , <EOL> <NUM_LIT:11> : { '<STR_LIT:h>' : <NUM_LIT:16> , '<STR_LIT:s>' : <NUM_LIT:100> , '<STR_LIT:l>' : <NUM_LIT> } , <EOL> <NUM_LIT:12> : { '<STR_LIT:h>' : <NUM_LIT> , '<STR_LIT:s>' : <NUM_LIT> , '<STR_LIT:l>' : <NUM_LIT> } , <EOL> <NUM_LIT> : { '<STR_LIT:h>' : <NUM_LIT> , '<STR_LIT:s>' : <NUM_LIT> , '<STR_LIT:l>' : <NUM_LIT:20> } , <EOL> <NUM_LIT> : { '<STR_LIT:h>' : <NUM_LIT> , '<STR_LIT:s>' : <NUM_LIT> , '<STR_LIT:l>' : <NUM_LIT:15> } , <EOL> <NUM_LIT> : { '<STR_LIT:h>' : <NUM_LIT> , '<STR_LIT:s>' : <NUM_LIT:64> , '<STR_LIT:l>' : <NUM_LIT> } , <EOL> <NUM_LIT> : { '<STR_LIT:h>' : <NUM_LIT> , '<STR_LIT:s>' : <NUM_LIT> , '<STR_LIT:l>' : <NUM_LIT> } , <EOL> <NUM_LIT> : { '<STR_LIT:h>' : <NUM_LIT> , '<STR_LIT:s>' : <NUM_LIT:100> , '<STR_LIT:l>' : <NUM_LIT> } , <EOL> <NUM_LIT> : { '<STR_LIT:h>' : <NUM_LIT:0> , '<STR_LIT:s>' : <NUM_LIT:100> , '<STR_LIT:l>' : <NUM_LIT:50> } , <EOL> <NUM_LIT:50> : { '<STR_LIT:h>' : <NUM_LIT> , '<STR_LIT:s>' : <NUM_LIT:100> , '<STR_LIT:l>' : <NUM_LIT:50> } , <EOL> <NUM_LIT> : { '<STR_LIT:h>' : <NUM_LIT> , '<STR_LIT:s>' : <NUM_LIT:100> , '<STR_LIT:l>' : <NUM_LIT:50> } , <EOL> <NUM_LIT> : { '<STR_LIT:h>' : <NUM_LIT> , '<STR_LIT:s>' : <NUM_LIT> , '<STR_LIT:l>' : <NUM_LIT:50> } , <EOL> <NUM_LIT> : { '<STR_LIT:h>' : <NUM_LIT> , '<STR_LIT:s>' : <NUM_LIT> , '<STR_LIT:l>' : <NUM_LIT:15> } , <EOL> <NUM_LIT> : { '<STR_LIT:h>' : <NUM_LIT> , '<STR_LIT:s>' : <NUM_LIT:10> , '<STR_LIT:l>' : <NUM_LIT> } , <EOL> <NUM_LIT> : { '<STR_LIT:h>' : <NUM_LIT> , '<STR_LIT:s>' : <NUM_LIT:10> , '<STR_LIT:l>' : <NUM_LIT> } , <EOL> <NUM_LIT> : { '<STR_LIT:h>' : <NUM_LIT> , '<STR_LIT:s>' : <NUM_LIT> , '<STR_LIT:l>' : <NUM_LIT:20> } , <EOL> <NUM_LIT> : { '<STR_LIT:h>' : <NUM_LIT:7> , '<STR_LIT:s>' : <NUM_LIT> , '<STR_LIT:l>' : <NUM_LIT> } , <EOL> <NUM_LIT> : { '<STR_LIT:h>' : <NUM_LIT> , '<STR_LIT:s>' : <NUM_LIT> , '<STR_LIT:l>' : <NUM_LIT:50> } , <EOL> <NUM_LIT> : { '<STR_LIT:h>' : <NUM_LIT> , '<STR_LIT:s>' : <NUM_LIT:100> , '<STR_LIT:l>' : <NUM_LIT> } , <EOL> <NUM_LIT> : { '<STR_LIT:h>' : <NUM_LIT> , '<STR_LIT:s>' : <NUM_LIT:100> , '<STR_LIT:l>' : <NUM_LIT> } , <EOL> } <EOL> for z in range ( <NUM_LIT:16> ) : <EOL> for x in range ( <NUM_LIT:16> ) : <EOL> ground_height = <NUM_LIT> <EOL> tints = [ ] <EOL> for y in range ( <NUM_LIT> , - <NUM_LIT:1> , - <NUM_LIT:1> ) : <EOL> block_id = chunk . blocks . get_block ( x , y , z ) <EOL> block_data = chunk . blocks . get_data ( x , y , z ) <EOL> if ( block_id == <NUM_LIT:8> or block_id == <NUM_LIT:9> ) : <EOL> tints . append ( { '<STR_LIT:h>' : <NUM_LIT> , '<STR_LIT:s>' : <NUM_LIT:50> , '<STR_LIT:l>' : <NUM_LIT> } ) <EOL> elif ( block_id == <NUM_LIT> ) : <EOL> if ( block_data == <NUM_LIT:1> ) : <EOL> tints . append ( { '<STR_LIT:h>' : <NUM_LIT> , '<STR_LIT:s>' : <NUM_LIT:64> , '<STR_LIT:l>' : <NUM_LIT> } ) <EOL> elif ( block_data == <NUM_LIT:2> ) : <EOL> tints . append ( { '<STR_LIT:h>' : <NUM_LIT> , '<STR_LIT:s>' : <NUM_LIT> , '<STR_LIT:l>' : <NUM_LIT:10> } ) <EOL> else : <EOL> tints . append ( { '<STR_LIT:h>' : <NUM_LIT> , '<STR_LIT:s>' : <NUM_LIT:64> , '<STR_LIT:l>' : <NUM_LIT> } ) <EOL> elif ( block_id == <NUM_LIT> ) : <EOL> tints . append ( { '<STR_LIT:h>' : <NUM_LIT> , '<STR_LIT:s>' : <NUM_LIT:5> , '<STR_LIT:l>' : <NUM_LIT> } ) <EOL> elif ( block_id == <NUM_LIT> ) : <EOL> tints . append ( { '<STR_LIT:h>' : <NUM_LIT> , '<STR_LIT:s>' : <NUM_LIT:100> , '<STR_LIT:l>' : <NUM_LIT:50> } ) <EOL> elif ( block_id != <NUM_LIT:0> or y == <NUM_LIT:0> ) : <EOL> ground_height = y <EOL> break <EOL> color = block_colors [ block_id ] if ( block_id in block_colors ) else { '<STR_LIT:h>' : <NUM_LIT:0> , '<STR_LIT:s>' : <NUM_LIT:0> , '<STR_LIT:l>' : <NUM_LIT:100> } <EOL> height_shift = ( ground_height - <NUM_LIT:64> ) * <NUM_LIT> <EOL> final_color = { '<STR_LIT:h>' : color [ '<STR_LIT:h>' ] , '<STR_LIT:s>' : color [ '<STR_LIT:s>' ] , '<STR_LIT:l>' : color [ '<STR_LIT:l>' ] + height_shift } <EOL> if final_color [ '<STR_LIT:l>' ] > <NUM_LIT:100> : final_color [ '<STR_LIT:l>' ] = <NUM_LIT:100> <EOL> if final_color [ '<STR_LIT:l>' ] < <NUM_LIT:0> : final_color [ '<STR_LIT:l>' ] = <NUM_LIT:0> <EOL> for tint in reversed ( tints ) : <EOL> final_color = hsl_slide ( final_color , tint , <NUM_LIT> ) <EOL> rgb = hsl2rgb ( final_color [ '<STR_LIT:h>' ] , final_color [ '<STR_LIT:s>' ] , final_color [ '<STR_LIT:l>' ] ) <EOL> pixels += pack ( "<STR_LIT>" , rgb [ <NUM_LIT:0> ] , rgb [ <NUM_LIT:1> ] , rgb [ <NUM_LIT:2> ] ) <EOL> im = Image . frombytes ( '<STR_LIT>' , ( <NUM_LIT:16> , <NUM_LIT:16> ) , pixels ) <EOL> return im <EOL> def hsl_slide ( hsl1 , hsl2 , ratio ) : <EOL> if ( abs ( hsl2 [ '<STR_LIT:h>' ] - hsl1 [ '<STR_LIT:h>' ] ) > <NUM_LIT> ) : <EOL> if ( hsl1 [ '<STR_LIT:h>' ] > hsl2 [ '<STR_LIT:h>' ] ) : <EOL> hsl1 [ '<STR_LIT:h>' ] -= <NUM_LIT> <EOL> else : <EOL> hsl1 [ '<STR_LIT:h>' ] += <NUM_LIT> <EOL> p1x = math . cos ( math . radians ( hsl1 [ '<STR_LIT:h>' ] ) ) * hsl1 [ '<STR_LIT:s>' ] <EOL> p1y = math . sin ( math . radians ( hsl1 [ '<STR_LIT:h>' ] ) ) * hsl1 [ '<STR_LIT:s>' ] <EOL> p2x = math . cos ( math . radians ( hsl2 [ '<STR_LIT:h>' ] ) ) * hsl2 [ '<STR_LIT:s>' ] <EOL> p2y = math . sin ( math . radians ( hsl2 [ '<STR_LIT:h>' ] ) ) * hsl2 [ '<STR_LIT:s>' ] <EOL> avg_x = p1x + ratio * ( p2x - p1x ) <EOL> avg_y = p1y + ratio * ( p2y - p1y ) <EOL> avg_h = math . atan ( avg_y / avg_x ) <EOL> avg_s = avg_y / math . sin ( avg_h ) <EOL> avg_l = hsl1 [ '<STR_LIT:l>' ] + ratio * ( hsl2 [ '<STR_LIT:l>' ] - hsl1 [ '<STR_LIT:l>' ] ) <EOL> avg_h = math . degrees ( avg_h ) <EOL> return { '<STR_LIT:h>' : avg_h , '<STR_LIT:s>' : avg_s , '<STR_LIT:l>' : avg_l } <EOL> def hsl2rgb ( H , S , L ) : <EOL> H = H / <NUM_LIT> <EOL> S = S / <NUM_LIT> <EOL> L = L / <NUM_LIT> <EOL> if ( S == <NUM_LIT:0> ) : <EOL> return ( int ( L * <NUM_LIT:255> ) , int ( L * <NUM_LIT:255> ) , int ( L * <NUM_LIT:255> ) ) <EOL> var_2 = L * ( <NUM_LIT:1> + S ) if ( L < <NUM_LIT:0.5> ) else ( L + S ) - ( S * L ) <EOL> var_1 = <NUM_LIT:2> * L - var_2 <EOL> def hue2rgb ( v1 , v2 , vH ) : <EOL> if ( vH < <NUM_LIT:0> ) : vH += <NUM_LIT:1> <EOL> if ( vH > <NUM_LIT:1> ) : vH -= <NUM_LIT:1> <EOL> if ( ( <NUM_LIT:6> * vH ) < <NUM_LIT:1> ) : return v1 + ( v2 - v1 ) * <NUM_LIT:6> * vH <EOL> if ( ( <NUM_LIT:2> * vH ) < <NUM_LIT:1> ) : return v2 <EOL> if ( ( <NUM_LIT:3> * vH ) < <NUM_LIT:2> ) : return v1 + ( v2 - v1 ) * ( <NUM_LIT:2> / <NUM_LIT> - vH ) * <NUM_LIT:6> <EOL> return v1 <EOL> R = int ( <NUM_LIT:255> * hue2rgb ( var_1 , var_2 , H + ( <NUM_LIT:1.0> / <NUM_LIT:3> ) ) ) <EOL> G = int ( <NUM_LIT:255> * hue2rgb ( var_1 , var_2 , H ) ) <EOL> B = int ( <NUM_LIT:255> * hue2rgb ( var_1 , var_2 , H - ( <NUM_LIT:1.0> / <NUM_LIT:3> ) ) ) <EOL> return ( R , G , B ) <EOL> def main ( world_folder , show = True ) : <EOL> world = McRegionWorldFolder ( world_folder ) <EOL> bb = world . get_boundingbox ( ) <EOL> map = Image . new ( '<STR_LIT>' , ( <NUM_LIT:16> * bb . lenx ( ) , <NUM_LIT:16> * bb . lenz ( ) ) ) <EOL> t = world . chunk_count ( ) <EOL> try : <EOL> i = <NUM_LIT:0.0> <EOL> for chunk in world . iter_chunks ( ) : <EOL> if i % <NUM_LIT:50> == <NUM_LIT:0> : <EOL> sys . stdout . write ( "<STR_LIT>" ) <EOL> elif i % <NUM_LIT:2> == <NUM_LIT:0> : <EOL> sys . stdout . write ( "<STR_LIT:.>" ) <EOL> sys . stdout . flush ( ) <EOL> elif i % <NUM_LIT:50> == <NUM_LIT> : <EOL> sys . stdout . write ( "<STR_LIT>" % ( <NUM_LIT:100> * i / t ) ) <EOL> i += <NUM_LIT:1> <EOL> chunkmap = get_map ( chunk ) <EOL> x , z = chunk . get_coords ( ) <EOL> map . paste ( chunkmap , ( <NUM_LIT:16> * ( x - bb . minx ) , <NUM_LIT:16> * ( z - bb . minz ) ) ) <EOL> print ( "<STR_LIT>" ) <EOL> filename = os . path . basename ( world_folder ) + "<STR_LIT>" <EOL> map . save ( filename , "<STR_LIT>" ) <EOL> print ( "<STR_LIT>" % filename ) <EOL> except KeyboardInterrupt : <EOL> print ( "<STR_LIT>" ) <EOL> filename = os . path . basename ( world_folder ) + "<STR_LIT>" <EOL> map . save ( filename , "<STR_LIT>" ) <EOL> print ( "<STR_LIT>" % filename ) <EOL> return <NUM_LIT> <EOL> if show : <EOL> map . show ( ) <EOL> return <NUM_LIT:0> <EOL> if __name__ == '<STR_LIT:__main__>' : <EOL> if ( len ( sys . argv ) == <NUM_LIT:1> ) : <EOL> print ( "<STR_LIT>" ) <EOL> sys . exit ( <NUM_LIT:64> ) <EOL> if sys . argv [ <NUM_LIT:1> ] == '<STR_LIT>' and len ( sys . argv ) > <NUM_LIT:2> : <EOL> show = False <EOL> world_folder = sys . argv [ <NUM_LIT:2> ] <EOL> else : <EOL> show = True <EOL> world_folder = sys . argv [ <NUM_LIT:1> ] <EOL> world_folder = os . path . normpath ( world_folder ) <EOL> if ( not os . path . exists ( world_folder ) ) : <EOL> print ( "<STR_LIT>" + world_folder ) <EOL> sys . exit ( <NUM_LIT> ) <EOL> sys . exit ( main ( world_folder , show ) ) </s>
