-
Notifications
You must be signed in to change notification settings - Fork 1
/
appendMaterials.py
119 lines (108 loc) · 6.51 KB
/
appendMaterials.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
#heads up, I didn't feel like coding this so I made copilot my bitch and do it. Prepare for unnessacery imports ^^
import os
import zipfile
import re #regular expressions
import json
import shutil #maybe these are not needed if I only use os...
import glob
import copy #f python. Why does it not deep copy by default when doing variable1 = variable2, that is so messed up
BEAMMP_CLIENT_FOLDER = "C:/Users/Julian/Desktop/beammp_Server/windows/Resources/Client"
BEAMNG_LEVELS_FOLDER = "I:/SteamLibrary/steamapps/common/BeamNG.drive/content/levels"
# BEAMNG_MODS_FOLDER = "C:/Users/Julian/AppData/Local/BeamNG.drive/0.32/mods" #only for if anyone else needs this
MATERIALS_TO_PUT_IN_EVERY_LEVEL = "materialsToCopy"
level_name_pattern = "levels/([^/.]+)/info.json"
def levelsInZips(dir):
level_list = set()
files_in_directory = os.listdir(dir)
zip_files = [file for file in files_in_directory if file.endswith('.zip')]
for zip_file in zip_files:
full_file_path = os.path.join(dir, zip_file)
with zipfile.ZipFile(full_file_path, 'r') as zip_ref:
all_files = zip_ref.namelist()
for s in all_files:
match = re.search(level_name_pattern, s)
if match:
level_list.add(match.group(1))
return level_list
def appendMaterials(dir):
files_in_directory = list_files(MATERIALS_TO_PUT_IN_EVERY_LEVEL)
json_files = [file for file in files_in_directory if file.endswith('.json')]
for json_file in json_files:
try:
with open(MATERIALS_TO_PUT_IN_EVERY_LEVEL + "/" + json_file, 'r') as f:
original_json_data_to_append = json.load(f)
files_in_directory = os.listdir(dir)
zip_files = [file for file in files_in_directory if file.endswith('.zip')]
for zip_file in zip_files:
# for level in levelsInZips(dir):
full_file_path = os.path.join(dir, zip_file)
try:
with zipfile.ZipFile(full_file_path, 'r') as f:
all_files = f.namelist()
for s in all_files:
match = re.search(level_name_pattern, s)
if match:
json_data_to_append = copy.deepcopy(original_json_data_to_append)
try:
# print("/" + match.group())
json_path = os.path.dirname(json_file)
level = match.group()
# print(match)
level = level.replace("levels/", "")
level = level.replace("/info.json", "")
# print(level)
json_path = json_path.replace('\\', "/")
# print(full_file_path + '\t\t\tlevels/' + level + '/' + json_path + "/" + 'main.materials.json')
# try:
with f.open('levels/' + level + '/' + json_path + "/" + 'main.materials.json', 'r') as sf:
original_json_data = json.load(sf)
for key, value in original_json_data.items():
# print(value)
json_data_to_append[key] = value #original is now new
# except Exception as e:
# print("An error occurred:", e)
except KeyError:
match = False
try:
json_path = os.path.dirname(json_file)
json_path = json_path.replace('\\', "/")
os.makedirs('Client/levels/' + level + "/" + json_path, exist_ok=True)
with open('Client/levels/' + level + "/" + json_file, 'w') as output_file:
json_data_to_append_final = copy.deepcopy(json_data_to_append) #I wonder why the creator of python decided it was better to reference by default
replace_nested_json(json_data_to_append_final, level, json_path)
json.dump(json_data_to_append_final, output_file, indent=2)
except FileNotFoundError:
print("Filesystem didn't create: " + 'Client/levels/' + level + json_file)
# copyMaterialFiles(MATERIALS_TO_PUT_IN_EVERY_LEVEL + "/" + json_path, 'Client/levels/' + level + "/" + json_path)
except FileNotFoundError:
print("no original file " + full_file_path)
except FileNotFoundError:
print("file to append doesn't exist somehow " + MATERIALS_TO_PUT_IN_EVERY_LEVEL + "/" + json_file)
def copyMaterialFiles(fromDir, toDir):
# find and copy .dds and .png files
for file_type in ['*.dds', '*.png']:
for file_name in glob.glob(fromDir + '/' + file_type):
shutil.copy(file_name, toDir)
def list_files(path):
file_paths = []
for root, dirs, files in os.walk(path):
for name in files:
relative_path = os.path.relpath(os.path.join(root, name), path)
file_paths.append(relative_path)
return file_paths
def replace_nested_json(json_data, level, json_path):
for key, value in json_data.items():
if isinstance(value, str):
if "/REPLACE_ME/" in value:
# new_value = value.replace("/REPLACE_ME/", 'levels/' + level + "/" + json_path + "/")
new_value = value.replace("/REPLACE_ME/", "/art/SumoMaterials/") #idk if the .dds and .png files are materials or textures that compose a texture
json_data[key] = new_value
elif isinstance(value, dict):
replace_nested_json(value, level, json_path)
elif isinstance(value, list):
for item in value:
if isinstance(item, dict):
replace_nested_json(item, level, json_path)
appendMaterials(BEAMMP_CLIENT_FOLDER)
appendMaterials(BEAMNG_LEVELS_FOLDER)
# appendMaterials(BEAMNG_MODS_FOLDER)