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.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()
+5 -2
View File
@@ -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()
-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):
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))
+17 -9
View File
@@ -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"
+2 -2
View File
@@ -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)
@@ -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
+2 -2
View File
@@ -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)
+2 -7
View File
@@ -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
+7 -1
View File
@@ -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()
+2 -2
View File
@@ -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")