@ -298,7 +298,9 @@ class MTChunks:
worlds_path = None
is_save_output_ok = None
mt_util_path = None
mtmn_path = None
minetestmapper_fast_sqlite_path = None
minetestmapper_custom_path = None
minetestmapper_py_path = None
colors_path = None
python_exe_path = None
chunks = None
@ -340,8 +342,12 @@ class MTChunks:
chunk_yaml_name_dotext_string = None
mapvars = None
rendered_count = None
backend_string = None
#region_separators = None
is_backend_detected = None
def __init__ ( self ) : #formerly checkpaths() in global scope
self . is_backend_detected = False
self . total_generated_count = 0
self . rendered_count = 0
self . preload_all_enable = True
@ -361,6 +367,7 @@ class MTChunks:
self . refresh_players_seconds = 5
self . chunk_yaml_name_opener_string = " chunk_ "
self . chunk_yaml_name_dotext_string = " .yml "
#self.region_separators = [" "," "," "]
input_string = " "
if ( os . path . sep != " / " ) :
@ -398,6 +405,7 @@ class MTChunks:
print ( " Using dotminetest_path ' " + self . dotminetest_path + " ' " )
self . worlds_path = os . path . join ( self . dotminetest_path , " worlds " )
self . world_path = os . path . join ( self . worlds_path , self . world_name )
auto_chosen_world = False
self . world_blacklist = list ( )
self . world_blacklist . append ( " CarbonUnit " )
@ -426,10 +434,31 @@ class MTChunks:
if auto_chosen_world :
break
self . python_exe_path = " python "
worldmt_path = os . path . join ( self . world_path , " world.mt " )
self . backend_string = " sqlite3 "
if ( os . path . isfile ( worldmt_path ) ) :
ins = open ( worldmt_path , ' r ' )
line = True
while line :
line = ins . readline ( )
if line :
line_strip = line . strip ( )
if len ( line_strip ) > 0 and line_strip [ 0 ] != " # " :
if line_strip [ : 7 ] == " backend " :
ao_index = line_strip . find ( " = " )
if ao_index > - 1 :
self . backend_string = line_strip [ ao_index + 1 : ] . strip ( )
self . is_backend_detected = True
break
ins . close ( )
else :
print ( " ERROR: failed to read ' " + worldmt_path + " ' " )
self . is_save_output_ok = True # Keeping output after analyzing it is no longer necessary since results are saved to YAML, but keeping output provides debug info since is the output of minetestmapper-numpy.py
if self . is_backend_detected :
print ( " Detected backend ' " + self . backend_string + " ' from ' " + worldmt_path + " ' " )
else :
print ( " WARNING: Database backend cannot be detected (unable to ensure image generator script will render map) " )
try :
alt_path = " C: \\ python27 \ python.exe "
if os . path . isfile ( alt_path ) :
@ -439,10 +468,24 @@ class MTChunks:
pass # do nothing, probably linux
mt_path = os . path . join ( self . profile_path , " minetest " )
self . mt_util_path = os . path . join ( mt_path , " util " )
self . mtmn_path = os . path . join ( self . mt_util_path , " minetestmapper-numpy.py " )
self . minetestmapper_fast_sqlite_path = os . path . join ( self . mt_util_path , " minetestmapper-numpy.py " )
if self . os_name == " windows " :
self . minetestmapper_fast_sqlite_path = os . path . join ( os . path . dirname ( os . path . abspath ( __file__ ) ) , " minetestmapper-numpy.py " )
self . minetestmapper_custom_path = os . path . join ( os . path . dirname ( os . path . abspath ( __file__ ) ) , " minetestmapper.py " )
self . mt_chunkymap_path = os . path . join ( self . mt_util_path , " chunkymap " )
try_path = os . path . join ( self . mt_chunkymap_path , " minetestmapper.py " )
if os . path . isfile ( try_path ) :
self . minetestmapper_custom_path
self . minetestmapper_py_path = self . minetestmapper_fast_sqlite_path
if ( self . backend_string != " sqlite3 " ) :
self . minetestmapper_py_path = self . minetestmapper_custom_path
print ( " Chose image generator script: " + self . minetestmapper_py_path )
if not os . path . isfile ( self . minetestmapper_py_path ) :
print ( " ERROR: script does not exist, exiting " + __file__ + " . " )
sys . exit ( )
self . colors_path = os . path . join ( self . mt_util_path , " colors.txt " )
if self . os_name == " windows " :
self . mtmn_path = os . path . join ( os . path . dirname ( os . path . abspath ( __file__ ) ) , " minetestmapper-numpy.py " )
self . colors_path = os . path . join ( os . path . dirname ( os . path . abspath ( __file__ ) ) , " colors.txt " )
self . website_root = None
prioritized_try_paths = list ( )
@ -470,6 +513,16 @@ class MTChunks:
self . chunkz_min = 0
self . chunkx_max = 0
self . chunkz_max = 0
self . mapvars = get_dict_from_conf_file ( self . world_yaml_path , " : " )
if self . mapvars is not None :
if " chunkx_min " in self . mapvars . keys ( ) :
self . chunkx_min = self . mapvars [ " chunkx_min " ]
if " chunkx_max " in self . mapvars . keys ( ) :
self . chunkx_max = self . mapvars [ " chunkx_max " ]
if " chunkz_min " in self . mapvars . keys ( ) :
self . chunkz_min = self . mapvars [ " chunkz_min " ]
if " chunkz_max " in self . mapvars . keys ( ) :
self . chunkz_max = self . mapvars [ " chunkz_max " ]
self . chunk_size = 16
self . maxheight = 64
@ -628,10 +681,10 @@ class MTChunks:
geometry_value_string = str ( x_min ) + " : " + str ( z_min ) + " + " + str ( int ( x_max ) - int ( x_min ) + 1 ) + " + " + str ( int ( z_max ) - int ( z_min ) + 1 ) # +1 since max-min is exclusive and width must be inclusive for minetestmapper.py
cmd_suffix = " "
cmd_suffix = " > \" " + genresult_path + " \" "
self . mapper_id = " minetestmapper-numpy "
cmd_string = self . python_exe_path + " \" " + self . mtmn _path + " \" --region " + str ( x_min ) + " " + str ( x_max ) + " " + str ( z_min ) + " " + str ( z_max ) + " --maxheight " + str ( self . maxheight ) + " --minheight " + str ( self . minheight ) + " --pixelspernode " + str ( self . pixelspernode ) + " \" " + self . world_path + " \" \" " + tmp_png_path + " \" " + cmd_suffix
#self.mapper_id = "minetestmapper-region "
cmd_string = self . python_exe_path + " \" " + self . minetestmapper_py _path + " \" --region " + str ( x_min ) + " " + str ( x_max ) + " " + str ( z_min ) + " " + str ( z_max ) + " --maxheight " + str ( self . maxheight ) + " --minheight " + str ( self . minheight ) + " --pixelspernode " + str ( self . pixelspernode ) + " \" " + self . world_path + " \" \" " + tmp_png_path + " \" " + cmd_suffix
if self . mapper_id == " minetestmapper-region " : #if self.os_name!="windows": #since windows client doesn't normally have minetest-mapper
if self . minetestmapper_py_path == self . minetestmapper_custom_path : #if self.backend_string!="sqlite3": #if self.mapper_id=="minetestmapper-region": #if self.os_name!="windows": #since windows client doesn't normally have minetest-mapper
# Since minetestmapper-numpy has trouble with leveldb:
# such as sudo minetest-mapper --input "/home/owner/.minetest/worlds/FCAGameAWorld" --geometry -32:-32+64+64 --output /var/www/html/minetest/try1.png
# where geometry option is like --geometry x:y+w+h
@ -641,14 +694,18 @@ class MTChunks:
# cmd_string = "/usr/games/minetest-mapper --input \""+self.world_path+"\" --draworigin --geometry "+geometry_value_string+" --output \""+tmp_png_path+"\""+cmd_suffix
# such as sudo python minetestmapper --input "/home/owner/.minetest/worlds/FCAGameAWorld" --geometry -32:-32+64+64 --output /var/www/html/minetest/try1.png
# OR try PYTHON version (looks for expertmm fork which has geometry option like C++ version does):
script_path = " /home/owner/minetest/util/minetestmapper.py "
region_capable_script_path = " /home/owner/minetest/util/chunkymap/minetestmapper.py "
if os . path . isfile ( region_capable_script_path ) :
script_path = region_capable_script_path
#cmd_suffix=" > entire-mtmresult.txt"
expertmm_region_string = str ( x_min ) + " : " + str ( z_min ) + " + " + str ( int ( x_max ) - int ( x_min ) + 1 ) + " + " + str ( int ( z_max ) - int ( z_min ) + 1 ) # +1 since max-min is exclusive and width must be inclusive for minetestmapper.py
#cmd_string="sudo python "+script_path+" --input \""+self.world_path+"\" --geometry "+geometry_value_string+" --output \""+tmp_png_path+"\""+cmd_suffix
cmd_string = " sudo python " + script_path + " --input \" " + self . world_path + " \" --region " + expertmm_region_string + " --output \" " + tmp_png_path + " \" " + cmd_suffix
#script_path = "/home/owner/minetest/util/minetestmapper.py"
#region_capable_script_path = "/home/owner/minetest/util/chunkymap/minetestmapper.py"
#if self.os_name=="windows":
# region_capable_script_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "minetestmapper.py")
# if os.path.isfile(region_capable_script_path):
# script_path=region_capable_script_path
#if os.path.isfile(region_capable_script_path):
#script_path = region_capable_script_path
geometry_string = str ( x_min ) + " : " + str ( z_min ) + " + " + str ( int ( x_max ) - int ( x_min ) + 1 ) + " + " + str ( int ( z_max ) - int ( z_min ) + 1 ) # +1 since max-min is exclusive and width must be inclusive for minetestmapper.py
#expertmm_region_string = str(x_min) + ":" + str(x_max) + "," + str(z_min) + ":" + str(z_max)
#cmd_string="sudo python "+script_path+" --input \""+self.world_path+"\" --geometry "+geometry_value_string+" --output \""+tmp_png_path+"\""+cmd_suffix
cmd_string = " sudo python " + script_path + " --input \" " + self . world_path + " \" --geometry " + geometry_string + " --output \" " + tmp_png_path + " \" " + cmd_suffix
#sudo python /home/owner/minetest/util/minetestmapper.py --input "/home/owner/.minetest/worlds/FCAGameAWorld" --output /var/www/html/minetest/chunkymapdata/entire.png > entire-mtmresult.txt
#sudo python /home/owner/minetest/util/chunkymap/minetestmapper.py --input "/home/owner/.minetest/worlds/FCAGameAWorld" --geometry 0:0+16+16 --output /var/www/html/minetest/chunkymapdata/chunk_x0z0.png > /home/owner/minetest/util/chunkymap-genresults/chunk_x0z0_mapper_result.txt
# sudo mv entire-mtmresult.txt /home/owner/minetest/util/chunkymap-genresults/
@ -698,7 +755,7 @@ class MTChunks:
def check_players ( self ) :
# NOT NEEDED: if os.path.isfile(self.mtmn _path) and os.path.isfile(self.colors_path):
# NOT NEEDED: if os.path.isfile(self.minetestmapper_py _path) and os.path.isfile(self.colors_path):
print ( " PROCESSING PLAYERS " )
self . chunkymap_data_path = os . path . join ( self . website_root , " chunkymapdata " )
chunkymap_players_name = " players "
@ -858,7 +915,8 @@ class MTChunks:
if not self . is_chunk_rendered_on_dest ( chunk_luid ) :
is_render_needed = True
if self . verbose_enable :
print ( chunk_luid + " : RENDERING where missing image on marked nonempty chunk (player in it) " )
theoretical_path = self . get_chunk_image_path ( chunk_luid )
print ( chunk_luid + " : RENDERING where missing image on marked nonempty chunk (player in it) { dest_png_path: " + theoretical_path + " } " )
else :
if self . verbose_enable :
print ( chunk_luid + " : SKIPPING nonfresh previously marked nonempty (player in it) " )
@ -880,8 +938,9 @@ class MTChunks:
else :
if not self . is_chunk_rendered_on_dest ( chunk_luid ) :
is_render_needed = True
theoretical_path = self . get_chunk_image_path ( chunk_luid )
if self . verbose_enable :
print ( chunk_luid + " : RENDERING where missing image on nonfresh previously marked (simple check since has no player) " )
print ( chunk_luid + " : RENDERING where missing image on nonfresh previously marked (simple check since has no player) { dest_png_path: " + theoretical_path + " } " )
else :
if self . verbose_enable :
print ( chunk_luid + " : SKIPPING nonfresh previously marked (simple check since has no player) " )
@ -962,7 +1021,7 @@ class MTChunks:
prev_len = len ( self . todo_positions )
self . _check_map_pseudorecursion_branchfrom ( x , z )
if self . verbose_enable :
print ( " [ " + str ( self . todo_index ) + " ] branching from " + str ( ( x , z ) ) + " (added " + ( len ( self . todo_positions ) - prev_len ) + " ) " )
print ( " [ " + str ( self . todo_index ) + " ] branching from " + str ( ( x , z ) ) + " (added " + str ( len ( self . todo_positions ) - prev_len ) + " ) " )
else :
if self . verbose_enable :
print ( " [ " + str ( self . todo_index ) + " ] not branching from " + str ( ( x , z ) ) )
@ -996,7 +1055,7 @@ class MTChunks:
def check_map_pseudorecursion_start ( self ) :
if self . todo_index < 0 :
print ( " PROCESSING MAP DATA (BRANCH PATTERN) " )
if os . path . isfile ( self . mtmn _path ) and os . path . isfile ( self . colors_path ) :
if os . path . isfile ( self . minetestmapper_py _path ) and os . path . isfile ( self . colors_path ) :
self . rendered_count = 0
self . todo_positions = list ( )
self . todo_positions . append ( ( 0 , 0 ) )
@ -1038,7 +1097,7 @@ class MTChunks:
self . verify_correct_map ( )
def verify_correct_map ( self ) :
if os . path . isfile ( self . mtmn _path ) and os . path . isfile ( self . colors_path ) :
if os . path . isfile ( self . minetestmapper_py _path ) and os . path . isfile ( self . colors_path ) :
if self . mapvars is not None and set ( [ ' world_name ' ] ) . issubset ( self . mapvars ) :
#if self.verbose_enable:
# print (" (FOUND self.world_name)")
@ -1124,12 +1183,13 @@ class MTChunks:
outs . write ( " chunkymap_data_path: " + str ( self . chunkymap_data_path ) + " \n " )
outs . write ( " total_generated_count: " + str ( self . total_generated_count ) + " \n " )
outs . close ( )
self . mapvars = get_dict_from_conf_file ( self . world_yaml_path , " : " )
else :
if self . verbose_enable :
print ( " (Not saving ' " + self . world_yaml_path + " ' since same value of each current variable is already in file as loaded) " )
def check_map_inefficient_squarepattern ( self ) :
if os . path . isfile ( self . mtmn _path ) and os . path . isfile ( self . colors_path ) :
if os . path . isfile ( self . minetestmapper_py _path ) and os . path . isfile ( self . colors_path ) :
self . rendered_count = 0
if not os . path . isdir ( self . chunkymap_data_path ) :
os . mkdir ( self . chunkymap_data_path )
@ -1149,6 +1209,15 @@ class MTChunks:
self . chunkz_min = 0
self . chunkx_max = 0
self . chunkz_max = 0
if self . mapvars is not None :
if " chunkx_min " in self . mapvars . keys ( ) :
self . chunkx_min = self . mapvars [ " chunkx_min " ]
if " chunkx_max " in self . mapvars . keys ( ) :
self . chunkx_max = self . mapvars [ " chunkx_max " ]
if " chunkz_min " in self . mapvars . keys ( ) :
self . chunkz_min = self . mapvars [ " chunkz_min " ]
if " chunkz_max " in self . mapvars . keys ( ) :
self . chunkz_max = self . mapvars [ " chunkz_max " ]
self . total_generated_count = 0
newchunk_luid_list = list ( )