Continued progress

This commit is contained in:
Andrew Miner
2025-10-14 08:30:14 -06:00
parent 25b1b7f9f9
commit b83ed4241d
16 changed files with 110 additions and 77 deletions
+5
View File
@@ -3,6 +3,8 @@ from mcpacker.format.report.mineralreport import MineralReport
from mcpacker.format.report.mobspawnreport import MobSpawnReport from mcpacker.format.report.mobspawnreport import MobSpawnReport
from mcpacker.model.modpack import ModPack from mcpacker.model.modpack import ModPack
from mcpacker.write.compositewriter import CompositeWriter 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.incontrol.spawnerwriter import SpawnerWriter
from mcpacker.write.report.writer import ReportWriter from mcpacker.write.report.writer import ReportWriter
from mcpacker.write.staticwriter import StaticWriter from mcpacker.write.staticwriter import StaticWriter
@@ -54,4 +56,7 @@ class Runner:
CompositeWriter(self.pack, self.outputDir, [ CompositeWriter(self.pack, self.outputDir, [
StaticWriter(self.pack, self.outputDir), StaticWriter(self.pack, self.outputDir),
SpawnerWriter(self.pack, self.outputDir), SpawnerWriter(self.pack, self.outputDir),
DataPackWriter(self.pack, self.outputDir, [
MetaWriter(self.pack, self.outputDir),
]),
]).write() ]).write()
+5 -2
View File
@@ -15,8 +15,11 @@ class CompositeWriter(Writer):
writers:Iterable[Writer]|None=None writers:Iterable[Writer]|None=None
): ):
super().__init__(pack, outputDir) 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: for writer in self._writers:
writer.write() writer.write()
-37
View File
@@ -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")
-7
View File
@@ -1,7 +0,0 @@
import mcpacker.write.datapack.locator
# Tests ############################################################################################
def test_syntax():
pass
+25
View File
@@ -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=" "))
+37
View File
@@ -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
+2 -5
View File
@@ -22,11 +22,8 @@ import os
class SpawnerWriter(Writer): class SpawnerWriter(Writer):
def __init__(self, pack:ModPack, outputDir:Path): def doWrite(self):
super().__init__(pack, outputDir) path = self.locator.inc_config()/"spawner.json"
def write(self):
path = self.outputDir / self.pack.name / INCONTROL_CONFIG_DIR / "spawner.json"
self.resetOutputFile(path) self.resetOutputFile(path)
path.write_text(json.dumps(self._makeAllRules(), indent=json.INDENT)) path.write_text(json.dumps(self._makeAllRules(), indent=json.INDENT))
+17 -9
View File
@@ -21,9 +21,9 @@ class Locator:
* Thirst Was Taken * Thirst Was Taken
""" """
def __init__(self, pack:ModPack, outputDir:Path): def __init__(self, pack:ModPack, outputDir:Path|None=None):
self._pack = pack self.pack = pack
self._outputDir = outputDir self.outputDir = outputDir
def biomeModifiers(self, modName:str|None=None, dataPackName:str|None=None) -> Path: def biomeModifiers(self, modName:str|None=None, dataPackName:str|None=None) -> Path:
return self.dataPackMod(modName, dataPackName) / "neoforge" / "biome_modifier" return self.dataPackMod(modName, dataPackName) / "neoforge" / "biome_modifier"
@@ -38,10 +38,10 @@ class Locator:
return self.dataPackMod(modName, dataPackName) / "worldgen" / "configured_feature" return self.dataPackMod(modName, dataPackName) / "worldgen" / "configured_feature"
def dataPack(self, dataPackName:str|None=None): 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): 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: def dataPacks(self) -> Path:
return self.root() / "datapacks" return self.root() / "datapacks"
@@ -65,16 +65,19 @@ class Locator:
return self.dataPackMod(modName, dataPackName) / "recipes" return self.dataPackMod(modName, dataPackName) / "recipes"
def resourcePack(self, resourcePackName:str|None=None) -> Path: 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: 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: def resourcePacks(self) -> Path:
return self.root() / "resourcepacks" return self.root() / "resourcepacks"
def root(self) -> Path: 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: def structures(self, modName:str|None=None, dataPackName:str|None=None) -> Path:
return self.dataPackMod(modName, dataPackName) / "structure" return self.dataPackMod(modName, dataPackName) / "structure"
@@ -131,7 +134,12 @@ class Locator:
def lod_vanilla(self) -> Path: def lod_vanilla(self) -> Path:
return self.lod_config() / "Vanilla" return self.lod_config() / "Vanilla"
# ThirstWasTaken ########################################################### # MCPacker Mixins ##########################################################
def mcp_reports(self) -> Path:
return self.root() / "reports"
# ThirstWasTaken Mixins ####################################################
def twt_config(self) -> Path: def twt_config(self) -> Path:
return self.config() / "thirst" return self.config() / "thirst"
+2 -2
View File
@@ -20,8 +20,8 @@ class ReportWriter(Writer):
self.composerClass = composerClass self.composerClass = composerClass
self.name = Path(name) self.name = Path(name)
def write(self) -> Self: def doWrite(self) -> Self:
path = self.outputDir/self.pack.name/"reports"/self.name path = self.locator.mcp_reports() / self.name
self.resetOutputFile(path) self.resetOutputFile(path)
composer = self.composerClass(self.pack) composer = self.composerClass(self.pack)
@@ -2,11 +2,12 @@ from mcpacker.write.writer import Writer
# Class ############################################################################################ # Class ############################################################################################
class BlockStateWiter(Writer): class BlockStateWriter(Writer):
def write(self): def doWrite(self):
for mod in self.pack.resourcePack.mods: for mod in self.pack.resourcePack.mods:
for blockState in mod.blockStates: for blockState in mod.blockStates:
path = self.outputDir/self.pack.name/"resourcepacks" path = self.locator.blockStates() # filename?
# TODO: not implemented
+2 -2
View File
@@ -17,7 +17,7 @@ class StaticWriter(Writer):
def __init__(self, pack:ModPack, outputDir:Path): def __init__(self, pack:ModPack, outputDir:Path):
super().__init__(pack, outputDir) super().__init__(pack, outputDir)
def write(self): def doWrite(self):
sourcePath = SOURCE_BASE / self.pack.name / "static" 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) shutil.copytree(sourcePath, targetPath, dirs_exist_ok=True)
+2 -7
View File
@@ -2,9 +2,6 @@ from mcpacker.format.textcomposer import TextComposer
from mcpacker.model.modpack import ModPack from mcpacker.model.modpack import ModPack
from mcpacker.write.writer import Writer from mcpacker.write.writer import Writer
from pathlib import Path from pathlib import Path
from typing import Self
import os
# Class ############################################################################################ # Class ############################################################################################
@@ -16,11 +13,9 @@ class TextWriter(Writer):
self.composer = composer self.composer = composer
self.filePath = filePath self.filePath = filePath
def write(self) -> Self: def doWrite(self):
path = self.outputDir/self.pack.name/self.filePath path = self.locator.root() / self.filePath
self.resetOutputFile(path) self.resetOutputFile(path)
with path.open("w") as file: with path.open("w") as file:
file.write(str(self.composer.compose())) file.write(str(self.composer.compose()))
return self
+7 -1
View File
@@ -1,4 +1,5 @@
from mcpacker.model.modpack import ModPack from mcpacker.model.modpack import ModPack
from mcpacker.write.locator import Locator
from pathlib import Path from pathlib import Path
from typing import Self from typing import Self
@@ -11,13 +12,18 @@ import shutil
class Writer: class Writer:
def __init__(self, pack:ModPack, outputDir:Path): def __init__(self, pack:ModPack, outputDir:Path):
self.locator = Locator(pack, outputDir)
self.pack = pack self.pack = pack
self.outputDir = outputDir
def resetOutputFile(self, file:Path): def resetOutputFile(self, file:Path):
if file.exists(): if file.exists():
os.remove(file) os.remove(file)
file.parent.mkdir(parents=True, exist_ok=True) file.parent.mkdir(parents=True, exist_ok=True)
def write(self) -> Self: def write(self) -> Self:
self.doWrite()
return self
def doWrite(self):
raise NotImplementedError() raise NotImplementedError()
+2 -2
View File
@@ -8,8 +8,8 @@ from pytest import fixture
class SampleWriter(Writer): class SampleWriter(Writer):
def write(self): def doWrite(self):
path = self.outputDir/self.pack.name/"samplewriter.md" path = self.locator.root() / "samplewriter.md"
self.resetOutputFile(path) self.resetOutputFile(path)
path.write_text("alpha bravo charlie") path.write_text("alpha bravo charlie")