diff --git a/gm4/contributors.json b/gm4/contributors.json index 231a846a3f..854f23af02 100644 --- a/gm4/contributors.json +++ b/gm4/contributors.json @@ -31,6 +31,10 @@ "name": "Denniss", "links": ["https://github.com/Dennis-0"] }, + { + "name": "Dinoguin_Jess", + "links": ["https://github.com/Dinoguin-Jess"] + }, { "name": "Djones", "links": ["https://bsky.app/profile/thanathor.bsky.social"] @@ -79,6 +83,10 @@ "name": "Lue", "links": ["https://github.com/Luexa"] }, + { + "name": "Lune6", + "links": ["https://bsky.app/profile/lune6.bsky.social"] + }, { "name": "Modulorium", "links": ["https://www.modulorium.dev"] diff --git a/gm4/modeldata_registry.json b/gm4/modeldata_registry.json index ca23f30dc9..8dda1bdbc0 100644 --- a/gm4/modeldata_registry.json +++ b/gm4/modeldata_registry.json @@ -1298,6 +1298,7 @@ "gm4_desire_lines:gui/advancement/desire_lines_8000": 1 }, "oak_sapling": { + "gm4_towering_trees:guidebook_icon/towering_trees": 1, "gm4_apple_trees:item/apple_tree_sapling": 4 }, "oak_sign": { diff --git a/gm4_guidebook/triggers.json b/gm4_guidebook/triggers.json index b8ded3e6be..accba8a70c 100644 --- a/gm4_guidebook/triggers.json +++ b/gm4_guidebook/triggers.json @@ -1,6 +1,6 @@ { "__important__": "Generated by generate_guidebooks.py. Don't manually update this", - "__next__": 124, + "__next__": 125, "animi_shamir": 91, "apple_trees": 83, "arborenda_shamir": 20, @@ -109,6 +109,7 @@ "tinkering_compressors": 52, "tipped_skeletons": 44, "tower_structures": 89, + "towering_trees": 124, "tunnel_bores": 59, "undead_players": 67, "vecto_shamir": 95, diff --git a/gm4_towering_trees/README.md b/gm4_towering_trees/README.md new file mode 100644 index 0000000000..b303ec4f24 --- /dev/null +++ b/gm4_towering_trees/README.md @@ -0,0 +1,10 @@ +# Towering Trees + +Adds mega and small tree variants to any sapling that is missing one! + +![Mega Oak Tree](images/towering_trees.png) + +### Features +- Adds mega and small tree variants to any vanilla sapling that is missing one. +- Grow a mega mangrove tree and admire it! Or chop it down, your choice! +- Works with natural growth or bonemeal, no special interaction required, just plant a 2x2 of saplings! diff --git a/gm4_towering_trees/assets/translations.csv b/gm4_towering_trees/assets/translations.csv new file mode 100644 index 0000000000..1259a2931d --- /dev/null +++ b/gm4_towering_trees/assets/translations.csv @@ -0,0 +1,3 @@ +key,en_us,de_de,en_ws +text.gm4.guidebook.towering_trees.description,"Oak, Birch, Acacia, Cherry and Mangrove trees have mega (2x2) variants.\n\nDark Oak and Pale Oak have small variants." +text.gm4.guidebook.module_desc.towering_trees,"Adds mega and small tree variants to any sapling that is missing one!" diff --git a/gm4_towering_trees/beet.yaml b/gm4_towering_trees/beet.yaml new file mode 100644 index 0000000000..40960d6cad --- /dev/null +++ b/gm4_towering_trees/beet.yaml @@ -0,0 +1,31 @@ +id: gm4_towering_trees +name: Towering Trees +version: 1.0.X + +data_pack: + load: . + +pipeline: + - gm4_towering_trees.generate + - gm4.plugins.extend.module + - gm4.plugins.include.lib_trees + +meta: + gm4: + versioning: + required: + lib_trees: 1.4.0 + website: + description: Adds mega and small tree variants to any sapling that is missing one! + recommended: + - gm4_metallurgy + wiki: https://wiki.gm4.co/wiki/Towering_Trees + credits: + Creator: + - Djones + - Kyrius + Tree Structures: + - BPR + - rednls + - Dinoguin_Jess + - Lune6 diff --git a/gm4_towering_trees/data/gm4_towering_trees/advancement/place_sapling.json b/gm4_towering_trees/data/gm4_towering_trees/advancement/place_sapling.json new file mode 100644 index 0000000000..6751e86b4e --- /dev/null +++ b/gm4_towering_trees/data/gm4_towering_trees/advancement/place_sapling.json @@ -0,0 +1,20 @@ +{ + "criteria": { + "place_sapling": { + "trigger": "minecraft:placed_block", + "conditions": { + "location": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "items": "#gm4_towering_trees:supported_sapling" + } + } + ] + } + } + }, + "rewards": { + "function": "gm4_towering_trees:place_sapling" + } +} diff --git a/gm4_towering_trees/data/gm4_towering_trees/function/check_for_mega_tree.mcfunction b/gm4_towering_trees/data/gm4_towering_trees/function/check_for_mega_tree.mcfunction new file mode 100644 index 0000000000..ff22a3858a --- /dev/null +++ b/gm4_towering_trees/data/gm4_towering_trees/function/check_for_mega_tree.mcfunction @@ -0,0 +1,15 @@ +# check what orientation this big tree has (if it is a big tree) +# @s = sapling marker +# located at @s +# run from generate_tree + +# SE = 1 +execute if blocks ~1 ~ ~ ~1 ~ ~ ~ ~ ~ all if blocks ~1 ~ ~1 ~1 ~ ~1 ~ ~ ~ all if blocks ~ ~ ~1 ~ ~ ~1 ~ ~ ~ all run return 1 +# NE = 2 +execute if blocks ~1 ~ ~ ~1 ~ ~ ~ ~ ~ all if blocks ~1 ~ ~-1 ~1 ~ ~-1 ~ ~ ~ all if blocks ~ ~ ~-1 ~ ~ ~-1 ~ ~ ~ all run return 2 +# SW = 3 +execute if blocks ~-1 ~ ~ ~-1 ~ ~ ~ ~ ~ all if blocks ~-1 ~ ~1 ~-1 ~ ~1 ~ ~ ~ all if blocks ~ ~ ~1 ~ ~ ~1 ~ ~ ~ all run return 3 +# NW = 4 +execute if blocks ~-1 ~ ~ ~-1 ~ ~ ~ ~ ~ all if blocks ~-1 ~ ~-1 ~-1 ~ ~-1 ~ ~ ~ all if blocks ~ ~ ~-1 ~ ~ ~-1 ~ ~ ~ all run return 4 + +return 0 diff --git a/gm4_towering_trees/data/gm4_towering_trees/function/clear_sapling.mcfunction b/gm4_towering_trees/data/gm4_towering_trees/function/clear_sapling.mcfunction new file mode 100644 index 0000000000..6c346cdf0e --- /dev/null +++ b/gm4_towering_trees/data/gm4_towering_trees/function/clear_sapling.mcfunction @@ -0,0 +1,9 @@ +# removes this sapling so features can be placed +# @s = sapling marker +# at @s +# run from generate_mega_tree +# run from generate_small_tree + +execute if block ~ ~ ~ mangrove_propagule[waterlogged=true] run tag @s add gm4_mangrove_tree_sapling.waterlogged +execute unless entity @s[tag=gm4_mangrove_tree_sapling.waterlogged] run fill ~ ~ ~ ~ ~ ~ air replace #gm4_towering_trees:supported_sapling +execute if entity @s[tag=gm4_mangrove_tree_sapling.waterlogged] run setblock ~ ~ ~ water diff --git a/gm4_towering_trees/data/gm4_towering_trees/function/generate_mega_tree.mcfunction b/gm4_towering_trees/data/gm4_towering_trees/function/generate_mega_tree.mcfunction new file mode 100644 index 0000000000..9f8ddc55ca --- /dev/null +++ b/gm4_towering_trees/data/gm4_towering_trees/function/generate_mega_tree.mcfunction @@ -0,0 +1,20 @@ +# generates the tree - mega +# @s = sapling marker +# located at @s (offset to be at the negative corner of the 2x2) +# run from generate_tree + +# towering +execute if entity @s[tag=gm4_oak_tree_sapling] run return run function gm4_towering_trees:generate_tree_type/oak/pick_variant +execute if entity @s[tag=gm4_acacia_tree_sapling] run return run function gm4_towering_trees:generate_tree_type/acacia/pick_variant +execute if entity @s[tag=gm4_cherry_tree_sapling] run return run function gm4_towering_trees:generate_tree_type/cherry/pick_variant +execute if entity @s[tag=gm4_mangrove_tree_sapling] run return run function gm4_towering_trees:generate_tree_type/mangrove/pick_variant +execute if entity @s[tag=gm4_birch_tree_sapling] run return run function gm4_towering_trees:generate_tree_type/birch/pick_variant + +# vanilla - needs to remove the saplings first so they can be placed +execute align xyz as @e[type=marker,tag=gm4_towering_trees_sapling,dx=1,dy=0,dz=1] at @s run function gm4_towering_trees:clear_sapling + +execute if entity @s[tag=gm4_pale_oak_tree_sapling] store success score $tree_placed gm4_towering_trees_data run place feature minecraft:pale_oak_bonemeal +execute if entity @s[tag=gm4_dark_oak_tree_sapling] store success score $tree_placed gm4_towering_trees_data run place feature minecraft:dark_oak + +# replace sapling if placement failed +execute if score $tree_placed gm4_towering_trees_data matches 0 align xyz as @e[type=marker,tag=gm4_towering_trees_sapling,dx=1,dy=0,dz=1] at @s run function gm4_towering_trees:replace_sapling diff --git a/gm4_towering_trees/data/gm4_towering_trees/function/generate_small_tree.mcfunction b/gm4_towering_trees/data/gm4_towering_trees/function/generate_small_tree.mcfunction new file mode 100644 index 0000000000..f96e81cbfe --- /dev/null +++ b/gm4_towering_trees/data/gm4_towering_trees/function/generate_small_tree.mcfunction @@ -0,0 +1,21 @@ +# generates the tree - small +# @s = sapling marker +# located at @s +# run from generate_tree + +# remove sapling to clear the space +function gm4_towering_trees:clear_sapling + +# vanilla +execute if entity @s[tag=gm4_oak_tree_sapling] store success score $tree_placed gm4_towering_trees_data run place feature minecraft:oak +execute if entity @s[tag=gm4_acacia_tree_sapling] store success score $tree_placed gm4_towering_trees_data run place feature minecraft:acacia +execute if entity @s[tag=gm4_cherry_tree_sapling] store success score $tree_placed gm4_towering_trees_data run place feature minecraft:cherry +execute if entity @s[tag=gm4_mangrove_tree_sapling] store success score $tree_placed gm4_towering_trees_data run place feature minecraft:mangrove +execute if entity @s[tag=gm4_birch_tree_sapling] store success score $tree_placed gm4_towering_trees_data run place feature minecraft:birch + +# towering +execute if entity @s[tag=gm4_pale_oak_tree_sapling] store success score $tree_placed gm4_towering_trees_data run function gm4_towering_trees:generate_tree_type/pale_oak/pick_variant +execute if entity @s[tag=gm4_dark_oak_tree_sapling] store success score $tree_placed gm4_towering_trees_data run function gm4_towering_trees:generate_tree_type/dark_oak/pick_variant + +# replace sapling if placement failed +execute if score $tree_placed gm4_towering_trees_data matches 0 run function gm4_towering_trees:replace_sapling diff --git a/gm4_towering_trees/data/gm4_towering_trees/function/generate_tree.mcfunction b/gm4_towering_trees/data/gm4_towering_trees/function/generate_tree.mcfunction new file mode 100644 index 0000000000..6955bac9c5 --- /dev/null +++ b/gm4_towering_trees/data/gm4_towering_trees/function/generate_tree.mcfunction @@ -0,0 +1,20 @@ +# generates the tree +# @s = sapling marker +# located at @s +# run from gm4_towering_trees:verify/generate_tree + +scoreboard players set $tree_placed gm4_towering_trees_data 0 + +# check if this is a big tree +execute store result score $big_tree gm4_towering_trees_data run function gm4_towering_trees:check_for_mega_tree + +# generate mega tree positionionally based on which sapling grew +execute if score $big_tree gm4_towering_trees_data matches 1 run function gm4_towering_trees:generate_mega_tree +execute if score $big_tree gm4_towering_trees_data matches 2 positioned ~ ~ ~-1 run function gm4_towering_trees:generate_mega_tree +execute if score $big_tree gm4_towering_trees_data matches 3 positioned ~-1 ~ ~ run function gm4_towering_trees:generate_mega_tree +execute if score $big_tree gm4_towering_trees_data matches 4 positioned ~-1 ~ ~-1 run function gm4_towering_trees:generate_mega_tree +# small trees +execute if score $big_tree gm4_towering_trees_data matches 0 run function gm4_towering_trees:generate_small_tree + +# remove the saplings +execute if score $tree_placed gm4_towering_trees_data matches 1 run kill @e[type=marker,tag=gm4_towering_trees_sapling.target,limit=4,distance=..3] diff --git a/gm4_towering_trees/data/gm4_towering_trees/function/generate_tree_type/mangrove/extra.mcfunction b/gm4_towering_trees/data/gm4_towering_trees/function/generate_tree_type/mangrove/extra.mcfunction new file mode 100644 index 0000000000..6409e69b11 --- /dev/null +++ b/gm4_towering_trees/data/gm4_towering_trees/function/generate_tree_type/mangrove/extra.mcfunction @@ -0,0 +1,11 @@ +# extra function for mangrove trees +# @s = sapling marker +# located at @s +# run from generate_tree_type/mangrove/place_tree + +# remove the saplings, this doesn't always happen for mangrove trees +fill ~ ~ ~ ~1 ~ ~1 air replace mangrove_propagule[waterlogged=false] +fill ~ ~ ~ ~1 ~ ~1 water replace mangrove_propagule[waterlogged=true] + +# place the roots after 1 tick to allow markers to load in +schedule function gm4_towering_trees:generate_tree_type/mangrove/roots/schedule 1t diff --git a/gm4_towering_trees/data/gm4_towering_trees/function/generate_tree_type/mangrove/roots/loop.mcfunction b/gm4_towering_trees/data/gm4_towering_trees/function/generate_tree_type/mangrove/roots/loop.mcfunction new file mode 100644 index 0000000000..1dc52848c9 --- /dev/null +++ b/gm4_towering_trees/data/gm4_towering_trees/function/generate_tree_type/mangrove/roots/loop.mcfunction @@ -0,0 +1,32 @@ +# build mangrove tree roots +# @s = mangrove tree root marker +# at @s positioned ^ ^-y ^z, randomly offset +# run from generate_tree_type/mangrove/roots/start +# run from here + +# if block cannot be replaced with root or max length was reached return +execute unless block ~ ~ ~ #gm4_towering_trees:mangrove_root_replaceable run return fail +scoreboard players remove $max_length gm4_towering_trees_data 1 +execute unless score $max_length gm4_towering_trees_data matches 1.. run return fail + +# fill with muddy / waterlogged / normal roots +fill ~ ~ ~ ~ ~ ~ muddy_mangrove_roots replace mud +fill ~ ~ ~ ~ ~ ~ mangrove_roots[waterlogged=true] replace #gm4:water +execute unless block ~ ~ ~ mangrove_roots unless block ~ ~ ~ muddy_mangrove_roots run setblock ~ ~ ~ mangrove_roots + +# random carpets +execute if predicate {condition:"random_chance",chance:0.5} run fill ~ ~1 ~ ~ ~1 ~ moss_carpet replace #air + +# small chance to skew to ground from now on +execute if predicate {condition:"random_chance",chance:0.02} run tag @s add gm4_towering_trees.mangrove_root_skewed + +# pick direction +execute if predicate {condition:"random_chance",chance:0.8} positioned ~ ~-1 ~ run return run function gm4_towering_trees:generate_tree_type/mangrove/roots/loop +execute if score $max_distance_from_tree gm4_towering_trees_data matches 0 positioned ~ ~-1 ~ run return run function gm4_towering_trees:generate_tree_type/mangrove/roots/loop + +# if skewed to ground start a loop down if the root is going forward +scoreboard players set $max_skew_length gm4_towering_trees_data 5 +execute if entity @s[tag=gm4_towering_trees.mangrove_root_skewed] positioned ~ ~-1 ~ run function gm4_towering_trees:generate_tree_type/mangrove/roots/loop_to_ground + +scoreboard players remove $max_distance_from_tree gm4_towering_trees_data 1 +execute positioned ^ ^ ^1 run function gm4_towering_trees:generate_tree_type/mangrove/roots/loop diff --git a/gm4_towering_trees/data/gm4_towering_trees/function/generate_tree_type/mangrove/roots/loop_to_ground.mcfunction b/gm4_towering_trees/data/gm4_towering_trees/function/generate_tree_type/mangrove/roots/loop_to_ground.mcfunction new file mode 100644 index 0000000000..6a3b31fab6 --- /dev/null +++ b/gm4_towering_trees/data/gm4_towering_trees/function/generate_tree_type/mangrove/roots/loop_to_ground.mcfunction @@ -0,0 +1,18 @@ +# build mangrove tree roots +# @s = mangrove tree root marker +# at @s positioned ^ ^-y ^z, randomly offset, then positioned ~ ~-n ~ +# run from generate_tree_type/mangrove/roots/loop +# run from here + +# if block cannot be replaced with root return +execute unless block ~ ~ ~ #gm4_towering_trees:mangrove_root_replaceable run return fail +scoreboard players remove $max_skew_length gm4_towering_trees_data 1 +execute unless score $max_skew_length gm4_towering_trees_data matches 1.. run return fail + +# fill with (muddy) roots +fill ~ ~ ~ ~ ~ ~ muddy_mangrove_roots replace mud +fill ~ ~ ~ ~ ~ ~ mangrove_roots[waterlogged=true] replace #gm4:water +execute unless block ~ ~ ~ mangrove_roots unless block ~ ~ ~ muddy_mangrove_roots run setblock ~ ~ ~ mangrove_roots + +# go down to ground +execute positioned ~ ~-1 ~ run function gm4_towering_trees:generate_tree_type/mangrove/roots/loop_to_ground diff --git a/gm4_towering_trees/data/gm4_towering_trees/function/generate_tree_type/mangrove/roots/schedule.mcfunction b/gm4_towering_trees/data/gm4_towering_trees/function/generate_tree_type/mangrove/roots/schedule.mcfunction new file mode 100644 index 0000000000..c119e99569 --- /dev/null +++ b/gm4_towering_trees/data/gm4_towering_trees/function/generate_tree_type/mangrove/roots/schedule.mcfunction @@ -0,0 +1,6 @@ +# look for mangrove tree root markers +# @s = unspecified +# at unspecified +# run from generate_tree_type/mangrove/extra + +execute as @e[type=marker,tag=gm4_towering_trees.mangrove_root] at @s run function gm4_towering_trees:generate_tree_type/mangrove/roots/start diff --git a/gm4_towering_trees/data/gm4_towering_trees/function/generate_tree_type/mangrove/roots/start.mcfunction b/gm4_towering_trees/data/gm4_towering_trees/function/generate_tree_type/mangrove/roots/start.mcfunction new file mode 100644 index 0000000000..d2da3149cb --- /dev/null +++ b/gm4_towering_trees/data/gm4_towering_trees/function/generate_tree_type/mangrove/roots/start.mcfunction @@ -0,0 +1,9 @@ +# build mangrove tree roots +# @s = mangrove tree root marker +# at @s +# run from generate_tree_type/mangrove/roots/schedule + +scoreboard players set $max_distance_from_tree gm4_towering_trees_data 7 +scoreboard players set $max_length gm4_towering_trees_data 16 +function gm4_towering_trees:generate_tree_type/mangrove/roots/loop +kill @s diff --git a/gm4_towering_trees/data/gm4_towering_trees/function/init.mcfunction b/gm4_towering_trees/data/gm4_towering_trees/function/init.mcfunction new file mode 100644 index 0000000000..3537001bf4 --- /dev/null +++ b/gm4_towering_trees/data/gm4_towering_trees/function/init.mcfunction @@ -0,0 +1,10 @@ +execute unless score towering_trees gm4_modules matches 1 run data modify storage gm4:log queue append value {type:"install",module:"Towering Trees"} +execute unless score towering_trees gm4_earliest_version < towering_trees gm4_modules run scoreboard players operation towering_trees gm4_earliest_version = towering_trees gm4_modules +scoreboard players set towering_trees gm4_modules 1 + +# to tree or not to tree + +# scoreboards and constants +scoreboard objectives add gm4_towering_trees_data dummy + +#$moduleUpdateList diff --git a/gm4_towering_trees/data/gm4_towering_trees/function/initialize_sapling.mcfunction b/gm4_towering_trees/data/gm4_towering_trees/function/initialize_sapling.mcfunction new file mode 100644 index 0000000000..ec9bf1891c --- /dev/null +++ b/gm4_towering_trees/data/gm4_towering_trees/function/initialize_sapling.mcfunction @@ -0,0 +1,16 @@ +# initializes the vanilla tree's marker +# @s = player who placed down the vanilla tree sapling +# located at the center of the placed sapling +# run from verify/initialize_sapling + +# summon marker +# spruce and jungle are not included as they already have both variants of tree +execute if block ~ ~ ~ oak_sapling run summon marker ~ ~ ~ {CustomName:"gm4_oak_tree_sapling",Tags:["gm4_tree_sapling","gm4_towering_trees_sapling","gm4_oak_tree_sapling","smithed.entity","smithed.strict","smithed.block"]} +execute if block ~ ~ ~ birch_sapling run summon marker ~ ~ ~ {CustomName:"gm4_birch_tree_sapling",Tags:["gm4_tree_sapling","gm4_towering_trees_sapling","gm4_birch_tree_sapling","smithed.entity","smithed.strict","smithed.block"]} +execute if block ~ ~ ~ acacia_sapling run summon marker ~ ~ ~ {CustomName:"gm4_acacia_tree_sapling",Tags:["gm4_tree_sapling","gm4_towering_trees_sapling","gm4_acacia_tree_sapling","smithed.entity","smithed.strict","smithed.block"]} +execute if block ~ ~ ~ dark_oak_sapling run summon marker ~ ~ ~ {CustomName:"gm4_dark_oak_tree_sapling",Tags:["gm4_tree_sapling","gm4_towering_trees_sapling","gm4_dark_oak_tree_sapling","smithed.entity","smithed.strict","smithed.block"]} +execute if block ~ ~ ~ cherry_sapling run summon marker ~ ~ ~ {CustomName:"gm4_cherry_tree_sapling",Tags:["gm4_tree_sapling","gm4_towering_trees_sapling","gm4_cherry_tree_sapling","smithed.entity","smithed.strict","smithed.block"]} +execute if block ~ ~ ~ pale_oak_sapling run summon marker ~ ~ ~ {CustomName:"gm4_pale_oak_tree_sapling",Tags:["gm4_tree_sapling","gm4_towering_trees_sapling","gm4_pale_oak_tree_sapling","smithed.entity","smithed.strict","smithed.block"]} +execute if block ~ ~ ~ mangrove_propagule run summon marker ~ ~ ~ {CustomName:"gm4_mangrove_tree_sapling",Tags:["gm4_tree_sapling","gm4_towering_trees_sapling","gm4_mangrove_tree_sapling","smithed.entity","smithed.strict","smithed.block"]} +# set stage requirement (higher = longer to grow) +scoreboard players set @e[type=marker,tag=gm4_towering_trees_sapling,distance=..0.1] gm4_sap_growth 2 diff --git a/gm4_towering_trees/data/gm4_towering_trees/function/place_sapling.mcfunction b/gm4_towering_trees/data/gm4_towering_trees/function/place_sapling.mcfunction new file mode 100644 index 0000000000..e85517ac7b --- /dev/null +++ b/gm4_towering_trees/data/gm4_towering_trees/function/place_sapling.mcfunction @@ -0,0 +1,7 @@ +# Initiates the search for the placed sapling +# @s = player that just placed a custom sapling +# at @s +advancement revoke @s only gm4_towering_trees:place_sapling + +# have to engage lib_trees from here since this module works with vanilla saplings +function #gm4_trees:place_sapling diff --git a/gm4_towering_trees/data/gm4_towering_trees/function/replace_sapling.mcfunction b/gm4_towering_trees/data/gm4_towering_trees/function/replace_sapling.mcfunction new file mode 100644 index 0000000000..19253e0484 --- /dev/null +++ b/gm4_towering_trees/data/gm4_towering_trees/function/replace_sapling.mcfunction @@ -0,0 +1,14 @@ +# replaces this sapling if the tree could not be placed +# @s = sapling marker +# at @s +# run from generate_mega_tree +# run from generate_small_tree + +execute if entity @s[tag=gm4_oak_tree_sapling] run setblock ~ ~ ~ oak_sapling[stage=0] +execute if entity @s[tag=gm4_acacia_tree_sapling] run setblock ~ ~ ~ acacia_sapling[stage=0] +execute if entity @s[tag=gm4_cherry_tree_sapling] run setblock ~ ~ ~ cherry_sapling[stage=0] +execute if entity @s[tag=gm4_mangrove_tree_sapling.waterlogged] run setblock ~ ~ ~ mangrove_propagule[stage=0,age=4,waterlogged=true] +execute if entity @s[tag=!gm4_mangrove_tree_sapling.waterlogged,tag=gm4_mangrove_tree_sapling] run setblock ~ ~ ~ mangrove_propagule[stage=0,age=4,waterlogged=false] +execute if entity @s[tag=gm4_birch_tree_sapling] run setblock ~ ~ ~ birch_sapling[stage=0] +execute if entity @s[tag=gm4_pale_oak_tree_sapling] run setblock ~ ~ ~ pale_oak_sapling[stage=0] +execute if entity @s[tag=gm4_dark_oak_tree_sapling] run setblock ~ ~ ~ dark_oak_sapling[stage=0] diff --git a/gm4_towering_trees/data/gm4_towering_trees/function/verify/generate_tree.mcfunction b/gm4_towering_trees/data/gm4_towering_trees/function/verify/generate_tree.mcfunction new file mode 100644 index 0000000000..037da2a3ef --- /dev/null +++ b/gm4_towering_trees/data/gm4_towering_trees/function/verify/generate_tree.mcfunction @@ -0,0 +1,6 @@ +# verifies that the sapling type is from this module +# @s = gm4_tree_sapling marker +# located at @s +# run from gm4_trees:advance_stage via #gm4_trees:generate_tree + +execute if entity @s[tag=gm4_towering_trees_sapling] run function gm4_towering_trees:generate_tree diff --git a/gm4_towering_trees/data/gm4_towering_trees/function/verify/initialize_sapling.mcfunction b/gm4_towering_trees/data/gm4_towering_trees/function/verify/initialize_sapling.mcfunction new file mode 100644 index 0000000000..243196ca15 --- /dev/null +++ b/gm4_towering_trees/data/gm4_towering_trees/function/verify/initialize_sapling.mcfunction @@ -0,0 +1,7 @@ +# verifies that the sapling type is from this module +# @s = player who just placed down a custom sapling +# located at the center sapling block +# run from gm4_trees:sapling/summon marker via #gm4_trees:initialize_sapling + +# this module runs on vanilla saplings, so we want to check for no specific type +execute unless data storage gm4_trees:temp sapling{} align xyz unless entity @e[tag=smithed.block,dx=0,dy=0,dz=0,limit=1] positioned ~.5 ~.5 ~.5 run function gm4_towering_trees:initialize_sapling diff --git a/gm4_towering_trees/data/gm4_towering_trees/guidebook/towering_trees.json b/gm4_towering_trees/data/gm4_towering_trees/guidebook/towering_trees.json new file mode 100644 index 0000000000..bf092902eb --- /dev/null +++ b/gm4_towering_trees/data/gm4_towering_trees/guidebook/towering_trees.json @@ -0,0 +1,42 @@ +{ + "id": "towering_trees", + "name": "Towering Trees", + "module_type": "module", + "icon": { + "id": "minecraft:oak_sapling" + }, + "criteria": { + "obtain_sapling": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "items": "#gm4_towering_trees:supported_sapling" + } + ] + } + } + }, + "sections": [ + { + "name": "towering_trees", + "enable": [], + "requirements": [ + [ + "obtain_sapling" + ] + ], + "pages": [ + [ + { + "insert": "title" + }, + { + "translate": "text.gm4.guidebook.towering_trees.description", + "fallback": "Oak, Birch, Acacia, Cherry and Mangrove trees have mega (2x2) variants.\n\nDark Oak and Pale Oak have small variants." + } + ] + ] + } + ] +} diff --git a/gm4_towering_trees/data/gm4_towering_trees/structure/acacia/a.nbt b/gm4_towering_trees/data/gm4_towering_trees/structure/acacia/a.nbt new file mode 100644 index 0000000000..1c3c8c9eaf Binary files /dev/null and b/gm4_towering_trees/data/gm4_towering_trees/structure/acacia/a.nbt differ diff --git a/gm4_towering_trees/data/gm4_towering_trees/structure/acacia/b.nbt b/gm4_towering_trees/data/gm4_towering_trees/structure/acacia/b.nbt new file mode 100644 index 0000000000..7d6b6b670c Binary files /dev/null and b/gm4_towering_trees/data/gm4_towering_trees/structure/acacia/b.nbt differ diff --git a/gm4_towering_trees/data/gm4_towering_trees/structure/acacia/c.nbt b/gm4_towering_trees/data/gm4_towering_trees/structure/acacia/c.nbt new file mode 100644 index 0000000000..981f21d8dd Binary files /dev/null and b/gm4_towering_trees/data/gm4_towering_trees/structure/acacia/c.nbt differ diff --git a/gm4_towering_trees/data/gm4_towering_trees/structure/acacia/d.nbt b/gm4_towering_trees/data/gm4_towering_trees/structure/acacia/d.nbt new file mode 100644 index 0000000000..682e03b068 Binary files /dev/null and b/gm4_towering_trees/data/gm4_towering_trees/structure/acacia/d.nbt differ diff --git a/gm4_towering_trees/data/gm4_towering_trees/structure/acacia/e.nbt b/gm4_towering_trees/data/gm4_towering_trees/structure/acacia/e.nbt new file mode 100644 index 0000000000..2e690e2cae Binary files /dev/null and b/gm4_towering_trees/data/gm4_towering_trees/structure/acacia/e.nbt differ diff --git a/gm4_towering_trees/data/gm4_towering_trees/structure/birch/a.nbt b/gm4_towering_trees/data/gm4_towering_trees/structure/birch/a.nbt new file mode 100644 index 0000000000..6b5eb0da0b Binary files /dev/null and b/gm4_towering_trees/data/gm4_towering_trees/structure/birch/a.nbt differ diff --git a/gm4_towering_trees/data/gm4_towering_trees/structure/birch/b.nbt b/gm4_towering_trees/data/gm4_towering_trees/structure/birch/b.nbt new file mode 100644 index 0000000000..bcc995d069 Binary files /dev/null and b/gm4_towering_trees/data/gm4_towering_trees/structure/birch/b.nbt differ diff --git a/gm4_towering_trees/data/gm4_towering_trees/structure/birch/c.nbt b/gm4_towering_trees/data/gm4_towering_trees/structure/birch/c.nbt new file mode 100644 index 0000000000..4031fb257e Binary files /dev/null and b/gm4_towering_trees/data/gm4_towering_trees/structure/birch/c.nbt differ diff --git a/gm4_towering_trees/data/gm4_towering_trees/structure/birch/d.nbt b/gm4_towering_trees/data/gm4_towering_trees/structure/birch/d.nbt new file mode 100644 index 0000000000..c5c5754990 Binary files /dev/null and b/gm4_towering_trees/data/gm4_towering_trees/structure/birch/d.nbt differ diff --git a/gm4_towering_trees/data/gm4_towering_trees/structure/birch/e.nbt b/gm4_towering_trees/data/gm4_towering_trees/structure/birch/e.nbt new file mode 100644 index 0000000000..21ec62728a Binary files /dev/null and b/gm4_towering_trees/data/gm4_towering_trees/structure/birch/e.nbt differ diff --git a/gm4_towering_trees/data/gm4_towering_trees/structure/birch/f.nbt b/gm4_towering_trees/data/gm4_towering_trees/structure/birch/f.nbt new file mode 100644 index 0000000000..ff5210ee0a Binary files /dev/null and b/gm4_towering_trees/data/gm4_towering_trees/structure/birch/f.nbt differ diff --git a/gm4_towering_trees/data/gm4_towering_trees/structure/cherry/a.nbt b/gm4_towering_trees/data/gm4_towering_trees/structure/cherry/a.nbt new file mode 100644 index 0000000000..ea33bdb128 Binary files /dev/null and b/gm4_towering_trees/data/gm4_towering_trees/structure/cherry/a.nbt differ diff --git a/gm4_towering_trees/data/gm4_towering_trees/structure/cherry/b.nbt b/gm4_towering_trees/data/gm4_towering_trees/structure/cherry/b.nbt new file mode 100644 index 0000000000..e89a057d0d Binary files /dev/null and b/gm4_towering_trees/data/gm4_towering_trees/structure/cherry/b.nbt differ diff --git a/gm4_towering_trees/data/gm4_towering_trees/structure/cherry/c.nbt b/gm4_towering_trees/data/gm4_towering_trees/structure/cherry/c.nbt new file mode 100644 index 0000000000..8bd61ad486 Binary files /dev/null and b/gm4_towering_trees/data/gm4_towering_trees/structure/cherry/c.nbt differ diff --git a/gm4_towering_trees/data/gm4_towering_trees/structure/cherry/d.nbt b/gm4_towering_trees/data/gm4_towering_trees/structure/cherry/d.nbt new file mode 100644 index 0000000000..5690ef9dba Binary files /dev/null and b/gm4_towering_trees/data/gm4_towering_trees/structure/cherry/d.nbt differ diff --git a/gm4_towering_trees/data/gm4_towering_trees/structure/dark_oak/a.nbt b/gm4_towering_trees/data/gm4_towering_trees/structure/dark_oak/a.nbt new file mode 100644 index 0000000000..f7cd5fc6ef Binary files /dev/null and b/gm4_towering_trees/data/gm4_towering_trees/structure/dark_oak/a.nbt differ diff --git a/gm4_towering_trees/data/gm4_towering_trees/structure/dark_oak/b.nbt b/gm4_towering_trees/data/gm4_towering_trees/structure/dark_oak/b.nbt new file mode 100644 index 0000000000..466ce7f309 Binary files /dev/null and b/gm4_towering_trees/data/gm4_towering_trees/structure/dark_oak/b.nbt differ diff --git a/gm4_towering_trees/data/gm4_towering_trees/structure/dark_oak/c.nbt b/gm4_towering_trees/data/gm4_towering_trees/structure/dark_oak/c.nbt new file mode 100644 index 0000000000..b59d66aeca Binary files /dev/null and b/gm4_towering_trees/data/gm4_towering_trees/structure/dark_oak/c.nbt differ diff --git a/gm4_towering_trees/data/gm4_towering_trees/structure/dark_oak/d.nbt b/gm4_towering_trees/data/gm4_towering_trees/structure/dark_oak/d.nbt new file mode 100644 index 0000000000..1eb6a36e66 Binary files /dev/null and b/gm4_towering_trees/data/gm4_towering_trees/structure/dark_oak/d.nbt differ diff --git a/gm4_towering_trees/data/gm4_towering_trees/structure/dark_oak/e.nbt b/gm4_towering_trees/data/gm4_towering_trees/structure/dark_oak/e.nbt new file mode 100644 index 0000000000..714a431d58 Binary files /dev/null and b/gm4_towering_trees/data/gm4_towering_trees/structure/dark_oak/e.nbt differ diff --git a/gm4_towering_trees/data/gm4_towering_trees/structure/dark_oak/f.nbt b/gm4_towering_trees/data/gm4_towering_trees/structure/dark_oak/f.nbt new file mode 100644 index 0000000000..0d60657d43 Binary files /dev/null and b/gm4_towering_trees/data/gm4_towering_trees/structure/dark_oak/f.nbt differ diff --git a/gm4_towering_trees/data/gm4_towering_trees/structure/dark_oak/g.nbt b/gm4_towering_trees/data/gm4_towering_trees/structure/dark_oak/g.nbt new file mode 100644 index 0000000000..53f69f96fe Binary files /dev/null and b/gm4_towering_trees/data/gm4_towering_trees/structure/dark_oak/g.nbt differ diff --git a/gm4_towering_trees/data/gm4_towering_trees/structure/dark_oak/h.nbt b/gm4_towering_trees/data/gm4_towering_trees/structure/dark_oak/h.nbt new file mode 100644 index 0000000000..2d594f0c77 Binary files /dev/null and b/gm4_towering_trees/data/gm4_towering_trees/structure/dark_oak/h.nbt differ diff --git a/gm4_towering_trees/data/gm4_towering_trees/structure/dark_oak/i.nbt b/gm4_towering_trees/data/gm4_towering_trees/structure/dark_oak/i.nbt new file mode 100644 index 0000000000..e3e3e54b9b Binary files /dev/null and b/gm4_towering_trees/data/gm4_towering_trees/structure/dark_oak/i.nbt differ diff --git a/gm4_towering_trees/data/gm4_towering_trees/structure/dark_oak/j.nbt b/gm4_towering_trees/data/gm4_towering_trees/structure/dark_oak/j.nbt new file mode 100644 index 0000000000..bac92cfc71 Binary files /dev/null and b/gm4_towering_trees/data/gm4_towering_trees/structure/dark_oak/j.nbt differ diff --git a/gm4_towering_trees/data/gm4_towering_trees/structure/mangrove/a.nbt b/gm4_towering_trees/data/gm4_towering_trees/structure/mangrove/a.nbt new file mode 100644 index 0000000000..d67c2e5683 Binary files /dev/null and b/gm4_towering_trees/data/gm4_towering_trees/structure/mangrove/a.nbt differ diff --git a/gm4_towering_trees/data/gm4_towering_trees/structure/mangrove/b.nbt b/gm4_towering_trees/data/gm4_towering_trees/structure/mangrove/b.nbt new file mode 100644 index 0000000000..84fc179514 Binary files /dev/null and b/gm4_towering_trees/data/gm4_towering_trees/structure/mangrove/b.nbt differ diff --git a/gm4_towering_trees/data/gm4_towering_trees/structure/mangrove/c.nbt b/gm4_towering_trees/data/gm4_towering_trees/structure/mangrove/c.nbt new file mode 100644 index 0000000000..2b178e531f Binary files /dev/null and b/gm4_towering_trees/data/gm4_towering_trees/structure/mangrove/c.nbt differ diff --git a/gm4_towering_trees/data/gm4_towering_trees/structure/mangrove/d.nbt b/gm4_towering_trees/data/gm4_towering_trees/structure/mangrove/d.nbt new file mode 100644 index 0000000000..bc400e2b9d Binary files /dev/null and b/gm4_towering_trees/data/gm4_towering_trees/structure/mangrove/d.nbt differ diff --git a/gm4_towering_trees/data/gm4_towering_trees/structure/oak/a.nbt b/gm4_towering_trees/data/gm4_towering_trees/structure/oak/a.nbt new file mode 100644 index 0000000000..cdfa86f3df Binary files /dev/null and b/gm4_towering_trees/data/gm4_towering_trees/structure/oak/a.nbt differ diff --git a/gm4_towering_trees/data/gm4_towering_trees/structure/oak/b.nbt b/gm4_towering_trees/data/gm4_towering_trees/structure/oak/b.nbt new file mode 100644 index 0000000000..af752f9051 Binary files /dev/null and b/gm4_towering_trees/data/gm4_towering_trees/structure/oak/b.nbt differ diff --git a/gm4_towering_trees/data/gm4_towering_trees/structure/oak/c.nbt b/gm4_towering_trees/data/gm4_towering_trees/structure/oak/c.nbt new file mode 100644 index 0000000000..827d73c983 Binary files /dev/null and b/gm4_towering_trees/data/gm4_towering_trees/structure/oak/c.nbt differ diff --git a/gm4_towering_trees/data/gm4_towering_trees/structure/oak/d.nbt b/gm4_towering_trees/data/gm4_towering_trees/structure/oak/d.nbt new file mode 100644 index 0000000000..2747057b59 Binary files /dev/null and b/gm4_towering_trees/data/gm4_towering_trees/structure/oak/d.nbt differ diff --git a/gm4_towering_trees/data/gm4_towering_trees/structure/oak/e.nbt b/gm4_towering_trees/data/gm4_towering_trees/structure/oak/e.nbt new file mode 100644 index 0000000000..d596e58f5f Binary files /dev/null and b/gm4_towering_trees/data/gm4_towering_trees/structure/oak/e.nbt differ diff --git a/gm4_towering_trees/data/gm4_towering_trees/structure/pale_oak/a.nbt b/gm4_towering_trees/data/gm4_towering_trees/structure/pale_oak/a.nbt new file mode 100644 index 0000000000..5e0e0430e1 Binary files /dev/null and b/gm4_towering_trees/data/gm4_towering_trees/structure/pale_oak/a.nbt differ diff --git a/gm4_towering_trees/data/gm4_towering_trees/structure/pale_oak/b.nbt b/gm4_towering_trees/data/gm4_towering_trees/structure/pale_oak/b.nbt new file mode 100644 index 0000000000..2ca076a386 Binary files /dev/null and b/gm4_towering_trees/data/gm4_towering_trees/structure/pale_oak/b.nbt differ diff --git a/gm4_towering_trees/data/gm4_towering_trees/structure/pale_oak/c.nbt b/gm4_towering_trees/data/gm4_towering_trees/structure/pale_oak/c.nbt new file mode 100644 index 0000000000..e5731a345c Binary files /dev/null and b/gm4_towering_trees/data/gm4_towering_trees/structure/pale_oak/c.nbt differ diff --git a/gm4_towering_trees/data/gm4_towering_trees/structure/pale_oak/d.nbt b/gm4_towering_trees/data/gm4_towering_trees/structure/pale_oak/d.nbt new file mode 100644 index 0000000000..ba13c15d3b Binary files /dev/null and b/gm4_towering_trees/data/gm4_towering_trees/structure/pale_oak/d.nbt differ diff --git a/gm4_towering_trees/data/gm4_towering_trees/structure/pale_oak/e.nbt b/gm4_towering_trees/data/gm4_towering_trees/structure/pale_oak/e.nbt new file mode 100644 index 0000000000..c746c4082d Binary files /dev/null and b/gm4_towering_trees/data/gm4_towering_trees/structure/pale_oak/e.nbt differ diff --git a/gm4_towering_trees/data/gm4_towering_trees/structure/pale_oak/f.nbt b/gm4_towering_trees/data/gm4_towering_trees/structure/pale_oak/f.nbt new file mode 100644 index 0000000000..226815e98c Binary files /dev/null and b/gm4_towering_trees/data/gm4_towering_trees/structure/pale_oak/f.nbt differ diff --git a/gm4_towering_trees/data/gm4_towering_trees/structure/pale_oak/g.nbt b/gm4_towering_trees/data/gm4_towering_trees/structure/pale_oak/g.nbt new file mode 100644 index 0000000000..1deac6a9f3 Binary files /dev/null and b/gm4_towering_trees/data/gm4_towering_trees/structure/pale_oak/g.nbt differ diff --git a/gm4_towering_trees/data/gm4_towering_trees/structure/pale_oak/h.nbt b/gm4_towering_trees/data/gm4_towering_trees/structure/pale_oak/h.nbt new file mode 100644 index 0000000000..c7458bd720 Binary files /dev/null and b/gm4_towering_trees/data/gm4_towering_trees/structure/pale_oak/h.nbt differ diff --git a/gm4_towering_trees/data/gm4_towering_trees/structure/pale_oak/i.nbt b/gm4_towering_trees/data/gm4_towering_trees/structure/pale_oak/i.nbt new file mode 100644 index 0000000000..df80ac56c1 Binary files /dev/null and b/gm4_towering_trees/data/gm4_towering_trees/structure/pale_oak/i.nbt differ diff --git a/gm4_towering_trees/data/gm4_towering_trees/structure/pale_oak/j.nbt b/gm4_towering_trees/data/gm4_towering_trees/structure/pale_oak/j.nbt new file mode 100644 index 0000000000..d15a379f9f Binary files /dev/null and b/gm4_towering_trees/data/gm4_towering_trees/structure/pale_oak/j.nbt differ diff --git a/gm4_towering_trees/data/gm4_towering_trees/tags/block/mangrove_root_replaceable.json b/gm4_towering_trees/data/gm4_towering_trees/tags/block/mangrove_root_replaceable.json new file mode 100644 index 0000000000..51f03a4a61 --- /dev/null +++ b/gm4_towering_trees/data/gm4_towering_trees/tags/block/mangrove_root_replaceable.json @@ -0,0 +1,7 @@ +{ + "values": [ + "#minecraft:air", + "#minecraft:mangrove_roots_can_grow_through", + "#minecraft:replaceable_by_trees" + ] +} diff --git a/gm4_towering_trees/data/gm4_towering_trees/tags/block/supported_sapling.json b/gm4_towering_trees/data/gm4_towering_trees/tags/block/supported_sapling.json new file mode 100644 index 0000000000..b160b9d4ae --- /dev/null +++ b/gm4_towering_trees/data/gm4_towering_trees/tags/block/supported_sapling.json @@ -0,0 +1,11 @@ +{ + "values": [ + "acacia_sapling", + "birch_sapling", + "cherry_sapling", + "dark_oak_sapling", + "mangrove_propagule", + "oak_sapling", + "pale_oak_sapling" + ] +} diff --git a/gm4_towering_trees/data/gm4_towering_trees/tags/block/tree_placeable.json b/gm4_towering_trees/data/gm4_towering_trees/tags/block/tree_placeable.json new file mode 100644 index 0000000000..1512929d35 --- /dev/null +++ b/gm4_towering_trees/data/gm4_towering_trees/tags/block/tree_placeable.json @@ -0,0 +1,8 @@ +{ + "values": [ + "#minecraft:air", + "#minecraft:logs", + "#minecraft:replaceable_by_trees", + "#gm4_towering_trees:supported_sapling" + ] +} diff --git a/gm4_towering_trees/data/gm4_towering_trees/tags/item/supported_sapling.json b/gm4_towering_trees/data/gm4_towering_trees/tags/item/supported_sapling.json new file mode 100644 index 0000000000..42bcd05931 --- /dev/null +++ b/gm4_towering_trees/data/gm4_towering_trees/tags/item/supported_sapling.json @@ -0,0 +1,11 @@ +{ + "values": [ + "oak_sapling", + "birch_sapling", + "acacia_sapling", + "dark_oak_sapling", + "cherry_sapling", + "pale_oak_sapling", + "mangrove_propagule" + ] +} diff --git a/gm4_towering_trees/data/gm4_towering_trees/worldgen/configured_feature/leaf_litter.json b/gm4_towering_trees/data/gm4_towering_trees/worldgen/configured_feature/leaf_litter.json new file mode 100644 index 0000000000..6009e00a0f --- /dev/null +++ b/gm4_towering_trees/data/gm4_towering_trees/worldgen/configured_feature/leaf_litter.json @@ -0,0 +1,347 @@ +{ + "type": "minecraft:tree", + "config": { + "decorators": [ + { + "type": "minecraft:place_on_ground", + "block_state_provider": { + "type": "minecraft:weighted_state_provider", + "entries": [ + { + "data": { + "Name": "minecraft:leaf_litter", + "Properties": { + "facing": "north", + "segment_amount": "1" + } + }, + "weight": 1 + }, + { + "data": { + "Name": "minecraft:leaf_litter", + "Properties": { + "facing": "east", + "segment_amount": "1" + } + }, + "weight": 1 + }, + { + "data": { + "Name": "minecraft:leaf_litter", + "Properties": { + "facing": "south", + "segment_amount": "1" + } + }, + "weight": 1 + }, + { + "data": { + "Name": "minecraft:leaf_litter", + "Properties": { + "facing": "west", + "segment_amount": "1" + } + }, + "weight": 1 + }, + { + "data": { + "Name": "minecraft:leaf_litter", + "Properties": { + "facing": "north", + "segment_amount": "2" + } + }, + "weight": 1 + }, + { + "data": { + "Name": "minecraft:leaf_litter", + "Properties": { + "facing": "east", + "segment_amount": "2" + } + }, + "weight": 1 + }, + { + "data": { + "Name": "minecraft:leaf_litter", + "Properties": { + "facing": "south", + "segment_amount": "2" + } + }, + "weight": 1 + }, + { + "data": { + "Name": "minecraft:leaf_litter", + "Properties": { + "facing": "west", + "segment_amount": "2" + } + }, + "weight": 1 + }, + { + "data": { + "Name": "minecraft:leaf_litter", + "Properties": { + "facing": "north", + "segment_amount": "3" + } + }, + "weight": 1 + }, + { + "data": { + "Name": "minecraft:leaf_litter", + "Properties": { + "facing": "east", + "segment_amount": "3" + } + }, + "weight": 1 + }, + { + "data": { + "Name": "minecraft:leaf_litter", + "Properties": { + "facing": "south", + "segment_amount": "3" + } + }, + "weight": 1 + }, + { + "data": { + "Name": "minecraft:leaf_litter", + "Properties": { + "facing": "west", + "segment_amount": "3" + } + }, + "weight": 1 + } + ] + }, + "height": 3, + "radius": 7, + "tries": 150 + }, + { + "type": "minecraft:place_on_ground", + "block_state_provider": { + "type": "minecraft:weighted_state_provider", + "entries": [ + { + "data": { + "Name": "minecraft:leaf_litter", + "Properties": { + "facing": "north", + "segment_amount": "1" + } + }, + "weight": 1 + }, + { + "data": { + "Name": "minecraft:leaf_litter", + "Properties": { + "facing": "east", + "segment_amount": "1" + } + }, + "weight": 1 + }, + { + "data": { + "Name": "minecraft:leaf_litter", + "Properties": { + "facing": "south", + "segment_amount": "1" + } + }, + "weight": 1 + }, + { + "data": { + "Name": "minecraft:leaf_litter", + "Properties": { + "facing": "west", + "segment_amount": "1" + } + }, + "weight": 1 + }, + { + "data": { + "Name": "minecraft:leaf_litter", + "Properties": { + "facing": "north", + "segment_amount": "2" + } + }, + "weight": 1 + }, + { + "data": { + "Name": "minecraft:leaf_litter", + "Properties": { + "facing": "east", + "segment_amount": "2" + } + }, + "weight": 1 + }, + { + "data": { + "Name": "minecraft:leaf_litter", + "Properties": { + "facing": "south", + "segment_amount": "2" + } + }, + "weight": 1 + }, + { + "data": { + "Name": "minecraft:leaf_litter", + "Properties": { + "facing": "west", + "segment_amount": "2" + } + }, + "weight": 1 + }, + { + "data": { + "Name": "minecraft:leaf_litter", + "Properties": { + "facing": "north", + "segment_amount": "3" + } + }, + "weight": 1 + }, + { + "data": { + "Name": "minecraft:leaf_litter", + "Properties": { + "facing": "east", + "segment_amount": "3" + } + }, + "weight": 1 + }, + { + "data": { + "Name": "minecraft:leaf_litter", + "Properties": { + "facing": "south", + "segment_amount": "3" + } + }, + "weight": 1 + }, + { + "data": { + "Name": "minecraft:leaf_litter", + "Properties": { + "facing": "west", + "segment_amount": "3" + } + }, + "weight": 1 + }, + { + "data": { + "Name": "minecraft:leaf_litter", + "Properties": { + "facing": "north", + "segment_amount": "4" + } + }, + "weight": 1 + }, + { + "data": { + "Name": "minecraft:leaf_litter", + "Properties": { + "facing": "east", + "segment_amount": "4" + } + }, + "weight": 1 + }, + { + "data": { + "Name": "minecraft:leaf_litter", + "Properties": { + "facing": "south", + "segment_amount": "4" + } + }, + "weight": 1 + }, + { + "data": { + "Name": "minecraft:leaf_litter", + "Properties": { + "facing": "west", + "segment_amount": "4" + } + }, + "weight": 1 + } + ] + }, + "height": 3, + "radius": 3, + "tries": 300 + } + ], + "dirt_provider": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "minecraft:air" + } + }, + "foliage_placer": { + "type": "minecraft:bush_foliage_placer", + "height": 0, + "offset": 0, + "radius": 0 + }, + "foliage_provider": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "minecraft:air" + } + }, + "force_dirt": false, + "ignore_vines": true, + "minimum_size": { + "type": "minecraft:two_layers_feature_size", + "limit": 0, + "lower_size": 0, + "upper_size": 0 + }, + "trunk_placer": { + "type": "minecraft:dark_oak_trunk_placer", + "base_height": 0, + "height_rand_a": 0, + "height_rand_b": 0 + }, + "trunk_provider": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "minecraft:air" + } + } + } +} diff --git a/gm4_towering_trees/data/gm4_towering_trees/worldgen/configured_feature/pink_petals.json b/gm4_towering_trees/data/gm4_towering_trees/worldgen/configured_feature/pink_petals.json new file mode 100644 index 0000000000..272e1612c1 --- /dev/null +++ b/gm4_towering_trees/data/gm4_towering_trees/worldgen/configured_feature/pink_petals.json @@ -0,0 +1,347 @@ +{ + "type": "minecraft:tree", + "config": { + "decorators": [ + { + "type": "minecraft:place_on_ground", + "block_state_provider": { + "type": "minecraft:weighted_state_provider", + "entries": [ + { + "data": { + "Name": "minecraft:pink_petals", + "Properties": { + "facing": "north", + "flower_amount": "1" + } + }, + "weight": 1 + }, + { + "data": { + "Name": "minecraft:pink_petals", + "Properties": { + "facing": "east", + "flower_amount": "1" + } + }, + "weight": 1 + }, + { + "data": { + "Name": "minecraft:pink_petals", + "Properties": { + "facing": "south", + "flower_amount": "1" + } + }, + "weight": 1 + }, + { + "data": { + "Name": "minecraft:pink_petals", + "Properties": { + "facing": "west", + "flower_amount": "1" + } + }, + "weight": 1 + }, + { + "data": { + "Name": "minecraft:pink_petals", + "Properties": { + "facing": "north", + "flower_amount": "2" + } + }, + "weight": 1 + }, + { + "data": { + "Name": "minecraft:pink_petals", + "Properties": { + "facing": "east", + "flower_amount": "2" + } + }, + "weight": 1 + }, + { + "data": { + "Name": "minecraft:pink_petals", + "Properties": { + "facing": "south", + "flower_amount": "2" + } + }, + "weight": 1 + }, + { + "data": { + "Name": "minecraft:pink_petals", + "Properties": { + "facing": "west", + "flower_amount": "2" + } + }, + "weight": 1 + }, + { + "data": { + "Name": "minecraft:pink_petals", + "Properties": { + "facing": "north", + "flower_amount": "3" + } + }, + "weight": 1 + }, + { + "data": { + "Name": "minecraft:pink_petals", + "Properties": { + "facing": "east", + "flower_amount": "3" + } + }, + "weight": 1 + }, + { + "data": { + "Name": "minecraft:pink_petals", + "Properties": { + "facing": "south", + "flower_amount": "3" + } + }, + "weight": 1 + }, + { + "data": { + "Name": "minecraft:pink_petals", + "Properties": { + "facing": "west", + "flower_amount": "3" + } + }, + "weight": 1 + } + ] + }, + "height": 3, + "radius": 7, + "tries": 150 + }, + { + "type": "minecraft:place_on_ground", + "block_state_provider": { + "type": "minecraft:weighted_state_provider", + "entries": [ + { + "data": { + "Name": "minecraft:pink_petals", + "Properties": { + "facing": "north", + "flower_amount": "1" + } + }, + "weight": 1 + }, + { + "data": { + "Name": "minecraft:pink_petals", + "Properties": { + "facing": "east", + "flower_amount": "1" + } + }, + "weight": 1 + }, + { + "data": { + "Name": "minecraft:pink_petals", + "Properties": { + "facing": "south", + "flower_amount": "1" + } + }, + "weight": 1 + }, + { + "data": { + "Name": "minecraft:pink_petals", + "Properties": { + "facing": "west", + "flower_amount": "1" + } + }, + "weight": 1 + }, + { + "data": { + "Name": "minecraft:pink_petals", + "Properties": { + "facing": "north", + "flower_amount": "2" + } + }, + "weight": 1 + }, + { + "data": { + "Name": "minecraft:pink_petals", + "Properties": { + "facing": "east", + "flower_amount": "2" + } + }, + "weight": 1 + }, + { + "data": { + "Name": "minecraft:pink_petals", + "Properties": { + "facing": "south", + "flower_amount": "2" + } + }, + "weight": 1 + }, + { + "data": { + "Name": "minecraft:pink_petals", + "Properties": { + "facing": "west", + "flower_amount": "2" + } + }, + "weight": 1 + }, + { + "data": { + "Name": "minecraft:pink_petals", + "Properties": { + "facing": "north", + "flower_amount": "3" + } + }, + "weight": 1 + }, + { + "data": { + "Name": "minecraft:pink_petals", + "Properties": { + "facing": "east", + "flower_amount": "3" + } + }, + "weight": 1 + }, + { + "data": { + "Name": "minecraft:pink_petals", + "Properties": { + "facing": "south", + "flower_amount": "3" + } + }, + "weight": 1 + }, + { + "data": { + "Name": "minecraft:pink_petals", + "Properties": { + "facing": "west", + "flower_amount": "3" + } + }, + "weight": 1 + }, + { + "data": { + "Name": "minecraft:pink_petals", + "Properties": { + "facing": "north", + "flower_amount": "4" + } + }, + "weight": 1 + }, + { + "data": { + "Name": "minecraft:pink_petals", + "Properties": { + "facing": "east", + "flower_amount": "4" + } + }, + "weight": 1 + }, + { + "data": { + "Name": "minecraft:pink_petals", + "Properties": { + "facing": "south", + "flower_amount": "4" + } + }, + "weight": 1 + }, + { + "data": { + "Name": "minecraft:pink_petals", + "Properties": { + "facing": "west", + "flower_amount": "4" + } + }, + "weight": 1 + } + ] + }, + "height": 3, + "radius": 3, + "tries": 300 + } + ], + "dirt_provider": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "minecraft:air" + } + }, + "foliage_placer": { + "type": "minecraft:bush_foliage_placer", + "height": 0, + "offset": 0, + "radius": 0 + }, + "foliage_provider": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "minecraft:air" + } + }, + "force_dirt": false, + "ignore_vines": true, + "minimum_size": { + "type": "minecraft:two_layers_feature_size", + "limit": 0, + "lower_size": 0, + "upper_size": 0 + }, + "trunk_placer": { + "type": "minecraft:dark_oak_trunk_placer", + "base_height": 0, + "height_rand_a": 0, + "height_rand_b": 0 + }, + "trunk_provider": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "minecraft:air" + } + } + } +} diff --git a/gm4_towering_trees/data/gm4_trees/tags/functions/generate_tree.json b/gm4_towering_trees/data/gm4_trees/tags/functions/generate_tree.json new file mode 100644 index 0000000000..bd8bc90d56 --- /dev/null +++ b/gm4_towering_trees/data/gm4_trees/tags/functions/generate_tree.json @@ -0,0 +1,5 @@ +{ + "values": [ + "gm4_towering_trees:verify/generate_tree" + ] +} diff --git a/gm4_towering_trees/data/gm4_trees/tags/functions/initialize_sapling.json b/gm4_towering_trees/data/gm4_trees/tags/functions/initialize_sapling.json new file mode 100644 index 0000000000..cc71747598 --- /dev/null +++ b/gm4_towering_trees/data/gm4_trees/tags/functions/initialize_sapling.json @@ -0,0 +1,5 @@ +{ + "values": [ + "gm4_towering_trees:verify/initialize_sapling" + ] +} diff --git a/gm4_towering_trees/generate.py b/gm4_towering_trees/generate.py new file mode 100644 index 0000000000..7624db8312 --- /dev/null +++ b/gm4_towering_trees/generate.py @@ -0,0 +1,115 @@ +from pathlib import Path +from typing import Any +from gm4.utils import CSV # type: ignore +import json + +from beet import Context, subproject # type: ignore + +def read_json(path: Path) -> CSV: + """ + Reads in a json file and returns a python object representing the json. + """ + with open(path, mode='r') as file: + json_file = json.load(file) + return json_file + +def beet_default(ctx: Context): + + # read raw data + tree_data: CSV = CSV.from_file(Path('gm4_towering_trees', 'tree_data.csv')) + + generate_tree_files(ctx, tree_data) + +def generate_tree_files(ctx: Context, tree_data: CSV): + """ + Generates tree placement functions based on parameters. + """ + + variant_randomizer: dict[str,Any] = {} + + for tree in tree_data: + + size_x: int = tree['size_x'].as_integer() + size_y: int = tree['size_y'].as_integer() + size_z: int = tree['size_z'].as_integer() + base_x_offset: int = tree['base_x_offset'].as_integer() * -1 + base_z_offset: int = tree['base_z_offset'].as_integer() * -1 + branch_height: int = tree['branch_start_height'].as_integer() - 1 + is_mega: int = tree["is_mega"].as_integer() + + tree_type = tree['type'] + type_variant = tree['variant'] + + variant_entry = variant_randomizer.setdefault( + tree_type, + {"count": 0, "variants": [], "ground_replacement": "execute if score $tree_placed gm4_towering_trees_data matches 1 run fill ~ ~-1 ~ ~1 ~-1 ~1 dirt replace grass_block"} + ) + variant_entry["count"] += 1 + variant_entry["variants"].append(type_variant) + if tree_type == "mangrove": + variant_entry["ground_replacement"] = "# mangrove trees do not replace the ground since they are placed in the air" + if is_mega == 0: + variant_entry["ground_replacement"] = "execute if score $tree_placed gm4_towering_trees_data matches 1 run fill ~ ~-1 ~ ~ ~-1 ~ dirt replace grass_block" + + subproject_config = { + "data_pack": { + "load": [ + { + f"data/gm4_towering_trees/function/generate_tree_type/{tree['type']}/{tree['variant']}.mcfunction": "templates/place_tree.mcfunction", + } + ], + "render": { + "functions": "*" + } + }, + "meta": { + "type": tree_type, + "variant": type_variant, + "branch_height": branch_height, + "is_mega": is_mega, + "check_1_height": size_y - 1, + "check_1_count": size_y * (is_mega + 1)**2, + "check_2_x": size_x - 1, + "check_2_height": size_y - branch_height - 1, + "check_2_z": size_z - 1, + "check_2_count": size_x * (size_y - branch_height) * size_z, + "feature": tree['feature'], + "x_offset": base_x_offset, + "z_offset": base_z_offset, + "x_offset_180": base_x_offset * -1 + is_mega, + "z_offset_180": base_z_offset * -1 + is_mega, + "x_offset_c90": base_z_offset * -1 + is_mega, + "z_offset_c90": base_x_offset, + "x_offset_cc90": base_z_offset, + "z_offset_cc90": base_x_offset * -1 + is_mega + } + } + ctx.require(subproject(subproject_config)) + + + for type, data in variant_randomizer.items(): + + functions: str = "" + index = 0 + for variant in data["variants"]: + index += 1 + functions += f"execute if score $tree_variant gm4_towering_trees_data matches {index} run function gm4_towering_trees:generate_tree_type/{type}/{variant}\n" + + subproject_config = { + "data_pack": { + "load": [ + { + f"data/gm4_towering_trees/function/generate_tree_type/{type}/pick_variant.mcfunction": "templates/pick_variant.mcfunction", + } + ], + "render": { + "functions": "*" + } + }, + "meta": { + "variant_count": data["count"], + "functions": functions, + "ground_replacement": data["ground_replacement"] + } + } + ctx.require(subproject(subproject_config)) diff --git a/gm4_towering_trees/images/towering_trees.png b/gm4_towering_trees/images/towering_trees.png new file mode 100644 index 0000000000..a405a7f039 Binary files /dev/null and b/gm4_towering_trees/images/towering_trees.png differ diff --git a/gm4_towering_trees/templates/pick_variant.mcfunction b/gm4_towering_trees/templates/pick_variant.mcfunction new file mode 100644 index 0000000000..0c5aad95e0 --- /dev/null +++ b/gm4_towering_trees/templates/pick_variant.mcfunction @@ -0,0 +1,10 @@ +# generates the tree - mega {{type}} +# @s = sapling marker +# located at @s (offset to be at the negative corner of the 2x2) +# run from generate_mega_tree + +execute store result score $tree_variant gm4_towering_trees_data run random value 1..{{variant_count}} + +{{functions}} + +{{ground_replacement}} diff --git a/gm4_towering_trees/templates/place_tree.mcfunction b/gm4_towering_trees/templates/place_tree.mcfunction new file mode 100644 index 0000000000..c9e2fdffae --- /dev/null +++ b/gm4_towering_trees/templates/place_tree.mcfunction @@ -0,0 +1,25 @@ +# generates the tree - mega {{type}} +# @s = sapling marker +# located at @s (offset to be at the negative corner of the 2x2) +# run from generate_tree_type/{{type}}/pick_variant + +# check trunk +execute store result score $blocks_moved gm4_towering_trees_data positioned ~ ~ ~ run clone ~ ~ ~ ~{{is_mega}} ~{{check_1_height}} ~{{is_mega}} ~ ~ ~ filtered #gm4_towering_trees:tree_placeable move +execute unless score $blocks_moved gm4_towering_trees_data matches {{check_1_count}} run return fail + +# check box 2 +execute store result score $blocks_moved gm4_towering_trees_data positioned ~{{base_x_offset}} ~{{branch_height}} ~{{base_z_offset}} run clone ~ ~ ~ ~{{check_2_x}} ~{{check_2_height}} ~{{check_2_z}} ~ ~ ~ filtered #gm4_towering_trees:tree_placeable move +execute unless score $blocks_moved gm4_towering_trees_data matches {{check_2_count}} run return fail + +# optional feature +{{feature}} + +# place tree +execute store result score $tree_rotation gm4_towering_trees_data run random value 1..4 +execute if score $tree_rotation gm4_towering_trees_data matches 1 run place template gm4_towering_trees:{{type}}/{{variant}} ~{{x_offset}} ~ ~{{z_offset}} +execute if score $tree_rotation gm4_towering_trees_data matches 2 run place template gm4_towering_trees:{{type}}/{{variant}} ~{{x_offset_180}} ~ ~{{z_offset_180}} 180 +execute if score $tree_rotation gm4_towering_trees_data matches 3 run place template gm4_towering_trees:{{type}}/{{variant}} ~{{x_offset_c90}} ~ ~{{z_offset_c90}} clockwise_90 +execute if score $tree_rotation gm4_towering_trees_data matches 4 run place template gm4_towering_trees:{{type}}/{{variant}} ~{{x_offset_cc90}} ~ ~{{z_offset_cc90}} counterclockwise_90 + +# mark as placed +scoreboard players set $tree_placed gm4_towering_trees_data 1 diff --git a/gm4_towering_trees/tree_data.csv b/gm4_towering_trees/tree_data.csv new file mode 100644 index 0000000000..97176fbed9 --- /dev/null +++ b/gm4_towering_trees/tree_data.csv @@ -0,0 +1,45 @@ +type,variant,size_x,size_y,size_z,base_x_offset,base_z_offset,branch_start_height,feature,is_mega +oak,a,19,14,18,8,9,3,place feature gm4_towering_trees:leaf_litter ~ ~1 ~,true +oak,b,14,15,14,6,6,3,place feature gm4_towering_trees:leaf_litter ~ ~1 ~,true +oak,c,18,15,19,8,8,4,place feature gm4_towering_trees:leaf_litter ~ ~1 ~,true +oak,d,18,16,19,8,8,4,place feature gm4_towering_trees:leaf_litter ~ ~1 ~,true +oak,e,14,13,14,6,6,3,place feature gm4_towering_trees:leaf_litter ~ ~1 ~,true +acacia,a,16,21,14,7,6,15,#,true +acacia,b,12,18,13,5,6,14,#,true +acacia,c,13,22,16,6,6,17,#,true +acacia,d,15,21,13,6,6,17,#,true +acacia,e,13,23,14,7,6,19,#,true +birch,a,10,30,10,4,4,12,#,true +birch,b,10,28,10,4,4,8,#,true +birch,c,10,33,10,4,4,13,#,true +birch,d,10,32,10,4,4,12,#,true +birch,e,10,30,10,4,4,10,#,true +birch,f,10,28,10,4,4,10,#,true +cherry,a,24,15,17,12,7,5,place feature gm4_towering_trees:pink_petals ~ ~1 ~,true +cherry,b,27,17,17,14,8,5,place feature gm4_towering_trees:pink_petals ~ ~1 ~,true +cherry,c,24,17,16,15,7,5,place feature gm4_towering_trees:pink_petals ~ ~1 ~,true +cherry,d,29,19,17,12,8,4,place feature gm4_towering_trees:pink_petals ~ ~1 ~,true +mangrove,a,16,33,14,5,8,16,function gm4_towering_trees:generate_tree_type/mangrove/extra,true +mangrove,b,17,29,14,7,6,13,function gm4_towering_trees:generate_tree_type/mangrove/extra,true +mangrove,c,17,30,15,5,6,14,function gm4_towering_trees:generate_tree_type/mangrove/extra,true +mangrove,d,17,28,14,8,5,14,function gm4_towering_trees:generate_tree_type/mangrove/extra,true +pale_oak,a,7,6,7,3,4,4,#,false +pale_oak,b,7,7,7,3,3,5,#,false +pale_oak,c,8,8,7,4,4,5,#,false +pale_oak,d,8,9,7,4,3,7,#,false +pale_oak,e,8,10,7,4,3,7,#,false +pale_oak,f,7,7,7,4,3,5,#,false +pale_oak,g,7,7,7,4,3,5,#,false +pale_oak,h,7,8,8,4,4,6,#,false +pale_oak,i,8,9,8,4,4,7,#,false +pale_oak,j,7,10,8,3,3,8,#,false +dark_oak,a,7,6,7,3,4,4,#,false +dark_oak,b,7,7,7,3,3,5,#,false +dark_oak,c,8,8,7,4,4,5,#,false +dark_oak,d,8,9,7,4,3,7,#,false +dark_oak,e,8,10,7,4,3,7,#,false +dark_oak,f,7,7,7,4,3,5,#,false +dark_oak,g,7,7,7,4,3,5,#,false +dark_oak,h,7,8,8,4,4,6,#,false +dark_oak,i,8,9,8,4,4,7,#,false +dark_oak,j,7,10,8,3,3,8,#,false