From 3734a0faaf62ff9b0137ccbac7ea4772bdbd2d10 Mon Sep 17 00:00:00 2001 From: Mysti Date: Wed, 27 Mar 2024 13:47:07 -0700 Subject: [PATCH 1/2] add key to copy data folder --- cbscript.py | 1 + mcworld.py | 13 +++++++++++++ scriptlex.py | 2 +- scriptparse.py | 19 ++++++++++++++----- 4 files changed, 29 insertions(+), 6 deletions(-) diff --git a/cbscript.py b/cbscript.py index 609f294..fef1bf0 100644 --- a/cbscript.py +++ b/cbscript.py @@ -131,6 +131,7 @@ def compile_all(self): if os.path.exists(latest_log_filename): self.latest_log_file = source_file(latest_log_filename) + world.write_data(parsed['data']) world.write_functions(self.global_context.functions) world.write_tags(self.global_context.clocks, self.global_context.block_tags, self.global_context.entity_tags, self.global_context.item_tags) world.write_mcmeta(parsed['desc']) diff --git a/mcworld.py b/mcworld.py index b96eb27..c475805 100644 --- a/mcworld.py +++ b/mcworld.py @@ -23,6 +23,19 @@ def get_latest_log_file(self): return logfile + def write_data(self, data): + data_dir = 'data/' + if data is not None: + for subdir, dirs, files in os.walk(data): + for file in files: + data_copy_path = os.path.join(subdir, file) + + data_raw_path = os.path.relpath(data_copy_path, data) + data_zip_path = os.path.join(data_dir, data_raw_path) + with open(data_copy_path, "rb") as file: + file_bytes = file.read() + self.zip.writestr(data_zip_path, file_bytes) + def write_functions(self, functions): function_dir = f'data/{self.namespace}/functions/' diff --git a/scriptlex.py b/scriptlex.py index 4700129..a2565a4 100644 --- a/scriptlex.py +++ b/scriptlex.py @@ -8,7 +8,7 @@ 'reset', 'clock', 'function', 'if', 'unless', 'then', 'do', 'else', 'switch', 'case', 'default', 'return', 'while', 'macro', 'block', 'block_data', 'block_tag', 'entity_tag', 'item_tag', 'define', 'array', 'remove', 'success', 'result', 'shaped', 'recipe', 'keys', 'eyes', 'feet', 'advancement', 'loot_table', 'predicate', - 'push', 'pop', 'true', 'false', + 'push', 'pop', 'true', 'false', 'data' ) tokens = keywords + ( diff --git a/scriptparse.py b/scriptparse.py index 0ad56f3..7282544 100644 --- a/scriptparse.py +++ b/scriptparse.py @@ -115,15 +115,16 @@ def p_parsed_expr(p): #### Program def p_program(p): - '''program : optcomments dir string newlines optdesc file_params top_level_blocks''' + '''program : optcomments dir string newlines optdesc optdata file_params top_level_blocks''' p[0] = {} p[0]['dir'] = p[3] p[0]['desc'] = p[5] + p[0]['data'] = p[6] - for param_name in p[6]: - p[0][param_name] = p[6][param_name] + for param_name in p[7]: + p[0][param_name] = p[7][param_name] - p[0]['lines'] = p[7] + p[0]['lines'] = p[8] ### Lib def p_lib(p): @@ -161,7 +162,15 @@ def p_file_param(p): raise SyntaxError(f'Unknown file parameter: "{p[1]}" at line {p.lineno(1)}') p[0] = (p[1], int(p[2])) - + +def p_optdata(p): + '''optdata : data string newlines + | empty''' + if len(p) < 4: + p[0] = None + else: + p[0] = p[2] + #### Sections def p_section_commented(p): '''section_commented : optcomments section''' From 517bc21acda882d26d5d4833f1a1e403a5a651e6 Mon Sep 17 00:00:00 2001 From: Mysti Date: Wed, 27 Mar 2024 14:09:49 -0700 Subject: [PATCH 2/2] Fix file duplication --- cbscript.py | 4 ++-- mcworld.py | 28 +++++++++++++++------------- 2 files changed, 17 insertions(+), 15 deletions(-) diff --git a/cbscript.py b/cbscript.py index fef1bf0..f32ebbc 100644 --- a/cbscript.py +++ b/cbscript.py @@ -97,7 +97,7 @@ def compile_all(self): if type != 'program': self.log('Script does not contain a full program.') return False - + self.global_context = global_context.global_context(self.namespace) global_environment = environment(self.global_context) global_environment.set_dollarid('namespace', self.namespace) @@ -131,7 +131,6 @@ def compile_all(self): if os.path.exists(latest_log_filename): self.latest_log_file = source_file(latest_log_filename) - world.write_data(parsed['data']) world.write_functions(self.global_context.functions) world.write_tags(self.global_context.clocks, self.global_context.block_tags, self.global_context.entity_tags, self.global_context.item_tags) world.write_mcmeta(parsed['desc']) @@ -139,6 +138,7 @@ def compile_all(self): world.write_advancements(self.global_context.advancements) world.write_loot_tables(self.global_context.loot_tables) world.write_predicates(self.global_context.predicates) + world.write_data(parsed['data']) world.write_zip() self.dependencies = [source_file(d) for d in self.global_context.dependencies] diff --git a/mcworld.py b/mcworld.py index c475805..383d631 100644 --- a/mcworld.py +++ b/mcworld.py @@ -22,19 +22,6 @@ def get_latest_log_file(self): logfile = os.path.join(logsdir, 'latest.log') return logfile - - def write_data(self, data): - data_dir = 'data/' - if data is not None: - for subdir, dirs, files in os.walk(data): - for file in files: - data_copy_path = os.path.join(subdir, file) - - data_raw_path = os.path.relpath(data_copy_path, data) - data_zip_path = os.path.join(data_dir, data_raw_path) - with open(data_copy_path, "rb") as file: - file_bytes = file.read() - self.zip.writestr(data_zip_path, file_bytes) def write_functions(self, functions): function_dir = f'data/{self.namespace}/functions/' @@ -118,6 +105,21 @@ def write_mcmeta(self, desc): self.zip.writestr(mcmeta_file, json.dumps({'pack':{'pack_format':1, 'description':desc}}, indent=4)) + def write_data(self, data): + data_dir = 'data' + if data is not None: + for subdir, dirs, files in os.walk(data): + for file in files: + data_copy_path = os.path.join(subdir, file) + + data_raw_path = os.path.relpath(data_copy_path, data) + data_zip_path = os.path.join(data_dir, data_raw_path) + if data_zip_path.replace(os.sep, '/') not in self.zip.namelist(): + with open(data_copy_path, "rb") as file: + file_bytes = file.read() + self.zip.writestr(data_zip_path, file_bytes) + + def write_zip(self): self.zip.close()