poikilos
9 years ago
committed by
Jacob Gustafson
4 changed files with 309 additions and 213 deletions
@ -0,0 +1,12 @@ |
|||||
|
import os |
||||
|
import datetime |
||||
|
|
||||
|
os_name = "*x" |
||||
|
debug_name = "debug.txt" |
||||
|
debug_path = "/usr/share/minetest/worlds" |
||||
|
world_name = None |
||||
|
if os.sep=="\\": |
||||
|
os_name = "windows" |
||||
|
|
||||
|
print("os detected: "+os_name) |
||||
|
|
@ -0,0 +1,239 @@ |
|||||
|
import os |
||||
|
import sys |
||||
|
import traceback |
||||
|
|
||||
|
class InstalledFile: |
||||
|
source_dir_path = None |
||||
|
dest_dir_path = None |
||||
|
file_name = None |
||||
|
|
||||
|
def __init__(self, file_name, source_dir_path, dest_dir_path): |
||||
|
self.file_name=file_name |
||||
|
self.source_dir_path=source_dir_path |
||||
|
self.dest_dir_path=dest_dir_path |
||||
|
|
||||
|
class ConsoleInputConfigFile: |
||||
|
#config_name = None |
||||
|
_config_path = None |
||||
|
_data = None |
||||
|
_ao = None |
||||
|
|
||||
|
#DOES load variables if path exists |
||||
|
def __init__(self, config_file_path, assignment_operator_string): |
||||
|
self._data = {} |
||||
|
self._config_path = config_file_path |
||||
|
self._ao = assignment_operator_string |
||||
|
self._data = get_dict_modified_by_conf_file(self._data, self._config_path, self._ao) |
||||
|
|
||||
|
#DOES ask for user input if does not exist |
||||
|
def ask_for_value_if_not_loaded(name, default_value, description): |
||||
|
if name not in self._data: |
||||
|
if default_value is None: |
||||
|
default_value = "" |
||||
|
answer = raw_input("Please specify "+description+" [blank for "+default_value+"]: ") |
||||
|
if answer is not None: |
||||
|
answer = answer.strip() |
||||
|
if len(answer)>0: |
||||
|
self_data[name] = answer |
||||
|
else: |
||||
|
self_data[name] = default_value |
||||
|
if not os.path.isfile(self._config_path): |
||||
|
is_changed = True |
||||
|
print("Creating '"+self._config_path+"'") |
||||
|
if is_changed: |
||||
|
self.save_yaml() |
||||
|
|
||||
|
|
||||
|
#DOES autosave IF different val |
||||
|
def set_val(name, val): |
||||
|
is_changed = False |
||||
|
if name not in self._data.keys(): |
||||
|
is_changed = True |
||||
|
elif self._data[name] != val: |
||||
|
is_changed = True |
||||
|
if is_changed: |
||||
|
self._data[name] = val |
||||
|
self.save_yaml() |
||||
|
|
||||
|
def get_val(name): |
||||
|
result = None |
||||
|
if name in self._data: |
||||
|
result = self._data[name] |
||||
|
return result |
||||
|
|
||||
|
def save_yaml() |
||||
|
save_conf_from_dict(self._config_path, self._data, self._ao, save_nulls_enable=False) |
||||
|
|
||||
|
def get_dict_deepcopy(old_dict): |
||||
|
new_dict = None |
||||
|
if type(old_dict) is dict: |
||||
|
new_dict = {} |
||||
|
for this_key in old_dict.iterkeys(): |
||||
|
new_dict[this_key] = old_dict[this_key] |
||||
|
return new_dict |
||||
|
|
||||
|
def is_dict_subset(new_dict, old_dict, verbose_messages_enable, verbose_dest_description="unknown file"): |
||||
|
is_changed = False |
||||
|
try: |
||||
|
if old_dict is not None: |
||||
|
if new_dict is not None: |
||||
|
old_dict_keys = old_dict.keys() |
||||
|
for this_key in new_dict.iterkeys(): |
||||
|
if (this_key not in old_dict_keys): |
||||
|
is_changed = True |
||||
|
if verbose_messages_enable: |
||||
|
print("SAVING '"+verbose_dest_description+"' since "+str(this_key)+" not in saved version.") |
||||
|
break |
||||
|
elif new_dict[this_key] != old_dict[this_key]: |
||||
|
is_changed = True |
||||
|
if verbose_messages_enable: |
||||
|
print("SAVING '"+verbose_dest_description+"' since "+str(this_key)+" not same as saved version.") |
||||
|
break |
||||
|
#else new_dict is None so no change detected (no new information) |
||||
|
else: |
||||
|
if new_dict is not None: |
||||
|
is_changed = True |
||||
|
except: |
||||
|
print("Could not finish is_dict_subset:") |
||||
|
view_traceback() |
||||
|
return is_changed |
||||
|
|
||||
|
def ivec2_equals(pos1, pos2): |
||||
|
return (int(pos1[0])==int(pos2[0])) and (int(pos1[1])==int(pos2[1])) |
||||
|
|
||||
|
def get_dict_from_conf_file(path,assignment_operator="="): |
||||
|
results = None |
||||
|
results = get_dict_modified_by_conf_file(results, path, assignment_operator) |
||||
|
return results |
||||
|
|
||||
|
def RepresentsInt(s): |
||||
|
try: |
||||
|
int(s) |
||||
|
return True |
||||
|
except ValueError: |
||||
|
return False |
||||
|
|
||||
|
def RepresentsFloat(s): |
||||
|
try: |
||||
|
float(s) |
||||
|
return True |
||||
|
except ValueError: |
||||
|
return False |
||||
|
|
||||
|
def view_traceback(): |
||||
|
ex_type, ex, tb = sys.exc_info() |
||||
|
print(str(ex_type)) |
||||
|
print(str(ex)) |
||||
|
traceback.print_tb(tb) |
||||
|
del tb |
||||
|
|
||||
|
def print_file(path, min_indent=""): |
||||
|
line_count = 0 |
||||
|
try: |
||||
|
if path is not None: |
||||
|
if os.path.isfile(path): |
||||
|
|
||||
|
if min_indent is None: |
||||
|
min_indent = "" |
||||
|
ins = open(path, 'r') |
||||
|
line = True |
||||
|
while line: |
||||
|
line = ins.readline() |
||||
|
line_count += 1 |
||||
|
if line: |
||||
|
print(min_indent+line) |
||||
|
ins.close() |
||||
|
#if line_count==0: |
||||
|
#print(min_indent+"print_file WARNING: "+str(line_count)+" line(s) in '"+path+"'") |
||||
|
#else: |
||||
|
#print(min_indent+"# "+str(line_count)+" line(s) in '"+path+"'") |
||||
|
else: |
||||
|
print (min_indent+"print_file: file does not exist") |
||||
|
else: |
||||
|
print (min_indent+"print_file: path is None") |
||||
|
except: |
||||
|
print(min_indent+"print_file: could not finish") |
||||
|
try: |
||||
|
ins.close() |
||||
|
except: |
||||
|
pass |
||||
|
return line_count |
||||
|
|
||||
|
def get_dict_modified_by_conf_file(this_dict, path,assignment_operator="="): |
||||
|
results = this_dict |
||||
|
#print ("Checking "+str(path)+" for settings...") |
||||
|
if (results is None) or (type(results) is not dict): |
||||
|
results = {} |
||||
|
if os.path.isfile(path): |
||||
|
ins = open(path, 'r') |
||||
|
line = True |
||||
|
while line: |
||||
|
line = ins.readline() |
||||
|
if line and len(line)>0: |
||||
|
line_strip=line.strip() |
||||
|
if len(line_strip)>0 and not line_strip[0]=="#": # if not comment |
||||
|
if not line_strip[0]=="-": # ignore yaml arrays |
||||
|
ao_index = line_strip.find(assignment_operator) |
||||
|
if ao_index>=1: # intentionally skip zero-length variable names |
||||
|
if ao_index<len(line_strip)-1: # skip yaml implicit nulls or yaml objects |
||||
|
result_name = line_strip[:ao_index].strip() |
||||
|
result_value = line_strip[ao_index+1:].strip() |
||||
|
result_lower = result_value.lower() |
||||
|
if result_value=="None" or result_value=="null" or result_value=="~" or result_value=="NULL": |
||||
|
result_value = None |
||||
|
elif result_lower=="true": |
||||
|
result_value = True |
||||
|
elif result_lower=="false": |
||||
|
result_value = False |
||||
|
elif RepresentsInt(result_value): |
||||
|
result_value = int(result_value) |
||||
|
elif RepresentsFloat(result_value): |
||||
|
result_value = float(result_value) |
||||
|
#print (" CHECKING... "+result_name+":"+result_value) |
||||
|
results[result_name]=result_value |
||||
|
ins.close() |
||||
|
return results |
||||
|
|
||||
|
def save_conf_from_dict(path, this_dict, assignment_operator="=", save_nulls_enable=True): |
||||
|
try: |
||||
|
outs = open(path, 'w') |
||||
|
for this_key in this_dict.keys(): |
||||
|
if save_nulls_enable or (this_dict[this_key] is not None): |
||||
|
if this_dict[this_key] is None: |
||||
|
outs.write(this_key+assignment_operator+"null\n") |
||||
|
else: |
||||
|
outs.write(this_key+assignment_operator+str(this_dict[this_key])+"\n") |
||||
|
outs.close() |
||||
|
except: |
||||
|
print("Could not finish saving chunk metadata to '"+str(path)+"': "+str(traceback.format_exc())) |
||||
|
try: |
||||
|
outs.close() |
||||
|
except: |
||||
|
pass |
||||
|
|
||||
|
def get_tuple_from_notation(line, debug_src_name="<unknown object>"): |
||||
|
result = None |
||||
|
if line is not None: |
||||
|
# mark chunk |
||||
|
tuple_noparen_pos_string = line.strip("() \n\r") |
||||
|
pos_strings = tuple_noparen_pos_string.split(",") |
||||
|
if len(pos_strings) == 3: |
||||
|
try: |
||||
|
player_x = float(pos_strings[0]) |
||||
|
player_y = float(pos_strings[1]) |
||||
|
player_z = float(pos_strings[2]) |
||||
|
except: |
||||
|
player_x = int(pos_strings[0]) |
||||
|
player_y = int(pos_strings[1]) |
||||
|
player_z = int(pos_strings[2]) |
||||
|
result = player_x, player_y, player_z |
||||
|
else: |
||||
|
print("'"+debug_src_name+"' has bad position data--should be 3-length (x,y,z) in position value: "+str(pos_strings)) |
||||
|
return result |
||||
|
|
||||
|
def is_same_fvec3(list_a, list_b): |
||||
|
result = False |
||||
|
if list_a is not None and list_b is not None: |
||||
|
if len(list_a)>=3 and len(list_b)>=3: |
||||
|
result = (float(list_a[0]) == float(list_b[0])) and (float(list_a[1]) == float(list_b[1])) and (float(list_a[2]) == float(list_b[2])) |
||||
|
return False |
@ -0,0 +1,35 @@ |
|||||
|
import os |
||||
|
from expertmm import * |
||||
|
|
||||
|
class MinetestMetadata: |
||||
|
|
||||
|
config = None |
||||
|
config_name = None |
||||
|
config_path = None |
||||
|
worldgen_mod_list = None |
||||
|
|
||||
|
|
||||
|
def __init__(self): |
||||
|
self.config_name = "minetestmeta.yml" |
||||
|
self.config_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), self.config_name) |
||||
|
self.config = {} |
||||
|
self.config = get_dict_modified_by_conf_file(self.config, self.config_path, ":") |
||||
|
is_config_changed = False |
||||
|
if not os.path.isfile(self.config_path): |
||||
|
is_config_changed = True |
||||
|
print("Creating '"+self.config_path+"'") |
||||
|
|
||||
|
self.worldgen_mod_list = list() |
||||
|
self.worldgen_mod_list.append("technic_worldgen") |
||||
|
self.worldgen_mod_list.append("mg") # this delays/prevents chunk generation and sometimes crashes in 0.4.13 release (tested on Windows 10) |
||||
|
self.worldgen_mod_list.append("moreores") |
||||
|
self.worldgen_mod_list.append("lapis") |
||||
|
self.worldgen_mod_list.append("sea") |
||||
|
self.worldgen_mod_list.append("moretrees") |
||||
|
self.worldgen_mod_list.append("caverealms") |
||||
|
#self.worldgen_mod_list.append("nature_classic") # NOTE: plantlife_modpack has this and other stuff, but detecting this could help since it is unique to the modpack |
||||
|
self.worldgen_mod_list.append("plantlife_modpack") #ok if installed as modpack instead of putting individual mods in mods folder |
||||
|
|
||||
|
|
||||
|
|
||||
|
mtmeta = MinetestMetadata() |
Loading…
Reference in new issue