Continued progress
This commit is contained in:
|
Before Width: | Height: | Size: 1.3 KiB After Width: | Height: | Size: 1.3 KiB |
|
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 1.2 KiB |
@@ -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()
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||
@@ -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")
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
import mcpacker.write.datapack.locator
|
|
||||||
|
|
||||||
|
|
||||||
# Tests ############################################################################################
|
|
||||||
|
|
||||||
def test_syntax():
|
|
||||||
pass
|
|
||||||
@@ -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=" "))
|
||||||
@@ -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
|
||||||
@@ -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))
|
||||||
|
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -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,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
|
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||
@@ -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")
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user