2. We need to be able to define a distance spread for the blocks we are replacing with the schems. I can't for the life of me figure out how #surfacespread works, but I'm sure that would do the trick.

I ended up finding a solution to this issue using the WorldEdit //generate command with the following invocation:

Code:

//generate -o stone round(x%(VAR+random()))+round(z%(VAR+random()))==0

The '-o' flag uses the map's coordinate system as a reference (instead of the selection specific coordinate system from -1 .. 1 //generate would use without it).
If a modulo ('%') b = 0 then that a is divisible by b without rest, this helps me define a regular grid with an even distance between points, VAR = b is therefore the variable that determines the density of points along a grid in our selection.
Now, we jitter the points a little by allowing VAR to fluctuate randomly on the x- and z-Axis by the number between 0 and 1 returned by 'random()'

So this gives us the following output for VAR= [2,3,4,5,10,1.2] from left to right!

This, frankly, is good enough for me now, since I wanted to only do this for a monoculture forest. Of course, this could be improved upon! As evident from the left-most panel, there are some nasty artifacts resulting from choosing a rigid grid before jittering. With several trees and thus differing minimal distances, another method would have to be found, one that takes a buffer parameter for each type of tree.

I gotta say, Iwan's solution up top using Perlin noise looks super convincing too (I have no idea how to get there though. nudge nudge wink wink @Iwan )

EDIT: Trying out a bunch of commands today I found that

Code:

//generate stone sin(random()*6*pi*x)+sin(random()*6*pi*z)>0.95

gave some mad patterns too! I can recommend playing around with these commands and the parameters if you want to expand your WE horizon!
Here's the expression syntax conserved for posterity: https://archive.is/JWqhP

1) Generate a density/probability mask //generate 35:5 perlin(11111111, sin(random() * x), y, sin(random() * z), .35, 2, .0001)<.5

2) Scatter single blocks, the mask defines where those blocks are more likely or less likely to occur. //gmask >35:5 //generate 35:13 perlin(randint(10000), sin(random() * x), y, sin(random() * z), 50, 12, .1)<.15

perlin(seed, x, y, z, frequency, octaves, persistence)

Thanks for the guide @SerLoras !! That should be pinned imo its super important!

I've created the sets WillowSFreshPoll, WillowSOnePoll, and WillowSTwoPoll. First is freshly pollarded willows, second and third are one and two years after pollarding respectively. Added pics to the wikia! https://westeroscraft.fandom.com/wiki/SchemSets

Changed the willow leaves to palm leaves since their shape fits the shape of Salix Viminalis better, which is a tree that is frequently pollarded. I also added a coppiced variant WillowSCopp.

Here's the completed prototype of a specific single species forest at a low density. In this case the forest type is a cultivated, middle-european wetland forest, typically found around old meanders. It's called Driesch where I'm from and used as pasture for cattle and a source of decent timber. In real life the planted poplars were owned by the peasants from the surrounding villages and marked with paint accordingly:

I'm planning to expand this script by adding a second type of tree: Salix viminalis, which naturally grows around the water but was planted there to provide kindling and material for making baskets.