111 lines
3.1 KiB
Python
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)
|