
#
# +-----------------------------------------------------------------+ #
# |                            BO3 object                           | #
# +-----------------------------------------------------------------+ #
#

# This is the config file of a custom object.
# If you add this object correctly to your BiomeConfigs, it will spawn in the world.

# This is the creator of this BO3 object
Author: NLBlackEagle

# A short description of this BO3 object
Description: No description given

# The BO3 version, don't change this! It can be used by external applications to do a version check.
Version: 3

# The settings mode, WriteAll, WriteWithoutComments or WriteDisable. See WorldConfig.
SettingsMode: WriteDisable


#
# +-----------------------------------------------------------------+ #
# |                          Main settings                          | #
# +-----------------------------------------------------------------+ #
#

# This needs to be set to true to spawn the object in the Tree and Sapling resources.
# Ignored when IsOTGPlus:true.
Tree: false

# When IsOTGPlus is set to false: The frequency of the BO3 from 1 to 200. Tries this many times to spawn this BO3 when using the CustomObject(...) resource.

# When IsOTGPlus is set to true: This BO3 can only spawn at least Frequency chunks distance away from any other BO3 with the exact same name.
# You can use this to make this BO3 spawn in groups or make sure that this BO3 only spawns once every X chunks.
Frequency: 100

# The rarity of the BO3 from 0 to 100. Each spawn attempt has rarity% chance to succeed when using the CustomObject(...) resource.

# Ignored when IsOTGPlus:true, rarity is configured via the CustomStructure tag in the biome config.
Rarity: 100.0

# If you set this to true, the BO3 will be placed with a random rotation.
# Ignored when IsOTGPlus:true, this is broken for OTG+ atm, will fix this a.s.a.p.
RotateRandomly: false

# The spawn height of the BO3: randomY, highestBlock or highestSolidBlock.
SpawnHeight: highestBlock

# The offset from the spawn height to spawn this BO3
# Ex. SpawnHeight = highestSolidBlock, SpawnHeightOffset = 3; This object will spawn 3 blocks above the highest solid block
# Ignored when IsOTGPlus:true, use HeightOffset instead.
SpawnHeightOffset: 0

# A random amount to offset the spawn location from the spawn offset height
# Ex. SpawnHeightOffset = 3, SpawnHeightVariance = 3; This object will spawn 3 to 6 blocks above the original spot it would have spawned
# Ignored when IsOTGPlus:true.
SpawnHeightVariance: 0


# Height Limits for the BO3. #


# When in randomY mode used as the minimum Y or in atMinY mode as the actual Y to spawn this BO3 at.
MinHeight: 75

# When in randomY mode used as the maximum Y to spawn this BO3 at.
MaxHeight: 78


# Extrusion settings #


# The style of extrusion you wish to use - BottomDown, TopUp, None (Default)
# Ignored when IsOTGPlus:true.
ExtrudeMode: None

# The blocks to extrude your BO3 through
# Ignored when IsOTGPlus:true.
ExtrudeThroughBlocks: AIR

# Objects can have other objects attacthed to it: branches. Branches can also
# have branches attached to it, which can also have branches, etc. This is the
# maximum branch depth for this objects.
# Ignored when IsOTGPlus:true, branch depth is configured in the Branch() tag.
MaxBranchDepth: 50

# When spawned with the UseWorld keyword, this BO3 should NOT spawn in the following biomes.
# If you write the BO3 name directly in the BiomeConfigs, this will be ignored.

ExcludedBiomes: All


#
# +-----------------------------------------------------------------+ #
# |                      Source block settings                      | #
# +-----------------------------------------------------------------+ #
#

# The B(s) the BO3 should spawn in.
# Ignored when IsOTGPlus:true.
SourceBlocks: AIR

# The maximum percentage of the BO3 that can be outside the SourceBlock.
# The BO3 won't be placed on a location with more blocks outside the SourceBlock than this percentage.
# Ignored when IsOTGPlus:true.
MaxPercentageOutsideSourceBlock: 100

# What to do when a block is about to be placed outside the SourceBlock? (dontPlace, placeAnyway)
# Ignored when IsOTGPlus:true.
OutsideSourceBlock: placeAnyway

# OTG+ settings #
# Set this to true to enable the advanced customstructure features of OTG+.
IsOTGPlus: false

# Copies the blocks and branches of an existing BO3 into this BO3. You can still add blocks and branches in this BO3, they will be added on top of the inherited blocks and branches.
InheritBO3: 

# Rotates the inheritedBO3's resources (blocks, spawners, checks etc) and branches, defaults to NORTH (no rotation).
InheritBO3Rotation: NORTH

# Defaults to true, if true and this is the starting BO3 for this branching structure then this BO3's smoothing and height settings are used for all children (branches).
OverrideChildSettings: true

# Defaults to false, if true then this branch uses it's own height settings (SpawnHeight, minHeight, maxHeight, spawnAtWaterLevel) instead of those defined in the starting BO3 for this branching structure.
OverrideParentHeight: false

# If this is set to true then this BO3 can spawn on top of or inside an existing BO3. If this is set to false then this BO3 will use a bounding box to detect collisions with other BO3's, if a collision is detected then this BO3 won't spawn and the current branch is rolled back.
CanOverride: false

# This branch can only spawn at least branchFrequency chunks (x,z) distance away from any other branch with the exact same name.
BranchFrequency: 0

# Define groups that this branch belongs to along with a minimum (x,z) range in chunks that this branch must have between it and any other members of this group if it is to be allowed to spawn. Syntax is "GroupName:Frequency, GoupName2:Frequency2" etc so for example a branch that belongs to 3 groups: "BranchFrequencyGroup: Ships:10, Vehicles:5, FloatingThings:3".
BranchFrequencyGroup: 

# If this is set to true then this BO3 can only spawn underneath an existing BO3. Used to make sure that dungeons only appear underneath buildings.
MustBeBelowOther: false

# Used with CanOverride: true. A comma-seperated list of BO3s, this BO3's bounding box must collide with one of the BO3's in the list or this BO3 fails to spawn and the current branch is rolled back.
MustBeInside: 

# Used with CanOverride: true. A comma-seperated list of BO3s, this BO3's bounding box cannot collide with any of the BO3's in the list or this BO3 fails to spawn and the current branch is rolled back.
CannotBeInside: 

# Used with CanOverride: true. A comma-seperated list of BO3s, if this BO3's bounding box collides with any of the BO3's in the list then those BO3's won't spawn any blocks. This does not remove or roll back any BO3's.
ReplacesBO3: 

# Defaults to true. Set to false if the BO3 is not allowed to spawn on a water block
CanSpawnOnWater: true

# Defaults to false. Set to true if the BO3 is allowed to spawn only on a water block
SpawnOnWaterOnly: false

# Defaults to false. Set to true if the BO3 and its smoothing area should ignore water when looking for the highest block to spawn on. Defaults to false (things spawn on top of water)
SpawnUnderWater: false

# Defaults to false. Set to true if the BO3 should spawn at water level
SpawnAtWaterLevel: false

# Spawns the BO3 at a Y offset of this value. Handy when using highestBlock for lowering BO3s into the surrounding terrain when there are layers of ground included in the BO3, also handy when using SpawnAtWaterLevel to lower objects like ships into the water.
HeightOffset: 0

# If set to true removes all AIR blocks from the BO3 so that it can be flooded or buried.
RemoveAir: true

# Replaces all the non-air blocks that are above this BO3 or its smoothing area with the given block material (should be WATER or AIR or NONE), also applies to smoothing areas although OTG intentionally leaves some of the terrain above them intact. WATER can be used in combination with SpawnUnderWater to fill any air blocks underneath waterlevel with water (and any above waterlevel with air).
ReplaceAbove: 

# Replaces all air blocks underneath the BO3 (but not its smoothing area) with the specified material until a solid block is found.
ReplaceBelow: 

# Defaults to true. If set to true then every block in the BO3 of the materials defined in ReplaceWithGroundBlock or ReplaceWithSurfaceBlock will be replaced by the GroundBlock or SurfaceBlock materials configured for the biome the block is spawned in.
ReplaceWithBiomeBlocks: true

# Defaults to DIRT, Replaces all the blocks of the given material in the BO3 with the GroundBlock configured for the biome it spawns in.
ReplaceWithGroundBlock: DIRT

# Defaults to GRASS, Replaces all the blocks of the given material in the BO3 with the SurfaceBlock configured for the biome it spawns in.
ReplaceWithSurfaceBlock: GRASS

# Makes the terrain around the BO3 slope evenly towards the edges of the BO3. The given value is the distance in blocks around the BO3 from where the slope should start and can be any positive number.
SmoothRadius: 0

# Moves the smoothing area up or down relative to the BO3 (at the points where the smoothing area is connected to the BO3). Handy when using SmoothStartTop: false and the BO3 has some layers of ground included, in that case we can set the HeightOffset to a negative value to lower the BO3 into the ground and we can set the SmoothHeightOffset to a positive value to move the smoothing area starting height up.
SmoothHeightOffset: 0

# Should the smoothing area be attached at the bottom or the top of the edges of the BO3? Defaults to false (bottom). Using this setting can make things slower so try to avoid using it and use SmoothHeightOffset instead if for instance you have a BO3 with some ground layers included. The only reason you should need to use this setting is if you have a BO3 with edges that have an irregular height (like some hills).
SmoothStartTop: false

# Should the smoothing area attach itself to "log" block or ignore them? Defaults to false (ignore logs).
SmoothStartWood: false

# The block used for smoothing area surface blocks, defaults to biome SurfaceBlock.
SmoothingSurfaceBlock: 

# The block used for smoothing area ground blocks, defaults to biome GroundBlock.
SmoothingGroundBlock: 

# Define groups that this BO3 belongs to along with a minimum range in chunks that this BO3 must have between it and any other members of this group if it is to be allowed to spawn. Syntax is "GroupName:Frequency, GoupName2:Frequency2" etc so for example a BO3 that belongs to 3 groups: "BO3Group: Ships:10, Vehicles:5, FloatingThings:3".
BO3Group: 

# Defaults to false. Set to true if this BO3 should spawn at the player spawn point. When the server starts the spawn point is determined and the BO3's for the biome it is in are loaded, one of these BO3s that has IsSpawnPoint set to true (if any) is selected randomly and is spawned at the spawn point regardless of its rarity (so even Rarity:0, IsSpawnPoint: true BO3's can get spawned as the spawn point!).
IsSpawnPoint: false


#
# +-----------------------------------------------------------------+ #
# |                              Blocks                             | #
# +-----------------------------------------------------------------+ #
#

# All the blocks used in the BO3 are listed here. Possible blocks:
# B(x,y,z,id[.data][,nbtfile.nbt)
# RandomBlock(x,y,z,id[:data][,nbtfile.nbt],chance[,id[:data][,nbtfile.nbt],chance[,...]])
#  So RandomBlock(0,0,0,CHEST,CHEST.nbt,50,CHEST,anotherCHEST.nbt,100) will spawn a CHEST at
#  the BO3 origin, and give it a 50% chance to have the contents of CHEST.nbt, or, if that
#  fails, a 100% percent chance to have the contents of anotherCHEST.nbt.
# MinecraftObject(x,y,z,name) (TODO: This may not work anymore and needs to be tested.
#  Spawns an object in the Mojang NBT structure format. For example, 
#  MinecraftObject(0,0,0,igloo/igloo_bottom)
#  spawns the bottom part of an igloo.
B(-7,0,-7,STONE)
B(-7,0,-6,STONE)
B(-7,0,-5,STONE)
B(-7,0,-4,STONE)
B(-7,0,-3,STONE)
B(-7,0,-2,STONE)
B(-7,0,-1,STONE)
B(-7,0,0,STONE)
B(-7,0,1,STONE)
B(-7,0,2,STONE)
B(-7,0,3,STONE)
B(-7,0,4,GRASS)
B(-7,1,-7,STONE)
B(-7,1,-6,STONE)
B(-7,1,-5,STONE)
B(-7,1,-4,STONE)
B(-7,1,-3,STONE)
B(-7,1,-2,STONE)
B(-7,1,-1,STONE)
B(-7,1,0,STONE)
B(-7,1,1,STONE)
B(-7,1,2,STONE)
B(-7,1,3,GRASS)
B(-7,2,-7,STONE)
B(-7,2,-6,STONE)
B(-7,2,-5,STONE)
B(-7,2,-4,STONE)
B(-7,2,-3,STONE)
B(-7,2,-2,STONE)
B(-7,2,-1,STONE)
B(-7,2,0,STONE)
B(-7,2,1,STONE)
B(-7,2,2,GRASS)
B(-7,3,-7,STONE)
B(-7,3,-6,STONE)
B(-7,3,-5,STONE)
B(-7,3,-4,STONE)
B(-7,3,-3,STONE)
B(-7,3,-2,STONE)
B(-7,3,-1,STONE)
B(-7,3,0,GRASS)
B(-7,4,-7,GRASS)
B(-7,4,-6,GRASS)
B(-7,4,-5,GRASS)
B(-7,4,-4,GRASS)
B(-7,4,-3,GRASS)
B(-7,4,-2,GRASS)
B(-6,0,-7,STONE)
B(-6,0,-6,STONE)
B(-6,0,-5,STONE)
B(-6,0,-4,STONE)
B(-6,0,-3,STONE)
B(-6,0,-2,STONE)
B(-6,0,-1,STONE)
B(-6,0,0,STONE)
B(-6,0,1,STONE)
B(-6,0,2,STONE)
B(-6,0,3,GRASS)
B(-6,0,4,GRASS)
B(-6,1,-7,STONE)
B(-6,1,-6,STONE)
B(-6,1,-5,STONE)
B(-6,1,-4,STONE)
B(-6,1,-3,STONE)
B(-6,1,-2,STONE)
B(-6,1,-1,STONE)
B(-6,1,0,STONE)
B(-6,1,1,STONE)
B(-6,1,2,GRASS)
B(-6,2,-7,STONE)
B(-6,2,-6,STONE)
B(-6,2,-5,STONE)
B(-6,2,-4,STONE)
B(-6,2,-3,STONE)
B(-6,2,-2,STONE)
B(-6,2,-1,STONE)
B(-6,2,0,STONE)
B(-6,2,1,GRASS)
B(-6,3,-7,STONE)
B(-6,3,-6,STONE)
B(-6,3,-5,STONE)
B(-6,3,-4,STONE)
B(-6,3,-3,STONE)
B(-6,3,-2,STONE)
B(-6,3,-1,STONE)
B(-6,3,0,GRASS)
B(-6,4,-7,GRASS)
B(-6,4,-6,GRASS)
B(-6,4,-5,GRASS)
B(-6,4,-4,GRASS)
B(-6,4,-3,GRASS)
B(-6,4,-2,GRASS)
B(-5,0,-7,STONE)
B(-5,0,-6,STONE)
B(-5,0,-5,STONE)
B(-5,0,-4,STONE)
B(-5,0,-3,STONE)
B(-5,0,-2,STONE)
B(-5,0,-1,STONE)
B(-5,0,0,STONE)
B(-5,0,1,STONE)
B(-5,0,2,STONE)
B(-5,0,3,GRASS)
B(-5,1,-7,STONE)
B(-5,1,-6,STONE)
B(-5,1,-5,STONE)
B(-5,1,-4,STONE)
B(-5,1,-3,STONE)
B(-5,1,-2,STONE)
B(-5,1,-1,STONE)
B(-5,1,0,STONE)
B(-5,1,1,STONE)
B(-5,1,2,GRASS)
B(-5,2,-7,STONE)
B(-5,2,-6,STONE)
B(-5,2,-5,STONE)
B(-5,2,-4,STONE)
B(-5,2,-3,STONE)
B(-5,2,-2,STONE)
B(-5,2,-1,STONE)
B(-5,2,0,STONE)
B(-5,2,1,GRASS)
B(-5,3,-7,STONE)
B(-5,3,-6,STONE)
B(-5,3,-5,STONE)
B(-5,3,-4,STONE)
B(-5,3,-3,STONE)
B(-5,3,-2,STONE)
B(-5,3,-1,STONE)
B(-5,3,0,GRASS)
B(-5,4,-7,GRASS)
B(-5,4,-6,GRASS)
B(-5,4,-5,GRASS)
B(-5,4,-4,GRASS)
B(-5,4,-3,GRASS)
B(-5,4,-2,GRASS)
B(-4,0,-7,STONE)
B(-4,0,-6,STONE)
B(-4,0,-5,STONE)
B(-4,0,-4,STONE)
B(-4,0,-3,STONE)
B(-4,0,-2,STONE)
B(-4,0,-1,STONE)
B(-4,0,0,STONE)
B(-4,0,1,STONE)
B(-4,0,2,STONE)
B(-4,0,3,GRASS)
B(-4,1,-7,STONE)
B(-4,1,-6,STONE)
B(-4,1,-5,STONE)
B(-4,1,-4,STONE)
B(-4,1,-3,STONE)
B(-4,1,-2,STONE)
B(-4,1,-1,STONE)
B(-4,1,0,STONE)
B(-4,1,1,STONE)
B(-4,1,2,GRASS)
B(-4,2,-7,STONE)
B(-4,2,-6,STONE)
B(-4,2,-5,STONE)
B(-4,2,-4,STONE)
B(-4,2,-3,STONE)
B(-4,2,-2,STONE)
B(-4,2,-1,STONE)
B(-4,2,0,STONE)
B(-4,2,1,GRASS)
B(-4,3,-7,STONE)
B(-4,3,-6,STONE)
B(-4,3,-5,STONE)
B(-4,3,-4,STONE)
B(-4,3,-3,STONE)
B(-4,3,-2,STONE)
B(-4,3,-1,GRASS)
B(-4,3,0,GRASS)
B(-4,4,-7,GRASS)
B(-4,4,-6,GRASS)
B(-4,4,-5,GRASS)
B(-4,4,-4,GRASS)
B(-3,0,-7,STONE)
B(-3,0,-6,STONE)
B(-3,0,-5,STONE)
B(-3,0,-4,STONE)
B(-3,0,-3,STONE)
B(-3,0,-2,STONE)
B(-3,0,-1,STONE)
B(-3,0,0,STONE)
B(-3,0,1,STONE)
B(-3,0,2,STONE)
B(-3,0,3,GRASS)
B(-3,1,-7,STONE)
B(-3,1,-6,STONE)
B(-3,1,-5,STONE)
B(-3,1,-4,STONE)
B(-3,1,-3,STONE)
B(-3,1,-2,STONE)
B(-3,1,-1,STONE)
B(-3,1,0,STONE)
B(-3,1,1,STONE)
B(-3,1,2,GRASS)
B(-3,2,-7,STONE)
B(-3,2,-6,STONE)
B(-3,2,-5,STONE)
B(-3,2,-4,STONE)
B(-3,2,-3,STONE)
B(-3,2,-2,STONE)
B(-3,2,-1,STONE)
B(-3,2,0,GRASS)
B(-3,2,1,GRASS)
B(-3,3,-7,STONE)
B(-3,3,-6,STONE)
B(-3,3,-5,STONE)
B(-3,3,-4,STONE)
B(-3,3,-3,STONE)
B(-3,3,-2,GRASS)
B(-3,4,-7,GRASS)
B(-3,4,-6,GRASS)
B(-3,4,-5,GRASS)
B(-3,4,-4,GRASS)
B(-2,0,-7,STONE)
B(-2,0,-6,STONE)
B(-2,0,-5,STONE)
B(-2,0,-4,STONE)
B(-2,0,-3,STONE)
B(-2,0,-2,STONE)
B(-2,0,-1,STONE)
B(-2,0,0,STONE)
B(-2,0,1,STONE)
B(-2,0,2,STONE)
B(-2,0,3,GRASS)
B(-2,1,-7,STONE)
B(-2,1,-6,STONE)
B(-2,1,-5,STONE)
B(-2,1,-4,STONE)
B(-2,1,-3,STONE)
B(-2,1,-2,STONE)
B(-2,1,-1,STONE)
B(-2,1,0,GRASS)
B(-2,1,1,GRASS)
B(-2,1,2,GRASS)
B(-2,2,-7,STONE)
B(-2,2,-6,STONE)
B(-2,2,-5,STONE)
B(-2,2,-4,STONE)
B(-2,2,-3,STONE)
B(-2,2,-2,STONE)
B(-2,2,-1,GRASS)
B(-2,3,-7,STONE)
B(-2,3,-6,STONE)
B(-2,3,-5,STONE)
B(-2,3,-4,STONE)
B(-2,3,-3,STONE)
B(-2,3,-2,GRASS)
B(-2,4,-7,GRASS)
B(-2,4,-6,GRASS)
B(-2,4,-5,GRASS)
B(-2,4,-4,GRASS)
B(-1,0,-7,STONE)
B(-1,0,-6,STONE)
B(-1,0,-5,STONE)
B(-1,0,-4,STONE)
B(-1,0,-3,STONE)
B(-1,0,-2,STONE)
B(-1,0,-1,STONE)
B(-1,0,0,STONE)
B(-1,0,1,STONE)
B(-1,0,2,GRASS)
B(-1,0,3,GRASS)
B(-1,1,-7,STONE)
B(-1,1,-6,STONE)
B(-1,1,-5,STONE)
B(-1,1,-4,STONE)
B(-1,1,-3,STONE)
B(-1,1,-2,STONE)
B(-1,1,-1,STONE)
B(-1,1,0,GRASS)
B(-1,2,-7,STONE)
B(-1,2,-6,STONE)
B(-1,2,-5,STONE)
B(-1,2,-4,STONE)
B(-1,2,-3,STONE)
B(-1,2,-2,STONE)
B(-1,2,-1,GRASS)
B(-1,3,-7,STONE)
B(-1,3,-6,STONE)
B(-1,3,-5,STONE)
B(-1,3,-4,STONE)
B(-1,3,-3,STONE)
B(-1,3,-2,GRASS)
B(-1,4,-7,GRASS)
B(-1,4,-6,GRASS)
B(-1,4,-5,GRASS)
B(-1,4,-4,GRASS)
B(0,0,-7,STONE)
B(0,0,-6,STONE)
B(0,0,-5,STONE)
B(0,0,-4,STONE)
B(0,0,-3,STONE)
B(0,0,-2,STONE)
B(0,0,-1,STONE)
B(0,0,0,STONE)
B(0,0,1,STONE)
B(0,0,2,GRASS)
B(0,1,-7,STONE)
B(0,1,-6,STONE)
B(0,1,-5,STONE)
B(0,1,-4,STONE)
B(0,1,-3,STONE)
B(0,1,-2,STONE)
B(0,1,-1,STONE)
B(0,1,0,GRASS)
B(0,2,-7,STONE)
B(0,2,-6,STONE)
B(0,2,-5,STONE)
B(0,2,-4,STONE)
B(0,2,-3,STONE)
B(0,2,-2,STONE)
B(0,2,-1,GRASS)
B(0,3,-7,STONE)
B(0,3,-6,STONE)
B(0,3,-5,STONE)
B(0,3,-4,STONE)
B(0,3,-3,STONE)
B(0,3,-2,GRASS)
B(0,4,-7,GRASS)
B(0,4,-6,GRASS)
B(0,4,-5,GRASS)
B(0,4,-4,GRASS)
B(0,4,-3,GRASS)
B(1,0,-7,STONE)
B(1,0,-6,STONE)
B(1,0,-5,STONE)
B(1,0,-4,STONE)
B(1,0,-3,STONE)
B(1,0,-2,STONE)
B(1,0,-1,STONE)
B(1,0,0,STONE)
B(1,0,1,STONE)
B(1,0,2,GRASS)
B(1,1,-7,STONE)
B(1,1,-6,STONE)
B(1,1,-5,STONE)
B(1,1,-4,STONE)
B(1,1,-3,STONE)
B(1,1,-2,STONE)
B(1,1,-1,STONE)
B(1,1,0,STONE)
B(1,1,1,GRASS)
B(1,2,-7,STONE)
B(1,2,-6,STONE)
B(1,2,-5,STONE)
B(1,2,-4,STONE)
B(1,2,-3,STONE)
B(1,2,-2,STONE)
B(1,2,-1,GRASS)
B(1,3,-7,STONE)
B(1,3,-6,STONE)
B(1,3,-5,STONE)
B(1,3,-4,STONE)
B(1,3,-3,STONE)
B(1,3,-2,GRASS)
B(1,4,-7,GRASS)
B(1,4,-6,GRASS)
B(1,4,-5,GRASS)
B(1,4,-4,GRASS)
B(1,4,-3,GRASS)
B(2,0,-7,STONE)
B(2,0,-6,STONE)
B(2,0,-5,STONE)
B(2,0,-4,STONE)
B(2,0,-3,STONE)
B(2,0,-2,STONE)
B(2,0,-1,STONE)
B(2,0,0,STONE)
B(2,0,1,STONE)
B(2,0,2,GRASS)
B(2,1,-7,STONE)
B(2,1,-6,STONE)
B(2,1,-5,STONE)
B(2,1,-4,STONE)
B(2,1,-3,STONE)
B(2,1,-2,STONE)
B(2,1,-1,STONE)
B(2,1,0,STONE)
B(2,1,1,GRASS)
B(2,2,-7,STONE)
B(2,2,-6,STONE)
B(2,2,-5,STONE)
B(2,2,-4,STONE)
B(2,2,-3,STONE)
B(2,2,-2,STONE)
B(2,2,-1,GRASS)
B(2,3,-7,STONE)
B(2,3,-6,STONE)
B(2,3,-5,STONE)
B(2,3,-4,STONE)
B(2,3,-3,STONE)
B(2,3,-2,GRASS)
B(2,4,-7,GRASS)
B(2,4,-6,GRASS)
B(2,4,-5,GRASS)
B(2,4,-4,GRASS)
B(2,4,-3,GRASS)
B(3,0,-7,STONE)
B(3,0,-6,STONE)
B(3,0,-5,STONE)
B(3,0,-4,STONE)
B(3,0,-3,STONE)
B(3,0,-2,STONE)
B(3,0,-1,STONE)
B(3,0,0,STONE)
B(3,0,1,STONE)
B(3,0,2,GRASS)
B(3,1,-7,STONE)
B(3,1,-6,STONE)
B(3,1,-5,STONE)
B(3,1,-4,STONE)
B(3,1,-3,STONE)
B(3,1,-2,STONE)
B(3,1,-1,STONE)
B(3,1,0,STONE)
B(3,1,1,GRASS)
B(3,2,-7,STONE)
B(3,2,-6,STONE)
B(3,2,-5,STONE)
B(3,2,-4,STONE)
B(3,2,-3,STONE)
B(3,2,-2,STONE)
B(3,2,-1,STONE)
B(3,2,0,GRASS)
B(3,3,-7,STONE)
B(3,3,-6,STONE)
B(3,3,-5,STONE)
B(3,3,-4,STONE)
B(3,3,-3,STONE)
B(3,3,-2,GRASS)
B(3,4,-7,GRASS)
B(3,4,-6,GRASS)
B(3,4,-5,GRASS)
B(3,4,-4,GRASS)
B(4,0,-7,STONE)
B(4,0,-6,STONE)
B(4,0,-5,STONE)
B(4,0,-4,STONE)
B(4,0,-3,STONE)
B(4,0,-2,STONE)
B(4,0,-1,STONE)
B(4,0,0,STONE)
B(4,0,1,STONE)
B(4,0,2,GRASS)
B(4,1,-7,STONE)
B(4,1,-6,STONE)
B(4,1,-5,STONE)
B(4,1,-4,STONE)
B(4,1,-3,STONE)
B(4,1,-2,STONE)
B(4,1,-1,STONE)
B(4,1,0,GRASS)
B(4,1,1,GRASS)
B(4,2,-7,STONE)
B(4,2,-6,STONE)
B(4,2,-5,STONE)
B(4,2,-4,STONE)
B(4,2,-3,STONE)
B(4,2,-2,STONE)
B(4,2,-1,GRASS)
B(4,3,-7,STONE)
B(4,3,-6,STONE)
B(4,3,-5,STONE)
B(4,3,-4,STONE)
B(4,3,-3,GRASS)
B(4,4,-7,GRASS)
B(4,4,-6,GRASS)
B(4,4,-5,GRASS)
B(4,4,-4,GRASS)
B(5,0,-7,STONE)
B(5,0,-6,STONE)
B(5,0,-5,STONE)
B(5,0,-4,STONE)
B(5,0,-3,STONE)
B(5,0,-2,STONE)
B(5,0,-1,STONE)
B(5,0,0,STONE)
B(5,0,1,GRASS)
B(5,1,-7,STONE)
B(5,1,-6,STONE)
B(5,1,-5,STONE)
B(5,1,-4,STONE)
B(5,1,-3,STONE)
B(5,1,-2,STONE)
B(5,1,-1,STONE)
B(5,1,0,GRASS)
B(5,2,-7,STONE)
B(5,2,-6,STONE)
B(5,2,-5,STONE)
B(5,2,-4,STONE)
B(5,2,-3,STONE)
B(5,2,-2,STONE)
B(5,2,-1,GRASS)
B(5,3,-7,STONE)
B(5,3,-6,GRASS)
B(5,3,-5,STONE)
B(5,3,-4,GRASS)
B(5,3,-3,GRASS)
B(5,4,-7,GRASS)
B(5,4,-5,GRASS)
B(6,0,-7,STONE)
B(6,0,-6,STONE)
B(6,0,-5,STONE)
B(6,0,-4,STONE)
B(6,0,-3,STONE)
B(6,0,-2,STONE)
B(6,0,-1,STONE)
B(6,0,0,STONE)
B(6,0,1,GRASS)
B(6,1,-7,STONE)
B(6,1,-6,STONE)
B(6,1,-5,STONE)
B(6,1,-4,STONE)
B(6,1,-3,STONE)
B(6,1,-2,STONE)
B(6,1,-1,STONE)
B(6,1,0,GRASS)
B(6,2,-7,STONE)
B(6,2,-6,STONE)
B(6,2,-5,STONE)
B(6,2,-4,DIRT)
B(6,2,-3,STONE)
B(6,2,-2,STONE)
B(6,2,-1,GRASS)
B(6,3,-7,GRASS)
B(6,3,-6,GRASS)
B(6,3,-5,GRASS)
B(6,3,-4,GRASS)
B(6,3,-3,GRASS)
B(7,0,-7,STONE)
B(7,0,-6,STONE)
B(7,0,-5,STONE)
B(7,0,-4,STONE)
B(7,0,-3,STONE)
B(7,0,-2,STONE)
B(7,0,-1,STONE)
B(7,0,0,STONE)
B(7,0,1,GRASS)
B(7,1,-7,STONE)
B(7,1,-6,STONE)
B(7,1,-5,STONE)
B(7,1,-4,STONE)
B(7,1,-3,STONE)
B(7,1,-2,STONE)
B(7,1,-1,STONE)
B(7,1,0,GRASS)
B(7,2,-7,STONE)
B(7,2,-6,STONE)
B(7,2,-5,STONE)
B(7,2,-4,STONE)
B(7,2,-3,STONE)
B(7,2,-2,STONE)
B(7,2,-1,GRASS)
B(7,3,-7,GRASS)
B(7,3,-6,GRASS)
B(7,3,-5,GRASS)
B(7,3,-4,GRASS)
B(7,3,-3,GRASS)
B(7,3,-2,GRASS)
B(8,0,-7,STONE)
B(8,0,-6,STONE)
B(8,0,-5,STONE)
B(8,0,-4,STONE)
B(8,0,-3,STONE)
B(8,0,-2,STONE)
B(8,0,-1,STONE)
B(8,0,0,STONE)
B(8,0,1,GRASS)
B(8,0,2,GRASS)
B(8,1,-7,STONE)
B(8,1,-6,STONE)
B(8,1,-5,STONE)
B(8,1,-4,STONE)
B(8,1,-3,STONE)
B(8,1,-2,STONE)
B(8,1,-1,GRASS)
B(8,2,-7,STONE)
B(8,2,-6,STONE)
B(8,2,-5,STONE)
B(8,2,-4,STONE)
B(8,2,-3,STONE)
B(8,2,-2,GRASS)
B(8,3,-7,GRASS)
B(8,3,-6,STONE)
B(8,3,-5,STONE)
B(8,3,-4,STONE)
B(8,3,-3,GRASS)
B(8,4,-6,GRASS)
B(8,4,-5,GRASS)
B(8,4,-4,GRASS)

#
# +-----------------------------------------------------------------+ #
# |                            BO3 checks                           | #
# +-----------------------------------------------------------------+ #
#

# Ignored when IsOTGPlus:true.
# Require a condition at a certain location in order for the BO3 to be spawned.
# BlockCheck(x,y,z,BlockName[,BlockName[,...]]) - one of the blocks must be at the location
# BlockCheckNot(x,y,z,BlockName[,BlockName[,...]]) - all the blocks must not be at the location
# LightCheck(x,y,z,minLightLevel,maxLightLevel) - light must be between min and max (inclusive)

# You can use "Solid" as a BlockName for matching all solid blocks or "All" to match all blocks that aren't air.

# Examples:
#   BlockCheck(0,-1,0,GRASS,DIRT)  Require grass or dirt just below the object
#   BlockCheck(0,-1,0,Solid)       Require any solid block just below the object
#   BlockCheck(0,-1,0,WOOL)        Require any type of wool just below the object
#   BlockCheck(0,-1,0,WOOL:0)      Require white wool just below the object
#   BlockCheckNot(0,-1,0,WOOL:0)   Require that there is no white wool below the object
#   LightCheck(0,0,0,0,1)          Require almost complete darkness just below the object

#
# +-----------------------------------------------------------------+ #
# |                             Branches                            | #
# +-----------------------------------------------------------------+ #
#

# Branches are child-BO3's that spawn if this BO3 is configured to spawn as a
# CustomStructure resource in a biome config. Branches can have branches,
# making complex structures possible. See the wiki for more details.

# Regular Branches spawn each branch with an independent chance of spawning.
# When IsOTGPlus is set to false: Branch(x,y,z,branchName,rotation,chance[,anotherBranchName,rotation,chance[,...]][IndividualChance])
# When IsOTGPlus is set to true: Branch(x,y,z,isRequiredBranch,branchName,rotation,chance,branchDepth[,anotherBranchName,rotation,chance,branchDepth[,...]][IndividualChance])
# branchName - name of the object to spawn.
# rotation - NORTH, SOUTH, EAST or WEST.
# IndividualChance - The chance each branch has to spawn, assumed to be 100 when left blank
# isRequiredBranch - If this is set to true then at least one of the branches in this BO3 must spawn at these x,y,z coordinates. If no branch can spawn there then this BO3 fails to spawn and its branch is rolled back.
# isRequiredBranch:true branches must spawn or the current branch is rolled back entirely. This is useful for grouping BO3's that must spawn together, for instance a single room made of multiple BO3's/branches.
# If all parts of the room are connected together via isRequiredBranch:true branches then either the entire room will spawns or no part of it will spawn.
# *Note: When isRequiredBranch:true only one BO3 can be added per Branch() and it will automatically have a rarity of 100.0.
# isRequiredBranch:false branches are used to make optional parts of structures, for instance the middle section of a tunnel that has a beginning, middle and end BO3/branch and can have a variable length by repeating the middle BO3/branch.
# By making the start and end branches isRequiredBranch:true and the middle branch isRequiredbranch:false you can make it so that either:
# A. A tunnel spawns with at least a beginning and end branch
# B. A tunnel spawns with a beginning and end branch and as many middle branches as will fit in the available space.
# C. No tunnel spawns at all because there wasn't enough space to spawn at least a beginning and end branch.
# branchDepth - When creating a chain of branches that contains optional (isRequiredBranch:false) branches branch depth is configured for the first BO3 in the chain to determine the maximum length of the chain.
# branchDepth - 1 is inherited by each isRequiredBranch:false branch in the chain. When branchDepth is zero isRequiredBranch:false branches cannot spawn and the chain ends. In the case of the tunnel this means the last middle branch would be
# rolled back and an IsRequiredBranch:true end branch could be spawned in its place to make sure the tunnel has a proper ending.
# Instead of inheriting branchDepth - 1 from the parent branchDepth can be overridden by child branches if it is set higher than 0 (the default value).
# isRequiredBranch:true branches do inherit branchDepth and pass it on to their own branches, however they cannot be prevented from spawning by it and also don't subtract 1 from branchDepth when inheriting it.

# Weighted Branches spawn branches with a dependent chance of spawning.
# When IsOTGPlus is set to false: WeightedBranch(x,y,z,branchName,rotation,chance[,anotherBranchName,rotation,chance[,...]][MaxChanceOutOf])
# When IsOTGPlus is set to true: WeightedBranch(x,y,z,isRequiredBranch,branchName,rotation,chance,branchDepth[,anotherBranchName,rotation,chance,branchDepth[,...]][MaxChanceOutOf])
# *Note: isRequiredBranch must be set to false. It is not possible to use isRequiredBranch:true with WeightedBranch() since isRequired:true branches must spawn and automatically have a rarity of 100.0.
# MaxChanceOutOf - The chance all branches have to spawn out of, assumed to be 100 when left blank

#
# +-----------------------------------------------------------------+ #
# |                             Entities                            | #
# +-----------------------------------------------------------------+ #
#

# Forge only (this may have changed, check for updates).
# An EntityFunction spawns an entity instead of a block. The entity is spawned only once when the BO3 is spawned.
# Entities are persistent by default so they don't de-spawn when no player is near, they are only unloaded.
# Usage: Entity(x,y,z,entityName,groupSize,NameTagOrNBTFileName) or Entity(x,y,z,mobName,groupSize)
# Use /otg entities to get a list of entities that can be used as entityName, this includes entities added by other mods and non-living entities.

# In the text file you can use the same mob spawning parameters used with the /summon command to equip the
# entity and give it custom attributes etc. You can copy the DATA part of a summon command including surrounding 
# curly braces to a .txt file, for instance for: "/summon Skeleton x y z {DATA}"

#
# +-----------------------------------------------------------------+ #
# |                            Particles                            | #
# +-----------------------------------------------------------------+ #
#

# Forge only (this may have changed, check for updates).
# Creates an invisible particle spawner at the given location that spawns particles every x milliseconds.

# velocityX, velocityY and velocityZ are optional.
# Only vanilla particle names can be used, for 1.11.2 these are;
# explode, largeexplode, hugeexplosion, fireworksSpark, bubble, splash, wake, suspended
# depthsuspend, crit, magicCrit, smoke, largesmoke, spell, instantSpell, mobSpell
# mobSpellAmbient, witchMagic, dripWater, dripLava, angryVillager, happyVillager
# townaura, note, portal, enchantmenttable, flame, lava, footstep, cloud, reddust
# snowballpoof,  snowshovel, slime, heart, barrier, iconcrack, blockcrack, blockdust
# droplet, take, mobappearance, dragonbreath, endRod, damageIndicator, sweepAttack
# fallingdust,Totem, spit.
# velocityX,velocityY,velocityZ - Spawn the enemy with the given velocity. If this is not filled in then a small random velocity is applied.

#
# +-----------------------------------------------------------------+ #
# |                             Spawners                            | #
# +-----------------------------------------------------------------+ #
#

# Forge only (this may have changed, check for updates).
# Creates an invisible entity spawner at the given location that spawns entities every x seconds.
# Entities can only spawn if their spawn requirements are met (zombies/skeletons only spawn in the dark etc). Max entity count for the server is ignored, each spawner has its own maxCount setting.
# Usage: Spawner(x,y,z,entityName,nbtFileName,groupSize,interval,spawnChance,maxCount,despawnTime,velocityX,velocityY,velocityZ,yaw,pitch)
# nbtFileName, despawnTime, velocityX, velocityY, velocityZ, yaw and pitch are optional
# Example Spawner(0, 0, 0, Villager, 1, 5, 100, 5) or Spawner(0, 0, 0, Villager, villager1.txt, 1, 5, 100, 5) or Spawner(0, 0, 0, Villager, 1, 5, 100, 5, 30, 1, 1, 1, 0, 0)
# entityName - Name of the entity to spawn, use /otg entities to get a list of entities that can be used as entityName, this includes entities added by other mods and non-living entities.

# In the text file you can use the same mob spawning parameters used with the /summon command to equip the
# entity and give it custom attributes etc. You can copy the DATA part of a summon command including surrounding 
# curly braces to a .txt file, for instance for: "/summon Skeleton x y z {DATA}"
# groupSize - Number of entities that should spawn for each successful spawn attempt.
# interval - Time in seconds between each spawn attempt.
# spawnChance - For each spawn attempt, the chance between 0-100 that the spawn attempt will succeed.
# maxCount - The maximum amount of this kind of entity that can exist within 32 blocks. If there are already maxCount or more entities of this type in a 32 radius this spawner will not spawn anything.
# despawnTime - After despawnTime seconds, if there is no player within 32 blocks of the entity it will despawn..
# velocityX,velocityY,velocityZ,yaw,pitch - Spawn the enemy with the given velocity and angle, handy for making traps and launchers (shooting arrows and fireballs etc).

#
# +-----------------------------------------------------------------+ #
# |                             ModData                             | #
# +-----------------------------------------------------------------+ #
#

# Forge only.
# Use the ModData() tag to include data that other mods can use
# Mod makers can use ModData and the /otg GetModData command to test IMC communications between OTG
# and their mod.
# Normal users can use it to spawn some mobs and blocks on command.
# ModData(x,y,z,"ModName", "MyModDataAsText"
# Example: ModData(x,y,z,MyCystomNPCMod,SpawnBobHere/WithAPotato/And50Health)
# Try not to use exotic/reserved characters, like brackets and comma's etc, this stuff isn't fool-proof.
# Also, use this only to store IDs/object names etc for your mod, DO NOT include things like character dialogue,
# messages on signs, loot lists etc in this file. As much as possible just store id's/names here and store all the data related to those id's/names in your own mod.
# OTG has some built in ModData commands for basic mob and block spawning.
# These are mostly just a demonstration for mod makers to show how ModData.
# can be used by other mods.
# For mob spawning in OTG use: ModData(x,y,z,OTG,mob/MobType/Count/Persistent/Name)
# mob: Makes OTG recognise this as a mob spawning command.
# MobType: Lower-case, no spaces. Any vanilla mob like dragon, skeleton, wither, villager etc
# Count: The number of mobs to spawn
# Persistent (true/false): Should the mobs never de-spawn? If set to true the mob will get a
# name-tag ingame so you can recognise it.
# Name: A name-tag for the monster/npc.
# Example: ModData(0,0,0,OTG,villager/1/true/Bob)
# To spawn blocks using ModData use: ModData(x,y,z,OTG,block/material)
# block: Makes OTG recognise this as a block spawning command.
# material: id or text, custom blocks can be added using ModName:MaterialName.
# To send all ModData within a radius in chunks around the player to the specified mod
# use this console command: /otg GetModData ModName Radius
# ModName: name of the mod, for OTG commands use OTG 
# Radius (optional): Radius in chunks around the player.
