This repository has been archived on 2024-06-13. You can view files and clone it, but cannot push or open issues or pull requests.
mcedit/filters/MCEditForester.py

111 lines
3.1 KiB
Python

'''MCEditForester.py
Tree-generating script by dudecon
http://www.minecraftforum.net/viewtopic.php?f=1022&t=219461
Needs the dummy mcInterface for MCEdit, and the default Forester script.
'''
from pymclevel.materials import alphaMaterials
import Forester
import mcInterface
displayName = "Forester"
inputs = (
("Forester script by dudecon", "label"),
("Shape", ("Procedural",
"Normal",
"Bamboo",
"Palm",
"Stickly",
"Round",
"Cone",
"Rainforest",
"Mangrove",
)),
("Tree Count", 2),
("Tree Height", 35),
("Height Variation", 12),
("Branch Density", 1.0),
("Trunk Thickness", 1.0),
("Broken Trunk", False),
("Hollow Trunk", False),
("Wood", True),
("Foliage", True),
("Foliage Density", 1.0),
("Roots", ("Yes", "To Stone", "Hanging", "No")),
("Root Buttresses", False),
("Wood Material", alphaMaterials.Wood),
("Leaf Material", alphaMaterials.Leaves),
("Plant On", alphaMaterials.Grass),
)
def perform(level, box, options):
'''Load the file, create the trees, and save the new file.
'''
# set up the non 1 to 1 mappings of options to Forester global names
optmap = {
"Tree Height": "CENTERHEIGHT",
}
# automatically set the options that map 1 to 1 from options to Forester
def setOption(opt):
OPT = optmap.get(opt, opt.replace(" ", "").upper())
if OPT in dir(Forester):
val = options[opt]
if isinstance(val, str):
val = val.replace(" ", "").lower()
setattr(Forester, OPT, val)
# set all of the options
for option in options:
setOption(option)
# set the EDGEHEIGHT the same as CENTERHEIGHT
Forester.EDGEHEIGHT = Forester.CENTERHEIGHT
# set the materials
wood = options["Wood Material"]
leaf = options["Leaf Material"]
grass = options["Plant On"]
Forester.WOODINFO = {"B": wood.ID, "D": wood.blockData}
Forester.LEAFINFO = {"B": leaf.ID, "D": leaf.blockData}
Forester.PLANTON = [grass.ID]
# calculate the plant-on center and radius
x_center = int(box.minx + (box.width / 2))
z_center = int(box.minz + (box.length / 2))
edge_padding = int(Forester.EDGEHEIGHT * 0.618)
max_dim = min(box.width, box.length)
planting_radius = (max_dim / 2) - edge_padding
if planting_radius <= 1:
planting_radius = 1
Forester.TREECOUNT = 1
print("Box isn't wide and/or long enough. Only planting one tree.")
# set the position to plant
Forester.X = x_center
Forester.Z = z_center
Forester.RADIUS = planting_radius
print("Plant radius = " + str(planting_radius))
# set the Forester settings that are not in the inputs
# and should be a specific value
# take these out if added to settings
Forester.LIGHTINGFIX = False
Forester.MAXTRIES = 5000
Forester.VERBOSE = True
# create the dummy map object
mcmap = mcInterface.MCLevelAdapter(level, box)
# call forester's main function on the map object.
Forester.main(mcmap)
level.markDirtyBox(box)