diff --git a/mcpacker/pack/mysteriousisland/static/resourcepack/assets/kubejs/textures/block/peat_block.png b/mcpacker/pack/mysteriousisland/static/kubejs/assets/textures/block/peat_block.png similarity index 100% rename from mcpacker/pack/mysteriousisland/static/resourcepack/assets/kubejs/textures/block/peat_block.png rename to mcpacker/pack/mysteriousisland/static/kubejs/assets/textures/block/peat_block.png diff --git a/mcpacker/pack/mysteriousisland/static/resourcepack/assets/kubejs/textures/item/peat_chunk.png b/mcpacker/pack/mysteriousisland/static/kubejs/assets/textures/item/peat_chunk.png similarity index 100% rename from mcpacker/pack/mysteriousisland/static/resourcepack/assets/kubejs/textures/item/peat_chunk.png rename to mcpacker/pack/mysteriousisland/static/kubejs/assets/textures/item/peat_chunk.png diff --git a/mcpacker/ui/runner.py b/mcpacker/ui/runner.py index 2abc47e..ccdb1eb 100644 --- a/mcpacker/ui/runner.py +++ b/mcpacker/ui/runner.py @@ -3,6 +3,8 @@ from mcpacker.format.report.mineralreport import MineralReport from mcpacker.format.report.mobspawnreport import MobSpawnReport from mcpacker.model.modpack import ModPack from mcpacker.write.compositewriter import CompositeWriter +from mcpacker.write.datapack.metawriter import MetaWriter +from mcpacker.write.datapack.writer import DataPackWriter from mcpacker.write.incontrol.spawnerwriter import SpawnerWriter from mcpacker.write.report.writer import ReportWriter from mcpacker.write.staticwriter import StaticWriter @@ -54,4 +56,7 @@ class Runner: CompositeWriter(self.pack, self.outputDir, [ StaticWriter(self.pack, self.outputDir), SpawnerWriter(self.pack, self.outputDir), + DataPackWriter(self.pack, self.outputDir, [ + MetaWriter(self.pack, self.outputDir), + ]), ]).write() diff --git a/mcpacker/write/compositewriter.py b/mcpacker/write/compositewriter.py index ed41948..6779d9e 100644 --- a/mcpacker/write/compositewriter.py +++ b/mcpacker/write/compositewriter.py @@ -15,8 +15,11 @@ class CompositeWriter(Writer): writers:Iterable[Writer]|None=None ): super().__init__(pack, outputDir) - self._writers:list[Writer] = list(w for w in writers or []) - def write(self): + self._writers:list[Writer] = [] + for writer in (writers or []): + self._writers.append(writer) + + def doWrite(self): for writer in self._writers: writer.write() diff --git a/mcpacker/write/datapack/locator.py b/mcpacker/write/datapack/locator.py deleted file mode 100644 index 7b3ff1b..0000000 --- a/mcpacker/write/datapack/locator.py +++ /dev/null @@ -1,37 +0,0 @@ -from os.path import join - - -# Class ############################################################################################ - -class Locator: - - def __init__(self, basePath:str, mod:str): - self.basePath = basePath - self.mod = mod - - def biomeModifier(self) -> str: - return join(self.basePath, "data", self.mod, "neoforge", "biome_modifier") - - def blockTag(self) -> str: - return join(self.basePath, "data", self.mod, "tags", "blocks") - - def configuredFeature(self) -> str: - return join(self.basePath, "data", self.mod, "worldgen", "configured_feature") - - def function(self) -> str: - return join(self.basePath, "data", self.mod, "functions") - - def placedFeature(self) -> str: - return join(self.basePath, "data", self.mod, "worldgen", "placed_feature") - - def structure(self) -> str: - return join(self.basePath, "data", self.mod, "worldgen", "structure") - - def structureNbt(self) -> str: - return join(self.basePath, "data", self.mod, "structure") - - def structureSet(self) -> str: - return join(self.basePath, "data", self.mod, "worldgen", "structure_set") - - def templatePool(self) -> str: - return join(self.basePath, "data", self.mod, "worldgen", "template_pool") diff --git a/mcpacker/write/datapack/locator_test.py b/mcpacker/write/datapack/locator_test.py deleted file mode 100644 index aca0389..0000000 --- a/mcpacker/write/datapack/locator_test.py +++ /dev/null @@ -1,7 +0,0 @@ -import mcpacker.write.datapack.locator - - -# Tests ############################################################################################ - -def test_syntax(): - pass diff --git a/mcpacker/write/datapack/metawriter.py b/mcpacker/write/datapack/metawriter.py new file mode 100644 index 0000000..2c49c15 --- /dev/null +++ b/mcpacker/write/datapack/metawriter.py @@ -0,0 +1,25 @@ +from mcpacker.model.modpack import ModPack +from mcpacker.write.writer import Writer +from pathlib import Path + +import mcpacker.json as json + + +# Class ############################################################################################ + +class MetaWriter(Writer): + + def __init__(self, pack:ModPack, outputDir:Path): + super().__init__(pack, outputDir) + + def doWrite(self): + path = self.locator.dataPack() / "pack.mcmeta" + self.resetOutputFile(path) + + with path.open("w") as file: + file.write(json.dumps({ + "pack": { + "pack_format": 48, + "description": f"auto-generated overrides for {self.pack.name}" + } + }, indent=" ")) diff --git a/mcpacker/write/datapack/writer.py b/mcpacker/write/datapack/writer.py new file mode 100644 index 0000000..01a5166 --- /dev/null +++ b/mcpacker/write/datapack/writer.py @@ -0,0 +1,37 @@ +from collections.abc import Iterable +from mcpacker.model.modpack import ModPack +from mcpacker.write.compositewriter import CompositeWriter +from mcpacker.write.writer import Writer +from mcpacker.write.locator import Locator +from pathlib import Path +from tempfile import TemporaryDirectory +from zipfile import ZipFile +from zipfile import ZIP_DEFLATED + +import mcpacker.json as json +import os + + +# Class ############################################################################################ + +class DataPackWriter(CompositeWriter): + + def doWrite(self): + outputDir = self.locator.outputDir + archivePath = self.locator.dataPacks() / f"{self.pack.name}.jar" + + with TemporaryDirectory() as buildDir: + self.locator.outputDir = Path(buildDir) + for writer in self._writers: + writer.locator.outputDir = self.locator.outputDir + writer.write() + + dataPackPath = self.locator.dataPack() + archivePath.parent.mkdir(exist_ok=True, parents=True) + + with ZipFile(archivePath, "w", ZIP_DEFLATED) as zipFile: + for path in dataPackPath.rglob("*"): + if not path.is_file(): continue + zipFile.write(path, path.relative_to(dataPackPath.parent)) + + self.locator.outputDir = outputDir diff --git a/mcpacker/write/incontrol/spawnerwriter.py b/mcpacker/write/incontrol/spawnerwriter.py index 7ba7731..1f8804b 100644 --- a/mcpacker/write/incontrol/spawnerwriter.py +++ b/mcpacker/write/incontrol/spawnerwriter.py @@ -22,11 +22,8 @@ import os class SpawnerWriter(Writer): - def __init__(self, pack:ModPack, outputDir:Path): - super().__init__(pack, outputDir) - - def write(self): - path = self.outputDir / self.pack.name / INCONTROL_CONFIG_DIR / "spawner.json" + def doWrite(self): + path = self.locator.inc_config()/"spawner.json" self.resetOutputFile(path) path.write_text(json.dumps(self._makeAllRules(), indent=json.INDENT)) diff --git a/mcpacker/write/locator.py b/mcpacker/write/locator.py index 29bfb17..1de57ae 100644 --- a/mcpacker/write/locator.py +++ b/mcpacker/write/locator.py @@ -21,9 +21,9 @@ class Locator: * Thirst Was Taken """ - def __init__(self, pack:ModPack, outputDir:Path): - self._pack = pack - self._outputDir = outputDir + def __init__(self, pack:ModPack, outputDir:Path|None=None): + self.pack = pack + self.outputDir = outputDir def biomeModifiers(self, modName:str|None=None, dataPackName:str|None=None) -> Path: return self.dataPackMod(modName, dataPackName) / "neoforge" / "biome_modifier" @@ -38,10 +38,10 @@ class Locator: return self.dataPackMod(modName, dataPackName) / "worldgen" / "configured_feature" def dataPack(self, dataPackName:str|None=None): - return self.dataPacks() / (dataPackName or f"{self._pack.name}_override") + return self.dataPacks() / (dataPackName or f"{self.pack.name}_override") def dataPackMod(self, modName:str|None=None, dataPackName:str|None=None): - return self.dataPack(dataPackName) / "data" / (modName or self._pack.name) + return self.dataPack(dataPackName) / "data" / (modName or self.pack.name) def dataPacks(self) -> Path: return self.root() / "datapacks" @@ -65,16 +65,19 @@ class Locator: return self.dataPackMod(modName, dataPackName) / "recipes" def resourcePack(self, resourcePackName:str|None=None) -> Path: - return self.resourcePacks() / (resourcePackName or f"{self._pack.name}_override") + return self.resourcePacks() / (resourcePackName or f"{self.pack.name}_override") def resourcePackMod(self, modName:str|None=None, resourcePackName:str|None=None) -> Path: - return self.resourcePack(resourcePackName) / "assets" / (modName or self._pack.name) + return self.resourcePack(resourcePackName) / "assets" / (modName or self.pack.name) def resourcePacks(self) -> Path: return self.root() / "resourcepacks" def root(self) -> Path: - return self._outputDir / self._pack.name + if self.outputDir == None: + raise RuntimeError("outputDir must be set before using the locator") + + return self.outputDir / self.pack.name def structures(self, modName:str|None=None, dataPackName:str|None=None) -> Path: return self.dataPackMod(modName, dataPackName) / "structure" @@ -131,7 +134,12 @@ class Locator: def lod_vanilla(self) -> Path: return self.lod_config() / "Vanilla" - # ThirstWasTaken ########################################################### + # MCPacker Mixins ########################################################## + + def mcp_reports(self) -> Path: + return self.root() / "reports" + + # ThirstWasTaken Mixins #################################################### def twt_config(self) -> Path: return self.config() / "thirst" diff --git a/mcpacker/write/report/writer.py b/mcpacker/write/report/writer.py index 174dabf..50f5a7c 100644 --- a/mcpacker/write/report/writer.py +++ b/mcpacker/write/report/writer.py @@ -20,8 +20,8 @@ class ReportWriter(Writer): self.composerClass = composerClass self.name = Path(name) - def write(self) -> Self: - path = self.outputDir/self.pack.name/"reports"/self.name + def doWrite(self) -> Self: + path = self.locator.mcp_reports() / self.name self.resetOutputFile(path) composer = self.composerClass(self.pack) diff --git a/mcpacker/write/resourcepack/blockstatewriter.py b/mcpacker/write/resourcepack/blockstatewriter.py index dbc32a9..41edc02 100644 --- a/mcpacker/write/resourcepack/blockstatewriter.py +++ b/mcpacker/write/resourcepack/blockstatewriter.py @@ -2,11 +2,12 @@ from mcpacker.write.writer import Writer # Class ############################################################################################ -class BlockStateWiter(Writer): +class BlockStateWriter(Writer): - def write(self): + def doWrite(self): for mod in self.pack.resourcePack.mods: for blockState in mod.blockStates: - path = self.outputDir/self.pack.name/"resourcepacks" + path = self.locator.blockStates() # filename? + # TODO: not implemented diff --git a/mcpacker/write/staticwriter.py b/mcpacker/write/staticwriter.py index 02a65bf..041521b 100644 --- a/mcpacker/write/staticwriter.py +++ b/mcpacker/write/staticwriter.py @@ -17,7 +17,7 @@ class StaticWriter(Writer): def __init__(self, pack:ModPack, outputDir:Path): super().__init__(pack, outputDir) - def write(self): + def doWrite(self): sourcePath = SOURCE_BASE / self.pack.name / "static" - targetPath = self.outputDir / self.pack.name + targetPath = self.locator.root() shutil.copytree(sourcePath, targetPath, dirs_exist_ok=True) diff --git a/mcpacker/write/textwriter.py b/mcpacker/write/textwriter.py index 94e6840..d331adc 100644 --- a/mcpacker/write/textwriter.py +++ b/mcpacker/write/textwriter.py @@ -2,9 +2,6 @@ from mcpacker.format.textcomposer import TextComposer from mcpacker.model.modpack import ModPack from mcpacker.write.writer import Writer from pathlib import Path -from typing import Self - -import os # Class ############################################################################################ @@ -16,11 +13,9 @@ class TextWriter(Writer): self.composer = composer self.filePath = filePath - def write(self) -> Self: - path = self.outputDir/self.pack.name/self.filePath + def doWrite(self): + path = self.locator.root() / self.filePath self.resetOutputFile(path) with path.open("w") as file: file.write(str(self.composer.compose())) - - return self diff --git a/mcpacker/write/writer.py b/mcpacker/write/writer.py index bb2cca9..97901e2 100644 --- a/mcpacker/write/writer.py +++ b/mcpacker/write/writer.py @@ -1,4 +1,5 @@ from mcpacker.model.modpack import ModPack +from mcpacker.write.locator import Locator from pathlib import Path from typing import Self @@ -11,13 +12,18 @@ import shutil class Writer: def __init__(self, pack:ModPack, outputDir:Path): + self.locator = Locator(pack, outputDir) self.pack = pack - self.outputDir = outputDir def resetOutputFile(self, file:Path): if file.exists(): os.remove(file) + file.parent.mkdir(parents=True, exist_ok=True) def write(self) -> Self: + self.doWrite() + return self + + def doWrite(self): raise NotImplementedError() diff --git a/mcpacker/write/writer_test.py b/mcpacker/write/writer_test.py index 4cbe935..e1aa2df 100644 --- a/mcpacker/write/writer_test.py +++ b/mcpacker/write/writer_test.py @@ -8,8 +8,8 @@ from pytest import fixture class SampleWriter(Writer): - def write(self): - path = self.outputDir/self.pack.name/"samplewriter.md" + def doWrite(self): + path = self.locator.root() / "samplewriter.md" self.resetOutputFile(path) path.write_text("alpha bravo charlie")