- Install Python 3
- Install and use mod Map Writer
- Download the file
- Type this:
CLS && py mapwriter_sorter.py
| #!/usr/bin/env python3 | |
| # -*- coding: utf-8 -*- | |
| # cls && py mapwriter_sorter.py | |
| import os | |
| #from os import path | |
| world_address = 'server_web_site_com_25565' # from 'server.web-site.com:25565' | |
| # path.expandvars(r'%APPDATA%\\') == %SystemDrive%:\\Users\\%USERNAME%\\AppData\\Roaming\\ | |
| file_path = os.getenv('APPDATA') + '\\.minecraft\\saves\\mapwriter_mp_worlds\\' + world_address + '\\mapwriter.cfg' | |
| output_file = 'mapwriter_sorted.txt' | |
| data_dict = {} | |
| meta_dict = {} | |
| merged_dict = {} | |
| sorted_dict = {} | |
| deaths_dict = {} | |
| indentation = ' ' * 4 | |
| marker_count = -1 | |
| debug = False | |
| def main(file_path): | |
| file_exists = (os.path.exists(file_path) and os.path.isfile(file_path)) | |
| print('path:', file_path) | |
| print('file_exists:', file_exists) | |
| f = open(file_path, 'r', encoding = 'utf8') | |
| content = f.read() | |
| f.close() | |
| content = content.split('markers {')[1] | |
| content = content.split('}')[0] | |
| content = content.replace(indentation, '') #.strip() | |
| content = content.split('\n') | |
| content = list(filter(None, content)) | |
| for marker in content: | |
| marker_splited = marker.split('=') | |
| head = marker_splited[0] | |
| data = marker_splited[1].split(':') | |
| if ( | |
| (head[0] == 'I') or | |
| ('markerCount' in head) or | |
| ('visibleGroup' in head) | |
| ): | |
| meta_dict[head] = data | |
| else: | |
| data_dict[head] = { | |
| 'name': data[0], | |
| 'coordinates': { | |
| 'x': data[1], | |
| 'y': data[2], | |
| 'z': data[3], | |
| }, | |
| 'unknown_param': data[4], | |
| 'color': data[5], | |
| 'group': data[6] | |
| } | |
| if ('playerDeaths' in data): | |
| deaths_dict[head] = { | |
| 'date_time': data[0], | |
| 'coordinates': { | |
| 'x': data[1], | |
| 'y': data[2], | |
| 'z': data[3], | |
| }, | |
| 'unknown_param': data[4], | |
| 'color': data[5], | |
| 'group': data[6] | |
| } | |
| if not 'I:markerCount' in meta_dict: | |
| return print('Error: No I:markerCount marker.') | |
| marker_count = int(meta_dict['I:markerCount'][0]) | |
| print('marker_count:', marker_count) #, type(marker_count) | |
| for x in range(0, marker_count): | |
| _key = 'S:marker' + str(x) | |
| sorted_dict[_key] = data_dict[_key] | |
| merged_dict = {**sorted_dict, **meta_dict} | |
| #print('\n' + 'content:', content) | |
| #print('\n' + 'data_dict:', data_dict) | |
| #print('\n' + 'meta_dict:', meta_dict) | |
| print('\n' + 'data_dict (first):', data_dict['S:marker' + str(0)]) | |
| print('\n' + 'data_dict (last):', data_dict['S:marker' + str(meta_dict['I:markerCount'][0])]) | |
| #print('\n' + 'dict(sorted(data_dict.items())):', dict(sorted(data_dict.items()))) | |
| #print('\n' + 'dict(sorted(meta_dict.items())):', dict(sorted(meta_dict.items()))) | |
| #print('\n' + 'merged_dict:', merged_dict) | |
| print('\n' + 'playerDeaths:', deaths_dict) | |
| f = open(file_path.replace('mapwriter.cfg', output_file ), 'w', encoding = 'utf8') | |
| f.write('markers {\n') | |
| for marker_name in merged_dict.keys(): | |
| data_line = '' | |
| #print('merged_dict[marker_name]:', merged_dict[marker_name]) | |
| #print('merged_dict[marker_name].keys():', merged_dict[marker_name].keys()) | |
| if debug: print('marker_name:', marker_name) | |
| if ( | |
| ( | |
| (marker_name != 'I:markerCount') and | |
| (marker_name != 'S:visibleGroup') | |
| ) or | |
| (type(merged_dict[marker_name]) is dict) | |
| ): | |
| for marker_header in merged_dict[marker_name].keys(): | |
| if ( | |
| (marker_header == 'coordinates') or | |
| (type(merged_dict[marker_name][marker_header]) is dict) | |
| ): | |
| for marker_subheader in merged_dict[marker_name][marker_header].keys(): | |
| #print('marker_subheader:', marker_subheader, merged_dict[marker_name][marker_header][marker_subheader]) | |
| data_line = data_line + merged_dict[marker_name][marker_header][marker_subheader] + ':' | |
| else: | |
| if debug: print(marker_name, marker_header) | |
| data_line = data_line + merged_dict[marker_name][marker_header] + ':' | |
| elif (type(marker_name) is list): #array | |
| for marker_header in marker_name: | |
| data_line = data_line + marker_header + ':' | |
| else: | |
| data_line = data_line + marker_name + ':' | |
| data_line = data_line[:len(data_line) - 1] # Delete last symbol | |
| current_line = marker_name + '=' + data_line #.replace(':\n', '\n') | |
| #print('Writing: ' + current_line) | |
| f.write(indentation + current_line + '\n') | |
| f.write('}\n') | |
| f.close() | |
| print('\n' + 'Done, check file "' + output_file + '"') | |
| main(file_path) |