diff --git a/mcpacker/format/datapack/configuredfeature/__init__.py b/mcpacker/format/datapack/configuredfeature/__init__.py index 1e6dc79..2bb1764 100644 --- a/mcpacker/format/datapack/configuredfeature/__init__.py +++ b/mcpacker/format/datapack/configuredfeature/__init__.py @@ -1,6 +1,15 @@ +from mcpacker.json import JsonBlob + + # Class ############################################################################################ class ConfiguredFeature: def __init__(self, gameId:str): self.gameId = gameId + + def asJsonBlob(self) -> JsonBlob: + return { + "type": self.gameId, + "config": {}, + } diff --git a/mcpacker/format/datapack/configuredfeature/randompatch.py b/mcpacker/format/datapack/configuredfeature/randompatch.py index aa56778..7201994 100644 --- a/mcpacker/format/datapack/configuredfeature/randompatch.py +++ b/mcpacker/format/datapack/configuredfeature/randompatch.py @@ -1,4 +1,5 @@ from mcpacker.format.datapack.configuredfeature import ConfiguredFeature +from mcpacker.json import JsonBlob from typing import Any from typing import TYPE_CHECKING @@ -13,7 +14,7 @@ class RandomPatch(ConfiguredFeature): def __init__( self, gameId:str, - feature:PlacedFeature, + feature:"PlacedFeature", tries:int=128, xzSpread:int=7, ySpread:int=3, @@ -25,7 +26,7 @@ class RandomPatch(ConfiguredFeature): self.xzSpread = xzSpread self.ySpread = ySpread - def asData(self) -> dict[str,Any]: + def asJsonBlob(self) -> JsonBlob: return { "type": self.gameId, "feature": self.feature.gameId, diff --git a/mcpacker/format/datapack/configuredfeature/randompatch_test.py b/mcpacker/format/datapack/configuredfeature/randompatch_test.py index cbdbab2..3ae8f54 100644 --- a/mcpacker/format/datapack/configuredfeature/randompatch_test.py +++ b/mcpacker/format/datapack/configuredfeature/randompatch_test.py @@ -1,6 +1,7 @@ from mcpacker.format.datapack.blockstate import BlockState +from mcpacker.format.datapack.placedfeature import PlacedFeature from mcpacker.format.datapack.blockstateprovider.simplestateprovider import SimpleStateProvider -from mcpacker.format.datapack.configuredfeature.simpleblock import SimpleBlock +from mcpacker.format.datapack.configuredfeature.randompatch import RandomPatch from pytest import fixture @@ -14,25 +15,22 @@ def createBlockState(): def createProvider(state:BlockState): return SimpleStateProvider(state) +@fixture(name="placedFeature") +def createPlacedFeature(): + return PlacedFeature("noop", []) + @fixture(name="feature") -def createSimpleBlockFeature(provider:SimpleStateProvider): - return SimpleBlock(provider) +def createFeature(placedFeature:PlacedFeature): + return RandomPatch("test", placedFeature) # Tests ############################################################################################ -def test_asData(feature:SimpleBlock): +def test_asJsonBlob(feature:RandomPatch): assert feature.asJsonBlob() == { - "type": "minecraft:simple_block", - "config": { - "to_place": { - "type": "minecraft:simple_state_provider", - "state": { - "Name": "minecraft:button", - "Properties": { - "waterlogged": "true" - } - } - } - } + "type": "minecraft:random_patch", + "feature": "noop", + "tries": 128, + "xz_spread": 7, + "y_spread": 3, } diff --git a/mcpacker/format/datapack/placedfeature.py b/mcpacker/format/datapack/placedfeature.py index 7734529..1709967 100644 --- a/mcpacker/format/datapack/placedfeature.py +++ b/mcpacker/format/datapack/placedfeature.py @@ -1,10 +1,18 @@ +from collections.abc import Iterable from mcpacker.format.datapack.placement import Placement +from mcpacker.json import JsonBlob # Class ############################################################################################ class PlacedFeature: - def __init__(self, gameId:str, placements:list[Placement]): + def __init__(self, gameId:str, placements:Iterable[Placement]): self.gameId = gameId self.placements = placements + + def asJsonBlob(self) -> JsonBlob: + return { + "feature": self.gameId, + "placements": [p.asJsonBlob() for p in self.placements], + } diff --git a/mcpacker/format/datapack/placement/__init__.py b/mcpacker/format/datapack/placement/__init__.py index 58d433f..4d32f88 100644 --- a/mcpacker/format/datapack/placement/__init__.py +++ b/mcpacker/format/datapack/placement/__init__.py @@ -1,6 +1,14 @@ +from mcpacker.json import JsonBlob + + # Class ############################################################################################ class Placement: def __init__(self, gameId:str): self.gameId = gameId + + def asJsonBlob(self) -> JsonBlob: + return { + "type": self.gameId, + } diff --git a/mcpacker/format/datapack/placement/biome.py b/mcpacker/format/datapack/placement/biome.py index 85e037a..4981e7d 100644 --- a/mcpacker/format/datapack/placement/biome.py +++ b/mcpacker/format/datapack/placement/biome.py @@ -7,7 +7,3 @@ class Biome(Placement): def __init__(self): super().__init__("minecraft:biome") - - def asData(self) -> dict[str,Any]: - return { "type": self.gameId } - diff --git a/mcpacker/format/datapack/placement/biome_test.py b/mcpacker/format/datapack/placement/biome_test.py index cd40f4b..3dee6ab 100644 --- a/mcpacker/format/datapack/placement/biome_test.py +++ b/mcpacker/format/datapack/placement/biome_test.py @@ -12,7 +12,7 @@ def createPlacement(): # Tests ############################################################################################ def test_asData(placement): - assert placement.asData() == { + assert placement.asJsonBlob() == { "type": "minecraft:biome", } diff --git a/mcpacker/format/datapack/placement/heightmap.py b/mcpacker/format/datapack/placement/heightmap.py index b4faea4..d5b4edd 100644 --- a/mcpacker/format/datapack/placement/heightmap.py +++ b/mcpacker/format/datapack/placement/heightmap.py @@ -1,7 +1,9 @@ from mcpacker.format.datapack.heightmaptype import HeightMapType from mcpacker.format.datapack.placement import Placement +from mcpacker.json import JsonBlob from typing import Any + # Class ############################################################################################ class HeightMap(Placement): @@ -10,7 +12,7 @@ class HeightMap(Placement): super().__init__("minecraft:heightmap") self.heightMap = heightMap - def asData(self) -> dict[str,Any]: + def asJsonBlob(self) -> JsonBlob: return { "type": self.gameId, "heightmap": self.heightMap.asData() diff --git a/mcpacker/format/datapack/placement/heightmap_test.py b/mcpacker/format/datapack/placement/heightmap_test.py index 93cfd22..b924ca6 100644 --- a/mcpacker/format/datapack/placement/heightmap_test.py +++ b/mcpacker/format/datapack/placement/heightmap_test.py @@ -13,7 +13,7 @@ def createPlacement(): # Tests ############################################################################################ def test_asData(placement): - assert placement.asData() == { + assert placement.asJsonBlob() == { "type": "minecraft:heightmap", "heightmap": "WORLD_SURFACE" } diff --git a/mcpacker/format/datapack/placement/insquare.py b/mcpacker/format/datapack/placement/insquare.py index 6e1d49e..ae6be32 100644 --- a/mcpacker/format/datapack/placement/insquare.py +++ b/mcpacker/format/datapack/placement/insquare.py @@ -1,13 +1,10 @@ from mcpacker.format.datapack.placement import Placement from typing import Any + # Class ############################################################################################ class InSquare(Placement): def __init__(self): super().__init__("minecraft:in_square") - - def asData(self) -> dict[str,Any]: - return { "type": self.gameId } - diff --git a/mcpacker/format/datapack/placement/insquare_test.py b/mcpacker/format/datapack/placement/insquare_test.py index d02e83c..2609534 100644 --- a/mcpacker/format/datapack/placement/insquare_test.py +++ b/mcpacker/format/datapack/placement/insquare_test.py @@ -12,7 +12,7 @@ def createPlacement(): # Tests ############################################################################################ def test_asData(placement): - assert placement.asData() == { + assert placement.asJsonBlob() == { "type": "minecraft:in_square", } diff --git a/mcpacker/format/datapack/placement/rarityfilter.py b/mcpacker/format/datapack/placement/rarityfilter.py index 0d0ace2..875bb0d 100644 --- a/mcpacker/format/datapack/placement/rarityfilter.py +++ b/mcpacker/format/datapack/placement/rarityfilter.py @@ -1,6 +1,8 @@ from mcpacker.format.datapack.placement import Placement +from mcpacker.json import JsonBlob from typing import Any + # Class ############################################################################################ class RarityFilter(Placement): @@ -9,9 +11,9 @@ class RarityFilter(Placement): super().__init__("minecraft:rarity_filter") self.chance = chance - def asData(self) -> dict[str,Any]: + def asJsonBlob(self) -> JsonBlob: return { "type": self.gameId, - "chance": self.chance + "chance": self.chance, } diff --git a/mcpacker/format/datapack/placement/rarityfilter_test.py b/mcpacker/format/datapack/placement/rarityfilter_test.py index 21122a4..828b327 100644 --- a/mcpacker/format/datapack/placement/rarityfilter_test.py +++ b/mcpacker/format/datapack/placement/rarityfilter_test.py @@ -12,7 +12,7 @@ def createPlacement(): # Tests ############################################################################################ def test_asData(placement): - assert placement.asData() == { + assert placement.asJsonBlob() == { "type": "minecraft:rarity_filter", "chance": 4 } diff --git a/mcpacker/model/modpack.py b/mcpacker/model/modpack.py index 4cc0ba1..4a8a85f 100644 --- a/mcpacker/model/modpack.py +++ b/mcpacker/model/modpack.py @@ -1,6 +1,7 @@ from collections.abc import Iterable -from mcpacker.model.core.world import World from mcpacker.format.datapack import DataPack +from mcpacker.model.core.resourceid import ResourceId +from mcpacker.model.core.world import World from mcpacker.model.mod import Mod from mcpacker.model.resourcepack import ResourcePack from typing import Callable @@ -23,15 +24,15 @@ class ModPack: world:World|None=None, dataPack:DataPack|None=None, resourcePack:ResourcePack|None=None, + disabledFeatures:Iterable[ResourceId]|None=None ): - self.name = name - self.world = world or World() - self.dataPack = dataPack or DataPack(self.name) - self.resourcePack = resourcePack or ResourcePack(self.name) + self.name = name - self._mods = {} - for mod in (mods or []): - self._mods[mod.name] = mod + self.dataPack = dataPack or DataPack(self.name) + self.mods = {mod.name: mod for mod in (mods or [])} + self.disabledFeatures = list(disabledFeatures or []) + self.resourcePack = resourcePack or ResourcePack(self.name) + self.world = world or World() def augment(self, doAugment:AugmentFunc) -> Self: doAugment(self) diff --git a/mcpacker/pack/mysteriousisland/adddisabledfeatures.py b/mcpacker/pack/mysteriousisland/adddisabledfeatures.py new file mode 100644 index 0000000..1cf8a6d --- /dev/null +++ b/mcpacker/pack/mysteriousisland/adddisabledfeatures.py @@ -0,0 +1,32 @@ +from mcpacker.model.core.resourceid import ResourceId +from mcpacker.model.modpack import ModPack + +# Helper Functions ################################################################################# + +def addDisabledFeatures(pack:ModPack): + d = pack.disabledFeatures + + def add(resourceText:str): + pack.disabledFeatures.append(ResourceId.parse(resourceText)) + + # Disable Vanilla ore generation + add("minecraft:ore_coal_lower") + add("minecraft:ore_coal_upper") + add("minecraft:ore_copper_large") + add("minecraft:ore_copper") + add("minecraft:ore_diamond_buried") + add("minecraft:ore_diamond_large") + add("minecraft:ore_diamond_medium") + add("minecraft:ore_diamond") + add("minecraft:ore_emerald") + add("minecraft:ore_gold_deltas") + add("minecraft:ore_gold_extra") + add("minecraft:ore_gold_lower") + add("minecraft:ore_gold") + add("minecraft:ore_iron_middle") + add("minecraft:ore_iron_small") + add("minecraft:ore_iron_upper") + add("minecraft:ore_lapis_buried") + add("minecraft:ore_lapis") + add("minecraft:ore_redstone_lower") + add("minecraft:ore_redstone") diff --git a/mcpacker/pack/mysteriousisland/adddisabledfeatures_test.py b/mcpacker/pack/mysteriousisland/adddisabledfeatures_test.py new file mode 100644 index 0000000..afc7c23 --- /dev/null +++ b/mcpacker/pack/mysteriousisland/adddisabledfeatures_test.py @@ -0,0 +1,7 @@ +import mcpacker.pack.mysteriousisland.adddisabledfeatures + + +# Tests ############################################################################################ + +def test_syntax(): + pass diff --git a/mcpacker/pack/mysteriousisland/modpack.py b/mcpacker/pack/mysteriousisland/modpack.py index 38110f0..5185b57 100644 --- a/mcpacker/pack/mysteriousisland/modpack.py +++ b/mcpacker/pack/mysteriousisland/modpack.py @@ -1,12 +1,13 @@ -from mcpacker.model.modpack import ModPack -from mcpacker.pack.mysteriousisland.addbiomes import addBiomes -from mcpacker.pack.mysteriousisland.addblocks import addBlocks -from mcpacker.pack.mysteriousisland.adddatapack import addDataPack -from mcpacker.pack.mysteriousisland.adddeposits import addDeposits -from mcpacker.pack.mysteriousisland.additems import addItems -from mcpacker.pack.mysteriousisland.addminerals import addMinerals -from mcpacker.pack.mysteriousisland.addmobs import addMobs -from mcpacker.pack.mysteriousisland.addmobspawns import addMobSpawns +from mcpacker.model.modpack import ModPack +from mcpacker.pack.mysteriousisland.addbiomes import addBiomes +from mcpacker.pack.mysteriousisland.addblocks import addBlocks +from mcpacker.pack.mysteriousisland.adddatapack import addDataPack +from mcpacker.pack.mysteriousisland.adddeposits import addDeposits +from mcpacker.pack.mysteriousisland.adddisabledfeatures import addDisabledFeatures +from mcpacker.pack.mysteriousisland.additems import addItems +from mcpacker.pack.mysteriousisland.addminerals import addMinerals +from mcpacker.pack.mysteriousisland.addmobs import addMobs +from mcpacker.pack.mysteriousisland.addmobspawns import addMobSpawns from mcpacker.pack.mysteriousisland.addresourcepack import addResourcePack @@ -23,6 +24,7 @@ def buildModPack(): pack.augment(addDeposits) pack.augment(addMobs) pack.augment(addMobSpawns) + pack.augment(addDisabledFeatures) pack.augment(addResourcePack) pack.augment(addDataPack) diff --git a/mcpacker/ui/runner.py b/mcpacker/ui/runner.py index 786629b..fa1dee4 100644 --- a/mcpacker/ui/runner.py +++ b/mcpacker/ui/runner.py @@ -4,6 +4,7 @@ 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.disablefeaturewriter import DisableFeatureWriter from mcpacker.write.datapack.disablespawnwriter import DisableSpawnWriter from mcpacker.write.datapack.metawriter import DataPackMetaWriter from mcpacker.write.datapack.writer import DataPackWriter @@ -69,6 +70,7 @@ class Runner: SpawnerWriter(p, o), DataPackWriter(p, o, [ DataPackMetaWriter(p, o, 48), + DisableFeatureWriter(p, o), DisableSpawnWriter(p, o), ]), ResourcePackWriter(p, o, [ diff --git a/mcpacker/write/datapack/disablefeaturewriter.py b/mcpacker/write/datapack/disablefeaturewriter.py new file mode 100644 index 0000000..d0cdc65 --- /dev/null +++ b/mcpacker/write/datapack/disablefeaturewriter.py @@ -0,0 +1,40 @@ +from mcpacker.format.datapack.biomemodifier.removefeature import RemoveFeatureBiomeModifier +from mcpacker.format.datapack.configuredfeature import ConfiguredFeature +from mcpacker.format.datapack.placedfeature import PlacedFeature +from mcpacker.write.writer import Writer + +import mcpacker.json as json + + +# Class ############################################################################################ + +class DisableFeatureWriter(Writer): + + def doWrite(self): + if not self.pack.disabledFeatures: return + + self._writeRemoveFeaturesBiomeModifier() + self._writeNoopConfiguredFeature() + self._writeNoopPlacedFeatures() + + # Private Methods ########################################################## + + def _writeNoopConfiguredFeature(self): + feature = ConfiguredFeature("minecraft:no_op") + path = self.locator.configuredFeatures() / "noop.json" + self.resetOutputFile(path) + path.write_text(json.dumps(feature.asJsonBlob(), indent=json.INDENT)) + + def _writeNoopPlacedFeatures(self): + for placedFeature in self.pack.disabledFeatures: + path = self.locator.placedFeatures(placedFeature.mod) / f"{placedFeature.name}.json" + self.resetOutputFile(path) + feature = PlacedFeature(f"{self.pack.name}:noop", []) + path.write_text(json.dumps(feature.asJsonBlob(), indent=json.INDENT)) + + def _writeRemoveFeaturesBiomeModifier(self): + features = [str(f) for f in self.pack.disabledFeatures] + modifier = RemoveFeatureBiomeModifier("#c:is_overworld", features) + path = self.locator.biomeModifiers() / "remove_disabled_features.json" + self.resetOutputFile(path) + path.write_text(json.dumps(modifier.asJsobBlob(), indent=json.INDENT))