Switch to simpler ore gen config

- Ditch use of LargeOreDepsoits in favor of using Minecraft's native
  placed features, but with auto-generated files which give more
  subtly and expression in an automated way
This commit is contained in:
Andrew Miner
2025-10-27 09:01:53 -06:00
parent 5405a13eb0
commit 5ccd48908a
116 changed files with 988 additions and 2190 deletions
-49
View File
@@ -1,49 +0,0 @@
from collections.abc import Iterable
from mcpacker.format.datapack.moddata import ModData
# Class ############################################################################################
class DataPack:
"""
A collection of data used to configure a Minecraft instance.
see: https://minecraft.wiki/w/Data_pack
"""
def __init__(self, name:str, mods:Iterable[ModData]|None=None):
self.name = name
self._mods:dict[str,ModData] = {}
self._defaultMod:ModData|None = None
for mod in (mods or []):
self.add(mod)
def add(self, mod:ModData) -> "DataPack":
if not self._defaultMod:
self._defaultMod = mod
self._mods[mod.name] = mod
return self
def get(self, name:str) -> ModData:
result = self._mods.get(name, None)
if not result:
result = self._mods[name] = ModData(name)
return result
@property
def defaultMod(self) -> ModData|None:
return self._defaultMod
@defaultMod.setter
def defaultMod(self, mod:ModData):
if mod:
existingModData = self.get(mod.name)
if not existingModData:
self.add(mod)
elif existingModData != mod:
raise Exception(f"Datapack already has a mod named {mod.name}")
self._defaultMod = mod
@@ -1,11 +0,0 @@
from mcpacker.json import JsonBlob
# Classes ##########################################################################################
class BiomeModifier:
def asJsonBlob(self) -> JsonBlob:
return {
"type": "neoforge:none",
}
@@ -1,12 +1,11 @@
from collections.abc import Iterable from collections.abc import Iterable
from mcpacker.format.datapack.biomemodifier import BiomeModifier
from mcpacker.format.datapack.generationstep import GenerationStep from mcpacker.format.datapack.generationstep import GenerationStep
from mcpacker.json import JsonBlob from mcpacker.format.json import JsonBlob
# Class ############################################################################################ # Class ############################################################################################
class AddFeatureBiomeModifier(BiomeModifier): class AddFeatureBiomeModifier:
def __init__(self, biomes:Iterable[str]|str, features:Iterable[str]|str, step:GenerationStep): def __init__(self, biomes:Iterable[str]|str, features:Iterable[str]|str, step:GenerationStep):
if isinstance(biomes, str): if isinstance(biomes, str):
@@ -21,7 +20,7 @@ class AddFeatureBiomeModifier(BiomeModifier):
def asJsobBlob(self) -> JsonBlob: def asJsobBlob(self) -> JsonBlob:
return { return {
"type": "neoforge:add_features", "type": "forge:add_features",
"biomes": list(self.biomes), "biomes": list(self.biomes),
"features": list(self.features), "features": list(self.features),
"step": str(self.step), "step": str(self.step),
@@ -1,7 +0,0 @@
import mcpacker.format.datapack.biomemodifier.addfeature
# Tests ############################################################################################
def test_syntax():
pass
@@ -1,14 +1,11 @@
from mcpacker.json import JsonBlob from mcpacker.format.json import JsonBlob
# Class ############################################################################################ # Class ############################################################################################
class Placement: class NoopBiomeModifier:
def __init__(self, gameId:str):
self.gameId = gameId
def asJsonBlob(self) -> JsonBlob: def asJsonBlob(self) -> JsonBlob:
return { return {
"type": self.gameId, "type": "forge:none",
} }
@@ -1,12 +1,11 @@
from collections.abc import Iterable from collections.abc import Iterable
from mcpacker.format.datapack.biomemodifier import BiomeModifier
from mcpacker.format.datapack.generationstep import GenerationStep from mcpacker.format.datapack.generationstep import GenerationStep
from mcpacker.json import JsonBlob from mcpacker.format.json import JsonBlob
# Classes ########################################################################################## # Class ############################################################################################
class RemoveFeatureBiomeModifier(BiomeModifier): class RemoveFeatureBiomeModifier:
def __init__( def __init__(
self, self,
@@ -26,7 +25,7 @@ class RemoveFeatureBiomeModifier(BiomeModifier):
def asJsobBlob(self) -> JsonBlob: def asJsobBlob(self) -> JsonBlob:
result:dict[str,JsonBlob] = { result:dict[str,JsonBlob] = {
"type": "neoforge:remove_features", "type": "forge:remove_features",
"biomes": list(self.biomes), "biomes": list(self.biomes),
"features": list(self.features), "features": list(self.features),
} }
@@ -1,7 +0,0 @@
import mcpacker.format.datapack.biomemodifier.removefeature
# Tests ############################################################################################
def test_syntax():
pass
@@ -1,12 +1,11 @@
from collections.abc import Iterable from collections.abc import Iterable
from mcpacker.format.datapack.biomemodifier import BiomeModifier from mcpacker.format.json import JsonBlob
from mcpacker.model.resourceid import ResourceId from mcpacker.model.resourceid import ResourceId
from mcpacker.json import JsonBlob
# Classes ########################################################################################## # Class ############################################################################################
class RemoveSpawnBiomeModifier(BiomeModifier): class RemoveSpawnBiomeModifier:
def __init__(self, biomes:Iterable[str]|str, entityTypes:Iterable[ResourceId]): def __init__(self, biomes:Iterable[str]|str, entityTypes:Iterable[ResourceId]):
if isinstance(biomes, str): if isinstance(biomes, str):
@@ -1,7 +0,0 @@
import mcpacker.format.datapack.biomemodifier.removespawn
# Tests ############################################################################################
def test_syntax():
pass
-20
View File
@@ -1,20 +0,0 @@
from mcpacker.json import JsonBlob
from typing import Any
from typing import cast
# Class ############################################################################################
class BlockState:
def __init__(self, blockId:str, properties:JsonBlob|None=None):
self.blockId = blockId
self.properties = properties
def asJsonBlob(self) -> JsonBlob:
result = cast(dict[str,JsonBlob], { "Name": self.blockId })
if self.properties:
result["Properties"] = self.properties
return result
@@ -1,20 +0,0 @@
from mcpacker.format.datapack.blockstate import BlockState
from pytest import fixture
# Fixtures #########################################################################################
@fixture(name="state")
def createBlockState():
yield BlockState("minecraft:button", {"waterlogged": "true"})
# Tests ############################################################################################
def test_asData(state:BlockState):
assert state.asJsonBlob() == {
"Name": "minecraft:button",
"Properties": {
"waterlogged": "true"
}
}
@@ -1,12 +0,0 @@
from mcpacker.json import JsonBlob
# Class ############################################################################################
class BlockStateProvider:
def __init__(self, gameId:str):
self.gameId = gameId
def asJsonBlob(self) -> JsonBlob:
raise NotImplementedError()
@@ -1,19 +0,0 @@
from mcpacker.json import JsonBlob
from mcpacker.format.datapack.blockstate import BlockState
from mcpacker.format.datapack.blockstateprovider import BlockStateProvider
from typing import Any
# Class ############################################################################################
class SimpleStateProvider(BlockStateProvider):
def __init__(self, state:BlockState):
super().__init__("minecraft:simple_state_provider")
self.state = state
def asJsonBlob(self) -> JsonBlob:
return {
"type": self.gameId,
"state": self.state.asJsonBlob(),
}
@@ -1,28 +0,0 @@
from mcpacker.format.datapack.blockstate import BlockState
from mcpacker.format.datapack.blockstateprovider.simplestateprovider import SimpleStateProvider
from pytest import fixture
# Fixtures #########################################################################################
@fixture(name="state")
def createBlockState():
yield BlockState("minecraft:button", {"waterlogged": "true"})
@fixture(name="provider")
def createProvider(state:BlockState):
return SimpleStateProvider(state)
# Tests ############################################################################################
def test_asData(provider:SimpleStateProvider):
assert provider.asJsonBlob() == {
"type": "minecraft:simple_state_provider",
"state": {
"Name": "minecraft:button",
"Properties": {
"waterlogged": "true"
}
}
}
@@ -1,15 +0,0 @@
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": {},
}
@@ -1,36 +0,0 @@
from mcpacker.format.datapack.configuredfeature import ConfiguredFeature
from mcpacker.json import JsonBlob
from typing import Any
from typing import TYPE_CHECKING
if TYPE_CHECKING:
from mcpacker.format.datapack.placedfeature import PlacedFeature
# Class ############################################################################################
class RandomPatch(ConfiguredFeature):
def __init__(
self,
gameId:str,
feature:"PlacedFeature",
tries:int=128,
xzSpread:int=7,
ySpread:int=3,
):
super().__init__("minecraft:random_patch")
self.feature = feature
self.tries = tries
self.xzSpread = xzSpread
self.ySpread = ySpread
def asJsonBlob(self) -> JsonBlob:
return {
"type": self.gameId,
"feature": self.feature.gameId,
"tries": self.tries,
"xz_spread": self.xzSpread,
"y_spread": self.ySpread
}
@@ -1,36 +0,0 @@
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.randompatch import RandomPatch
from pytest import fixture
# Fixtures #########################################################################################
@fixture(name="state")
def createBlockState():
yield BlockState("minecraft:button", {"waterlogged": "true"})
@fixture(name="provider")
def createProvider(state:BlockState):
return SimpleStateProvider(state)
@fixture(name="placedFeature")
def createPlacedFeature():
return PlacedFeature("noop", [])
@fixture(name="feature")
def createFeature(placedFeature:PlacedFeature):
return RandomPatch("test", placedFeature)
# Tests ############################################################################################
def test_asJsonBlob(feature:RandomPatch):
assert feature.asJsonBlob() == {
"type": "minecraft:random_patch",
"feature": "noop",
"tries": 128,
"xz_spread": 7,
"y_spread": 3,
}
@@ -1,21 +0,0 @@
from mcpacker.json import JsonBlob
from mcpacker.format.datapack.blockstateprovider import BlockStateProvider
from mcpacker.format.datapack.configuredfeature import ConfiguredFeature
from typing import Any
# Class ############################################################################################
class SimpleBlock(ConfiguredFeature):
def __init__(self, toPlace:BlockStateProvider):
super().__init__("minecraft:simple_block")
self.toPlace = toPlace
def asJsonBlob(self) -> JsonBlob:
return {
"type": self.gameId,
"config": {
"to_place": self.toPlace.asJsonBlob()
}
}
@@ -1,38 +0,0 @@
from mcpacker.format.datapack.blockstate import BlockState
from mcpacker.format.datapack.blockstateprovider.simplestateprovider import SimpleStateProvider
from mcpacker.format.datapack.configuredfeature.simpleblock import SimpleBlock
from pytest import fixture
# Fixtures #########################################################################################
@fixture(name="state")
def createBlockState():
yield BlockState("minecraft:button", {"waterlogged": "true"})
@fixture(name="provider")
def createProvider(state:BlockState):
return SimpleStateProvider(state)
@fixture(name="feature")
def createSimpleBlockFeature(provider:SimpleStateProvider):
return SimpleBlock(provider)
# Tests ############################################################################################
def test_asData(feature:SimpleBlock):
assert feature.asJsonBlob() == {
"type": "minecraft:simple_block",
"config": {
"to_place": {
"type": "minecraft:simple_state_provider",
"state": {
"Name": "minecraft:button",
"Properties": {
"waterlogged": "true"
}
}
}
}
}
@@ -1,7 +0,0 @@
import mcpacker.format.datapack.generationstep
# Tests ############################################################################################
def test_syntax():
pass
-30
View File
@@ -1,30 +0,0 @@
# Class ############################################################################################
class HeightMapType:
"""
A cached record of the top block at all points in the world.
see: https://minecraft.wiki/w/Heightmap
"""
def __init__(self, name:str):
self.name = name
def __repr__(self) -> str:
return f"HeightMapType(name={self.name})"
def __str__(self) -> str:
return self.name
def asData(self) -> str:
return self.name
# Constants ########################################################################################
MOTION_BLOCKING = HeightMapType("MOTION_BLOCKING")
MOTION_BLOCKING_NO_LEAVES = HeightMapType("MOTION_BLOCKING_NO_LEAVES")
OCEAN_FLOOR = HeightMapType("OCEAN_FLOOR")
OCEAN_FLOOR_WG = HeightMapType("OCEAN_FLOOR_WG")
WORLD_SURFACE = HeightMapType("WORLD_SURFACE")
WORLD_SURFACE_WG = HeightMapType("WORLD_SURFACE_WG")
@@ -1,7 +0,0 @@
from mcpacker.format.datapack.heightmaptype import HeightMapType
# Tests ############################################################################################
def test_syntax():
pass
-23
View File
@@ -1,23 +0,0 @@
from mcpacker.format.datapack.configuredfeature import ConfiguredFeature
from mcpacker.format.datapack.placedfeature import PlacedFeature
from typing import Any
# Class ############################################################################################
class ModData:
def __init__(self, name:str):
self.name = name
self.biomeModifiers:list[Any] = []
self.configuredFeatures:list[ConfiguredFeature] = []
self.functions:list[Any] = []
self.functionTags:list[Any] = []
self.lootModifiers:list[Any] = []
self.lootTables:list[Any] = []
self.placedFeatures:list[PlacedFeature] = []
self.recipes:list[Any] = []
self.structures:list[Any] = []
self.structureSets:list[Any] = []
self.tags:list[Any] = []
self.templatePools:list[Any] = []
-7
View File
@@ -1,7 +0,0 @@
import mcpacker.format.datapack.moddata
# Tests ############################################################################################
def test_syntax():
pass
+21
View File
@@ -0,0 +1,21 @@
from mcpacker.format.json import JsonBlob
# Class ############################################################################################
class NoopConfiguredFeature:
def asJsonBlob(self) -> JsonBlob:
return {
"type": "minecraft:noop",
"config": {},
}
class NoopPlacedFeature:
def asJsonBlob(self) -> JsonBlob:
return {
"feature": NoopConfiguredFeature().asJsonBlob(),
"placement": []
}
-18
View File
@@ -1,18 +0,0 @@
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:Iterable[Placement]):
self.gameId = gameId
self.placements = placements
def asJsonBlob(self) -> JsonBlob:
return {
"feature": self.gameId,
"placements": [p.asJsonBlob() for p in self.placements],
}
@@ -1,7 +0,0 @@
from mcpacker.format.datapack.placedfeature import PlacedFeature
# Tests ############################################################################################
def test_syntax():
pass
@@ -1,9 +0,0 @@
from mcpacker.format.datapack.placement import Placement
from typing import Any
# Class ############################################################################################
class Biome(Placement):
def __init__(self):
super().__init__("minecraft:biome")
@@ -1,18 +0,0 @@
from mcpacker.format.datapack.placement.biome import Biome
from pytest import fixture
# Fixtures #########################################################################################
@fixture(name="placement")
def createPlacement():
yield Biome()
# Tests ############################################################################################
def test_asData(placement):
assert placement.asJsonBlob() == {
"type": "minecraft:biome",
}
@@ -1,19 +0,0 @@
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):
def __init__(self, heightMap:HeightMapType):
super().__init__("minecraft:heightmap")
self.heightMap = heightMap
def asJsonBlob(self) -> JsonBlob:
return {
"type": self.gameId,
"heightmap": self.heightMap.asData()
}
@@ -1,20 +0,0 @@
from mcpacker.format.datapack.heightmaptype import WORLD_SURFACE
from mcpacker.format.datapack.placement.heightmap import HeightMap
from pytest import fixture
# Fixtures #########################################################################################
@fixture(name="placement")
def createPlacement():
yield HeightMap(WORLD_SURFACE)
# Tests ############################################################################################
def test_asData(placement):
assert placement.asJsonBlob() == {
"type": "minecraft:heightmap",
"heightmap": "WORLD_SURFACE"
}
@@ -1,10 +0,0 @@
from mcpacker.format.datapack.placement import Placement
from typing import Any
# Class ############################################################################################
class InSquare(Placement):
def __init__(self):
super().__init__("minecraft:in_square")
@@ -1,18 +0,0 @@
from mcpacker.format.datapack.placement.insquare import InSquare
from pytest import fixture
# Fixtures #########################################################################################
@fixture(name="placement")
def createPlacement():
yield InSquare()
# Tests ############################################################################################
def test_asData(placement):
assert placement.asJsonBlob() == {
"type": "minecraft:in_square",
}
@@ -1,19 +0,0 @@
from mcpacker.format.datapack.placement import Placement
from mcpacker.json import JsonBlob
from typing import Any
# Class ############################################################################################
class RarityFilter(Placement):
def __init__(self, chance:int):
super().__init__("minecraft:rarity_filter")
self.chance = chance
def asJsonBlob(self) -> JsonBlob:
return {
"type": self.gameId,
"chance": self.chance,
}
@@ -1,19 +0,0 @@
from mcpacker.format.datapack.placement.rarityfilter import RarityFilter
from pytest import fixture
# Fixtures #########################################################################################
@fixture(name="placement")
def createPlacement():
yield RarityFilter(4)
# Tests ############################################################################################
def test_asData(placement):
assert placement.asJsonBlob() == {
"type": "minecraft:rarity_filter",
"chance": 4
}
@@ -1,20 +0,0 @@
from collections.abc import Iterable
from collections.abc import Mapping
from mcpacker.model.resourceid import ResourceId
# Class ############################################################################################
class Recipe:
def __init__(
self,
gameId:str|ResourceId,
resultId:str|ResourceId,
resultCount:int=1,
resultComponents:Mapping[str,str]|None=None,
):
self.gameId = ResourceId.parse(gameId)
self.resultComponents = resultComponents
self.resultCount = resultCount
self.resultId = ResourceId.parse(resultId)
@@ -1,56 +0,0 @@
from collections.abc import Iterable
from collections.abc import Mapping
from mcpacker.format.datapack.recipe import Recipe
from mcpacker.model.resourceid import ResourceId
# Class ############################################################################################
class ShapedRecipe(Recipe):
def __init__(
self,
gameId:str|ResourceId,
key:Mapping[str,(str|ResourceId|Iterable[ResourceId|str])],
pattern:Iterable[str],
resultId:str|ResourceId,
resultCount:int=1,
resultComponents:Mapping[str,str]|None=None,
):
super().__init__(gameId, resultId, resultCount, resultComponents)
self.key = self._parseKey(key)
self.pattern = self._parsePattern(pattern)
# Private Methods ##########################################################
def _parseKey(
self,
key:Mapping[str,(str|ResourceId|Iterable[ResourceId|str])]
) -> dict[str, list[ResourceId]]:
result:dict[str, list[ResourceId]] = {}
for name, value in key.items():
finalValue:list[ResourceId] = []
if isinstance(value, str) or isinstance(value, ResourceId):
finalValue = [ ResourceId.parse(value) ]
elif isinstance(value, Iterable):
finalValue = [ ResourceId.parse(e) for e in value ]
if len(name) != 1:
raise ValueError(f"key names must be a single letter (\"{name}\" is not valid)")
result[name] = finalValue
return result
def _parsePattern(self, pattern:Iterable[str]) -> list[str]:
result:list[str] = []
for row in pattern:
if len(row) not in [2, 3]:
raise ValueError(f"pattern rows must be 2 or 3 letters: (\"{row}\" is not valid)")
result.append(row)
return result
@@ -1,27 +0,0 @@
from pytest import fixture
from mcpacker.format.datapack.recipe.shapedrecipe import ShapedRecipe
# Fixtures #########################################################################################
@fixture(name="recipe")
def createRecipe():
yield ShapedRecipe(
"iron_pickaxe",
{"s": "stick", "i": "iron_ingot"},
["iii", " s ", " s "],
"iron_pickaxe"
)
# Tests ############################################################################################
def test_recipe(recipe:ShapedRecipe):
keyText = ", ".join(f"{k}:{str(v[0])}" for k,v in recipe.key.items())
recipeText = "|".join(str(i) for i in recipe.pattern)
assert keyText == "s:minecraft:stick, i:minecraft:iron_ingot"
assert recipeText == "iii| s | s "
assert str(recipe.resultId) == "minecraft:iron_pickaxe"
assert recipe.resultCount == 1
@@ -1,28 +0,0 @@
from collections.abc import Iterable
from collections.abc import Mapping
from mcpacker.model.resourceid import ResourceId
from mcpacker.format.datapack.recipe import Recipe
# Class ############################################################################################
class ShapelessRecipe(Recipe):
def __init__(
self,
gameId:str|ResourceId,
ingredients:Iterable[str|ResourceId],
resultId:str|ResourceId,
resultCount:int=1,
resultComponents:Mapping[str,str]|None=None,
):
super().__init__(gameId, resultId, resultCount, resultComponents)
self.ingredients = self._parseIngredients(ingredients)
def _parseIngredients(self, ingredients:Iterable[str|ResourceId]) -> list[ResourceId]:
result = [ ResourceId.parse(e) for e in ingredients ]
if len(result) > 9:
raise ValueError("cannot have more than 9 ingredients (\"{len(result}\" is not valid")
return result
@@ -1,17 +0,0 @@
from pytest import fixture
from mcpacker.format.datapack.recipe.shapelessrecipe import ShapelessRecipe
# Fixtures #########################################################################################
@fixture(name="recipe")
def createRecipe():
yield ShapelessRecipe("flint_and_steel", ["iron_ingot", "flint"], "flint_and_steel")
# Tests ############################################################################################
def test_recipe(recipe:ShapelessRecipe):
assert ", ".join(str(i) for i in recipe.ingredients) == "minecraft:iron_ingot, minecraft:flint"
assert str(recipe.resultId) == "minecraft:flint_and_steel"
assert recipe.resultCount == 1
-33
View File
@@ -1,33 +0,0 @@
from collections.abc import Iterable
from mcpacker.model.resourceid import ResourceId
from mcpacker.json import JsonBlob
import mcpacker.format.datapack.heightmaptype as HM
import mcpacker.format.datapack.generationstep as GS
# Class ############################################################################################
class Structure:
def __init__(
self,
gameId:ResourceId,
biomes:Iterable[ResourceId],
):
self.gameId = gameId
self.biomes = list(biomes)
def asJsonBlob(self) -> JsonBlob:
return {
"biomes": [str(b) for b in self.biomes],
"max_distance_from_center": 10,
"project_start_to_heightmap": str(HM.OCEAN_FLOOR),
"size": 1,
"spawn_overrides": {},
"start_height": { "absolute": 0 },
"start_pool": f"{self.gameId.mod}:deposit/{self.gameId.name}_marker",
"step": str(GS.SURFACE_STRUCTURES),
"type": "minecraft:jigsaw",
"use_expansion_hack": False,
}
@@ -1,7 +0,0 @@
import mcpacker.format.datapack.structure
# Tests ############################################################################################
def test_syntax():
pass
+6 -11
View File
@@ -1,18 +1,13 @@
from json import dump from typing import Protocol
from json import dumps
from json import load
from json import loads
from typing import TypeAlias
# Constants ########################################################################################
INDENT = " "
# Type Support ##################################################################################### # Type Support #####################################################################################
JsonBlob:TypeAlias = dict[str, "JsonBlob"] | list["JsonBlob"] | str | int | float | bool | None type JsonBlob = dict[str, "JsonBlob"] | list["JsonBlob"] | str | int | float | bool | None
class JsonBlobSource(Protocol):
def asJsonBlob(self) -> JsonBlob:...
# Functions ######################################################################################## # Functions ########################################################################################
@@ -1,8 +1,8 @@
from mcpacker.json import JsonBlob from mcpacker.format.json import JsonBlob
from pytest import fixture from pytest import fixture
from typing import cast from typing import cast
import mcpacker.json as json import mcpacker.format.json as json
# Fixtures ######################################################################################### # Fixtures #########################################################################################
@@ -1,127 +0,0 @@
from collections.abc import Iterator
from collections.abc import Mapping
from mcpacker.model.geology.inclusion import Inclusion
from mcpacker.format.templatecomposer import TemplateComposer
from mcpacker.model.geology.deposit.mineraldeposit import MineralDeposit
# Constants ########################################################################################
TEMPLATE = """
Config {{
B:enabled = true
}}
Deposit {{
S:customReplacements <
{customReplacements}
>
S:ores <
{ores}
>
I:rarity={rarity}
S:replaceableBlocks <
{replaceableBlocks}
>
B:vanilla=false
Dimensions {{
S:blackList <
>
S:whiteList <
>
}}
Biomes {{
S:blackList <
>
S:whiteList <
>
}}
Altitude {{
I:min={altitudeMin}
I:max={altitudeMax}
}}
Miscellaneous {{
B:exposed=true
S:proportions={proportions}
B:strictBounds=false
B:strictStart=false
}}
Indicator {{
S:circles <
>
S:continuity=0
I:distortion=0
S:id={indicatorId}
S:threshold=100
}}
Size {{
i:min={sizeMin}
I:max={sizeMax}
}}
}}
""".strip()
# Class ############################################################################################
class MineralDepositComposer(TemplateComposer):
def __init__(self, deposit:MineralDeposit):
super().__init__(TEMPLATE)
self._deposit = deposit
def gatherData(self) -> dict[str,str]:
return {
"altitudeMin": f"{self._deposit.altitude.bottom}",
"altitudeMax": f"{self._deposit.altitude.top}",
"customReplacements": "\n ".join(self._gatherCustomReplacements()),
"indicatorId": f"deposit/{self._deposit.gameId}_marker",
"ores": "\n ".join(self._gatherOres()),
"proportions": f"{self._deposit.proportion.ratio:0.2f}",
"rarity": f"{self._gatherRarity()}",
"replaceableBlocks": "\n ".join(self._gatherReplaceableBlocks()),
"sizeMin": f"{self._deposit.bulk.smallest}",
"sizeMax": f"{self._deposit.bulk.largest}",
}
# Private Methods ##########################################################
def _gatherCustomReplacements(self) -> list[str]:
result = {}
for inclusion in self._deposit.inclusions:
if len(inclusion.mineral.replacements) < 2: continue
for replacement in inclusion.mineral.replacements[1:]:
result[f"{replacement.source}->{replacement.target},{inclusion.weight}"] = True
return list(result.keys())
def _gatherOres(self) -> list[str]:
result = {}
for inclusion in self._deposit.inclusions:
if len(inclusion.mineral.replacements) < 1: continue
for replacement in inclusion.mineral.replacements[0:1]:
result[f"{replacement.target},{inclusion.weight}"] = True
return list(result.keys())
def _gatherReplaceableBlocks(self) -> list[str]:
result = {}
for inclusion in self._deposit.inclusions:
if len(inclusion.mineral.replacements) < 1: continue
for replacement in inclusion.mineral.replacements[0:1]:
result[f"{replacement.source}"] = True
return list(result.keys())
def _gatherRarity(self) -> int:
return {
"absent": 1000**2,
"rare": 21**2,
"unusual": 13**2,
"sparse": 8**2,
"uncommon": 5**2,
"common": 3**2,
"carpet": 1**2,
}[self._deposit.scarcity.name]
@@ -1,107 +0,0 @@
from mcpacker.model.ecology.biomefilter import BiomeFilter
from mcpacker.model.geology.deposit.mineraldeposit import MineralDeposit
from mcpacker.model.geology.inclusion import Inclusion
from mcpacker.model.geology.mineral import Mineral
from mcpacker.model.geology.replacement import Replacement
from pytest import fixture
from mcpacker.format.largeoredeposit.mineraldepositcomposer import MineralDepositComposer
from pytest import fixture
import mcpacker.model.altitude as AL
import mcpacker.model.ecology.flora as FL
import mcpacker.model.geology.bulk as BU
import mcpacker.model.geology.proportion as PR
import mcpacker.model.scarcity as SC
import textwrap
# Fixtures #########################################################################################
@fixture(name="quartz")
def createQuartz():
yield Mineral("quartz", [
Replacement.inStone("quartz_ore"),
Replacement.inDeepslate("deepslate_quartz_ore"),
])
@fixture(name="iron")
def createIron():
yield Mineral("iron", [
Replacement.inStone("iron_ore"),
Replacement.inDeepslate("deepslate_iron_ore"),
])
@fixture(name="bifIron")
def createBifIron(iron, quartz):
yield MineralDeposit(
name = "bifiron",
altitude = AL.CRUST,
biomeFilters = BiomeFilter([FL.FOREST]),
bulk = BU.LARGE,
inclusions = [Inclusion(iron, 60), Inclusion(quartz, 40)],
proportion = PR.LENS,
scarcity = SC.COMMON,
)
@fixture(name="composer")
def createComposer(bifIron):
yield MineralDepositComposer(bifIron).compose()
# Tests ############################################################################################
def test_str(composer):
assert str(composer) == textwrap.dedent("""
Config {
B:enabled = true
}
Deposit {
S:customReplacements <
#minecraft:deepslate_ore_replaceables->minecraft:deepslate_iron_ore,60
#minecraft:deepslate_ore_replaceables->minecraft:deepslate_quartz_ore,40
>
S:ores <
minecraft:iron_ore,60
minecraft:quartz_ore,40
>
I:rarity=9
S:replaceableBlocks <
#minecraft:stone_ore_replaceables
>
B:vanilla=false
Dimensions {
S:blackList <
>
S:whiteList <
>
}
Biomes {
S:blackList <
>
S:whiteList <
>
}
Altitude {
I:min=-32
I:max=32
}
Miscellaneous {
B:exposed=true
S:proportions=0.40
B:strictBounds=false
B:strictStart=false
}
Indicator {
S:circles <
>
S:continuity=0
I:distortion=0
S:id=deposit/bifiron_marker
S:threshold=100
}
Size {
i:min=1250
I:max=1500
}
}
""").strip()
+11 -8
View File
@@ -1,4 +1,5 @@
from mcpacker.model.modpack import ModPack from mcpacker.model.modpack import ModPack
from mcpacker.model.geology.mineralspawn import MineralSpawn
from mcpacker.model.ecology.biome import Biome from mcpacker.model.ecology.biome import Biome
from mcpacker.format.report.composer import ReportComposer from mcpacker.format.report.composer import ReportComposer
from pathlib import Path from pathlib import Path
@@ -26,15 +27,17 @@ class BiomeReport(ReportComposer):
def _composeGeologySection(self, biome:Biome): def _composeGeologySection(self, biome:Biome):
self.line().line("Geology:").indent() self.line().line("Geology:").indent()
depositCount = 0 mineralCount = 0
for deposit in self.pack.world.deposits: for spawn in self.pack.world.mineralSpawns:
if not deposit.acceptsBiome(biome): continue if "plutonic" in spawn.name: continue
self.line(f"{deposit.name} ({deposit.scarcity})")
depositCount += 1
if depositCount == 0: if not spawn.habitat.accepts(biome): continue
self.line("<no deposits>") self.line(f"{spawn.name} ({spawn.ecotype.scarcity})")
self.outdent() # deposits mineralCount += 1
if mineralCount == 0:
self.line("<no minerals>")
self.outdent() # minerals
def _composeFaunaSection(self, biome:Biome): def _composeFaunaSection(self, biome:Biome):
self.line().line("Fauna:").indent() self.line().line("Fauna:").indent()
+2 -2
View File
@@ -52,7 +52,7 @@ def test_report(report):
Traits: field, sedimentary, subtropical, dry, sandy, inland Traits: field, sedimentary, subtropical, dry, sandy, inland
Geology: Geology:
<no deposits> <no minerals>
Flora: Flora:
<no flora> <no flora>
@@ -65,7 +65,7 @@ def test_report(report):
Traits: field, sedimentary, temperate, damp, loamy, inland Traits: field, sedimentary, temperate, damp, loamy, inland
Geology: Geology:
<no deposits> <no minerals>
Flora: Flora:
<no flora> <no flora>
+28 -29
View File
@@ -1,5 +1,4 @@
from mcpacker.format.report.composer import ReportComposer from mcpacker.format.report.composer import ReportComposer
from mcpacker.model.geology.deposit.mineraldeposit import MineralDeposit
from mcpacker.model.modpack import ModPack from mcpacker.model.modpack import ModPack
from pathlib import Path from pathlib import Path
@@ -11,31 +10,31 @@ class DepositReport(ReportComposer):
def doCompose(self): def doCompose(self):
biomes = self.pack.world.biomes biomes = self.pack.world.biomes
for deposit in self.pack.world.deposits: # for deposit in self.pack.world.deposits:
self.line(f"Deposit: {deposit.name}") # self.line(f"Deposit: {deposit.name}")
self.line() # self.line()
self.indent() # self.indent()
self.text("altitude: ").line(deposit.altitude) # self.text("altitude: ").line(deposit.altitude)
self.text("biome filters: ").line(", ".join(str(b) for b in deposit.biomeFilters)) # self.text("biome filters: ").line(", ".join(str(b) for b in deposit.biomeFilters))
self.text("scarcity: ").line(deposit.scarcity) # self.text("scarcity: ").line(deposit.scarcity)
if isinstance(deposit, MineralDeposit): # if isinstance(deposit, MineralDeposit):
self.text("bulk: ").line(deposit.bulk) # self.text("bulk: ").line(deposit.bulk)
self.text("inclusions: ").line(", ".join(str(i) for i in deposit.inclusions)) # self.text("inclusions: ").line(", ".join(str(i) for i in deposit.inclusions))
self.text("proportion: ").line(deposit.proportion) # self.text("proportion: ").line(deposit.proportion)
#
self.line() # self.line()
self.line("Found in:") # self.line("Found in:")
self.indent() # self.indent()
#
biomeCount = 0 # biomeCount = 0
for biome in biomes.filter(lambda b: deposit.acceptsBiome(b)): # for biome in biomes.filter(lambda b: deposit.acceptsBiome(b)):
self.line(biome) # self.line(biome)
biomeCount += 1 # biomeCount += 1
#
if biomeCount == 0: # if biomeCount == 0:
self.line("WARNING: no suitable biomes") # self.line("WARNING: no suitable biomes")
#
self.outdent() # self.outdent()
#
self.outdent() # self.outdent()
self.line() # self.line()
+34 -5
View File
@@ -1,4 +1,6 @@
from mcpacker.format.report.composer import ReportComposer from mcpacker.format.report.composer import ReportComposer
from mcpacker.model.ecology.biome import Biome
from mcpacker.model.geology.mineral import Mineral
from mcpacker.model.modpack import ModPack from mcpacker.model.modpack import ModPack
from pathlib import Path from pathlib import Path
@@ -9,12 +11,39 @@ class MineralReport(ReportComposer):
def doCompose(self): def doCompose(self):
for mineral in self.pack.world.minerals: for mineral in self.pack.world.minerals:
self.line(f"Mineral: {mineral.name}") self.line(f"Mineral: {mineral.name}").line().indent()
self.line()
self.indent() self.line("Replacements:").line().indent()
for replacement in mineral.replacements: for replacement in mineral.replacements:
self.line(str(replacement)) self.line(str(replacement))
self.outdent() self.outdent().line() # replacements
self.line() self.line("Spawns:").line().indent()
for spawn in self.pack.world.mineralSpawns:
if spawn.mineral != mineral: continue
self.text(spawn.name).line(":").line().indent()
self.text("altitude: ").line(spawn.habitat.altitude)
self.text("biomeFilters: ")
self.line(" -or- ".join(str(f) for f in spawn.habitat.biomeFilters))
self.text("bulk: ").line(spawn.ecotype.bulk)
self.text("scarcity: ").line(spawn.ecotype.scarcity)
self.outdent().line() # spawn.name
self.outdent() # spawns
self.line("Biomes:").line().indent()
for biome in self._collateBiomes(mineral):
self.line(str(biome))
self.outdent().line() # biomes
self.outdent() # mineral
def _collateBiomes(self, mineral:Mineral) -> list[Biome]:
result:set[Biome] = set()
spawns = [s for s in self.pack.world.mineralSpawns if s.mineral == mineral]
for biome in self.pack.world.biomes:
for spawn in spawns:
if not spawn.habitat.accepts(biome): continue
result.add(biome)
return sorted(result)
@@ -40,11 +40,24 @@ def test_report(report:MineralReport):
assert str(report).strip() == textwrap.dedent(""" assert str(report).strip() == textwrap.dedent("""
Mineral: copper Mineral: copper
Replacements:
#minecraft:stone_replaceables => minecraft:copper_ore #minecraft:stone_replaceables => minecraft:copper_ore
#minecraft:deepslate_replaceables => minecraft:deepslate_copper_ore #minecraft:deepslate_replaceables => minecraft:deepslate_copper_ore
Spawns:
Biomes:
Mineral: iron Mineral: iron
Replacements:
#minecraft:stone_replaceables => minecraft:iron_ore #minecraft:stone_replaceables => minecraft:iron_ore
#minecraft:deepslate_replaceables => minecraft:deepslate_iron_ore #minecraft:deepslate_replaceables => minecraft:deepslate_iron_ore
Spawns:
Biomes:
""").strip() """).strip()
+2 -1
View File
@@ -1,6 +1,7 @@
from mcpacker.model.flora.patch import Patch from mcpacker.model.flora.patch import Patch
from mcpacker.model.flora.tree import Tree from mcpacker.model.flora.tree import Tree
from mcpacker.format.report.composer import ReportComposer from mcpacker.format.report.composer import ReportComposer
from mcpacker.model.ecology.biomefilter import BiomeFilter
from mcpacker.model.ecology.biometrait import BiomeTrait from mcpacker.model.ecology.biometrait import BiomeTrait
from mcpacker.model.modpack import ModPack from mcpacker.model.modpack import ModPack
from pathlib import Path from pathlib import Path
@@ -52,7 +53,7 @@ class PlantSpawnReport(ReportComposer):
self.line().line("Biomes:") self.line().line("Biomes:")
self.indent() # biomes self.indent() # biomes
for biome in self.pack.world.biomes.find(spawn.habitat.biomeFilters): for biome in BiomeFilter.collate(self.pack.world.biomes, spawn.habitat.biomeFilters):
self.line(biome) self.line(biome)
self.outdent() # biomes self.outdent() # biomes
-26
View File
@@ -1,26 +0,0 @@
from mcpacker.format.resourcepack.blockstate import BlockState
from mcpacker.format.resourcepack.variant import Variant
from mcpacker.format.resourcepack.model import Model
from mcpacker.model.modpack import ModPack
from mcpacker.model.resourceid import ResourceId
from mcpacker.format.datapack.recipe.shapedrecipe import ShapedRecipe
# Class ############################################################################################
class BlockFactory:
def __init__(self, pack:ModPack):
self.pack = pack
def makeBasicBlock(self, name:str, gameId:ResourceId):
basicCubeModelId = ResourceId.parse("block/cube_all")
textureId = ResourceId.parse(f"{gameId.mod}:block/{gameId.name}")
blockId = ResourceId.parse(f"{gameId.mod}:block/{gameId.name}")
resource = self.pack.resourcePack.get(gameId.mod)
resource.blockModels.append(Model(basicCubeModelId, {"all": textureId}))
resource.itemModels.append(Model(blockId))
resource.blockStates.append(BlockState(Variant(blockId)))
data = self.pack.dataPack.get(gameId.mod)
-9
View File
@@ -1,9 +0,0 @@
import mcpacker.model.blockfactory
# Tests ############################################################################################
def test_syntax():
pass
# TODO: add some meaningful tests
+5 -2
View File
@@ -1,7 +1,10 @@
from mcpacker.json import JsonBlob
from mcpacker.model.resourceid import ResourceId from mcpacker.model.resourceid import ResourceId
from typing import Any from typing import Any
# Type Support ####################################################################################
type PropertyDict = dict[str, str|int]
# Class ############################################################################################ # Class ############################################################################################
@@ -12,7 +15,7 @@ class BlockState:
if isinstance(value, BlockState): return value if isinstance(value, BlockState): return value
return BlockState(ResourceId.parse(value)) return BlockState(ResourceId.parse(value))
def __init__(self, gameId:ResourceId|str, properties:JsonBlob=None): def __init__(self, gameId:ResourceId|str, properties:PropertyDict|None=None):
self.gameId = ResourceId.parse(gameId) self.gameId = ResourceId.parse(gameId)
self.properties = properties self.properties = properties
+1 -1
View File
@@ -47,7 +47,7 @@ class Catalog[CatalogItem: HasName]:
def add(self, item:CatalogItem) -> "Catalog[CatalogItem]": def add(self, item:CatalogItem) -> "Catalog[CatalogItem]":
if item.name in self._items: if item.name in self._items:
raise Exception(f"Catalog already contains {item.name}") raise Exception(f"Catalog already contains '{item.name}'")
self._items[item.name] = item self._items[item.name] = item
return self return self
+17 -10
View File
@@ -6,6 +6,7 @@ from mcpacker.model.ecology.humidity import Humidity
from mcpacker.model.ecology.soil import Soil from mcpacker.model.ecology.soil import Soil
from mcpacker.model.ecology.water import Water from mcpacker.model.ecology.water import Water
from mcpacker.model.resourceid import ResourceId from mcpacker.model.resourceid import ResourceId
from typing import Any
#################################################################################################### ####################################################################################################
@@ -36,7 +37,7 @@ class Biome:
self.soil = soil self.soil = soil
self.water = water self.water = water
def __eq__(self, other) -> bool: def __eq__(self, other:Any) -> bool:
if type(self) != type(other): return False if type(self) != type(other): return False
if self.gameId != other.gameId: return False if self.gameId != other.gameId: return False
if self.name != other.name: return False if self.name != other.name: return False
@@ -45,20 +46,26 @@ class Biome:
def __hash__(self) -> int: def __hash__(self) -> int:
return hash((self.gameId, self.name)) return hash((self.gameId, self.name))
def __lt__(self, other:Any) -> bool:
if type(self) != type(other): raise ValueError()
return self.gameId < other.gameId
def __str__(self) -> str: def __str__(self) -> str:
return f"{self.gameId} ({self.name})" return f"{self.gameId} ({self.name})"
def __repr__(self) -> str: def __repr__(self) -> str:
return "".join([str(p) for p in [ return (
"Biome(", "Biome("
"flora=", repr(self.flora), ", ", f"flora={self.flora!r}, "
"geology=", repr(self.geology), ", ", f"gameId={self.gameId!r}, "
"heat=", repr(self.heat), ", ", f"geology={self.geology!r}, "
"humidity=", repr(self.humidity), ", ", f"heat={self.heat!r}, "
"soil=", repr(self.soil), ", ", f"humidity={self.humidity!r}, "
"water=", repr(self.water), f"name={self.name!r}, "
f"soil={self.soil!r}, "
f"water={self.water!r}"
")" ")"
]]) )
def traits(self) -> list[BiomeTrait]: def traits(self) -> list[BiomeTrait]:
return list([ return list([
+16
View File
@@ -1,4 +1,5 @@
from collections.abc import Sequence from collections.abc import Sequence
from collections.abc import Iterable
from mcpacker.model.resourceid import ResourceId from mcpacker.model.resourceid import ResourceId
from mcpacker.model.ecology.biome import Biome from mcpacker.model.ecology.biome import Biome
from mcpacker.model.ecology.biometrait import BiomeTrait from mcpacker.model.ecology.biometrait import BiomeTrait
@@ -25,6 +26,21 @@ class BiomeFilter:
required traits while simultaneously not possessing *any* of the prohibited ones. required traits while simultaneously not possessing *any* of the prohibited ones.
""" """
@staticmethod
def collate(biomes:Iterable[Biome], biomeFilters:Iterable["BiomeFilter"]) -> list[Biome]:
"""
Return the subset of given biomes which are accepted by all of the given filters.
"""
accepted:set[Biome] = set()
for biome in biomes:
for biomeFilter in biomeFilters:
if not biomeFilter.accepts(biome): continue
accepted.add(biome)
break
return sorted(accepted)
def __init__( def __init__(
self, self,
required:Sequence[BiomeTrait|ResourceId|Sequence[BiomeTrait]]|None=None, required:Sequence[BiomeTrait|ResourceId|Sequence[BiomeTrait]]|None=None,
+3 -1
View File
@@ -15,11 +15,13 @@ class Humidity(BiomeTrait):
# Constants ######################################################################################## # Constants ########################################################################################
SOAKED = Humidity("soaked")
WET = Humidity("wet") WET = Humidity("wet")
DAMP = Humidity("damp") DAMP = Humidity("damp")
DRY = Humidity("dry") DRY = Humidity("dry")
ARID = Humidity("arid")
ALL = [WET, DAMP, DRY] ALL = [SOAKED, WET, DAMP, DRY, ARID]
# Helpers ########################################################################################## # Helpers ##########################################################################################
+2 -2
View File
@@ -1,9 +1,9 @@
from mcpacker.model.catalog import Catalog
from mcpacker.model.fauna.group import Group from mcpacker.model.fauna.group import Group
from mcpacker.model.fauna.location import Location from mcpacker.model.fauna.location import Location
from mcpacker.model.fauna.mob import Mob from mcpacker.model.fauna.mob import Mob
from mcpacker.model.fauna.mobecotype import MobEcotype from mcpacker.model.fauna.mobecotype import MobEcotype
from mcpacker.model.fauna.mobspawn import MobSpawn from mcpacker.model.fauna.mobspawn import MobSpawn
from mcpacker.model.fauna.mobspawncatalog import MobSpawnCatalog
from mcpacker.model.scarcity import Scarcity from mcpacker.model.scarcity import Scarcity
from mcpacker.model.spawnbuilder import SpawnBuilder from mcpacker.model.spawnbuilder import SpawnBuilder
from typing import Self from typing import Self
@@ -16,7 +16,7 @@ import mcpacker.model.fauna.location as LO
class MobSpawnBuilder(SpawnBuilder[Mob, MobEcotype, MobSpawn]): class MobSpawnBuilder(SpawnBuilder[Mob, MobEcotype, MobSpawn]):
def __init__(self, catalog:MobSpawnCatalog): def __init__(self, catalog:Catalog[MobSpawn]):
super().__init__(catalog, MobSpawn) super().__init__(catalog, MobSpawn)
@property @property
+2 -2
View File
@@ -1,7 +1,7 @@
from mcpacker.model.catalog import Catalog
from mcpacker.model.ecotype import Ecotype from mcpacker.model.ecotype import Ecotype
from mcpacker.model.flora.plant import Plant from mcpacker.model.flora.plant import Plant
from mcpacker.model.flora.plantspawn import PlantSpawn from mcpacker.model.flora.plantspawn import PlantSpawn
from mcpacker.model.flora.plantspawncatalog import PlantSpawnCatalog
from mcpacker.model.spawnbuilder import SpawnBuilder from mcpacker.model.spawnbuilder import SpawnBuilder
from typing import Self from typing import Self
@@ -10,7 +10,7 @@ from typing import Self
class PlantSpawnBuilder(SpawnBuilder[Plant, Ecotype, PlantSpawn]): class PlantSpawnBuilder(SpawnBuilder[Plant, Ecotype, PlantSpawn]):
def __init__(self, catalog:PlantSpawnCatalog): def __init__(self, catalog:Catalog[PlantSpawn]):
super().__init__(catalog, PlantSpawn) super().__init__(catalog, PlantSpawn)
def _createEcotype(self) -> Ecotype: def _createEcotype(self) -> Ecotype:
+38 -17
View File
@@ -5,11 +5,20 @@ import math
# Class ############################################################################################ # Class ############################################################################################
class Bulk: class Bulk:
"""
Bulk describes the tendency of the material in a mineral deposit to clump together.
def __init__(self, name:str, smallest:int, largest:int): The `blobCount` describes how many blobs of mineral will appear in a 16mx16mx16m cube, more bulk
implies fewer overall blobs of larger size. For 2D deposit types (e.g., disk), this refers to
how many individual shapes are placed.
In any case, the total amount of mineral deposited remains the same (i.e., controlled by
`Scarcity`).
"""
def __init__(self, name:str, blobCount:int):
self.name = name self.name = name
self.smallest = smallest self.blobCount = blobCount
self.largest = largest
def __eq__(self, other:Any) -> bool: def __eq__(self, other:Any) -> bool:
if type(self) != type(other): return False if type(self) != type(other): return False
@@ -20,25 +29,37 @@ class Bulk:
return hash(self.name) return hash(self.name)
def __repr__(self) -> str: def __repr__(self) -> str:
return f"Bulk(name='{self.name}', smallest={self.smallest}, largest={self.largest})" return f"Bulk(name={self.name!r}, blobCount={self.blobCount!r})"
def __str__(self) -> str: def __str__(self) -> str:
return f"{self.name} ({self.smallest} to {self.largest})" return f"{self.name} ({self.blobCount})"
def scale(self, factor) -> "Bulk":
return Bulk(
self.name,
math.floor(self.smallest * factor),
math.floor(self.largest * factor)
)
# Constants ######################################################################################## # Constants ########################################################################################
TINY = Bulk("tiny", 250, 500) TINY = Bulk("tiny", 5)
SMALL = Bulk("small", 500, 750) SMALL = Bulk("small", 4)
MEDIUM = Bulk("small", 750, 1000) MEDIUM = Bulk("medium", 3)
LARGE = Bulk("large", 1250, 1500) LARGE = Bulk("large", 2)
HUGE = Bulk("huge", 1500, 1750) HUGE = Bulk("huge", 1)
ALL = [TINY, SMALL, MEDIUM, LARGE, HUGE] ALL = [TINY, SMALL, MEDIUM, LARGE, HUGE]
# Helper Functions #################################################################################
# TODO: The following properly belong somewhere in mcpacker.format, but I'm not sure where yet.
ORE_MAX_BLOCKS = [
0, 0, 0, 4, 5, 8, 9, 10, 10, 13, 16, 17, 23, 24, 24, 29, 32, 37, 46, 52, 52, 60, 68, 68, 74, 82,
94, 104, 106, 120, 128, 135, 149, 160, 180, 190, 204, 212, 228, 246, 262, 276, 292, 308, 324,
344, 360, 381, 403, 429, 452, 480, 500, 530, 558, 584, 616, 634, 664, 694, 730, 760, 790, 826,
864
]
def convertBlockCountToSize(blockCount:int) -> int:
"""Return the smallest integer `size` whose vein can reach at least max_blocks."""
for size, maxCount in enumerate(ORE_MAX_BLOCKS):
if maxCount >= blockCount:
return size
return len(ORE_MAX_BLOCKS) - 1
-20
View File
@@ -1,20 +0,0 @@
from mcpacker.model.geology.bulk import Bulk
from pytest import fixture
# Fixture ##########################################################################################
@fixture(name="bulk")
def createBulk():
return Bulk("chunk", 64, 128)
@fixture(name="scaledBulk")
def scaleBulk(bulk):
yield bulk.scale(2.0)
# Fixture ##########################################################################################
def test_repr(bulk, scaledBulk):
assert repr(bulk) == "Bulk(name='chunk', smallest=64, largest=128)"
assert repr(scaledBulk) == "Bulk(name='chunk', smallest=128, largest=256)"
@@ -1,56 +0,0 @@
from collections.abc import Iterable
from mcpacker.model.altitude import Altitude
from mcpacker.model.ecology.biome import Biome
from mcpacker.model.ecology.biomefilter import BiomeFilter
from mcpacker.model.geology.bulk import Bulk
from mcpacker.model.geology.mineral import Mineral
from mcpacker.model.scarcity import Scarcity
import mcpacker.model.altitude as altitude
import mcpacker.model.scarcity as scarcity
# Class ############################################################################################
class Deposit:
def __init__(
self,
name:str,
altitude:Altitude=altitude.ANYWHERE,
biomeFilters:Iterable[BiomeFilter]|BiomeFilter|None=None,
scarcity:Scarcity=scarcity.SPARSE,
):
self.altitude = altitude
self.biomeFilters:list[BiomeFilter] = []
self.gameId = name
self.name = name
self.scarcity = scarcity
if not biomeFilters:
biomeFilters = [BiomeFilter()]
if isinstance(biomeFilters, BiomeFilter):
biomeFilters = [biomeFilters]
for biomeFilter in biomeFilters:
self.biomeFilters.append(biomeFilter)
def __repr__(self) -> str:
return "".join([str(p) for p in [
"Deposit(",
"name=", self.name, ", ",
"altitude=", repr(self.altitude), ", ",
"biomeFilters=[", ", ".join(repr(self.biomeFilters)), "], ",
"scarcity=", repr(self.scarcity),
")"
]])
def __str__(self) -> str:
return self.name
def acceptsBiome(self, biome:Biome) -> bool:
for biomeFilter in self.biomeFilters:
if biomeFilter.accepts(biome): return True
return False
@@ -1,7 +0,0 @@
import mcpacker.model.geology.deposit
# Tests ############################################################################################
def test_syntax():
pass
@@ -1,25 +0,0 @@
from collections.abc import Iterable
from mcpacker.model.altitude import Altitude
from mcpacker.model.ecology.biomefilter import BiomeFilter
from mcpacker.model.geology.bulk import Bulk
from mcpacker.model.geology.deposit import Deposit
from mcpacker.model.geology.mineral import Mineral
from mcpacker.model.scarcity import Scarcity
import mcpacker.model.altitude as altitude
import mcpacker.model.scarcity as scarcity
# Class ############################################################################################
class GeodeDeposit(Deposit):
def __init__(
self,
name:str,
altitude:Altitude=altitude.ANYWHERE,
biomeFilters:Iterable[BiomeFilter]|BiomeFilter|None=None,
scarcity:Scarcity=scarcity.SPARSE,
):
super().__init__(name, altitude, biomeFilters, scarcity)
# TODO: add geode layers
@@ -1,7 +0,0 @@
import mcpacker.model.geology.deposit.geodedeposit
# Class ############################################################################################
def test_syntax():
pass
@@ -1,50 +0,0 @@
from collections.abc import Iterable
from mcpacker.model.altitude import Altitude
from mcpacker.model.ecology.biomefilter import BiomeFilter
from mcpacker.model.geology.bulk import Bulk
from mcpacker.model.geology.deposit import Deposit
from mcpacker.model.geology.inclusion import Inclusion
from mcpacker.model.geology.proportion import Proportion
from mcpacker.model.scarcity import Scarcity
import mcpacker.model.altitude as AL
import mcpacker.model.geology.bulk as BU
import mcpacker.model.geology.proportion as PR
import mcpacker.model.scarcity as SC
# Class ############################################################################################
class MineralDeposit(Deposit):
def __init__(
self,
name:str,
altitude:Altitude=AL.ANYWHERE,
biomeFilters:Iterable[BiomeFilter]|BiomeFilter|None=None,
bulk:Bulk=BU.MEDIUM,
inclusions:Iterable[Inclusion]|None=None,
proportion:Proportion=PR.BODY,
scarcity:Scarcity=SC.SPARSE,
):
super().__init__(name, altitude, biomeFilters, scarcity)
self.bulk = bulk
self.inclusions = list(inclusions or [])
self.proportion = proportion
def __repr__(self) -> str:
return "".join([str(p) for p in [
"MineralDeposit(" +
"name=", repr(self.name), ", ",
"altitude=", repr(self.altitude), ", ",
"biomeFilters=", repr(self.biomeFilters), ", ",
"bulk=", repr(self.bulk), ", ",
"inclusions=[", ", ".join([repr(m) for m in self.inclusions]), "], ",
"proportion=", repr(self.proportion), ", ",
"scarcity=", repr(self.scarcity),
")"
]])
def __str__(self) -> str:
return self.name
@@ -1,51 +0,0 @@
from mcpacker.model.ecology.biomefilter import BiomeFilter
from mcpacker.model.geology.deposit.mineraldeposit import MineralDeposit
from mcpacker.model.geology.inclusion import Inclusion
from mcpacker.model.geology.mineral import Mineral
from mcpacker.model.geology.replacement import Replacement
from pytest import fixture
import mcpacker.model.ecology.flora as FL
import mcpacker.model.geology.bulk as BU
import mcpacker.model.geology.proportion as PR
import mcpacker.model.scarcity as SC
# Fixtures #########################################################################################
@fixture(name="quartz")
def createQuartz():
yield Mineral("quartz", [])
@fixture(name="iron")
def createIron():
yield Mineral("iron", [])
@fixture(name="bifIron")
def createBifIron(iron, quartz):
yield MineralDeposit(
name = "bifiron",
biomeFilters = BiomeFilter([FL.FOREST]),
bulk = BU.LARGE,
inclusions = [Inclusion(iron, 60), Inclusion(quartz, 40)],
proportion = PR.LENS,
scarcity = SC.COMMON,
)
# Tests ############################################################################################
def test_repr(bifIron):
assert repr(bifIron) == (
"MineralDeposit(" +
"name='bifiron', " +
"altitude=Altitude(name=anywhere, bottom=-64, top=320), " +
"biomeFilters=[BiomeFilter(required=[Flora(name='forest')], prohibited=[])], " +
"bulk=Bulk(name='large', smallest=1250, largest=1500), " +
"inclusions=[" +
"Inclusion(mineral=Mineral(name='iron', replacements=[]), weight=60), " +
"Inclusion(mineral=Mineral(name='quartz', replacements=[]), weight=40)" +
"], " +
"proportion=Proportion(name='lens', ratio=0.4), " +
"scarcity=Scarcity(name='common')" +
")"
)
-8
View File
@@ -1,8 +0,0 @@
from mcpacker.model.catalog import Catalog
from mcpacker.model.geology.deposit import Deposit
# Classes ##########################################################################################
class DepositCatalog(Catalog[Deposit]):
pass
@@ -1,7 +0,0 @@
import mcpacker.model.geology.depositcatalog
# Tests ############################################################################################
def test_syntax():
pass
+32
View File
@@ -0,0 +1,32 @@
from typing import Any
# Class ############################################################################################
class DepositType:
def __init__(self, name:str):
self.name = name
def __eq__(self, other:Any) -> bool:
if type(self) != type(other): return False
if self.name != other.name: return False
return True
def __hash__(self) -> int:
return hash(self.name)
def __repr__(self) -> str:
return f"DepositType(name={self.name!r})"
def __str__(self) -> str:
return self.name
# Constants ########################################################################################
VEIN = DepositType("vein")
DISK = DepositType("disk")
STRATA = DepositType("strata")
ALL = [VEIN, STRATA]
-21
View File
@@ -1,21 +0,0 @@
from mcpacker.model.geology.inclusion import Inclusion
from mcpacker.model.geology.mineral import Mineral
from mcpacker.model.geology.replacement import Replacement
from pytest import fixture
# Fixtures #########################################################################################I
@fixture(name="iron")
def createIron():
yield Mineral("iron", [])
@fixture(name="inclusion")
def createInclusion(iron):
yield Inclusion(iron, 75)
# Tests ############################################################################################I
def test_repr(inclusion):
assert repr(inclusion) == "Inclusion(mineral=Mineral(name='iron', replacements=[]), weight=75)"
+14 -9
View File
@@ -1,24 +1,29 @@
from collections.abc import Iterable from collections.abc import Iterable
from mcpacker.model.geology.replacement import Replacement from mcpacker.model.geology.replacement import Replacement
from mcpacker.model.resourceid import ResourceId from mcpacker.model.resourceid import ResourceId
from mcpacker.model.spawnable import Spawnable
# Class ############################################################################################ # Class ############################################################################################
class Mineral: class Mineral(Spawnable):
def __init__(self, name:str, replacements:Iterable[Replacement]|Replacement):
super().__init__(name)
if isinstance(replacements, Replacement):
replacements = [replacements]
def __init__(self, name:str, replacements:Iterable[Replacement]|None=None):
self.name = name self.name = name
self.gameId = name self.replacements = list(replacements)
self.replacements = list(replacements or [])
def __str__(self) -> str: def __str__(self) -> str:
return self.name return self.name
def __repr__(self) -> str: def __repr__(self) -> str:
return "".join([str(p) for p in [ return (
f"Mineral(" + "Mineral("
"name=", repr(self.name), ", ", f"name={self.name!r}, "
"replacements=", repr(self.replacements), f"replacements={self.replacements!r}"
")" ")"
]]) )
-37
View File
@@ -1,37 +0,0 @@
from mcpacker.model.geology.mineral import Mineral
from mcpacker.model.geology.replacement import Replacement
from pytest import fixture
import mcpacker.model.geology.mineral as mineral
# Fixtures #########################################################################################
@fixture(name="iron")
def createIron():
yield Mineral("iron", [
Replacement.inStone("iron_ore"),
Replacement.inDeepslate("deepslate_iron_ore"),
])
# Tests ############################################################################################
def test_repr(iron):
assert repr(iron) == (
"Mineral(" +
"name='iron', " +
"replacements=[" +
"Replacement(" +
"source='#minecraft:stone_ore_replaceables', " +
"target='minecraft:iron_ore', " +
"weight=100" +
"), " +
"Replacement(" +
"source='#minecraft:deepslate_ore_replaceables', " +
"target='minecraft:deepslate_iron_ore', " +
"weight=100" +
")"
"]" +
")"
)
-8
View File
@@ -1,8 +0,0 @@
from mcpacker.model.catalog import Catalog
from mcpacker.model.geology.mineral import Mineral
# Classes ##########################################################################################
class MineralCatalog(Catalog[Mineral]):
pass
@@ -1,7 +0,0 @@
import mcpacker.model.geology.mineralcatalog
# Tests ############################################################################################
def test_syntax():
pass
+19
View File
@@ -0,0 +1,19 @@
from mcpacker.model.ecotype import Ecotype
from mcpacker.model.geology.bulk import Bulk
from mcpacker.model.geology.deposittype import DepositType
from mcpacker.model.scarcity import Scarcity
from mcpacker.model.resourceid import ResourceId
import mcpacker.model.geology.bulk as BU
import mcpacker.model.geology.deposittype as DE
# Class ############################################################################################
class MineralEcotype(Ecotype):
def __init__(self, scarcity:Scarcity, bulk:Bulk=BU.MEDIUM, depositType:DepositType=DE.VEIN):
super().__init__(scarcity)
self.bulk = bulk
self.depositType = depositType
+16
View File
@@ -0,0 +1,16 @@
from mcpacker.model.geology.mineralecotype import MineralEcotype
from mcpacker.model.geology.mineral import Mineral
from mcpacker.model.habitat import Habitat
from mcpacker.model.spawn import Spawn
# Class ############################################################################################
class MineralSpawn(Spawn[Mineral, MineralEcotype]):
def __init__(self, name:str, habitat:Habitat, deposit:Mineral, ecotype:MineralEcotype):
super().__init__(name, habitat, deposit, ecotype)
@property
def mineral(self) -> Mineral:
return self.spawnable
@@ -0,0 +1,51 @@
from mcpacker.model.catalog import Catalog
from mcpacker.model.ecotype import Ecotype
from mcpacker.model.geology.bulk import Bulk
from mcpacker.model.geology.deposittype import DepositType
from mcpacker.model.geology.mineral import Mineral
from mcpacker.model.geology.mineralecotype import MineralEcotype
from mcpacker.model.geology.mineralspawn import MineralSpawn
from mcpacker.model.resourceid import ResourceId
from mcpacker.model.spawnbuilder import SpawnBuilder
from typing import Self
import mcpacker.model.geology.bulk as BU
import mcpacker.model.geology.deposittype as DE
# Class ############################################################################################
class MineralSpawnBuilder(SpawnBuilder[Mineral, MineralEcotype, MineralSpawn]):
def __init__(self, catalog:Catalog[MineralSpawn]):
super().__init__(catalog, MineralSpawn)
def _createEcotype(self) -> MineralEcotype:
return MineralEcotype(self.scarcity, self.bulk, self.depositType)
def _reset(self):
super()._reset()
self.bulk = None
self.depositType = None
@property
def bulk(self) -> Bulk:
return self._bulk
@bulk.setter
def bulk(self, value:Bulk|None):
if value == None:
value = BU.MEDIUM
self._bulk = value
@property
def depositType(self) -> DepositType:
return self._depositType
@depositType.setter
def depositType(self, value:DepositType|None):
if value == None:
value = DE.VEIN
self._depositType = value
-34
View File
@@ -1,34 +0,0 @@
# Class ############################################################################################
class Proportion:
def __init__(self, name:str, ratio:float):
self.name = name
self.ratio = ratio
def __eq__(self, other) -> bool:
if type(self) != type(other): return False
if self.name != other.name: return False
return True
def __hash__(self) -> int:
return hash(self.name)
def __str__(self) -> str:
return f"{self.name} ({self.ratio})"
def __repr__(self) -> str:
return f"Proportion(name='{self.name}', ratio={self.ratio})"
# Constants ########################################################################################
BED = Proportion("bed", 0.1) # salt, nitrate, redbed, loam, bif iron, peat coal
LENS = Proportion("lens", 0.4) # bit.coal, aluminum, lapis, quartzite
LODE = Proportion("lode", 0.7) # au.quartz, mvt lead
BODY = Proportion("body", 1.0) # sed.iron
STOCK = Proportion("stock", 1.3) # tin
VENT = Proportion("vent", 1.6) # sulfur
PIPE = Proportion("pipe", 1.9) # por.copper
ALL = [BED, LENS, LODE, BODY, STOCK, VENT, PIPE]
-12
View File
@@ -1,12 +0,0 @@
from pytest import fixture
import mcpacker.model.geology.proportion as proportion
# Tests ############################################################################################
def test_str():
assert str(proportion.LENS) == "lens (0.4)"
def test_repr():
assert repr(proportion.LENS) == "Proportion(name='lens', ratio=0.4)"
+18 -18
View File
@@ -3,8 +3,9 @@ from mcpacker.model.resourceid import ResourceId
# Constants ######################################################################################## # Constants ########################################################################################
STONE_REPLACEABLES = "#minecraft:stone_ore_replaceables"
DEEPSLATE_REPLACEABLES = "#minecraft:deepslate_ore_replaceables" DEEPSLATE_REPLACEABLES = "#minecraft:deepslate_ore_replaceables"
NETHERRACK_REPLACEABLES = "#minecraft:base_stone_nether"
STONE_REPLACEABLES = "#minecraft:stone_ore_replaceables"
# Class ############################################################################################ # Class ############################################################################################
@@ -12,29 +13,28 @@ DEEPSLATE_REPLACEABLES = "#minecraft:deepslate_ore_replaceables"
class Replacement: class Replacement:
@staticmethod @staticmethod
def inStone(target:str, weight:int=100): def inDeepslate(target:ResourceId|str):
return Replacement(STONE_REPLACEABLES, target, weight) return Replacement(DEEPSLATE_REPLACEABLES, target)
@staticmethod @staticmethod
def inDeepslate(target:str, weight:int=100): def inNetherrack(target:ResourceId|str):
return Replacement(DEEPSLATE_REPLACEABLES, target, weight) return Replacement(NETHERRACK_REPLACEABLES, target)
def __init__(self, source:str, target:str, weight:int=100): @staticmethod
self.source = ResourceId.canonical(source) def inStone(target:ResourceId|str):
self.target = ResourceId.canonical(target) return Replacement(STONE_REPLACEABLES, target)
self.weight = weight
def __init__(self, source:ResourceId|str, target:ResourceId|str):
self.source = ResourceId.parse(source)
self.target = ResourceId.parse(target)
def __str__(self) -> str: def __str__(self) -> str:
if self.weight == 100:
return f"{self.source} => {self.target}" return f"{self.source} => {self.target}"
return f"{self.source} => {self.target} ({self.weight}%)"
def __repr__(self) -> str: def __repr__(self) -> str:
return "".join([str(p) for p in [ return (
"Replacement(" + "Replacement("
"source=", repr(self.source), ", ", f"source={self.source!r}, "
"target=", repr(self.target), ", ", f"target={self.target!r}"
"weight=", repr(self.weight),
")" ")"
]]) )
@@ -1,28 +0,0 @@
from pytest import fixture
from mcpacker.model.geology.replacement import Replacement
# Fixtures #########################################################################################
@fixture(name="replacement")
def createReplacement():
yield Replacement("#minecraft:stone", "minecraft:iron_ore")
@fixture(name="weightedReplacement")
def createWeightedReplacement():
yield Replacement("#minecraft:dirt", "minecraft:gravel", 25)
# Tests ############################################################################################
def test_repr(replacement, weightedReplacement):
assert repr(replacement) == (
"Replacement(source='#minecraft:stone', target='minecraft:iron_ore', weight=100)"
)
assert repr(weightedReplacement) == (
"Replacement(source='#minecraft:dirt', target='minecraft:gravel', weight=25)"
)
def test_str(replacement, weightedReplacement):
assert str(replacement) == "#minecraft:stone => minecraft:iron_ore"
assert str(weightedReplacement) == "#minecraft:dirt => minecraft:gravel (25%)"
-6
View File
@@ -1,9 +1,7 @@
from collections.abc import Iterable from collections.abc import Iterable
from mcpacker.format.datapack import DataPack
from mcpacker.model.resourceid import ResourceId from mcpacker.model.resourceid import ResourceId
from mcpacker.model.world import World from mcpacker.model.world import World
from mcpacker.model.mod import Mod from mcpacker.model.mod import Mod
from mcpacker.format.resourcepack import ResourcePack
from typing import Callable from typing import Callable
from typing import Self from typing import Self
@@ -22,16 +20,12 @@ class ModPack:
name:str, name:str,
mods:Iterable[Mod]|None=None, mods:Iterable[Mod]|None=None,
world:World|None=None, world:World|None=None,
dataPack:DataPack|None=None,
resourcePack:ResourcePack|None=None,
disabledFeatures:Iterable[ResourceId]|None=None disabledFeatures:Iterable[ResourceId]|None=None
): ):
self.name = name self.name = name
self.dataPack = dataPack or DataPack(self.name)
self.mods = {mod.name: mod for mod in (mods or [])} self.mods = {mod.name: mod for mod in (mods or [])}
self.disabledFeatures = list(disabledFeatures or []) self.disabledFeatures = list(disabledFeatures or [])
self.resourcePack = resourcePack or ResourcePack(self.name)
self.world = world or World() self.world = world or World()
def augment(self, doAugment:AugmentFunc) -> Self: def augment(self, doAugment:AugmentFunc) -> Self:
+7
View File
@@ -32,6 +32,13 @@ class SpawnBuilder[SpawnableKind:Spawnable, EcotypeKind:Ecotype, SpawnKind:Spawn
self._spawnable = spawnable self._spawnable = spawnable
return self return self
def switch(self, spawnable:SpawnableKind) -> Self:
biomeFilters = self.biomeFilters
self._reset()
self._biomeFilters = biomeFilters
self._spawnable = spawnable
return self
def save(self, name:str) -> Self: def save(self, name:str) -> Self:
if not self._spawnable: raise RuntimeError("you must call start before save") if not self._spawnable: raise RuntimeError("you must call start before save")
+47 -42
View File
@@ -1,51 +1,56 @@
from mcpacker.model.ecology.biomecatalog import BiomeCatalog from mcpacker.model.catalog import Catalog
from mcpacker.model.fauna.mobcatalog import MobCatalog from mcpacker.model.ecology.biome import Biome
from mcpacker.model.fauna.mobspawncatalog import MobSpawnCatalog from mcpacker.model.fauna.mob import Mob
from mcpacker.model.flora.plantcatalog import PlantCatalog from mcpacker.model.fauna.mobspawn import MobSpawn
from mcpacker.model.flora.plantspawncatalog import PlantSpawnCatalog from mcpacker.model.flora.plant import Plant
from mcpacker.model.geology.depositcatalog import DepositCatalog from mcpacker.model.flora.plantspawn import PlantSpawn
from mcpacker.model.geology.mineralcatalog import MineralCatalog from mcpacker.model.geology.mineral import Mineral
from mcpacker.model.material.blockcatalog import BlockCatalog from mcpacker.model.geology.mineralspawn import MineralSpawn
from mcpacker.model.material.itemcatalog import ItemCatalog from mcpacker.model.material.block import Block
from mcpacker.model.material.item import Item
# Class ############################################################################################ # Class ############################################################################################
class World: class World:
def __init__( def __init__(self):
self, self.biomes = Catalog[Biome]()
biomes:BiomeCatalog|None=None, self.blocks = Catalog[Block]()
blocks:BlockCatalog|None=None, self.items = Catalog[Item]()
deposits:DepositCatalog|None=None, self.minerals = Catalog[Mineral]()
items:ItemCatalog|None=None, self.mineralSpawns = Catalog[MineralSpawn]()
minerals:MineralCatalog|None=None, self.mobs = Catalog[Mob]()
mobs:MobCatalog|None=None, self.mobSpawns = Catalog[MobSpawn]()
mobSpawns:MobSpawnCatalog|None=None, self.plants = Catalog[Plant]()
plants:PlantCatalog|None=None, self.plantSpawns = Catalog[PlantSpawn]()
plantSpawns:PlantSpawnCatalog|None=None,
): def __str__(self) -> str:
self.biomes = biomes or BiomeCatalog() return (
self.blocks = blocks or BlockCatalog() "World("
self.deposits = deposits or DepositCatalog() f"{len(self.biomes)} biomes, "
self.items = items or ItemCatalog() f"{len(self.blocks)} blocks, "
self.minerals = minerals or MineralCatalog() f"{len(self.items)} items, "
self.mobs = mobs or MobCatalog() f"{len(self.minerals)} minerals, "
self.mobSpawns = mobSpawns or MobSpawnCatalog() f"{len(self.mineralSpawns)} mineralSpawns, "
self.plants = plants or PlantCatalog() f"{len(self.mobs)} mobs, "
self.plantSpawns = plantSpawns or PlantSpawnCatalog() f"{len(self.mobSpawns)} mobSpawns, "
f"{len(self.plants)} plants, "
f"{len(self.plantSpawns)} plantSpawns"
")"
)
def __repr__(self) -> str: def __repr__(self) -> str:
return "".join([ return (
"World(", "World("
"biomes=", repr(self.biomes), ", ", f"biomes={self.biomes!r}, "
"blocks=", repr(self.blocks), ", ", f"blocks={self.blocks!r}, "
"deposits=", repr(self.deposits), ", ", f"items={self.items!r}, "
"items=", repr(self.items), ", ", f"minerals={self.minerals!r}, "
"minerals=", repr(self.minerals), ", ", f"mineralSpawns={self.mineralSpawns!r}, "
"mobs=", repr(self.mobs), ", ", f"mobs={self.mobs!r}, "
"mobSpawns=", repr(self.mobSpawns), ", ", f"mobSpawns={self.mobSpawns!r}, "
"plants=", repr(self.plants), ", ", f"plants={self.plants!r}, "
"plantSpawns=", repr(self.plantSpawns), f"plantSpawns={self.plantSpawns!r}"
")" ")"
]) )
+128 -128
View File
@@ -14,94 +14,122 @@ import mcpacker.model.ecology.water as WA
def addBiomes(pack:ModPack): def addBiomes(pack:ModPack):
biomes = pack.world.biomes biomes = pack.world.biomes
biomes.add(Biome("aberdeen", "minecraft:windswept_gravelly_hills", biomes.add(Biome("tombstone", "minecraft:badlands",
FL.BARREN, GE.METAMORPHIC, HE.BOREAL, HU.DAMP, SO.ROCKY, WA.INLAND FL.BARREN, GE.SEDIMENTARY, HE.SUBTROPICAL, HU.ARID, SO.CLAYEY, WA.INLAND
)) ))
biomes.add(Biome("archangel", "minecraft:frozen_ocean", biomes.add(Biome("rangoon", "minecraft:bamboo_jungle",
FL.BARREN, GE.SEDIMENTARY, HE.FROZEN, HU.WET, SO.SANDY, WA.OCEAN FL.FOREST, GE.SEDIMENTARY, HE.TROPICAL, HU.WET, SO.ACIDIC, WA.INLAND
)) ))
biomes.add(Biome("aspen", "minecraft:frozen_peaks", biomes.add(Biome("nice", "minecraft:beach",
FL.BARREN, GE.IGNEOUS, HE.FROZEN, HU.WET, SO.ROCKY, WA.INLAND FL.BARREN, GE.SEDIMENTARY, HE.SUBTROPICAL, HU.DAMP, SO.SANDY, WA.COAST
)) ))
biomes.add(Biome("bombay", "minecraft:lukewarm_ocean", biomes.add(Biome("helsinki", "minecraft:birch_forest",
FL.BARREN, GE.SEDIMENTARY, HE.SUBTROPICAL, HU.WET, SO.SANDY, WA.OCEAN FL.FOREST, GE.SEDIMENTARY, HE.TEMPERATE, HU.WET, SO.ACIDIC, WA.INLAND
))
biomes.add(Biome("tokyo", "minecraft:cherry_grove",
FL.CLEARING, GE.SEDIMENTARY, HE.TEMPERATE, HU.DAMP, SO.ROCKY, WA.INLAND
)) ))
biomes.add(Biome("boston", "minecraft:cold_ocean", biomes.add(Biome("boston", "minecraft:cold_ocean",
FL.BARREN, GE.SEDIMENTARY, HE.BOREAL, HU.WET, SO.CLAYEY, WA.OCEAN FL.BARREN, GE.SEDIMENTARY, HE.BOREAL, HU.DAMP, SO.CLAYEY, WA.OCEAN
))
biomes.add(Biome("bryce", "minecraft:eroded_badlands",
FL.BARREN, GE.SEDIMENTARY, HE.SUBTROPICAL, HU.DRY, SO.CLAYEY, WA.INLAND
))
biomes.add(Biome("calcutta", "minecraft:mangrove_swamp",
FL.FOREST, GE.SEDIMENTARY, HE.TROPICAL, HU.WET, SO.CLAYEY, WA.SWAMP
))
biomes.add(Biome("cornwall", "minecraft:windswept_hills",
FL.BARREN, GE.METAMORPHIC, HE.BOREAL, HU.DAMP, SO.ROCKY, WA.INLAND
))
biomes.add(Biome("dakar", "minecraft:savanna",
FL.FIELD, GE.SEDIMENTARY, HE.SUBTROPICAL, HU.DRY, SO.SANDY, WA.INLAND
))
biomes.add(Biome("duluth", "minecraft:frozen_river",
FL.BARREN, GE.SEDIMENTARY, HE.FROZEN, HU.WET, SO.SANDY, WA.RIVER
))
biomes.add(Biome("khartoum", "minecraft:savanna_plateau",
FL.FIELD, GE.IGNEOUS, HE.SUBTROPICAL, HU.DRY, SO.SANDY, WA.INLAND
)) ))
biomes.add(Biome("freiburg", "minecraft:dark_forest", biomes.add(Biome("freiburg", "minecraft:dark_forest",
FL.CANOPY, GE.SEDIMENTARY, HE.TEMPERATE, HU.WET, SO.CLAYEY, WA.INLAND FL.CANOPY, GE.METAMORPHIC, HE.TEMPERATE, HU.SOAKED, SO.CLAYEY, WA.INLAND
))
biomes.add(Biome("glasgow", "minecraft:windswept_forest",
FL.CLEARING, GE.METAMORPHIC, HE.BOREAL, HU.DAMP, SO.ACIDIC, WA.INLAND
))
biomes.add(Biome("haarlem", "minecraft:flower_forest",
FL.CLEARING, GE.SEDIMENTARY, HE.TEMPERATE, HU.DAMP, SO.LOAMY, WA.INLAND
)) ))
biomes.add(Biome("halifax", "minecraft:deep_cold_ocean", biomes.add(Biome("halifax", "minecraft:deep_cold_ocean",
FL.BARREN, GE.SEDIMENTARY, HE.BOREAL, HU.WET, SO.SANDY, WA.OCEAN FL.BARREN, GE.METAMORPHIC, HE.BOREAL, HU.WET, SO.CLAYEY, WA.OCEAN
))
biomes.add(Biome("tromso", "minecraft:deep_frozen_ocean",
FL.BARREN, GE.METAMORPHIC, HE.FROZEN, HU.DAMP, SO.CLAYEY, WA.OCEAN
))
biomes.add(Biome("havana", "minecraft:deep_lukewarm_ocean",
FL.BARREN, GE.SEDIMENTARY, HE.SUBTROPICAL, HU.WET, SO.CLAYEY, WA.OCEAN
))
biomes.add(Biome("auckland", "minecraft:deep_ocean",
FL.BARREN, GE.IGNEOUS, HE.TEMPERATE, HU.DAMP, SO.CLAYEY, WA.OCEAN
))
biomes.add(Biome("timbuktu", "minecraft:desert",
FL.BARREN, GE.SEDIMENTARY, HE.TROPICAL, HU.ARID, SO.SANDY, WA.INLAND
))
biomes.add(Biome("canoncity", "minecraft:eroded_badlands",
FL.BARREN, GE.IGNEOUS, HE.SUBTROPICAL, HU.ARID, SO.ROCKY, WA.INLAND
))
biomes.add(Biome("haarlem", "minecraft:flower_forest",
FL.CLEARING, GE.SEDIMENTARY, HE.TEMPERATE, HU.WET, SO.LOAMY, WA.INLAND
))
biomes.add(Biome("sherwood", "minecraft:forest",
FL.FOREST, GE.SEDIMENTARY, HE.TEMPERATE, HU.WET, SO.LOAMY, WA.INLAND
))
biomes.add(Biome("archangel", "minecraft:frozen_ocean",
FL.BARREN, GE.IGNEOUS, HE.FROZEN, HU.DAMP, SO.SANDY, WA.OCEAN
))
biomes.add(Biome("chamonix", "minecraft:frozen_peaks",
FL.BARREN, GE.IGNEOUS, HE.FROZEN, HU.DAMP, SO.ROCKY, WA.INLAND
))
biomes.add(Biome("winnipeg", "minecraft:frozen_river",
FL.BARREN, GE.IGNEOUS, HE.FROZEN, HU.DAMP, SO.SANDY, WA.RIVER
))
biomes.add(Biome("umea", "minecraft:grove",
FL.CLEARING, GE.METAMORPHIC, HE.FROZEN, HU.DAMP, SO.ACIDIC, WA.INLAND
)) ))
biomes.add(Biome("hammerfest", "minecraft:ice_spikes", biomes.add(Biome("hammerfest", "minecraft:ice_spikes",
FL.BARREN, GE.METAMORPHIC, HE.FROZEN, HU.WET, SO.ROCKY, WA.INLAND FL.BARREN, GE.METAMORPHIC, HE.FROZEN, HU.WET, SO.ROCKY, WA.INLAND
)) ))
biomes.add(Biome("havana", "minecraft:deep_lukewarm_ocean", biomes.add(Biome("jackson", "minecraft:jagged_peaks",
FL.BARREN, GE.SEDIMENTARY, HE.SUBTROPICAL, HU.WET, SO.SANDY, WA.OCEAN FL.BARREN, GE.METAMORPHIC, HE.BOREAL, HU.DRY, SO.ROCKY, WA.INLAND
)) ))
biomes.add(Biome("tahiti", "minecraft:mushroom_fields", biomes.add(Biome("singapore", "minecraft:jungle",
FL.CLEARING, GE.IGNEOUS, HE.TROPICAL, HU.WET, SO.FUNGAL, WA.INLAND FL.CANOPY, GE.IGNEOUS, HE.TROPICAL, HU.SOAKED, SO.ACIDIC, WA.INLAND
)) ))
biomes.add(Biome("honolulu", "minecraft:deep_ocean", biomes.add(Biome("bombay", "minecraft:lukewarm_ocean",
FL.BARREN, GE.IGNEOUS, HE.TEMPERATE, HU.WET, SO.SANDY, WA.OCEAN FL.BARREN, GE.IGNEOUS, HE.SUBTROPICAL, HU.WET, SO.SANDY, WA.OCEAN
))
biomes.add(Biome("calcutta", "minecraft:mangrove_swamp",
FL.FOREST, GE.SEDIMENTARY, HE.TROPICAL, HU.SOAKED, SO.CLAYEY, WA.SWAMP
)) ))
biomes.add(Biome("innsbruck", "minecraft:meadow", biomes.add(Biome("innsbruck", "minecraft:meadow",
FL.FIELD, GE.IGNEOUS, HE.BOREAL, HU.DAMP, SO.LOAMY, WA.INLAND FL.FIELD, GE.METAMORPHIC, HE.BOREAL, HU.DAMP, SO.LOAMY, WA.INLAND
)) ))
biomes.add(Biome("irkutsk", "minecraft:taiga", biomes.add(Biome("krakatoa", "minecraft:mushroom_fields",
FL.CLEARING, GE.IGNEOUS, HE.TROPICAL, HU.WET, SO.FUNGAL, WA.INLAND
))
biomes.add(Biome("sanfrancisco", "minecraft:ocean",
FL.BARREN, GE.IGNEOUS, HE.TEMPERATE, HU.DAMP, SO.SANDY, WA.OCEAN
))
biomes.add(Biome("minsk", "minecraft:old_growth_birch_forest",
FL.FOREST, GE.SEDIMENTARY, HE.TEMPERATE, HU.WET, SO.SANDY, WA.INLAND
))
biomes.add(Biome("stpetersburg", "minecraft:old_growth_pine_taiga",
FL.FOREST, GE.METAMORPHIC, HE.BOREAL, HU.DAMP, SO.ACIDIC, WA.INLAND FL.FOREST, GE.METAMORPHIC, HE.BOREAL, HU.DAMP, SO.ACIDIC, WA.INLAND
)) ))
biomes.add(Biome("jackson", "minecraft:jagged_peaks",
FL.BARREN, GE.METAMORPHIC, HE.BOREAL, HU.DRY, SO.ROCKY, WA.INLAND
))
biomes.add(Biome("juneau", "minecraft:old_growth_spruce_taiga", biomes.add(Biome("juneau", "minecraft:old_growth_spruce_taiga",
FL.FOREST, GE.METAMORPHIC, HE.BOREAL, HU.DAMP, SO.PEATY, WA.INLAND FL.FOREST, GE.METAMORPHIC, HE.BOREAL, HU.DAMP, SO.PEATY, WA.INLAND
)) ))
@@ -110,106 +138,78 @@ def addBiomes(pack:ModPack):
FL.FIELD, GE.SEDIMENTARY, HE.TEMPERATE, HU.DAMP, SO.LOAMY, WA.INLAND FL.FIELD, GE.SEDIMENTARY, HE.TEMPERATE, HU.DAMP, SO.LOAMY, WA.INLAND
)) ))
biomes.add(Biome("kola", "minecraft:snowy_taiga",
FL.FOREST, GE.METAMORPHIC, HE.FROZEN, HU.DAMP, SO.ACIDIC, WA.INLAND
))
biomes.add(Biome("kyoto", "minecraft:cherry_grove",
FL.CLEARING, GE.SEDIMENTARY, HE.TEMPERATE, HU.DAMP, SO.ROCKY, WA.INLAND
))
biomes.add(Biome("madras", "minecraft:sparse_jungle",
FL.CLEARING, GE.SEDIMENTARY, HE.TROPICAL, HU.WET, SO.ACIDIC, WA.INLAND
))
biomes.add(Biome("memphis", "minecraft:river", biomes.add(Biome("memphis", "minecraft:river",
FL.BARREN, GE.SEDIMENTARY, HE.TEMPERATE, HU.WET, SO.SANDY, WA.RIVER FL.BARREN, GE.SEDIMENTARY, HE.TEMPERATE, HU.WET, SO.SANDY, WA.RIVER
)) ))
biomes.add(Biome("minsk", "minecraft:old_growth_birch_forest", biomes.add(Biome("katanga", "minecraft:savanna",
FL.FOREST, GE.SEDIMENTARY, HE.TEMPERATE, HU.DAMP, SO.ACIDIC, WA.INLAND FL.FIELD, GE.SEDIMENTARY, HE.SUBTROPICAL, HU.DRY, SO.SANDY, WA.INLAND
)) ))
biomes.add(Biome("moab", "minecraft:windswept_savanna", biomes.add(Biome("khartoum", "minecraft:savanna_plateau",
FL.FIELD, GE.IGNEOUS, HE.SUBTROPICAL, HU.DRY, SO.ROCKY, WA.INLAND FL.FIELD, GE.SEDIMENTARY, HE.SUBTROPICAL, HU.DRY, SO.SANDY, WA.INLAND
))
biomes.add(Biome("mobile", "minecraft:swamp",
FL.CLEARING, GE.SEDIMENTARY, HE.TEMPERATE, HU.WET, SO.PEATY, WA.SWAMP
))
biomes.add(Biome("moscow", "minecraft:snowy_plains",
FL.FIELD, GE.SEDIMENTARY, HE.FROZEN, HU.DAMP, SO.PEATY, WA.INLAND
))
biomes.add(Biome("nassau", "minecraft:warm_ocean",
FL.BARREN, GE.SEDIMENTARY, HE.TROPICAL, HU.WET, SO.SANDY, WA.COAST
))
biomes.add(Biome("nice", "minecraft:beach",
FL.BARREN, GE.SEDIMENTARY, HE.SUBTROPICAL, HU.DAMP, SO.SANDY, WA.COAST
)) ))
biomes.add(Biome("nuuk", "minecraft:snowy_beach", biomes.add(Biome("nuuk", "minecraft:snowy_beach",
FL.BARREN, GE.SEDIMENTARY, HE.FROZEN, HU.DAMP, SO.SANDY, WA.COAST FL.BARREN, GE.METAMORPHIC, HE.FROZEN, HU.DAMP, SO.SANDY, WA.COAST
)) ))
biomes.add(Biome("perm", "minecraft:old_growth_pine_taiga", biomes.add(Biome("rovaniemi", "minecraft:snowy_plains",
FL.FOREST, GE.METAMORPHIC, HE.BOREAL, HU.DAMP, SO.ACIDIC, WA.INLAND FL.FIELD, GE.SEDIMENTARY, HE.FROZEN, HU.DAMP, SO.PEATY, WA.INLAND
)) ))
biomes.add(Biome("timbuktu", "minecraft:desert", biomes.add(Biome("zurich", "minecraft:snowy_slopes",
FL.BARREN, GE.SEDIMENTARY, HE.TROPICAL, HU.DRY, SO.SANDY, WA.INLAND FL.BARREN, GE.METAMORPHIC, HE.FROZEN, HU.DAMP, SO.ROCKY, WA.INLAND
)) ))
biomes.add(Biome("plymouth", "minecraft:stony_shore", biomes.add(Biome("kola", "minecraft:snowy_taiga",
FL.BARREN, GE.METAMORPHIC, HE.TEMPERATE, HU.DAMP, SO.ROCKY, WA.COAST FL.FOREST, GE.METAMORPHIC, HE.FROZEN, HU.DAMP, SO.ACIDIC, WA.INLAND
)) ))
biomes.add(Biome("sherwood", "minecraft:forest", biomes.add(Biome("madras", "minecraft:sparse_jungle",
FL.FOREST, GE.SEDIMENTARY, HE.TEMPERATE, HU.DAMP, SO.LOAMY, WA.INLAND FL.CLEARING, GE.METAMORPHIC, HE.TROPICAL, HU.SOAKED, SO.ACIDIC, WA.INLAND
)) ))
biomes.add(Biome("quito", "minecraft:stony_peaks", biomes.add(Biome("quito", "minecraft:stony_peaks",
FL.BARREN, GE.IGNEOUS, HE.BOREAL, HU.DRY, SO.ROCKY, WA.INLAND FL.BARREN, GE.IGNEOUS, HE.BOREAL, HU.DRY, SO.ROCKY, WA.INLAND
)) ))
biomes.add(Biome("rangoon", "minecraft:bamboo_jungle", biomes.add(Biome("plymouth", "minecraft:stony_shore",
FL.FOREST, GE.SEDIMENTARY, HE.TROPICAL, HU.WET, SO.ACIDIC, WA.INLAND FL.BARREN, GE.METAMORPHIC, HE.TEMPERATE, HU.DAMP, SO.ROCKY, WA.COAST
)) ))
biomes.add(Biome("sanfrancisco", "minecraft:ocean", biomes.add(Biome("stlouis", "minecraft:sunflower_plains",
FL.BARREN, GE.SEDIMENTARY, HE.TEMPERATE, HU.WET, SO.SANDY, WA.OCEAN FL.FIELD, GE.SEDIMENTARY, HE.TEMPERATE, HU.DAMP, SO.SANDY, WA.INLAND
))
biomes.add(Biome("neworleans", "minecraft:swamp",
FL.CLEARING, GE.SEDIMENTARY, HE.TEMPERATE, HU.SOAKED, SO.PEATY, WA.SWAMP
))
biomes.add(Biome("irkutsk", "minecraft:taiga",
FL.FOREST, GE.IGNEOUS, HE.BOREAL, HU.DAMP, SO.ACIDIC, WA.INLAND
))
biomes.add(Biome("nassau", "minecraft:warm_ocean",
FL.BARREN, GE.SEDIMENTARY, HE.TROPICAL, HU.SOAKED, SO.SANDY, WA.COAST
))
biomes.add(Biome("stirling", "minecraft:windswept_forest",
FL.CLEARING, GE.SEDIMENTARY, HE.BOREAL, HU.DAMP, SO.ACIDIC, WA.INLAND
))
biomes.add(Biome("inverness", "minecraft:windswept_gravelly_hills",
FL.BARREN, GE.METAMORPHIC, HE.BOREAL, HU.DRY, SO.ROCKY, WA.INLAND
))
biomes.add(Biome("cornwall", "minecraft:windswept_hills",
FL.BARREN, GE.IGNEOUS, HE.BOREAL, HU.DRY, SO.ROCKY, WA.INLAND
))
biomes.add(Biome("moab", "minecraft:windswept_savanna",
FL.FIELD, GE.SEDIMENTARY, HE.SUBTROPICAL, HU.DRY, SO.ROCKY, WA.INLAND
)) ))
biomes.add(Biome("santafe", "minecraft:wooded_badlands", biomes.add(Biome("santafe", "minecraft:wooded_badlands",
FL.CLEARING, GE.SEDIMENTARY, HE.SUBTROPICAL, HU.DRY, SO.CLAYEY, WA.INLAND FL.CLEARING, GE.SEDIMENTARY, HE.SUBTROPICAL, HU.DRY, SO.CLAYEY, WA.INLAND
)) ))
biomes.add(Biome("singapore", "minecraft:jungle",
FL.CANOPY, GE.SEDIMENTARY, HE.TROPICAL, HU.WET, SO.ACIDIC, WA.INLAND
))
biomes.add(Biome("tombstone", "minecraft:badlands",
FL.BARREN, GE.SEDIMENTARY, HE.SUBTROPICAL, HU.DRY, SO.CLAYEY, WA.INLAND
))
biomes.add(Biome("stlouis", "minecraft:sunflower_plains",
FL.FIELD, GE.SEDIMENTARY, HE.TEMPERATE, HU.DAMP, SO.LOAMY, WA.INLAND
))
biomes.add(Biome("tromso", "minecraft:deep_frozen_ocean",
FL.BARREN, GE.SEDIMENTARY, HE.FROZEN, HU.WET, SO.SANDY, WA.OCEAN
))
biomes.add(Biome("umea", "minecraft:grove",
FL.CLEARING, GE.METAMORPHIC, HE.FROZEN, HU.DAMP, SO.ACIDIC, WA.INLAND
))
biomes.add(Biome("warsaw", "minecraft:birch_forest",
FL.FOREST, GE.SEDIMENTARY, HE.TEMPERATE, HU.DAMP, SO.ACIDIC, WA.INLAND
))
biomes.add(Biome("zurich", "minecraft:snowy_slopes",
FL.BARREN, GE.METAMORPHIC, HE.FROZEN, HU.DAMP, SO.ROCKY, WA.INLAND
))
@@ -1,8 +0,0 @@
from mcpacker.model.modpack import ModPack
from mcpacker.format.datapack import DataPack
# Functions ########################################################################################
def addDataPack(modPack:ModPack):
pass
@@ -1,7 +0,0 @@
import mcpacker.pack.mysteriousisland.adddatapack
# Tests ############################################################################################
def test_syntax():
pass
@@ -1,246 +0,0 @@
from mcpacker.model.ecology.biomefilter import BiomeFilter as BF
from mcpacker.model.geology.deposit.geodedeposit import GeodeDeposit
from mcpacker.model.geology.deposit.mineraldeposit import MineralDeposit
from mcpacker.model.geology.inclusion import Inclusion as I
from mcpacker.model.modpack import ModPack
import mcpacker.model.altitude as AL
import mcpacker.model.ecology.flora as FL
import mcpacker.model.ecology.geology as GE
import mcpacker.model.ecology.heat as HE
import mcpacker.model.ecology.humidity as HU
import mcpacker.model.ecology.soil as SO
import mcpacker.model.ecology.water as WA
import mcpacker.model.geology.bulk as BU
import mcpacker.model.geology.proportion as PR
import mcpacker.model.scarcity as SC
# Catalog ##########################################################################################
def addDeposits(pack:ModPack):
minerals = pack.world.minerals
deposits = pack.world.deposits
# Geode Deposits ###########################################################
deposits.add(GeodeDeposit(
name = "geode_amethyst",
altitude = AL.span(AL.MANTLE, AL.CRUST),
# TODO: these filter exclude all biomes
biomeFilters = BF([GE.IGNEOUS, HE.TEMPERATE, HU.DAMP]),
scarcity = SC.UNCOMMON,
))
deposits.add(GeodeDeposit(
name = "geode_kimberlite",
altitude = AL.span(AL.MANTLE, AL.CRUST),
biomeFilters = BF([GE.IGNEOUS, SO.ROCKY, WA.INLAND]),
scarcity = SC.SPARSE,
))
deposits.add(MineralDeposit(
name = "hydrothermal_emerald",
altitude = AL.span(AL.CRUST, AL.SUBSTRATE),
biomeFilters = BF([HE.FROZEN, GE.METAMORPHIC, SO.ROCKY]),
scarcity = SC.UNCOMMON,
))
# Metal Deposits ###########################################################
deposits.add(MineralDeposit(
name = "bif_iron",
altitude = AL.span(AL.CRUST, AL.SUBSTRATE),
biomeFilters = BF([FL.FIELD, HE.SUBTROPICAL, HU.DRY]),
bulk = BU.LARGE,
inclusions = [
I(minerals["iron"], 50),
I(minerals["quartz"], 45),
I(minerals["uranium"], 5)
],
proportion = PR.BED,
scarcity = SC.UNCOMMON,
))
deposits.add(MineralDeposit(
name = "epithermal_silver",
altitude = AL.span(AL.OVERBURDEN, AL.SUBSTRATE),
biomeFilters = BF([(HE.BOREAL, HE.FROZEN), SO.ROCKY, GE.IGNEOUS]),
bulk = BU.SMALL,
inclusions = [I(minerals["silver"], 75), I(minerals["gold"], 25)],
proportion = PR.PIPE,
scarcity = SC.RARE,
))
deposits.add(MineralDeposit(
name = "greisen_tin",
altitude = AL.span(AL.OVERBURDEN, AL.SUBSTRATE),
biomeFilters = BF([HE.BOREAL, SO.ROCKY, GE.METAMORPHIC]),
bulk = BU.MEDIUM,
inclusions = [I(minerals["tin"], 100)],
proportion = PR.STOCK,
scarcity = SC.COMMON,
))
deposits.add(MineralDeposit(
name = "laterite_aluminum",
altitude = AL.span(AL.DUNES, AL.UPLANDS),
biomeFilters = BF([FL.within(FL.CANOPY, FL.CLEARING), HU.WET, HE.TROPICAL, GE.SEDIMENTARY]),
bulk = BU.MEDIUM,
inclusions = [I(minerals["aluminum"], 70), I(minerals["nickel"], 30)],
proportion = PR.LENS,
scarcity = SC.UNCOMMON,
))
deposits.add(MineralDeposit(
name = "mvt_lead",
altitude = AL.span(AL.CRUST, AL.SUBSTRATE),
biomeFilters = [
BF([FL.FIELD, GE.SEDIMENTARY, HE.TEMPERATE, HU.DAMP]),
BF([GE.SEDIMENTARY, HE.TEMPERATE, SO.CLAYEY]),
],
bulk = BU.MEDIUM,
inclusions = [
I(minerals["lead"], 45),
I(minerals["zinc"], 40),
I(minerals["silver"], 15),
],
proportion = PR.LODE,
scarcity = SC.SPARSE,
))
deposits.add(MineralDeposit(
name = "porphyry_copper",
altitude = AL.span(AL.MANTLE, AL.OVERBURDEN),
biomeFilters = BF([GE.SEDIMENTARY, HE.SUBTROPICAL, HU.DRY, SO.CLAYEY]),
bulk = BU.LARGE,
inclusions = [
I(minerals["copper"], 55),
I(minerals["redstone"], 25),
I(minerals["gold"], 20),
],
proportion = PR.PIPE,
scarcity = SC.UNUSUAL,
))
deposits.add(MineralDeposit(
name = "sedimentary_iron",
altitude = AL.span(AL.OVERBURDEN, AL.SOIL),
biomeFilters = BF([SO.PEATY]),
bulk = BU.LARGE,
inclusions = [I(minerals["iron"], 100)],
proportion = PR.LODE,
scarcity = SC.COMMON,
))
deposits.add(MineralDeposit(
name = "serpentine_nickel",
altitude = AL.span(AL.UPLANDS, AL.HILLS),
biomeFilters = BF([GE.METAMORPHIC, HU.DAMP, SO.ACIDIC]),
bulk = BU.SMALL,
inclusions = [I(minerals["nickel"], 70), I(minerals["iron"], 30)],
proportion = PR.LENS,
scarcity = SC.UNCOMMON,
))
# Mineral Deposits #########################################################
deposits.add(MineralDeposit(
name = "evaporite_salt",
altitude = AL.EVAPORITES,
biomeFilters = BF([HE.TROPICAL, HU.DRY, SO.SANDY]),
bulk = BU.TINY,
inclusions = [I(minerals["salt"], 100)],
proportion = PR.BED,
scarcity = SC.SPARSE,
))
deposits.add(MineralDeposit(
name = "evaporite_nitrate",
altitude = AL.EVAPORITES,
biomeFilters = BF([FL.BARREN, HE.SUBTROPICAL, HU.DRY, SO.CLAYEY]),
bulk = BU.TINY,
inclusions = [I(minerals["nitrate"], 100)],
proportion = PR.BED,
scarcity = SC.SPARSE,
))
deposits.add(MineralDeposit(
name = "fumarole_sulfur",
altitude = AL.CRUST,
biomeFilters = BF([GE.IGNEOUS, SO.ROCKY, WA.INLAND]),
bulk = BU.MEDIUM,
inclusions = [I(minerals["sulfur"], 100)],
proportion = PR.VENT,
scarcity = SC.UNUSUAL,
))
deposits.add(MineralDeposit(
name = "sedimentary_redbed",
altitude = AL.span(AL.SOIL, AL.HILLS),
biomeFilters = BF([GE.SEDIMENTARY, HE.SUBTROPICAL, HU.DRY, SO.CLAYEY]),
bulk = BU.SMALL,
inclusions = [I(minerals["redstone"], 80), I(minerals["iron"], 20)],
proportion = PR.BED,
scarcity = SC.UNCOMMON,
))
deposits.add(MineralDeposit(
name = "skarn_lapis",
altitude = AL.CRUST,
biomeFilters = BF([GE.METAMORPHIC, HE.BOREAL, SO.ROCKY]),
bulk = BU.LARGE,
inclusions = [
I(minerals["greywacke"], 50),
I(minerals["lapis"], 25),
I(minerals["diorite"], 10),
I(minerals["quartz"], 10),
I(minerals["iron"], 5),
],
proportion = PR.LENS,
scarcity = SC.SPARSE,
))
deposits.add(MineralDeposit(
name = "vein_quartz",
altitude = AL.span(AL.SUBSTRATE, AL.OVERBURDEN),
biomeFilters = BF([HE.TROPICAL, HU.DRY, SO.SANDY]),
bulk = BU.MEDIUM,
inclusions = [I(minerals["quartz"], 95), I(minerals["gold"], 5)],
proportion = PR.LODE,
scarcity = SC.UNUSUAL,
))
# Organic Deposits #########################################################
deposits.add(MineralDeposit(
name = "bed_loam",
altitude = AL.span(AL.SOIL),
biomeFilters = BF([HE.TEMPERATE, HU.DAMP, SO.LOAMY]),
bulk = BU.TINY,
inclusions = [I(minerals["loam"], 100)],
proportion = PR.BED,
scarcity = SC.COMMON,
))
deposits.add(MineralDeposit(
name = "seam_bituminouscoal",
altitude = AL.span(AL.CRUST, AL.OVERBURDEN),
biomeFilters = [
BF([HE.BOREAL, GE.METAMORPHIC, (SO.ACIDIC, SO.ROCKY)]),
],
bulk = BU.HUGE,
inclusions = [I(minerals["coal"], 100)],
proportion = PR.BED,
scarcity = SC.COMMON,
))
deposits.add(MineralDeposit(
name = "seam_peatcoal",
altitude = AL.span(AL.SOIL),
biomeFilters = BF([SO.PEATY]),
bulk = BU.LARGE,
inclusions = [I(minerals["peat"], 100)],
proportion = PR.BED,
scarcity = SC.COMMON,
))
@@ -1,7 +0,0 @@
import mcpacker.pack.mysteriousisland.adddeposits
# Class ############################################################################################
def test_syntax():
pass
@@ -10,6 +10,7 @@ def addDisabledFeatures(pack:ModPack):
pack.disabledFeatures.append(ResourceId.parse(resourceText)) pack.disabledFeatures.append(ResourceId.parse(resourceText))
# Disable vanilla ore generation # Disable vanilla ore generation
add("minecraft:amethyst_geode")
add("minecraft:ore_coal_lower") add("minecraft:ore_coal_lower")
add("minecraft:ore_coal_upper") add("minecraft:ore_coal_upper")
add("minecraft:ore_copper_large") add("minecraft:ore_copper_large")
+29 -28
View File
@@ -1,5 +1,4 @@
from mcpacker.model.geology.mineral import Mineral from mcpacker.model.geology.mineral import Mineral
from mcpacker.model.geology.mineralcatalog import MineralCatalog
from mcpacker.model.geology.replacement import Replacement from mcpacker.model.geology.replacement import Replacement
from mcpacker.model.modpack import ModPack from mcpacker.model.modpack import ModPack
@@ -21,6 +20,12 @@ def makeMineral(name:str, blockId:str, deepslateBlockId:None|str=None) -> Minera
Replacement.inDeepslate(blockId) Replacement.inDeepslate(blockId)
]) ])
def makeEvaporate(name:str, blockId:str) -> Mineral:
return Mineral(name, [
Replacement("minecraft:sand", blockId),
Replacement("minecraft:sandstone", blockId)
])
def makeOreMineral(name:str) -> Mineral: def makeOreMineral(name:str) -> Mineral:
return Mineral(name, [ return Mineral(name, [
Replacement.inStone(f"{name}_ore"), Replacement.inStone(f"{name}_ore"),
@@ -45,30 +50,43 @@ def makeRailcraftOreMineral(name:str) -> Mineral:
def addMinerals(pack:ModPack): def addMinerals(pack:ModPack):
minerals = pack.world.minerals minerals = pack.world.minerals
# Basic Ores # Metals
minerals.add(makeOreMineral("coal")) minerals.add(makeImmersiveEngineeringOreMineral("aluminum"))
minerals.add(makeImmersiveEngineeringOreMineral("lead"))
minerals.add(makeImmersiveEngineeringOreMineral("nickel"))
minerals.add(makeImmersiveEngineeringOreMineral("silver"))
minerals.add(makeImmersiveEngineeringOreMineral("uranium"))
minerals.add(makeOreMineral("copper")) minerals.add(makeOreMineral("copper"))
minerals.add(makeOreMineral("diamond"))
minerals.add(makeOreMineral("emerald"))
minerals.add(makeOreMineral("gold")) minerals.add(makeOreMineral("gold"))
minerals.add(makeOreMineral("iron")) minerals.add(makeOreMineral("iron"))
minerals.add(makeOreMineral("lapis")) minerals.add(makeRailcraftOreMineral("tin"))
minerals.add(makeOreMineral("redstone")) minerals.add(makeRailcraftOreMineral("zinc"))
# Crystals # Organic Minerals
minerals.add(makeOreMineral("coal"))
minerals.add(makeMineral("peat", "kubejs:peat_block"))
minerals.add(makeMineral("loam", "farmersdelight:rich_soil"))
# Industrial Minerals
minerals.add(makeEvaporate("salt", "butcher:saltblock"))
minerals.add(makeRailcraftOreMineral("sulfur"))
minerals.add(makeEvaporate("nitrate", f"{RC}:saltpeter_ore"))
# Crystaline Minerals
minerals.add(makeMineral("amethyst", "amethyst_block")) minerals.add(makeMineral("amethyst", "amethyst_block"))
minerals.add(makeMineral("glowstone", "glowstone")) minerals.add(makeMineral("glowstone", "glowstone"))
minerals.add(makeMineral("quartz", f"{OQ}:quartz_ore", f"{OQ}:deepslate_quartz_ore")) minerals.add(makeMineral("quartz", f"{OQ}:quartz_ore", f"{OQ}:deepslate_quartz_ore"))
minerals.add(makeMineral("salt", "butcher:saltblock")) minerals.add(makeOreMineral("diamond"))
minerals.add(makeOreMineral("emerald"))
minerals.add(makeOreMineral("lapis"))
minerals.add(makeOreMineral("redstone"))
# Earth, gravel, etc. # Earth, gravel, etc.
minerals.add(makeMineral("clay", "clay")) minerals.add(makeMineral("clay", "clay"))
minerals.add(makeMineral("coarsedirt", "coarse_dirt")) minerals.add(makeMineral("coarsedirt", "coarse_dirt"))
minerals.add(makeMineral("dirt", "dirt")) minerals.add(makeMineral("dirt", "dirt"))
minerals.add(makeMineral("gravel", "gravel")) minerals.add(makeMineral("gravel", "gravel"))
minerals.add(makeMineral("loam", "farmersdelight:rich_soil"))
minerals.add(makeMineral("packedice", "packed_ice")) minerals.add(makeMineral("packedice", "packed_ice"))
minerals.add(makeMineral("peat", "kubejs:peat_block"))
minerals.add(makeMineral("redsand", "redsand")) minerals.add(makeMineral("redsand", "redsand"))
minerals.add(makeMineral("sand", "sand")) minerals.add(makeMineral("sand", "sand"))
minerals.add(makeMineral("soulsand", "soulsand")) minerals.add(makeMineral("soulsand", "soulsand"))
@@ -88,24 +106,7 @@ def addMinerals(pack:ModPack):
minerals.add(makeMineral("limestone", "dripstone_block")) minerals.add(makeMineral("limestone", "dripstone_block"))
minerals.add(makeMineral("magma", "magma_block")) minerals.add(makeMineral("magma", "magma_block"))
minerals.add(makeMineral("marble", f"{RC}:quarried_stone")) minerals.add(makeMineral("marble", f"{RC}:quarried_stone"))
minerals.add(makeMineral("netherite", "ancient_debris"))
minerals.add(makeMineral("obsidian", "obsidian")) minerals.add(makeMineral("obsidian", "obsidian"))
minerals.add(makeMineral("pumice", "netherrack")) minerals.add(makeMineral("pumice", "netherrack"))
minerals.add(makeMineral("sandstone", "sandstone")) minerals.add(makeMineral("sandstone", "sandstone"))
minerals.add(makeMineral("tuff", "tuff")) minerals.add(makeMineral("tuff", "tuff"))
# Immersive Engineering Ores
minerals.add(makeImmersiveEngineeringOreMineral("aluminum"))
minerals.add(makeImmersiveEngineeringOreMineral("lead"))
minerals.add(makeImmersiveEngineeringOreMineral("nickel"))
minerals.add(makeImmersiveEngineeringOreMineral("silver"))
minerals.add(makeImmersiveEngineeringOreMineral("uranium"))
# Railcraft Ores
minerals.add(Mineral("nitrate", [
Replacement("sand", f"{RC}:saltpeter_ore"),
Replacement("sandstone", f"{RC}:saltpeter_ore"),
]))
minerals.add(makeRailcraftOreMineral("sulfur"))
minerals.add(makeRailcraftOreMineral("tin"))
minerals.add(makeRailcraftOreMineral("zinc"))
@@ -0,0 +1,251 @@
from mcpacker.model.ecology.biomefilter import BiomeFilter as BF
from mcpacker.model.geology.mineralspawnbuilder import MineralSpawnBuilder
from mcpacker.model.modpack import ModPack
import mcpacker.model.altitude as AL
import mcpacker.model.ecology.flora as FL
import mcpacker.model.ecology.geology as GE
import mcpacker.model.ecology.heat as HE
import mcpacker.model.ecology.humidity as HU
import mcpacker.model.ecology.soil as SO
import mcpacker.model.ecology.water as WA
import mcpacker.model.geology.bulk as BU
import mcpacker.model.geology.deposittype as DE
import mcpacker.model.scarcity as SC
# Helper Functions #################################################################################
def addMineralSpawns(pack:ModPack):
minerals = pack.world.minerals
b = MineralSpawnBuilder(pack.world.mineralSpawns)
# Aluminum Family ##########################################################
b.start(minerals["basalt"])
b.biomeFilters = BF([HE.TROPICAL, HU.SOAKED, WA.INLAND])
b.save("aluminum-indicator")
b.switch(minerals["aluminum"])
b.altitude = AL.span(AL.SUBSTRATE, AL.OVERBURDEN)
b.bulk = BU.HUGE
b.depositType = DE.STRATA
b.scarcity = SC.COMMON
b.save("aluminum-primary-aluminum")
b.switch(minerals["nickel"])
b.altitude = AL.span(AL.OVERBURDEN, AL.CRUST)
b.bulk = BU.SMALL
b.scarcity = SC.UNCOMMON
b.save("aluminum-secondary-nickel")
b.switch(minerals["amethyst"])
b.altitude = AL.CRUST
b.bulk = BU.TINY
b.scarcity = SC.RARE
b.save("aluminum-tertiary-amethyst")
# Coal Family ##############################################################
b.start(minerals["tuff"])
b.biomeFilters = BF([GE.SEDIMENTARY, HE.TEMPERATE, HU.SOAKED])
b.save("coal-indicator")
b.switch(minerals["coal"])
b.altitude = AL.span(AL.SUBSTRATE, AL.OVERBURDEN)
b.bulk = BU.LARGE
b.depositType = DE.STRATA
b.scarcity = SC.COMMON
b.save("coal-primary-coal")
b.switch(minerals["sulfur"])
b.altitude = AL.CRUST
b.bulk = BU.SMALL
b.scarcity = SC.SPARSE
b.save("coal-secondary-sulfur")
b.switch(minerals["iron"])
b.altitude = AL.span(AL.CRUST, AL.MANTLE)
b.bulk = BU.SMALL
b.scarcity = SC.UNUSUAL
b.save("coal-tertiary-iron")
# Copper Family ############################################################
b.start(minerals["diorite"])
b.biomeFilters = BF([GE.SEDIMENTARY, HE.SUBTROPICAL, HU.DRY])
b.save("copper-indicator")
b.switch(minerals["copper"])
b.altitude = AL.CRUST
b.bulk = BU.MEDIUM
b.scarcity = SC.UNCOMMON
b.save("copper-primary-copper")
b.switch(minerals["redstone"])
b.altitude = AL.MANTLE
b.bulk = BU.SMALL
b.scarcity = SC.UNUSUAL
b.save("copper-secondary-redstone")
b.switch(minerals["gold"])
b.altitude = AL.span(AL.CRUST, AL.MANTLE)
b.bulk = BU.TINY
b.scarcity = SC.RARE
b.save("copper-tertiary-gold")
# Gold Family ##############################################################
b.start(minerals["marble"])
b.biomeFilters = BF([GE.METAMORPHIC, HE.BOREAL, HU.DRY])
b.save("gold-indicator")
b.start(minerals["quartz"])
b.altitude = AL.span(AL.CRAGS, AL.PEAKS)
b.bulk = BU.MEDIUM
b.scarcity = SC.SPARSE
b.save("gold-primary-quartz")
b.switch(minerals["lapis"])
b.altitude = AL.span(AL.CRUST, AL.MANTLE)
b.bulk = BU.SMALL
b.scarcity = SC.UNUSUAL
b.save("gold-secondary-lapis")
b.switch(minerals["gold"])
b.altitude = AL.CRUST
b.bulk = BU.TINY
b.scarcity = SC.RARE
b.save("gold-tertiary-gold")
b.switch(minerals["emerald"])
b.altitude = AL.MANTLE
b.bulk = BU.TINY
b.scarcity = SC.RARE
b.save("gold-quarternary-emerald")
# Iron Family ##############################################################
b.start(minerals["andesite"])
b.biomeFilters = BF([GE.SEDIMENTARY, HE.TEMPERATE, HU.WET])
b.save("iron-indicator")
b.start(minerals["iron"])
b.altitude = AL.CRUST
b.bulk = BU.MEDIUM
b.scarcity = SC.COMMON
b.save("iron-primary-iron")
b.switch(minerals["quartz"])
b.altitude = AL.CRUST
b.bulk = BU.SMALL
b.scarcity = SC.UNUSUAL
b.save("iron-secondary-quartz")
b.switch(minerals["uranium"])
b.altitude = AL.MANTLE
b.bulk = BU.TINY
b.scarcity = SC.RARE
b.save("iron-tertiary-uranium")
# Lead Family ##############################################################
b.start(minerals["dolostone"])
b.biomeFilters = BF([GE.SEDIMENTARY, HE.TEMPERATE, HU.DAMP])
b.save("lead-indicator")
b.start(minerals["lead"])
b.altitude = AL.CRUST
b.bulk = BU.MEDIUM
b.scarcity = SC.SPARSE
b.save("lead-primary-lead")
b.switch(minerals["zinc"])
b.altitude = AL.CRUST
b.bulk = BU.SMALL
b.scarcity = SC.SPARSE
b.save("lead-secondary-zinc")
b.switch(minerals["silver"])
b.altitude = AL.span(AL.CRUST, AL.MANTLE)
b.bulk = BU.SMALL
b.scarcity = SC.UNUSUAL
b.save("lead-tertiary-silver")
# Plutonic Family ##########################################################
b.start(minerals["sulfur"])
b.altitude = AL.PLUTONIC
b.save("plutonic-special-sulfur")
b.switch(minerals["glowstone"])
b.save("plutonic-special-glowstone")
b.switch(minerals["diamond"])
b.save("plutonic-special-diamond")
# Salt Family ##############################################################
b.start(minerals["chalk"])
b.biomeFilters = BF([GE.SEDIMENTARY, HE.TROPICAL, HU.ARID])
b.save("salt-indicator")
b.switch(minerals["salt"])
b.altitude = AL.span(AL.CRUST, AL.MANTLE)
b.bulk = BU.LARGE
b.depositType = DE.STRATA
b.scarcity = SC.UNCOMMON
b.save("salt-primary-salt")
b.switch(minerals["nitrate"])
b.altitude = AL.EVAPORITES
b.bulk = BU.SMALL
b.depositType = DE.DISK
b.scarcity = SC.UNCOMMON
b.save("salt-secondary-nitrate")
# Soil Family ##############################################################
b.start(minerals["loam"])
b.altitude = AL.SOIL
b.bulk = BU.HUGE
b.biomeFilters = BF([SO.LOAMY])
b.scarcity = SC.CARPET
b.save("soil-special-loam")
b.start(minerals["peat"])
b.altitude = AL.SOIL
b.bulk = BU.LARGE
b.biomeFilters = BF([SO.PEATY])
b.scarcity = SC.COMMON
b.save("soil-special-peat")
# Tin Family ###############################################################
b.start(minerals["granite"])
b.biomeFilters = BF([GE.IGNEOUS, HE.BOREAL, HU.DRY])
b.save("tin-indicator")
b.switch(minerals["tin"])
b.altitude = AL.CRUST
b.bulk = BU.MEDIUM
b.scarcity = SC.SPARSE
b.save("tin-primary-tin")
b.switch(minerals["copper"])
b.altitude = AL.span(AL.CRUST, AL.MANTLE)
b.bulk = BU.SMALL
b.scarcity = SC.UNUSUAL
b.save("tin-secondary-copper")
"""
vein strata
absent 0 0
rare 0.024 0.5
unusual 0.12 2.0
sparse 0.3 5.0
uncommon 0.61 10.0
common 1.83 25.0
carpet 3.66 60.0
"""
@@ -27,25 +27,25 @@ def addPlantSpawns(pack:ModPack):
b.altitude = AL.span(AL.LOWLANDS, AL.HILLS) b.altitude = AL.span(AL.LOWLANDS, AL.HILLS)
b.biomeFilters = BF([FL.CANOPY, HE.TEMPERATE]) b.biomeFilters = BF([FL.CANOPY, HE.TEMPERATE])
b.scarcity = SC.SPARSE b.scarcity = SC.SPARSE
b.save("") b.save("athelas")
b.start(plants["beetroot"]) b.start(plants["beetroot"])
b.altitude = AL.LOWLANDS b.altitude = AL.LOWLANDS
b.biomeFilters = BF([FL.FOREST, HE.BOREAL, SO.ACIDIC]) b.biomeFilters = BF([FL.FOREST, HE.BOREAL, SO.ACIDIC])
b.scarcity = SC.COMMON b.scarcity = SC.COMMON
b.save("") b.save("beetroot")
b.start(plants["bellpepper"]) b.start(plants["bellpepper"])
b.altitude = AL.LOWLANDS b.altitude = AL.LOWLANDS
b.biomeFilters = BF([FL.CLEARING, HE.TROPICAL, HU.WET, WA.INLAND]) b.biomeFilters = BF([FL.CLEARING, HE.TROPICAL, HU.WET, WA.INLAND])
b.scarcity = SC.COMMON b.scarcity = SC.COMMON
b.save("") b.save("bellpepper")
b.start(plants["blueberry"]) b.start(plants["blueberry"])
b.altitude = AL.span(AL.UPLANDS, AL.ALPINE) b.altitude = AL.span(AL.UPLANDS, AL.ALPINE)
b.biomeFilters = BF([FL.within(FL.FOREST, FL.FIELD), HE.BOREAL]) b.biomeFilters = BF([FL.within(FL.FOREST, FL.FIELD), HE.BOREAL])
b.scarcity = SC.SPARSE b.scarcity = SC.SPARSE
b.save("") b.save("blueberry")
b.start(plants["brownmushroom"]) b.start(plants["brownmushroom"])
b.altitude = AL.span(AL.SOIL, AL.ALPINE) b.altitude = AL.span(AL.SOIL, AL.ALPINE)
@@ -55,13 +55,13 @@ def addPlantSpawns(pack:ModPack):
BF([SO.FUNGAL]), BF([SO.FUNGAL]),
] ]
b.scarcity = SC.COMMON b.scarcity = SC.COMMON
b.save("") b.save("brownmushroom")
b.start(plants["cabbage"]) b.start(plants["cabbage"])
b.altitude = AL.HILLS b.altitude = AL.HILLS
b.biomeFilters = BF([(HE.SUBTROPICAL, HE.TEMPERATE), SO.SANDY, WA.COAST]) b.biomeFilters = BF([(HE.SUBTROPICAL, HE.TEMPERATE), SO.SANDY, WA.COAST])
b.scarcity = SC.COMMON b.scarcity = SC.COMMON
b.save("") b.save("cabbage")
b.start(plants["carrot"]) b.start(plants["carrot"])
b.altitude = AL.LOWLANDS b.altitude = AL.LOWLANDS
@@ -69,37 +69,37 @@ def addPlantSpawns(pack:ModPack):
[(FL.FOREST, FL.CLEARING), HE.TEMPERATE, SO.LOAMY], [ResourceId.parse("flower_forest")], [(FL.FOREST, FL.CLEARING), HE.TEMPERATE, SO.LOAMY], [ResourceId.parse("flower_forest")],
) )
b.scarcity = SC.COMMON b.scarcity = SC.COMMON
b.save("") b.save("carrot")
b.start(plants["coffee"]) b.start(plants["coffee"])
b.altitude = AL.span(AL.HILLS, AL.ALPINE) b.altitude = AL.span(AL.HILLS, AL.ALPINE)
b.biomeFilters = BF([FL.CANOPY, HE.TROPICAL, HU.WET]) b.biomeFilters = BF([FL.CANOPY, HE.TROPICAL, HU.WET])
b.scarcity = SC.SPARSE b.scarcity = SC.SPARSE
b.save("") b.save("coffee")
b.start(plants["corn"]) b.start(plants["corn"])
b.altitude = AL.span(AL.LOWLANDS, AL.UPLANDS) b.altitude = AL.span(AL.LOWLANDS, AL.UPLANDS)
b.biomeFilters = BF([FL.FIELD, HE.SUBTROPICAL, (SO.LOAMY, SO.SANDY)]) b.biomeFilters = BF([FL.FIELD, HE.SUBTROPICAL, (SO.LOAMY, SO.SANDY)])
b.scarcity = SC.COMMON b.scarcity = SC.COMMON
b.save("") b.save("corn")
b.start(plants["cotton"]) b.start(plants["cotton"])
b.altitude = AL.LOWLANDS b.altitude = AL.LOWLANDS
b.biomeFilters = BF([FL.FIELD, HE.SUBTROPICAL, HU.DRY, (SO.LOAMY, SO.SANDY)]) b.biomeFilters = BF([FL.FIELD, HE.SUBTROPICAL, HU.DRY, (SO.LOAMY, SO.SANDY)])
b.scarcity = SC.UNCOMMON b.scarcity = SC.UNCOMMON
b.save("") b.save("cotton")
b.start(plants["currant"]) b.start(plants["currant"])
b.altitude = AL.span(AL.UPLANDS, AL.ALPINE) b.altitude = AL.span(AL.UPLANDS, AL.ALPINE)
b.biomeFilters = BF([FL.within(FL.FOREST, FL.FIELD), (HE.BOREAL, HE.FROZEN)]) b.biomeFilters = BF([FL.within(FL.FOREST, FL.FIELD), (HE.BOREAL, HE.FROZEN)])
b.scarcity = SC.UNCOMMON b.scarcity = SC.UNCOMMON
b.save("") b.save("currant")
b.start(plants["cranberry"]) b.start(plants["cranberry"])
b.altitude = AL.DUNES b.altitude = AL.DUNES
b.biomeFilters = BF([HU.WET, SO.PEATY]) b.biomeFilters = BF([HU.WET, SO.PEATY])
b.scarcity = SC.UNCOMMON b.scarcity = SC.UNCOMMON
b.save("") b.save("cranberry")
# NOTE: Due to a bug in Supplementaries, flax can *only* be planted on sand, despite the actual # NOTE: Due to a bug in Supplementaries, flax can *only* be planted on sand, despite the actual
# plant requiring an entirely different soil. Therefore, we're imaginging *this* so-called # plant requiring an entirely different soil. Therefore, we're imaginging *this* so-called
@@ -108,13 +108,13 @@ def addPlantSpawns(pack:ModPack):
b.altitude = AL.DUNES b.altitude = AL.DUNES
b.biomeFilters = BF([FL.BARREN, HU.DRY, SO.SANDY]) b.biomeFilters = BF([FL.BARREN, HU.DRY, SO.SANDY])
b.scarcity = SC.COMMON b.scarcity = SC.COMMON
b.save("") b.save("flax")
b.start(plants["hamimelon"]) b.start(plants["hamimelon"])
b.altitude = AL.span(AL.LOWLANDS, AL.UPLANDS) b.altitude = AL.span(AL.LOWLANDS, AL.UPLANDS)
b.biomeFilters = BF([FL.FIELD, HE.SUBTROPICAL, HU.DRY, (SO.LOAMY, SO.SANDY)]) b.biomeFilters = BF([FL.FIELD, HE.SUBTROPICAL, HU.DRY, (SO.LOAMY, SO.SANDY)])
b.scarcity = SC.RARE b.scarcity = SC.RARE
b.save("") b.save("hamimelon")
b.start(plants["hemp"]) b.start(plants["hemp"])
b.altitude = AL.span(AL.DUNES, AL.UPLANDS) b.altitude = AL.span(AL.DUNES, AL.UPLANDS)
@@ -122,25 +122,25 @@ def addPlantSpawns(pack:ModPack):
[FL.FIELD, HE.TEMPERATE, HU.DAMP, SO.LOAMY], [ResourceId.parse("sunflower_plains")] [FL.FIELD, HE.TEMPERATE, HU.DAMP, SO.LOAMY], [ResourceId.parse("sunflower_plains")]
), ),
b.scarcity = SC.UNCOMMON b.scarcity = SC.UNCOMMON
b.save("") b.save("hemp")
b.start(plants["lemon"]) b.start(plants["lemon"])
b.altitude = AL.UPLANDS b.altitude = AL.UPLANDS
b.biomeFilters = BF([FL.FIELD, HE.SUBTROPICAL, HU.DRY]) b.biomeFilters = BF([FL.FIELD, HE.SUBTROPICAL, HU.DRY])
b.scarcity = SC.SPARSE b.scarcity = SC.SPARSE
b.save("") b.save("lemon")
b.start(plants["melon"]) b.start(plants["melon"])
b.altitude = AL.LOWLANDS b.altitude = AL.LOWLANDS
b.biomeFilters = BF([FL.CLEARING, HE.TROPICAL, HU.WET], [SO.FUNGAL]) b.biomeFilters = BF([FL.CLEARING, HE.TROPICAL, HU.WET], [SO.FUNGAL])
b.scarcity = SC.SPARSE b.scarcity = SC.SPARSE
b.save("") b.save("melon")
b.start(plants["onion"]) b.start(plants["onion"])
b.altitude = AL.span(AL.UPLANDS, AL.HILLS) b.altitude = AL.span(AL.UPLANDS, AL.HILLS)
b.biomeFilters = BF([FL.FOREST, HE.TEMPERATE, HU.DAMP, SO.ACIDIC]) b.biomeFilters = BF([FL.FOREST, HE.TEMPERATE, HU.DAMP, SO.ACIDIC])
b.scarcity = SC.SPARSE b.scarcity = SC.SPARSE
b.save("") b.save("onion")
# NOTE: Due to a bug in Fruits Delight, pineapple can *only* be planted on sand: despite this # NOTE: Due to a bug in Fruits Delight, pineapple can *only* be planted on sand: despite this
# in now way reflecting the plant's actual ecology. As such, we have to imagine these as # in now way reflecting the plant's actual ecology. As such, we have to imagine these as
@@ -150,19 +150,19 @@ def addPlantSpawns(pack:ModPack):
b.biomeFilters = BF([FL.BARREN, HE.TROPICAL, HU.DRY, SO.SANDY]) b.biomeFilters = BF([FL.BARREN, HE.TROPICAL, HU.DRY, SO.SANDY])
b.scarcity = SC.SPARSE b.scarcity = SC.SPARSE
# TODO: add sand as substrate in addplants.py # TODO: add sand as substrate in addplants.py
b.save("") b.save("pineapple")
b.start(plants["potato"]) b.start(plants["potato"])
b.altitude = AL.span(AL.UPLANDS, AL.HILLS) b.altitude = AL.span(AL.UPLANDS, AL.HILLS)
b.biomeFilters = BF([FL.FOREST, HE.BOREAL, HU.DAMP, SO.ACIDIC]) b.biomeFilters = BF([FL.FOREST, HE.BOREAL, HU.DAMP, SO.ACIDIC])
b.scarcity = SC.UNCOMMON b.scarcity = SC.UNCOMMON
b.save("") b.save("potato")
b.start(plants["pumpkin"]) b.start(plants["pumpkin"])
b.altitude = AL.LOWLANDS b.altitude = AL.LOWLANDS
b.biomeFilters = BF([FL.FIELD, HE.TEMPERATE, SO.LOAMY]) b.biomeFilters = BF([FL.FIELD, HE.TEMPERATE, SO.LOAMY])
b.scarcity = SC.UNUSUAL b.scarcity = SC.UNUSUAL
b.save("") b.save("pumpkin")
b.start(plants["redmushroom"]) b.start(plants["redmushroom"])
b.altitude = AL.span(AL.SOIL, AL.ALPINE) b.altitude = AL.span(AL.SOIL, AL.ALPINE)
@@ -172,37 +172,37 @@ def addPlantSpawns(pack:ModPack):
BF([SO.FUNGAL]), BF([SO.FUNGAL]),
] ]
b.scarcity = SC.UNCOMMON b.scarcity = SC.UNCOMMON
b.save("") b.save("redmushroom")
b.start(plants["rice"]) b.start(plants["rice"])
b.altitude = AL.SURFACE b.altitude = AL.SURFACE
b.biomeFilters = BF([(HE.SUBTROPICAL, HE.TEMPERATE), (WA.RIVER, WA.SWAMP)]) b.biomeFilters = BF([(HE.SUBTROPICAL, HE.TEMPERATE), (WA.RIVER, WA.SWAMP)])
b.scarcity = SC.COMMON b.scarcity = SC.COMMON
b.save("") b.save("rice")
b.start(plants["sugarcane"]) b.start(plants["sugarcane"])
b.altitude = AL.DUNES b.altitude = AL.DUNES
b.biomeFilters = BF([(HE.TROPICAL, HE.TEMPERATE), (WA.RIVER, WA.SWAMP)]) b.biomeFilters = BF([(HE.TROPICAL, HE.TEMPERATE), (WA.RIVER, WA.SWAMP)])
b.scarcity = SC.COMMON b.scarcity = SC.COMMON
b.save("") b.save("sugarcane")
b.start(plants["sunflower"]) b.start(plants["sunflower"])
b.altitude = AL.span(AL.LOWLANDS, AL.UPLANDS) b.altitude = AL.span(AL.LOWLANDS, AL.UPLANDS)
b.biomeFilters = BF([ResourceId.parse("sunflower_plains")]) b.biomeFilters = BF([ResourceId.parse("sunflower_plains")])
b.scarcity = SC.CARPET b.scarcity = SC.CARPET
b.save("") b.save("sunflower")
b.start(plants["tomato"]) b.start(plants["tomato"])
b.altitude = AL.span(AL.UPLANDS, AL.HILLS) b.altitude = AL.span(AL.UPLANDS, AL.HILLS)
b.biomeFilters = BF([FL.CLEARING, HE.TROPICAL, HU.WET], [SO.FUNGAL]) b.biomeFilters = BF([FL.CLEARING, HE.TROPICAL, HU.WET], [SO.FUNGAL])
b.scarcity = SC.UNCOMMON b.scarcity = SC.UNCOMMON
b.save("") b.save("tomato")
b.start(plants["wheat"]) b.start(plants["wheat"])
b.altitude = AL.span(AL.LOWLANDS, AL.UPLANDS) b.altitude = AL.span(AL.LOWLANDS, AL.UPLANDS)
b.biomeFilters = BF([FL.FIELD, HE.TEMPERATE, HU.DAMP, SO.LOAMY]) b.biomeFilters = BF([FL.FIELD, HE.TEMPERATE, HU.DAMP, SO.LOAMY])
b.scarcity = SC.COMMON b.scarcity = SC.COMMON
b.save("") b.save("wheat")
# Flower Patches ########################################################### # Flower Patches ###########################################################
@@ -210,31 +210,31 @@ def addPlantSpawns(pack:ModPack):
b.altitude = AL.span(AL.UPLANDS, AL.HILLS) b.altitude = AL.span(AL.UPLANDS, AL.HILLS)
b.biomeFilters = BF([FL.FOREST, HE.TEMPERATE, HU.DAMP, SO.ACIDIC]) b.biomeFilters = BF([FL.FOREST, HE.TEMPERATE, HU.DAMP, SO.ACIDIC])
b.scarcity = SC.UNCOMMON b.scarcity = SC.UNCOMMON
b.save("") b.save("allium")
b.start(plants["azurebluet"]) b.start(plants["azurebluet"])
b.altitude = AL.span(AL.UPLANDS, AL.ALPINE) b.altitude = AL.span(AL.UPLANDS, AL.ALPINE)
b.biomeFilters = BF([FL.FIELD, (HE.TEMPERATE, HE.BOREAL), HU.DAMP, (SO.LOAMY, SO.PEATY)]) b.biomeFilters = BF([FL.FIELD, (HE.TEMPERATE, HE.BOREAL), HU.DAMP, (SO.LOAMY, SO.PEATY)])
b.scarcity = SC.SPARSE b.scarcity = SC.SPARSE
b.save("") b.save("azurebluet")
b.start(plants["blueorchid"]) b.start(plants["blueorchid"])
b.altitude = AL.span(AL.LOWLANDS, AL.UPLANDS) b.altitude = AL.span(AL.LOWLANDS, AL.UPLANDS)
b.biomeFilters = BF([FL.CANOPY, HE.TROPICAL, HU.WET]) b.biomeFilters = BF([FL.CANOPY, HE.TROPICAL, HU.WET])
b.scarcity = SC.RARE b.scarcity = SC.RARE
b.save("") b.save("blueorchid")
b.start(plants["cornflower"]) b.start(plants["cornflower"])
b.altitude = AL.span(AL.UPLANDS, AL.ALPINE) b.altitude = AL.span(AL.UPLANDS, AL.ALPINE)
b.biomeFilters = BF([FL.FIELD, HE.TEMPERATE, (SO.LOAMY, SO.PEATY)]) b.biomeFilters = BF([FL.FIELD, HE.TEMPERATE, (SO.LOAMY, SO.PEATY)])
b.scarcity = SC.COMMON b.scarcity = SC.COMMON
b.save("") b.save("cornflower")
b.start(plants["daisy"]) b.start(plants["daisy"])
b.altitude = AL.span(AL.UPLANDS, AL.ALPINE) b.altitude = AL.span(AL.UPLANDS, AL.ALPINE)
b.biomeFilters = BF([FL.FIELD, (HE.TEMPERATE, HE.BOREAL)]) b.biomeFilters = BF([FL.FIELD, (HE.TEMPERATE, HE.BOREAL)])
b.scarcity = SC.UNCOMMON b.scarcity = SC.UNCOMMON
b.save("") b.save("daisy")
b.start(plants["dandelion"]) b.start(plants["dandelion"])
b.altitude = AL.span(AL.DUNES, AL.HILLS) b.altitude = AL.span(AL.DUNES, AL.HILLS)
@@ -243,25 +243,25 @@ def addPlantSpawns(pack:ModPack):
[HE.FROZEN, HU.WET, SO.FUNGAL, SO.ROCKY, ResourceId.parse("flower_forest")] [HE.FROZEN, HU.WET, SO.FUNGAL, SO.ROCKY, ResourceId.parse("flower_forest")]
) )
b.scarcity = SC.COMMON b.scarcity = SC.COMMON
b.save("") b.save("dandelion")
b.start(plants["lilac"]) b.start(plants["lilac"])
b.altitude = AL.LOWLANDS b.altitude = AL.LOWLANDS
b.biomeFilters = BF([FL.FOREST, HE.TEMPERATE, HU.DAMP, SO.LOAMY]) b.biomeFilters = BF([FL.FOREST, HE.TEMPERATE, HU.DAMP, SO.LOAMY])
b.scarcity = SC.UNUSUAL b.scarcity = SC.UNUSUAL
b.save("") b.save("lilac")
b.start(plants["lily"]) b.start(plants["lily"])
b.altitude = AL.span(AL.LOWLANDS, AL.UPLANDS) b.altitude = AL.span(AL.LOWLANDS, AL.UPLANDS)
b.biomeFilters = BF([FL.FOREST, (HE.TEMPERATE, HE.BOREAL), HU.DAMP, SO.ACIDIC]) b.biomeFilters = BF([FL.FOREST, (HE.TEMPERATE, HE.BOREAL), HU.DAMP, SO.ACIDIC])
b.scarcity = SC.RARE b.scarcity = SC.RARE
b.save("") b.save("lily")
b.start(plants["peony"]) b.start(plants["peony"])
b.altitude = AL.LOWLANDS b.altitude = AL.LOWLANDS
b.biomeFilters = BF([FL.CLEARING, HE.TEMPERATE, HU.DAMP, SO.ROCKY]) b.biomeFilters = BF([FL.CLEARING, HE.TEMPERATE, HU.DAMP, SO.ROCKY])
b.scarcity = SC.SPARSE b.scarcity = SC.SPARSE
b.save("") b.save("peony")
b.start(plants["poppy"]) b.start(plants["poppy"])
b.altitude = AL.span(AL.DUNES, AL.UPLANDS) b.altitude = AL.span(AL.DUNES, AL.UPLANDS)
@@ -270,43 +270,43 @@ def addPlantSpawns(pack:ModPack):
[SO.FUNGAL] [SO.FUNGAL]
), ),
b.scarcity = SC.SPARSE b.scarcity = SC.SPARSE
b.save("") b.save("poppy")
b.start(plants["rose_black"]) b.start(plants["rose_black"])
b.altitude = AL.HILLS b.altitude = AL.HILLS
b.biomeFilters = BF([FL.CANOPY, HE.TEMPERATE]) b.biomeFilters = BF([FL.CANOPY, HE.TEMPERATE])
b.scarcity = SC.RARE b.scarcity = SC.RARE
b.save("") b.save("rose_black")
b.start(plants["rose_bush"]) b.start(plants["rose_bush"])
b.altitude = AL.span(AL.UPLANDS, AL.ALPINE) b.altitude = AL.span(AL.UPLANDS, AL.ALPINE)
b.biomeFilters = BF([FL.FOREST, (HE.TEMPERATE, HE.BOREAL), SO.LOAMY]) b.biomeFilters = BF([FL.FOREST, (HE.TEMPERATE, HE.BOREAL), SO.LOAMY])
b.scarcity = SC.UNUSUAL b.scarcity = SC.UNUSUAL
b.save("") b.save("rose_bush")
b.start(plants["tulip_orange"]) b.start(plants["tulip_orange"])
b.altitude = AL.span(AL.DUNES, AL.LOWLANDS) b.altitude = AL.span(AL.DUNES, AL.LOWLANDS)
b.biomeFilters = BF([ResourceId.parse("flower_forest")]) b.biomeFilters = BF([ResourceId.parse("flower_forest")])
b.scarcity = SC.UNUSUAL b.scarcity = SC.UNUSUAL
b.save("") b.save("tulip_orange")
b.start(plants["tulip_pink"]) b.start(plants["tulip_pink"])
b.altitude = AL.span(AL.DUNES, AL.LOWLANDS) b.altitude = AL.span(AL.DUNES, AL.LOWLANDS)
b.biomeFilters = BF([ResourceId.parse("flower_forest")]) b.biomeFilters = BF([ResourceId.parse("flower_forest")])
b.scarcity = SC.SPARSE b.scarcity = SC.SPARSE
b.save("") b.save("tulip-pink")
b.start(plants["tulip_red"]) b.start(plants["tulip_red"])
b.altitude = AL.span(AL.DUNES, AL.LOWLANDS) b.altitude = AL.span(AL.DUNES, AL.LOWLANDS)
b.biomeFilters = BF([ResourceId.parse("flower_forest")]) b.biomeFilters = BF([ResourceId.parse("flower_forest")])
b.scarcity = SC.COMMON b.scarcity = SC.COMMON
b.save("") b.save("tulip-red")
b.start(plants["tulip_white"]) b.start(plants["tulip_white"])
b.altitude = AL.span(AL.DUNES, AL.LOWLANDS) b.altitude = AL.span(AL.DUNES, AL.LOWLANDS)
b.biomeFilters = BF([ResourceId.parse("flower_forest")]) b.biomeFilters = BF([ResourceId.parse("flower_forest")])
b.scarcity = SC.UNCOMMON b.scarcity = SC.UNCOMMON
b.save("") b.save("tulip-white")
# Trees #################################################################### # Trees ####################################################################
@@ -317,37 +317,37 @@ def addPlantSpawns(pack:ModPack):
[ResourceId.parse("flower_forest")], [ResourceId.parse("flower_forest")],
) )
b.scarcity = SC.SPARSE b.scarcity = SC.SPARSE
b.save("") b.save("apple-tree")
b.start(plants["bayberry"]) b.start(plants["bayberry"])
b.altitude = AL.span(AL.DUNES, AL.UPLANDS) b.altitude = AL.span(AL.DUNES, AL.UPLANDS)
b.biomeFilters = BF([HE.TEMPERATE, (SO.ROCKY, SO.SANDY), WA.COAST]) b.biomeFilters = BF([HE.TEMPERATE, (SO.ROCKY, SO.SANDY), WA.COAST])
b.scarcity = SC.SPARSE b.scarcity = SC.SPARSE
b.save("") b.save("bayberry-tree")
b.start(plants["durian"]) b.start(plants["durian"])
b.altitude = AL.HILLS b.altitude = AL.HILLS
b.biomeFilters = BF([FL.within(FL.CANOPY, FL.CLEARING), HE.TROPICAL, HU.WET, SO.ACIDIC]) b.biomeFilters = BF([FL.within(FL.CANOPY, FL.CLEARING), HE.TROPICAL, HU.WET, SO.ACIDIC])
b.scarcity = SC.UNUSUAL b.scarcity = SC.UNUSUAL
b.save("") b.save("durian-tree")
b.start(plants["fig"]) b.start(plants["fig"])
b.altitude = AL.span(AL.UPLANDS, AL.HILLS) b.altitude = AL.span(AL.UPLANDS, AL.HILLS)
b.biomeFilters = BF([HE.SUBTROPICAL, HU.DRY, SO.SANDY], [FL.BARREN]) b.biomeFilters = BF([HE.SUBTROPICAL, HU.DRY, SO.SANDY], [FL.BARREN])
b.scarcity = SC.UNCOMMON b.scarcity = SC.UNCOMMON
b.save("") b.save("fig-tree")
b.start(plants["hawberry"]) b.start(plants["hawberry"])
b.altitude = AL.span(AL.UPLANDS, AL.HILLS) b.altitude = AL.span(AL.UPLANDS, AL.HILLS)
b.biomeFilters = BF([(FL.FOREST, FL.CLEARING), HE.TEMPERATE, (SO.ACIDIC, SO.LOAMY)]) b.biomeFilters = BF([(FL.FOREST, FL.CLEARING), HE.TEMPERATE, (SO.ACIDIC, SO.LOAMY)])
b.scarcity = SC.SPARSE b.scarcity = SC.SPARSE
b.save("") b.save("hawberry-tree")
b.start(plants["lychee"]) b.start(plants["lychee"])
b.altitude = AL.UPLANDS b.altitude = AL.UPLANDS
b.biomeFilters = BF([FL.CLEARING, HE.TROPICAL, HU.WET], [SO.FUNGAL]) b.biomeFilters = BF([FL.CLEARING, HE.TROPICAL, HU.WET], [SO.FUNGAL])
b.scarcity = SC.SPARSE b.scarcity = SC.SPARSE
b.save("") b.save("lychee-tree")
b.start(plants["mango"]) b.start(plants["mango"])
b.altitude = AL.LOWLANDS b.altitude = AL.LOWLANDS
@@ -355,34 +355,34 @@ def addPlantSpawns(pack:ModPack):
[FL.within(FL.CANOPY, FL.CLEARING), HE.TROPICAL, (HU.DAMP, HU.WET), SO.ACIDIC] [FL.within(FL.CANOPY, FL.CLEARING), HE.TROPICAL, (HU.DAMP, HU.WET), SO.ACIDIC]
) )
b.scarcity = SC.UNCOMMON b.scarcity = SC.UNCOMMON
b.save("") b.save("mango-tree")
b.start(plants["mangosteen"]) b.start(plants["mangosteen"])
b.altitude = AL.UPLANDS b.altitude = AL.UPLANDS
b.biomeFilters = BF([FL.CANOPY, HE.TROPICAL, HU.WET, SO.ACIDIC]) b.biomeFilters = BF([FL.CANOPY, HE.TROPICAL, HU.WET, SO.ACIDIC])
b.scarcity = SC.UNUSUAL b.scarcity = SC.UNUSUAL
b.save("") b.save("mangosteen-tree")
b.start(plants["orange"]) b.start(plants["orange"])
b.altitude = AL.LOWLANDS b.altitude = AL.LOWLANDS
b.biomeFilters = BF([FL.FIELD, HE.SUBTROPICAL, HU.DRY]) b.biomeFilters = BF([FL.FIELD, HE.SUBTROPICAL, HU.DRY])
b.scarcity = SC.SPARSE b.scarcity = SC.SPARSE
b.save("") b.save("orange-tree")
b.start(plants["peach"]) b.start(plants["peach"])
b.altitude = AL.span(AL.LOWLANDS, AL.UPLANDS) b.altitude = AL.span(AL.LOWLANDS, AL.UPLANDS)
b.biomeFilters = BF([FL.CLEARING, HE.TEMPERATE, HU.DAMP, SO.ROCKY]) b.biomeFilters = BF([FL.CLEARING, HE.TEMPERATE, HU.DAMP, SO.ROCKY])
b.scarcity = SC.UNCOMMON b.scarcity = SC.UNCOMMON
b.save("") b.save("peach-tree")
b.start(plants["pear"]) b.start(plants["pear"])
b.altitude = AL.span(AL.LOWLANDS, AL.UPLANDS) b.altitude = AL.span(AL.LOWLANDS, AL.UPLANDS)
b.biomeFilters = BF([FL.CLEARING, HE.TEMPERATE, HU.DAMP, (SO.ACIDIC, SO.LOAMY)]) b.biomeFilters = BF([FL.CLEARING, HE.TEMPERATE, HU.DAMP, (SO.ACIDIC, SO.LOAMY)])
b.scarcity = SC.UNCOMMON b.scarcity = SC.UNCOMMON
b.save("") b.save("pear-tree")
b.start(plants["persimmon"]) b.start(plants["persimmon"])
b.altitude = AL.span(AL.LOWLANDS, AL.UPLANDS) b.altitude = AL.span(AL.LOWLANDS, AL.UPLANDS)
b.biomeFilters = BF([FL.FOREST, HE.TEMPERATE, SO.LOAMY]) b.biomeFilters = BF([FL.FOREST, HE.TEMPERATE, SO.LOAMY])
b.scarcity = SC.UNCOMMON b.scarcity = SC.UNCOMMON
b.save("") b.save("persimmon-tree")
@@ -1,8 +0,0 @@
from mcpacker.model.modpack import ModPack
from mcpacker.format.resourcepack import ResourcePack
# Functions ########################################################################################
def addResourcePack(modPack:ModPack):
pass
@@ -1,7 +0,0 @@
import mcpacker.pack.mysteriousisland.addresourcepack
# Tests ############################################################################################
def test_syntax():
pass
+2 -6
View File
@@ -1,14 +1,12 @@
from mcpacker.model.modpack import ModPack from mcpacker.model.modpack import ModPack
from mcpacker.pack.mysteriousisland.addbiomes import addBiomes from mcpacker.pack.mysteriousisland.addbiomes import addBiomes
from mcpacker.pack.mysteriousisland.addblocks import addBlocks 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.adddisabledfeatures import addDisabledFeatures
from mcpacker.pack.mysteriousisland.additems import addItems from mcpacker.pack.mysteriousisland.additems import addItems
from mcpacker.pack.mysteriousisland.addminerals import addMinerals from mcpacker.pack.mysteriousisland.addminerals import addMinerals
from mcpacker.pack.mysteriousisland.addmineralspawns import addMineralSpawns
from mcpacker.pack.mysteriousisland.addmobs import addMobs from mcpacker.pack.mysteriousisland.addmobs import addMobs
from mcpacker.pack.mysteriousisland.addmobspawns import addMobSpawns from mcpacker.pack.mysteriousisland.addmobspawns import addMobSpawns
from mcpacker.pack.mysteriousisland.addresourcepack import addResourcePack
from mcpacker.pack.mysteriousisland.addplants import addPlants from mcpacker.pack.mysteriousisland.addplants import addPlants
from mcpacker.pack.mysteriousisland.addplantspawns import addPlantSpawns from mcpacker.pack.mysteriousisland.addplantspawns import addPlantSpawns
@@ -23,13 +21,11 @@ def buildModPack():
pack.augment(addItems) pack.augment(addItems)
pack.augment(addBlocks) pack.augment(addBlocks)
pack.augment(addMinerals) pack.augment(addMinerals)
pack.augment(addDeposits) pack.augment(addMineralSpawns)
pack.augment(addPlants) pack.augment(addPlants)
pack.augment(addPlantSpawns) pack.augment(addPlantSpawns)
pack.augment(addMobs) pack.augment(addMobs)
pack.augment(addMobSpawns) pack.augment(addMobSpawns)
pack.augment(addDisabledFeatures) pack.augment(addDisabledFeatures)
pack.augment(addResourcePack)
pack.augment(addDataPack)
return pack return pack

Some files were not shown because too many files have changed in this diff Show More